forked from pool/python-lmfit
Markéta Machová
03e97688a9
* fix typo in restoring a _buildmodel dict (PR #957, Issue #956) * fixes for Numpy2 support (PR #959, Issue #958) * ensure that correct initial params are used when re-fitting a ModeRresult (PR #961, Issue #960) * make sure that CompositeModels cannot have a prefix (PR #961, Issue #954) * now require asteval>=1.0 and uncertainties>=3.2.2 - Fix requirements - Drop support-numpy-2.patch - Add lmfit-pr965-asteval.patch gh#lmfit/lmfit-py#965 OBS-URL: https://build.opensuse.org/package/show/devel:languages:python:numeric/python-lmfit?expand=0&rev=13
344 lines
13 KiB
Diff
344 lines
13 KiB
Diff
From eee021f650833f0a2667315b2ab5d8351f0b1a1f Mon Sep 17 00:00:00 2001
|
|
From: Matthew Newville <newville@cars.uchicago.edu>
|
|
Date: Sat, 29 Jun 2024 10:27:59 -0500
|
|
Subject: [PATCH 1/6] clean un-serializable symbols with NumPy2 that should be
|
|
removed from asteval
|
|
|
|
---
|
|
lmfit/parameter.py | 31 ++++++++++++++++++++++++-------
|
|
pyproject.toml | 3 ++-
|
|
2 files changed, 26 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/lmfit/parameter.py b/lmfit/parameter.py
|
|
index ca9ccc72..b68584c4 100644
|
|
--- a/lmfit/parameter.py
|
|
+++ b/lmfit/parameter.py
|
|
@@ -5,6 +5,8 @@
|
|
|
|
from asteval import Interpreter, get_ast_names, valid_symbol_name
|
|
from numpy import arcsin, array, cos, inf, isclose, sin, sqrt
|
|
+from numpy import version as npvers
|
|
+from packaging.version import Version
|
|
from scipy.linalg import LinAlgError
|
|
import scipy.special
|
|
from uncertainties import correlated_values, ufloat
|
|
@@ -21,6 +23,18 @@
|
|
SCIPY_FUNCTIONS[fnc_name] = getattr(scipy.special, fnc_name)
|
|
|
|
|
|
+def clean_np2_symbols(user_syms):
|
|
+ """clean symbols from self._asteval.user_defined_symbols()
|
|
+ that have been deprecated in numpy 2.0
|
|
+ This should be a short term fix, as these are removed from asteval.
|
|
+ """
|
|
+ if Version(npvers.version) > Version('1.9'):
|
|
+ for sym in ('ogrid', 'mgrid', 'c_', 'r_', 's_', 'index_exp'):
|
|
+ if sym in user_syms:
|
|
+ user_syms.remove(sym)
|
|
+ return user_syms
|
|
+
|
|
+
|
|
def check_ast_errors(expr_eval):
|
|
"""Check for errors derived from asteval."""
|
|
if len(expr_eval.error) > 0:
|
|
@@ -95,7 +109,8 @@ def update(self, other):
|
|
if not isinstance(other, Parameters):
|
|
raise ValueError(f"'{other}' is not a Parameters object")
|
|
self.add_many(*other.values())
|
|
- for sym in other._asteval.user_defined_symbols():
|
|
+ usersyms = clean_np2_symbols(other._asteval.user_defined_symbols())
|
|
+ for sym in usersyms:
|
|
self._asteval.symtable[sym] = other._asteval.symtable[sym]
|
|
return self
|
|
|
|
@@ -114,7 +129,8 @@ def __deepcopy__(self, memo):
|
|
|
|
# find the symbols that were added by users, not during construction
|
|
unique_symbols = {}
|
|
- for key in self._asteval.user_defined_symbols():
|
|
+ usersyms = clean_np2_symbols(self._asteval.user_defined_symbols())
|
|
+ for key in usersyms:
|
|
try:
|
|
val = deepcopy(self._asteval.symtable[key])
|
|
unique_symbols[key] = val
|
|
@@ -161,7 +177,8 @@ def __add__(self, other):
|
|
raise ValueError(f"'{other}' is not a Parameters object")
|
|
out = deepcopy(self)
|
|
out.add_many(*other.values())
|
|
- for sym in other._asteval.user_defined_symbols():
|
|
+ usersyms = clean_np2_symbols(other._asteval.user_defined_symbols())
|
|
+ for sym in usersyms:
|
|
if sym not in out._asteval.symtable:
|
|
out._asteval.symtable[sym] = other._asteval.symtable[sym]
|
|
return out
|
|
@@ -181,9 +198,9 @@ def __reduce__(self):
|
|
params = [self[k] for k in self]
|
|
|
|
# find the symbols from _asteval.symtable, that need to be remembered.
|
|
- sym_unique = self._asteval.user_defined_symbols()
|
|
+ usersyms = clean_np2_symbols(self._asteval.user_defined_symbols())
|
|
unique_symbols = {key: deepcopy(self._asteval.symtable[key])
|
|
- for key in sym_unique}
|
|
+ for key in usersyms}
|
|
|
|
return self.__class__, (), {'unique_symbols': unique_symbols,
|
|
'params': params}
|
|
@@ -567,9 +584,9 @@ def dumps(self, **kws):
|
|
|
|
"""
|
|
params = [p.__getstate__() for p in self.values()]
|
|
- sym_unique = self._asteval.user_defined_symbols()
|
|
+ usersyms = clean_np2_symbols(self._asteval.user_defined_symbols())
|
|
unique_symbols = {key: encode4js(deepcopy(self._asteval.symtable[key]))
|
|
- for key in sym_unique}
|
|
+ for key in usersyms}
|
|
return json.dumps({'unique_symbols': unique_symbols,
|
|
'params': params}, **kws)
|
|
|
|
diff --git a/pyproject.toml b/pyproject.toml
|
|
index 623c6a2d..511e9a97 100644
|
|
--- a/pyproject.toml
|
|
+++ b/pyproject.toml
|
|
@@ -10,7 +10,8 @@ dependencies = [
|
|
"numpy>=1.19",
|
|
"scipy>=1.6",
|
|
"uncertainties>=3.1.4",
|
|
- "dill>=0.3.4"
|
|
+ "dill>=0.3.4",
|
|
+ "packaging",
|
|
]
|
|
requires-python = ">= 3.8"
|
|
authors = [
|
|
|
|
From 2a195ac6a375b34245f330f8e60824f564e086bd Mon Sep 17 00:00:00 2001
|
|
From: Matthew Newville <newville@cars.uchicago.edu>
|
|
Date: Sat, 29 Jun 2024 10:36:34 -0500
|
|
Subject: [PATCH 2/6] fix numpy2 deprecation
|
|
|
|
---
|
|
tests/test_model.py | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/tests/test_model.py b/tests/test_model.py
|
|
index 396ea0b1..24dfbfcd 100644
|
|
--- a/tests/test_model.py
|
|
+++ b/tests/test_model.py
|
|
@@ -900,7 +900,7 @@ def test_independent_var_parsing(self):
|
|
yatan = stepmod2.eval(pars, x=x)
|
|
|
|
assert (yatan-yline).std() > 0.1
|
|
- assert (yatan-yline).ptp() > 1.0
|
|
+ assert np.ptp(yatan-yline) > 1.0
|
|
|
|
voigtmod = Model(voigt)
|
|
assert 'x' in voigtmod.independent_vars
|
|
|
|
From 48d3b5f9338312078186543044fb5d0109cec429 Mon Sep 17 00:00:00 2001
|
|
From: Matthew Newville <newville@cars.uchicago.edu>
|
|
Date: Sat, 29 Jun 2024 10:38:23 -0500
|
|
Subject: [PATCH 3/6] specify numpy>=2 for latest tests
|
|
|
|
---
|
|
azure-pipelines.yml | 6 +++---
|
|
1 file changed, 3 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
|
|
index 53c7c7f1..54f70890 100644
|
|
--- a/azure-pipelines.yml
|
|
+++ b/azure-pipelines.yml
|
|
@@ -139,7 +139,7 @@ stages:
|
|
swig libmpc-dev
|
|
displayName: 'Install dependencies'
|
|
- script: |
|
|
- python -m pip install --upgrade build pip setuptools wheel
|
|
+ python -m pip install --upgrade build pip setuptools wheel "numpy>=2.0"
|
|
displayName: 'Install latest available version of Python dependencies'
|
|
- script: |
|
|
python -m build
|
|
@@ -183,7 +183,7 @@ stages:
|
|
versionSpec: '$(python.version)'
|
|
displayName: 'Use Python $(python.version)'
|
|
- script: |
|
|
- python -m pip install --upgrade build pip setuptools wheel
|
|
+ python -m pip install --upgrade build pip setuptools wheel "numpy>=2.0"
|
|
displayName: 'Install latest available version of Python dependencies'
|
|
- script: |
|
|
python -m build
|
|
@@ -218,7 +218,7 @@ stages:
|
|
versionSpec: '$(python.version)'
|
|
displayName: 'Use Python $(python.version)'
|
|
- script: |
|
|
- python -m pip install --upgrade build pip setuptools wheel
|
|
+ python -m pip install --upgrade build pip setuptools wheel "numpy>=2.0"
|
|
displayName: 'Install latest available version of Python dependencies'
|
|
- script: |
|
|
python -m build
|
|
|
|
From 2a40772b20e2c1c48807c6b50d36217d72472d28 Mon Sep 17 00:00:00 2001
|
|
From: Matthew Newville <newville@cars.uchicago.edu>
|
|
Date: Sat, 29 Jun 2024 10:55:24 -0500
|
|
Subject: [PATCH 4/6] numpy2 not available for Python3.8
|
|
|
|
---
|
|
azure-pipelines.yml | 4 ++--
|
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
|
|
index 54f70890..98f8674b 100644
|
|
--- a/azure-pipelines.yml
|
|
+++ b/azure-pipelines.yml
|
|
@@ -107,13 +107,13 @@ stages:
|
|
- script: |
|
|
./codecov -v -f "coverage.xml"
|
|
displayName: 'Upload to codecov.io'
|
|
-
|
|
- stage: tests_latest_dependencies
|
|
dependsOn: check_codestyle
|
|
condition: succeededOrFailed()
|
|
jobs:
|
|
- job:
|
|
pool:
|
|
+
|
|
vmImage: 'ubuntu-latest'
|
|
strategy:
|
|
matrix:
|
|
@@ -139,7 +139,7 @@ stages:
|
|
swig libmpc-dev
|
|
displayName: 'Install dependencies'
|
|
- script: |
|
|
- python -m pip install --upgrade build pip setuptools wheel "numpy>=2.0"
|
|
+ python -m pip install --upgrade build pip setuptools wheel numpy
|
|
displayName: 'Install latest available version of Python dependencies'
|
|
- script: |
|
|
python -m build
|
|
|
|
From 4a986540dec49cc714faa726a060c5d9dda66feb Mon Sep 17 00:00:00 2001
|
|
From: Matthew Newville <newville@cars.uchicago.edu>
|
|
Date: Sun, 30 Jun 2024 13:46:26 -0500
|
|
Subject: [PATCH 5/6] remove packaging, clarify when clean_np2_symbols() can be
|
|
removed
|
|
|
|
---
|
|
lmfit/parameter.py | 10 +++++++---
|
|
pyproject.toml | 1 -
|
|
2 files changed, 7 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/lmfit/parameter.py b/lmfit/parameter.py
|
|
index b68584c4..56e37f94 100644
|
|
--- a/lmfit/parameter.py
|
|
+++ b/lmfit/parameter.py
|
|
@@ -6,7 +6,6 @@
|
|
from asteval import Interpreter, get_ast_names, valid_symbol_name
|
|
from numpy import arcsin, array, cos, inf, isclose, sin, sqrt
|
|
from numpy import version as npvers
|
|
-from packaging.version import Version
|
|
from scipy.linalg import LinAlgError
|
|
import scipy.special
|
|
from uncertainties import correlated_values, ufloat
|
|
@@ -26,9 +25,9 @@
|
|
def clean_np2_symbols(user_syms):
|
|
"""clean symbols from self._asteval.user_defined_symbols()
|
|
that have been deprecated in numpy 2.0
|
|
- This should be a short term fix, as these are removed from asteval.
|
|
+ This function can be removed when asteval 0.9.33 is no longer supported
|
|
"""
|
|
- if Version(npvers.version) > Version('1.9'):
|
|
+ if npvers.version.startswith('2'):
|
|
for sym in ('ogrid', 'mgrid', 'c_', 'r_', 's_', 'index_exp'):
|
|
if sym in user_syms:
|
|
user_syms.remove(sym)
|
|
@@ -109,6 +108,7 @@ def update(self, other):
|
|
if not isinstance(other, Parameters):
|
|
raise ValueError(f"'{other}' is not a Parameters object")
|
|
self.add_many(*other.values())
|
|
+ # FIXME: clear_np2_symbols() can be removed when asteval 0.9.33 is not supported
|
|
usersyms = clean_np2_symbols(other._asteval.user_defined_symbols())
|
|
for sym in usersyms:
|
|
self._asteval.symtable[sym] = other._asteval.symtable[sym]
|
|
@@ -129,6 +129,7 @@ def __deepcopy__(self, memo):
|
|
|
|
# find the symbols that were added by users, not during construction
|
|
unique_symbols = {}
|
|
+ # FIXME: clear_np2_symbols() can be removed when asteval 0.9.33 is not supported
|
|
usersyms = clean_np2_symbols(self._asteval.user_defined_symbols())
|
|
for key in usersyms:
|
|
try:
|
|
@@ -177,6 +178,7 @@ def __add__(self, other):
|
|
raise ValueError(f"'{other}' is not a Parameters object")
|
|
out = deepcopy(self)
|
|
out.add_many(*other.values())
|
|
+ # FIXME: clear_np2_symbols() can be removed when asteval 0.9.33 is not supported
|
|
usersyms = clean_np2_symbols(other._asteval.user_defined_symbols())
|
|
for sym in usersyms:
|
|
if sym not in out._asteval.symtable:
|
|
@@ -198,6 +200,7 @@ def __reduce__(self):
|
|
params = [self[k] for k in self]
|
|
|
|
# find the symbols from _asteval.symtable, that need to be remembered.
|
|
+ # FIXME: clear_np2_symbols() can be removed when asteval 0.9.33 is not supported
|
|
usersyms = clean_np2_symbols(self._asteval.user_defined_symbols())
|
|
unique_symbols = {key: deepcopy(self._asteval.symtable[key])
|
|
for key in usersyms}
|
|
@@ -584,6 +587,7 @@ def dumps(self, **kws):
|
|
|
|
"""
|
|
params = [p.__getstate__() for p in self.values()]
|
|
+ # FIXME: clear_np2_symbols() can be removed when asteval 0.9.33 is not supported
|
|
usersyms = clean_np2_symbols(self._asteval.user_defined_symbols())
|
|
unique_symbols = {key: encode4js(deepcopy(self._asteval.symtable[key]))
|
|
for key in usersyms}
|
|
diff --git a/pyproject.toml b/pyproject.toml
|
|
index 511e9a97..a40dad96 100644
|
|
--- a/pyproject.toml
|
|
+++ b/pyproject.toml
|
|
@@ -11,7 +11,6 @@ dependencies = [
|
|
"scipy>=1.6",
|
|
"uncertainties>=3.1.4",
|
|
"dill>=0.3.4",
|
|
- "packaging",
|
|
]
|
|
requires-python = ">= 3.8"
|
|
authors = [
|
|
|
|
From 8c49b0cebef3bc1e05f6c8ccf3278f1049d8cae2 Mon Sep 17 00:00:00 2001
|
|
From: Matthew Newville <newville@cars.uchicago.edu>
|
|
Date: Sun, 30 Jun 2024 13:47:14 -0500
|
|
Subject: [PATCH 6/6] revert azure pipeline to not specify numpy version for
|
|
most tests
|
|
|
|
---
|
|
azure-pipelines.yml | 6 +++---
|
|
1 file changed, 3 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
|
|
index 98f8674b..03a3b132 100644
|
|
--- a/azure-pipelines.yml
|
|
+++ b/azure-pipelines.yml
|
|
@@ -139,7 +139,7 @@ stages:
|
|
swig libmpc-dev
|
|
displayName: 'Install dependencies'
|
|
- script: |
|
|
- python -m pip install --upgrade build pip setuptools wheel numpy
|
|
+ python -m pip install --upgrade build pip setuptools wheel
|
|
displayName: 'Install latest available version of Python dependencies'
|
|
- script: |
|
|
python -m build
|
|
@@ -183,7 +183,7 @@ stages:
|
|
versionSpec: '$(python.version)'
|
|
displayName: 'Use Python $(python.version)'
|
|
- script: |
|
|
- python -m pip install --upgrade build pip setuptools wheel "numpy>=2.0"
|
|
+ python -m pip install --upgrade build pip setuptools wheel
|
|
displayName: 'Install latest available version of Python dependencies'
|
|
- script: |
|
|
python -m build
|
|
@@ -218,7 +218,7 @@ stages:
|
|
versionSpec: '$(python.version)'
|
|
displayName: 'Use Python $(python.version)'
|
|
- script: |
|
|
- python -m pip install --upgrade build pip setuptools wheel "numpy>=2.0"
|
|
+ python -m pip install --upgrade build pip setuptools wheel
|
|
displayName: 'Install latest available version of Python dependencies'
|
|
- script: |
|
|
python -m build
|