diff --git a/lmfit-1.2.2.tar.gz b/lmfit-1.2.2.tar.gz deleted file mode 100644 index cded35e..0000000 --- a/lmfit-1.2.2.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:044a052a11a61da0576274504c17eb7e2803b41128e25821e96632207f23c88c -size 336346 diff --git a/lmfit-1.3.1.tar.gz b/lmfit-1.3.1.tar.gz new file mode 100644 index 0000000..ce0f3a9 --- /dev/null +++ b/lmfit-1.3.1.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bc386244adbd10ef1a2a2c4f9d17b3def905552c0a64aef854f0ad46cc309cc5 +size 629917 diff --git a/python-lmfit.changes b/python-lmfit.changes index 77e123d..72026f0 100644 --- a/python-lmfit.changes +++ b/python-lmfit.changes @@ -1,3 +1,42 @@ +------------------------------------------------------------------- +Fri Jul 5 03:01:53 UTC 2024 - Steve Kowalik + +- 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á diff --git a/python-lmfit.spec b/python-lmfit.spec index 4f0817d..f5095e3 100644 --- a/python-lmfit.spec +++ b/python-lmfit.spec @@ -1,7 +1,7 @@ # # 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 # remain the property of their copyright owners, unless otherwise agreed @@ -17,13 +17,15 @@ Name: python-lmfit -Version: 1.2.2 +Version: 1.3.1 Release: 0 Summary: Least-Squares Minimization with Bounds and Constraints License: BSD-3-Clause AND MIT URL: https://lmfit.github.io/lmfit-py/ 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 setuptools_scm} BuildRequires: %{python_module setuptools} @@ -31,19 +33,22 @@ BuildRequires: %{python_module wheel} BuildRequires: fdupes BuildRequires: python-rpm-macros Requires: python-asteval >= 0.9.28 -Requires: python-numpy >= 1.19 -Requires: python-scipy >= 1.6 +Requires: python-dill >= 0.3.4 +Requires: python-numpy >= 1.23 +Requires: python-scipy >= 1.8 Requires: python-uncertainties >= 3.1.4 -Recommends: python-dill Recommends: python-emcee Recommends: python-matplotlib Recommends: python-pandas BuildArch: noarch # SECTION test requirements 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 scipy >= 1.6} +BuildRequires: %{python_module scipy >= 1.8} BuildRequires: %{python_module uncertainties >= 3.1.4} # /SECTION %python_subpackages @@ -68,10 +73,8 @@ estimating Parameter uncertainties from the covariance matrix is questionable. %prep -%setup -q -n lmfit-%{version} +%autosetup -p1 -n lmfit-%{version} sed -i -e '/^#!\//, 1d' lmfit/jsonutils.py -# only coverage related pytest flags here. remove -sed -i '/addopts/d' setup.cfg %build %pyproject_wheel @@ -97,6 +100,6 @@ fi %doc README.rst AUTHORS.txt %license LICENSE %{python_sitelib}/lmfit -%{python_sitelib}/lmfit-%{version}*-info +%{python_sitelib}/lmfit-%{version}.dist-info %changelog diff --git a/support-numpy-2.patch b/support-numpy-2.patch new file mode 100644 index 0000000..3631a3a --- /dev/null +++ b/support-numpy-2.patch @@ -0,0 +1,343 @@ +From eee021f650833f0a2667315b2ab5d8351f0b1a1f Mon Sep 17 00:00:00 2001 +From: Matthew Newville +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 +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 +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 +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 +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 +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