pyerrors.input.misc
1import os 2import fnmatch 3import re 4import struct 5import numpy as np # Thinly-wrapped numpy 6from ..obs import Obs 7 8 9def read_pbp(path, prefix, **kwargs): 10 """Read pbp format from given folder structure. Returns a list of length nrw 11 12 Parameters 13 ---------- 14 r_start : list 15 list which contains the first config to be read for each replicum 16 r_stop : list 17 list which contains the last config to be read for each replicum 18 """ 19 20 ls = [] 21 for (dirpath, dirnames, filenames) in os.walk(path): 22 ls.extend(filenames) 23 break 24 25 if not ls: 26 raise Exception('Error, directory not found') 27 28 # Exclude files with different names 29 for exc in ls: 30 if not fnmatch.fnmatch(exc, prefix + '*.dat'): 31 ls = list(set(ls) - set([exc])) 32 if len(ls) > 1: 33 ls.sort(key=lambda x: int(re.findall(r'\d+', x[len(prefix):])[0])) 34 replica = len(ls) 35 36 if 'r_start' in kwargs: 37 r_start = kwargs.get('r_start') 38 if len(r_start) != replica: 39 raise Exception('r_start does not match number of replicas') 40 # Adjust Configuration numbering to python index 41 r_start = [o - 1 if o else None for o in r_start] 42 else: 43 r_start = [None] * replica 44 45 if 'r_stop' in kwargs: 46 r_stop = kwargs.get('r_stop') 47 if len(r_stop) != replica: 48 raise Exception('r_stop does not match number of replicas') 49 else: 50 r_stop = [None] * replica 51 52 print(r'Read <bar{psi}\psi> from', prefix[:-1], ',', replica, 'replica', end='') 53 54 print_err = 0 55 if 'print_err' in kwargs: 56 print_err = 1 57 print() 58 59 deltas = [] 60 61 for rep in range(replica): 62 tmp_array = [] 63 with open(path + '/' + ls[rep], 'rb') as fp: 64 65 t = fp.read(4) # number of reweighting factors 66 if rep == 0: 67 nrw = struct.unpack('i', t)[0] 68 for k in range(nrw): 69 deltas.append([]) 70 else: 71 if nrw != struct.unpack('i', t)[0]: 72 raise Exception('Error: different number of factors for replicum', rep) 73 74 for k in range(nrw): 75 tmp_array.append([]) 76 77 # This block is necessary for openQCD1.6 ms1 files 78 nfct = [] 79 for i in range(nrw): 80 t = fp.read(4) 81 nfct.append(struct.unpack('i', t)[0]) 82 print('nfct: ', nfct) # Hasenbusch factor, 1 for rat reweighting 83 84 nsrc = [] 85 for i in range(nrw): 86 t = fp.read(4) 87 nsrc.append(struct.unpack('i', t)[0]) 88 89 # body 90 while True: 91 t = fp.read(4) 92 if len(t) < 4: 93 break 94 if print_err: 95 config_no = struct.unpack('i', t) 96 for i in range(nrw): 97 tmp_nfct = 1.0 98 for j in range(nfct[i]): 99 t = fp.read(8 * nsrc[i]) 100 t = fp.read(8 * nsrc[i]) 101 tmp_rw = struct.unpack('d' * nsrc[i], t) 102 tmp_nfct *= np.mean(np.asarray(tmp_rw)) 103 if print_err: 104 print(config_no, i, j, np.mean(np.asarray(tmp_rw)), np.std(np.asarray(tmp_rw))) 105 print('Sources:', np.asarray(tmp_rw)) 106 print('Partial factor:', tmp_nfct) 107 tmp_array[i].append(tmp_nfct) 108 109 for k in range(nrw): 110 deltas[k].append(tmp_array[k][r_start[rep]:r_stop[rep]]) 111 112 rep_names = [] 113 for entry in ls: 114 truncated_entry = entry.split('.')[0] 115 idx = truncated_entry.index('r') 116 rep_names.append(truncated_entry[:idx] + '|' + truncated_entry[idx:]) 117 print(',', nrw, r'<bar{psi}\psi> with', nsrc, 'sources') 118 result = [] 119 for t in range(nrw): 120 result.append(Obs(deltas[t], rep_names)) 121 122 return result
def
read_pbp(path, prefix, **kwargs):
10def read_pbp(path, prefix, **kwargs): 11 """Read pbp format from given folder structure. Returns a list of length nrw 12 13 Parameters 14 ---------- 15 r_start : list 16 list which contains the first config to be read for each replicum 17 r_stop : list 18 list which contains the last config to be read for each replicum 19 """ 20 21 ls = [] 22 for (dirpath, dirnames, filenames) in os.walk(path): 23 ls.extend(filenames) 24 break 25 26 if not ls: 27 raise Exception('Error, directory not found') 28 29 # Exclude files with different names 30 for exc in ls: 31 if not fnmatch.fnmatch(exc, prefix + '*.dat'): 32 ls = list(set(ls) - set([exc])) 33 if len(ls) > 1: 34 ls.sort(key=lambda x: int(re.findall(r'\d+', x[len(prefix):])[0])) 35 replica = len(ls) 36 37 if 'r_start' in kwargs: 38 r_start = kwargs.get('r_start') 39 if len(r_start) != replica: 40 raise Exception('r_start does not match number of replicas') 41 # Adjust Configuration numbering to python index 42 r_start = [o - 1 if o else None for o in r_start] 43 else: 44 r_start = [None] * replica 45 46 if 'r_stop' in kwargs: 47 r_stop = kwargs.get('r_stop') 48 if len(r_stop) != replica: 49 raise Exception('r_stop does not match number of replicas') 50 else: 51 r_stop = [None] * replica 52 53 print(r'Read <bar{psi}\psi> from', prefix[:-1], ',', replica, 'replica', end='') 54 55 print_err = 0 56 if 'print_err' in kwargs: 57 print_err = 1 58 print() 59 60 deltas = [] 61 62 for rep in range(replica): 63 tmp_array = [] 64 with open(path + '/' + ls[rep], 'rb') as fp: 65 66 t = fp.read(4) # number of reweighting factors 67 if rep == 0: 68 nrw = struct.unpack('i', t)[0] 69 for k in range(nrw): 70 deltas.append([]) 71 else: 72 if nrw != struct.unpack('i', t)[0]: 73 raise Exception('Error: different number of factors for replicum', rep) 74 75 for k in range(nrw): 76 tmp_array.append([]) 77 78 # This block is necessary for openQCD1.6 ms1 files 79 nfct = [] 80 for i in range(nrw): 81 t = fp.read(4) 82 nfct.append(struct.unpack('i', t)[0]) 83 print('nfct: ', nfct) # Hasenbusch factor, 1 for rat reweighting 84 85 nsrc = [] 86 for i in range(nrw): 87 t = fp.read(4) 88 nsrc.append(struct.unpack('i', t)[0]) 89 90 # body 91 while True: 92 t = fp.read(4) 93 if len(t) < 4: 94 break 95 if print_err: 96 config_no = struct.unpack('i', t) 97 for i in range(nrw): 98 tmp_nfct = 1.0 99 for j in range(nfct[i]): 100 t = fp.read(8 * nsrc[i]) 101 t = fp.read(8 * nsrc[i]) 102 tmp_rw = struct.unpack('d' * nsrc[i], t) 103 tmp_nfct *= np.mean(np.asarray(tmp_rw)) 104 if print_err: 105 print(config_no, i, j, np.mean(np.asarray(tmp_rw)), np.std(np.asarray(tmp_rw))) 106 print('Sources:', np.asarray(tmp_rw)) 107 print('Partial factor:', tmp_nfct) 108 tmp_array[i].append(tmp_nfct) 109 110 for k in range(nrw): 111 deltas[k].append(tmp_array[k][r_start[rep]:r_stop[rep]]) 112 113 rep_names = [] 114 for entry in ls: 115 truncated_entry = entry.split('.')[0] 116 idx = truncated_entry.index('r') 117 rep_names.append(truncated_entry[:idx] + '|' + truncated_entry[idx:]) 118 print(',', nrw, r'<bar{psi}\psi> with', nsrc, 'sources') 119 result = [] 120 for t in range(nrw): 121 result.append(Obs(deltas[t], rep_names)) 122 123 return result
Read pbp format from given folder structure. Returns a list of length nrw
Parameters
- 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