From 5c0159d0166c8a3345e6108453ed95e9cc2e9cf29546050998802058e6a8ce2f Mon Sep 17 00:00:00 2001 From: Steve Kowalik Date: Fri, 5 Jul 2024 03:04:39 +0000 Subject: [PATCH] - 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. OBS-URL: https://build.opensuse.org/package/show/devel:languages:python:numeric/python-lmfit?expand=0&rev=11 --- .gitattributes | 23 +++ .gitignore | 1 + lmfit-1.2.2.tar.gz | 3 + lmfit-1.3.1.tar.gz | 3 + python-lmfit.changes | 343 ++++++++++++++++++++++++++++++++++++++++++ python-lmfit.spec | 105 +++++++++++++ support-numpy-2.patch | 343 ++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 821 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 lmfit-1.2.2.tar.gz create mode 100644 lmfit-1.3.1.tar.gz create mode 100644 python-lmfit.changes create mode 100644 python-lmfit.spec create mode 100644 support-numpy-2.patch diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..9b03811 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,23 @@ +## Default LFS +*.7z filter=lfs diff=lfs merge=lfs -text +*.bsp filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.gem filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.jar filter=lfs diff=lfs merge=lfs -text +*.lz filter=lfs diff=lfs merge=lfs -text +*.lzma filter=lfs diff=lfs merge=lfs -text +*.obscpio filter=lfs diff=lfs merge=lfs -text +*.oxt filter=lfs diff=lfs merge=lfs -text +*.pdf filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text +*.rpm filter=lfs diff=lfs merge=lfs -text +*.tbz filter=lfs diff=lfs merge=lfs -text +*.tbz2 filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.ttf filter=lfs diff=lfs merge=lfs -text +*.txz filter=lfs diff=lfs merge=lfs -text +*.whl filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zst filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..57affb6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.osc diff --git a/lmfit-1.2.2.tar.gz b/lmfit-1.2.2.tar.gz new file mode 100644 index 0000000..cded35e --- /dev/null +++ b/lmfit-1.2.2.tar.gz @@ -0,0 +1,3 @@ +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 new file mode 100644 index 0000000..72026f0 --- /dev/null +++ b/python-lmfit.changes @@ -0,0 +1,343 @@ +------------------------------------------------------------------- +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á + +- Update to 1.2.2 + * add create_params function + * add ModelResult.summary() to return many resulting fit statistics + and attributes into a JSON-able dict. + * update tests for latest versions of NumPy and SciPy. + * Coercing of user input data and independent data for Model to + float64 ndarrays is somewhat less aggressive and will not increase + the precision of numpy ndarrays + * improve Model.make_params and create_params to take optional dict + of Parameter attributes + * Outputs of residual functions, including Model._residual, are more + explicitly coerced to 1d-arrays of datatype Float64. This decreases the + expectation for the user-supplied code to return ndarrays, and increases + the tolerance for more “array-like” objects or ndarrays that are not + Float64 or 1-dimensional. + +------------------------------------------------------------------- +Fri Jan 13 15:42:09 UTC 2023 - Ben Greiner + +- Update to v1.1.0 + ## New features: + * add Pearson4Model (@lellid; PR #800) + * add SplineModel (PR #804) + * add R^2 rsquared statistic to fit outputs and reports for Model + fits (Issue #803; PR #810) + * add calculation of dely for model components of composite + models (Issue #761; PR #826) + ## Bug fixes/enhancements: + * make sure variable spercent is always defined in + params_html_table functions (reported by @MySlientWind; Issue + #768, PR #770) + * always initialize the variables success and covar the + MinimizerResult (reported by Marc W. Pound; PR #771) + * build package following PEP517/PEP518; use pyproject.toml and + setup.cfg; leave setup.py for now (PR #777) + * components used to create a CompositeModel can now have + different independent variables (@Julian-Hochhaus; Discussion + #787; PR #788) + * fixed function definition for StepModel(form='linear'), was not + consistent with the other ones (@matpompili; PR #794) + * fixed height factor for Gaussian2dModel, was not correct + (@matpompili; PR #795) + * for covariances with negative diagonal elements, we set the + covariance to None (PR #813) + * fixed linear mode for RectangleModel (@arunpersaud; Issue #815; + PR #816) + * report correct initial values for parameters with bounds (Issue + #820; PR #821) + * allow recalculation of confidence intervals (@jagerber48; PR + #798) + * include 'residual' in JSON output of ModelResult.dumps + (@mac01021; PR #830) + * supports and is tested against Python 3.11; updated minimum + required version of SciPy, NumPy, and asteval (PR #832) + ## Deprecations: + * remove support for Python 3.6 which reached EOL on 2021-12-23 + (PR #790) +- Clean check section from extra example + +------------------------------------------------------------------- +Tue Dec 28 19:11:00 UTC 2021 - Ben Greiner + +- Update to v1.0.3 + **Potentially breaking change:** + * argument ``x`` is now required for the ``guess`` method of + Models (Issue #747; PR #748) + + To get reasonable estimates for starting values one should + always supply both ``x`` and ``y`` values; in some cases it + would work when only providing ``data`` (i.e., y-values). With + the change above, ``x`` is now required in the ``guess`` method + call, so scripts might need to be updated to explicitly supply + ``x``. + **Bug fixes/enhancements:** + * do not overwrite user-specified figure titles in Model.plot() + functions and allow setting with ``title`` keyword argument (PR + #711) + * preserve Parameters subclass in deepcopy (@jenshnielsen; PR + #719) + * coerce ``data`` and ``indepdent_vars`` to NumPy array with + ``dtype=float64`` or ``dtype=complex128`` where applicable + (Issues #723 and #728) + * fix collision between parameter names in built-in models and + user-specified parameters (Issue #710 and PR #732) + * correct error message in PolynomialModel (@kremeyer; PR #737) + * improved handling of altered JSON data (Issue #739; PR #740, + reported by Matthew Giammar) + * map ``max_nfev`` to ``maxiter`` when using + ``differential_evolution`` (PR #749, reported by Olivier B.) + * correct use of noise versus experimental uncertainty in the + documentation (PR #751, reported by Andrés Zelcer) + * specify return type of ``eval`` method more precisely and allow + for plotting of (Complex)ConstantModel by coercing their + ``float``, ``int``, or ``complex`` return value to a + ``numpy.ndarray`` (Issue #684 and PR #754) + * fix ``dho`` (Damped Harmonic Oscillator) lineshape (PR #755; + @rayosborn) + * reset ``Minimizer._abort`` to ``False`` before starting a new + fit (Issue #756 and PR #757; @azelcer) + * fix typo in ``guess_from_peak2d`` (@ivan-usovl; PR #758) + **Various:** + * update asteval dependency to >= 0.9.22 to avoid + DeprecationWarnings from NumPy v1.20.0 (PR #707) + * remove incorrectly spelled ``DonaichModel`` and ``donaich`` + lineshape, deprecated in version 1.0.1 (PR #707) + * remove occurrences of OrderedDict throughout the code; dict is + order-preserving since Python 3.6 (PR #713) + * update the contributing instructions (PR #718; @martin-majlis) + * (again) defer import of matplotlib to when it is needed + (@zobristnicholas; PR #721) + * fix description of ``name`` argument in ``Parameters.add`` + (@kristianmeyerr; PR #725) + * update dependencies, make sure a functional development + environment is installed on Windows (Issue #712) + * use ``setuptools_scm`` for version info instead of + ``versioneer`` (PR #729) + * transition to using ``f-strings`` (PR #730) + * mark ``test_manypeaks_speed.py`` as flaky to avoid intermittent + test failures (repeat up to 5 times; PR #745) + * update scipy dependency to >= 1.14.0 (PR #751) + * improvement to output of examples in sphinx-gallery and use + higher resolution figures (PR #753) + * remove deprecated functions ``lmfit.printfuncs.report_errors`` + and ``asteval`` argument in ``Parameters`` class (PR #759) + +------------------------------------------------------------------- +Wed Feb 17 11:46:57 UTC 2021 - Ben Greiner + +- Update to version 1.0.2 + * officially supports Python 3.9 and has dropped support for + Python 3.5. The minimum version of the following dependencies + were updated: asteval>=0.9.21, numpy>=1.18, and scipy>=1.3. + New features: + * added two-dimensional Gaussian lineshape and model (PR #642; + @mpmdean) + * all built-in models are now registered in lmfit.models. + lmfit_models; new Model class attribute valid_forms (PR #663; + @rayosborn) + * added a SineModel (PR #676; @lneuhaus) + * add the run_mcmc_kwargs argument to Minimizer.emcee to pass to + the emcee.EnsembleSampler.run_mcmc function (PR #694; @rbnvrw) +- Skip python36 build: Numpy 1.20 dropped support for Python 3.6 + (NEP 29) + +------------------------------------------------------------------- +Tue Jun 16 08:44:01 UTC 2020 - Tomáš Chvátal + +- Skip two failing tests that are borked on non 64bit intel + +------------------------------------------------------------------- +Mon Jun 8 07:06:22 UTC 2020 - John Paul Adrian Glaubitz + +- Update to version 1.0.1 + + New features: + - added thermal distribution model and lineshape (PR #620; @mpmdean) + - introduced a new argument ``max_nfev`` to uniformly specify the maximum + number of function evalutions (PR #610) + **Please note: all other arguments (e.g., ``maxfev``, ``maxiter``, ...) + will no longer be passed to the underlying solver. A warning will be emitted + stating that one should use ``max_nfev``.** + - the attribute ``call_kws`` was added to the ``MinimizerResult`` class and + contains the keyword arguments that are supplied to the solver in SciPy. + + Bug fixes: + - fixes to the ``load`` and ``__setstate__`` methods of the Parameter class + - fixed failure of ModelResult.dump() due to missing attributes + (Issue #611, PR #623; @mpmdean) + - ``guess_from_peak`` function now also works correctly with decreasing + x-values or when using pandas (PRs #627 and #629; @mpmdean) + - the ``Parameter.set()`` method now correctly first updates the boundaries + and then the value (Issue #636, PR #637; @arunpersaud) + + Various: + - fixed typo for the use of expressions in the documentation + (Issue #610; @jkrogager) + - removal of PY2-compatibility and unused code and improved test + coverage (PRs #619, #631, and #633) + - removed deprecated ``isParameter`` function and automatic conversion of + an ``uncertainties`` object (PR #626) + - inaccurate FWHM calculations were removed from built-in models, others + labeled as estimates (Issue #616 and PR #630) + - corrected spelling mistake for the Doniach lineshape and model + (Issue #634; @rayosborn) + - removed unsupported/untested code for IPython notebooks in lmfit/ui/* +- from version 1.0.0 + + New features: + - no new features are introduced in 1.0.0. + + Improvements: + - support for Python 2 and use of the ``six`` package are removed. (PR #612) + + Various: + - documentation updates to clarify the use of ``emcee``. (PR #614) +- from version 0.9.15 + + New features, improvements, and bug fixes: + - move application of parameter bounds to setter instead of getter (PR #587) + - add support for non-array Jacobian types in least_squares + (Issue #588, @ezwelty in PR #589) + - add more information (i.e., acor and acceptance_fraction) about + emcee fit (@j-zimmermann in PR #593) + - "name" is now a required positional argument for Parameter class, + update the magic methods (PR #595) + - fix nvars count and bound handling in confidence interval + calculations (Issue #597, PR #598) + - support Python 3.8; requires asteval >= 0.9.16 (PR #599) + - only support emcee version 3 (i.e., no PTSampler anymore) (PR #600) + - fix and refactor prob_bunc in confidence interval calculations (PR #604) + - fix adding Parameters with custom user-defined symbols + (Issue #607, PR #608; thanks to @gbouvignies for the report) + + Various: + - bump requirements to LTS version of SciPy/ NumPy and code clean-up (PR #591) + - documentation updates (PR #596, and others) + - improve test coverage and Travis CI updates (PR #595, and others) + - update pre-commit hooks and configuration in setup.cfg + + To-be deprecated: + - function Parameter.isParameter and conversion from + uncertainties.core.Variable to value in _getval (PR #595) +- from version 0.9.14 + + New features: + - the global optimizers ``shgo`` and ``dual_annealing`` (new in SciPy v1.2) + are now supported (Issue #527; PRs #545 and #556) + - ``eval`` method added to the Parameter class (PR #550 by @zobristnicholas) + - avoid ZeroDivisionError in ``printfuncs.params_html_table`` + (PR #552 by @aaristov and PR #559) + - add parallelization to ``brute`` method (PR #564, requires SciPy v1.3) + + Bug fixes: + - consider only varying parameters when reporting potential issues with calculating + errorbars (PR #549) and compare ``value`` to both ``min`` and ``max`` (PR #571) + - guard against division by zero in lineshape functions and ``FWHM`` + and ``height`` expression calculations (PR #545) + - fix issues with restoring a saved Model (Issue #553; PR #554) + - always set ``result.method`` for ``emcee`` algorithm (PR #558) + - more careful adding of parameters to handle out-of-order + constraint expressions (Issue #560; PR #561) + - make sure all parameters in Model.guess() use prefixes (PRs #567 and #569) + - use ``inspect.signature`` for PY3 to support wrapped functions + (Issue #570; PR #576) + - fix ``result.nfev``` for ``brute`` method when using parallelization + (Issue #578; PR #579) + + Various: + - remove "missing" in the Model class (replaced by nan_policy) and "drop" + as option to nan_policy (replaced by omit) deprecated since 0.9 (PR #565). + - deprecate 'report_errors' in printfuncs.py (PR #571) + - updates to the documentation to use ``jupyter-sphinx`` to include + examples/output (PRs #573 and #575) + - include a Gallery with examples in the documentation + using ``sphinx-gallery`` (PR #574 and #583) + - improve test-coverage (PRs #571, #572 and #585) + - add/clarify warning messages when NaN values are detected (PR #586) + - several updates to docstrings (Issue #584; PR #583, and others) + - update pre-commit hooks and several docstrings +- Update BuildRequires and Requires from setup.py + +------------------------------------------------------------------- +Wed Apr 24 08:42:15 UTC 2019 - pgajdos@suse.com + +- version update to 0.9.13 + New features: + Clearer warning message in fit reports when uncertainties should + but cannot be estimated, including guesses of which Parameters + to examine (#521, #543) + SplitLorenztianModel and split_lorentzian function (#523) + HTML representations for Parameter, MinimizerResult, and Model + so that they can be printed better with Jupyter (#524, #548) + support parallelization for differential evolution (#526) + Bug fixes: + delay import of matplotlib (and so, the selection of its backend) + as late as possible (#528, #529) + fix for saving, loading, and reloading ModelResults (#534) + fix to leastsq to report the best-fit values, not the values tried + last (#535, #536) + fix synchronization of all parameter values on Model.guess() (#539, #542) + improve deprecation warnings for outdated nan_policy keywords (#540) + fix for edge case in gformat() (#547) + Project managements: + using pre-commit framework to improve and enforce coding style (#533) + added code coverage report to github main page + updated docs, github templates, added several tests. + dropped support and testing for Python 3.4. +- deleted patches + - lmfit-scipy.patch (upstreamed) + +------------------------------------------------------------------- +Tue Mar 5 14:57:02 UTC 2019 - Todd R + +- Fix spurious unit test errors. + +------------------------------------------------------------------- +Fri Jan 18 10:24:44 UTC 2019 - Tomáš Chvátal + +- Apply patch to fix build with new scipy: + * lmfit-scipy.patch + +------------------------------------------------------------------- +Fri Jan 18 10:19:27 UTC 2019 - Tomáš Chvátal + +- Update to 0.9.12: + * make exceptions explicit + * use inspect.getfullargspec for Python3 + * test-suite: use pytest features, improve coverage, fix mistakes + +------------------------------------------------------------------- +Thu Mar 22 04:46:08 UTC 2018 - toddrme2178@gmail.com + +- Initial version diff --git a/python-lmfit.spec b/python-lmfit.spec new file mode 100644 index 0000000..f5095e3 --- /dev/null +++ b/python-lmfit.spec @@ -0,0 +1,105 @@ +# +# spec file for package python-lmfit +# +# 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 +# upon. The license for this file, and modifications and additions to the +# file, is the same license as for the pristine package itself (unless the +# license for the pristine package is not an Open Source License, in which +# case the license is the MIT License). An "Open Source License" is a +# license that conforms to the Open Source Definition (Version 1.9) +# published by the Open Source Initiative. + +# Please submit bugfixes or comments via https://bugs.opensuse.org/ +# + + +Name: python-lmfit +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 +# 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} +BuildRequires: %{python_module wheel} +BuildRequires: fdupes +BuildRequires: python-rpm-macros +Requires: python-asteval >= 0.9.28 +Requires: python-dill >= 0.3.4 +Requires: python-numpy >= 1.23 +Requires: python-scipy >= 1.8 +Requires: python-uncertainties >= 3.1.4 +Recommends: python-emcee +Recommends: python-matplotlib +Recommends: python-pandas +BuildArch: noarch +# SECTION test requirements +BuildRequires: %{python_module asteval >= 0.9.28} +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.8} +BuildRequires: %{python_module uncertainties >= 3.1.4} +# /SECTION +%python_subpackages + +%description +A library for least-squares minimization and data fitting in +Python. Built on top of scipy.optimize, lmfit provides a Parameter object +which can be set as fixed or free, can have upper and/or lower bounds, or +can be written in terms of algebraic constraints of other Parameters. The +user writes a function to be minimized as a function of these Parameters, +and the scipy.optimize methods are used to find the optimal values for the +Parameters. The Levenberg-Marquardt (leastsq) is the default minimization +algorithm, and provides estimated standard errors and correlations between +varied Parameters. Other minimization methods, including Nelder-Mead's +downhill simplex, Powell's method, BFGS, Sequential Least Squares, and +others are also supported. Bounds and constraints can be placed on +Parameters for all of these methods. + +In addition, methods for explicitly calculating confidence intervals are +provided for exploring minmization problems where the approximation of +estimating Parameter uncertainties from the covariance matrix is +questionable. + +%prep +%autosetup -p1 -n lmfit-%{version} +sed -i -e '/^#!\//, 1d' lmfit/jsonutils.py + +%build +%pyproject_wheel + +%install +%pyproject_install +%python_expand %fdupes %{buildroot}%{$python_sitelib} + +%check +# We don't care about speed on obs +donttest="speed" +# these tests fail on non x86_64. Upstream does not care: https://github.com/lmfit/lmfit-py/issues/692 +donttest+=" or test_model_nan_policy" +donttest+=" or test_shgo_scipy_vs_lmfit_2" +# fails on 32-bit +if [ $(getconf LONG_BIT) -ne 64 ]; then + donttest+=" or (test_itercb_minimizer_class and leastsq and False)" + donttest+=" or (test_aborted_solvers and brute)" +fi +%pytest -k "not ($donttest)" + +%files %{python_files} +%doc README.rst AUTHORS.txt +%license LICENSE +%{python_sitelib}/lmfit +%{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