From d1e18b6673104a2a3b366fa7b247bd951869d293 Mon Sep 17 00:00:00 2001 From: Simon Kuberski Date: Wed, 2 Feb 2022 09:05:13 +0100 Subject: [PATCH 001/136] Fixes least_squares with migrad, tests extended --- pyerrors/fits.py | 5 +++-- tests/fits_test.py | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/pyerrors/fits.py b/pyerrors/fits.py index 22c69fe3..311fba89 100644 --- a/pyerrors/fits.py +++ b/pyerrors/fits.py @@ -487,20 +487,21 @@ def _standard_fit(x, y, func, silent=False, **kwargs): chisq = anp.sum(((y_f - model) / dy_f) ** 2) return chisq - if 'method' in kwargs: + if 'method' in kwargs and not (kwargs.get('method', 'Levenberg-Marquardt') == 'Levenberg-Marquardt'): output.method = kwargs.get('method') if not silent: print('Method:', kwargs.get('method')) if kwargs.get('method') == 'migrad': fit_result = iminuit.minimize(chisqfunc, x0) fit_result = iminuit.minimize(chisqfunc, fit_result.x) + output.iterations = fit_result.nfev else: fit_result = scipy.optimize.minimize(chisqfunc, x0, method=kwargs.get('method')) fit_result = scipy.optimize.minimize(chisqfunc, fit_result.x, method=kwargs.get('method'), tol=1e-12) + output.iterations = fit_result.nit chisquare = fit_result.fun - output.iterations = fit_result.nit else: output.method = 'Levenberg-Marquardt' if not silent: diff --git a/tests/fits_test.py b/tests/fits_test.py index 48012edb..33a3b958 100644 --- a/tests/fits_test.py +++ b/tests/fits_test.py @@ -49,6 +49,8 @@ def test_least_squares(): y = a[0] * np.exp(-a[1] * x) return y + out = pe.least_squares(x, oy, func, method='migrad') + out = pe.least_squares(x, oy, func, method='Powell') out = pe.least_squares(x, oy, func, expected_chisquare=True, resplot=True, qqplot=True) beta = out.fit_parameters From d602bea5b721bd5ff826bb8380613841b25759a4 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Wed, 2 Feb 2022 10:05:48 +0000 Subject: [PATCH 002/136] refactor: Classification of fit method in fits.least_squares simplified, precision of imiunit solver adjusted, prefitting for alternative methods removed. --- pyerrors/fits.py | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/pyerrors/fits.py b/pyerrors/fits.py index 311fba89..ea51f6f0 100644 --- a/pyerrors/fits.py +++ b/pyerrors/fits.py @@ -96,7 +96,7 @@ def least_squares(x, y, func, priors=None, silent=False, **kwargs): initial_guess : list can provide an initial guess for the input parameters. Relevant for non-linear fits with many parameters. - method : str + method : str, optional can be used to choose an alternative method for the minimization of chisquare. The possible methods are the ones which can be used for scipy.optimize.minimize and migrad of iminuit. If no method is specified, Levenberg-Marquard is used. @@ -487,26 +487,21 @@ def _standard_fit(x, y, func, silent=False, **kwargs): chisq = anp.sum(((y_f - model) / dy_f) ** 2) return chisq - if 'method' in kwargs and not (kwargs.get('method', 'Levenberg-Marquardt') == 'Levenberg-Marquardt'): - output.method = kwargs.get('method') - if not silent: - print('Method:', kwargs.get('method')) - if kwargs.get('method') == 'migrad': - fit_result = iminuit.minimize(chisqfunc, x0) - fit_result = iminuit.minimize(chisqfunc, fit_result.x) + output.method = kwargs.get('method', 'Levenberg-Marquardt') + if not silent: + print('Method:', output.method) + + if output.method != 'Levenberg-Marquardt': + if output.method == 'migrad': + fit_result = iminuit.minimize(chisqfunc, x0, tol=1e-4) # Stopping crieterion 0.002 * tol * errordef output.iterations = fit_result.nfev else: - fit_result = scipy.optimize.minimize(chisqfunc, x0, method=kwargs.get('method')) - fit_result = scipy.optimize.minimize(chisqfunc, fit_result.x, method=kwargs.get('method'), tol=1e-12) + fit_result = scipy.optimize.minimize(chisqfunc, x0, method=kwargs.get('method'), tol=1e-12) output.iterations = fit_result.nit chisquare = fit_result.fun else: - output.method = 'Levenberg-Marquardt' - if not silent: - print('Method: Levenberg-Marquardt') - if kwargs.get('correlated_fit') is True: def chisqfunc_residuals(p): model = func(p, x) From 952c7acef51da03029e515081da046dc1971e4b1 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Wed, 2 Feb 2022 10:10:20 +0000 Subject: [PATCH 003/136] tests: additional tests for alternative fit methods in fits.least_squares added --- tests/fits_test.py | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/tests/fits_test.py b/tests/fits_test.py index 33a3b958..90a073e7 100644 --- a/tests/fits_test.py +++ b/tests/fits_test.py @@ -49,8 +49,6 @@ def test_least_squares(): y = a[0] * np.exp(-a[1] * x) return y - out = pe.least_squares(x, oy, func, method='migrad') - out = pe.least_squares(x, oy, func, method='Powell') out = pe.least_squares(x, oy, func, expected_chisquare=True, resplot=True, qqplot=True) beta = out.fit_parameters @@ -86,6 +84,33 @@ def test_least_squares(): assert math.isclose(pe.covariance(betac[0], betac[1]), pcov[0, 1], abs_tol=1e-3) +def test_alternative_solvers(): + dim = 192 + x = np.arange(dim) + y = 2 * np.exp(-0.06 * x) + np.random.normal(0.0, 0.15, dim) + yerr = 0.1 + 0.1 * np.random.rand(dim) + + oy = [] + for i, item in enumerate(x): + oy.append(pe.pseudo_Obs(y[i], yerr[i], 'test')) + + def func(a, x): + y = a[0] * np.exp(-a[1] * x) + return y + + chisquare_values = [] + out = pe.least_squares(x, oy, func, method='migrad') + chisquare_values.append(out.chisquare) + out = pe.least_squares(x, oy, func, method='Powell') + chisquare_values.append(out.chisquare) + out = pe.least_squares(x, oy, func, method='Nelder-Mead') + chisquare_values.append(out.chisquare) + out = pe.least_squares(x, oy, func, method='Levenberg-Marquardt') + chisquare_values.append(out.chisquare) + chisquare_values = np.array(chisquare_values) + assert np.all(np.isclose(chisquare_values, chisquare_values[0])) + + def test_correlated_fit(): num_samples = 400 N = 10 From 16a997aa904372f8e9ff83382cff849ba63c3e0d Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Wed, 2 Feb 2022 10:15:39 +0000 Subject: [PATCH 004/136] refactor!: Deprecated fit functions standard_fit, odr_fit and prior_fit removed. --- pyerrors/fits.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/pyerrors/fits.py b/pyerrors/fits.py index ea51f6f0..599c6eff 100644 --- a/pyerrors/fits.py +++ b/pyerrors/fits.py @@ -292,11 +292,6 @@ def total_least_squares(x, y, func, silent=False, **kwargs): return output -def prior_fit(x, y, func, priors, silent=False, **kwargs): - warnings.warn("prior_fit renamed to least_squares", DeprecationWarning) - return least_squares(x, y, func, priors=priors, silent=silent, **kwargs) - - def _prior_fit(x, y, func, priors, silent=False, **kwargs): output = Fit_result() @@ -415,11 +410,6 @@ def _prior_fit(x, y, func, priors, silent=False, **kwargs): return output -def standard_fit(x, y, func, silent=False, **kwargs): - warnings.warn("standard_fit renamed to least_squares", DeprecationWarning) - return least_squares(x, y, func, silent=silent, **kwargs) - - def _standard_fit(x, y, func, silent=False, **kwargs): output = Fit_result() @@ -583,11 +573,6 @@ def _standard_fit(x, y, func, silent=False, **kwargs): return output -def odr_fit(x, y, func, silent=False, **kwargs): - warnings.warn("odr_fit renamed to total_least_squares", DeprecationWarning) - return total_least_squares(x, y, func, silent=silent, **kwargs) - - def fit_lin(x, y, **kwargs): """Performs a linear fit to y = n + m * x and returns two Obs n, m. From 0dc4d4008a0ef13f411b6f2adef2983049ea2891 Mon Sep 17 00:00:00 2001 From: Simon Kuberski Date: Thu, 3 Feb 2022 10:33:24 +0100 Subject: [PATCH 005/136] Introduced JSON I/O for dictionaries --- pyerrors/input/json.py | 219 ++++++++++++++++++++++++++++++++++++++++- tests/io_test.py | 106 ++++++++++++++++++++ 2 files changed, 322 insertions(+), 3 deletions(-) diff --git a/pyerrors/input/json.py b/pyerrors/input/json.py index 6f5cf470..6b854874 100644 --- a/pyerrors/input/json.py +++ b/pyerrors/input/json.py @@ -6,6 +6,7 @@ import socket import datetime import platform import warnings +import re from ..obs import Obs from ..covobs import Covobs from ..correlators import Corr @@ -20,7 +21,7 @@ def create_json_string(ol, description='', indent=1): Parameters ---------- ol : list - List of objects that will be exported. At the moments, these objects can be + List of objects that will be exported. At the moment, these objects can be either of: Obs, list, numpy.ndarray, Corr. All Obs inside a structure have to be defined on the same set of configurations. description : str @@ -246,7 +247,7 @@ def dump_to_json(ol, fname, description='', indent=1, gz=True): Parameters ---------- ol : list - List of objects that will be exported. At the moments, these objects can be + List of objects that will be exported. At the moment, these objects can be either of: Obs, list, numpy.ndarray, Corr. All Obs inside a structure have to be defined on the same set of configurations. fname : str @@ -476,7 +477,7 @@ def import_json_string(json_string, verbose=True, full_output=False): def load_json(fname, verbose=True, gz=True, full_output=False): - """Import a list of Obs or structures containing Obs from a .json.gz file. + """Import a list of Obs or structures containing Obs from a .json(.gz) file. The following structures are supported: Obs, list, numpy.ndarray, Corr If the list contains only one element, it is unpacked from the list. @@ -507,3 +508,215 @@ def load_json(fname, verbose=True, gz=True, full_output=False): d = fin.read() return import_json_string(d, verbose, full_output) + + +def _ol_from_dict(ind, reps='DICTOBS'): + """Convert a dictionary of Obs objects to a list and a dictionary that contains + placeholders instead of the Obs objects. + + Parameters + ---------- + ind : dict + Dict of JSON valid structures and objects that will be exported. + At the moment, these object can be either of: Obs, list, numpy.ndarray, Corr. + All Obs inside a structure have to be defined on the same set of configurations. + reps : str + Specify the structure of the placeholder in exported dict to be reps[0-9]+. + """ + + obstypes = (Obs, Corr, np.ndarray) + + if not reps.isalnum(): + raise Exception('Placeholder string has to be alphanumeric!') + ol = [] + counter = 0 + + def dict_replace_obs(d): + nonlocal ol + nonlocal counter + x = {} + for k, v in d.items(): + if isinstance(v, dict): + v = dict_replace_obs(v) + elif isinstance(v, list) and all([isinstance(o, Obs) for o in v]): + v = obslist_replace_obs(v) + elif isinstance(v, list): + v = list_replace_obs(v) + elif isinstance(v, obstypes): + ol.append(v) + v = reps + '%d' % (counter) + counter += 1 + elif isinstance(v, str): + if bool(re.match(r'%s[0-9]+' % (reps), v)): + raise Exception('Dict contains string %s that matches the placeholder! %s Cannot be savely exported.' % (v, reps)) + x[k] = v + return x + + def list_replace_obs(li): + nonlocal ol + nonlocal counter + x = [] + for e in li: + if isinstance(e, list): + e = list_replace_obs(e) + elif isinstance(e, list) and all([isinstance(o, Obs) for o in e]): + e = obslist_replace_obs(e) + elif isinstance(e, dict): + e = dict_replace_obs(e) + elif isinstance(e, obstypes): + ol.append(e) + e = reps + '%d' % (counter) + counter += 1 + elif isinstance(e, str): + if bool(re.match(r'%s[0-9]+' % (reps), e)): + raise Exception('Dict contains string %s that matches the placeholder! %s Cannot be savely exported.' % (e, reps)) + x.append(e) + return x + + def obslist_replace_obs(li): + nonlocal ol + nonlocal counter + il = [] + for e in li: + il.append(e) + + ol.append(il) + x = reps + '%d' % (counter) + counter += 1 + return x + + nd = dict_replace_obs(ind) + + return ol, nd + + +def dump_dict_to_json(od, fname, description='', indent=1, reps='DICTOBS', gz=True): + """Export a dict of Obs or structures containing Obs to a .json(.gz) file + + Parameters + ---------- + od : dict + Dict of JSON valid structures and objects that will be exported. + At the moment, these objects can be either of: Obs, list, numpy.ndarray, Corr. + All Obs inside a structure have to be defined on the same set of configurations. + fname : str + Filename of the output file. + description : str + Optional string that describes the contents of the json file. + indent : int + Specify the indentation level of the json file. None or 0 is permissible and + saves disk space. + reps : str + Specify the structure of the placeholder in exported dict to be reps[0-9]+. + gz : bool + If True, the output is a gzipped json. If False, the output is a json file. + """ + + if not isinstance(od, dict): + raise Exception('od has to be a dictionary. Did you want to use dump_to_json?') + + infostring = ('This JSON file contains a python dictionary that has been parsed to a list of structures. ' + 'OBSDICT contains the dictionary, where Obs or other structures have been replaced by ' + '' + reps + '[0-9]+. The field description contains the additional description of this JSON file. ' + 'This file may be parsed to a dict with the pyerrors routine load_json_dict.') + + desc_dict = {'INFO': infostring, 'OBSDICT': {}, 'description': description} + ol, desc_dict['OBSDICT'] = _ol_from_dict(od, reps=reps) + + dump_to_json(ol, fname, description=desc_dict, indent=indent, gz=gz) + + +def _od_from_list_and_dict(ol, ind, reps='DICTOBS'): + """Parse a list of Obs or structures containing Obs and an accompanying + dict, where the structures have been replaced by placeholders to a + dict that contains the structures. + + The following structures are supported: Obs, list, numpy.ndarray, Corr + + Parameters + ---------- + ol : list + List of objects - + At the moment, these objects can be either of: Obs, list, numpy.ndarray, Corr. + All Obs inside a structure have to be defined on the same set of configurations. + ind : dict + Dict that defines the structure of the resulting dict and contains placeholders + reps : str + Specify the structure of the placeholder in imported dict to be reps[0-9]+. + """ + if not reps.isalnum(): + raise Exception('Placeholder string has to be alphanumeric!') + + counter = 0 + + def dict_replace_string(d): + nonlocal counter + nonlocal ol + x = {} + for k, v in d.items(): + if isinstance(v, dict): + v = dict_replace_string(v) + elif isinstance(v, list): + v = list_replace_string(v) + elif isinstance(v, str) and bool(re.match(r'%s[0-9]+' % (reps), v)): + index = int(v[len(reps):]) + v = ol[index] + counter += 1 + x[k] = v + return x + + def list_replace_string(li): + nonlocal counter + nonlocal ol + x = [] + for e in li: + if isinstance(e, list): + e = list_replace_string(e) + elif isinstance(e, dict): + e = dict_replace_string(e) + elif isinstance(e, str) and bool(re.match(r'%s[0-9]+' % (reps), e)): + index = int(e[len(reps):]) + e = ol[index] + counter += 1 + x.append(e) + return x + + nd = dict_replace_string(ind) + + if counter == 0: + raise Exception('No placeholder has been replaced! Check if reps is set correctly.') + + return nd + + +def load_json_dict(fname, verbose=True, gz=True, full_output=False, reps='DICTOBS'): + """Import a dict of Obs or structures containing Obs from a .json(.gz) file. + + The following structures are supported: Obs, list, numpy.ndarray, Corr + + Parameters + ---------- + fname : str + Filename of the input file. + verbose : bool + Print additional information that was written to the file. + gz : bool + If True, assumes that data is gzipped. If False, assumes JSON file. + full_output : bool + If True, a dict containing auxiliary information and the data is returned. + If False, only the data is returned. + reps : str + Specify the structure of the placeholder in imported dict to be reps[0-9]+. + """ + indata = load_json(fname, verbose=verbose, gz=gz, full_output=True) + description = indata['description']['description'] + indict = indata['description']['OBSDICT'] + ol = indata['obsdata'] + od = _od_from_list_and_dict(ol, indict, reps=reps) + + if full_output: + indata['description'] = description + indata['obsdata'] = od + return indata + else: + return od diff --git a/tests/io_test.py b/tests/io_test.py index 88f0a3ae..f5546d9f 100644 --- a/tests/io_test.py +++ b/tests/io_test.py @@ -3,6 +3,7 @@ import gzip import numpy as np import pyerrors as pe import pyerrors.input.json as jsonio +import pytest def test_jsonio(): @@ -136,3 +137,108 @@ def test_json_corr_2d_io(): assert recover[index] is None assert my_corr.tag == recover.tag assert my_corr.prange == recover.prange + + +def test_json_dict_io(): + def check_dict_equality(d1, d2): + def dict_check_obs(d1, d2): + for k, v in d1.items(): + if isinstance(v, dict): + v = dict_check_obs(v, d2[k]) + elif isinstance(v, list) and all([isinstance(o, pe.Obs) for o in v]): + for i in range(len(v)): + assert((v[i] - d2[k][i]).is_zero()) + elif isinstance(v, list): + v = list_check_obs(v, d2[k]) + elif isinstance(v, pe.Obs): + assert((v - d2[k]).is_zero()) + elif isinstance(v, pe.Corr): + for i in range(v.T): + assert((v[i] - d2[k][i]).is_zero()) + elif isinstance(v, np.ndarray): + a1 = np.ravel(v) + a2 = np.ravel(d2[k]) + for i in range(len(a1)): + assert((a1[i] - a2[i]).is_zero()) + + def list_check_obs(l1, l2): + for ei in range(len(l1)): + e = l1[ei] + if isinstance(e, list): + e = list_check_obs(e, l2[ei]) + elif isinstance(e, list) and all([isinstance(o, pe.Obs) for o in e]): + for i in range(len(e)): + assert((e[i] - l2[ei][i]).is_zero()) + elif isinstance(e, dict): + e = dict_check_obs(e, l2[ei]) + elif isinstance(e, pe.Obs): + assert((e - l2[ei]).is_zero()) + elif isinstance(e, pe.Corr): + for i in range(e.T): + assert((e[i] - l2[ei][i]).is_zero()) + elif isinstance(e, np.ndarray): + a1 = np.ravel(e) + a2 = np.ravel(l2[ei]) + for i in range(len(a1)): + assert((a1[i] - a2[i]).is_zero()) + dict_check_obs(d1, d2) + return True + + od = { + 'l': + { + 'a': pe.pseudo_Obs(1, .2, 'testa', samples=10), + 'b': [pe.pseudo_Obs(1.1, .1, 'test', samples=10), pe.pseudo_Obs(1.2, .1, 'test', samples=10), pe.pseudo_Obs(1.3, .1, 'test', samples=10)], + 'c': { + 'd': 1, + 'e': pe.pseudo_Obs(.2, .01, 'teste', samples=10), + 'f': pe.Corr([pe.pseudo_Obs(.1, .01, 'a', samples=10), pe.pseudo_Obs(.1, .01, 'a', samples=10), pe.pseudo_Obs(.1, .01, 'a', samples=10), pe.pseudo_Obs(.1, .01, 'a', samples=10)]), + 'g': np.reshape(np.asarray([pe.pseudo_Obs(.1, .01, 'a', samples=10), pe.pseudo_Obs(.1, .01, 'a', samples=10), pe.pseudo_Obs(.1, .01, 'a', samples=10), pe.pseudo_Obs(.1, .01, 'a', samples=10)]), (2, 2)), + } + }, + 's': + { + 'a': 'Infor123', + 'b': ['Some', 'list'], + 'd': pe.pseudo_Obs(.01, .001, 'testd', samples=10) * pe.cov_Obs(1, .01, 'cov1'), + 'se': None, + 'sf': 1.2, + } + } + + fname = 'test_rw' + + desc = 'This is a random description' + + with pytest.raises(Exception): + jsonio.dump_dict_to_json(od, fname, description=desc, reps='|Test') + + jsonio.dump_dict_to_json(od, fname, description=desc, reps='TEST') + nd = jsonio.load_json_dict(fname, full_output=True, reps='TEST') + + with pytest.raises(Exception): + nd = jsonio.load_json_dict(fname, full_output=True) + + jsonio.dump_dict_to_json(od, fname, description=desc) + nd = jsonio.load_json_dict(fname, full_output=True) + assert (desc == nd['description']) + + assert(check_dict_equality(od, nd['obsdata'])) + nd = jsonio.load_json_dict(fname, full_output=False) + assert(check_dict_equality(od, nd)) + + nl = jsonio.load_json(fname, full_output=True) + nl = jsonio.load_json(fname, full_output=False) + + with pytest.raises(Exception): + jsonio.dump_dict_to_json(nl, fname, description=desc) + + od['k'] = 'DICTOBS2' + with pytest.raises(Exception): + jsonio.dump_dict_to_json(od, fname, description=desc) + + od['k'] = ['DICTOBS2'] + with pytest.raises(Exception): + jsonio.dump_dict_to_json(od, fname, description=desc) + + os.remove(fname + '.json.gz') From ef1fecad100f590f7cd144a630e71f3f20b6569a Mon Sep 17 00:00:00 2001 From: Simon Kuberski Date: Thu, 3 Feb 2022 15:57:23 +0100 Subject: [PATCH 006/136] Several improvements for read_rwms and extract_t0 --- pyerrors/input/openQCD.py | 111 +++++++++++++++++++++++++++++++++----- 1 file changed, 97 insertions(+), 14 deletions(-) diff --git a/pyerrors/input/openQCD.py b/pyerrors/input/openQCD.py index a1b4e61d..6bb91848 100644 --- a/pyerrors/input/openQCD.py +++ b/pyerrors/input/openQCD.py @@ -3,6 +3,8 @@ import fnmatch import re import struct import numpy as np # Thinly-wrapped numpy +import matplotlib.pyplot as plt +from matplotlib import gridspec from ..obs import Obs from ..fits import fit_lin @@ -27,6 +29,9 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs): list which contains the first config to be read for each replicum r_stop : list list which contains the last config to be read for each replicum + r_step : int + integer that defines a fixed step size between two measurements (in units of configs) + If not given, r_step=1 is assumed. postfix : str postfix of the file to read, e.g. '.ms1' for openQCD-files files : list @@ -76,6 +81,11 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs): else: r_stop = [None] * replica + if 'r_step' in kwargs: + r_step = kwargs.get('r_step') + else: + r_step = 1 + print('Read reweighting factors from', prefix[:-1], ',', replica, 'replica', end='') @@ -85,6 +95,8 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs): truncated_entry = entry.split('.')[0] idx = truncated_entry.index('r') rep_names.append(truncated_entry[:idx] + '|' + truncated_entry[idx:]) + else: + rep_names = names print_err = 0 if 'print_err' in kwargs: @@ -129,6 +141,9 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs): if not struct.unpack('i', fp.read(4))[0] == 0: print('something is wrong!') + if r_start[rep] is None: + r_start[rep] = 0 + while 0 < 1: t = fp.read(4) if len(t) < 4: @@ -164,18 +179,16 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs): print('Sources:', np.exp(-np.asarray(tmp_rw))) print('Partial factor:', tmp_nfct) tmp_array[i].append(tmp_nfct) - + if r_stop[rep] is None: + r_stop[rep] = len(tmp_array[0]) for k in range(nrw): - deltas[k].append(tmp_array[k][r_start[rep]:r_stop[rep]]) + deltas[k].append(tmp_array[k][r_start[rep]:r_stop[rep]][::r_step]) print(',', nrw, 'reweighting factors with', nsrc, 'sources') result = [] + idl = [range(r_start[rep] + 1, r_stop[rep] + r_step, r_step) for rep in range(replica)] for t in range(nrw): - if names is None: - result.append(Obs(deltas[t], rep_names)) - else: - print(names) - result.append(Obs(deltas[t], names)) + result.append(Obs(deltas[t], rep_names, idl=idl)) return result @@ -212,8 +225,19 @@ def extract_t0(path, prefix, dtr_read, xmin, list which contains the first config to be read for each replicum. r_stop : list list which contains the last config to be read for each replicum. + r_step : int + integer that defines a fixed step size between two measurements (in units of configs) + If not given, r_step=1 is assumed. plaquette : bool If true extract the plaquette estimate of t0 instead. + names : list + list of names that is assigned to the data according according + to the order in the file list. Use careful, if you do not provide file names! + files : list + list which contains the filenames to be read. No automatic detection of + files performed if given. + plot_fit : bool + If true, the fit for the extraction of t0 is shown together with the data. """ ls = [] @@ -224,11 +248,14 @@ def extract_t0(path, prefix, dtr_read, xmin, if not ls: raise Exception('Error, directory not found') - for exc in ls: - if not fnmatch.fnmatch(exc, prefix + '*.ms.dat'): - ls = list(set(ls) - set([exc])) - if len(ls) > 1: - ls.sort(key=lambda x: int(re.findall(r'\d+', x[len(prefix):])[0])) + if 'files' in kwargs: + ls = kwargs.get('files') + else: + for exc in ls: + if not fnmatch.fnmatch(exc, prefix + '*.ms.dat'): + ls = list(set(ls) - set([exc])) + if len(ls) > 1: + ls.sort(key=lambda x: int(re.findall(r'\d+', x[len(prefix):])[0])) replica = len(ls) if 'r_start' in kwargs: @@ -246,8 +273,22 @@ def extract_t0(path, prefix, dtr_read, xmin, else: r_stop = [None] * replica + if 'r_step' in kwargs: + r_step = kwargs.get('r_step') + else: + r_step = 1 + print('Extract t0 from', prefix, ',', replica, 'replica') + if 'names' in kwargs: + rep_names = kwargs.get('names') + else: + rep_names = [] + for entry in ls: + truncated_entry = entry.split('.')[0] + idx = truncated_entry.index('r') + rep_names.append(truncated_entry[:idx] + '|' + truncated_entry[idx:]) + Ysum = [] for rep in range(replica): @@ -271,6 +312,10 @@ def extract_t0(path, prefix, dtr_read, xmin, Ysl = [] + if r_start[rep] is None: + r_start[rep] = 0 + + cfgcount = -1 while 0 < 1: t = fp.read(4) if(len(t) < 4): @@ -287,12 +332,16 @@ def extract_t0(path, prefix, dtr_read, xmin, Ysl.append(struct.unpack('d' * tmax * (nn + 1), t)) t = fp.read(8 * tmax * (nn + 1)) + cfgcount += 1 + if r_stop[rep] is None: + r_stop[rep] = cfgcount Ysum.append([]) for i, item in enumerate(Ysl): Ysum[-1].append([np.mean(item[current + xmin: current + tmax - xmin]) for current in range(0, len(item), tmax)]) + idl = [range(r_start[rep] + 1, r_stop[rep] + r_step, r_step) for rep in range(len(r_start))] t2E_dict = {} for n in range(nn + 1): samples = [] @@ -300,8 +349,8 @@ def extract_t0(path, prefix, dtr_read, xmin, samples.append([]) for cnfg in rep: samples[-1].append(cnfg[n]) - samples[-1] = samples[-1][r_start[nrep]:r_stop[nrep]] - new_obs = Obs(samples, [(w.split('.'))[0] for w in ls]) + samples[-1] = samples[-1][r_start[nrep]:r_stop[nrep]][::r_step] + new_obs = Obs(samples, rep_names, idl=idl) t2E_dict[n * dn * eps] = (n * dn * eps) ** 2 * new_obs / (spatial_extent ** 3) - 0.3 zero_crossing = np.argmax(np.array( @@ -314,6 +363,40 @@ def extract_t0(path, prefix, dtr_read, xmin, [o.gamma_method() for o in y] fit_result = fit_lin(x, y) + + if kwargs.get('plot_fit'): + plt.figure() + gs = gridspec.GridSpec(2, 1, height_ratios=[3, 1], wspace=0.0, hspace=0.0) + ax0 = plt.subplot(gs[0]) + xmore = list(t2E_dict.keys())[zero_crossing - fit_range - 2: zero_crossing + fit_range + 2] + ymore = list(t2E_dict.values())[zero_crossing - fit_range - 2: zero_crossing + fit_range + 2] + [o.gamma_method() for o in ymore] + ax0.errorbar(xmore, [yi.value for yi in ymore], yerr=[yi.dvalue for yi in ymore], fmt='x') + xplot = np.linspace(np.min(x), np.max(x)) + yplot = [fit_result[0] + fit_result[1] * xi for xi in xplot] + [yi.gamma_method() for yi in yplot] + ax0.fill_between(xplot, y1=[yi.value - yi.dvalue for yi in yplot], y2=[yi.value + yi.dvalue for yi in yplot]) + retval = (-fit_result[0] / fit_result[1]) + retval.gamma_method() + ylim = ax0.get_ylim() + ax0.fill_betweenx(ylim, x1=retval.value - retval.dvalue, x2=retval.value + retval.dvalue, color='gray', alpha=0.4) + ax0.set_ylim(ylim) + ax0.set_ylabel(r'$t^2 \langle E(t) \rangle - 0.3 $') + xlim = ax0.get_xlim() + + fit_res = [fit_result[0] + fit_result[1] * xi for xi in x] + residuals = (np.asarray([o.value for o in y]) - [o.value for o in fit_res]) / np.asarray([o.dvalue for o in y]) + ax1 = plt.subplot(gs[1]) + ax1.plot(x, residuals, 'ko', ls='none', markersize=5) + ax1.tick_params(direction='out') + ax1.tick_params(axis="x", bottom=True, top=True, labelbottom=True) + ax1.axhline(y=0.0, ls='--', color='k') + ax1.fill_between(xlim, -1.0, 1.0, alpha=0.1, facecolor='k') + ax1.set_xlim(xlim) + ax1.set_ylabel('Residuals') + ax1.set_xlabel(r'$t/a^2$') + + plt.show() return -fit_result[0] / fit_result[1] From c3b38c8b6f153d20e98e4943f9368baf25ed8b16 Mon Sep 17 00:00:00 2001 From: Simon Kuberski Date: Thu, 3 Feb 2022 16:05:47 +0100 Subject: [PATCH 007/136] Small change on idl --- pyerrors/input/openQCD.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyerrors/input/openQCD.py b/pyerrors/input/openQCD.py index 6bb91848..4d2eb5fa 100644 --- a/pyerrors/input/openQCD.py +++ b/pyerrors/input/openQCD.py @@ -186,7 +186,7 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs): print(',', nrw, 'reweighting factors with', nsrc, 'sources') result = [] - idl = [range(r_start[rep] + 1, r_stop[rep] + r_step, r_step) for rep in range(replica)] + idl = [range(r_start[rep] + 1, r_stop[rep] + 1, r_step) for rep in range(replica)] for t in range(nrw): result.append(Obs(deltas[t], rep_names, idl=idl)) return result @@ -341,7 +341,7 @@ def extract_t0(path, prefix, dtr_read, xmin, current + tmax - xmin]) for current in range(0, len(item), tmax)]) - idl = [range(r_start[rep] + 1, r_stop[rep] + r_step, r_step) for rep in range(len(r_start))] + idl = [range(r_start[rep] + 1, r_stop[rep] + 1, r_step) for rep in range(len(r_start))] t2E_dict = {} for n in range(nn + 1): samples = [] From ff738de6af1e76d299de096b40aa9661c934ea4e Mon Sep 17 00:00:00 2001 From: Simon Kuberski Date: Fri, 4 Feb 2022 09:49:17 +0100 Subject: [PATCH 008/136] Ensure correctness of idl in RWFs and t0 --- pyerrors/input/openQCD.py | 90 ++++++++++++++++++++++++++++++--------- 1 file changed, 70 insertions(+), 20 deletions(-) diff --git a/pyerrors/input/openQCD.py b/pyerrors/input/openQCD.py index 4d2eb5fa..91311672 100644 --- a/pyerrors/input/openQCD.py +++ b/pyerrors/input/openQCD.py @@ -3,6 +3,7 @@ import fnmatch import re import struct import numpy as np # Thinly-wrapped numpy +import warnings import matplotlib.pyplot as plt from matplotlib import gridspec from ..obs import Obs @@ -69,8 +70,7 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs): r_start = kwargs.get('r_start') if len(r_start) != replica: raise Exception('r_start does not match number of replicas') - # Adjust Configuration numbering to python index - r_start = [o - 1 if o else None for o in r_start] + r_start = [o if o else None for o in r_start] else: r_start = [None] * replica @@ -105,6 +105,10 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs): deltas = [] + configlist = [] + r_start_index = [] + r_stop_index = [] + for rep in range(replica): tmp_array = [] with open(path + '/' + ls[rep], 'rb') as fp: @@ -141,15 +145,13 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs): if not struct.unpack('i', fp.read(4))[0] == 0: print('something is wrong!') - if r_start[rep] is None: - r_start[rep] = 0 - + configlist.append([]) while 0 < 1: t = fp.read(4) if len(t) < 4: break - if print_err: - config_no = struct.unpack('i', t) + config_no = struct.unpack('i', t)[0] + configlist[-1].append(config_no) for i in range(nrw): if(version == '2.0'): tmpd = _read_array_openQCD2(fp) @@ -179,14 +181,37 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs): print('Sources:', np.exp(-np.asarray(tmp_rw))) print('Partial factor:', tmp_nfct) tmp_array[i].append(tmp_nfct) + + if r_start[rep] is None: + r_start_index.append(0) + else: + try: + r_start_index.append(configlist[-1].index(r_start[rep])) + except ValueError: + raise Exception('Config %d not in file with range [%d, %d]' % ( + r_start[rep], configlist[-1][0], configlist[-1][-1])) from None + if r_stop[rep] is None: - r_stop[rep] = len(tmp_array[0]) + r_stop_index.append(len(configlist[-1]) - 1) + else: + try: + r_stop_index.append(configlist[-1].index(r_stop[rep])) + except ValueError: + raise Exception('Config %d not in file with range [%d, %d]' % ( + r_stop[rep], configlist[-1][0], configlist[-1][-1])) from None + for k in range(nrw): - deltas[k].append(tmp_array[k][r_start[rep]:r_stop[rep]][::r_step]) + deltas[k].append(tmp_array[k][r_start_index[rep]:r_stop_index[rep]][::r_step]) + + if np.any([len(np.unique(np.diff(cl))) != 1 for cl in configlist]): + raise Exception('Irregular spaced data in input file!', [len(np.unique(np.diff(cl))) for cl in configlist]) + stepsizes = [list(np.unique(np.diff(cl)))[0] for cl in configlist] + if np.any([step != 1 for step in stepsizes]): + warnings.warn('Stepsize between configurations is greater than one!' + str(stepsizes), RuntimeWarning) print(',', nrw, 'reweighting factors with', nsrc, 'sources') result = [] - idl = [range(r_start[rep] + 1, r_stop[rep] + 1, r_step) for rep in range(replica)] + idl = [range(configlist[rep][r_start_index[rep]], configlist[rep][r_stop_index[rep]], r_step) for rep in range(replica)] for t in range(nrw): result.append(Obs(deltas[t], rep_names, idl=idl)) return result @@ -262,7 +287,7 @@ def extract_t0(path, prefix, dtr_read, xmin, r_start = kwargs.get('r_start') if len(r_start) != replica: raise Exception('r_start does not match number of replicas') - r_start = [o - 1 if o else None for o in r_start] + r_start = [o if o else None for o in r_start] else: r_start = [None] * replica @@ -291,6 +316,10 @@ def extract_t0(path, prefix, dtr_read, xmin, Ysum = [] + configlist = [] + r_start_index = [] + r_stop_index = [] + for rep in range(replica): with open(path + '/' + ls[rep], 'rb') as fp: @@ -312,15 +341,13 @@ def extract_t0(path, prefix, dtr_read, xmin, Ysl = [] - if r_start[rep] is None: - r_start[rep] = 0 - - cfgcount = -1 + configlist.append([]) while 0 < 1: t = fp.read(4) if(len(t) < 4): break nc = struct.unpack('i', t)[0] + configlist[-1].append(nc) t = fp.read(8 * tmax * (nn + 1)) if kwargs.get('plaquette'): @@ -332,16 +359,39 @@ def extract_t0(path, prefix, dtr_read, xmin, Ysl.append(struct.unpack('d' * tmax * (nn + 1), t)) t = fp.read(8 * tmax * (nn + 1)) - cfgcount += 1 - if r_stop[rep] is None: - r_stop[rep] = cfgcount Ysum.append([]) for i, item in enumerate(Ysl): Ysum[-1].append([np.mean(item[current + xmin: current + tmax - xmin]) for current in range(0, len(item), tmax)]) - idl = [range(r_start[rep] + 1, r_stop[rep] + 1, r_step) for rep in range(len(r_start))] + diffmeas = configlist[-1][-1] - configlist[-1][-2] + configlist[-1] = [item // diffmeas for item in configlist[-1]] + if r_start[rep] is None: + r_start_index.append(0) + else: + try: + r_start_index.append(configlist[-1].index(r_start[rep])) + except ValueError: + raise Exception('Config %d not in file with range [%d, %d]' % ( + r_start[rep], configlist[-1][0], configlist[-1][-1])) from None + + if r_stop[rep] is None: + r_stop_index.append(len(configlist[-1]) - 1) + else: + try: + r_stop_index.append(configlist[-1].index(r_stop[rep])) + except ValueError: + raise Exception('Config %d not in file with range [%d, %d]' % ( + r_stop[rep], configlist[-1][0], configlist[-1][-1])) from None + + if np.any([len(np.unique(np.diff(cl))) != 1 for cl in configlist]): + raise Exception('Irregular spaced data in input file!', [len(np.unique(np.diff(cl))) for cl in configlist]) + stepsizes = [list(np.unique(np.diff(cl)))[0] for cl in configlist] + if np.any([step != 1 for step in stepsizes]): + warnings.warn('Stepsize between configurations is greater than one!' + str(stepsizes), RuntimeWarning) + + idl = [range(configlist[rep][r_start_index[rep]], configlist[rep][r_stop_index[rep]], r_step) for rep in range(replica)] t2E_dict = {} for n in range(nn + 1): samples = [] @@ -349,7 +399,7 @@ def extract_t0(path, prefix, dtr_read, xmin, samples.append([]) for cnfg in rep: samples[-1].append(cnfg[n]) - samples[-1] = samples[-1][r_start[nrep]:r_stop[nrep]][::r_step] + samples[-1] = samples[-1][r_start_index[nrep]:r_stop_index[nrep]][::r_step] new_obs = Obs(samples, rep_names, idl=idl) t2E_dict[n * dn * eps] = (n * dn * eps) ** 2 * new_obs / (spatial_extent ** 3) - 0.3 From 65568c84a41d8e25dcb30353ee72d213c7d06f60 Mon Sep 17 00:00:00 2001 From: Simon Kuberski Date: Fri, 4 Feb 2022 10:15:43 +0100 Subject: [PATCH 009/136] Handling thermalization correctly in t0 --- pyerrors/input/openQCD.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/pyerrors/input/openQCD.py b/pyerrors/input/openQCD.py index 91311672..3c50a3d2 100644 --- a/pyerrors/input/openQCD.py +++ b/pyerrors/input/openQCD.py @@ -226,7 +226,12 @@ def extract_t0(path, prefix, dtr_read, xmin, The data around the zero crossing of t^2 - 0.3 is fitted with a linear function from which the exact root is extracted. - Only works with openQCD v 1.2. + Only works with openQCD + + It is assumed that one measurement is performed for each config. + If this is not the case, the resulting idl, as well as the handling + of r_start, r_stop and r_step is wrong and the user has to correct + this in the resulting observable. Parameters ---------- @@ -263,6 +268,11 @@ def extract_t0(path, prefix, dtr_read, xmin, files performed if given. plot_fit : bool If true, the fit for the extraction of t0 is shown together with the data. + assume_thermalization : bool + If True: If the first record divided by the distance between two measurements is larger than + 1, it is assumed that this is due to thermalization and the first measurement belongs + to the first config (default). + If False: The config numbers are assumed to be traj_number // difference """ ls = [] @@ -367,6 +377,11 @@ def extract_t0(path, prefix, dtr_read, xmin, diffmeas = configlist[-1][-1] - configlist[-1][-2] configlist[-1] = [item // diffmeas for item in configlist[-1]] + if kwargs.get('assume_thermalization', True) and configlist[-1][0] > 1: + warnings.warn('Assume thermalization and that the first measurement belongs to the first config.') + offset = configlist[-1][0] - 1 + configlist[-1] = [item - offset for item in configlist[-1]] + if r_start[rep] is None: r_start_index.append(0) else: From 07ca32f1669435adb37ddf47c3015adda420e2da Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Fri, 4 Feb 2022 12:56:51 +0000 Subject: [PATCH 010/136] refactor!: Removed Corr.sum method --- pyerrors/correlators.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py index 1f47de87..b99f5ae3 100644 --- a/pyerrors/correlators.py +++ b/pyerrors/correlators.py @@ -174,9 +174,6 @@ class Corr: newcontent = [None if (self.content[t] is None or vector_l[t] is None or vector_r[t] is None) else np.asarray([vector_l[t].T @ self.content[t] @ vector_r[t]]) for t in range(self.T)] return Corr(newcontent) - def sum(self): - return np.sqrt(self.N) * self.projected(np.ones(self.N)) - def smearing(self, i, j): """Picks the element [i,j] from every matrix and returns a correlator containing one Obs per timeslice. @@ -199,7 +196,7 @@ class Corr: timeslice and the error on each timeslice. """ if self.N != 1: - raise Exception("Can only make Corr[N=1] plottable") # We could also autoproject to the groundstate or expect vectors, but this is supposed to be a super simple function. + raise Exception("Can only make Corr[N=1] plottable") x_list = [x for x in range(self.T) if not self.content[x] is None] y_list = [y[0].value for y in self.content if y is not None] y_err_list = [y[0].dvalue for y in self.content if y is not None] From a839592ea87a36cc74f55b3b25228e2122753ffc Mon Sep 17 00:00:00 2001 From: jkuhl-uni Date: Sun, 6 Feb 2022 18:05:37 +0100 Subject: [PATCH 011/136] first steps to testing input methods --- tests/data/sfcf_test/data_a/data_a.F_V0 | 1146 ++++++ tests/data/sfcf_test/data_a/data_a.f_1 | 966 +++++ tests/data/sfcf_test/data_a/data_a.f_A | 396 ++ .../sfcf_test/data_c/data_c_r0/data_c_r0_n1 | 476 +++ tests/data/sfcf_test/data_o/cfg1/F_V0 | 230 ++ tests/data/sfcf_test/data_o/cfg1/f_1 | 194 + tests/data/sfcf_test/data_o/cfg1/f_A | 80 + tests/data/sfcf_test/param/out.out | 3273 +++++++++++++++++ tests/data/sfcf_test/param/parameters_a | 102 + tests/data/sfcf_test/param/parameters_c | 102 + tests/data/sfcf_test/param/parameters_o | 102 + tests/sfcf_in_test.py | 29 + 12 files changed, 7096 insertions(+) create mode 100644 tests/data/sfcf_test/data_a/data_a.F_V0 create mode 100644 tests/data/sfcf_test/data_a/data_a.f_1 create mode 100644 tests/data/sfcf_test/data_a/data_a.f_A create mode 100644 tests/data/sfcf_test/data_c/data_c_r0/data_c_r0_n1 create mode 100644 tests/data/sfcf_test/data_o/cfg1/F_V0 create mode 100644 tests/data/sfcf_test/data_o/cfg1/f_1 create mode 100644 tests/data/sfcf_test/data_o/cfg1/f_A create mode 100644 tests/data/sfcf_test/param/out.out create mode 100644 tests/data/sfcf_test/param/parameters_a create mode 100644 tests/data/sfcf_test/param/parameters_c create mode 100644 tests/data/sfcf_test/param/parameters_o create mode 100644 tests/sfcf_in_test.py diff --git a/tests/data/sfcf_test/data_a/data_a.F_V0 b/tests/data/sfcf_test/data_a/data_a.F_V0 new file mode 100644 index 00000000..970e1143 --- /dev/null +++ b/tests/data/sfcf_test/data_a/data_a.F_V0 @@ -0,0 +1,1146 @@ +[run] + +version 2.1 +date 2022-01-19 11:04:03 +0100 +host r04n07.palma.wwu +dir /scratch/tmp/j_kuhl19 +user j_kuhl19 +gauge_name /unity +gauge_md5 1ea28326e4090996111a320b8372811d +param_name sfcf_unity_test.in +param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 +param_hash 686af5e712ee2902180f5428af94c6e7 +data_name ./output_10519905/data_aF_V0 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 0 +wf_2 0 +corr_t + 1 +6.8367760900851147e+02 +3.0531839956225539e-10 + 2 +6.6131885855823339e+02 +3.9736225045852382e-12 + 3 +6.8367760900810049e+02 -2.5611665964422843e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 0 +wf_2 1 +corr_t + 1 +6.8370283168793060e+02 +3.0532966356282939e-10 + 2 +6.6134325636407561e+02 +3.9737690976212336e-12 + 3 +6.8370283168751973e+02 -2.5612610847134760e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 0 +wf_2 2 +corr_t + 1 +6.8370484437212463e+02 +3.0533056232915147e-10 + 2 +6.6134520322615822e+02 +3.9737807346122766e-12 + 3 +6.8370484437171353e+02 -2.5612686251836130e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 1 +wf_2 0 +corr_t + 1 +6.8370283168792889e+02 +3.0532890521977295e-10 + 2 +6.6134325636407402e+02 +3.9730355551484655e-12 + 3 +6.8370283168751791e+02 -2.5612686681440218e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 1 +wf_2 1 +corr_t + 1 +6.8372805529787934e+02 +3.0534016954586185e-10 + 2 +6.6136765507001564e+02 +3.9731820664935325e-12 + 3 +6.8372805529746825e+02 -2.5613631608015786e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 1 +wf_2 2 +corr_t + 1 +6.8373006805632656e+02 +3.0534106842445933e-10 + 2 +6.6136960200392332e+02 +3.9731937804440792e-12 + 3 +6.8373006805591558e+02 -2.5613707007587266e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 2 +wf_2 0 +corr_t + 1 +6.8370484437212156e+02 +3.0532220084664646e-10 + 2 +6.6134520322615526e+02 +3.9656927030717790e-12 + 3 +6.8370484437171069e+02 -2.5613522400086377e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 2 +wf_2 1 +corr_t + 1 +6.8373006805632599e+02 +3.0533346499198999e-10 + 2 +6.6136960200392275e+02 +3.9658390079382195e-12 + 3 +6.8373006805591490e+02 -2.5614467350834153e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 2 +wf_2 2 +corr_t + 1 +6.8373208082069789e+02 +3.0533436384459901e-10 + 2 +6.6137154894356127e+02 +3.9658506942251639e-12 + 3 +6.8373208082028680e+02 -2.5614542753491032e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 0 +wf_2 0 +corr_t + 1 +6.8367760900918211e+02 -9.5149222536505804e-10 + 2 +6.6131885855810310e+02 +3.2960434859595585e-10 + 3 +6.8367760900806934e+02 -2.3744430846347533e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 0 +wf_2 1 +corr_t + 1 +6.8370283168860135e+02 -9.5152732859532533e-10 + 2 +6.6134325636394544e+02 +3.2961650841969937e-10 + 3 +6.8370283168748858e+02 -2.3745306857315358e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 0 +wf_2 2 +corr_t + 1 +6.8370484437279526e+02 -9.5153012965274573e-10 + 2 +6.6134520322602793e+02 +3.2961747879154288e-10 + 3 +6.8370484437168250e+02 -2.3745376753897864e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 1 +wf_2 0 +corr_t + 1 +6.8370283168859953e+02 -9.5151770701795658e-10 + 2 +6.6134325636394351e+02 +3.2962581533640458e-10 + 3 +6.8370283168748665e+02 -2.3744344699578737e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 1 +wf_2 1 +corr_t + 1 +6.8372805529855032e+02 -9.5155281099707234e-10 + 2 +6.6136765506988547e+02 +3.2963797613709602e-10 + 3 +6.8372805529743755e+02 -2.3745220688244645e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 1 +wf_2 2 +corr_t + 1 +6.8373006805699742e+02 -9.5155561220425917e-10 + 2 +6.6136960200379315e+02 +3.2963894649982994e-10 + 3 +6.8373006805588454e+02 -2.3745290592048597e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 2 +wf_2 0 +corr_t + 1 +6.8370484437279174e+02 -9.5153224647433932e-10 + 2 +6.6134520322602452e+02 +3.2961543119772646e-10 + 3 +6.8370484437167897e+02 -2.3745588436057620e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 2 +wf_2 1 +corr_t + 1 +6.8373006805699617e+02 -9.5156735103669992e-10 + 2 +6.6136960200379178e+02 +3.2962759157000606e-10 + 3 +6.8373006805588329e+02 -2.3746464475292832e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 2 +wf_2 2 +corr_t + 1 +6.8373208082136819e+02 -9.5157015223999714e-10 + 2 +6.6137154894343041e+02 +3.2962856194733528e-10 + 3 +6.8373208082025531e+02 -2.3746534378088984e-10 + +[run] + +version 2.1 +date 2022-01-19 11:04:05 +0100 +host r04n07.palma.wwu +dir /scratch/tmp/j_kuhl19 +user j_kuhl19 +gauge_name /unity +gauge_md5 1ea28326e4090996111a320b8372811d +param_name sfcf_unity_test.in +param_hash 686af5e712ee2902180f5428af94c6e7 +data_name ./output_10519905/data_aF_V0 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 0 +wf_2 0 +corr_t + 1 +6.8367760900851147e+02 +3.0531839956225539e-10 + 2 +6.6131885855823339e+02 +3.9736225045852382e-12 + 3 +6.8367760900810049e+02 -2.5611665964422843e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 0 +wf_2 1 +corr_t + 1 +6.8370283168793060e+02 +3.0532966356282939e-10 + 2 +6.6134325636407561e+02 +3.9737690976212336e-12 + 3 +6.8370283168751973e+02 -2.5612610847134760e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 0 +wf_2 2 +corr_t + 1 +6.8370484437212463e+02 +3.0533056232915147e-10 + 2 +6.6134520322615822e+02 +3.9737807346122766e-12 + 3 +6.8370484437171353e+02 -2.5612686251836130e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 1 +wf_2 0 +corr_t + 1 +6.8370283168792889e+02 +3.0532890521977295e-10 + 2 +6.6134325636407402e+02 +3.9730355551484655e-12 + 3 +6.8370283168751791e+02 -2.5612686681440218e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 1 +wf_2 1 +corr_t + 1 +6.8372805529787934e+02 +3.0534016954586185e-10 + 2 +6.6136765507001564e+02 +3.9731820664935325e-12 + 3 +6.8372805529746825e+02 -2.5613631608015786e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 1 +wf_2 2 +corr_t + 1 +6.8373006805632656e+02 +3.0534106842445933e-10 + 2 +6.6136960200392332e+02 +3.9731937804440792e-12 + 3 +6.8373006805591558e+02 -2.5613707007587266e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 2 +wf_2 0 +corr_t + 1 +6.8370484437212156e+02 +3.0532220084664646e-10 + 2 +6.6134520322615526e+02 +3.9656927030717790e-12 + 3 +6.8370484437171069e+02 -2.5613522400086377e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 2 +wf_2 1 +corr_t + 1 +6.8373006805632599e+02 +3.0533346499198999e-10 + 2 +6.6136960200392275e+02 +3.9658390079382195e-12 + 3 +6.8373006805591490e+02 -2.5614467350834153e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 2 +wf_2 2 +corr_t + 1 +6.8373208082069789e+02 +3.0533436384459901e-10 + 2 +6.6137154894356127e+02 +3.9658506942251639e-12 + 3 +6.8373208082028680e+02 -2.5614542753491032e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 0 +wf_2 0 +corr_t + 1 +6.8367760900918211e+02 -9.5149222536505804e-10 + 2 +6.6131885855810310e+02 +3.2960434859595585e-10 + 3 +6.8367760900806934e+02 -2.3744430846347533e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 0 +wf_2 1 +corr_t + 1 +6.8370283168860135e+02 -9.5152732859532533e-10 + 2 +6.6134325636394544e+02 +3.2961650841969937e-10 + 3 +6.8370283168748858e+02 -2.3745306857315358e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 0 +wf_2 2 +corr_t + 1 +6.8370484437279526e+02 -9.5153012965274573e-10 + 2 +6.6134520322602793e+02 +3.2961747879154288e-10 + 3 +6.8370484437168250e+02 -2.3745376753897864e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 1 +wf_2 0 +corr_t + 1 +6.8370283168859953e+02 -9.5151770701795658e-10 + 2 +6.6134325636394351e+02 +3.2962581533640458e-10 + 3 +6.8370283168748665e+02 -2.3744344699578737e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 1 +wf_2 1 +corr_t + 1 +6.8372805529855032e+02 -9.5155281099707234e-10 + 2 +6.6136765506988547e+02 +3.2963797613709602e-10 + 3 +6.8372805529743755e+02 -2.3745220688244645e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 1 +wf_2 2 +corr_t + 1 +6.8373006805699742e+02 -9.5155561220425917e-10 + 2 +6.6136960200379315e+02 +3.2963894649982994e-10 + 3 +6.8373006805588454e+02 -2.3745290592048597e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 2 +wf_2 0 +corr_t + 1 +6.8370484437279174e+02 -9.5153224647433932e-10 + 2 +6.6134520322602452e+02 +3.2961543119772646e-10 + 3 +6.8370484437167897e+02 -2.3745588436057620e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 2 +wf_2 1 +corr_t + 1 +6.8373006805699617e+02 -9.5156735103669992e-10 + 2 +6.6136960200379178e+02 +3.2962759157000606e-10 + 3 +6.8373006805588329e+02 -2.3746464475292832e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 2 +wf_2 2 +corr_t + 1 +6.8373208082136819e+02 -9.5157015223999714e-10 + 2 +6.6137154894343041e+02 +3.2962856194733528e-10 + 3 +6.8373208082025531e+02 -2.3746534378088984e-10 + +[run] + +version 2.1 +date 2022-01-19 11:04:07 +0100 +host r04n07.palma.wwu +dir /scratch/tmp/j_kuhl19 +user j_kuhl19 +gauge_name /unity +gauge_md5 1ea28326e4090996111a320b8372811d +param_name sfcf_unity_test.in +param_hash 686af5e712ee2902180f5428af94c6e7 +data_name ./output_10519905/data_aF_V0 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 0 +wf_2 0 +corr_t + 1 +6.8367760900851147e+02 +3.0531839956225539e-10 + 2 +6.6131885855823339e+02 +3.9736225045852382e-12 + 3 +6.8367760900810049e+02 -2.5611665964422843e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 0 +wf_2 1 +corr_t + 1 +6.8370283168793060e+02 +3.0532966356282939e-10 + 2 +6.6134325636407561e+02 +3.9737690976212336e-12 + 3 +6.8370283168751973e+02 -2.5612610847134760e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 0 +wf_2 2 +corr_t + 1 +6.8370484437212463e+02 +3.0533056232915147e-10 + 2 +6.6134520322615822e+02 +3.9737807346122766e-12 + 3 +6.8370484437171353e+02 -2.5612686251836130e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 1 +wf_2 0 +corr_t + 1 +6.8370283168792889e+02 +3.0532890521977295e-10 + 2 +6.6134325636407402e+02 +3.9730355551484655e-12 + 3 +6.8370283168751791e+02 -2.5612686681440218e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 1 +wf_2 1 +corr_t + 1 +6.8372805529787934e+02 +3.0534016954586185e-10 + 2 +6.6136765507001564e+02 +3.9731820664935325e-12 + 3 +6.8372805529746825e+02 -2.5613631608015786e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 1 +wf_2 2 +corr_t + 1 +6.8373006805632656e+02 +3.0534106842445933e-10 + 2 +6.6136960200392332e+02 +3.9731937804440792e-12 + 3 +6.8373006805591558e+02 -2.5613707007587266e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 2 +wf_2 0 +corr_t + 1 +6.8370484437212156e+02 +3.0532220084664646e-10 + 2 +6.6134520322615526e+02 +3.9656927030717790e-12 + 3 +6.8370484437171069e+02 -2.5613522400086377e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 2 +wf_2 1 +corr_t + 1 +6.8373006805632599e+02 +3.0533346499198999e-10 + 2 +6.6136960200392275e+02 +3.9658390079382195e-12 + 3 +6.8373006805591490e+02 -2.5614467350834153e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 2 +wf_2 2 +corr_t + 1 +6.8373208082069789e+02 +3.0533436384459901e-10 + 2 +6.6137154894356127e+02 +3.9658506942251639e-12 + 3 +6.8373208082028680e+02 -2.5614542753491032e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 0 +wf_2 0 +corr_t + 1 +6.8367760900918211e+02 -9.5149222536505804e-10 + 2 +6.6131885855810310e+02 +3.2960434859595585e-10 + 3 +6.8367760900806934e+02 -2.3744430846347533e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 0 +wf_2 1 +corr_t + 1 +6.8370283168860135e+02 -9.5152732859532533e-10 + 2 +6.6134325636394544e+02 +3.2961650841969937e-10 + 3 +6.8370283168748858e+02 -2.3745306857315358e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 0 +wf_2 2 +corr_t + 1 +6.8370484437279526e+02 -9.5153012965274573e-10 + 2 +6.6134520322602793e+02 +3.2961747879154288e-10 + 3 +6.8370484437168250e+02 -2.3745376753897864e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 1 +wf_2 0 +corr_t + 1 +6.8370283168859953e+02 -9.5151770701795658e-10 + 2 +6.6134325636394351e+02 +3.2962581533640458e-10 + 3 +6.8370283168748665e+02 -2.3744344699578737e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 1 +wf_2 1 +corr_t + 1 +6.8372805529855032e+02 -9.5155281099707234e-10 + 2 +6.6136765506988547e+02 +3.2963797613709602e-10 + 3 +6.8372805529743755e+02 -2.3745220688244645e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 1 +wf_2 2 +corr_t + 1 +6.8373006805699742e+02 -9.5155561220425917e-10 + 2 +6.6136960200379315e+02 +3.2963894649982994e-10 + 3 +6.8373006805588454e+02 -2.3745290592048597e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 2 +wf_2 0 +corr_t + 1 +6.8370484437279174e+02 -9.5153224647433932e-10 + 2 +6.6134520322602452e+02 +3.2961543119772646e-10 + 3 +6.8370484437167897e+02 -2.3745588436057620e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 2 +wf_2 1 +corr_t + 1 +6.8373006805699617e+02 -9.5156735103669992e-10 + 2 +6.6136960200379178e+02 +3.2962759157000606e-10 + 3 +6.8373006805588329e+02 -2.3746464475292832e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 2 +wf_2 2 +corr_t + 1 +6.8373208082136819e+02 -9.5157015223999714e-10 + 2 +6.6137154894343041e+02 +3.2962856194733528e-10 + 3 +6.8373208082025531e+02 -2.3746534378088984e-10 + +[run] + +version 2.1 +date 2022-01-19 11:04:09 +0100 +host r04n07.palma.wwu +dir /scratch/tmp/j_kuhl19 +user j_kuhl19 +gauge_name /unity +gauge_md5 1ea28326e4090996111a320b8372811d +param_name sfcf_unity_test.in +param_hash 686af5e712ee2902180f5428af94c6e7 +data_name ./output_10519905/data_aF_V0 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 0 +wf_2 0 +corr_t + 1 +6.8367760900851147e+02 +3.0531839956225539e-10 + 2 +6.6131885855823339e+02 +3.9736225045852382e-12 + 3 +6.8367760900810049e+02 -2.5611665964422843e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 0 +wf_2 1 +corr_t + 1 +6.8370283168793060e+02 +3.0532966356282939e-10 + 2 +6.6134325636407561e+02 +3.9737690976212336e-12 + 3 +6.8370283168751973e+02 -2.5612610847134760e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 0 +wf_2 2 +corr_t + 1 +6.8370484437212463e+02 +3.0533056232915147e-10 + 2 +6.6134520322615822e+02 +3.9737807346122766e-12 + 3 +6.8370484437171353e+02 -2.5612686251836130e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 1 +wf_2 0 +corr_t + 1 +6.8370283168792889e+02 +3.0532890521977295e-10 + 2 +6.6134325636407402e+02 +3.9730355551484655e-12 + 3 +6.8370283168751791e+02 -2.5612686681440218e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 1 +wf_2 1 +corr_t + 1 +6.8372805529787934e+02 +3.0534016954586185e-10 + 2 +6.6136765507001564e+02 +3.9731820664935325e-12 + 3 +6.8372805529746825e+02 -2.5613631608015786e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 1 +wf_2 2 +corr_t + 1 +6.8373006805632656e+02 +3.0534106842445933e-10 + 2 +6.6136960200392332e+02 +3.9731937804440792e-12 + 3 +6.8373006805591558e+02 -2.5613707007587266e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 2 +wf_2 0 +corr_t + 1 +6.8370484437212156e+02 +3.0532220084664646e-10 + 2 +6.6134520322615526e+02 +3.9656927030717790e-12 + 3 +6.8370484437171069e+02 -2.5613522400086377e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 2 +wf_2 1 +corr_t + 1 +6.8373006805632599e+02 +3.0533346499198999e-10 + 2 +6.6136960200392275e+02 +3.9658390079382195e-12 + 3 +6.8373006805591490e+02 -2.5614467350834153e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 2 +wf_2 2 +corr_t + 1 +6.8373208082069789e+02 +3.0533436384459901e-10 + 2 +6.6137154894356127e+02 +3.9658506942251639e-12 + 3 +6.8373208082028680e+02 -2.5614542753491032e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 0 +wf_2 0 +corr_t + 1 +6.8367760900918211e+02 -9.5149222536505804e-10 + 2 +6.6131885855810310e+02 +3.2960434859595585e-10 + 3 +6.8367760900806934e+02 -2.3744430846347533e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 0 +wf_2 1 +corr_t + 1 +6.8370283168860135e+02 -9.5152732859532533e-10 + 2 +6.6134325636394544e+02 +3.2961650841969937e-10 + 3 +6.8370283168748858e+02 -2.3745306857315358e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 0 +wf_2 2 +corr_t + 1 +6.8370484437279526e+02 -9.5153012965274573e-10 + 2 +6.6134520322602793e+02 +3.2961747879154288e-10 + 3 +6.8370484437168250e+02 -2.3745376753897864e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 1 +wf_2 0 +corr_t + 1 +6.8370283168859953e+02 -9.5151770701795658e-10 + 2 +6.6134325636394351e+02 +3.2962581533640458e-10 + 3 +6.8370283168748665e+02 -2.3744344699578737e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 1 +wf_2 1 +corr_t + 1 +6.8372805529855032e+02 -9.5155281099707234e-10 + 2 +6.6136765506988547e+02 +3.2963797613709602e-10 + 3 +6.8372805529743755e+02 -2.3745220688244645e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 1 +wf_2 2 +corr_t + 1 +6.8373006805699742e+02 -9.5155561220425917e-10 + 2 +6.6136960200379315e+02 +3.2963894649982994e-10 + 3 +6.8373006805588454e+02 -2.3745290592048597e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 2 +wf_2 0 +corr_t + 1 +6.8370484437279174e+02 -9.5153224647433932e-10 + 2 +6.6134520322602452e+02 +3.2961543119772646e-10 + 3 +6.8370484437167897e+02 -2.3745588436057620e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 2 +wf_2 1 +corr_t + 1 +6.8373006805699617e+02 -9.5156735103669992e-10 + 2 +6.6136960200379178e+02 +3.2962759157000606e-10 + 3 +6.8373006805588329e+02 -2.3746464475292832e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 2 +wf_2 2 +corr_t + 1 +6.8373208082136819e+02 -9.5157015223999714e-10 + 2 +6.6137154894343041e+02 +3.2962856194733528e-10 + 3 +6.8373208082025531e+02 -2.3746534378088984e-10 + +[run] + +version 2.1 +date 2022-01-19 11:04:11 +0100 +host r04n07.palma.wwu +dir /scratch/tmp/j_kuhl19 +user j_kuhl19 +gauge_name /unity +gauge_md5 1ea28326e4090996111a320b8372811d +param_name sfcf_unity_test.in +param_hash 686af5e712ee2902180f5428af94c6e7 +data_name ./output_10519905/data_aF_V0 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 0 +wf_2 0 +corr_t + 1 +6.8367760900851147e+02 +3.0531839956225539e-10 + 2 +6.6131885855823339e+02 +3.9736225045852382e-12 + 3 +6.8367760900810049e+02 -2.5611665964422843e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 0 +wf_2 1 +corr_t + 1 +6.8370283168793060e+02 +3.0532966356282939e-10 + 2 +6.6134325636407561e+02 +3.9737690976212336e-12 + 3 +6.8370283168751973e+02 -2.5612610847134760e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 0 +wf_2 2 +corr_t + 1 +6.8370484437212463e+02 +3.0533056232915147e-10 + 2 +6.6134520322615822e+02 +3.9737807346122766e-12 + 3 +6.8370484437171353e+02 -2.5612686251836130e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 1 +wf_2 0 +corr_t + 1 +6.8370283168792889e+02 +3.0532890521977295e-10 + 2 +6.6134325636407402e+02 +3.9730355551484655e-12 + 3 +6.8370283168751791e+02 -2.5612686681440218e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 1 +wf_2 1 +corr_t + 1 +6.8372805529787934e+02 +3.0534016954586185e-10 + 2 +6.6136765507001564e+02 +3.9731820664935325e-12 + 3 +6.8372805529746825e+02 -2.5613631608015786e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 1 +wf_2 2 +corr_t + 1 +6.8373006805632656e+02 +3.0534106842445933e-10 + 2 +6.6136960200392332e+02 +3.9731937804440792e-12 + 3 +6.8373006805591558e+02 -2.5613707007587266e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 2 +wf_2 0 +corr_t + 1 +6.8370484437212156e+02 +3.0532220084664646e-10 + 2 +6.6134520322615526e+02 +3.9656927030717790e-12 + 3 +6.8370484437171069e+02 -2.5613522400086377e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 2 +wf_2 1 +corr_t + 1 +6.8373006805632599e+02 +3.0533346499198999e-10 + 2 +6.6136960200392275e+02 +3.9658390079382195e-12 + 3 +6.8373006805591490e+02 -2.5614467350834153e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 2 +wf_2 2 +corr_t + 1 +6.8373208082069789e+02 +3.0533436384459901e-10 + 2 +6.6137154894356127e+02 +3.9658506942251639e-12 + 3 +6.8373208082028680e+02 -2.5614542753491032e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 0 +wf_2 0 +corr_t + 1 +6.8367760900918211e+02 -9.5149222536505804e-10 + 2 +6.6131885855810310e+02 +3.2960434859595585e-10 + 3 +6.8367760900806934e+02 -2.3744430846347533e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 0 +wf_2 1 +corr_t + 1 +6.8370283168860135e+02 -9.5152732859532533e-10 + 2 +6.6134325636394544e+02 +3.2961650841969937e-10 + 3 +6.8370283168748858e+02 -2.3745306857315358e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 0 +wf_2 2 +corr_t + 1 +6.8370484437279526e+02 -9.5153012965274573e-10 + 2 +6.6134520322602793e+02 +3.2961747879154288e-10 + 3 +6.8370484437168250e+02 -2.3745376753897864e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 1 +wf_2 0 +corr_t + 1 +6.8370283168859953e+02 -9.5151770701795658e-10 + 2 +6.6134325636394351e+02 +3.2962581533640458e-10 + 3 +6.8370283168748665e+02 -2.3744344699578737e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 1 +wf_2 1 +corr_t + 1 +6.8372805529855032e+02 -9.5155281099707234e-10 + 2 +6.6136765506988547e+02 +3.2963797613709602e-10 + 3 +6.8372805529743755e+02 -2.3745220688244645e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 1 +wf_2 2 +corr_t + 1 +6.8373006805699742e+02 -9.5155561220425917e-10 + 2 +6.6136960200379315e+02 +3.2963894649982994e-10 + 3 +6.8373006805588454e+02 -2.3745290592048597e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 2 +wf_2 0 +corr_t + 1 +6.8370484437279174e+02 -9.5153224647433932e-10 + 2 +6.6134520322602452e+02 +3.2961543119772646e-10 + 3 +6.8370484437167897e+02 -2.3745588436057620e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 2 +wf_2 1 +corr_t + 1 +6.8373006805699617e+02 -9.5156735103669992e-10 + 2 +6.6136960200379178e+02 +3.2962759157000606e-10 + 3 +6.8373006805588329e+02 -2.3746464475292832e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 2 +wf_2 2 +corr_t + 1 +6.8373208082136819e+02 -9.5157015223999714e-10 + 2 +6.6137154894343041e+02 +3.2962856194733528e-10 + 3 +6.8373208082025531e+02 -2.3746534378088984e-10 + diff --git a/tests/data/sfcf_test/data_a/data_a.f_1 b/tests/data/sfcf_test/data_a/data_a.f_1 new file mode 100644 index 00000000..e40e70b4 --- /dev/null +++ b/tests/data/sfcf_test/data_a/data_a.f_1 @@ -0,0 +1,966 @@ +[run] + +version 2.1 +date 2022-01-19 11:04:03 +0100 +host r04n07.palma.wwu +dir /scratch/tmp/j_kuhl19 +user j_kuhl19 +gauge_name /unity +gauge_md5 1ea28326e4090996111a320b8372811d +param_name sfcf_unity_test.in +param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 +param_hash 686af5e712ee2902180f5428af94c6e7 +data_name ./output_10519905/data_af_1 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 0 +wf_2 0 +corr ++3.5119415254545021e+02 +6.7620978057264750e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 0 +wf_2 1 +corr ++3.5120703575855339e+02 +6.5026340956203663e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 0 +wf_2 2 +corr ++3.5120808902177868e+02 +6.5443496235264788e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 1 +wf_2 0 +corr ++3.5120703575855515e+02 +6.9706500417651470e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 1 +wf_2 1 +corr ++3.5122001235609065e+02 +6.9516150897757419e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 1 +wf_2 2 +corr ++3.5122104108046199e+02 +6.9232860455434941e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 2 +wf_2 0 +corr ++3.5120808902177447e+02 +1.0849949614595719e-14 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 2 +wf_2 1 +corr ++3.5122104108046182e+02 +1.0866063643253473e-14 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 2 +wf_2 2 +corr ++3.5122207631098047e+02 +1.0827277318679030e-14 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 0 +wf_2 0 +corr ++3.5119415254545038e+02 +3.0143306723935508e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 0 +wf_2 1 +corr ++3.5120703575855367e+02 +4.3340379505972648e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 0 +wf_2 2 +corr ++3.5120808902177902e+02 +3.9652247575094006e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 1 +wf_2 0 +corr ++3.5120703575855526e+02 -8.2540994138261318e-16 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 1 +wf_2 1 +corr ++3.5122001235609082e+02 -9.7121215247039609e-16 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 1 +wf_2 2 +corr ++3.5122104108046227e+02 -9.0872484903683497e-16 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 2 +wf_2 0 +corr ++3.5120808902177453e+02 +5.1331372776616026e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 2 +wf_2 1 +corr ++3.5122104108046193e+02 +5.0816653044831932e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 2 +wf_2 2 +corr ++3.5122207631098064e+02 +5.1165649253001659e-15 + +[run] + +version 2.1 +date 2022-01-19 11:04:05 +0100 +host r04n07.palma.wwu +dir /scratch/tmp/j_kuhl19 +user j_kuhl19 +gauge_name /unity +gauge_md5 1ea28326e4090996111a320b8372811d +param_name sfcf_unity_test.in +param_hash 686af5e712ee2902180f5428af94c6e7 +data_name ./output_10519905/data_af_1 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 0 +wf_2 0 +corr ++3.5119415254545021e+02 +6.7620978057264750e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 0 +wf_2 1 +corr ++3.5120703575855339e+02 +6.5026340956203663e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 0 +wf_2 2 +corr ++3.5120808902177868e+02 +6.5443496235264788e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 1 +wf_2 0 +corr ++3.5120703575855515e+02 +6.9706500417651470e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 1 +wf_2 1 +corr ++3.5122001235609065e+02 +6.9516150897757419e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 1 +wf_2 2 +corr ++3.5122104108046199e+02 +6.9232860455434941e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 2 +wf_2 0 +corr ++3.5120808902177447e+02 +1.0849949614595719e-14 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 2 +wf_2 1 +corr ++3.5122104108046182e+02 +1.0866063643253473e-14 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 2 +wf_2 2 +corr ++3.5122207631098047e+02 +1.0827277318679030e-14 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 0 +wf_2 0 +corr ++3.5119415254545038e+02 +3.0143306723935508e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 0 +wf_2 1 +corr ++3.5120703575855367e+02 +4.3340379505972648e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 0 +wf_2 2 +corr ++3.5120808902177902e+02 +3.9652247575094006e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 1 +wf_2 0 +corr ++3.5120703575855526e+02 -8.2540994138261318e-16 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 1 +wf_2 1 +corr ++3.5122001235609082e+02 -9.7121215247039609e-16 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 1 +wf_2 2 +corr ++3.5122104108046227e+02 -9.0872484903683497e-16 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 2 +wf_2 0 +corr ++3.5120808902177453e+02 +5.1331372776616026e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 2 +wf_2 1 +corr ++3.5122104108046193e+02 +5.0816653044831932e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 2 +wf_2 2 +corr ++3.5122207631098064e+02 +5.1165649253001659e-15 + +[run] + +version 2.1 +date 2022-01-19 11:04:07 +0100 +host r04n07.palma.wwu +dir /scratch/tmp/j_kuhl19 +user j_kuhl19 +gauge_name /unity +gauge_md5 1ea28326e4090996111a320b8372811d +param_name sfcf_unity_test.in +param_hash 686af5e712ee2902180f5428af94c6e7 +data_name ./output_10519905/data_af_1 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 0 +wf_2 0 +corr ++3.5119415254545021e+02 +6.7620978057264750e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 0 +wf_2 1 +corr ++3.5120703575855339e+02 +6.5026340956203663e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 0 +wf_2 2 +corr ++3.5120808902177868e+02 +6.5443496235264788e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 1 +wf_2 0 +corr ++3.5120703575855515e+02 +6.9706500417651470e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 1 +wf_2 1 +corr ++3.5122001235609065e+02 +6.9516150897757419e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 1 +wf_2 2 +corr ++3.5122104108046199e+02 +6.9232860455434941e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 2 +wf_2 0 +corr ++3.5120808902177447e+02 +1.0849949614595719e-14 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 2 +wf_2 1 +corr ++3.5122104108046182e+02 +1.0866063643253473e-14 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 2 +wf_2 2 +corr ++3.5122207631098047e+02 +1.0827277318679030e-14 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 0 +wf_2 0 +corr ++3.5119415254545038e+02 +3.0143306723935508e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 0 +wf_2 1 +corr ++3.5120703575855367e+02 +4.3340379505972648e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 0 +wf_2 2 +corr ++3.5120808902177902e+02 +3.9652247575094006e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 1 +wf_2 0 +corr ++3.5120703575855526e+02 -8.2540994138261318e-16 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 1 +wf_2 1 +corr ++3.5122001235609082e+02 -9.7121215247039609e-16 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 1 +wf_2 2 +corr ++3.5122104108046227e+02 -9.0872484903683497e-16 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 2 +wf_2 0 +corr ++3.5120808902177453e+02 +5.1331372776616026e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 2 +wf_2 1 +corr ++3.5122104108046193e+02 +5.0816653044831932e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 2 +wf_2 2 +corr ++3.5122207631098064e+02 +5.1165649253001659e-15 + +[run] + +version 2.1 +date 2022-01-19 11:04:09 +0100 +host r04n07.palma.wwu +dir /scratch/tmp/j_kuhl19 +user j_kuhl19 +gauge_name /unity +gauge_md5 1ea28326e4090996111a320b8372811d +param_name sfcf_unity_test.in +param_hash 686af5e712ee2902180f5428af94c6e7 +data_name ./output_10519905/data_af_1 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 0 +wf_2 0 +corr ++3.5119415254545021e+02 +6.7620978057264750e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 0 +wf_2 1 +corr ++3.5120703575855339e+02 +6.5026340956203663e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 0 +wf_2 2 +corr ++3.5120808902177868e+02 +6.5443496235264788e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 1 +wf_2 0 +corr ++3.5120703575855515e+02 +6.9706500417651470e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 1 +wf_2 1 +corr ++3.5122001235609065e+02 +6.9516150897757419e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 1 +wf_2 2 +corr ++3.5122104108046199e+02 +6.9232860455434941e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 2 +wf_2 0 +corr ++3.5120808902177447e+02 +1.0849949614595719e-14 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 2 +wf_2 1 +corr ++3.5122104108046182e+02 +1.0866063643253473e-14 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 2 +wf_2 2 +corr ++3.5122207631098047e+02 +1.0827277318679030e-14 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 0 +wf_2 0 +corr ++3.5119415254545038e+02 +3.0143306723935508e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 0 +wf_2 1 +corr ++3.5120703575855367e+02 +4.3340379505972648e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 0 +wf_2 2 +corr ++3.5120808902177902e+02 +3.9652247575094006e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 1 +wf_2 0 +corr ++3.5120703575855526e+02 -8.2540994138261318e-16 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 1 +wf_2 1 +corr ++3.5122001235609082e+02 -9.7121215247039609e-16 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 1 +wf_2 2 +corr ++3.5122104108046227e+02 -9.0872484903683497e-16 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 2 +wf_2 0 +corr ++3.5120808902177453e+02 +5.1331372776616026e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 2 +wf_2 1 +corr ++3.5122104108046193e+02 +5.0816653044831932e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 2 +wf_2 2 +corr ++3.5122207631098064e+02 +5.1165649253001659e-15 + +[run] + +version 2.1 +date 2022-01-19 11:04:11 +0100 +host r04n07.palma.wwu +dir /scratch/tmp/j_kuhl19 +user j_kuhl19 +gauge_name /unity +gauge_md5 1ea28326e4090996111a320b8372811d +param_name sfcf_unity_test.in +param_hash 686af5e712ee2902180f5428af94c6e7 +data_name ./output_10519905/data_af_1 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 0 +wf_2 0 +corr ++3.5119415254545021e+02 +6.7620978057264750e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 0 +wf_2 1 +corr ++3.5120703575855339e+02 +6.5026340956203663e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 0 +wf_2 2 +corr ++3.5120808902177868e+02 +6.5443496235264788e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 1 +wf_2 0 +corr ++3.5120703575855515e+02 +6.9706500417651470e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 1 +wf_2 1 +corr ++3.5122001235609065e+02 +6.9516150897757419e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 1 +wf_2 2 +corr ++3.5122104108046199e+02 +6.9232860455434941e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 2 +wf_2 0 +corr ++3.5120808902177447e+02 +1.0849949614595719e-14 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 2 +wf_2 1 +corr ++3.5122104108046182e+02 +1.0866063643253473e-14 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 2 +wf_2 2 +corr ++3.5122207631098047e+02 +1.0827277318679030e-14 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 0 +wf_2 0 +corr ++3.5119415254545038e+02 +3.0143306723935508e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 0 +wf_2 1 +corr ++3.5120703575855367e+02 +4.3340379505972648e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 0 +wf_2 2 +corr ++3.5120808902177902e+02 +3.9652247575094006e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 1 +wf_2 0 +corr ++3.5120703575855526e+02 -8.2540994138261318e-16 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 1 +wf_2 1 +corr ++3.5122001235609082e+02 -9.7121215247039609e-16 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 1 +wf_2 2 +corr ++3.5122104108046227e+02 -9.0872484903683497e-16 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 2 +wf_2 0 +corr ++3.5120808902177453e+02 +5.1331372776616026e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 2 +wf_2 1 +corr ++3.5122104108046193e+02 +5.0816653044831932e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 2 +wf_2 2 +corr ++3.5122207631098064e+02 +5.1165649253001659e-15 + diff --git a/tests/data/sfcf_test/data_a/data_a.f_A b/tests/data/sfcf_test/data_a/data_a.f_A new file mode 100644 index 00000000..a37c0f92 --- /dev/null +++ b/tests/data/sfcf_test/data_a/data_a.f_A @@ -0,0 +1,396 @@ +[run] + +version 2.1 +date 2022-01-19 11:04:03 +0100 +host r04n07.palma.wwu +dir /scratch/tmp/j_kuhl19 +user j_kuhl19 +gauge_name /unity +gauge_md5 1ea28326e4090996111a320b8372811d +param_name sfcf_unity_test.in +param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 +param_hash 686af5e712ee2902180f5428af94c6e7 +data_name ./output_10519905/data_af_A + +[correlator] + +name f_A +quarks lquark lquark +offset 0 +wf 0 +corr_t + 1 +6.5471188727972304e+01 -6.1214214711790100e-12 + 2 +1.0447210336915187e+00 +8.9219487930753188e-13 + 3 -4.1025094911185178e+01 -4.8315634170546161e-14 + +[correlator] + +name f_A +quarks lquark lquark +offset 0 +wf 1 +corr_t + 1 +6.5551520722862705e+01 +2.0963356863957609e-13 + 2 +1.0542820240851569e+00 +2.3989756974599379e-15 + 3 -4.1024441815729936e+01 -5.7107484666182308e-15 + +[correlator] + +name f_A +quarks lquark lquark +offset 0 +wf 2 +corr_t + 1 +6.5529951269442847e+01 -6.6512260271334321e-14 + 2 +1.0516822345055969e+00 -2.2935262162529075e-15 + 3 -4.1025142768037746e+01 +3.7566377680004518e-16 + +[correlator] + +name f_A +quarks lquark lquark +offset 1 +wf 0 +corr_t + 1 +6.5471188727965909e+01 -1.6112786177915427e-11 + 2 +1.0447210337411881e+00 -7.0387528705692678e-13 + 3 -4.1025094911167137e+01 +4.6509152745618223e-13 + +[correlator] + +name f_A +quarks lquark lquark +offset 1 +wf 1 +corr_t + 1 +6.5551520722842213e+01 -8.1976426690345305e-13 + 2 +1.0542820240843382e+00 +2.1626370477046812e-13 + 3 -4.1024441815730086e+01 -2.4147931196409923e-14 + +[correlator] + +name f_A +quarks lquark lquark +offset 1 +wf 2 +corr_t + 1 +6.5529951269443117e+01 +7.9192560386479701e-14 + 2 +1.0516822345055870e+00 -1.2443038782429568e-14 + 3 -4.1025142768037739e+01 +5.9315333178954509e-17 + +[run] + +version 2.1 +date 2022-01-19 11:04:05 +0100 +host r04n07.palma.wwu +dir /scratch/tmp/j_kuhl19 +user j_kuhl19 +gauge_name /unity +gauge_md5 1ea28326e4090996111a320b8372811d +param_name sfcf_unity_test.in +param_hash 686af5e712ee2902180f5428af94c6e7 +data_name ./output_10519905/data_af_A + +[correlator] + +name f_A +quarks lquark lquark +offset 0 +wf 0 +corr_t + 1 +6.5471188727972304e+01 -6.1214214711790100e-12 + 2 +1.0447210336915187e+00 +8.9219487930753188e-13 + 3 -4.1025094911185178e+01 -4.8315634170546161e-14 + +[correlator] + +name f_A +quarks lquark lquark +offset 0 +wf 1 +corr_t + 1 +6.5551520722862705e+01 +2.0963356863957609e-13 + 2 +1.0542820240851569e+00 +2.3989756974599379e-15 + 3 -4.1024441815729936e+01 -5.7107484666182308e-15 + +[correlator] + +name f_A +quarks lquark lquark +offset 0 +wf 2 +corr_t + 1 +6.5529951269442847e+01 -6.6512260271334321e-14 + 2 +1.0516822345055969e+00 -2.2935262162529075e-15 + 3 -4.1025142768037746e+01 +3.7566377680004518e-16 + +[correlator] + +name f_A +quarks lquark lquark +offset 1 +wf 0 +corr_t + 1 +6.5471188727965909e+01 -1.6112786177915427e-11 + 2 +1.0447210337411881e+00 -7.0387528705692678e-13 + 3 -4.1025094911167137e+01 +4.6509152745618223e-13 + +[correlator] + +name f_A +quarks lquark lquark +offset 1 +wf 1 +corr_t + 1 +6.5551520722842213e+01 -8.1976426690345305e-13 + 2 +1.0542820240843382e+00 +2.1626370477046812e-13 + 3 -4.1024441815730086e+01 -2.4147931196409923e-14 + +[correlator] + +name f_A +quarks lquark lquark +offset 1 +wf 2 +corr_t + 1 +6.5529951269443117e+01 +7.9192560386479701e-14 + 2 +1.0516822345055870e+00 -1.2443038782429568e-14 + 3 -4.1025142768037739e+01 +5.9315333178954509e-17 + +[run] + +version 2.1 +date 2022-01-19 11:04:07 +0100 +host r04n07.palma.wwu +dir /scratch/tmp/j_kuhl19 +user j_kuhl19 +gauge_name /unity +gauge_md5 1ea28326e4090996111a320b8372811d +param_name sfcf_unity_test.in +param_hash 686af5e712ee2902180f5428af94c6e7 +data_name ./output_10519905/data_af_A + +[correlator] + +name f_A +quarks lquark lquark +offset 0 +wf 0 +corr_t + 1 +6.5471188727972304e+01 -6.1214214711790100e-12 + 2 +1.0447210336915187e+00 +8.9219487930753188e-13 + 3 -4.1025094911185178e+01 -4.8315634170546161e-14 + +[correlator] + +name f_A +quarks lquark lquark +offset 0 +wf 1 +corr_t + 1 +6.5551520722862705e+01 +2.0963356863957609e-13 + 2 +1.0542820240851569e+00 +2.3989756974599379e-15 + 3 -4.1024441815729936e+01 -5.7107484666182308e-15 + +[correlator] + +name f_A +quarks lquark lquark +offset 0 +wf 2 +corr_t + 1 +6.5529951269442847e+01 -6.6512260271334321e-14 + 2 +1.0516822345055969e+00 -2.2935262162529075e-15 + 3 -4.1025142768037746e+01 +3.7566377680004518e-16 + +[correlator] + +name f_A +quarks lquark lquark +offset 1 +wf 0 +corr_t + 1 +6.5471188727965909e+01 -1.6112786177915427e-11 + 2 +1.0447210337411881e+00 -7.0387528705692678e-13 + 3 -4.1025094911167137e+01 +4.6509152745618223e-13 + +[correlator] + +name f_A +quarks lquark lquark +offset 1 +wf 1 +corr_t + 1 +6.5551520722842213e+01 -8.1976426690345305e-13 + 2 +1.0542820240843382e+00 +2.1626370477046812e-13 + 3 -4.1024441815730086e+01 -2.4147931196409923e-14 + +[correlator] + +name f_A +quarks lquark lquark +offset 1 +wf 2 +corr_t + 1 +6.5529951269443117e+01 +7.9192560386479701e-14 + 2 +1.0516822345055870e+00 -1.2443038782429568e-14 + 3 -4.1025142768037739e+01 +5.9315333178954509e-17 + +[run] + +version 2.1 +date 2022-01-19 11:04:09 +0100 +host r04n07.palma.wwu +dir /scratch/tmp/j_kuhl19 +user j_kuhl19 +gauge_name /unity +gauge_md5 1ea28326e4090996111a320b8372811d +param_name sfcf_unity_test.in +param_hash 686af5e712ee2902180f5428af94c6e7 +data_name ./output_10519905/data_af_A + +[correlator] + +name f_A +quarks lquark lquark +offset 0 +wf 0 +corr_t + 1 +6.5471188727972304e+01 -6.1214214711790100e-12 + 2 +1.0447210336915187e+00 +8.9219487930753188e-13 + 3 -4.1025094911185178e+01 -4.8315634170546161e-14 + +[correlator] + +name f_A +quarks lquark lquark +offset 0 +wf 1 +corr_t + 1 +6.5551520722862705e+01 +2.0963356863957609e-13 + 2 +1.0542820240851569e+00 +2.3989756974599379e-15 + 3 -4.1024441815729936e+01 -5.7107484666182308e-15 + +[correlator] + +name f_A +quarks lquark lquark +offset 0 +wf 2 +corr_t + 1 +6.5529951269442847e+01 -6.6512260271334321e-14 + 2 +1.0516822345055969e+00 -2.2935262162529075e-15 + 3 -4.1025142768037746e+01 +3.7566377680004518e-16 + +[correlator] + +name f_A +quarks lquark lquark +offset 1 +wf 0 +corr_t + 1 +6.5471188727965909e+01 -1.6112786177915427e-11 + 2 +1.0447210337411881e+00 -7.0387528705692678e-13 + 3 -4.1025094911167137e+01 +4.6509152745618223e-13 + +[correlator] + +name f_A +quarks lquark lquark +offset 1 +wf 1 +corr_t + 1 +6.5551520722842213e+01 -8.1976426690345305e-13 + 2 +1.0542820240843382e+00 +2.1626370477046812e-13 + 3 -4.1024441815730086e+01 -2.4147931196409923e-14 + +[correlator] + +name f_A +quarks lquark lquark +offset 1 +wf 2 +corr_t + 1 +6.5529951269443117e+01 +7.9192560386479701e-14 + 2 +1.0516822345055870e+00 -1.2443038782429568e-14 + 3 -4.1025142768037739e+01 +5.9315333178954509e-17 + +[run] + +version 2.1 +date 2022-01-19 11:04:11 +0100 +host r04n07.palma.wwu +dir /scratch/tmp/j_kuhl19 +user j_kuhl19 +gauge_name /unity +gauge_md5 1ea28326e4090996111a320b8372811d +param_name sfcf_unity_test.in +param_hash 686af5e712ee2902180f5428af94c6e7 +data_name ./output_10519905/data_af_A + +[correlator] + +name f_A +quarks lquark lquark +offset 0 +wf 0 +corr_t + 1 +6.5471188727972304e+01 -6.1214214711790100e-12 + 2 +1.0447210336915187e+00 +8.9219487930753188e-13 + 3 -4.1025094911185178e+01 -4.8315634170546161e-14 + +[correlator] + +name f_A +quarks lquark lquark +offset 0 +wf 1 +corr_t + 1 +6.5551520722862705e+01 +2.0963356863957609e-13 + 2 +1.0542820240851569e+00 +2.3989756974599379e-15 + 3 -4.1024441815729936e+01 -5.7107484666182308e-15 + +[correlator] + +name f_A +quarks lquark lquark +offset 0 +wf 2 +corr_t + 1 +6.5529951269442847e+01 -6.6512260271334321e-14 + 2 +1.0516822345055969e+00 -2.2935262162529075e-15 + 3 -4.1025142768037746e+01 +3.7566377680004518e-16 + +[correlator] + +name f_A +quarks lquark lquark +offset 1 +wf 0 +corr_t + 1 +6.5471188727965909e+01 -1.6112786177915427e-11 + 2 +1.0447210337411881e+00 -7.0387528705692678e-13 + 3 -4.1025094911167137e+01 +4.6509152745618223e-13 + +[correlator] + +name f_A +quarks lquark lquark +offset 1 +wf 1 +corr_t + 1 +6.5551520722842213e+01 -8.1976426690345305e-13 + 2 +1.0542820240843382e+00 +2.1626370477046812e-13 + 3 -4.1024441815730086e+01 -2.4147931196409923e-14 + +[correlator] + +name f_A +quarks lquark lquark +offset 1 +wf 2 +corr_t + 1 +6.5529951269443117e+01 +7.9192560386479701e-14 + 2 +1.0516822345055870e+00 -1.2443038782429568e-14 + 3 -4.1025142768037739e+01 +5.9315333178954509e-17 + diff --git a/tests/data/sfcf_test/data_c/data_c_r0/data_c_r0_n1 b/tests/data/sfcf_test/data_c/data_c_r0/data_c_r0_n1 new file mode 100644 index 00000000..90275570 --- /dev/null +++ b/tests/data/sfcf_test/data_c/data_c_r0/data_c_r0_n1 @@ -0,0 +1,476 @@ +[run] + +version 2.1 +date 2022-01-19 11:03:58 +0100 +host r04n07.palma.wwu +dir /scratch/tmp/j_kuhl19 +user j_kuhl19 +gauge_name /unity +gauge_md5 1ea28326e4090996111a320b8372811d +param_name sfcf_unity_test.in +param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 +param_hash 686af5e712ee2902180f5428af94c6e7 +data_name ./output_10519905/data_c + +[correlator] + +name f_A +quarks lquark lquark +offset 0 +wf 0 +corr_t + 1 +6.5471188727972304e+01 -6.1214214711790100e-12 + 2 +1.0447210336915187e+00 +8.9219487930753188e-13 + 3 -4.1025094911185178e+01 -4.8315634170546161e-14 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 0 +wf_2 0 +corr ++3.5119415254545021e+02 +6.7620978057264750e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 0 +wf_2 1 +corr ++3.5120703575855339e+02 +6.5026340956203663e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 0 +wf_2 2 +corr ++3.5120808902177868e+02 +6.5443496235264788e-15 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 0 +wf_2 0 +corr_t + 1 +6.8367760900851147e+02 +3.0531839956225539e-10 + 2 +6.6131885855823339e+02 +3.9736225045852382e-12 + 3 +6.8367760900810049e+02 -2.5611665964422843e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 0 +wf_2 1 +corr_t + 1 +6.8370283168793060e+02 +3.0532966356282939e-10 + 2 +6.6134325636407561e+02 +3.9737690976212336e-12 + 3 +6.8370283168751973e+02 -2.5612610847134760e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 0 +wf_2 2 +corr_t + 1 +6.8370484437212463e+02 +3.0533056232915147e-10 + 2 +6.6134520322615822e+02 +3.9737807346122766e-12 + 3 +6.8370484437171353e+02 -2.5612686251836130e-10 + +[correlator] + +name f_A +quarks lquark lquark +offset 0 +wf 1 +corr_t + 1 +6.5551520722862705e+01 +2.0963356863957609e-13 + 2 +1.0542820240851569e+00 +2.3989756974599379e-15 + 3 -4.1024441815729936e+01 -5.7107484666182308e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 1 +wf_2 0 +corr ++3.5120703575855515e+02 +6.9706500417651470e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 1 +wf_2 1 +corr ++3.5122001235609065e+02 +6.9516150897757419e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 1 +wf_2 2 +corr ++3.5122104108046199e+02 +6.9232860455434941e-15 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 1 +wf_2 0 +corr_t + 1 +6.8370283168792889e+02 +3.0532890521977295e-10 + 2 +6.6134325636407402e+02 +3.9730355551484655e-12 + 3 +6.8370283168751791e+02 -2.5612686681440218e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 1 +wf_2 1 +corr_t + 1 +6.8372805529787934e+02 +3.0534016954586185e-10 + 2 +6.6136765507001564e+02 +3.9731820664935325e-12 + 3 +6.8372805529746825e+02 -2.5613631608015786e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 1 +wf_2 2 +corr_t + 1 +6.8373006805632656e+02 +3.0534106842445933e-10 + 2 +6.6136960200392332e+02 +3.9731937804440792e-12 + 3 +6.8373006805591558e+02 -2.5613707007587266e-10 + +[correlator] + +name f_A +quarks lquark lquark +offset 0 +wf 2 +corr_t + 1 +6.5529951269442847e+01 -6.6512260271334321e-14 + 2 +1.0516822345055969e+00 -2.2935262162529075e-15 + 3 -4.1025142768037746e+01 +3.7566377680004518e-16 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 2 +wf_2 0 +corr ++3.5120808902177447e+02 +1.0849949614595719e-14 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 2 +wf_2 1 +corr ++3.5122104108046182e+02 +1.0866063643253473e-14 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 2 +wf_2 2 +corr ++3.5122207631098047e+02 +1.0827277318679030e-14 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 2 +wf_2 0 +corr_t + 1 +6.8370484437212156e+02 +3.0532220084664646e-10 + 2 +6.6134520322615526e+02 +3.9656927030717790e-12 + 3 +6.8370484437171069e+02 -2.5613522400086377e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 2 +wf_2 1 +corr_t + 1 +6.8373006805632599e+02 +3.0533346499198999e-10 + 2 +6.6136960200392275e+02 +3.9658390079382195e-12 + 3 +6.8373006805591490e+02 -2.5614467350834153e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 2 +wf_2 2 +corr_t + 1 +6.8373208082069789e+02 +3.0533436384459901e-10 + 2 +6.6137154894356127e+02 +3.9658506942251639e-12 + 3 +6.8373208082028680e+02 -2.5614542753491032e-10 + +[correlator] + +name f_A +quarks lquark lquark +offset 1 +wf 0 +corr_t + 1 +6.5471188727965909e+01 -1.6112786177915427e-11 + 2 +1.0447210337411881e+00 -7.0387528705692678e-13 + 3 -4.1025094911167137e+01 +4.6509152745618223e-13 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 0 +wf_2 0 +corr ++3.5119415254545038e+02 +3.0143306723935508e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 0 +wf_2 1 +corr ++3.5120703575855367e+02 +4.3340379505972648e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 0 +wf_2 2 +corr ++3.5120808902177902e+02 +3.9652247575094006e-15 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 0 +wf_2 0 +corr_t + 1 +6.8367760900918211e+02 -9.5149222536505804e-10 + 2 +6.6131885855810310e+02 +3.2960434859595585e-10 + 3 +6.8367760900806934e+02 -2.3744430846347533e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 0 +wf_2 1 +corr_t + 1 +6.8370283168860135e+02 -9.5152732859532533e-10 + 2 +6.6134325636394544e+02 +3.2961650841969937e-10 + 3 +6.8370283168748858e+02 -2.3745306857315358e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 0 +wf_2 2 +corr_t + 1 +6.8370484437279526e+02 -9.5153012965274573e-10 + 2 +6.6134520322602793e+02 +3.2961747879154288e-10 + 3 +6.8370484437168250e+02 -2.3745376753897864e-10 + +[correlator] + +name f_A +quarks lquark lquark +offset 1 +wf 1 +corr_t + 1 +6.5551520722842213e+01 -8.1976426690345305e-13 + 2 +1.0542820240843382e+00 +2.1626370477046812e-13 + 3 -4.1024441815730086e+01 -2.4147931196409923e-14 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 1 +wf_2 0 +corr ++3.5120703575855526e+02 -8.2540994138261318e-16 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 1 +wf_2 1 +corr ++3.5122001235609082e+02 -9.7121215247039609e-16 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 1 +wf_2 2 +corr ++3.5122104108046227e+02 -9.0872484903683497e-16 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 1 +wf_2 0 +corr_t + 1 +6.8370283168859953e+02 -9.5151770701795658e-10 + 2 +6.6134325636394351e+02 +3.2962581533640458e-10 + 3 +6.8370283168748665e+02 -2.3744344699578737e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 1 +wf_2 1 +corr_t + 1 +6.8372805529855032e+02 -9.5155281099707234e-10 + 2 +6.6136765506988547e+02 +3.2963797613709602e-10 + 3 +6.8372805529743755e+02 -2.3745220688244645e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 1 +wf_2 2 +corr_t + 1 +6.8373006805699742e+02 -9.5155561220425917e-10 + 2 +6.6136960200379315e+02 +3.2963894649982994e-10 + 3 +6.8373006805588454e+02 -2.3745290592048597e-10 + +[correlator] + +name f_A +quarks lquark lquark +offset 1 +wf 2 +corr_t + 1 +6.5529951269443117e+01 +7.9192560386479701e-14 + 2 +1.0516822345055870e+00 -1.2443038782429568e-14 + 3 -4.1025142768037739e+01 +5.9315333178954509e-17 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 2 +wf_2 0 +corr ++3.5120808902177453e+02 +5.1331372776616026e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 2 +wf_2 1 +corr ++3.5122104108046193e+02 +5.0816653044831932e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 2 +wf_2 2 +corr ++3.5122207631098064e+02 +5.1165649253001659e-15 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 2 +wf_2 0 +corr_t + 1 +6.8370484437279174e+02 -9.5153224647433932e-10 + 2 +6.6134520322602452e+02 +3.2961543119772646e-10 + 3 +6.8370484437167897e+02 -2.3745588436057620e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 2 +wf_2 1 +corr_t + 1 +6.8373006805699617e+02 -9.5156735103669992e-10 + 2 +6.6136960200379178e+02 +3.2962759157000606e-10 + 3 +6.8373006805588329e+02 -2.3746464475292832e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 2 +wf_2 2 +corr_t + 1 +6.8373208082136819e+02 -9.5157015223999714e-10 + 2 +6.6137154894343041e+02 +3.2962856194733528e-10 + 3 +6.8373208082025531e+02 -2.3746534378088984e-10 + diff --git a/tests/data/sfcf_test/data_o/cfg1/F_V0 b/tests/data/sfcf_test/data_o/cfg1/F_V0 new file mode 100644 index 00000000..b0e4fb17 --- /dev/null +++ b/tests/data/sfcf_test/data_o/cfg1/F_V0 @@ -0,0 +1,230 @@ +[run] + +version 2.1 +date 2022-01-19 11:04:00 +0100 +host r04n07.palma.wwu +dir /scratch/tmp/j_kuhl19 +user j_kuhl19 +gauge_name /unity +gauge_md5 1ea28326e4090996111a320b8372811d +param_name sfcf_unity_test.in +param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 +param_hash 686af5e712ee2902180f5428af94c6e7 +data_name ./output_10519905/data_oF_V0 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 0 +wf_2 0 +corr_t + 1 +6.8367760900851147e+02 +3.0531839956225539e-10 + 2 +6.6131885855823339e+02 +3.9736225045852382e-12 + 3 +6.8367760900810049e+02 -2.5611665964422843e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 0 +wf_2 1 +corr_t + 1 +6.8370283168793060e+02 +3.0532966356282939e-10 + 2 +6.6134325636407561e+02 +3.9737690976212336e-12 + 3 +6.8370283168751973e+02 -2.5612610847134760e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 0 +wf_2 2 +corr_t + 1 +6.8370484437212463e+02 +3.0533056232915147e-10 + 2 +6.6134520322615822e+02 +3.9737807346122766e-12 + 3 +6.8370484437171353e+02 -2.5612686251836130e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 1 +wf_2 0 +corr_t + 1 +6.8370283168792889e+02 +3.0532890521977295e-10 + 2 +6.6134325636407402e+02 +3.9730355551484655e-12 + 3 +6.8370283168751791e+02 -2.5612686681440218e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 1 +wf_2 1 +corr_t + 1 +6.8372805529787934e+02 +3.0534016954586185e-10 + 2 +6.6136765507001564e+02 +3.9731820664935325e-12 + 3 +6.8372805529746825e+02 -2.5613631608015786e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 1 +wf_2 2 +corr_t + 1 +6.8373006805632656e+02 +3.0534106842445933e-10 + 2 +6.6136960200392332e+02 +3.9731937804440792e-12 + 3 +6.8373006805591558e+02 -2.5613707007587266e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 2 +wf_2 0 +corr_t + 1 +6.8370484437212156e+02 +3.0532220084664646e-10 + 2 +6.6134520322615526e+02 +3.9656927030717790e-12 + 3 +6.8370484437171069e+02 -2.5613522400086377e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 2 +wf_2 1 +corr_t + 1 +6.8373006805632599e+02 +3.0533346499198999e-10 + 2 +6.6136960200392275e+02 +3.9658390079382195e-12 + 3 +6.8373006805591490e+02 -2.5614467350834153e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 0 +wf 2 +wf_2 2 +corr_t + 1 +6.8373208082069789e+02 +3.0533436384459901e-10 + 2 +6.6137154894356127e+02 +3.9658506942251639e-12 + 3 +6.8373208082028680e+02 -2.5614542753491032e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 0 +wf_2 0 +corr_t + 1 +6.8367760900918211e+02 -9.5149222536505804e-10 + 2 +6.6131885855810310e+02 +3.2960434859595585e-10 + 3 +6.8367760900806934e+02 -2.3744430846347533e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 0 +wf_2 1 +corr_t + 1 +6.8370283168860135e+02 -9.5152732859532533e-10 + 2 +6.6134325636394544e+02 +3.2961650841969937e-10 + 3 +6.8370283168748858e+02 -2.3745306857315358e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 0 +wf_2 2 +corr_t + 1 +6.8370484437279526e+02 -9.5153012965274573e-10 + 2 +6.6134520322602793e+02 +3.2961747879154288e-10 + 3 +6.8370484437168250e+02 -2.3745376753897864e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 1 +wf_2 0 +corr_t + 1 +6.8370283168859953e+02 -9.5151770701795658e-10 + 2 +6.6134325636394351e+02 +3.2962581533640458e-10 + 3 +6.8370283168748665e+02 -2.3744344699578737e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 1 +wf_2 1 +corr_t + 1 +6.8372805529855032e+02 -9.5155281099707234e-10 + 2 +6.6136765506988547e+02 +3.2963797613709602e-10 + 3 +6.8372805529743755e+02 -2.3745220688244645e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 1 +wf_2 2 +corr_t + 1 +6.8373006805699742e+02 -9.5155561220425917e-10 + 2 +6.6136960200379315e+02 +3.2963894649982994e-10 + 3 +6.8373006805588454e+02 -2.3745290592048597e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 2 +wf_2 0 +corr_t + 1 +6.8370484437279174e+02 -9.5153224647433932e-10 + 2 +6.6134520322602452e+02 +3.2961543119772646e-10 + 3 +6.8370484437167897e+02 -2.3745588436057620e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 2 +wf_2 1 +corr_t + 1 +6.8373006805699617e+02 -9.5156735103669992e-10 + 2 +6.6136960200379178e+02 +3.2962759157000606e-10 + 3 +6.8373006805588329e+02 -2.3746464475292832e-10 + +[correlator] + +name F_V0 +quarks lquark lquark +offset 1 +wf 2 +wf_2 2 +corr_t + 1 +6.8373208082136819e+02 -9.5157015223999714e-10 + 2 +6.6137154894343041e+02 +3.2962856194733528e-10 + 3 +6.8373208082025531e+02 -2.3746534378088984e-10 + diff --git a/tests/data/sfcf_test/data_o/cfg1/f_1 b/tests/data/sfcf_test/data_o/cfg1/f_1 new file mode 100644 index 00000000..09751218 --- /dev/null +++ b/tests/data/sfcf_test/data_o/cfg1/f_1 @@ -0,0 +1,194 @@ +[run] + +version 2.1 +date 2022-01-19 11:04:00 +0100 +host r04n07.palma.wwu +dir /scratch/tmp/j_kuhl19 +user j_kuhl19 +gauge_name /unity +gauge_md5 1ea28326e4090996111a320b8372811d +param_name sfcf_unity_test.in +param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 +param_hash 686af5e712ee2902180f5428af94c6e7 +data_name ./output_10519905/data_of_1 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 0 +wf_2 0 +corr ++3.5119415254545021e+02 +6.7620978057264750e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 0 +wf_2 1 +corr ++3.5120703575855339e+02 +6.5026340956203663e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 0 +wf_2 2 +corr ++3.5120808902177868e+02 +6.5443496235264788e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 1 +wf_2 0 +corr ++3.5120703575855515e+02 +6.9706500417651470e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 1 +wf_2 1 +corr ++3.5122001235609065e+02 +6.9516150897757419e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 1 +wf_2 2 +corr ++3.5122104108046199e+02 +6.9232860455434941e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 2 +wf_2 0 +corr ++3.5120808902177447e+02 +1.0849949614595719e-14 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 2 +wf_2 1 +corr ++3.5122104108046182e+02 +1.0866063643253473e-14 + +[correlator] + +name f_1 +quarks lquark lquark +offset 0 +wf 2 +wf_2 2 +corr ++3.5122207631098047e+02 +1.0827277318679030e-14 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 0 +wf_2 0 +corr ++3.5119415254545038e+02 +3.0143306723935508e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 0 +wf_2 1 +corr ++3.5120703575855367e+02 +4.3340379505972648e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 0 +wf_2 2 +corr ++3.5120808902177902e+02 +3.9652247575094006e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 1 +wf_2 0 +corr ++3.5120703575855526e+02 -8.2540994138261318e-16 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 1 +wf_2 1 +corr ++3.5122001235609082e+02 -9.7121215247039609e-16 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 1 +wf_2 2 +corr ++3.5122104108046227e+02 -9.0872484903683497e-16 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 2 +wf_2 0 +corr ++3.5120808902177453e+02 +5.1331372776616026e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 2 +wf_2 1 +corr ++3.5122104108046193e+02 +5.0816653044831932e-15 + +[correlator] + +name f_1 +quarks lquark lquark +offset 1 +wf 2 +wf_2 2 +corr ++3.5122207631098064e+02 +5.1165649253001659e-15 + diff --git a/tests/data/sfcf_test/data_o/cfg1/f_A b/tests/data/sfcf_test/data_o/cfg1/f_A new file mode 100644 index 00000000..74be18ea --- /dev/null +++ b/tests/data/sfcf_test/data_o/cfg1/f_A @@ -0,0 +1,80 @@ +[run] + +version 2.1 +date 2022-01-19 11:04:00 +0100 +host r04n07.palma.wwu +dir /scratch/tmp/j_kuhl19 +user j_kuhl19 +gauge_name /unity +gauge_md5 1ea28326e4090996111a320b8372811d +param_name sfcf_unity_test.in +param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 +param_hash 686af5e712ee2902180f5428af94c6e7 +data_name ./output_10519905/data_of_A + +[correlator] + +name f_A +quarks lquark lquark +offset 0 +wf 0 +corr_t + 1 +6.5471188727972304e+01 -6.1214214711790100e-12 + 2 +1.0447210336915187e+00 +8.9219487930753188e-13 + 3 -4.1025094911185178e+01 -4.8315634170546161e-14 + +[correlator] + +name f_A +quarks lquark lquark +offset 0 +wf 1 +corr_t + 1 +6.5551520722862705e+01 +2.0963356863957609e-13 + 2 +1.0542820240851569e+00 +2.3989756974599379e-15 + 3 -4.1024441815729936e+01 -5.7107484666182308e-15 + +[correlator] + +name f_A +quarks lquark lquark +offset 0 +wf 2 +corr_t + 1 +6.5529951269442847e+01 -6.6512260271334321e-14 + 2 +1.0516822345055969e+00 -2.2935262162529075e-15 + 3 -4.1025142768037746e+01 +3.7566377680004518e-16 + +[correlator] + +name f_A +quarks lquark lquark +offset 1 +wf 0 +corr_t + 1 +6.5471188727965909e+01 -1.6112786177915427e-11 + 2 +1.0447210337411881e+00 -7.0387528705692678e-13 + 3 -4.1025094911167137e+01 +4.6509152745618223e-13 + +[correlator] + +name f_A +quarks lquark lquark +offset 1 +wf 1 +corr_t + 1 +6.5551520722842213e+01 -8.1976426690345305e-13 + 2 +1.0542820240843382e+00 +2.1626370477046812e-13 + 3 -4.1024441815730086e+01 -2.4147931196409923e-14 + +[correlator] + +name f_A +quarks lquark lquark +offset 1 +wf 2 +corr_t + 1 +6.5529951269443117e+01 +7.9192560386479701e-14 + 2 +1.0516822345055870e+00 -1.2443038782429568e-14 + 3 -4.1025142768037739e+01 +5.9315333178954509e-17 + diff --git a/tests/data/sfcf_test/param/out.out b/tests/data/sfcf_test/param/out.out new file mode 100644 index 00000000..0b3afcc7 --- /dev/null +++ b/tests/data/sfcf_test/param/out.out @@ -0,0 +1,3273 @@ +The following modules were not unloaded: + (Use "module --force purge" to unload all): + + 1) palma/2019a + +Currently Loaded Modules: + 1) palma/2019a (S) + 2) GCCcore/8.2.0 + 3) zlib/1.2.11 + 4) binutils/2.31.1 + 5) icc/2019.1.144-GCC-8.2.0-2.31.1 + 6) ifort/2019.1.144-GCC-8.2.0-2.31.1 + 7) impi/2018.4.274 + 8) imkl/2019.1.144 + 9) intel/2019a + + Where: + S: Module is Sticky, requires --force to unload or purge + + + +Build info +---------- +Global lattice: 4 x 4 x 4 x 4 +Local lattice: 4 x 4 x 4 x 4 (u: 320+0 s: 192+0) +Using single MPI process +SFCF version: 2.1 +Using geometry 2 (boundary spinors mapped to dummy, u_ipt != s_ipt) +Using solvers from openQCD +Using dfl_update in DFL_SAP_GCR solver from openQCD +Using oqcd_utils2.c from SFCF +Using profiler functions also in openQCD interface +Using SSE3 +Using prefetch PM +Using prefetch P4 + +Initialization +-------------- +... initializing geometry +... allocating gauge field +... using unit gauge field +Gauge field checked (184320 B, unused links: 64 zero, 1216 unity, BF0) +Gauge checksum (MD5): 1ea28326e4090996111a320b8372811d +... reading input file ('sfcf_unity_test.in') +... finished reading input file (without hash) [input.c] + +Basic parameters: + Nf = 3 + beta = 3.552200000000 + ct = 1.055185744046 (input) + cttilde= 0.974579134058 (input) + csw = 1.822845956831 (input) + isw = 0 + +WARNING: The improvement coefficients have been calculated according to old + formulae, which were used in past simulations. If you do not need + compatibility to old simulations, you can use the newest formulae by + defining the preprocessor flag USE_LATEST_IMPROVEMENT. + + +Solver parameters: + errsq = 1.000000e-18 + nmax = 4096 + + oqcd_solver_select = -1 + oqcd_solver_param = 0xf04 + + [Solver 0] + solver = DFL_SAP_GCR + nkv = 24 + isolv = 1 + nmr = 4 + ncy = 5 + nmx = 2048 + res = 1.000000e-10 + [Solver 1] + solver = CGNE + nmx = 4096 + res = 1.000000e-10 + [Solver 2] + solver = SAP_GCR + nkv = 24 + isolv = 1 + nmr = 4 + ncy = 5 + nmx = 2048 + res = 1.000000e-10 + [Solver 3] + solver = CGNE_NO_EO + nkv = 0 + isolv = 0 + nmr = 0 + ncy = 0 + nmx = 4096 + res = 1.000000e-10 + [SAP] + bs = 4 4 4 4 + [[Deflation subspace] + bs = 4 4 4 4 + Ns = 20 + [[Deflation subspace generation] + kappa = 1.371379e-01 + mu = 0.000000e+00 + ninv = 10 + nmr = 4 + ncy = 5 + [[Deflation projection] + nkv = 18 + nmx = 2048 + res = 1.000000e-02 + +Source offsets: 2 + offsets[0] = (0.0000000000000000e+00,0.0000000000000000e+00,0.0000000000000000e+00) = (0,0,0) sites +WARNING in safe_ftoi [utils.c]: Fractional part exceeds tolerance (|0.5|>1e-06). offsets[1] = (0.0000000000000000e+00,0.0000000000000000e+00,5.0000000000000000e-01) = (0,0,0) sites + +Wave-function parameters: + sigma type = delta + Wave-function basis: + element #0: n_H = 0.000000000000 r_H = 2.666666666667 + element #1: n_H = 1.000000000000 r_H = 2.666666666667 + element #2: n_H = 0.000000000000 r_H = 5.333333333333 + Wave-function coefficients: + element #0: coeff = { 1.000000000000, 0.000000000000, 0.000000000000,} + element #1: coeff = { 0.000000000000, 1.000000000000, 0.000000000000,} + element #2: coeff = { 0.000000000000, 0.000000000000, 1.000000000000,} + +Relativistic quarks: + rel. quark #0: name = 'lquark' kappa = 0.137137900000 theta = 0.500000000000 0.500000000000 0.500000000000 persistent + +Measurements for rr: 1 + mrr[0] = (0, 0) + +Correlators for rr: 3 + crr[0] = 'f_A' + crr[1] = 'f_1' + crr[2] = 'F_V0' + +Static actions (`smearings'): + +Static quarks: + +Measurements for rs: 0 + +Correlators for rs: 0 + +... allocating rprop (32 blocks) +... initializing dataio (a=0 f=0 b=0 c=1 dname='./output_10519905/data_c' p=0 pname='./output_10519905/parameters_c') +... creating data file './output_10519905/data_c' [dataio.c] +... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7, param_md5 = d881e90d41188a33b8b0f1bd0bc53ea5) + +Plaquette: + + sum: 4.09557397714092622e+03 + sum (time): 2.36757397714092622e+03 + sum (space): 1.72800000000000000e+03 + sum (avg.): 1.01576735544169794e+00 + dS/deta: 0.00000000000000000e+00 + vbar: 0.00000000000000000e+00 + + + +RR Correlation Functions +------------------------ + + offset[0] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +0.0000000000000000e+00} + computing correlations between rel. quark 0 and rel. quark 0... + wave function: 0 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.335827e-10 + True residue: |r_n|/|v| = 8.335828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.335827e-10 + True residue: |r_n|/|v| = 8.335828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.335827e-10 + True residue: |r_n|/|v| = 8.335828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.534512e-10 + True residue: |r_n|/|v| = 8.534511e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.534512e-10 + True residue: |r_n|/|v| = 8.534511e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.534512e-10 + True residue: |r_n|/|v| = 8.534511e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802722e-10 + True residue: |r_n|/|v| = 8.802722e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802722e-10 + True residue: |r_n|/|v| = 8.802722e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802722e-10 + True residue: |r_n|/|v| = 8.802722e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802562e-10 + True residue: |r_n|/|v| = 8.802562e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802562e-10 + True residue: |r_n|/|v| = 8.802562e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802562e-10 + True residue: |r_n|/|v| = 8.802562e-10 + computing f_1 ... + computing F_V0 ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.801999e-10 + True residue: |r_n|/|v| = 8.801999e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.801999e-10 + True residue: |r_n|/|v| = 8.801999e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.801999e-10 + True residue: |r_n|/|v| = 8.801999e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796995e-10 + True residue: |r_n|/|v| = 8.796995e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796995e-10 + True residue: |r_n|/|v| = 8.796995e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796995e-10 + True residue: |r_n|/|v| = 8.796995e-10 + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 1 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.684873e-10 + True residue: |r_n|/|v| = 6.684873e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.684873e-10 + True residue: |r_n|/|v| = 6.684873e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.684873e-10 + True residue: |r_n|/|v| = 6.684873e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.682003e-10 + True residue: |r_n|/|v| = 6.682002e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.682003e-10 + True residue: |r_n|/|v| = 6.682002e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.682003e-10 + True residue: |r_n|/|v| = 6.682002e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 2 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021740e-10 + True residue: |r_n|/|v| = 6.021742e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021740e-10 + True residue: |r_n|/|v| = 6.021742e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021740e-10 + True residue: |r_n|/|v| = 6.021742e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021726e-10 + True residue: |r_n|/|v| = 6.021726e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021726e-10 + True residue: |r_n|/|v| = 6.021726e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021726e-10 + True residue: |r_n|/|v| = 6.021726e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + offset[1] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +5.0000000000000000e-01} + computing correlations between rel. quark 0 and rel. quark 0... + wave function: 0 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 9.352828e-10 + True residue: |r_n|/|v| = 9.352828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 9.352828e-10 + True residue: |r_n|/|v| = 9.352828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 9.352828e-10 + True residue: |r_n|/|v| = 9.352828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.277678e-10 + True residue: |r_n|/|v| = 8.277678e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.277678e-10 + True residue: |r_n|/|v| = 8.277678e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.277678e-10 + True residue: |r_n|/|v| = 8.277678e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.800192e-10 + True residue: |r_n|/|v| = 8.800192e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.800192e-10 + True residue: |r_n|/|v| = 8.800192e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.800192e-10 + True residue: |r_n|/|v| = 8.800192e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.804954e-10 + True residue: |r_n|/|v| = 8.804953e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.804954e-10 + True residue: |r_n|/|v| = 8.804953e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.804954e-10 + True residue: |r_n|/|v| = 8.804953e-10 + computing f_1 ... + computing F_V0 ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.806137e-10 + True residue: |r_n|/|v| = 8.806137e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.806137e-10 + True residue: |r_n|/|v| = 8.806137e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.806137e-10 + True residue: |r_n|/|v| = 8.806137e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796464e-10 + True residue: |r_n|/|v| = 8.796464e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796464e-10 + True residue: |r_n|/|v| = 8.796464e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796464e-10 + True residue: |r_n|/|v| = 8.796464e-10 + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 1 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.689213e-10 + True residue: |r_n|/|v| = 6.689212e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.689213e-10 + True residue: |r_n|/|v| = 6.689212e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.689213e-10 + True residue: |r_n|/|v| = 6.689212e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.695514e-10 + True residue: |r_n|/|v| = 6.695515e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.695514e-10 + True residue: |r_n|/|v| = 6.695515e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.695514e-10 + True residue: |r_n|/|v| = 6.695515e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 2 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021731e-10 + True residue: |r_n|/|v| = 6.021731e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021731e-10 + True residue: |r_n|/|v| = 6.021731e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021731e-10 + True residue: |r_n|/|v| = 6.021731e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021729e-10 + True residue: |r_n|/|v| = 6.021727e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021729e-10 + True residue: |r_n|/|v| = 6.021727e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021729e-10 + True residue: |r_n|/|v| = 6.021727e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + + +RS Correlation Functions +------------------------ + +... finalizing dataio + + +OK: All 197 PSDdummy are zero + +Maximum memory usage (rank 0): 8.61 MB (8.61 by SFCF, 0.00 by openQCD) +Current memory usage (rank 0): 8.58 MB (8.58 by SFCF, 0.00 by openQCD) + +Total execution time with solver -1 (CG): 2.11e+00 sec + + section count avg sec tot sec rel cost + ----------------------------------------------------------------- + main 1 1.06e-03 1.06e-03 0.1 % + reading input 1 1.82e+00 1.82e+00 85.9 % + IO config 1 9.28e-04 9.28e-04 0.0 % + IO data 2 3.03e-03 6.06e-03 0.3 % + mem alloc 2 1.30e-03 2.60e-03 0.1 % + solver (sfcf only) 60 4.51e-03 2.70e-01 12.8 % + rr correlators 1 1.59e-02 1.59e-02 0.8 % + rs correlators 1 1.19e-06 1.19e-06 0.0 % + +End. +Build info +---------- +Global lattice: 4 x 4 x 4 x 4 +Local lattice: 4 x 4 x 4 x 4 (u: 320+0 s: 192+0) +Using single MPI process +SFCF version: 2.1 +Using geometry 2 (boundary spinors mapped to dummy, u_ipt != s_ipt) +Using solvers from openQCD +Using dfl_update in DFL_SAP_GCR solver from openQCD +Using oqcd_utils2.c from SFCF +Using profiler functions also in openQCD interface +Using SSE3 +Using prefetch PM +Using prefetch P4 + +Initialization +-------------- +... initializing geometry +... allocating gauge field +... using unit gauge field +Gauge field checked (184320 B, unused links: 64 zero, 1216 unity, BF0) +Gauge checksum (MD5): 1ea28326e4090996111a320b8372811d +... reading input file ('sfcf_unity_test.in') +... finished reading input file (without hash) [input.c] + +Basic parameters: + Nf = 3 + beta = 3.552200000000 + ct = 1.055185744046 (input) + cttilde= 0.974579134058 (input) + csw = 1.822845956831 (input) + isw = 0 + +WARNING: The improvement coefficients have been calculated according to old + formulae, which were used in past simulations. If you do not need + compatibility to old simulations, you can use the newest formulae by + defining the preprocessor flag USE_LATEST_IMPROVEMENT. + + +Solver parameters: + errsq = 1.000000e-18 + nmax = 4096 + + oqcd_solver_select = -1 + oqcd_solver_param = 0xf04 + + [Solver 0] + solver = DFL_SAP_GCR + nkv = 24 + isolv = 1 + nmr = 4 + ncy = 5 + nmx = 2048 + res = 1.000000e-10 + [Solver 1] + solver = CGNE + nmx = 4096 + res = 1.000000e-10 + [Solver 2] + solver = SAP_GCR + nkv = 24 + isolv = 1 + nmr = 4 + ncy = 5 + nmx = 2048 + res = 1.000000e-10 + [Solver 3] + solver = CGNE_NO_EO + nkv = 0 + isolv = 0 + nmr = 0 + ncy = 0 + nmx = 4096 + res = 1.000000e-10 + [SAP] + bs = 4 4 4 4 + [[Deflation subspace] + bs = 4 4 4 4 + Ns = 20 + [[Deflation subspace generation] + kappa = 1.371379e-01 + mu = 0.000000e+00 + ninv = 10 + nmr = 4 + ncy = 5 + [[Deflation projection] + nkv = 18 + nmx = 2048 + res = 1.000000e-02 + +Source offsets: 2 + offsets[0] = (0.0000000000000000e+00,0.0000000000000000e+00,0.0000000000000000e+00) = (0,0,0) sites +WARNING in safe_ftoi [utils.c]: Fractional part exceeds tolerance (|0.5|>1e-06). offsets[1] = (0.0000000000000000e+00,0.0000000000000000e+00,5.0000000000000000e-01) = (0,0,0) sites + +Wave-function parameters: + sigma type = delta + Wave-function basis: + element #0: n_H = 0.000000000000 r_H = 2.666666666667 + element #1: n_H = 1.000000000000 r_H = 2.666666666667 + element #2: n_H = 0.000000000000 r_H = 5.333333333333 + Wave-function coefficients: + element #0: coeff = { 1.000000000000, 0.000000000000, 0.000000000000,} + element #1: coeff = { 0.000000000000, 1.000000000000, 0.000000000000,} + element #2: coeff = { 0.000000000000, 0.000000000000, 1.000000000000,} + +Relativistic quarks: + rel. quark #0: name = 'lquark' kappa = 0.137137900000 theta = 0.500000000000 0.500000000000 0.500000000000 persistent + +Measurements for rr: 1 + mrr[0] = (0, 0) + +Correlators for rr: 3 + crr[0] = 'f_A' + crr[1] = 'f_1' + crr[2] = 'F_V0' + +Static actions (`smearings'): + +Static quarks: + +Measurements for rs: 0 + +Correlators for rs: 0 + +... allocating rprop (32 blocks) +... initializing dataio (a=0 f=0 b=0 c=0 dname='./output_10519905/data_o' p=0 pname='./output_10519905/parameters_o') +... creating data file './output_10519905/data_of_A' [dataio.c] +... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7, param_md5 = d881e90d41188a33b8b0f1bd0bc53ea5) +... creating data file './output_10519905/data_of_1' [dataio.c] +... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7, param_md5 = d881e90d41188a33b8b0f1bd0bc53ea5) +... creating data file './output_10519905/data_oF_V0' [dataio.c] +... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7, param_md5 = d881e90d41188a33b8b0f1bd0bc53ea5) + +Plaquette: + + sum: 4.09557397714092622e+03 + sum (time): 2.36757397714092622e+03 + sum (space): 1.72800000000000000e+03 + sum (avg.): 1.01576735544169794e+00 + dS/deta: 0.00000000000000000e+00 + vbar: 0.00000000000000000e+00 + + + +RR Correlation Functions +------------------------ + + offset[0] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +0.0000000000000000e+00} + computing correlations between rel. quark 0 and rel. quark 0... + wave function: 0 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.335827e-10 + True residue: |r_n|/|v| = 8.335828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.335827e-10 + True residue: |r_n|/|v| = 8.335828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.335827e-10 + True residue: |r_n|/|v| = 8.335828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.534512e-10 + True residue: |r_n|/|v| = 8.534511e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.534512e-10 + True residue: |r_n|/|v| = 8.534511e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.534512e-10 + True residue: |r_n|/|v| = 8.534511e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802722e-10 + True residue: |r_n|/|v| = 8.802722e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802722e-10 + True residue: |r_n|/|v| = 8.802722e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802722e-10 + True residue: |r_n|/|v| = 8.802722e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802562e-10 + True residue: |r_n|/|v| = 8.802562e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802562e-10 + True residue: |r_n|/|v| = 8.802562e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802562e-10 + True residue: |r_n|/|v| = 8.802562e-10 + computing f_1 ... + computing F_V0 ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.801999e-10 + True residue: |r_n|/|v| = 8.801999e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.801999e-10 + True residue: |r_n|/|v| = 8.801999e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.801999e-10 + True residue: |r_n|/|v| = 8.801999e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796995e-10 + True residue: |r_n|/|v| = 8.796995e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796995e-10 + True residue: |r_n|/|v| = 8.796995e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796995e-10 + True residue: |r_n|/|v| = 8.796995e-10 + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 1 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.684873e-10 + True residue: |r_n|/|v| = 6.684873e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.684873e-10 + True residue: |r_n|/|v| = 6.684873e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.684873e-10 + True residue: |r_n|/|v| = 6.684873e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.682003e-10 + True residue: |r_n|/|v| = 6.682002e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.682003e-10 + True residue: |r_n|/|v| = 6.682002e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.682003e-10 + True residue: |r_n|/|v| = 6.682002e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 2 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021740e-10 + True residue: |r_n|/|v| = 6.021742e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021740e-10 + True residue: |r_n|/|v| = 6.021742e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021740e-10 + True residue: |r_n|/|v| = 6.021742e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021726e-10 + True residue: |r_n|/|v| = 6.021726e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021726e-10 + True residue: |r_n|/|v| = 6.021726e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021726e-10 + True residue: |r_n|/|v| = 6.021726e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + offset[1] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +5.0000000000000000e-01} + computing correlations between rel. quark 0 and rel. quark 0... + wave function: 0 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 9.352828e-10 + True residue: |r_n|/|v| = 9.352828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 9.352828e-10 + True residue: |r_n|/|v| = 9.352828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 9.352828e-10 + True residue: |r_n|/|v| = 9.352828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.277678e-10 + True residue: |r_n|/|v| = 8.277678e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.277678e-10 + True residue: |r_n|/|v| = 8.277678e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.277678e-10 + True residue: |r_n|/|v| = 8.277678e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.800192e-10 + True residue: |r_n|/|v| = 8.800192e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.800192e-10 + True residue: |r_n|/|v| = 8.800192e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.800192e-10 + True residue: |r_n|/|v| = 8.800192e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.804954e-10 + True residue: |r_n|/|v| = 8.804953e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.804954e-10 + True residue: |r_n|/|v| = 8.804953e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.804954e-10 + True residue: |r_n|/|v| = 8.804953e-10 + computing f_1 ... + computing F_V0 ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.806137e-10 + True residue: |r_n|/|v| = 8.806137e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.806137e-10 + True residue: |r_n|/|v| = 8.806137e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.806137e-10 + True residue: |r_n|/|v| = 8.806137e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796464e-10 + True residue: |r_n|/|v| = 8.796464e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796464e-10 + True residue: |r_n|/|v| = 8.796464e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796464e-10 + True residue: |r_n|/|v| = 8.796464e-10 + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 1 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.689213e-10 + True residue: |r_n|/|v| = 6.689212e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.689213e-10 + True residue: |r_n|/|v| = 6.689212e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.689213e-10 + True residue: |r_n|/|v| = 6.689212e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.695514e-10 + True residue: |r_n|/|v| = 6.695515e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.695514e-10 + True residue: |r_n|/|v| = 6.695515e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.695514e-10 + True residue: |r_n|/|v| = 6.695515e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 2 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021731e-10 + True residue: |r_n|/|v| = 6.021731e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021731e-10 + True residue: |r_n|/|v| = 6.021731e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021731e-10 + True residue: |r_n|/|v| = 6.021731e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021729e-10 + True residue: |r_n|/|v| = 6.021727e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021729e-10 + True residue: |r_n|/|v| = 6.021727e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021729e-10 + True residue: |r_n|/|v| = 6.021727e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + + +RS Correlation Functions +------------------------ + +... finalizing dataio + + +OK: All 197 PSDdummy are zero + +Maximum memory usage (rank 0): 8.61 MB (8.61 by SFCF, 0.00 by openQCD) +Current memory usage (rank 0): 8.58 MB (8.58 by SFCF, 0.00 by openQCD) + +Total execution time with solver -1 (CG): 2.11e+00 sec + + section count avg sec tot sec rel cost + ----------------------------------------------------------------- + main 1 8.18e-04 8.18e-04 0.0 % + reading input 1 1.81e+00 1.81e+00 86.0 % + IO config 1 7.10e-04 7.10e-04 0.0 % + IO data 2 2.91e-03 5.82e-03 0.3 % + mem alloc 2 1.34e-03 2.68e-03 0.1 % + solver (sfcf only) 60 4.50e-03 2.70e-01 12.8 % + rr correlators 1 1.52e-02 1.52e-02 0.7 % + rs correlators 1 9.54e-07 9.54e-07 0.0 % + +End. +Build info +---------- +Global lattice: 4 x 4 x 4 x 4 +Local lattice: 4 x 4 x 4 x 4 (u: 320+0 s: 192+0) +Using single MPI process +SFCF version: 2.1 +Using geometry 2 (boundary spinors mapped to dummy, u_ipt != s_ipt) +Using solvers from openQCD +Using dfl_update in DFL_SAP_GCR solver from openQCD +Using oqcd_utils2.c from SFCF +Using profiler functions also in openQCD interface +Using SSE3 +Using prefetch PM +Using prefetch P4 + +Initialization +-------------- +... initializing geometry +... allocating gauge field +... using unit gauge field +Gauge field checked (184320 B, unused links: 64 zero, 1216 unity, BF0) +Gauge checksum (MD5): 1ea28326e4090996111a320b8372811d +... reading input file ('sfcf_unity_test.in') +... finished reading input file (without hash) [input.c] + +Basic parameters: + Nf = 3 + beta = 3.552200000000 + ct = 1.055185744046 (input) + cttilde= 0.974579134058 (input) + csw = 1.822845956831 (input) + isw = 0 + +WARNING: The improvement coefficients have been calculated according to old + formulae, which were used in past simulations. If you do not need + compatibility to old simulations, you can use the newest formulae by + defining the preprocessor flag USE_LATEST_IMPROVEMENT. + + +Solver parameters: + errsq = 1.000000e-18 + nmax = 4096 + + oqcd_solver_select = -1 + oqcd_solver_param = 0xf04 + + [Solver 0] + solver = DFL_SAP_GCR + nkv = 24 + isolv = 1 + nmr = 4 + ncy = 5 + nmx = 2048 + res = 1.000000e-10 + [Solver 1] + solver = CGNE + nmx = 4096 + res = 1.000000e-10 + [Solver 2] + solver = SAP_GCR + nkv = 24 + isolv = 1 + nmr = 4 + ncy = 5 + nmx = 2048 + res = 1.000000e-10 + [Solver 3] + solver = CGNE_NO_EO + nkv = 0 + isolv = 0 + nmr = 0 + ncy = 0 + nmx = 4096 + res = 1.000000e-10 + [SAP] + bs = 4 4 4 4 + [[Deflation subspace] + bs = 4 4 4 4 + Ns = 20 + [[Deflation subspace generation] + kappa = 1.371379e-01 + mu = 0.000000e+00 + ninv = 10 + nmr = 4 + ncy = 5 + [[Deflation projection] + nkv = 18 + nmx = 2048 + res = 1.000000e-02 + +Source offsets: 2 + offsets[0] = (0.0000000000000000e+00,0.0000000000000000e+00,0.0000000000000000e+00) = (0,0,0) sites +WARNING in safe_ftoi [utils.c]: Fractional part exceeds tolerance (|0.5|>1e-06). offsets[1] = (0.0000000000000000e+00,0.0000000000000000e+00,5.0000000000000000e-01) = (0,0,0) sites + +Wave-function parameters: + sigma type = delta + Wave-function basis: + element #0: n_H = 0.000000000000 r_H = 2.666666666667 + element #1: n_H = 1.000000000000 r_H = 2.666666666667 + element #2: n_H = 0.000000000000 r_H = 5.333333333333 + Wave-function coefficients: + element #0: coeff = { 1.000000000000, 0.000000000000, 0.000000000000,} + element #1: coeff = { 0.000000000000, 1.000000000000, 0.000000000000,} + element #2: coeff = { 0.000000000000, 0.000000000000, 1.000000000000,} + +Relativistic quarks: + rel. quark #0: name = 'lquark' kappa = 0.137137900000 theta = 0.500000000000 0.500000000000 0.500000000000 persistent + +Measurements for rr: 1 + mrr[0] = (0, 0) + +Correlators for rr: 3 + crr[0] = 'f_A' + crr[1] = 'f_1' + crr[2] = 'F_V0' + +Static actions (`smearings'): + +Static quarks: + +Measurements for rs: 0 + +Correlators for rs: 0 + +... allocating rprop (32 blocks) +... initializing dataio (a=0 f=0 b=0 c=0 dname='./output_10519905/data_a' p=0 pname='./output_10519905/parameters_a') +... creating data file './output_10519905/data_af_A' [dataio.c] +... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7, param_md5 = d881e90d41188a33b8b0f1bd0bc53ea5) +... creating data file './output_10519905/data_af_1' [dataio.c] +... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7, param_md5 = d881e90d41188a33b8b0f1bd0bc53ea5) +... creating data file './output_10519905/data_aF_V0' [dataio.c] +... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7, param_md5 = d881e90d41188a33b8b0f1bd0bc53ea5) + +Plaquette: + + sum: 4.09557397714092622e+03 + sum (time): 2.36757397714092622e+03 + sum (space): 1.72800000000000000e+03 + sum (avg.): 1.01576735544169794e+00 + dS/deta: 0.00000000000000000e+00 + vbar: 0.00000000000000000e+00 + + + +RR Correlation Functions +------------------------ + + offset[0] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +0.0000000000000000e+00} + computing correlations between rel. quark 0 and rel. quark 0... + wave function: 0 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.335827e-10 + True residue: |r_n|/|v| = 8.335828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.335827e-10 + True residue: |r_n|/|v| = 8.335828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.335827e-10 + True residue: |r_n|/|v| = 8.335828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.534512e-10 + True residue: |r_n|/|v| = 8.534511e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.534512e-10 + True residue: |r_n|/|v| = 8.534511e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.534512e-10 + True residue: |r_n|/|v| = 8.534511e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802722e-10 + True residue: |r_n|/|v| = 8.802722e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802722e-10 + True residue: |r_n|/|v| = 8.802722e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802722e-10 + True residue: |r_n|/|v| = 8.802722e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802562e-10 + True residue: |r_n|/|v| = 8.802562e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802562e-10 + True residue: |r_n|/|v| = 8.802562e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802562e-10 + True residue: |r_n|/|v| = 8.802562e-10 + computing f_1 ... + computing F_V0 ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.801999e-10 + True residue: |r_n|/|v| = 8.801999e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.801999e-10 + True residue: |r_n|/|v| = 8.801999e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.801999e-10 + True residue: |r_n|/|v| = 8.801999e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796995e-10 + True residue: |r_n|/|v| = 8.796995e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796995e-10 + True residue: |r_n|/|v| = 8.796995e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796995e-10 + True residue: |r_n|/|v| = 8.796995e-10 + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 1 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.684873e-10 + True residue: |r_n|/|v| = 6.684873e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.684873e-10 + True residue: |r_n|/|v| = 6.684873e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.684873e-10 + True residue: |r_n|/|v| = 6.684873e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.682003e-10 + True residue: |r_n|/|v| = 6.682002e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.682003e-10 + True residue: |r_n|/|v| = 6.682002e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.682003e-10 + True residue: |r_n|/|v| = 6.682002e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 2 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021740e-10 + True residue: |r_n|/|v| = 6.021742e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021740e-10 + True residue: |r_n|/|v| = 6.021742e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021740e-10 + True residue: |r_n|/|v| = 6.021742e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021726e-10 + True residue: |r_n|/|v| = 6.021726e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021726e-10 + True residue: |r_n|/|v| = 6.021726e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021726e-10 + True residue: |r_n|/|v| = 6.021726e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + offset[1] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +5.0000000000000000e-01} + computing correlations between rel. quark 0 and rel. quark 0... + wave function: 0 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 9.352828e-10 + True residue: |r_n|/|v| = 9.352828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 9.352828e-10 + True residue: |r_n|/|v| = 9.352828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 9.352828e-10 + True residue: |r_n|/|v| = 9.352828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.277678e-10 + True residue: |r_n|/|v| = 8.277678e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.277678e-10 + True residue: |r_n|/|v| = 8.277678e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.277678e-10 + True residue: |r_n|/|v| = 8.277678e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.800192e-10 + True residue: |r_n|/|v| = 8.800192e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.800192e-10 + True residue: |r_n|/|v| = 8.800192e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.800192e-10 + True residue: |r_n|/|v| = 8.800192e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.804954e-10 + True residue: |r_n|/|v| = 8.804953e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.804954e-10 + True residue: |r_n|/|v| = 8.804953e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.804954e-10 + True residue: |r_n|/|v| = 8.804953e-10 + computing f_1 ... + computing F_V0 ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.806137e-10 + True residue: |r_n|/|v| = 8.806137e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.806137e-10 + True residue: |r_n|/|v| = 8.806137e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.806137e-10 + True residue: |r_n|/|v| = 8.806137e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796464e-10 + True residue: |r_n|/|v| = 8.796464e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796464e-10 + True residue: |r_n|/|v| = 8.796464e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796464e-10 + True residue: |r_n|/|v| = 8.796464e-10 + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 1 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.689213e-10 + True residue: |r_n|/|v| = 6.689212e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.689213e-10 + True residue: |r_n|/|v| = 6.689212e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.689213e-10 + True residue: |r_n|/|v| = 6.689212e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.695514e-10 + True residue: |r_n|/|v| = 6.695515e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.695514e-10 + True residue: |r_n|/|v| = 6.695515e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.695514e-10 + True residue: |r_n|/|v| = 6.695515e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 2 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021731e-10 + True residue: |r_n|/|v| = 6.021731e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021731e-10 + True residue: |r_n|/|v| = 6.021731e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021731e-10 + True residue: |r_n|/|v| = 6.021731e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021729e-10 + True residue: |r_n|/|v| = 6.021727e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021729e-10 + True residue: |r_n|/|v| = 6.021727e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021729e-10 + True residue: |r_n|/|v| = 6.021727e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + + +RS Correlation Functions +------------------------ + +... finalizing dataio + + +OK: All 197 PSDdummy are zero + +Maximum memory usage (rank 0): 8.61 MB (8.61 by SFCF, 0.00 by openQCD) +Current memory usage (rank 0): 8.58 MB (8.58 by SFCF, 0.00 by openQCD) + +Total execution time with solver -1 (CG): 2.10e+00 sec + + section count avg sec tot sec rel cost + ----------------------------------------------------------------- + main 1 7.49e-04 7.49e-04 0.0 % + reading input 1 1.81e+00 1.81e+00 85.9 % + IO config 1 6.98e-04 6.98e-04 0.0 % + IO data 2 3.40e-03 6.79e-03 0.3 % + mem alloc 2 1.30e-03 2.60e-03 0.1 % + solver (sfcf only) 60 4.52e-03 2.71e-01 12.9 % + rr correlators 1 1.51e-02 1.51e-02 0.7 % + rs correlators 1 0.00e+00 0.00e+00 0.0 % + +End. +Build info +---------- +Global lattice: 4 x 4 x 4 x 4 +Local lattice: 4 x 4 x 4 x 4 (u: 320+0 s: 192+0) +Using single MPI process +SFCF version: 2.1 +Using geometry 2 (boundary spinors mapped to dummy, u_ipt != s_ipt) +Using solvers from openQCD +Using dfl_update in DFL_SAP_GCR solver from openQCD +Using oqcd_utils2.c from SFCF +Using profiler functions also in openQCD interface +Using SSE3 +Using prefetch PM +Using prefetch P4 + +Initialization +-------------- +... initializing geometry +... allocating gauge field +... using unit gauge field +Gauge field checked (184320 B, unused links: 64 zero, 1216 unity, BF0) +Gauge checksum (MD5): 1ea28326e4090996111a320b8372811d +... reading input file ('sfcf_unity_test.in') +... finished reading input file (without hash) [input.c] + +Basic parameters: + Nf = 3 + beta = 3.552200000000 + ct = 1.055185744046 (input) + cttilde= 0.974579134058 (input) + csw = 1.822845956831 (input) + isw = 0 + +WARNING: The improvement coefficients have been calculated according to old + formulae, which were used in past simulations. If you do not need + compatibility to old simulations, you can use the newest formulae by + defining the preprocessor flag USE_LATEST_IMPROVEMENT. + + +Solver parameters: + errsq = 1.000000e-18 + nmax = 4096 + + oqcd_solver_select = -1 + oqcd_solver_param = 0xf04 + + [Solver 0] + solver = DFL_SAP_GCR + nkv = 24 + isolv = 1 + nmr = 4 + ncy = 5 + nmx = 2048 + res = 1.000000e-10 + [Solver 1] + solver = CGNE + nmx = 4096 + res = 1.000000e-10 + [Solver 2] + solver = SAP_GCR + nkv = 24 + isolv = 1 + nmr = 4 + ncy = 5 + nmx = 2048 + res = 1.000000e-10 + [Solver 3] + solver = CGNE_NO_EO + nkv = 0 + isolv = 0 + nmr = 0 + ncy = 0 + nmx = 4096 + res = 1.000000e-10 + [SAP] + bs = 4 4 4 4 + [[Deflation subspace] + bs = 4 4 4 4 + Ns = 20 + [[Deflation subspace generation] + kappa = 1.371379e-01 + mu = 0.000000e+00 + ninv = 10 + nmr = 4 + ncy = 5 + [[Deflation projection] + nkv = 18 + nmx = 2048 + res = 1.000000e-02 + +Source offsets: 2 + offsets[0] = (0.0000000000000000e+00,0.0000000000000000e+00,0.0000000000000000e+00) = (0,0,0) sites +WARNING in safe_ftoi [utils.c]: Fractional part exceeds tolerance (|0.5|>1e-06). offsets[1] = (0.0000000000000000e+00,0.0000000000000000e+00,5.0000000000000000e-01) = (0,0,0) sites + +Wave-function parameters: + sigma type = delta + Wave-function basis: + element #0: n_H = 0.000000000000 r_H = 2.666666666667 + element #1: n_H = 1.000000000000 r_H = 2.666666666667 + element #2: n_H = 0.000000000000 r_H = 5.333333333333 + Wave-function coefficients: + element #0: coeff = { 1.000000000000, 0.000000000000, 0.000000000000,} + element #1: coeff = { 0.000000000000, 1.000000000000, 0.000000000000,} + element #2: coeff = { 0.000000000000, 0.000000000000, 1.000000000000,} + +Relativistic quarks: + rel. quark #0: name = 'lquark' kappa = 0.137137900000 theta = 0.500000000000 0.500000000000 0.500000000000 persistent + +Measurements for rr: 1 + mrr[0] = (0, 0) + +Correlators for rr: 3 + crr[0] = 'f_A' + crr[1] = 'f_1' + crr[2] = 'F_V0' + +Static actions (`smearings'): + +Static quarks: + +Measurements for rs: 0 + +Correlators for rs: 0 + +... allocating rprop (32 blocks) +... initializing dataio (a=1 f=0 b=0 c=0 dname='./output_10519905/data_a' p=0 pname='./output_10519905/parameters_a') +... checking data file './output_10519905/data_af_A' [dataio.c] +... skipped 1 run records [dataio.c] +... skipped 6 correlator records [dataio.c] +... appending to data file './output_10519905/data_af_A' [dataio.c] +... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7) +... checking data file './output_10519905/data_af_1' [dataio.c] +... skipped 1 run records [dataio.c] +... skipped 18 correlator records [dataio.c] +... appending to data file './output_10519905/data_af_1' [dataio.c] +... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7) +... checking data file './output_10519905/data_aF_V0' [dataio.c] +... skipped 1 run records [dataio.c] +... skipped 18 correlator records [dataio.c] +... appending to data file './output_10519905/data_aF_V0' [dataio.c] +... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7) + +Plaquette: + + sum: 4.09557397714092622e+03 + sum (time): 2.36757397714092622e+03 + sum (space): 1.72800000000000000e+03 + sum (avg.): 1.01576735544169794e+00 + dS/deta: 0.00000000000000000e+00 + vbar: 0.00000000000000000e+00 + + + +RR Correlation Functions +------------------------ + + offset[0] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +0.0000000000000000e+00} + computing correlations between rel. quark 0 and rel. quark 0... + wave function: 0 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.335827e-10 + True residue: |r_n|/|v| = 8.335828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.335827e-10 + True residue: |r_n|/|v| = 8.335828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.335827e-10 + True residue: |r_n|/|v| = 8.335828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.534512e-10 + True residue: |r_n|/|v| = 8.534511e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.534512e-10 + True residue: |r_n|/|v| = 8.534511e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.534512e-10 + True residue: |r_n|/|v| = 8.534511e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802722e-10 + True residue: |r_n|/|v| = 8.802722e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802722e-10 + True residue: |r_n|/|v| = 8.802722e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802722e-10 + True residue: |r_n|/|v| = 8.802722e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802562e-10 + True residue: |r_n|/|v| = 8.802562e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802562e-10 + True residue: |r_n|/|v| = 8.802562e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802562e-10 + True residue: |r_n|/|v| = 8.802562e-10 + computing f_1 ... + computing F_V0 ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.801999e-10 + True residue: |r_n|/|v| = 8.801999e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.801999e-10 + True residue: |r_n|/|v| = 8.801999e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.801999e-10 + True residue: |r_n|/|v| = 8.801999e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796995e-10 + True residue: |r_n|/|v| = 8.796995e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796995e-10 + True residue: |r_n|/|v| = 8.796995e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796995e-10 + True residue: |r_n|/|v| = 8.796995e-10 + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 1 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.684873e-10 + True residue: |r_n|/|v| = 6.684873e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.684873e-10 + True residue: |r_n|/|v| = 6.684873e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.684873e-10 + True residue: |r_n|/|v| = 6.684873e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.682003e-10 + True residue: |r_n|/|v| = 6.682002e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.682003e-10 + True residue: |r_n|/|v| = 6.682002e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.682003e-10 + True residue: |r_n|/|v| = 6.682002e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 2 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021740e-10 + True residue: |r_n|/|v| = 6.021742e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021740e-10 + True residue: |r_n|/|v| = 6.021742e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021740e-10 + True residue: |r_n|/|v| = 6.021742e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021726e-10 + True residue: |r_n|/|v| = 6.021726e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021726e-10 + True residue: |r_n|/|v| = 6.021726e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021726e-10 + True residue: |r_n|/|v| = 6.021726e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + offset[1] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +5.0000000000000000e-01} + computing correlations between rel. quark 0 and rel. quark 0... + wave function: 0 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 9.352828e-10 + True residue: |r_n|/|v| = 9.352828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 9.352828e-10 + True residue: |r_n|/|v| = 9.352828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 9.352828e-10 + True residue: |r_n|/|v| = 9.352828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.277678e-10 + True residue: |r_n|/|v| = 8.277678e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.277678e-10 + True residue: |r_n|/|v| = 8.277678e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.277678e-10 + True residue: |r_n|/|v| = 8.277678e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.800192e-10 + True residue: |r_n|/|v| = 8.800192e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.800192e-10 + True residue: |r_n|/|v| = 8.800192e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.800192e-10 + True residue: |r_n|/|v| = 8.800192e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.804954e-10 + True residue: |r_n|/|v| = 8.804953e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.804954e-10 + True residue: |r_n|/|v| = 8.804953e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.804954e-10 + True residue: |r_n|/|v| = 8.804953e-10 + computing f_1 ... + computing F_V0 ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.806137e-10 + True residue: |r_n|/|v| = 8.806137e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.806137e-10 + True residue: |r_n|/|v| = 8.806137e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.806137e-10 + True residue: |r_n|/|v| = 8.806137e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796464e-10 + True residue: |r_n|/|v| = 8.796464e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796464e-10 + True residue: |r_n|/|v| = 8.796464e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796464e-10 + True residue: |r_n|/|v| = 8.796464e-10 + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 1 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.689213e-10 + True residue: |r_n|/|v| = 6.689212e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.689213e-10 + True residue: |r_n|/|v| = 6.689212e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.689213e-10 + True residue: |r_n|/|v| = 6.689212e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.695514e-10 + True residue: |r_n|/|v| = 6.695515e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.695514e-10 + True residue: |r_n|/|v| = 6.695515e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.695514e-10 + True residue: |r_n|/|v| = 6.695515e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 2 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021731e-10 + True residue: |r_n|/|v| = 6.021731e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021731e-10 + True residue: |r_n|/|v| = 6.021731e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021731e-10 + True residue: |r_n|/|v| = 6.021731e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021729e-10 + True residue: |r_n|/|v| = 6.021727e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021729e-10 + True residue: |r_n|/|v| = 6.021727e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021729e-10 + True residue: |r_n|/|v| = 6.021727e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + + +RS Correlation Functions +------------------------ + +... finalizing dataio + + +OK: All 197 PSDdummy are zero + +Maximum memory usage (rank 0): 8.61 MB (8.61 by SFCF, 0.00 by openQCD) +Current memory usage (rank 0): 8.58 MB (8.58 by SFCF, 0.00 by openQCD) + +Total execution time with solver -1 (CG): 2.11e+00 sec + + section count avg sec tot sec rel cost + ----------------------------------------------------------------- + main 1 7.90e-04 7.90e-04 0.0 % + reading input 1 1.81e+00 1.81e+00 85.8 % + IO config 1 6.84e-04 6.84e-04 0.0 % + IO data 2 2.45e-03 4.91e-03 0.2 % + mem alloc 2 1.34e-03 2.68e-03 0.1 % + solver (sfcf only) 60 4.58e-03 2.75e-01 13.0 % + rr correlators 1 1.53e-02 1.53e-02 0.7 % + rs correlators 1 1.19e-06 1.19e-06 0.0 % + +End. +Build info +---------- +Global lattice: 4 x 4 x 4 x 4 +Local lattice: 4 x 4 x 4 x 4 (u: 320+0 s: 192+0) +Using single MPI process +SFCF version: 2.1 +Using geometry 2 (boundary spinors mapped to dummy, u_ipt != s_ipt) +Using solvers from openQCD +Using dfl_update in DFL_SAP_GCR solver from openQCD +Using oqcd_utils2.c from SFCF +Using profiler functions also in openQCD interface +Using SSE3 +Using prefetch PM +Using prefetch P4 + +Initialization +-------------- +... initializing geometry +... allocating gauge field +... using unit gauge field +Gauge field checked (184320 B, unused links: 64 zero, 1216 unity, BF0) +Gauge checksum (MD5): 1ea28326e4090996111a320b8372811d +... reading input file ('sfcf_unity_test.in') +... finished reading input file (without hash) [input.c] + +Basic parameters: + Nf = 3 + beta = 3.552200000000 + ct = 1.055185744046 (input) + cttilde= 0.974579134058 (input) + csw = 1.822845956831 (input) + isw = 0 + +WARNING: The improvement coefficients have been calculated according to old + formulae, which were used in past simulations. If you do not need + compatibility to old simulations, you can use the newest formulae by + defining the preprocessor flag USE_LATEST_IMPROVEMENT. + + +Solver parameters: + errsq = 1.000000e-18 + nmax = 4096 + + oqcd_solver_select = -1 + oqcd_solver_param = 0xf04 + + [Solver 0] + solver = DFL_SAP_GCR + nkv = 24 + isolv = 1 + nmr = 4 + ncy = 5 + nmx = 2048 + res = 1.000000e-10 + [Solver 1] + solver = CGNE + nmx = 4096 + res = 1.000000e-10 + [Solver 2] + solver = SAP_GCR + nkv = 24 + isolv = 1 + nmr = 4 + ncy = 5 + nmx = 2048 + res = 1.000000e-10 + [Solver 3] + solver = CGNE_NO_EO + nkv = 0 + isolv = 0 + nmr = 0 + ncy = 0 + nmx = 4096 + res = 1.000000e-10 + [SAP] + bs = 4 4 4 4 + [[Deflation subspace] + bs = 4 4 4 4 + Ns = 20 + [[Deflation subspace generation] + kappa = 1.371379e-01 + mu = 0.000000e+00 + ninv = 10 + nmr = 4 + ncy = 5 + [[Deflation projection] + nkv = 18 + nmx = 2048 + res = 1.000000e-02 + +Source offsets: 2 + offsets[0] = (0.0000000000000000e+00,0.0000000000000000e+00,0.0000000000000000e+00) = (0,0,0) sites +WARNING in safe_ftoi [utils.c]: Fractional part exceeds tolerance (|0.5|>1e-06). offsets[1] = (0.0000000000000000e+00,0.0000000000000000e+00,5.0000000000000000e-01) = (0,0,0) sites + +Wave-function parameters: + sigma type = delta + Wave-function basis: + element #0: n_H = 0.000000000000 r_H = 2.666666666667 + element #1: n_H = 1.000000000000 r_H = 2.666666666667 + element #2: n_H = 0.000000000000 r_H = 5.333333333333 + Wave-function coefficients: + element #0: coeff = { 1.000000000000, 0.000000000000, 0.000000000000,} + element #1: coeff = { 0.000000000000, 1.000000000000, 0.000000000000,} + element #2: coeff = { 0.000000000000, 0.000000000000, 1.000000000000,} + +Relativistic quarks: + rel. quark #0: name = 'lquark' kappa = 0.137137900000 theta = 0.500000000000 0.500000000000 0.500000000000 persistent + +Measurements for rr: 1 + mrr[0] = (0, 0) + +Correlators for rr: 3 + crr[0] = 'f_A' + crr[1] = 'f_1' + crr[2] = 'F_V0' + +Static actions (`smearings'): + +Static quarks: + +Measurements for rs: 0 + +Correlators for rs: 0 + +... allocating rprop (32 blocks) +... initializing dataio (a=1 f=0 b=0 c=0 dname='./output_10519905/data_a' p=0 pname='./output_10519905/parameters_a') +... checking data file './output_10519905/data_af_A' [dataio.c] +... skipped 2 run records [dataio.c] +... skipped 12 correlator records [dataio.c] +... appending to data file './output_10519905/data_af_A' [dataio.c] +... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7) +... checking data file './output_10519905/data_af_1' [dataio.c] +... skipped 2 run records [dataio.c] +... skipped 36 correlator records [dataio.c] +... appending to data file './output_10519905/data_af_1' [dataio.c] +... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7) +... checking data file './output_10519905/data_aF_V0' [dataio.c] +... skipped 2 run records [dataio.c] +... skipped 36 correlator records [dataio.c] +... appending to data file './output_10519905/data_aF_V0' [dataio.c] +... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7) + +Plaquette: + + sum: 4.09557397714092622e+03 + sum (time): 2.36757397714092622e+03 + sum (space): 1.72800000000000000e+03 + sum (avg.): 1.01576735544169794e+00 + dS/deta: 0.00000000000000000e+00 + vbar: 0.00000000000000000e+00 + + + +RR Correlation Functions +------------------------ + + offset[0] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +0.0000000000000000e+00} + computing correlations between rel. quark 0 and rel. quark 0... + wave function: 0 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.335827e-10 + True residue: |r_n|/|v| = 8.335828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.335827e-10 + True residue: |r_n|/|v| = 8.335828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.335827e-10 + True residue: |r_n|/|v| = 8.335828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.534512e-10 + True residue: |r_n|/|v| = 8.534511e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.534512e-10 + True residue: |r_n|/|v| = 8.534511e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.534512e-10 + True residue: |r_n|/|v| = 8.534511e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802722e-10 + True residue: |r_n|/|v| = 8.802722e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802722e-10 + True residue: |r_n|/|v| = 8.802722e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802722e-10 + True residue: |r_n|/|v| = 8.802722e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802562e-10 + True residue: |r_n|/|v| = 8.802562e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802562e-10 + True residue: |r_n|/|v| = 8.802562e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802562e-10 + True residue: |r_n|/|v| = 8.802562e-10 + computing f_1 ... + computing F_V0 ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.801999e-10 + True residue: |r_n|/|v| = 8.801999e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.801999e-10 + True residue: |r_n|/|v| = 8.801999e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.801999e-10 + True residue: |r_n|/|v| = 8.801999e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796995e-10 + True residue: |r_n|/|v| = 8.796995e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796995e-10 + True residue: |r_n|/|v| = 8.796995e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796995e-10 + True residue: |r_n|/|v| = 8.796995e-10 + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 1 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.684873e-10 + True residue: |r_n|/|v| = 6.684873e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.684873e-10 + True residue: |r_n|/|v| = 6.684873e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.684873e-10 + True residue: |r_n|/|v| = 6.684873e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.682003e-10 + True residue: |r_n|/|v| = 6.682002e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.682003e-10 + True residue: |r_n|/|v| = 6.682002e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.682003e-10 + True residue: |r_n|/|v| = 6.682002e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 2 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021740e-10 + True residue: |r_n|/|v| = 6.021742e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021740e-10 + True residue: |r_n|/|v| = 6.021742e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021740e-10 + True residue: |r_n|/|v| = 6.021742e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021726e-10 + True residue: |r_n|/|v| = 6.021726e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021726e-10 + True residue: |r_n|/|v| = 6.021726e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021726e-10 + True residue: |r_n|/|v| = 6.021726e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + offset[1] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +5.0000000000000000e-01} + computing correlations between rel. quark 0 and rel. quark 0... + wave function: 0 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 9.352828e-10 + True residue: |r_n|/|v| = 9.352828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 9.352828e-10 + True residue: |r_n|/|v| = 9.352828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 9.352828e-10 + True residue: |r_n|/|v| = 9.352828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.277678e-10 + True residue: |r_n|/|v| = 8.277678e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.277678e-10 + True residue: |r_n|/|v| = 8.277678e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.277678e-10 + True residue: |r_n|/|v| = 8.277678e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.800192e-10 + True residue: |r_n|/|v| = 8.800192e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.800192e-10 + True residue: |r_n|/|v| = 8.800192e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.800192e-10 + True residue: |r_n|/|v| = 8.800192e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.804954e-10 + True residue: |r_n|/|v| = 8.804953e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.804954e-10 + True residue: |r_n|/|v| = 8.804953e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.804954e-10 + True residue: |r_n|/|v| = 8.804953e-10 + computing f_1 ... + computing F_V0 ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.806137e-10 + True residue: |r_n|/|v| = 8.806137e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.806137e-10 + True residue: |r_n|/|v| = 8.806137e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.806137e-10 + True residue: |r_n|/|v| = 8.806137e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796464e-10 + True residue: |r_n|/|v| = 8.796464e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796464e-10 + True residue: |r_n|/|v| = 8.796464e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796464e-10 + True residue: |r_n|/|v| = 8.796464e-10 + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 1 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.689213e-10 + True residue: |r_n|/|v| = 6.689212e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.689213e-10 + True residue: |r_n|/|v| = 6.689212e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.689213e-10 + True residue: |r_n|/|v| = 6.689212e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.695514e-10 + True residue: |r_n|/|v| = 6.695515e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.695514e-10 + True residue: |r_n|/|v| = 6.695515e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.695514e-10 + True residue: |r_n|/|v| = 6.695515e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 2 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021731e-10 + True residue: |r_n|/|v| = 6.021731e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021731e-10 + True residue: |r_n|/|v| = 6.021731e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021731e-10 + True residue: |r_n|/|v| = 6.021731e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021729e-10 + True residue: |r_n|/|v| = 6.021727e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021729e-10 + True residue: |r_n|/|v| = 6.021727e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021729e-10 + True residue: |r_n|/|v| = 6.021727e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + + +RS Correlation Functions +------------------------ + +... finalizing dataio + + +OK: All 197 PSDdummy are zero + +Maximum memory usage (rank 0): 8.61 MB (8.61 by SFCF, 0.00 by openQCD) +Current memory usage (rank 0): 8.58 MB (8.58 by SFCF, 0.00 by openQCD) + +Total execution time with solver -1 (CG): 2.11e+00 sec + + section count avg sec tot sec rel cost + ----------------------------------------------------------------- + main 1 8.06e-04 8.06e-04 0.0 % + reading input 1 1.81e+00 1.81e+00 85.8 % + IO config 1 7.46e-04 7.46e-04 0.0 % + IO data 2 2.60e-03 5.20e-03 0.2 % + mem alloc 2 1.33e-03 2.66e-03 0.1 % + solver (sfcf only) 60 4.57e-03 2.74e-01 13.0 % + rr correlators 1 1.60e-02 1.60e-02 0.8 % + rs correlators 1 0.00e+00 0.00e+00 0.0 % + +End. +Build info +---------- +Global lattice: 4 x 4 x 4 x 4 +Local lattice: 4 x 4 x 4 x 4 (u: 320+0 s: 192+0) +Using single MPI process +SFCF version: 2.1 +Using geometry 2 (boundary spinors mapped to dummy, u_ipt != s_ipt) +Using solvers from openQCD +Using dfl_update in DFL_SAP_GCR solver from openQCD +Using oqcd_utils2.c from SFCF +Using profiler functions also in openQCD interface +Using SSE3 +Using prefetch PM +Using prefetch P4 + +Initialization +-------------- +... initializing geometry +... allocating gauge field +... using unit gauge field +Gauge field checked (184320 B, unused links: 64 zero, 1216 unity, BF0) +Gauge checksum (MD5): 1ea28326e4090996111a320b8372811d +... reading input file ('sfcf_unity_test.in') +... finished reading input file (without hash) [input.c] + +Basic parameters: + Nf = 3 + beta = 3.552200000000 + ct = 1.055185744046 (input) + cttilde= 0.974579134058 (input) + csw = 1.822845956831 (input) + isw = 0 + +WARNING: The improvement coefficients have been calculated according to old + formulae, which were used in past simulations. If you do not need + compatibility to old simulations, you can use the newest formulae by + defining the preprocessor flag USE_LATEST_IMPROVEMENT. + + +Solver parameters: + errsq = 1.000000e-18 + nmax = 4096 + + oqcd_solver_select = -1 + oqcd_solver_param = 0xf04 + + [Solver 0] + solver = DFL_SAP_GCR + nkv = 24 + isolv = 1 + nmr = 4 + ncy = 5 + nmx = 2048 + res = 1.000000e-10 + [Solver 1] + solver = CGNE + nmx = 4096 + res = 1.000000e-10 + [Solver 2] + solver = SAP_GCR + nkv = 24 + isolv = 1 + nmr = 4 + ncy = 5 + nmx = 2048 + res = 1.000000e-10 + [Solver 3] + solver = CGNE_NO_EO + nkv = 0 + isolv = 0 + nmr = 0 + ncy = 0 + nmx = 4096 + res = 1.000000e-10 + [SAP] + bs = 4 4 4 4 + [[Deflation subspace] + bs = 4 4 4 4 + Ns = 20 + [[Deflation subspace generation] + kappa = 1.371379e-01 + mu = 0.000000e+00 + ninv = 10 + nmr = 4 + ncy = 5 + [[Deflation projection] + nkv = 18 + nmx = 2048 + res = 1.000000e-02 + +Source offsets: 2 + offsets[0] = (0.0000000000000000e+00,0.0000000000000000e+00,0.0000000000000000e+00) = (0,0,0) sites +WARNING in safe_ftoi [utils.c]: Fractional part exceeds tolerance (|0.5|>1e-06). offsets[1] = (0.0000000000000000e+00,0.0000000000000000e+00,5.0000000000000000e-01) = (0,0,0) sites + +Wave-function parameters: + sigma type = delta + Wave-function basis: + element #0: n_H = 0.000000000000 r_H = 2.666666666667 + element #1: n_H = 1.000000000000 r_H = 2.666666666667 + element #2: n_H = 0.000000000000 r_H = 5.333333333333 + Wave-function coefficients: + element #0: coeff = { 1.000000000000, 0.000000000000, 0.000000000000,} + element #1: coeff = { 0.000000000000, 1.000000000000, 0.000000000000,} + element #2: coeff = { 0.000000000000, 0.000000000000, 1.000000000000,} + +Relativistic quarks: + rel. quark #0: name = 'lquark' kappa = 0.137137900000 theta = 0.500000000000 0.500000000000 0.500000000000 persistent + +Measurements for rr: 1 + mrr[0] = (0, 0) + +Correlators for rr: 3 + crr[0] = 'f_A' + crr[1] = 'f_1' + crr[2] = 'F_V0' + +Static actions (`smearings'): + +Static quarks: + +Measurements for rs: 0 + +Correlators for rs: 0 + +... allocating rprop (32 blocks) +... initializing dataio (a=1 f=0 b=0 c=0 dname='./output_10519905/data_a' p=0 pname='./output_10519905/parameters_a') +... checking data file './output_10519905/data_af_A' [dataio.c] +... skipped 3 run records [dataio.c] +... skipped 18 correlator records [dataio.c] +... appending to data file './output_10519905/data_af_A' [dataio.c] +... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7) +... checking data file './output_10519905/data_af_1' [dataio.c] +... skipped 3 run records [dataio.c] +... skipped 54 correlator records [dataio.c] +... appending to data file './output_10519905/data_af_1' [dataio.c] +... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7) +... checking data file './output_10519905/data_aF_V0' [dataio.c] +... skipped 3 run records [dataio.c] +... skipped 54 correlator records [dataio.c] +... appending to data file './output_10519905/data_aF_V0' [dataio.c] +... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7) + +Plaquette: + + sum: 4.09557397714092622e+03 + sum (time): 2.36757397714092622e+03 + sum (space): 1.72800000000000000e+03 + sum (avg.): 1.01576735544169794e+00 + dS/deta: 0.00000000000000000e+00 + vbar: 0.00000000000000000e+00 + + + +RR Correlation Functions +------------------------ + + offset[0] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +0.0000000000000000e+00} + computing correlations between rel. quark 0 and rel. quark 0... + wave function: 0 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.335827e-10 + True residue: |r_n|/|v| = 8.335828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.335827e-10 + True residue: |r_n|/|v| = 8.335828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.335827e-10 + True residue: |r_n|/|v| = 8.335828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.534512e-10 + True residue: |r_n|/|v| = 8.534511e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.534512e-10 + True residue: |r_n|/|v| = 8.534511e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.534512e-10 + True residue: |r_n|/|v| = 8.534511e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802722e-10 + True residue: |r_n|/|v| = 8.802722e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802722e-10 + True residue: |r_n|/|v| = 8.802722e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802722e-10 + True residue: |r_n|/|v| = 8.802722e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802562e-10 + True residue: |r_n|/|v| = 8.802562e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802562e-10 + True residue: |r_n|/|v| = 8.802562e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802562e-10 + True residue: |r_n|/|v| = 8.802562e-10 + computing f_1 ... + computing F_V0 ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.801999e-10 + True residue: |r_n|/|v| = 8.801999e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.801999e-10 + True residue: |r_n|/|v| = 8.801999e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.801999e-10 + True residue: |r_n|/|v| = 8.801999e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796995e-10 + True residue: |r_n|/|v| = 8.796995e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796995e-10 + True residue: |r_n|/|v| = 8.796995e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796995e-10 + True residue: |r_n|/|v| = 8.796995e-10 + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 1 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.684873e-10 + True residue: |r_n|/|v| = 6.684873e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.684873e-10 + True residue: |r_n|/|v| = 6.684873e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.684873e-10 + True residue: |r_n|/|v| = 6.684873e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.682003e-10 + True residue: |r_n|/|v| = 6.682002e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.682003e-10 + True residue: |r_n|/|v| = 6.682002e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.682003e-10 + True residue: |r_n|/|v| = 6.682002e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 2 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021740e-10 + True residue: |r_n|/|v| = 6.021742e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021740e-10 + True residue: |r_n|/|v| = 6.021742e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021740e-10 + True residue: |r_n|/|v| = 6.021742e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021726e-10 + True residue: |r_n|/|v| = 6.021726e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021726e-10 + True residue: |r_n|/|v| = 6.021726e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021726e-10 + True residue: |r_n|/|v| = 6.021726e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + offset[1] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +5.0000000000000000e-01} + computing correlations between rel. quark 0 and rel. quark 0... + wave function: 0 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 9.352828e-10 + True residue: |r_n|/|v| = 9.352828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 9.352828e-10 + True residue: |r_n|/|v| = 9.352828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 9.352828e-10 + True residue: |r_n|/|v| = 9.352828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.277678e-10 + True residue: |r_n|/|v| = 8.277678e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.277678e-10 + True residue: |r_n|/|v| = 8.277678e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.277678e-10 + True residue: |r_n|/|v| = 8.277678e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.800192e-10 + True residue: |r_n|/|v| = 8.800192e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.800192e-10 + True residue: |r_n|/|v| = 8.800192e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.800192e-10 + True residue: |r_n|/|v| = 8.800192e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.804954e-10 + True residue: |r_n|/|v| = 8.804953e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.804954e-10 + True residue: |r_n|/|v| = 8.804953e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.804954e-10 + True residue: |r_n|/|v| = 8.804953e-10 + computing f_1 ... + computing F_V0 ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.806137e-10 + True residue: |r_n|/|v| = 8.806137e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.806137e-10 + True residue: |r_n|/|v| = 8.806137e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.806137e-10 + True residue: |r_n|/|v| = 8.806137e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796464e-10 + True residue: |r_n|/|v| = 8.796464e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796464e-10 + True residue: |r_n|/|v| = 8.796464e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796464e-10 + True residue: |r_n|/|v| = 8.796464e-10 + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 1 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.689213e-10 + True residue: |r_n|/|v| = 6.689212e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.689213e-10 + True residue: |r_n|/|v| = 6.689212e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.689213e-10 + True residue: |r_n|/|v| = 6.689212e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.695514e-10 + True residue: |r_n|/|v| = 6.695515e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.695514e-10 + True residue: |r_n|/|v| = 6.695515e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.695514e-10 + True residue: |r_n|/|v| = 6.695515e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 2 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021731e-10 + True residue: |r_n|/|v| = 6.021731e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021731e-10 + True residue: |r_n|/|v| = 6.021731e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021731e-10 + True residue: |r_n|/|v| = 6.021731e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021729e-10 + True residue: |r_n|/|v| = 6.021727e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021729e-10 + True residue: |r_n|/|v| = 6.021727e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021729e-10 + True residue: |r_n|/|v| = 6.021727e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + + +RS Correlation Functions +------------------------ + +... finalizing dataio + + +OK: All 197 PSDdummy are zero + +Maximum memory usage (rank 0): 8.61 MB (8.61 by SFCF, 0.00 by openQCD) +Current memory usage (rank 0): 8.58 MB (8.58 by SFCF, 0.00 by openQCD) + +Total execution time with solver -1 (CG): 2.11e+00 sec + + section count avg sec tot sec rel cost + ----------------------------------------------------------------- + main 1 8.31e-04 8.31e-04 0.0 % + reading input 1 1.81e+00 1.81e+00 85.9 % + IO config 1 9.42e-04 9.42e-04 0.0 % + IO data 2 1.73e-03 3.45e-03 0.2 % + mem alloc 2 1.62e-03 3.24e-03 0.2 % + solver (sfcf only) 60 4.54e-03 2.72e-01 12.9 % + rr correlators 1 1.52e-02 1.52e-02 0.7 % + rs correlators 1 0.00e+00 0.00e+00 0.0 % + +End. +Build info +---------- +Global lattice: 4 x 4 x 4 x 4 +Local lattice: 4 x 4 x 4 x 4 (u: 320+0 s: 192+0) +Using single MPI process +SFCF version: 2.1 +Using geometry 2 (boundary spinors mapped to dummy, u_ipt != s_ipt) +Using solvers from openQCD +Using dfl_update in DFL_SAP_GCR solver from openQCD +Using oqcd_utils2.c from SFCF +Using profiler functions also in openQCD interface +Using SSE3 +Using prefetch PM +Using prefetch P4 + +Initialization +-------------- +... initializing geometry +... allocating gauge field +... using unit gauge field +Gauge field checked (184320 B, unused links: 64 zero, 1216 unity, BF0) +Gauge checksum (MD5): 1ea28326e4090996111a320b8372811d +... reading input file ('sfcf_unity_test.in') +... finished reading input file (without hash) [input.c] + +Basic parameters: + Nf = 3 + beta = 3.552200000000 + ct = 1.055185744046 (input) + cttilde= 0.974579134058 (input) + csw = 1.822845956831 (input) + isw = 0 + +WARNING: The improvement coefficients have been calculated according to old + formulae, which were used in past simulations. If you do not need + compatibility to old simulations, you can use the newest formulae by + defining the preprocessor flag USE_LATEST_IMPROVEMENT. + + +Solver parameters: + errsq = 1.000000e-18 + nmax = 4096 + + oqcd_solver_select = -1 + oqcd_solver_param = 0xf04 + + [Solver 0] + solver = DFL_SAP_GCR + nkv = 24 + isolv = 1 + nmr = 4 + ncy = 5 + nmx = 2048 + res = 1.000000e-10 + [Solver 1] + solver = CGNE + nmx = 4096 + res = 1.000000e-10 + [Solver 2] + solver = SAP_GCR + nkv = 24 + isolv = 1 + nmr = 4 + ncy = 5 + nmx = 2048 + res = 1.000000e-10 + [Solver 3] + solver = CGNE_NO_EO + nkv = 0 + isolv = 0 + nmr = 0 + ncy = 0 + nmx = 4096 + res = 1.000000e-10 + [SAP] + bs = 4 4 4 4 + [[Deflation subspace] + bs = 4 4 4 4 + Ns = 20 + [[Deflation subspace generation] + kappa = 1.371379e-01 + mu = 0.000000e+00 + ninv = 10 + nmr = 4 + ncy = 5 + [[Deflation projection] + nkv = 18 + nmx = 2048 + res = 1.000000e-02 + +Source offsets: 2 + offsets[0] = (0.0000000000000000e+00,0.0000000000000000e+00,0.0000000000000000e+00) = (0,0,0) sites +WARNING in safe_ftoi [utils.c]: Fractional part exceeds tolerance (|0.5|>1e-06). offsets[1] = (0.0000000000000000e+00,0.0000000000000000e+00,5.0000000000000000e-01) = (0,0,0) sites + +Wave-function parameters: + sigma type = delta + Wave-function basis: + element #0: n_H = 0.000000000000 r_H = 2.666666666667 + element #1: n_H = 1.000000000000 r_H = 2.666666666667 + element #2: n_H = 0.000000000000 r_H = 5.333333333333 + Wave-function coefficients: + element #0: coeff = { 1.000000000000, 0.000000000000, 0.000000000000,} + element #1: coeff = { 0.000000000000, 1.000000000000, 0.000000000000,} + element #2: coeff = { 0.000000000000, 0.000000000000, 1.000000000000,} + +Relativistic quarks: + rel. quark #0: name = 'lquark' kappa = 0.137137900000 theta = 0.500000000000 0.500000000000 0.500000000000 persistent + +Measurements for rr: 1 + mrr[0] = (0, 0) + +Correlators for rr: 3 + crr[0] = 'f_A' + crr[1] = 'f_1' + crr[2] = 'F_V0' + +Static actions (`smearings'): + +Static quarks: + +Measurements for rs: 0 + +Correlators for rs: 0 + +... allocating rprop (32 blocks) +... initializing dataio (a=1 f=0 b=0 c=0 dname='./output_10519905/data_a' p=0 pname='./output_10519905/parameters_a') +... checking data file './output_10519905/data_af_A' [dataio.c] +... skipped 4 run records [dataio.c] +... skipped 24 correlator records [dataio.c] +... appending to data file './output_10519905/data_af_A' [dataio.c] +... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7) +... checking data file './output_10519905/data_af_1' [dataio.c] +... skipped 4 run records [dataio.c] +... skipped 72 correlator records [dataio.c] +... appending to data file './output_10519905/data_af_1' [dataio.c] +... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7) +... checking data file './output_10519905/data_aF_V0' [dataio.c] +... skipped 4 run records [dataio.c] +... skipped 72 correlator records [dataio.c] +... appending to data file './output_10519905/data_aF_V0' [dataio.c] +... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7) + +Plaquette: + + sum: 4.09557397714092622e+03 + sum (time): 2.36757397714092622e+03 + sum (space): 1.72800000000000000e+03 + sum (avg.): 1.01576735544169794e+00 + dS/deta: 0.00000000000000000e+00 + vbar: 0.00000000000000000e+00 + + + +RR Correlation Functions +------------------------ + + offset[0] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +0.0000000000000000e+00} + computing correlations between rel. quark 0 and rel. quark 0... + wave function: 0 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.335827e-10 + True residue: |r_n|/|v| = 8.335828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.335827e-10 + True residue: |r_n|/|v| = 8.335828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.335827e-10 + True residue: |r_n|/|v| = 8.335828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.534512e-10 + True residue: |r_n|/|v| = 8.534511e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.534512e-10 + True residue: |r_n|/|v| = 8.534511e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.534512e-10 + True residue: |r_n|/|v| = 8.534511e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802722e-10 + True residue: |r_n|/|v| = 8.802722e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802722e-10 + True residue: |r_n|/|v| = 8.802722e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802722e-10 + True residue: |r_n|/|v| = 8.802722e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802562e-10 + True residue: |r_n|/|v| = 8.802562e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802562e-10 + True residue: |r_n|/|v| = 8.802562e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.802562e-10 + True residue: |r_n|/|v| = 8.802562e-10 + computing f_1 ... + computing F_V0 ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.801999e-10 + True residue: |r_n|/|v| = 8.801999e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.801999e-10 + True residue: |r_n|/|v| = 8.801999e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.801999e-10 + True residue: |r_n|/|v| = 8.801999e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796995e-10 + True residue: |r_n|/|v| = 8.796995e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796995e-10 + True residue: |r_n|/|v| = 8.796995e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796995e-10 + True residue: |r_n|/|v| = 8.796995e-10 + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 1 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.684873e-10 + True residue: |r_n|/|v| = 6.684873e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.684873e-10 + True residue: |r_n|/|v| = 6.684873e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.684873e-10 + True residue: |r_n|/|v| = 6.684873e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.682003e-10 + True residue: |r_n|/|v| = 6.682002e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.682003e-10 + True residue: |r_n|/|v| = 6.682002e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.682003e-10 + True residue: |r_n|/|v| = 6.682002e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 2 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021740e-10 + True residue: |r_n|/|v| = 6.021742e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021740e-10 + True residue: |r_n|/|v| = 6.021742e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021740e-10 + True residue: |r_n|/|v| = 6.021742e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021726e-10 + True residue: |r_n|/|v| = 6.021726e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021726e-10 + True residue: |r_n|/|v| = 6.021726e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021726e-10 + True residue: |r_n|/|v| = 6.021726e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + offset[1] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +5.0000000000000000e-01} + computing correlations between rel. quark 0 and rel. quark 0... + wave function: 0 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 9.352828e-10 + True residue: |r_n|/|v| = 9.352828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 9.352828e-10 + True residue: |r_n|/|v| = 9.352828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 9.352828e-10 + True residue: |r_n|/|v| = 9.352828e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.277678e-10 + True residue: |r_n|/|v| = 8.277678e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.277678e-10 + True residue: |r_n|/|v| = 8.277678e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 42 iterations + Iterated residue: |r_n|/|v| = 8.277678e-10 + True residue: |r_n|/|v| = 8.277678e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.800192e-10 + True residue: |r_n|/|v| = 8.800192e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.800192e-10 + True residue: |r_n|/|v| = 8.800192e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.800192e-10 + True residue: |r_n|/|v| = 8.800192e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.804954e-10 + True residue: |r_n|/|v| = 8.804953e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.804954e-10 + True residue: |r_n|/|v| = 8.804953e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.804954e-10 + True residue: |r_n|/|v| = 8.804953e-10 + computing f_1 ... + computing F_V0 ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.806137e-10 + True residue: |r_n|/|v| = 8.806137e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.806137e-10 + True residue: |r_n|/|v| = 8.806137e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.806137e-10 + True residue: |r_n|/|v| = 8.806137e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796464e-10 + True residue: |r_n|/|v| = 8.796464e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796464e-10 + True residue: |r_n|/|v| = 8.796464e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 48 iterations + Iterated residue: |r_n|/|v| = 8.796464e-10 + True residue: |r_n|/|v| = 8.796464e-10 + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 1 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.689213e-10 + True residue: |r_n|/|v| = 6.689212e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.689213e-10 + True residue: |r_n|/|v| = 6.689212e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.689213e-10 + True residue: |r_n|/|v| = 6.689212e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.695514e-10 + True residue: |r_n|/|v| = 6.695515e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.695514e-10 + True residue: |r_n|/|v| = 6.695515e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 41 iterations + Iterated residue: |r_n|/|v| = 6.695514e-10 + True residue: |r_n|/|v| = 6.695515e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + wave function: 2 + computing f_A ... +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021731e-10 + True residue: |r_n|/|v| = 6.021731e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021731e-10 + True residue: |r_n|/|v| = 6.021731e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021731e-10 + True residue: |r_n|/|v| = 6.021731e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021729e-10 + True residue: |r_n|/|v| = 6.021727e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021729e-10 + True residue: |r_n|/|v| = 6.021727e-10 +... start SFCF solver CG: iv=-1 ix=196 [solver.c] + CG converged after 39 iterations + Iterated residue: |r_n|/|v| = 6.021729e-10 + True residue: |r_n|/|v| = 6.021727e-10 + computing f_1 ... + computing F_V0 ... + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions. + + +RS Correlation Functions +------------------------ + +... finalizing dataio + + +OK: All 197 PSDdummy are zero + +Maximum memory usage (rank 0): 8.61 MB (8.61 by SFCF, 0.00 by openQCD) +Current memory usage (rank 0): 8.58 MB (8.58 by SFCF, 0.00 by openQCD) + +Total execution time with solver -1 (CG): 2.11e+00 sec + + section count avg sec tot sec rel cost + ----------------------------------------------------------------- + main 1 7.94e-04 7.94e-04 0.0 % + reading input 1 1.81e+00 1.81e+00 86.0 % + IO config 1 7.78e-04 7.78e-04 0.0 % + IO data 2 2.04e-03 4.08e-03 0.2 % + mem alloc 2 1.56e-03 3.13e-03 0.1 % + solver (sfcf only) 60 4.50e-03 2.70e-01 12.8 % + rr correlators 1 1.54e-02 1.54e-02 0.7 % + rs correlators 1 0.00e+00 0.00e+00 0.0 % + +End. diff --git a/tests/data/sfcf_test/param/parameters_a b/tests/data/sfcf_test/param/parameters_a new file mode 100644 index 00000000..8e573616 --- /dev/null +++ b/tests/data/sfcf_test/param/parameters_a @@ -0,0 +1,102 @@ + +tsize 4 +l1 4 +l2 4 +l3 4 +nf 3 +beta +3.5522000000000000e+00 +ct +1.0551857440459433e+00 +cttilde +9.7457913405776697e-01 +csw +1.8228459568314139e+00 +isw 0 +errsq +1.0000000000000001e-18 +nmax 4096 +oqcd_solver_select -1 +oqcd_solver_param 3844 + +[Solver 0] +solver DFL_SAP_GCR +nkv 24 +isolv 1 +nmr 4 +ncy 5 +nmx 2048 +res +1.0000000000000000e-10 +istop 0 + +[Solver 1] +solver CGNE +nkv 0 +isolv 0 +nmr 0 +ncy 0 +nmx 4096 +res +1.0000000000000000e-10 +istop 0 + +[Solver 2] +solver SAP_GCR +nkv 24 +isolv 1 +nmr 4 +ncy 5 +nmx 2048 +res +1.0000000000000000e-10 +istop 0 + +[Solver 3] +solver CGNE_NO_EO +nkv 0 +isolv 0 +nmr 0 +ncy 0 +nmx 4096 +res +1.0000000000000000e-10 +istop 0 + +[SAP] +bs 4 4 4 4 + +[Deflation subspace] +bs 4 4 4 4 +Ns 20 + +[Deflation subspace generation] +kappa +1.3713790000000001e-01 +mu +0.0000000000000000e+00 +ninv 10 +nmr 4 +ncy 5 + +[Deflation projection] +nkv 18 +nmx 2048 +res +1.0000000000000000e-02 + +wf_offsets 2 + +0.0000000000000000e+00 +0.0000000000000000e+00 +0.0000000000000000e+00 + +0.0000000000000000e+00 +0.0000000000000000e+00 +5.0000000000000000e-01 +wf_basis 3 + +0.0000000000000000e+00 +2.6666666666666665e+00 + +1.0000000000000000e+00 +2.6666666666666665e+00 + +0.0000000000000000e+00 +5.3333333333333330e+00 +wf_coeff 3 + +1.0000000000000000e+00 +0.0000000000000000e+00 +0.0000000000000000e+00 + +0.0000000000000000e+00 +1.0000000000000000e+00 +0.0000000000000000e+00 + +0.0000000000000000e+00 +0.0000000000000000e+00 +1.0000000000000000e+00 + +qr 1 + lquark +1.3713790000000001e-01 +5.0000000000000000e-01 +5.0000000000000000e-01 +5.0000000000000000e-01 persistent +mrr 1 + lquark lquark +crr 3 + f_A + f_1 + F_V0 + +sg 0 +qs 0 +mrs 0 +crs 0 + +# param_hash 686af5e712ee2902180f5428af94c6e7 diff --git a/tests/data/sfcf_test/param/parameters_c b/tests/data/sfcf_test/param/parameters_c new file mode 100644 index 00000000..8e573616 --- /dev/null +++ b/tests/data/sfcf_test/param/parameters_c @@ -0,0 +1,102 @@ + +tsize 4 +l1 4 +l2 4 +l3 4 +nf 3 +beta +3.5522000000000000e+00 +ct +1.0551857440459433e+00 +cttilde +9.7457913405776697e-01 +csw +1.8228459568314139e+00 +isw 0 +errsq +1.0000000000000001e-18 +nmax 4096 +oqcd_solver_select -1 +oqcd_solver_param 3844 + +[Solver 0] +solver DFL_SAP_GCR +nkv 24 +isolv 1 +nmr 4 +ncy 5 +nmx 2048 +res +1.0000000000000000e-10 +istop 0 + +[Solver 1] +solver CGNE +nkv 0 +isolv 0 +nmr 0 +ncy 0 +nmx 4096 +res +1.0000000000000000e-10 +istop 0 + +[Solver 2] +solver SAP_GCR +nkv 24 +isolv 1 +nmr 4 +ncy 5 +nmx 2048 +res +1.0000000000000000e-10 +istop 0 + +[Solver 3] +solver CGNE_NO_EO +nkv 0 +isolv 0 +nmr 0 +ncy 0 +nmx 4096 +res +1.0000000000000000e-10 +istop 0 + +[SAP] +bs 4 4 4 4 + +[Deflation subspace] +bs 4 4 4 4 +Ns 20 + +[Deflation subspace generation] +kappa +1.3713790000000001e-01 +mu +0.0000000000000000e+00 +ninv 10 +nmr 4 +ncy 5 + +[Deflation projection] +nkv 18 +nmx 2048 +res +1.0000000000000000e-02 + +wf_offsets 2 + +0.0000000000000000e+00 +0.0000000000000000e+00 +0.0000000000000000e+00 + +0.0000000000000000e+00 +0.0000000000000000e+00 +5.0000000000000000e-01 +wf_basis 3 + +0.0000000000000000e+00 +2.6666666666666665e+00 + +1.0000000000000000e+00 +2.6666666666666665e+00 + +0.0000000000000000e+00 +5.3333333333333330e+00 +wf_coeff 3 + +1.0000000000000000e+00 +0.0000000000000000e+00 +0.0000000000000000e+00 + +0.0000000000000000e+00 +1.0000000000000000e+00 +0.0000000000000000e+00 + +0.0000000000000000e+00 +0.0000000000000000e+00 +1.0000000000000000e+00 + +qr 1 + lquark +1.3713790000000001e-01 +5.0000000000000000e-01 +5.0000000000000000e-01 +5.0000000000000000e-01 persistent +mrr 1 + lquark lquark +crr 3 + f_A + f_1 + F_V0 + +sg 0 +qs 0 +mrs 0 +crs 0 + +# param_hash 686af5e712ee2902180f5428af94c6e7 diff --git a/tests/data/sfcf_test/param/parameters_o b/tests/data/sfcf_test/param/parameters_o new file mode 100644 index 00000000..8e573616 --- /dev/null +++ b/tests/data/sfcf_test/param/parameters_o @@ -0,0 +1,102 @@ + +tsize 4 +l1 4 +l2 4 +l3 4 +nf 3 +beta +3.5522000000000000e+00 +ct +1.0551857440459433e+00 +cttilde +9.7457913405776697e-01 +csw +1.8228459568314139e+00 +isw 0 +errsq +1.0000000000000001e-18 +nmax 4096 +oqcd_solver_select -1 +oqcd_solver_param 3844 + +[Solver 0] +solver DFL_SAP_GCR +nkv 24 +isolv 1 +nmr 4 +ncy 5 +nmx 2048 +res +1.0000000000000000e-10 +istop 0 + +[Solver 1] +solver CGNE +nkv 0 +isolv 0 +nmr 0 +ncy 0 +nmx 4096 +res +1.0000000000000000e-10 +istop 0 + +[Solver 2] +solver SAP_GCR +nkv 24 +isolv 1 +nmr 4 +ncy 5 +nmx 2048 +res +1.0000000000000000e-10 +istop 0 + +[Solver 3] +solver CGNE_NO_EO +nkv 0 +isolv 0 +nmr 0 +ncy 0 +nmx 4096 +res +1.0000000000000000e-10 +istop 0 + +[SAP] +bs 4 4 4 4 + +[Deflation subspace] +bs 4 4 4 4 +Ns 20 + +[Deflation subspace generation] +kappa +1.3713790000000001e-01 +mu +0.0000000000000000e+00 +ninv 10 +nmr 4 +ncy 5 + +[Deflation projection] +nkv 18 +nmx 2048 +res +1.0000000000000000e-02 + +wf_offsets 2 + +0.0000000000000000e+00 +0.0000000000000000e+00 +0.0000000000000000e+00 + +0.0000000000000000e+00 +0.0000000000000000e+00 +5.0000000000000000e-01 +wf_basis 3 + +0.0000000000000000e+00 +2.6666666666666665e+00 + +1.0000000000000000e+00 +2.6666666666666665e+00 + +0.0000000000000000e+00 +5.3333333333333330e+00 +wf_coeff 3 + +1.0000000000000000e+00 +0.0000000000000000e+00 +0.0000000000000000e+00 + +0.0000000000000000e+00 +1.0000000000000000e+00 +0.0000000000000000e+00 + +0.0000000000000000e+00 +0.0000000000000000e+00 +1.0000000000000000e+00 + +qr 1 + lquark +1.3713790000000001e-01 +5.0000000000000000e-01 +5.0000000000000000e-01 +5.0000000000000000e-01 persistent +mrr 1 + lquark lquark +crr 3 + f_A + f_1 + F_V0 + +sg 0 +qs 0 +mrs 0 +crs 0 + +# param_hash 686af5e712ee2902180f5428af94c6e7 diff --git a/tests/sfcf_in_test.py b/tests/sfcf_in_test.py new file mode 100644 index 00000000..e4a495d1 --- /dev/null +++ b/tests/sfcf_in_test.py @@ -0,0 +1,29 @@ +import os,sys,inspect +current_dir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) +parent_dir = os.path.dirname(current_dir) +sys.path.insert(0, parent_dir) + +import pyerrors as pe +import pyerrors.input.openQCD as qcdin +import pyerrors.input.sfcf as sfin +import shutil +import pytest + +from time import sleep + +n = 5 +def o_test(): + for i in range(2,n+1): + os.mkdir("data/sfcf_test/data_o/cfg"+str(i)) + shutil.copy("data/sfcf_test/data_o/cfg1/f_1","data/sfcf_test/data_o/cfg"+str(i)) + shutil.copy("data/sfcf_test/data_o/cfg1/f_A","data/sfcf_test/data_o/cfg"+str(i)) + shutil.copy("data/sfcf_test/data_o/cfg1/F_V0","data/sfcf_test/data_o/cfg"+str(i)) + + o = sfin.read_sfcf("data/sfcf_test/data_o", "qcd2sf_T24L24_b3.685_k0.1394400_id0", "f_A",quarks="lquark lquark", noffset=15)#, files = ["qcd2sf_T24L24_b3.685_k0.1394400_id0_r0_n50","qcd2sf_T24L24_b3.685_k0.1394400_id0_r0_n100","qcd2sf_T24L24_b3.685_k0.1394400_id0_r0_n120","qcd2sf_T24L24_b3.685_k0.1394400_id0_r0_n140","qcd2sf_T24L24_b3.685_k0.1394400_id0_r0_n150"]) + + + sleep(10) + for i in range(2,n+1): + shutil.rmtree("data/sfcf_test/data_o/cfg"+str(i)) + + \ No newline at end of file From 02872bc461e06194530a922e99477ccd41f71838 Mon Sep 17 00:00:00 2001 From: jkuhl-uni Date: Sun, 6 Feb 2022 18:08:01 +0100 Subject: [PATCH 012/136] small bug fix in sfcf read method --- pyerrors/input/sfcf.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pyerrors/input/sfcf.py b/pyerrors/input/sfcf.py index 2371d101..d8b88d60 100644 --- a/pyerrors/input/sfcf.py +++ b/pyerrors/input/sfcf.py @@ -184,16 +184,16 @@ def read_sfcf(path, prefix, name, quarks='.*', noffset=0, wf=0, wf2=0, break # print(sub_ls) - for exc in sub_ls: - if compact: + if compact: + for exc in sub_ls: if not fnmatch.fnmatch(exc, prefix + '*'): sub_ls = list(set(sub_ls) - set([exc])) - sub_ls.sort(key=lambda x: - int(re.findall(r'\d+', x)[-1])) - else: + sub_ls.sort(key=lambda x: int(re.findall(r'\d+', x)[-1])) + else: + for exc in sub_ls: if not fnmatch.fnmatch(exc, 'cfg*'): sub_ls = list(set(sub_ls) - set([exc])) - sub_ls.sort(key=lambda x: int(x[3:])) + sub_ls.sort(key=lambda x: int(x[3:])) # print(sub_ls) rep_idl = [] no_cfg = len(sub_ls) From 338158961798afa83cf05d87f0e113077d7e56cd Mon Sep 17 00:00:00 2001 From: jkuhl-uni Date: Sun, 6 Feb 2022 18:14:04 +0100 Subject: [PATCH 013/136] enable idl_offsets in rwms method --- pyerrors/input/openQCD.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/pyerrors/input/openQCD.py b/pyerrors/input/openQCD.py index 8caede78..51d6d975 100644 --- a/pyerrors/input/openQCD.py +++ b/pyerrors/input/openQCD.py @@ -23,6 +23,8 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs): list which contains the last config to be read for each replicum postfix : str postfix of the file to read, e.g. '.ms1' for openQCD-files + idl_offsets : list + offsets to the idl range of obs. Useful for the case that the measurements of rwms are only starting at cfg. 20 """ known_oqcd_versions = ['1.4', '1.6', '2.0'] if not (version in known_oqcd_versions): @@ -165,13 +167,20 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs): deltas[k].append(tmp_array[k][r_start[rep]:r_stop[rep]]) print(',', nrw, 'reweighting factors with', nsrc, 'sources') + if "idl_offsets" in kwargs: + idl_offsets = kwargs.get("idl_offsets") + else: + idl_offsets = np.ones(nrw, dtype = int) result = [] for t in range(nrw): + idl = [] + for rep in range(replica): + idl.append(range(idl_offsets[rep],len(deltas[t][rep]+idl_offsets[rep]))) if names is None: - result.append(Obs(deltas[t], rep_names)) + result.append(Obs(deltas[t], rep_names, idl = idl)) else: print(names) - result.append(Obs(deltas[t], names)) + result.append(Obs(deltas[t], names, idl = idl)) return result From 8731fcc615c3ad7f049036715268f487896249e9 Mon Sep 17 00:00:00 2001 From: jkuhl-uni Date: Sun, 6 Feb 2022 18:16:40 +0100 Subject: [PATCH 014/136] flake8 compliance --- pyerrors/input/openQCD.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pyerrors/input/openQCD.py b/pyerrors/input/openQCD.py index 51d6d975..bef7efd3 100644 --- a/pyerrors/input/openQCD.py +++ b/pyerrors/input/openQCD.py @@ -170,17 +170,17 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs): if "idl_offsets" in kwargs: idl_offsets = kwargs.get("idl_offsets") else: - idl_offsets = np.ones(nrw, dtype = int) + idl_offsets = np.ones(nrw, dtype=int) result = [] for t in range(nrw): idl = [] for rep in range(replica): - idl.append(range(idl_offsets[rep],len(deltas[t][rep]+idl_offsets[rep]))) + idl.append(range(idl_offsets[rep], len(deltas[t][rep] + idl_offsets[rep]))) if names is None: - result.append(Obs(deltas[t], rep_names, idl = idl)) + result.append(Obs(deltas[t], rep_names, idl=idl)) else: print(names) - result.append(Obs(deltas[t], names, idl = idl)) + result.append(Obs(deltas[t], names, idl=idl)) return result From 0d1921c16b221e28b844cd9cb8c4b00b308bb4f2 Mon Sep 17 00:00:00 2001 From: jkuhl-uni Date: Mon, 7 Feb 2022 12:28:14 +0100 Subject: [PATCH 015/136] positive tests for o and c finished --- .../sfcf_test/data_o/{ => test_r0}/cfg1/F_V0 | 0 .../sfcf_test/data_o/{ => test_r0}/cfg1/f_1 | 0 .../sfcf_test/data_o/{ => test_r0}/cfg1/f_A | 0 tests/sfcf_in_test.py | 75 +++++++++++++++---- 4 files changed, 62 insertions(+), 13 deletions(-) rename tests/data/sfcf_test/data_o/{ => test_r0}/cfg1/F_V0 (100%) rename tests/data/sfcf_test/data_o/{ => test_r0}/cfg1/f_1 (100%) rename tests/data/sfcf_test/data_o/{ => test_r0}/cfg1/f_A (100%) diff --git a/tests/data/sfcf_test/data_o/cfg1/F_V0 b/tests/data/sfcf_test/data_o/test_r0/cfg1/F_V0 similarity index 100% rename from tests/data/sfcf_test/data_o/cfg1/F_V0 rename to tests/data/sfcf_test/data_o/test_r0/cfg1/F_V0 diff --git a/tests/data/sfcf_test/data_o/cfg1/f_1 b/tests/data/sfcf_test/data_o/test_r0/cfg1/f_1 similarity index 100% rename from tests/data/sfcf_test/data_o/cfg1/f_1 rename to tests/data/sfcf_test/data_o/test_r0/cfg1/f_1 diff --git a/tests/data/sfcf_test/data_o/cfg1/f_A b/tests/data/sfcf_test/data_o/test_r0/cfg1/f_A similarity index 100% rename from tests/data/sfcf_test/data_o/cfg1/f_A rename to tests/data/sfcf_test/data_o/test_r0/cfg1/f_A diff --git a/tests/sfcf_in_test.py b/tests/sfcf_in_test.py index e4a495d1..3696f526 100644 --- a/tests/sfcf_in_test.py +++ b/tests/sfcf_in_test.py @@ -11,19 +11,68 @@ import pytest from time import sleep -n = 5 -def o_test(): - for i in range(2,n+1): - os.mkdir("data/sfcf_test/data_o/cfg"+str(i)) - shutil.copy("data/sfcf_test/data_o/cfg1/f_1","data/sfcf_test/data_o/cfg"+str(i)) - shutil.copy("data/sfcf_test/data_o/cfg1/f_A","data/sfcf_test/data_o/cfg"+str(i)) - shutil.copy("data/sfcf_test/data_o/cfg1/F_V0","data/sfcf_test/data_o/cfg"+str(i)) - - o = sfin.read_sfcf("data/sfcf_test/data_o", "qcd2sf_T24L24_b3.685_k0.1394400_id0", "f_A",quarks="lquark lquark", noffset=15)#, files = ["qcd2sf_T24L24_b3.685_k0.1394400_id0_r0_n50","qcd2sf_T24L24_b3.685_k0.1394400_id0_r0_n100","qcd2sf_T24L24_b3.685_k0.1394400_id0_r0_n120","qcd2sf_T24L24_b3.685_k0.1394400_id0_r0_n140","qcd2sf_T24L24_b3.685_k0.1394400_id0_r0_n150"]) +def build_test_environment(type, cfgs, reps): + if type == "o": + for i in range(2,cfgs+1): + shutil.copytree("data/sfcf_test/data_o/test_r0/cfg1","data/sfcf_test/data_o/test_r0/cfg"+str(i)) + for i in range(1,reps): + shutil.copytree("data/sfcf_test/data_o/test_r0", "data/sfcf_test/data_o/test_r"+str(i)) + elif type == "c": + for i in range(2,cfgs+1): + shutil.copy("data/sfcf_test/data_c/data_c_r0/data_c_r0_n1","data/sfcf_test/data_c/data_c_r0/data_c_r0_n"+str(i)) + for i in range(1,reps): + os.mkdir("data/sfcf_test/data_c/data_c_r"+str(i)) + for j in range(1,cfgs+1): + shutil.copy("data/sfcf_test/data_c/data_c_r0/data_c_r0_n1","data/sfcf_test/data_c/data_c_r"+str(i)+"/data_c_r"+str(i)+"_n"+str(j)) - sleep(10) - for i in range(2,n+1): - shutil.rmtree("data/sfcf_test/data_o/cfg"+str(i)) + + +def clean_test_environment(type, cfgs, reps): + if type == "o": + for i in range(1,reps): + shutil.rmtree("data/sfcf_test/data_o/test_r"+str(i)) + for i in range(2,cfgs+1): + shutil.rmtree("data/sfcf_test/data_o/test_r0/cfg"+str(i)) + elif type == "c": + for i in range(1,reps): + shutil.rmtree("data/sfcf_test/data_c/data_c_r"+str(i)) + for i in range(2,cfgs+1): + os.remove("data/sfcf_test/data_c/data_c_r0/data_c_r0_n"+str(i)) + - \ No newline at end of file +def o_bb_test(): + build_test_environment("o",5,3) + f_1 = sfin.read_sfcf("data/sfcf_test/data_o", "test", "f_1",quarks="lquark lquark", wf = 0, wf2=0, version = "2.0", single = True) + print(f_1) + clean_test_environment("o",5,3) + +def o_bi_test(): + build_test_environment("o",5,3) + f_A = sfin.read_sfcf("data/sfcf_test/data_o", "test", "f_A",quarks="lquark lquark", wf = 0, version = "2.0") + print(f_A) + clean_test_environment("o",5,3) + +def o_bib_test(): + build_test_environment("o",5,3) + f_V0 = sfin.read_sfcf("data/sfcf_test/data_o", "test", "F_V0",quarks="lquark lquark", wf = 0, wf2 = 0, version = "2.0", b2b = True) + print(f_V0) + clean_test_environment("o",5,3) + +def c_bb_test(): + build_test_environment("c",5,3) + f_1 = sfin.read_sfcf("data/sfcf_test/data_c", "data_c", "f_1", quarks="lquark lquark", wf = 0, wf2=0, version = "2.0c", single = True) + print(f_1) + clean_test_environment("c",5,3) + +def c_bi_test(): + build_test_environment("c",5,3) + f_1 = sfin.read_sfcf("data/sfcf_test/data_c", "data_c", "f_A", quarks="lquark lquark", wf = 0, version = "2.0c") + print(f_1) + clean_test_environment("c",5,3) + +def c_bib_test(): + build_test_environment("c",5,3) + f_V0 = sfin.read_sfcf("data/sfcf_test/data_c", "data_c", "F_V0",quarks="lquark lquark", wf = 0, wf2 = 0, version = "2.0c", b2b = True) + print(f_V0) + clean_test_environment("c",5,3) \ No newline at end of file From b36d559ac36092af4533efeb03644e1d3526dec0 Mon Sep 17 00:00:00 2001 From: jkuhl-uni Date: Mon, 7 Feb 2022 15:10:19 +0100 Subject: [PATCH 016/136] input append mode tests done --- .../data_a/{data_a.F_V0 => data_a_r0.F_V0} | 14 ++++++---- .../data_a/{data_a.f_1 => data_a_r0.f_1} | 14 ++++++---- .../data_a/{data_a.f_A => data_a_r0.f_A} | 14 ++++++---- tests/sfcf_in_test.py | 26 ++++++++++++++++--- 4 files changed, 49 insertions(+), 19 deletions(-) rename tests/data/sfcf_test/data_a/{data_a.F_V0 => data_a_r0.F_V0} (98%) rename tests/data/sfcf_test/data_a/{data_a.f_1 => data_a_r0.f_1} (97%) rename tests/data/sfcf_test/data_a/{data_a.f_A => data_a_r0.f_A} (96%) diff --git a/tests/data/sfcf_test/data_a/data_a.F_V0 b/tests/data/sfcf_test/data_a/data_a_r0.F_V0 similarity index 98% rename from tests/data/sfcf_test/data_a/data_a.F_V0 rename to tests/data/sfcf_test/data_a/data_a_r0.F_V0 index 970e1143..1d490c03 100644 --- a/tests/data/sfcf_test/data_a/data_a.F_V0 +++ b/tests/data/sfcf_test/data_a/data_a_r0.F_V0 @@ -5,7 +5,7 @@ date 2022-01-19 11:04:03 +0100 host r04n07.palma.wwu dir /scratch/tmp/j_kuhl19 user j_kuhl19 -gauge_name /unity +gauge_name /data_a_r0_n1 gauge_md5 1ea28326e4090996111a320b8372811d param_name sfcf_unity_test.in param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 @@ -235,9 +235,10 @@ date 2022-01-19 11:04:05 +0100 host r04n07.palma.wwu dir /scratch/tmp/j_kuhl19 user j_kuhl19 -gauge_name /unity +gauge_name /data_a_r0_n2 gauge_md5 1ea28326e4090996111a320b8372811d param_name sfcf_unity_test.in +param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 param_hash 686af5e712ee2902180f5428af94c6e7 data_name ./output_10519905/data_aF_V0 @@ -464,9 +465,10 @@ date 2022-01-19 11:04:07 +0100 host r04n07.palma.wwu dir /scratch/tmp/j_kuhl19 user j_kuhl19 -gauge_name /unity +gauge_name /data_a_r0_n3 gauge_md5 1ea28326e4090996111a320b8372811d param_name sfcf_unity_test.in +param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 param_hash 686af5e712ee2902180f5428af94c6e7 data_name ./output_10519905/data_aF_V0 @@ -693,9 +695,10 @@ date 2022-01-19 11:04:09 +0100 host r04n07.palma.wwu dir /scratch/tmp/j_kuhl19 user j_kuhl19 -gauge_name /unity +gauge_name /data_a_r0_n4 gauge_md5 1ea28326e4090996111a320b8372811d param_name sfcf_unity_test.in +param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 param_hash 686af5e712ee2902180f5428af94c6e7 data_name ./output_10519905/data_aF_V0 @@ -922,9 +925,10 @@ date 2022-01-19 11:04:11 +0100 host r04n07.palma.wwu dir /scratch/tmp/j_kuhl19 user j_kuhl19 -gauge_name /unity +gauge_name /data_a_r0_n5 gauge_md5 1ea28326e4090996111a320b8372811d param_name sfcf_unity_test.in +param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 param_hash 686af5e712ee2902180f5428af94c6e7 data_name ./output_10519905/data_aF_V0 diff --git a/tests/data/sfcf_test/data_a/data_a.f_1 b/tests/data/sfcf_test/data_a/data_a_r0.f_1 similarity index 97% rename from tests/data/sfcf_test/data_a/data_a.f_1 rename to tests/data/sfcf_test/data_a/data_a_r0.f_1 index e40e70b4..5b905ac5 100644 --- a/tests/data/sfcf_test/data_a/data_a.f_1 +++ b/tests/data/sfcf_test/data_a/data_a_r0.f_1 @@ -5,7 +5,7 @@ date 2022-01-19 11:04:03 +0100 host r04n07.palma.wwu dir /scratch/tmp/j_kuhl19 user j_kuhl19 -gauge_name /unity +gauge_name /data_a_r0_n1 gauge_md5 1ea28326e4090996111a320b8372811d param_name sfcf_unity_test.in param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 @@ -199,9 +199,10 @@ date 2022-01-19 11:04:05 +0100 host r04n07.palma.wwu dir /scratch/tmp/j_kuhl19 user j_kuhl19 -gauge_name /unity +gauge_name /data_a_r0_n2 gauge_md5 1ea28326e4090996111a320b8372811d param_name sfcf_unity_test.in +param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 param_hash 686af5e712ee2902180f5428af94c6e7 data_name ./output_10519905/data_af_1 @@ -392,9 +393,10 @@ date 2022-01-19 11:04:07 +0100 host r04n07.palma.wwu dir /scratch/tmp/j_kuhl19 user j_kuhl19 -gauge_name /unity +gauge_name /data_a_r0_n3 gauge_md5 1ea28326e4090996111a320b8372811d param_name sfcf_unity_test.in +param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 param_hash 686af5e712ee2902180f5428af94c6e7 data_name ./output_10519905/data_af_1 @@ -585,9 +587,10 @@ date 2022-01-19 11:04:09 +0100 host r04n07.palma.wwu dir /scratch/tmp/j_kuhl19 user j_kuhl19 -gauge_name /unity +gauge_name /data_a_r0_n4 gauge_md5 1ea28326e4090996111a320b8372811d param_name sfcf_unity_test.in +param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 param_hash 686af5e712ee2902180f5428af94c6e7 data_name ./output_10519905/data_af_1 @@ -778,9 +781,10 @@ date 2022-01-19 11:04:11 +0100 host r04n07.palma.wwu dir /scratch/tmp/j_kuhl19 user j_kuhl19 -gauge_name /unity +gauge_name /data_a_r0_n5 gauge_md5 1ea28326e4090996111a320b8372811d param_name sfcf_unity_test.in +param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 param_hash 686af5e712ee2902180f5428af94c6e7 data_name ./output_10519905/data_af_1 diff --git a/tests/data/sfcf_test/data_a/data_a.f_A b/tests/data/sfcf_test/data_a/data_a_r0.f_A similarity index 96% rename from tests/data/sfcf_test/data_a/data_a.f_A rename to tests/data/sfcf_test/data_a/data_a_r0.f_A index a37c0f92..58a7ca67 100644 --- a/tests/data/sfcf_test/data_a/data_a.f_A +++ b/tests/data/sfcf_test/data_a/data_a_r0.f_A @@ -5,7 +5,7 @@ date 2022-01-19 11:04:03 +0100 host r04n07.palma.wwu dir /scratch/tmp/j_kuhl19 user j_kuhl19 -gauge_name /unity +gauge_name /data_a_r0_n1 gauge_md5 1ea28326e4090996111a320b8372811d param_name sfcf_unity_test.in param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 @@ -85,9 +85,10 @@ date 2022-01-19 11:04:05 +0100 host r04n07.palma.wwu dir /scratch/tmp/j_kuhl19 user j_kuhl19 -gauge_name /unity +gauge_name /data_a_r0_n2 gauge_md5 1ea28326e4090996111a320b8372811d param_name sfcf_unity_test.in +param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 param_hash 686af5e712ee2902180f5428af94c6e7 data_name ./output_10519905/data_af_A @@ -164,9 +165,10 @@ date 2022-01-19 11:04:07 +0100 host r04n07.palma.wwu dir /scratch/tmp/j_kuhl19 user j_kuhl19 -gauge_name /unity +gauge_name /data_a_r0_n3 gauge_md5 1ea28326e4090996111a320b8372811d param_name sfcf_unity_test.in +param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 param_hash 686af5e712ee2902180f5428af94c6e7 data_name ./output_10519905/data_af_A @@ -243,9 +245,10 @@ date 2022-01-19 11:04:09 +0100 host r04n07.palma.wwu dir /scratch/tmp/j_kuhl19 user j_kuhl19 -gauge_name /unity +gauge_name /data_a_r0_n4 gauge_md5 1ea28326e4090996111a320b8372811d param_name sfcf_unity_test.in +param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 param_hash 686af5e712ee2902180f5428af94c6e7 data_name ./output_10519905/data_af_A @@ -322,9 +325,10 @@ date 2022-01-19 11:04:11 +0100 host r04n07.palma.wwu dir /scratch/tmp/j_kuhl19 user j_kuhl19 -gauge_name /unity +gauge_name /data_a_r0_n5 gauge_md5 1ea28326e4090996111a320b8372811d param_name sfcf_unity_test.in +param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 param_hash 686af5e712ee2902180f5428af94c6e7 data_name ./output_10519905/data_af_A diff --git a/tests/sfcf_in_test.py b/tests/sfcf_in_test.py index 3696f526..859ebd8b 100644 --- a/tests/sfcf_in_test.py +++ b/tests/sfcf_in_test.py @@ -67,12 +67,30 @@ def c_bb_test(): def c_bi_test(): build_test_environment("c",5,3) - f_1 = sfin.read_sfcf("data/sfcf_test/data_c", "data_c", "f_A", quarks="lquark lquark", wf = 0, version = "2.0c") - print(f_1) + f_A = sfin.read_sfcf("data/sfcf_test/data_c", "data_c", "f_A", quarks="lquark lquark", wf = 0, version = "2.0c") + print(f_A) clean_test_environment("c",5,3) def c_bib_test(): build_test_environment("c",5,3) - f_V0 = sfin.read_sfcf("data/sfcf_test/data_c", "data_c", "F_V0",quarks="lquark lquark", wf = 0, wf2 = 0, version = "2.0c", b2b = True) + f_V0 = sfin.read_sfcf("data/sfcf_test/data_a", "data_c", "F_V0",quarks="lquark lquark", wf = 0, wf2 = 0, version = "2.0c", b2b = True) print(f_V0) - clean_test_environment("c",5,3) \ No newline at end of file + clean_test_environment("c",5,3) + +def a_bb_test(): + build_test_environment("a",5,3) + f_1 = sfin.read_sfcf("data/sfcf_test/data_a", "data_a", "f_1", quarks="lquark lquark", wf = 0, wf2=0, version = "2.0a", single = True) + print(f_1) + clean_test_environment("a",5,3) + +def a_bi_test(): + build_test_environment("a",5,3) + f_A = sfin.read_sfcf("data/sfcf_test/data_a", "data_a", "f_A", quarks="lquark lquark", wf = 0, version = "2.0a") + print(f_A) + clean_test_environment("a",5,3) + +def a_bib_test(): + build_test_environment("a",5,3) + f_V0 = sfin.read_sfcf("data/sfcf_test/data_a", "data_a", "F_V0",quarks="lquark lquark", wf = 0, wf2 = 0, version = "2.0a", b2b = True) + print(f_V0) + clean_test_environment("a",5,3) \ No newline at end of file From ecfaa8ed67606c35a4df185b55d776e47a375de2 Mon Sep 17 00:00:00 2001 From: jkuhl-uni Date: Mon, 7 Feb 2022 15:11:55 +0100 Subject: [PATCH 017/136] minor bug fixes, big bug fix in append mode read in --- pyerrors/input/sfcf.py | 108 +++++++++++++++++------------------------ 1 file changed, 45 insertions(+), 63 deletions(-) diff --git a/pyerrors/input/sfcf.py b/pyerrors/input/sfcf.py index d8b88d60..1e8b23a4 100644 --- a/pyerrors/input/sfcf.py +++ b/pyerrors/input/sfcf.py @@ -118,11 +118,11 @@ def read_sfcf(path, prefix, name, quarks='.*', noffset=0, wf=0, wf2=0, for exc in ls: if not fnmatch.fnmatch(exc, prefix + '*'): ls = list(set(ls) - set([exc])) - if len(ls) > 1: - # New version, to cope with ids, etc. - ls.sort(key=lambda x: int(re.findall(r'\d+', x[len(prefix):])[0])) - + if not appended: + if len(ls) > 1: + # New version, to cope with ids, etc. + ls.sort(key=lambda x: int(re.findall(r'\d+', x[len(prefix):])[0])) replica = len(ls) else: replica = len([file.split(".")[-1] for file in ls]) // len(set([file.split(".")[-1] for file in ls])) @@ -213,58 +213,39 @@ def read_sfcf(path, prefix, name, quarks='.*', noffset=0, wf=0, wf2=0, if i == 0: # here, we want to find the place within the file, # where the correlator we need is stored. - if compact: - # to do so, the pattern needed is put together - # from the input values - pattern = 'name ' + name + '\nquarks ' + quarks + '\noffset ' + str(noffset) + '\nwf ' + str(wf) - if b2b: - pattern += '\nwf_2 ' + str(wf2) - # and the file is parsed through to find the pattern - with open(path + '/' + item + '/' + sub_ls[0], 'r') as file: - content = file.read() - match = re.search(pattern, content) - if match: - # the start and end point of the correlator - # in quaetion is extracted for later use in - # the other files - start_read = content.count('\n', 0, match.start()) + 5 + b2b - end_match = re.search(r'\n\s*\n', content[match.start():]) - T = content[match.start():].count('\n', 0, end_match.start()) - 4 - b2b - assert T > 0 - print(T, 'entries, starting to read in line', start_read) - else: - raise Exception('Correlator with pattern\n' + pattern + '\nnot found.') - else: - # this part does the same as above, - # but for non-compactified versions of the files - with open(path + '/' + item + '/' + sub_ls[0] + '/' + name) as fp: - for k, line in enumerate(fp): - if version == "0.0": - # check if this is really the right file - # by matching pattern similar to above - pattern = "# " + name + " : offset " + str(noffset) + ", wf " + str(wf) - # if b2b, a second wf is needed - if b2b: - pattern += ", wf_2 " + str(wf2) - qs = quarks.split(" ") - pattern += " : " + qs[0] + " - " + qs[1] - # print(pattern) + # to do so, the pattern needed is put together + # from the input values + if version == "0.0": + for k, line in enumerate(file): if read == 1 and not line.strip() and k > start + 1: break if read == 1 and k >= start: T += 1 + if pattern in line: + read = 1 + start = k + 1 + print(str(T) + " entries found.") + else: + pattern = 'name ' + name + '\nquarks ' + quarks + '\noffset ' + str(noffset) + '\nwf ' + str(wf) + if b2b: + pattern += '\nwf_2 ' + str(wf2) + # and the file is parsed through to find the pattern + if compact: + file = open(path + '/' + item + '/' + sub_ls[0], "r") + else: + # for non-compactified versions of the files + file = open(path + '/' + item + '/' + sub_ls[0] + '/' + name, "r") - if version == "0.0": - if pattern in line: - # print(line) - read = 1 - start = k + 1 - else: - if '[correlator]' in line: - read = 1 - start = k + 7 + b2b - T -= b2b - print(str(T) + " entries found.") + content = file.read() + match = re.search(pattern, content) + if match: + start_read = content.count('\n', 0, match.start()) + 5 + b2b + end_match = re.search(r'\n\s*\n', content[match.start():]) + T = content[match.start():].count('\n', 0, end_match.start()) - 4 - b2b + assert T > 0 + print(T, 'entries, starting to read in line', start_read) + else: + raise Exception('Correlator with pattern\n' + pattern + '\nnot found.') # we found where the correlator # that is to be read is in the files # after preparing the datastructure @@ -292,8 +273,7 @@ def read_sfcf(path, prefix, name, quarks='.*', noffset=0, wf=0, wf2=0, for k in range(start_read - 6, start_read + T): if k == start_read - 5 - b2b: if lines[k].strip() != 'name ' + name: - raise Exception('Wrong format', - sub_ls[cfg]) + raise Exception('Wrong format', sub_ls[cfg]) if(k >= start_read and k < start_read + T): floats = list(map(float, lines[k].split())) deltas[k - start_read][i][cfg] = floats[-2:][im] @@ -305,12 +285,12 @@ def read_sfcf(path, prefix, name, quarks='.*', noffset=0, wf=0, wf2=0, # we can iterate over the whole file. # here one can also implement the chekc from above. for k, line in enumerate(fp): - if(k >= start and k < start + T): + if(k >= start_read and k < start_read + T): floats = list(map(float, line.split())) if version == "0.0": - deltas[k - start][i][cnfg] = floats[im] + deltas[k - start][i][cnfg] = floats[im - single] else: - deltas[k - start][i][cnfg] = floats[1 + im - single] + deltas[k - start_read][i][cnfg] = floats[1 + im - single] else: if "files" in kwargs: @@ -320,7 +300,6 @@ def read_sfcf(path, prefix, name, quarks='.*', noffset=0, wf=0, wf2=0, if not fnmatch.fnmatch(exc, prefix + '*.' + name): ls = list(set(ls) - set([exc])) ls.sort(key=lambda x: int(re.findall(r'\d+', x)[-1])) - # print(ls) pattern = 'name ' + name + '\nquarks ' + quarks + '\noffset ' + str(noffset) + '\nwf ' + str(wf) if b2b: pattern += '\nwf_2 ' + str(wf2) @@ -332,8 +311,7 @@ def read_sfcf(path, prefix, name, quarks='.*', noffset=0, wf=0, wf2=0, for linenumber, line in enumerate(content): if "[run]" in line: data_starts.append(linenumber) - if len(set([data_starts[i] - data_starts[i - 1] for i in - range(1, len(data_starts))])) > 1: + if len(set([data_starts[i] - data_starts[i - 1] for i in range(1, len(data_starts))])) > 1: raise Exception("Irregularities in file structure found, not all runs have the same output length") # first chunk of data chunk = content[:data_starts[1]] @@ -343,11 +321,15 @@ def read_sfcf(path, prefix, name, quarks='.*', noffset=0, wf=0, wf2=0, elif line.startswith("[correlator]"): corr_line = linenumber found_pat = "" - for li in chunk[corr_line + 1:corr_line + 6 + b2b]: + for li in chunk[corr_line + 1: corr_line + 6 + b2b]: found_pat += li if re.search(pattern, found_pat): start_read = corr_line + 7 + b2b - T = len(chunk) - 1 - start_read + break + endline = corr_line + 6 + b2b + while not chunk[endline] == "\n": + endline += 1 + T = endline - start_read if rep == 0: deltas = [] for t in range(T): @@ -363,7 +345,7 @@ def read_sfcf(path, prefix, name, quarks='.*', noffset=0, wf=0, wf2=0, try: rep_idl.append(int(chunk[gauge_line].split("n")[-1])) except Exception: - raise Exception("Couldn't parse idl from directroy, problem with chunk around line " + gauge_line) + raise Exception("Couldn't parse idl from directory, problem with chunk around line ", gauge_line) found_pat = "" for li in chunk[corr_line + 1:corr_line + 6 + b2b]: @@ -371,7 +353,7 @@ def read_sfcf(path, prefix, name, quarks='.*', noffset=0, wf=0, wf2=0, if re.search(pattern, found_pat): for t, line in enumerate(chunk[start_read:start_read + T]): floats = list(map(float, line.split())) - deltas[t][rep][cnfg] = floats[-2:][im] + deltas[t][rep][cnfg] = floats[im + 1 - single] idl.append(rep_idl) if "check_configs" in kwargs: From a97d0c31a65b677d1f08678fea74f9ae4d38721f Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Mon, 7 Feb 2022 14:36:22 +0000 Subject: [PATCH 018/136] refactor: removed comment on rescaling of texp on case of irregular idl which is no longer used in the code. --- pyerrors/obs.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/pyerrors/obs.py b/pyerrors/obs.py index f395d7db..5fe3d900 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -288,8 +288,6 @@ class Obs: _compute_drho(1) if self.tau_exp[e_name] > 0: texp = self.tau_exp[e_name] - # if type(self.idl[e_name]) is range: # scale tau_exp according to step size - # texp /= self.idl[e_name].step # Critical slowing down analysis if w_max // 2 <= 1: raise Exception("Need at least 8 samples for tau_exp error analysis") From 6971e8cd9be06635e3af8724762325be0bdb798f Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Mon, 7 Feb 2022 14:51:25 +0000 Subject: [PATCH 019/136] refactor: unnecessary keywords for call to numdifftools removed, test against numerical differentiation made stricter. --- pyerrors/obs.py | 9 +-------- tests/obs_test.py | 2 +- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/pyerrors/obs.py b/pyerrors/obs.py index 5fe3d900..72a4156e 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -1123,14 +1123,7 @@ def derived_observable(func, data, array_mode=False, **kwargs): raise Exception('Multi mode currently not supported for numerical derivative') options = { 'base_step': 0.1, - 'step_ratio': 2.5, - 'num_steps': None, - 'step_nom': None, - 'offset': None, - 'num_extrap': None, - 'use_exact_steps': None, - 'check_num_steps': None, - 'scale': None} + 'step_ratio': 2.5} for key in options.keys(): kwarg = kwargs.get(key) if kwarg is not None: diff --git a/tests/obs_test.py b/tests/obs_test.py index cf09e0aa..3460c4a8 100644 --- a/tests/obs_test.py +++ b/tests/obs_test.py @@ -304,7 +304,7 @@ def test_derived_observables(): d_Obs_fd = pe.derived_observable(lambda x, **kwargs: x[0] * x[1] * np.sin(x[0] * x[1]), [test_obs, test_obs], num_grad=True) d_Obs_fd.gamma_method() - assert d_Obs_ad.value == d_Obs_fd.value + assert d_Obs_ad == d_Obs_fd assert np.abs(4.0 * np.sin(4.0) - d_Obs_ad.value) < 1000 * np.finfo(np.float64).eps * np.abs(d_Obs_ad.value) assert np.abs(d_Obs_ad.dvalue-d_Obs_fd.dvalue) < 1000 * np.finfo(np.float64).eps * d_Obs_ad.dvalue From 5062f030c41b0ace0afa97eec638d25773266deb Mon Sep 17 00:00:00 2001 From: jkuhl-uni Date: Mon, 7 Feb 2022 15:54:57 +0100 Subject: [PATCH 020/136] made read in tests functioning --- tests/sfcf_in_test.py | 52 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/tests/sfcf_in_test.py b/tests/sfcf_in_test.py index 859ebd8b..3f993cd6 100644 --- a/tests/sfcf_in_test.py +++ b/tests/sfcf_in_test.py @@ -41,56 +41,86 @@ def clean_test_environment(type, cfgs, reps): os.remove("data/sfcf_test/data_c/data_c_r0/data_c_r0_n"+str(i)) -def o_bb_test(): +def test_o_bb(): build_test_environment("o",5,3) f_1 = sfin.read_sfcf("data/sfcf_test/data_o", "test", "f_1",quarks="lquark lquark", wf = 0, wf2=0, version = "2.0", single = True) print(f_1) clean_test_environment("o",5,3) + assert len(f_1) == 1 + assert f_1[0].value == 351.1941525454502 -def o_bi_test(): +def test_o_bi(): build_test_environment("o",5,3) f_A = sfin.read_sfcf("data/sfcf_test/data_o", "test", "f_A",quarks="lquark lquark", wf = 0, version = "2.0") print(f_A) clean_test_environment("o",5,3) + assert len(f_A) == 3 + assert f_A[0].value == 65.4711887279723 + assert f_A[1].value == 1.0447210336915187 + assert f_A[2].value == -41.025094911185185 -def o_bib_test(): +def test_o_bib(): build_test_environment("o",5,3) f_V0 = sfin.read_sfcf("data/sfcf_test/data_o", "test", "F_V0",quarks="lquark lquark", wf = 0, wf2 = 0, version = "2.0", b2b = True) print(f_V0) clean_test_environment("o",5,3) + assert len(f_V0) == 3 + assert f_V0[0] == 683.6776090085115 + assert f_V0[1] == 661.3188585582334 + assert f_V0[2] == 683.6776090081005 -def c_bb_test(): +def test_c_bb(): build_test_environment("c",5,3) f_1 = sfin.read_sfcf("data/sfcf_test/data_c", "data_c", "f_1", quarks="lquark lquark", wf = 0, wf2=0, version = "2.0c", single = True) print(f_1) clean_test_environment("c",5,3) + assert len(f_1) == 1 + assert f_1[0].value == 351.1941525454502 -def c_bi_test(): +def test_c_bi(): build_test_environment("c",5,3) f_A = sfin.read_sfcf("data/sfcf_test/data_c", "data_c", "f_A", quarks="lquark lquark", wf = 0, version = "2.0c") print(f_A) clean_test_environment("c",5,3) + assert len(f_A) == 3 + assert f_A[0].value == 65.4711887279723 + assert f_A[1].value == 1.0447210336915187 + assert f_A[2].value == -41.025094911185185 -def c_bib_test(): +def test_c_bib(): build_test_environment("c",5,3) - f_V0 = sfin.read_sfcf("data/sfcf_test/data_a", "data_c", "F_V0",quarks="lquark lquark", wf = 0, wf2 = 0, version = "2.0c", b2b = True) + f_V0 = sfin.read_sfcf("data/sfcf_test/data_c", "data_c", "F_V0",quarks="lquark lquark", wf = 0, wf2 = 0, version = "2.0c", b2b = True) print(f_V0) clean_test_environment("c",5,3) + assert len(f_V0) == 3 + assert f_V0[0] == 683.6776090085115 + assert f_V0[1] == 661.3188585582334 + assert f_V0[2] == 683.6776090081005 -def a_bb_test(): +def test_a_bb(): build_test_environment("a",5,3) f_1 = sfin.read_sfcf("data/sfcf_test/data_a", "data_a", "f_1", quarks="lquark lquark", wf = 0, wf2=0, version = "2.0a", single = True) print(f_1) clean_test_environment("a",5,3) + assert len(f_1) == 1 + assert f_1[0].value == 351.1941525454502 -def a_bi_test(): +def test_a_bi(): build_test_environment("a",5,3) f_A = sfin.read_sfcf("data/sfcf_test/data_a", "data_a", "f_A", quarks="lquark lquark", wf = 0, version = "2.0a") print(f_A) clean_test_environment("a",5,3) + assert len(f_A) == 3 + assert f_A[0].value == 65.4711887279723 + assert f_A[1].value == 1.0447210336915187 + assert f_A[2].value == -41.02509491118518 -def a_bib_test(): +def test_a_bib(): build_test_environment("a",5,3) f_V0 = sfin.read_sfcf("data/sfcf_test/data_a", "data_a", "F_V0",quarks="lquark lquark", wf = 0, wf2 = 0, version = "2.0a", b2b = True) print(f_V0) - clean_test_environment("a",5,3) \ No newline at end of file + clean_test_environment("a",5,3) + assert len(f_V0) == 3 + assert f_V0[0] == 683.6776090085115 + assert f_V0[1] == 661.3188585582334 + assert f_V0[2] == 683.6776090081005 \ No newline at end of file From a6126c84a894baa2f656e1ace990a183b759b97e Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Mon, 7 Feb 2022 14:56:15 +0000 Subject: [PATCH 021/136] tests: test on iamone made more strict --- tests/obs_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/obs_test.py b/tests/obs_test.py index 3460c4a8..4944630f 100644 --- a/tests/obs_test.py +++ b/tests/obs_test.py @@ -311,7 +311,7 @@ def test_derived_observables(): i_am_one = pe.derived_observable(lambda x, **kwargs: x[0] / x[1], [d_Obs_ad, d_Obs_ad]) i_am_one.gamma_method() - assert i_am_one.value == 1.0 + assert i_am_one == 1.0 assert i_am_one.dvalue < 2 * np.finfo(np.float64).eps assert i_am_one.e_dvalue['t'] <= 2 * np.finfo(np.float64).eps assert i_am_one.e_ddvalue['t'] <= 2 * np.finfo(np.float64).eps From a33d6897f0a8ace2520386aeb65a78e8870a20be Mon Sep 17 00:00:00 2001 From: jkuhl-uni Date: Mon, 7 Feb 2022 18:29:49 +0100 Subject: [PATCH 022/136] small change in read parameters, made tests available for auto-testing --- pyerrors/input/sfcf.py | 36 +++++++++++++------------------ tests/sfcf_in_test.py | 49 +++++++++++++++++++++--------------------- 2 files changed, 39 insertions(+), 46 deletions(-) diff --git a/pyerrors/input/sfcf.py b/pyerrors/input/sfcf.py index 1e8b23a4..0ded45b1 100644 --- a/pyerrors/input/sfcf.py +++ b/pyerrors/input/sfcf.py @@ -9,8 +9,7 @@ from ..obs import Obs from . import utils -def read_sfcf(path, prefix, name, quarks='.*', noffset=0, wf=0, wf2=0, - version="1.0c", **kwargs): +def read_sfcf(path, prefix, name, quarks='.*', corr_type = 'bi', noffset=0, wf=0, wf2=0, version="1.0c", **kwargs): """Read sfcf c format from given folder structure. Parameters @@ -30,13 +29,10 @@ def read_sfcf(path, prefix, name, quarks='.*', noffset=0, wf=0, wf2=0, im: bool if True, read imaginary instead of real part of the correlation function. - b2b: bool - if True, read a time-dependent boundary-to-boundary - correlation function - single: bool - if True, read time independent boundary to boundary - correlation function - names: list + corr_type : str + change between bi (boundary - inner) (default) bib (boundary - inner - boundary) and bb (boundary - boundary) + correlator types + names : list Alternative labeling for replicas/ensembles. Has to have the appropriate length ens_name : str @@ -55,8 +51,6 @@ def read_sfcf(path, prefix, name, quarks='.*', noffset=0, wf=0, wf2=0, check_configs: list of list of supposed configs, eg. [range(1,1000)] for one replicum with 1000 configs - TODO: - - whats going on with files here? """ if kwargs.get('im'): im = 1 @@ -64,19 +58,19 @@ def read_sfcf(path, prefix, name, quarks='.*', noffset=0, wf=0, wf2=0, else: im = 0 part = 'real' - - if kwargs.get('single'): - b2b = 1 - single = 1 - else: - if kwargs.get('b2b'): - b2b = 1 - else: - b2b = 0 - single = 0 + if "replica" in kwargs: reps = kwargs.get("replica") + if corr_type == 'bb': + b2b = True + single = True + elif corr_type == 'bib': + b2b = True + single = False + else: + b2b = False + single = False # due to higher usage in current projects, # compact file format is default compact = True diff --git a/tests/sfcf_in_test.py b/tests/sfcf_in_test.py index 3f993cd6..d4b31f1e 100644 --- a/tests/sfcf_in_test.py +++ b/tests/sfcf_in_test.py @@ -7,43 +7,42 @@ import pyerrors as pe import pyerrors.input.openQCD as qcdin import pyerrors.input.sfcf as sfin import shutil -import pytest from time import sleep -def build_test_environment(type, cfgs, reps): - if type == "o": +def build_test_environment(env_type, cfgs, reps): + if env_type == "o": for i in range(2,cfgs+1): - shutil.copytree("data/sfcf_test/data_o/test_r0/cfg1","data/sfcf_test/data_o/test_r0/cfg"+str(i)) + shutil.copytree("tests/data/sfcf_test/data_o/test_r0/cfg1","tests/data/sfcf_test/data_o/test_r0/cfg"+str(i)) for i in range(1,reps): - shutil.copytree("data/sfcf_test/data_o/test_r0", "data/sfcf_test/data_o/test_r"+str(i)) - elif type == "c": + shutil.copytree("tests/data/sfcf_test/data_o/test_r0", "tests/data/sfcf_test/data_o/test_r"+str(i)) + elif env_type == "c": for i in range(2,cfgs+1): - shutil.copy("data/sfcf_test/data_c/data_c_r0/data_c_r0_n1","data/sfcf_test/data_c/data_c_r0/data_c_r0_n"+str(i)) + shutil.copy("tests/data/sfcf_test/data_c/data_c_r0/data_c_r0_n1","tests/data/sfcf_test/data_c/data_c_r0/data_c_r0_n"+str(i)) for i in range(1,reps): - os.mkdir("data/sfcf_test/data_c/data_c_r"+str(i)) + os.mkdir("tests/data/sfcf_test/data_c/data_c_r"+str(i)) for j in range(1,cfgs+1): - shutil.copy("data/sfcf_test/data_c/data_c_r0/data_c_r0_n1","data/sfcf_test/data_c/data_c_r"+str(i)+"/data_c_r"+str(i)+"_n"+str(j)) + shutil.copy("tests/data/sfcf_test/data_c/data_c_r0/data_c_r0_n1","tests/data/sfcf_test/data_c/data_c_r"+str(i)+"/data_c_r"+str(i)+"_n"+str(j)) -def clean_test_environment(type, cfgs, reps): - if type == "o": +def clean_test_environment(env_type, cfgs, reps): + if env_type == "o": for i in range(1,reps): - shutil.rmtree("data/sfcf_test/data_o/test_r"+str(i)) + shutil.rmtree("tests/data/sfcf_test/data_o/test_r"+str(i)) for i in range(2,cfgs+1): - shutil.rmtree("data/sfcf_test/data_o/test_r0/cfg"+str(i)) - elif type == "c": + shutil.rmtree("tests/data/sfcf_test/data_o/test_r0/cfg"+str(i)) + elif env_type == "c": for i in range(1,reps): - shutil.rmtree("data/sfcf_test/data_c/data_c_r"+str(i)) + shutil.rmtree("tests/data/sfcf_test/data_c/data_c_r"+str(i)) for i in range(2,cfgs+1): - os.remove("data/sfcf_test/data_c/data_c_r0/data_c_r0_n"+str(i)) + os.remove("tests/data/sfcf_test/data_c/data_c_r0/data_c_r0_n"+str(i)) def test_o_bb(): build_test_environment("o",5,3) - f_1 = sfin.read_sfcf("data/sfcf_test/data_o", "test", "f_1",quarks="lquark lquark", wf = 0, wf2=0, version = "2.0", single = True) + f_1 = sfin.read_sfcf("tests/data/sfcf_test/data_o", "test", "f_1",quarks="lquark lquark", wf = 0, wf2=0, version = "2.0", single = True) print(f_1) clean_test_environment("o",5,3) assert len(f_1) == 1 @@ -51,7 +50,7 @@ def test_o_bb(): def test_o_bi(): build_test_environment("o",5,3) - f_A = sfin.read_sfcf("data/sfcf_test/data_o", "test", "f_A",quarks="lquark lquark", wf = 0, version = "2.0") + f_A = sfin.read_sfcf("tests/data/sfcf_test/data_o", "test", "f_A",quarks="lquark lquark", wf = 0, version = "2.0") print(f_A) clean_test_environment("o",5,3) assert len(f_A) == 3 @@ -61,7 +60,7 @@ def test_o_bi(): def test_o_bib(): build_test_environment("o",5,3) - f_V0 = sfin.read_sfcf("data/sfcf_test/data_o", "test", "F_V0",quarks="lquark lquark", wf = 0, wf2 = 0, version = "2.0", b2b = True) + f_V0 = sfin.read_sfcf("tests/data/sfcf_test/data_o", "test", "F_V0",quarks="lquark lquark", wf = 0, wf2 = 0, version = "2.0", b2b = True) print(f_V0) clean_test_environment("o",5,3) assert len(f_V0) == 3 @@ -71,7 +70,7 @@ def test_o_bib(): def test_c_bb(): build_test_environment("c",5,3) - f_1 = sfin.read_sfcf("data/sfcf_test/data_c", "data_c", "f_1", quarks="lquark lquark", wf = 0, wf2=0, version = "2.0c", single = True) + f_1 = sfin.read_sfcf("tests/data/sfcf_test/data_c", "data_c", "f_1", quarks="lquark lquark", wf = 0, wf2=0, version = "2.0c", single = True) print(f_1) clean_test_environment("c",5,3) assert len(f_1) == 1 @@ -79,7 +78,7 @@ def test_c_bb(): def test_c_bi(): build_test_environment("c",5,3) - f_A = sfin.read_sfcf("data/sfcf_test/data_c", "data_c", "f_A", quarks="lquark lquark", wf = 0, version = "2.0c") + f_A = sfin.read_sfcf("tests/data/sfcf_test/data_c", "data_c", "f_A", quarks="lquark lquark", wf = 0, version = "2.0c") print(f_A) clean_test_environment("c",5,3) assert len(f_A) == 3 @@ -89,7 +88,7 @@ def test_c_bi(): def test_c_bib(): build_test_environment("c",5,3) - f_V0 = sfin.read_sfcf("data/sfcf_test/data_c", "data_c", "F_V0",quarks="lquark lquark", wf = 0, wf2 = 0, version = "2.0c", b2b = True) + f_V0 = sfin.read_sfcf("tests/data/sfcf_test/data_c", "data_c", "F_V0",quarks="lquark lquark", wf = 0, wf2 = 0, version = "2.0c", b2b = True) print(f_V0) clean_test_environment("c",5,3) assert len(f_V0) == 3 @@ -99,7 +98,7 @@ def test_c_bib(): def test_a_bb(): build_test_environment("a",5,3) - f_1 = sfin.read_sfcf("data/sfcf_test/data_a", "data_a", "f_1", quarks="lquark lquark", wf = 0, wf2=0, version = "2.0a", single = True) + f_1 = sfin.read_sfcf("tests/data/sfcf_test/data_a", "data_a", "f_1", quarks="lquark lquark", wf = 0, wf2=0, version = "2.0a", single = True) print(f_1) clean_test_environment("a",5,3) assert len(f_1) == 1 @@ -107,7 +106,7 @@ def test_a_bb(): def test_a_bi(): build_test_environment("a",5,3) - f_A = sfin.read_sfcf("data/sfcf_test/data_a", "data_a", "f_A", quarks="lquark lquark", wf = 0, version = "2.0a") + f_A = sfin.read_sfcf("tests/data/sfcf_test/data_a", "data_a", "f_A", quarks="lquark lquark", wf = 0, version = "2.0a") print(f_A) clean_test_environment("a",5,3) assert len(f_A) == 3 @@ -117,7 +116,7 @@ def test_a_bi(): def test_a_bib(): build_test_environment("a",5,3) - f_V0 = sfin.read_sfcf("data/sfcf_test/data_a", "data_a", "F_V0",quarks="lquark lquark", wf = 0, wf2 = 0, version = "2.0a", b2b = True) + f_V0 = sfin.read_sfcf("tests/data/sfcf_test/data_a", "data_a", "F_V0",quarks="lquark lquark", wf = 0, wf2 = 0, version = "2.0a", b2b = True) print(f_V0) clean_test_environment("a",5,3) assert len(f_V0) == 3 From 4ae5188f91a2550d5b6c5a84b79738b0865f244e Mon Sep 17 00:00:00 2001 From: jkuhl-uni Date: Tue, 8 Feb 2022 10:37:00 +0100 Subject: [PATCH 023/136] change parameters of sfcf read method --- pyerrors/input/sfcf.py | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/pyerrors/input/sfcf.py b/pyerrors/input/sfcf.py index 0ded45b1..bd5c95e1 100644 --- a/pyerrors/input/sfcf.py +++ b/pyerrors/input/sfcf.py @@ -9,7 +9,7 @@ from ..obs import Obs from . import utils -def read_sfcf(path, prefix, name, quarks='.*', corr_type = 'bi', noffset=0, wf=0, wf2=0, version="1.0c", **kwargs): +def read_sfcf(path, prefix, name, quarks='.*', corr_type='bi', noffset=0, wf=0, wf2=0, version="1.0c", **kwargs): """Read sfcf c format from given folder structure. Parameters @@ -58,10 +58,8 @@ def read_sfcf(path, prefix, name, quarks='.*', corr_type = 'bi', noffset=0, wf=0 else: im = 0 part = 'real' - if "replica" in kwargs: reps = kwargs.get("replica") - if corr_type == 'bb': b2b = True single = True @@ -112,7 +110,7 @@ def read_sfcf(path, prefix, name, quarks='.*', corr_type = 'bi', noffset=0, wf=0 for exc in ls: if not fnmatch.fnmatch(exc, prefix + '*'): ls = list(set(ls) - set([exc])) - + if not appended: if len(ls) > 1: # New version, to cope with ids, etc. @@ -210,20 +208,27 @@ def read_sfcf(path, prefix, name, quarks='.*', corr_type = 'bi', noffset=0, wf=0 # to do so, the pattern needed is put together # from the input values if version == "0.0": + pattern = "# " + name + " : offset " + str(noffset) + ", wf " + str(wf) + # if b2b, a second wf is needed + if b2b: + pattern += ", wf_2 " + str(wf2) + qs = quarks.split(" ") + pattern += " : " + qs[0] + " - " + qs[1] + file = open(path + '/' + item + '/' + sub_ls[0] + '/' + name, "r") for k, line in enumerate(file): - if read == 1 and not line.strip() and k > start + 1: - break - if read == 1 and k >= start: - T += 1 - if pattern in line: - read = 1 - start = k + 1 + if read == 1 and not line.strip() and k > start + 1: + break + if read == 1 and k >= start: + T += 1 + if pattern in line: + read = 1 + start = k + 1 print(str(T) + " entries found.") else: pattern = 'name ' + name + '\nquarks ' + quarks + '\noffset ' + str(noffset) + '\nwf ' + str(wf) if b2b: pattern += '\nwf_2 ' + str(wf2) - # and the file is parsed through to find the pattern + # and the file is parsed through to find the pattern if compact: file = open(path + '/' + item + '/' + sub_ls[0], "r") else: From b6e75230df026b714db1235becf0088d36897097 Mon Sep 17 00:00:00 2001 From: jkuhl-uni Date: Tue, 8 Feb 2022 11:23:13 +0100 Subject: [PATCH 024/136] small flake8 issue resolved --- pyerrors/input/openQCD.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/pyerrors/input/openQCD.py b/pyerrors/input/openQCD.py index 37c42f6d..97208fde 100644 --- a/pyerrors/input/openQCD.py +++ b/pyerrors/input/openQCD.py @@ -210,10 +210,6 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs): warnings.warn('Stepsize between configurations is greater than one!' + str(stepsizes), RuntimeWarning) print(',', nrw, 'reweighting factors with', nsrc, 'sources') - if "idl_offsets" in kwargs: - idl_offsets = kwargs.get("idl_offsets") - else: - idl_offsets = np.ones(nrw, dtype=int) result = [] idl = [range(configlist[rep][r_start_index[rep]], configlist[rep][r_stop_index[rep]], r_step) for rep in range(replica)] for t in range(nrw): @@ -221,8 +217,7 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs): return result -def extract_t0(path, prefix, dtr_read, xmin, - spatial_extent, fit_range=5, **kwargs): +def extract_t0(path, prefix, dtr_read, xmin, spatial_extent, fit_range=5, **kwargs): """Extract t0 from given .ms.dat files. Returns t0 as Obs. It is assumed that all boundary effects have From 10e7171d5bde2a5ae990e611232cb5dbb950a70c Mon Sep 17 00:00:00 2001 From: jkuhl-uni Date: Tue, 8 Feb 2022 11:51:51 +0100 Subject: [PATCH 025/136] changed parameters for input tests --- tests/sfcf_in_test.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/sfcf_in_test.py b/tests/sfcf_in_test.py index d4b31f1e..20a3e924 100644 --- a/tests/sfcf_in_test.py +++ b/tests/sfcf_in_test.py @@ -42,7 +42,7 @@ def clean_test_environment(env_type, cfgs, reps): def test_o_bb(): build_test_environment("o",5,3) - f_1 = sfin.read_sfcf("tests/data/sfcf_test/data_o", "test", "f_1",quarks="lquark lquark", wf = 0, wf2=0, version = "2.0", single = True) + f_1 = sfin.read_sfcf("tests/data/sfcf_test/data_o", "test", "f_1",quarks="lquark lquark", wf = 0, wf2=0, version = "2.0", corr_type="bb") print(f_1) clean_test_environment("o",5,3) assert len(f_1) == 1 @@ -60,7 +60,7 @@ def test_o_bi(): def test_o_bib(): build_test_environment("o",5,3) - f_V0 = sfin.read_sfcf("tests/data/sfcf_test/data_o", "test", "F_V0",quarks="lquark lquark", wf = 0, wf2 = 0, version = "2.0", b2b = True) + f_V0 = sfin.read_sfcf("tests/data/sfcf_test/data_o", "test", "F_V0",quarks="lquark lquark", wf = 0, wf2 = 0, version = "2.0", corr_type="bib") print(f_V0) clean_test_environment("o",5,3) assert len(f_V0) == 3 @@ -70,7 +70,7 @@ def test_o_bib(): def test_c_bb(): build_test_environment("c",5,3) - f_1 = sfin.read_sfcf("tests/data/sfcf_test/data_c", "data_c", "f_1", quarks="lquark lquark", wf = 0, wf2=0, version = "2.0c", single = True) + f_1 = sfin.read_sfcf("tests/data/sfcf_test/data_c", "data_c", "f_1", quarks="lquark lquark", wf = 0, wf2=0, version = "2.0c", corr_type="bb") print(f_1) clean_test_environment("c",5,3) assert len(f_1) == 1 @@ -88,7 +88,7 @@ def test_c_bi(): def test_c_bib(): build_test_environment("c",5,3) - f_V0 = sfin.read_sfcf("tests/data/sfcf_test/data_c", "data_c", "F_V0",quarks="lquark lquark", wf = 0, wf2 = 0, version = "2.0c", b2b = True) + f_V0 = sfin.read_sfcf("tests/data/sfcf_test/data_c", "data_c", "F_V0",quarks="lquark lquark", wf = 0, wf2 = 0, version = "2.0c", corr_type="bib") print(f_V0) clean_test_environment("c",5,3) assert len(f_V0) == 3 @@ -98,7 +98,7 @@ def test_c_bib(): def test_a_bb(): build_test_environment("a",5,3) - f_1 = sfin.read_sfcf("tests/data/sfcf_test/data_a", "data_a", "f_1", quarks="lquark lquark", wf = 0, wf2=0, version = "2.0a", single = True) + f_1 = sfin.read_sfcf("tests/data/sfcf_test/data_a", "data_a", "f_1", quarks="lquark lquark", wf = 0, wf2=0, version = "2.0a", corr_type="bb") print(f_1) clean_test_environment("a",5,3) assert len(f_1) == 1 @@ -116,7 +116,7 @@ def test_a_bi(): def test_a_bib(): build_test_environment("a",5,3) - f_V0 = sfin.read_sfcf("tests/data/sfcf_test/data_a", "data_a", "F_V0",quarks="lquark lquark", wf = 0, wf2 = 0, version = "2.0a", b2b = True) + f_V0 = sfin.read_sfcf("tests/data/sfcf_test/data_a", "data_a", "F_V0",quarks="lquark lquark", wf = 0, wf2 = 0, version = "2.0a", corr_type="bib") print(f_V0) clean_test_environment("a",5,3) assert len(f_V0) == 3 From 3c990b2e1fcf03d3382d8715b399b6d0f2631b9d Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 8 Feb 2022 13:40:24 +0000 Subject: [PATCH 026/136] refactor: Cleaned up duplicate sfcf test data in the wrong folder. --- data/sfcf_test/data_o/test_r0/cfg2/F_V0 | 230 ------------------------ data/sfcf_test/data_o/test_r0/cfg2/f_1 | 194 -------------------- data/sfcf_test/data_o/test_r0/cfg2/f_A | 80 --------- data/sfcf_test/data_o/test_r0/cfg3/F_V0 | 230 ------------------------ data/sfcf_test/data_o/test_r0/cfg3/f_1 | 194 -------------------- data/sfcf_test/data_o/test_r0/cfg3/f_A | 80 --------- data/sfcf_test/data_o/test_r0/cfg4/F_V0 | 230 ------------------------ data/sfcf_test/data_o/test_r0/cfg4/f_1 | 194 -------------------- data/sfcf_test/data_o/test_r0/cfg4/f_A | 80 --------- data/sfcf_test/data_o/test_r0/cfg5/F_V0 | 230 ------------------------ data/sfcf_test/data_o/test_r0/cfg5/f_1 | 194 -------------------- data/sfcf_test/data_o/test_r0/cfg5/f_A | 80 --------- data/sfcf_test/data_o/test_r1/cfg1/F_V0 | 230 ------------------------ data/sfcf_test/data_o/test_r1/cfg1/f_1 | 194 -------------------- data/sfcf_test/data_o/test_r1/cfg1/f_A | 80 --------- data/sfcf_test/data_o/test_r2/cfg1/F_V0 | 230 ------------------------ data/sfcf_test/data_o/test_r2/cfg1/f_1 | 194 -------------------- data/sfcf_test/data_o/test_r2/cfg1/f_A | 80 --------- 18 files changed, 3024 deletions(-) delete mode 100644 data/sfcf_test/data_o/test_r0/cfg2/F_V0 delete mode 100644 data/sfcf_test/data_o/test_r0/cfg2/f_1 delete mode 100644 data/sfcf_test/data_o/test_r0/cfg2/f_A delete mode 100644 data/sfcf_test/data_o/test_r0/cfg3/F_V0 delete mode 100644 data/sfcf_test/data_o/test_r0/cfg3/f_1 delete mode 100644 data/sfcf_test/data_o/test_r0/cfg3/f_A delete mode 100644 data/sfcf_test/data_o/test_r0/cfg4/F_V0 delete mode 100644 data/sfcf_test/data_o/test_r0/cfg4/f_1 delete mode 100644 data/sfcf_test/data_o/test_r0/cfg4/f_A delete mode 100644 data/sfcf_test/data_o/test_r0/cfg5/F_V0 delete mode 100644 data/sfcf_test/data_o/test_r0/cfg5/f_1 delete mode 100644 data/sfcf_test/data_o/test_r0/cfg5/f_A delete mode 100644 data/sfcf_test/data_o/test_r1/cfg1/F_V0 delete mode 100644 data/sfcf_test/data_o/test_r1/cfg1/f_1 delete mode 100644 data/sfcf_test/data_o/test_r1/cfg1/f_A delete mode 100644 data/sfcf_test/data_o/test_r2/cfg1/F_V0 delete mode 100644 data/sfcf_test/data_o/test_r2/cfg1/f_1 delete mode 100644 data/sfcf_test/data_o/test_r2/cfg1/f_A diff --git a/data/sfcf_test/data_o/test_r0/cfg2/F_V0 b/data/sfcf_test/data_o/test_r0/cfg2/F_V0 deleted file mode 100644 index b0e4fb17..00000000 --- a/data/sfcf_test/data_o/test_r0/cfg2/F_V0 +++ /dev/null @@ -1,230 +0,0 @@ -[run] - -version 2.1 -date 2022-01-19 11:04:00 +0100 -host r04n07.palma.wwu -dir /scratch/tmp/j_kuhl19 -user j_kuhl19 -gauge_name /unity -gauge_md5 1ea28326e4090996111a320b8372811d -param_name sfcf_unity_test.in -param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 -param_hash 686af5e712ee2902180f5428af94c6e7 -data_name ./output_10519905/data_oF_V0 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 0 -wf_2 0 -corr_t - 1 +6.8367760900851147e+02 +3.0531839956225539e-10 - 2 +6.6131885855823339e+02 +3.9736225045852382e-12 - 3 +6.8367760900810049e+02 -2.5611665964422843e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 0 -wf_2 1 -corr_t - 1 +6.8370283168793060e+02 +3.0532966356282939e-10 - 2 +6.6134325636407561e+02 +3.9737690976212336e-12 - 3 +6.8370283168751973e+02 -2.5612610847134760e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 0 -wf_2 2 -corr_t - 1 +6.8370484437212463e+02 +3.0533056232915147e-10 - 2 +6.6134520322615822e+02 +3.9737807346122766e-12 - 3 +6.8370484437171353e+02 -2.5612686251836130e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 1 -wf_2 0 -corr_t - 1 +6.8370283168792889e+02 +3.0532890521977295e-10 - 2 +6.6134325636407402e+02 +3.9730355551484655e-12 - 3 +6.8370283168751791e+02 -2.5612686681440218e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 1 -wf_2 1 -corr_t - 1 +6.8372805529787934e+02 +3.0534016954586185e-10 - 2 +6.6136765507001564e+02 +3.9731820664935325e-12 - 3 +6.8372805529746825e+02 -2.5613631608015786e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 1 -wf_2 2 -corr_t - 1 +6.8373006805632656e+02 +3.0534106842445933e-10 - 2 +6.6136960200392332e+02 +3.9731937804440792e-12 - 3 +6.8373006805591558e+02 -2.5613707007587266e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 2 -wf_2 0 -corr_t - 1 +6.8370484437212156e+02 +3.0532220084664646e-10 - 2 +6.6134520322615526e+02 +3.9656927030717790e-12 - 3 +6.8370484437171069e+02 -2.5613522400086377e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 2 -wf_2 1 -corr_t - 1 +6.8373006805632599e+02 +3.0533346499198999e-10 - 2 +6.6136960200392275e+02 +3.9658390079382195e-12 - 3 +6.8373006805591490e+02 -2.5614467350834153e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 2 -wf_2 2 -corr_t - 1 +6.8373208082069789e+02 +3.0533436384459901e-10 - 2 +6.6137154894356127e+02 +3.9658506942251639e-12 - 3 +6.8373208082028680e+02 -2.5614542753491032e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 0 -wf_2 0 -corr_t - 1 +6.8367760900918211e+02 -9.5149222536505804e-10 - 2 +6.6131885855810310e+02 +3.2960434859595585e-10 - 3 +6.8367760900806934e+02 -2.3744430846347533e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 0 -wf_2 1 -corr_t - 1 +6.8370283168860135e+02 -9.5152732859532533e-10 - 2 +6.6134325636394544e+02 +3.2961650841969937e-10 - 3 +6.8370283168748858e+02 -2.3745306857315358e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 0 -wf_2 2 -corr_t - 1 +6.8370484437279526e+02 -9.5153012965274573e-10 - 2 +6.6134520322602793e+02 +3.2961747879154288e-10 - 3 +6.8370484437168250e+02 -2.3745376753897864e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 1 -wf_2 0 -corr_t - 1 +6.8370283168859953e+02 -9.5151770701795658e-10 - 2 +6.6134325636394351e+02 +3.2962581533640458e-10 - 3 +6.8370283168748665e+02 -2.3744344699578737e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 1 -wf_2 1 -corr_t - 1 +6.8372805529855032e+02 -9.5155281099707234e-10 - 2 +6.6136765506988547e+02 +3.2963797613709602e-10 - 3 +6.8372805529743755e+02 -2.3745220688244645e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 1 -wf_2 2 -corr_t - 1 +6.8373006805699742e+02 -9.5155561220425917e-10 - 2 +6.6136960200379315e+02 +3.2963894649982994e-10 - 3 +6.8373006805588454e+02 -2.3745290592048597e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 2 -wf_2 0 -corr_t - 1 +6.8370484437279174e+02 -9.5153224647433932e-10 - 2 +6.6134520322602452e+02 +3.2961543119772646e-10 - 3 +6.8370484437167897e+02 -2.3745588436057620e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 2 -wf_2 1 -corr_t - 1 +6.8373006805699617e+02 -9.5156735103669992e-10 - 2 +6.6136960200379178e+02 +3.2962759157000606e-10 - 3 +6.8373006805588329e+02 -2.3746464475292832e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 2 -wf_2 2 -corr_t - 1 +6.8373208082136819e+02 -9.5157015223999714e-10 - 2 +6.6137154894343041e+02 +3.2962856194733528e-10 - 3 +6.8373208082025531e+02 -2.3746534378088984e-10 - diff --git a/data/sfcf_test/data_o/test_r0/cfg2/f_1 b/data/sfcf_test/data_o/test_r0/cfg2/f_1 deleted file mode 100644 index 09751218..00000000 --- a/data/sfcf_test/data_o/test_r0/cfg2/f_1 +++ /dev/null @@ -1,194 +0,0 @@ -[run] - -version 2.1 -date 2022-01-19 11:04:00 +0100 -host r04n07.palma.wwu -dir /scratch/tmp/j_kuhl19 -user j_kuhl19 -gauge_name /unity -gauge_md5 1ea28326e4090996111a320b8372811d -param_name sfcf_unity_test.in -param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 -param_hash 686af5e712ee2902180f5428af94c6e7 -data_name ./output_10519905/data_of_1 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 0 -wf_2 0 -corr -+3.5119415254545021e+02 +6.7620978057264750e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 0 -wf_2 1 -corr -+3.5120703575855339e+02 +6.5026340956203663e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 0 -wf_2 2 -corr -+3.5120808902177868e+02 +6.5443496235264788e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 1 -wf_2 0 -corr -+3.5120703575855515e+02 +6.9706500417651470e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 1 -wf_2 1 -corr -+3.5122001235609065e+02 +6.9516150897757419e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 1 -wf_2 2 -corr -+3.5122104108046199e+02 +6.9232860455434941e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 2 -wf_2 0 -corr -+3.5120808902177447e+02 +1.0849949614595719e-14 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 2 -wf_2 1 -corr -+3.5122104108046182e+02 +1.0866063643253473e-14 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 2 -wf_2 2 -corr -+3.5122207631098047e+02 +1.0827277318679030e-14 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 0 -wf_2 0 -corr -+3.5119415254545038e+02 +3.0143306723935508e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 0 -wf_2 1 -corr -+3.5120703575855367e+02 +4.3340379505972648e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 0 -wf_2 2 -corr -+3.5120808902177902e+02 +3.9652247575094006e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 1 -wf_2 0 -corr -+3.5120703575855526e+02 -8.2540994138261318e-16 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 1 -wf_2 1 -corr -+3.5122001235609082e+02 -9.7121215247039609e-16 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 1 -wf_2 2 -corr -+3.5122104108046227e+02 -9.0872484903683497e-16 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 2 -wf_2 0 -corr -+3.5120808902177453e+02 +5.1331372776616026e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 2 -wf_2 1 -corr -+3.5122104108046193e+02 +5.0816653044831932e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 2 -wf_2 2 -corr -+3.5122207631098064e+02 +5.1165649253001659e-15 - diff --git a/data/sfcf_test/data_o/test_r0/cfg2/f_A b/data/sfcf_test/data_o/test_r0/cfg2/f_A deleted file mode 100644 index 74be18ea..00000000 --- a/data/sfcf_test/data_o/test_r0/cfg2/f_A +++ /dev/null @@ -1,80 +0,0 @@ -[run] - -version 2.1 -date 2022-01-19 11:04:00 +0100 -host r04n07.palma.wwu -dir /scratch/tmp/j_kuhl19 -user j_kuhl19 -gauge_name /unity -gauge_md5 1ea28326e4090996111a320b8372811d -param_name sfcf_unity_test.in -param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 -param_hash 686af5e712ee2902180f5428af94c6e7 -data_name ./output_10519905/data_of_A - -[correlator] - -name f_A -quarks lquark lquark -offset 0 -wf 0 -corr_t - 1 +6.5471188727972304e+01 -6.1214214711790100e-12 - 2 +1.0447210336915187e+00 +8.9219487930753188e-13 - 3 -4.1025094911185178e+01 -4.8315634170546161e-14 - -[correlator] - -name f_A -quarks lquark lquark -offset 0 -wf 1 -corr_t - 1 +6.5551520722862705e+01 +2.0963356863957609e-13 - 2 +1.0542820240851569e+00 +2.3989756974599379e-15 - 3 -4.1024441815729936e+01 -5.7107484666182308e-15 - -[correlator] - -name f_A -quarks lquark lquark -offset 0 -wf 2 -corr_t - 1 +6.5529951269442847e+01 -6.6512260271334321e-14 - 2 +1.0516822345055969e+00 -2.2935262162529075e-15 - 3 -4.1025142768037746e+01 +3.7566377680004518e-16 - -[correlator] - -name f_A -quarks lquark lquark -offset 1 -wf 0 -corr_t - 1 +6.5471188727965909e+01 -1.6112786177915427e-11 - 2 +1.0447210337411881e+00 -7.0387528705692678e-13 - 3 -4.1025094911167137e+01 +4.6509152745618223e-13 - -[correlator] - -name f_A -quarks lquark lquark -offset 1 -wf 1 -corr_t - 1 +6.5551520722842213e+01 -8.1976426690345305e-13 - 2 +1.0542820240843382e+00 +2.1626370477046812e-13 - 3 -4.1024441815730086e+01 -2.4147931196409923e-14 - -[correlator] - -name f_A -quarks lquark lquark -offset 1 -wf 2 -corr_t - 1 +6.5529951269443117e+01 +7.9192560386479701e-14 - 2 +1.0516822345055870e+00 -1.2443038782429568e-14 - 3 -4.1025142768037739e+01 +5.9315333178954509e-17 - diff --git a/data/sfcf_test/data_o/test_r0/cfg3/F_V0 b/data/sfcf_test/data_o/test_r0/cfg3/F_V0 deleted file mode 100644 index b0e4fb17..00000000 --- a/data/sfcf_test/data_o/test_r0/cfg3/F_V0 +++ /dev/null @@ -1,230 +0,0 @@ -[run] - -version 2.1 -date 2022-01-19 11:04:00 +0100 -host r04n07.palma.wwu -dir /scratch/tmp/j_kuhl19 -user j_kuhl19 -gauge_name /unity -gauge_md5 1ea28326e4090996111a320b8372811d -param_name sfcf_unity_test.in -param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 -param_hash 686af5e712ee2902180f5428af94c6e7 -data_name ./output_10519905/data_oF_V0 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 0 -wf_2 0 -corr_t - 1 +6.8367760900851147e+02 +3.0531839956225539e-10 - 2 +6.6131885855823339e+02 +3.9736225045852382e-12 - 3 +6.8367760900810049e+02 -2.5611665964422843e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 0 -wf_2 1 -corr_t - 1 +6.8370283168793060e+02 +3.0532966356282939e-10 - 2 +6.6134325636407561e+02 +3.9737690976212336e-12 - 3 +6.8370283168751973e+02 -2.5612610847134760e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 0 -wf_2 2 -corr_t - 1 +6.8370484437212463e+02 +3.0533056232915147e-10 - 2 +6.6134520322615822e+02 +3.9737807346122766e-12 - 3 +6.8370484437171353e+02 -2.5612686251836130e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 1 -wf_2 0 -corr_t - 1 +6.8370283168792889e+02 +3.0532890521977295e-10 - 2 +6.6134325636407402e+02 +3.9730355551484655e-12 - 3 +6.8370283168751791e+02 -2.5612686681440218e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 1 -wf_2 1 -corr_t - 1 +6.8372805529787934e+02 +3.0534016954586185e-10 - 2 +6.6136765507001564e+02 +3.9731820664935325e-12 - 3 +6.8372805529746825e+02 -2.5613631608015786e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 1 -wf_2 2 -corr_t - 1 +6.8373006805632656e+02 +3.0534106842445933e-10 - 2 +6.6136960200392332e+02 +3.9731937804440792e-12 - 3 +6.8373006805591558e+02 -2.5613707007587266e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 2 -wf_2 0 -corr_t - 1 +6.8370484437212156e+02 +3.0532220084664646e-10 - 2 +6.6134520322615526e+02 +3.9656927030717790e-12 - 3 +6.8370484437171069e+02 -2.5613522400086377e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 2 -wf_2 1 -corr_t - 1 +6.8373006805632599e+02 +3.0533346499198999e-10 - 2 +6.6136960200392275e+02 +3.9658390079382195e-12 - 3 +6.8373006805591490e+02 -2.5614467350834153e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 2 -wf_2 2 -corr_t - 1 +6.8373208082069789e+02 +3.0533436384459901e-10 - 2 +6.6137154894356127e+02 +3.9658506942251639e-12 - 3 +6.8373208082028680e+02 -2.5614542753491032e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 0 -wf_2 0 -corr_t - 1 +6.8367760900918211e+02 -9.5149222536505804e-10 - 2 +6.6131885855810310e+02 +3.2960434859595585e-10 - 3 +6.8367760900806934e+02 -2.3744430846347533e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 0 -wf_2 1 -corr_t - 1 +6.8370283168860135e+02 -9.5152732859532533e-10 - 2 +6.6134325636394544e+02 +3.2961650841969937e-10 - 3 +6.8370283168748858e+02 -2.3745306857315358e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 0 -wf_2 2 -corr_t - 1 +6.8370484437279526e+02 -9.5153012965274573e-10 - 2 +6.6134520322602793e+02 +3.2961747879154288e-10 - 3 +6.8370484437168250e+02 -2.3745376753897864e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 1 -wf_2 0 -corr_t - 1 +6.8370283168859953e+02 -9.5151770701795658e-10 - 2 +6.6134325636394351e+02 +3.2962581533640458e-10 - 3 +6.8370283168748665e+02 -2.3744344699578737e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 1 -wf_2 1 -corr_t - 1 +6.8372805529855032e+02 -9.5155281099707234e-10 - 2 +6.6136765506988547e+02 +3.2963797613709602e-10 - 3 +6.8372805529743755e+02 -2.3745220688244645e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 1 -wf_2 2 -corr_t - 1 +6.8373006805699742e+02 -9.5155561220425917e-10 - 2 +6.6136960200379315e+02 +3.2963894649982994e-10 - 3 +6.8373006805588454e+02 -2.3745290592048597e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 2 -wf_2 0 -corr_t - 1 +6.8370484437279174e+02 -9.5153224647433932e-10 - 2 +6.6134520322602452e+02 +3.2961543119772646e-10 - 3 +6.8370484437167897e+02 -2.3745588436057620e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 2 -wf_2 1 -corr_t - 1 +6.8373006805699617e+02 -9.5156735103669992e-10 - 2 +6.6136960200379178e+02 +3.2962759157000606e-10 - 3 +6.8373006805588329e+02 -2.3746464475292832e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 2 -wf_2 2 -corr_t - 1 +6.8373208082136819e+02 -9.5157015223999714e-10 - 2 +6.6137154894343041e+02 +3.2962856194733528e-10 - 3 +6.8373208082025531e+02 -2.3746534378088984e-10 - diff --git a/data/sfcf_test/data_o/test_r0/cfg3/f_1 b/data/sfcf_test/data_o/test_r0/cfg3/f_1 deleted file mode 100644 index 09751218..00000000 --- a/data/sfcf_test/data_o/test_r0/cfg3/f_1 +++ /dev/null @@ -1,194 +0,0 @@ -[run] - -version 2.1 -date 2022-01-19 11:04:00 +0100 -host r04n07.palma.wwu -dir /scratch/tmp/j_kuhl19 -user j_kuhl19 -gauge_name /unity -gauge_md5 1ea28326e4090996111a320b8372811d -param_name sfcf_unity_test.in -param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 -param_hash 686af5e712ee2902180f5428af94c6e7 -data_name ./output_10519905/data_of_1 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 0 -wf_2 0 -corr -+3.5119415254545021e+02 +6.7620978057264750e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 0 -wf_2 1 -corr -+3.5120703575855339e+02 +6.5026340956203663e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 0 -wf_2 2 -corr -+3.5120808902177868e+02 +6.5443496235264788e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 1 -wf_2 0 -corr -+3.5120703575855515e+02 +6.9706500417651470e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 1 -wf_2 1 -corr -+3.5122001235609065e+02 +6.9516150897757419e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 1 -wf_2 2 -corr -+3.5122104108046199e+02 +6.9232860455434941e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 2 -wf_2 0 -corr -+3.5120808902177447e+02 +1.0849949614595719e-14 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 2 -wf_2 1 -corr -+3.5122104108046182e+02 +1.0866063643253473e-14 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 2 -wf_2 2 -corr -+3.5122207631098047e+02 +1.0827277318679030e-14 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 0 -wf_2 0 -corr -+3.5119415254545038e+02 +3.0143306723935508e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 0 -wf_2 1 -corr -+3.5120703575855367e+02 +4.3340379505972648e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 0 -wf_2 2 -corr -+3.5120808902177902e+02 +3.9652247575094006e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 1 -wf_2 0 -corr -+3.5120703575855526e+02 -8.2540994138261318e-16 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 1 -wf_2 1 -corr -+3.5122001235609082e+02 -9.7121215247039609e-16 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 1 -wf_2 2 -corr -+3.5122104108046227e+02 -9.0872484903683497e-16 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 2 -wf_2 0 -corr -+3.5120808902177453e+02 +5.1331372776616026e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 2 -wf_2 1 -corr -+3.5122104108046193e+02 +5.0816653044831932e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 2 -wf_2 2 -corr -+3.5122207631098064e+02 +5.1165649253001659e-15 - diff --git a/data/sfcf_test/data_o/test_r0/cfg3/f_A b/data/sfcf_test/data_o/test_r0/cfg3/f_A deleted file mode 100644 index 74be18ea..00000000 --- a/data/sfcf_test/data_o/test_r0/cfg3/f_A +++ /dev/null @@ -1,80 +0,0 @@ -[run] - -version 2.1 -date 2022-01-19 11:04:00 +0100 -host r04n07.palma.wwu -dir /scratch/tmp/j_kuhl19 -user j_kuhl19 -gauge_name /unity -gauge_md5 1ea28326e4090996111a320b8372811d -param_name sfcf_unity_test.in -param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 -param_hash 686af5e712ee2902180f5428af94c6e7 -data_name ./output_10519905/data_of_A - -[correlator] - -name f_A -quarks lquark lquark -offset 0 -wf 0 -corr_t - 1 +6.5471188727972304e+01 -6.1214214711790100e-12 - 2 +1.0447210336915187e+00 +8.9219487930753188e-13 - 3 -4.1025094911185178e+01 -4.8315634170546161e-14 - -[correlator] - -name f_A -quarks lquark lquark -offset 0 -wf 1 -corr_t - 1 +6.5551520722862705e+01 +2.0963356863957609e-13 - 2 +1.0542820240851569e+00 +2.3989756974599379e-15 - 3 -4.1024441815729936e+01 -5.7107484666182308e-15 - -[correlator] - -name f_A -quarks lquark lquark -offset 0 -wf 2 -corr_t - 1 +6.5529951269442847e+01 -6.6512260271334321e-14 - 2 +1.0516822345055969e+00 -2.2935262162529075e-15 - 3 -4.1025142768037746e+01 +3.7566377680004518e-16 - -[correlator] - -name f_A -quarks lquark lquark -offset 1 -wf 0 -corr_t - 1 +6.5471188727965909e+01 -1.6112786177915427e-11 - 2 +1.0447210337411881e+00 -7.0387528705692678e-13 - 3 -4.1025094911167137e+01 +4.6509152745618223e-13 - -[correlator] - -name f_A -quarks lquark lquark -offset 1 -wf 1 -corr_t - 1 +6.5551520722842213e+01 -8.1976426690345305e-13 - 2 +1.0542820240843382e+00 +2.1626370477046812e-13 - 3 -4.1024441815730086e+01 -2.4147931196409923e-14 - -[correlator] - -name f_A -quarks lquark lquark -offset 1 -wf 2 -corr_t - 1 +6.5529951269443117e+01 +7.9192560386479701e-14 - 2 +1.0516822345055870e+00 -1.2443038782429568e-14 - 3 -4.1025142768037739e+01 +5.9315333178954509e-17 - diff --git a/data/sfcf_test/data_o/test_r0/cfg4/F_V0 b/data/sfcf_test/data_o/test_r0/cfg4/F_V0 deleted file mode 100644 index b0e4fb17..00000000 --- a/data/sfcf_test/data_o/test_r0/cfg4/F_V0 +++ /dev/null @@ -1,230 +0,0 @@ -[run] - -version 2.1 -date 2022-01-19 11:04:00 +0100 -host r04n07.palma.wwu -dir /scratch/tmp/j_kuhl19 -user j_kuhl19 -gauge_name /unity -gauge_md5 1ea28326e4090996111a320b8372811d -param_name sfcf_unity_test.in -param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 -param_hash 686af5e712ee2902180f5428af94c6e7 -data_name ./output_10519905/data_oF_V0 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 0 -wf_2 0 -corr_t - 1 +6.8367760900851147e+02 +3.0531839956225539e-10 - 2 +6.6131885855823339e+02 +3.9736225045852382e-12 - 3 +6.8367760900810049e+02 -2.5611665964422843e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 0 -wf_2 1 -corr_t - 1 +6.8370283168793060e+02 +3.0532966356282939e-10 - 2 +6.6134325636407561e+02 +3.9737690976212336e-12 - 3 +6.8370283168751973e+02 -2.5612610847134760e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 0 -wf_2 2 -corr_t - 1 +6.8370484437212463e+02 +3.0533056232915147e-10 - 2 +6.6134520322615822e+02 +3.9737807346122766e-12 - 3 +6.8370484437171353e+02 -2.5612686251836130e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 1 -wf_2 0 -corr_t - 1 +6.8370283168792889e+02 +3.0532890521977295e-10 - 2 +6.6134325636407402e+02 +3.9730355551484655e-12 - 3 +6.8370283168751791e+02 -2.5612686681440218e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 1 -wf_2 1 -corr_t - 1 +6.8372805529787934e+02 +3.0534016954586185e-10 - 2 +6.6136765507001564e+02 +3.9731820664935325e-12 - 3 +6.8372805529746825e+02 -2.5613631608015786e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 1 -wf_2 2 -corr_t - 1 +6.8373006805632656e+02 +3.0534106842445933e-10 - 2 +6.6136960200392332e+02 +3.9731937804440792e-12 - 3 +6.8373006805591558e+02 -2.5613707007587266e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 2 -wf_2 0 -corr_t - 1 +6.8370484437212156e+02 +3.0532220084664646e-10 - 2 +6.6134520322615526e+02 +3.9656927030717790e-12 - 3 +6.8370484437171069e+02 -2.5613522400086377e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 2 -wf_2 1 -corr_t - 1 +6.8373006805632599e+02 +3.0533346499198999e-10 - 2 +6.6136960200392275e+02 +3.9658390079382195e-12 - 3 +6.8373006805591490e+02 -2.5614467350834153e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 2 -wf_2 2 -corr_t - 1 +6.8373208082069789e+02 +3.0533436384459901e-10 - 2 +6.6137154894356127e+02 +3.9658506942251639e-12 - 3 +6.8373208082028680e+02 -2.5614542753491032e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 0 -wf_2 0 -corr_t - 1 +6.8367760900918211e+02 -9.5149222536505804e-10 - 2 +6.6131885855810310e+02 +3.2960434859595585e-10 - 3 +6.8367760900806934e+02 -2.3744430846347533e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 0 -wf_2 1 -corr_t - 1 +6.8370283168860135e+02 -9.5152732859532533e-10 - 2 +6.6134325636394544e+02 +3.2961650841969937e-10 - 3 +6.8370283168748858e+02 -2.3745306857315358e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 0 -wf_2 2 -corr_t - 1 +6.8370484437279526e+02 -9.5153012965274573e-10 - 2 +6.6134520322602793e+02 +3.2961747879154288e-10 - 3 +6.8370484437168250e+02 -2.3745376753897864e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 1 -wf_2 0 -corr_t - 1 +6.8370283168859953e+02 -9.5151770701795658e-10 - 2 +6.6134325636394351e+02 +3.2962581533640458e-10 - 3 +6.8370283168748665e+02 -2.3744344699578737e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 1 -wf_2 1 -corr_t - 1 +6.8372805529855032e+02 -9.5155281099707234e-10 - 2 +6.6136765506988547e+02 +3.2963797613709602e-10 - 3 +6.8372805529743755e+02 -2.3745220688244645e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 1 -wf_2 2 -corr_t - 1 +6.8373006805699742e+02 -9.5155561220425917e-10 - 2 +6.6136960200379315e+02 +3.2963894649982994e-10 - 3 +6.8373006805588454e+02 -2.3745290592048597e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 2 -wf_2 0 -corr_t - 1 +6.8370484437279174e+02 -9.5153224647433932e-10 - 2 +6.6134520322602452e+02 +3.2961543119772646e-10 - 3 +6.8370484437167897e+02 -2.3745588436057620e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 2 -wf_2 1 -corr_t - 1 +6.8373006805699617e+02 -9.5156735103669992e-10 - 2 +6.6136960200379178e+02 +3.2962759157000606e-10 - 3 +6.8373006805588329e+02 -2.3746464475292832e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 2 -wf_2 2 -corr_t - 1 +6.8373208082136819e+02 -9.5157015223999714e-10 - 2 +6.6137154894343041e+02 +3.2962856194733528e-10 - 3 +6.8373208082025531e+02 -2.3746534378088984e-10 - diff --git a/data/sfcf_test/data_o/test_r0/cfg4/f_1 b/data/sfcf_test/data_o/test_r0/cfg4/f_1 deleted file mode 100644 index 09751218..00000000 --- a/data/sfcf_test/data_o/test_r0/cfg4/f_1 +++ /dev/null @@ -1,194 +0,0 @@ -[run] - -version 2.1 -date 2022-01-19 11:04:00 +0100 -host r04n07.palma.wwu -dir /scratch/tmp/j_kuhl19 -user j_kuhl19 -gauge_name /unity -gauge_md5 1ea28326e4090996111a320b8372811d -param_name sfcf_unity_test.in -param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 -param_hash 686af5e712ee2902180f5428af94c6e7 -data_name ./output_10519905/data_of_1 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 0 -wf_2 0 -corr -+3.5119415254545021e+02 +6.7620978057264750e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 0 -wf_2 1 -corr -+3.5120703575855339e+02 +6.5026340956203663e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 0 -wf_2 2 -corr -+3.5120808902177868e+02 +6.5443496235264788e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 1 -wf_2 0 -corr -+3.5120703575855515e+02 +6.9706500417651470e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 1 -wf_2 1 -corr -+3.5122001235609065e+02 +6.9516150897757419e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 1 -wf_2 2 -corr -+3.5122104108046199e+02 +6.9232860455434941e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 2 -wf_2 0 -corr -+3.5120808902177447e+02 +1.0849949614595719e-14 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 2 -wf_2 1 -corr -+3.5122104108046182e+02 +1.0866063643253473e-14 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 2 -wf_2 2 -corr -+3.5122207631098047e+02 +1.0827277318679030e-14 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 0 -wf_2 0 -corr -+3.5119415254545038e+02 +3.0143306723935508e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 0 -wf_2 1 -corr -+3.5120703575855367e+02 +4.3340379505972648e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 0 -wf_2 2 -corr -+3.5120808902177902e+02 +3.9652247575094006e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 1 -wf_2 0 -corr -+3.5120703575855526e+02 -8.2540994138261318e-16 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 1 -wf_2 1 -corr -+3.5122001235609082e+02 -9.7121215247039609e-16 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 1 -wf_2 2 -corr -+3.5122104108046227e+02 -9.0872484903683497e-16 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 2 -wf_2 0 -corr -+3.5120808902177453e+02 +5.1331372776616026e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 2 -wf_2 1 -corr -+3.5122104108046193e+02 +5.0816653044831932e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 2 -wf_2 2 -corr -+3.5122207631098064e+02 +5.1165649253001659e-15 - diff --git a/data/sfcf_test/data_o/test_r0/cfg4/f_A b/data/sfcf_test/data_o/test_r0/cfg4/f_A deleted file mode 100644 index 74be18ea..00000000 --- a/data/sfcf_test/data_o/test_r0/cfg4/f_A +++ /dev/null @@ -1,80 +0,0 @@ -[run] - -version 2.1 -date 2022-01-19 11:04:00 +0100 -host r04n07.palma.wwu -dir /scratch/tmp/j_kuhl19 -user j_kuhl19 -gauge_name /unity -gauge_md5 1ea28326e4090996111a320b8372811d -param_name sfcf_unity_test.in -param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 -param_hash 686af5e712ee2902180f5428af94c6e7 -data_name ./output_10519905/data_of_A - -[correlator] - -name f_A -quarks lquark lquark -offset 0 -wf 0 -corr_t - 1 +6.5471188727972304e+01 -6.1214214711790100e-12 - 2 +1.0447210336915187e+00 +8.9219487930753188e-13 - 3 -4.1025094911185178e+01 -4.8315634170546161e-14 - -[correlator] - -name f_A -quarks lquark lquark -offset 0 -wf 1 -corr_t - 1 +6.5551520722862705e+01 +2.0963356863957609e-13 - 2 +1.0542820240851569e+00 +2.3989756974599379e-15 - 3 -4.1024441815729936e+01 -5.7107484666182308e-15 - -[correlator] - -name f_A -quarks lquark lquark -offset 0 -wf 2 -corr_t - 1 +6.5529951269442847e+01 -6.6512260271334321e-14 - 2 +1.0516822345055969e+00 -2.2935262162529075e-15 - 3 -4.1025142768037746e+01 +3.7566377680004518e-16 - -[correlator] - -name f_A -quarks lquark lquark -offset 1 -wf 0 -corr_t - 1 +6.5471188727965909e+01 -1.6112786177915427e-11 - 2 +1.0447210337411881e+00 -7.0387528705692678e-13 - 3 -4.1025094911167137e+01 +4.6509152745618223e-13 - -[correlator] - -name f_A -quarks lquark lquark -offset 1 -wf 1 -corr_t - 1 +6.5551520722842213e+01 -8.1976426690345305e-13 - 2 +1.0542820240843382e+00 +2.1626370477046812e-13 - 3 -4.1024441815730086e+01 -2.4147931196409923e-14 - -[correlator] - -name f_A -quarks lquark lquark -offset 1 -wf 2 -corr_t - 1 +6.5529951269443117e+01 +7.9192560386479701e-14 - 2 +1.0516822345055870e+00 -1.2443038782429568e-14 - 3 -4.1025142768037739e+01 +5.9315333178954509e-17 - diff --git a/data/sfcf_test/data_o/test_r0/cfg5/F_V0 b/data/sfcf_test/data_o/test_r0/cfg5/F_V0 deleted file mode 100644 index b0e4fb17..00000000 --- a/data/sfcf_test/data_o/test_r0/cfg5/F_V0 +++ /dev/null @@ -1,230 +0,0 @@ -[run] - -version 2.1 -date 2022-01-19 11:04:00 +0100 -host r04n07.palma.wwu -dir /scratch/tmp/j_kuhl19 -user j_kuhl19 -gauge_name /unity -gauge_md5 1ea28326e4090996111a320b8372811d -param_name sfcf_unity_test.in -param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 -param_hash 686af5e712ee2902180f5428af94c6e7 -data_name ./output_10519905/data_oF_V0 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 0 -wf_2 0 -corr_t - 1 +6.8367760900851147e+02 +3.0531839956225539e-10 - 2 +6.6131885855823339e+02 +3.9736225045852382e-12 - 3 +6.8367760900810049e+02 -2.5611665964422843e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 0 -wf_2 1 -corr_t - 1 +6.8370283168793060e+02 +3.0532966356282939e-10 - 2 +6.6134325636407561e+02 +3.9737690976212336e-12 - 3 +6.8370283168751973e+02 -2.5612610847134760e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 0 -wf_2 2 -corr_t - 1 +6.8370484437212463e+02 +3.0533056232915147e-10 - 2 +6.6134520322615822e+02 +3.9737807346122766e-12 - 3 +6.8370484437171353e+02 -2.5612686251836130e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 1 -wf_2 0 -corr_t - 1 +6.8370283168792889e+02 +3.0532890521977295e-10 - 2 +6.6134325636407402e+02 +3.9730355551484655e-12 - 3 +6.8370283168751791e+02 -2.5612686681440218e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 1 -wf_2 1 -corr_t - 1 +6.8372805529787934e+02 +3.0534016954586185e-10 - 2 +6.6136765507001564e+02 +3.9731820664935325e-12 - 3 +6.8372805529746825e+02 -2.5613631608015786e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 1 -wf_2 2 -corr_t - 1 +6.8373006805632656e+02 +3.0534106842445933e-10 - 2 +6.6136960200392332e+02 +3.9731937804440792e-12 - 3 +6.8373006805591558e+02 -2.5613707007587266e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 2 -wf_2 0 -corr_t - 1 +6.8370484437212156e+02 +3.0532220084664646e-10 - 2 +6.6134520322615526e+02 +3.9656927030717790e-12 - 3 +6.8370484437171069e+02 -2.5613522400086377e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 2 -wf_2 1 -corr_t - 1 +6.8373006805632599e+02 +3.0533346499198999e-10 - 2 +6.6136960200392275e+02 +3.9658390079382195e-12 - 3 +6.8373006805591490e+02 -2.5614467350834153e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 2 -wf_2 2 -corr_t - 1 +6.8373208082069789e+02 +3.0533436384459901e-10 - 2 +6.6137154894356127e+02 +3.9658506942251639e-12 - 3 +6.8373208082028680e+02 -2.5614542753491032e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 0 -wf_2 0 -corr_t - 1 +6.8367760900918211e+02 -9.5149222536505804e-10 - 2 +6.6131885855810310e+02 +3.2960434859595585e-10 - 3 +6.8367760900806934e+02 -2.3744430846347533e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 0 -wf_2 1 -corr_t - 1 +6.8370283168860135e+02 -9.5152732859532533e-10 - 2 +6.6134325636394544e+02 +3.2961650841969937e-10 - 3 +6.8370283168748858e+02 -2.3745306857315358e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 0 -wf_2 2 -corr_t - 1 +6.8370484437279526e+02 -9.5153012965274573e-10 - 2 +6.6134520322602793e+02 +3.2961747879154288e-10 - 3 +6.8370484437168250e+02 -2.3745376753897864e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 1 -wf_2 0 -corr_t - 1 +6.8370283168859953e+02 -9.5151770701795658e-10 - 2 +6.6134325636394351e+02 +3.2962581533640458e-10 - 3 +6.8370283168748665e+02 -2.3744344699578737e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 1 -wf_2 1 -corr_t - 1 +6.8372805529855032e+02 -9.5155281099707234e-10 - 2 +6.6136765506988547e+02 +3.2963797613709602e-10 - 3 +6.8372805529743755e+02 -2.3745220688244645e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 1 -wf_2 2 -corr_t - 1 +6.8373006805699742e+02 -9.5155561220425917e-10 - 2 +6.6136960200379315e+02 +3.2963894649982994e-10 - 3 +6.8373006805588454e+02 -2.3745290592048597e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 2 -wf_2 0 -corr_t - 1 +6.8370484437279174e+02 -9.5153224647433932e-10 - 2 +6.6134520322602452e+02 +3.2961543119772646e-10 - 3 +6.8370484437167897e+02 -2.3745588436057620e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 2 -wf_2 1 -corr_t - 1 +6.8373006805699617e+02 -9.5156735103669992e-10 - 2 +6.6136960200379178e+02 +3.2962759157000606e-10 - 3 +6.8373006805588329e+02 -2.3746464475292832e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 2 -wf_2 2 -corr_t - 1 +6.8373208082136819e+02 -9.5157015223999714e-10 - 2 +6.6137154894343041e+02 +3.2962856194733528e-10 - 3 +6.8373208082025531e+02 -2.3746534378088984e-10 - diff --git a/data/sfcf_test/data_o/test_r0/cfg5/f_1 b/data/sfcf_test/data_o/test_r0/cfg5/f_1 deleted file mode 100644 index 09751218..00000000 --- a/data/sfcf_test/data_o/test_r0/cfg5/f_1 +++ /dev/null @@ -1,194 +0,0 @@ -[run] - -version 2.1 -date 2022-01-19 11:04:00 +0100 -host r04n07.palma.wwu -dir /scratch/tmp/j_kuhl19 -user j_kuhl19 -gauge_name /unity -gauge_md5 1ea28326e4090996111a320b8372811d -param_name sfcf_unity_test.in -param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 -param_hash 686af5e712ee2902180f5428af94c6e7 -data_name ./output_10519905/data_of_1 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 0 -wf_2 0 -corr -+3.5119415254545021e+02 +6.7620978057264750e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 0 -wf_2 1 -corr -+3.5120703575855339e+02 +6.5026340956203663e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 0 -wf_2 2 -corr -+3.5120808902177868e+02 +6.5443496235264788e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 1 -wf_2 0 -corr -+3.5120703575855515e+02 +6.9706500417651470e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 1 -wf_2 1 -corr -+3.5122001235609065e+02 +6.9516150897757419e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 1 -wf_2 2 -corr -+3.5122104108046199e+02 +6.9232860455434941e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 2 -wf_2 0 -corr -+3.5120808902177447e+02 +1.0849949614595719e-14 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 2 -wf_2 1 -corr -+3.5122104108046182e+02 +1.0866063643253473e-14 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 2 -wf_2 2 -corr -+3.5122207631098047e+02 +1.0827277318679030e-14 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 0 -wf_2 0 -corr -+3.5119415254545038e+02 +3.0143306723935508e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 0 -wf_2 1 -corr -+3.5120703575855367e+02 +4.3340379505972648e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 0 -wf_2 2 -corr -+3.5120808902177902e+02 +3.9652247575094006e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 1 -wf_2 0 -corr -+3.5120703575855526e+02 -8.2540994138261318e-16 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 1 -wf_2 1 -corr -+3.5122001235609082e+02 -9.7121215247039609e-16 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 1 -wf_2 2 -corr -+3.5122104108046227e+02 -9.0872484903683497e-16 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 2 -wf_2 0 -corr -+3.5120808902177453e+02 +5.1331372776616026e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 2 -wf_2 1 -corr -+3.5122104108046193e+02 +5.0816653044831932e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 2 -wf_2 2 -corr -+3.5122207631098064e+02 +5.1165649253001659e-15 - diff --git a/data/sfcf_test/data_o/test_r0/cfg5/f_A b/data/sfcf_test/data_o/test_r0/cfg5/f_A deleted file mode 100644 index 74be18ea..00000000 --- a/data/sfcf_test/data_o/test_r0/cfg5/f_A +++ /dev/null @@ -1,80 +0,0 @@ -[run] - -version 2.1 -date 2022-01-19 11:04:00 +0100 -host r04n07.palma.wwu -dir /scratch/tmp/j_kuhl19 -user j_kuhl19 -gauge_name /unity -gauge_md5 1ea28326e4090996111a320b8372811d -param_name sfcf_unity_test.in -param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 -param_hash 686af5e712ee2902180f5428af94c6e7 -data_name ./output_10519905/data_of_A - -[correlator] - -name f_A -quarks lquark lquark -offset 0 -wf 0 -corr_t - 1 +6.5471188727972304e+01 -6.1214214711790100e-12 - 2 +1.0447210336915187e+00 +8.9219487930753188e-13 - 3 -4.1025094911185178e+01 -4.8315634170546161e-14 - -[correlator] - -name f_A -quarks lquark lquark -offset 0 -wf 1 -corr_t - 1 +6.5551520722862705e+01 +2.0963356863957609e-13 - 2 +1.0542820240851569e+00 +2.3989756974599379e-15 - 3 -4.1024441815729936e+01 -5.7107484666182308e-15 - -[correlator] - -name f_A -quarks lquark lquark -offset 0 -wf 2 -corr_t - 1 +6.5529951269442847e+01 -6.6512260271334321e-14 - 2 +1.0516822345055969e+00 -2.2935262162529075e-15 - 3 -4.1025142768037746e+01 +3.7566377680004518e-16 - -[correlator] - -name f_A -quarks lquark lquark -offset 1 -wf 0 -corr_t - 1 +6.5471188727965909e+01 -1.6112786177915427e-11 - 2 +1.0447210337411881e+00 -7.0387528705692678e-13 - 3 -4.1025094911167137e+01 +4.6509152745618223e-13 - -[correlator] - -name f_A -quarks lquark lquark -offset 1 -wf 1 -corr_t - 1 +6.5551520722842213e+01 -8.1976426690345305e-13 - 2 +1.0542820240843382e+00 +2.1626370477046812e-13 - 3 -4.1024441815730086e+01 -2.4147931196409923e-14 - -[correlator] - -name f_A -quarks lquark lquark -offset 1 -wf 2 -corr_t - 1 +6.5529951269443117e+01 +7.9192560386479701e-14 - 2 +1.0516822345055870e+00 -1.2443038782429568e-14 - 3 -4.1025142768037739e+01 +5.9315333178954509e-17 - diff --git a/data/sfcf_test/data_o/test_r1/cfg1/F_V0 b/data/sfcf_test/data_o/test_r1/cfg1/F_V0 deleted file mode 100644 index b0e4fb17..00000000 --- a/data/sfcf_test/data_o/test_r1/cfg1/F_V0 +++ /dev/null @@ -1,230 +0,0 @@ -[run] - -version 2.1 -date 2022-01-19 11:04:00 +0100 -host r04n07.palma.wwu -dir /scratch/tmp/j_kuhl19 -user j_kuhl19 -gauge_name /unity -gauge_md5 1ea28326e4090996111a320b8372811d -param_name sfcf_unity_test.in -param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 -param_hash 686af5e712ee2902180f5428af94c6e7 -data_name ./output_10519905/data_oF_V0 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 0 -wf_2 0 -corr_t - 1 +6.8367760900851147e+02 +3.0531839956225539e-10 - 2 +6.6131885855823339e+02 +3.9736225045852382e-12 - 3 +6.8367760900810049e+02 -2.5611665964422843e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 0 -wf_2 1 -corr_t - 1 +6.8370283168793060e+02 +3.0532966356282939e-10 - 2 +6.6134325636407561e+02 +3.9737690976212336e-12 - 3 +6.8370283168751973e+02 -2.5612610847134760e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 0 -wf_2 2 -corr_t - 1 +6.8370484437212463e+02 +3.0533056232915147e-10 - 2 +6.6134520322615822e+02 +3.9737807346122766e-12 - 3 +6.8370484437171353e+02 -2.5612686251836130e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 1 -wf_2 0 -corr_t - 1 +6.8370283168792889e+02 +3.0532890521977295e-10 - 2 +6.6134325636407402e+02 +3.9730355551484655e-12 - 3 +6.8370283168751791e+02 -2.5612686681440218e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 1 -wf_2 1 -corr_t - 1 +6.8372805529787934e+02 +3.0534016954586185e-10 - 2 +6.6136765507001564e+02 +3.9731820664935325e-12 - 3 +6.8372805529746825e+02 -2.5613631608015786e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 1 -wf_2 2 -corr_t - 1 +6.8373006805632656e+02 +3.0534106842445933e-10 - 2 +6.6136960200392332e+02 +3.9731937804440792e-12 - 3 +6.8373006805591558e+02 -2.5613707007587266e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 2 -wf_2 0 -corr_t - 1 +6.8370484437212156e+02 +3.0532220084664646e-10 - 2 +6.6134520322615526e+02 +3.9656927030717790e-12 - 3 +6.8370484437171069e+02 -2.5613522400086377e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 2 -wf_2 1 -corr_t - 1 +6.8373006805632599e+02 +3.0533346499198999e-10 - 2 +6.6136960200392275e+02 +3.9658390079382195e-12 - 3 +6.8373006805591490e+02 -2.5614467350834153e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 2 -wf_2 2 -corr_t - 1 +6.8373208082069789e+02 +3.0533436384459901e-10 - 2 +6.6137154894356127e+02 +3.9658506942251639e-12 - 3 +6.8373208082028680e+02 -2.5614542753491032e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 0 -wf_2 0 -corr_t - 1 +6.8367760900918211e+02 -9.5149222536505804e-10 - 2 +6.6131885855810310e+02 +3.2960434859595585e-10 - 3 +6.8367760900806934e+02 -2.3744430846347533e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 0 -wf_2 1 -corr_t - 1 +6.8370283168860135e+02 -9.5152732859532533e-10 - 2 +6.6134325636394544e+02 +3.2961650841969937e-10 - 3 +6.8370283168748858e+02 -2.3745306857315358e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 0 -wf_2 2 -corr_t - 1 +6.8370484437279526e+02 -9.5153012965274573e-10 - 2 +6.6134520322602793e+02 +3.2961747879154288e-10 - 3 +6.8370484437168250e+02 -2.3745376753897864e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 1 -wf_2 0 -corr_t - 1 +6.8370283168859953e+02 -9.5151770701795658e-10 - 2 +6.6134325636394351e+02 +3.2962581533640458e-10 - 3 +6.8370283168748665e+02 -2.3744344699578737e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 1 -wf_2 1 -corr_t - 1 +6.8372805529855032e+02 -9.5155281099707234e-10 - 2 +6.6136765506988547e+02 +3.2963797613709602e-10 - 3 +6.8372805529743755e+02 -2.3745220688244645e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 1 -wf_2 2 -corr_t - 1 +6.8373006805699742e+02 -9.5155561220425917e-10 - 2 +6.6136960200379315e+02 +3.2963894649982994e-10 - 3 +6.8373006805588454e+02 -2.3745290592048597e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 2 -wf_2 0 -corr_t - 1 +6.8370484437279174e+02 -9.5153224647433932e-10 - 2 +6.6134520322602452e+02 +3.2961543119772646e-10 - 3 +6.8370484437167897e+02 -2.3745588436057620e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 2 -wf_2 1 -corr_t - 1 +6.8373006805699617e+02 -9.5156735103669992e-10 - 2 +6.6136960200379178e+02 +3.2962759157000606e-10 - 3 +6.8373006805588329e+02 -2.3746464475292832e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 2 -wf_2 2 -corr_t - 1 +6.8373208082136819e+02 -9.5157015223999714e-10 - 2 +6.6137154894343041e+02 +3.2962856194733528e-10 - 3 +6.8373208082025531e+02 -2.3746534378088984e-10 - diff --git a/data/sfcf_test/data_o/test_r1/cfg1/f_1 b/data/sfcf_test/data_o/test_r1/cfg1/f_1 deleted file mode 100644 index 09751218..00000000 --- a/data/sfcf_test/data_o/test_r1/cfg1/f_1 +++ /dev/null @@ -1,194 +0,0 @@ -[run] - -version 2.1 -date 2022-01-19 11:04:00 +0100 -host r04n07.palma.wwu -dir /scratch/tmp/j_kuhl19 -user j_kuhl19 -gauge_name /unity -gauge_md5 1ea28326e4090996111a320b8372811d -param_name sfcf_unity_test.in -param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 -param_hash 686af5e712ee2902180f5428af94c6e7 -data_name ./output_10519905/data_of_1 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 0 -wf_2 0 -corr -+3.5119415254545021e+02 +6.7620978057264750e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 0 -wf_2 1 -corr -+3.5120703575855339e+02 +6.5026340956203663e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 0 -wf_2 2 -corr -+3.5120808902177868e+02 +6.5443496235264788e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 1 -wf_2 0 -corr -+3.5120703575855515e+02 +6.9706500417651470e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 1 -wf_2 1 -corr -+3.5122001235609065e+02 +6.9516150897757419e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 1 -wf_2 2 -corr -+3.5122104108046199e+02 +6.9232860455434941e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 2 -wf_2 0 -corr -+3.5120808902177447e+02 +1.0849949614595719e-14 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 2 -wf_2 1 -corr -+3.5122104108046182e+02 +1.0866063643253473e-14 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 2 -wf_2 2 -corr -+3.5122207631098047e+02 +1.0827277318679030e-14 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 0 -wf_2 0 -corr -+3.5119415254545038e+02 +3.0143306723935508e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 0 -wf_2 1 -corr -+3.5120703575855367e+02 +4.3340379505972648e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 0 -wf_2 2 -corr -+3.5120808902177902e+02 +3.9652247575094006e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 1 -wf_2 0 -corr -+3.5120703575855526e+02 -8.2540994138261318e-16 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 1 -wf_2 1 -corr -+3.5122001235609082e+02 -9.7121215247039609e-16 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 1 -wf_2 2 -corr -+3.5122104108046227e+02 -9.0872484903683497e-16 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 2 -wf_2 0 -corr -+3.5120808902177453e+02 +5.1331372776616026e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 2 -wf_2 1 -corr -+3.5122104108046193e+02 +5.0816653044831932e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 2 -wf_2 2 -corr -+3.5122207631098064e+02 +5.1165649253001659e-15 - diff --git a/data/sfcf_test/data_o/test_r1/cfg1/f_A b/data/sfcf_test/data_o/test_r1/cfg1/f_A deleted file mode 100644 index 74be18ea..00000000 --- a/data/sfcf_test/data_o/test_r1/cfg1/f_A +++ /dev/null @@ -1,80 +0,0 @@ -[run] - -version 2.1 -date 2022-01-19 11:04:00 +0100 -host r04n07.palma.wwu -dir /scratch/tmp/j_kuhl19 -user j_kuhl19 -gauge_name /unity -gauge_md5 1ea28326e4090996111a320b8372811d -param_name sfcf_unity_test.in -param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 -param_hash 686af5e712ee2902180f5428af94c6e7 -data_name ./output_10519905/data_of_A - -[correlator] - -name f_A -quarks lquark lquark -offset 0 -wf 0 -corr_t - 1 +6.5471188727972304e+01 -6.1214214711790100e-12 - 2 +1.0447210336915187e+00 +8.9219487930753188e-13 - 3 -4.1025094911185178e+01 -4.8315634170546161e-14 - -[correlator] - -name f_A -quarks lquark lquark -offset 0 -wf 1 -corr_t - 1 +6.5551520722862705e+01 +2.0963356863957609e-13 - 2 +1.0542820240851569e+00 +2.3989756974599379e-15 - 3 -4.1024441815729936e+01 -5.7107484666182308e-15 - -[correlator] - -name f_A -quarks lquark lquark -offset 0 -wf 2 -corr_t - 1 +6.5529951269442847e+01 -6.6512260271334321e-14 - 2 +1.0516822345055969e+00 -2.2935262162529075e-15 - 3 -4.1025142768037746e+01 +3.7566377680004518e-16 - -[correlator] - -name f_A -quarks lquark lquark -offset 1 -wf 0 -corr_t - 1 +6.5471188727965909e+01 -1.6112786177915427e-11 - 2 +1.0447210337411881e+00 -7.0387528705692678e-13 - 3 -4.1025094911167137e+01 +4.6509152745618223e-13 - -[correlator] - -name f_A -quarks lquark lquark -offset 1 -wf 1 -corr_t - 1 +6.5551520722842213e+01 -8.1976426690345305e-13 - 2 +1.0542820240843382e+00 +2.1626370477046812e-13 - 3 -4.1024441815730086e+01 -2.4147931196409923e-14 - -[correlator] - -name f_A -quarks lquark lquark -offset 1 -wf 2 -corr_t - 1 +6.5529951269443117e+01 +7.9192560386479701e-14 - 2 +1.0516822345055870e+00 -1.2443038782429568e-14 - 3 -4.1025142768037739e+01 +5.9315333178954509e-17 - diff --git a/data/sfcf_test/data_o/test_r2/cfg1/F_V0 b/data/sfcf_test/data_o/test_r2/cfg1/F_V0 deleted file mode 100644 index b0e4fb17..00000000 --- a/data/sfcf_test/data_o/test_r2/cfg1/F_V0 +++ /dev/null @@ -1,230 +0,0 @@ -[run] - -version 2.1 -date 2022-01-19 11:04:00 +0100 -host r04n07.palma.wwu -dir /scratch/tmp/j_kuhl19 -user j_kuhl19 -gauge_name /unity -gauge_md5 1ea28326e4090996111a320b8372811d -param_name sfcf_unity_test.in -param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 -param_hash 686af5e712ee2902180f5428af94c6e7 -data_name ./output_10519905/data_oF_V0 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 0 -wf_2 0 -corr_t - 1 +6.8367760900851147e+02 +3.0531839956225539e-10 - 2 +6.6131885855823339e+02 +3.9736225045852382e-12 - 3 +6.8367760900810049e+02 -2.5611665964422843e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 0 -wf_2 1 -corr_t - 1 +6.8370283168793060e+02 +3.0532966356282939e-10 - 2 +6.6134325636407561e+02 +3.9737690976212336e-12 - 3 +6.8370283168751973e+02 -2.5612610847134760e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 0 -wf_2 2 -corr_t - 1 +6.8370484437212463e+02 +3.0533056232915147e-10 - 2 +6.6134520322615822e+02 +3.9737807346122766e-12 - 3 +6.8370484437171353e+02 -2.5612686251836130e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 1 -wf_2 0 -corr_t - 1 +6.8370283168792889e+02 +3.0532890521977295e-10 - 2 +6.6134325636407402e+02 +3.9730355551484655e-12 - 3 +6.8370283168751791e+02 -2.5612686681440218e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 1 -wf_2 1 -corr_t - 1 +6.8372805529787934e+02 +3.0534016954586185e-10 - 2 +6.6136765507001564e+02 +3.9731820664935325e-12 - 3 +6.8372805529746825e+02 -2.5613631608015786e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 1 -wf_2 2 -corr_t - 1 +6.8373006805632656e+02 +3.0534106842445933e-10 - 2 +6.6136960200392332e+02 +3.9731937804440792e-12 - 3 +6.8373006805591558e+02 -2.5613707007587266e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 2 -wf_2 0 -corr_t - 1 +6.8370484437212156e+02 +3.0532220084664646e-10 - 2 +6.6134520322615526e+02 +3.9656927030717790e-12 - 3 +6.8370484437171069e+02 -2.5613522400086377e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 2 -wf_2 1 -corr_t - 1 +6.8373006805632599e+02 +3.0533346499198999e-10 - 2 +6.6136960200392275e+02 +3.9658390079382195e-12 - 3 +6.8373006805591490e+02 -2.5614467350834153e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 0 -wf 2 -wf_2 2 -corr_t - 1 +6.8373208082069789e+02 +3.0533436384459901e-10 - 2 +6.6137154894356127e+02 +3.9658506942251639e-12 - 3 +6.8373208082028680e+02 -2.5614542753491032e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 0 -wf_2 0 -corr_t - 1 +6.8367760900918211e+02 -9.5149222536505804e-10 - 2 +6.6131885855810310e+02 +3.2960434859595585e-10 - 3 +6.8367760900806934e+02 -2.3744430846347533e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 0 -wf_2 1 -corr_t - 1 +6.8370283168860135e+02 -9.5152732859532533e-10 - 2 +6.6134325636394544e+02 +3.2961650841969937e-10 - 3 +6.8370283168748858e+02 -2.3745306857315358e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 0 -wf_2 2 -corr_t - 1 +6.8370484437279526e+02 -9.5153012965274573e-10 - 2 +6.6134520322602793e+02 +3.2961747879154288e-10 - 3 +6.8370484437168250e+02 -2.3745376753897864e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 1 -wf_2 0 -corr_t - 1 +6.8370283168859953e+02 -9.5151770701795658e-10 - 2 +6.6134325636394351e+02 +3.2962581533640458e-10 - 3 +6.8370283168748665e+02 -2.3744344699578737e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 1 -wf_2 1 -corr_t - 1 +6.8372805529855032e+02 -9.5155281099707234e-10 - 2 +6.6136765506988547e+02 +3.2963797613709602e-10 - 3 +6.8372805529743755e+02 -2.3745220688244645e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 1 -wf_2 2 -corr_t - 1 +6.8373006805699742e+02 -9.5155561220425917e-10 - 2 +6.6136960200379315e+02 +3.2963894649982994e-10 - 3 +6.8373006805588454e+02 -2.3745290592048597e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 2 -wf_2 0 -corr_t - 1 +6.8370484437279174e+02 -9.5153224647433932e-10 - 2 +6.6134520322602452e+02 +3.2961543119772646e-10 - 3 +6.8370484437167897e+02 -2.3745588436057620e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 2 -wf_2 1 -corr_t - 1 +6.8373006805699617e+02 -9.5156735103669992e-10 - 2 +6.6136960200379178e+02 +3.2962759157000606e-10 - 3 +6.8373006805588329e+02 -2.3746464475292832e-10 - -[correlator] - -name F_V0 -quarks lquark lquark -offset 1 -wf 2 -wf_2 2 -corr_t - 1 +6.8373208082136819e+02 -9.5157015223999714e-10 - 2 +6.6137154894343041e+02 +3.2962856194733528e-10 - 3 +6.8373208082025531e+02 -2.3746534378088984e-10 - diff --git a/data/sfcf_test/data_o/test_r2/cfg1/f_1 b/data/sfcf_test/data_o/test_r2/cfg1/f_1 deleted file mode 100644 index 09751218..00000000 --- a/data/sfcf_test/data_o/test_r2/cfg1/f_1 +++ /dev/null @@ -1,194 +0,0 @@ -[run] - -version 2.1 -date 2022-01-19 11:04:00 +0100 -host r04n07.palma.wwu -dir /scratch/tmp/j_kuhl19 -user j_kuhl19 -gauge_name /unity -gauge_md5 1ea28326e4090996111a320b8372811d -param_name sfcf_unity_test.in -param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 -param_hash 686af5e712ee2902180f5428af94c6e7 -data_name ./output_10519905/data_of_1 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 0 -wf_2 0 -corr -+3.5119415254545021e+02 +6.7620978057264750e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 0 -wf_2 1 -corr -+3.5120703575855339e+02 +6.5026340956203663e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 0 -wf_2 2 -corr -+3.5120808902177868e+02 +6.5443496235264788e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 1 -wf_2 0 -corr -+3.5120703575855515e+02 +6.9706500417651470e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 1 -wf_2 1 -corr -+3.5122001235609065e+02 +6.9516150897757419e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 1 -wf_2 2 -corr -+3.5122104108046199e+02 +6.9232860455434941e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 2 -wf_2 0 -corr -+3.5120808902177447e+02 +1.0849949614595719e-14 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 2 -wf_2 1 -corr -+3.5122104108046182e+02 +1.0866063643253473e-14 - -[correlator] - -name f_1 -quarks lquark lquark -offset 0 -wf 2 -wf_2 2 -corr -+3.5122207631098047e+02 +1.0827277318679030e-14 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 0 -wf_2 0 -corr -+3.5119415254545038e+02 +3.0143306723935508e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 0 -wf_2 1 -corr -+3.5120703575855367e+02 +4.3340379505972648e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 0 -wf_2 2 -corr -+3.5120808902177902e+02 +3.9652247575094006e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 1 -wf_2 0 -corr -+3.5120703575855526e+02 -8.2540994138261318e-16 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 1 -wf_2 1 -corr -+3.5122001235609082e+02 -9.7121215247039609e-16 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 1 -wf_2 2 -corr -+3.5122104108046227e+02 -9.0872484903683497e-16 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 2 -wf_2 0 -corr -+3.5120808902177453e+02 +5.1331372776616026e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 2 -wf_2 1 -corr -+3.5122104108046193e+02 +5.0816653044831932e-15 - -[correlator] - -name f_1 -quarks lquark lquark -offset 1 -wf 2 -wf_2 2 -corr -+3.5122207631098064e+02 +5.1165649253001659e-15 - diff --git a/data/sfcf_test/data_o/test_r2/cfg1/f_A b/data/sfcf_test/data_o/test_r2/cfg1/f_A deleted file mode 100644 index 74be18ea..00000000 --- a/data/sfcf_test/data_o/test_r2/cfg1/f_A +++ /dev/null @@ -1,80 +0,0 @@ -[run] - -version 2.1 -date 2022-01-19 11:04:00 +0100 -host r04n07.palma.wwu -dir /scratch/tmp/j_kuhl19 -user j_kuhl19 -gauge_name /unity -gauge_md5 1ea28326e4090996111a320b8372811d -param_name sfcf_unity_test.in -param_md5 d881e90d41188a33b8b0f1bd0bc53ea5 -param_hash 686af5e712ee2902180f5428af94c6e7 -data_name ./output_10519905/data_of_A - -[correlator] - -name f_A -quarks lquark lquark -offset 0 -wf 0 -corr_t - 1 +6.5471188727972304e+01 -6.1214214711790100e-12 - 2 +1.0447210336915187e+00 +8.9219487930753188e-13 - 3 -4.1025094911185178e+01 -4.8315634170546161e-14 - -[correlator] - -name f_A -quarks lquark lquark -offset 0 -wf 1 -corr_t - 1 +6.5551520722862705e+01 +2.0963356863957609e-13 - 2 +1.0542820240851569e+00 +2.3989756974599379e-15 - 3 -4.1024441815729936e+01 -5.7107484666182308e-15 - -[correlator] - -name f_A -quarks lquark lquark -offset 0 -wf 2 -corr_t - 1 +6.5529951269442847e+01 -6.6512260271334321e-14 - 2 +1.0516822345055969e+00 -2.2935262162529075e-15 - 3 -4.1025142768037746e+01 +3.7566377680004518e-16 - -[correlator] - -name f_A -quarks lquark lquark -offset 1 -wf 0 -corr_t - 1 +6.5471188727965909e+01 -1.6112786177915427e-11 - 2 +1.0447210337411881e+00 -7.0387528705692678e-13 - 3 -4.1025094911167137e+01 +4.6509152745618223e-13 - -[correlator] - -name f_A -quarks lquark lquark -offset 1 -wf 1 -corr_t - 1 +6.5551520722842213e+01 -8.1976426690345305e-13 - 2 +1.0542820240843382e+00 +2.1626370477046812e-13 - 3 -4.1024441815730086e+01 -2.4147931196409923e-14 - -[correlator] - -name f_A -quarks lquark lquark -offset 1 -wf 2 -corr_t - 1 +6.5529951269443117e+01 +7.9192560386479701e-14 - 2 +1.0516822345055870e+00 -1.2443038782429568e-14 - 3 -4.1025142768037739e+01 +5.9315333178954509e-17 - From b8b3d6191f52c7fbed6ae15416c62a8bc4f4d42a Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 8 Feb 2022 13:48:55 +0000 Subject: [PATCH 027/136] docs: typos fixed, print statements removed --- pyerrors/input/bdio.py | 3 --- pyerrors/input/openQCD.py | 1 - pyerrors/input/sfcf.py | 25 +++---------------------- 3 files changed, 3 insertions(+), 26 deletions(-) diff --git a/pyerrors/input/bdio.py b/pyerrors/input/bdio.py index 0a15cceb..ef0e7f68 100644 --- a/pyerrors/input/bdio.py +++ b/pyerrors/input/bdio.py @@ -1,6 +1,3 @@ -#!/usr/bin/env python -# coding: utf-8 - import ctypes import hashlib import autograd.numpy as np # Thinly-wrapped numpy diff --git a/pyerrors/input/openQCD.py b/pyerrors/input/openQCD.py index 97208fde..276b0155 100644 --- a/pyerrors/input/openQCD.py +++ b/pyerrors/input/openQCD.py @@ -573,7 +573,6 @@ def read_qtop(path, prefix, c, dtr_cnfg=1, version="1.2", **kwargs): found = [] files = [] for (dirpath, dirnames, filenames) in os.walk(path + "/"): - # print(filenames) found.extend(filenames) break for f in found: diff --git a/pyerrors/input/sfcf.py b/pyerrors/input/sfcf.py index bd5c95e1..5a22c3cd 100644 --- a/pyerrors/input/sfcf.py +++ b/pyerrors/input/sfcf.py @@ -1,6 +1,3 @@ -#!/usr/bin/env python -# coding: utf-8 - import os import fnmatch import re @@ -39,7 +36,7 @@ def read_sfcf(path, prefix, name, quarks='.*', corr_type='bi', noffset=0, wf=0, replaces the name of the ensemble version: str version of SFCF, with which the measurement was done. - if the compact output option (-c) was spectified, + if the compact output option (-c) was specified, append a "c" to the version (e.g. "1.0c") if the append output option (-a) was specified, append an "a" to the version @@ -47,7 +44,7 @@ def read_sfcf(path, prefix, name, quarks='.*', corr_type='bi', noffset=0, wf=0, list of replica to be read, default is all files: list list of files to be read per replica, default is all. - for non-conpact ouztput format, hand the folders to be read here. + for non-compact output format, hand the folders to be read here. check_configs: list of list of supposed configs, eg. [range(1,1000)] for one replicum with 1000 configs @@ -69,17 +66,12 @@ def read_sfcf(path, prefix, name, quarks='.*', corr_type='bi', noffset=0, wf=0, else: b2b = False single = False - # due to higher usage in current projects, - # compact file format is default compact = True appended = False - # get version string known_versions = ["0.0", "1.0", "2.0", "1.0c", "2.0c", "1.0a", "2.0a"] if version not in known_versions: raise Exception("This version is not known!") - # if the letter c is appended to the version, - # the compact fileformat is used (former read_sfcf_c) if(version[-1] == "c"): appended = False compact = True @@ -127,8 +119,6 @@ def read_sfcf(path, prefix, name, quarks='.*', corr_type='bi', noffset=0, wf=0, if len(new_names) != replica: raise Exception('Names does not have the required length', replica) else: - # Adjust replica names to new bookmarking system - new_names = [] if not appended: for entry in ls: @@ -149,7 +139,6 @@ def read_sfcf(path, prefix, name, quarks='.*', corr_type='bi', noffset=0, wf=0, ls.sort(key=lambda x: int(re.findall(r'\d+', x)[-1])) for entry in ls: myentry = entry[:-len(name) - 1] - # print(myentry) try: idx = myentry.index('r') except Exception: @@ -159,7 +148,6 @@ def read_sfcf(path, prefix, name, quarks='.*', corr_type='bi', noffset=0, wf=0, new_names.append(kwargs.get('ens_name') + '|' + myentry[idx:]) else: new_names.append(myentry[:idx] + '|' + myentry[idx:]) - # print(new_names) idl = [] if not appended: for i, item in enumerate(ls): @@ -174,8 +162,6 @@ def read_sfcf(path, prefix, name, quarks='.*', corr_type='bi', noffset=0, wf=0, else: sub_ls.extend(dirnames) break - - # print(sub_ls) if compact: for exc in sub_ls: if not fnmatch.fnmatch(exc, prefix + '*'): @@ -186,7 +172,6 @@ def read_sfcf(path, prefix, name, quarks='.*', corr_type='bi', noffset=0, wf=0, if not fnmatch.fnmatch(exc, 'cfg*'): sub_ls = list(set(sub_ls) - set([exc])) sub_ls.sort(key=lambda x: int(x[3:])) - # print(sub_ls) rep_idl = [] no_cfg = len(sub_ls) for cfg in sub_ls: @@ -201,7 +186,7 @@ def read_sfcf(path, prefix, name, quarks='.*', corr_type='bi', noffset=0, wf=0, # maybe there is a better way to print the idls print(item, ':', no_cfg, ' configurations') idl.append(rep_idl) - # here we have found all the files we need to look into. + # here we have found all the files we need to look into. if i == 0: # here, we want to find the place within the file, # where the correlator we need is stored. @@ -255,8 +240,6 @@ def read_sfcf(path, prefix, name, quarks='.*', corr_type='bi', noffset=0, wf=0, for t in range(T): deltas[t].append(np.zeros(no_cfg)) - # ...the actual parsing can start. - # we iterate through all measurement files in the path given... if compact: for cfg in range(no_cfg): with open(path + '/' + item + '/' + sub_ls[cfg]) as fp: @@ -312,7 +295,6 @@ def read_sfcf(path, prefix, name, quarks='.*', corr_type='bi', noffset=0, wf=0, data_starts.append(linenumber) if len(set([data_starts[i] - data_starts[i - 1] for i in range(1, len(data_starts))])) > 1: raise Exception("Irregularities in file structure found, not all runs have the same output length") - # first chunk of data chunk = content[:data_starts[1]] for linenumber, line in enumerate(chunk): if line.startswith("gauge_name"): @@ -340,7 +322,6 @@ def read_sfcf(path, prefix, name, quarks='.*', corr_type='bi', noffset=0, wf=0, start = data_starts[cnfg] stop = start + data_starts[1] chunk = content[start:stop] - # meta_data = {} try: rep_idl.append(int(chunk[gauge_line].split("n")[-1])) except Exception: From 1196935e4e2d8065b15e7d979043d6b5ecfb1e3f Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 8 Feb 2022 14:06:04 +0000 Subject: [PATCH 028/136] refactor!: Renamed methods smearing into index and smearing_symmetric into matrix_symmetric --- examples/06_gevp.ipynb | 8 ++++---- pyerrors/correlators.py | 20 ++++++++------------ 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/examples/06_gevp.ipynb b/examples/06_gevp.ipynb index 95a02172..5f9b6b61 100644 --- a/examples/06_gevp.ipynb +++ b/examples/06_gevp.ipynb @@ -120,7 +120,7 @@ "Many methods we could use for regular correlators do not work with matrix-correlators. \n", "In order to get the effective mass, we need to convert to a regular correlator first. \n", "\n", - "One way to do it, is to pick a smearing out of the matrix:" + "One way to do it, is to pick an element out of the matrix:" ] }, { @@ -130,7 +130,7 @@ "metadata": {}, "outputs": [], "source": [ - "single_smearing = matrix_V1V1.smearing(0,0)" + "single_smearing = matrix_V1V1.index(0,0)" ] }, { @@ -138,7 +138,7 @@ "id": "5c25a23c", "metadata": {}, "source": [ - "**Corr.smearing(i,j)** picks the element [i,j] from every matrix and returns a correlator containing one Obs per timeslice. \n", + "**Corr.index(i,j)** picks the element [i,j] from every matrix and returns a correlator containing one Obs per timeslice. \n", "But there is a more usefull way to retrieve a single value per timeslice. \n", "We might want a linear combination of different sources and sinks. \n", "We can formalize this as\n", @@ -214,7 +214,7 @@ "This gives us a new correlator with one Obs per timeslice. We then calculate its effective mass and plot it. \n", "We tell the **Corr.show** method to show another correlator as a comparison. \n", "\n", - "We can see, that the projected correlator (*blue*) converges to a mass plateau much quicker than the single smearing." + "We can see, that the projected correlator (*blue*) converges to a mass plateau much quicker than the single smearing level." ] }, { diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py index b99f5ae3..6996e5a2 100644 --- a/pyerrors/correlators.py +++ b/pyerrors/correlators.py @@ -16,10 +16,10 @@ class Corr: Everything, this class does, can be achieved using lists or arrays of Obs. But it is simply more convenient to have a dedicated object for correlators. One often wants to add or multiply correlators of the same length at every timeslice and it is inconvenient - to iterate over all timeslices for every operation. This is especially true, when dealing with smearing matrices. + to iterate over all timeslices for every operation. This is especially true, when dealing with matrices. The correlator can have two types of content: An Obs at every timeslice OR a GEVP - smearing matrix at every timeslice. Other dependency (eg. spatial) are not supported. + matrix at every timeslice. Other dependency (eg. spatial) are not supported. """ @@ -174,7 +174,7 @@ class Corr: newcontent = [None if (self.content[t] is None or vector_l[t] is None or vector_r[t] is None) else np.asarray([vector_l[t].T @ self.content[t] @ vector_r[t]]) for t in range(self.T)] return Corr(newcontent) - def smearing(self, i, j): + def item(self, i, j): """Picks the element [i,j] from every matrix and returns a correlator containing one Obs per timeslice. Parameters @@ -185,7 +185,7 @@ class Corr: Second index to be picked. """ if self.N == 1: - raise Exception("Trying to pick smearing from projected Corr") + raise Exception("Trying to pick item from projected Corr") newcontent = [None if(item is None) else item[i, j] for item in self.content] return Corr(newcontent) @@ -239,13 +239,13 @@ class Corr: raise Exception("Corr could not be symmetrized: No redundant values") return Corr(newcontent, prange=self.prange) - def smearing_symmetric(self): - """Symmetrizes the matrices and therefore make them positive definite.""" + def matrix_symmetric(self): + """Symmetrizes the correlator matrices on every timeslice.""" if self.N > 1: transposed = [None if (G is None) else G.T for G in self.content] return 0.5 * (Corr(transposed) + self) if self.N == 1: - raise Exception("Trying to symmetrize a smearing matrix, that already has N=1.") + raise Exception("Trying to symmetrize a correlator matrix, that already has N=1.") def GEVP(self, t0, ts=None, state=0, sorted_list=None): """Solve the general eigenvalue problem on the current correlator @@ -307,7 +307,7 @@ class Corr: return all_vecs def Eigenvalue(self, t0, state=1): - G = self.smearing_symmetric() + G = self.matrix_symmetric() G0 = G.content[t0] L = cholesky(G0) Li = inv(L) @@ -798,8 +798,6 @@ class Corr: content_string += "Description: " + self.tag + "\n" if self.N != 1: return content_string - # This avoids a crash for N>1. I do not know, what else to do here. I like the list representation for N==1. We could print only one "smearing" or one matrix. Printing everything will just - # be a wall of numbers. if range[1]: range[1] += 1 @@ -878,8 +876,6 @@ class Corr: newcontent.append(None) else: newcontent.append(self.content[t] / y.content[t]) - # Here we set the entire timeslice to undefined, if one of the smearings has encountered an division by zero. - # While this might throw away perfectly good values in other smearings, we will never have to check, if all values in our matrix are defined for t in range(self.T): if newcontent[t] is None: continue From 091f19def1ef0d1470027b44b3f5dee192669a62 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 8 Feb 2022 14:31:38 +0000 Subject: [PATCH 029/136] fix: Bug in Corr.Hankel fixed --- pyerrors/correlators.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py index 6996e5a2..352af782 100644 --- a/pyerrors/correlators.py +++ b/pyerrors/correlators.py @@ -350,8 +350,8 @@ class Corr: new_content.append(array.copy()) def wrap(i): - if i >= self.T: - return i - self.T + while i >= self.T: + i -= self.T return i for t in range(self.T): From 6ae53cb575f4f310cb24f87cce73adf6be3cfb27 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 8 Feb 2022 14:31:49 +0000 Subject: [PATCH 030/136] tests: tests for correlator module corrected and extended --- tests/correlators_test.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/tests/correlators_test.py b/tests/correlators_test.py index 8cec767c..556afa1c 100644 --- a/tests/correlators_test.py +++ b/tests/correlators_test.py @@ -207,7 +207,7 @@ def test_matrix_corr(): corr_ab = _gen_corr(0.5) corr_mat = pe.Corr(np.array([[corr_aa, corr_ab], [corr_ab, corr_aa]])) - corr_mat.smearing(0, 0) + corr_mat.item(0, 0) vec_0 = corr_mat.GEVP(0, 0) vec_1 = corr_mat.GEVP(0, 0, state=1) @@ -221,6 +221,8 @@ def test_matrix_corr(): corr_mat.GEVP(0, 0, sorted_list="Eigenvalue") corr_mat.GEVP(0, 0, sorted_list="Eigenvector") + corr_mat.matrix_symmetric() + with pytest.raises(Exception): corr_mat.plottable() @@ -240,4 +242,16 @@ def test_matrix_corr(): corr_mat.plateau([2, 4]) with pytest.raises(Exception): - corr_o.smearing(0, 0) + corr_o.item(0, 0) + + +def test_hankel(): + corr_content = [] + for t in range(8): + exponent = 1.2 + corr_content.append(pe.pseudo_Obs(2 + t ** exponent, 0.2, 't')) + + corr = pe.Corr(corr_content) + corr.Hankel(2) + corr.Hankel(6, periodic=True) + From 60ad91ead600c901d4e144685a359c6aa4b30232 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 8 Feb 2022 14:43:23 +0000 Subject: [PATCH 031/136] tests: coverage in correlator increased --- tests/correlators_test.py | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/tests/correlators_test.py b/tests/correlators_test.py index 556afa1c..1a394d63 100644 --- a/tests/correlators_test.py +++ b/tests/correlators_test.py @@ -98,6 +98,9 @@ def test_m_eff(): with pytest.warns(RuntimeWarning): my_corr.m_eff('sinh') + with pytest.raises(Exception): + my_corr.m_eff('unkown_variant') + def test_reweighting(): my_corr = pe.correlators.Corr([pe.pseudo_Obs(10, 0.1, 't'), pe.pseudo_Obs(0, 0.05, 't')]) @@ -175,6 +178,7 @@ def test_utility(): corr.print() corr.print([2, 4]) corr.show() + corr.show(comp=corr) corr.dump('test_dump', datatype="pickle", path='.') corr.dump('test_dump', datatype="pickle") @@ -195,6 +199,21 @@ def test_utility(): assert np.allclose(o_a[0].deltas['t'], o_b[0].deltas['t']) +def test_prange(): + corr_content = [] + for t in range(8): + corr_content.append(pe.pseudo_Obs(2 + 10 ** (1.1 * t), 0.2, 't')) + corr = pe.correlators.Corr(corr_content) + + corr.set_prange([2, 4]) + with pytest.raises(Exception): + corr.set_prange([2]) + with pytest.raises(Exception): + corr.set_prange([2, 2.3]) + with pytest.raises(Exception): + corr.set_prange([4, 1]) + + def test_matrix_corr(): def _gen_corr(val): corr_content = [] @@ -242,7 +261,16 @@ def test_matrix_corr(): corr_mat.plateau([2, 4]) with pytest.raises(Exception): - corr_o.item(0, 0) + corr_mat.hankel(3) + + with pytest.raises(Exception): + corr_mat.fit(lambda x: x[0]) + + with pytest.raises(Exception): + corr_0.item(0, 0) + + with pytest.raises(Exception): + corr_0.matrix_symmetric() def test_hankel(): From aadf9cf32fa0f46e1d36ea48a7ea3cda3f000cbe Mon Sep 17 00:00:00 2001 From: Simon Kuberski Date: Tue, 8 Feb 2022 15:44:56 +0100 Subject: [PATCH 032/136] Rewritten large parts of Qtop routines, making it compatible with sfqcd --- pyerrors/input/openQCD.py | 499 +++++++++++++++++++++++--------------- 1 file changed, 298 insertions(+), 201 deletions(-) diff --git a/pyerrors/input/openQCD.py b/pyerrors/input/openQCD.py index 3c50a3d2..36bdd552 100644 --- a/pyerrors/input/openQCD.py +++ b/pyerrors/input/openQCD.py @@ -217,8 +217,7 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs): return result -def extract_t0(path, prefix, dtr_read, xmin, - spatial_extent, fit_range=5, **kwargs): +def extract_t0(path, prefix, dtr_read, xmin, spatial_extent, fit_range=5, **kwargs): """Extract t0 from given .ms.dat files. Returns t0 as Obs. It is assumed that all boundary effects have @@ -226,7 +225,6 @@ def extract_t0(path, prefix, dtr_read, xmin, The data around the zero crossing of t^2 - 0.3 is fitted with a linear function from which the exact root is extracted. - Only works with openQCD It is assumed that one measurement is performed for each config. If this is not the case, the resulting idl, as well as the handling @@ -510,8 +508,289 @@ def _read_array_openQCD2(fp): return {'d': d, 'n': n, 'size': size, 'arr': arr} -def read_qtop(path, prefix, c, dtr_cnfg=1, version="1.2", **kwargs): - """Read qtop format from given folder structure. +def read_qtop(path, prefix, c, dtr_cnfg=1, version="openQCD", **kwargs): + """Read the topologial charge based on openQCD gradient flow measurements. + + Parameters + ---------- + path : str + path of the measurement files + prefix : str + prefix of the measurement files, e.g. _id0_r0.ms.dat. + Ignored if file names are passed explicitly via keyword files. + c : double + Smearing radius in units of the lattice extent, c = sqrt(8 t0) / L. + dtr_cnfg : int + (optional) parameter that specifies the number of measurements + between two configs. + If it is not set, the distance between two measurements + in the file is assumed to be the distance between two configurations. + steps : int + (optional) Distance between two configurations in units of trajectories / + cycles. Assumed to be the distance between two measurements * dtr_cnfg if not given + version : str + Either openQCD or sfqcd, depending on the data. + L : int + spatial length of the lattice in L/a. + HAS to be set if version != sfqcd, since openQCD does not provide + this in the header + r_start : list + list which contains the first config to be read for each replicum. + r_stop : list + list which contains the last config to be read for each replicum. + files : list + specify the exact files that need to be read + from path, practical if e.g. only one replicum is needed + names : list + Alternative labeling for replicas/ensembles. + Has to have the appropriate length. + Zeuthen_flow : bool + (optional) If True, the Zeuthen flow is used for Qtop. Only possible + for version=='sfqcd' If False, the Wilson flow is used. + integer_charge : bool + If True, the charge is rounded towards the nearest integer on each config. + """ + known_versions = ["openQCD", "sfqcd"] + + if version not in known_versions: + raise Exception("Unknown openQCD version.") + if "steps" in kwargs: + steps = kwargs.get("steps") + if version == "sfqcd": + if "L" in kwargs: + supposed_L = kwargs.get("L") + else: + supposed_L = None + postfix = ".gfms.dat" + else: + if "L" not in kwargs: + raise Exception("This version of openQCD needs you to provide the spatial length of the lattice as parameter 'L'.") + else: + L = kwargs.get("L") + postfix = ".ms.dat" + + if "files" in kwargs: + files = kwargs.get("files") + postfix = '' + else: + found = [] + files = [] + for (dirpath, dirnames, filenames) in os.walk(path + "/"): + # print(filenames) + found.extend(filenames) + break + for f in found: + if fnmatch.fnmatch(f, prefix + "*" + postfix): + files.append(f) + + if 'r_start' in kwargs: + r_start = kwargs.get('r_start') + if len(r_start) != len(files): + raise Exception('r_start does not match number of replicas') + r_start = [o if o else None for o in r_start] + else: + r_start = [None] * len(files) + + if 'r_stop' in kwargs: + r_stop = kwargs.get('r_stop') + if len(r_stop) != len(files): + raise Exception('r_stop does not match number of replicas') + else: + r_stop = [None] * len(files) + rep_names = [] + + zeuthen = kwargs.get('Zeuthen_flow', False) + if zeuthen and version not in ['sfqcd']: + raise Exception('Zeuthen flow can only be used for version==sfqcd') + + r_start_index = [] + r_stop_index = [] + deltas = [] + configlist = [] + for rep, file in enumerate(files): + with open(path + "/" + file, "rb") as fp: + + Q = [] + traj_list = [] + if version in ['sfqcd']: + if zeuthen: + obspos = 0 + else: + obspos = 8 + t = fp.read(12) + header = struct.unpack(' if it's equal to 2 it means that the Zeuthen flow is also 'measured' (apart from the Wilson flow) + ncs = header[1] # number of different values for c in t_flow=1/8 c² L² -> measurements done for ncs c's + tmax = header[2] # lattice T/a + + t = fp.read(12) + Ls = struct.unpack(' cmax: + raise Exception('Flow has been determined between c=0 and c=%lf with tolerance %lf' % (cmax, tol)) + + if(zthfl == 2): + nfl = 2 # number of flows + else: + nfl = 1 + iobs = 8 * nfl # number of flow observables calculated + + while 0 < 1: + t = fp.read(4) + if(len(t) < 4): + break + traj_list.append(struct.unpack('i', t)[0]) # trajectory number when measurement was done + + for j in range(ncs + 1): + for i in range(iobs): + t = fp.read(8 * tmax) + if (i == obspos): # determines the flow observable -> i=0 <-> Zeuthen flow + Q.append(struct.unpack('d' * tmax, t)) + + else: + t = fp.read(12) + header = struct.unpack(' 1: + offset = configlist[-1][0] - 1 + warnings.warn('Assume thermalization and that the first measurement belongs to the first config. Offset = %d configs (%d trajectories / cycles)' % ( + offset, offset * steps)) + configlist[-1] = [item - offset for item in configlist[-1]] + + if r_start[rep] is None: + r_start_index.append(0) + else: + try: + r_start_index.append(configlist[-1].index(r_start[rep])) + except ValueError: + raise Exception('Config %d not in file with range [%d, %d]' % ( + r_start[rep], configlist[-1][0], configlist[-1][-1])) from None + + if r_stop[rep] is None: + r_stop_index.append(len(configlist[-1]) - 1) + else: + try: + r_stop_index.append(configlist[-1].index(r_stop[rep])) + except ValueError: + raise Exception('Config %d not in file with range [%d, %d]' % ( + r_stop[rep], configlist[-1][0], configlist[-1][-1])) from None + + if version in ['sfqcd']: + cstepsize = cmax / ncs + index_aim = round(c / cstepsize) + else: + t_aim = (c * L) ** 2 / 8 + index_aim = round(t_aim / eps / dn) + + Q_sum = [] + for i, item in enumerate(Q): + Q_sum.append([sum(item[current:current + tmax]) + for current in range(0, len(item), tmax)]) + Q_top = [] + if version in ['sfqcd']: + for i in range(len(Q_sum) // (ncs + 1)): + Q_top.append(Q_sum[i * (ncs + 1) + index_aim][0]) + else: + for i in range(len(Q) // dtr_cnfg): + Q_top.append(Q_sum[dtr_cnfg * i][index_aim]) + if len(Q_top) != len(traj_list) // dtr_cnfg: + raise Exception("qtops and traj_list dont have the same length") + + if kwargs.get('integer_charge', False): + Q_top = [round(q) for q in Q_top] + + truncated_file = file[:-len(postfix)] + + if "names" not in kwargs: + try: + idx = truncated_file.index('r') + except Exception: + if "names" not in kwargs: + raise Exception("Automatic recognition of replicum failed, please enter the key word 'names'.") + ens_name = truncated_file[:idx] + rep_names.append(ens_name + '|' + truncated_file[idx:]) + else: + names = kwargs.get("names") + rep_names = names + deltas.append(Q_top) + + idl = [range(int(configlist[rep][r_start_index[rep]]), int(configlist[rep][r_stop_index[rep]]), 1) for rep in range(len(deltas))] + deltas = [deltas[nrep][r_start_index[nrep]:r_stop_index[nrep]] for nrep in range(len(deltas))] + result = Obs(deltas, rep_names, idl=idl) + return result + + +def qtop_projection(qtop, target=0): + """Returns the projection to the topological charge sector defined by target. + + Parameters + ---------- + path : Obs + Topological charge, rounded to nearest integer on each config. + target : int + Specifies the topological sector to be reweighted to (default 0) + """ + if qtop.reweighted: + raise Exception('You can not use a reweighted observable for reweighting!') + + proj_qtop = [] + for n in qtop.deltas: + proj_qtop.append(np.array([1 if int(qtop.value + q) == target else 0 for q in qtop.deltas[n]])) + + reto = Obs(proj_qtop, qtop.names, idl=[qtop.idl[name] for name in qtop.names]) + reto.is_merged = qtop.is_merged + return reto + + +def read_qtop_sector(path, prefix, c, target=0, **kwargs): + """Constructs reweighting factors to a specified topological sector. Parameters ---------- @@ -521,18 +800,19 @@ def read_qtop(path, prefix, c, dtr_cnfg=1, version="1.2", **kwargs): prefix of the measurement files, e.g. _id0_r0.ms.dat c : double Smearing radius in units of the lattice extent, c = sqrt(8 t0) / L + target : int + Specifies the topological sector to be reweighted to (default 0) dtr_cnfg : int (optional) parameter that specifies the number of trajectories between two configs. if it is not set, the distance between two measurements - in the file is assumed to be - the distance between two configurations. + in the file is assumed to be the distance between two configurations. steps : int - (optional) (maybe only necessary for openQCD2.0) - nt step size, guessed if not given + (optional) Distance between two configurations in units of trajectories / + cycles. Assumed to be the distance between two measurements * dtr_cnfg if not given version : str version string of the openQCD (sfqcd) version used to create - the ensemble + the ensemble. Default is 2.0. May also be set to sfqcd. L : int spatial length of the lattice in L/a. HAS to be set if version != sfqcd, since openQCD does not provide @@ -548,200 +828,17 @@ def read_qtop(path, prefix, c, dtr_cnfg=1, version="1.2", **kwargs): names : list Alternative labeling for replicas/ensembles. Has to have the appropriate length - """ - known_versions = ["1.0", "1.2", "1.4", "1.6", "2.0", "sfqcd"] - - if version not in known_versions: - raise Exception("Unknown openQCD version.") - if "steps" in kwargs: - steps = kwargs.get("steps") - if version == "sfqcd": - if "L" in kwargs: - supposed_L = kwargs.get("L") - else: - if "L" not in kwargs: - raise Exception("This version of openQCD needs you to provide the spatial length of the lattice as parameter 'L'.") - else: - L = kwargs.get("L") - r_start = 1 - if "r_start" in kwargs: - r_start = kwargs.get("r_start") - if "r_stop" in kwargs: - r_stop = kwargs.get("r_stop") - if "files" in kwargs: - files = kwargs.get("files") - else: - found = [] - files = [] - for (dirpath, dirnames, filenames) in os.walk(path + "/"): - # print(filenames) - found.extend(filenames) - break - for f in found: - if fnmatch.fnmatch(f, prefix + "*" + ".ms.dat"): - files.append(f) - print(files) - rep_names = [] - - deltas = [] - idl = [] - for rep, file in enumerate(files): - with open(path + "/" + file, "rb") as fp: - t = fp.read(12) - header = struct.unpack(' Date: Tue, 8 Feb 2022 17:07:40 +0000 Subject: [PATCH 033/136] fix: CObs can now be added and multiplied to as well as subtracted from Obs in all combinations --- pyerrors/obs.py | 12 +++++------- tests/obs_test.py | 24 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/pyerrors/obs.py b/pyerrors/obs.py index 72a4156e..94748ed6 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -693,7 +693,7 @@ class Obs: else: if isinstance(y, np.ndarray): return np.array([self + o for o in y]) - elif y.__class__.__name__ == 'Corr': + elif y.__class__.__name__ in ['Corr', 'CObs']: return NotImplemented else: return derived_observable(lambda x, **kwargs: x[0] + y, [self], man_grad=[1]) @@ -709,7 +709,7 @@ class Obs: return np.array([self * o for o in y]) elif isinstance(y, complex): return CObs(self * y.real, self * y.imag) - elif y.__class__.__name__ == 'Corr': + elif y.__class__.__name__ in ['Corr', 'CObs']: return NotImplemented else: return derived_observable(lambda x, **kwargs: x[0] * y, [self], man_grad=[y]) @@ -723,10 +723,8 @@ class Obs: else: if isinstance(y, np.ndarray): return np.array([self - o for o in y]) - - elif y.__class__.__name__ == 'Corr': + elif y.__class__.__name__ in ['Corr', 'CObs']: return NotImplemented - else: return derived_observable(lambda x, **kwargs: x[0] - y, [self], man_grad=[1]) @@ -742,7 +740,7 @@ class Obs: else: if isinstance(y, np.ndarray): return np.array([self / o for o in y]) - elif y.__class__.__name__ == 'Corr': + elif y.__class__.__name__ in ['Corr', 'CObs']: return NotImplemented else: return derived_observable(lambda x, **kwargs: x[0] / y, [self], man_grad=[1 / y]) @@ -753,7 +751,7 @@ class Obs: else: if isinstance(y, np.ndarray): return np.array([o / self for o in y]) - elif y.__class__.__name__ == 'Corr': + elif y.__class__.__name__ in ['Corr', 'CObs']: return NotImplemented else: return derived_observable(lambda x, **kwargs: y / x[0], [self], man_grad=[-y / self.value ** 2]) diff --git a/tests/obs_test.py b/tests/obs_test.py index 4944630f..548f1a42 100644 --- a/tests/obs_test.py +++ b/tests/obs_test.py @@ -117,6 +117,10 @@ def test_function_overloading(): np.arctanh(1 / b) np.sinc(1 / b) + b ** b + 0.5 ** b + b ** 0.5 + def test_overloading_vectorization(): a = np.random.randint(1, 100, 10) @@ -392,6 +396,9 @@ def test_cobs(): obs2 = pe.pseudo_Obs(-0.2, 0.03, 't') my_cobs = pe.CObs(obs1, obs2) + my_cobs == my_cobs + str(my_cobs) + repr(my_cobs) assert not (my_cobs + my_cobs.conjugate()).real.is_zero() assert (my_cobs + my_cobs.conjugate()).imag.is_zero() assert (my_cobs - my_cobs.conjugate()).real.is_zero() @@ -424,6 +431,23 @@ def test_cobs(): assert (other / my_cobs * my_cobs - other).is_zero() +def test_cobs_overloading(): + obs = pe.pseudo_Obs(1.1, 0.1, 't') + cobs = pe.CObs(obs, obs) + + cobs + obs + obs + cobs + + cobs - obs + obs - cobs + + cobs * obs + obs * cobs + + cobs / obs + obs / cobs + + def test_reweighting(): my_obs = pe.Obs([np.random.rand(1000)], ['t']) assert not my_obs.reweighted From 445476beb8e3ffcbb183004d3a664e46df928a88 Mon Sep 17 00:00:00 2001 From: Simon Kuberski Date: Wed, 9 Feb 2022 11:56:47 +0100 Subject: [PATCH 034/136] Bugfix in openQCD routines: r_stop was excluded instead of being the last element --- pyerrors/input/openQCD.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pyerrors/input/openQCD.py b/pyerrors/input/openQCD.py index 81b9eec3..91ab6cf7 100644 --- a/pyerrors/input/openQCD.py +++ b/pyerrors/input/openQCD.py @@ -195,7 +195,7 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs): r_stop_index.append(len(configlist[-1]) - 1) else: try: - r_stop_index.append(configlist[-1].index(r_stop[rep])) + r_stop_index.append(configlist[-1].index(r_stop[rep]) + 1) except ValueError: raise Exception('Config %d not in file with range [%d, %d]' % ( r_stop[rep], configlist[-1][0], configlist[-1][-1])) from None @@ -393,7 +393,7 @@ def extract_t0(path, prefix, dtr_read, xmin, spatial_extent, fit_range=5, **kwar r_stop_index.append(len(configlist[-1]) - 1) else: try: - r_stop_index.append(configlist[-1].index(r_stop[rep])) + r_stop_index.append(configlist[-1].index(r_stop[rep]) + 1) except ValueError: raise Exception('Config %d not in file with range [%d, %d]' % ( r_stop[rep], configlist[-1][0], configlist[-1][-1])) from None @@ -716,7 +716,7 @@ def read_qtop(path, prefix, c, dtr_cnfg=1, version="openQCD", **kwargs): r_stop_index.append(len(configlist[-1]) - 1) else: try: - r_stop_index.append(configlist[-1].index(r_stop[rep])) + r_stop_index.append(configlist[-1].index(r_stop[rep]) + 1) except ValueError: raise Exception('Config %d not in file with range [%d, %d]' % ( r_stop[rep], configlist[-1][0], configlist[-1][-1])) from None From 6d9ce5bb521afad914cbc79993493394a5fd960c Mon Sep 17 00:00:00 2001 From: Simon Kuberski Date: Wed, 9 Feb 2022 12:03:53 +0100 Subject: [PATCH 035/136] Catching the special case, where r_stop is equal to the last item of the configlist in openQCD routines --- pyerrors/input/openQCD.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pyerrors/input/openQCD.py b/pyerrors/input/openQCD.py index 91ab6cf7..5ded025a 100644 --- a/pyerrors/input/openQCD.py +++ b/pyerrors/input/openQCD.py @@ -196,6 +196,8 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs): else: try: r_stop_index.append(configlist[-1].index(r_stop[rep]) + 1) + if r_stop_index[-1] == len(configlist[-1]): + r_stop_index[-1] -= 1 except ValueError: raise Exception('Config %d not in file with range [%d, %d]' % ( r_stop[rep], configlist[-1][0], configlist[-1][-1])) from None @@ -394,6 +396,8 @@ def extract_t0(path, prefix, dtr_read, xmin, spatial_extent, fit_range=5, **kwar else: try: r_stop_index.append(configlist[-1].index(r_stop[rep]) + 1) + if r_stop_index[-1] == len(configlist[-1]): + r_stop_index[-1] -= 1 except ValueError: raise Exception('Config %d not in file with range [%d, %d]' % ( r_stop[rep], configlist[-1][0], configlist[-1][-1])) from None @@ -717,6 +721,8 @@ def read_qtop(path, prefix, c, dtr_cnfg=1, version="openQCD", **kwargs): else: try: r_stop_index.append(configlist[-1].index(r_stop[rep]) + 1) + if r_stop_index[-1] == len(configlist[-1]): + r_stop_index[-1] -= 1 except ValueError: raise Exception('Config %d not in file with range [%d, %d]' % ( r_stop[rep], configlist[-1][0], configlist[-1][-1])) from None From 080e09a07f8f32525c2ce880763124302af3abc1 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Wed, 9 Feb 2022 11:23:58 +0000 Subject: [PATCH 036/136] tests: tests cleaned up, name duplicate in obs_test corrected --- tests/benchmark_test.py | 1 - tests/obs_test.py | 6 ++---- tests/sfcf_in_test.py | 23 +++++++++++------------ 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/tests/benchmark_test.py b/tests/benchmark_test.py index ebdf4681..2b07578a 100644 --- a/tests/benchmark_test.py +++ b/tests/benchmark_test.py @@ -1,7 +1,6 @@ import numpy as np import pyerrors as pe import pytest -import time np.random.seed(0) diff --git a/tests/obs_test.py b/tests/obs_test.py index 548f1a42..9bb508b4 100644 --- a/tests/obs_test.py +++ b/tests/obs_test.py @@ -1,7 +1,5 @@ import autograd.numpy as np import os -import random -import string import copy import pyerrors as pe import pytest @@ -142,7 +140,7 @@ def test_overloading_vectorization(): assert [o.value for o in b / a] == [o.value for o in [b / p for p in a]] -def test_gamma_method(): +def test_gamma_method_standard_data(): for data in [np.tile([1, -1], 1000), np.random.rand(100001), np.zeros(1195), @@ -285,7 +283,7 @@ def test_covariance_symmetry(): assert np.abs(cov_ab) < test_obs1.dvalue * test_obs2.dvalue * (1 + 10 * np.finfo(np.float64).eps) -def test_gamma_method(): +def test_gamma_method_uncorrelated(): # Construct pseudo Obs with random shape value = np.random.normal(5, 10) dvalue = np.abs(np.random.normal(0, 1)) diff --git a/tests/sfcf_in_test.py b/tests/sfcf_in_test.py index 20a3e924..86ff6cd6 100644 --- a/tests/sfcf_in_test.py +++ b/tests/sfcf_in_test.py @@ -1,14 +1,14 @@ -import os,sys,inspect +import os +import sys +import inspect +import pyerrors as pe +import pyerrors.input.sfcf as sfin +import shutil + current_dir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) parent_dir = os.path.dirname(current_dir) sys.path.insert(0, parent_dir) -import pyerrors as pe -import pyerrors.input.openQCD as qcdin -import pyerrors.input.sfcf as sfin -import shutil - -from time import sleep def build_test_environment(env_type, cfgs, reps): if env_type == "o": @@ -26,7 +26,6 @@ def build_test_environment(env_type, cfgs, reps): - def clean_test_environment(env_type, cfgs, reps): if env_type == "o": for i in range(1,reps): @@ -39,7 +38,7 @@ def clean_test_environment(env_type, cfgs, reps): for i in range(2,cfgs+1): os.remove("tests/data/sfcf_test/data_c/data_c_r0/data_c_r0_n"+str(i)) - + def test_o_bb(): build_test_environment("o",5,3) f_1 = sfin.read_sfcf("tests/data/sfcf_test/data_o", "test", "f_1",quarks="lquark lquark", wf = 0, wf2=0, version = "2.0", corr_type="bb") @@ -47,7 +46,7 @@ def test_o_bb(): clean_test_environment("o",5,3) assert len(f_1) == 1 assert f_1[0].value == 351.1941525454502 - + def test_o_bi(): build_test_environment("o",5,3) f_A = sfin.read_sfcf("tests/data/sfcf_test/data_o", "test", "f_A",quarks="lquark lquark", wf = 0, version = "2.0") @@ -57,7 +56,7 @@ def test_o_bi(): assert f_A[0].value == 65.4711887279723 assert f_A[1].value == 1.0447210336915187 assert f_A[2].value == -41.025094911185185 - + def test_o_bib(): build_test_environment("o",5,3) f_V0 = sfin.read_sfcf("tests/data/sfcf_test/data_o", "test", "F_V0",quarks="lquark lquark", wf = 0, wf2 = 0, version = "2.0", corr_type="bib") @@ -122,4 +121,4 @@ def test_a_bib(): assert len(f_V0) == 3 assert f_V0[0] == 683.6776090085115 assert f_V0[1] == 661.3188585582334 - assert f_V0[2] == 683.6776090081005 \ No newline at end of file + assert f_V0[2] == 683.6776090081005 From 0a1a9ce1a168728cd7ca9444676639466c8454b7 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Wed, 9 Feb 2022 11:33:16 +0000 Subject: [PATCH 037/136] docs: docstrings and comments cleaned up --- pyerrors/correlators.py | 6 +----- pyerrors/obs.py | 4 ++-- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py index 352af782..694dc9a5 100644 --- a/pyerrors/correlators.py +++ b/pyerrors/correlators.py @@ -39,7 +39,7 @@ class Corr: region indentified for this correlator. """ - if isinstance(data_input, np.ndarray): # Input is an array of Corrs + if isinstance(data_input, np.ndarray): # This only works, if the array fulfills the conditions below if not len(data_input.shape) == 2 and data_input.shape[0] == data_input.shape[1]: @@ -95,7 +95,6 @@ class Corr: # An undefined timeslice is represented by the None object self.content = [None] * padding[0] + self.content + [None] * padding[1] self.T = len(self.content) - self.prange = prange self.gamma_method() @@ -160,9 +159,6 @@ class Corr: raise Exception("Vectors are of wrong shape!") if normalize: vector_l, vector_r = vector_l / np.sqrt((vector_l @ vector_l)), vector_r / np.sqrt(vector_r @ vector_r) - # if (not (0.95 < vector_r @ vector_r < 1.05)) or (not (0.95 < vector_l @ vector_l < 1.05)): - # print("Vectors are normalized before projection!") - newcontent = [None if (item is None) else np.asarray([vector_l.T @ item @ vector_r]) for item in self.content] else: diff --git a/pyerrors/obs.py b/pyerrors/obs.py index 94748ed6..08c8f291 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -1301,7 +1301,7 @@ def correlate(obs_a, obs_b): Keep in mind to only correlate primary observables which have not been reweighted yet. The reweighting has to be applied after correlating the observables. - Currently only works if ensembles are identical. This is not really necessary. + Currently only works if ensembles are identical (this is not strictly necessary). """ if sorted(obs_a.names) != sorted(obs_b.names): @@ -1462,7 +1462,7 @@ def covariance(obs1, obs2, correlation=False, **kwargs): def pseudo_Obs(value, dvalue, name, samples=1000): - """Generate a pseudo Obs with given value, dvalue and name + """Generate an Obs object with given value, dvalue and name for test purposes Parameters ---------- From 8f2312240f18dfb95826a44b5112a67b2df30286 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Wed, 9 Feb 2022 11:38:00 +0000 Subject: [PATCH 038/136] refactor: pseudo_Obs moved to misc --- pyerrors/misc.py | 32 ++++++++++++++++++++++++++++++++ pyerrors/obs.py | 32 -------------------------------- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/pyerrors/misc.py b/pyerrors/misc.py index f7fa0af3..bbfb8e7d 100644 --- a/pyerrors/misc.py +++ b/pyerrors/misc.py @@ -35,6 +35,38 @@ def load_object(path): return pickle.load(file) +def pseudo_Obs(value, dvalue, name, samples=1000): + """Generate an Obs object with given value, dvalue and name for test purposes + + Parameters + ---------- + value : float + central value of the Obs to be generated. + dvalue : float + error of the Obs to be generated. + name : str + name of the ensemble for which the Obs is to be generated. + samples: int + number of samples for the Obs (default 1000). + """ + if dvalue <= 0.0: + return Obs([np.zeros(samples) + value], [name]) + else: + for _ in range(100): + deltas = [np.random.normal(0.0, dvalue * np.sqrt(samples), samples)] + deltas -= np.mean(deltas) + deltas *= dvalue / np.sqrt((np.var(deltas) / samples)) / np.sqrt(1 + 3 / samples) + deltas += value + res = Obs(deltas, [name]) + res.gamma_method(S=2, tau_exp=0) + if abs(res.dvalue - dvalue) < 1e-10 * dvalue: + break + + res._value = float(value) + + return res + + def gen_correlated_data(means, cov, name, tau=0.5, samples=1000): """ Generate observables with given covariance and autocorrelation times. diff --git a/pyerrors/obs.py b/pyerrors/obs.py index 08c8f291..a705a3a2 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -1461,38 +1461,6 @@ def covariance(obs1, obs2, correlation=False, **kwargs): return dvalue -def pseudo_Obs(value, dvalue, name, samples=1000): - """Generate an Obs object with given value, dvalue and name for test purposes - - Parameters - ---------- - value : float - central value of the Obs to be generated. - dvalue : float - error of the Obs to be generated. - name : str - name of the ensemble for which the Obs is to be generated. - samples: int - number of samples for the Obs (default 1000). - """ - if dvalue <= 0.0: - return Obs([np.zeros(samples) + value], [name]) - else: - for _ in range(100): - deltas = [np.random.normal(0.0, dvalue * np.sqrt(samples), samples)] - deltas -= np.mean(deltas) - deltas *= dvalue / np.sqrt((np.var(deltas) / samples)) / np.sqrt(1 + 3 / samples) - deltas += value - res = Obs(deltas, [name]) - res.gamma_method(S=2, tau_exp=0) - if abs(res.dvalue - dvalue) < 1e-10 * dvalue: - break - - res._value = float(value) - - return res - - def import_jackknife(jacks, name, idl=None): """Imports jackknife samples and returns an Obs From 570c6abf2a4ca2ea67824c627bde4d15b61dda0c Mon Sep 17 00:00:00 2001 From: Simon Kuberski Date: Wed, 9 Feb 2022 14:08:05 +0100 Subject: [PATCH 039/136] Yet another small change to openQCD. Added explicit tests for reweighting. --- pyerrors/input/openQCD.py | 32 ++++++++-------- tests/data/openqcd_test/openqcd2r1.ms1.dat | Bin 0 -> 2076 bytes tests/data/openqcd_test/sfqcdr1.rwms.dat | Bin 0 -> 252 bytes tests/io_test.py | 41 +++++++++++++++++++++ 4 files changed, 58 insertions(+), 15 deletions(-) create mode 100644 tests/data/openqcd_test/openqcd2r1.ms1.dat create mode 100644 tests/data/openqcd_test/sfqcdr1.rwms.dat diff --git a/pyerrors/input/openQCD.py b/pyerrors/input/openQCD.py index 5ded025a..acbf60f0 100644 --- a/pyerrors/input/openQCD.py +++ b/pyerrors/input/openQCD.py @@ -182,6 +182,13 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs): print('Partial factor:', tmp_nfct) tmp_array[i].append(tmp_nfct) + diffmeas = configlist[-1][-1] - configlist[-1][-2] + configlist[-1] = [item // diffmeas for item in configlist[-1]] + if configlist[-1][0] > 1 and diffmeas > 1: + warnings.warn('Assume thermalization and that the first measurement belongs to the first config.') + offset = configlist[-1][0] - 1 + configlist[-1] = [item - offset for item in configlist[-1]] + if r_start[rep] is None: r_start_index.append(0) else: @@ -195,15 +202,13 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs): r_stop_index.append(len(configlist[-1]) - 1) else: try: - r_stop_index.append(configlist[-1].index(r_stop[rep]) + 1) - if r_stop_index[-1] == len(configlist[-1]): - r_stop_index[-1] -= 1 + r_stop_index.append(configlist[-1].index(r_stop[rep])) except ValueError: raise Exception('Config %d not in file with range [%d, %d]' % ( r_stop[rep], configlist[-1][0], configlist[-1][-1])) from None for k in range(nrw): - deltas[k].append(tmp_array[k][r_start_index[rep]:r_stop_index[rep]][::r_step]) + deltas[k].append(tmp_array[k][r_start_index[rep]:r_stop_index[rep] + 1][::r_step]) if np.any([len(np.unique(np.diff(cl))) != 1 for cl in configlist]): raise Exception('Irregular spaced data in input file!', [len(np.unique(np.diff(cl))) for cl in configlist]) @@ -213,7 +218,8 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs): print(',', nrw, 'reweighting factors with', nsrc, 'sources') result = [] - idl = [range(configlist[rep][r_start_index[rep]], configlist[rep][r_stop_index[rep]], r_step) for rep in range(replica)] + idl = [range(configlist[rep][r_start_index[rep]], configlist[rep][r_stop_index[rep]] + 1, r_step) for rep in range(replica)] + for t in range(nrw): result.append(Obs(deltas[t], rep_names, idl=idl)) return result @@ -395,9 +401,7 @@ def extract_t0(path, prefix, dtr_read, xmin, spatial_extent, fit_range=5, **kwar r_stop_index.append(len(configlist[-1]) - 1) else: try: - r_stop_index.append(configlist[-1].index(r_stop[rep]) + 1) - if r_stop_index[-1] == len(configlist[-1]): - r_stop_index[-1] -= 1 + r_stop_index.append(configlist[-1].index(r_stop[rep])) except ValueError: raise Exception('Config %d not in file with range [%d, %d]' % ( r_stop[rep], configlist[-1][0], configlist[-1][-1])) from None @@ -408,7 +412,7 @@ def extract_t0(path, prefix, dtr_read, xmin, spatial_extent, fit_range=5, **kwar if np.any([step != 1 for step in stepsizes]): warnings.warn('Stepsize between configurations is greater than one!' + str(stepsizes), RuntimeWarning) - idl = [range(configlist[rep][r_start_index[rep]], configlist[rep][r_stop_index[rep]], r_step) for rep in range(replica)] + idl = [range(configlist[rep][r_start_index[rep]], configlist[rep][r_stop_index[rep]] + 1, r_step) for rep in range(replica)] t2E_dict = {} for n in range(nn + 1): samples = [] @@ -416,7 +420,7 @@ def extract_t0(path, prefix, dtr_read, xmin, spatial_extent, fit_range=5, **kwar samples.append([]) for cnfg in rep: samples[-1].append(cnfg[n]) - samples[-1] = samples[-1][r_start_index[nrep]:r_stop_index[nrep]][::r_step] + samples[-1] = samples[-1][r_start_index[nrep]:r_stop_index[nrep] + 1][::r_step] new_obs = Obs(samples, rep_names, idl=idl) t2E_dict[n * dn * eps] = (n * dn * eps) ** 2 * new_obs / (spatial_extent ** 3) - 0.3 @@ -720,9 +724,7 @@ def read_qtop(path, prefix, c, dtr_cnfg=1, version="openQCD", **kwargs): r_stop_index.append(len(configlist[-1]) - 1) else: try: - r_stop_index.append(configlist[-1].index(r_stop[rep]) + 1) - if r_stop_index[-1] == len(configlist[-1]): - r_stop_index[-1] -= 1 + r_stop_index.append(configlist[-1].index(r_stop[rep])) except ValueError: raise Exception('Config %d not in file with range [%d, %d]' % ( r_stop[rep], configlist[-1][0], configlist[-1][-1])) from None @@ -766,8 +768,8 @@ def read_qtop(path, prefix, c, dtr_cnfg=1, version="openQCD", **kwargs): rep_names = names deltas.append(Q_top) - idl = [range(int(configlist[rep][r_start_index[rep]]), int(configlist[rep][r_stop_index[rep]]), 1) for rep in range(len(deltas))] - deltas = [deltas[nrep][r_start_index[nrep]:r_stop_index[nrep]] for nrep in range(len(deltas))] + idl = [range(int(configlist[rep][r_start_index[rep]]), int(configlist[rep][r_stop_index[rep]]) + 1, 1) for rep in range(len(deltas))] + deltas = [deltas[nrep][r_start_index[nrep]:r_stop_index[nrep] + 1] for nrep in range(len(deltas))] result = Obs(deltas, rep_names, idl=idl) return result diff --git a/tests/data/openqcd_test/openqcd2r1.ms1.dat b/tests/data/openqcd_test/openqcd2r1.ms1.dat new file mode 100644 index 0000000000000000000000000000000000000000..cd5ee2c9b7db69e86147fe1926084560695556eb GIT binary patch literal 2076 zcmZvc2~bm46owxt5ono4JE&C)iWL!Df+QG|+-C|wu6`61WB^R?U zxKNn#`L@klcVvpuM`_Pa+dU7F8_unt&-`p}WypuZPxCAW#=7HxxPQgD)&>NTeyOeq zV!(L}XS&}m3gg^{Gc$m+HLmla26|FK#n8Q`eFab_fe5FPuj|)M?Erehow$jGs&}t|})l0%^Q6K&pu`=F;o}U<*tNQLYG+pH0 zf3TBEH)bd|PtpugVL#%;PGNTX9c=hKv)F2|MaS59WdD+I#*9xpH)Q-M8u=&46EZje zYuTeKC;m**EyzP^V7p)zI%vQ@GhcK`-d3)-rtU5@ai*3HI)> zcfir$HRBoO9yC(<+|_w;V)T+}V(;T0c=8P<_L5$EF=`&PB8JS~ipy~%$C@`&1N$*> zjPZ-QZQcdwbF^_CXYOX`cWu0PS=rH;N86_u_(YH3=MB)4h^0#_#(WM=>X>Y$Bz8ZsWYja^mudH|GUtY-#qO_oK(5To)j70_4{OcrJ($g-NQpS-i-GHO4|PR%k4 zk{{*dOWO*h=vQjViPH;6IL3}8!5thn?El}lVVI-yMi%`=!8IMD`m>az2!+`+jE&xw zqHi*x2MIWHy>ed7f;9ts_c5t(1{X3h0F!K{-hx7%h|95vBQEn=HVle4z6$KQ8bDk1 zEI(4~@e=f;6a?435Yj@Im&E?Lsu8UeTDK4~*mPUJ6V7J{a+I}@Ex7H&!!iC*n=s<& z2>UZ}Ij$HyFDdw0&nOxe*iaONX&5V?@#;r>p@#!Nm}~jwlerQ>Zc;*za1PWF#D0## zC7TUvGA>71p~&yGN&_yR3~Akc{unL!rz`WcaZdnC+xqR(u^d^)(ltJ0i%zub*X9e9 zsC9DMD7RgGsR^Ya+cK_3hT^`*9AWp4*=dvgCU$C=qn*G}*-p8kV+=TWi_^T+ddle5y8n_xYV(`vy}qzjFSV-+_R!xs$d=4drQBi~ z#jZGyV)TFzyi zt)-Q=XhydUzX7hu2Q`6|Dm!%3;$B1bLsS_e9z(aM)8jiv>#YLrqAbhEBKcA-E=NU( c$6voNVLuY?U5yy@Kh&qy=O_(*Hq)$ literal 0 HcmV?d00001 diff --git a/tests/data/openqcd_test/sfqcdr1.rwms.dat b/tests/data/openqcd_test/sfqcdr1.rwms.dat new file mode 100644 index 0000000000000000000000000000000000000000..53f0f2426f65a54d3cb659b8947caed88233f20b GIT binary patch literal 252 zcmZQ%U|?W`VkRIRJooS-OW{clT1ygqIG)DsX90?B+*&1La%rN&BGU!kpO%*HX9J4$ zZB@Ck&}ouGw#-85TVHGTa{$F2``5&^9-8EERO+LbXJ*}gE}+=$sP2>PlP5WB-|Hga z+E%-t2Pn4JOk(C{ddvY zi4H$3`gD-U9BnRiED%KS_jr&D_Vp*J0?qN?SIz*i>+;DSY!+tTK pm|OyP#H{&~9F+47B5S`j?Uw+G-C3FG%_cp`VM?G_v+;(;{Q#%rT!;Vw literal 0 HcmV?d00001 diff --git a/tests/io_test.py b/tests/io_test.py index f5546d9f..cb47c065 100644 --- a/tests/io_test.py +++ b/tests/io_test.py @@ -242,3 +242,44 @@ def test_json_dict_io(): jsonio.dump_dict_to_json(od, fname, description=desc) os.remove(fname + '.json.gz') + + +def test_openqcd(): + path = './tests//data/openqcd_test/' + prefix = 'sfqcd' + postfix = '.rwms' + + # sfqcd-1.6: Trajectories instead of confignumbers are printed to file. + rwfo = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix) + repname = list(rwfo[0].idl.keys())[0] + assert(rwfo[0].idl[repname] == range(1, 13)) + rwfo = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix, r_start=[1], r_stop=[12]) + assert(rwfo[0].idl[repname] == range(1, 13)) + rwfo = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix, r_start=[3], r_stop=[8]) + assert(rwfo[0].idl[repname] == range(3, 9)) + rwfo = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix, r_start=[2], r_stop=[6]) + assert(rwfo[0].idl[repname] == range(2, 7)) + rwfs = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix, r_start=[1], r_stop=[12], r_step=2) + assert(rwfs[0].idl[repname] == range(1, 12, 2)) + rwfs = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix, r_start=[2], r_stop=[12], r_step=2) + assert(rwfs[0].idl[repname] == range(2, 13, 2)) + rwfo = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix) + assert((rwfo[0].r_values[repname] + rwfo[0].deltas[repname][1]) == (rwfs[0].r_values[repname] + rwfs[0].deltas[repname][0])) + + o = pe.pseudo_Obs(1., .01, repname, samples=12) + pe.reweight(rwfo[0], [o]) + + o = pe.pseudo_Obs(1., .01, repname, samples=6) + pe.reweight(rwfo[0], [o]) + o.idl[repname] = range(2, 13, 2) + pe.reweight(rwfo[0], [o]) + pe.reweight(rwfs[0], [o]) + + files = ['openqcd2r1.ms1.dat'] + names = ['openqcd2|r1'] + + # TM with 2 Hasenbusch factors and 2 sources each + RHMC with one source, openQCD 2.0 + rwfo = pe.input.openQCD.read_rwms(path, prefix, version='2.0', files=files, names=names) + assert(len(rwfo) == 2) + assert(rwfo[0].value == 0.9999974970236312) + assert(rwfo[1].value == 1.184681251089919) From 25d00de5ceb47b1b64160a9fcd3e09d18599f427 Mon Sep 17 00:00:00 2001 From: Simon Kuberski Date: Wed, 9 Feb 2022 14:13:04 +0100 Subject: [PATCH 040/136] More tests for openQCD-2.0 --- tests/io_test.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/io_test.py b/tests/io_test.py index cb47c065..92e97902 100644 --- a/tests/io_test.py +++ b/tests/io_test.py @@ -283,3 +283,7 @@ def test_openqcd(): assert(len(rwfo) == 2) assert(rwfo[0].value == 0.9999974970236312) assert(rwfo[1].value == 1.184681251089919) + repname = list(rwfo[0].idl.keys())[0] + assert(rwfo[0].idl[repname] == range(1, 10)) + rwfo = pe.input.openQCD.read_rwms(path, prefix, version='2.0', files=files, names=names, r_start=[1], r_stop=[8]) + assert(rwfo[0].idl[repname] == range(1, 9)) From 7568275d5d6f1ae48b938c6cc604dadf43e8395f Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Wed, 9 Feb 2022 14:05:44 +0000 Subject: [PATCH 041/136] refactor: io tests split up in several files --- tests/{io_test.py => json_io_test.py} | 45 ------------------------ tests/openQCD_in_test.py | 49 +++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 45 deletions(-) rename tests/{io_test.py => json_io_test.py} (80%) create mode 100644 tests/openQCD_in_test.py diff --git a/tests/io_test.py b/tests/json_io_test.py similarity index 80% rename from tests/io_test.py rename to tests/json_io_test.py index 92e97902..f5546d9f 100644 --- a/tests/io_test.py +++ b/tests/json_io_test.py @@ -242,48 +242,3 @@ def test_json_dict_io(): jsonio.dump_dict_to_json(od, fname, description=desc) os.remove(fname + '.json.gz') - - -def test_openqcd(): - path = './tests//data/openqcd_test/' - prefix = 'sfqcd' - postfix = '.rwms' - - # sfqcd-1.6: Trajectories instead of confignumbers are printed to file. - rwfo = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix) - repname = list(rwfo[0].idl.keys())[0] - assert(rwfo[0].idl[repname] == range(1, 13)) - rwfo = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix, r_start=[1], r_stop=[12]) - assert(rwfo[0].idl[repname] == range(1, 13)) - rwfo = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix, r_start=[3], r_stop=[8]) - assert(rwfo[0].idl[repname] == range(3, 9)) - rwfo = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix, r_start=[2], r_stop=[6]) - assert(rwfo[0].idl[repname] == range(2, 7)) - rwfs = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix, r_start=[1], r_stop=[12], r_step=2) - assert(rwfs[0].idl[repname] == range(1, 12, 2)) - rwfs = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix, r_start=[2], r_stop=[12], r_step=2) - assert(rwfs[0].idl[repname] == range(2, 13, 2)) - rwfo = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix) - assert((rwfo[0].r_values[repname] + rwfo[0].deltas[repname][1]) == (rwfs[0].r_values[repname] + rwfs[0].deltas[repname][0])) - - o = pe.pseudo_Obs(1., .01, repname, samples=12) - pe.reweight(rwfo[0], [o]) - - o = pe.pseudo_Obs(1., .01, repname, samples=6) - pe.reweight(rwfo[0], [o]) - o.idl[repname] = range(2, 13, 2) - pe.reweight(rwfo[0], [o]) - pe.reweight(rwfs[0], [o]) - - files = ['openqcd2r1.ms1.dat'] - names = ['openqcd2|r1'] - - # TM with 2 Hasenbusch factors and 2 sources each + RHMC with one source, openQCD 2.0 - rwfo = pe.input.openQCD.read_rwms(path, prefix, version='2.0', files=files, names=names) - assert(len(rwfo) == 2) - assert(rwfo[0].value == 0.9999974970236312) - assert(rwfo[1].value == 1.184681251089919) - repname = list(rwfo[0].idl.keys())[0] - assert(rwfo[0].idl[repname] == range(1, 10)) - rwfo = pe.input.openQCD.read_rwms(path, prefix, version='2.0', files=files, names=names, r_start=[1], r_stop=[8]) - assert(rwfo[0].idl[repname] == range(1, 9)) diff --git a/tests/openQCD_in_test.py b/tests/openQCD_in_test.py new file mode 100644 index 00000000..d1dc999d --- /dev/null +++ b/tests/openQCD_in_test.py @@ -0,0 +1,49 @@ +import os +import numpy as np +import pyerrors as pe +import pytest + + +def test_openqcd(): + path = './tests//data/openqcd_test/' + prefix = 'sfqcd' + postfix = '.rwms' + + # sfqcd-1.6: Trajectories instead of confignumbers are printed to file. + rwfo = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix) + repname = list(rwfo[0].idl.keys())[0] + assert(rwfo[0].idl[repname] == range(1, 13)) + rwfo = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix, r_start=[1], r_stop=[12]) + assert(rwfo[0].idl[repname] == range(1, 13)) + rwfo = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix, r_start=[3], r_stop=[8]) + assert(rwfo[0].idl[repname] == range(3, 9)) + rwfo = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix, r_start=[2], r_stop=[6]) + assert(rwfo[0].idl[repname] == range(2, 7)) + rwfs = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix, r_start=[1], r_stop=[12], r_step=2) + assert(rwfs[0].idl[repname] == range(1, 12, 2)) + rwfs = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix, r_start=[2], r_stop=[12], r_step=2) + assert(rwfs[0].idl[repname] == range(2, 13, 2)) + rwfo = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix) + assert((rwfo[0].r_values[repname] + rwfo[0].deltas[repname][1]) == (rwfs[0].r_values[repname] + rwfs[0].deltas[repname][0])) + + o = pe.pseudo_Obs(1., .01, repname, samples=12) + pe.reweight(rwfo[0], [o]) + + o = pe.pseudo_Obs(1., .01, repname, samples=6) + pe.reweight(rwfo[0], [o]) + o.idl[repname] = range(2, 13, 2) + pe.reweight(rwfo[0], [o]) + pe.reweight(rwfs[0], [o]) + + files = ['openqcd2r1.ms1.dat'] + names = ['openqcd2|r1'] + + # TM with 2 Hasenbusch factors and 2 sources each + RHMC with one source, openQCD 2.0 + rwfo = pe.input.openQCD.read_rwms(path, prefix, version='2.0', files=files, names=names) + assert(len(rwfo) == 2) + assert(rwfo[0].value == 0.9999974970236312) + assert(rwfo[1].value == 1.184681251089919) + repname = list(rwfo[0].idl.keys())[0] + assert(rwfo[0].idl[repname] == range(1, 10)) + rwfo = pe.input.openQCD.read_rwms(path, prefix, version='2.0', files=files, names=names, r_start=[1], r_stop=[8]) + assert(rwfo[0].idl[repname] == range(1, 9)) From 471eabeb8cfe034fb5eee62a0de200cd27ed243b Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Wed, 9 Feb 2022 14:18:36 +0000 Subject: [PATCH 042/136] fix: Bug in export of derivative of correlator containing covobs fixed, test added. --- pyerrors/input/json.py | 3 +++ tests/json_io_test.py | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/pyerrors/input/json.py b/pyerrors/input/json.py index 6b854874..cdf203f2 100644 --- a/pyerrors/input/json.py +++ b/pyerrors/input/json.py @@ -171,6 +171,9 @@ def create_json_string(ol, description='', indent=1): names.append(key) idl.append(value) my_obs = Obs(samples, names, idl) + my_obs._covobs = obs._covobs + for name in obs._covobs: + my_obs.names.append(name) my_obs.reweighted = obs.reweighted my_obs.is_merged = obs.is_merged return my_obs diff --git a/tests/json_io_test.py b/tests/json_io_test.py index f5546d9f..04ccfd9f 100644 --- a/tests/json_io_test.py +++ b/tests/json_io_test.py @@ -242,3 +242,12 @@ def test_json_dict_io(): jsonio.dump_dict_to_json(od, fname, description=desc) os.remove(fname + '.json.gz') + + +def test_renorm_deriv_of_corr(tmp_path): + c = pe.Corr([pe.pseudo_Obs(i, .1, 'test') for i in range(10)]) + c *= pe.cov_Obs(1., .1, '#ren') + c = c.deriv() + pe.input.json.dump_to_json(c, (tmp_path / 'test').as_posix()) + recover = pe.input.json.load_json((tmp_path / 'test').as_posix()) + assert np.all([o == 0 for o in (c - recover)[1:-1]]) From f8c8b27ec3bf4090f78b239bee20586b7c5da5db Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Wed, 9 Feb 2022 14:41:59 +0000 Subject: [PATCH 043/136] docs: CHANGELOG updated --- CHANGELOG.md | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 73d9eab9..f2503841 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,30 +2,39 @@ All notable changes to this project will be documented in this file. -## [2.0.0] - 2021-??-?? +## [2.0.0] - 2022-??-?? ### Added +- The possibility to work with Monte Carlo histories which are evenly or unevenly spaced was added. +- `cov_Obs` added as a possibility to propagate the error of non Monte Carlo data together with Monte Carlo data. - `CObs` class added which can handle complex valued Markov chain Monte Carlo data and the corresponding error propagation. - Matrix to matrix operations like the matrix inverse now also work for complex matrices and matrices containing entries that are not `Obs` but `float` or `int`. -- The possibility to work with Monte Carlo histories which are evenly or unevenly spaced was added. +- Support for a new `json.gz` file format was added - The Corr class now has additional methods like `reverse`, `T_symmetry`, `correlate` and `reweight`. -- `linalg` module now has explicit functions `inv` and `cholesky`. +- `Corr.m_eff` can now cope with periodic and anti-periodic correlation functions +- Forward, backward and improved variants of the first and second derivative were added to the `Corr` class +- The `linalg` module now has explicit functions `inv` and `cholesky`. - `Obs` objects now have methods `is_zero` and `is_zero_within_error` as well as overloaded comparison operations. - Functions to convert Obs data to or from jackknife was added. - Alternative matrix multiplication routine `jack_matmul` was added to `linalg` module which makes use of the jackknife approximation and is much faster for large matrices. - Additional input routines for npr data added to `input.hadrons`. +- The `sfcf` and `openQCD` input modules can now handle all recent file type versions. +- `extract_t0` can now visualize the extraction on the fly +- Module added which provides the Dirac gamma matrices in the Grid convention. - Version number added. ### Changed - The internal bookkeeping system for ensembles/replica was changed. The separator for replica is now `|`. - The fit functions were renamed to `least_squares` and `total_least_squares`. +- The output of the fit functions is now a dedicated results class which keeps track of all relevant information - The fit functions can now deal with provided covariance matrices. - The convention for the fit range in the Corr class has been changed. -- Obs.print was renamed to Obs.details and the output was improved. +- Various method of the `Corr` class were renamed +- `Obs.print` was renamed to `Obs.details` and the output was improved. - The default value for `Corr.prange` is now `None`. - The `input` module was restructured to contain one submodule per data source. - Performance of Obs.__init__ improved. -### Deprecated +### Removed - The function `plot_corrs` was deprecated as all its functionality is now contained within `Corr.show` - The kwarg `bias_correction` in `derived_observable` was removed - Obs no longer have an attribute `e_Q` From ca040972729c4e09527275f370b5c8a722810243 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Wed, 9 Feb 2022 15:32:18 +0000 Subject: [PATCH 044/136] feat: thin method added to Corr class which allows to thin out a correlator in order suppress correlations between neighbouring entries --- pyerrors/correlators.py | 18 ++++++++++++++++++ tests/correlators_test.py | 8 ++++++++ 2 files changed, 26 insertions(+) diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py index 694dc9a5..cb40be1a 100644 --- a/pyerrors/correlators.py +++ b/pyerrors/correlators.py @@ -376,6 +376,24 @@ class Corr: """Reverse the time ordering of the Corr""" return Corr(self.content[:: -1]) + def thin(self, spacing=2, offset=0): + """Thin out a correlator to suppress correlations + + Parameters + ---------- + spacing : int + Keep only every 'spacing'th entry of the correlator + offset : int + Offset the equal spacing + """ + new_content = [] + for t in range(self.T): + if (offset + t) % spacing != 0: + new_content.append(None) + else: + new_content.append(self.content[t]) + return Corr(new_content) + def correlate(self, partner): """Correlate the correlator with another correlator or Obs diff --git a/tests/correlators_test.py b/tests/correlators_test.py index 1a394d63..2bbea0b5 100644 --- a/tests/correlators_test.py +++ b/tests/correlators_test.py @@ -283,3 +283,11 @@ def test_hankel(): corr.Hankel(2) corr.Hankel(6, periodic=True) + +def test_thin(): + c = pe.Corr([pe.pseudo_Obs(i, .1, 'test') for i in range(10)]) + c *= pe.cov_Obs(1., .1, '#ren') + thin = c.thin() + thin.fit(lambda a, x: a[0] * x) + c.thin(offset=1) + c.thin(3, offset=1) From cf137e284374aeb396098f3cc16c6f16ea7f8f57 Mon Sep 17 00:00:00 2001 From: Simon Kuberski Date: Wed, 9 Feb 2022 18:41:54 +0100 Subject: [PATCH 045/136] Added tests for t0 and qtop --- pyerrors/input/openQCD.py | 4 +- tests/data/openqcd_test/openqcd2r1.ms.dat | Bin 0 -> 87320 bytes tests/data/openqcd_test/sfqcdr1.gfms.dat | Bin 0 -> 157504 bytes tests/openQCD_in_test.py | 46 ++++++++++++++++++++++ 4 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 tests/data/openqcd_test/openqcd2r1.ms.dat create mode 100644 tests/data/openqcd_test/sfqcdr1.gfms.dat diff --git a/pyerrors/input/openQCD.py b/pyerrors/input/openQCD.py index acbf60f0..78d2805d 100644 --- a/pyerrors/input/openQCD.py +++ b/pyerrors/input/openQCD.py @@ -704,7 +704,7 @@ def read_qtop(path, prefix, c, dtr_cnfg=1, version="openQCD", **kwargs): else: steps = traj_list[1] - traj_list[0] - configlist.append([tr // steps / dtr_cnfg for tr in traj_list]) + configlist.append([tr // steps // dtr_cnfg for tr in traj_list]) if configlist[-1][0] > 1: offset = configlist[-1][0] - 1 warnings.warn('Assume thermalization and that the first measurement belongs to the first config. Offset = %d configs (%d trajectories / cycles)' % ( @@ -838,8 +838,6 @@ def read_qtop_sector(path, prefix, c, target=0, **kwargs): Zeuthen_flow : bool (optional) If True, the Zeuthen flow is used for Qtop. Only possible for version=='sfqcd' If False, the Wilson flow is used. - integer_charge : bool - If True, the charge is rounded towards the nearest integer on each config. """ if not isinstance(target, int): diff --git a/tests/data/openqcd_test/openqcd2r1.ms.dat b/tests/data/openqcd_test/openqcd2r1.ms.dat new file mode 100644 index 0000000000000000000000000000000000000000..e51976e7611f674fcb658143dfe19653917ce22c GIT binary patch literal 87320 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

#it;F0{(w#VE;=+Yiia`0;=NL00^2qs&ili^~P z%AghzI5hQl`)VuE_WqBcNpC&jx^v=-)A?MY&3$5~@3%AB6TRLV{Hcu)I;(-}v=xL- zQg#2u`4S>Tl|E%&gq&R5WJ)}&e9 z;x^);{l_s?W-ns&^r`1>$FqsrObLOXejaFuwRM^_riGwXmGB$RN=22HYixV(BZ&`= z#h-RUJ(1t+)|v3cM&kaV8+vNxCD=cbSx@pl3VqCzoDyWdhF(Nd4S7-35w_aVm7ZnQ zXgc|ww24L@I@G(-e0JR*wJDZe_tdW-Z12w4jUH}5r+K)@&YJoYH^rDIPWpt3v?2MJtM`Tk>(S9H z{!jdQVJJ+3-0#|o50U1X!PJhuTDOg>U$3b)qD1$9uUw`g5qUi>5jw@9Lnr-0^IvtM ziZ<1#;G0e8QTep}s!S{@d4E#dt1SopAf3-{p+MLlX0^6*uo>l=Wvv|ONJ0)0ukyk= zOA&p=6VAaIgn0a0=M>4Bk=l=({6g1sbY<{|mSj^UYM1&F#LU%={#+RvW@u?bucpb% zZY1R(w~j}T#KvpUWcEg_n{+o)DuEZqwoT|xSNI$C)k5@fugg|I9J5(Mr$bq8{lpNj~cW6~lq(`Z7~RwwlyS3g2mQVwxQc{ii! zcwRiHh|t5>_X#F-O=$4ffW(jVYP{!HyGrlSg5GeZkJ-C+AtEwdWy!S}(X?oa|FWt@ zzBt0@^RopB6fdd0@#{pUx_*Z)+P0upZ@UBH-gT($n>iDma4U*XLHl(5I#3lEN3(N8 zD-tt2&e^b2hj#KftkQW}(PxF)p)&t=gvok$!HzaGyDI(Uzs)+7++%!DZm9)H#Zncm z+-gJn-P`Zn`rVFH1Q<3X@#Ei`=)JJds|Bs*&ROs^wj#%fmyYd1ooM-$QPrWCTBIC7 z*YbU)8Br>QXvUGYqJ46yMelUG(6ElvC+M0at&Sx^h|x#LLHt%{Ju zQ;}fi+DcSQ1N*4)@k$o@)b7jDg1k2OoxDWWjfAGkDBk*&qbs?wcbQ!qk$l2K!`o}k zs6T(`d5n5Df+H+FjK51!-G$GpR?!Ve?_L(0@JcfhO}+Bg-o6{jRloUtRj~+tSo$JB z|F9k{fFRo`O3diJIO20azZ)G1+g~&on~TcnK6T75)S(CB*KO2wT2Pt#1twAIZnUDT z_4mf_H1s#lgrpI-Bb`;b)k`0>Amz0pOXjl()eHFTQr?e6ZJr7fg^9^ma*S z)S%7B`t`X&ZAj(9n<0baZHO=ALPV&2GVvg?AVyxd2L0*&{%QxcA=Zdfx3cP+(MKnZ zLdUrr!j*l7LX@cnNy|8SU(;+Ek5*Rkk#jAAimW{EXfMbWf4Al>T!)aVa(}|5r&h5^(zB#LwA@e2Cg=1CM-UJxk8L zE!a%7*326w-K<6n(d$W{eLK;oB!O=?_opEKn#RKmZf%6+@SjT=de!LHz>OOd*lUu1 z!>{F)vmZ+Nx&7zv%}!#kq2&3yKUHXprjGgeVkbI2oqBhGA&|JFcP)KLu$$=qJu2lL zSB1#*K7645hmX5K)sgBucL^H&`Jm+9Lr|n~NlxxmqU0#v!^e+wp|dFian+S@kH{;GI{R-4^q^+>x=9_zEz@6E-;XSZoCN5OuAmG0Sh zr_pj`95vr{VyhEvkY@$i43`jpeKTi9F833StG9fvetL*=jT;R3AWXw z4Svmj;$qN$TUb_yrtmgBi%lo?BA(Q;-6oX^)gPy}~cz7KOTF(5@V!g#EYAcPasr$-ABNrJl&xdgub zRbg0qV-exiV}I(wNH5`-Z4=XVyAU-N&#X>;ZbwT0cK&5+6%qgH%I5{bFavwWG)lps z5WU=GiJnhyN4XIL%k{4c3GI$UOUXjL#6rOJzfYM9k;LMXQ#EFY2P~8-eqAXfXcQ=J zw!i2h8hyVfzFjXs5$W5<_fNN>t=pbFetWoi7^s+eH@t`7yk0}|YPbNYKd9CawuW~Jj%)IGZm{T56{-q$Q_GK4wMDrb^%D;S6bB5dJ!~JHY zG3C24=b20BfAN>Y?GVD@6zv_>G3*Vc7ACp*tqI|F?}S1?4nb+;Kc=wSLDU}m_9r7X zA0;SO^MGs<(q??|Ybhj~P=8nzb!WMqAP$O%WfTe~Qjrsfvee)3M(x1y$zSW}? ze?9ZL@J!+lwR%tS!xqA(OG9N11%+Jwo2`Mg?)ZneglUbTRK& z4jTL>wm)A3e{Qm}tHlRq5Cdnr`z>9Xh_XTo0XD`QRIk~Q`yI1$tCI2T%Kqtuhig8Y zg;FCCM3SGeeHJ%pf2-A{CSwL))Zow$?=(WtqTi(abOW(}-)S3_vsq~OtEo+hD{d+K zU3(>QHI>L@Il|t*g&AR9P18(<`)DzwF4(BD674@lF4p0mLKNuVyw5pXOH^q%=WOiW zLyq1|yv#ozA&OC>WJ&jAVsJ`#N4=?rcuc}ZQ9hA@OlWjWwdBi@{z%+mmn(OP0B5;D z5$S3|i>W5^d`>zl=Jnw^mso}l#^!|`xt2uuGuRG&p{*pARU}GF9nz3_b`uBbN-0{C z2xwXPok%bRJ{(v4Q%>w_S@w?NN<}B~ZUjBkDM3GPx0`n0_Nx;ZeGb_wBl6g_OVCO( z%5$Adj_N8xQa{~i8I4%fM!F-t>in)&ZFXv2t{%pmhT%6r86g5lqxok&!j^~y`dGzHlb zc71mvf(aRk=xNbMX~fv|tI9m*BGA!&`}Qe4c+MO7Aq^7l_a=oerNIw6mAhxV)8NUu z=CivMX`p$=oy@rQF7DVHC$@jT3kk^nV`I!+Xy7q@s8M@B$eTsmspJ{F|NE2>GdW8jFSSM#FeE!gszeu>Mm zkUz5j)h<&sy!^#DI!k&JxP>XreM)a)S38Str$7WOAt%{^qDT;X=wfDO5f0`Zo(-Pg z!=X`z(P>sN45-HrZm%|nL)(OwOH@M$bi|gDU3?UZ9pH^z!y>_OLePgzR3Hp~%j4ui zK_CE!PDrFt5PW%)o_{9y29)Vn7>G>-Lz&SZj}VyvnBoia*UJfj$9VGQ!u9JAmndO2 zR~ZO4I1|37=MSGfe%&~2>kkt9B^d3nuS=~mQcL$m09>;aZxibDg>B_>k1wIVpsTIU z#K_<0 zrj4oVD)wH`^-C+VSJM-;F1!roEcAq9f<|vb<9y(&=I6>!ahTDHsY)WLx&nt48*OMF zT!pay{Ij-s-f%x#@y)NOs}Py(Cl|cw4lfoqx1}Ynz+TpJS^j_*o)=e}SfjiGyd&!5 z`F8lC?_nX%_D}ARFRe3`^V<`qT!#)ED{zNA%6_xopIxEI7!>9Y-xnF2Pp09A#=2ejSVTb35fO&=G8;xvv3}CO9$LcNc+L~${DjkUi6O~-5|2Y-EKV9 z2`CF`DlX%_yo%w4V<#w`Ax?mdlhxi8&Q;oL9m9{ioba0U@_SpDysnBB`cCkwiti@# zl}kV|zT0vWH-Gr}G#s5`@Sa)Bryt=#ju6uGd2kQ6Cy)KTEqrjt9#Zjc!+Mw%+&-4V z-qqs(3Leh)_#QdKyM}++L-O{p9CMEDWRnFfZv1kap>}|PW1=9l-~{s5(bv`ASiF-v3t}BIs;xY$ZXm|-u)ad^UjN)>-d6mv&s(KKfTKf)pG>u z&;rhIM_bTothucbb^**toEyI#z>S~pJ6xQp4xmBty^pHX1{$wUdfat11=5%F8;2}# zlk(`p4{>ktp5_wGEr&j9h`d70A?0KOhvG)FV_a>3DzLFMNz@(=1u=w5E?_UiJM9qT z5Mu~`W;A1i{R_#rs_0}B?4ZMH{ub3AOEAp5w!go^2tFF+YZiX81aiL`%?Dp?p?~Ez zO#`nbSSvPXeEez%uPUtn1a(+I*%v&?I~8C7ffONfNol^nl6~_ z{eBeGirKgamA@yaF2bO_e|K4y30xVg`BHXS2O5IqD*iDT!_dpsUOnvjx-uBlZ2rs` z@UQ;;bFwx(o2=k`dD95!&-NVtEOY_fKkp{@k{g2-b0B90Zm1**wzezo7{V3K`K9m9 z*cajZ>HG^$+z{Gb6k>UWy-<8kcW(I^LKuD9-o648m>`MFIUtOiIkLCDj_zteH$!vV ze}4>MeX?ed^^Gyqe|$sD!iCv1sS1zNH2y(=jguUeAC zy7`yQ2yGC|JtF^2L={RV@8%>}>ch`SX4bi5hG5V=qa}x#HLciyAa_L-5EV_-dP9o+ zUZQ8dy!SGIu}*_ToqRP&jAo>=w@`+kJ7&t^PUj)BKHZG;l|DSZ;_Ypmj{O5`@?I%X zN}##*@Yhw`SR8X@zDJ8$LE3S@?$seBU_HvEQ{Afwx=TMI5@hrsJAG==FaJDLG*7Lj zi7CRV8|My~9ajXqUw`dJYIR{QAn=t;g&wRPvwfmhNdRc;H&pon46jCp?4HBkEp&Nl zwoe!ER8P2T^rl{57U}DD zbgiroX8B6>o{{Q6UhOZ}Hx|-xmOQ6)eODeX`bmp@8qkK)uE!fAc<=GOL(ZR`8cFa8 zxEp)woIG?gMC)1My}tN_;B%?cT5x|hXglq!1ZeFVkR@J|1F;nxjhokk5=-|sF+vlJ z56@<@;P%B_VA6A{VOdD^Gk8dgS+)g`dnPBK0RuTAFaLRng0IFrSt*w+Y|e3UqGx!I z^e_MS#6M~PZM-Te{2~x$k>K_uK?c~Fq)x18Xad`8Tm5V7KWJ>1-u;`LtfpTPZjfZtA$Fs}2l3`)N&P;xLG#eJ z?$B)&C=K|*umw`^?XRDK!7eBKu70o7SR?^sHsSA_vG>dHsfdzqo;c)u*1Uhs^FKHe zbHHQ#pai(jI!U-(P=?ZdK;enKSK^n9R3gdoHR%s*ogz-+AZvKVR1Y@;tF6dedoBt? z)YsVy4y|m^;c!gWxk(H@l^mmu%~yo-Q-wZ8isyh~Hm$lgiWQ18{S@nVM4>#Wk@0Ii z!1Yg=uYur)!szM~A`{Fo%762vI=?8;R-J3m@E~B~lBv+&RLmF!Q3@VwKMf+ev>y_* zML^@SE}sQH9|e8TmnI=@kcivmC>&&jORm*6nI^(;|B--QE2%6na{`kN87IsMb@ThJ z(L=LoV(y5h5cvC@;#13(g1t0@!Foy#*f03sHQIBhV9NN}<_AMTXfSPbPiBz-n{K1- zqf%_(SNy1DJ?aEdJhn|v!Fv}9x^hdI`J#{%5yfW2zydR0ZuVYTKMvM!UwQnv&I`%3 zzI;zag&|(rQ-p@(;LrD@1!tzpVCp|ypm)lD#RuIS8hgfPLTo^N06`87%gs>M2j1%)4?x+8fThn3aH7n z;ku{2ADW8vZq<4ogY}>8VaAa(a4>87ma+mF#7=)T(JS5up*PPiDvnSCDXU(vvE>m^ z?mIN%dGr8u&9jae5PQU>{->Y1fD+!@rTnwU&wFAhSN01N3Am?ZnN|D$CSF%Co1_Sn z0|h0w3(pY>;6EN4NY}nc@Q4;jKl!>%oME&T@{KzHHYviwN zyKk7;9Cw66-**N1@$DK}dByqe4)E5x>Dw{`ZZ?K^WF=wNzZ0Ca9`rf@UE50h!_W3G z@H)$hq|^b@x92&tEF7Sj{%hxRM+b0lIVF7tGhla;YT{LKL$Ox#+WwtUdniTws44e5 zz^ftc^4w1B)e1K(+^S>|}{KuLZ0 zwh7SW8sQunRlprmNrv1#n-Qg6*C$Fm0Y)`evUtgRsBL+^vy94pv; zcKvH`IA+KGbw(agLsp(Esd1tuMb7`2URCzH`kC-UjF@gugX`rJUFK3(FV4ggQ7vCJ+0>SXP3Z2QI>F z#ZKc_Y7^LNAiMh7@dDVMe}5?#dtP4{HE?#(UIcmL^Dpcbu&*`P@{!m_Q=l*U;w*o| z0$O)?{*_u||Cnl-D6PK{_WRy)>AY+TeeuK}p+$2DW1Cx0dSnWtlkOT6c)ep-$Nj-< z9W!11ciXwu&B05tRPWxd38?0BB#2`V>^I0InesP*7p)#aqUC1b<8vzfik=A!tg0;@ zH8p@I+b8}6{4<7p|x%`x_is;3bInb5o~9@7KEcm703ff3lh zGXHZ>>H-8Zt*}$SF@*Sc9ECjjx)6Ozxu-+O2nOpa&u8XgubQM!VvVsOTnh+IvyRpQ znc~T{s2=Qvy~upGlF}54eXcn6P8dK7nRiWSm^K*P+H43jGK9hrt#p4sd>o3}WEu?( zu*dRTc^LLG4GpHPIW8MO>!Yo$W6Q>{PE%d~c|jj?u4QcwJ<^2onC8FaHw?i2d1dg; zi^d@9+Y{O9q!0dSRhh{P8lar7OJRA$0DQkp(mxwB0@mx%xy!g6uDzN4f$f9_T#$^s z7g(eZeLZJ04yzeKF7sOG^s)0$zVLTv)KVP+pPzi4C#?^0={Kzf@bAHbciNX^^`Ihf zk&3)p4Fp)CZI!Se)}EzpSPFk%+3OShJL{$kx-pfC7F23r>ue4)GkPE!*PX%JZ2;+e zf4*JK)`1dpOGSSVRqz1zp3y^kz#p$;vZ`zV?PRA-62`S5)Fk6J`!md-Ut3*YQrCsp zrW7k{>|N92B$SUI(8l+Ry{xLH0@P{(rsc6Z@Z8dCSkFiw(pzUOKZ|R@L`0eMr&eW< z?7MB^jlHdHMRA$?JI_O;u(|6mXH9s@uEi-WtPFqs3ZmUvw83KZ*n-0|Jy1}2-Fh@l z1DKC_6@@&)t=~Bps&XGKpkR%s7v9u`D-PrQ`>|(LbwlPU3y%`m6rLF6eTrv7XzGII zPw2w8a1-71_iC_yo%i7VQbmY*Cw%;^peAh3S^14gVXvB`pjR1*8f-;Teh$KHRk2mb zn^ydMt&xYwlC88stE@g*k6snt_8jzad;oAQJhCc#zXrThS8?c%)B@U%M-wQxRe&+; z%DtaF09J|FGY-D$aFZjaNf@6GJHLe9t_UcD_CKG>fkVJRj9?I2(vl~<|bD1pxa)TJ+Ouw zh_u%c9Ut}z-@@TbR)GFxCHr;EGHHLEtO)c|g-u2^1zHO=h%u{e;TBbZ>9=1D65SPS6_`}*Y2{Iu z!LxZXRts^`u+>OrX3ePru5Zdj?QttHgu91+F+d7ZqZ599s*r;8?uVo%?aFY8Dd0?) zx-yIjb$=g!Dgo<*97;c*O9IpNV=_fX%5We}>2y#6Zae<|uys~l9BjH0=e$o!g0_sa zN%vPJ&gsxNu$--wpyX5n8r8jjwD@vSLEDnzVJ~60M*cvP^SC(BewC$pi&?3oul1cBE)noJ z^4zOZYatL`)~@>%C>p;wkogKea{E;7iDh>Rabr1zvzt=Bb#9 zihy8+=4Eac+=~2B>^=^II1w%3Se7Bv2;c4R|i6b|#7q>fk z-{U8kO{x>P8%)IsZ>QhiPyHeUAs&qtao6R5jGabBP*W5x3Ebq|tKk5NJBtS!uL=Qc z#;eE_cUgE|(37+}DGXN`JZ#x6V-_YuC}QiwIdD?eP~yci8zb#~8KiDPKxf4CVqBUH zLIS7~g_i}v#HG#UlC(68W|-%2@Ckx&!N2bcXIMe_{8(f3JM5LJiKjh9Ck5Jdfeby> zeDMC)wnG#zGf>IiTz8q}he;I<^{XFoyU{-F5SbG%EVsQae=mO;w}0Qzt90|hhV;=) zar{2>AN+kE;vgX@|nu5i?KS9-1HL(}ch({A-N1D=V0*wvtim(Lt;;bqfpj&B~sj+`Sbc z2sTPSPfd5vK)}1dp`#nL@Ry-&&obJ?D45OF8IeUG~%9k66~IQ z8{7>%0@kP3=4V$}z(X`~=&#y;@TNq;$oMK97~Qf@=aHlaS^t#Jd^Bf3VcVJW3kf?2 zKI+yw7DS7gs>Vb1hpC{=x+Ys)pAj6l#og*=Sm3&DC!I(AF~}=noUHgqfjz?#D$=#5 z;GMzbt-6D!!O&t~voiM)pfzdLKX#NH3Z?>{^~jxoY=s?4%R+h}t`_(WiX8$U$uV;i zIZ{|y;x4G&riHPe314;dPQV|-{QA?k4?>ibf7d8)oN63RH(I0yRbriE*OeYmM zTAj>f)I1Db@wGO5B>N$C(YfoT%pc;koto68J_^XGoAOZ}qy)aFcSWu%?1RyFT|Ym! z?GQAf`!{!)$sn>zvq-ar9D3|7OuRApOK8W>sO4VWBFHI3=uZvrholoD^(jY5LHkk) zjq3GXLUUS{STorqv?P2UWj5j0IeWL$po;`3I_pwMRUZ|@Rk3VtwL`1qSx)7IWDivCH=i0JlS zru|N&2K@9^s@Wpwl0Eqz#g!p3wP%8&!?3q?OQOyCSRpE2&;C>**nqAV z{CPLsb! zN4#ZvvN`}+lFgQil#<3Ym&8*4X`9T6PMldd6bBQq8(B&rCz7spM>?p6>Cp}Gfe;r2|_ zcgxSoKkA9AR8-{wmUV=@_0BxYY&B71>Gt|)YY#G>_?*us)l3Aour}B0G!XaStyIxb z)Dk_LUhkLcdJ)rIzDtz#twfy)eRREMBOyCm8mS~yM;PxsqaUvBLua+O$l7_^iK9Wi zmn*Oz=e7KZLQ!5lQGRl@-nO(K$t2o*p}O5p{2)2RMW?h7gjiyDmtyMl~da_Ru8 z4>z74e&0rPeoN|1kZdFp`_>N@{B0s))s3b5uMeV#QNmvMY6WEAccoEAQA*++tdlVULY#APD~~ z)t#VvLfUj9QYEa7m`-#`>2DlH2L~d@M9OQ4(rymLTSIjOsm;Up+)Zsn0u=QATZrG67oXIGjG(pZsfXrmnZ)g> zGvPM>DhVgG(lK+-CcA(j|HWnD+afBWR_llBDB)rK?N$yG&OqbHOi|0^ZzQXUsp zveXbuMe@Q8-=823pCguHRAGprc~D?jq=+CXIkFNO{fNj=E!L;g97VoT&B@G(3Fu|$ z?0_3xJ~1ez6L>7Rl;8|BP%q8F?X80F@#n|W(C;-KzB3`2ge-aMZGMUZ;=$#e-RRse^_y&){aPT)48(8=!SxwIP5=_j-jx@;JYN5r6~Ov zd*=G38|dd<0X;#gB(y8zv8C~N3=LbD))IdnA}e3E0MT1_5ODz*9&2Z#b3#M*A6|^1 z_Rqn?kJ~HJ_||o+@iUp|$2+gv@U{ql`cq)?r3D>5xi#-nUWJZIoqgl6T8Fr6mPaCn$I$W7 zIjh@eFyplum&agNixi$4REynjK=1JK+;Vmd{cDMqi;6*rJNELKKJ4>JCqLC^a0a(t zNldxsevTntF0}_t2|Z}+$@dc<=^K$Kr9VeTXftYCe=~oB>nZX-L%Jkp--kk#I>)|t zHzC21$U6}uE$EOwWzYUAPZ8%ap9nFT0d!PrqBusS1-Yg5_Q#XAq3M&)m4Y8XMLi*V zk@?g^=qt}zHnqZ5w8M1xzgC%clo@oPsYYTPeY$)_u@$#PU${w$D9*Pb5f@=MTlWt1 zV8I~v4sLRme!WPQ9WjE0KPF$Cf8UP0_0Mv0$TyXHpXl}k8g*{h`%5u_R>}SJIB+9&_Y5ar0`wrO zE(7{cij!!VkW{0Loj|WG6-ru!y3l8_vr*IwJxKBB(Vnr`NmQ(xvTC(4fsU#zl`S9b zLO-Hi7S~;S(WOH+bi+?4(PUtO^#{#K#MJx5<-e&;#Ilq#)VJ1)IECcHo*bP*_GNsB z&)uFxRQFXF-QqhD#dvHdxkDe4{JhCNu04f%M44hNn%?&~KVK7{ncltS)YQcyoiH7Wl5i)tF>JdNQWO_)RnIff(as5;Saip_To(f#Pp13C4& z6Vv$bAgj^WXcDEd1`2VHbRgfab-sGH`q6=Z$NzhXZy%n1W0FWdiGG_6#tJ!gpciv; z?^h!F5tZAFG8=w;SM`Wbwj~otzcv3_!>e{QW#0cu$iE-CnM5fn{Fp-IG;~E%0=QWy zHo_Py*^Xj{KgbC?^&{Qf-p9X2rx0D=K8<%WxLN4VkuvPphSu+#SGcXykD8tZjMHRJ zAv2cS75unSnOR3azn$BPN~V@n?(_GfhyHEl=S-&1iz9cqqtA~bHvy96Cv`1IE|)wc zowOg#?Y}zs;ol_UW|jHq6EuPvkKJpNYiLG}=>c$Wx(~%Kd@o$hm_$Eh%-YG^hS6`P z=iBd#n@~WN7)#N;K2)_YFgf5fK0lTWwv(6#Q8AOev}bf9l9+40{J^jeHGgY(dp}_U z-TI?dm+-I;iH3b26SinTec=PtH~00S{nJsjQVZiqesx3f1ZNL26!J02<*G-vr>Gh! z3wqHzH*PYO>rc_62?ePNmrm3?Z~8FnYb`p$yU$^tXfNs&@%(x7-zee;P3$t?XhC14 zzi{HeSY$s}8zb1*gI>@37m)cqLEf;n;mgyAIDTH(K5?`f`#2+qY`A*Rus`#C!MBgm zYx0bA!P9l9ygY}i{b>dI8clZDH3~QQzMYGvQ5Z(S2OoDIh^t21vD;6x8p_eO4#OFX zLWFc087}+B4I-rz&!Sn$D^PtNe}>#Z87k!$_Ew|m!cD!)pK^No5#tisnPSt2=wau% zsJ?vd;-+tdqab)phE6#?>+A~d6=O7bMG5UmG!31)IM zp^tyH*FSb+hE45nLFvB&H2Zu{!b7D1*{5&s_|RBU7iBlMztt%sdlD>zZ%&aRNdiq%RvjfR3_6SImrIMZ*dQ+E71x0nr79aQnXTg zkogJoee^trA?9jA7W&4ooXkE}hH6_cZ%@nWt6J{UOQxLaQyK#+OGIHU0`i<&<4^h)qpm^4&L!TfL zC6tT#4;V%e7vhOM{(aadHlDz8jV2zghSg1+KM{x+O0&IHOd^S%i@m2L=x!jbh|tGj zhhve|k8f6}#~YEAl^*Ln8A&v7>slS>_eB}F8EB^+jS^pRA85&QMGv!&NPJ_8AOv$i zl%M7DLaayD>HmLR(fy_&nHuq zW6h#fe=UTFK1{Oz$2DiPk0etfj5HK&byi1qjOrr)FviYVyFlWb*J_QLkUbiVvl|(A z4n#G~hc5h@QbNnLK`UpjTqhigi#zBetD2(Ft+hxXq!!oJv0zew!!n)#q~%Zl+7 zdZI+7U-#LQ5K8;9N08{FAA^jobV;75p>F)pE7<6w#f%qM`$SvR6#iv3n6i*+=# zAL;pi&n*JZ=)dvf@r(dF(v0AQBayIl>ECZ{)=20QzU$O8779G#zu#ssg+XA+!mX&_ zFmNzS8R4x8gQA?POeJ%HAU*hG^K5Al+;U|XzH}fMA}$ceHg5*Qk1JvszWLX|>rV4} z`b+?5g>jQrVirq@c2RTI=?2jJ{`6*a#~0X@s#51;{XtRMTk)2rKM+wBRl!gE!6hxo za=h0Ejxw9RAt~^M>+hFib-8_^dp@+LHO&`}Jv?+Rbjb@e+nx^kkX!?sV&+8?OU!J2 z^p-tb?E}g$z1>v|Jb}i$>_zB(Z+I$v@7{xFUSMrL#l1%14WVDjy0F{{pDYmQgafP$__T^fbSu&4oupe4=gz@R;V=ez&Vb@`C zh4RuR_}xNzVtT+Crp>ZaUer0jX6E-t7uzmDB>e`pn2-yEoKSSFQgwo5-wzFH_pwK7 z@!PSeyDku^=|sew#J(+@jo|<60F#|;8@)MpkioFKAQbKlBPT?(^XZ-7sF4U&N{u~k zOxWVDI<~N=BoycohH{0fVMLNhbFlp_f6jL&Mnt ztQ`%oQ`8pf@{X##l(h!obDdqMIvhYrH79c9kv*_TZ!AP%HtDjo00Uc(B@8OY|6=%P zkFR-i=u6|~AXTSet>>5(oRiEieQ00-*_OhD0QN5M3vtlPJJ`XAwIcRFQ%e|ue$}!dkA*yjG+wL?+SNI4a_zop|cS zjxICU_xshK6_yLY^pHJ_)6WJ>S**=odD#G3Fg=i!auK@V@%@%Q6WE}Ue0b)Q74W;i zJ@wqh8lI+(IIsj<09D_YhPvLyuzZ<1hTPr~ZpX|vG}~JN^L1;@TkfVHvPM3A9`CUn z*`k=Sz|F$=7Y=fIc9>QA&eh(Gy<3L-DYW7whH!j?eyP#N477PHzX&>5z{yS7oPEB= zKuOD;SGcSXZz7A|F&)1Mq;Iy51YRL?vb&X&mHzZ)O(iA>QSCQH?=tJ_! zO?lx>4N%+=Y?IeEgfWU&egDQy;J=eEOpEjNVDIu0U3Q#0RDS)y^}yT!VmUMPns$w$ zGgjR$v}4M1AI zWWPka8l;e3I%xJBK$>wlu^qEADN+gUz2ms4LPxCF)vLnq1uk*PT>^N=YG0u`4bZFM zRbRuNgFpO-K%$#Iv1_dWLD64|YYWtYQe`HFGweL%a+@pfTU3TEbAw^ZcXIG1 zH9MTH=>NxI+r}b652WgcBic_Y19$ICuz!dwyw7?j5!9#(H;dR0m}3UZ?wJa6o|O`$ zjLd#B7sqqb;<3Z=c+ctCCt`Hef2(O2$(aTglL1_!&Ir1_m4E~PE_(iV zM+q2K_)n7eViu_+{1Vkk0MDYGLXI!uz-AcR{_s7Xt7e%CJHVp_rgZM%x3vhcNhr5# zCl`kwV%3cQDJepFla|Z-dwB29+Q#K?hyo;YbTjq}i^1&6cXE{v0Vev@YU__{!V!&w zaqdI%P@=HK_W^r*c)yxj`7mJL)C6C4T80KZ8`$aEW0Qv$d%jAau(wCwOm5DTjR5Tu zYMM?C4XF9@wt*x;4i4HKF{|G%0&^o@M+(m1J)^49w5!ePz)n5Dyh4tz?I+17%i9P; zj(!Z4DwjMkzjYu#V5kmLb-0X}C<|A&Grr#&5P~8e!BkZlIoKeZlzRC?4UXBd*vzoW zLJX&A!dEdN=rp(eU4Bs(a{oQK?~$nnEw&qzcHJ^SO8r6d%f)kWIdfk?dYBB5*W7t7 zuBryJFPv__yd(o$zP{4Crh>TTdXWigrD2GPHn(dNvvXhkuV^yLK&`JDUa$&)Qf>zO z#wRJ@8PU|I`8VRt7$kYB_fISiZZpux&Qm}l!{AZ*pFVJLW$1J&u z1ePP2&zD8v(O`Qya(3rU}?7e ziW?{|GVG=Dih&W0kcTw(vMClZMV`Hl=j)Y)(@n&CvkzqsNo^+T@iTHv8t4oqztcbXaD`BCj|#2+avOSa6(5T!5?u+1X`v~ zKby2x1_~lmu~AG4TEZC)*qd>JG|ex~)dgV~_u)yQ5mbi%QFPw%RKINi7A=IxtgP(F z$e!QZ-g`tgWk*6rMoB`*&dlCqm7T{-AzM)@<0mTZq_W=U{mZA$$D!k#+~4zD_jR$j z+LJJyl!0Cg{qmT8Zn%AI*4o8D48-LX$&c)+z|&?oRJ~sYGoS8}IpW+PH%!e`fuARf zukHx@kE#H7E~4^Pl1;x+scCP8R*4M2Tdx>Kwc0yLX(W!E?v0`?YPz|pyY z2ZDo)J$Fd3hwg2t{Wr`?23%lzQcZdSM8x{8O_y*3$(?!4U3q+F$iOeZHz^5AR64X$ z|5)H8{o-PEITzIKG{{}ER)U}aS8*f!eD)w6ItrMXTWV?8Sgtq)o}!}BW7dk`HN1Q8 z{6`7+Bk@(w|1A?#^_}Wzui%77PyR+&%P0Wq89icYA^|&m+G~%87=gltt-ZIL11QAr zGt+*S1G5)<;i-A}OtDh>v~3duv_4JkeW%Y3@+)!v+JUmL)_e5(`qQ&;%^`aKzf5{~ zn-tF=W5^1|AB25gypVX&F6<4=s;t0FPqw(1th-y`S*=a0u0jQ{|lfHfpv$>;!kR{P^J7bFgBJ6#wu7B zL(X8|#}UK#Vb~YoOlHn_B+40jXVNT68Jxl7ymiUXbaSzLhA z(~nk*mN1JIzHjj2JKSE}Fc94AbppG5nq_#78M1ixtFEd}&>nx|M4Xxv^w|7tOgilZ zoRcXhCs>?;tl!EzGRYAFLvH>jorOQ1JAQgO5;q#(2iHEuEEv}zKEC^74seA<`QFke z?9ZwVXz!SGfW1>^E2wT^pVzuH8S^0rIG5*uz-o`drjs8~A0T;vRup)c2Bq%+5#HLVAgm zNFcu*d^Vvbf)lKvC&2vaUwK>LzoarVCt(9gw>X~X725!BaN6!iMeJ*R+t@Kt!xv2`n;irht6ZKftKC@%%Xqw7~~{tvxMlm%+*7GEI`5M)od>I(T37&)=@2=gQKF3TW-1M zKyb~_EDdMWK$0>-c$=9@#pMWl{AOrkta?F^;?3bry3z= zYyppGAHSButo!~)z9U8+X25+@?!Y7`X1)fUt>-GuVMj7x{dXhwRgp_<->fu+(R)HO zDDoUg_KA3S(3^uPclqm=v$%P!A6nS^-2{5}Rez~?Zvm+d-Fqm(4ETLs)83^tg-13a zi5<$gnfO`fQ>wlN{%F({dkoKyI(ycN*u#3uA&dQdrZMPgav!K`!C!Z8cgO_$wxY5J z46V|Pp+dXWzU`M0s5faJ5aKZh_|=rpgd2^|1pR^oKN!KA%t#es3nS3%Rq*G@FauK? z>esKAOkn6!=S3!M%#?EO14(30sfv#= zIDD)%XEo5p4Kn$5s;`*g9w9w5gBki;7hI;+g^ZzHuJj4RMIG4w9qjAAqy@j^|6FqW zYy|5Du6Nb&T<^P6|EB1sHugdmkyX6Zgq!Z^8JAp*K!E&5rd62{+}FCBCR>5$dY$iQ zg2pu9R9@rVFUSxY8N=xVadTVE_u$RU2~Ehhrx3^FGz*u+T7QNgH|dAmf40txw&DWBBBBJ7StlDU#J4H#j6v9o8D9s zKZdFI44|M*g{IX>9pZ#(!YbBOKp{<@!7)k~68&ox#_SAW$69vKAWIF#6V2BT?N@=* zHX=k_xDIT%QytK6*9S_^u7Q9lRS4=`|3nBVLmR8rhmr_w@V+>&9ERJ4?&d7vuV_`l zsw;;k3I9Hkk~$c1HU@jdq^=~~bklO&ETB)cXEo z{J8I)DCoVfjCY>Mtglxq!dyIw%|`s6(tP?fPn;HiQP;I_qpefHD>7 z$XYA*Usdsj7)q+aJGL*!JUH=n2uYQeHHQ-P9F+uP%*~gipvX4p@5Esh zP@8JxY&nM+G5jud1DQO0+H!>NEzVUomYWZ zIij?Y53wKhaBN^UHd|7H%e&+l87M%_t!2@;S$^P7+@hHTj7hT|BcTw2M^?Rz&mK!d zXT;6drV=X9Y8YT#wj&NDrx`@2jtfG4+#xgSEh!jY%qD4FQ3gqlh_*uy#Gx+5T=R&` zY1j+%y*Eclf%=Lh#qDfm_<6`qOY5RIaL{*1wmJxarc*Fo?Hx%dly0fIYN8C3XZo79$^Kii`sPrHMnbVi2P;e%tZ0xWd({;Ir^uc*))HA}@&D zRyooB2mhRdS08TZ0yw_qOw7?f3)YHyj|@6^;3$23OQPdhc+e!7dzA*S;P86{kDWXV zU+z>`*faA0lbF1_z?c}kXy-jdSxJD;KSzq8A7Y?*bY1YrHEyWR+;{-WVsPRXJO8jG z0UqYvPZ);9AlF}S{Kg6woW5rJ^lpnND32)!HDj+D2S)>+YN;5QGxQH9n{h$Da538p zF;Vz3lfq?Tt_0*Ap_8lE#bEz8uF2Y`r{Hsz--XmWF) za#zN;+pZhcISGTZlAZs%U`3#${Sr?qF9t$>2|l)6cqfD_%0SiY4A4-ED9_{Pso3i; zip|VoAnp8|T#(=dPiBWBd-ytT)61cuF<${HcD(Y>{}u%ee>s=HJ`QlrSkJnaEC^rq zSZ=O}DZsG-3Hp>NQJ4^oUS8MXfEshTLbICFps&=b^P^WDju^d++^xf&rxzAn{#ER- zFxywbHzELp%)*ADi9FypJGkJEC}>~SXFt`?22#4#7gKQ)-9F}@_@#IFIyJCE^w$O4 zPJbCQqrb!oat}4wq*?euNU!MW19v&#bbfT>|LsJ{CyD!9_T%}y?l51YIv;%7;+nYh zO%~XbAMG5a6UDoM!lUy7Ct*w5+rKz~7j`T9seWIPg~^{5KSZ91fK=6g4|y@$g|-6C zD=T>5UI347)HfOMzP0x~%~b@*qW%W8g&qgBxc4@WZ@J;f{B;&}HyP0QFJV?`R~W8* zs5GFgWP#Z$B#CZ}++eOS!fb|H^L9RIANIuyW4~aWM#>9jxZ3#hy|ob+oES4w>r}zl zE#;$==`_M%S=!9ezn>YtzH_)VcjpvLGtkWj6KM{hf$I1`jtaecY* zloPf*^UA`p?~kU}VKv}~5U85P+wXH^gpV?}>$VPXLbcJYe{CAr%O-uADaSwv4qYHD z_YxSOxmMHZw<-s`&&s#sxs82(_tjtOXA6Q&pPh7C8$E6#f7Wu`&ki4jjy`$WE)F&Z zzi&-Vod$=q*6t?D$MCN7%H!SZtf0A{#++jjdy#h*o<#i>0JG%ul>aD>!L>gMXCLgG zfZ`r)(aOJKkpAhh<_~fKs8121Ixb2F#Uxx`YD12L-qw}(1^dO|I7fjC(|&%K-fPkQ zZ9)q=Id9r3{xE|TpC!wCQc?KF;_@zQl@~fo$6xpO9fg$rg&IRaOu)9n@a{bJ15;9X zoTq)n1IEE5z7o7NnBBb~KD5mMb1Jeg&-4nyv(DeUy58I%ar(m8rZW}9k3M*?5={?x zeg88sOcVf>;KGIoMlN73B}I|Nl%S`W@Uxrc7<{bIbx^V5!)?hW9`i;{h(5h)!@Wih zyHe{`BCWLGO|+5u2=Rdb9l5`qnjCP|>96YGk52TpFmLTNZ5z5eFst46p%J}wNfx7A zjw8rJvxQ@ycA=N{ha&5-SE%-lKxo=}3$mr0y(3O3PCS;`U%rc3g`;g!42pbB$aqJj zq5W7Jl6;VW=03-w5nJyfwT=#Cq4ac)bL9cb6J`5M9oCHGR5D2zq|(sd1v;+(pH->~ zdOLq2Ekp0WxXRSOY(T55G#$ac>FDjTHJ__TafK~@V48I19xA@Ix)2gsiKgj-nh|bf zMF^CR^{y)Lidfy&@)AER3zqU!Af0>G(E!Jn^!(Y*1Zi{fc+0!RW&-KE{ z$@=nr>oNK&y!g> zgHeC$9k)W&8YFs=WYhc+_PETMQ-}R{M69yU8+uPhAs$!XHSR+XkXKY2vkJ>&Ei=b zm-JuugWv6Fa*1LtR;8WTqF~HRR=S7mPmv#PwtIlmC3MMEZnU9Fm+LOOY8^!Jp5DcT z@@zE!=i`M>iM8m=6^CV)*Dc7}(L|&6cLyP_u&%XrFAueP41Og?HRxANQ3xY_Gt$m9 zITx+bNk}pzwxpdYK$2wgX0MoQ&}r#5s+%$o(Q8tx%|4z^;$P6gz}5$a$Wgv9?Qvx_ zaxQJbmm7^}Ww4e^Jf?$iCS$NBi77@c8B$@69@WT;x;AZfYWD`mZ@VKz;RgEMJ$D%s8^3l-gp{nzB6~v9<&x!e` zn-NF`$%VYBMmzBY8+x0CxHgrL>A3=eLBVuh-v_@A*Pq7Rsjop!EgTd-uB9X2ya73r z`a~k{8dHDh-%g~`xmsaI_5e}2v5h!Uq@a_t+vV4U?a<-?vT9nZ1_rzfcKOzS{||3fq?a&V?CIR@Pbc+=ch zTZ3e8(XtM^JwsaVX2}SEcjQhv>13qC8vQ80zRaCPZt}g%}+}mE)=7QMDY4{oS4HcGWyMuIvGaYf<~U$()j(IL^EY^l#I>2XmsHI$0rgg=u2|f1TJ%- zFJ~^4EICXe<}$Gz%68lEcr1{Ch&R_Zpb1+h;~29&>ikPFMbc5qjxrN{MCYN zZe_FOWKJU`DGKUM|9-T|b^ccNaYpt?TcD?f#8jV)OQ%uWmzA%kGIJEyv zAMZz`dh5&97juwQMdr#O>sGXA9W`k6X&RBpcV1#!?MEy0%R(XExyVJFUX9kP6?MGq zea`oN8mZO{XzOnEqxenY@q52K6f*0>F&xy2nqH_&S^Str!r@=U`=|zx$$w8TCHmh- zHx4}4`E3UGyMCQUtizi#yKDpKAVZ10r%yiOJ4N257}bh?svNEvTAM~IA3ej2 zLHokrXK{{KEI4WJE`z&jh|1?avvr5FYF^{whG z)oe{nBg(ak>{a~%bY(t-<{e8R+BtjYy5HqibW0{e+M#zEO4!(Wc@AzWQG-{$c#zYl3 zfF75&OFYLut@=~f63>dZA{`UuQ%1L@(cw^?Qqh|OXr+sWD(68Fa&#^4lA>)zOzc!X zbzalx4rxWSPT~M+bqeoMJ5Y>LdB3w}e{Mm!FJ(B6noJ|hgH>(N>X2=Oc`*uc z+r8^Q(1IS>8mWg!P9rW^+-EKrKqqZfz8=gkM)!_f517wvLHuras6R7KBlYx(IkWNs z}b`p-R~)M;!r#zcg+A&s5<+MhP4E}J$qTC=xhrb){L}& zJT-;x)sl`selUP;a`v(d8keBW>u1c^|289AmRn~&KbS(bhAAO0@a+{;6J1ZjO3;%J z?_argG^3YuB?HfHPod2m@2Hdb{-kcUQzQZqj7{?eRoDKekeWJfGWDaDRV@dKu3|Qrl0W(XVt&_jCqO zP@gvI_FM_dV4C3_O@D}z?dax?b4((peYZc$@(&<3si`*!PfF0rp4#sn?A_Fxe=tQp zKY>JdTg6EC`jMA3cW6yj31U}|(n*_WLepaRvt?2ykl>G65w_8O+I%YyIekn4_PwPj#A4;>xtV&RE{IHDqzeYr(<*jP+aU3xg>Xio=_apN5 z%Vo=_O3>h`q!Gkqg|Ik_5|ui#Q3j=RhM%d zwbyC#vSa2?GV_Evt)#f^%x3b+{oRh+=sOJzoq(V6{FSt+Cl0^ z8t}U=yX7J_qbOk?^cy|HjNfyc^tYdi5ciF7+RYpF$dPq1IalR5nhYxMW`8SA^PlCCkSfAE2mB{+g1eA(WpY z_`&B}H!A!Q^9`jHqK3v$SMq>b#AQLIuPO5k*_GVh4dUrW#l}r1rYQ=M8Q<6Yj{G$U z1@NYl+#5u6ufB)*T<=00YBIJm{slRdW}|O7ypXPY>SpA${#*57<=N(Y@0zk2@&cM`>j&4WX;$Xhdq`oyABGdc|g^ zy>GMy*|UXtKIzUyGybF^i}q!Rw~wapmkdHU%_XuT8Cf82!=OE)3cct%+l%U;5 z0UZ&K+L5P0Y)gh^Bg&Z=f9(^5cR%QZQc^{Wk&r=*W$_v8ll9Wja$kLb&YvtM+1GRr zm2iAp;!i3>Mm%X%vQHaOnEJgXVU9}l`tRuHf;Z{tzxOg-mW%l)^}Wrb8oO$=Hyiw2 zGPM}LzQqEL@1-Kcy~FDd>vK^=?Z+RNkCmVk+H#w9KXMTRX1omJ$XQREO9K{_FDt(# z(qPc!2HW%PR5;q8-gezB4UDMGm$PY;;MbtqA-d|jP!yFj5t?%sif3s~r70#sUT^#2 zUS2FbrF~8lb2t{P2c9u_7{^wDJ6h7P8u~K*t1vlA0 z#oI>Q0*^bgU*kJb)7bCFyAx{NhoWBh>ven8+=EN2)vA>2F*DCn*o5D=Z#Rep2bx`~>z|sb!0{DPG2Hkwc9~FmuJM zH*YIQ;s(o$E3IxN?hxlN9Kx#W4Z0KORGyu4hqA=?f7X>;V8PW=221;)=g(F@pPv^v zkx8rVYjA~h%_l*@-4~!$o=>sC!v+4(H;QpBc)&f6qut@)0vF8m7v1q0nAA~nhF!6X zVC2o#{4^4KwlbAhsJAZwSDtNszljqBzPWRwhxYe{9{5v#{N?Qg%rjI?I)n>+3`qz( z^4$>}o0^&&#O)#K+WD?3>@Toj^?g%eei8Qh7X~Y_Il>MZ;tg!Kg}KM9bN>$FW=&m# zsebSUn3?fZ4778A4_Es3hdJB8$nmm_N$jDzCyN^f*t75{ZDM!L&K_!h@;c57SOe3s z*TuQ1_7HvBJt!Zy7A2zZeXnD)13ors&p7h)@Kda*QOv~-2F}L${yOFa?;fhZrNC!o zxzmjc-*+vcAdUQIw}LI~o8fM4Hg*KsmluubKUst8Imxo`2Q9JBt;ez97-qumNeE7) zIzW4#CM(Mi%udN38G6rl4#v{wC}P&mLrWF4kntmX%;uOCM^T=KJ?D04SF?bS#yoVm z-3lheRN~w9?cgkzO3{o2Zp}!zdVIut>O(pY?%Tvz!tui|uZaAxfl;z6D)&6GzlrK{ zaLhw9xKA0dEntqn&iPwpBgNLxvS-X_U3(6`97{aOy<>_+HSL$exh#Oko%@TP^Le<~ zNh8p-X#r7hUpkf=nZndFht4aTX0UtG&iuQm6?m~Gi3@94K-{B6_LFrcutGNJoiKy_ z0)f2Cjz{qK@t8T^Iu|ojR8bbm%y{2E#l)1d*93muaJf&A7o}V-V-t!jK2Ug5r%>2*` z^(<33%u1tQmu3Ww&*DeSe;9&L(e#_Z52mni{9mWR2NS5arY+pyH3Cz|8!r#L8-U6e zX*#c8c)vehZ25&WZo^2A2Ry!M2o92&j0*?#q4YYLAHzWtclill@+;0~z#4OG_R5ree-$hRWb3 zjQX8xWa0X7Rj~fES&cThTl;)u`ECHZQry&h%7!rDH&-3@Q4dH4erAn4(E`07<9g2^ zeUPamcTyKL0Kxooo3W01u(K7&rTa${Zq*l71K4Op4yd#l$c1agZ9&x6g zRMLc(TAY=xUv+@l?(TAnz8+wUdU&BH-lwnre0eop11zqO#D&ajh4bs@b$n(tR3sD_rUmKehSJ%j zwIS~qW5dByOI<>9^UurFN-n*(oNy*QI0(>@CRy|r+ znW71iKi`u}m1=67QV&G(qL{j_tgo7DV^*1jkLNfXm1S z$%dDz;7TVYTGXQfDZyT|d7N7CP(W^D8?$2eOr0kVxT``}&1yrfg9c2!n|3<%pC(vK z+#{tmQ-Q&puq{R0kg;(=WFyj%D`25n5*1b4J>yenvSMv!1g;BIj4p1|5?tBhr0k*<4%P(GpWJB>xw@! z>@*BP{fRvT6Kl;3>j0PTSnN9^g7@DWZ$F(=QiTuNB(+>uo7G5e@)&hE@$bClb_;I)sP8v!a3+BLPsn?fW)-OaJG3`utPUPB zT2ssU0QbN2dHh&cf`gTfx4HdQ;3MUBi|Gk<2=%Ru?1%wyqLBN^5uyb9hO47I#Z`b# zMvgQ8KQ-73`WpyW0O~q?=|58_!RXYbtF*uHnbRMWgx*>;nDo2tb{3-y592qxkK`-D zSjwI#U9&Pg(3^cRaa9fKrrNhm@!2QSZ0(|)lp?&{&-~FNSQ&&q-UwMD)Ij9n9l0NBv@vM6C6MfjOTa&k4;r2dhpd>kOu;HFHUmjaYUy^lDtUm21Hm^Z8^ zRl(xjF1*U|dw8hNm-a=1#B z1~4eYV%2+56+DR-tz8ua6m7m?xo;>BbOC1$;q)0uRNS!qDxwNi(NYx?R|!a={rW}! zmmIu2{A2GpZUcpK&K(K*hub#slHpHP2srz7YAPXH4ld?Sto-~)fMk3Xv%`Q22*+oK zc^@HwpKj}%xQZM+YLIzD6-_|7zRBr|Bo(|1(EKfPN(uVDacwbvl7&jeI;l%s1Vo>7 z4>7P&f#&tnE#6EeAnmUer%#s!s*6_#|MV(B>-{KGLw*%lk{34KcU}qT({laDK^9s+ zy;o1apahSU<}*t1&nc%Se3XSn2}V9`3Cw564-P@!Zb4Pkye*_$Q`5EJk@M71A)?eX(NHRl!Ja!2T< z`koZf@0(yN+LMReuLs*@F|*q5x+EQPNCD(R`JM6~NC79O!lretJiMcPC1>IQU}Vhk zj-^o^f=+O8DBDSa{wslJq&D(!YLw0JwlIFZIsZ~@I*(gKeCwyU@ENh`$n|wUN_qGa zqE=k?mw;e?nXb$GQn0 zN_Y;aSd%*=3!T1ASHdw{Yp^i&XiZcWG$I_mWXlxc+qJ^m=SO5<-|XPCq$P1kpY$k? zr*?+S;mH629%r~fl_%}{*a@7|I5`>loWU_?^lYIzo@*VYnQzfLLt$ri^vg;-k8(ZN zId0+%6ir$)v)`P+A!Cf=p{Emkcm11k<+u}Ms~?ew!5*&e=Vcj6D%jg)vNoq5><9pTqqA5q2_?SD(5i=*kp8?N7**8y>RuPN~aZ^>3vna zY;qnB9_WtxylMwqtddcw9@bFlDG)msVhJH3tQ=*eR?vR_T3ZJ8R&@n(#+}2>ZIW9i z4bHeVm}R0k$u)Hj7^zXtOr{NtNr*^UI#_|jot>Kj-WIUlF!_uZv-(RFw|KrLTf;e4 zO2q(tza{;@_D`jo1HjdFtQK1Jh>E{yt7qmDC)n z98U2K4q5?wS#n(XYYP~XIi#=0Z3cQdQB?}K*{$XqC$_z33BL-f2PWAp;Jwyh>O;&Z z9p>#8SJ(jw!sra%P1hz69?`*nRL4+%pDC zvWoRr9}MyDjm-sX+%{Cbn-LPpXa>RByrJ)-a6@tK5~Vn`AzZ3NC+Mk+V3GNTTYao4 zZb%OCRMFr$^+--qimU;g=lra7+rkiLZm*No?wG*vy(ax{_l>Y8PMcQIQy z41l4v{j%N_6RpR>GccP!Uen205?%Eja*cyYYk=kSXK?7jEJS1Jtp$oCu>;@MV^dPLh^y=u05!_q! z3e+GqfU9a-B8sj$;N#Ru-tDUkByZ&U?im_E^Dt$@s0#L!PJi){YQn8Vb<@xTWje4B z_}8TJo+0d7MR+B|=s{h+Sw8mxZ3v)}^7@1ue@)bE@7~}R;zsy8eaR`@J{0hL*KUjF z#0DYXYt-5hd6|?yI9nf>)hyTxPU(U;WhL{2$C~ivtbiJ$x)$VxSbRBLrU#_HbR*MO zaZ|gbdFdVxW{YCozgtIW!sc~bt;21)u+Ym9K{Bolw4d^nm+@Rp_UHbwy)F&VOiY}5 zH>CrWn!Y#AW6#u+H$jU7)Ee+rK3Cu$AEk=w~{nLbugTFInj^nmo_C?-s+%mkjTD*GAObb5ESlS+U!>vX> z{ah#f_f^-`-@8z&fwuEcI+;XG5F_0kqI#tPVSzWEdSWlv6KdDT9wDkQcSG_~!Kelt zIPh7g*+>JTIg3KSud0I4eWrw4-&Ejtx%`LM3>xt88Y-$AQ3vnR;G#Ipp2t?5cD!~O zvtvGo8geh-oehhrAMFO}z?~#oFhZz8^ZVduAO0$X((E6P@eVcM?ycbS!Mht9?Hn%* zHdNr`6PK43@pwM8Sm;;4bAHTDXF0X28j$Baj;X0vfu;i_feLuOG$h?F(}-3DdqI|$ z(L1W(+@gE!mahspOZ*c$Is}lIq<-}yo(rwR!y!6b6}q>*y27OK&d5o}T}^+0f>+1y zPh7?A$Q<-uMinzz!Ix0OL~u=a`gdlh`)heKt{rEg4DV96ZIrc@;PP^b-4i@V z7SZQTap3u}dr?2z9s7H=9UrBBTf`pTpBGjb_X8|AZ+e;f;mJpTQBMHuKL+L-r{Kmldx_{ot|Go3GVL(A z3BXID4Owwh@yT!1&{OUN439l(K7J8Ek%lKb?=o&|vtLrv5|jt}Wv<&jT};r zl;G>S=>2hVfbKVw&n3Re;kMuI33oi79<~*DaB@o#1iWA+oD0Bo-kHs9NDi#`MR;uA zmIeR%b!MMZMfh45n7c>^P_>v5*?!Hn&RHa=M>v#<9<#)>d-D$3y5K7gY^KJ6R0 z<=8B<_{U{P2EMW~JFM*~z)}9HI;I5zdcri@?mEeV;=^Y<&wXT|&xJ2@unzl>(+sF6 zItXa~&;8(vvK-`C5dED@GC;RQ{!9`3-W2L&n1s^^D3Lt3p2H~zPpgsb{$6Q#LZam> zOs@cxxBuFkd*bUQ;qPB;_sK!0Jbhx2w={hEyxAFneab?i6)d=Tb09^~&&rggiKHpv19d%$Av+ zAnVPOg+@6yH_Zqs7^Nm}m|K^F4&hQOkw$#IRpD+}5+VzcMSoAdJu3y`KgK*?mCAv_ z7Zx`=yffA6JgdcPAq&hMk#S3_lF*wOwE5az4$__ne7>Zm1P6YzXwl+%uQ&Wys`!0L zC}O0b7{|LrlIb-a{zozUcDQF!@~|vyz`b`3=92JKIz_kgg)EG^ed7mC` zheu_g;rE$ls<#U8XY3gc*m+JK)z- z_mxYm-$JF~o~ElnjfglLT$H^!IVKGf5s%pH$K_!qOE4l+SsFCoEJa-Td=`fE+5U^b zyEH4GAtfYE9`0nx^PJr;4OainZ>3eA1xJdK_IOii@DP71^h{MAoR3^Q{jy&Qe(kDB zk$aql(*pWjYYfs*&2>iFep?PWj>(WG~M7PF|||BEqrC?JCz*l^ILOvDf7fTW1VsLRkkHTbGfQvw@eJ!C%nCmut5rx?lAzOnoNgyY$uKuVh3k&65SFXH~ z08z>0vZ+#0SUowWUEn4Oin`&7qkk~Fr)SM5n<@dFCs&ofUKE9A-fJwWrzPP;sQ7#7 zS{Vp5C^iQz2^fu%lN96?1x-S+kaArDbk7`I;c&#)o9yizrQ71bs$-UIPtb5UJrs+sW*5%&w1086z{yZCHh%tKiktY9pP7=z0 zn(xPp8KqO_KkV>Hbs^pb%d-)t&P49_Ft^9TwP;vTFx@5bA#!UtRkU-u2PLE&+5NhH zlZc6rzV=?G1)Y}no7gJsL|fuD`yaXWp~<+}UG6(6gr95K-+j2v<-5NqMSG+d&6bF~ zZmqy)p&7|7JR6w=pDfRPo%=l~za(PtYvUk#aq{=thmk=P8M~jk|3(gxB=#&R1)qV* zm8d<;Y8gQ@4&#hUUC+=>;Y6p6?^y&7FF)P(%m9MI_@TtEab%#*Zg~9CFseDlOOy2h zw}3i~l#8MV5nsb6dyaRL=#EHK#7sVI(AaW}m^0SyX<~eJyWt6up|r3G|rHL(EYdRMOPL$d8YFv%Gc|nH^+p zsgWK<(9dP?9YJFmc=I#)hDOQzVN}5Hv->u4)jGrTi#E6ntQYGlv(y7Mgp=XF; z%x7&&WETCkj5jV88bN;LyuL#XrATXY|Jru{QxvMmz&Dii64~54ENwh9gkGr{g`Kc2 zLrG!`zviwFV%Ec=ex&UM`mblqX2bL4jZ>X}rr;BFuypCxqmW`Wv|jgj%Cr|5 zu)g{xcydL$+!!j;aqeBZ)$X?#i*}=o3qe z(bgzJ9+S2z-9fP^j=ze`t+oO2lbzAu{E59bC06A7);iH%rMGVEo6E@f@KaO}oG&hNq8(|h`R>U|Tp_r^Y0O`r&qFqJbAPj<2auT>t*?$t3*ws%`+F}n zj>vN#YFt^0#2%r3+1Z_5^v83%P2kBx1UW}Ja=Ow9!a8u|{=G^$)QSGBe*KTlvkvJfA9je3DIx|kvh1|RN{9%R z9adA3Rur#WJz^AEg_xp^m6+#C31%U+^EOsvYM_S zENpZ>wOyJG8wTyOe@N7x5cy@YTY$*uwr_WtB%)uEpQzvW)Diz0ysMC9mh(gANUf;k5 zB9i6n#gO6_;^BcRhSU{5LfzrLQgmiGQKjd`d*Ns!AthrhJg(D9oU!~fa!>Rw5$)sP z75*`n@a`b^30p}bUY>5~DSp>TWZYz??oe$b zHXqmI7cmtOjDg-O7ot)LPlhJd-waK}BFi!Mm!)lleF4pQ38zwmD&b>jrGGjRB3uy5&e=q~3Z0{O)@vukmOg!+=O`z# z^Vdm#2&NOe(xJ%a|BW(~wRRxAonZMT*1K`3f^Zff{1SB2i1Sk6!nf-hi57)d{LL@h zi3wq|O^XYa#9C=q`mfCtqILOe1g&l(VeIOblR@7>^f0$n?mu2d-2C0o%BP=9Xjiq* z<_L$t`&NdKoRBmr*Lpuo3nWG*9q}9X` zWsi3A>v2Tfv7pmKk@bY4=DClbOFIZIUPsz6-D<+BCs~x{$1P$ZtJhX3q>cc`7_EY* z9YnO5o!HIm)x^{{W3mIx)2hpOc-mOwrO$6gCl%rJ;q3mTJ zn)|()XuPQ(J&9S;9=)VMTo@(j-yB$%lJ_DwgbpQeZC4V#5q$2k`#Omt{-NAgqt(Qr z1fHCFAAMrBOJ@x}l@q#y8AL2uC$WA+;K<5!H6a?VwGK(vh$38in6QYZi`niV zNE0nXlP0T)*(sCSQ!&2iXa!^3;TYValypzmS??h9_T&oXo>mk6AM-+^g+tLP1&QHc zr9$F`TU2)8WCu~*NqdE?xth3+$V}fk-$d)=4?Kl&L$rH-Q`o1jgV^_Dyml$4ni%UC z_Yy3MK~=L(^A~us2H7KYVC(MpW0WB`u z7Q!==(K+gQIYHO{NpDxS2qhj9(zP#2LowHT#h%YJ6KSvh9GB22Cpc^0Hw^R_q5RvC z`Y&2D(0_3)5{Gr0i8K0t2B%ue2tjebEfV=+G`Nji*uygs;ti6{d;Exa7jdOx`BWKE zHp0X$lUIyb=q~v9{>nn^g-4Z*gdY+6*+%6^h>eXMIS;vf%_sQE7>^Vr)EL8kW z-b3Oa8!2VnY6+3RBjGi}UxISWUs7!C%SGKaMF%&IJS2*&YYrHxln`G`y6LpcN>C0R z*XytNac;?2NSDVR&rhYb3X7S=gtYj~(>9+Hq}#n}v`2=2@2vD3)L3uCEVrND;-?}a zJVErecW4Qcv%Yfv+L=6L{-6IqmTe<(edo`u4f!IXCoB3~Z|9gR1Ps`S+rhbn)VxN9u(dwlcWe^XKTlfej6(LU5&$p6)q@$Qv zC6mGFN+K%Yc*lZVIuWe<@9~@pX2eewdc9vxL;HwgnvXjbL?G$e{_r2E#8=BqMe?78 z$nxjmvc8E_beWvs$~aR&)E+ccOl(XcCWzMy+=Yecvu$#fLstr-RegJ>#JQYkiT!)> z$+cvnNKGyyM!yjKl9{&Zs7^-0f}a~!^UDa6*nfUQ21x``9vO)IQ-G)<+2nHYTt84z z_*Q7Cl%Uz4_xzk?BC(y))ni^%fU3M}DFra={O@j5jN<81;@Q^&`J?>t#8_4Zx2$df zn!i*=&q$YmgiQSc7XnL&v{h=RVVXE%wEmZ5Gxn|B`di_tB;(5+1$kyHu?b3GVyO@{~Wi37sVe z;mW(4u!ycXyOxK;wXXbv*D+!6=RYNl-@4b~^w^_>jOy#aD@A(v-&8PoPcr|Bxe^2d zjOSdRgkJ;pnPXf{*xPmKf{3??;#D}Ct5%;`=MRbAg{)&)f#6_PN~6mj406$oKYOG6 zAc9<d0NbOlO=a(uy*Ho7mQhAo*(6cP zN><58$S$*CRY>-T@KPd5AyjsDWY3U(@9(d!t0TvCy3X-=-{*ern@F`kJL<9zNE%ji zUN`l|{S@m<3jDrsi)poaO5Puem-}^%!n~n(vxQt?zzZmT_~kN+Ux(jr3VD=Qd?7N# zkjAC!3e?v>Y+XF?0Q!V1VOrL!P#Ouid}w^2+J5idSN^UazYP7-y5duuiyN>189rZPcV5wSgdT=V*%K7o6$Oizr<%iF^f zp2Bm_8?0b5G?MSpr3+wFclb8&qZ2TWuDE5{UVxHGHjir|_^fE!BuZw(1}^q`t9GsoGm5sOe$`xv|wj1nmpIS)UrClr7SGqaz!sHy3QyZwW zJ6l113gvl`!wV419F|;(&$d3TvYSv@TR``Jdz-&iETM6Oj8ox)EtnUU2_F#PExp?d zarpt}&^dO7o=WgM{NraBWE-@GvMGL@rdJlQ^XqO%s;$6!WBbdoF{DxThz~Y_3;)S z`JH2xzrLJStgqr%^N3%C1?q2A%CoH0I2;(wg=c<36=WW5}J z_3^9`G;G@Coai-zt!ux0qufj&T!JJ1r-v!znyYQoem@Nga$>a~e&UUf@b^zvyNzIj zgW*ZTFuw0zPd-8vZU7}0M?U`}HG~qP^x@B1h7k5j{KCl{V{q?J+S}04hu3B*TjHvx z!NC5W(BLQBb0mJ}=LnAx^mDg$I`iv6$f@y+?%M{i@T72k6Q6n9=!oDEr3LaVx6z@sm%4~ce%y*2|n5Os#J zaQRRd=8QD6hK#gf&n37{Hb)PtfA8MO&C>=m;?5uzeBXNZ1?5*$yoI)?dBUR@pW*1! zr|IN|X@QDN$bi@wzMs!9q3ok1z?dUx;LGk0G^;S$ z_#eE#A48=Jv=XixyZEf0$=xgS9KH|iIFiSAE(B)-%1TRV9_TmX z!Wom%JLdJh2yW%*H|lcf;0@H2Zc>~%D5w8>h1x(Bs!S!1=9@J@=9S&K8>QOtktum* zNLLli$KGQ7=DtkkMst~6!;M-++4-&G(0-+y z%<&u(9JYyt{H~;f@yK;wq7!r=Gc|o)caaf($12yjzGZ+>Q__TaLRuK%{7twSLk(^U zMQ_PD7;qN%_Q2({^x)Sr+-dNc3b=*_D&58Z11kEv=l(^~L1XFqv55^@sC#++oaOst zIED0A;VL~Pm>iSnIwMH~y|cICcSEURNb_%U`7{MY++#h@DoPF_?zdj&;`_h^-!J~v zSN;#Qew`6e6eI`Lf!P5rKT_~sDx0jer3B`nKexI0DdBs@(PraPvA-aBX*xF|7528>g2$TPIh!(LjQUS@oNXAuDcgkoVMLk&w zw&UMJ?lA>B7aRAHa7^Vr7rFyPbmZH5IergWhJF5wD>RW|@4I@jk9&x-@|}?+#~*ZL zbDV~6X$O7I(Y(mRu#Fn;#s@Nx?jk3F;C~}#yJ%pJH|vqdHku=PA$qxb6Sc?7F7mr= zBcfR!Rq~hHDD%nM%XGpmwBXHJ@a5_T8jY`In3>r`o`0WfWeRMeW3ObD|5b0G>rwP< zr_nkpt6puCiP}ILU+#QuXxTs%tjiQDVe6=W#s?=uN#(1U>@{aN4TC# zBhP*f*#&dCC&LQ5yUFtGCF2?ro<7-iUuz91Nvt_-<*%TkC+`pSZGNNNOFtvjj+Rkr zYd3|D*$R?dnk3&Y|BWc#?FV|KEuzA&cJI-@C8T6pH`;3O8`<@@vqerUBK{afW53@E zC@MjMuw8HwVvkzU7rOss=G#yN)}M-&(X9q zkLD47ipG@n#w=ntICUXybPgrke;OC1nMac$e?}+-=1}--UcFS#3>y7*EFE2(MWw4D zV&TcN$n=3#o>u1!YH~WrpSGPwc2pN0a8k}7|KEm(tr9b+#v)>#_s%rB-^tb7D>;Q; zZ(9u=zMn!$$FsO!&P}0n-}atwnc`IBOKa0W=AURQi{|5xte>d#si&|+-A|;(Y_!EE z{}WZn4Q=`{PNJwwH=a&KOrmg|;?d`ca)8@UxwDI(Il;Fyol>gX&hYwm2Uj58wmvgcSZZBj2g(w^&GUmD zAv@@~9^JSTSb3?2|L5ueVn04DZtvT|H2p?XNRvIpkROWrs5?Ov_cpf0ZV&w(q^!?F zZD3!NMka^f4i+hLG=nuA;rE5iqt?X>FuQg->A0jdG|`(m*)`b0!&m)0dGrpT*AnNK ziTkq{*K`X9sH}in=&TLrO&h2?5*vE6Xa{HCnw|O3U<20)ZYO9`TY>|B#_f0;YnV1L zFHZW1Hxc8BX^m>FLDlGBHx)nErb&i=-#upqKOPF5TdJ~!-#6?%lp1lbR-zFjkLfuG zlaY5$bg_i#;ZXKZPiabthovBu$dxDOAkFn2#e*0txM(M{p0;!jrtYOotPz=m)LFY4^A8r#Fl(z~ z5n%~8v0Exp#OEMHaS z*%CJgYTw7tKE#}Z!NW^Zj2hm>61U>9pC;g@_9XYLtPxC2X{}Al zn?Tv!u%Hs0<;q;?XOgrthU3HL(iHrL5Mj^UPqAtQC(W}{&fmcs(36853A2VU^FU;9 zo%=NIy+J1nY7HSMBexCy;5!9tYK{K4PJ^{pwB_0<17LW0e7`&PG;mCxA+3!x0yk`7 z?t+j3M3J6xAk2-|1+&%(R%E3IKfg^~m`T%z+C+}UfG8c{91VQ_{jCnX zdlq__=A;WXQq9c=m-N7Afcoz0HEsNP`+B-abl@ntnurHysV5!_+)*^vg=`CNii?+V z?_|L5kA!C0@aE0HeWna;cwf`CzpbGIIUmOVx!{aU_)TRs;ul&l_Da?I##=40m*?)f zinHbH%ND8D_i<*3{ZYCOnHCtPBz;uc)dY)d&6IBjT5vmS%1ZSTf+o$5lakjo;ZJ|~ z_Gz5OsdE0(oo1&AFND^}w|mv$UI@7+C(h99H{>Ma+HY9xcz9V4|8rkFfZXw%8XOO) z+;hS;Yy?c91NU*}IsX+bCgXH|g3%W0WFR}o$(cNIMUp$1b_|Dxv9RUqkx?fYl%m0(%fP3|(zT1eO|oc)7) zvGgy8JR~AihNr5&Txy1j@J-FA)Iv%gM$@KKCvfj;^k+8y!B2`HEXNtGIW7;nY=5M; z)#M=M)jRG^V-+CE{^Yx!rvUrBGqntna-d;&OU>C*7Sh56$mwvlLyrQZS`NqA-*k$- z7G+ud{K0OW94rILmlESBiGYmZus?qgMYkex;R{>d|_;pBLM;LjdWjW%R|bl(yOr>QgH0EMH^d< zDA>~5v0h{p2W=Tb57P^B!2I~>`)WQ(_&5`kl(u>bXr?$h-o=YTE+d+V_Qc!PW%81g zp5icN-SlQsR~V#h%C27|7J*FaYh*k=GQeIi`q2av1)qO^j(OJzg2xhJm|L(g9F`6S zH+f3~V-tQd;}wA>E!}_}B>~9cQ=5OgE(o6)--kZGBn7;>22QT2!tk5iZ9K1!5B}xd z=OOYEfT_f&TEkiin3xgHF`*TL4@fllR2VN9ce9xPp63HeZ??A&ABw@{P~OV$ECC?6 zB-8Uvg$H^h3pG|fdEtaMUAIJl2;?slYD`M=!`_1$VV`68Ip6on{+nHH2qS(XS7a*; z5m&7Rqkr%MQNy*Fqi-CrZ^k&EF31G}TtU0~X9S_@O>CNP3J+|!W&hyE*nmQ};?MhN zcAOzDE?l(chr8nRmJYVu&{jm#bE2CC?ttrx|8Z96eXMez7{Lp}6QfLumpNg{BY2Q( z?0IrJU1WxIr|eb4>@>p%l}T&D1{u%tD7%WP`^672h{0isFQB#+Uz@ zD6_&u>bZ5odM4QG*6s-)W&+YalLNIn{JMi!N5$5H8C;LYhN)<`%3S#)FO{LA#9pjNo~YLO27L#}+}UpfIzax@o8W|@F-vvw`FoDLFI zJ(Hix(n3r;Sw_(m6J(vP+g8572m`lhZM*ILdbk=NYuJb0%9o@ z%YJhtpwG9Wve``tm1k=-iv$QD8QyaqGvLfJ0Hamz_DMisKJ_-FhG&3DZU$Z#JZ`P1x{Torq0K{e|2W&1<)@+g-e z^!XuTGi$zQWd8>ZZq`3F;Mhf$gvSPx&hDcu)n%j0+50GR&htZH!!EjRAyn)8d>cI^ zPf9Vpx`)DJmUNZt_mCmU-TY9Q9n@#|J<#Fw79uTgtB$VPL2u4ia}@sBLDj{SPYgS@ zkVk>M0wu{NqNkD^2xHquyOh`dJayPc!G?C;e|$F)sqnwqf`N6^UHbIia^WV5@g-+* znBK%^vL@~A3L8ji;Ma0|!y0=2{ZYk~(FXcdu~DNRy@6<@L@!a&t)t5Fg^O`6t0)j* zi4D~2D6Vm~W?yq1u|M~;jNV^G8M|Xvi~h^#n&V85VDBm-JLh^{@8lY~BsL^Lx4(=Y zD>S7xzgR-*w7cDpDwmPqqw+^*$ySggNmarL_TOk*b)2DP?-y!$@LTEcnuXUexyCF$d-pGy^O{ABD_3f7gwCLtwJQNpG}Fi>{re%^{4`qm%y?Xd zb_NX|j-MBSY2?1zquIUu6AA9jEJPPgAxtmAC-dVJI(g@Zcs}zKs@|To44;@pKQN0E zH^P6S$CO@`q)&gM|E7xiuaf*kWK%*O-`XdTQ3M-1$JI#`M@_I-5i^OZ7|cZ#i6+q- z&2`n!i(_aZH=nQR$2dB@AyD#@d;+}%McO+&SEgn`cL~RQLEtya9kd~-q{gPM%_D*2+?|%zN=iS0EJhC#s%vXxR(QQ{(TX*dAA)CcT;g`ro>_G4_<2#IG z=8VttPvzJr+we-R1|va>uz~OMz}ofim#(y`^{9I3#TQi9W*$i2SbpH(iX(%lu@uQo1o} zBLCU?!49lc6gT^MJ+%=^H$ZfwsZ{1@`H{jH813IU;Oz(~R%^fTf?&@V{O05$oJW zyj)&Y*drGPb@n#}=%cfB&SXF*7N}f9v2^$m%M6dD+8wFEA_6UYn_lK3-%a0Or3KtG zQ@(V>_2wfskBIw}b?PyltQkA+iY)X&rS@+;-r^FZ+VL9BxU9Mx7b(yk=C+Z{B_cjxGqut1|v`uN;zl_Mh@(01OZpuu#dABmi|B{JHk?WrX{K@w^ULT@b24kiYJxv%ZqL&?a!Zpb}Zx=w^LhI zHTG6lyXZn6-rB2`!w;Kn7|HcsSDvGG?0Ef1Ou|qtCeU!&$-x2lx4~BBQ}H%z?Z0`^ z@>}mQlxRWZ`WXA)oK0 z`?XHYKCvuhbhj1DcDtHY%Z*|7aV|xB*V-`Jkx~Bk;!ez3`{$zv`1gw~esWzdxdr<@ zpqqHgqz$`2B_k|4(22Rs3?zR0+=exlklLx{HDlQvx0b%Mwqd1rQ^PEOcVb+FwI(OW z+OS6%TWewGny{(RKT~VpTQMPqU^AojPRziGfo-#_4V%)r;mJ|ch&`5U%z<@cYz5!n^0c&KR&8g)F89=7 zZTIz!!tP;M3M-Y7eGLBmI}QWi7+SH!k}-oBtOiRGT4{59-h%z0Q)H%4?ZhtVxM9}#{{Y#bgd!}dMh-201gPhc*E&#fQtG0BJ2hWZAL*tm7r*bQCW z+tNR1OOxD)1$a>FPAK8tpdT!(c?YjCd+#q>d157)Mpb2*-sJ|YWS!j4=}tRl(DCB@ z?e2Q)b(!4LoroeV-YzC#Li#oKj6r_QtMVPTVXE{~xvCELNxeuTmU)56Fz9V@%++Bn z0o)pk9d9unAy$KhSGCxyJrX)vUYx1?ZZzd|rxx=bUM;u4+AvEI@egJ7HQ3j}5<)}u zXP97$rB?7!HOAO;Gva4PD|Rd3oK0z0HSUX%{c^>p5W8ME)uDv@TvSB9mQUogU}x(> zug8t!eiv)A2HuJS%v5BO0^%yL)w9{+rq~-SC6!&IW4#hHbn#Vsw~~(uX4B3*<9~%! zjIymVXTQd7MvO%C{j0zZ6L|i;6UfIR_V%kyW{R*|n+jyZGPPJt@gk8hSp{}-eW+i= zG!OeXEJ`NlT8PmXEV@Z%S7J}+gap5m;r_vJ%_;%h*O=`XfB$jBQ_QyJ%iWj5FEPjC zd;!F(FR>r1N(m)PPq2hX*}sGw)3Ml8YwGVW3$a#-H=g;O#n?p4pHrbzkFYCe$15F5 z;xXp_!89+1M;L*tn_5`<3v5bHWHzid8>xPnEIEz&y$I z{$^jjkA=NhF&U-K23wEDo-ui>c~K_);rw%B04t!)f5Vg6FT@JSBq@}I*KriJSV|l;+HQbI#evG zN9TtMb=jv1HoTEX$*tz6e{N#tCqJ$IvAT|VC6J1>=;hVbltH{f zXb|48qpyh3dOOCpd8?!JUpj(>kuvBa$-eg8bAa9a+sTr-C5w@{<|v=aQ%1El!AooD zl4#6glIo62y@l$LP(}dTvBlhbpfMOJRyMk2p;|d9iiPzQ^x7PNBGTWw(Mm z>?n6<^C=s*81^aEGd(+&3uC6+al0QTh&1Y%JCsbA(bN&2jQTBM%<9vuY7hY%mU{S7 zIx&wA{rxD+G+xJq?vnuu6v!Y+;Y?i?N~)TMxSy z^C^*fpKC_DB|8>+$k*`ZFBP^W%2lsAbpoX?PsMY7BSq>|T(_1nW~?rV%K60?3XBbB zyn;l9;}7gp!GRYTwk1>H^-pipT-8*l`J&$O_evVL`-l@2ZpQ<+_Oi|C=kXA7*&^PN z3Bn#I9T5w&s`hR~` zk>0gwFL)+9!+s>>4(UsO<3<`>;N7-7r&aJJAPb5PX?b-Sx<0(S-gM6mRMjcItnfI) z&Y%0wcsehFjPNIgnWjtdPWuthxs$HYloA=VMtMpkpvwB4XN^;*y+B6m1>`exI1 zw=;~6aEcj-*~2rYM!t{JE}&Wd)S=ne4fj@MiamJb1T7VfPm5SDK==C2ZGxxHa4W;# z<}ryY2wMi}_EI^*j^B4uOxFg)s{hL!yygVk9GtRWE1cm(ae`Mqxjmd0C(K*QvjQpx zws`s{4iF{ao(R59FzaokJHdMaC_3Cj76kAX%G_7sr@?m67iMc%7w-V&QB3{`wl+Xx zb2`tc`y5CdL@%oN+TxxHg=q5gc3{%t6={llsv6lgBlz*Xc7Lyb>8^LJfj%(T25H)Y zGIowLip>%RlM8a|?9D+$QYLo3!4lj^ckNfqt?^b`am?(qb8z43wflJ;Gq8J8vK&u) z9x!zA^WJ?+h+)s7l;qwQnG7EaO|JBC3plIK{5ThHk9^OqB2a!}40ku%%4k4pUHbOS-d$x9wPybn?q^rm4lHr#`a92z0!XZa<4S0}s-)YbfFjflB9EpMruO zsD}@|Cg3uJ+PT$;N@5f6_eiw~$M?xsBnj6qPwRmH)8{vC;|-MIsAlHUIwMFw;CaXBFd0YEx)!>RYXE@*2FwKX*0?Jx5c`w)E3@IZ&(2Tyyz zU$)4#@f*6pv|q;Ij{B1Q?~Xt!e9QA~qa55UdFhhusRHfTJVn(C-cG49A&Oen0OQ2Y$OTF{IB6YQ zV^^pQB{lc^6!7NUV7jS)e+2&c*F||xH(8Kbza@5cQ3*csq@U}@y+Z#9>r**$X~5;D zdoKjK@L7&)fo8I*5^&jH(%BBw25o8c6oz(n$h7(SkwsAkI-Z-)Ri`V$xx0#I1+288 zNs-m@&|4ka+m(`CUP(iLv4j28z5+!5n&jA5!o32HLkq^d_hkfbX4GDYZB6hyxMJ!4+4WeH-{p zydm~d3ygQOo}I77_iM3!FF84Jyn$yR#1|+Fts;~f0-3nis8oaXY&7m;`Wy2sCrAuZ z?fH}F{=?b1pnwueyqQwh(ksGjtqNxewM5N2aJDS)S!hqb3{<4klVP~O>eQH(ae%lg z>`)&mzhe=Fyb9iG5)By$zfrC#?uL7jPT9{&ld6J8n^w*>KM~k`mipaeR2ptB&^Bw} zJ~GAlQ-)l4`=aElFQ?RHZ7+W1C4KIzOi6(V$Um5+=QAXVJK~Y@5!D}0w5zIaM&ou&P*#gG;h1hUr?vsja>3>?l z_}C)!hMEe91Piv&{1JqF&a0ICNs>@^aHoj(ND~}9xGbJ>tALS=QbmxTAW&?(C>t+H z0Qc1p<*qeN=uoMpVIxz4{Dl8T-PQ%*pYEY;prHiRY9@S4p4NmC1}DFM+&lEtp1b{_ zuK?tebnDxcii5z--oeX5nh^06et_@I zhbDN%{inwZQAqKFTGA<~@fmw*c|#L|buUGk>L^3++v{#Q!#p529i<-gR~Wv~%M$)` z$9-_hWlIOr%HSX@;r;zO4{+y+hZ|oJhE-c(yI;7s;^vRb@k3n7@Z(6KHJgG5Zv7q0 zGaV6vm2oGjRb5T^ymI$q6}2+(kGmp)xMG=ew2REhGp|)o1iN{?mjg z@@4K#oDuC&XKOk$&k1vld5;Jl;ZzpIT^g|V)q@_9kSvKH$R&&IWJHUasJ-K zeQ>w6nh1T#m7pR=`K)3D3q0K#T)uIM2OLYD`O*;pJlLX^b;M`m5wwna(GAQn_Jh^& zNjoqPFD!CLuSL}zjd2xaAC+VQF%ok+O1PY1ag?bD~GXVx``F^ z`}rp>|5b%=LY9{LNFD@b=Pn*KFal*|;>6Nv7T_W`Wz!!~fk_m+#c){;hKiER%h@=svXb;7dx^9IN;A`q?_I81cTd@RoVaSpkc|1 z!044N?EKw)X0&4m24UMf|IIl<Ih4;W)3h3z!iqve#`|9uAVc@6!x2BXtEpU*=SedIy8pOJ)Q+8n znK#6mH8|6yk@w)$u~G|oL~EU{@WB-3X5XpmJv4zm`-q?i=H{?i@+N=2(Hx394vaF6 znZm4!V9X^sW4Nznf4L^g3?vuHo?v}u@Z|1~J@e`_aIR*MqZwzZ)MYn!ZEH-y6*;VoLY=VD2t5TLR_;vGp@KBh5wb9norm54w z7EpE9P)85+JY?IpX^r6Kn(gJIhepu#<5AHJz7r9Xy5rQVstd}JN*ksbr{Ve&pYx^a zhOkCE!1}OFA9Tt(wi48F59QTzn-LiU$Rc85S|K+N8P0lY zZblDIXPvGooYaTCgOG)N-1Bs`<3q9w?qM7nP_z#&(}fW3OD3(OdO&f8WM_E>_oc2$ zbBhOQ!kdOmqxX_@fWqi|_=PQ9Al5y#^#k`;`gHAe#pCCD1J<|eaxvOq>-jihSwI(J zXefpZ)U@&651&E`a&gbigZsC*A83K!=LnZO-a2sMS+-YJs22E+Uw?O(Sp!mTNIZI3 zqY0Bf#q0B*wIPpxu5h7S6Dp4X3jc)r6oby5Y2=;9J)-%wF%z2F;P;Y(j1u=o>FN6a zH+)7F+_ld0j^f_R=PQ@Hr8=}=vY3JFUNV50Ly);2wF*3*xA>C0qX7>FXP&p&Xu)rq zm!vrQ0Qv4t@4rnc0jJbt!e+HP91kzKnY)kssK^W+me3=p{upgJ-=hdhH|5_O#j1hW zZR2Z{FYuj*)Q=ZOai7u^!PO>R+>7&7xwzfHUlm#&Y3y9G$A3SHX?aQ8;vOJY=Jdb` zd7u)hQ2Xwy0=;X?Ip^8&^Mffh>dRJx5=DBqJtBE{wbD_<6{!qGp^Ww!Qvi(PJXf}t zR3T6*m&{NBZ`Ea89SJDF{Xay_60GF_isc4T8%CHB14f<99L1VK9S7cNmFXWMjDUS@0B(e|} zTHEN_$9HiCZV%7^R92LPgyH@aCEf%P zpKU2{E${rVnM@ug>m*`-j3H1Jy+bSeLkSki1DmO?N`cFCs!87!IVhz%rt&Z!!H|jT zeeWAe@LP=b(up6EAlunDFE}C#kGJVo*l}+WNurw$f)j-AKU%aag59Gx2`K~;@G1u?+InPw`S(>)4pIbOw}VTb_$k63q6%Witt(L%Trk^F_0A#YQ6tM8kAODe|>qO0d(hB4*#1} zfYh1WHy`7zI_8RBRu3;p!%{*7MNo(aP`|i#LFJJG5Ph${vpOIGGV0>IKKoL*$MND# zJyQ+n&fusXx}X5;I+0f{bBlmbm(2af6e-BOwfNs30lXDI7Bm{osQ^#qY#uxM;mp~} z^ZUoerC|HatdQ-YI)uiZao(Ah2ab5(_ewp&P}>`N&K_sq%ykEl%2#zrVmq!q@lqZn zZ@p^v5*G$G`D|JLF$r+isfzV3QHO&5wz;DKdC1X8dmM(hs2{i0PtOWVz?XdEp96Q) z;nMX3ZdNUMa5&JUB={!?g`Yd8<$}eb!%1eqz(yTx*!mm}Xyw7UX|^KCTM(`!FV?N} zis2qzs@_s5b=b%?n)jKI1LE}Ohy61GARlj4Um_+3Ec4&4&XB9aBww_QSq1Jx($Ji| z=^y~d_$J9H6GY+ZhQQze?nV0bP~GA>?o%>cFEVfgFG$4xn=3JW_=4qNWX z!nV7JTii)r@JqG(?WuHMv6h9@lH2=DFL~hC^YpPe1|cYaP`#`l zt_tIJ_is5%$>N?-r#siRc);a7=h0x2AZ%Tq-(WXYg(ga&h(mJx`)gBLhmUYWM5}?k zIxW5G%0Q^VIJJ6e)WkgAC9blN4T8;(%=$*(`erKG0=V@eBQe`@r~su5Vr%_-ay@lcLzc zkKj+{U_CE{3q>0TB;nUBuVd47nxtX9@Aq0De*UhCm2qI#;)NiGq1da&$}kW}oSl~> z4g9~1LRR?Mz$39y{8$eUkSq_(F_9_5p^>Ljm9sRoH1?#tzR3!wyd=Nfu;zixFZJd0 zO-j)1+McB>BaQE7TuCH6?c`{N@gUfgDe=gQeOl6ze6mFW$^=sQKow5Io|%#ea{ zb1SiL>fqHfF}hp(iJNd&`9lb|jQ!CrWW9cB?U8wparGn@i*+ zC}x79Bi48-KUUyqOwsu&EDw&t6HZZ-5};a_CUQi=1RtV<8a={UfQfuBk0VnQt%UpDcWcinILlSPY1K)hqZK7{Gd7ELl0_B*czN zknUK?!dWJvnC>1?I2mqLZbip{cSO8*r_yjn^FZ5x4!;j#6U1k@vLFKf>!!PVZuGeC z4!6#y9)~i?%imk^`yABv4ot$!r(n7ujsAWe9R$(7lGeV@1b01;`h>`(A+>75HubwO z%-W5v6_C)uk$mONZ+95Mh2>Y<2)7ity+6D6r&tJn%epDdJf?w-CH?1)et28{l~bwx zISCk<;F~sa7K92ybH7FrYUrnYdywx;4^G8~zFP)jAjib09imZ%rPM!Y$TrGFebNCj zLrY~SCo@+4T1*;BS(Di9P$w+f^@_fvOX@&R&wYW@3#@iWXM z@Ipy-YBYBK(U{W4QWY90XP}}pNk&RF`A_+gG7QM^FCJh#{_L_XBb??M^ow$KGWk%-YUR$oU-_yCX$CA{>fJ7cJ(MPgh`C zemcAsh6PC9JIJ){_Inf{II!IL?GCd0$dtwXpb{Gl>VEQ5pahYEl{@W!ort+Vwg6L) zN8&>Z0sh;Sn2)lT)J{MJs@nb9eCn_hwXbH7oS%Dude0m?Ztq)(-MH_Ve5tD%vCA>~ z7ukP69S;{pclRG7k++{je5ER|?xghWXaDL@ZP)p0PC6e@O(I6=@v8v23luZ6ca>u9 z2c01&2^-P;d8LkbA39Nfw3R|sO%c+~PY!RmTZFN-4YE^LHlbKnLYiWtPV_27?!E0^ zDWYRFD|cEcz_d082eP+Yki0reAU}Br;u^eY`bVV#ktoMRT6jOf7+6UxR2^H4R>_hx{E!N zvs~P~+J=%$zAc;Ie2bn4DY1Vdtwwn=wOzB)c9{F7nE%&jZAd_^;fIQD8}hx>Lu=() zjf}hB{+8YeN2Kz^UYG0JP>Sl2C97yFE*YHk7pbg9CVoso4=AKP`p8eZx&TO zvUW}8{WVsFy7wv`#L2cH%855R!f|hq{*A0b`1BfOZVC=FG}ocGT+uN&DOc7o>+lX%7->IVsZ$!V`$&?1hT9H=2BW2^|93-Z_zOwy@+i(qv7Znn-lbT2fQOx+Q~y+U;qvF9;F zJ(X_W%h8S+s-CFbHE%~VB_H#xAGV;x#dGyE1g&Uy+gY6<;yvmgt$pI8_#U~sXYdWQ zHKRtgV;-D_tthkTd#CeQ2U7ei-E?*DJt`S?r!QG-LWkjtSJPu!k>9)5H#NmRAeApl z3V*UYP^X=L+%!`Yy7JvI_^`ee@mv}9SGdxJG)nSR%)AWCQ)QUbw{@UkxZjgl{Rzlqj#MP$@d< zCVEv0Z>e;}^&+Vo%FM}dj^P}~bdF5tITYu4hz6z65T&@tQ1|)!yVhQN@3q%nd+p!) zeRdmOI!OEOa1hZ$^=seli}=v|Ps_h;=GDXe`}vI(g2$LiyP-3iD1yT9m(fU?|I@Zh z>6bTCLKFt-Dmv#s!S00O?$c;oX?P z+p8t8Km0CFEs4OYn%d!Uy$aNs8}T+f2;tI7=B5Qmuwu8-h{r<$`d+1ncQlqmPydWf zgq9GFk!*xUyj6HElSRyI8S+>XQ&?%Z6+ zFoFFlTC0-xmSMJ*B{TG_4$H|QtGrMWeXREk^9ceAKP>y!KTG!$+j@@m#X1DK+;kXA zBVilNaHi%6#5347zt9{q6*sFli!|!soAk(MK|P828haZKGQ>EbT=uoluN2>ckDR?+ zQ;VDcI~V0XTJQThIVK~9nZx}q=E_n`2J+_y57xrzhw&q?84}wznO-VhBu3}VV#ah2 z2g%&XS10FcFtx|oMOlTyz*VQFR9Y|cdq1j_!hvS|z|6Yz8ZYH+Rtf-5m8C>{`LWvLE|fBl@aQUh26n%7%jd zZ@G`8e-P;TWU)o=6&ov=vi9p}PFLu_Yu;^V3c)`7C2ErdrgPfco@cR8%P4jg+7jr~&lbFWe9ST{qj+8vy4YzC zt``uPvV7jTqP7@M6K}aYjaA~A;b!-Y0~GYv>^Iqan}Di)oFnC0j4Vt3_3GqG_%8BG z)wHJ|lh|0PbD6-~piP<{Uy5*Ig$DD3NhRJ{#`YM2LVTRX>v>E9^5qUI&;C&aU+uBn zif26R(b?MCt54yG&5LvNQ9dlbwI*wHO%XDvQ}IhK^60uU-KnHW;pj;(Sx+MZvO0kl z>2-w|JGj(%NS%i!W9CSsJcX@>vHm&B2{^?ucRG0#BK5e^*h0QT&tU&Rt0A-abup2$Qer zZfGEJx*@6HREY@VQ(aHnbsl1MSc2(XN(JJs%HLJaAz|?{_l#<^2!^L?TD}NbnCLVK zEjO%yZL~tfWE2T=hwr25ULtVI3eVViu;3=maCYb@hY!7qFZLmko{{`fK=F=v}qK0>tOg5sM>v9LBQ&M{a5J%+oL8>0p49|r^YWFE|B6+5Kd zOOe=V+wNy1q5mrIKTPqOY2MSq^>&BzATcZM3LoI0-%BrzG1h@Mjs6B*$C}aYcsQ0j zl8asZtrL<^4tk}uV*X-vApWJ9ys~^VMBl_x_2+W&b7H}ct_2+EG8}ZTdUarJc9RUd zpb4MkHl=I-%z@2`;$gQ~HeIK-z4N6zpri45B+8-*nYv2RNl`hF56gYGR)vi(YV3j_ zhjtK(f%$sPjcB-Eb+JM!2W{%>Ir5uIK#&3j_e)PeS-BOeSv8{OU7+l`E7_nXH@pqi zE5?ZX+>47TkCD0V2cKEefQn-udBHPTke!!pE~Q%pCFQ@uUGBBvV@0yw54i?39{Fsz zA}9+oQe=|$%0dM7jI(8~wW99>*N5r)2qy(AE3duIM1TAI->~Q*l0)3Zk#l^@pn@- z&b1a49MbZ*V>}yTuq&#${4o6${H(~RRLoRl*wa6^__TTTG58!jx zFzk$bF6v(mX>HMLMCnnpT7GO5UJ8z@^6c)Tqbz*6ib@Vd|39totp5ni(DPje5*}PL z%{HmFrNORF`m0w%7Gho2*!!soq4(zNM$XG}sAZWf-C&xEV`Z-vEM#WFtdeVD+**x) E03!X|qW}N^ literal 0 HcmV?d00001 diff --git a/tests/data/openqcd_test/sfqcdr1.gfms.dat b/tests/data/openqcd_test/sfqcdr1.gfms.dat new file mode 100644 index 0000000000000000000000000000000000000000..e75881d9dc031aedf937640c29abb2e76baad705 GIT binary patch literal 157504 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 Date: Thu, 10 Feb 2022 11:03:59 +0000 Subject: [PATCH 046/136] tests: openQCD tests split up in two functions, coverage improved --- pyerrors/input/openQCD.py | 4 ++-- tests/openQCD_in_test.py | 40 +++++++++++++++++++++------------------ 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/pyerrors/input/openQCD.py b/pyerrors/input/openQCD.py index 78d2805d..1c875c1c 100644 --- a/pyerrors/input/openQCD.py +++ b/pyerrors/input/openQCD.py @@ -467,7 +467,7 @@ def extract_t0(path, prefix, dtr_read, xmin, spatial_extent, fit_range=5, **kwar ax1.set_ylabel('Residuals') ax1.set_xlabel(r'$t/a^2$') - plt.show() + plt.draw() return -fit_result[0] / fit_result[1] @@ -504,7 +504,7 @@ def _read_array_openQCD2(fp): elif size == 16: types = 'dd' else: - print('Type not known!') + raise Exception("Type for size '" + str(size) + "' not known.") m = n[0] for i in range(1, d): m *= n[i] diff --git a/tests/openQCD_in_test.py b/tests/openQCD_in_test.py index 81b2e983..18750a07 100644 --- a/tests/openQCD_in_test.py +++ b/tests/openQCD_in_test.py @@ -4,7 +4,7 @@ import pyerrors as pe import pytest -def test_openqcd(): +def test_rwms(): path = './tests//data/openqcd_test/' prefix = 'sfqcd' postfix = '.rwms' @@ -45,10 +45,29 @@ def test_openqcd(): assert(rwfo[1].value == 1.184681251089919) repname = list(rwfo[0].idl.keys())[0] assert(rwfo[0].idl[repname] == range(1, 10)) - rwfo = pe.input.openQCD.read_rwms(path, prefix, version='2.0', files=files, names=names, r_start=[1], r_stop=[8]) + rwfo = pe.input.openQCD.read_rwms(path, prefix, version='2.0', files=files, names=names, r_start=[1], r_stop=[8], print_err=True) assert(rwfo[0].idl[repname] == range(1, 9)) - # Qtop + # t0 + prefix = 'openqcd' + + t0 = pe.input.openQCD.extract_t0(path, prefix, dtr_read=3, xmin=0, spatial_extent=4) + files = ['openqcd2r1.ms.dat'] + names = ['openqcd2|r1'] + t0 = pe.input.openQCD.extract_t0(path, '', dtr_read=3, xmin=0, spatial_extent=4, files=files, names=names, fit_range=2) + t0 = pe.input.openQCD.extract_t0(path, prefix, dtr_read=3, xmin=0, spatial_extent=4, r_start=[1]) + repname = list(rwfo[0].idl.keys())[0] + assert(t0.idl[repname] == range(1, 10)) + t0 = pe.input.openQCD.extract_t0(path, prefix, dtr_read=3, xmin=0, spatial_extent=4, r_start=[2], r_stop=[8]) + repname = list(rwfo[0].idl.keys())[0] + assert(t0.idl[repname] == range(2, 9)) + t0 = pe.input.openQCD.extract_t0(path, prefix, dtr_read=3, xmin=0, spatial_extent=4, fit_range=2, plaquette=True, assume_thermalization=True) + + pe.input.openQCD.extract_t0(path, '', dtr_read=3, xmin=0, spatial_extent=4, files=files, names=names, fit_range=2, plot_fit=True) + +def test_Qtop(): + path = './tests//data/openqcd_test/' + prefix = 'sfqcd' qtop = pe.input.openQCD.read_qtop(path, prefix, c=0.3, version='sfqcd') repname = list(qtop.idl.keys())[0] @@ -78,18 +97,3 @@ def test_openqcd(): qs = pe.input.openQCD.read_qtop_sector(path, '', 0.3, target=0, Zeuthen_flow=True, version='sfqcd') assert((pe.input.openQCD.qtop_projection(qi, target=0) - qs).is_zero()) - - # t0 - - prefix = 'openqcd' - t0 = pe.input.openQCD.extract_t0(path, prefix, dtr_read=3, xmin=0, spatial_extent=4) - files = ['openqcd2r1.ms.dat'] - names = ['openqcd2|r1'] - t0 = pe.input.openQCD.extract_t0(path, '', dtr_read=3, xmin=0, spatial_extent=4, files=files, names=names, fit_range=2) - t0 = pe.input.openQCD.extract_t0(path, prefix, dtr_read=3, xmin=0, spatial_extent=4, r_start=[1]) - repname = list(rwfo[0].idl.keys())[0] - assert(t0.idl[repname] == range(1, 10)) - t0 = pe.input.openQCD.extract_t0(path, prefix, dtr_read=3, xmin=0, spatial_extent=4, r_start=[2], r_stop=[8]) - repname = list(rwfo[0].idl.keys())[0] - assert(t0.idl[repname] == range(2, 9)) - t0 = pe.input.openQCD.extract_t0(path, prefix, dtr_read=3, xmin=0, spatial_extent=4, fit_range=2, plaquette=True, assume_thermalization=True) From 3523bfa568da0fbd5516107b7ec07d370e77f52f Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Thu, 10 Feb 2022 11:12:31 +0000 Subject: [PATCH 047/136] refactor: isinstance comparisons in correlators module simplified --- pyerrors/correlators.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py index cb40be1a..abc4b0a9 100644 --- a/pyerrors/correlators.py +++ b/pyerrors/correlators.py @@ -69,10 +69,10 @@ class Corr: if isinstance(data_input, list): - if all([(isinstance(item, Obs) or isinstance(item, CObs)) for item in data_input]): + 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) or isinstance(item, CObs)) or item is None 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] self.N = 1 @@ -735,7 +735,7 @@ class Corr: else: ax1.set_ylim(y_range) if comp: - if isinstance(comp, Corr) or isinstance(comp, list): + if isinstance(comp, (Corr, list)): for corr in comp if isinstance(comp, list) else [comp]: x, y, y_err = corr.plottable() plt.errorbar(x, y, y_err, label=corr.tag, mfc=plt.rcParams['axes.facecolor']) @@ -846,7 +846,7 @@ class Corr: newcontent.append(self.content[t] + y.content[t]) return Corr(newcontent) - elif isinstance(y, Obs) or isinstance(y, int) or isinstance(y, float) or isinstance(y, CObs): + elif isinstance(y, (Obs, int, float, CObs)): newcontent = [] for t in range(self.T): if (self.content[t] is None): @@ -869,7 +869,7 @@ class Corr: newcontent.append(self.content[t] * y.content[t]) return Corr(newcontent) - elif isinstance(y, Obs) or isinstance(y, int) or isinstance(y, float) or isinstance(y, CObs): + elif isinstance(y, (Obs, int, float, CObs)): newcontent = [] for t in range(self.T): if (self.content[t] is None): @@ -900,7 +900,7 @@ class Corr: raise Exception("Division returns completely undefined correlator") return Corr(newcontent) - elif isinstance(y, Obs) or isinstance(y, CObs): + elif isinstance(y, (Obs, CObs)): if isinstance(y, Obs): if y.value == 0: raise Exception('Division by zero will return undefined correlator') @@ -916,7 +916,7 @@ class Corr: newcontent.append(self.content[t] / y) return Corr(newcontent, prange=self.prange) - elif isinstance(y, int) or isinstance(y, float): + elif isinstance(y, (int, float)): if y == 0: raise Exception('Division by zero will return undefined correlator') newcontent = [] @@ -937,7 +937,7 @@ class Corr: return self + (-y) def __pow__(self, y): - if isinstance(y, Obs) or isinstance(y, int) or isinstance(y, float) or isinstance(y, CObs): + if isinstance(y, (Obs, int, float, CObs)): newcontent = [None if (item is None) else item**y for item in self.content] return Corr(newcontent, prange=self.prange) else: From 8788891d5f0b57b9e3413b52e9a5170119d6cf44 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Thu, 10 Feb 2022 11:23:25 +0000 Subject: [PATCH 048/136] refactor: import order corrected --- pyerrors/input/hadrons.py | 2 +- pyerrors/input/json.py | 2 +- pyerrors/input/openQCD.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pyerrors/input/hadrons.py b/pyerrors/input/hadrons.py index 371d1525..cea7fb81 100644 --- a/pyerrors/input/hadrons.py +++ b/pyerrors/input/hadrons.py @@ -1,7 +1,7 @@ import os +from collections import Counter import h5py import numpy as np -from collections import Counter from ..obs import Obs, CObs from ..correlators import Corr diff --git a/pyerrors/input/json.py b/pyerrors/input/json.py index cdf203f2..c6d0e3cc 100644 --- a/pyerrors/input/json.py +++ b/pyerrors/input/json.py @@ -1,12 +1,12 @@ import json import gzip -import numpy as np import getpass import socket import datetime import platform import warnings import re +import numpy as np from ..obs import Obs from ..covobs import Covobs from ..correlators import Corr diff --git a/pyerrors/input/openQCD.py b/pyerrors/input/openQCD.py index 1c875c1c..b3b8da04 100644 --- a/pyerrors/input/openQCD.py +++ b/pyerrors/input/openQCD.py @@ -2,8 +2,8 @@ import os import fnmatch import re import struct -import numpy as np # Thinly-wrapped numpy import warnings +import numpy as np # Thinly-wrapped numpy import matplotlib.pyplot as plt from matplotlib import gridspec from ..obs import Obs From 5818dbe883816fb93cb27bf54096993d05f59217 Mon Sep 17 00:00:00 2001 From: Simon Kuberski Date: Thu, 10 Feb 2022 14:49:12 +0100 Subject: [PATCH 049/136] Bugfix in _reduce_deltas. Results were correct, but performance was bad --- pyerrors/obs.py | 8 +++++--- tests/obs_test.py | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/pyerrors/obs.py b/pyerrors/obs.py index a705a3a2..681cb270 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -1214,6 +1214,9 @@ def derived_observable(func, data, array_mode=False, **kwargs): def _reduce_deltas(deltas, idx_old, idx_new): """Extract deltas defined on idx_old on all configs of idx_new. + Assumes, that idx_old and idx_new are correctly defined idl, i.e., they + are ordered in an ascending order. + Parameters ---------- deltas : list @@ -1233,8 +1236,6 @@ def _reduce_deltas(deltas, idx_old, idx_new): ret = np.zeros(shape) oldpos = 0 for i in range(shape): - if oldpos == idx_old[i]: - raise Exception('idx_old and idx_new do not match!') pos = -1 for j in range(oldpos, len(idx_old)): if idx_old[j] == idx_new[i]: @@ -1242,7 +1243,8 @@ def _reduce_deltas(deltas, idx_old, idx_new): break if pos < 0: raise Exception('Error in _reduce_deltas: Config %d not in idx_old' % (idx_new[i])) - ret[i] = deltas[j] + ret[i] = deltas[pos] + oldpos = pos return np.array(ret) diff --git a/tests/obs_test.py b/tests/obs_test.py index 9bb508b4..44f282ac 100644 --- a/tests/obs_test.py +++ b/tests/obs_test.py @@ -675,3 +675,19 @@ def test_import_jackknife(): my_jacks = my_obs.export_jackknife() reconstructed_obs = pe.import_jackknife(my_jacks, 'test') assert my_obs == reconstructed_obs + + +def test_reduce_deltas(): + idx_old = range(1, 101) + deltas = [float(i) for i in idx_old] + idl = [ + range(2, 26, 2), + range(1, 101), + np.arange(1, 101), + [1, 2, 3, 5, 6, 7, 9, 12], + [7], + ] + for idx_new in idl: + new = pe.obs._reduce_deltas(deltas, idx_old, idx_new) + print(new) + assert(np.alltrue([float(i) for i in idx_new] == new)) From c5c82dae21c1c98550db7ec226f02ff500f88f3e Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Thu, 10 Feb 2022 14:57:37 +0000 Subject: [PATCH 050/136] fix: erroneous replica separator in json format caught and corrected --- pyerrors/input/json.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pyerrors/input/json.py b/pyerrors/input/json.py index c6d0e3cc..88be9e55 100644 --- a/pyerrors/input/json.py +++ b/pyerrors/input/json.py @@ -307,10 +307,15 @@ def import_json_string(json_string, verbose=True, full_output=False): retd['is_merged'] = {} for ens in d: for rep in ens['replica']: - retd['names'].append(rep['name']) + rep_name = rep['name'] + if len(rep_name) > len(ens["id"]): + tmp_list = list(rep_name) + tmp_list[len(ens["id"])] = "|" + rep_name = ''.join(tmp_list) + retd['names'].append(rep_name) retd['idl'].append([di[0] for di in rep['deltas']]) retd['deltas'].append(np.array([di[1:] for di in rep['deltas']])) - retd['is_merged'][rep['name']] = rep.get('is_merged', False) + retd['is_merged'][rep_name] = rep.get('is_merged', False) return retd def _gen_covobsd_from_cdatad(d): From d772e09d50a533e1307a2c5041173a174f86af21 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Thu, 10 Feb 2022 15:29:00 +0000 Subject: [PATCH 051/136] fix: Special case were no replica separator is specified accounted for --- pyerrors/input/json.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pyerrors/input/json.py b/pyerrors/input/json.py index 88be9e55..b53d4e3d 100644 --- a/pyerrors/input/json.py +++ b/pyerrors/input/json.py @@ -309,9 +309,10 @@ def import_json_string(json_string, verbose=True, full_output=False): for rep in ens['replica']: rep_name = rep['name'] if len(rep_name) > len(ens["id"]): - tmp_list = list(rep_name) - tmp_list[len(ens["id"])] = "|" - rep_name = ''.join(tmp_list) + if rep_name[len(ens["id"])] != "|": + tmp_list = list(rep_name) + tmp_list = tmp_list[:len(ens["id"])] + ["|"] + tmp_list[len(ens["id"]):] + rep_name = ''.join(tmp_list) retd['names'].append(rep_name) retd['idl'].append([di[0] for di in rep['deltas']]) retd['deltas'].append(np.array([di[1:] for di in rep['deltas']])) From e80fde66308a872b5f600258f911db2339638a0a Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Sun, 13 Feb 2022 16:21:27 +0000 Subject: [PATCH 052/136] fix: Obs.dump can now be provided with a description for the json.gz file --- pyerrors/obs.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pyerrors/obs.py b/pyerrors/obs.py index 681cb270..c596a580 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -597,7 +597,7 @@ class Obs: return dict(zip(self.e_names, sizes)) - def dump(self, filename, datatype="json.gz", **kwargs): + def dump(self, filename, datatype="json.gz", description="", **kwargs): """Dump the Obs to a file 'name' of chosen format. Parameters @@ -607,6 +607,8 @@ class Obs: datatype : str Format of the exported file. Supported formats include "json.gz" and "pickle" + description : str + Description for output file, only relevant for json.gz format. path : str specifies a custom path for the file (default '.') """ @@ -617,7 +619,7 @@ class Obs: if datatype == "json.gz": from .input.json import dump_to_json - dump_to_json([self], file_name) + dump_to_json([self], file_name, description=description) elif datatype == "pickle": with open(file_name + '.p', 'wb') as fb: pickle.dump(self, fb) From 3a6fc810b14b9b840e67543058b83c43ce1409f1 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Mon, 14 Feb 2022 14:06:46 +0000 Subject: [PATCH 053/136] docs: documentation of error propagation for iterative algorithms extended. --- pyerrors/__init__.py | 65 +++++++++++++++++++++++++++++++++++++++++--- pyerrors/fits.py | 10 ++++--- 2 files changed, 67 insertions(+), 8 deletions(-) diff --git a/pyerrors/__init__.py b/pyerrors/__init__.py index 7687ad53..266a7d43 100644 --- a/pyerrors/__init__.py +++ b/pyerrors/__init__.py @@ -247,7 +247,7 @@ my_new_corr = 0.3 * my_corr[2] * my_corr * my_corr + 12 / my_corr For the full API see `pyerrors.correlators.Corr`. -# Complex observables +# Complex valued observables `pyerrors` can handle complex valued observables via the class `pyerrors.obs.CObs`. `CObs` are initialized with a real and an imaginary part which both can be `Obs` valued. @@ -270,9 +270,60 @@ print(my_derived_cobs) > (1.668(23)+0.0j) ``` -# Optimization / fits / roots -`pyerrors.fits` -`pyerrors.roots` +# Error propagation in iterative algorithms + +`pyerrors` supports exact linear error propagation for iterative algorithms like various variants of non-linear least sqaures fits or root finding. The derivatives required for the error propagation are calculated as described in [arXiv:1809.01289](https://arxiv.org/abs/1809.01289). + +## Least squares fits + +Standard non-linear least square fits with errors on the dependent but not the independent variables can be performed with `pyerrors.fits.least_squares`. As default solver the Levenberg-Marquardt algorithm implemented in [scipy](https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.least_squares.html) is used. + +Fit functions have to be of the following form +```python +import autograd.numpy as anp + +def func(a, x): + return a[1] * anp.exp(-a[0] * x) +``` +**It is important that numerical functions refer to `autograd.numpy` instead of `numpy` for the automatic differentiation to work properly.** + +Fits can then be performed via +```python +fit_result = pe.fits.least_squares(x, y, func) +print("\n", fit_result) +> Fit with 2 parameters +> Method: Levenberg-Marquardt +> `ftol` termination condition is satisfied. +> chisquare/d.o.f.: 0.9593035785160936 + +> Goodness of fit: +> χ²/d.o.f. = 0.959304 +> p-value = 0.5673 +> Fit parameters: +> 0 0.0548(28) +> 1 1.933(64) +``` +where x is a `list` or `numpy.array` of `floats` and y is a `list` or `numpy.array` of `Obs`. + +Data stored in `Corr` objects can be fitted directly using the `Corr.fit` method. +```python +my_corr = pe.Corr(y) +fit_result = my_corr.fit(func, fitrange=[12, 25]) +``` +this can simplify working with absolute fit ranges and takes care of gaps in the data automatically. + +For fit functions with multiple independent variables the fit function can be of the form + +```python +def func(a, x): + (x1, x2) = x + return a[0] * x1 ** 2 + a[1] * x2 +``` + +## Total least squares fits +`pyerrors` can also fit data with errors on both the dependent and independent variables using the total least squares method also referred to orthogonal distance regression as implemented in [scipy](https://docs.scipy.org/doc/scipy/reference/odr.html), see `pyerrors.fits.least_squares`. The syntax is identical to the standard least squares case, the only diffrence being that `x` also has to be a `list` or `numpy.array` of `Obs`. + +For the full API see `pyerrors.fits` for fits and `pyerrors.roots` for finding roots of functions. # Matrix operations `pyerrors` provides wrappers for `Obs`-valued matrix operations based on `numpy.linalg`. The supported functions include: @@ -295,6 +346,12 @@ See `pyerrors.obs.Obs.export_jackknife` and `pyerrors.obs.import_jackknife` for # Input `pyerrors` includes an `input` submodule in which input routines and parsers for the output of various numerical programs are contained. For details see `pyerrors.input`. + +# Citing +If you use `pyerrors` for research that leads to a publication please consider citing: +- Ulli Wolff, "Monte Carlo errors with less errors". Comput.Phys.Commun. 156 (2004) 143-153, Comput.Phys.Commun. 176 (2007) 383 (erratum). +- Stefan Schaefer, Rainer Sommer, Francesco Virotta, "Critical slowing down and error analysis in lattice QCD simulations". Nucl.Phys.B 845 (2011) 93-119. +- Alberto Ramos, "Automatic differentiation for error analysis of Monte Carlo data". Comput.Phys.Commun. 238 (2019) 19-35. ''' from .obs import * from .correlators import * diff --git a/pyerrors/fits.py b/pyerrors/fits.py index 599c6eff..339611d6 100644 --- a/pyerrors/fits.py +++ b/pyerrors/fits.py @@ -72,9 +72,10 @@ def least_squares(x, y, func, priors=None, silent=False, **kwargs): fit function, has to be of the form ```python + import autograd.numpy as anp + def func(a, x): - y = a[0] + a[1] * x + a[2] * anp.sinh(x) - return y + return a[0] + a[1] * x + a[2] * anp.sinh(x) ``` For multiple x values func can be of the form @@ -133,9 +134,10 @@ def total_least_squares(x, y, func, silent=False, **kwargs): func has to be of the form ```python + import autograd.numpy as anp + def func(a, x): - y = a[0] + a[1] * x + a[2] * anp.sinh(x) - return y + return a[0] + a[1] * x + a[2] * anp.sinh(x) ``` For multiple x values func can be of the form From ae60c5bb8a0f024255edbfaf6e52319e96ded6ff Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Mon, 14 Feb 2022 14:18:49 +0000 Subject: [PATCH 054/136] docs: documentation for input module restructured. --- pyerrors/__init__.py | 12 +++++------- pyerrors/input/__init__.py | 3 +++ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/pyerrors/__init__.py b/pyerrors/__init__.py index 266a7d43..a87eb9b7 100644 --- a/pyerrors/__init__.py +++ b/pyerrors/__init__.py @@ -338,20 +338,18 @@ For the full API see `pyerrors.fits` for fits and `pyerrors.roots` for finding r For the full API see `pyerrors.linalg`. # Export data -The preferred exported file format within `pyerrors` is json.gz + +The preferred exported file format within `pyerrors` is json.gz. The exact specifications of this formats will be listed here soon. ## Jackknife samples For comparison with other analysis workflows `pyerrors` can generate jackknife samples from an `Obs` object or import jackknife samples into an `Obs` object. See `pyerrors.obs.Obs.export_jackknife` and `pyerrors.obs.import_jackknife` for details. -# Input -`pyerrors` includes an `input` submodule in which input routines and parsers for the output of various numerical programs are contained. For details see `pyerrors.input`. - # Citing If you use `pyerrors` for research that leads to a publication please consider citing: -- Ulli Wolff, "Monte Carlo errors with less errors". Comput.Phys.Commun. 156 (2004) 143-153, Comput.Phys.Commun. 176 (2007) 383 (erratum). -- Stefan Schaefer, Rainer Sommer, Francesco Virotta, "Critical slowing down and error analysis in lattice QCD simulations". Nucl.Phys.B 845 (2011) 93-119. -- Alberto Ramos, "Automatic differentiation for error analysis of Monte Carlo data". Comput.Phys.Commun. 238 (2019) 19-35. +- Ulli Wolff, *Monte Carlo errors with less errors*. Comput.Phys.Commun. 156 (2004) 143-153, Comput.Phys.Commun. 176 (2007) 383 (erratum). +- Stefan Schaefer, Rainer Sommer, Francesco Virotta, *Critical slowing down and error analysis in lattice QCD simulations*. Nucl.Phys.B 845 (2011) 93-119. +- Alberto Ramos, *Automatic differentiation for error analysis of Monte Carlo data*. Comput.Phys.Commun. 238 (2019) 19-35. ''' from .obs import * from .correlators import * diff --git a/pyerrors/input/__init__.py b/pyerrors/input/__init__.py index 2797841c..735de0c3 100644 --- a/pyerrors/input/__init__.py +++ b/pyerrors/input/__init__.py @@ -1,3 +1,6 @@ +r''' +`pyerrors` includes an `input` submodule in which input routines and parsers for the output of various numerical programs are contained. +''' from . import bdio from . import hadrons from . import json From 1a48d6939aad912731e2df477615f050d5252bf5 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Mon, 14 Feb 2022 14:24:30 +0000 Subject: [PATCH 055/136] docs: clarified that matrix operations also work on CObs matrices. --- pyerrors/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyerrors/__init__.py b/pyerrors/__init__.py index a87eb9b7..e423ea8a 100644 --- a/pyerrors/__init__.py +++ b/pyerrors/__init__.py @@ -326,7 +326,7 @@ def func(a, x): For the full API see `pyerrors.fits` for fits and `pyerrors.roots` for finding roots of functions. # Matrix operations -`pyerrors` provides wrappers for `Obs`-valued matrix operations based on `numpy.linalg`. The supported functions include: +`pyerrors` provides wrappers for `Obs`- and `CObs`-valued matrix operations based on `numpy.linalg`. The supported functions include: - `inv` for the matrix inverse. - `cholseky` for the Cholesky decomposition. - `det` for the matrix determinant. From ddfd7a2a394bfd1c65565651992a166281443101 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 15 Feb 2022 12:24:14 +0000 Subject: [PATCH 056/136] fix: removed automatic call to gamma_method in __str__ method of Fit_results class --- pyerrors/__init__.py | 2 +- pyerrors/fits.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/pyerrors/__init__.py b/pyerrors/__init__.py index e423ea8a..d8f526a6 100644 --- a/pyerrors/__init__.py +++ b/pyerrors/__init__.py @@ -195,7 +195,7 @@ Make sure to check the autocorrelation time with e.g. `pyerrors.obs.Obs.plot_rho For the full API see `pyerrors.obs.Obs`. # Correlators -When one is not interested in single observables but correlation functions, `pyerrors` offers the `Corr` class which simplifies the corresponding error propagation and provides the user with a set of standard methods. In order to initialize a `Corr` objects one needs to arrange the data as a list of `Obs´ +When one is not interested in single observables but correlation functions, `pyerrors` offers the `Corr` class which simplifies the corresponding error propagation and provides the user with a set of standard methods. In order to initialize a `Corr` objects one needs to arrange the data as a list of `Obs` ```python my_corr = pe.Corr([obs_0, obs_1, obs_2, obs_3]) print(my_corr) diff --git a/pyerrors/fits.py b/pyerrors/fits.py index 339611d6..061efcd3 100644 --- a/pyerrors/fits.py +++ b/pyerrors/fits.py @@ -39,7 +39,6 @@ class Fit_result(Sequence): [o.gamma_method() for o in self.fit_parameters] def __str__(self): - self.gamma_method() my_str = 'Goodness of fit:\n' if hasattr(self, 'chisquare_by_dof'): my_str += '\u03C7\u00b2/d.o.f. = ' + f'{self.chisquare_by_dof:2.6f}' + '\n' From a0753fa98402987c663af3d26472cc2210d786fc Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 15 Feb 2022 13:16:25 +0000 Subject: [PATCH 057/136] fix: parameter 'means' of Obs.__init__ demoted to a keyword argument. Documentation of 'means' removed from the docstring. --- pyerrors/obs.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/pyerrors/obs.py b/pyerrors/obs.py index c596a580..bba9e43f 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -53,7 +53,7 @@ class Obs: N_sigma_dict = {} filter_eps = 1e-10 - def __init__(self, samples, names, idl=None, means=None, **kwargs): + def __init__(self, samples, names, idl=None, **kwargs): """ Initialize Obs object. Parameters @@ -64,12 +64,9 @@ class Obs: list of strings labeling the individual samples idl : list, optional list of ranges or lists on which the samples are defined - means : list, optional - list of mean values for the case that the mean values were - already subtracted from the samples """ - if means is None and len(samples): + if kwargs.get("means") is None and len(samples): if len(samples) != len(names): raise Exception('Length of samples and names incompatible.') if idl is not None: @@ -115,8 +112,8 @@ class Obs: self._value = 0 self.N = 0 - if means is not None: - for name, sample, mean in sorted(zip(names, samples, means)): + if kwargs.get("means") is not None: + for name, sample, mean in sorted(zip(names, samples, kwargs.get("means"))): self.shape[name] = len(self.idl[name]) self.N += self.shape[name] self.r_values[name] = mean From 5f86aaba4bdb64fced8b0ccdf13f3dcf29d34aa9 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 15 Feb 2022 13:25:01 +0000 Subject: [PATCH 058/136] feat: calls to the gamma_method removed in Corr.__init__ and other method of the Corr class. Test adjusted by adding additional calls to the gamma_method --- pyerrors/correlators.py | 6 ------ tests/correlators_test.py | 5 +++++ 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py index abc4b0a9..7d9e2ae0 100644 --- a/pyerrors/correlators.py +++ b/pyerrors/correlators.py @@ -97,8 +97,6 @@ class Corr: self.T = len(self.content) self.prange = prange - self.gamma_method() - def __getitem__(self, idx): """Return the content of timeslice idx""" if self.content[idx] is None: @@ -139,8 +137,6 @@ class Corr: if self.N == 1: raise Exception("Trying to project a Corr, that already has N=1.") - self.gamma_method() - if vector_l is None: vector_l, vector_r = np.asarray([1.] + (self.N - 1) * [0.]), np.asarray([1.] + (self.N - 1) * [0.]) elif(vector_r is None): @@ -642,7 +638,6 @@ class Corr: xs = [x for x in range(fitrange[0], fitrange[1] + 1) if not self.content[x] is None] ys = [self.content[x][0] for x in range(fitrange[0], fitrange[1] + 1) if not self.content[x] is None] result = least_squares(xs, ys, function, silent=silent, **kwargs) - result.gamma_method() return result def plateau(self, plateau_range=None, method="fit"): @@ -673,7 +668,6 @@ class Corr: return self.fit(const_func, plateau_range)[0] elif method in ["avg", "average", "mean"]: returnvalue = np.mean([item[0] for item in self.content[plateau_range[0]:plateau_range[1] + 1] if item is not None]) - returnvalue.gamma_method() return returnvalue else: diff --git a/tests/correlators_test.py b/tests/correlators_test.py index 2bbea0b5..550e2a5b 100644 --- a/tests/correlators_test.py +++ b/tests/correlators_test.py @@ -24,6 +24,7 @@ def test_function_overloading(): for i, f in enumerate(fs): t1 = f([corr_a, corr_b]) + t1.gamma_method() 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() @@ -175,6 +176,7 @@ def test_utility(): corr_content.append(pe.pseudo_Obs(2 + 10 ** exponent, 10 ** (exponent - 1), 't')) corr = pe.correlators.Corr(corr_content) + corr.gamma_method() corr.print() corr.print([2, 4]) corr.show() @@ -183,6 +185,7 @@ def test_utility(): corr.dump('test_dump', datatype="pickle", path='.') corr.dump('test_dump', datatype="pickle") new_corr = pe.load_object('test_dump.p') + new_corr.gamma_method() os.remove('test_dump.p') for o_a, o_b in zip(corr.content, new_corr.content): assert np.isclose(o_a[0].value, o_b[0].value) @@ -192,6 +195,7 @@ def test_utility(): corr.dump('test_dump', datatype="json.gz", path='.') corr.dump('test_dump', datatype="json.gz") new_corr = pe.input.json.load_json('test_dump') + new_corr.gamma_method() os.remove('test_dump.json.gz') for o_a, o_b in zip(corr.content, new_corr.content): assert np.isclose(o_a[0].value, o_b[0].value) @@ -288,6 +292,7 @@ def test_thin(): c = pe.Corr([pe.pseudo_Obs(i, .1, 'test') for i in range(10)]) c *= pe.cov_Obs(1., .1, '#ren') thin = c.thin() + thin.gamma_method() thin.fit(lambda a, x: a[0] * x) c.thin(offset=1) c.thin(3, offset=1) From 199df2b344caf80789de4ff5c284d23592a8f1a1 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 15 Feb 2022 13:38:22 +0000 Subject: [PATCH 059/136] docs: correlator examples updated with additional calls to gamma_method --- examples/02_correlators.ipynb | 3 ++- examples/04_fit_example.ipynb | 7 +++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/examples/02_correlators.ipynb b/examples/02_correlators.ipynb index 76234ceb..fe1028e1 100644 --- a/examples/02_correlators.ipynb +++ b/examples/02_correlators.ipynb @@ -68,7 +68,8 @@ "metadata": {}, "outputs": [], "source": [ - "my_correlator = pe.Corr(correlator_data)" + "my_correlator = pe.Corr(correlator_data)\n", + "my_correlator.gamma_method()" ] }, { diff --git a/examples/04_fit_example.ipynb b/examples/04_fit_example.ipynb index 06bfc29d..554c6be3 100644 --- a/examples/04_fit_example.ipynb +++ b/examples/04_fit_example.ipynb @@ -46,7 +46,8 @@ } ], "source": [ - "fP = pe.Corr(pe.input.json.load_json(\"./data/f_P\"), padding=[1, 1])" + "fP = pe.Corr(pe.input.json.load_json(\"./data/f_P\"), padding=[1, 1])\n", + "fP.gamma_method()" ] }, { @@ -116,6 +117,7 @@ "stop_fit = 18\n", "\n", "fit_result = fP.fit(func_exp, [start_fit, stop_fit], resplot=True)\n", + "fit_result.gamma_method()\n", "print(\"\\n\", fit_result)" ] }, @@ -197,6 +199,7 @@ } ], "source": [ + "m_eff_fP.gamma_method()\n", "m_eff_plateau = m_eff_fP.plateau([start_fit, stop_fit])\n", "m_eff_plateau.gamma_method()\n", "print()\n", @@ -320,7 +323,7 @@ } ], "source": [ - "beta = pe.fits.odr_fit(ox, oy, func)\n", + "beta = pe.fits.total_least_squares(ox, oy, func)\n", "\n", "for i, item in enumerate(beta):\n", " item.gamma_method()\n", From 891f77bcef2783c32f7d47ad60b3bae1ae6537c1 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 15 Feb 2022 13:40:50 +0000 Subject: [PATCH 060/136] docs: typo in gevp example fixed, additional call to gamma_method added. --- examples/06_gevp.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/06_gevp.ipynb b/examples/06_gevp.ipynb index 5f9b6b61..480afe3a 100644 --- a/examples/06_gevp.ipynb +++ b/examples/06_gevp.ipynb @@ -130,7 +130,7 @@ "metadata": {}, "outputs": [], "source": [ - "single_smearing = matrix_V1V1.index(0,0)" + "single_smearing = matrix_V1V1.item(0,0)" ] }, { @@ -284,7 +284,7 @@ "m_eff_Jpsi = corr_ground.m_eff(variant=\"cosh\")\n", "\n", "# We can now pick a plateau range and get a single value for the mass. \n", - "\n", + "m_eff_Jpsi.gamma_method()\n", "m_Jpsi = m_eff_Jpsi.plateau([5, 24])\n", "\n", "# We can now visually compare our plateau value to the data\n", From 0d201081fc54142bac6614bed3b9706886049b07 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 15 Feb 2022 16:10:41 +0000 Subject: [PATCH 061/136] feat: auto_gamma parameter introduced to Corr.show --- pyerrors/correlators.py | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py index 7d9e2ae0..46735361 100644 --- a/pyerrors/correlators.py +++ b/pyerrors/correlators.py @@ -685,8 +685,8 @@ class Corr: self.prange = prange return - def show(self, x_range=None, comp=None, y_range=None, logscale=False, plateau=None, fit_res=None, ylabel=None, save=None): - """Plots the correlator, uses tag as label if available. + def show(self, x_range=None, comp=None, y_range=None, logscale=False, plateau=None, fit_res=None, ylabel=None, save=None, auto_gamma=False): + """Plots the correlator using the tag of the correlator as label if available. Parameters ---------- @@ -694,19 +694,26 @@ class Corr: list of two values, determining the range of the x-axis e.g. [4, 8] comp : Corr or list of Corr Correlator or list of correlators which are plotted for comparison. + The tags of these correlators are used as labels if available. logscale : bool Sets y-axis to logscale plateau : Obs - plateau to be visualized in the figure + Plateau value to be visualized in the figure fit_res : Fit_result Fit_result object to be visualized ylabel : str Label for the y-axis save : str path to file in which the figure should be saved + auto_gamma : bool + Apply the gamma method with standard parameters to all correlators and plateau values before plotting. """ if self.N != 1: raise Exception("Correlator must be projected before plotting") + + if auto_gamma: + self.gamma_method() + if x_range is None: x_range = [0, self.T - 1] @@ -718,7 +725,6 @@ class Corr: if logscale: ax1.set_yscale('log') else: - # we generate ylim instead of using autoscaling. if y_range is None: try: y_min = min([(x[0].value - x[0].dvalue) for x in self.content[x_range[0]: x_range[1] + 1] if (x is not None) and x[0].dvalue < 2 * np.abs(x[0].value)]) @@ -731,17 +737,21 @@ class Corr: if comp: if isinstance(comp, (Corr, list)): for corr in comp if isinstance(comp, list) else [comp]: + if auto_gamma: + corr.gamma_method() x, y, y_err = corr.plottable() plt.errorbar(x, y, y_err, label=corr.tag, mfc=plt.rcParams['axes.facecolor']) else: - raise Exception('comp must be a correlator or a list of correlators.') + raise Exception("'comp' must be a correlator or a list of correlators.") if plateau: if isinstance(plateau, Obs): + if auto_gamma: + plateau.gamma_method() ax1.axhline(y=plateau.value, linewidth=2, color=plt.rcParams['text.color'], alpha=0.6, marker=',', ls='--', label=str(plateau)) ax1.axhspan(plateau.value - plateau.dvalue, plateau.value + plateau.dvalue, alpha=0.25, color=plt.rcParams['text.color'], ls='-') else: - raise Exception('plateau must be an Obs') + raise Exception("'plateau' must be an Obs") if self.prange: ax1.axvline(self.prange[0], 0, 1, ls='-', marker=',') ax1.axvline(self.prange[1], 0, 1, ls='-', marker=',') @@ -766,7 +776,7 @@ class Corr: if isinstance(save, str): fig.savefig(save) else: - raise Exception("Safe has to be a string.") + raise Exception("'save' has to be a string.") return From a8d9846fbbb7f32411b6a8581f460d199f5734eb Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 15 Feb 2022 16:35:30 +0000 Subject: [PATCH 062/136] feat: introduced cfg_separator parameter to read_sfcf which allows to use custom cfg separators different from "n" --- pyerrors/input/sfcf.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pyerrors/input/sfcf.py b/pyerrors/input/sfcf.py index 5a22c3cd..e520f7f3 100644 --- a/pyerrors/input/sfcf.py +++ b/pyerrors/input/sfcf.py @@ -6,7 +6,7 @@ from ..obs import Obs from . import utils -def read_sfcf(path, prefix, name, quarks='.*', corr_type='bi', noffset=0, wf=0, wf2=0, version="1.0c", **kwargs): +def read_sfcf(path, prefix, name, quarks='.*', corr_type='bi', noffset=0, wf=0, wf2=0, version="1.0c", cfg_separator="n", **kwargs): """Read sfcf c format from given folder structure. Parameters @@ -40,6 +40,8 @@ def read_sfcf(path, prefix, name, quarks='.*', corr_type='bi', noffset=0, wf=0, append a "c" to the version (e.g. "1.0c") if the append output option (-a) was specified, append an "a" to the version + cfg_separator : str + String that separates the ensemble identifier from the configuration number (default 'n'). replica: list list of replica to be read, default is all files: list @@ -177,7 +179,7 @@ def read_sfcf(path, prefix, name, quarks='.*', corr_type='bi', noffset=0, wf=0, for cfg in sub_ls: try: if compact: - rep_idl.append(int(cfg.split("n")[-1])) + rep_idl.append(int(cfg.split(cfg_separator)[-1])) else: rep_idl.append(int(cfg[3:])) except Exception: @@ -323,7 +325,7 @@ def read_sfcf(path, prefix, name, quarks='.*', corr_type='bi', noffset=0, wf=0, stop = start + data_starts[1] chunk = content[start:stop] try: - rep_idl.append(int(chunk[gauge_line].split("n")[-1])) + rep_idl.append(int(chunk[gauge_line].split(cfg_separator)[-1])) except Exception: raise Exception("Couldn't parse idl from directory, problem with chunk around line ", gauge_line) From 815970e780a22f63c9a6092d718a7ff3e5b37c8b Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 15 Feb 2022 17:02:03 +0000 Subject: [PATCH 063/136] fix: calls to gamma_method added to T_symmetric and antisymmetric methods of the Corr class to restore original functionality --- pyerrors/correlators.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py index 7d9e2ae0..fa4eb4b1 100644 --- a/pyerrors/correlators.py +++ b/pyerrors/correlators.py @@ -218,7 +218,9 @@ class Corr: if self.T % 2 != 0: raise Exception("Can not symmetrize odd T") - if not all([o.is_zero_within_error(3) for o in self.content[0]]): + test = 1 * self + test.gamma_method() + if not all([o.is_zero_within_error(3) for o in test.content[0]]): warnings.warn("Correlator does not seem to be anti-symmetric around x0=0.", RuntimeWarning) newcontent = [self.content[0]] @@ -455,7 +457,9 @@ class Corr: T_partner = parity * partner.reverse() t_slices = [] - for x0, t_slice in enumerate((self - T_partner).content): + test = (self - T_partner) + test.gamma_method() + for x0, t_slice in enumerate(test.content): if t_slice is not None: if not t_slice[0].is_zero_within_error(5): t_slices.append(x0) From 1ea759f1cc68262488712f5dc8635cfa3f5bd7b9 Mon Sep 17 00:00:00 2001 From: jkuhl-uni Date: Tue, 15 Feb 2022 22:03:52 +0100 Subject: [PATCH 064/136] bug fix: read methods are in fact closing files now --- pyerrors/input/sfcf.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pyerrors/input/sfcf.py b/pyerrors/input/sfcf.py index bd5c95e1..112a9836 100644 --- a/pyerrors/input/sfcf.py +++ b/pyerrors/input/sfcf.py @@ -224,6 +224,7 @@ def read_sfcf(path, prefix, name, quarks='.*', corr_type='bi', noffset=0, wf=0, read = 1 start = k + 1 print(str(T) + " entries found.") + file.close() else: pattern = 'name ' + name + '\nquarks ' + quarks + '\noffset ' + str(noffset) + '\nwf ' + str(wf) if b2b: @@ -243,8 +244,11 @@ def read_sfcf(path, prefix, name, quarks='.*', corr_type='bi', noffset=0, wf=0, T = content[match.start():].count('\n', 0, end_match.start()) - 4 - b2b assert T > 0 print(T, 'entries, starting to read in line', start_read) + file.close() else: + file.close() raise Exception('Correlator with pattern\n' + pattern + '\nnot found.') + # we found where the correlator # that is to be read is in the files # after preparing the datastructure From 0c1b11f8ac1c6172646bacba27bc862711924a42 Mon Sep 17 00:00:00 2001 From: jkuhl-uni Date: Tue, 15 Feb 2022 22:15:51 +0100 Subject: [PATCH 065/136] and again flake8 --- pyerrors/input/sfcf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyerrors/input/sfcf.py b/pyerrors/input/sfcf.py index 112a9836..a9c39bd7 100644 --- a/pyerrors/input/sfcf.py +++ b/pyerrors/input/sfcf.py @@ -248,7 +248,7 @@ def read_sfcf(path, prefix, name, quarks='.*', corr_type='bi', noffset=0, wf=0, else: file.close() raise Exception('Correlator with pattern\n' + pattern + '\nnot found.') - + # we found where the correlator # that is to be read is in the files # after preparing the datastructure From bd20057f5219a0fc75b19bb3d92545c8c8e285ab Mon Sep 17 00:00:00 2001 From: Simon Kuberski Date: Wed, 16 Feb 2022 11:13:11 +0100 Subject: [PATCH 066/136] Cut RAM requirements for reading JSON in half --- pyerrors/input/json.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/pyerrors/input/json.py b/pyerrors/input/json.py index b53d4e3d..c7f8cf7f 100644 --- a/pyerrors/input/json.py +++ b/pyerrors/input/json.py @@ -6,6 +6,7 @@ import datetime import platform import warnings import re +import gc import numpy as np from ..obs import Obs from ..covobs import Covobs @@ -38,6 +39,8 @@ def create_json_string(ol, description='', indent=1): my_encoder.default = _default class Deltalist: + __slots__ = ['cnfg', 'deltas'] + def __init__(self, li): self.cnfg = li[0] self.deltas = li[1:] @@ -53,6 +56,8 @@ def create_json_string(ol, description='', indent=1): return self.__repr__() class Floatlist: + __slots__ = ['li'] + def __init__(self, li): self.li = list(li) @@ -222,14 +227,18 @@ def create_json_string(ol, description='', indent=1): else: raise Exception("Unkown datatype.") - jsonstring = json.dumps(d, indent=indent, cls=my_encoder, ensure_ascii=False) + jsonstring = '' + for chunk in my_encoder(indent=indent, ensure_ascii=False).iterencode(d): + jsonstring += chunk - def remove_quotationmarks(s): + del d + gc.collect() + + def remove_quotationmarks_split(split): """Workaround for un-quoting of delta lists, adds 5% of work but is save, compared to a simple replace that could destroy the structure """ deltas = False - split = s.split('\n') for i in range(len(split)): if '"deltas":' in split[i] or '"cov":' in split[i] or '"grad":' in split[i]: deltas = True @@ -239,7 +248,8 @@ def create_json_string(ol, description='', indent=1): deltas = False return '\n'.join(split) - jsonstring = remove_quotationmarks(jsonstring) + jsonstring = jsonstring.split('\n') + jsonstring = remove_quotationmarks_split(jsonstring) jsonstring = jsonstring.replace('nan', 'NaN') return jsonstring From 005f54e0d127e1c017e17cb763b5ef81f68ff479 Mon Sep 17 00:00:00 2001 From: Simon Kuberski Date: Wed, 16 Feb 2022 11:26:06 +0100 Subject: [PATCH 067/136] Reduce RAM requirements when reading a JSON file --- pyerrors/input/json.py | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/pyerrors/input/json.py b/pyerrors/input/json.py index c7f8cf7f..a4fab75e 100644 --- a/pyerrors/input/json.py +++ b/pyerrors/input/json.py @@ -291,8 +291,9 @@ def dump_to_json(ol, fname, description='', indent=1, gz=True): fp.close() -def import_json_string(json_string, verbose=True, full_output=False): - """Reconstruct a list of Obs or structures containing Obs from a json string. +def _parse_json_dict(json_dict, verbose=True, full_output=False): + """Reconstruct a list of Obs or structures containing Obs from a dict that + was built out of a json string. The following structures are supported: Obs, list, numpy.ndarray, Corr If the list contains only one element, it is unpacked from the list. @@ -446,8 +447,6 @@ def import_json_string(json_string, verbose=True, full_output=False): my_corr.prange = temp_prange return my_corr - json_dict = json.loads(json_string) - prog = json_dict.get('program', '') version = json_dict.get('version', '') who = json_dict.get('who', '') @@ -495,6 +494,26 @@ def import_json_string(json_string, verbose=True, full_output=False): return ol +def import_json_string(json_string, verbose=True, full_output=False): + """Reconstruct a list of Obs or structures containing Obs from a json string. + + The following structures are supported: Obs, list, numpy.ndarray, Corr + If the list contains only one element, it is unpacked from the list. + + Parameters + ---------- + json_string : str + json string containing the data. + verbose : bool + Print additional information that was written to the file. + full_output : bool + If True, a dict containing auxiliary information and the data is returned. + If False, only the data is returned. + """ + + return _parse_json_dict(json.loads(json_string), verbose, full_output) + + def load_json(fname, verbose=True, gz=True, full_output=False): """Import a list of Obs or structures containing Obs from a .json(.gz) file. @@ -519,14 +538,14 @@ def load_json(fname, verbose=True, gz=True, full_output=False): if not fname.endswith('.gz'): fname += '.gz' with gzip.open(fname, 'r') as fin: - d = fin.read().decode('utf-8') + d = json.load(fin) else: if fname.endswith('.gz'): warnings.warn("Trying to read from %s without unzipping!" % fname, UserWarning) with open(fname, 'r', encoding='utf-8') as fin: - d = fin.read() + d = json.loads(fin.read()) - return import_json_string(d, verbose, full_output) + return _parse_json_dict(d, verbose, full_output) def _ol_from_dict(ind, reps='DICTOBS'): From ed8274d7c4a55d4325607b33f4c581f60f9ec84a Mon Sep 17 00:00:00 2001 From: Simon Kuberski Date: Wed, 16 Feb 2022 14:27:40 +0100 Subject: [PATCH 068/136] Added JSON schema for validation and documentation purposes --- examples/json_schema.json | 343 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 343 insertions(+) create mode 100644 examples/json_schema.json diff --git a/examples/json_schema.json b/examples/json_schema.json new file mode 100644 index 00000000..81d12599 --- /dev/null +++ b/examples/json_schema.json @@ -0,0 +1,343 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "https://github.com/fjosw/pyerrors/tree/develop/examples/json_schema.json", + "type": "object", + "title": "pyerrors JSON file format", + "description": "Schema to validate JSON files according to the pyerrors file format 1.0.", + "required": [ + "obsdata" + ], + "optional": [ + "program", + "version", + "who", + "date", + "host", + "description" + ], + "properties": { + "program": { + "type": "string", + "description": "The program that was used to write the file", + "examples": [ + "pyerrors" + ] + }, + "version": { + "type": "string", + "description": "The version of the file format.", + "examples": [ + "1.0" + ] + }, + "who": { + "type": "string", + "description": "The username of the creator of this file." + }, + "date": { + "type": "string", + "description": "Date, when this file has been written.", + "examples": [ + "2021-11-29 09:55:05" + ] + }, + "host": { + "type": "string", + "description": "Hostname of the machine where the file has been written." + }, + "description": { + "type": "string", + "description": "A string that describes the content of the file." + }, + "obsdata": { + "type": "array", + "description": "Contains the actual data. One entry per structure. A structure is either a single Obs or a one-dimensional representation of a multi-dimensional object (list, array, Corr). Each Obs inside a structure has to be defined on the same set of configs.", + "items": { + "$ref": "#/$defs/obsdata_items" + } + } + }, + "$defs": { + "obsdata_items": { + "type": "object", + "description": "Contains the information for one structure of Observables.", + "required": [ + "type", + "value" + ], + "optional": [ + "layout", + "tag", + "reweighted", + "data", + "cdata" + ], + "properties": { + "type": { + "type": "string", + "description": "Specifies the type of the structure, needed for the correct parsing of flattened structures.", + "examples": [ + "Obs", "List", "Array", "Corr" + ] + }, + "layout": { + "type": "string", + "description": "The layout of the structure. One entry per dimension, separated by commas", + "default": "1", + "examples": [ + "1", "1, 2", "2, 2, 4" + ] + }, + "value": { + "type": "array", + "description": "The mean values of all Obs inside the structure.", + "examples": [ + [1.2], + [2.3, 2.1, 3.1] + ], + "items": [{ + "type": "number", + "description": "A mean value of an Obs." + }] + }, + "tag": { + "type": "string", + "description": "Optional descriptor of the structure." + }, + "reweighted": { + "type": "boolean", + "description": "May be used to specify whether the Obs inside the structure have been reweighted." + }, + "data": { + "type": "array", + "description": "Contains the data for each ensemble.", + "items": { + "$ref": "#/$defs/ensdata_items" + } + }, + "cdata": { + "type": "array", + "description": "Contains the data for each covariance matrix.", + "items": { + "$ref": "#/$defs/cdata_items" + } + } + } + }, + "ensdata_items": { + "type": "object", + "description": "The data for one single ensemble", + "required": [ + "id", + "replica" + ], + "properties": { + "id": { + "type": "string", + "description": "The id of the ensemble" + }, + "replica": { + "type": "array", + "description": "Contains the data for each replica of the ensemble.", + "items": { + "$ref": "#/$defs/repdata_items" + } + } + } + }, + + "repdata_items": { + "type": "object", + "description": "The data for one single replica", + "required": [ + "name", + "deltas" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the replica." + }, + "deltas": { + "type": "array", + "description": "The actual data: Contains configuration numbers and the deltas, i.e., the deviations from the mean value, for each Obs inside the structure.", + "items": { + "$ref": "#/$defs/deltas_items" + } + } + } + }, + + "deltas_items": { + "type": "array", + "description": "First entry is the configuration number. Each further entry is the delta, i.e., the deviation from the mean value, for one Obs inside the structure.", + "prefixItems": [{ + "type": "integer" + }], + "items": [{ + "type": "number" + }] + }, + + "cdata_items": { + "type": "object", + "description": "Contains the data for one covariance matrix.", + "required": [ + "id", + "layout", + "cov", + "grad" + ], + "properties": { + "id": { + "type": "string", + "description": "The identifier of the covariance matrix." + }, + "layout": { + "type": "string", + "description": "The layout of the NxN covariance matrix", + "examples": [ + "1, 1", "2, 2" + ] + }, + "cov": { + "type": "array", + "description": "Contains the NxN covariance matrix, stored in row-major format.", + "items": [{ + "type": "number" + }] + }, + "grad": { + "type": "array", + "description": "The gradient of all Obs inside the structure with respect to the corresponding (diagonal) elements of the covariance matrix.", + "items": [{ + "type": "array", + "description": "The gradient of all Obs with respect to the Ith element of the covariance matrix, where I is the position of this array inside grad.", + "items": [{ + "type": "number" + }] + }] + } + } + } + }, + "examples": [ + { + "program": "pyerrors 2.0.0+dev", + "version": "1.0", + "who": "s-kuberski", + "date": "2022-02-16 12:59:09 +0100", + "host": "Hostname", + "obsdata": [ + { + "type": "Obs", + "layout": "1", + "value": [ + 1.0 + ], + "data": [ + { + "id": "A", + "replica": [ + { + "name": "A|r1", + "deltas": [ + [1, -4.579833517667820e-02], + [2, 1.272532469141094e-01], + [3, -7.042514710393744e-02], + [4, -4.800967024769492e-01], + [5, 2.967284377711763e-01], + [6, 3.156118966788146e-01], + [7, 1.139599354351861e-02], + [8, -1.546693901500542e-01] + ] + }, + { + "name": "A|r2", + "deltas": [ + [1, 2.003189752235817e-01], + [2, 1.456782186748891e-01], + [3, -2.417953154609670e-01], + [4, 1.112557347812830e-01], + [5, -6.889549539458262e-02], + [6, 2.984543471692340e-01], + [7, -4.874803852180309e-01], + [8, 4.246392022459267e-02] + ] + } + ] + }, + { + "id": "B", + "replica": [ + { + "name": "B|r1", + "deltas": [ + [1, -2.726195322210824e-01], + [2, 3.949288132215630e-01], + [3, -2.832514721110847e-01], + [4, -8.371015800402004e-02], + [5, 2.643463355004773e-01], + [6, -2.265154600267616e-02], + [7, -1.954084091845127e-01], + [8, 1.983659688013363e-01] + ] + } + ] + } + ], + "cdata": [ + { + "id": "#renorm", + "layout": "2, 2", + "cov": [1.000000000000000e-01, 5.000000000000000e-02, 5.000000000000000e-02, 2.000000000000000e-02], + "grad": [ + [1.000000000000000e+00], + [0.000000000000000e+00] + ] + } + ] + }, + { + "type": "List", + "layout": "2", + "value": [ + 1.2, + 0.8333333333333334 + ], + "data": [ + { + "id": "B", + "replica": [ + { + "name": "B|r1", + "deltas": [ + [1, 2.368958758731594e-01, 1.645110249119163e-01], + [2, 3.164596213857241e-01, 2.197636259623084e-01], + [3, -2.422021289001151e-01, -1.681959228473022e-01], + [4, 1.365207560473117e-01, 9.480608058841092e-02], + [5, -1.958565486752142e-02, -1.360114921355654e-02], + [6, -6.335145310374894e-01, -4.399406465538122e-01], + [7, 1.945374561549609e-02, 1.350954556631673e-02], + [8, 1.859723158834354e-01, 1.291474415857190e-01] + ] + } + ] + } + ], + "cdata": [ + { + "id": "renorm", + "layout": "2, 2", + "cov": [1.000000000000000e-01, 5.000000000000000e-02, 5.000000000000000e-02, 2.000000000000000e-02], + "grad": [ + [1.000000000000000e+00, -6.944444444444444e-01], + [0.000000000000000e+00, 0.000000000000000e+00] + ] + } + ] + } + ] + } + ] +} \ No newline at end of file From 0e073da5c6c92172bc3f29c351dca1959acedbe2 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Thu, 17 Feb 2022 09:32:34 +0000 Subject: [PATCH 069/136] refactor: calculation of permutations in correlator module simplified. --- pyerrors/correlators.py | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py index db3821b9..890e3f07 100644 --- a/pyerrors/correlators.py +++ b/pyerrors/correlators.py @@ -1,4 +1,5 @@ import warnings +from itertools import permutations import numpy as np import autograd.numpy as anp import matplotlib.pyplot as plt @@ -1057,7 +1058,7 @@ def _sort_vectors(vec_set, ts): if vec_set[t] is None: sorted_vec_set.append(None) elif not t == ts: - perms = permutation([i for i in range(N)]) + perms = [list(o) for o in permutations([i for i in range(N)], N)] best_score = 0 for perm in perms: current_score = 1 @@ -1075,19 +1076,6 @@ def _sort_vectors(vec_set, ts): return sorted_vec_set -def permutation(lst): # Shamelessly copied - if len(lst) == 1: - return [lst] - ll = [] - for i in range(len(lst)): - m = lst[i] - remLst = lst[:i] + lst[i + 1:] - # Generating all permutations where m is first - for p in permutation(remLst): - ll.append([m] + p) - return ll - - def _GEVP_solver(Gt, G0): # Just so normalization an sorting does not need to be repeated. Here we could later put in some checks sp_val, sp_vecs = scipy.linalg.eig(Gt, G0) sp_vecs = [sp_vecs[:, np.argsort(sp_val)[-i]] for i in range(1, sp_vecs.shape[0] + 1)] From ef98a5a9741fcaee2bb9de429ea077dc93b57aeb Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Thu, 17 Feb 2022 13:01:56 +0000 Subject: [PATCH 070/136] fix: redundant argument 'tree' removed from read_meson_hd5 --- pyerrors/input/hadrons.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyerrors/input/hadrons.py b/pyerrors/input/hadrons.py index cea7fb81..a03dc6c6 100644 --- a/pyerrors/input/hadrons.py +++ b/pyerrors/input/hadrons.py @@ -49,7 +49,7 @@ def _get_files(path, filestem, idl): return filtered_files, idx -def read_meson_hd5(path, filestem, ens_id, meson='meson_0', tree='meson', idl=None): +def read_meson_hd5(path, filestem, ens_id, meson='meson_0', idl=None): """Read hadrons meson hdf5 file and extract the meson labeled 'meson' Parameters From 951233ab7958a49ac0ca712f0d10fb08b3574c2a Mon Sep 17 00:00:00 2001 From: JanNeuendorf Date: Fri, 18 Feb 2022 09:46:07 +0100 Subject: [PATCH 071/136] Fixed bug in Corr._init_() , added auto_gamma argument to plateaus and updated the examples. --- examples/02_correlators.ipynb | 26 +++++++++--------- examples/05_matrix_operations.ipynb | 4 +-- examples/06_gevp.ipynb | 42 +++++++++++++---------------- pyerrors/correlators.py | 10 ++++--- 4 files changed, 40 insertions(+), 42 deletions(-) diff --git a/examples/02_correlators.ipynb b/examples/02_correlators.ipynb index fe1028e1..a647162e 100644 --- a/examples/02_correlators.ipynb +++ b/examples/02_correlators.ipynb @@ -105,7 +105,7 @@ "id": "b00d670b", "metadata": {}, "source": [ - "The `show` method can display the correlator" + "The `show` method can display the correlator. The argument auto_gamma tells `show` to calculate the y-errors using the gamma method with the default parameters." ] }, { @@ -116,7 +116,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -128,7 +128,7 @@ } ], "source": [ - "my_correlator.show()" + "my_correlator.show(auto_gamma=True)" ] }, { @@ -193,7 +193,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -205,7 +205,7 @@ } ], "source": [ - "shifted_correlator.show(comp=symmetrised_correlator, logscale=True)" + "shifted_correlator.show(comp=symmetrised_correlator, logscale=True, auto_gamma=True)" ] }, { @@ -270,7 +270,7 @@ "outputs": [ { "data": { - "image/png": "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DTI+o7PfGNPin81prU0YY8Dp6gz8ntbao8BRXx2ynEJERALbfif84psT9/9gU+r2JV+Hj3ZOLCdSYULR3QngtoCd62/9MsbY9O5I37EGYAfOOLN42r5mYDtwOO14xN23wA1sgd4zQx1qgBF1d4qITIL0lrRs1JImM9xM7O7swmkB87ouW/Atj+GOL2vxZnNaa2PGmM1pXZobgZi7lAYZjrcC/b6Wt5zvKSIiU0jhSyRFaFrSILm4rBeqGn0zMb1B/x3W2nrfvgip65rVu2USWY4v9J8z33sWUF+1pImIiEgghbakhSqkzTQKaSIiIhJUoSEtFIvZioiIiEgqhTQRERGREFJIExEREQkhhTQRERGREFJIExEREQkhhTQRERGREFJIExEREQkhhTQRERGREFJIExEREQkhhTQRERGREFJIExEREQkhhTQRERGREFJIExEREQkhhTQRERGREFJIExEREQkhhTQRERGREFJIExEREQkhhTQRERGREFJIExEREQkhhTQRERGREFJIExEREQkhhTQRERGREFJIExEREQkhhTQRERGREFJIExEREQkhhTQRERGREFJIExEREQkhhTQRERGREFJIExEREQkhhTQRERGREJoz3RXwM8a0Awl3M2Kt3ZynfATY4G7WA1Fgk7U24SvT7juOtbbNd6wJaAMGgDjQDGyz1vaXeCkiIiIiJQlNSPPClLW2191uMsb0+ENVBt1At7U27r6mB+jDCVsYY7qttR2+9+gxxgxYa5vdXRGgCWjBCWndCmgiIiISBmHq7uwEer0Na+0g0JrnNVGcgOUZAtZCspWtwf3s6QGajDFR376V1lpjra33AqKIiIjIdAtFS5obmiL+bkrfsSY3sE3gaxHzNAL+smtxglzM3Y67nyNF1nMuMNe3a14x5xERERHJJxQhDSdIZZKgwEBljGlxy64HcAPfgrRiTe7nuG/fBmPMMFAL1Pu7RzPoBG4opD4iIiIipQhLSMvGC09Z+SYPRIC+TK1xPp1Am69MDMA3pq3VGNNnrV2f5fVdwLd82/OAF3NegYiIiEgRwh7ScgY0SLaYeZMNWo0xh3HGmSX85Ywx3cAW/7gzL5z53Af0GGMydr1aa48CR33nLPhCRERERIIIy8SB9LDkiWQ7ZoyJGGO60yYGDDI+Y9NftgUYSl/Sw92f5Atm2bpfRURERKZE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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -301,7 +301,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -314,7 +314,7 @@ ], "source": [ "difference_m_eff = np.abs(periodic_m_eff - m_eff)\n", - "difference_m_eff.show([0, 47], logscale=True)" + "difference_m_eff.show([0, 47], logscale=True, auto_gamma=True)" ] }, { @@ -357,13 +357,13 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 19, "id": "165550d9", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -375,7 +375,7 @@ } ], "source": [ - "symmetrised_correlator.show([5, 20], comp=[first_derivative, second_derivative], y_range=[-500, 1300])" + "symmetrised_correlator.show([5, 20], comp=[first_derivative, second_derivative], y_range=[-500, 1300], auto_gamma=True)" ] }, { @@ -480,7 +480,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -494,7 +494,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/examples/05_matrix_operations.ipynb b/examples/05_matrix_operations.ipynb index 926d1734..a49a7ee0 100644 --- a/examples/05_matrix_operations.ipynb +++ b/examples/05_matrix_operations.ipynb @@ -393,7 +393,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -407,7 +407,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/examples/06_gevp.ipynb b/examples/06_gevp.ipynb index 480afe3a..73b6f980 100644 --- a/examples/06_gevp.ipynb +++ b/examples/06_gevp.ipynb @@ -72,10 +72,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[Obs[0.95214(67)] Obs[0.01240(11)] Obs[0.005965(72)] Obs[0.002719(40)]]\n", - " [Obs[0.01241(12)] Obs[0.004389(60)] Obs[0.002672(41)] Obs[0.001432(25)]]\n", - " [Obs[0.005975(74)] Obs[0.002672(41)] Obs[0.001741(29)] Obs[0.000990(18)]]\n", - " [Obs[0.002729(41)] Obs[0.001433(25)] Obs[0.000990(18)] Obs[0.000596(12)]]]\n" + "[[Obs[0.9521372299563664] Obs[0.012396221358945024]\n", + " Obs[0.005964522290444636] Obs[0.00271868582032491]]\n", + " [Obs[0.012406080421737313] Obs[0.004389377599144552]\n", + " Obs[0.0026720900942348203] Obs[0.0014322792739559524]]\n", + " [Obs[0.00597528112202714] Obs[0.0026722311560493962]\n", + " Obs[0.0017410144722897988] Obs[0.0009900129922259138]]\n", + " [Obs[0.002728787039125839] Obs[0.001432511366233049]\n", + " Obs[0.0009901084333529782] Obs[0.0005964594911910594]]]\n" ] } ], @@ -188,7 +192,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -200,7 +204,7 @@ } ], "source": [ - "matrix_V1V1.projected(vec).m_eff().show(comp=single_smearing.m_eff())" + "matrix_V1V1.projected(vec).m_eff().show(comp=single_smearing.m_eff(), auto_gamma=True)" ] }, { @@ -232,7 +236,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 12, "id": "def98bc0", "metadata": {}, "outputs": [ @@ -240,22 +244,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "Data has been written using pyerrors 2.0.0+dev.\n", - "Format version 0.1\n", - "Written by jan on 2022-01-27 10:49:51 +0100 on host endwings, Linux-5.13.0-27-generic-x86_64-with-glibc2.10\n", - "Data has been written using pyerrors 2.0.0+dev.\n", - "Format version 0.1\n", - "Written by jan on 2022-01-27 10:49:51 +0100 on host endwings, Linux-5.13.0-27-generic-x86_64-with-glibc2.10\n", - "Fit with 1 parameter\n", - "Method: Levenberg-Marquardt\n", - "`ftol` termination condition is satisfied.\n", - "chisquare/d.o.f.: 0.692947327942094\n", "--- The mass was calculated to be 3079.8(7.9) MeV ---\n" ] }, { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkoAAAGLCAYAAAA4f70VAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA1NklEQVR4nO3df2wc52Hm8eelJJOyRHJNpzTZyGq0st2YxxN8tGTXqNsAMXkRmtMVxpEWejZwSIGQMNqD7euBPPkfVTjAOhKHXoy0Z5AGGgSV7yCJhZG6CZSKNprUB8OWxLoCT0ljcZ3KSqjqbHIp6gcpWXrvj51ZzS53dmdJ7s5o5/sBVtT83Hdnl7MP3/edd4y1VgAAAFiuLuwCAAAARBVBCQAAwAdBCQAAwAdBCQAAwAdBCQAAwAdBCQAAwAdBCQAAwMf6sAuwWsYYI+lXJS2EXRYAAHBHaZT0S1tkUMk7PigpE5LOh10IAABwR9oi6Rd+C2shKC1I0ieffKKmpqawywIAAO4Aly5d0v333y+VaJGqhaAkSWpqaiIoAQCANUVnbgAAAB8EJQAAAB8EJQAAAB8EJQAAAB8EJQAAAB8EJQAAAB8EJQAAAB8EJQAAAB8EJQAAAB9ljcxtjElIekZSn7W2J+A2g5LSzmTCWjtSYJ1hSdPO5Ky1dryccgEAAFRC4KBkjOmStFNSQlJLwG0GJclaO+ZMdxtjRq21A850QtLbkp6y1qad5zglyZTxGgAAACoicNObtXbSCTypMva/T9KYZx8Tkvo9y4clHbbWpt3nkBSopgoAAKDSKtZHyRiTVKapLV1gWbfz335J48aYpDvPCVPF9ltvjGlyH5Ia17joAAAAkirbmTvpMz8tKeEEKUnqUqY5L2WMGfWEKD/7JM17HudXX1QAALDW0ul0pPazEmFc9TarTB8nNyilnWa9lKQhSUdLbH9QUrPnsaVSBQUAACszNDSkRCKxJvsaGxtTKlVOz5+1U9ZVb2skvyP4Sfc/TofuhDGm268Jzlq7JGnJnTaGft8AgNqUTqd15MgRHT16VMePHw+0zcjISDagpNNpDQ4OLlsuSdPTmYvNR0dHV7S9JH322WcaHh5eVoaxsTENDAyU9bxSJlxt375dktTS0qLe3l5J0uDgoAYGBgpuU2mVrFHyi34JZ5nf8rT8m+0AAIiFyclJHTlyROl0WrOzs4G2ccNIf3+/+vv71dXVlRNYhoaGNDg4qMHBwWzo6OnpCbx9X1+fEolEdh/bt2/X0NBQThlSqZROnTqlZPL2V3mp502n03r00Ue1b98+9ff3a+fOnerr68vZb19fX05IqxprbVkPSb2STgVcd05SMm+e9fx/WlJX/vL8eSWeo0mSnZ+ftwAA1JqjR4/arq6uQOsmEgk7NzeXM8/53rVzc3O2u7s7Z/mpU6esJDs9PV1y++npaSspZ/nc3NyyeYODg9n9BX3e/v5+Ozw8nPO8x48fX/b6gh6HIObn562TOZpskZyxkqa3gmMoOZ2ze23ugJIHJXXLGSLAGNMrz3AByvRJ2itp0rN8wmaGCQAAYFUmJiYCNVlt3bpVf/AHf5Az78/+7M907tw5/fCHP9TXvvY13217enrU3X37OqTFxUXt37/fd3mlpFIppdPpgv2CJiYmtHPnTp08eVKpVEpdXV2SlK31SafTJbd3eZe7/z958mT2NU5MTCxrjiv2vFKmqW56elqpVEqpVErd3d0Fj1kymdTk5GR2P9VQzoCTSWVqk/ZK6nJG0z5hb4+i3S1pQFI2KFlrR4wxg04AkqRd1hls0lk+boxpcQemlHSvDTjiNwAApVy7di3QFVMtLcvrAC5fvqx0Oq3HH3+86D6uXbu2bJ53/ULLK8Gvs3MikcgGoLm5uZxlbgBKJpM6efJkoc2z27vhpFCYcp87lUotO5alntfddnJyUslkUslkUgMDA+rr61sWlnp6ejQxMRHNoGQzV6WNyBOE8paPKbe2yJ3vXX/ZrUmc7QAAWHMbN24MdOXV5s2bC84Lsu3GjRuXzfNuV2h5NbW0tPj2cTp48KBGR0eLvk53+2Qyqe7ubk1MTGQ7WXtrmqRMiPL2TfLjfV43oCUSiWwAGh4e1rZt25YFrJaWlmxn8GoJ46o3AACqwq8JJ4j8prigGhoaCl4JFha/kDQ0NKS9e/eqv7+/4PJC2x8/flxDQ0OanZ1VS0tLNhS5P1OpVMlw6fe8O3fuzP7frcWamJjIef+SyaQOHz5cdP9rjaAEAEAN8KvJKVTLMz4+ru3bt+eElaDbe0Og28ToDTnFlPO8iURiWXOiG9CqiaAEAIici5cWdXFhqeR6rY31am1qqEKJoi+ZTGbDRX748NbKuM1lblhxhx8Isn1+R2q3Gc6tRSpW41Psed2+St59p9PpZQEsnU5nx1mqFoISACBy3nj/nF59+6OS673w1IN6qeehKpQoPH5NZ6lUSuPj4zkDQu7bt08TExPZMDI+Pp5TezM5OanJyUn19vZma2u865Tavq+vT6Ojo9ngNDo6mjMIpLdztlep5x0eHtbhw4ezQWl8fFzd3d3LOm0Hadpba8ZmxiK6Yzk3xp2fn59XU1NT2MUBAKyB/Bqlsxcv68XDH+pbex/RA623O17Xco2SG4QOHz6syclJDQ4OateuXdmO1OPj4xoaGlrWuXlkZCRbI3TixIlsU1k6nda2bdsKXsHnzQJ+20uZWqHJyUklEglNT09rYGBgWe1TT09PzpAMQZ93bGwsu47fiN99fX16/fXX1yQsXbp0Sc3NzZLUbK295LceQQkAEHlTv5jXv/n2u/rr//ikOr/YHHZxUMTIyIi6uroqMnZUX1+fjh4tdUvYYIIGpTBuigsAAGqU9zYla2lkZGTZ/eOqgaAEAADW1N69ezU+vmzoxBVLp9P67LPPqjLCeT6CEgAAWFNuPyq/0cLLNTY2FtrYVFz1BgAA1pwbltaC98q+aqNGCQAAwAdBCQAAwAdBCQAAwAdBCQAAwAdBCQAAwAdBCQAAwAdBCQAAwAdBCQAAwAdBCQAAwAdBCQAAwAdBCQAAwAdBCQAAwAdBCQAAwAdBCQAAwAdBCQAAwMf6clY2xiQkPSOpz1rbE3CbQUlpZzJhrR3xLOuWNCDpuKSUpB5JJ6y14+WUCwAAoBICByVjTJeknZISkloCbjMoSdbaMWe62xgzaq0dcFZJSOqW1KtMUBomJAEAgKgIHJSstZOSJo0xvWXsf5+kbZ59TBhjjitTi+TaZq1Nl7FPAACAqqhYHyVjTFKZprZ0gWXdlXpeAACAtVJWH6UyJX3mp5VpcnM9Y4yZVaY5b7u1dqjYTo0x9ZLqPbMaV1FGAAAAX5UMSn7cUCRJk5JkrU1JkjGm3xhz1FrbV2T7fZL2V7aIAAAA4QwPkO0Ibq1NuSHJcURSr3N1nZ+Dkpo9jy2VKCQAAEAlg1LKZ37CXZbfMdzTn8mv2U7W2iVr7SX3IWlh9UUFAABYrmJByakpSjuduvOXTTi1Rke9yz01SX4hCwAAoGpWEpQKjqFkjEm64yZ5HFRmnCR3nV5JY1K29mgkr+mtX9I4wwUAAIAoKGfAyaQyA0PuldRljBlW7ija7ijb2ZG3rbUjxphBTxPbLs9gk5J0MC9c3VuiIzcAAEDVlDPgZEqZEDTis3xMTm1R3nzv+uN5y9J++wMAAAgbN8UFAADwQVACAADwQVACAADwQVACAADwQVACAADwQVACAADwQVACAADwEXgcJQAAED8XLy3q4sJSyfVaG+vV2tRQhRJVF0EJAAD4euP9c3r17Y9KrvfCUw/qpZ6HqlCi6iIoAQAAX88+vlU9Hfdlp89evKwXD3+ob+19RA+0bs7Ob22sD6N4FUdQAgAAvlqbGgo2qT3QulmdX2wOoUTVRWduAAAAHwQlAECk3bxldfp8WpJ0+nxaN2/ZcAuEWCEoAQAi69jUjJ4cfkcvvzklSXr5zSk9OfyOjk3NhFwyxAVBCQAQScemZvT8oUnNzC/mzL8wv6jnD00SllAVdOYGgAiJ+5g1rpu3rA68dUaFGtmsJCPpwFtn1NPRpnV1psqlQ5wQlAAgQuI+Zo3rg49nl9UkeVlJM/OL+uDjWT2x/d7qFQyxQ1ACgAiJ+5g1rosL/iFpJesBK0VQAoAIifuYNa7WxmDNikHXA1aKztwAgMh5bFuL2psb5Nf7yEhqb27QY9taqlksxBBBCQAQOevqjPbv6ZCkZWHJnd6/p4OO3Kg4ghIAIJJ2d7brtee61Nac27zW1tyg157r0u7O9pBKhjihjxIAILJ2d7arp6NNh0+c08tvTumVpzu1d9dWapJQNdQoAQAibV2d0Y4tCUnSji0JQhKqiqAEAADgg6AEAADgo6w+SsaYhKRnJPVZa3sCbjMoKe1MJqy1I0XWPR50vwAAAJUWOCgZY7ok7ZSUkBRo4AonJMlaO+ZMdxtjRq21AwXW7ZXUHbQ8AAAAlRa46c1aO+kEnlQZ+98nacyzjwlJ/fkrOTVVjBoGAAAipWJ9lIwxSWWa2tIFluXXHD0j6UjA/dYbY5rch6TGVRcWAACggEp25k76zE8r03wnKRuaJsrY7z5J857H+ZUVDwAAoLgwrnqbVW4zW8JaW05z3kFJzZ7HljUsGwAAQFYYI3NnQ5Ixpt/t6B2UtXZJ0pJnH2tYNAAAgNsqWaPkV0uUkJRyrqI7WcHnBwAAWJWK1ShZa1PGmLQxJpnftGatnXD6JnV5OnZvl7JDCqSsteOVKhsAAEAQKwlKBS/jd65y680bUPKgMmMjueMo9br/d4YKmPBs3yWpv9iAlAAAANUUuOnNGJN0ansGlKkJGnaCj6vbWZblhJ6EMabXWXdXkcEm9zn/Hy4wfAAAAEDVBa5RcprPRpxHoeVj8gwu6ZnvXb9gc5rTzEZTGwAAiBRuigsAAOCDoAQAAOCDoAQAAOCDoAQAAOCDoAQAAOCDoAQAAOAjjHu9heripUVdXFgquV5rY71amxqqUCIAABBVsQtKb7x/Tq++/VHJ9V546kG91PNQFUoUDgIjAAClxS4oPfv4VvV03JedPnvxsl48/KG+tfcRPdC6OTu/tbE+jOJVDYERAIDSYheUWpsaCtaQPNC6WZ1fbA6hROEgMAIAUFrsghIyCIwAAJTGVW8AAAA+CEoAAAA+CEoAAAA+CEoAAAA+CEoAAAA+uOoNAJCDAWmB2whKIeAkBCDKGJAWuI2gFAJOQgCijAFpgdsISiHgJAQgyhiQFriNoBQCTkIAANwZuOoNAADAB0EJAADAB01vACKBq0EBRBFBCUAkcDUogCgiKAGIBK4GBRBFZQUlY0xC0jOS+qy1PQG3GZSUdiYT1tqRAvuTpO2SkpK+aa1NCzWPphZ4cTUosBznyfAFDkrGmC5JOyUlJLUE3GZQkqy1Y850tzFm1Fo74KwyLGnYWptylo9KOiopUAjDnY2mlgxOhAD8cJ4MX+CgZK2dlDRpjOktY//7JG3z7GPCGHNckhuUkpJ6Jbm1TNO6XcOEGkdTS0YUToSENSCaOE+Gr2J9lIwxSWWa2tIFlnVbaycKNN/tkjRRYr/1kryfiMbVlhXhoKklIwonwiiENcArP7yfvXg556er1sM758nwVbIzd9JnflqZ5rscTk1VQlJfif3uk7R/FeUCIiUKJ8IohDXAyy+8v3j4w5xpwjsqLYyr3mbl6ePk6dCdkHQ0QEfug5L+xDPdKOn8mpYQiJkohDXAKz+8+yG8o9LCCEo5HcGdYOR29u43xsxJ2uYXmKy1S5Ky9bHGmIoVFADCdPOW1enzaUnS6fNpPdzepHV18Tjn+YV3oNoqeQuTlM/8hKSUMSZhjBl2apRcE87y7gqWCwAi79jUjJ4cfkcvvzklSXr5zSk9OfyOjk3NhFwyIF4qFpScS/7TTqfu/GUTyvRhGlRuDVPC+ZmuVLkAIOqOTc3o+UOTmplfzJl/YX5Rzx+aJCwBVbSSoFRwDCVjTNIdN8njoDy1Q06H7TEpO9zAiDuGkmOvpEknSAFA7Ny8ZXXgrTOyBZa58w68dUY3bxVaA8BaCxyUPEFoQFKX02zmHVOpW7fHR5IkOaNwJ4wxvc66uzyDTUrSQWPMoPtQpkbpqZW+GAC4033w8eyymiQvK2lmflEffDxbvUIBjvx+c3EI7OUMOJlSZmDIEZ/lY3Jqi/Lme9cfz1uW9tsfAMTRxQX/kLSS9YC1cmxqRgfeOpMN8i+/OaVvv3NW+/d0aHdne8ilqxxuigsAjiiMUN7aGGy/QdcD1oLbby6//sjtN/fac101G5YISgDgiMII5Y9ta1F7c4MuzC8W7KdkJLU1N+ixbYFuuQmsWql+c0aZfnM9HW01OXwFQQkAHFEYoXxdndH+PR16/tCkjJTz5eR+Be3f01GTX0iIpnL6zT2x/d7qFaxKCEoA4IjKCOW7O9v12nNdOf1BpExNUq33B0H0xL3fHEEJACJod2e7ejradPjEOb385pReebpTe3dtpSYJVRf3fnOVHJkbALAK6+qMdmxJSJJ2bEkQkhAKt9+c36fPSGqv4X5zBCUAAODL7TcnaVlYikO/OYISAAAoyu0319ac27zW1txQ00MDSPRRAgAAAcS13xw1SgAAIJA49psjKAEAAPiIdVCK4839CuE4AABQWGyD0rGpGT05/I5efnNKUubmfk8Ov6NjUzMhl6y6OA4AAPiLZVByb+6XPyS7e3O/uIQEjgMAAMXFLiiVurmflLm5X7Wan8Jq9oracQAAIIpqZniAhYUFGVO69/2Jf0oHurnfj86c165fS6xdAQuY+Omn+m9/c1b/vHBdUqbZ69WJn+m//OsH1P3lL1T0uaN0HFxXrlzJ/lxYiF2Gz4rCcaAMlCFqZUBGFN6LKJRhLSwsLARar2aC0g9/+EPdfffdJdf7cG69pI0l1/ubv3tfF6c+X4OSFTaVXq9DP3cH7rod8P55YUkv/eX/1XNfWlRnonLPH5Xj4PWLq3WSNundd9/Vx3ffqspzRlEUjgNloAxRKwMyovBeRKEMa+Hq1auB1quZoHTXXXepqamp5HptAZuS2po3qqmpMuND3LJWf33Gb2nmOb8/s1G/cb9UF6CWbCWicBzypU2mTJs2bVJTY+2PzeEnCseBMlCGqJUBGVF4L6JQhrXw+efBKgFqJig1NDQEqlHasdHqnn+8prkl/6DQ0mC0o31jxULKTz67qfR1/2YvSZpbkj5ZbNDD966rSBmicBzyNdy4KWnReS8r87rvBFE4DpSBMkStDMiIwnsRhTKshaA1Sndu4+IK1RmjZx++q+g6//7Ld1U0HMwXCScrWW8lonAcAACIutgFJUna2bZef/hIve6pzw0BLQ1Gf/hIvXa2Vbairbk+WPgIut5KhX0cAACIuth+E+5sW6+u+9bpR5/c0HfP3NB/6Nigr9y/oSo1KL/eUqd76k3JZq9fb6l8jg3zOAAAEHWxrFFy1Rmjbc2Z9tVtzeuqFg6i1uwV1nEAACDqYh2UwkSzFwAA0ce3cYho9gIAINrKCkrGmISkZyT1WWt7Am4zKCntTCastSMFlkvSdkmy1g6UUybXX/zFX5QcHqC1tVVPP/10zry3f/A9zf3DL3XkZ+uLdp7euXOnHn300ez09evX9Z3vfCdQ2X73d39XbW1t2enp6WlNTExkp+eXrOZ++blO/Gy9fuYpw4YNG/T7v//7Ofv60Y9+pJ/+9KclnzOZTKqnJ/ctOnToUHZE1XxuGY78bL329HxFDz/8cHbZ7Oysjh49WvI5JenZZ5/V5s2bs9OnT5/We++9V3K7e+65R4997d/lzPv+97+v8+fPl9x2x44deuKJJ3LmjY6OBirv7/zO7+j+++/PTn/yySf6wQ9+EGjbgYHcj+p7772n06dPl9xuy5Yt+vrXv54z78iRI5qbm5OU+17kfyafeOIJ7dixIzt9+fJlvfHGG4HK29fXp5aWluz0T37yE/34xz8uuK63DL/aslnPPfdczvLjx48rlUqVfM4vf/nL+spXvpIz78///M9148aNktt2/MZXJf1qdvrChQv63ve+V3I7SfrGN76hu+663bx96tQpnTx5suR2hc4RC5N/rSM/myt5cUWlzhHFPg/VOEdYGc3U/YouL9yl73xyXe23/p++8tu/Fco54plnnsmZF8dzRLHPg1Sdc0R+GTZt2hTKOaK7u1vbt2/PTpd7jggqcFAyxnRJ2ikpIaml+NrZbQYlyVo75kx3G2NG3TBkjBm21g551h81xhwPGsK8rl69qlu3io8QWmhAysXFa7q1eEVXr6zTuhv+J8KlpaVl8y5fvhyobPnl+vzzz3O2vXrd6tbizWVl8J7ob5d3MdDzXrt2bdm8K1eu+G7rLUP+IFy3bt0K/Fqtze2gfuPGjUDb1tfXL5t37dq1QNuu5r3Jf6357005lpaWVvzeXL16Nbut3+dB0rKTh7V2zT6HOeXxlOFKgZNx0PdmcXH5eGFXrlzR9evXS257cxWfw3xB35tC54hb1xd19crloucH9znyrcV7U+zzUOlzxHzjNs20/6ZubNiszZL+SdIvb1xW68JlPezZjnNEMGtxjij2eZCqc44oVQb3NVT6HLGa76pyBA5K1tpJSZPGmN4y9r9P0jbPPiaMMcclDTi1U13GmIS1Nu2sMirplDEmaa0tHUU97r777pI1Sg0NDQXmbVRdwybdvWm9Nhf5i7HQL6n3r6Ji6upyu4KtX78+Z9ubS1Z1DZ8vK8OGDRsKvoYgz7tx4/Lbk2zatMl3fW8Z1q/P/VjU1dUFfq3599vbsGFDoG0LvXcbN24MtO1q3pv815r/3pSjvr5+xe/N3XffnT2Z+30epOWfCWPMmn0OvbxlKPS5CfreFPqd27RpU8Ev+HzrVvE5zBf0vSlU3rq7GnT3ps1Fzw/uc+Rbi/emnM+DtHbniM823q9zv/Lby9a5sX6T/mp2k7Ze+Dzbl5JzRDBrcY4o9nmQqnOOyC9DWOeI1XxXlcPkp/uSG2SC0j5r7aMl1ktKmrbWmrz5VlKPpJOSPpb0lBPC3Ka9OUmPuvMClKdJ0vzRo0f1hS+UfyPZn8/f1B+/t6g/fqJBX2oOZ4RRyhCdMkRBFI4DZYh3GW5Zqz/629Ij9//3r1Rv5H5kxPUzWQmffvqp+vr6JKnZWnvJb71KXvWW9JmfVqavUtpae09eIOp2fvrWJhlj6o0xTe5DUuPaFBdAVNyyVh/P35QkfTx/U7fK/IMOq/OPs7eKhiRJml20+sfZO/eGqEBQYVz1Niv/Pk77JA14muL81tm/1oUCEA0nL3yuN35yPftF/d0zN/RX05/r2YfvYtiMKonCbZaAqAhjHKWCIckYMyzpsNvxu4iDkpo9jy1rWzwAYTl54XP96YdLy2oz5pas/vTDJZ28EOxu31idqNxmCYiCSgYlv+azRP4yp9/TdP7QAYVYa5estZfch6SFVZcUQOhuWas3flL8Spf/9dPrNMNVgXubpWKqdZslIGwV+5Q7V62lnU7d+cuygwgZY7qdee4QAolC2wCojrD6B9EvJjqidpslIEwrCUp+TWdJz+CRroO63UHbrTka80x3SepSZtiBpBOQ+pXpxwTETtidmE9e+Fx/9LfX9N0zmbFYvnvmhv7ob69VpcmLfjHRwm2WgIxyBpxMSuqVtFeZ8Y+GJZ2w1o47q3RLGpCUbT6z1o4YYwY9Yy/t8gw2mZD0tjJNccPe5wrSBJdvcXFRV69eLXczLS7a29tvCOevI8oQnTKE6e8/tTp6Vko7rU/fPXND3zt7Q30PSP/qC5U/Hn//qdXrZ5bPd/sHfbNjqaLlaFCwANSgJV29WnowurUQhc9kmGXoaJL+62NW/2dG+t9npd97QPrNdqs6c71q7wFyxf0zuZYKDXZZSDkDTqaUCUEFQ4zTdLasI3Ze6Bn3zE9Luifo85dy/fp1XbrkOwyCrytX6yRt0pUrV3TJhlOlTxmiU4awTKXX69DP3YHXbp940tcz4eW5L11TZ6JytTq3rHTko03Ocxc68Vkd+chq24YrqqvQebHVSM0bNmn+hn8ZmjdYtZorWsGv+opE4TMZhTJ8oS5Thi/UXdHlhXj9bkZNFD4PYZTh0g2jhRKj40tS4warpg3B/ugKMvq3VEM3xf3a175W8PYDpZyZWdC3f/b3evLJJ9XRHs6QTJQhOmUIw81bVv/jT9+XVOiX1shImphN6D//3mNaV6GUcuKf0pr/h2L3oDKav2HU9i9/U7t+LVGRMkjSxgc+1X/6y0y1lvdUZ5x///jf/gt1f7n8gWVXKgqfScoAryi8F2GU4X/++Od67e/OlVzv+d/aqt/77S8F2mfQypWaCUqNjY1qbCz/Ddt0KZOGN23atKLt1wJlyISF6blM17TpuRva+cDmioWCqHlv+jP984L/XzZW0oVLS/rJpzf0xPZ7K1KGhc+DnTAWPq+r6Ofj6V2N2rixQQfeOqOZ+dvV4m3NDdq/p0O7O9sr9tyFhP17QRnCdfHSoi4uLL9PXL7Wxnq1Ni2/FUclROG9CKMM3/itB/X1R7Zmp89evKwXD3+ob+19RA+03r5tSWtjvRobg70XQe9MUjNBCXeuY1MzOV+ML785pW+/czaUL8YwXFwI1k4edL2VaA14Ygm63mrs7mxXT0ebDp84p5ffnNIrT3dq766tsQnOiI433j+nV9/+qOR6Lzz1oF7qeagKJYqv1qaGgmH0gdbN6vxic0Wfm6CEUB2bmtHzhyaXdeO9ML+o5w9N6rXnumo+LEUhpDy2rUXtzQ26ML9YsEu1UaZW57FtfoPqr611dUY7tiQkSTu2JAhJCMWzj29VT8d92elitRioXQQlhObmLasDb50p+MVslflyPvDWGfV0tNX0F2UUQsq6OqP9ezr0/KFJGRXqHyTt39NR0+8DkC/MWgxEB8OqIjQffDyb0w8ln5U0M7+oDz6u7WG13JAiLb/Wq5ohZXdnu157rkttzblfDG3NDbGo2QOAQghKCE0U+uZERVRCyu7Odr079FW98nSnJOmVpzv17tBXCUkAYoumN4QmCn1zoiQqnZjpHwQAt1GjhNC4fXP8voaNpPYqdiCOAkIKAEQLQQmhiUrfHAAA/BCUEKqo9M0BAKAQ+ighdFHpmwMAQD5qlBAJ9M0BAEQRQQkAAMAHQQkAgDvAzVtWp8+nJUmnz6d181awm7pidQhKAFAAX0qIkmNTM3py+B29/OaUpMzNw58cfkfHpmZCLlntIygBQB6+lBAl7s3D82/55N48nM9lZRGUAMCDLyVESambh0uZm4dT41k5BCUAcPClhKjh5uHhYxwlAHCU86X0xPZ7K1KGi5cWdXFhKTt99uLlnJ+u1sZ6tTbF4z6IccbNw8NHUAoBJ0IgmqLwpfTG++f06tsfLZv/4uEPc6ZfeOpBvdTzUMXKgWjg5uHhIyiFgBMhEE1R+FJ69vGt6um4L0AZ6itWBkSHe/PwC/OLBZuEjTK3fIrTzcOrjaAUAk6EQDRF4UuptamBmmRkuTcPf/7QpIyU87nk5uHVQVAKASdCIJr4UkIUuTcPP/DWmZw+dG3NDdq/p4Obh1dY7IIS/YMyOA5AYXwpIYq4eXh4YheU6B+UwXEA/PGlhCji5uHhKCsoGWMSkp6R1Get7Qm4zaCktDOZsNaOrHafq0H/oAyOA1AcX0oApDKCkjGmS9JOSQlJgXoyOiFJ1toxZ7rbGDNqrR1Y6T5Xi/5BGRwHAABKCzwyt7V20gk8qTL2v0/SmGcfE5L6V7lPAACAqqjYLUyMMUllmtrSBZZ1r2K/9caYJvchqXEVxQQAAPBVyXu9JX3mp5VpalupfZLmPY/zq9gXAACArzBuijur1fVHOiip2fPYshaFAgAAyBfG8ACr6rRtrV2SlB0AyBiuRMHK5Y8n5YfxpAAgnioZlPw6aCeKLAOqym88qXyMJwUA8VSxoGStTRlj0saYpLU2lbdsolLPC5Qjfzypsxcv68XDH+pbex/RA62bs/MZTwoA4mklQalg05lzlVtv3oCSByV1yxkiwBjTK89wAaX2CVSa33hSD7RuVucXm0MoEQAgSsoZcDIpqVfSXkldxphhSSestePOKt2SBiRlg5K1dsQYM+gEJEna5Q42GXCfAAAgRHG/N2jgoOQ0n43IE4Tylo+pQG1RXg3TeN6yovsEAADhivu9QWN3U1wAABBc3O8NSlACAAC+4n5v0DAGnAQAALgjEJQAAAB8EJQAAAB80EcJAJAj7peDA14EJQCRwJdzdMT9cnDAi6AEIBL4co6OuF8ODngRlABEAl/O0RH3y8ELuXnL6vT5tCTp9Pm0Hm5v0ro6E26hUBUEJQCRaPbiyxlRdWxqRgfeOqOZ+UVJ0stvTunb75zV/j0d2t3ZHnLpUGkEJQA0ewE+jk3N6PlDk7J58y/ML+r5Q5N67bkuwlKVVbt2j6AEgGYvoICbt6wOvHVmWUiSJCvJSDrw1hn1dLTRDFclYdTuEZQA0OwFFPDBx7PZL+RCrKSZ+UV98PGsnth+b/UKFlNh1e4RlICQRaF/EIDlLi74h6SVrIeVC7N2j6AEhIz+QUA0tTYG+8Mk6HpYuTBr9whKQMjoHwRE02PbWtTe3KAL84sFazKMpLbmBj22raXaRYudMGv3CEpAyOgfBETTujqj/Xs69PyhSRkpJyy5jTv793TQkbsKwqzd46a4AAD42N3Zrtee61Jbc+4XcFtzA0MDVJFbu+cXSY2k9grV7hGUAAAoYndnu94d+qpeebpTkvTK0516d+irhKQqcmv3JC0LS5Wu3SMoAQBQwro6ox1bEpKkHVsSNLeFIKzaPfooAQCAO8Luznb1dLTp8IlzevnNKb3ydKf27trKyNyoTYwfBAAoV7Vr9whKCA3jBwEAoo6ghNAwfhAAIOoISggN4wcBAKKurKBkjElIekZSn7W2J+A2g5LSzmTCWjtSznIAAICwBB4ewBjTpUxISkgKNKKTE4JkrR2z1o5JmjTGjAZdDgAAEKbAQclaO+mEmVQZ+98nacyzjwlJ/WUsBwAACE3FBpw0xiSVaUpLF1jWXWp5pcoFAAAQVCU7cyd95qeVab4rtbwgY0y9JO9lUI1llwwAACCAMG5hMqvifZxKLd8nad7zOL92RQMAALgtjKBUqiN4qeUHJTV7HlvWolAAAAD5Ktn05tfpO+EsK7W8IGvtkqTsfS+M4caEAACgMipWo2StTUlKO52285dNlFpeqXIBAAAEtZKgVLBpzBiTdMdF8jgoqduzTq88wwEEWA4AABCacgacdIPQgKQuY8ywE2xc3c6yLGeU7YQxptdZd5e1diDocgAAgDAF7qPkNJWNOI9Cy8dUoDYo75Yk4+UuB6rl5i2r0+fTkqTT59N6uL1J6+roAwcAccZNcQFJx6ZmdOCtM5qZX5QkvfzmlL79zlnt39Oh3Z3tIZcO1XLx0qIuLmSvFdHZi5dzfrpaG+u5oTMQEwQlxN6xqRk9f2hSNm/+hflFPX9oUq8910VYiok33j+nV9/+aNn8Fw9/mDP9wlMP6qWeh6pUKgBhIigh1m7esjrw1pllIUmSrCQj6cBbZ9TT0UYzXAw8+/hW9XTcV3K91sb6kusAqA0EJcTaBx/PZpvbCrGSZuYX9cHHs3pi+73VKxhC0drUQJMagBxhjMwNRMbFBf+QtJL1AAC1haCEWGttDFZ7EHQ9AEBtISgh1h7b1qL25gb59T4yktqbG/TYtlK3IAQA1CKCEmJtXZ3R/j0dkrQsLLnT+/d00JEbAGKKoITY293Zrtee61Jbc27zWltzA0MDAEDMcdUboExY6ulo0+ET5/Tym1N65elO7d21lZokAKFiENTwEZQAx7o6ox1bEpKkHVsShCQAoWMQ1PARlAAAiCgGQQ0fQQkAgIhiENTw0ZkbAADAB0EJAADAB0EJAADAB0EJAADAB0EJAADAB0EJAADAB0EJAADAB0EJAADAB0EJAADAB0EJAADAB0EJAADAB/d6AwCggIuXFnVxYSk7ffbi5ZyfrtbGeu7HVsMISgAAFPDG++f06tsfLZv/4uEPc6ZfeOpBvdTzUJVKhWorOygZYwYlpZ3JhLV2JOA2rnuttUPlLAcAoNqefXyrejruK7lea2N9FUqDsJQVlNxAY60dc6a7jTGj1tqBItsclXTcs02/MWbYDUOllgMAEIbWpgaa1FB2Z+59ksbcCWvthKR+v5WNMUlJvZKOeGYfkTRojEmUWl5m2QAAANZU4KDkhJqEtTZdYFm3z2ZJSfJu4/n/zgDLC5Wj3hjT5D4kNQZ9DQAAAOUop0Yp6TM/LSnhsywlST61Q8kAywvZJ2ne8zjvsx4AAMCqrMVVb7OSWgotsNamjDETkroljUu5tU+llvs4KOlPPNONIiwBAFCzwhyqYS2CUsGQ5LLW9hhjho0xLcqEqpSzKBVkeYH9LUnKHi1jzCqLDwAAoizMoRrKCUoFg4syzW5+yyRJ3ivYPM1sJ4MuBwAA8RXmUA2Bg5LTTJY2xiSttam8ZRN+2xljuqy1k55Z3ZLG3U7bpZYDAIB4C3OohnKHBzioTJCRJBljeuUZLsAYk8wbPFKSjub1OxqQNFTGcgAAgFCU1UfJWjtijBl0ApIk7cobbLJbmaDjHa17QFKXM7zAdkkDeTVSpZYDAACEouzO3Hm3LBnPWzYmTw2TM29Ckm/TXKnlAAAAYSm36Q0AACA2CEoAAAA+CEoAAAA+CEoAAAA+CEoAAAA+CEoAAAA+CEoAAAA+CEoAAAA+CEoAAAA+CEoAAAA+CEoAAAA+yr7XG1BLLl5a1MWFpez02YuXc366Whvr1drUUNWyAQDCR1BCrL3x/jm9+vZHy+a/ePjDnOkXnnpQL/U8VKVSAQCigqCEWHv28a3q6biv5HqtjfVVKA0AIGoISoi11qYGmtQAAL7ozA0AAOCDoAQAAOCDoAQAAOCDoAQAAOCDoAQAAOCDoAQAAOCDoAQAAOCDoAQAAOCDoAQAAOCDoAQAAOCDoAQAAOCj7Hu9GWMGJaWdyYS1diTgNq57rbVDecv7JSWc/W6XdNBamxYAAECIygpKbuCx1o45093GmFFr7UCRbY5KOu7Zpt8YM+yGJWefY24wMsYkJL0uqa/8lwMAALB2jLU2+MrGzEna5q3tMcZYa63xWT8paVrSPXlBaM6dZ4w5bq3tydtu2bwiZWqSND8/P6+mpqbArwUAAMTXpUuX1NzcLEnN1tpLfusF7qPkhJ5EoSYxY0y3z2ZJSfJu4/n/Tudn2hhz3AlQ7vOkipSj3hjT5D4kNQZ9DQAAAOUopzN30md+Wpn+RYWkpGwtkt/+vun8f84YMyypu1hTnqR9kuY9j/PFCg0AALBSa3HV26yklkILrLUpSROSsjVO+bVPTg3TsKRxSYOS+nyCleugpGbPY8vKiw4AAOBvLYJSwZDkcvoa7XI6cfcqE6yk27VNw5JS1to+Za54a5F0qsj+lqy1l9yHpIU1eA0AAADLlHPVm1+/oUSRZZIk73AAntqik55+TxPOeilJjxpjThljeq2142WUDwAAYE0FrlFyQkzaCTf5yyb8tjPGdOXN6pY07jS5JXV7TCav0aDlAgAAqJRym94OKre/Ua+kMc90Mm9wSUk6mtcvaUDSkJQNWF0F+iQ9Sm0SAAAIW1njKEnZASLdprZdec1q/ZKGrLXbPfO6JXXp9qjbo07tlLs8ocyVbJ/p9hV0Y4WGIfApD+MoAQCAsgQdR6nsoBQ1BCUAAFCuNR9wEgAAIG7KviluVF265BsGAQAAcgTNDbXQ9PZFMTo3AABYmS3W2l/4LayFoGQk/apWPvBkozJBa8sq9lELOA4ZHIcMjkMGxyGD45DBcciopePQKOmXtkgYuuOb3pwX55sES8nkLEnSQrHOXLWO45DBccjgOGRwHDI4Dhkch4waOw4ly09nbgAAAB8EJQAAAB8EJWlJ0gHnZ5xxHDI4DhkchwyOQwbHIYPjkBGr43DHd+YGAACoFGqUAAAAfBCUAAAAfBCUAAAAfBCUAAAAfNzxA04GZYxJSHpGUp+1tqfA8kFJaWcyYa0dqV7pqifgcZCk7ZJkrR2oXumqp9RxyFv3eKl17lRBjoMxZljStDM5a60dr1LxqibA70W/pIQy54jtkg5aa9PVK2H1lDoHxOhcGeQ4+C6vFeW8zlo9V8YiKBljuiTtVOZE11Jg+aAkWWvHnOluY8xorX3wAxyHYWvtkGd6tBY/+KWOQ966vZK6q1CsqgvweUhIelvSU9batLP+KUkmf907WcDzw5gbjJzj8rqkvqoVskpKnQNidK4sdRzicq4M/Dpr+VwZi6Y3a+2k84ud8llln6Qxz/oTkvqrUbZqKnYcnJN/l/PTNSqp2xiTrE4JqyPA50FS9pgUDVJ3sgDHYVjSYTcgWGsnJdXUF4EU6Dj0eGuPnP8nKl+y6gp4Dqj5c2Wp4xCXc2U5r7PWz5WxCErFOG94olA1ujGmJtNxETsleX8B3C+ORPWLEgnPSDoSdiFC1C9p3Ply6JayX4xxkzbGHHe/MJxzRtGQfQfzPQfE7FxZ6lwYl3Nl0NdZ0+fKWDS9leD3F0Batfeh9+Wc/O7Jm+2e/Gr1S8GXc+KPYyiQlA0DktSlzPufMsaMSjoaw7D0TWWaHOeMMSOSpmutqUkKdA7Y6bNpWjV0rix1HOJyrgz6OuNwrox9jVIRs6rhqsSA9kkaqNVOqyUkrLU1c9JbATcopZ2mqZSkIUlHQyxTKJzP/7CkcUmDkvrymiNqWZBzQBzOlaWOQ1zOlYVeZ82fKwlK/mr9F78o50qnw26nzTgxxvTX4pVdK3TS/Y/bN6cGm1mKcn4XUtbaPmWu/GlRpoapppVxDqjpc2Wp4xCXc2Wh1xmXcyVByb+qNFFkWU1zrl6YrtXLfotxroA6WXLF2uf32U/Lv7m65nj65UxIkrU2Za19VJl+S73hlq5yfM4BsTtXljoXxuVcWeh1xulcGfs+StbalDEmbYxJ5lcfxrAvhjyddt3LfxOSWmq9atWjRZkrPdxak+1S9rLoVBz+epKyvxcpZULRpGdRQjE5OTqSuj1mkNdolctRNcXOAXE6V5Y6F8blXOn3OhWjc2XcgpJfFfFBZTqpuR+EXnkuga1BBY+D8xdCl5wrnZzZtXwslh0H54SfPek7x6S/xv9i9Pu9GJK0V05Qcn4vJpxhAmpRwc+DMWbIGJN/tdejtdihO8A5IBbnylLHIS7nymKv0wmEsThXGmtt2GWoOOcN7lXmpN8laUTSCW/idVOwM7nLO8hWrSh2HJy/Ej5WgatXrLW1NsBgyc+Ds567Tq+zzvFa+ss54O+FOyK1JN0bt98LZ3lCmU6sn+n2FV5jtsY67gY9B9T6ubLUcYjLubKc11nz58o4BCUAAICVoDM3AACAD4ISAACAD4ISAACAD4ISAACAD4ISAACAD4ISAACAD4ISAACAD4ISgFgyxiScQfUAwBdBCUBc7VOMbvALYGUISgDiqquG71sHYI0QlADEjnPH8+NhlwNA9BGUAMRRn6TxkmsBiD2CEoA4SlprU2EXAkD0rQ+7AADgxxjTJWmnpO2STkiakNTvLE5ba8dWsM9eSUeLLNslaVpSynnMWmvTZRceQE2gRglAJDmX7ndba8estUOSXpe0z1o74qwytMJd75V0pMDz9UvqsdYOOQEsoUxg2rnC5wFQA6hRAhBV/Z5Q5Jp2fk5KGljhfhP5NUTGmKSkYUnbPLPTkmStnVjh8wCoAQQlAFGV7WztBJmEnJqg/PDiLO9Vpqlsl6TRQn2QnFqj0QLPNSppIi9A9SgTyADEGEEJQCTlBZ1uSakifYWOWmsflSRjzISktyU9WmC9PmttT4H53cpcCefVpUyfKAAxRh8lAHeCHuVdzu/efsTp8J3lhKmEU8uUv346f8ee9fJrjxhrCQBBCUA0Oc1krl5lrnrLLvPULvl1tu7Km/ZrdpOUW4PlDEgpa+2EMaYrP4wBiA+CEoDIcULSsPP/XnmawArcyDYhaTZvXlpSS968nkIds52AlHLDkLP/AWX6O0mZK+/oqwTEFH2UAETRhKQxJzCdVCa4DBljJKklb/yktJaHooQ84clpXis2wGSfpAFjzClJstb2GWOOOs9PSAJizFhrwy4DAKyYUxP0utuZ25k3J+lRtznNGDMs6TA1QwDKRdMbgDuaE34S7rTTdJbKu2qui5AEYCVoegNQC/qcWqMTyoyjlL3U36lxIiQBWBGa3gDUNGPMqKRhboILYCVoegNQ61oISQBWiholAAAAH9QoAQAA+CAoAQAA+CAoAQAA+CAoAQAA+CAoAQAA+CAoAQAA+CAoAQAA+CAoAQAA+Pj/rm6oML80iigAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] @@ -268,8 +262,8 @@ ], "source": [ "# We do not just have V1V1, but also the two other spacial directions. We can average over them for better statistics. \n", - "matrix_V2V2= pe.input.json.load_json(\"./data/matrix_correlator_V2V2\")\n", - "matrix_V3V3= pe.input.json.load_json(\"./data/matrix_correlator_V3V3\")\n", + "matrix_V2V2= pe.input.json.load_json(\"./data/matrix_correlator_V2V2\", verbose=False)\n", + "matrix_V3V3= pe.input.json.load_json(\"./data/matrix_correlator_V3V3\", verbose=False)\n", "matrix_VnVn=(matrix_V1V1 + matrix_V2V2 + matrix_V3V3) / 3. \n", "\n", "#We then solve the GEVP to get eigenvectors corresponding to the ground state. \n", @@ -285,8 +279,8 @@ "\n", "# We can now pick a plateau range and get a single value for the mass. \n", "m_eff_Jpsi.gamma_method()\n", - "m_Jpsi = m_eff_Jpsi.plateau([5, 24])\n", - "\n", + "m_Jpsi = m_eff_Jpsi.plateau([5, 24],method=\"avg\")\n", + "m_Jpsi.gamma_method()\n", "# We can now visually compare our plateau value to the data\n", "\n", "m_eff_Jpsi.show([10, 25], plateau=m_Jpsi)\n", @@ -313,7 +307,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -327,7 +321,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py index 890e3f07..2274f7e1 100644 --- a/pyerrors/correlators.py +++ b/pyerrors/correlators.py @@ -56,8 +56,8 @@ class Corr: N = data_input.shape[0] input_as_list = [] for t in range(T): - if any([(item.content[t][0] is None) for item in data_input.flatten()]): - if not all([(item.content[t][0] is None) for item in data_input.flatten()]): + if any([(item.content[t] is None) for item in data_input.flatten()]): + if not all([(item.content[t] is None) for item in data_input.flatten()]): warnings.warn("Input ill-defined at different timeslices. Conversion leads to data loss!", RuntimeWarning) input_as_list.append(None) else: @@ -645,7 +645,7 @@ class Corr: result = least_squares(xs, ys, function, silent=silent, **kwargs) return result - def plateau(self, plateau_range=None, method="fit"): + def plateau(self, plateau_range=None, method="fit", auto_gamma=False): """ Extract a plateau value from a Corr object Parameters @@ -657,6 +657,8 @@ class Corr: method to extract the plateau. 'fit' fits a constant to the plateau region 'avg', 'average' or 'mean' just average over the given timeslices. + auto_gamma : bool + apply gamma_method with default parameters to the Corr. Defaults to None """ if not plateau_range: if self.prange: @@ -667,6 +669,8 @@ class Corr: raise Exception("Correlator must be projected before getting a plateau.") if(all([self.content[t] is None for t in range(plateau_range[0], plateau_range[1] + 1)])): raise Exception("plateau is undefined at all timeslices in plateaurange.") + if auto_gamma: + self.gamma_method() if method == "fit": def const_func(a, t): return a[0] From dce7d4bec825c294a184c970684dc2c19ff47e5d Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Fri, 18 Feb 2022 09:16:29 +0000 Subject: [PATCH 072/136] tests: test for corr matrix initialization with none entries added. --- tests/correlators_test.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/correlators_test.py b/tests/correlators_test.py index 550e2a5b..27dc0f67 100644 --- a/tests/correlators_test.py +++ b/tests/correlators_test.py @@ -296,3 +296,18 @@ def test_thin(): thin.fit(lambda a, x: a[0] * x) c.thin(offset=1) c.thin(3, offset=1) + + +def test_corr_matrix_none_entries(): + dim = 8 + x = np.arange(dim) + y = 2 * np.exp(-0.06 * x) + np.random.normal(0.0, 0.15, dim) + yerr = [0.1] * dim + + oy = [] + for i, item in enumerate(x): + oy.append(pe.pseudo_Obs(y[i], yerr[i], 'test')) + + corr = pe.Corr(oy) + corr = corr.deriv() + pe.Corr(np.array([[corr, corr], [corr, corr]])) From 9ba180e3c4366379f21e9a0f3989662a82975405 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Mon, 21 Feb 2022 14:51:27 +0000 Subject: [PATCH 073/136] docs: typos in documentation corrected. --- pyerrors/__init__.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pyerrors/__init__.py b/pyerrors/__init__.py index d8f526a6..133b77e7 100644 --- a/pyerrors/__init__.py +++ b/pyerrors/__init__.py @@ -26,7 +26,7 @@ print(my_new_obs) # Print the result to stdout # The `Obs` class `pyerrors` introduces a new datatype, `Obs`, which simplifies error propagation and estimation for auto- and cross-correlated data. -An `Obs` object can be initialized with two arguments, the first is a list containing the samples for an Observable from a Monte Carlo chain. +An `Obs` object can be initialized with two arguments, the first is a list containing the samples for an observable from a Monte Carlo chain. The samples can either be provided as python list or as numpy array. The second argument is a list containing the names of the respective Monte Carlo chains as strings. These strings uniquely identify a Monte Carlo chain/ensemble. @@ -38,7 +38,7 @@ my_obs = pe.Obs([samples], ['ensemble_name']) ## Error propagation -When performing mathematical operations on `Obs` objects the correct error propagation is intrinsically taken care using a first order Taylor expansion +When performing mathematical operations on `Obs` objects the correct error propagation is intrinsically taken care of using a first order Taylor expansion $$\delta_f^i=\sum_\alpha \bar{f}_\alpha \delta_\alpha^i\,,\quad \delta_\alpha^i=a_\alpha^i-\bar{a}_\alpha\,,$$ as introduced in [arXiv:hep-lat/0306017](https://arxiv.org/abs/hep-lat/0306017). The required derivatives $\bar{f}_\alpha$ are evaluated up to machine precision via automatic differentiation as suggested in [arXiv:1809.01289](https://arxiv.org/abs/1809.01289). @@ -96,7 +96,7 @@ my_sum.details() The integrated autocorrelation time $\tau_\mathrm{int}$ and the autocorrelation function $\rho(W)$ can be monitored via the methods `pyerrors.obs.Obs.plot_tauint` and `pyerrors.obs.Obs.plot_tauint`. -If the parameter $S$ is set to zero it is assumed that dataset does not exhibit any autocorrelation and the windowsize is chosen to be zero. +If the parameter $S$ is set to zero it is assumed that the dataset does not exhibit any autocorrelation and the windowsize is chosen to be zero. In this case the error estimate is identical to the sample standard error. ### Exponential tails @@ -285,7 +285,7 @@ import autograd.numpy as anp def func(a, x): return a[1] * anp.exp(-a[0] * x) ``` -**It is important that numerical functions refer to `autograd.numpy` instead of `numpy` for the automatic differentiation to work properly.** +**It is important that numerical functions refer to `autograd.numpy` instead of `numpy` for the automatic differentiation in iterative algorithms to work properly.** Fits can then be performed via ```python @@ -339,7 +339,7 @@ For the full API see `pyerrors.linalg`. # Export data -The preferred exported file format within `pyerrors` is json.gz. The exact specifications of this formats will be listed here soon. +The preferred exported file format within `pyerrors` is json.gz. The exact specifications of this format will be listed here soon. ## Jackknife samples For comparison with other analysis workflows `pyerrors` can generate jackknife samples from an `Obs` object or import jackknife samples into an `Obs` object. From 6b7aa29cdbc3ca350371e0e5f4672a92a83255f0 Mon Sep 17 00:00:00 2001 From: JanNeuendorf Date: Mon, 21 Feb 2022 18:24:40 +0100 Subject: [PATCH 074/136] GEVP method now uses `scipy.eigh()` and applies `matrix_symmetric()`. `Eigenvalue` takes the same arguments as `GEVP` and projects automatically. --- pyerrors/correlators.py | 29 +++++++---------------------- 1 file changed, 7 insertions(+), 22 deletions(-) diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py index 2274f7e1..c1ff9417 100644 --- a/pyerrors/correlators.py +++ b/pyerrors/correlators.py @@ -7,7 +7,7 @@ import scipy.linalg from .obs import Obs, reweight, correlate, CObs from .misc import dump_object, _assert_equal_properties from .fits import least_squares -from .linalg import eigh, inv, cholesky +# from .linalg import eigh, inv, cholesky from .roots import find_root @@ -268,8 +268,8 @@ class Corr: G0, Gt = np.empty([self.N, self.N], dtype="double"), np.empty([self.N, self.N], dtype="double") for i in range(self.N): for j in range(self.N): - G0[i, j] = self.content[t0][i, j].value - Gt[i, j] = self.content[ts][i, j].value + G0[i, j] = self.matrix_symmetric().content[t0][i, j].value + Gt[i, j] = self.matrix_symmetric().content[ts][i, j].value sp_vecs = _GEVP_solver(Gt, G0) sp_vec = sp_vecs[state] @@ -301,24 +301,9 @@ class Corr: return all_vecs - def Eigenvalue(self, t0, state=1): - G = self.matrix_symmetric() - G0 = G.content[t0] - L = cholesky(G0) - Li = inv(L) - LT = L.T - LTi = inv(LT) - newcontent = [] - for t in range(self.T): - if self.content[t] is None: - newcontent.append(None) - else: - Gt = G.content[t] - M = Li @ Gt @ LTi - eigenvalues = eigh(M)[0] - eigenvalue = eigenvalues[-state] - newcontent.append(eigenvalue) - return Corr(newcontent) + def Eigenvalue(self, t0, ts=None, state=0, sorted_list=None): + vec = self.GEVP(self, t0=t0, ts=ts, state=state, sorted_list=sorted_list) + return self.projected(vec) def Hankel(self, N, periodic=False): """Constructs an NxN Hankel matrix @@ -1081,7 +1066,7 @@ def _sort_vectors(vec_set, ts): def _GEVP_solver(Gt, G0): # Just so normalization an sorting does not need to be repeated. Here we could later put in some checks - sp_val, sp_vecs = scipy.linalg.eig(Gt, G0) + sp_val, sp_vecs = scipy.linalg.eigh(Gt, G0) sp_vecs = [sp_vecs[:, np.argsort(sp_val)[-i]] for i in range(1, sp_vecs.shape[0] + 1)] sp_vecs = [v / np.sqrt((v.T @ G0 @ v)) for v in sp_vecs] return sp_vecs From 04533c2c2f1958e7318dbb279b7361d875631a1c Mon Sep 17 00:00:00 2001 From: Simon Kuberski Date: Mon, 21 Feb 2022 18:33:06 +0100 Subject: [PATCH 075/136] Documentation of the JSON format --- pyerrors/__init__.py | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/pyerrors/__init__.py b/pyerrors/__init__.py index d8f526a6..677dd4b5 100644 --- a/pyerrors/__init__.py +++ b/pyerrors/__init__.py @@ -187,7 +187,7 @@ obs3.details() ``` -`Obs` objects defined on regular and irregular histories of the same ensemble can be computed with each other and the correct error propagation and estimation is automatically taken care of. +`Obs` objects defined on regular and irregular histories of the same ensemble can be combined with each other and the correct error propagation and estimation is automatically taken care of. **Warning:** Irregular Monte Carlo chains can result in odd patterns in the autocorrelation functions. Make sure to check the autocorrelation time with e.g. `pyerrors.obs.Obs.plot_rho` or `pyerrors.obs.Obs.plot_tauint`. @@ -339,7 +339,47 @@ For the full API see `pyerrors.linalg`. # Export data -The preferred exported file format within `pyerrors` is json.gz. The exact specifications of this formats will be listed here soon. +The preferred exported file format within `pyerrors` is json.gz. Files written to this format are valid JSON files that have been compressed using gzip. The structure of the content is inspired by the dobs format of the ALPHA collaboration. The aim of the format is to facilitate the storage of data in a self-contained way such that, even years after the creation of the file, it is possible to extract all necessary information: +- What observables are stored? Possibly: How exactly are they defined. +- How does each single ensemble or external quantity contribute to the error of the observable? +- Who did write the file when and on which machine? + +This can be achieved by storing all information in on single file. The export routines of `pyerrors` are written such that as much information is written automatically. The first entries of the file provide optional auxiliary information: +- `program` is a string that indicates which program was used to write the file. +- `version` is a string that specifies the version of the format. +- `who' is a string that specifies the user name of the creator of the file. +- `date` is a string and contains the creation date of the file. +- `host` is a string and contains the hostname on which the file was written. +- `description` contains information on the content of the file. This field is not filled automatically. The user is advised to provide as detailed information as possible in this field. Examples are: Input files of measurements or simulations, LaTeX formulae or references to publications to specify how the observables have been computed, details on the analysis strategy, ... This field may be any valid JSON type. Strings, arrays or objects (equivalent to dicts in python) are well suited to provide information. + +The only necessary entry of the file is the field +-`obsdata`, an array that contains the actual data. + +Each entry of the array belongs to a single structure of observables. Currently, these strucutres can be eiter of `Obs`, `list`, `numpy.ndarray`, `Corr`. All `Obs` inside a structure (with dimension > 0) have to be defined on the same set of configurations. Different structures, that are represented by entries of the array `obsdata`, are treated independently. Each entry of this array has the following required entries: +- `type` is a string that specifies the type of the structure. This allows to parse the content to the correct form after reading the file. It is always possible to interpret the content as list of Obs. +- `value` is an array that contains the mean values of the Obs inside the structure. +The following entries are optional: +- `layout` is a string that specifies the layout of multi-dimensional structures. Examples are "2, 2" for a 2x2 dimensional matrix or "64, 4, 4" for a Corr with T=64 and 4x4 matrices at each time slices. "1" denotes a single Obs. +- `tag` is any JSON type. It contains additional information concerning the structure. The `tag` of an `Obs` in `pyerrors` is written here. +- `reweighted` is a Bool that may be used to specify, whether the `Obs` in the structure have been reweighted. +- `data` is an array that contains the data from MC chains. We will define it below. +- `cdata` is an array that contains the data from external quantities with an error (`Covobs` in `pyerrors`). We will define it below. + +The array `data` contains the data from MC chains. Each entry of the array corresponds to one ensemble and contains: +- `id`, a string giving the name of the ensemble +- `replica`, an array that contains an entry per replica of the ensemble. + +Each entry of `replica` contains +`name`, a string that contains the name of the replica +`deltas`, an array that contains the actual data. + +Each entry in `deltas` corresponds to one configuration of the replica and has $1+N$ many entries. The first entry is an integer that specifies the configuration number that, together with ensemble and replica name, may be used to uniquely identify the configuration on which the data has been obtained. The following N entries specify the deltas, i.e., the deviation of the observable from the mean value on this configuration, of each `Obs` inside the structure. Multi-dimensional structures are stored in a row-major format. + +The array `cdata` contains information about the contribution of auxiliary observables, represented by `Covobs` in `pyerrors`, to the total error of the observables. Each entry of the array belongs to one auxiliary covariance matrix and contains: +- `id`, a string that identifies the covariance matrix +- `layout`, a string that defines the dimensions of the $M\times M$ covariance matrix (has to be "M, M"). +- `cov`, an array that contains the $M\times M$ many entries of the covariance matrix, stored in row-major format. +- `grad`, an array that contains N entries, one for each `Obs` inside the structure. Each entry is an array, that contains the M gradients of the Nth observable with respect to the values that correspond to the diagonal entries of the covariance matrix. ## Jackknife samples For comparison with other analysis workflows `pyerrors` can generate jackknife samples from an `Obs` object or import jackknife samples into an `Obs` object. From ab960ee7ad3c110acb50f1b36a073bd41b37f4ff Mon Sep 17 00:00:00 2001 From: JanNeuendorf Date: Mon, 21 Feb 2022 18:34:19 +0100 Subject: [PATCH 076/136] typo --- pyerrors/correlators.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py index c1ff9417..187ba9b1 100644 --- a/pyerrors/correlators.py +++ b/pyerrors/correlators.py @@ -302,7 +302,7 @@ class Corr: return all_vecs def Eigenvalue(self, t0, ts=None, state=0, sorted_list=None): - vec = self.GEVP(self, t0=t0, ts=ts, state=state, sorted_list=sorted_list) + vec = self.GEVP(t0, ts=ts, state=state, sorted_list=sorted_list) return self.projected(vec) def Hankel(self, N, periodic=False): From 0e685d552a8c98082fe22df87f59ca71bf119121 Mon Sep 17 00:00:00 2001 From: Simon Kuberski Date: Mon, 21 Feb 2022 18:46:56 +0100 Subject: [PATCH 077/136] Added reference to JSON schema --- pyerrors/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pyerrors/__init__.py b/pyerrors/__init__.py index 4e2db252..0aeb65d8 100644 --- a/pyerrors/__init__.py +++ b/pyerrors/__init__.py @@ -381,6 +381,8 @@ The array `cdata` contains information about the contribution of auxiliary obser - `cov`, an array that contains the $M\times M$ many entries of the covariance matrix, stored in row-major format. - `grad`, an array that contains N entries, one for each `Obs` inside the structure. Each entry itself is an array, that contains the M gradients of the Nth observable with respect to the quantity that corresponds to the Mth diagonal entry of the covariance matrix. +A JSON schema that may be used to verify the correctness of a file with respect to the format definition is stored in ./examples/json_schema.json. The schema is a self-descriptive format definition and contains an exemplary file. + ## Jackknife samples For comparison with other analysis workflows `pyerrors` can generate jackknife samples from an `Obs` object or import jackknife samples into an `Obs` object. See `pyerrors.obs.Obs.export_jackknife` and `pyerrors.obs.import_jackknife` for details. From 8e5938ebe3c83f56deba3f8164f99e3a7557a3f0 Mon Sep 17 00:00:00 2001 From: Simon Kuberski Date: Mon, 21 Feb 2022 18:47:47 +0100 Subject: [PATCH 078/136] Added version number of JSON file format to 1.0 --- pyerrors/input/json.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyerrors/input/json.py b/pyerrors/input/json.py index a4fab75e..a6060d5f 100644 --- a/pyerrors/input/json.py +++ b/pyerrors/input/json.py @@ -207,7 +207,7 @@ def create_json_string(ol, description='', indent=1): d = {} d['program'] = 'pyerrors %s' % (pyerrorsversion.__version__) - d['version'] = '0.2' + d['version'] = '1.0' d['who'] = getpass.getuser() d['date'] = datetime.datetime.now().astimezone().strftime('%Y-%m-%d %H:%M:%S %z') d['host'] = socket.gethostname() + ', ' + platform.platform() From c2bc1c0bed1ad70b77e79e98a793341f8adbe93f Mon Sep 17 00:00:00 2001 From: JanNeuendorf Date: Mon, 21 Feb 2022 18:48:20 +0100 Subject: [PATCH 079/136] called matrix_symmetric only once --- pyerrors/correlators.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py index 187ba9b1..c7078fa3 100644 --- a/pyerrors/correlators.py +++ b/pyerrors/correlators.py @@ -266,10 +266,11 @@ class Corr: if (self.content[t0] is None) or (self.content[ts] is None): raise Exception("Corr not defined at t0/ts") G0, Gt = np.empty([self.N, self.N], dtype="double"), np.empty([self.N, self.N], dtype="double") + symmetric_corr = self.matrix_symmetric() for i in range(self.N): for j in range(self.N): - G0[i, j] = self.matrix_symmetric().content[t0][i, j].value - Gt[i, j] = self.matrix_symmetric().content[ts][i, j].value + G0[i, j] = symmetric_corr.content[t0][i, j].value + Gt[i, j] = symmetric_corr[ts][i, j].value sp_vecs = _GEVP_solver(Gt, G0) sp_vec = sp_vecs[state] From 6cfa87eb158495017942b99e825d341e3fec199e Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Mon, 21 Feb 2022 18:06:35 +0000 Subject: [PATCH 080/136] docs: reference to ADjson.jl added, typos corrected. --- pyerrors/__init__.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pyerrors/__init__.py b/pyerrors/__init__.py index 0aeb65d8..0a825a3e 100644 --- a/pyerrors/__init__.py +++ b/pyerrors/__init__.py @@ -352,10 +352,10 @@ This can be achieved by storing all information in one single file. The export r - `host` is a string and contains the hostname of the machine where the file has been written. - `description` contains information on the content of the file. This field is not filled automatically in `pyerrors`. The user is advised to provide as detailed information as possible in this field. Examples are: Input files of measurements or simulations, LaTeX formulae or references to publications to specify how the observables have been computed, details on the analysis strategy, ... This field may be any valid JSON type. Strings, arrays or objects (equivalent to dicts in python) are well suited to provide information. -The only necessary entry of the file is the field +The only necessary entry of the file is the field -`obsdata`, an array that contains the actual data. -Each entry of the array belongs to a single structure of observables. Currently, these strucutres can be eiter of `Obs`, `list`, `numpy.ndarray`, `Corr`. All `Obs` inside a structure (with dimension > 0) have to be defined on the same set of configurations. Different structures, that are represented by entries of the array `obsdata`, are treated independently. Each entry of the array `obsdata` has the following required entries: +Each entry of the array belongs to a single structure of observables. Currently, these structures can be either of `Obs`, `list`, `numpy.ndarray`, `Corr`. All `Obs` inside a structure (with dimension > 0) have to be defined on the same set of configurations. Different structures, that are represented by entries of the array `obsdata`, are treated independently. Each entry of the array `obsdata` has the following required entries: - `type` is a string that specifies the type of the structure. This allows to parse the content to the correct form after reading the file. It is always possible to interpret the content as list of Obs. - `value` is an array that contains the mean values of the Obs inside the structure. The following entries are optional: @@ -367,11 +367,11 @@ The following entries are optional: The array `data` contains the data from MC chains. Each entry of the array corresponds to one ensemble and contains: - `id`, a string that contains the name of the ensemble -- `replica`, an array that contains an entry per replica of the ensemble. +- `replica`, an array that contains an entry per replica of the ensemble. Each entry of `replica` contains `name`, a string that contains the name of the replica -`deltas`, an array that contains the actual data. +`deltas`, an array that contains the actual data. Each entry in `deltas` corresponds to one configuration of the replica and has $1+N$ many entries. The first entry is an integer that specifies the configuration number that, together with ensemble and replica name, may be used to uniquely identify the configuration on which the data has been obtained. The following N entries specify the deltas, i.e., the deviation of the observable from the mean value on this configuration, of each `Obs` inside the structure. Multi-dimensional structures are stored in a row-major format. For primary observables, such as correlation functions, $value + delta_i$ matches the primary data obtained on the configuration. @@ -383,6 +383,8 @@ The array `cdata` contains information about the contribution of auxiliary obser A JSON schema that may be used to verify the correctness of a file with respect to the format definition is stored in ./examples/json_schema.json. The schema is a self-descriptive format definition and contains an exemplary file. +Julia I/O routines for the json.gz format, compatible with [ADerrors.jl](https://gitlab.ift.uam-csic.es/alberto/aderrors.jl), can be found [here](https://github.com/fjosw/ADjson.jl). + ## Jackknife samples For comparison with other analysis workflows `pyerrors` can generate jackknife samples from an `Obs` object or import jackknife samples into an `Obs` object. See `pyerrors.obs.Obs.export_jackknife` and `pyerrors.obs.import_jackknife` for details. From 280dbb5d984a2fb3a9f6c91f9a77bc84f351b977 Mon Sep 17 00:00:00 2001 From: JanNeuendorf Date: Tue, 22 Feb 2022 08:25:45 +0100 Subject: [PATCH 081/136] comment deleted --- pyerrors/correlators.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py index c7078fa3..1da8f3bc 100644 --- a/pyerrors/correlators.py +++ b/pyerrors/correlators.py @@ -7,7 +7,6 @@ import scipy.linalg from .obs import Obs, reweight, correlate, CObs from .misc import dump_object, _assert_equal_properties from .fits import least_squares -# from .linalg import eigh, inv, cholesky from .roots import find_root From 5e1724d7e0cc1173c90fc2606fef7e831c863273 Mon Sep 17 00:00:00 2001 From: Simon Kuberski Date: Tue, 22 Feb 2022 09:31:01 +0100 Subject: [PATCH 082/136] Adapted json_schema --- examples/json_schema.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/json_schema.json b/examples/json_schema.json index 81d12599..c836c195 100644 --- a/examples/json_schema.json +++ b/examples/json_schema.json @@ -46,8 +46,8 @@ "description": "Hostname of the machine where the file has been written." }, "description": { - "type": "string", - "description": "A string that describes the content of the file." + "type": ["number","string","boolean","object","array","null"], + "description": "A description of the content of the file." }, "obsdata": { "type": "array", @@ -101,7 +101,7 @@ }] }, "tag": { - "type": "string", + "type": ["number","string","boolean","object","array","null"], "description": "Optional descriptor of the structure." }, "reweighted": { @@ -340,4 +340,4 @@ ] } ] -} \ No newline at end of file +} From 97273b33ef2aea305348ef35ca57a2d355f60b9d Mon Sep 17 00:00:00 2001 From: Simon Kuberski Date: Tue, 22 Feb 2022 10:22:09 +0100 Subject: [PATCH 083/136] Added documentation of Covobs --- pyerrors/__init__.py | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/pyerrors/__init__.py b/pyerrors/__init__.py index 0a825a3e..b6d84c2b 100644 --- a/pyerrors/__init__.py +++ b/pyerrors/__init__.py @@ -270,6 +270,39 @@ print(my_derived_cobs) > (1.668(23)+0.0j) ``` +# The `Covobs` class +In many projects, auxiliary data that is not based on Monte Carlo chains enters. Examples are experimentally determined mesons masses which are used to set the scale or renormalization constants. These numbers come with an error that has to be propagated through the analysis. The `Covobs` class allows to define such quantities in `pyerrors`. Furthermore, external input might consist of correlated quantities. An example are the parameters of an interpolation formula, which are defined via mean values and a covariance matrix between all parameters. The contribution of the interpolation formula to the error of a derived quantity therefore might depend on the complete covariance matrix. + +This concept is built into the definition of `Covobs`. In `pyerrors`, external input is defined by $M$ mean values, a $M\times M$ covariance matrix, where $M=1$ is permissable, and a name that uniquely identifies the covariance matrix. Below, we define the pion mass, based on its mean value and error, 134.9768(5). Note, that the square of the error enters `cov_Obs`, since the second argument of this function is the covariance matrix of the `Covobs`. + +```python +import pyerrors.obs as pe + +mpi = pe.cov_Obs(134.9768, 0.0005**2, 'pi^0 mass') +mpi.gamma_method() +mpi.details() +> Result 1.34976800e+02 +/- 5.00000000e-04 +/- 0.00000000e+00 (0.000%) +> pi^0 mass 5.00000000e-04 +> 0 samples in 1 ensemble: +> · Covobs 'pi^0 mass' +``` +The resulting object `mpi` is an `Obs` that contains a `Covobs`. In the following, it may be handled as any other `Obs`. The contribution of the covariance matrix to the error of an `Obs` is determined from the $M \times M$ covariance matrix $\Sigma$ and the gradient of the `Obs` with respect to the external quantitites, which is the $1\times M$ Jacobian matrix $J$, via +$$s = \sqrt{J^T \Sigma J}\,,$$ +where the Jacobian is computed for each derived quantity via automatic differentiation. + +Correlated auxiliary data is defined similarly to above, e.g., via +```python +RAP = pe.cov_Obs([16.7457, -19.0475], [[3.49591, -6.07560], [-6.07560, 10.5834]], 'R_AP, 1906.03445, (5.3a)') +print(RAP) +> [Obs[16.7(1.9)], Obs[-19.0(3.3)]] +``` +where `RAP` now is a list of two `Obs` that contains the two correlated parameters. + +Since the gradient of a derived observable with respect to an external covariance matrix is propagated through the entire analysis, the `Covobs` class allows to quote the derivative of a result with respect to the external quantities. If these derivatives are published together with the result, small shifts in the definition of external quantities, e.g., the definition of the physical point, can be performed a posteriori based on the published information. This may help to compare results of different groups. The gradient of an `Obs` `o` with respect to a covariance matrix with the identificating string `k` may be accessed via +```python +o.covobs[k].grad +``` + # Error propagation in iterative algorithms `pyerrors` supports exact linear error propagation for iterative algorithms like various variants of non-linear least sqaures fits or root finding. The derivatives required for the error propagation are calculated as described in [arXiv:1809.01289](https://arxiv.org/abs/1809.01289). @@ -385,7 +418,7 @@ A JSON schema that may be used to verify the correctness of a file with respect Julia I/O routines for the json.gz format, compatible with [ADerrors.jl](https://gitlab.ift.uam-csic.es/alberto/aderrors.jl), can be found [here](https://github.com/fjosw/ADjson.jl). -## Jackknife samples +# Jackknife samples For comparison with other analysis workflows `pyerrors` can generate jackknife samples from an `Obs` object or import jackknife samples into an `Obs` object. See `pyerrors.obs.Obs.export_jackknife` and `pyerrors.obs.import_jackknife` for details. From 19d7e7639ecaf815710cb137daa6c047dd14f9e2 Mon Sep 17 00:00:00 2001 From: Simon Kuberski Date: Tue, 22 Feb 2022 10:29:51 +0100 Subject: [PATCH 084/136] qtop_projection can now handle non-int charges --- pyerrors/input/openQCD.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyerrors/input/openQCD.py b/pyerrors/input/openQCD.py index b3b8da04..f32663fe 100644 --- a/pyerrors/input/openQCD.py +++ b/pyerrors/input/openQCD.py @@ -780,7 +780,7 @@ def qtop_projection(qtop, target=0): Parameters ---------- path : Obs - Topological charge, rounded to nearest integer on each config. + Topological charge. target : int Specifies the topological sector to be reweighted to (default 0) """ @@ -789,7 +789,7 @@ def qtop_projection(qtop, target=0): proj_qtop = [] for n in qtop.deltas: - proj_qtop.append(np.array([1 if int(qtop.value + q) == target else 0 for q in qtop.deltas[n]])) + proj_qtop.append(np.array([1 if round(qtop.value + q) == target else 0 for q in qtop.deltas[n]])) reto = Obs(proj_qtop, qtop.names, idl=[qtop.idl[name] for name in qtop.names]) reto.is_merged = qtop.is_merged From 43191db72f1427d958fc9462e641ba18e9760067 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 22 Feb 2022 09:57:35 +0000 Subject: [PATCH 085/136] docs: Section about Jackknife samples movded to input, typos corrected. --- pyerrors/__init__.py | 14 +++++--------- pyerrors/input/__init__.py | 4 ++++ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pyerrors/__init__.py b/pyerrors/__init__.py index b6d84c2b..9badb820 100644 --- a/pyerrors/__init__.py +++ b/pyerrors/__init__.py @@ -273,7 +273,7 @@ print(my_derived_cobs) # The `Covobs` class In many projects, auxiliary data that is not based on Monte Carlo chains enters. Examples are experimentally determined mesons masses which are used to set the scale or renormalization constants. These numbers come with an error that has to be propagated through the analysis. The `Covobs` class allows to define such quantities in `pyerrors`. Furthermore, external input might consist of correlated quantities. An example are the parameters of an interpolation formula, which are defined via mean values and a covariance matrix between all parameters. The contribution of the interpolation formula to the error of a derived quantity therefore might depend on the complete covariance matrix. -This concept is built into the definition of `Covobs`. In `pyerrors`, external input is defined by $M$ mean values, a $M\times M$ covariance matrix, where $M=1$ is permissable, and a name that uniquely identifies the covariance matrix. Below, we define the pion mass, based on its mean value and error, 134.9768(5). Note, that the square of the error enters `cov_Obs`, since the second argument of this function is the covariance matrix of the `Covobs`. +This concept is built into the definition of `Covobs`. In `pyerrors`, external input is defined by $M$ mean values, a $M\times M$ covariance matrix, where $M=1$ is permissible, and a name that uniquely identifies the covariance matrix. Below, we define the pion mass, based on its mean value and error, 134.9768(5). Note, that the square of the error enters `cov_Obs`, since the second argument of this function is the covariance matrix of the `Covobs`. ```python import pyerrors.obs as pe @@ -284,11 +284,11 @@ mpi.details() > Result 1.34976800e+02 +/- 5.00000000e-04 +/- 0.00000000e+00 (0.000%) > pi^0 mass 5.00000000e-04 > 0 samples in 1 ensemble: -> · Covobs 'pi^0 mass' +> · Covobs 'pi^0 mass' ``` -The resulting object `mpi` is an `Obs` that contains a `Covobs`. In the following, it may be handled as any other `Obs`. The contribution of the covariance matrix to the error of an `Obs` is determined from the $M \times M$ covariance matrix $\Sigma$ and the gradient of the `Obs` with respect to the external quantitites, which is the $1\times M$ Jacobian matrix $J$, via +The resulting object `mpi` is an `Obs` that contains a `Covobs`. In the following, it may be handled as any other `Obs`. The contribution of the covariance matrix to the error of an `Obs` is determined from the $M \times M$ covariance matrix $\Sigma$ and the gradient of the `Obs` with respect to the external quantities, which is the $1\times M$ Jacobian matrix $J$, via $$s = \sqrt{J^T \Sigma J}\,,$$ -where the Jacobian is computed for each derived quantity via automatic differentiation. +where the Jacobian is computed for each derived quantity via automatic differentiation. Correlated auxiliary data is defined similarly to above, e.g., via ```python @@ -298,7 +298,7 @@ print(RAP) ``` where `RAP` now is a list of two `Obs` that contains the two correlated parameters. -Since the gradient of a derived observable with respect to an external covariance matrix is propagated through the entire analysis, the `Covobs` class allows to quote the derivative of a result with respect to the external quantities. If these derivatives are published together with the result, small shifts in the definition of external quantities, e.g., the definition of the physical point, can be performed a posteriori based on the published information. This may help to compare results of different groups. The gradient of an `Obs` `o` with respect to a covariance matrix with the identificating string `k` may be accessed via +Since the gradient of a derived observable with respect to an external covariance matrix is propagated through the entire analysis, the `Covobs` class allows to quote the derivative of a result with respect to the external quantities. If these derivatives are published together with the result, small shifts in the definition of external quantities, e.g., the definition of the physical point, can be performed a posteriori based on the published information. This may help to compare results of different groups. The gradient of an `Obs` `o` with respect to a covariance matrix with the identifying string `k` may be accessed via ```python o.covobs[k].grad ``` @@ -418,10 +418,6 @@ A JSON schema that may be used to verify the correctness of a file with respect Julia I/O routines for the json.gz format, compatible with [ADerrors.jl](https://gitlab.ift.uam-csic.es/alberto/aderrors.jl), can be found [here](https://github.com/fjosw/ADjson.jl). -# Jackknife samples -For comparison with other analysis workflows `pyerrors` can generate jackknife samples from an `Obs` object or import jackknife samples into an `Obs` object. -See `pyerrors.obs.Obs.export_jackknife` and `pyerrors.obs.import_jackknife` for details. - # Citing If you use `pyerrors` for research that leads to a publication please consider citing: - Ulli Wolff, *Monte Carlo errors with less errors*. Comput.Phys.Commun. 156 (2004) 143-153, Comput.Phys.Commun. 176 (2007) 383 (erratum). diff --git a/pyerrors/input/__init__.py b/pyerrors/input/__init__.py index 735de0c3..3b585614 100644 --- a/pyerrors/input/__init__.py +++ b/pyerrors/input/__init__.py @@ -1,5 +1,9 @@ r''' `pyerrors` includes an `input` submodule in which input routines and parsers for the output of various numerical programs are contained. + +# Jackknife samples +For comparison with other analysis workflows `pyerrors` can also generate jackknife samples from an `Obs` object or import jackknife samples into an `Obs` object. +See `pyerrors.obs.Obs.export_jackknife` and `pyerrors.obs.import_jackknife` for details. ''' from . import bdio from . import hadrons From 350ccc083e447ade4884b91c5efb236827ad9958 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 22 Feb 2022 10:10:18 +0000 Subject: [PATCH 086/136] docs: example for export to json.gz format added --- pyerrors/__init__.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/pyerrors/__init__.py b/pyerrors/__init__.py index 9badb820..4aa75e22 100644 --- a/pyerrors/__init__.py +++ b/pyerrors/__init__.py @@ -377,7 +377,23 @@ The preferred exported file format within `pyerrors` is json.gz. Files written t - How does each single ensemble or external quantity contribute to the error of the observable? - Who did write the file when and on which machine? -This can be achieved by storing all information in one single file. The export routines of `pyerrors` are written such that as much information as possible is written automatically. The first entries of the file provide optional auxiliary information: +This can be achieved by storing all information in one single file. The export routines of `pyerrors` are written such that as much information as possible is written automatically as described in the following example +```python +my_obs = pe.Obs([samples], ["test_ensemble"]) +my_obs.tag = "My observable" + +pe.input.json.dump_to_json(my_obs, "test_output_file", description="This file contains a test observable") +# For a single observable one can equivalently use the class method dump +my_obs.dump("test_output", description="This file contains a test observable") + +check = pe.input.json.load_json("test_output_file") + +print(my_obs == check) +> True +``` + +## json.gz format specification +The first entries of the file provide optional auxiliary information: - `program` is a string that indicates which program was used to write the file. - `version` is a string that specifies the version of the format. - `who` is a string that specifies the user name of the creator of the file. From e435907a0795166a2f1e08fcf759485c58f3e34d Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 22 Feb 2022 10:15:11 +0000 Subject: [PATCH 087/136] docs: explanation of json.gz example slightly extended. --- pyerrors/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyerrors/__init__.py b/pyerrors/__init__.py index 4aa75e22..69f919f7 100644 --- a/pyerrors/__init__.py +++ b/pyerrors/__init__.py @@ -384,13 +384,14 @@ my_obs.tag = "My observable" pe.input.json.dump_to_json(my_obs, "test_output_file", description="This file contains a test observable") # For a single observable one can equivalently use the class method dump -my_obs.dump("test_output", description="This file contains a test observable") +my_obs.dump("test_output_file", description="This file contains a test observable") check = pe.input.json.load_json("test_output_file") print(my_obs == check) > True ``` +The format also allows to directly write out the content of `Corr` objects or lists and arrays of `Obs` objects by passing the desired data to `pyerrors.input.json.dump_to_json`. ## json.gz format specification The first entries of the file provide optional auxiliary information: From 1ee4aa0a597bd6c326ee133bd64e6f376b4d2f9c Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 22 Feb 2022 10:53:49 +0000 Subject: [PATCH 088/136] feat: hadrons.read_mesons_hd5 now checks whether 'meson' is available and throws a dedicated exception. --- pyerrors/input/hadrons.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pyerrors/input/hadrons.py b/pyerrors/input/hadrons.py index a03dc6c6..e414183c 100644 --- a/pyerrors/input/hadrons.py +++ b/pyerrors/input/hadrons.py @@ -73,14 +73,16 @@ def read_meson_hd5(path, filestem, ens_id, meson='meson_0', idl=None): corr_data = [] infos = [] for hd5_file in files: - file = h5py.File(path + '/' + hd5_file, "r") - raw_data = list(file[tree + '/' + meson + '/corr']) + h5file = h5py.File(path + '/' + hd5_file, "r") + if not tree + '/' + meson in h5file: + raise Exception("Entry '" + meson + "' not contained in the files.") + raw_data = list(h5file[tree + '/' + meson + '/corr']) real_data = [o[0] for o in raw_data] corr_data.append(real_data) if not infos: - for k, i in file[tree + '/' + meson].attrs.items(): + for k, i in h5file[tree + '/' + meson].attrs.items(): infos.append(k + ': ' + i[0].decode()) - file.close() + h5file.close() corr_data = np.array(corr_data) l_obs = [] From dd3bee56359879793c8a5b5fdfc41d686558c7fd Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 22 Feb 2022 15:09:06 +0000 Subject: [PATCH 089/136] feat: basic arithmetic operations for correlators and np.ndarrays of the same length work now. --- pyerrors/correlators.py | 15 +++++++++++++++ tests/correlators_test.py | 30 +++++++++++++++++++++++------- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py index 2274f7e1..a363852c 100644 --- a/pyerrors/correlators.py +++ b/pyerrors/correlators.py @@ -867,6 +867,11 @@ class Corr: else: newcontent.append(self.content[t] + y) return Corr(newcontent, prange=self.prange) + elif isinstance(y, np.ndarray): + if y.shape == (self.T,): + return Corr(list((np.array(self.content).T + y).T)) + else: + raise ValueError("operands could not be broadcast together") else: raise TypeError("Corr + wrong type") @@ -890,6 +895,11 @@ class Corr: else: newcontent.append(self.content[t] * y) return Corr(newcontent, prange=self.prange) + elif isinstance(y, np.ndarray): + if y.shape == (self.T,): + return Corr(list((np.array(self.content).T * y).T)) + else: + raise ValueError("operands could not be broadcast together") else: raise TypeError("Corr * wrong type") @@ -939,6 +949,11 @@ class Corr: else: newcontent.append(self.content[t] / y) return Corr(newcontent, prange=self.prange) + elif isinstance(y, np.ndarray): + if y.shape == (self.T,): + return Corr(list((np.array(self.content).T / y).T)) + else: + raise ValueError("operands could not be broadcast together") else: raise TypeError('Corr / wrong type') diff --git a/tests/correlators_test.py b/tests/correlators_test.py index 27dc0f67..2d068d90 100644 --- a/tests/correlators_test.py +++ b/tests/correlators_test.py @@ -219,13 +219,6 @@ def test_prange(): def test_matrix_corr(): - def _gen_corr(val): - corr_content = [] - for t in range(16): - corr_content.append(pe.pseudo_Obs(val, 0.1, 't', 2000)) - - return pe.correlators.Corr(corr_content) - corr_aa = _gen_corr(1) corr_ab = _gen_corr(0.5) @@ -311,3 +304,26 @@ def test_corr_matrix_none_entries(): corr = pe.Corr(oy) corr = corr.deriv() pe.Corr(np.array([[corr, corr], [corr, corr]])) + + +def test_corr_vector_operations(): + my_corr = _gen_corr(1.0) + my_vec = np.arange(1, 17) + + my_corr + my_vec + my_corr - my_vec + my_corr * my_vec + my_corr / my_vec + + assert np.all([o == 0 for o in ((my_corr + my_vec) - my_vec) - my_corr]) + assert np.all([o == 0 for o in ((my_corr - my_vec) + my_vec) - my_corr]) + assert np.all([o == 0 for o in ((my_corr * my_vec) / my_vec) - my_corr]) + assert np.all([o == 0 for o in ((my_corr / my_vec) * my_vec) - my_corr]) + +def _gen_corr(val): + corr_content = [] + for t in range(16): + corr_content.append(pe.pseudo_Obs(val, 0.1, 't', 2000)) + + return pe.correlators.Corr(corr_content) + From 39dff5a830cfb730783abe44b33f826f29821d5a Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 22 Feb 2022 21:33:04 +0000 Subject: [PATCH 090/136] tests: tests for GEVP fixed, docstring for Corr.Eigenvalue added, typos fixed --- pyerrors/correlators.py | 21 +++++++++++++++++++-- tests/correlators_test.py | 2 +- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py index 5c24007f..cc3afa4b 100644 --- a/pyerrors/correlators.py +++ b/pyerrors/correlators.py @@ -255,9 +255,9 @@ class Corr: The state one is interested in ordered by energy. The lowest state is zero. sorted_list : string if this argument is set, a list of vectors (len=self.T) is returned. If it is left as None, only one vector is returned. - "Eigenvalue" - The eigenvector is chosen according to which einvenvalue it belongs individually on every timeslice. + "Eigenvalue" - The eigenvector is chosen according to which eigenvalue it belongs individually on every timeslice. "Eigenvector" - Use the method described in arXiv:2004.10472 [hep-lat] to find the set of v(t) belonging to the state. - The referense state is identified by its eigenvalue at t=ts + The reference state is identified by its eigenvalue at t=ts """ if sorted_list is None: if (ts is None): @@ -302,6 +302,23 @@ class Corr: return all_vecs def Eigenvalue(self, t0, ts=None, state=0, sorted_list=None): + """Determines the eigenvalue of the GEVP by solving and projecting the correlator + + Parameters + ---------- + t0 : int + The time t0 for G(t)v= lambda G(t_0)v + ts : int + fixed time G(t_s)v= lambda G(t_0)v if return_list=False + If return_list=True and sorting=Eigenvector it gives a reference point for the sorting method. + state : int + The state one is interested in ordered by energy. The lowest state is zero. + sorted_list : string + if this argument is set, a list of vectors (len=self.T) is returned. If it is left as None, only one vector is returned. + "Eigenvalue" - The eigenvector is chosen according to which eigenvalue it belongs individually on every timeslice. + "Eigenvector" - Use the method described in arXiv:2004.10472 [hep-lat] to find the set of v(t) belonging to the state. + The reference state is identified by its eigenvalue at t=ts + """ vec = self.GEVP(t0, ts=ts, state=state, sorted_list=sorted_list) return self.projected(vec) diff --git a/tests/correlators_test.py b/tests/correlators_test.py index 2d068d90..581705fd 100644 --- a/tests/correlators_test.py +++ b/tests/correlators_test.py @@ -220,7 +220,7 @@ def test_prange(): def test_matrix_corr(): corr_aa = _gen_corr(1) - corr_ab = _gen_corr(0.5) + corr_ab = 0.5 * corr_aa corr_mat = pe.Corr(np.array([[corr_aa, corr_ab], [corr_ab, corr_aa]])) corr_mat.item(0, 0) From 7ba013cc6024aa97b9f03455741b9bb5971f63bb Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 22 Feb 2022 21:41:32 +0000 Subject: [PATCH 091/136] Version number bumped to 2.0.0-rc.1 --- pyerrors/version.py | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyerrors/version.py b/pyerrors/version.py index 1452f094..8cc94347 100644 --- a/pyerrors/version.py +++ b/pyerrors/version.py @@ -1 +1 @@ -__version__ = "2.0.0+dev" +__version__ = "2.0.0-rc.1" diff --git a/setup.py b/setup.py index cef96ece..ea07cb5f 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup, find_packages setup(name='pyerrors', - version='2.0.0+dev', + version='2.0.0-rc.1', description='Error analysis for lattice QCD', author='Fabian Joswig', author_email='fabian.joswig@ed.ac.uk', From fe4c04adcb38d0d5724f6173319b3873c29b7dbb Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Wed, 23 Feb 2022 10:23:09 +0000 Subject: [PATCH 092/136] Version number bumped to 2.0.0-rc.2+dev --- pyerrors/version.py | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyerrors/version.py b/pyerrors/version.py index 8cc94347..c71c5a3d 100644 --- a/pyerrors/version.py +++ b/pyerrors/version.py @@ -1 +1 @@ -__version__ = "2.0.0-rc.1" +__version__ = "2.0.0-rc.2+dev" diff --git a/setup.py b/setup.py index ea07cb5f..0edc33a9 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup, find_packages setup(name='pyerrors', - version='2.0.0-rc.1', + version='2.0.0-rc.2+dev', description='Error analysis for lattice QCD', author='Fabian Joswig', author_email='fabian.joswig@ed.ac.uk', From 5ee975dc4474bafe7f2f5832d71cece1630ac5a5 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Wed, 23 Feb 2022 10:25:13 +0000 Subject: [PATCH 093/136] fix: auto detection of replica names in opeqnQCD.rwms now also works with dots in the file names. --- pyerrors/input/openQCD.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pyerrors/input/openQCD.py b/pyerrors/input/openQCD.py index f32663fe..d4da549f 100644 --- a/pyerrors/input/openQCD.py +++ b/pyerrors/input/openQCD.py @@ -92,6 +92,11 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs): if names is None: rep_names = [] for entry in ls: + truncated_entry = entry + suffixes = [".dat", ".rwms", ".ms1"] + for suffix in suffixes: + if truncated_entry.endswith(suffix): + truncated_entry = truncated_entry[0:-len(suffix)] truncated_entry = entry.split('.')[0] idx = truncated_entry.index('r') rep_names.append(truncated_entry[:idx] + '|' + truncated_entry[idx:]) From ab8e3ce549828e050fdff93f117636a41019f10b Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Wed, 23 Feb 2022 10:26:32 +0000 Subject: [PATCH 094/136] fix: splitting at '.' removed from auto detection of replica names in openQCD.read_rwms --- pyerrors/input/openQCD.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pyerrors/input/openQCD.py b/pyerrors/input/openQCD.py index d4da549f..05e9fdb7 100644 --- a/pyerrors/input/openQCD.py +++ b/pyerrors/input/openQCD.py @@ -97,7 +97,6 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs): for suffix in suffixes: if truncated_entry.endswith(suffix): truncated_entry = truncated_entry[0:-len(suffix)] - truncated_entry = entry.split('.')[0] idx = truncated_entry.index('r') rep_names.append(truncated_entry[:idx] + '|' + truncated_entry[idx:]) else: From 6bfeff4f27aa6a58fcd678c71cb8cf830678253a Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Wed, 23 Feb 2022 16:23:42 +0000 Subject: [PATCH 095/136] fix: Corr.fit now explicitly checks that the provided fit range is a two element list. --- pyerrors/correlators.py | 7 ++++++- tests/correlators_test.py | 5 +++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py index cc3afa4b..94dd2f09 100644 --- a/pyerrors/correlators.py +++ b/pyerrors/correlators.py @@ -628,7 +628,7 @@ class Corr: function : obj function to fit to the data. See fits.least_squares for details. fitrange : list - Range in which the function is to be fitted to the data. + Two element list containing the timeslices on which the fit is supposed to start and stop. If not specified, self.prange or all timeslices are used. silent : bool Decides whether output is printed to the standard output. @@ -641,6 +641,11 @@ class Corr: fitrange = self.prange else: fitrange = [0, self.T - 1] + else: + if not isinstance(fitrange, list): + raise Exception("fitrange has to be a list with two elements") + if len(fitrange) != 2: + raise Exception("fitrange has to have exactly two elements [fit_start, fit_stop]") xs = [x for x in range(fitrange[0], fitrange[1] + 1) if not self.content[x] is None] ys = [self.content[x][0] for x in range(fitrange[0], fitrange[1] + 1) if not self.content[x] is None] diff --git a/tests/correlators_test.py b/tests/correlators_test.py index 581705fd..9a2e7ea1 100644 --- a/tests/correlators_test.py +++ b/tests/correlators_test.py @@ -135,6 +135,11 @@ def test_fit_correlator(): assert fit_res[0] == my_corr[0] assert fit_res[1] == my_corr[1] - my_corr[0] + with pytest.raises(Exception): + my_corr.fit(f, "from 0 to 3") + with pytest.raises(Exception): + my_corr.fit(f, [0, 2, 3]) + def test_plateau(): my_corr = pe.correlators.Corr([pe.pseudo_Obs(1.01324, 0.05, 't'), pe.pseudo_Obs(1.042345, 0.008, 't')]) From 3288dfd148e094645be1de4894a40e54ad5f84ce Mon Sep 17 00:00:00 2001 From: Simon Kuberski Date: Wed, 23 Feb 2022 17:31:18 +0100 Subject: [PATCH 096/136] _merge_idx now returns sorted lists --- pyerrors/obs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyerrors/obs.py b/pyerrors/obs.py index bba9e43f..a2dd3ea1 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -971,7 +971,7 @@ def _merge_idx(idl): idstep = min([idx.step for idx in idl]) return range(idstart, idstop, idstep) - return list(set().union(*idl)) + return sorted(set().union(*idl)) def _expand_deltas_for_merge(deltas, idx, shape, new_idx): From 86b1371363b536b4c95198ffd45aeeab47344a47 Mon Sep 17 00:00:00 2001 From: Simon Kuberski Date: Wed, 23 Feb 2022 17:51:12 +0100 Subject: [PATCH 097/136] Adjusted function definitions, added test for _merge_idx --- pyerrors/obs.py | 8 ++++---- tests/obs_test.py | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/pyerrors/obs.py b/pyerrors/obs.py index a2dd3ea1..a85628a4 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -934,7 +934,7 @@ def _expand_deltas(deltas, idx, shape): deltas : list List of fluctuations idx : list - List or range of configs on which the deltas are defined. + List or range of configs on which the deltas are defined, has to be sorted in ascending order. shape : int Number of configs in idx. """ @@ -948,7 +948,7 @@ def _expand_deltas(deltas, idx, shape): def _merge_idx(idl): - """Returns the union of all lists in idl + """Returns the union of all lists in idl as sorted list Parameters ---------- @@ -985,11 +985,11 @@ def _expand_deltas_for_merge(deltas, idx, shape, new_idx): List of fluctuations idx : list List or range of configs on which the deltas are defined. - Has to be a subset of new_idx. + Has to be a subset of new_idx and has to be sorted in ascending order. shape : list Number of configs in idx. new_idx : list - List of configs that defines the new range. + List of configs that defines the new range, has to be sorted in ascending order. """ if type(idx) is range and type(new_idx) is range: diff --git a/tests/obs_test.py b/tests/obs_test.py index 44f282ac..2fed00af 100644 --- a/tests/obs_test.py +++ b/tests/obs_test.py @@ -613,6 +613,12 @@ def test_gamma_method_irregular(): assert((ae.e_tauint['a'] - 4 * ae.e_dtauint['a'] < ao.e_tauint['a'])) assert((ae.e_tauint['a'] + 4 * ae.e_dtauint['a'] > ao.e_tauint['a'])) + a = pe.pseudo_Obs(1, .1, 'a', samples=10) + a.idl['a'] = range(4, 15) + b = pe.pseudo_Obs(1, .1, 'a', samples=151) + b.idl['a'] = range(4, 608, 4) + ol = [a, b] + o = (ol[0] - ol[1]) / (ol[1]) def test_covariance_symmetry(): value1 = np.random.normal(5, 10) @@ -691,3 +697,11 @@ def test_reduce_deltas(): new = pe.obs._reduce_deltas(deltas, idx_old, idx_new) print(new) assert(np.alltrue([float(i) for i in idx_new] == new)) + + +def test_merge_idx(): + idl = [list(np.arange(1, 14)) + list(range(16, 100, 4)), range(4, 604, 4), [2, 4, 5, 6, 8, 9, 12, 24], range(1, 20, 1), range(50, 789, 7)] + new_idx = pe.obs._merge_idx(idl) + assert(new_idx[-1] > new_idx[0]) + for i in range(1, len(new_idx)): + assert(new_idx[i - 1] < new_idx[i]) \ No newline at end of file From 24a0df6a2a0fde97aad99a81adbe4f0bf6d93dc5 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Thu, 24 Feb 2022 16:12:37 +0000 Subject: [PATCH 098/136] feat: a warning is now issued when an estimated covariance matrix is not positive semi-definite. Docstrings extended. --- pyerrors/fits.py | 15 +++++++++++++-- pyerrors/obs.py | 8 ++++---- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/pyerrors/fits.py b/pyerrors/fits.py index 061efcd3..c1364c13 100644 --- a/pyerrors/fits.py +++ b/pyerrors/fits.py @@ -652,7 +652,13 @@ def residual_plot(x, y, func, fit_res): def covariance_matrix(y): - """Returns the covariance matrix of y.""" + """Returns the covariance matrix of y. + + Parameters + ---------- + y : list or numpy.ndarray + List or one dimensional array of Obs + """ length = len(y) cov = np.zeros((length, length)) for i, item in enumerate(y): @@ -661,7 +667,12 @@ def covariance_matrix(y): cov[i, j] = item.dvalue ** 2 else: cov[i, j] = covariance(item, jtem) - return cov + cov.T - np.diag(np.diag(cov)) + cov = cov + cov.T - np.diag(np.diag(cov)) + eigenvalues = np.linalg.eigh(cov)[0] + if not np.all(eigenvalues >= 0): + warnings.warn("Covariance matrix is not positive semi-definite", RuntimeWarning) + print("Eigenvalues of the covariance matrix:", eigenvalues) + return cov def error_band(x, func, beta): diff --git a/pyerrors/obs.py b/pyerrors/obs.py index a85628a4..aea75752 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -1341,10 +1341,10 @@ def covariance(obs1, obs2, correlation=False, **kwargs): If abs(covariance(obs1, obs2)) > obs1.dvalue * obs2.dvalue, the covariance is constrained to the maximum value. - Keyword arguments - ----------------- - correlation -- if true the correlation instead of the covariance is - returned (default False) + Parameters + ---------- + correlation : bool + if true the correlation instead of the covariance is returned (default False) """ def expand_deltas(deltas, idx, shape, new_idx): From 751d28711f9ff70bd07494b9dd4648cce2c25103 Mon Sep 17 00:00:00 2001 From: Simon Kuberski Date: Fri, 25 Feb 2022 17:39:49 +0100 Subject: [PATCH 099/136] feat: Check for symmetry and positive-semidefiniteness of covariance matrices in the initialization of covobs --- pyerrors/covobs.py | 29 +++++++++++++++++++++++++++++ tests/covobs_test.py | 9 ++++++--- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/pyerrors/covobs.py b/pyerrors/covobs.py index 2c8f81fc..49953983 100644 --- a/pyerrors/covobs.py +++ b/pyerrors/covobs.py @@ -45,6 +45,16 @@ class Covobs: return float(np.dot(np.transpose(self.grad), np.dot(self.cov, self.grad))) def _set_cov(self, cov): + """ Set the covariance matrix of the covobs + + Parameters + ---------- + cov : list or array + Has to be either of: + 0 dimensional number: variance of a single covobs, + 1 dimensional list or array of lenght N: variances of multiple covobs + 2 dimensional list or array (N x N): Symmetric, positive-semidefinite covariance matrix + """ self._cov = np.array(cov) if self._cov.ndim == 0: self.N = 1 @@ -59,7 +69,26 @@ class Covobs: else: raise Exception('Covariance matrix has to be a 2 dimensional square matrix!') + for i in range(self.N): + for j in range(i): + if not self._cov[i][j] == self._cov[j][i]: + raise Exception('Covariance matrix is non-symmetric for (%d, %d' % (i, j)) + + evals = np.linalg.eigvalsh(self._cov) + for ev in evals: + if ev < 0: + raise Exception('Covariance matrix is not positive-semidefinite!') + def _set_grad(self, grad): + """ Set the gradient of the covobs + + Parameters + ---------- + grad : list or array + Has to be either of: + 0 dimensional number: gradient w.r.t. a single covobs, + 1 dimensional list or array of lenght N: gradient w.r.t. multiple covobs + """ self._grad = np.array(grad) if self._grad.ndim in [0, 1]: self._grad = np.reshape(self._grad, (self.N, 1)) diff --git a/tests/covobs_test.py b/tests/covobs_test.py index 215c75d3..418cb83e 100644 --- a/tests/covobs_test.py +++ b/tests/covobs_test.py @@ -78,9 +78,8 @@ def test_covobs_init(): covobs = pe.cov_Obs(0.5, 0.002, 'test') covobs = pe.cov_Obs([1, 2], [0.1, 0.2], 'test') covobs = pe.cov_Obs([1, 2], np.array([0.1, 0.2]), 'test') - covobs = pe.cov_Obs([1, 2], [[0.1, 0.2], [0.1, 0.2]], 'test') - covobs = pe.cov_Obs([1, 2], np.array([[0.1, 0.2], [0.1, 0.2]]), 'test') - + covobs = pe.cov_Obs([1, 2], [[0.21, 0.2], [0.2, 0.21]], 'test') + covobs = pe.cov_Obs([1, 2], np.array([[0.21, 0.2], [0.2, 0.21]]), 'test') def test_covobs_exceptions(): @@ -92,3 +91,7 @@ def test_covobs_exceptions(): covobs = pe.cov_Obs([0.5, 0.1], np.array([[2, 1, 3], [1, 2, 3]]), 'test') with pytest.raises(Exception): covobs = pe.cov_Obs([0.5, 0.1], np.random.random((2, 2, 2)), 'test') + with pytest.raises(Exception): + covobs = pe.cov_Obs([1.5, 0.1], [[1., .2,], [.3, .5]] , 'test') + with pytest.raises(Exception): + covobs = pe.cov_Obs([1.5, 0.1], [[8, 4,], [4, -2]] , 'test') From 542296099fb93933086bc012bd848a62ba8cc2cf Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Fri, 25 Feb 2022 16:41:02 +0000 Subject: [PATCH 100/136] feat: hadrons fourquark function can now read tensor operators --- pyerrors/input/hadrons.py | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/pyerrors/input/hadrons.py b/pyerrors/input/hadrons.py index e414183c..b62325dc 100644 --- a/pyerrors/input/hadrons.py +++ b/pyerrors/input/hadrons.py @@ -4,6 +4,7 @@ import h5py import numpy as np from ..obs import Obs, CObs from ..correlators import Corr +from ..dirac import epsilon_tensor_rank4 def _get_files(path, filestem, idl): @@ -280,10 +281,14 @@ def read_Fourquark_hd5(path, filestem, ens_id, idl=None, vertices=["VA", "AV"]): for vertex in vertices: lorentz_names = _get_lorentz_names(vertex) for v_name in lorentz_names: - if vertex not in intermediate_dict: - intermediate_dict[vertex] = np.array(corr_data[v_name]) + if v_name in [('SigmaXZ', 'SigmaYT'), ('SigmaYT', 'SigmaXZ')]: + sign = -1 else: - intermediate_dict[vertex] += np.array(corr_data[v_name]) + sign = 1 + if vertex not in intermediate_dict: + intermediate_dict[vertex] = sign * np.array(corr_data[v_name]) + else: + intermediate_dict[vertex] += sign * np.array(corr_data[v_name]) result_dict = {} @@ -303,12 +308,27 @@ def read_Fourquark_hd5(path, filestem, ens_id, idl=None, vertices=["VA", "AV"]): def _get_lorentz_names(name): - assert len(name) == 2 + lorentz_index = ['X', 'Y', 'Z', 'T'] res = [] - if not set(name) <= set(['S', 'P', 'V', 'A', 'T']): - raise Exception("Name can only contain 'S', 'P', 'V', 'A' or 'T'") + if name == "TT": + for i in range(4): + for j in range(i + 1, 4): + res.append(("Sigma" + lorentz_index[i] + lorentz_index[j], "Sigma" + lorentz_index[i] + lorentz_index[j])) + return res + + if name == "TTtilde": + for i in range(4): + for j in range(i + 1, 4): + for k in range(4): + for o in range(k + 1, 4): + fac = epsilon_tensor_rank4(i, j, k, o) + if not np.isclose(fac, 0.0): + res.append(("Sigma" + lorentz_index[i] + lorentz_index[j], "Sigma" + lorentz_index[k] + lorentz_index[o])) + return res + + assert len(name) == 2 if 'S' in name or 'P' in name: if not set(name) <= set(['S', 'P']): @@ -319,14 +339,9 @@ def _get_lorentz_names(name): res.append((g_names[name[0]], g_names[name[1]])) - elif 'T' in name: - if not set(name) <= set(['T']): - raise Exception("'" + name + "' is not a Lorentz scalar") - raise Exception("Tensor operators not yet implemented.") else: if not set(name) <= set(['V', 'A']): raise Exception("'" + name + "' is not a Lorentz scalar") - lorentz_index = ['X', 'Y', 'Z', 'T'] for ind in lorentz_index: res.append(('Gamma' + ind + (name[0] == 'A') * 'Gamma5', From 4498da01a9cc79dc2da8e5b26fe9da2e12e1e9fb Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Fri, 25 Feb 2022 16:59:20 +0000 Subject: [PATCH 101/136] fix: Relative minus sign for TTtilde operator added in hadrons.read_fourquark_hd5 --- pyerrors/input/hadrons.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pyerrors/input/hadrons.py b/pyerrors/input/hadrons.py index b62325dc..75a19aea 100644 --- a/pyerrors/input/hadrons.py +++ b/pyerrors/input/hadrons.py @@ -281,7 +281,10 @@ def read_Fourquark_hd5(path, filestem, ens_id, idl=None, vertices=["VA", "AV"]): for vertex in vertices: lorentz_names = _get_lorentz_names(vertex) for v_name in lorentz_names: - if v_name in [('SigmaXZ', 'SigmaYT'), ('SigmaYT', 'SigmaXZ')]: + if v_name in [('SigmaXY', 'SigmaZT'), + ('SigmaXT', 'SigmaYZ'), + ('SigmaYZ', 'SigmaXT'), + ('SigmaZT', 'SigmaXY')]: sign = -1 else: sign = 1 From 8e3e34bbea99f36852c4f9a6eb586b51507af4fd Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Sat, 26 Feb 2022 09:13:59 +0000 Subject: [PATCH 102/136] tests: test for covariance of covobs added --- tests/covobs_test.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/covobs_test.py b/tests/covobs_test.py index 418cb83e..82cd4ae0 100644 --- a/tests/covobs_test.py +++ b/tests/covobs_test.py @@ -82,6 +82,19 @@ def test_covobs_init(): covobs = pe.cov_Obs([1, 2], np.array([[0.21, 0.2], [0.2, 0.21]]), 'test') +def test_covobs_covariance(): + a = pe.cov_Obs(2.47, 0.03 ** 2, "Cov_obs 1") + b = pe.cov_Obs(-4.3, 0.335 ** 2, "Cov_obs 2") + + x = [a + b, a - b] + [o.gamma_method() for o in x] + + covariance = pe.fits.covariance_matrix(x) + + assert covariance[0, 0] == covariance[1, 1] + assert covariance[0, 1] == a.dvalue ** 2 - b.dvalue ** 2 + + def test_covobs_exceptions(): with pytest.raises(Exception): covobs = pe.cov_Obs(0.1, [[0.1, 0.2], [0.1, 0.2]], 'test') From 82419b7a88f372bf9392d77b7f1a93338da98c36 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 1 Mar 2022 09:45:25 +0000 Subject: [PATCH 103/136] feat: positive semi-definite estimator for the covariance implemented, fits.covariance matrix deprecated, covariance can now handle lists of observables. --- pyerrors/fits.py | 32 +++------------------- pyerrors/obs.py | 65 ++++++++++++++++++++++++++++++-------------- tests/covobs_test.py | 6 ++-- tests/fits_test.py | 10 +++---- tests/obs_test.py | 31 ++++++--------------- 5 files changed, 65 insertions(+), 79 deletions(-) diff --git a/pyerrors/fits.py b/pyerrors/fits.py index c1364c13..e290dbfb 100644 --- a/pyerrors/fits.py +++ b/pyerrors/fits.py @@ -239,7 +239,7 @@ def total_least_squares(x, y, func, silent=False, **kwargs): if kwargs.get('covariance') is not None: cov = kwargs.get('covariance') else: - cov = covariance_matrix(np.concatenate((y, x.ravel()))) + cov = covariance(np.concatenate((y, x.ravel()))) number_of_x_parameters = int(m / x_f.shape[-1]) @@ -455,7 +455,7 @@ def _standard_fit(x, y, func, silent=False, **kwargs): x0 = [0.1] * n_parms if kwargs.get('correlated_fit') is True: - cov = covariance_matrix(y) + cov = covariance(y) covdiag = np.diag(1. / np.sqrt(np.diag(cov))) corr = np.copy(cov) for i in range(len(y)): @@ -527,7 +527,7 @@ def _standard_fit(x, y, func, silent=False, **kwargs): if kwargs.get('expected_chisquare') is True: if kwargs.get('correlated_fit') is not True: W = np.diag(1 / np.asarray(dy_f)) - cov = covariance_matrix(y) + cov = covariance(y) A = W @ jacobian(func)(fit_result.x, x) P_phi = A @ np.linalg.inv(A.T @ A) @ A.T expected_chisquare = np.trace((np.identity(x.shape[-1]) - P_phi) @ W @ cov @ W) @@ -651,33 +651,9 @@ def residual_plot(x, y, func, fit_res): plt.draw() -def covariance_matrix(y): - """Returns the covariance matrix of y. - - Parameters - ---------- - y : list or numpy.ndarray - List or one dimensional array of Obs - """ - length = len(y) - cov = np.zeros((length, length)) - for i, item in enumerate(y): - for j, jtem in enumerate(y[:i + 1]): - if i == j: - cov[i, j] = item.dvalue ** 2 - else: - cov[i, j] = covariance(item, jtem) - cov = cov + cov.T - np.diag(np.diag(cov)) - eigenvalues = np.linalg.eigh(cov)[0] - if not np.all(eigenvalues >= 0): - warnings.warn("Covariance matrix is not positive semi-definite", RuntimeWarning) - print("Eigenvalues of the covariance matrix:", eigenvalues) - return cov - - def error_band(x, func, beta): """Returns the error band for an array of sample values x, for given fit function func with optimized parameters beta.""" - cov = covariance_matrix(beta) + cov = covariance(beta) if np.any(np.abs(cov - cov.T) > 1000 * np.finfo(np.float64).eps): warnings.warn("Covariance matrix is not symmetric within floating point precision", RuntimeWarning) diff --git a/pyerrors/obs.py b/pyerrors/obs.py index aea75752..ecb848f0 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -1332,20 +1332,50 @@ def correlate(obs_a, obs_b): return o -def covariance(obs1, obs2, correlation=False, **kwargs): - """Calculates the covariance of two observables. +def covariance(obs, window=min, correlation=False, **kwargs): + """Calculates the covariance matrix of a set of observables. - covariance(obs, obs) is equal to obs.dvalue ** 2 + covariance([obs, obs])[0,1] is equal to obs.dvalue ** 2 The gamma method has to be applied first to both observables. - If abs(covariance(obs1, obs2)) > obs1.dvalue * obs2.dvalue, the covariance - is constrained to the maximum value. - Parameters ---------- + obs : list or numpy.ndarray + List or one dimensional array of Obs + window: function or dict + Function which selects the window for each ensemble, examples 'min', 'max', 'np.mean', 'np.median' + Alternatively a dictionary with an entry for every ensemble can be manually specified. correlation : bool if true the correlation instead of the covariance is returned (default False) """ + if isinstance(window, dict): + window_dict = window + else: + window_dict = {} + names = sorted(set([item for sublist in [o.mc_names for o in obs] for item in sublist])) + for name in names: + window_list = [] + for ob in obs: + if ob.e_windowsize.get(name) is not None: + window_list.append(ob.e_windowsize[name]) + window_dict[name] = int(window(window_list)) + + length = len(obs) + cov = np.zeros((length, length)) + for i, item in enumerate(obs): + for j, jtem in enumerate(obs[:i + 1]): + cov[i, j] = _covariance_element(item, jtem, window_dict) + cov = cov + cov.T - np.diag(np.diag(cov)) + eigenvalues = np.linalg.eigh(cov)[0] + if not np.all(eigenvalues >= 0): + warnings.warn("Covariance matrix is not positive semi-definite", RuntimeWarning) + print("Eigenvalues of the covariance matrix:", eigenvalues) + return cov + + +def _covariance_element(obs1, obs2, window_dict, correlation=False, **kwargs): + """TODO + """ def expand_deltas(deltas, idx, shape, new_idx): """Expand deltas defined on idx to a contiguous range [new_idx[0], new_idx[-1]]. @@ -1398,21 +1428,16 @@ def covariance(obs1, obs2, correlation=False, **kwargs): if e_name not in obs2.mc_names: continue + window = window_dict[e_name] + idl_d = {} - r_length = [] for r_name in obs1.e_content[e_name]: if r_name not in obs2.e_content[e_name]: continue idl_d[r_name] = _merge_idx([obs1.idl[r_name], obs2.idl[r_name]]) - if isinstance(idl_d[r_name], range): - r_length.append(len(idl_d[r_name])) - else: - r_length.append((idl_d[r_name][-1] - idl_d[r_name][0] + 1)) + # TODO: Is a check needed if the length of an ensemble is zero? - if not r_length: - return 0. - - w_max = max(r_length) // 2 + w_max = window + 1 e_gamma[e_name] = np.zeros(w_max) for r_name in obs1.e_content[e_name]: @@ -1438,11 +1463,10 @@ def covariance(obs1, obs2, correlation=False, **kwargs): e_rho[e_name] = e_gamma[e_name][:w_max] / e_gamma[e_name][0] e_n_tauint[e_name] = np.cumsum(np.concatenate(([0.5], e_rho[e_name][1:]))) # Make sure no entry of tauint is smaller than 0.5 - e_n_tauint[e_name][e_n_tauint[e_name] < 0.5] = 0.500000000001 + e_n_tauint[e_name][e_n_tauint[e_name] < 0.5] = 0.5 + np.finfo(np.float64).eps - window = min(obs1.e_windowsize[e_name], obs2.e_windowsize[e_name]) # Bias correction hep-lat/0306017 eq. (49) - e_dvalue[e_name] = 2 * (e_n_tauint[e_name][window] + obs1.tau_exp[e_name] * np.abs(e_rho[e_name][window + 1])) * (1 + (2 * window + 1) / e_N) * e_gamma[e_name][0] / e_N + e_dvalue[e_name] = 2 * (e_n_tauint[e_name][window]) * (1 + (2 * window + 1) / e_N) * e_gamma[e_name][0] / e_N dvalue += e_dvalue[e_name] @@ -1453,8 +1477,9 @@ def covariance(obs1, obs2, correlation=False, **kwargs): dvalue += float(np.dot(np.transpose(obs1.covobs[e_name].grad), np.dot(obs1.covobs[e_name].cov, obs2.covobs[e_name].grad))) - if np.abs(dvalue / obs1.dvalue / obs2.dvalue) > 1.0: - dvalue = np.sign(dvalue) * obs1.dvalue * obs2.dvalue + # TODO: Check if this is needed. + # if np.abs(dvalue / obs1.dvalue / obs2.dvalue) > 1.0: + # dvalue = np.sign(dvalue) * obs1.dvalue * obs2.dvalue if correlation: dvalue = dvalue / obs1.dvalue / obs2.dvalue diff --git a/tests/covobs_test.py b/tests/covobs_test.py index 82cd4ae0..6bc1d49a 100644 --- a/tests/covobs_test.py +++ b/tests/covobs_test.py @@ -39,8 +39,8 @@ def test_covobs(): assert(np.isclose(oc.value, op.value, rtol=1e-14, atol=1e-14)) [o.gamma_method() for o in cl] - assert(pe.covariance(cl[0], cl[1]) == cov[0][1]) - assert(pe.covariance(cl[0], cl[1]) == cov[1][0]) + assert(pe.covariance([cl[0], cl[1]])[0, 1] == cov[0][1]) + assert(pe.covariance([cl[0], cl[1]])[0, 1] == cov[1][0]) do = cl[0] * cl[1] assert(np.array_equal(do.covobs['rAP'].grad, np.transpose([pi[1], pi[0]]).reshape(2, 1))) @@ -89,7 +89,7 @@ def test_covobs_covariance(): x = [a + b, a - b] [o.gamma_method() for o in x] - covariance = pe.fits.covariance_matrix(x) + covariance = pe.covariance(x) assert covariance[0, 0] == covariance[1, 1] assert covariance[0, 1] == a.dvalue ** 2 - b.dvalue ** 2 diff --git a/tests/fits_test.py b/tests/fits_test.py index 90a073e7..4367ac65 100644 --- a/tests/fits_test.py +++ b/tests/fits_test.py @@ -60,7 +60,7 @@ def test_least_squares(): beta[i].gamma_method(S=1.0) assert math.isclose(beta[i].value, popt[i], abs_tol=1e-5) assert math.isclose(pcov[i, i], beta[i].dvalue ** 2, abs_tol=1e-3) - assert math.isclose(pe.covariance(beta[0], beta[1]), pcov[0, 1], abs_tol=1e-3) + assert math.isclose(pe.covariance([beta[0], beta[1]])[0, 1], pcov[0, 1], abs_tol=1e-3) chi2_pyerrors = np.sum(((f(x, *[o.value for o in beta]) - y) / yerr) ** 2) / (len(x) - 2) chi2_scipy = np.sum(((f(x, *popt) - y) / yerr) ** 2) / (len(x) - 2) @@ -81,7 +81,7 @@ def test_least_squares(): betac[i].gamma_method(S=1.0) assert math.isclose(betac[i].value, popt[i], abs_tol=1e-5) assert math.isclose(pcov[i, i], betac[i].dvalue ** 2, abs_tol=1e-3) - assert math.isclose(pe.covariance(betac[0], betac[1]), pcov[0, 1], abs_tol=1e-3) + assert math.isclose(pe.covariance([betac[0], betac[1]])[0, 1], pcov[0, 1], abs_tol=1e-3) def test_alternative_solvers(): @@ -195,7 +195,7 @@ def test_total_least_squares(): beta[i].gamma_method(S=1.0) assert math.isclose(beta[i].value, output.beta[i], rel_tol=1e-5) assert math.isclose(output.cov_beta[i, i], beta[i].dvalue ** 2, rel_tol=2.5e-1), str(output.cov_beta[i, i]) + ' ' + str(beta[i].dvalue ** 2) - assert math.isclose(pe.covariance(beta[0], beta[1]), output.cov_beta[0, 1], rel_tol=2.5e-1) + assert math.isclose(pe.covariance([beta[0], beta[1]])[0, 1], output.cov_beta[0, 1], rel_tol=2.5e-1) out = pe.total_least_squares(ox, oy, func, const_par=[beta[1]]) @@ -218,7 +218,7 @@ def test_total_least_squares(): betac[i].gamma_method(S=1.0) assert math.isclose(betac[i].value, output.beta[i], rel_tol=1e-3) assert math.isclose(output.cov_beta[i, i], betac[i].dvalue ** 2, rel_tol=2.5e-1), str(output.cov_beta[i, i]) + ' ' + str(betac[i].dvalue ** 2) - assert math.isclose(pe.covariance(betac[0], betac[1]), output.cov_beta[0, 1], rel_tol=2.5e-1) + assert math.isclose(pe.covariance([betac[0], betac[1]])[0, 1], output.cov_beta[0, 1], rel_tol=2.5e-1) outc = pe.total_least_squares(oxc, oyc, func, const_par=[betac[1]]) @@ -233,7 +233,7 @@ def test_total_least_squares(): betac[i].gamma_method(S=1.0) assert math.isclose(betac[i].value, output.beta[i], rel_tol=1e-3) assert math.isclose(output.cov_beta[i, i], betac[i].dvalue ** 2, rel_tol=2.5e-1), str(output.cov_beta[i, i]) + ' ' + str(betac[i].dvalue ** 2) - assert math.isclose(pe.covariance(betac[0], betac[1]), output.cov_beta[0, 1], rel_tol=2.5e-1) + assert math.isclose(pe.covariance([betac[0], betac[1]])[0, 1], output.cov_beta[0, 1], rel_tol=2.5e-1) outc = pe.total_least_squares(oxc, oy, func, const_par=[betac[1]]) diff --git a/tests/obs_test.py b/tests/obs_test.py index 2fed00af..abbb091c 100644 --- a/tests/obs_test.py +++ b/tests/obs_test.py @@ -251,10 +251,10 @@ def test_covariance_is_variance(): dvalue = np.abs(np.random.normal(0, 1)) test_obs = pe.pseudo_Obs(value, dvalue, 't') test_obs.gamma_method() - assert np.abs(test_obs.dvalue ** 2 - pe.covariance(test_obs, test_obs)) <= 10 * np.finfo(np.float64).eps + assert np.abs(test_obs.dvalue ** 2 - pe.covariance([test_obs, test_obs])[0, 1]) <= 10 * np.finfo(np.float64).eps test_obs = test_obs + pe.pseudo_Obs(value, dvalue, 'q', 200) test_obs.gamma_method() - assert np.abs(test_obs.dvalue ** 2 - pe.covariance(test_obs, test_obs)) <= 10 * np.finfo(np.float64).eps + assert np.abs(test_obs.dvalue ** 2 - pe.covariance([test_obs, test_obs])[0, 1]) <= 10 * np.finfo(np.float64).eps def test_fft(): @@ -268,21 +268,6 @@ def test_fft(): assert np.abs(test_obs1.dvalue - test_obs2.dvalue) <= 10 * max(test_obs1.dvalue, test_obs2.dvalue) * np.finfo(np.float64).eps -def test_covariance_symmetry(): - value1 = np.random.normal(5, 10) - dvalue1 = np.abs(np.random.normal(0, 1)) - test_obs1 = pe.pseudo_Obs(value1, dvalue1, 't') - test_obs1.gamma_method() - value2 = np.random.normal(5, 10) - dvalue2 = np.abs(np.random.normal(0, 1)) - test_obs2 = pe.pseudo_Obs(value2, dvalue2, 't') - test_obs2.gamma_method() - cov_ab = pe.covariance(test_obs1, test_obs2) - cov_ba = pe.covariance(test_obs2, test_obs1) - assert np.abs(cov_ab - cov_ba) <= 10 * np.finfo(np.float64).eps - assert np.abs(cov_ab) < test_obs1.dvalue * test_obs2.dvalue * (1 + 10 * np.finfo(np.float64).eps) - - def test_gamma_method_uncorrelated(): # Construct pseudo Obs with random shape value = np.random.normal(5, 10) @@ -629,8 +614,8 @@ def test_covariance_symmetry(): dvalue2 = np.abs(np.random.normal(0, 1)) test_obs2 = pe.pseudo_Obs(value2, dvalue2, 't') test_obs2.gamma_method() - cov_ab = pe.covariance(test_obs1, test_obs2) - cov_ba = pe.covariance(test_obs2, test_obs1) + cov_ab = pe.covariance([test_obs1, test_obs2])[0, 1] + cov_ba = pe.covariance([test_obs2, test_obs1])[0, 1] assert np.abs(cov_ab - cov_ba) <= 10 * np.finfo(np.float64).eps assert np.abs(cov_ab) < test_obs1.dvalue * test_obs2.dvalue * (1 + 10 * np.finfo(np.float64).eps) @@ -643,10 +628,10 @@ def test_covariance_symmetry(): idx = [i + 1 for i in range(len(configs)) if configs[i] == 1] a = pe.Obs([zero_arr], ['t'], idl=[idx]) a.gamma_method() - assert np.isclose(a.dvalue**2, pe.covariance(a, a), atol=100, rtol=1e-4) + assert np.isclose(a.dvalue ** 2, pe.covariance([a, a])[0, 1], atol=100, rtol=1e-4) - cov_ab = pe.covariance(test_obs1, a) - cov_ba = pe.covariance(a, test_obs1) + cov_ab = pe.covariance([test_obs1, a])[0, 1] + cov_ba = pe.covariance([a, test_obs1])[0, 1] assert np.abs(cov_ab - cov_ba) <= 10 * np.finfo(np.float64).eps assert np.abs(cov_ab) < test_obs1.dvalue * a.dvalue * (1 + 10 * np.finfo(np.float64).eps) @@ -704,4 +689,4 @@ def test_merge_idx(): new_idx = pe.obs._merge_idx(idl) assert(new_idx[-1] > new_idx[0]) for i in range(1, len(new_idx)): - assert(new_idx[i - 1] < new_idx[i]) \ No newline at end of file + assert(new_idx[i - 1] < new_idx[i]) From 74b0f77c2d77f2f9a11a0982bd8fbd4acf0820b6 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 1 Mar 2022 14:32:13 +0000 Subject: [PATCH 104/136] feat: covariance is now estimated from the uncorrelated correlation matrix rescaled by the full (correlated) errors. --- pyerrors/obs.py | 52 +++++++++++++++++-------------------------------- 1 file changed, 18 insertions(+), 34 deletions(-) diff --git a/pyerrors/obs.py b/pyerrors/obs.py index ecb848f0..8437a795 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -1332,50 +1332,40 @@ def correlate(obs_a, obs_b): return o -def covariance(obs, window=min, correlation=False, **kwargs): +def covariance(obs, correlation=False, **kwargs): """Calculates the covariance matrix of a set of observables. covariance([obs, obs])[0,1] is equal to obs.dvalue ** 2 - The gamma method has to be applied first to both observables. + The gamma method has to be applied first to all observables. Parameters ---------- obs : list or numpy.ndarray List or one dimensional array of Obs - window: function or dict - Function which selects the window for each ensemble, examples 'min', 'max', 'np.mean', 'np.median' - Alternatively a dictionary with an entry for every ensemble can be manually specified. correlation : bool if true the correlation instead of the covariance is returned (default False) """ - if isinstance(window, dict): - window_dict = window - else: - window_dict = {} - names = sorted(set([item for sublist in [o.mc_names for o in obs] for item in sublist])) - for name in names: - window_list = [] - for ob in obs: - if ob.e_windowsize.get(name) is not None: - window_list.append(ob.e_windowsize[name]) - window_dict[name] = int(window(window_list)) length = len(obs) cov = np.zeros((length, length)) - for i, item in enumerate(obs): - for j, jtem in enumerate(obs[:i + 1]): - cov[i, j] = _covariance_element(item, jtem, window_dict) + for i in range(length): + for j in range(i, length): + cov[i, j] = _covariance_element(obs[i], obs[j]) cov = cov + cov.T - np.diag(np.diag(cov)) + + corr = np.diag(1 / np.sqrt(np.diag(cov))) @ cov @ np.diag(1 / np.sqrt(np.diag(cov))) + + errors = [o.dvalue for o in obs] + cov = np.sqrt(np.diag(errors)) @ corr @ np.sqrt(np.diag(errors)) + eigenvalues = np.linalg.eigh(cov)[0] if not np.all(eigenvalues >= 0): - warnings.warn("Covariance matrix is not positive semi-definite", RuntimeWarning) - print("Eigenvalues of the covariance matrix:", eigenvalues) + warnings.warn("Covariance matrix is not positive semi-definite (Eigenvalues: " + str(eigenvalues) + ")", RuntimeWarning) return cov -def _covariance_element(obs1, obs2, window_dict, correlation=False, **kwargs): - """TODO - """ +def _covariance_element(obs1, obs2): + """Estimates the covariance of two Obs objects based on fixed window sizes passed to the function.""" def expand_deltas(deltas, idx, shape, new_idx): """Expand deltas defined on idx to a contiguous range [new_idx[0], new_idx[-1]]. @@ -1407,7 +1397,9 @@ def _covariance_element(obs1, obs2, window_dict, correlation=False, **kwargs): max_gamma = min(new_shape, w_max) # The padding for the fft has to be even padding = new_shape + max_gamma + (new_shape + max_gamma) % 2 - gamma[:max_gamma] += (np.fft.irfft(np.fft.rfft(deltas1, padding) * np.conjugate(np.fft.rfft(deltas2, padding)))[:max_gamma] + np.fft.irfft(np.fft.rfft(deltas2, padding) * np.conjugate(np.fft.rfft(deltas1, padding)))[:max_gamma]) / 2.0 + rfft1 = np.fft.rfft(deltas1, padding) + rfft2 = np.fft.rfft(deltas2, padding) + gamma[:max_gamma] += (np.fft.irfft(rfft1 * np.conjugate(rfft2))[:max_gamma] + np.fft.irfft(rfft2 * np.conjugate(rfft1))[:max_gamma]) / 2.0 return gamma @@ -1428,14 +1420,13 @@ def _covariance_element(obs1, obs2, window_dict, correlation=False, **kwargs): if e_name not in obs2.mc_names: continue - window = window_dict[e_name] + window = 0 idl_d = {} for r_name in obs1.e_content[e_name]: if r_name not in obs2.e_content[e_name]: continue idl_d[r_name] = _merge_idx([obs1.idl[r_name], obs2.idl[r_name]]) - # TODO: Is a check needed if the length of an ensemble is zero? w_max = window + 1 e_gamma[e_name] = np.zeros(w_max) @@ -1477,13 +1468,6 @@ def _covariance_element(obs1, obs2, window_dict, correlation=False, **kwargs): dvalue += float(np.dot(np.transpose(obs1.covobs[e_name].grad), np.dot(obs1.covobs[e_name].cov, obs2.covobs[e_name].grad))) - # TODO: Check if this is needed. - # if np.abs(dvalue / obs1.dvalue / obs2.dvalue) > 1.0: - # dvalue = np.sign(dvalue) * obs1.dvalue * obs2.dvalue - - if correlation: - dvalue = dvalue / obs1.dvalue / obs2.dvalue - return dvalue From c28d6131b1a892ace1c9586f846fa0ddbdace9b4 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 1 Mar 2022 14:35:38 +0000 Subject: [PATCH 105/136] refactor: redundant lines in _covariance_element removed. --- pyerrors/obs.py | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/pyerrors/obs.py b/pyerrors/obs.py index 8437a795..19b08860 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -1365,7 +1365,7 @@ def covariance(obs, correlation=False, **kwargs): def _covariance_element(obs1, obs2): - """Estimates the covariance of two Obs objects based on fixed window sizes passed to the function.""" + """Estimates the uncorrelated covariance of two Obs objects.""" def expand_deltas(deltas, idx, shape, new_idx): """Expand deltas defined on idx to a contiguous range [new_idx[0], new_idx[-1]]. @@ -1410,25 +1410,20 @@ def _covariance_element(obs1, obs2): raise Exception('The gamma method has to be applied to both Obs first.') dvalue = 0 + w_max = 1 e_gamma = {} - e_dvalue = {} - e_n_tauint = {} - e_rho = {} for e_name in obs1.mc_names: if e_name not in obs2.mc_names: continue - window = 0 - idl_d = {} for r_name in obs1.e_content[e_name]: if r_name not in obs2.e_content[e_name]: continue idl_d[r_name] = _merge_idx([obs1.idl[r_name], obs2.idl[r_name]]) - w_max = window + 1 e_gamma[e_name] = np.zeros(w_max) for r_name in obs1.e_content[e_name]: @@ -1451,15 +1446,8 @@ def _covariance_element(obs1, obs2): e_N += np.sum(np.ones_like(idl_d[r_name])) e_gamma[e_name] /= gamma_div[:w_max] - e_rho[e_name] = e_gamma[e_name][:w_max] / e_gamma[e_name][0] - e_n_tauint[e_name] = np.cumsum(np.concatenate(([0.5], e_rho[e_name][1:]))) - # Make sure no entry of tauint is smaller than 0.5 - e_n_tauint[e_name][e_n_tauint[e_name] < 0.5] = 0.5 + np.finfo(np.float64).eps - # Bias correction hep-lat/0306017 eq. (49) - e_dvalue[e_name] = 2 * (e_n_tauint[e_name][window]) * (1 + (2 * window + 1) / e_N) * e_gamma[e_name][0] / e_N - - dvalue += e_dvalue[e_name] + dvalue += (1 + 1 / e_N) * e_gamma[e_name][0] / e_N for e_name in obs1.cov_names: From 3796c0395f83a146bed3c71b34afbc6f7f259de3 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 1 Mar 2022 15:34:53 +0000 Subject: [PATCH 106/136] feat: computation of _covariance_element optimized, visualize option added to covariance, tests adjusted. --- pyerrors/obs.py | 51 +++++++++++++++++++------------------------- tests/covobs_test.py | 8 +++---- 2 files changed, 26 insertions(+), 33 deletions(-) diff --git a/pyerrors/obs.py b/pyerrors/obs.py index 19b08860..3cb22f36 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -1332,7 +1332,7 @@ def correlate(obs_a, obs_b): return o -def covariance(obs, correlation=False, **kwargs): +def covariance(obs, visualize=False, **kwargs): """Calculates the covariance matrix of a set of observables. covariance([obs, obs])[0,1] is equal to obs.dvalue ** 2 @@ -1342,8 +1342,8 @@ def covariance(obs, correlation=False, **kwargs): ---------- obs : list or numpy.ndarray List or one dimensional array of Obs - correlation : bool - if true the correlation instead of the covariance is returned (default False) + visualize : bool + Plots the corresponding normalized correlation matrix. """ length = len(obs) @@ -1356,11 +1356,18 @@ def covariance(obs, correlation=False, **kwargs): corr = np.diag(1 / np.sqrt(np.diag(cov))) @ cov @ np.diag(1 / np.sqrt(np.diag(cov))) errors = [o.dvalue for o in obs] - cov = np.sqrt(np.diag(errors)) @ corr @ np.sqrt(np.diag(errors)) + cov = np.diag(errors) @ corr @ np.diag(errors) eigenvalues = np.linalg.eigh(cov)[0] if not np.all(eigenvalues >= 0): warnings.warn("Covariance matrix is not positive semi-definite (Eigenvalues: " + str(eigenvalues) + ")", RuntimeWarning) + + if visualize: + plt.matshow(corr, vmin=-1, vmax=1) + plt.set_cmap('RdBu') + plt.colorbar() + plt.draw() + return cov @@ -1389,29 +1396,18 @@ def _covariance_element(obs1, obs2): ret[idx[i] - new_idx[0]] = deltas[i] return ret - def calc_gamma(deltas1, deltas2, idx1, idx2, new_idx, w_max): - gamma = np.zeros(w_max) + def calc_gamma(deltas1, deltas2, idx1, idx2, new_idx): deltas1 = expand_deltas(deltas1, idx1, len(idx1), new_idx) deltas2 = expand_deltas(deltas2, idx2, len(idx2), new_idx) - new_shape = len(deltas1) - max_gamma = min(new_shape, w_max) - # The padding for the fft has to be even - padding = new_shape + max_gamma + (new_shape + max_gamma) % 2 - rfft1 = np.fft.rfft(deltas1, padding) - rfft2 = np.fft.rfft(deltas2, padding) - gamma[:max_gamma] += (np.fft.irfft(rfft1 * np.conjugate(rfft2))[:max_gamma] + np.fft.irfft(rfft2 * np.conjugate(rfft1))[:max_gamma]) / 2.0 - - return gamma + return np.sum(deltas1 * deltas2) if set(obs1.names).isdisjoint(set(obs2.names)): - return 0. + return 0.0 if not hasattr(obs1, 'e_dvalue') or not hasattr(obs2, 'e_dvalue'): raise Exception('The gamma method has to be applied to both Obs first.') - dvalue = 0 - w_max = 1 - e_gamma = {} + dvalue = 0.0 for e_name in obs1.mc_names: @@ -1424,30 +1420,27 @@ def _covariance_element(obs1, obs2): continue idl_d[r_name] = _merge_idx([obs1.idl[r_name], obs2.idl[r_name]]) - e_gamma[e_name] = np.zeros(w_max) + gamma = 0.0 for r_name in obs1.e_content[e_name]: if r_name not in obs2.e_content[e_name]: continue - e_gamma[e_name] += calc_gamma(obs1.deltas[r_name], obs2.deltas[r_name], obs1.idl[r_name], obs2.idl[r_name], idl_d[r_name], w_max) + gamma += calc_gamma(obs1.deltas[r_name], obs2.deltas[r_name], obs1.idl[r_name], obs2.idl[r_name], idl_d[r_name]) - if np.all(e_gamma[e_name] == 0.0): + if gamma == 0.0: continue - e_shapes = [] - for r_name in obs1.e_content[e_name]: - e_shapes.append(obs1.shape[r_name]) - gamma_div = np.zeros(w_max) + gamma_div = 0.0 e_N = 0 for r_name in obs1.e_content[e_name]: if r_name not in obs2.e_content[e_name]: continue - gamma_div += calc_gamma(np.ones(obs1.shape[r_name]), np.ones(obs2.shape[r_name]), obs1.idl[r_name], obs2.idl[r_name], idl_d[r_name], w_max) + gamma_div += calc_gamma(np.ones(obs1.shape[r_name]), np.ones(obs2.shape[r_name]), obs1.idl[r_name], obs2.idl[r_name], idl_d[r_name]) e_N += np.sum(np.ones_like(idl_d[r_name])) - e_gamma[e_name] /= gamma_div[:w_max] + gamma /= gamma_div # Bias correction hep-lat/0306017 eq. (49) - dvalue += (1 + 1 / e_N) * e_gamma[e_name][0] / e_N + dvalue += (1 + 1 / e_N) * gamma / e_N for e_name in obs1.cov_names: diff --git a/tests/covobs_test.py b/tests/covobs_test.py index 6bc1d49a..f0a53e89 100644 --- a/tests/covobs_test.py +++ b/tests/covobs_test.py @@ -39,8 +39,8 @@ def test_covobs(): assert(np.isclose(oc.value, op.value, rtol=1e-14, atol=1e-14)) [o.gamma_method() for o in cl] - assert(pe.covariance([cl[0], cl[1]])[0, 1] == cov[0][1]) - assert(pe.covariance([cl[0], cl[1]])[0, 1] == cov[1][0]) + assert(np.isclose(pe.covariance([cl[0], cl[1]])[0, 1], cov[0][1])) + assert(np.isclose(pe.covariance([cl[0], cl[1]])[0, 1], cov[1][0])) do = cl[0] * cl[1] assert(np.array_equal(do.covobs['rAP'].grad, np.transpose([pi[1], pi[0]]).reshape(2, 1))) @@ -91,8 +91,8 @@ def test_covobs_covariance(): covariance = pe.covariance(x) - assert covariance[0, 0] == covariance[1, 1] - assert covariance[0, 1] == a.dvalue ** 2 - b.dvalue ** 2 + assert np.isclose(covariance[0, 0], covariance[1, 1]) + assert np.isclose(covariance[0, 1], a.dvalue ** 2 - b.dvalue ** 2) def test_covobs_exceptions(): From 8d93ff95f202bf8a67374e222336dd7f3b32a0f7 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 1 Mar 2022 17:27:04 +0000 Subject: [PATCH 107/136] tests: further tests for covariance added. --- tests/obs_test.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/tests/obs_test.py b/tests/obs_test.py index abbb091c..c86da060 100644 --- a/tests/obs_test.py +++ b/tests/obs_test.py @@ -636,6 +636,43 @@ def test_covariance_symmetry(): assert np.abs(cov_ab) < test_obs1.dvalue * a.dvalue * (1 + 10 * np.finfo(np.float64).eps) +def test_covariance_sum(): + length = 2 + t_fac = 0.4 + tt = pe.misc.gen_correlated_data(np.zeros(length), 0.99 * np.ones((length, length)) + 0.01 * np.diag(np.ones(length)), 'test', tau=0.5 + t_fac * np.random.rand(length), samples=1000) + [o.gamma_method(S=0) for o in tt] + + t_cov = pe.covariance(tt) + + my_sum = tt[0] + tt[1] + my_sum.gamma_method(S=0) + e_cov = (my_sum.dvalue ** 2 - tt[0].dvalue ** 2 - tt[1].dvalue ** 2) / 2 + + assert np.isclose(e_cov, t_cov[0, 1]) + + +def test_covariance_positive_semidefinite(): + length = 64 + t_fac = 1.5 + tt = pe.misc.gen_correlated_data(np.zeros(length), 0.99999 * np.ones((length, length)) + 0.00001 * np.diag(np.ones(length)), 'test', tau=0.5 + t_fac * np.random.rand(length), samples=1000) + [o.gamma_method() for o in tt] + cov = pe.covariance(tt) + assert np.all(np.linalg.eigh(cov)[0] >= -1e-15) + + +def test_covariance_factorizing(): + length = 2 + t_fac = 1.5 + + tt = pe.misc.gen_correlated_data(np.zeros(length), 0.75 * np.ones((length, length)) + 0.8 * np.diag(np.ones(length)), 'test', tau=0.5 + t_fac * np.random.rand(length), samples=1000) + [o.gamma_method() for o in tt] + + mt0 = -tt[0] + mt0.gamma_method() + + assert np.isclose(pe.covariance([mt0, tt[1]])[0, 1], -pe.covariance(tt)[0, 1]) + + def test_empty_obs(): o = pe.Obs([np.random.rand(100)], ['test']) q = o + pe.Obs([], []) From da0c43fe9ae1d43dc361329ceffdceab9db9d3e4 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 1 Mar 2022 17:46:12 +0000 Subject: [PATCH 108/136] feat: correlation parameter added to covariance again, tests extended. --- pyerrors/obs.py | 11 ++++++++--- tests/obs_test.py | 30 ++++++++++++++++++------------ 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/pyerrors/obs.py b/pyerrors/obs.py index 3cb22f36..461e76a8 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -1332,7 +1332,7 @@ def correlate(obs_a, obs_b): return o -def covariance(obs, visualize=False, **kwargs): +def covariance(obs, visualize=False, correlation=False, **kwargs): """Calculates the covariance matrix of a set of observables. covariance([obs, obs])[0,1] is equal to obs.dvalue ** 2 @@ -1343,7 +1343,9 @@ def covariance(obs, visualize=False, **kwargs): obs : list or numpy.ndarray List or one dimensional array of Obs visualize : bool - Plots the corresponding normalized correlation matrix. + If True plots the corresponding normalized correlation matrix (default False). + correlation : bool + If True the correlation instead of the covariance is returned (default False). """ length = len(obs) @@ -1368,7 +1370,10 @@ def covariance(obs, visualize=False, **kwargs): plt.colorbar() plt.draw() - return cov + if correlation is True: + return corr + else: + return cov def _covariance_element(obs1, obs2): diff --git a/tests/obs_test.py b/tests/obs_test.py index c86da060..2a80cac1 100644 --- a/tests/obs_test.py +++ b/tests/obs_test.py @@ -246,17 +246,6 @@ def test_gamma_method_kwargs(): assert my_obs.N_sigma['ens'] == pe.Obs.N_sigma_global -def test_covariance_is_variance(): - value = np.random.normal(5, 10) - dvalue = np.abs(np.random.normal(0, 1)) - test_obs = pe.pseudo_Obs(value, dvalue, 't') - test_obs.gamma_method() - assert np.abs(test_obs.dvalue ** 2 - pe.covariance([test_obs, test_obs])[0, 1]) <= 10 * np.finfo(np.float64).eps - test_obs = test_obs + pe.pseudo_Obs(value, dvalue, 'q', 200) - test_obs.gamma_method() - assert np.abs(test_obs.dvalue ** 2 - pe.covariance([test_obs, test_obs])[0, 1]) <= 10 * np.finfo(np.float64).eps - - def test_fft(): value = np.random.normal(5, 100) dvalue = np.abs(np.random.normal(0, 5)) @@ -605,6 +594,18 @@ def test_gamma_method_irregular(): ol = [a, b] o = (ol[0] - ol[1]) / (ol[1]) + +def test_covariance_is_variance(): + value = np.random.normal(5, 10) + dvalue = np.abs(np.random.normal(0, 1)) + test_obs = pe.pseudo_Obs(value, dvalue, 't') + test_obs.gamma_method() + assert np.isclose(test_obs.dvalue ** 2, pe.covariance([test_obs, test_obs])[0, 1]) + test_obs = test_obs + pe.pseudo_Obs(value, dvalue, 'q', 200) + test_obs.gamma_method() + assert np.isclose(test_obs.dvalue ** 2, pe.covariance([test_obs, test_obs])[0, 1]) + + def test_covariance_symmetry(): value1 = np.random.normal(5, 10) dvalue1 = np.abs(np.random.normal(0, 1)) @@ -616,7 +617,7 @@ def test_covariance_symmetry(): test_obs2.gamma_method() cov_ab = pe.covariance([test_obs1, test_obs2])[0, 1] cov_ba = pe.covariance([test_obs2, test_obs1])[0, 1] - assert np.abs(cov_ab - cov_ba) <= 10 * np.finfo(np.float64).eps + assert np.isclose(cov_ab, cov_ba) assert np.abs(cov_ab) < test_obs1.dvalue * test_obs2.dvalue * (1 + 10 * np.finfo(np.float64).eps) N = 100 @@ -673,6 +674,11 @@ def test_covariance_factorizing(): assert np.isclose(pe.covariance([mt0, tt[1]])[0, 1], -pe.covariance(tt)[0, 1]) +def test_covariance_correlation(): + test_obs = pe.pseudo_Obs(-4, 0.8, 'test', samples=784) + assert np.allclose(pe.covariance([test_obs, test_obs, test_obs], correlation=True), np.ones((3, 3))) + + def test_empty_obs(): o = pe.Obs([np.random.rand(100)], ['test']) q = o + pe.Obs([], []) From 1f0f0604721d7caa38b65fa68ee92640eb0a45b0 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 1 Mar 2022 19:07:08 +0000 Subject: [PATCH 109/136] docs: docstring for covariance extended. --- pyerrors/obs.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pyerrors/obs.py b/pyerrors/obs.py index 461e76a8..4b6a431a 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -1335,7 +1335,6 @@ def correlate(obs_a, obs_b): def covariance(obs, visualize=False, correlation=False, **kwargs): """Calculates the covariance matrix of a set of observables. - covariance([obs, obs])[0,1] is equal to obs.dvalue ** 2 The gamma method has to be applied first to all observables. Parameters @@ -1346,6 +1345,14 @@ def covariance(obs, visualize=False, correlation=False, **kwargs): If True plots the corresponding normalized correlation matrix (default False). correlation : bool If True the correlation instead of the covariance is returned (default False). + + Notes + ----- + The covariance is estimated by calculating the correlation matrix assuming no autocorrelation and then rescaling the correlation matrix by the full errors including the previous gamma method estimate for the autocorrelation of the observables. This is equivalent to assuming that the integrated autocorrelation time of an off-diagonal element is equal to the geometric mean of the integrated autocorrelation times of the corresponding diagonal elements. + $$ + \tau_{\mathrm{int}, ij}=\sqrt{\tau_{\mathrm{int}, i}\times \tau_{\mathrm{int}, j}} + $$ + This construction ensures that the estimated covariance matrix is positive semi-definite (up to numerical rounding errors). """ length = len(obs) From 42d9d3630e670ff4bd3e5a0688c8de18fe5e78ad Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 1 Mar 2022 19:16:54 +0000 Subject: [PATCH 110/136] ci: W605 added to flake8 exceptions. --- .github/workflows/flake8.yml | 2 +- CONTRIBUTING.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/flake8.yml b/.github/workflows/flake8.yml index efb81565..3b067cd2 100644 --- a/.github/workflows/flake8.yml +++ b/.github/workflows/flake8.yml @@ -21,6 +21,6 @@ jobs: - name: flake8 Lint uses: py-actions/flake8@v1 with: - ignore: "E501" + ignore: "E501,W605" exclude: "__init__.py, input/__init__.py" path: "pyerrors" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cd627bd2..8ef8055e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -24,12 +24,12 @@ For all pull requests tests are executed for the most recent python releases via ``` pytest --cov=pyerrors -vv ``` -requiring `pytest`, `pytest-cov` and `pytest-benchmark`. To get a coverage report in html run +requiring `pytest`, `pytest-cov` and `pytest-benchmark`. To get a coverage report in html run ``` pytest --cov=pyerrors --cov-report html ``` The linter `flake8` is executed with the command ``` -flake8 --ignore=E501 --exclude=__init__.py pyerrors +flake8 --ignore=E501,W605 --exclude=__init__.py pyerrors ``` Please make sure that all tests are passed for a new pull requests. From 11007dffc9d7f0e2081fde9a6a1f6c1e045629c9 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Wed, 2 Mar 2022 11:11:48 +0000 Subject: [PATCH 111/136] docs: docstrings of covariance and _covariance_element clarified --- pyerrors/obs.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyerrors/obs.py b/pyerrors/obs.py index 4b6a431a..69af5cea 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -1348,7 +1348,7 @@ def covariance(obs, visualize=False, correlation=False, **kwargs): Notes ----- - The covariance is estimated by calculating the correlation matrix assuming no autocorrelation and then rescaling the correlation matrix by the full errors including the previous gamma method estimate for the autocorrelation of the observables. This is equivalent to assuming that the integrated autocorrelation time of an off-diagonal element is equal to the geometric mean of the integrated autocorrelation times of the corresponding diagonal elements. + The covariance is estimated by calculating the correlation matrix assuming no autocorrelation and then rescaling the correlation matrix by the full errors including the previous gamma method estimate for the autocorrelation of the observables. For observables defined on a single ensemble this is equivalent to assuming that the integrated autocorrelation time of an off-diagonal element is equal to the geometric mean of the integrated autocorrelation times of the corresponding diagonal elements. $$ \tau_{\mathrm{int}, ij}=\sqrt{\tau_{\mathrm{int}, i}\times \tau_{\mathrm{int}, j}} $$ @@ -1384,7 +1384,7 @@ def covariance(obs, visualize=False, correlation=False, **kwargs): def _covariance_element(obs1, obs2): - """Estimates the uncorrelated covariance of two Obs objects.""" + """Estimates the covariance of two Obs objects, neglecting autocorrelations.""" def expand_deltas(deltas, idx, shape, new_idx): """Expand deltas defined on idx to a contiguous range [new_idx[0], new_idx[-1]]. From ece3c5d2ba62f3ed84e20f581db95cc3823a18e2 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Wed, 2 Mar 2022 11:49:29 +0000 Subject: [PATCH 112/136] tests: additional test added. --- tests/obs_test.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/obs_test.py b/tests/obs_test.py index 2a80cac1..3d773951 100644 --- a/tests/obs_test.py +++ b/tests/obs_test.py @@ -674,6 +674,23 @@ def test_covariance_factorizing(): assert np.isclose(pe.covariance([mt0, tt[1]])[0, 1], -pe.covariance(tt)[0, 1]) +def test_covariance_alternation(): + length = 12 + t_fac = 2.5 + + tt1 = pe.misc.gen_correlated_data(np.zeros(length), -0.00001 * np.ones((length, length)) + 0.002 * np.diag(np.ones(length)), 'test', tau=0.5 + t_fac * np.random.rand(length), samples=88) + tt2 = pe.misc.gen_correlated_data(np.zeros(length), 0.9999 * np.ones((length, length)) + 0.0001 * np.diag(np.ones(length)), 'another_test|r0', tau=0.7 + t_fac * np.random.rand(length), samples=73) + tt3 = pe.misc.gen_correlated_data(np.zeros(length), 0.9999 * np.ones((length, length)) + 0.0001 * np.diag(np.ones(length)), 'another_test|r1', tau=0.7 + t_fac * np.random.rand(length), samples=91) + + tt = np.array(tt1) + (np.array(tt2) + np.array(tt3)) + tt *= np.resize([1, -1], length) + + [o.gamma_method() for o in tt] + cov = pe.covariance(tt, True) + + assert np.all(np.linalg.eigh(cov)[0] > -1e-15) + + def test_covariance_correlation(): test_obs = pe.pseudo_Obs(-4, 0.8, 'test', samples=784) assert np.allclose(pe.covariance([test_obs, test_obs, test_obs], correlation=True), np.ones((3, 3))) From 7f5989dfb9da73641900d4193772b25f161938e2 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Wed, 2 Mar 2022 12:29:26 +0000 Subject: [PATCH 113/136] docs: latex in docstring of covariance fixed --- .github/workflows/flake8.yml | 2 +- CONTRIBUTING.md | 2 +- pyerrors/obs.py | 8 +++----- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/.github/workflows/flake8.yml b/.github/workflows/flake8.yml index 3b067cd2..efb81565 100644 --- a/.github/workflows/flake8.yml +++ b/.github/workflows/flake8.yml @@ -21,6 +21,6 @@ jobs: - name: flake8 Lint uses: py-actions/flake8@v1 with: - ignore: "E501,W605" + ignore: "E501" exclude: "__init__.py, input/__init__.py" path: "pyerrors" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8ef8055e..6d95d672 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -30,6 +30,6 @@ pytest --cov=pyerrors --cov-report html ``` The linter `flake8` is executed with the command ``` -flake8 --ignore=E501,W605 --exclude=__init__.py pyerrors +flake8 --ignore=E501 --exclude=__init__.py pyerrors ``` Please make sure that all tests are passed for a new pull requests. diff --git a/pyerrors/obs.py b/pyerrors/obs.py index 69af5cea..5cc33b69 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -1333,7 +1333,7 @@ def correlate(obs_a, obs_b): def covariance(obs, visualize=False, correlation=False, **kwargs): - """Calculates the covariance matrix of a set of observables. + r'''Calculates the covariance matrix of a set of observables. The gamma method has to be applied first to all observables. @@ -1349,11 +1349,9 @@ def covariance(obs, visualize=False, correlation=False, **kwargs): Notes ----- The covariance is estimated by calculating the correlation matrix assuming no autocorrelation and then rescaling the correlation matrix by the full errors including the previous gamma method estimate for the autocorrelation of the observables. For observables defined on a single ensemble this is equivalent to assuming that the integrated autocorrelation time of an off-diagonal element is equal to the geometric mean of the integrated autocorrelation times of the corresponding diagonal elements. - $$ - \tau_{\mathrm{int}, ij}=\sqrt{\tau_{\mathrm{int}, i}\times \tau_{\mathrm{int}, j}} - $$ + $$\tau_{\mathrm{int}, ij}=\sqrt{\tau_{\mathrm{int}, i}\times \tau_{\mathrm{int}, j}}$$ This construction ensures that the estimated covariance matrix is positive semi-definite (up to numerical rounding errors). - """ + ''' length = len(obs) cov = np.zeros((length, length)) From b14314b424e85d5bdf7746c1794682610a35c876 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Wed, 2 Mar 2022 15:10:07 +0000 Subject: [PATCH 114/136] fix: Error handling for fits and root finding with numpy instead of autograd.numpy improved. Tests added. --- pyerrors/fits.py | 10 ++++++++-- pyerrors/roots.py | 5 ++++- tests/fits_test.py | 36 +++++++++++++++++++++++++++++------- tests/roots_test.py | 12 ++++++++++++ 4 files changed, 53 insertions(+), 10 deletions(-) diff --git a/pyerrors/fits.py b/pyerrors/fits.py index e290dbfb..4e9c80d3 100644 --- a/pyerrors/fits.py +++ b/pyerrors/fits.py @@ -260,7 +260,10 @@ def total_least_squares(x, y, func, silent=False, **kwargs): output.chisquare_by_expected_chisquare) fitp = out.beta - hess_inv = np.linalg.pinv(jacobian(jacobian(odr_chisquare))(np.concatenate((fitp, out.xplus.ravel())))) + try: + hess_inv = np.linalg.pinv(jacobian(jacobian(odr_chisquare))(np.concatenate((fitp, out.xplus.ravel())))) + except TypeError: + raise Exception("It is required to use autograd.numpy instead of numpy within fit functions, see the documentation for details.") from None def odr_chisquare_compact_x(d): model = func(d[:n_parms], d[n_parms:n_parms + m].reshape(x_shape)) @@ -537,7 +540,10 @@ def _standard_fit(x, y, func, silent=False, **kwargs): output.chisquare_by_expected_chisquare) fitp = fit_result.x - hess_inv = np.linalg.pinv(jacobian(jacobian(chisqfunc))(fitp)) + try: + hess_inv = np.linalg.pinv(jacobian(jacobian(chisqfunc))(fitp)) + except TypeError: + raise Exception("It is required to use autograd.numpy instead of numpy within fit functions, see the documentation for details.") from None if kwargs.get('correlated_fit') is True: def chisqfunc_compact(d): diff --git a/pyerrors/roots.py b/pyerrors/roots.py index e26b44e7..5f6134b5 100644 --- a/pyerrors/roots.py +++ b/pyerrors/roots.py @@ -31,7 +31,10 @@ def find_root(d, func, guess=1.0, **kwargs): # Error propagation as detailed in arXiv:1809.01289 dx = jacobian(func)(root[0], d.value) - da = jacobian(lambda u, v: func(v, u))(d.value, root[0]) + try: + da = jacobian(lambda u, v: func(v, u))(d.value, root[0]) + except TypeError: + raise Exception("It is required to use autograd.numpy instead of numpy within root functions, see the documentation for details.") from None deriv = - da / dx res = derived_observable(lambda x, **kwargs: (x[0] + np.finfo(np.float64).eps) / (d.value + np.finfo(np.float64).eps) * root[0], [d], man_grad=[deriv]) diff --git a/tests/fits_test.py b/tests/fits_test.py index 4367ac65..da43b4ec 100644 --- a/tests/fits_test.py +++ b/tests/fits_test.py @@ -1,4 +1,5 @@ -import autograd.numpy as np +import numpy as np +import autograd.numpy as anp import math import scipy.optimize from scipy.odr import ODR, Model, RealData @@ -41,12 +42,12 @@ def test_least_squares(): oy.append(pe.pseudo_Obs(y[i], yerr[i], str(i))) def f(x, a, b): - return a * np.exp(-b * x) + return a * anp.exp(-b * x) popt, pcov = scipy.optimize.curve_fit(f, x, y, sigma=[o.dvalue for o in oy], absolute_sigma=True) def func(a, x): - y = a[0] * np.exp(-a[1] * x) + y = a[0] * anp.exp(-a[1] * x) return y out = pe.least_squares(x, oy, func, expected_chisquare=True, resplot=True, qqplot=True) @@ -95,7 +96,7 @@ def test_alternative_solvers(): oy.append(pe.pseudo_Obs(y[i], yerr[i], 'test')) def func(a, x): - y = a[0] * np.exp(-a[1] * x) + y = a[0] * anp.exp(-a[1] * x) return y chisquare_values = [] @@ -145,7 +146,7 @@ def test_correlated_fit(): return p[1] + p[0] * x else: def fitf(p, x): - return p[1] * np.exp(-p[0] * x) + return p[1] * anp.exp(-p[0] * x) fitp = pe.least_squares(x, data, fitf, expected_chisquare=True) @@ -172,10 +173,10 @@ def test_total_least_squares(): oy.append(pe.pseudo_Obs(y[i], yerr[i], str(i))) def f(x, a, b): - return a * np.exp(-b * x) + return a * anp.exp(-b * x) def func(a, x): - y = a[0] * np.exp(-a[1] * x) + y = a[0] * anp.exp(-a[1] * x) return y data = RealData([o.value for o in ox], [o.value for o in oy], sx=[o.dvalue for o in ox], sy=[o.dvalue for o in oy]) @@ -336,6 +337,27 @@ def test_error_band(): pe.fits.error_band(x, f, fitp.fit_parameters) +def test_fit_no_autograd(): + dim = 10 + x = np.arange(dim) + y = 2 * np.exp(-0.08 * x) + np.random.normal(0.0, 0.15, dim) + yerr = 0.1 + 0.1 * np.random.rand(dim) + + oy = [] + for i, item in enumerate(x): + oy.append(pe.pseudo_Obs(y[i], yerr[i], str(i))) + + def func(a, x): + y = a[0] * np.exp(-a[1] * x) + return y + + with pytest.raises(Exception): + pe.least_squares(x, oy, func) + + with pytest.raises(Exception): + pe.total_least_squares(oy, oy, func) + + def test_ks_test(): def f(a, x): y = a[0] + a[1] * x diff --git a/tests/roots_test.py b/tests/roots_test.py index dbb27bbe..b6e9bdb0 100644 --- a/tests/roots_test.py +++ b/tests/roots_test.py @@ -30,3 +30,15 @@ def test_root_linear_idl(): difference = my_obs - my_root assert difference.is_zero() + + +def test_root_no_autograd(): + + def root_function(x, d): + return x - np.log(np.exp(d)) + + value = np.random.normal(0, 100) + my_obs = pe.pseudo_Obs(value, 0.1, 't') + + with pytest.raises(Exception): + my_root = pe.roots.find_root(my_obs, root_function) From b6eed60ec150cebe670a7e7bf9dab648930b6184 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Thu, 3 Mar 2022 10:10:29 +0000 Subject: [PATCH 115/136] refactor: computation of inverse cholesky composition for correlated fits simplified. Threshold for ill conditioned correlation matrix warning raised to 1e8. --- pyerrors/fits.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/pyerrors/fits.py b/pyerrors/fits.py index 4e9c80d3..6a428e65 100644 --- a/pyerrors/fits.py +++ b/pyerrors/fits.py @@ -458,15 +458,11 @@ def _standard_fit(x, y, func, silent=False, **kwargs): x0 = [0.1] * n_parms if kwargs.get('correlated_fit') is True: - cov = covariance(y) - covdiag = np.diag(1. / np.sqrt(np.diag(cov))) - corr = np.copy(cov) - for i in range(len(y)): - for j in range(len(y)): - corr[i][j] = cov[i][j] / np.sqrt(cov[i][i] * cov[j][j]) + corr = covariance(y, correlation=True) + covdiag = np.diag(1 / np.asarray(dy_f)) condn = np.linalg.cond(corr) - if condn > 1e4: - warnings.warn("Correlation matrix may be ill-conditioned! condition number: %1.2e" % (condn), RuntimeWarning) + if condn > 1e8: + warnings.warn("Correlation matrix may be ill-conditioned, condition number: %1.2e" % (condn), RuntimeWarning) chol = np.linalg.cholesky(corr) chol_inv = np.linalg.inv(chol) chol_inv = np.dot(chol_inv, covdiag) @@ -487,7 +483,7 @@ def _standard_fit(x, y, func, silent=False, **kwargs): if output.method != 'Levenberg-Marquardt': if output.method == 'migrad': - fit_result = iminuit.minimize(chisqfunc, x0, tol=1e-4) # Stopping crieterion 0.002 * tol * errordef + fit_result = iminuit.minimize(chisqfunc, x0, tol=1e-4) # Stopping criterion 0.002 * tol * errordef output.iterations = fit_result.nfev else: fit_result = scipy.optimize.minimize(chisqfunc, x0, method=kwargs.get('method'), tol=1e-12) From dcc24a380632ae5dcd69638a515e5933bd793475 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Thu, 3 Mar 2022 10:40:07 +0000 Subject: [PATCH 116/136] refactor: simplification and speed up of the computation of e_N in _covariance_element --- pyerrors/obs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyerrors/obs.py b/pyerrors/obs.py index 5cc33b69..bea49bbb 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -1446,7 +1446,7 @@ def _covariance_element(obs1, obs2): if r_name not in obs2.e_content[e_name]: continue gamma_div += calc_gamma(np.ones(obs1.shape[r_name]), np.ones(obs2.shape[r_name]), obs1.idl[r_name], obs2.idl[r_name], idl_d[r_name]) - e_N += np.sum(np.ones_like(idl_d[r_name])) + e_N += len(idl_d[r_name]) gamma /= gamma_div # Bias correction hep-lat/0306017 eq. (49) From ceb1fabf9a06c9ed9ae825911937b3260f4f17d2 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Thu, 3 Mar 2022 12:06:21 +0000 Subject: [PATCH 117/136] Version number bumped to 2.0.0-rc.2, changelog updated. --- CHANGELOG.md | 2 ++ pyerrors/version.py | 2 +- setup.py | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2503841..5d78cc00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ All notable changes to this project will be documented in this file. - The fit functions were renamed to `least_squares` and `total_least_squares`. - The output of the fit functions is now a dedicated results class which keeps track of all relevant information - The fit functions can now deal with provided covariance matrices. +- `covariance` can now operate on a list or array of `Obs` and returns a matrix - The convention for the fit range in the Corr class has been changed. - Various method of the `Corr` class were renamed - `Obs.print` was renamed to `Obs.details` and the output was improved. @@ -36,6 +37,7 @@ All notable changes to this project will be documented in this file. ### Removed - The function `plot_corrs` was deprecated as all its functionality is now contained within `Corr.show` +- `fits.covariance_matrix` was removed as it is now redundant with the functionality of `covariance` - The kwarg `bias_correction` in `derived_observable` was removed - Obs no longer have an attribute `e_Q` - Removed `fits.fit_exp` diff --git a/pyerrors/version.py b/pyerrors/version.py index c71c5a3d..b29c5e50 100644 --- a/pyerrors/version.py +++ b/pyerrors/version.py @@ -1 +1 @@ -__version__ = "2.0.0-rc.2+dev" +__version__ = "2.0.0-rc.2" diff --git a/setup.py b/setup.py index 0edc33a9..b3f0c306 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup, find_packages setup(name='pyerrors', - version='2.0.0-rc.2+dev', + version='2.0.0-rc.2', description='Error analysis for lattice QCD', author='Fabian Joswig', author_email='fabian.joswig@ed.ac.uk', From cec0ec83d71875758afbb85cbcb7a8dd9c31036e Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Thu, 3 Mar 2022 12:07:35 +0000 Subject: [PATCH 118/136] Version number bumped to 2.0.0-rc.3+dev --- pyerrors/version.py | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyerrors/version.py b/pyerrors/version.py index b29c5e50..69bd966d 100644 --- a/pyerrors/version.py +++ b/pyerrors/version.py @@ -1 +1 @@ -__version__ = "2.0.0-rc.2" +__version__ = "2.0.0-rc.3+dev" diff --git a/setup.py b/setup.py index b3f0c306..e7a997db 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup, find_packages setup(name='pyerrors', - version='2.0.0-rc.2', + version='2.0.0-rc.3+dev', description='Error analysis for lattice QCD', author='Fabian Joswig', author_email='fabian.joswig@ed.ac.uk', From 009975029522e4688fb78fcf00d84d4739ab59a8 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Thu, 3 Mar 2022 18:29:18 +0000 Subject: [PATCH 119/136] fix: replaced inverse by the pseudo inverse in the calculation of chi_exp --- pyerrors/fits.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyerrors/fits.py b/pyerrors/fits.py index 6a428e65..c023dd29 100644 --- a/pyerrors/fits.py +++ b/pyerrors/fits.py @@ -249,7 +249,7 @@ def total_least_squares(x, y, func, silent=False, **kwargs): new_jac = np.concatenate((fused_row1, fused_row2), axis=1) A = W @ new_jac - P_phi = A @ np.linalg.inv(A.T @ A) @ A.T + P_phi = A @ np.linalg.pinv(A.T @ A) @ A.T expected_chisquare = np.trace((np.identity(P_phi.shape[0]) - P_phi) @ W @ cov @ W) if expected_chisquare <= 0.0: warnings.warn("Negative expected_chisquare.", RuntimeWarning) @@ -528,7 +528,7 @@ def _standard_fit(x, y, func, silent=False, **kwargs): W = np.diag(1 / np.asarray(dy_f)) cov = covariance(y) A = W @ jacobian(func)(fit_result.x, x) - P_phi = A @ np.linalg.inv(A.T @ A) @ A.T + P_phi = A @ np.linalg.pinv(A.T @ A) @ A.T expected_chisquare = np.trace((np.identity(x.shape[-1]) - P_phi) @ W @ cov @ W) output.chisquare_by_expected_chisquare = chisquare / expected_chisquare if not silent: From 5dd365a997629eea82247bd3a4dacb9c6e25d929 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Fri, 4 Mar 2022 11:10:59 +0000 Subject: [PATCH 120/136] feat: Warning added when trying to estimate a covariance matrix from observables with too few samples. --- pyerrors/obs.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pyerrors/obs.py b/pyerrors/obs.py index bea49bbb..a806c597 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -1354,6 +1354,11 @@ def covariance(obs, visualize=False, correlation=False, **kwargs): ''' length = len(obs) + + max_samples = np.max([o.N for o in obs]) + if max_samples <= length: + warnings.warn(f"The dimension of the covariance matrix ({length}) is larger or equal to the number of samples ({max_samples}). This will result in a rank deficient matrix.", RuntimeWarning) + cov = np.zeros((length, length)) for i in range(length): for j in range(i, length): From 4139f88a0a915c341f26612634cc1e4531e03696 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Fri, 4 Mar 2022 16:56:30 +0000 Subject: [PATCH 121/136] fix: prevent division by zero by setting values of gamma_div which are smaller than 1 to 1 --- pyerrors/obs.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyerrors/obs.py b/pyerrors/obs.py index a806c597..c9c1659c 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -260,6 +260,7 @@ class Obs: gamma_div = np.zeros(w_max) for r_name in e_content[e_name]: gamma_div += self._calc_gamma(np.ones((self.shape[r_name])), self.idl[r_name], self.shape[r_name], w_max, fft) + gamma_div[gamma_div < 1] = 1.0 e_gamma[e_name] /= gamma_div[:w_max] if np.abs(e_gamma[e_name][0]) < 10 * np.finfo(float).tiny: # Prevent division by zero @@ -1452,7 +1453,7 @@ def _covariance_element(obs1, obs2): continue gamma_div += calc_gamma(np.ones(obs1.shape[r_name]), np.ones(obs2.shape[r_name]), obs1.idl[r_name], obs2.idl[r_name], idl_d[r_name]) e_N += len(idl_d[r_name]) - gamma /= gamma_div + gamma /= max(gamma_div, 1.0) # Bias correction hep-lat/0306017 eq. (49) dvalue += (1 + 1 / e_N) * gamma / e_N From abbb234257c3ba565db6538ca4a64e9a3ca1c2aa Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Fri, 4 Mar 2022 17:03:49 +0000 Subject: [PATCH 122/136] feat: hadrons input can now handle irregularly spaced ensembles. A warning is triggered in these cases. --- pyerrors/input/hadrons.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pyerrors/input/hadrons.py b/pyerrors/input/hadrons.py index 75a19aea..41b437a2 100644 --- a/pyerrors/input/hadrons.py +++ b/pyerrors/input/hadrons.py @@ -1,4 +1,5 @@ import os +import warnings from collections import Counter import h5py import numpy as np @@ -45,7 +46,8 @@ def _get_files(path, filestem, idl): if len(dc) == 1: idx = range(cnfg_numbers[0], cnfg_numbers[-1] + dc[0], dc[0]) else: - raise Exception('Configurations are not evenly spaced.') + idx = idl + warnings.warn("Configurations are not evenly spaced.", RuntimeWarning) return filtered_files, idx From c4468989327477dd3f94b22135e359929810b49c Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Fri, 4 Mar 2022 17:15:29 +0000 Subject: [PATCH 123/136] fix: warning for rank deficient covariance matrix is no longer called when covobs are involved. Test added. --- pyerrors/obs.py | 2 +- tests/obs_test.py | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/pyerrors/obs.py b/pyerrors/obs.py index a806c597..6889fd3f 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -1356,7 +1356,7 @@ def covariance(obs, visualize=False, correlation=False, **kwargs): length = len(obs) max_samples = np.max([o.N for o in obs]) - if max_samples <= length: + if max_samples <= length and not [item for sublist in [o.cov_names for o in obs] for item in sublist]: warnings.warn(f"The dimension of the covariance matrix ({length}) is larger or equal to the number of samples ({max_samples}). This will result in a rank deficient matrix.", RuntimeWarning) cov = np.zeros((length, length)) diff --git a/tests/obs_test.py b/tests/obs_test.py index 3d773951..a2f40fdf 100644 --- a/tests/obs_test.py +++ b/tests/obs_test.py @@ -696,6 +696,15 @@ def test_covariance_correlation(): assert np.allclose(pe.covariance([test_obs, test_obs, test_obs], correlation=True), np.ones((3, 3))) +def test_covariance_rank_deficient(): + obs = [] + for i in range(5): + obs.append(pe.pseudo_Obs(1.0, 0.1, 'test', 5)) + + with pytest.warns(RuntimeWarning): + pe.covariance(obs) + + def test_empty_obs(): o = pe.Obs([np.random.rand(100)], ['test']) q = o + pe.Obs([], []) From a7ff26ed9c369bc20737153d13064c83eaec24bf Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Fri, 4 Mar 2022 17:25:30 +0000 Subject: [PATCH 124/136] fix: only allow irregularly spaced configs in hadrons input if idl is specified. --- pyerrors/input/hadrons.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pyerrors/input/hadrons.py b/pyerrors/input/hadrons.py index 41b437a2..e9097625 100644 --- a/pyerrors/input/hadrons.py +++ b/pyerrors/input/hadrons.py @@ -45,9 +45,11 @@ def _get_files(path, filestem, idl): raise Exception("Unsorted files") if len(dc) == 1: idx = range(cnfg_numbers[0], cnfg_numbers[-1] + dc[0], dc[0]) - else: + elif idl: idx = idl warnings.warn("Configurations are not evenly spaced.", RuntimeWarning) + else: + raise Exception("Configurations are not evenly spaced.") return filtered_files, idx From 6bd386817941022bfedb21132a8f748a9455c441 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Sat, 5 Mar 2022 08:13:24 +0000 Subject: [PATCH 125/136] docs: documentation of covariance and correlated fits extended. --- pyerrors/__init__.py | 5 +++++ pyerrors/fits.py | 27 ++++++++++++++------------- pyerrors/obs.py | 4 +++- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/pyerrors/__init__.py b/pyerrors/__init__.py index 69f919f7..6ec89a04 100644 --- a/pyerrors/__init__.py +++ b/pyerrors/__init__.py @@ -353,6 +353,11 @@ def func(a, x): return a[0] * x1 ** 2 + a[1] * x2 ``` +`pyerrors` also supports correlated fits which can be triggered via the parameter `correlated_fit=True`. +Details about how the required covariance matrix is estimated can be found in `pyerrors.obs.covariance`. + +Direct visualizations of the performed fits can be triggered via `resplot=True` or `qqplot=True`. For all available options see `pyerrors.fits.least_squares`. + ## Total least squares fits `pyerrors` can also fit data with errors on both the dependent and independent variables using the total least squares method also referred to orthogonal distance regression as implemented in [scipy](https://docs.scipy.org/doc/scipy/reference/odr.html), see `pyerrors.fits.least_squares`. The syntax is identical to the standard least squares case, the only diffrence being that `x` also has to be a `list` or `numpy.array` of `Obs`. diff --git a/pyerrors/fits.py b/pyerrors/fits.py index 6a428e65..c1925560 100644 --- a/pyerrors/fits.py +++ b/pyerrors/fits.py @@ -86,7 +86,7 @@ def least_squares(x, y, func, priors=None, silent=False, **kwargs): ``` It is important that all numpy functions refer to autograd.numpy, otherwise the differentiation - will not work + will not work. priors : list, optional priors has to be a list with an entry for every parameter in the fit. The entries can either be Obs (e.g. results from a previous fit) or strings containing a value and an error formatted like @@ -95,24 +95,25 @@ def least_squares(x, y, func, priors=None, silent=False, **kwargs): If true all output to the console is omitted (default False). initial_guess : list can provide an initial guess for the input parameters. Relevant for - non-linear fits with many parameters. + non-linear fits with many parameters. method : str, optional can be used to choose an alternative method for the minimization of chisquare. The possible methods are the ones which can be used for scipy.optimize.minimize and migrad of iminuit. If no method is specified, Levenberg-Marquard is used. Reliable alternatives are migrad, Powell and Nelder-Mead. - resplot : bool - If true, a plot which displays fit, data and residuals is generated (default False). - qqplot : bool - If true, a quantile-quantile plot of the fit result is generated (default False). - expected_chisquare : bool - If true prints the expected chisquare which is - corrected by effects caused by correlated input data. - This can take a while as the full correlation matrix - has to be calculated (default False). correlated_fit : bool - If true, use the full correlation matrix in the definition of the chisquare - (only works for prior==None and when no method is given, at the moment). + If True, use the full inverse covariance matrix in the definition of the chisquare cost function. + For details about how the covariance matrix is estimated see `pyerrors.obs.covariance`. + In practice the correlation matrix is Cholesky decomposed and inverted (instead of the covariance matrix). + This procedure should be numerically more stable as the correlation matrix is typically better conditioned (Jacobi preconditioning). + At the moment this option only works for `prior==None` and when no `method` is given. + expected_chisquare : bool + If True estimates the expected chisquare which is + corrected by effects caused by correlated input data (default False). + resplot : bool + If True, a plot which displays fit, data and residuals is generated (default False). + qqplot : bool + If True, a quantile-quantile plot of the fit result is generated (default False). ''' if priors is not None: return _prior_fit(x, y, func, priors, silent=silent, **kwargs) diff --git a/pyerrors/obs.py b/pyerrors/obs.py index 6889fd3f..8e4351a8 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -1348,7 +1348,9 @@ def covariance(obs, visualize=False, correlation=False, **kwargs): Notes ----- - The covariance is estimated by calculating the correlation matrix assuming no autocorrelation and then rescaling the correlation matrix by the full errors including the previous gamma method estimate for the autocorrelation of the observables. For observables defined on a single ensemble this is equivalent to assuming that the integrated autocorrelation time of an off-diagonal element is equal to the geometric mean of the integrated autocorrelation times of the corresponding diagonal elements. + The covariance is estimated by calculating the correlation matrix assuming no autocorrelation and then rescaling the correlation matrix by the full errors including the previous gamma method estimate for the autocorrelation of the observables. The covariance at windowsize 0 is guaranteed to be positive semi-definite + $$v_i\Gamma_{ij}(0)v_j=\frac{1}{N}\sum_{s=1}^N\sum_{i,j}v_i\delta_i^s\delta_j^s v_j=\frac{1}{N}\sum_{s=1}^N\sum_{i}|v_i\delta_i^s|^2\geq 0\,,$$ for every $v_i\in\mathbb{R}^N$, while such an identity does not hold for larger windows/lags. + For observables defined on a single ensemble our approximation is equivalent to assuming that the integrated autocorrelation time of an off-diagonal element is equal to the geometric mean of the integrated autocorrelation times of the corresponding diagonal elements. $$\tau_{\mathrm{int}, ij}=\sqrt{\tau_{\mathrm{int}, i}\times \tau_{\mathrm{int}, j}}$$ This construction ensures that the estimated covariance matrix is positive semi-definite (up to numerical rounding errors). ''' From 57a45e271f7e3f49903f5fcad50efbef5e0cd118 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Sat, 5 Mar 2022 08:43:57 +0000 Subject: [PATCH 126/136] docs: formatting of docstrings improved. --- pyerrors/fits.py | 16 +++++++++++----- pyerrors/obs.py | 4 ++++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/pyerrors/fits.py b/pyerrors/fits.py index c1925560..377246a8 100644 --- a/pyerrors/fits.py +++ b/pyerrors/fits.py @@ -161,6 +161,8 @@ def total_least_squares(x, y, func, silent=False, **kwargs): This can take a while as the full correlation matrix has to be calculated (default False). + Notes + ----- Based on the orthogonal distance regression module of scipy ''' @@ -580,9 +582,13 @@ def _standard_fit(x, y, func, silent=False, **kwargs): def fit_lin(x, y, **kwargs): """Performs a linear fit to y = n + m * x and returns two Obs n, m. - y has to be a list of Obs, the dvalues of the Obs are used as yerror for the fit. - x can either be a list of floats in which case no xerror is assumed, or - a list of Obs, where the dvalues of the Obs are used as xerror for the fit. + Parameters + ---------- + x : list + Can either be a list of floats in which case no xerror is assumed, or + a list of Obs, where the dvalues of the Obs are used as xerror for the fit. + y : list + List of Obs, the dvalues of the Obs are used as yerror for the fit. """ def f(a, x): @@ -600,8 +606,8 @@ def fit_lin(x, y, **kwargs): def qqplot(x, o_y, func, p): - """ Generates a quantile-quantile plot of the fit result which can be used to - check if the residuals of the fit are gaussian distributed. + """Generates a quantile-quantile plot of the fit result which can be used to + check if the residuals of the fit are gaussian distributed. """ residuals = [] diff --git a/pyerrors/obs.py b/pyerrors/obs.py index 8e4351a8..613daf26 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -1300,6 +1300,8 @@ def correlate(obs_a, obs_b): obs_b : Obs Second observable + Notes + ----- Keep in mind to only correlate primary observables which have not been reweighted yet. The reweighting has to be applied after correlating the observables. Currently only works if ensembles are identical (this is not strictly necessary). @@ -1496,6 +1498,8 @@ def merge_obs(list_of_obs): list_of_obs : list list of the Obs object to be combined + Notes + ----- It is not possible to combine obs which are based on the same replicum """ replist = [item for obs in list_of_obs for item in obs.names] From 56af582303e614d8d18e59dac572d8cbab72e271 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Sat, 5 Mar 2022 15:27:29 +0000 Subject: [PATCH 127/136] docs: typo corrected --- pyerrors/obs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyerrors/obs.py b/pyerrors/obs.py index 613daf26..de8c8425 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -1351,7 +1351,7 @@ def covariance(obs, visualize=False, correlation=False, **kwargs): Notes ----- The covariance is estimated by calculating the correlation matrix assuming no autocorrelation and then rescaling the correlation matrix by the full errors including the previous gamma method estimate for the autocorrelation of the observables. The covariance at windowsize 0 is guaranteed to be positive semi-definite - $$v_i\Gamma_{ij}(0)v_j=\frac{1}{N}\sum_{s=1}^N\sum_{i,j}v_i\delta_i^s\delta_j^s v_j=\frac{1}{N}\sum_{s=1}^N\sum_{i}|v_i\delta_i^s|^2\geq 0\,,$$ for every $v_i\in\mathbb{R}^N$, while such an identity does not hold for larger windows/lags. + $$v_i\Gamma_{ij}(0)v_j=\frac{1}{N}\sum_{s=1}^N\sum_{i,j}v_i\delta_i^s\delta_j^s v_j=\frac{1}{N}\sum_{s=1}^N\sum_{i}|v_i\delta_i^s|^2\geq 0\,,$$ for every $v\in\mathbb{R}^M$, while such an identity does not hold for larger windows/lags. For observables defined on a single ensemble our approximation is equivalent to assuming that the integrated autocorrelation time of an off-diagonal element is equal to the geometric mean of the integrated autocorrelation times of the corresponding diagonal elements. $$\tau_{\mathrm{int}, ij}=\sqrt{\tau_{\mathrm{int}, i}\times \tau_{\mathrm{int}, j}}$$ This construction ensures that the estimated covariance matrix is positive semi-definite (up to numerical rounding errors). From 99bead518c6c50c60952ebb07d9e88685c739237 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Mon, 7 Mar 2022 11:54:09 +0000 Subject: [PATCH 128/136] tests: additional test for expected chiqsquare and correlated fit based on cov obs added. --- tests/fits_test.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/fits_test.py b/tests/fits_test.py index da43b4ec..cc958dbc 100644 --- a/tests/fits_test.py +++ b/tests/fits_test.py @@ -319,6 +319,23 @@ def test_prior_fit(): fitp = pe.fits.least_squares([0, 1], y, f, priors=y, resplot=True, qqplot=True) +def test_correlated_fit_covobs(): + x1 = pe.cov_Obs(1.01, 0.01 ** 2, 'test1') + x2 = pe.cov_Obs(2.01, 0.01 ** 2, 'test2') + x3 = pe.cov_Obs(2.99, 0.01 ** 2, 'test3') + + [o.gamma_method() for o in [x1, x2, x3]] + + def func(a, x): + return a[0] * x + a[1] + + fit_res = pe.fits.least_squares(np.arange(1, 4), [x1, x2, x3], func, expected_chisquare=True) + assert np.isclose(fit_res.chisquare_by_dof, fit_res.chisquare_by_expected_chisquare) + + fit_res_corr = pe.fits.least_squares(np.arange(1, 4), [x1, x2, x3], func, correlated_fit=True) + assert np.isclose(fit_res.chisquare_by_dof, fit_res_corr.chisquare_by_dof) + + def test_error_band(): def f(a, x): return a[0] + a[1] * x From 8d0bfafaab2b796ae109d1a7cc309eeb516393c0 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 8 Mar 2022 10:50:46 +0000 Subject: [PATCH 129/136] feat: spaghetti_plot method for monitoring exceptional configurations added to Corr class, tests added. --- pyerrors/correlators.py | 29 ++++++++++++++++++++++++++++- tests/correlators_test.py | 14 ++++++++++++-- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py index 94dd2f09..ac3f8b07 100644 --- a/pyerrors/correlators.py +++ b/pyerrors/correlators.py @@ -794,7 +794,34 @@ class Corr: else: raise Exception("'save' has to be a string.") - return + def spaghetti_plot(self, logscale=True): + """Produces a spaghetti plot of the correlator suited to monitor exceptional configurations. + + Parameters + ---------- + logscale : bool + Determines whether the scale of the y-axis is logarithmic or standard. + """ + if self.N != 1: + raise Exception("Correlator needs to be projected first.") + + mc_names = list(set([item for sublist in [o[0].mc_names for o in self.content if o is not None] for item in sublist])) + x0_vals = [n for (n, o) in zip(np.arange(self.T), self.content) if o is not None] + + for name in mc_names: + data = np.array([o[0].deltas[name] + o[0].r_values[name] for o in self.content if o is not None]).T + + fig = plt.figure() + ax = fig.add_subplot(111) + for dat in data: + ax.plot(x0_vals, dat, ls='-', marker='') + + if logscale is True: + ax.set_yscale('log') + + ax.set_xlabel(r'$x_0 / a$') + plt.title(name) + plt.draw() def dump(self, filename, datatype="json.gz", **kwargs): """Dumps the Corr into a file of chosen type diff --git a/tests/correlators_test.py b/tests/correlators_test.py index 9a2e7ea1..8ebca6aa 100644 --- a/tests/correlators_test.py +++ b/tests/correlators_test.py @@ -325,10 +325,20 @@ def test_corr_vector_operations(): assert np.all([o == 0 for o in ((my_corr * my_vec) / my_vec) - my_corr]) assert np.all([o == 0 for o in ((my_corr / my_vec) * my_vec) - my_corr]) -def _gen_corr(val): + +def test_spaghetti_plot(): + corr = _gen_corr(12, 50) + corr += pe.pseudo_Obs(0.0, 0.1, 'another_ensemble') + corr += pe.cov_Obs(0.0, 0.01 ** 2, 'covobs') + + corr.spaghetti_plot(True) + corr.spaghetti_plot(False) + + +def _gen_corr(val, samples=2000): corr_content = [] for t in range(16): - corr_content.append(pe.pseudo_Obs(val, 0.1, 't', 2000)) + corr_content.append(pe.pseudo_Obs(val, 0.1, 't', samples)) return pe.correlators.Corr(corr_content) From b72897a1bd789df541b0bcc4a73f357f1b19ba3d Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 8 Mar 2022 10:57:43 +0000 Subject: [PATCH 130/136] tests: random data removed from test_gamma_method_standard_data --- tests/obs_test.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/obs_test.py b/tests/obs_test.py index a2f40fdf..4eae6db4 100644 --- a/tests/obs_test.py +++ b/tests/obs_test.py @@ -142,7 +142,6 @@ def test_overloading_vectorization(): def test_gamma_method_standard_data(): for data in [np.tile([1, -1], 1000), - np.random.rand(100001), np.zeros(1195), np.sin(np.sqrt(2) * np.pi * np.arange(1812))]: test_obs = pe.Obs([data], ['t']) From e6813a6c8ee9d68c15d4b72a347d34f3c42aba0f Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Wed, 9 Mar 2022 12:24:52 +0000 Subject: [PATCH 131/136] feat: correlated_fit now throws an exception when the correlation matrix is ill conditioned with respect to the machine precision. Criterion for warning for ill-conditioned covariance matrix changed to cond > sqrt(eps) Test added. --- pyerrors/fits.py | 6 ++++-- tests/fits_test.py | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/pyerrors/fits.py b/pyerrors/fits.py index 6db0b1dc..17da5e71 100644 --- a/pyerrors/fits.py +++ b/pyerrors/fits.py @@ -464,8 +464,10 @@ def _standard_fit(x, y, func, silent=False, **kwargs): corr = covariance(y, correlation=True) covdiag = np.diag(1 / np.asarray(dy_f)) condn = np.linalg.cond(corr) - if condn > 1e8: - warnings.warn("Correlation matrix may be ill-conditioned, condition number: %1.2e" % (condn), RuntimeWarning) + if condn > 0.1 / np.finfo(float).eps: + raise Exception(f"Cannot invert correlation matrix as its condition number exceeds machine precision ({condn:1.2e})") + if condn > 1 / np.sqrt(np.finfo(float).eps): + warnings.warn("Correlation matrix may be ill-conditioned, condition number: {%1.2e}" % (condn), RuntimeWarning) chol = np.linalg.cholesky(corr) chol_inv = np.linalg.inv(chol) chol_inv = np.dot(chol_inv, covdiag) diff --git a/tests/fits_test.py b/tests/fits_test.py index cc958dbc..b6236fb9 100644 --- a/tests/fits_test.py +++ b/tests/fits_test.py @@ -375,6 +375,12 @@ def test_fit_no_autograd(): pe.total_least_squares(oy, oy, func) +def test_singular_correlated_fit(): + obs1 = pe.pseudo_Obs(1.0, 0.1, 'test') + with pytest.raises(Exception): + pe.fits.fit_lin([0, 1], [obs1, obs1], correlated_fit=True) + + def test_ks_test(): def f(a, x): y = a[0] + a[1] * x From e21e2d1904097f8741d27212199dfe31b5a24eaa Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Fri, 11 Mar 2022 14:54:24 +0000 Subject: [PATCH 132/136] fix: formatting of qqplot fixed --- pyerrors/fits.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyerrors/fits.py b/pyerrors/fits.py index 17da5e71..cfb10907 100644 --- a/pyerrors/fits.py +++ b/pyerrors/fits.py @@ -625,7 +625,7 @@ def qqplot(x, o_y, func, p): fit_stop = my_x[-1] samples = np.arange(fit_start, fit_stop, 0.01) plt.plot(samples, samples, 'k--', zorder=11, label='Standard normal distribution') - plt.plot(samples, probplot[1][0] * samples + probplot[1][1], zorder=10, label='Least squares fit, r=' + str(np.around(probplot[1][2], 3))) + plt.plot(samples, probplot[1][0] * samples + probplot[1][1], zorder=10, label='Least squares fit, r=' + str(np.around(probplot[1][2], 3)), marker='', ls='-') plt.xlabel('Theoretical quantiles') plt.ylabel('Ordered Values') From 2a02020a71a7cf578449f7e9e9f80b1a1f05b671 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Mon, 21 Mar 2022 16:45:37 +0000 Subject: [PATCH 133/136] fix: Increased the precision at which two observables are considered to be equal. --- pyerrors/obs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyerrors/obs.py b/pyerrors/obs.py index 2439bc03..0b46537c 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -443,7 +443,7 @@ class Obs: """ return self.is_zero() or np.abs(self.value) <= sigma * self._dvalue - def is_zero(self, rtol=1.e-5, atol=1.e-8): + def is_zero(self, rtol=1e-14, atol=1e-10): """Checks whether the observable is zero within a given tolerance. Parameters From da45a398b7934be1b21c466cde4f9eeb6eef64d8 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 22 Mar 2022 10:26:48 +0000 Subject: [PATCH 134/136] refactor: unnecessary parameter rtol removed from Obs.is_zero --- pyerrors/obs.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pyerrors/obs.py b/pyerrors/obs.py index 0b46537c..bf8575bd 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -443,17 +443,15 @@ class Obs: """ return self.is_zero() or np.abs(self.value) <= sigma * self._dvalue - def is_zero(self, rtol=1e-14, atol=1e-10): + def is_zero(self, atol=1e-10): """Checks whether the observable is zero within a given tolerance. Parameters ---------- - rtol : float - Relative tolerance (for details see numpy documentation). atol : float Absolute tolerance (for details see numpy documentation). """ - return np.isclose(0.0, self.value, rtol, atol) and all(np.allclose(0.0, delta, rtol, atol) for delta in self.deltas.values()) and all(np.allclose(0.0, delta.errsq(), rtol, atol) for delta in self.covobs.values()) + return np.isclose(0.0, self.value, 1e-14, atol) and all(np.allclose(0.0, delta, 1e-14, atol) for delta in self.deltas.values()) and all(np.allclose(0.0, delta.errsq(), 1e-14, atol) for delta in self.covobs.values()) def plot_tauint(self, save=None): """Plot integrated autocorrelation time for each ensemble. From c9e1cd10af15ec6e79398ceaf90f05ad0c20aa3e Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Thu, 24 Mar 2022 11:44:36 +0000 Subject: [PATCH 135/136] feat: implemented unary positive operation for Obs and CObs classes, included tolerance for exception in Obs.plot_piechart --- pyerrors/obs.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/pyerrors/obs.py b/pyerrors/obs.py index bf8575bd..6874bd12 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -582,7 +582,7 @@ class Obs: ensemble to the error and returns a dictionary containing the fractions.""" if not hasattr(self, 'e_dvalue'): raise Exception('Run the gamma method first.') - if self._dvalue == 0.0: + if np.isclose(0.0, self._dvalue, atol=1e-15): raise Exception('Error is 0.0') labels = self.e_names sizes = [self.e_dvalue[name] ** 2 for name in labels] / self._dvalue ** 2 @@ -729,6 +729,9 @@ class Obs: def __rsub__(self, y): return -1 * (self - y) + def __pos__(self): + return self + def __neg__(self): return -1 * self @@ -911,8 +914,11 @@ class CObs: def __abs__(self): return np.sqrt(self.real**2 + self.imag**2) - def __neg__(other): - return -1 * other + def __pos__(self): + return self + + def __neg__(self): + return -1 * self def __eq__(self, other): return self.real == other.real and self.imag == other.imag From cd2f361a3e81e42774c7a2ac97045af43d570476 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Thu, 24 Mar 2022 11:45:18 +0000 Subject: [PATCH 136/136] tests: tests for linalg and obs extended. --- tests/linalg_test.py | 10 ++++++++++ tests/obs_test.py | 22 ++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 61c71514..09db0ac5 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -314,6 +314,9 @@ def test_matrix_functions(): # Check determinant assert pe.linalg.det(np.diag(np.diag(matrix))) == np.prod(np.diag(matrix)) + with pytest.raises(Exception): + pe.linalg.det(5) + pe.linalg.pinv(matrix[:,:3]) @@ -347,3 +350,10 @@ def test_complex_matrix_operations(): diff = ta * tb - 1 for (i, j), entry in np.ndenumerate(diff): assert entry.is_zero() + + +def test_complex_matrix_real_entries(): + my_mat = get_complex_matrix(4) + my_mat[0, 1] = 4 + my_mat[2, 0] = pe.Obs([np.random.normal(1.0, 0.1, 100)], ['t']) + assert np.all((my_mat @ pe.linalg.inv(my_mat) - np.identity(4)) == 0) diff --git a/tests/obs_test.py b/tests/obs_test.py index 4eae6db4..c8aef487 100644 --- a/tests/obs_test.py +++ b/tests/obs_test.py @@ -51,6 +51,12 @@ def test_Obs_exceptions(): my_obs.gamma_method() my_obs.details() + obs = pe.Obs([np.random.normal(1.0, 0.1, 100)], ['t']) + one = obs / obs + one.gamma_method() + with pytest.raises(Exception): + one.plot_piechart() + def test_dump(): value = np.random.normal(5, 10) dvalue = np.abs(np.random.normal(0, 1)) @@ -86,6 +92,8 @@ def test_comparison(): assert test_obs2 != value2 assert test_obs1 != test_obs2 assert test_obs2 != test_obs1 + assert +test_obs1 == test_obs1 + assert -test_obs1 == 0 - test_obs1 def test_function_overloading(): @@ -367,6 +375,8 @@ def test_cobs(): obs2 = pe.pseudo_Obs(-0.2, 0.03, 't') my_cobs = pe.CObs(obs1, obs2) + assert +my_cobs == my_cobs + assert -my_cobs == 0 - my_cobs my_cobs == my_cobs str(my_cobs) repr(my_cobs) @@ -758,3 +768,15 @@ def test_merge_idx(): assert(new_idx[-1] > new_idx[0]) for i in range(1, len(new_idx)): assert(new_idx[i - 1] < new_idx[i]) + +def test_cobs_array(): + cobs = pe.Obs([np.random.normal(1.0, 0.1, 100)], ['t']) * (1 + 2j) + np.identity(4) + cobs + cobs + np.identity(4) + np.identity(4) - cobs + cobs - np.identity(4) + np.identity(4) * cobs + cobs * np.identity(4) + np.identity(4) / cobs + cobs / np.ones((4, 4)) +