Accepting request 1186990 from devel:languages:python:numeric

Automatic submission by obs-autosubmit

OBS-URL: https://build.opensuse.org/request/show/1186990
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/python-lmfit?expand=0&rev=6
This commit is contained in:
Ana Guerrero 2024-07-12 15:05:16 +00:00 committed by Git OBS Bridge
commit 5c185703f7
5 changed files with 400 additions and 15 deletions

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:044a052a11a61da0576274504c17eb7e2803b41128e25821e96632207f23c88c
size 336346

3
lmfit-1.3.1.tar.gz Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:bc386244adbd10ef1a2a2c4f9d17b3def905552c0a64aef854f0ad46cc309cc5
size 629917

View File

@ -1,3 +1,42 @@
-------------------------------------------------------------------
Fri Jul 5 03:01:53 UTC 2024 - Steve Kowalik <steven.kowalik@suse.com>
- Update to 1.3.1:
* New features:
+ add 'min_rel_change' as optional variable in calculation of confidence
intervals with Model.conf_interval().
+ Model.eval_uncertainty now takes an optional dscale parameter (default
value of 0.01) to set the step size for calculating derivatives
+ add calculation of predicted_interval to Model.eval_uncertainty
* Bug fixes/enhancements:
+ allow Model.eval_uncertainty to be performed with single points for x
independent variables
+ allow Model._parse_param to handle older-style passed-in 'argnames' and
'kwargs' as for variadic function
+ better allow (or re-allow) Model function independent variables / keyword
arguments to be given non-default values at model creation time
+ add form as independent variable for builtin Step, Rectangle, Thermal
Distribution models.
+ use Model._reprstring(long=True) for model Model.__repr__().
+ restore best-fit parameter values for high accuracy values of constrained
values
+ improvement to Model for the difference between Parameter, "independent
variable", and "option".
+ better saving/loading saved states of Model now use dill, have several
cleanups, and are now versioned for future-proofing.
+ fix bug calculating r-squared for fits with weights
+ fix bug in modelresult.eval_uncertainty() after load_modelresult()
+ add test for MinimizerResult.uvars after successful fit
* Maintenance/Deprecations:
+ drop support for Python 3.7
+ fix tests for Python 3.12 and Python 3.13-dev
+ increase minimum numpy verstio to 1.23 and scipy to 1.8.
+ updates for compatibility with numpy 2.0
+ the dill package is now required
- Switch to autosetup macro.
- Add patch support-numpy-2.patch:
* Support numpy 2.0 more thoroughly.
------------------------------------------------------------------- -------------------------------------------------------------------
Mon Aug 21 10:32:37 UTC 2023 - Markéta Machová <mmachova@suse.com> Mon Aug 21 10:32:37 UTC 2023 - Markéta Machová <mmachova@suse.com>

View File

@ -1,7 +1,7 @@
# #
# spec file for package python-lmfit # spec file for package python-lmfit
# #
# Copyright (c) 2023 SUSE LLC # Copyright (c) 2024 SUSE LLC
# #
# All modifications and additions to the file contributed by third parties # All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed # remain the property of their copyright owners, unless otherwise agreed
@ -17,13 +17,15 @@
Name: python-lmfit Name: python-lmfit
Version: 1.2.2 Version: 1.3.1
Release: 0 Release: 0
Summary: Least-Squares Minimization with Bounds and Constraints Summary: Least-Squares Minimization with Bounds and Constraints
License: BSD-3-Clause AND MIT License: BSD-3-Clause AND MIT
URL: https://lmfit.github.io/lmfit-py/ URL: https://lmfit.github.io/lmfit-py/
Source: https://files.pythonhosted.org/packages/source/l/lmfit/lmfit-%{version}.tar.gz Source: https://files.pythonhosted.org/packages/source/l/lmfit/lmfit-%{version}.tar.gz
BuildRequires: %{python_module base >= 3.7} # PATCH-FIX-UPSTREAM gh#lmfit/lmfit-py#959
Patch0: support-numpy-2.patch
BuildRequires: %{python_module base >= 3.8}
BuildRequires: %{python_module pip} BuildRequires: %{python_module pip}
BuildRequires: %{python_module setuptools_scm} BuildRequires: %{python_module setuptools_scm}
BuildRequires: %{python_module setuptools} BuildRequires: %{python_module setuptools}
@ -31,19 +33,22 @@ BuildRequires: %{python_module wheel}
BuildRequires: fdupes BuildRequires: fdupes
BuildRequires: python-rpm-macros BuildRequires: python-rpm-macros
Requires: python-asteval >= 0.9.28 Requires: python-asteval >= 0.9.28
Requires: python-numpy >= 1.19 Requires: python-dill >= 0.3.4
Requires: python-scipy >= 1.6 Requires: python-numpy >= 1.23
Requires: python-scipy >= 1.8
Requires: python-uncertainties >= 3.1.4 Requires: python-uncertainties >= 3.1.4
Recommends: python-dill
Recommends: python-emcee Recommends: python-emcee
Recommends: python-matplotlib Recommends: python-matplotlib
Recommends: python-pandas Recommends: python-pandas
BuildArch: noarch BuildArch: noarch
# SECTION test requirements # SECTION test requirements
BuildRequires: %{python_module asteval >= 0.9.28} BuildRequires: %{python_module asteval >= 0.9.28}
BuildRequires: %{python_module numpy >= 1.19} BuildRequires: %{python_module dill >= 0.3.4}
BuildRequires: %{python_module flaky}
BuildRequires: %{python_module numpy >= 1.23}
BuildRequires: %{python_module pytest-cov}
BuildRequires: %{python_module pytest} BuildRequires: %{python_module pytest}
BuildRequires: %{python_module scipy >= 1.6} BuildRequires: %{python_module scipy >= 1.8}
BuildRequires: %{python_module uncertainties >= 3.1.4} BuildRequires: %{python_module uncertainties >= 3.1.4}
# /SECTION # /SECTION
%python_subpackages %python_subpackages
@ -68,10 +73,8 @@ estimating Parameter uncertainties from the covariance matrix is
questionable. questionable.
%prep %prep
%setup -q -n lmfit-%{version} %autosetup -p1 -n lmfit-%{version}
sed -i -e '/^#!\//, 1d' lmfit/jsonutils.py sed -i -e '/^#!\//, 1d' lmfit/jsonutils.py
# only coverage related pytest flags here. remove
sed -i '/addopts/d' setup.cfg
%build %build
%pyproject_wheel %pyproject_wheel
@ -97,6 +100,6 @@ fi
%doc README.rst AUTHORS.txt %doc README.rst AUTHORS.txt
%license LICENSE %license LICENSE
%{python_sitelib}/lmfit %{python_sitelib}/lmfit
%{python_sitelib}/lmfit-%{version}*-info %{python_sitelib}/lmfit-%{version}.dist-info
%changelog %changelog

343
support-numpy-2.patch Normal file
View File

@ -0,0 +1,343 @@
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