mirror of
https://github.com/fjosw/pyerrors.git
synced 2025-05-14 19:43:41 +02:00
Merge branch 'develop' into fix/covariance_idl
This commit is contained in:
commit
3a8e21ef2d
3 changed files with 105 additions and 25 deletions
|
@ -621,7 +621,7 @@ class Corr:
|
||||||
raise Exception('Unknown variant.')
|
raise Exception('Unknown variant.')
|
||||||
|
|
||||||
def fit(self, function, fitrange=None, silent=False, **kwargs):
|
def fit(self, function, fitrange=None, silent=False, **kwargs):
|
||||||
"""Fits function to the data
|
r'''Fits function to the data
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
|
@ -629,10 +629,12 @@ class Corr:
|
||||||
function to fit to the data. See fits.least_squares for details.
|
function to fit to the data. See fits.least_squares for details.
|
||||||
fitrange : list
|
fitrange : list
|
||||||
Two element list containing the timeslices on which the fit is supposed to start and stop.
|
Two element list containing the timeslices on which the fit is supposed to start and stop.
|
||||||
|
Caution: This range is inclusive as opposed to standard python indexing.
|
||||||
|
`fitrange=[4, 6]` corresponds to the three entries 4, 5 and 6.
|
||||||
If not specified, self.prange or all timeslices are used.
|
If not specified, self.prange or all timeslices are used.
|
||||||
silent : bool
|
silent : bool
|
||||||
Decides whether output is printed to the standard output.
|
Decides whether output is printed to the standard output.
|
||||||
"""
|
'''
|
||||||
if self.N != 1:
|
if self.N != 1:
|
||||||
raise Exception("Correlator must be projected before fitting")
|
raise Exception("Correlator must be projected before fitting")
|
||||||
|
|
||||||
|
|
|
@ -302,11 +302,24 @@ def read_mesons(file_path, bdio_path='./libbdio.so', **kwargs):
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
file_path -- path to the bdio file
|
file_path : str
|
||||||
bdio_path -- path to the shared bdio library libbdio.so (default ./libbdio.so)
|
path to the bdio file
|
||||||
stop -- stops reading at given configuration number (default None)
|
bdio_path : str
|
||||||
alternative_ensemble_name -- Manually overwrite ensemble name
|
path to the shared bdio library libbdio.so (default ./libbdio.so)
|
||||||
|
start : int
|
||||||
|
The first configuration to be read (default 1)
|
||||||
|
stop : int
|
||||||
|
The last configuration to be read (default None)
|
||||||
|
step : int
|
||||||
|
Fixed step size between two measurements (default 1)
|
||||||
|
alternative_ensemble_name : str
|
||||||
|
Manually overwrite ensemble name
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
start = kwargs.get('start', 1)
|
||||||
|
stop = kwargs.get('stop', None)
|
||||||
|
step = kwargs.get('step', 1)
|
||||||
|
|
||||||
bdio = ctypes.cdll.LoadLibrary(bdio_path)
|
bdio = ctypes.cdll.LoadLibrary(bdio_path)
|
||||||
|
|
||||||
bdio_open = bdio.bdio_open
|
bdio_open = bdio.bdio_open
|
||||||
|
@ -353,9 +366,9 @@ def read_mesons(file_path, bdio_path='./libbdio.so', **kwargs):
|
||||||
prop_kappa = [] # Contains propagator kappas (Component of corr_kappa)
|
prop_kappa = [] # Contains propagator kappas (Component of corr_kappa)
|
||||||
prop_source = [] # Contains propagator source positions
|
prop_source = [] # Contains propagator source positions
|
||||||
# Check noise type for multiple replica?
|
# Check noise type for multiple replica?
|
||||||
cnfg_no = -1
|
|
||||||
corr_no = -1
|
corr_no = -1
|
||||||
data = []
|
data = []
|
||||||
|
idl = []
|
||||||
|
|
||||||
fbdio = bdio_open(ctypes.c_char_p(b_path), ctypes.c_char_p(b_read), ctypes.c_char_p(b_form))
|
fbdio = bdio_open(ctypes.c_char_p(b_path), ctypes.c_char_p(b_read), ctypes.c_char_p(b_form))
|
||||||
|
|
||||||
|
@ -418,18 +431,20 @@ def read_mesons(file_path, bdio_path='./libbdio.so', **kwargs):
|
||||||
prop_kappa.append(_get_kwd(tmp_string, 'KAPPA='))
|
prop_kappa.append(_get_kwd(tmp_string, 'KAPPA='))
|
||||||
prop_source.append(_get_kwd(tmp_string, 'x0='))
|
prop_source.append(_get_kwd(tmp_string, 'x0='))
|
||||||
if ruinfo == 4:
|
if ruinfo == 4:
|
||||||
if 'stop' in kwargs:
|
cnfg_no = int(_get_kwd(tmp_string, 'CNFG_ID='))
|
||||||
if cnfg_no >= kwargs.get('stop') - 1:
|
if stop:
|
||||||
|
if cnfg_no > kwargs.get('stop'):
|
||||||
break
|
break
|
||||||
cnfg_no += 1
|
idl.append(cnfg_no)
|
||||||
print('\r%s %i' % ('Reading configuration', cnfg_no + 1), end='\r')
|
print('\r%s %i' % ('Reading configuration', cnfg_no), end='\r')
|
||||||
if cnfg_no == 0:
|
if len(idl) == 1:
|
||||||
no_corrs = len(corr_name)
|
no_corrs = len(corr_name)
|
||||||
data = []
|
data = []
|
||||||
for c in range(no_corrs):
|
for c in range(no_corrs):
|
||||||
data.append([])
|
data.append([])
|
||||||
|
|
||||||
corr_no = 0
|
corr_no = 0
|
||||||
|
|
||||||
bdio_close(fbdio)
|
bdio_close(fbdio)
|
||||||
|
|
||||||
print('\nEnsemble: ', ensemble_name)
|
print('\nEnsemble: ', ensemble_name)
|
||||||
|
@ -441,7 +456,7 @@ def read_mesons(file_path, bdio_path='./libbdio.so', **kwargs):
|
||||||
print('Number of time values: ', d0)
|
print('Number of time values: ', d0)
|
||||||
print('Number of random sources: ', d1)
|
print('Number of random sources: ', d1)
|
||||||
print('Number of corrs: ', len(corr_name))
|
print('Number of corrs: ', len(corr_name))
|
||||||
print('Number of configurations: ', cnfg_no + 1)
|
print('Number of configurations: ', len(idl))
|
||||||
|
|
||||||
corr_kappa = [] # Contains kappa values for both propagators of given correlation function
|
corr_kappa = [] # Contains kappa values for both propagators of given correlation function
|
||||||
corr_source = []
|
corr_source = []
|
||||||
|
@ -452,12 +467,29 @@ def read_mesons(file_path, bdio_path='./libbdio.so', **kwargs):
|
||||||
else:
|
else:
|
||||||
corr_source.append(int(prop_source[int(item[0])]))
|
corr_source.append(int(prop_source[int(item[0])]))
|
||||||
|
|
||||||
|
if stop is None:
|
||||||
|
stop = idl[-1]
|
||||||
|
idl_target = range(start, stop + 1, step)
|
||||||
|
|
||||||
|
if set(idl) != set(idl_target):
|
||||||
|
try:
|
||||||
|
indices = [idl.index(i) for i in idl_target]
|
||||||
|
except ValueError as err:
|
||||||
|
raise Exception('Configurations in file do no match target list!', err)
|
||||||
|
else:
|
||||||
|
indices = None
|
||||||
|
|
||||||
result = {}
|
result = {}
|
||||||
for c in range(no_corrs):
|
for c in range(no_corrs):
|
||||||
tmp_corr = []
|
tmp_corr = []
|
||||||
|
tmp_data = np.asarray(data[c])
|
||||||
for t in range(d0 - 2):
|
for t in range(d0 - 2):
|
||||||
tmp_corr.append(Obs([np.asarray(data[c])[:, t]], [ensemble_name]))
|
if indices:
|
||||||
result[(corr_name[c], corr_source[c]) + tuple(sorted(corr_kappa[c]))] = tmp_corr
|
deltas = [tmp_data[:, t][index] for index in indices]
|
||||||
|
else:
|
||||||
|
deltas = tmp_data[:, t]
|
||||||
|
tmp_corr.append(Obs([deltas], [ensemble_name], idl=[idl_target]))
|
||||||
|
result[(corr_name[c], corr_source[c]) + tuple(corr_kappa[c])] = tmp_corr
|
||||||
|
|
||||||
# Check that all data entries have the same number of configurations
|
# Check that all data entries have the same number of configurations
|
||||||
if len(set([o[0].N for o in list(result.values())])) != 1:
|
if len(set([o[0].N for o in list(result.values())])) != 1:
|
||||||
|
@ -480,10 +512,24 @@ def read_dSdm(file_path, bdio_path='./libbdio.so', **kwargs):
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
file_path -- path to the bdio file
|
file_path : str
|
||||||
bdio_path -- path to the shared bdio library libbdio.so (default ./libbdio.so)
|
path to the bdio file
|
||||||
stop -- stops reading at given configuration number (default None)
|
bdio_path : str
|
||||||
|
path to the shared bdio library libbdio.so (default ./libbdio.so)
|
||||||
|
start : int
|
||||||
|
The first configuration to be read (default 1)
|
||||||
|
stop : int
|
||||||
|
The last configuration to be read (default None)
|
||||||
|
step : int
|
||||||
|
Fixed step size between two measurements (default 1)
|
||||||
|
alternative_ensemble_name : str
|
||||||
|
Manually overwrite ensemble name
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
start = kwargs.get('start', 1)
|
||||||
|
stop = kwargs.get('stop', None)
|
||||||
|
step = kwargs.get('step', 1)
|
||||||
|
|
||||||
bdio = ctypes.cdll.LoadLibrary(bdio_path)
|
bdio = ctypes.cdll.LoadLibrary(bdio_path)
|
||||||
|
|
||||||
bdio_open = bdio.bdio_open
|
bdio_open = bdio.bdio_open
|
||||||
|
@ -529,9 +575,9 @@ def read_dSdm(file_path, bdio_path='./libbdio.so', **kwargs):
|
||||||
# d1 = 0 # nnoise
|
# d1 = 0 # nnoise
|
||||||
prop_kappa = [] # Contains propagator kappas (Component of corr_kappa)
|
prop_kappa = [] # Contains propagator kappas (Component of corr_kappa)
|
||||||
# Check noise type for multiple replica?
|
# Check noise type for multiple replica?
|
||||||
cnfg_no = -1
|
|
||||||
corr_no = -1
|
corr_no = -1
|
||||||
data = []
|
data = []
|
||||||
|
idl = []
|
||||||
|
|
||||||
fbdio = bdio_open(ctypes.c_char_p(b_path), ctypes.c_char_p(b_read), ctypes.c_char_p(b_form))
|
fbdio = bdio_open(ctypes.c_char_p(b_path), ctypes.c_char_p(b_read), ctypes.c_char_p(b_form))
|
||||||
|
|
||||||
|
@ -586,12 +632,13 @@ def read_dSdm(file_path, bdio_path='./libbdio.so', **kwargs):
|
||||||
if ruinfo == 2:
|
if ruinfo == 2:
|
||||||
prop_kappa.append(_get_kwd(tmp_string, 'KAPPA='))
|
prop_kappa.append(_get_kwd(tmp_string, 'KAPPA='))
|
||||||
if ruinfo == 4:
|
if ruinfo == 4:
|
||||||
if 'stop' in kwargs:
|
cnfg_no = int(_get_kwd(tmp_string, 'CNFG_ID='))
|
||||||
if cnfg_no >= kwargs.get('stop') - 1:
|
if stop:
|
||||||
|
if cnfg_no > kwargs.get('stop'):
|
||||||
break
|
break
|
||||||
cnfg_no += 1
|
idl.append(cnfg_no)
|
||||||
print('\r%s %i' % ('Reading configuration', cnfg_no + 1), end='\r')
|
print('\r%s %i' % ('Reading configuration', cnfg_no), end='\r')
|
||||||
if cnfg_no == 0:
|
if len(idl) == 1:
|
||||||
no_corrs = len(corr_name)
|
no_corrs = len(corr_name)
|
||||||
data = []
|
data = []
|
||||||
for c in range(no_corrs):
|
for c in range(no_corrs):
|
||||||
|
@ -612,9 +659,18 @@ def read_dSdm(file_path, bdio_path='./libbdio.so', **kwargs):
|
||||||
for item in corr_props:
|
for item in corr_props:
|
||||||
corr_kappa.append(float(prop_kappa[int(item)]))
|
corr_kappa.append(float(prop_kappa[int(item)]))
|
||||||
|
|
||||||
|
if stop is None:
|
||||||
|
stop = idl[-1]
|
||||||
|
idl_target = range(start, stop + 1, step)
|
||||||
|
try:
|
||||||
|
indices = [idl.index(i) for i in idl_target]
|
||||||
|
except ValueError as err:
|
||||||
|
raise Exception('Configurations in file do no match target list!', err)
|
||||||
|
|
||||||
result = {}
|
result = {}
|
||||||
for c in range(no_corrs):
|
for c in range(no_corrs):
|
||||||
result[(corr_name[c], str(corr_kappa[c]))] = Obs([np.asarray(data[c])], [ensemble_name])
|
deltas = [np.asarray(data[c])[index] for index in indices]
|
||||||
|
result[(corr_name[c], str(corr_kappa[c]))] = Obs([deltas], [ensemble_name], idl=[idl_target])
|
||||||
|
|
||||||
# Check that all data entries have the same number of configurations
|
# Check that all data entries have the same number of configurations
|
||||||
if len(set([o.N for o in list(result.values())])) != 1:
|
if len(set([o.N for o in list(result.values())])) != 1:
|
||||||
|
|
|
@ -157,6 +157,28 @@ def test_correlated_fit():
|
||||||
assert(diff.is_zero_within_error(sigma=5))
|
assert(diff.is_zero_within_error(sigma=5))
|
||||||
|
|
||||||
|
|
||||||
|
def test_fit_corr_independent():
|
||||||
|
dim = 50
|
||||||
|
x = np.arange(dim)
|
||||||
|
y = 0.84 * np.exp(-0.12 * x) + np.random.normal(0.0, 0.1, dim)
|
||||||
|
yerr = [0.1] * 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] * anp.exp(-a[1] * x)
|
||||||
|
return y
|
||||||
|
|
||||||
|
out = pe.least_squares(x, oy, func)
|
||||||
|
out_corr = pe.least_squares(x, oy, func, correlated_fit=True)
|
||||||
|
|
||||||
|
assert np.isclose(out.chisquare, out_corr.chisquare)
|
||||||
|
assert (out[0] - out_corr[0]).is_zero(atol=1e-5)
|
||||||
|
assert (out[1] - out_corr[1]).is_zero(atol=1e-5)
|
||||||
|
|
||||||
|
|
||||||
def test_total_least_squares():
|
def test_total_least_squares():
|
||||||
dim = 10 + int(30 * np.random.rand())
|
dim = 10 + int(30 * np.random.rand())
|
||||||
x = np.arange(dim) + np.random.normal(0.0, 0.15, dim)
|
x = np.arange(dim) + np.random.normal(0.0, 0.15, dim)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue