pyerrors 2.15.1__tar.gz → 2.17.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pyerrors-2.15.1 → pyerrors-2.17.0}/PKG-INFO +4 -4
- {pyerrors-2.15.1 → pyerrors-2.17.0}/README.md +1 -1
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/fits.py +1 -1
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/input/pandas.py +30 -18
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/input/sfcf.py +91 -41
- pyerrors-2.17.0/pyerrors/version.py +1 -0
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors.egg-info/PKG-INFO +4 -4
- {pyerrors-2.15.1 → pyerrors-2.17.0}/setup.py +2 -2
- pyerrors-2.15.1/pyerrors/version.py +0 -1
- {pyerrors-2.15.1 → pyerrors-2.17.0}/LICENSE +0 -0
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/__init__.py +0 -0
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/correlators.py +0 -0
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/covobs.py +0 -0
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/dirac.py +0 -0
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/input/__init__.py +0 -0
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/input/bdio.py +0 -0
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/input/dobs.py +0 -0
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/input/hadrons.py +0 -0
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/input/json.py +0 -0
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/input/misc.py +0 -0
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/input/openQCD.py +0 -0
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/input/utils.py +0 -0
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/integrate.py +0 -0
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/linalg.py +0 -0
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/misc.py +0 -0
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/mpm.py +0 -0
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/obs.py +0 -0
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/roots.py +0 -0
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/special.py +0 -0
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors.egg-info/SOURCES.txt +0 -0
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors.egg-info/dependency_links.txt +0 -0
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors.egg-info/requires.txt +0 -0
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors.egg-info/top_level.txt +0 -0
- {pyerrors-2.15.1 → pyerrors-2.17.0}/pyproject.toml +0 -0
- {pyerrors-2.15.1 → pyerrors-2.17.0}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyerrors
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.17.0
|
|
4
4
|
Summary: Error propagation and statistical analysis for Monte Carlo simulations
|
|
5
5
|
Home-page: https://github.com/fjosw/pyerrors
|
|
6
6
|
Author: Fabian Joswig
|
|
@@ -12,13 +12,13 @@ Project-URL: Changelog, https://github.com/fjosw/pyerrors/blob/master/CHANGELOG.
|
|
|
12
12
|
Classifier: Development Status :: 5 - Production/Stable
|
|
13
13
|
Classifier: Intended Audience :: Science/Research
|
|
14
14
|
Classifier: Programming Language :: Python :: 3
|
|
15
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
16
15
|
Classifier: Programming Language :: Python :: 3.10
|
|
17
16
|
Classifier: Programming Language :: Python :: 3.11
|
|
18
17
|
Classifier: Programming Language :: Python :: 3.12
|
|
19
18
|
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
20
20
|
Classifier: Topic :: Scientific/Engineering :: Physics
|
|
21
|
-
Requires-Python: >=3.
|
|
21
|
+
Requires-Python: >=3.10.0
|
|
22
22
|
Description-Content-Type: text/markdown
|
|
23
23
|
License-File: LICENSE
|
|
24
24
|
Requires-Dist: numpy>=2.0
|
|
@@ -52,7 +52,7 @@ Dynamic: requires-dist
|
|
|
52
52
|
Dynamic: requires-python
|
|
53
53
|
Dynamic: summary
|
|
54
54
|
|
|
55
|
-
[](https://www.python.org/downloads/) [](https://opensource.org/licenses/MIT) [](https://arxiv.org/abs/2209.14371) [](https://doi.org/10.1016/j.cpc.2023.108750)
|
|
56
56
|
# pyerrors
|
|
57
57
|
`pyerrors` is a python framework for error computation and propagation of Markov chain Monte Carlo data from lattice field theory and statistical mechanics simulations.
|
|
58
58
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
[](https://www.python.org/downloads/) [](https://opensource.org/licenses/MIT) [](https://arxiv.org/abs/2209.14371) [](https://doi.org/10.1016/j.cpc.2023.108750)
|
|
2
2
|
# pyerrors
|
|
3
3
|
`pyerrors` is a python framework for error computation and propagation of Markov chain Monte Carlo data from lattice field theory and statistical mechanics simulations.
|
|
4
4
|
|
|
@@ -472,7 +472,7 @@ def least_squares(x, y, func, priors=None, silent=False, **kwargs):
|
|
|
472
472
|
hat_vector = prepare_hat_matrix()
|
|
473
473
|
A = W @ hat_vector
|
|
474
474
|
P_phi = A @ np.linalg.pinv(A.T @ A) @ A.T
|
|
475
|
-
expected_chisquare = np.trace((np.identity(y_all.shape[-1]) - P_phi) @ W @ cov @ W)
|
|
475
|
+
expected_chisquare = np.trace((np.identity(y_all.shape[-1]) - P_phi) @ W @ cov @ W) + len(loc_priors)
|
|
476
476
|
output.chisquare_by_expected_chisquare = output.chisquare / expected_chisquare
|
|
477
477
|
if not silent:
|
|
478
478
|
print('chisquare/expected_chisquare:', output.chisquare_by_expected_chisquare)
|
|
@@ -145,9 +145,9 @@ def _serialize_df(df, gz=False):
|
|
|
145
145
|
serialize = _need_to_serialize(out[column])
|
|
146
146
|
|
|
147
147
|
if serialize is True:
|
|
148
|
-
out[column] = out[column].transform(lambda x: create_json_string(x, indent=0) if
|
|
148
|
+
out[column] = out[column].transform(lambda x: create_json_string(x, indent=0) if not _is_null(x) else None)
|
|
149
149
|
if gz is True:
|
|
150
|
-
out[column] = out[column].transform(lambda x: gzip.compress((
|
|
150
|
+
out[column] = out[column].transform(lambda x: gzip.compress(x.encode('utf-8')) if not _is_null(x) else gzip.compress(b''))
|
|
151
151
|
return out
|
|
152
152
|
|
|
153
153
|
|
|
@@ -166,37 +166,49 @@ def _deserialize_df(df, auto_gamma=False):
|
|
|
166
166
|
------
|
|
167
167
|
In case any column of the DataFrame is gzipped it is gunzipped in the process.
|
|
168
168
|
"""
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
if
|
|
169
|
+
# In pandas 3+, string columns use 'str' dtype instead of 'object'
|
|
170
|
+
string_like_dtypes = ["object", "str"] if int(pd.__version__.split(".")[0]) >= 3 else ["object"]
|
|
171
|
+
for column in df.select_dtypes(include=string_like_dtypes):
|
|
172
|
+
if len(df[column]) == 0:
|
|
173
|
+
continue
|
|
174
|
+
if isinstance(df[column].iloc[0], bytes):
|
|
175
|
+
if df[column].iloc[0].startswith(b"\x1f\x8b\x08\x00"):
|
|
176
|
+
df[column] = df[column].transform(lambda x: gzip.decompress(x).decode('utf-8') if not pd.isna(x) else '')
|
|
177
|
+
|
|
178
|
+
if df[column].notna().any():
|
|
175
179
|
df[column] = df[column].replace({r'^$': None}, regex=True)
|
|
176
180
|
i = 0
|
|
177
|
-
while df[column][i]
|
|
181
|
+
while i < len(df[column]) and pd.isna(df[column].iloc[i]):
|
|
178
182
|
i += 1
|
|
179
|
-
if isinstance(df[column][i], str):
|
|
180
|
-
if '"program":' in df[column][i][:20]:
|
|
181
|
-
df[column] = df[column].transform(lambda x: import_json_string(x, verbose=False) if
|
|
183
|
+
if i < len(df[column]) and isinstance(df[column].iloc[i], str):
|
|
184
|
+
if '"program":' in df[column].iloc[i][:20]:
|
|
185
|
+
df[column] = df[column].transform(lambda x: import_json_string(x, verbose=False) if not pd.isna(x) else None)
|
|
182
186
|
if auto_gamma is True:
|
|
183
|
-
if isinstance(df[column][i], list):
|
|
184
|
-
df[column].apply(lambda x: [o.gm() if o is not None else x for o in x])
|
|
187
|
+
if isinstance(df[column].iloc[i], list):
|
|
188
|
+
df[column].apply(lambda x: [o.gm() if o is not None else x for o in x] if x is not None else x)
|
|
185
189
|
else:
|
|
186
190
|
df[column].apply(lambda x: x.gm() if x is not None else x)
|
|
191
|
+
# Convert NA values back to Python None for compatibility with `x is None` checks
|
|
192
|
+
if df[column].isna().any():
|
|
193
|
+
df[column] = df[column].astype(object).where(df[column].notna(), None)
|
|
187
194
|
return df
|
|
188
195
|
|
|
189
196
|
|
|
190
197
|
def _need_to_serialize(col):
|
|
191
198
|
serialize = False
|
|
192
199
|
i = 0
|
|
193
|
-
while i < len(col) and col[i]
|
|
200
|
+
while i < len(col) and _is_null(col.iloc[i]):
|
|
194
201
|
i += 1
|
|
195
202
|
if i == len(col):
|
|
196
203
|
return serialize
|
|
197
|
-
if isinstance(col[i], (Obs, Corr)):
|
|
204
|
+
if isinstance(col.iloc[i], (Obs, Corr)):
|
|
198
205
|
serialize = True
|
|
199
|
-
elif isinstance(col[i], list):
|
|
200
|
-
if all(isinstance(o, Obs) for o in col[i]):
|
|
206
|
+
elif isinstance(col.iloc[i], list):
|
|
207
|
+
if all(isinstance(o, Obs) for o in col.iloc[i]):
|
|
201
208
|
serialize = True
|
|
202
209
|
return serialize
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def _is_null(val):
|
|
213
|
+
"""Check if a value is null (None or NA), handling list/array values."""
|
|
214
|
+
return False if isinstance(val, (list, np.ndarray)) else pd.isna(val)
|
|
@@ -5,12 +5,13 @@ import numpy as np # Thinly-wrapped numpy
|
|
|
5
5
|
from ..obs import Obs
|
|
6
6
|
from .utils import sort_names, check_idl
|
|
7
7
|
import itertools
|
|
8
|
+
import warnings
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
sep = "/"
|
|
11
12
|
|
|
12
13
|
|
|
13
|
-
def read_sfcf(path, prefix, name, quarks='.*', corr_type="bi", noffset=0, wf=0, wf2=0, version="1.0c", cfg_separator="n", silent=False, **kwargs):
|
|
14
|
+
def read_sfcf(path, prefix, name, quarks='.*', corr_type="bi", noffset=0, wf=0, wf2=0, version="1.0c", cfg_separator="n", cfg_func=None, silent=False, **kwargs):
|
|
14
15
|
"""Read sfcf files from given folder structure.
|
|
15
16
|
|
|
16
17
|
Parameters
|
|
@@ -71,11 +72,11 @@ def read_sfcf(path, prefix, name, quarks='.*', corr_type="bi", noffset=0, wf=0,
|
|
|
71
72
|
"""
|
|
72
73
|
ret = read_sfcf_multi(path, prefix, [name], quarks_list=[quarks], corr_type_list=[corr_type],
|
|
73
74
|
noffset_list=[noffset], wf_list=[wf], wf2_list=[wf2], version=version,
|
|
74
|
-
cfg_separator=cfg_separator, silent=silent, **kwargs)
|
|
75
|
+
cfg_separator=cfg_separator, cfg_func=cfg_func, silent=silent, **kwargs)
|
|
75
76
|
return ret[name][quarks][str(noffset)][str(wf)][str(wf2)]
|
|
76
77
|
|
|
77
78
|
|
|
78
|
-
def read_sfcf_multi(path, prefix, name_list, quarks_list=['.*'], corr_type_list=['bi'], noffset_list=[0], wf_list=[0], wf2_list=[0], version="1.0c", cfg_separator="n", silent=False, keyed_out=False, **kwargs):
|
|
79
|
+
def read_sfcf_multi(path, prefix, name_list, quarks_list=['.*'], corr_type_list=['bi'], noffset_list=[0], wf_list=[0], wf2_list=[0], version="1.0c", cfg_separator="n", cfg_func=None, silent=False, keyed_out=False, **kwargs):
|
|
79
80
|
"""Read sfcf files from given folder structure.
|
|
80
81
|
|
|
81
82
|
Parameters
|
|
@@ -245,6 +246,16 @@ def read_sfcf_multi(path, prefix, name_list, quarks_list=['.*'], corr_type_list=
|
|
|
245
246
|
for key in needed_keys:
|
|
246
247
|
internal_ret_dict[key] = []
|
|
247
248
|
|
|
249
|
+
def _default_idl_func(cfg_string, cfg_sep):
|
|
250
|
+
return int(cfg_string.split(cfg_sep)[-1])
|
|
251
|
+
|
|
252
|
+
if cfg_func is None:
|
|
253
|
+
print("Default idl function in use.")
|
|
254
|
+
cfg_func = _default_idl_func
|
|
255
|
+
cfg_func_args = [cfg_separator]
|
|
256
|
+
else:
|
|
257
|
+
cfg_func_args = kwargs.get("cfg_func_args", [])
|
|
258
|
+
|
|
248
259
|
if not appended:
|
|
249
260
|
for i, item in enumerate(ls):
|
|
250
261
|
rep_path = path + '/' + item
|
|
@@ -268,7 +279,7 @@ def read_sfcf_multi(path, prefix, name_list, quarks_list=['.*'], corr_type_list=
|
|
|
268
279
|
for cfg in sub_ls:
|
|
269
280
|
try:
|
|
270
281
|
if compact:
|
|
271
|
-
rep_idl.append(
|
|
282
|
+
rep_idl.append(cfg_func(cfg, *cfg_func_args))
|
|
272
283
|
else:
|
|
273
284
|
rep_idl.append(int(cfg[3:]))
|
|
274
285
|
except Exception:
|
|
@@ -351,7 +362,7 @@ def read_sfcf_multi(path, prefix, name_list, quarks_list=['.*'], corr_type_list=
|
|
|
351
362
|
for rep, file in enumerate(name_ls):
|
|
352
363
|
rep_idl = []
|
|
353
364
|
filename = path + '/' + file
|
|
354
|
-
T, rep_idl, rep_data = _read_append_rep(filename, pattern, intern[name]['b2b'],
|
|
365
|
+
T, rep_idl, rep_data = _read_append_rep(filename, pattern, intern[name]['b2b'], im, intern[name]['single'], cfg_func, cfg_func_args)
|
|
355
366
|
if rep == 0:
|
|
356
367
|
intern[name]['T'] = T
|
|
357
368
|
for t in range(intern[name]['T']):
|
|
@@ -581,12 +592,7 @@ def _read_compact_rep(path, rep, sub_ls, intern, needed_keys, im):
|
|
|
581
592
|
return return_vals
|
|
582
593
|
|
|
583
594
|
|
|
584
|
-
def
|
|
585
|
-
try:
|
|
586
|
-
idl = int(chunk[gauge_line].split(cfg_sep)[-1])
|
|
587
|
-
except Exception:
|
|
588
|
-
raise Exception("Couldn't parse idl from directory, problem with chunk around line ", gauge_line)
|
|
589
|
-
|
|
595
|
+
def _read_chunk_data(chunk, start_read, T, corr_line, b2b, pattern, im, single):
|
|
590
596
|
found_pat = ""
|
|
591
597
|
data = []
|
|
592
598
|
for li in chunk[corr_line + 1:corr_line + 6 + b2b]:
|
|
@@ -595,46 +601,90 @@ def _read_chunk(chunk, gauge_line, cfg_sep, start_read, T, corr_line, b2b, patte
|
|
|
595
601
|
for t, line in enumerate(chunk[start_read:start_read + T]):
|
|
596
602
|
floats = list(map(float, line.split()))
|
|
597
603
|
data.append(floats[im + 1 - single])
|
|
598
|
-
return
|
|
604
|
+
return data
|
|
599
605
|
|
|
600
606
|
|
|
601
|
-
def
|
|
607
|
+
def _check_append_rep(content, start_list):
|
|
608
|
+
data_len_list = []
|
|
609
|
+
header_len_list = []
|
|
610
|
+
has_regular_len_heads = True
|
|
611
|
+
for chunk_num in range(len(start_list)):
|
|
612
|
+
start = start_list[chunk_num]
|
|
613
|
+
if chunk_num == len(start_list) - 1:
|
|
614
|
+
stop = len(content)
|
|
615
|
+
else:
|
|
616
|
+
stop = start_list[chunk_num + 1]
|
|
617
|
+
chunk = content[start:stop]
|
|
618
|
+
for linenumber, line in enumerate(chunk):
|
|
619
|
+
if line.startswith("[correlator]"):
|
|
620
|
+
header_len = linenumber
|
|
621
|
+
break
|
|
622
|
+
header_len_list.append(header_len)
|
|
623
|
+
data_len_list.append(len(chunk) - header_len)
|
|
624
|
+
|
|
625
|
+
if len(set(header_len_list)) > 1:
|
|
626
|
+
warnings.warn("Not all headers have the same length. Data parts do.")
|
|
627
|
+
has_regular_len_heads = False
|
|
628
|
+
|
|
629
|
+
if len(set(data_len_list)) > 1:
|
|
630
|
+
raise Exception("Irregularities in file structure found, not all run data are of the same output length")
|
|
631
|
+
return has_regular_len_heads
|
|
632
|
+
|
|
633
|
+
|
|
634
|
+
def _read_chunk_structure(chunk, pattern, b2b):
|
|
635
|
+
start_read = 0
|
|
636
|
+
for linenumber, line in enumerate(chunk):
|
|
637
|
+
if line.startswith("gauge_name"):
|
|
638
|
+
gauge_line = linenumber
|
|
639
|
+
elif line.startswith("[correlator]"):
|
|
640
|
+
corr_line = linenumber
|
|
641
|
+
found_pat = ""
|
|
642
|
+
for li in chunk[corr_line + 1: corr_line + 6 + b2b]:
|
|
643
|
+
found_pat += li
|
|
644
|
+
if re.search(pattern, found_pat):
|
|
645
|
+
start_read = corr_line + 7 + b2b
|
|
646
|
+
break
|
|
647
|
+
if start_read == 0:
|
|
648
|
+
raise ValueError("Did not find pattern\n", pattern)
|
|
649
|
+
endline = corr_line + 6 + b2b
|
|
650
|
+
while not chunk[endline] == "\n":
|
|
651
|
+
endline += 1
|
|
652
|
+
T = endline - start_read
|
|
653
|
+
return gauge_line, corr_line, start_read, T
|
|
654
|
+
|
|
655
|
+
|
|
656
|
+
def _read_append_rep(filename, pattern, b2b, im, single, idl_func, cfg_func_args):
|
|
602
657
|
with open(filename, 'r') as fp:
|
|
603
658
|
content = fp.readlines()
|
|
604
|
-
|
|
659
|
+
chunk_start_lines = []
|
|
605
660
|
for linenumber, line in enumerate(content):
|
|
606
661
|
if "[run]" in line:
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
found_pat = ""
|
|
617
|
-
for li in chunk[corr_line + 1: corr_line + 6 + b2b]:
|
|
618
|
-
found_pat += li
|
|
619
|
-
if re.search(pattern, found_pat):
|
|
620
|
-
start_read = corr_line + 7 + b2b
|
|
621
|
-
break
|
|
622
|
-
else:
|
|
623
|
-
raise ValueError("Did not find pattern\n", pattern, "\nin\n", filename)
|
|
624
|
-
endline = corr_line + 6 + b2b
|
|
625
|
-
while not chunk[endline] == "\n":
|
|
626
|
-
endline += 1
|
|
627
|
-
T = endline - start_read
|
|
628
|
-
|
|
629
|
-
# all other chunks should follow the same structure
|
|
662
|
+
chunk_start_lines.append(linenumber)
|
|
663
|
+
has_regular_len_heads = _check_append_rep(content, chunk_start_lines)
|
|
664
|
+
if has_regular_len_heads:
|
|
665
|
+
chunk = content[:chunk_start_lines[1]]
|
|
666
|
+
try:
|
|
667
|
+
gauge_line, corr_line, start_read, T = _read_chunk_structure(chunk, pattern, b2b)
|
|
668
|
+
except ValueError:
|
|
669
|
+
raise ValueError("Did not find pattern\n", pattern, "\nin\n", filename, "lines", 1, "to", chunk_start_lines[1] + 1)
|
|
670
|
+
# if has_regular_len_heads is true, all other chunks should follow the same structure
|
|
630
671
|
rep_idl = []
|
|
631
672
|
rep_data = []
|
|
632
673
|
|
|
633
|
-
for
|
|
634
|
-
start =
|
|
635
|
-
|
|
674
|
+
for chunk_num in range(len(chunk_start_lines)):
|
|
675
|
+
start = chunk_start_lines[chunk_num]
|
|
676
|
+
if chunk_num == len(chunk_start_lines) - 1:
|
|
677
|
+
stop = len(content)
|
|
678
|
+
else:
|
|
679
|
+
stop = chunk_start_lines[chunk_num + 1]
|
|
636
680
|
chunk = content[start:stop]
|
|
637
|
-
|
|
681
|
+
if not has_regular_len_heads:
|
|
682
|
+
gauge_line, corr_line, start_read, T = _read_chunk_structure(chunk, pattern, b2b)
|
|
683
|
+
try:
|
|
684
|
+
idl = idl_func(chunk[gauge_line], *cfg_func_args)
|
|
685
|
+
except Exception:
|
|
686
|
+
raise Exception("Couldn't parse idl from file", filename, ", problem with chunk of lines", start + 1, "to", stop + 1)
|
|
687
|
+
data = _read_chunk_data(chunk, start_read, T, corr_line, b2b, pattern, im, single)
|
|
638
688
|
rep_idl.append(idl)
|
|
639
689
|
rep_data.append(data)
|
|
640
690
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "2.17.0"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyerrors
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.17.0
|
|
4
4
|
Summary: Error propagation and statistical analysis for Monte Carlo simulations
|
|
5
5
|
Home-page: https://github.com/fjosw/pyerrors
|
|
6
6
|
Author: Fabian Joswig
|
|
@@ -12,13 +12,13 @@ Project-URL: Changelog, https://github.com/fjosw/pyerrors/blob/master/CHANGELOG.
|
|
|
12
12
|
Classifier: Development Status :: 5 - Production/Stable
|
|
13
13
|
Classifier: Intended Audience :: Science/Research
|
|
14
14
|
Classifier: Programming Language :: Python :: 3
|
|
15
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
16
15
|
Classifier: Programming Language :: Python :: 3.10
|
|
17
16
|
Classifier: Programming Language :: Python :: 3.11
|
|
18
17
|
Classifier: Programming Language :: Python :: 3.12
|
|
19
18
|
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
20
20
|
Classifier: Topic :: Scientific/Engineering :: Physics
|
|
21
|
-
Requires-Python: >=3.
|
|
21
|
+
Requires-Python: >=3.10.0
|
|
22
22
|
Description-Content-Type: text/markdown
|
|
23
23
|
License-File: LICENSE
|
|
24
24
|
Requires-Dist: numpy>=2.0
|
|
@@ -52,7 +52,7 @@ Dynamic: requires-dist
|
|
|
52
52
|
Dynamic: requires-python
|
|
53
53
|
Dynamic: summary
|
|
54
54
|
|
|
55
|
-
[](https://www.python.org/downloads/) [](https://opensource.org/licenses/MIT) [](https://arxiv.org/abs/2209.14371) [](https://doi.org/10.1016/j.cpc.2023.108750)
|
|
56
56
|
# pyerrors
|
|
57
57
|
`pyerrors` is a python framework for error computation and propagation of Markov chain Monte Carlo data from lattice field theory and statistical mechanics simulations.
|
|
58
58
|
|
|
@@ -24,18 +24,18 @@ setup(name='pyerrors',
|
|
|
24
24
|
author_email='fabian.joswig@ed.ac.uk',
|
|
25
25
|
license="MIT",
|
|
26
26
|
packages=find_packages(),
|
|
27
|
-
python_requires='>=3.
|
|
27
|
+
python_requires='>=3.10.0',
|
|
28
28
|
install_requires=['numpy>=2.0', 'autograd>=1.7.0', 'numdifftools>=0.9.41', 'matplotlib>=3.9', 'scipy>=1.13', 'iminuit>=2.28', 'h5py>=3.11', 'lxml>=5.0', 'python-rapidjson>=1.20', 'pandas>=2.2'],
|
|
29
29
|
extras_require={'test': ['pytest', 'pytest-cov', 'pytest-benchmark', 'hypothesis', 'nbmake', 'flake8']},
|
|
30
30
|
classifiers=[
|
|
31
31
|
'Development Status :: 5 - Production/Stable',
|
|
32
32
|
'Intended Audience :: Science/Research',
|
|
33
33
|
'Programming Language :: Python :: 3',
|
|
34
|
-
'Programming Language :: Python :: 3.9',
|
|
35
34
|
'Programming Language :: Python :: 3.10',
|
|
36
35
|
'Programming Language :: Python :: 3.11',
|
|
37
36
|
'Programming Language :: Python :: 3.12',
|
|
38
37
|
'Programming Language :: Python :: 3.13',
|
|
38
|
+
'Programming Language :: Python :: 3.14',
|
|
39
39
|
'Topic :: Scientific/Engineering :: Physics'
|
|
40
40
|
],
|
|
41
41
|
)
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "2.15.1"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|