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.
Files changed (35) hide show
  1. {pyerrors-2.15.1 → pyerrors-2.17.0}/PKG-INFO +4 -4
  2. {pyerrors-2.15.1 → pyerrors-2.17.0}/README.md +1 -1
  3. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/fits.py +1 -1
  4. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/input/pandas.py +30 -18
  5. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/input/sfcf.py +91 -41
  6. pyerrors-2.17.0/pyerrors/version.py +1 -0
  7. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors.egg-info/PKG-INFO +4 -4
  8. {pyerrors-2.15.1 → pyerrors-2.17.0}/setup.py +2 -2
  9. pyerrors-2.15.1/pyerrors/version.py +0 -1
  10. {pyerrors-2.15.1 → pyerrors-2.17.0}/LICENSE +0 -0
  11. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/__init__.py +0 -0
  12. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/correlators.py +0 -0
  13. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/covobs.py +0 -0
  14. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/dirac.py +0 -0
  15. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/input/__init__.py +0 -0
  16. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/input/bdio.py +0 -0
  17. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/input/dobs.py +0 -0
  18. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/input/hadrons.py +0 -0
  19. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/input/json.py +0 -0
  20. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/input/misc.py +0 -0
  21. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/input/openQCD.py +0 -0
  22. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/input/utils.py +0 -0
  23. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/integrate.py +0 -0
  24. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/linalg.py +0 -0
  25. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/misc.py +0 -0
  26. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/mpm.py +0 -0
  27. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/obs.py +0 -0
  28. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/roots.py +0 -0
  29. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors/special.py +0 -0
  30. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors.egg-info/SOURCES.txt +0 -0
  31. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors.egg-info/dependency_links.txt +0 -0
  32. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors.egg-info/requires.txt +0 -0
  33. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyerrors.egg-info/top_level.txt +0 -0
  34. {pyerrors-2.15.1 → pyerrors-2.17.0}/pyproject.toml +0 -0
  35. {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.15.1
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.9.0
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://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![arXiv](https://img.shields.io/badge/arXiv-2209.14371-b31b1b.svg)](https://arxiv.org/abs/2209.14371) [![DOI](https://img.shields.io/badge/DOI-10.1016%2Fj.cpc.2023.108750-blue)](https://doi.org/10.1016/j.cpc.2023.108750)
55
+ [![](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![arXiv](https://img.shields.io/badge/arXiv-2209.14371-b31b1b.svg)](https://arxiv.org/abs/2209.14371) [![DOI](https://img.shields.io/badge/DOI-10.1016%2Fj.cpc.2023.108750-blue)](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://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![arXiv](https://img.shields.io/badge/arXiv-2209.14371-b31b1b.svg)](https://arxiv.org/abs/2209.14371) [![DOI](https://img.shields.io/badge/DOI-10.1016%2Fj.cpc.2023.108750-blue)](https://doi.org/10.1016/j.cpc.2023.108750)
1
+ [![](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![arXiv](https://img.shields.io/badge/arXiv-2209.14371-b31b1b.svg)](https://arxiv.org/abs/2209.14371) [![DOI](https://img.shields.io/badge/DOI-10.1016%2Fj.cpc.2023.108750-blue)](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 x is not None else None)
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((x if x is not None else '').encode('utf-8')))
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
- for column in df.select_dtypes(include="object"):
170
- if isinstance(df[column][0], bytes):
171
- if df[column][0].startswith(b"\x1f\x8b\x08\x00"):
172
- df[column] = df[column].transform(lambda x: gzip.decompress(x).decode('utf-8'))
173
-
174
- if not all([e is None for e in df[column]]):
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] is None:
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 x is not None else None)
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] is None:
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(int(cfg.split(cfg_separator)[-1]))
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'], cfg_separator, im, intern[name]['single'])
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 _read_chunk(chunk, gauge_line, cfg_sep, start_read, T, corr_line, b2b, pattern, im, single):
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 idl, data
604
+ return data
599
605
 
600
606
 
601
- def _read_append_rep(filename, pattern, b2b, cfg_separator, im, single):
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
- data_starts = []
659
+ chunk_start_lines = []
605
660
  for linenumber, line in enumerate(content):
606
661
  if "[run]" in line:
607
- data_starts.append(linenumber)
608
- if len(set([data_starts[i] - data_starts[i - 1] for i in range(1, len(data_starts))])) > 1:
609
- raise Exception("Irregularities in file structure found, not all runs have the same output length")
610
- chunk = content[:data_starts[1]]
611
- for linenumber, line in enumerate(chunk):
612
- if line.startswith("gauge_name"):
613
- gauge_line = linenumber
614
- elif line.startswith("[correlator]"):
615
- corr_line = linenumber
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 cnfg in range(len(data_starts)):
634
- start = data_starts[cnfg]
635
- stop = start + data_starts[1]
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
- idl, data = _read_chunk(chunk, gauge_line, cfg_separator, start_read, T, corr_line, b2b, pattern, im, single)
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.15.1
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.9.0
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://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![arXiv](https://img.shields.io/badge/arXiv-2209.14371-b31b1b.svg)](https://arxiv.org/abs/2209.14371) [![DOI](https://img.shields.io/badge/DOI-10.1016%2Fj.cpc.2023.108750-blue)](https://doi.org/10.1016/j.cpc.2023.108750)
55
+ [![](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![arXiv](https://img.shields.io/badge/arXiv-2209.14371-b31b1b.svg)](https://arxiv.org/abs/2209.14371) [![DOI](https://img.shields.io/badge/DOI-10.1016%2Fj.cpc.2023.108750-blue)](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.9.0',
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