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