scipy 1.16.2__cp311-cp311-win_arm64.whl
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.
- scipy/__config__.py +161 -0
- scipy/__init__.py +150 -0
- scipy/_cyutility.cp311-win_arm64.lib +0 -0
- scipy/_cyutility.cp311-win_arm64.pyd +0 -0
- scipy/_distributor_init.py +18 -0
- scipy/_lib/__init__.py +14 -0
- scipy/_lib/_array_api.py +931 -0
- scipy/_lib/_array_api_compat_vendor.py +9 -0
- scipy/_lib/_array_api_no_0d.py +103 -0
- scipy/_lib/_bunch.py +229 -0
- scipy/_lib/_ccallback.py +251 -0
- scipy/_lib/_ccallback_c.cp311-win_arm64.lib +0 -0
- scipy/_lib/_ccallback_c.cp311-win_arm64.pyd +0 -0
- scipy/_lib/_disjoint_set.py +254 -0
- scipy/_lib/_docscrape.py +761 -0
- scipy/_lib/_elementwise_iterative_method.py +346 -0
- scipy/_lib/_fpumode.cp311-win_arm64.lib +0 -0
- scipy/_lib/_fpumode.cp311-win_arm64.pyd +0 -0
- scipy/_lib/_gcutils.py +105 -0
- scipy/_lib/_pep440.py +487 -0
- scipy/_lib/_sparse.py +41 -0
- scipy/_lib/_test_ccallback.cp311-win_arm64.lib +0 -0
- scipy/_lib/_test_ccallback.cp311-win_arm64.pyd +0 -0
- scipy/_lib/_test_deprecation_call.cp311-win_arm64.lib +0 -0
- scipy/_lib/_test_deprecation_call.cp311-win_arm64.pyd +0 -0
- scipy/_lib/_test_deprecation_def.cp311-win_arm64.lib +0 -0
- scipy/_lib/_test_deprecation_def.cp311-win_arm64.pyd +0 -0
- scipy/_lib/_testutils.py +373 -0
- scipy/_lib/_threadsafety.py +58 -0
- scipy/_lib/_tmpdirs.py +86 -0
- scipy/_lib/_uarray/LICENSE +29 -0
- scipy/_lib/_uarray/__init__.py +116 -0
- scipy/_lib/_uarray/_backend.py +707 -0
- scipy/_lib/_uarray/_uarray.cp311-win_arm64.lib +0 -0
- scipy/_lib/_uarray/_uarray.cp311-win_arm64.pyd +0 -0
- scipy/_lib/_util.py +1283 -0
- scipy/_lib/array_api_compat/__init__.py +22 -0
- scipy/_lib/array_api_compat/_internal.py +59 -0
- scipy/_lib/array_api_compat/common/__init__.py +1 -0
- scipy/_lib/array_api_compat/common/_aliases.py +727 -0
- scipy/_lib/array_api_compat/common/_fft.py +213 -0
- scipy/_lib/array_api_compat/common/_helpers.py +1058 -0
- scipy/_lib/array_api_compat/common/_linalg.py +232 -0
- scipy/_lib/array_api_compat/common/_typing.py +192 -0
- scipy/_lib/array_api_compat/cupy/__init__.py +13 -0
- scipy/_lib/array_api_compat/cupy/_aliases.py +156 -0
- scipy/_lib/array_api_compat/cupy/_info.py +336 -0
- scipy/_lib/array_api_compat/cupy/_typing.py +31 -0
- scipy/_lib/array_api_compat/cupy/fft.py +36 -0
- scipy/_lib/array_api_compat/cupy/linalg.py +49 -0
- scipy/_lib/array_api_compat/dask/__init__.py +0 -0
- scipy/_lib/array_api_compat/dask/array/__init__.py +12 -0
- scipy/_lib/array_api_compat/dask/array/_aliases.py +376 -0
- scipy/_lib/array_api_compat/dask/array/_info.py +416 -0
- scipy/_lib/array_api_compat/dask/array/fft.py +21 -0
- scipy/_lib/array_api_compat/dask/array/linalg.py +72 -0
- scipy/_lib/array_api_compat/numpy/__init__.py +28 -0
- scipy/_lib/array_api_compat/numpy/_aliases.py +190 -0
- scipy/_lib/array_api_compat/numpy/_info.py +366 -0
- scipy/_lib/array_api_compat/numpy/_typing.py +30 -0
- scipy/_lib/array_api_compat/numpy/fft.py +35 -0
- scipy/_lib/array_api_compat/numpy/linalg.py +143 -0
- scipy/_lib/array_api_compat/torch/__init__.py +22 -0
- scipy/_lib/array_api_compat/torch/_aliases.py +855 -0
- scipy/_lib/array_api_compat/torch/_info.py +369 -0
- scipy/_lib/array_api_compat/torch/_typing.py +3 -0
- scipy/_lib/array_api_compat/torch/fft.py +85 -0
- scipy/_lib/array_api_compat/torch/linalg.py +121 -0
- scipy/_lib/array_api_extra/__init__.py +38 -0
- scipy/_lib/array_api_extra/_delegation.py +171 -0
- scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
- scipy/_lib/array_api_extra/_lib/_at.py +463 -0
- scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
- scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
- scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
- scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
- scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
- scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
- scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
- scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
- scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
- scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
- scipy/_lib/array_api_extra/testing.py +359 -0
- scipy/_lib/cobyqa/__init__.py +20 -0
- scipy/_lib/cobyqa/framework.py +1240 -0
- scipy/_lib/cobyqa/main.py +1506 -0
- scipy/_lib/cobyqa/models.py +1529 -0
- scipy/_lib/cobyqa/problem.py +1296 -0
- scipy/_lib/cobyqa/settings.py +132 -0
- scipy/_lib/cobyqa/subsolvers/__init__.py +14 -0
- scipy/_lib/cobyqa/subsolvers/geometry.py +387 -0
- scipy/_lib/cobyqa/subsolvers/optim.py +1203 -0
- scipy/_lib/cobyqa/utils/__init__.py +18 -0
- scipy/_lib/cobyqa/utils/exceptions.py +22 -0
- scipy/_lib/cobyqa/utils/math.py +77 -0
- scipy/_lib/cobyqa/utils/versions.py +67 -0
- scipy/_lib/decorator.py +399 -0
- scipy/_lib/deprecation.py +274 -0
- scipy/_lib/doccer.py +366 -0
- scipy/_lib/messagestream.cp311-win_arm64.lib +0 -0
- scipy/_lib/messagestream.cp311-win_arm64.pyd +0 -0
- scipy/_lib/pyprima/__init__.py +212 -0
- scipy/_lib/pyprima/cobyla/__init__.py +0 -0
- scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
- scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
- scipy/_lib/pyprima/cobyla/geometry.py +226 -0
- scipy/_lib/pyprima/cobyla/initialize.py +215 -0
- scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
- scipy/_lib/pyprima/cobyla/update.py +289 -0
- scipy/_lib/pyprima/common/__init__.py +0 -0
- scipy/_lib/pyprima/common/_bounds.py +34 -0
- scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
- scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
- scipy/_lib/pyprima/common/_project.py +173 -0
- scipy/_lib/pyprima/common/checkbreak.py +93 -0
- scipy/_lib/pyprima/common/consts.py +47 -0
- scipy/_lib/pyprima/common/evaluate.py +99 -0
- scipy/_lib/pyprima/common/history.py +38 -0
- scipy/_lib/pyprima/common/infos.py +30 -0
- scipy/_lib/pyprima/common/linalg.py +435 -0
- scipy/_lib/pyprima/common/message.py +290 -0
- scipy/_lib/pyprima/common/powalg.py +131 -0
- scipy/_lib/pyprima/common/preproc.py +277 -0
- scipy/_lib/pyprima/common/present.py +5 -0
- scipy/_lib/pyprima/common/ratio.py +54 -0
- scipy/_lib/pyprima/common/redrho.py +47 -0
- scipy/_lib/pyprima/common/selectx.py +296 -0
- scipy/_lib/tests/__init__.py +0 -0
- scipy/_lib/tests/test__gcutils.py +110 -0
- scipy/_lib/tests/test__pep440.py +67 -0
- scipy/_lib/tests/test__testutils.py +32 -0
- scipy/_lib/tests/test__threadsafety.py +51 -0
- scipy/_lib/tests/test__util.py +641 -0
- scipy/_lib/tests/test_array_api.py +322 -0
- scipy/_lib/tests/test_bunch.py +169 -0
- scipy/_lib/tests/test_ccallback.py +196 -0
- scipy/_lib/tests/test_config.py +45 -0
- scipy/_lib/tests/test_deprecation.py +10 -0
- scipy/_lib/tests/test_doccer.py +143 -0
- scipy/_lib/tests/test_import_cycles.py +18 -0
- scipy/_lib/tests/test_public_api.py +482 -0
- scipy/_lib/tests/test_scipy_version.py +28 -0
- scipy/_lib/tests/test_tmpdirs.py +48 -0
- scipy/_lib/tests/test_warnings.py +137 -0
- scipy/_lib/uarray.py +31 -0
- scipy/cluster/__init__.py +31 -0
- scipy/cluster/_hierarchy.cp311-win_arm64.lib +0 -0
- scipy/cluster/_hierarchy.cp311-win_arm64.pyd +0 -0
- scipy/cluster/_optimal_leaf_ordering.cp311-win_arm64.lib +0 -0
- scipy/cluster/_optimal_leaf_ordering.cp311-win_arm64.pyd +0 -0
- scipy/cluster/_vq.cp311-win_arm64.lib +0 -0
- scipy/cluster/_vq.cp311-win_arm64.pyd +0 -0
- scipy/cluster/hierarchy.py +4348 -0
- scipy/cluster/tests/__init__.py +0 -0
- scipy/cluster/tests/hierarchy_test_data.py +145 -0
- scipy/cluster/tests/test_disjoint_set.py +202 -0
- scipy/cluster/tests/test_hierarchy.py +1238 -0
- scipy/cluster/tests/test_vq.py +434 -0
- scipy/cluster/vq.py +832 -0
- scipy/conftest.py +683 -0
- scipy/constants/__init__.py +358 -0
- scipy/constants/_codata.py +2266 -0
- scipy/constants/_constants.py +369 -0
- scipy/constants/codata.py +21 -0
- scipy/constants/constants.py +53 -0
- scipy/constants/tests/__init__.py +0 -0
- scipy/constants/tests/test_codata.py +78 -0
- scipy/constants/tests/test_constants.py +83 -0
- scipy/datasets/__init__.py +90 -0
- scipy/datasets/_download_all.py +71 -0
- scipy/datasets/_fetchers.py +225 -0
- scipy/datasets/_registry.py +26 -0
- scipy/datasets/_utils.py +81 -0
- scipy/datasets/tests/__init__.py +0 -0
- scipy/datasets/tests/test_data.py +128 -0
- scipy/differentiate/__init__.py +27 -0
- scipy/differentiate/_differentiate.py +1129 -0
- scipy/differentiate/tests/__init__.py +0 -0
- scipy/differentiate/tests/test_differentiate.py +694 -0
- scipy/fft/__init__.py +114 -0
- scipy/fft/_backend.py +196 -0
- scipy/fft/_basic.py +1650 -0
- scipy/fft/_basic_backend.py +197 -0
- scipy/fft/_debug_backends.py +22 -0
- scipy/fft/_fftlog.py +223 -0
- scipy/fft/_fftlog_backend.py +200 -0
- scipy/fft/_helper.py +348 -0
- scipy/fft/_pocketfft/LICENSE.md +25 -0
- scipy/fft/_pocketfft/__init__.py +9 -0
- scipy/fft/_pocketfft/basic.py +251 -0
- scipy/fft/_pocketfft/helper.py +249 -0
- scipy/fft/_pocketfft/pypocketfft.cp311-win_arm64.lib +0 -0
- scipy/fft/_pocketfft/pypocketfft.cp311-win_arm64.pyd +0 -0
- scipy/fft/_pocketfft/realtransforms.py +109 -0
- scipy/fft/_pocketfft/tests/__init__.py +0 -0
- scipy/fft/_pocketfft/tests/test_basic.py +1011 -0
- scipy/fft/_pocketfft/tests/test_real_transforms.py +505 -0
- scipy/fft/_realtransforms.py +706 -0
- scipy/fft/_realtransforms_backend.py +63 -0
- scipy/fft/tests/__init__.py +0 -0
- scipy/fft/tests/mock_backend.py +96 -0
- scipy/fft/tests/test_backend.py +98 -0
- scipy/fft/tests/test_basic.py +504 -0
- scipy/fft/tests/test_fftlog.py +215 -0
- scipy/fft/tests/test_helper.py +558 -0
- scipy/fft/tests/test_multithreading.py +84 -0
- scipy/fft/tests/test_real_transforms.py +247 -0
- scipy/fftpack/__init__.py +103 -0
- scipy/fftpack/_basic.py +428 -0
- scipy/fftpack/_helper.py +115 -0
- scipy/fftpack/_pseudo_diffs.py +554 -0
- scipy/fftpack/_realtransforms.py +598 -0
- scipy/fftpack/basic.py +20 -0
- scipy/fftpack/convolve.cp311-win_arm64.lib +0 -0
- scipy/fftpack/convolve.cp311-win_arm64.pyd +0 -0
- scipy/fftpack/helper.py +19 -0
- scipy/fftpack/pseudo_diffs.py +22 -0
- scipy/fftpack/realtransforms.py +19 -0
- scipy/fftpack/tests/__init__.py +0 -0
- scipy/fftpack/tests/fftw_double_ref.npz +0 -0
- scipy/fftpack/tests/fftw_longdouble_ref.npz +0 -0
- scipy/fftpack/tests/fftw_single_ref.npz +0 -0
- scipy/fftpack/tests/test.npz +0 -0
- scipy/fftpack/tests/test_basic.py +877 -0
- scipy/fftpack/tests/test_helper.py +54 -0
- scipy/fftpack/tests/test_import.py +33 -0
- scipy/fftpack/tests/test_pseudo_diffs.py +388 -0
- scipy/fftpack/tests/test_real_transforms.py +836 -0
- scipy/integrate/__init__.py +122 -0
- scipy/integrate/_bvp.py +1160 -0
- scipy/integrate/_cubature.py +729 -0
- scipy/integrate/_dop.cp311-win_arm64.lib +0 -0
- scipy/integrate/_dop.cp311-win_arm64.pyd +0 -0
- scipy/integrate/_ivp/__init__.py +8 -0
- scipy/integrate/_ivp/base.py +290 -0
- scipy/integrate/_ivp/bdf.py +478 -0
- scipy/integrate/_ivp/common.py +451 -0
- scipy/integrate/_ivp/dop853_coefficients.py +193 -0
- scipy/integrate/_ivp/ivp.py +755 -0
- scipy/integrate/_ivp/lsoda.py +224 -0
- scipy/integrate/_ivp/radau.py +572 -0
- scipy/integrate/_ivp/rk.py +601 -0
- scipy/integrate/_ivp/tests/__init__.py +0 -0
- scipy/integrate/_ivp/tests/test_ivp.py +1287 -0
- scipy/integrate/_ivp/tests/test_rk.py +37 -0
- scipy/integrate/_lebedev.py +5450 -0
- scipy/integrate/_lsoda.cp311-win_arm64.lib +0 -0
- scipy/integrate/_lsoda.cp311-win_arm64.pyd +0 -0
- scipy/integrate/_ode.py +1395 -0
- scipy/integrate/_odepack.cp311-win_arm64.lib +0 -0
- scipy/integrate/_odepack.cp311-win_arm64.pyd +0 -0
- scipy/integrate/_odepack_py.py +273 -0
- scipy/integrate/_quad_vec.py +674 -0
- scipy/integrate/_quadpack.cp311-win_arm64.lib +0 -0
- scipy/integrate/_quadpack.cp311-win_arm64.pyd +0 -0
- scipy/integrate/_quadpack_py.py +1283 -0
- scipy/integrate/_quadrature.py +1336 -0
- scipy/integrate/_rules/__init__.py +12 -0
- scipy/integrate/_rules/_base.py +518 -0
- scipy/integrate/_rules/_gauss_kronrod.py +202 -0
- scipy/integrate/_rules/_gauss_legendre.py +62 -0
- scipy/integrate/_rules/_genz_malik.py +210 -0
- scipy/integrate/_tanhsinh.py +1385 -0
- scipy/integrate/_test_multivariate.cp311-win_arm64.lib +0 -0
- scipy/integrate/_test_multivariate.cp311-win_arm64.pyd +0 -0
- scipy/integrate/_test_odeint_banded.cp311-win_arm64.lib +0 -0
- scipy/integrate/_test_odeint_banded.cp311-win_arm64.pyd +0 -0
- scipy/integrate/_vode.cp311-win_arm64.lib +0 -0
- scipy/integrate/_vode.cp311-win_arm64.pyd +0 -0
- scipy/integrate/dop.py +15 -0
- scipy/integrate/lsoda.py +15 -0
- scipy/integrate/odepack.py +17 -0
- scipy/integrate/quadpack.py +23 -0
- scipy/integrate/tests/__init__.py +0 -0
- scipy/integrate/tests/test__quad_vec.py +211 -0
- scipy/integrate/tests/test_banded_ode_solvers.py +305 -0
- scipy/integrate/tests/test_bvp.py +714 -0
- scipy/integrate/tests/test_cubature.py +1375 -0
- scipy/integrate/tests/test_integrate.py +840 -0
- scipy/integrate/tests/test_odeint_jac.py +74 -0
- scipy/integrate/tests/test_quadpack.py +680 -0
- scipy/integrate/tests/test_quadrature.py +730 -0
- scipy/integrate/tests/test_tanhsinh.py +1171 -0
- scipy/integrate/vode.py +15 -0
- scipy/interpolate/__init__.py +228 -0
- scipy/interpolate/_bary_rational.py +715 -0
- scipy/interpolate/_bsplines.py +2469 -0
- scipy/interpolate/_cubic.py +973 -0
- scipy/interpolate/_dfitpack.cp311-win_arm64.lib +0 -0
- scipy/interpolate/_dfitpack.cp311-win_arm64.pyd +0 -0
- scipy/interpolate/_dierckx.cp311-win_arm64.lib +0 -0
- scipy/interpolate/_dierckx.cp311-win_arm64.pyd +0 -0
- scipy/interpolate/_fitpack.cp311-win_arm64.lib +0 -0
- scipy/interpolate/_fitpack.cp311-win_arm64.pyd +0 -0
- scipy/interpolate/_fitpack2.py +2397 -0
- scipy/interpolate/_fitpack_impl.py +811 -0
- scipy/interpolate/_fitpack_py.py +898 -0
- scipy/interpolate/_fitpack_repro.py +996 -0
- scipy/interpolate/_interpnd.cp311-win_arm64.lib +0 -0
- scipy/interpolate/_interpnd.cp311-win_arm64.pyd +0 -0
- scipy/interpolate/_interpolate.py +2266 -0
- scipy/interpolate/_ndbspline.py +415 -0
- scipy/interpolate/_ndgriddata.py +329 -0
- scipy/interpolate/_pade.py +67 -0
- scipy/interpolate/_polyint.py +1025 -0
- scipy/interpolate/_ppoly.cp311-win_arm64.lib +0 -0
- scipy/interpolate/_ppoly.cp311-win_arm64.pyd +0 -0
- scipy/interpolate/_rbf.py +290 -0
- scipy/interpolate/_rbfinterp.py +550 -0
- scipy/interpolate/_rbfinterp_pythran.cp311-win_arm64.lib +0 -0
- scipy/interpolate/_rbfinterp_pythran.cp311-win_arm64.pyd +0 -0
- scipy/interpolate/_rgi.py +764 -0
- scipy/interpolate/_rgi_cython.cp311-win_arm64.lib +0 -0
- scipy/interpolate/_rgi_cython.cp311-win_arm64.pyd +0 -0
- scipy/interpolate/dfitpack.py +24 -0
- scipy/interpolate/fitpack.py +31 -0
- scipy/interpolate/fitpack2.py +29 -0
- scipy/interpolate/interpnd.py +24 -0
- scipy/interpolate/interpolate.py +30 -0
- scipy/interpolate/ndgriddata.py +23 -0
- scipy/interpolate/polyint.py +24 -0
- scipy/interpolate/rbf.py +18 -0
- scipy/interpolate/tests/__init__.py +0 -0
- scipy/interpolate/tests/data/bug-1310.npz +0 -0
- scipy/interpolate/tests/data/estimate_gradients_hang.npy +0 -0
- scipy/interpolate/tests/data/gcvspl.npz +0 -0
- scipy/interpolate/tests/test_bary_rational.py +368 -0
- scipy/interpolate/tests/test_bsplines.py +3754 -0
- scipy/interpolate/tests/test_fitpack.py +519 -0
- scipy/interpolate/tests/test_fitpack2.py +1431 -0
- scipy/interpolate/tests/test_gil.py +64 -0
- scipy/interpolate/tests/test_interpnd.py +452 -0
- scipy/interpolate/tests/test_interpolate.py +2630 -0
- scipy/interpolate/tests/test_ndgriddata.py +308 -0
- scipy/interpolate/tests/test_pade.py +107 -0
- scipy/interpolate/tests/test_polyint.py +972 -0
- scipy/interpolate/tests/test_rbf.py +246 -0
- scipy/interpolate/tests/test_rbfinterp.py +534 -0
- scipy/interpolate/tests/test_rgi.py +1151 -0
- scipy/io/__init__.py +116 -0
- scipy/io/_fast_matrix_market/__init__.py +600 -0
- scipy/io/_fast_matrix_market/_fmm_core.cp311-win_arm64.lib +0 -0
- scipy/io/_fast_matrix_market/_fmm_core.cp311-win_arm64.pyd +0 -0
- scipy/io/_fortran.py +354 -0
- scipy/io/_harwell_boeing/__init__.py +7 -0
- scipy/io/_harwell_boeing/_fortran_format_parser.py +316 -0
- scipy/io/_harwell_boeing/hb.py +571 -0
- scipy/io/_harwell_boeing/tests/__init__.py +0 -0
- scipy/io/_harwell_boeing/tests/test_fortran_format.py +74 -0
- scipy/io/_harwell_boeing/tests/test_hb.py +70 -0
- scipy/io/_idl.py +917 -0
- scipy/io/_mmio.py +968 -0
- scipy/io/_netcdf.py +1104 -0
- scipy/io/_test_fortran.cp311-win_arm64.lib +0 -0
- scipy/io/_test_fortran.cp311-win_arm64.pyd +0 -0
- scipy/io/arff/__init__.py +28 -0
- scipy/io/arff/_arffread.py +873 -0
- scipy/io/arff/arffread.py +19 -0
- scipy/io/arff/tests/__init__.py +0 -0
- scipy/io/arff/tests/data/iris.arff +225 -0
- scipy/io/arff/tests/data/missing.arff +8 -0
- scipy/io/arff/tests/data/nodata.arff +11 -0
- scipy/io/arff/tests/data/quoted_nominal.arff +13 -0
- scipy/io/arff/tests/data/quoted_nominal_spaces.arff +13 -0
- scipy/io/arff/tests/data/test1.arff +10 -0
- scipy/io/arff/tests/data/test10.arff +8 -0
- scipy/io/arff/tests/data/test11.arff +11 -0
- scipy/io/arff/tests/data/test2.arff +15 -0
- scipy/io/arff/tests/data/test3.arff +6 -0
- scipy/io/arff/tests/data/test4.arff +11 -0
- scipy/io/arff/tests/data/test5.arff +26 -0
- scipy/io/arff/tests/data/test6.arff +12 -0
- scipy/io/arff/tests/data/test7.arff +15 -0
- scipy/io/arff/tests/data/test8.arff +12 -0
- scipy/io/arff/tests/data/test9.arff +14 -0
- scipy/io/arff/tests/test_arffread.py +421 -0
- scipy/io/harwell_boeing.py +17 -0
- scipy/io/idl.py +17 -0
- scipy/io/matlab/__init__.py +66 -0
- scipy/io/matlab/_byteordercodes.py +75 -0
- scipy/io/matlab/_mio.py +375 -0
- scipy/io/matlab/_mio4.py +632 -0
- scipy/io/matlab/_mio5.py +901 -0
- scipy/io/matlab/_mio5_params.py +281 -0
- scipy/io/matlab/_mio5_utils.cp311-win_arm64.lib +0 -0
- scipy/io/matlab/_mio5_utils.cp311-win_arm64.pyd +0 -0
- scipy/io/matlab/_mio_utils.cp311-win_arm64.lib +0 -0
- scipy/io/matlab/_mio_utils.cp311-win_arm64.pyd +0 -0
- scipy/io/matlab/_miobase.py +435 -0
- scipy/io/matlab/_streams.cp311-win_arm64.lib +0 -0
- scipy/io/matlab/_streams.cp311-win_arm64.pyd +0 -0
- scipy/io/matlab/byteordercodes.py +17 -0
- scipy/io/matlab/mio.py +16 -0
- scipy/io/matlab/mio4.py +17 -0
- scipy/io/matlab/mio5.py +19 -0
- scipy/io/matlab/mio5_params.py +18 -0
- scipy/io/matlab/mio5_utils.py +17 -0
- scipy/io/matlab/mio_utils.py +17 -0
- scipy/io/matlab/miobase.py +16 -0
- scipy/io/matlab/streams.py +16 -0
- scipy/io/matlab/tests/__init__.py +0 -0
- scipy/io/matlab/tests/data/bad_miuint32.mat +0 -0
- scipy/io/matlab/tests/data/bad_miutf8_array_name.mat +0 -0
- scipy/io/matlab/tests/data/big_endian.mat +0 -0
- scipy/io/matlab/tests/data/broken_utf8.mat +0 -0
- scipy/io/matlab/tests/data/corrupted_zlib_checksum.mat +0 -0
- scipy/io/matlab/tests/data/corrupted_zlib_data.mat +0 -0
- scipy/io/matlab/tests/data/debigged_m4.mat +0 -0
- scipy/io/matlab/tests/data/japanese_utf8.txt +5 -0
- scipy/io/matlab/tests/data/little_endian.mat +0 -0
- scipy/io/matlab/tests/data/logical_sparse.mat +0 -0
- scipy/io/matlab/tests/data/malformed1.mat +0 -0
- scipy/io/matlab/tests/data/miuint32_for_miint32.mat +0 -0
- scipy/io/matlab/tests/data/miutf8_array_name.mat +0 -0
- scipy/io/matlab/tests/data/nasty_duplicate_fieldnames.mat +0 -0
- scipy/io/matlab/tests/data/one_by_zero_char.mat +0 -0
- scipy/io/matlab/tests/data/parabola.mat +0 -0
- scipy/io/matlab/tests/data/single_empty_string.mat +0 -0
- scipy/io/matlab/tests/data/some_functions.mat +0 -0
- scipy/io/matlab/tests/data/sqr.mat +0 -0
- scipy/io/matlab/tests/data/test3dmatrix_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/test3dmatrix_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/test3dmatrix_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/test3dmatrix_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/test_empty_struct.mat +0 -0
- scipy/io/matlab/tests/data/test_mat4_le_floats.mat +0 -0
- scipy/io/matlab/tests/data/test_skip_variable.mat +0 -0
- scipy/io/matlab/tests/data/testbool_8_WIN64.mat +0 -0
- scipy/io/matlab/tests/data/testcell_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testcell_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcell_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcell_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcellnest_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testcellnest_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcellnest_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcellnest_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcomplex_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testcomplex_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testcomplex_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcomplex_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcomplex_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testdouble_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testdouble_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testdouble_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testdouble_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testdouble_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testemptycell_5.3_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testemptycell_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testemptycell_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testemptycell_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testfunc_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testhdf5_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testmatrix_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testmatrix_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testmatrix_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testmatrix_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testmatrix_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testminus_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testminus_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testminus_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testminus_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testminus_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testmulti_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testmulti_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testmulti_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testobject_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testobject_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testobject_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testobject_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testonechar_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testonechar_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testonechar_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testonechar_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testonechar_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testscalarcell_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsimplecell.mat +0 -0
- scipy/io/matlab/tests/data/testsparse_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testsparse_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testsparse_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsparse_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsparse_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsparsecomplex_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testsparsecomplex_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testsparsecomplex_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsparsecomplex_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsparsecomplex_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsparsefloat_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststring_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststring_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststring_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststring_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststring_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststringarray_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststringarray_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststringarray_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststringarray_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststringarray_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststruct_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststruct_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststruct_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststruct_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststructarr_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststructarr_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststructarr_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststructarr_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststructnest_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststructnest_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststructnest_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststructnest_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testunicode_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testunicode_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testvec_4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/test_byteordercodes.py +29 -0
- scipy/io/matlab/tests/test_mio.py +1399 -0
- scipy/io/matlab/tests/test_mio5_utils.py +179 -0
- scipy/io/matlab/tests/test_mio_funcs.py +51 -0
- scipy/io/matlab/tests/test_mio_utils.py +45 -0
- scipy/io/matlab/tests/test_miobase.py +32 -0
- scipy/io/matlab/tests/test_pathological.py +33 -0
- scipy/io/matlab/tests/test_streams.py +241 -0
- scipy/io/mmio.py +17 -0
- scipy/io/netcdf.py +17 -0
- scipy/io/tests/__init__.py +0 -0
- scipy/io/tests/data/Transparent Busy.ani +0 -0
- scipy/io/tests/data/array_float32_1d.sav +0 -0
- scipy/io/tests/data/array_float32_2d.sav +0 -0
- scipy/io/tests/data/array_float32_3d.sav +0 -0
- scipy/io/tests/data/array_float32_4d.sav +0 -0
- scipy/io/tests/data/array_float32_5d.sav +0 -0
- scipy/io/tests/data/array_float32_6d.sav +0 -0
- scipy/io/tests/data/array_float32_7d.sav +0 -0
- scipy/io/tests/data/array_float32_8d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_1d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_2d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_3d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_4d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_5d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_6d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_7d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_8d.sav +0 -0
- scipy/io/tests/data/example_1.nc +0 -0
- scipy/io/tests/data/example_2.nc +0 -0
- scipy/io/tests/data/example_3_maskedvals.nc +0 -0
- scipy/io/tests/data/fortran-3x3d-2i.dat +0 -0
- scipy/io/tests/data/fortran-mixed.dat +0 -0
- scipy/io/tests/data/fortran-sf8-11x1x10.dat +0 -0
- scipy/io/tests/data/fortran-sf8-15x10x22.dat +0 -0
- scipy/io/tests/data/fortran-sf8-1x1x1.dat +0 -0
- scipy/io/tests/data/fortran-sf8-1x1x5.dat +0 -0
- scipy/io/tests/data/fortran-sf8-1x1x7.dat +0 -0
- scipy/io/tests/data/fortran-sf8-1x3x5.dat +0 -0
- scipy/io/tests/data/fortran-si4-11x1x10.dat +0 -0
- scipy/io/tests/data/fortran-si4-15x10x22.dat +0 -0
- scipy/io/tests/data/fortran-si4-1x1x1.dat +0 -0
- scipy/io/tests/data/fortran-si4-1x1x5.dat +0 -0
- scipy/io/tests/data/fortran-si4-1x1x7.dat +0 -0
- scipy/io/tests/data/fortran-si4-1x3x5.dat +0 -0
- scipy/io/tests/data/invalid_pointer.sav +0 -0
- scipy/io/tests/data/null_pointer.sav +0 -0
- scipy/io/tests/data/scalar_byte.sav +0 -0
- scipy/io/tests/data/scalar_byte_descr.sav +0 -0
- scipy/io/tests/data/scalar_complex32.sav +0 -0
- scipy/io/tests/data/scalar_complex64.sav +0 -0
- scipy/io/tests/data/scalar_float32.sav +0 -0
- scipy/io/tests/data/scalar_float64.sav +0 -0
- scipy/io/tests/data/scalar_heap_pointer.sav +0 -0
- scipy/io/tests/data/scalar_int16.sav +0 -0
- scipy/io/tests/data/scalar_int32.sav +0 -0
- scipy/io/tests/data/scalar_int64.sav +0 -0
- scipy/io/tests/data/scalar_string.sav +0 -0
- scipy/io/tests/data/scalar_uint16.sav +0 -0
- scipy/io/tests/data/scalar_uint32.sav +0 -0
- scipy/io/tests/data/scalar_uint64.sav +0 -0
- scipy/io/tests/data/struct_arrays.sav +0 -0
- scipy/io/tests/data/struct_arrays_byte_idl80.sav +0 -0
- scipy/io/tests/data/struct_arrays_replicated.sav +0 -0
- scipy/io/tests/data/struct_arrays_replicated_3d.sav +0 -0
- scipy/io/tests/data/struct_inherit.sav +0 -0
- scipy/io/tests/data/struct_pointer_arrays.sav +0 -0
- scipy/io/tests/data/struct_pointer_arrays_replicated.sav +0 -0
- scipy/io/tests/data/struct_pointer_arrays_replicated_3d.sav +0 -0
- scipy/io/tests/data/struct_pointers.sav +0 -0
- scipy/io/tests/data/struct_pointers_replicated.sav +0 -0
- scipy/io/tests/data/struct_pointers_replicated_3d.sav +0 -0
- scipy/io/tests/data/struct_scalars.sav +0 -0
- scipy/io/tests/data/struct_scalars_replicated.sav +0 -0
- scipy/io/tests/data/struct_scalars_replicated_3d.sav +0 -0
- scipy/io/tests/data/test-1234Hz-le-1ch-10S-20bit-extra.wav +0 -0
- scipy/io/tests/data/test-44100Hz-2ch-32bit-float-be.wav +0 -0
- scipy/io/tests/data/test-44100Hz-2ch-32bit-float-le.wav +0 -0
- scipy/io/tests/data/test-44100Hz-be-1ch-4bytes.wav +0 -0
- scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-early-eof-no-data.wav +0 -0
- scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-early-eof.wav +0 -0
- scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-incomplete-chunk.wav +0 -0
- scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-rf64.wav +0 -0
- scipy/io/tests/data/test-44100Hz-le-1ch-4bytes.wav +0 -0
- scipy/io/tests/data/test-48000Hz-2ch-64bit-float-le-wavex.wav +0 -0
- scipy/io/tests/data/test-8000Hz-be-3ch-5S-24bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-1ch-1byte-ulaw.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-2ch-1byteu.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit-inconsistent.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit-rf64.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-36bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-45bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-53bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-64bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-4ch-9S-12bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-5ch-9S-5bit.wav +0 -0
- scipy/io/tests/data/various_compressed.sav +0 -0
- scipy/io/tests/test_fortran.py +264 -0
- scipy/io/tests/test_idl.py +483 -0
- scipy/io/tests/test_mmio.py +831 -0
- scipy/io/tests/test_netcdf.py +550 -0
- scipy/io/tests/test_paths.py +93 -0
- scipy/io/tests/test_wavfile.py +501 -0
- scipy/io/wavfile.py +938 -0
- scipy/linalg/__init__.pxd +1 -0
- scipy/linalg/__init__.py +236 -0
- scipy/linalg/_basic.py +2146 -0
- scipy/linalg/_blas_subroutines.h +164 -0
- scipy/linalg/_cythonized_array_utils.cp311-win_arm64.lib +0 -0
- scipy/linalg/_cythonized_array_utils.cp311-win_arm64.pyd +0 -0
- scipy/linalg/_cythonized_array_utils.pxd +40 -0
- scipy/linalg/_cythonized_array_utils.pyi +16 -0
- scipy/linalg/_decomp.py +1645 -0
- scipy/linalg/_decomp_cholesky.py +413 -0
- scipy/linalg/_decomp_cossin.py +236 -0
- scipy/linalg/_decomp_interpolative.cp311-win_arm64.lib +0 -0
- scipy/linalg/_decomp_interpolative.cp311-win_arm64.pyd +0 -0
- scipy/linalg/_decomp_ldl.py +356 -0
- scipy/linalg/_decomp_lu.py +401 -0
- scipy/linalg/_decomp_lu_cython.cp311-win_arm64.lib +0 -0
- scipy/linalg/_decomp_lu_cython.cp311-win_arm64.pyd +0 -0
- scipy/linalg/_decomp_lu_cython.pyi +6 -0
- scipy/linalg/_decomp_polar.py +113 -0
- scipy/linalg/_decomp_qr.py +494 -0
- scipy/linalg/_decomp_qz.py +452 -0
- scipy/linalg/_decomp_schur.py +336 -0
- scipy/linalg/_decomp_svd.py +545 -0
- scipy/linalg/_decomp_update.cp311-win_arm64.lib +0 -0
- scipy/linalg/_decomp_update.cp311-win_arm64.pyd +0 -0
- scipy/linalg/_expm_frechet.py +417 -0
- scipy/linalg/_fblas.cp311-win_arm64.lib +0 -0
- scipy/linalg/_fblas.cp311-win_arm64.pyd +0 -0
- scipy/linalg/_flapack.cp311-win_arm64.lib +0 -0
- scipy/linalg/_flapack.cp311-win_arm64.pyd +0 -0
- scipy/linalg/_lapack_subroutines.h +1521 -0
- scipy/linalg/_linalg_pythran.cp311-win_arm64.lib +0 -0
- scipy/linalg/_linalg_pythran.cp311-win_arm64.pyd +0 -0
- scipy/linalg/_matfuncs.py +1050 -0
- scipy/linalg/_matfuncs_expm.cp311-win_arm64.lib +0 -0
- scipy/linalg/_matfuncs_expm.cp311-win_arm64.pyd +0 -0
- scipy/linalg/_matfuncs_expm.pyi +6 -0
- scipy/linalg/_matfuncs_inv_ssq.py +886 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cp311-win_arm64.lib +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cp311-win_arm64.pyd +0 -0
- scipy/linalg/_matfuncs_sqrtm.py +107 -0
- scipy/linalg/_matfuncs_sqrtm_triu.cp311-win_arm64.lib +0 -0
- scipy/linalg/_matfuncs_sqrtm_triu.cp311-win_arm64.pyd +0 -0
- scipy/linalg/_misc.py +191 -0
- scipy/linalg/_procrustes.py +113 -0
- scipy/linalg/_sketches.py +189 -0
- scipy/linalg/_solve_toeplitz.cp311-win_arm64.lib +0 -0
- scipy/linalg/_solve_toeplitz.cp311-win_arm64.pyd +0 -0
- scipy/linalg/_solvers.py +862 -0
- scipy/linalg/_special_matrices.py +1322 -0
- scipy/linalg/_testutils.py +65 -0
- scipy/linalg/basic.py +23 -0
- scipy/linalg/blas.py +495 -0
- scipy/linalg/cython_blas.cp311-win_arm64.lib +0 -0
- scipy/linalg/cython_blas.cp311-win_arm64.pyd +0 -0
- scipy/linalg/cython_blas.pxd +169 -0
- scipy/linalg/cython_blas.pyx +1432 -0
- scipy/linalg/cython_lapack.cp311-win_arm64.lib +0 -0
- scipy/linalg/cython_lapack.cp311-win_arm64.pyd +0 -0
- scipy/linalg/cython_lapack.pxd +1528 -0
- scipy/linalg/cython_lapack.pyx +12045 -0
- scipy/linalg/decomp.py +23 -0
- scipy/linalg/decomp_cholesky.py +21 -0
- scipy/linalg/decomp_lu.py +21 -0
- scipy/linalg/decomp_qr.py +20 -0
- scipy/linalg/decomp_schur.py +21 -0
- scipy/linalg/decomp_svd.py +21 -0
- scipy/linalg/interpolative.py +989 -0
- scipy/linalg/lapack.py +1081 -0
- scipy/linalg/matfuncs.py +23 -0
- scipy/linalg/misc.py +21 -0
- scipy/linalg/special_matrices.py +22 -0
- scipy/linalg/tests/__init__.py +0 -0
- scipy/linalg/tests/_cython_examples/extending.pyx +23 -0
- scipy/linalg/tests/_cython_examples/meson.build +34 -0
- scipy/linalg/tests/data/carex_15_data.npz +0 -0
- scipy/linalg/tests/data/carex_18_data.npz +0 -0
- scipy/linalg/tests/data/carex_19_data.npz +0 -0
- scipy/linalg/tests/data/carex_20_data.npz +0 -0
- scipy/linalg/tests/data/carex_6_data.npz +0 -0
- scipy/linalg/tests/data/gendare_20170120_data.npz +0 -0
- scipy/linalg/tests/test_basic.py +2074 -0
- scipy/linalg/tests/test_batch.py +588 -0
- scipy/linalg/tests/test_blas.py +1127 -0
- scipy/linalg/tests/test_cython_blas.py +118 -0
- scipy/linalg/tests/test_cython_lapack.py +22 -0
- scipy/linalg/tests/test_cythonized_array_utils.py +130 -0
- scipy/linalg/tests/test_decomp.py +3189 -0
- scipy/linalg/tests/test_decomp_cholesky.py +268 -0
- scipy/linalg/tests/test_decomp_cossin.py +314 -0
- scipy/linalg/tests/test_decomp_ldl.py +137 -0
- scipy/linalg/tests/test_decomp_lu.py +308 -0
- scipy/linalg/tests/test_decomp_polar.py +110 -0
- scipy/linalg/tests/test_decomp_update.py +1701 -0
- scipy/linalg/tests/test_extending.py +46 -0
- scipy/linalg/tests/test_fblas.py +607 -0
- scipy/linalg/tests/test_interpolative.py +232 -0
- scipy/linalg/tests/test_lapack.py +3620 -0
- scipy/linalg/tests/test_matfuncs.py +1125 -0
- scipy/linalg/tests/test_matmul_toeplitz.py +136 -0
- scipy/linalg/tests/test_procrustes.py +214 -0
- scipy/linalg/tests/test_sketches.py +118 -0
- scipy/linalg/tests/test_solve_toeplitz.py +150 -0
- scipy/linalg/tests/test_solvers.py +844 -0
- scipy/linalg/tests/test_special_matrices.py +636 -0
- scipy/misc/__init__.py +6 -0
- scipy/misc/common.py +6 -0
- scipy/misc/doccer.py +6 -0
- scipy/ndimage/__init__.py +174 -0
- scipy/ndimage/_ctest.cp311-win_arm64.lib +0 -0
- scipy/ndimage/_ctest.cp311-win_arm64.pyd +0 -0
- scipy/ndimage/_cytest.cp311-win_arm64.lib +0 -0
- scipy/ndimage/_cytest.cp311-win_arm64.pyd +0 -0
- scipy/ndimage/_delegators.py +303 -0
- scipy/ndimage/_filters.py +2422 -0
- scipy/ndimage/_fourier.py +306 -0
- scipy/ndimage/_interpolation.py +1033 -0
- scipy/ndimage/_measurements.py +1689 -0
- scipy/ndimage/_morphology.py +2634 -0
- scipy/ndimage/_nd_image.cp311-win_arm64.lib +0 -0
- scipy/ndimage/_nd_image.cp311-win_arm64.pyd +0 -0
- scipy/ndimage/_ndimage_api.py +16 -0
- scipy/ndimage/_ni_docstrings.py +214 -0
- scipy/ndimage/_ni_label.cp311-win_arm64.lib +0 -0
- scipy/ndimage/_ni_label.cp311-win_arm64.pyd +0 -0
- scipy/ndimage/_ni_support.py +139 -0
- scipy/ndimage/_rank_filter_1d.cp311-win_arm64.lib +0 -0
- scipy/ndimage/_rank_filter_1d.cp311-win_arm64.pyd +0 -0
- scipy/ndimage/_support_alternative_backends.py +84 -0
- scipy/ndimage/filters.py +27 -0
- scipy/ndimage/fourier.py +21 -0
- scipy/ndimage/interpolation.py +22 -0
- scipy/ndimage/measurements.py +24 -0
- scipy/ndimage/morphology.py +27 -0
- scipy/ndimage/tests/__init__.py +12 -0
- scipy/ndimage/tests/data/label_inputs.txt +21 -0
- scipy/ndimage/tests/data/label_results.txt +294 -0
- scipy/ndimage/tests/data/label_strels.txt +42 -0
- scipy/ndimage/tests/dots.png +0 -0
- scipy/ndimage/tests/test_c_api.py +102 -0
- scipy/ndimage/tests/test_datatypes.py +67 -0
- scipy/ndimage/tests/test_filters.py +3083 -0
- scipy/ndimage/tests/test_fourier.py +187 -0
- scipy/ndimage/tests/test_interpolation.py +1491 -0
- scipy/ndimage/tests/test_measurements.py +1592 -0
- scipy/ndimage/tests/test_morphology.py +2950 -0
- scipy/ndimage/tests/test_ni_support.py +78 -0
- scipy/ndimage/tests/test_splines.py +70 -0
- scipy/odr/__init__.py +131 -0
- scipy/odr/__odrpack.cp311-win_arm64.lib +0 -0
- scipy/odr/__odrpack.cp311-win_arm64.pyd +0 -0
- scipy/odr/_add_newdocs.py +34 -0
- scipy/odr/_models.py +315 -0
- scipy/odr/_odrpack.py +1154 -0
- scipy/odr/models.py +20 -0
- scipy/odr/odrpack.py +21 -0
- scipy/odr/tests/__init__.py +0 -0
- scipy/odr/tests/test_odr.py +607 -0
- scipy/optimize/__init__.pxd +1 -0
- scipy/optimize/__init__.py +460 -0
- scipy/optimize/_basinhopping.py +741 -0
- scipy/optimize/_bglu_dense.cp311-win_arm64.lib +0 -0
- scipy/optimize/_bglu_dense.cp311-win_arm64.pyd +0 -0
- scipy/optimize/_bracket.py +706 -0
- scipy/optimize/_chandrupatla.py +551 -0
- scipy/optimize/_cobyla_py.py +297 -0
- scipy/optimize/_cobyqa_py.py +72 -0
- scipy/optimize/_constraints.py +598 -0
- scipy/optimize/_dcsrch.py +728 -0
- scipy/optimize/_differentiable_functions.py +835 -0
- scipy/optimize/_differentialevolution.py +1970 -0
- scipy/optimize/_direct.cp311-win_arm64.lib +0 -0
- scipy/optimize/_direct.cp311-win_arm64.pyd +0 -0
- scipy/optimize/_direct_py.py +280 -0
- scipy/optimize/_dual_annealing.py +732 -0
- scipy/optimize/_elementwise.py +798 -0
- scipy/optimize/_group_columns.cp311-win_arm64.lib +0 -0
- scipy/optimize/_group_columns.cp311-win_arm64.pyd +0 -0
- scipy/optimize/_hessian_update_strategy.py +479 -0
- scipy/optimize/_highspy/__init__.py +0 -0
- scipy/optimize/_highspy/_core.cp311-win_arm64.lib +0 -0
- scipy/optimize/_highspy/_core.cp311-win_arm64.pyd +0 -0
- scipy/optimize/_highspy/_highs_options.cp311-win_arm64.lib +0 -0
- scipy/optimize/_highspy/_highs_options.cp311-win_arm64.pyd +0 -0
- scipy/optimize/_highspy/_highs_wrapper.py +338 -0
- scipy/optimize/_isotonic.py +157 -0
- scipy/optimize/_lbfgsb.cp311-win_arm64.lib +0 -0
- scipy/optimize/_lbfgsb.cp311-win_arm64.pyd +0 -0
- scipy/optimize/_lbfgsb_py.py +634 -0
- scipy/optimize/_linesearch.py +896 -0
- scipy/optimize/_linprog.py +733 -0
- scipy/optimize/_linprog_doc.py +1434 -0
- scipy/optimize/_linprog_highs.py +422 -0
- scipy/optimize/_linprog_ip.py +1141 -0
- scipy/optimize/_linprog_rs.py +572 -0
- scipy/optimize/_linprog_simplex.py +663 -0
- scipy/optimize/_linprog_util.py +1521 -0
- scipy/optimize/_lsap.cp311-win_arm64.lib +0 -0
- scipy/optimize/_lsap.cp311-win_arm64.pyd +0 -0
- scipy/optimize/_lsq/__init__.py +5 -0
- scipy/optimize/_lsq/bvls.py +183 -0
- scipy/optimize/_lsq/common.py +731 -0
- scipy/optimize/_lsq/dogbox.py +345 -0
- scipy/optimize/_lsq/givens_elimination.cp311-win_arm64.lib +0 -0
- scipy/optimize/_lsq/givens_elimination.cp311-win_arm64.pyd +0 -0
- scipy/optimize/_lsq/least_squares.py +1044 -0
- scipy/optimize/_lsq/lsq_linear.py +361 -0
- scipy/optimize/_lsq/trf.py +587 -0
- scipy/optimize/_lsq/trf_linear.py +249 -0
- scipy/optimize/_milp.py +394 -0
- scipy/optimize/_minimize.py +1199 -0
- scipy/optimize/_minpack.cp311-win_arm64.lib +0 -0
- scipy/optimize/_minpack.cp311-win_arm64.pyd +0 -0
- scipy/optimize/_minpack_py.py +1178 -0
- scipy/optimize/_moduleTNC.cp311-win_arm64.lib +0 -0
- scipy/optimize/_moduleTNC.cp311-win_arm64.pyd +0 -0
- scipy/optimize/_nnls.py +96 -0
- scipy/optimize/_nonlin.py +1634 -0
- scipy/optimize/_numdiff.py +963 -0
- scipy/optimize/_optimize.py +4169 -0
- scipy/optimize/_pava_pybind.cp311-win_arm64.lib +0 -0
- scipy/optimize/_pava_pybind.cp311-win_arm64.pyd +0 -0
- scipy/optimize/_qap.py +760 -0
- scipy/optimize/_remove_redundancy.py +522 -0
- scipy/optimize/_root.py +732 -0
- scipy/optimize/_root_scalar.py +538 -0
- scipy/optimize/_shgo.py +1606 -0
- scipy/optimize/_shgo_lib/__init__.py +0 -0
- scipy/optimize/_shgo_lib/_complex.py +1225 -0
- scipy/optimize/_shgo_lib/_vertex.py +460 -0
- scipy/optimize/_slsqp_py.py +603 -0
- scipy/optimize/_slsqplib.cp311-win_arm64.lib +0 -0
- scipy/optimize/_slsqplib.cp311-win_arm64.pyd +0 -0
- scipy/optimize/_spectral.py +260 -0
- scipy/optimize/_tnc.py +438 -0
- scipy/optimize/_trlib/__init__.py +12 -0
- scipy/optimize/_trlib/_trlib.cp311-win_arm64.lib +0 -0
- scipy/optimize/_trlib/_trlib.cp311-win_arm64.pyd +0 -0
- scipy/optimize/_trustregion.py +318 -0
- scipy/optimize/_trustregion_constr/__init__.py +6 -0
- scipy/optimize/_trustregion_constr/canonical_constraint.py +390 -0
- scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +231 -0
- scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +584 -0
- scipy/optimize/_trustregion_constr/projections.py +411 -0
- scipy/optimize/_trustregion_constr/qp_subproblem.py +637 -0
- scipy/optimize/_trustregion_constr/report.py +49 -0
- scipy/optimize/_trustregion_constr/tests/__init__.py +0 -0
- scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py +296 -0
- scipy/optimize/_trustregion_constr/tests/test_nested_minimize.py +39 -0
- scipy/optimize/_trustregion_constr/tests/test_projections.py +214 -0
- scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +645 -0
- scipy/optimize/_trustregion_constr/tests/test_report.py +34 -0
- scipy/optimize/_trustregion_constr/tr_interior_point.py +361 -0
- scipy/optimize/_trustregion_dogleg.py +122 -0
- scipy/optimize/_trustregion_exact.py +437 -0
- scipy/optimize/_trustregion_krylov.py +65 -0
- scipy/optimize/_trustregion_ncg.py +126 -0
- scipy/optimize/_tstutils.py +972 -0
- scipy/optimize/_zeros.cp311-win_arm64.lib +0 -0
- scipy/optimize/_zeros.cp311-win_arm64.pyd +0 -0
- scipy/optimize/_zeros_py.py +1475 -0
- scipy/optimize/cobyla.py +19 -0
- scipy/optimize/cython_optimize/__init__.py +133 -0
- scipy/optimize/cython_optimize/_zeros.cp311-win_arm64.lib +0 -0
- scipy/optimize/cython_optimize/_zeros.cp311-win_arm64.pyd +0 -0
- scipy/optimize/cython_optimize/_zeros.pxd +33 -0
- scipy/optimize/cython_optimize/c_zeros.pxd +26 -0
- scipy/optimize/cython_optimize.pxd +11 -0
- scipy/optimize/elementwise.py +38 -0
- scipy/optimize/lbfgsb.py +23 -0
- scipy/optimize/linesearch.py +18 -0
- scipy/optimize/minpack.py +27 -0
- scipy/optimize/minpack2.py +17 -0
- scipy/optimize/moduleTNC.py +19 -0
- scipy/optimize/nonlin.py +29 -0
- scipy/optimize/optimize.py +40 -0
- scipy/optimize/slsqp.py +22 -0
- scipy/optimize/tests/__init__.py +0 -0
- scipy/optimize/tests/_cython_examples/extending.pyx +43 -0
- scipy/optimize/tests/_cython_examples/meson.build +32 -0
- scipy/optimize/tests/test__basinhopping.py +535 -0
- scipy/optimize/tests/test__differential_evolution.py +1703 -0
- scipy/optimize/tests/test__dual_annealing.py +416 -0
- scipy/optimize/tests/test__linprog_clean_inputs.py +312 -0
- scipy/optimize/tests/test__numdiff.py +885 -0
- scipy/optimize/tests/test__remove_redundancy.py +228 -0
- scipy/optimize/tests/test__root.py +124 -0
- scipy/optimize/tests/test__shgo.py +1164 -0
- scipy/optimize/tests/test__spectral.py +226 -0
- scipy/optimize/tests/test_bracket.py +896 -0
- scipy/optimize/tests/test_chandrupatla.py +982 -0
- scipy/optimize/tests/test_cobyla.py +195 -0
- scipy/optimize/tests/test_cobyqa.py +252 -0
- scipy/optimize/tests/test_constraint_conversion.py +286 -0
- scipy/optimize/tests/test_constraints.py +255 -0
- scipy/optimize/tests/test_cython_optimize.py +92 -0
- scipy/optimize/tests/test_differentiable_functions.py +1025 -0
- scipy/optimize/tests/test_direct.py +321 -0
- scipy/optimize/tests/test_extending.py +28 -0
- scipy/optimize/tests/test_hessian_update_strategy.py +300 -0
- scipy/optimize/tests/test_isotonic_regression.py +167 -0
- scipy/optimize/tests/test_lbfgsb_hessinv.py +65 -0
- scipy/optimize/tests/test_lbfgsb_setulb.py +122 -0
- scipy/optimize/tests/test_least_squares.py +986 -0
- scipy/optimize/tests/test_linear_assignment.py +116 -0
- scipy/optimize/tests/test_linesearch.py +328 -0
- scipy/optimize/tests/test_linprog.py +2577 -0
- scipy/optimize/tests/test_lsq_common.py +297 -0
- scipy/optimize/tests/test_lsq_linear.py +287 -0
- scipy/optimize/tests/test_milp.py +459 -0
- scipy/optimize/tests/test_minimize_constrained.py +845 -0
- scipy/optimize/tests/test_minpack.py +1194 -0
- scipy/optimize/tests/test_nnls.py +469 -0
- scipy/optimize/tests/test_nonlin.py +572 -0
- scipy/optimize/tests/test_optimize.py +3344 -0
- scipy/optimize/tests/test_quadratic_assignment.py +455 -0
- scipy/optimize/tests/test_regression.py +40 -0
- scipy/optimize/tests/test_slsqp.py +645 -0
- scipy/optimize/tests/test_tnc.py +345 -0
- scipy/optimize/tests/test_trustregion.py +110 -0
- scipy/optimize/tests/test_trustregion_exact.py +351 -0
- scipy/optimize/tests/test_trustregion_krylov.py +170 -0
- scipy/optimize/tests/test_zeros.py +998 -0
- scipy/optimize/tnc.py +22 -0
- scipy/optimize/zeros.py +26 -0
- scipy/signal/__init__.py +316 -0
- scipy/signal/_arraytools.py +264 -0
- scipy/signal/_czt.py +575 -0
- scipy/signal/_delegators.py +568 -0
- scipy/signal/_filter_design.py +5893 -0
- scipy/signal/_fir_filter_design.py +1458 -0
- scipy/signal/_lti_conversion.py +534 -0
- scipy/signal/_ltisys.py +3546 -0
- scipy/signal/_max_len_seq.py +139 -0
- scipy/signal/_max_len_seq_inner.cp311-win_arm64.lib +0 -0
- scipy/signal/_max_len_seq_inner.cp311-win_arm64.pyd +0 -0
- scipy/signal/_peak_finding.py +1310 -0
- scipy/signal/_peak_finding_utils.cp311-win_arm64.lib +0 -0
- scipy/signal/_peak_finding_utils.cp311-win_arm64.pyd +0 -0
- scipy/signal/_polyutils.py +172 -0
- scipy/signal/_savitzky_golay.py +357 -0
- scipy/signal/_short_time_fft.py +2228 -0
- scipy/signal/_signal_api.py +30 -0
- scipy/signal/_signaltools.py +5309 -0
- scipy/signal/_sigtools.cp311-win_arm64.lib +0 -0
- scipy/signal/_sigtools.cp311-win_arm64.pyd +0 -0
- scipy/signal/_sosfilt.cp311-win_arm64.lib +0 -0
- scipy/signal/_sosfilt.cp311-win_arm64.pyd +0 -0
- scipy/signal/_spectral_py.py +2471 -0
- scipy/signal/_spline.cp311-win_arm64.lib +0 -0
- scipy/signal/_spline.cp311-win_arm64.pyd +0 -0
- scipy/signal/_spline.pyi +34 -0
- scipy/signal/_spline_filters.py +848 -0
- scipy/signal/_support_alternative_backends.py +73 -0
- scipy/signal/_upfirdn.py +219 -0
- scipy/signal/_upfirdn_apply.cp311-win_arm64.lib +0 -0
- scipy/signal/_upfirdn_apply.cp311-win_arm64.pyd +0 -0
- scipy/signal/_waveforms.py +687 -0
- scipy/signal/_wavelets.py +29 -0
- scipy/signal/bsplines.py +21 -0
- scipy/signal/filter_design.py +28 -0
- scipy/signal/fir_filter_design.py +21 -0
- scipy/signal/lti_conversion.py +20 -0
- scipy/signal/ltisys.py +25 -0
- scipy/signal/signaltools.py +27 -0
- scipy/signal/spectral.py +21 -0
- scipy/signal/spline.py +18 -0
- scipy/signal/tests/__init__.py +0 -0
- scipy/signal/tests/_scipy_spectral_test_shim.py +311 -0
- scipy/signal/tests/mpsig.py +122 -0
- scipy/signal/tests/test_array_tools.py +111 -0
- scipy/signal/tests/test_bsplines.py +365 -0
- scipy/signal/tests/test_cont2discrete.py +424 -0
- scipy/signal/tests/test_czt.py +221 -0
- scipy/signal/tests/test_dltisys.py +599 -0
- scipy/signal/tests/test_filter_design.py +4744 -0
- scipy/signal/tests/test_fir_filter_design.py +851 -0
- scipy/signal/tests/test_ltisys.py +1225 -0
- scipy/signal/tests/test_max_len_seq.py +71 -0
- scipy/signal/tests/test_peak_finding.py +915 -0
- scipy/signal/tests/test_result_type.py +51 -0
- scipy/signal/tests/test_savitzky_golay.py +363 -0
- scipy/signal/tests/test_short_time_fft.py +1107 -0
- scipy/signal/tests/test_signaltools.py +4735 -0
- scipy/signal/tests/test_spectral.py +2141 -0
- scipy/signal/tests/test_splines.py +427 -0
- scipy/signal/tests/test_upfirdn.py +322 -0
- scipy/signal/tests/test_waveforms.py +400 -0
- scipy/signal/tests/test_wavelets.py +59 -0
- scipy/signal/tests/test_windows.py +987 -0
- scipy/signal/waveforms.py +20 -0
- scipy/signal/wavelets.py +17 -0
- scipy/signal/windows/__init__.py +52 -0
- scipy/signal/windows/_windows.py +2513 -0
- scipy/signal/windows/windows.py +23 -0
- scipy/sparse/__init__.py +350 -0
- scipy/sparse/_base.py +1613 -0
- scipy/sparse/_bsr.py +880 -0
- scipy/sparse/_compressed.py +1328 -0
- scipy/sparse/_construct.py +1454 -0
- scipy/sparse/_coo.py +1581 -0
- scipy/sparse/_csc.py +367 -0
- scipy/sparse/_csparsetools.cp311-win_arm64.lib +0 -0
- scipy/sparse/_csparsetools.cp311-win_arm64.pyd +0 -0
- scipy/sparse/_csr.py +558 -0
- scipy/sparse/_data.py +569 -0
- scipy/sparse/_dia.py +677 -0
- scipy/sparse/_dok.py +669 -0
- scipy/sparse/_extract.py +178 -0
- scipy/sparse/_index.py +444 -0
- scipy/sparse/_lil.py +632 -0
- scipy/sparse/_matrix.py +169 -0
- scipy/sparse/_matrix_io.py +167 -0
- scipy/sparse/_sparsetools.cp311-win_arm64.lib +0 -0
- scipy/sparse/_sparsetools.cp311-win_arm64.pyd +0 -0
- scipy/sparse/_spfuncs.py +76 -0
- scipy/sparse/_sputils.py +632 -0
- scipy/sparse/base.py +24 -0
- scipy/sparse/bsr.py +22 -0
- scipy/sparse/compressed.py +20 -0
- scipy/sparse/construct.py +38 -0
- scipy/sparse/coo.py +23 -0
- scipy/sparse/csc.py +22 -0
- scipy/sparse/csgraph/__init__.py +210 -0
- scipy/sparse/csgraph/_flow.cp311-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_flow.cp311-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_laplacian.py +563 -0
- scipy/sparse/csgraph/_matching.cp311-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_matching.cp311-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cp311-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cp311-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_reordering.cp311-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_reordering.cp311-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_shortest_path.cp311-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_shortest_path.cp311-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_tools.cp311-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_tools.cp311-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_traversal.cp311-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_traversal.cp311-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_validation.py +66 -0
- scipy/sparse/csgraph/tests/__init__.py +0 -0
- scipy/sparse/csgraph/tests/test_connected_components.py +119 -0
- scipy/sparse/csgraph/tests/test_conversions.py +61 -0
- scipy/sparse/csgraph/tests/test_flow.py +209 -0
- scipy/sparse/csgraph/tests/test_graph_laplacian.py +368 -0
- scipy/sparse/csgraph/tests/test_matching.py +307 -0
- scipy/sparse/csgraph/tests/test_pydata_sparse.py +197 -0
- scipy/sparse/csgraph/tests/test_reordering.py +70 -0
- scipy/sparse/csgraph/tests/test_shortest_path.py +540 -0
- scipy/sparse/csgraph/tests/test_spanning_tree.py +66 -0
- scipy/sparse/csgraph/tests/test_traversal.py +148 -0
- scipy/sparse/csr.py +22 -0
- scipy/sparse/data.py +18 -0
- scipy/sparse/dia.py +22 -0
- scipy/sparse/dok.py +22 -0
- scipy/sparse/extract.py +23 -0
- scipy/sparse/lil.py +22 -0
- scipy/sparse/linalg/__init__.py +148 -0
- scipy/sparse/linalg/_dsolve/__init__.py +71 -0
- scipy/sparse/linalg/_dsolve/_add_newdocs.py +147 -0
- scipy/sparse/linalg/_dsolve/_superlu.cp311-win_arm64.lib +0 -0
- scipy/sparse/linalg/_dsolve/_superlu.cp311-win_arm64.pyd +0 -0
- scipy/sparse/linalg/_dsolve/linsolve.py +882 -0
- scipy/sparse/linalg/_dsolve/tests/__init__.py +0 -0
- scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +928 -0
- scipy/sparse/linalg/_eigen/__init__.py +22 -0
- scipy/sparse/linalg/_eigen/_svds.py +540 -0
- scipy/sparse/linalg/_eigen/_svds_doc.py +382 -0
- scipy/sparse/linalg/_eigen/arpack/COPYING +45 -0
- scipy/sparse/linalg/_eigen/arpack/__init__.py +20 -0
- scipy/sparse/linalg/_eigen/arpack/_arpack.cp311-win_arm64.lib +0 -0
- scipy/sparse/linalg/_eigen/arpack/_arpack.cp311-win_arm64.pyd +0 -0
- scipy/sparse/linalg/_eigen/arpack/arpack.py +1706 -0
- scipy/sparse/linalg/_eigen/arpack/tests/__init__.py +0 -0
- scipy/sparse/linalg/_eigen/arpack/tests/test_arpack.py +717 -0
- scipy/sparse/linalg/_eigen/lobpcg/__init__.py +16 -0
- scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +1110 -0
- scipy/sparse/linalg/_eigen/lobpcg/tests/__init__.py +0 -0
- scipy/sparse/linalg/_eigen/lobpcg/tests/test_lobpcg.py +725 -0
- scipy/sparse/linalg/_eigen/tests/__init__.py +0 -0
- scipy/sparse/linalg/_eigen/tests/test_svds.py +886 -0
- scipy/sparse/linalg/_expm_multiply.py +816 -0
- scipy/sparse/linalg/_interface.py +920 -0
- scipy/sparse/linalg/_isolve/__init__.py +20 -0
- scipy/sparse/linalg/_isolve/_gcrotmk.py +503 -0
- scipy/sparse/linalg/_isolve/iterative.py +1051 -0
- scipy/sparse/linalg/_isolve/lgmres.py +230 -0
- scipy/sparse/linalg/_isolve/lsmr.py +486 -0
- scipy/sparse/linalg/_isolve/lsqr.py +589 -0
- scipy/sparse/linalg/_isolve/minres.py +372 -0
- scipy/sparse/linalg/_isolve/tests/__init__.py +0 -0
- scipy/sparse/linalg/_isolve/tests/test_gcrotmk.py +183 -0
- scipy/sparse/linalg/_isolve/tests/test_iterative.py +809 -0
- scipy/sparse/linalg/_isolve/tests/test_lgmres.py +225 -0
- scipy/sparse/linalg/_isolve/tests/test_lsmr.py +185 -0
- scipy/sparse/linalg/_isolve/tests/test_lsqr.py +120 -0
- scipy/sparse/linalg/_isolve/tests/test_minres.py +97 -0
- scipy/sparse/linalg/_isolve/tests/test_utils.py +9 -0
- scipy/sparse/linalg/_isolve/tfqmr.py +179 -0
- scipy/sparse/linalg/_isolve/utils.py +121 -0
- scipy/sparse/linalg/_matfuncs.py +940 -0
- scipy/sparse/linalg/_norm.py +195 -0
- scipy/sparse/linalg/_onenormest.py +467 -0
- scipy/sparse/linalg/_propack/_cpropack.cp311-win_arm64.lib +0 -0
- scipy/sparse/linalg/_propack/_cpropack.cp311-win_arm64.pyd +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cp311-win_arm64.lib +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cp311-win_arm64.pyd +0 -0
- scipy/sparse/linalg/_propack/_spropack.cp311-win_arm64.lib +0 -0
- scipy/sparse/linalg/_propack/_spropack.cp311-win_arm64.pyd +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cp311-win_arm64.lib +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cp311-win_arm64.pyd +0 -0
- scipy/sparse/linalg/_special_sparse_arrays.py +949 -0
- scipy/sparse/linalg/_svdp.py +309 -0
- scipy/sparse/linalg/dsolve.py +22 -0
- scipy/sparse/linalg/eigen.py +21 -0
- scipy/sparse/linalg/interface.py +20 -0
- scipy/sparse/linalg/isolve.py +22 -0
- scipy/sparse/linalg/matfuncs.py +18 -0
- scipy/sparse/linalg/tests/__init__.py +0 -0
- scipy/sparse/linalg/tests/propack_test_data.npz +0 -0
- scipy/sparse/linalg/tests/test_expm_multiply.py +367 -0
- scipy/sparse/linalg/tests/test_interface.py +561 -0
- scipy/sparse/linalg/tests/test_matfuncs.py +592 -0
- scipy/sparse/linalg/tests/test_norm.py +154 -0
- scipy/sparse/linalg/tests/test_onenormest.py +252 -0
- scipy/sparse/linalg/tests/test_propack.py +165 -0
- scipy/sparse/linalg/tests/test_pydata_sparse.py +272 -0
- scipy/sparse/linalg/tests/test_special_sparse_arrays.py +337 -0
- scipy/sparse/sparsetools.py +17 -0
- scipy/sparse/spfuncs.py +17 -0
- scipy/sparse/sputils.py +17 -0
- scipy/sparse/tests/__init__.py +0 -0
- scipy/sparse/tests/data/csc_py2.npz +0 -0
- scipy/sparse/tests/data/csc_py3.npz +0 -0
- scipy/sparse/tests/test_arithmetic1d.py +341 -0
- scipy/sparse/tests/test_array_api.py +561 -0
- scipy/sparse/tests/test_base.py +5870 -0
- scipy/sparse/tests/test_common1d.py +447 -0
- scipy/sparse/tests/test_construct.py +872 -0
- scipy/sparse/tests/test_coo.py +1119 -0
- scipy/sparse/tests/test_csc.py +98 -0
- scipy/sparse/tests/test_csr.py +214 -0
- scipy/sparse/tests/test_dok.py +209 -0
- scipy/sparse/tests/test_extract.py +51 -0
- scipy/sparse/tests/test_indexing1d.py +603 -0
- scipy/sparse/tests/test_matrix_io.py +109 -0
- scipy/sparse/tests/test_minmax1d.py +128 -0
- scipy/sparse/tests/test_sparsetools.py +344 -0
- scipy/sparse/tests/test_spfuncs.py +97 -0
- scipy/sparse/tests/test_sputils.py +424 -0
- scipy/spatial/__init__.py +129 -0
- scipy/spatial/_ckdtree.cp311-win_arm64.lib +0 -0
- scipy/spatial/_ckdtree.cp311-win_arm64.pyd +0 -0
- scipy/spatial/_distance_pybind.cp311-win_arm64.lib +0 -0
- scipy/spatial/_distance_pybind.cp311-win_arm64.pyd +0 -0
- scipy/spatial/_distance_wrap.cp311-win_arm64.lib +0 -0
- scipy/spatial/_distance_wrap.cp311-win_arm64.pyd +0 -0
- scipy/spatial/_geometric_slerp.py +238 -0
- scipy/spatial/_hausdorff.cp311-win_arm64.lib +0 -0
- scipy/spatial/_hausdorff.cp311-win_arm64.pyd +0 -0
- scipy/spatial/_kdtree.py +920 -0
- scipy/spatial/_plotutils.py +274 -0
- scipy/spatial/_procrustes.py +132 -0
- scipy/spatial/_qhull.cp311-win_arm64.lib +0 -0
- scipy/spatial/_qhull.cp311-win_arm64.pyd +0 -0
- scipy/spatial/_qhull.pyi +213 -0
- scipy/spatial/_spherical_voronoi.py +341 -0
- scipy/spatial/_voronoi.cp311-win_arm64.lib +0 -0
- scipy/spatial/_voronoi.cp311-win_arm64.pyd +0 -0
- scipy/spatial/_voronoi.pyi +4 -0
- scipy/spatial/ckdtree.py +18 -0
- scipy/spatial/distance.py +3147 -0
- scipy/spatial/distance.pyi +210 -0
- scipy/spatial/kdtree.py +25 -0
- scipy/spatial/qhull.py +25 -0
- scipy/spatial/qhull_src/COPYING_QHULL.txt +39 -0
- scipy/spatial/tests/__init__.py +0 -0
- scipy/spatial/tests/data/cdist-X1.txt +10 -0
- scipy/spatial/tests/data/cdist-X2.txt +20 -0
- scipy/spatial/tests/data/degenerate_pointset.npz +0 -0
- scipy/spatial/tests/data/iris.txt +150 -0
- scipy/spatial/tests/data/pdist-boolean-inp.txt +20 -0
- scipy/spatial/tests/data/pdist-chebyshev-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-chebyshev-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-cityblock-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-cityblock-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-correlation-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-correlation-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-cosine-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-cosine-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-double-inp.txt +20 -0
- scipy/spatial/tests/data/pdist-euclidean-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-euclidean-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-hamming-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-jaccard-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-jensenshannon-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-jensenshannon-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-minkowski-3.2-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-minkowski-3.2-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-minkowski-5.8-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-seuclidean-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-seuclidean-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-spearman-ml.txt +1 -0
- scipy/spatial/tests/data/random-bool-data.txt +100 -0
- scipy/spatial/tests/data/random-double-data.txt +100 -0
- scipy/spatial/tests/data/random-int-data.txt +100 -0
- scipy/spatial/tests/data/random-uint-data.txt +100 -0
- scipy/spatial/tests/data/selfdual-4d-polytope.txt +27 -0
- scipy/spatial/tests/test__plotutils.py +91 -0
- scipy/spatial/tests/test__procrustes.py +116 -0
- scipy/spatial/tests/test_distance.py +2389 -0
- scipy/spatial/tests/test_hausdorff.py +199 -0
- scipy/spatial/tests/test_kdtree.py +1536 -0
- scipy/spatial/tests/test_qhull.py +1313 -0
- scipy/spatial/tests/test_slerp.py +417 -0
- scipy/spatial/tests/test_spherical_voronoi.py +358 -0
- scipy/spatial/transform/__init__.py +31 -0
- scipy/spatial/transform/_rigid_transform.cp311-win_arm64.lib +0 -0
- scipy/spatial/transform/_rigid_transform.cp311-win_arm64.pyd +0 -0
- scipy/spatial/transform/_rotation.cp311-win_arm64.lib +0 -0
- scipy/spatial/transform/_rotation.cp311-win_arm64.pyd +0 -0
- scipy/spatial/transform/_rotation_groups.py +140 -0
- scipy/spatial/transform/_rotation_spline.py +460 -0
- scipy/spatial/transform/rotation.py +21 -0
- scipy/spatial/transform/tests/__init__.py +0 -0
- scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
- scipy/spatial/transform/tests/test_rotation.py +2569 -0
- scipy/spatial/transform/tests/test_rotation_groups.py +169 -0
- scipy/spatial/transform/tests/test_rotation_spline.py +183 -0
- scipy/special/__init__.pxd +1 -0
- scipy/special/__init__.py +841 -0
- scipy/special/_add_newdocs.py +9961 -0
- scipy/special/_basic.py +3576 -0
- scipy/special/_comb.cp311-win_arm64.lib +0 -0
- scipy/special/_comb.cp311-win_arm64.pyd +0 -0
- scipy/special/_ellip_harm.py +214 -0
- scipy/special/_ellip_harm_2.cp311-win_arm64.lib +0 -0
- scipy/special/_ellip_harm_2.cp311-win_arm64.pyd +0 -0
- scipy/special/_gufuncs.cp311-win_arm64.lib +0 -0
- scipy/special/_gufuncs.cp311-win_arm64.pyd +0 -0
- scipy/special/_input_validation.py +17 -0
- scipy/special/_lambertw.py +149 -0
- scipy/special/_logsumexp.py +426 -0
- scipy/special/_mptestutils.py +453 -0
- scipy/special/_multiufuncs.py +610 -0
- scipy/special/_orthogonal.py +2592 -0
- scipy/special/_orthogonal.pyi +330 -0
- scipy/special/_precompute/__init__.py +0 -0
- scipy/special/_precompute/cosine_cdf.py +17 -0
- scipy/special/_precompute/expn_asy.py +54 -0
- scipy/special/_precompute/gammainc_asy.py +116 -0
- scipy/special/_precompute/gammainc_data.py +124 -0
- scipy/special/_precompute/hyp2f1_data.py +484 -0
- scipy/special/_precompute/lambertw.py +68 -0
- scipy/special/_precompute/loggamma.py +43 -0
- scipy/special/_precompute/struve_convergence.py +131 -0
- scipy/special/_precompute/utils.py +38 -0
- scipy/special/_precompute/wright_bessel.py +342 -0
- scipy/special/_precompute/wright_bessel_data.py +152 -0
- scipy/special/_precompute/wrightomega.py +41 -0
- scipy/special/_precompute/zetac.py +27 -0
- scipy/special/_sf_error.py +15 -0
- scipy/special/_specfun.cp311-win_arm64.lib +0 -0
- scipy/special/_specfun.cp311-win_arm64.pyd +0 -0
- scipy/special/_special_ufuncs.cp311-win_arm64.lib +0 -0
- scipy/special/_special_ufuncs.cp311-win_arm64.pyd +0 -0
- scipy/special/_spfun_stats.py +106 -0
- scipy/special/_spherical_bessel.py +397 -0
- scipy/special/_support_alternative_backends.py +295 -0
- scipy/special/_test_internal.cp311-win_arm64.lib +0 -0
- scipy/special/_test_internal.cp311-win_arm64.pyd +0 -0
- scipy/special/_test_internal.pyi +9 -0
- scipy/special/_testutils.py +321 -0
- scipy/special/_ufuncs.cp311-win_arm64.lib +0 -0
- scipy/special/_ufuncs.cp311-win_arm64.pyd +0 -0
- scipy/special/_ufuncs.pyi +522 -0
- scipy/special/_ufuncs.pyx +13173 -0
- scipy/special/_ufuncs_cxx.cp311-win_arm64.lib +0 -0
- scipy/special/_ufuncs_cxx.cp311-win_arm64.pyd +0 -0
- scipy/special/_ufuncs_cxx.pxd +142 -0
- scipy/special/_ufuncs_cxx.pyx +427 -0
- scipy/special/_ufuncs_cxx_defs.h +147 -0
- scipy/special/_ufuncs_defs.h +57 -0
- scipy/special/add_newdocs.py +15 -0
- scipy/special/basic.py +87 -0
- scipy/special/cython_special.cp311-win_arm64.lib +0 -0
- scipy/special/cython_special.cp311-win_arm64.pyd +0 -0
- scipy/special/cython_special.pxd +259 -0
- scipy/special/cython_special.pyi +3 -0
- scipy/special/orthogonal.py +45 -0
- scipy/special/sf_error.py +20 -0
- scipy/special/specfun.py +24 -0
- scipy/special/spfun_stats.py +17 -0
- scipy/special/tests/__init__.py +0 -0
- scipy/special/tests/_cython_examples/extending.pyx +12 -0
- scipy/special/tests/_cython_examples/meson.build +34 -0
- scipy/special/tests/data/__init__.py +0 -0
- scipy/special/tests/data/boost.npz +0 -0
- scipy/special/tests/data/gsl.npz +0 -0
- scipy/special/tests/data/local.npz +0 -0
- scipy/special/tests/test_basic.py +4815 -0
- scipy/special/tests/test_bdtr.py +112 -0
- scipy/special/tests/test_boost_ufuncs.py +64 -0
- scipy/special/tests/test_boxcox.py +125 -0
- scipy/special/tests/test_cdflib.py +712 -0
- scipy/special/tests/test_cdft_asymptotic.py +49 -0
- scipy/special/tests/test_cephes_intp_cast.py +29 -0
- scipy/special/tests/test_cosine_distr.py +83 -0
- scipy/special/tests/test_cython_special.py +363 -0
- scipy/special/tests/test_data.py +719 -0
- scipy/special/tests/test_dd.py +42 -0
- scipy/special/tests/test_digamma.py +45 -0
- scipy/special/tests/test_ellip_harm.py +278 -0
- scipy/special/tests/test_erfinv.py +89 -0
- scipy/special/tests/test_exponential_integrals.py +118 -0
- scipy/special/tests/test_extending.py +28 -0
- scipy/special/tests/test_faddeeva.py +85 -0
- scipy/special/tests/test_gamma.py +12 -0
- scipy/special/tests/test_gammainc.py +152 -0
- scipy/special/tests/test_hyp2f1.py +2566 -0
- scipy/special/tests/test_hypergeometric.py +234 -0
- scipy/special/tests/test_iv_ratio.py +249 -0
- scipy/special/tests/test_kolmogorov.py +491 -0
- scipy/special/tests/test_lambertw.py +109 -0
- scipy/special/tests/test_legendre.py +1518 -0
- scipy/special/tests/test_log1mexp.py +85 -0
- scipy/special/tests/test_loggamma.py +70 -0
- scipy/special/tests/test_logit.py +162 -0
- scipy/special/tests/test_logsumexp.py +469 -0
- scipy/special/tests/test_mpmath.py +2293 -0
- scipy/special/tests/test_nan_inputs.py +65 -0
- scipy/special/tests/test_ndtr.py +77 -0
- scipy/special/tests/test_ndtri_exp.py +94 -0
- scipy/special/tests/test_orthogonal.py +821 -0
- scipy/special/tests/test_orthogonal_eval.py +275 -0
- scipy/special/tests/test_owens_t.py +53 -0
- scipy/special/tests/test_pcf.py +24 -0
- scipy/special/tests/test_pdtr.py +48 -0
- scipy/special/tests/test_powm1.py +65 -0
- scipy/special/tests/test_precompute_expn_asy.py +24 -0
- scipy/special/tests/test_precompute_gammainc.py +108 -0
- scipy/special/tests/test_precompute_utils.py +36 -0
- scipy/special/tests/test_round.py +18 -0
- scipy/special/tests/test_sf_error.py +146 -0
- scipy/special/tests/test_sici.py +36 -0
- scipy/special/tests/test_specfun.py +48 -0
- scipy/special/tests/test_spence.py +32 -0
- scipy/special/tests/test_spfun_stats.py +61 -0
- scipy/special/tests/test_sph_harm.py +85 -0
- scipy/special/tests/test_spherical_bessel.py +400 -0
- scipy/special/tests/test_support_alternative_backends.py +248 -0
- scipy/special/tests/test_trig.py +72 -0
- scipy/special/tests/test_ufunc_signatures.py +46 -0
- scipy/special/tests/test_wright_bessel.py +205 -0
- scipy/special/tests/test_wrightomega.py +117 -0
- scipy/special/tests/test_zeta.py +301 -0
- scipy/stats/__init__.py +670 -0
- scipy/stats/_ansari_swilk_statistics.cp311-win_arm64.lib +0 -0
- scipy/stats/_ansari_swilk_statistics.cp311-win_arm64.pyd +0 -0
- scipy/stats/_axis_nan_policy.py +692 -0
- scipy/stats/_biasedurn.cp311-win_arm64.lib +0 -0
- scipy/stats/_biasedurn.cp311-win_arm64.pyd +0 -0
- scipy/stats/_biasedurn.pxd +27 -0
- scipy/stats/_binned_statistic.py +795 -0
- scipy/stats/_binomtest.py +375 -0
- scipy/stats/_bws_test.py +177 -0
- scipy/stats/_censored_data.py +459 -0
- scipy/stats/_common.py +5 -0
- scipy/stats/_constants.py +42 -0
- scipy/stats/_continued_fraction.py +387 -0
- scipy/stats/_continuous_distns.py +12486 -0
- scipy/stats/_correlation.py +210 -0
- scipy/stats/_covariance.py +636 -0
- scipy/stats/_crosstab.py +204 -0
- scipy/stats/_discrete_distns.py +2098 -0
- scipy/stats/_distn_infrastructure.py +4201 -0
- scipy/stats/_distr_params.py +299 -0
- scipy/stats/_distribution_infrastructure.py +5750 -0
- scipy/stats/_entropy.py +428 -0
- scipy/stats/_finite_differences.py +145 -0
- scipy/stats/_fit.py +1351 -0
- scipy/stats/_hypotests.py +2060 -0
- scipy/stats/_kde.py +732 -0
- scipy/stats/_ksstats.py +600 -0
- scipy/stats/_levy_stable/__init__.py +1231 -0
- scipy/stats/_levy_stable/levyst.cp311-win_arm64.lib +0 -0
- scipy/stats/_levy_stable/levyst.cp311-win_arm64.pyd +0 -0
- scipy/stats/_mannwhitneyu.py +492 -0
- scipy/stats/_mgc.py +550 -0
- scipy/stats/_morestats.py +4626 -0
- scipy/stats/_mstats_basic.py +3658 -0
- scipy/stats/_mstats_extras.py +521 -0
- scipy/stats/_multicomp.py +449 -0
- scipy/stats/_multivariate.py +7281 -0
- scipy/stats/_new_distributions.py +452 -0
- scipy/stats/_odds_ratio.py +466 -0
- scipy/stats/_page_trend_test.py +486 -0
- scipy/stats/_probability_distribution.py +1964 -0
- scipy/stats/_qmc.py +2956 -0
- scipy/stats/_qmc_cy.cp311-win_arm64.lib +0 -0
- scipy/stats/_qmc_cy.cp311-win_arm64.pyd +0 -0
- scipy/stats/_qmc_cy.pyi +54 -0
- scipy/stats/_qmvnt.py +454 -0
- scipy/stats/_qmvnt_cy.cp311-win_arm64.lib +0 -0
- scipy/stats/_qmvnt_cy.cp311-win_arm64.pyd +0 -0
- scipy/stats/_quantile.py +335 -0
- scipy/stats/_rcont/__init__.py +4 -0
- scipy/stats/_rcont/rcont.cp311-win_arm64.lib +0 -0
- scipy/stats/_rcont/rcont.cp311-win_arm64.pyd +0 -0
- scipy/stats/_relative_risk.py +263 -0
- scipy/stats/_resampling.py +2352 -0
- scipy/stats/_result_classes.py +40 -0
- scipy/stats/_sampling.py +1314 -0
- scipy/stats/_sensitivity_analysis.py +713 -0
- scipy/stats/_sobol.cp311-win_arm64.lib +0 -0
- scipy/stats/_sobol.cp311-win_arm64.pyd +0 -0
- scipy/stats/_sobol.pyi +54 -0
- scipy/stats/_sobol_direction_numbers.npz +0 -0
- scipy/stats/_stats.cp311-win_arm64.lib +0 -0
- scipy/stats/_stats.cp311-win_arm64.pyd +0 -0
- scipy/stats/_stats.pxd +10 -0
- scipy/stats/_stats_mstats_common.py +322 -0
- scipy/stats/_stats_py.py +11089 -0
- scipy/stats/_stats_pythran.cp311-win_arm64.lib +0 -0
- scipy/stats/_stats_pythran.cp311-win_arm64.pyd +0 -0
- scipy/stats/_survival.py +683 -0
- scipy/stats/_tukeylambda_stats.py +199 -0
- scipy/stats/_unuran/__init__.py +0 -0
- scipy/stats/_unuran/unuran_wrapper.cp311-win_arm64.lib +0 -0
- scipy/stats/_unuran/unuran_wrapper.cp311-win_arm64.pyd +0 -0
- scipy/stats/_unuran/unuran_wrapper.pyi +179 -0
- scipy/stats/_variation.py +126 -0
- scipy/stats/_warnings_errors.py +38 -0
- scipy/stats/_wilcoxon.py +265 -0
- scipy/stats/biasedurn.py +16 -0
- scipy/stats/contingency.py +521 -0
- scipy/stats/distributions.py +24 -0
- scipy/stats/kde.py +18 -0
- scipy/stats/morestats.py +27 -0
- scipy/stats/mstats.py +140 -0
- scipy/stats/mstats_basic.py +42 -0
- scipy/stats/mstats_extras.py +25 -0
- scipy/stats/mvn.py +17 -0
- scipy/stats/qmc.py +236 -0
- scipy/stats/sampling.py +73 -0
- scipy/stats/stats.py +41 -0
- scipy/stats/tests/__init__.py +0 -0
- scipy/stats/tests/common_tests.py +356 -0
- scipy/stats/tests/data/_mvt.py +171 -0
- scipy/stats/tests/data/fisher_exact_results_from_r.py +607 -0
- scipy/stats/tests/data/jf_skew_t_gamlss_pdf_data.npy +0 -0
- scipy/stats/tests/data/levy_stable/stable-Z1-cdf-sample-data.npy +0 -0
- scipy/stats/tests/data/levy_stable/stable-Z1-pdf-sample-data.npy +0 -0
- scipy/stats/tests/data/levy_stable/stable-loc-scale-sample-data.npy +0 -0
- scipy/stats/tests/data/nist_anova/AtmWtAg.dat +108 -0
- scipy/stats/tests/data/nist_anova/SiRstv.dat +85 -0
- scipy/stats/tests/data/nist_anova/SmLs01.dat +249 -0
- scipy/stats/tests/data/nist_anova/SmLs02.dat +1869 -0
- scipy/stats/tests/data/nist_anova/SmLs03.dat +18069 -0
- scipy/stats/tests/data/nist_anova/SmLs04.dat +249 -0
- scipy/stats/tests/data/nist_anova/SmLs05.dat +1869 -0
- scipy/stats/tests/data/nist_anova/SmLs06.dat +18069 -0
- scipy/stats/tests/data/nist_anova/SmLs07.dat +249 -0
- scipy/stats/tests/data/nist_anova/SmLs08.dat +1869 -0
- scipy/stats/tests/data/nist_anova/SmLs09.dat +18069 -0
- scipy/stats/tests/data/nist_linregress/Norris.dat +97 -0
- scipy/stats/tests/data/rel_breitwigner_pdf_sample_data_ROOT.npy +0 -0
- scipy/stats/tests/data/studentized_range_mpmath_ref.json +1499 -0
- scipy/stats/tests/test_axis_nan_policy.py +1388 -0
- scipy/stats/tests/test_binned_statistic.py +568 -0
- scipy/stats/tests/test_censored_data.py +152 -0
- scipy/stats/tests/test_contingency.py +294 -0
- scipy/stats/tests/test_continued_fraction.py +173 -0
- scipy/stats/tests/test_continuous.py +2198 -0
- scipy/stats/tests/test_continuous_basic.py +1053 -0
- scipy/stats/tests/test_continuous_fit_censored.py +683 -0
- scipy/stats/tests/test_correlation.py +80 -0
- scipy/stats/tests/test_crosstab.py +115 -0
- scipy/stats/tests/test_discrete_basic.py +580 -0
- scipy/stats/tests/test_discrete_distns.py +700 -0
- scipy/stats/tests/test_distributions.py +10413 -0
- scipy/stats/tests/test_entropy.py +322 -0
- scipy/stats/tests/test_fast_gen_inversion.py +435 -0
- scipy/stats/tests/test_fit.py +1090 -0
- scipy/stats/tests/test_hypotests.py +1991 -0
- scipy/stats/tests/test_kdeoth.py +676 -0
- scipy/stats/tests/test_marray.py +289 -0
- scipy/stats/tests/test_mgc.py +217 -0
- scipy/stats/tests/test_morestats.py +3259 -0
- scipy/stats/tests/test_mstats_basic.py +2071 -0
- scipy/stats/tests/test_mstats_extras.py +172 -0
- scipy/stats/tests/test_multicomp.py +405 -0
- scipy/stats/tests/test_multivariate.py +4381 -0
- scipy/stats/tests/test_odds_ratio.py +148 -0
- scipy/stats/tests/test_qmc.py +1492 -0
- scipy/stats/tests/test_quantile.py +199 -0
- scipy/stats/tests/test_rank.py +345 -0
- scipy/stats/tests/test_relative_risk.py +95 -0
- scipy/stats/tests/test_resampling.py +2000 -0
- scipy/stats/tests/test_sampling.py +1450 -0
- scipy/stats/tests/test_sensitivity_analysis.py +310 -0
- scipy/stats/tests/test_stats.py +9707 -0
- scipy/stats/tests/test_survival.py +466 -0
- scipy/stats/tests/test_tukeylambda_stats.py +85 -0
- scipy/stats/tests/test_variation.py +216 -0
- scipy/version.py +12 -0
- scipy-1.16.2.dist-info/DELVEWHEEL +2 -0
- scipy-1.16.2.dist-info/LICENSE.txt +912 -0
- scipy-1.16.2.dist-info/METADATA +1061 -0
- scipy-1.16.2.dist-info/RECORD +1530 -0
- scipy-1.16.2.dist-info/WHEEL +4 -0
- scipy.libs/msvcp140-5f1c5dd31916990d94181e07bc3afb32.dll +0 -0
- scipy.libs/scipy_openblas-f3ac85b1f412f7e86514c923dc4058d1.dll +0 -0
@@ -0,0 +1,1634 @@
|
|
1
|
+
# Copyright (C) 2009, Pauli Virtanen <pav@iki.fi>
|
2
|
+
# Distributed under the same license as SciPy.
|
3
|
+
|
4
|
+
import inspect
|
5
|
+
import sys
|
6
|
+
import warnings
|
7
|
+
|
8
|
+
import numpy as np
|
9
|
+
from numpy import asarray, dot, vdot
|
10
|
+
|
11
|
+
from scipy.linalg import norm, solve, inv, qr, svd, LinAlgError
|
12
|
+
import scipy.sparse.linalg
|
13
|
+
import scipy.sparse
|
14
|
+
from scipy.linalg import get_blas_funcs
|
15
|
+
from scipy._lib._util import copy_if_needed
|
16
|
+
from scipy._lib._util import getfullargspec_no_self as _getfullargspec
|
17
|
+
from ._linesearch import scalar_search_wolfe1, scalar_search_armijo
|
18
|
+
from inspect import signature
|
19
|
+
from difflib import get_close_matches
|
20
|
+
|
21
|
+
|
22
|
+
__all__ = [
|
23
|
+
'broyden1', 'broyden2', 'anderson', 'linearmixing',
|
24
|
+
'diagbroyden', 'excitingmixing', 'newton_krylov',
|
25
|
+
'BroydenFirst', 'KrylovJacobian', 'InverseJacobian', 'NoConvergence']
|
26
|
+
|
27
|
+
#------------------------------------------------------------------------------
|
28
|
+
# Utility functions
|
29
|
+
#------------------------------------------------------------------------------
|
30
|
+
|
31
|
+
|
32
|
+
class NoConvergence(Exception):
|
33
|
+
"""Exception raised when nonlinear solver fails to converge within the specified
|
34
|
+
`maxiter`."""
|
35
|
+
pass
|
36
|
+
|
37
|
+
|
38
|
+
def maxnorm(x):
|
39
|
+
return np.absolute(x).max()
|
40
|
+
|
41
|
+
|
42
|
+
def _as_inexact(x):
|
43
|
+
"""Return `x` as an array, of either floats or complex floats"""
|
44
|
+
x = asarray(x)
|
45
|
+
if not np.issubdtype(x.dtype, np.inexact):
|
46
|
+
return asarray(x, dtype=np.float64)
|
47
|
+
return x
|
48
|
+
|
49
|
+
|
50
|
+
def _array_like(x, x0):
|
51
|
+
"""Return ndarray `x` as same array subclass and shape as `x0`"""
|
52
|
+
x = np.reshape(x, np.shape(x0))
|
53
|
+
wrap = getattr(x0, '__array_wrap__', x.__array_wrap__)
|
54
|
+
return wrap(x)
|
55
|
+
|
56
|
+
|
57
|
+
def _safe_norm(v):
|
58
|
+
if not np.isfinite(v).all():
|
59
|
+
return np.array(np.inf)
|
60
|
+
return norm(v)
|
61
|
+
|
62
|
+
#------------------------------------------------------------------------------
|
63
|
+
# Generic nonlinear solver machinery
|
64
|
+
#------------------------------------------------------------------------------
|
65
|
+
|
66
|
+
|
67
|
+
_doc_parts = dict(
|
68
|
+
params_basic="""
|
69
|
+
F : function(x) -> f
|
70
|
+
Function whose root to find; should take and return an array-like
|
71
|
+
object.
|
72
|
+
xin : array_like
|
73
|
+
Initial guess for the solution
|
74
|
+
""".strip(),
|
75
|
+
params_extra="""
|
76
|
+
iter : int, optional
|
77
|
+
Number of iterations to make. If omitted (default), make as many
|
78
|
+
as required to meet tolerances.
|
79
|
+
verbose : bool, optional
|
80
|
+
Print status to stdout on every iteration.
|
81
|
+
maxiter : int, optional
|
82
|
+
Maximum number of iterations to make. If more are needed to
|
83
|
+
meet convergence, `NoConvergence` is raised.
|
84
|
+
f_tol : float, optional
|
85
|
+
Absolute tolerance (in max-norm) for the residual.
|
86
|
+
If omitted, default is 6e-6.
|
87
|
+
f_rtol : float, optional
|
88
|
+
Relative tolerance for the residual. If omitted, not used.
|
89
|
+
x_tol : float, optional
|
90
|
+
Absolute minimum step size, as determined from the Jacobian
|
91
|
+
approximation. If the step size is smaller than this, optimization
|
92
|
+
is terminated as successful. If omitted, not used.
|
93
|
+
x_rtol : float, optional
|
94
|
+
Relative minimum step size. If omitted, not used.
|
95
|
+
tol_norm : function(vector) -> scalar, optional
|
96
|
+
Norm to use in convergence check. Default is the maximum norm.
|
97
|
+
line_search : {None, 'armijo' (default), 'wolfe'}, optional
|
98
|
+
Which type of a line search to use to determine the step size in the
|
99
|
+
direction given by the Jacobian approximation. Defaults to 'armijo'.
|
100
|
+
callback : function, optional
|
101
|
+
Optional callback function. It is called on every iteration as
|
102
|
+
``callback(x, f)`` where `x` is the current solution and `f`
|
103
|
+
the corresponding residual.
|
104
|
+
|
105
|
+
Returns
|
106
|
+
-------
|
107
|
+
sol : ndarray
|
108
|
+
An array (of similar array type as `x0`) containing the final solution.
|
109
|
+
|
110
|
+
Raises
|
111
|
+
------
|
112
|
+
NoConvergence
|
113
|
+
When a solution was not found.
|
114
|
+
|
115
|
+
""".strip()
|
116
|
+
)
|
117
|
+
|
118
|
+
|
119
|
+
def _set_doc(obj):
|
120
|
+
if obj.__doc__:
|
121
|
+
obj.__doc__ = obj.__doc__ % _doc_parts
|
122
|
+
|
123
|
+
|
124
|
+
def nonlin_solve(F, x0, jacobian='krylov', iter=None, verbose=False,
|
125
|
+
maxiter=None, f_tol=None, f_rtol=None, x_tol=None, x_rtol=None,
|
126
|
+
tol_norm=None, line_search='armijo', callback=None,
|
127
|
+
full_output=False, raise_exception=True):
|
128
|
+
"""
|
129
|
+
Find a root of a function, in a way suitable for large-scale problems.
|
130
|
+
|
131
|
+
Parameters
|
132
|
+
----------
|
133
|
+
%(params_basic)s
|
134
|
+
jacobian : Jacobian
|
135
|
+
A Jacobian approximation: `Jacobian` object or something that
|
136
|
+
`asjacobian` can transform to one. Alternatively, a string specifying
|
137
|
+
which of the builtin Jacobian approximations to use:
|
138
|
+
|
139
|
+
krylov, broyden1, broyden2, anderson
|
140
|
+
diagbroyden, linearmixing, excitingmixing
|
141
|
+
|
142
|
+
%(params_extra)s
|
143
|
+
full_output : bool
|
144
|
+
If true, returns a dictionary `info` containing convergence
|
145
|
+
information.
|
146
|
+
raise_exception : bool
|
147
|
+
If True, a `NoConvergence` exception is raise if no solution is found.
|
148
|
+
|
149
|
+
See Also
|
150
|
+
--------
|
151
|
+
asjacobian, Jacobian
|
152
|
+
|
153
|
+
Notes
|
154
|
+
-----
|
155
|
+
This algorithm implements the inexact Newton method, with
|
156
|
+
backtracking or full line searches. Several Jacobian
|
157
|
+
approximations are available, including Krylov and Quasi-Newton
|
158
|
+
methods.
|
159
|
+
|
160
|
+
References
|
161
|
+
----------
|
162
|
+
.. [KIM] C. T. Kelley, \"Iterative Methods for Linear and Nonlinear
|
163
|
+
Equations\". Society for Industrial and Applied Mathematics. (1995)
|
164
|
+
https://archive.siam.org/books/kelley/fr16/
|
165
|
+
|
166
|
+
"""
|
167
|
+
# Can't use default parameters because it's being explicitly passed as None
|
168
|
+
# from the calling function, so we need to set it here.
|
169
|
+
tol_norm = maxnorm if tol_norm is None else tol_norm
|
170
|
+
condition = TerminationCondition(f_tol=f_tol, f_rtol=f_rtol,
|
171
|
+
x_tol=x_tol, x_rtol=x_rtol,
|
172
|
+
iter=iter, norm=tol_norm)
|
173
|
+
|
174
|
+
x0 = _as_inexact(x0)
|
175
|
+
def func(z):
|
176
|
+
return _as_inexact(F(_array_like(z, x0))).flatten()
|
177
|
+
x = x0.flatten()
|
178
|
+
|
179
|
+
dx = np.full_like(x, np.inf)
|
180
|
+
Fx = func(x)
|
181
|
+
Fx_norm = norm(Fx)
|
182
|
+
|
183
|
+
jacobian = asjacobian(jacobian)
|
184
|
+
jacobian.setup(x.copy(), Fx, func)
|
185
|
+
|
186
|
+
if maxiter is None:
|
187
|
+
if iter is not None:
|
188
|
+
maxiter = iter + 1
|
189
|
+
else:
|
190
|
+
maxiter = 100*(x.size+1)
|
191
|
+
|
192
|
+
if line_search is True:
|
193
|
+
line_search = 'armijo'
|
194
|
+
elif line_search is False:
|
195
|
+
line_search = None
|
196
|
+
|
197
|
+
if line_search not in (None, 'armijo', 'wolfe'):
|
198
|
+
raise ValueError("Invalid line search")
|
199
|
+
|
200
|
+
# Solver tolerance selection
|
201
|
+
gamma = 0.9
|
202
|
+
eta_max = 0.9999
|
203
|
+
eta_treshold = 0.1
|
204
|
+
eta = 1e-3
|
205
|
+
|
206
|
+
for n in range(maxiter):
|
207
|
+
status = condition.check(Fx, x, dx)
|
208
|
+
if status:
|
209
|
+
break
|
210
|
+
|
211
|
+
# The tolerance, as computed for scipy.sparse.linalg.* routines
|
212
|
+
tol = min(eta, eta*Fx_norm)
|
213
|
+
dx = -jacobian.solve(Fx, tol=tol)
|
214
|
+
|
215
|
+
if norm(dx) == 0:
|
216
|
+
raise ValueError("Jacobian inversion yielded zero vector. "
|
217
|
+
"This indicates a bug in the Jacobian "
|
218
|
+
"approximation.")
|
219
|
+
|
220
|
+
# Line search, or Newton step
|
221
|
+
if line_search:
|
222
|
+
s, x, Fx, Fx_norm_new = _nonlin_line_search(func, x, Fx, dx,
|
223
|
+
line_search)
|
224
|
+
else:
|
225
|
+
s = 1.0
|
226
|
+
x = x + dx
|
227
|
+
Fx = func(x)
|
228
|
+
Fx_norm_new = norm(Fx)
|
229
|
+
|
230
|
+
jacobian.update(x.copy(), Fx)
|
231
|
+
|
232
|
+
if callback:
|
233
|
+
callback(x, Fx)
|
234
|
+
|
235
|
+
# Adjust forcing parameters for inexact methods
|
236
|
+
eta_A = gamma * Fx_norm_new**2 / Fx_norm**2
|
237
|
+
if gamma * eta**2 < eta_treshold:
|
238
|
+
eta = min(eta_max, eta_A)
|
239
|
+
else:
|
240
|
+
eta = min(eta_max, max(eta_A, gamma*eta**2))
|
241
|
+
|
242
|
+
Fx_norm = Fx_norm_new
|
243
|
+
|
244
|
+
# Print status
|
245
|
+
if verbose:
|
246
|
+
sys.stdout.write(f"{n}: |F(x)| = {tol_norm(Fx):g}; step {s:g}\n")
|
247
|
+
sys.stdout.flush()
|
248
|
+
else:
|
249
|
+
if raise_exception:
|
250
|
+
raise NoConvergence(_array_like(x, x0))
|
251
|
+
else:
|
252
|
+
status = 2
|
253
|
+
|
254
|
+
if full_output:
|
255
|
+
info = {'nit': condition.iteration,
|
256
|
+
'fun': Fx,
|
257
|
+
'status': status,
|
258
|
+
'success': status == 1,
|
259
|
+
'message': {1: 'A solution was found at the specified '
|
260
|
+
'tolerance.',
|
261
|
+
2: 'The maximum number of iterations allowed '
|
262
|
+
'has been reached.'
|
263
|
+
}[status]
|
264
|
+
}
|
265
|
+
return _array_like(x, x0), info
|
266
|
+
else:
|
267
|
+
return _array_like(x, x0)
|
268
|
+
|
269
|
+
|
270
|
+
_set_doc(nonlin_solve)
|
271
|
+
|
272
|
+
|
273
|
+
def _nonlin_line_search(func, x, Fx, dx, search_type='armijo', rdiff=1e-8,
|
274
|
+
smin=1e-2):
|
275
|
+
tmp_s = [0]
|
276
|
+
tmp_Fx = [Fx]
|
277
|
+
tmp_phi = [norm(Fx)**2]
|
278
|
+
s_norm = norm(x) / norm(dx)
|
279
|
+
|
280
|
+
def phi(s, store=True):
|
281
|
+
if s == tmp_s[0]:
|
282
|
+
return tmp_phi[0]
|
283
|
+
xt = x + s*dx
|
284
|
+
v = func(xt)
|
285
|
+
p = _safe_norm(v)**2
|
286
|
+
if store:
|
287
|
+
tmp_s[0] = s
|
288
|
+
tmp_phi[0] = p
|
289
|
+
tmp_Fx[0] = v
|
290
|
+
return p
|
291
|
+
|
292
|
+
def derphi(s):
|
293
|
+
ds = (abs(s) + s_norm + 1) * rdiff
|
294
|
+
return (phi(s+ds, store=False) - phi(s)) / ds
|
295
|
+
|
296
|
+
if search_type == 'wolfe':
|
297
|
+
s, phi1, phi0 = scalar_search_wolfe1(phi, derphi, tmp_phi[0],
|
298
|
+
xtol=1e-2, amin=smin)
|
299
|
+
elif search_type == 'armijo':
|
300
|
+
s, phi1 = scalar_search_armijo(phi, tmp_phi[0], -tmp_phi[0],
|
301
|
+
amin=smin)
|
302
|
+
|
303
|
+
if s is None:
|
304
|
+
# XXX: No suitable step length found. Take the full Newton step,
|
305
|
+
# and hope for the best.
|
306
|
+
s = 1.0
|
307
|
+
|
308
|
+
x = x + s*dx
|
309
|
+
if s == tmp_s[0]:
|
310
|
+
Fx = tmp_Fx[0]
|
311
|
+
else:
|
312
|
+
Fx = func(x)
|
313
|
+
Fx_norm = norm(Fx)
|
314
|
+
|
315
|
+
return s, x, Fx, Fx_norm
|
316
|
+
|
317
|
+
|
318
|
+
class TerminationCondition:
|
319
|
+
"""
|
320
|
+
Termination condition for an iteration. It is terminated if
|
321
|
+
|
322
|
+
- |F| < f_rtol*|F_0|, AND
|
323
|
+
- |F| < f_tol
|
324
|
+
|
325
|
+
AND
|
326
|
+
|
327
|
+
- |dx| < x_rtol*|x|, AND
|
328
|
+
- |dx| < x_tol
|
329
|
+
|
330
|
+
"""
|
331
|
+
def __init__(self, f_tol=None, f_rtol=None, x_tol=None, x_rtol=None,
|
332
|
+
iter=None, norm=maxnorm):
|
333
|
+
|
334
|
+
if f_tol is None:
|
335
|
+
f_tol = np.finfo(np.float64).eps ** (1./3)
|
336
|
+
if f_rtol is None:
|
337
|
+
f_rtol = np.inf
|
338
|
+
if x_tol is None:
|
339
|
+
x_tol = np.inf
|
340
|
+
if x_rtol is None:
|
341
|
+
x_rtol = np.inf
|
342
|
+
|
343
|
+
self.x_tol = x_tol
|
344
|
+
self.x_rtol = x_rtol
|
345
|
+
self.f_tol = f_tol
|
346
|
+
self.f_rtol = f_rtol
|
347
|
+
|
348
|
+
self.norm = norm
|
349
|
+
|
350
|
+
self.iter = iter
|
351
|
+
|
352
|
+
self.f0_norm = None
|
353
|
+
self.iteration = 0
|
354
|
+
|
355
|
+
def check(self, f, x, dx):
|
356
|
+
self.iteration += 1
|
357
|
+
f_norm = self.norm(f)
|
358
|
+
x_norm = self.norm(x)
|
359
|
+
dx_norm = self.norm(dx)
|
360
|
+
|
361
|
+
if self.f0_norm is None:
|
362
|
+
self.f0_norm = f_norm
|
363
|
+
|
364
|
+
if f_norm == 0:
|
365
|
+
return 1
|
366
|
+
|
367
|
+
if self.iter is not None:
|
368
|
+
# backwards compatibility with SciPy 0.6.0
|
369
|
+
return 2 * (self.iteration > self.iter)
|
370
|
+
|
371
|
+
# NB: condition must succeed for rtol=inf even if norm == 0
|
372
|
+
return int((f_norm <= self.f_tol
|
373
|
+
and f_norm/self.f_rtol <= self.f0_norm)
|
374
|
+
and (dx_norm <= self.x_tol
|
375
|
+
and dx_norm/self.x_rtol <= x_norm))
|
376
|
+
|
377
|
+
|
378
|
+
#------------------------------------------------------------------------------
|
379
|
+
# Generic Jacobian approximation
|
380
|
+
#------------------------------------------------------------------------------
|
381
|
+
|
382
|
+
class Jacobian:
|
383
|
+
"""
|
384
|
+
Common interface for Jacobians or Jacobian approximations.
|
385
|
+
|
386
|
+
The optional methods come useful when implementing trust region
|
387
|
+
etc., algorithms that often require evaluating transposes of the
|
388
|
+
Jacobian.
|
389
|
+
|
390
|
+
Methods
|
391
|
+
-------
|
392
|
+
solve
|
393
|
+
Returns J^-1 * v
|
394
|
+
update
|
395
|
+
Updates Jacobian to point `x` (where the function has residual `Fx`)
|
396
|
+
|
397
|
+
matvec : optional
|
398
|
+
Returns J * v
|
399
|
+
rmatvec : optional
|
400
|
+
Returns A^H * v
|
401
|
+
rsolve : optional
|
402
|
+
Returns A^-H * v
|
403
|
+
matmat : optional
|
404
|
+
Returns A * V, where V is a dense matrix with dimensions (N,K).
|
405
|
+
todense : optional
|
406
|
+
Form the dense Jacobian matrix. Necessary for dense trust region
|
407
|
+
algorithms, and useful for testing.
|
408
|
+
|
409
|
+
Attributes
|
410
|
+
----------
|
411
|
+
shape
|
412
|
+
Matrix dimensions (M, N)
|
413
|
+
dtype
|
414
|
+
Data type of the matrix.
|
415
|
+
func : callable, optional
|
416
|
+
Function the Jacobian corresponds to
|
417
|
+
|
418
|
+
"""
|
419
|
+
|
420
|
+
def __init__(self, **kw):
|
421
|
+
names = ["solve", "update", "matvec", "rmatvec", "rsolve",
|
422
|
+
"matmat", "todense", "shape", "dtype"]
|
423
|
+
for name, value in kw.items():
|
424
|
+
if name not in names:
|
425
|
+
raise ValueError(f"Unknown keyword argument {name}")
|
426
|
+
if value is not None:
|
427
|
+
setattr(self, name, kw[name])
|
428
|
+
|
429
|
+
|
430
|
+
if hasattr(self, "todense"):
|
431
|
+
def __array__(self, dtype=None, copy=None):
|
432
|
+
if dtype is not None:
|
433
|
+
raise ValueError(f"`dtype` must be None, was {dtype}")
|
434
|
+
return self.todense()
|
435
|
+
|
436
|
+
def aspreconditioner(self):
|
437
|
+
return InverseJacobian(self)
|
438
|
+
|
439
|
+
def solve(self, v, tol=0):
|
440
|
+
raise NotImplementedError
|
441
|
+
|
442
|
+
def update(self, x, F):
|
443
|
+
pass
|
444
|
+
|
445
|
+
def setup(self, x, F, func):
|
446
|
+
self.func = func
|
447
|
+
self.shape = (F.size, x.size)
|
448
|
+
self.dtype = F.dtype
|
449
|
+
if self.__class__.setup is Jacobian.setup:
|
450
|
+
# Call on the first point unless overridden
|
451
|
+
self.update(x, F)
|
452
|
+
|
453
|
+
|
454
|
+
class InverseJacobian:
|
455
|
+
"""
|
456
|
+
A simple wrapper that inverts the Jacobian using the `solve` method.
|
457
|
+
|
458
|
+
.. legacy:: class
|
459
|
+
|
460
|
+
See the newer, more consistent interfaces in :mod:`scipy.optimize`.
|
461
|
+
|
462
|
+
Parameters
|
463
|
+
----------
|
464
|
+
jacobian : Jacobian
|
465
|
+
The Jacobian to invert.
|
466
|
+
|
467
|
+
Attributes
|
468
|
+
----------
|
469
|
+
shape
|
470
|
+
Matrix dimensions (M, N)
|
471
|
+
dtype
|
472
|
+
Data type of the matrix.
|
473
|
+
|
474
|
+
"""
|
475
|
+
def __init__(self, jacobian):
|
476
|
+
self.jacobian = jacobian
|
477
|
+
self.matvec = jacobian.solve
|
478
|
+
self.update = jacobian.update
|
479
|
+
if hasattr(jacobian, 'setup'):
|
480
|
+
self.setup = jacobian.setup
|
481
|
+
if hasattr(jacobian, 'rsolve'):
|
482
|
+
self.rmatvec = jacobian.rsolve
|
483
|
+
|
484
|
+
@property
|
485
|
+
def shape(self):
|
486
|
+
return self.jacobian.shape
|
487
|
+
|
488
|
+
@property
|
489
|
+
def dtype(self):
|
490
|
+
return self.jacobian.dtype
|
491
|
+
|
492
|
+
|
493
|
+
def asjacobian(J):
|
494
|
+
"""
|
495
|
+
Convert given object to one suitable for use as a Jacobian.
|
496
|
+
"""
|
497
|
+
spsolve = scipy.sparse.linalg.spsolve
|
498
|
+
if isinstance(J, Jacobian):
|
499
|
+
return J
|
500
|
+
elif inspect.isclass(J) and issubclass(J, Jacobian):
|
501
|
+
return J()
|
502
|
+
elif isinstance(J, np.ndarray):
|
503
|
+
if J.ndim > 2:
|
504
|
+
raise ValueError('array must have rank <= 2')
|
505
|
+
J = np.atleast_2d(np.asarray(J))
|
506
|
+
if J.shape[0] != J.shape[1]:
|
507
|
+
raise ValueError('array must be square')
|
508
|
+
|
509
|
+
return Jacobian(matvec=lambda v: dot(J, v),
|
510
|
+
rmatvec=lambda v: dot(J.conj().T, v),
|
511
|
+
solve=lambda v, tol=0: solve(J, v),
|
512
|
+
rsolve=lambda v, tol=0: solve(J.conj().T, v),
|
513
|
+
dtype=J.dtype, shape=J.shape)
|
514
|
+
elif scipy.sparse.issparse(J):
|
515
|
+
if J.shape[0] != J.shape[1]:
|
516
|
+
raise ValueError('matrix must be square')
|
517
|
+
return Jacobian(matvec=lambda v: J @ v,
|
518
|
+
rmatvec=lambda v: J.conj().T @ v,
|
519
|
+
solve=lambda v, tol=0: spsolve(J, v),
|
520
|
+
rsolve=lambda v, tol=0: spsolve(J.conj().T, v),
|
521
|
+
dtype=J.dtype, shape=J.shape)
|
522
|
+
elif hasattr(J, 'shape') and hasattr(J, 'dtype') and hasattr(J, 'solve'):
|
523
|
+
return Jacobian(matvec=getattr(J, 'matvec'),
|
524
|
+
rmatvec=getattr(J, 'rmatvec'),
|
525
|
+
solve=J.solve,
|
526
|
+
rsolve=getattr(J, 'rsolve'),
|
527
|
+
update=getattr(J, 'update'),
|
528
|
+
setup=getattr(J, 'setup'),
|
529
|
+
dtype=J.dtype,
|
530
|
+
shape=J.shape)
|
531
|
+
elif callable(J):
|
532
|
+
# Assume it's a function J(x) that returns the Jacobian
|
533
|
+
class Jac(Jacobian):
|
534
|
+
def update(self, x, F):
|
535
|
+
self.x = x
|
536
|
+
|
537
|
+
def solve(self, v, tol=0):
|
538
|
+
m = J(self.x)
|
539
|
+
if isinstance(m, np.ndarray):
|
540
|
+
return solve(m, v)
|
541
|
+
elif scipy.sparse.issparse(m):
|
542
|
+
return spsolve(m, v)
|
543
|
+
else:
|
544
|
+
raise ValueError("Unknown matrix type")
|
545
|
+
|
546
|
+
def matvec(self, v):
|
547
|
+
m = J(self.x)
|
548
|
+
if isinstance(m, np.ndarray):
|
549
|
+
return dot(m, v)
|
550
|
+
elif scipy.sparse.issparse(m):
|
551
|
+
return m @ v
|
552
|
+
else:
|
553
|
+
raise ValueError("Unknown matrix type")
|
554
|
+
|
555
|
+
def rsolve(self, v, tol=0):
|
556
|
+
m = J(self.x)
|
557
|
+
if isinstance(m, np.ndarray):
|
558
|
+
return solve(m.conj().T, v)
|
559
|
+
elif scipy.sparse.issparse(m):
|
560
|
+
return spsolve(m.conj().T, v)
|
561
|
+
else:
|
562
|
+
raise ValueError("Unknown matrix type")
|
563
|
+
|
564
|
+
def rmatvec(self, v):
|
565
|
+
m = J(self.x)
|
566
|
+
if isinstance(m, np.ndarray):
|
567
|
+
return dot(m.conj().T, v)
|
568
|
+
elif scipy.sparse.issparse(m):
|
569
|
+
return m.conj().T @ v
|
570
|
+
else:
|
571
|
+
raise ValueError("Unknown matrix type")
|
572
|
+
return Jac()
|
573
|
+
elif isinstance(J, str):
|
574
|
+
return dict(broyden1=BroydenFirst,
|
575
|
+
broyden2=BroydenSecond,
|
576
|
+
anderson=Anderson,
|
577
|
+
diagbroyden=DiagBroyden,
|
578
|
+
linearmixing=LinearMixing,
|
579
|
+
excitingmixing=ExcitingMixing,
|
580
|
+
krylov=KrylovJacobian)[J]()
|
581
|
+
else:
|
582
|
+
raise TypeError('Cannot convert object to a Jacobian')
|
583
|
+
|
584
|
+
|
585
|
+
#------------------------------------------------------------------------------
|
586
|
+
# Broyden
|
587
|
+
#------------------------------------------------------------------------------
|
588
|
+
|
589
|
+
class GenericBroyden(Jacobian):
|
590
|
+
def setup(self, x0, f0, func):
|
591
|
+
Jacobian.setup(self, x0, f0, func)
|
592
|
+
self.last_f = f0
|
593
|
+
self.last_x = x0
|
594
|
+
|
595
|
+
if hasattr(self, 'alpha') and self.alpha is None:
|
596
|
+
# Autoscale the initial Jacobian parameter
|
597
|
+
# unless we have already guessed the solution.
|
598
|
+
normf0 = norm(f0)
|
599
|
+
if normf0:
|
600
|
+
self.alpha = 0.5*max(norm(x0), 1) / normf0
|
601
|
+
else:
|
602
|
+
self.alpha = 1.0
|
603
|
+
|
604
|
+
def _update(self, x, f, dx, df, dx_norm, df_norm):
|
605
|
+
raise NotImplementedError
|
606
|
+
|
607
|
+
def update(self, x, f):
|
608
|
+
df = f - self.last_f
|
609
|
+
dx = x - self.last_x
|
610
|
+
self._update(x, f, dx, df, norm(dx), norm(df))
|
611
|
+
self.last_f = f
|
612
|
+
self.last_x = x
|
613
|
+
|
614
|
+
|
615
|
+
class LowRankMatrix:
|
616
|
+
r"""
|
617
|
+
A matrix represented as
|
618
|
+
|
619
|
+
.. math:: \alpha I + \sum_{n=0}^{n=M} c_n d_n^\dagger
|
620
|
+
|
621
|
+
However, if the rank of the matrix reaches the dimension of the vectors,
|
622
|
+
full matrix representation will be used thereon.
|
623
|
+
|
624
|
+
"""
|
625
|
+
|
626
|
+
def __init__(self, alpha, n, dtype):
|
627
|
+
self.alpha = alpha
|
628
|
+
self.cs = []
|
629
|
+
self.ds = []
|
630
|
+
self.n = n
|
631
|
+
self.dtype = dtype
|
632
|
+
self.collapsed = None
|
633
|
+
|
634
|
+
@staticmethod
|
635
|
+
def _matvec(v, alpha, cs, ds):
|
636
|
+
axpy, scal, dotc = get_blas_funcs(['axpy', 'scal', 'dotc'],
|
637
|
+
cs[:1] + [v])
|
638
|
+
w = alpha * v
|
639
|
+
for c, d in zip(cs, ds):
|
640
|
+
a = dotc(d, v)
|
641
|
+
w = axpy(c, w, w.size, a)
|
642
|
+
return w
|
643
|
+
|
644
|
+
@staticmethod
|
645
|
+
def _solve(v, alpha, cs, ds):
|
646
|
+
"""Evaluate w = M^-1 v"""
|
647
|
+
if len(cs) == 0:
|
648
|
+
return v/alpha
|
649
|
+
|
650
|
+
# (B + C D^H)^-1 = B^-1 - B^-1 C (I + D^H B^-1 C)^-1 D^H B^-1
|
651
|
+
|
652
|
+
axpy, dotc = get_blas_funcs(['axpy', 'dotc'], cs[:1] + [v])
|
653
|
+
|
654
|
+
c0 = cs[0]
|
655
|
+
A = alpha * np.identity(len(cs), dtype=c0.dtype)
|
656
|
+
for i, d in enumerate(ds):
|
657
|
+
for j, c in enumerate(cs):
|
658
|
+
A[i,j] += dotc(d, c)
|
659
|
+
|
660
|
+
q = np.zeros(len(cs), dtype=c0.dtype)
|
661
|
+
for j, d in enumerate(ds):
|
662
|
+
q[j] = dotc(d, v)
|
663
|
+
q /= alpha
|
664
|
+
q = solve(A, q)
|
665
|
+
|
666
|
+
w = v/alpha
|
667
|
+
for c, qc in zip(cs, q):
|
668
|
+
w = axpy(c, w, w.size, -qc)
|
669
|
+
|
670
|
+
return w
|
671
|
+
|
672
|
+
def matvec(self, v):
|
673
|
+
"""Evaluate w = M v"""
|
674
|
+
if self.collapsed is not None:
|
675
|
+
return np.dot(self.collapsed, v)
|
676
|
+
return LowRankMatrix._matvec(v, self.alpha, self.cs, self.ds)
|
677
|
+
|
678
|
+
def rmatvec(self, v):
|
679
|
+
"""Evaluate w = M^H v"""
|
680
|
+
if self.collapsed is not None:
|
681
|
+
return np.dot(self.collapsed.T.conj(), v)
|
682
|
+
return LowRankMatrix._matvec(v, np.conj(self.alpha), self.ds, self.cs)
|
683
|
+
|
684
|
+
def solve(self, v, tol=0):
|
685
|
+
"""Evaluate w = M^-1 v"""
|
686
|
+
if self.collapsed is not None:
|
687
|
+
return solve(self.collapsed, v)
|
688
|
+
return LowRankMatrix._solve(v, self.alpha, self.cs, self.ds)
|
689
|
+
|
690
|
+
def rsolve(self, v, tol=0):
|
691
|
+
"""Evaluate w = M^-H v"""
|
692
|
+
if self.collapsed is not None:
|
693
|
+
return solve(self.collapsed.T.conj(), v)
|
694
|
+
return LowRankMatrix._solve(v, np.conj(self.alpha), self.ds, self.cs)
|
695
|
+
|
696
|
+
def append(self, c, d):
|
697
|
+
if self.collapsed is not None:
|
698
|
+
self.collapsed += c[:,None] * d[None,:].conj()
|
699
|
+
return
|
700
|
+
|
701
|
+
self.cs.append(c)
|
702
|
+
self.ds.append(d)
|
703
|
+
|
704
|
+
if len(self.cs) > c.size:
|
705
|
+
self.collapse()
|
706
|
+
|
707
|
+
def __array__(self, dtype=None, copy=None):
|
708
|
+
if dtype is not None:
|
709
|
+
warnings.warn("LowRankMatrix is scipy-internal code, `dtype` "
|
710
|
+
f"should only be None but was {dtype} (not handled)",
|
711
|
+
stacklevel=3)
|
712
|
+
if copy is not None:
|
713
|
+
warnings.warn("LowRankMatrix is scipy-internal code, `copy` "
|
714
|
+
f"should only be None but was {copy} (not handled)",
|
715
|
+
stacklevel=3)
|
716
|
+
if self.collapsed is not None:
|
717
|
+
return self.collapsed
|
718
|
+
|
719
|
+
Gm = self.alpha*np.identity(self.n, dtype=self.dtype)
|
720
|
+
for c, d in zip(self.cs, self.ds):
|
721
|
+
Gm += c[:,None]*d[None,:].conj()
|
722
|
+
return Gm
|
723
|
+
|
724
|
+
def collapse(self):
|
725
|
+
"""Collapse the low-rank matrix to a full-rank one."""
|
726
|
+
self.collapsed = np.array(self, copy=copy_if_needed)
|
727
|
+
self.cs = None
|
728
|
+
self.ds = None
|
729
|
+
self.alpha = None
|
730
|
+
|
731
|
+
def restart_reduce(self, rank):
|
732
|
+
"""
|
733
|
+
Reduce the rank of the matrix by dropping all vectors.
|
734
|
+
"""
|
735
|
+
if self.collapsed is not None:
|
736
|
+
return
|
737
|
+
assert rank > 0
|
738
|
+
if len(self.cs) > rank:
|
739
|
+
del self.cs[:]
|
740
|
+
del self.ds[:]
|
741
|
+
|
742
|
+
def simple_reduce(self, rank):
|
743
|
+
"""
|
744
|
+
Reduce the rank of the matrix by dropping oldest vectors.
|
745
|
+
"""
|
746
|
+
if self.collapsed is not None:
|
747
|
+
return
|
748
|
+
assert rank > 0
|
749
|
+
while len(self.cs) > rank:
|
750
|
+
del self.cs[0]
|
751
|
+
del self.ds[0]
|
752
|
+
|
753
|
+
def svd_reduce(self, max_rank, to_retain=None):
|
754
|
+
"""
|
755
|
+
Reduce the rank of the matrix by retaining some SVD components.
|
756
|
+
|
757
|
+
This corresponds to the \"Broyden Rank Reduction Inverse\"
|
758
|
+
algorithm described in [1]_.
|
759
|
+
|
760
|
+
Note that the SVD decomposition can be done by solving only a
|
761
|
+
problem whose size is the effective rank of this matrix, which
|
762
|
+
is viable even for large problems.
|
763
|
+
|
764
|
+
Parameters
|
765
|
+
----------
|
766
|
+
max_rank : int
|
767
|
+
Maximum rank of this matrix after reduction.
|
768
|
+
to_retain : int, optional
|
769
|
+
Number of SVD components to retain when reduction is done
|
770
|
+
(ie. rank > max_rank). Default is ``max_rank - 2``.
|
771
|
+
|
772
|
+
References
|
773
|
+
----------
|
774
|
+
.. [1] B.A. van der Rotten, PhD thesis,
|
775
|
+
\"A limited memory Broyden method to solve high-dimensional
|
776
|
+
systems of nonlinear equations\". Mathematisch Instituut,
|
777
|
+
Universiteit Leiden, The Netherlands (2003).
|
778
|
+
|
779
|
+
https://web.archive.org/web/20161022015821/http://www.math.leidenuniv.nl/scripties/Rotten.pdf
|
780
|
+
|
781
|
+
"""
|
782
|
+
if self.collapsed is not None:
|
783
|
+
return
|
784
|
+
|
785
|
+
p = max_rank
|
786
|
+
if to_retain is not None:
|
787
|
+
q = to_retain
|
788
|
+
else:
|
789
|
+
q = p - 2
|
790
|
+
|
791
|
+
if self.cs:
|
792
|
+
p = min(p, len(self.cs[0]))
|
793
|
+
q = max(0, min(q, p-1))
|
794
|
+
|
795
|
+
m = len(self.cs)
|
796
|
+
if m < p:
|
797
|
+
# nothing to do
|
798
|
+
return
|
799
|
+
|
800
|
+
C = np.array(self.cs).T
|
801
|
+
D = np.array(self.ds).T
|
802
|
+
|
803
|
+
D, R = qr(D, mode='economic')
|
804
|
+
C = dot(C, R.T.conj())
|
805
|
+
|
806
|
+
U, S, WH = svd(C, full_matrices=False)
|
807
|
+
|
808
|
+
C = dot(C, inv(WH))
|
809
|
+
D = dot(D, WH.T.conj())
|
810
|
+
|
811
|
+
for k in range(q):
|
812
|
+
self.cs[k] = C[:,k].copy()
|
813
|
+
self.ds[k] = D[:,k].copy()
|
814
|
+
|
815
|
+
del self.cs[q:]
|
816
|
+
del self.ds[q:]
|
817
|
+
|
818
|
+
|
819
|
+
_doc_parts['broyden_params'] = """
|
820
|
+
alpha : float, optional
|
821
|
+
Initial guess for the Jacobian is ``(-1/alpha)``.
|
822
|
+
reduction_method : str or tuple, optional
|
823
|
+
Method used in ensuring that the rank of the Broyden matrix
|
824
|
+
stays low. Can either be a string giving the name of the method,
|
825
|
+
or a tuple of the form ``(method, param1, param2, ...)``
|
826
|
+
that gives the name of the method and values for additional parameters.
|
827
|
+
|
828
|
+
Methods available:
|
829
|
+
|
830
|
+
- ``restart``: drop all matrix columns. Has no extra parameters.
|
831
|
+
- ``simple``: drop oldest matrix column. Has no extra parameters.
|
832
|
+
- ``svd``: keep only the most significant SVD components.
|
833
|
+
Takes an extra parameter, ``to_retain``, which determines the
|
834
|
+
number of SVD components to retain when rank reduction is done.
|
835
|
+
Default is ``max_rank - 2``.
|
836
|
+
|
837
|
+
max_rank : int, optional
|
838
|
+
Maximum rank for the Broyden matrix.
|
839
|
+
Default is infinity (i.e., no rank reduction).
|
840
|
+
""".strip()
|
841
|
+
|
842
|
+
|
843
|
+
class BroydenFirst(GenericBroyden):
|
844
|
+
"""
|
845
|
+
Find a root of a function, using Broyden's first Jacobian approximation.
|
846
|
+
|
847
|
+
This method is also known as "Broyden's good method".
|
848
|
+
|
849
|
+
Parameters
|
850
|
+
----------
|
851
|
+
%(params_basic)s
|
852
|
+
%(broyden_params)s
|
853
|
+
%(params_extra)s
|
854
|
+
|
855
|
+
See Also
|
856
|
+
--------
|
857
|
+
root : Interface to root finding algorithms for multivariate
|
858
|
+
functions. See ``method='broyden1'`` in particular.
|
859
|
+
|
860
|
+
Notes
|
861
|
+
-----
|
862
|
+
This algorithm implements the inverse Jacobian Quasi-Newton update
|
863
|
+
|
864
|
+
.. math:: H_+ = H + (dx - H df) dx^\\dagger H / ( dx^\\dagger H df)
|
865
|
+
|
866
|
+
which corresponds to Broyden's first Jacobian update
|
867
|
+
|
868
|
+
.. math:: J_+ = J + (df - J dx) dx^\\dagger / dx^\\dagger dx
|
869
|
+
|
870
|
+
|
871
|
+
References
|
872
|
+
----------
|
873
|
+
.. [1] B.A. van der Rotten, PhD thesis,
|
874
|
+
"A limited memory Broyden method to solve high-dimensional
|
875
|
+
systems of nonlinear equations". Mathematisch Instituut,
|
876
|
+
Universiteit Leiden, The Netherlands (2003).
|
877
|
+
https://math.leidenuniv.nl/scripties/Rotten.pdf
|
878
|
+
|
879
|
+
Examples
|
880
|
+
--------
|
881
|
+
The following functions define a system of nonlinear equations
|
882
|
+
|
883
|
+
>>> def fun(x):
|
884
|
+
... return [x[0] + 0.5 * (x[0] - x[1])**3 - 1.0,
|
885
|
+
... 0.5 * (x[1] - x[0])**3 + x[1]]
|
886
|
+
|
887
|
+
A solution can be obtained as follows.
|
888
|
+
|
889
|
+
>>> from scipy import optimize
|
890
|
+
>>> sol = optimize.broyden1(fun, [0, 0])
|
891
|
+
>>> sol
|
892
|
+
array([0.84116396, 0.15883641])
|
893
|
+
|
894
|
+
"""
|
895
|
+
|
896
|
+
def __init__(self, alpha=None, reduction_method='restart', max_rank=None):
|
897
|
+
GenericBroyden.__init__(self)
|
898
|
+
self.alpha = alpha
|
899
|
+
self.Gm = None
|
900
|
+
|
901
|
+
if max_rank is None:
|
902
|
+
max_rank = np.inf
|
903
|
+
self.max_rank = max_rank
|
904
|
+
|
905
|
+
if isinstance(reduction_method, str):
|
906
|
+
reduce_params = ()
|
907
|
+
else:
|
908
|
+
reduce_params = reduction_method[1:]
|
909
|
+
reduction_method = reduction_method[0]
|
910
|
+
reduce_params = (max_rank - 1,) + reduce_params
|
911
|
+
|
912
|
+
if reduction_method == 'svd':
|
913
|
+
self._reduce = lambda: self.Gm.svd_reduce(*reduce_params)
|
914
|
+
elif reduction_method == 'simple':
|
915
|
+
self._reduce = lambda: self.Gm.simple_reduce(*reduce_params)
|
916
|
+
elif reduction_method == 'restart':
|
917
|
+
self._reduce = lambda: self.Gm.restart_reduce(*reduce_params)
|
918
|
+
else:
|
919
|
+
raise ValueError(f"Unknown rank reduction method '{reduction_method}'")
|
920
|
+
|
921
|
+
def setup(self, x, F, func):
|
922
|
+
GenericBroyden.setup(self, x, F, func)
|
923
|
+
self.Gm = LowRankMatrix(-self.alpha, self.shape[0], self.dtype)
|
924
|
+
|
925
|
+
def todense(self):
|
926
|
+
return inv(self.Gm)
|
927
|
+
|
928
|
+
def solve(self, f, tol=0):
|
929
|
+
r = self.Gm.matvec(f)
|
930
|
+
if not np.isfinite(r).all():
|
931
|
+
# singular; reset the Jacobian approximation
|
932
|
+
self.setup(self.last_x, self.last_f, self.func)
|
933
|
+
return self.Gm.matvec(f)
|
934
|
+
return r
|
935
|
+
|
936
|
+
def matvec(self, f):
|
937
|
+
return self.Gm.solve(f)
|
938
|
+
|
939
|
+
def rsolve(self, f, tol=0):
|
940
|
+
return self.Gm.rmatvec(f)
|
941
|
+
|
942
|
+
def rmatvec(self, f):
|
943
|
+
return self.Gm.rsolve(f)
|
944
|
+
|
945
|
+
def _update(self, x, f, dx, df, dx_norm, df_norm):
|
946
|
+
self._reduce() # reduce first to preserve secant condition
|
947
|
+
|
948
|
+
v = self.Gm.rmatvec(dx)
|
949
|
+
c = dx - self.Gm.matvec(df)
|
950
|
+
d = v / vdot(df, v)
|
951
|
+
|
952
|
+
self.Gm.append(c, d)
|
953
|
+
|
954
|
+
|
955
|
+
class BroydenSecond(BroydenFirst):
|
956
|
+
"""
|
957
|
+
Find a root of a function, using Broyden\'s second Jacobian approximation.
|
958
|
+
|
959
|
+
This method is also known as \"Broyden's bad method\".
|
960
|
+
|
961
|
+
Parameters
|
962
|
+
----------
|
963
|
+
%(params_basic)s
|
964
|
+
%(broyden_params)s
|
965
|
+
%(params_extra)s
|
966
|
+
|
967
|
+
See Also
|
968
|
+
--------
|
969
|
+
root : Interface to root finding algorithms for multivariate
|
970
|
+
functions. See ``method='broyden2'`` in particular.
|
971
|
+
|
972
|
+
Notes
|
973
|
+
-----
|
974
|
+
This algorithm implements the inverse Jacobian Quasi-Newton update
|
975
|
+
|
976
|
+
.. math:: H_+ = H + (dx - H df) df^\\dagger / ( df^\\dagger df)
|
977
|
+
|
978
|
+
corresponding to Broyden's second method.
|
979
|
+
|
980
|
+
References
|
981
|
+
----------
|
982
|
+
.. [1] B.A. van der Rotten, PhD thesis,
|
983
|
+
\"A limited memory Broyden method to solve high-dimensional
|
984
|
+
systems of nonlinear equations\". Mathematisch Instituut,
|
985
|
+
Universiteit Leiden, The Netherlands (2003).
|
986
|
+
|
987
|
+
https://web.archive.org/web/20161022015821/http://www.math.leidenuniv.nl/scripties/Rotten.pdf
|
988
|
+
|
989
|
+
Examples
|
990
|
+
--------
|
991
|
+
The following functions define a system of nonlinear equations
|
992
|
+
|
993
|
+
>>> def fun(x):
|
994
|
+
... return [x[0] + 0.5 * (x[0] - x[1])**3 - 1.0,
|
995
|
+
... 0.5 * (x[1] - x[0])**3 + x[1]]
|
996
|
+
|
997
|
+
A solution can be obtained as follows.
|
998
|
+
|
999
|
+
>>> from scipy import optimize
|
1000
|
+
>>> sol = optimize.broyden2(fun, [0, 0])
|
1001
|
+
>>> sol
|
1002
|
+
array([0.84116365, 0.15883529])
|
1003
|
+
|
1004
|
+
"""
|
1005
|
+
|
1006
|
+
def _update(self, x, f, dx, df, dx_norm, df_norm):
|
1007
|
+
self._reduce() # reduce first to preserve secant condition
|
1008
|
+
|
1009
|
+
v = df
|
1010
|
+
c = dx - self.Gm.matvec(df)
|
1011
|
+
d = v / df_norm**2
|
1012
|
+
self.Gm.append(c, d)
|
1013
|
+
|
1014
|
+
|
1015
|
+
#------------------------------------------------------------------------------
|
1016
|
+
# Broyden-like (restricted memory)
|
1017
|
+
#------------------------------------------------------------------------------
|
1018
|
+
|
1019
|
+
class Anderson(GenericBroyden):
|
1020
|
+
"""
|
1021
|
+
Find a root of a function, using (extended) Anderson mixing.
|
1022
|
+
|
1023
|
+
The Jacobian is formed by for a 'best' solution in the space
|
1024
|
+
spanned by last `M` vectors. As a result, only a MxM matrix
|
1025
|
+
inversions and MxN multiplications are required. [Ey]_
|
1026
|
+
|
1027
|
+
Parameters
|
1028
|
+
----------
|
1029
|
+
%(params_basic)s
|
1030
|
+
alpha : float, optional
|
1031
|
+
Initial guess for the Jacobian is (-1/alpha).
|
1032
|
+
M : float, optional
|
1033
|
+
Number of previous vectors to retain. Defaults to 5.
|
1034
|
+
w0 : float, optional
|
1035
|
+
Regularization parameter for numerical stability.
|
1036
|
+
Compared to unity, good values of the order of 0.01.
|
1037
|
+
%(params_extra)s
|
1038
|
+
|
1039
|
+
See Also
|
1040
|
+
--------
|
1041
|
+
root : Interface to root finding algorithms for multivariate
|
1042
|
+
functions. See ``method='anderson'`` in particular.
|
1043
|
+
|
1044
|
+
References
|
1045
|
+
----------
|
1046
|
+
.. [Ey] V. Eyert, J. Comp. Phys., 124, 271 (1996).
|
1047
|
+
|
1048
|
+
Examples
|
1049
|
+
--------
|
1050
|
+
The following functions define a system of nonlinear equations
|
1051
|
+
|
1052
|
+
>>> def fun(x):
|
1053
|
+
... return [x[0] + 0.5 * (x[0] - x[1])**3 - 1.0,
|
1054
|
+
... 0.5 * (x[1] - x[0])**3 + x[1]]
|
1055
|
+
|
1056
|
+
A solution can be obtained as follows.
|
1057
|
+
|
1058
|
+
>>> from scipy import optimize
|
1059
|
+
>>> sol = optimize.anderson(fun, [0, 0])
|
1060
|
+
>>> sol
|
1061
|
+
array([0.84116588, 0.15883789])
|
1062
|
+
|
1063
|
+
"""
|
1064
|
+
|
1065
|
+
# Note:
|
1066
|
+
#
|
1067
|
+
# Anderson method maintains a rank M approximation of the inverse Jacobian,
|
1068
|
+
#
|
1069
|
+
# J^-1 v ~ -v*alpha + (dX + alpha dF) A^-1 dF^H v
|
1070
|
+
# A = W + dF^H dF
|
1071
|
+
# W = w0^2 diag(dF^H dF)
|
1072
|
+
#
|
1073
|
+
# so that for w0 = 0 the secant condition applies for last M iterates, i.e.,
|
1074
|
+
#
|
1075
|
+
# J^-1 df_j = dx_j
|
1076
|
+
#
|
1077
|
+
# for all j = 0 ... M-1.
|
1078
|
+
#
|
1079
|
+
# Moreover, (from Sherman-Morrison-Woodbury formula)
|
1080
|
+
#
|
1081
|
+
# J v ~ [ b I - b^2 C (I + b dF^H A^-1 C)^-1 dF^H ] v
|
1082
|
+
# C = (dX + alpha dF) A^-1
|
1083
|
+
# b = -1/alpha
|
1084
|
+
#
|
1085
|
+
# and after simplification
|
1086
|
+
#
|
1087
|
+
# J v ~ -v/alpha + (dX/alpha + dF) (dF^H dX - alpha W)^-1 dF^H v
|
1088
|
+
#
|
1089
|
+
|
1090
|
+
def __init__(self, alpha=None, w0=0.01, M=5):
|
1091
|
+
GenericBroyden.__init__(self)
|
1092
|
+
self.alpha = alpha
|
1093
|
+
self.M = M
|
1094
|
+
self.dx = []
|
1095
|
+
self.df = []
|
1096
|
+
self.gamma = None
|
1097
|
+
self.w0 = w0
|
1098
|
+
|
1099
|
+
def solve(self, f, tol=0):
|
1100
|
+
dx = -self.alpha*f
|
1101
|
+
|
1102
|
+
n = len(self.dx)
|
1103
|
+
if n == 0:
|
1104
|
+
return dx
|
1105
|
+
|
1106
|
+
df_f = np.empty(n, dtype=f.dtype)
|
1107
|
+
for k in range(n):
|
1108
|
+
df_f[k] = vdot(self.df[k], f)
|
1109
|
+
|
1110
|
+
try:
|
1111
|
+
gamma = solve(self.a, df_f)
|
1112
|
+
except LinAlgError:
|
1113
|
+
# singular; reset the Jacobian approximation
|
1114
|
+
del self.dx[:]
|
1115
|
+
del self.df[:]
|
1116
|
+
return dx
|
1117
|
+
|
1118
|
+
for m in range(n):
|
1119
|
+
dx += gamma[m]*(self.dx[m] + self.alpha*self.df[m])
|
1120
|
+
return dx
|
1121
|
+
|
1122
|
+
def matvec(self, f):
|
1123
|
+
dx = -f/self.alpha
|
1124
|
+
|
1125
|
+
n = len(self.dx)
|
1126
|
+
if n == 0:
|
1127
|
+
return dx
|
1128
|
+
|
1129
|
+
df_f = np.empty(n, dtype=f.dtype)
|
1130
|
+
for k in range(n):
|
1131
|
+
df_f[k] = vdot(self.df[k], f)
|
1132
|
+
|
1133
|
+
b = np.empty((n, n), dtype=f.dtype)
|
1134
|
+
for i in range(n):
|
1135
|
+
for j in range(n):
|
1136
|
+
b[i,j] = vdot(self.df[i], self.dx[j])
|
1137
|
+
if i == j and self.w0 != 0:
|
1138
|
+
b[i,j] -= vdot(self.df[i], self.df[i])*self.w0**2*self.alpha
|
1139
|
+
gamma = solve(b, df_f)
|
1140
|
+
|
1141
|
+
for m in range(n):
|
1142
|
+
dx += gamma[m]*(self.df[m] + self.dx[m]/self.alpha)
|
1143
|
+
return dx
|
1144
|
+
|
1145
|
+
def _update(self, x, f, dx, df, dx_norm, df_norm):
|
1146
|
+
if self.M == 0:
|
1147
|
+
return
|
1148
|
+
|
1149
|
+
self.dx.append(dx)
|
1150
|
+
self.df.append(df)
|
1151
|
+
|
1152
|
+
while len(self.dx) > self.M:
|
1153
|
+
self.dx.pop(0)
|
1154
|
+
self.df.pop(0)
|
1155
|
+
|
1156
|
+
n = len(self.dx)
|
1157
|
+
a = np.zeros((n, n), dtype=f.dtype)
|
1158
|
+
|
1159
|
+
for i in range(n):
|
1160
|
+
for j in range(i, n):
|
1161
|
+
if i == j:
|
1162
|
+
wd = self.w0**2
|
1163
|
+
else:
|
1164
|
+
wd = 0
|
1165
|
+
a[i,j] = (1+wd)*vdot(self.df[i], self.df[j])
|
1166
|
+
|
1167
|
+
a += np.triu(a, 1).T.conj()
|
1168
|
+
self.a = a
|
1169
|
+
|
1170
|
+
#------------------------------------------------------------------------------
|
1171
|
+
# Simple iterations
|
1172
|
+
#------------------------------------------------------------------------------
|
1173
|
+
|
1174
|
+
|
1175
|
+
class DiagBroyden(GenericBroyden):
|
1176
|
+
"""
|
1177
|
+
Find a root of a function, using diagonal Broyden Jacobian approximation.
|
1178
|
+
|
1179
|
+
The Jacobian approximation is derived from previous iterations, by
|
1180
|
+
retaining only the diagonal of Broyden matrices.
|
1181
|
+
|
1182
|
+
.. warning::
|
1183
|
+
|
1184
|
+
This algorithm may be useful for specific problems, but whether
|
1185
|
+
it will work may depend strongly on the problem.
|
1186
|
+
|
1187
|
+
Parameters
|
1188
|
+
----------
|
1189
|
+
%(params_basic)s
|
1190
|
+
alpha : float, optional
|
1191
|
+
Initial guess for the Jacobian is (-1/alpha).
|
1192
|
+
%(params_extra)s
|
1193
|
+
|
1194
|
+
See Also
|
1195
|
+
--------
|
1196
|
+
root : Interface to root finding algorithms for multivariate
|
1197
|
+
functions. See ``method='diagbroyden'`` in particular.
|
1198
|
+
|
1199
|
+
Examples
|
1200
|
+
--------
|
1201
|
+
The following functions define a system of nonlinear equations
|
1202
|
+
|
1203
|
+
>>> def fun(x):
|
1204
|
+
... return [x[0] + 0.5 * (x[0] - x[1])**3 - 1.0,
|
1205
|
+
... 0.5 * (x[1] - x[0])**3 + x[1]]
|
1206
|
+
|
1207
|
+
A solution can be obtained as follows.
|
1208
|
+
|
1209
|
+
>>> from scipy import optimize
|
1210
|
+
>>> sol = optimize.diagbroyden(fun, [0, 0])
|
1211
|
+
>>> sol
|
1212
|
+
array([0.84116403, 0.15883384])
|
1213
|
+
|
1214
|
+
"""
|
1215
|
+
|
1216
|
+
def __init__(self, alpha=None):
|
1217
|
+
GenericBroyden.__init__(self)
|
1218
|
+
self.alpha = alpha
|
1219
|
+
|
1220
|
+
def setup(self, x, F, func):
|
1221
|
+
GenericBroyden.setup(self, x, F, func)
|
1222
|
+
self.d = np.full((self.shape[0],), 1 / self.alpha, dtype=self.dtype)
|
1223
|
+
|
1224
|
+
def solve(self, f, tol=0):
|
1225
|
+
return -f / self.d
|
1226
|
+
|
1227
|
+
def matvec(self, f):
|
1228
|
+
return -f * self.d
|
1229
|
+
|
1230
|
+
def rsolve(self, f, tol=0):
|
1231
|
+
return -f / self.d.conj()
|
1232
|
+
|
1233
|
+
def rmatvec(self, f):
|
1234
|
+
return -f * self.d.conj()
|
1235
|
+
|
1236
|
+
def todense(self):
|
1237
|
+
return np.diag(-self.d)
|
1238
|
+
|
1239
|
+
def _update(self, x, f, dx, df, dx_norm, df_norm):
|
1240
|
+
self.d -= (df + self.d*dx)*dx/dx_norm**2
|
1241
|
+
|
1242
|
+
|
1243
|
+
class LinearMixing(GenericBroyden):
|
1244
|
+
"""
|
1245
|
+
Find a root of a function, using a scalar Jacobian approximation.
|
1246
|
+
|
1247
|
+
.. warning::
|
1248
|
+
|
1249
|
+
This algorithm may be useful for specific problems, but whether
|
1250
|
+
it will work may depend strongly on the problem.
|
1251
|
+
|
1252
|
+
Parameters
|
1253
|
+
----------
|
1254
|
+
%(params_basic)s
|
1255
|
+
alpha : float, optional
|
1256
|
+
The Jacobian approximation is (-1/alpha).
|
1257
|
+
%(params_extra)s
|
1258
|
+
|
1259
|
+
See Also
|
1260
|
+
--------
|
1261
|
+
root : Interface to root finding algorithms for multivariate
|
1262
|
+
functions. See ``method='linearmixing'`` in particular.
|
1263
|
+
|
1264
|
+
"""
|
1265
|
+
|
1266
|
+
def __init__(self, alpha=None):
|
1267
|
+
GenericBroyden.__init__(self)
|
1268
|
+
self.alpha = alpha
|
1269
|
+
|
1270
|
+
def solve(self, f, tol=0):
|
1271
|
+
return -f*self.alpha
|
1272
|
+
|
1273
|
+
def matvec(self, f):
|
1274
|
+
return -f/self.alpha
|
1275
|
+
|
1276
|
+
def rsolve(self, f, tol=0):
|
1277
|
+
return -f*np.conj(self.alpha)
|
1278
|
+
|
1279
|
+
def rmatvec(self, f):
|
1280
|
+
return -f/np.conj(self.alpha)
|
1281
|
+
|
1282
|
+
def todense(self):
|
1283
|
+
return np.diag(np.full(self.shape[0], -1/self.alpha))
|
1284
|
+
|
1285
|
+
def _update(self, x, f, dx, df, dx_norm, df_norm):
|
1286
|
+
pass
|
1287
|
+
|
1288
|
+
|
1289
|
+
class ExcitingMixing(GenericBroyden):
|
1290
|
+
"""
|
1291
|
+
Find a root of a function, using a tuned diagonal Jacobian approximation.
|
1292
|
+
|
1293
|
+
The Jacobian matrix is diagonal and is tuned on each iteration.
|
1294
|
+
|
1295
|
+
.. warning::
|
1296
|
+
|
1297
|
+
This algorithm may be useful for specific problems, but whether
|
1298
|
+
it will work may depend strongly on the problem.
|
1299
|
+
|
1300
|
+
See Also
|
1301
|
+
--------
|
1302
|
+
root : Interface to root finding algorithms for multivariate
|
1303
|
+
functions. See ``method='excitingmixing'`` in particular.
|
1304
|
+
|
1305
|
+
Parameters
|
1306
|
+
----------
|
1307
|
+
%(params_basic)s
|
1308
|
+
alpha : float, optional
|
1309
|
+
Initial Jacobian approximation is (-1/alpha).
|
1310
|
+
alphamax : float, optional
|
1311
|
+
The entries of the diagonal Jacobian are kept in the range
|
1312
|
+
``[alpha, alphamax]``.
|
1313
|
+
%(params_extra)s
|
1314
|
+
"""
|
1315
|
+
|
1316
|
+
def __init__(self, alpha=None, alphamax=1.0):
|
1317
|
+
GenericBroyden.__init__(self)
|
1318
|
+
self.alpha = alpha
|
1319
|
+
self.alphamax = alphamax
|
1320
|
+
self.beta = None
|
1321
|
+
|
1322
|
+
def setup(self, x, F, func):
|
1323
|
+
GenericBroyden.setup(self, x, F, func)
|
1324
|
+
self.beta = np.full((self.shape[0],), self.alpha, dtype=self.dtype)
|
1325
|
+
|
1326
|
+
def solve(self, f, tol=0):
|
1327
|
+
return -f*self.beta
|
1328
|
+
|
1329
|
+
def matvec(self, f):
|
1330
|
+
return -f/self.beta
|
1331
|
+
|
1332
|
+
def rsolve(self, f, tol=0):
|
1333
|
+
return -f*self.beta.conj()
|
1334
|
+
|
1335
|
+
def rmatvec(self, f):
|
1336
|
+
return -f/self.beta.conj()
|
1337
|
+
|
1338
|
+
def todense(self):
|
1339
|
+
return np.diag(-1/self.beta)
|
1340
|
+
|
1341
|
+
def _update(self, x, f, dx, df, dx_norm, df_norm):
|
1342
|
+
incr = f*self.last_f > 0
|
1343
|
+
self.beta[incr] += self.alpha
|
1344
|
+
self.beta[~incr] = self.alpha
|
1345
|
+
np.clip(self.beta, 0, self.alphamax, out=self.beta)
|
1346
|
+
|
1347
|
+
|
1348
|
+
#------------------------------------------------------------------------------
|
1349
|
+
# Iterative/Krylov approximated Jacobians
|
1350
|
+
#------------------------------------------------------------------------------
|
1351
|
+
|
1352
|
+
class KrylovJacobian(Jacobian):
|
1353
|
+
"""
|
1354
|
+
Find a root of a function, using Krylov approximation for inverse Jacobian.
|
1355
|
+
|
1356
|
+
This method is suitable for solving large-scale problems.
|
1357
|
+
|
1358
|
+
Parameters
|
1359
|
+
----------
|
1360
|
+
%(params_basic)s
|
1361
|
+
rdiff : float, optional
|
1362
|
+
Relative step size to use in numerical differentiation.
|
1363
|
+
method : str or callable, optional
|
1364
|
+
Krylov method to use to approximate the Jacobian. Can be a string,
|
1365
|
+
or a function implementing the same interface as the iterative
|
1366
|
+
solvers in `scipy.sparse.linalg`. If a string, needs to be one of:
|
1367
|
+
``'lgmres'``, ``'gmres'``, ``'bicgstab'``, ``'cgs'``, ``'minres'``,
|
1368
|
+
``'tfqmr'``.
|
1369
|
+
|
1370
|
+
The default is `scipy.sparse.linalg.lgmres`.
|
1371
|
+
inner_maxiter : int, optional
|
1372
|
+
Parameter to pass to the "inner" Krylov solver: maximum number of
|
1373
|
+
iterations. Iteration will stop after maxiter steps even if the
|
1374
|
+
specified tolerance has not been achieved.
|
1375
|
+
inner_M : LinearOperator or InverseJacobian
|
1376
|
+
Preconditioner for the inner Krylov iteration.
|
1377
|
+
Note that you can use also inverse Jacobians as (adaptive)
|
1378
|
+
preconditioners. For example,
|
1379
|
+
|
1380
|
+
>>> from scipy.optimize import BroydenFirst, KrylovJacobian
|
1381
|
+
>>> from scipy.optimize import InverseJacobian
|
1382
|
+
>>> jac = BroydenFirst()
|
1383
|
+
>>> kjac = KrylovJacobian(inner_M=InverseJacobian(jac))
|
1384
|
+
|
1385
|
+
If the preconditioner has a method named 'update', it will be called
|
1386
|
+
as ``update(x, f)`` after each nonlinear step, with ``x`` giving
|
1387
|
+
the current point, and ``f`` the current function value.
|
1388
|
+
outer_k : int, optional
|
1389
|
+
Size of the subspace kept across LGMRES nonlinear iterations.
|
1390
|
+
See `scipy.sparse.linalg.lgmres` for details.
|
1391
|
+
inner_kwargs : kwargs
|
1392
|
+
Keyword parameters for the "inner" Krylov solver
|
1393
|
+
(defined with `method`). Parameter names must start with
|
1394
|
+
the `inner_` prefix which will be stripped before passing on
|
1395
|
+
the inner method. See, e.g., `scipy.sparse.linalg.gmres` for details.
|
1396
|
+
%(params_extra)s
|
1397
|
+
|
1398
|
+
See Also
|
1399
|
+
--------
|
1400
|
+
root : Interface to root finding algorithms for multivariate
|
1401
|
+
functions. See ``method='krylov'`` in particular.
|
1402
|
+
scipy.sparse.linalg.gmres
|
1403
|
+
scipy.sparse.linalg.lgmres
|
1404
|
+
|
1405
|
+
Notes
|
1406
|
+
-----
|
1407
|
+
This function implements a Newton-Krylov solver. The basic idea is
|
1408
|
+
to compute the inverse of the Jacobian with an iterative Krylov
|
1409
|
+
method. These methods require only evaluating the Jacobian-vector
|
1410
|
+
products, which are conveniently approximated by a finite difference:
|
1411
|
+
|
1412
|
+
.. math:: J v \\approx (f(x + \\omega*v/|v|) - f(x)) / \\omega
|
1413
|
+
|
1414
|
+
Due to the use of iterative matrix inverses, these methods can
|
1415
|
+
deal with large nonlinear problems.
|
1416
|
+
|
1417
|
+
SciPy's `scipy.sparse.linalg` module offers a selection of Krylov
|
1418
|
+
solvers to choose from. The default here is `lgmres`, which is a
|
1419
|
+
variant of restarted GMRES iteration that reuses some of the
|
1420
|
+
information obtained in the previous Newton steps to invert
|
1421
|
+
Jacobians in subsequent steps.
|
1422
|
+
|
1423
|
+
For a review on Newton-Krylov methods, see for example [1]_,
|
1424
|
+
and for the LGMRES sparse inverse method, see [2]_.
|
1425
|
+
|
1426
|
+
References
|
1427
|
+
----------
|
1428
|
+
.. [1] C. T. Kelley, Solving Nonlinear Equations with Newton's Method,
|
1429
|
+
SIAM, pp.57-83, 2003.
|
1430
|
+
:doi:`10.1137/1.9780898718898.ch3`
|
1431
|
+
.. [2] D.A. Knoll and D.E. Keyes, J. Comp. Phys. 193, 357 (2004).
|
1432
|
+
:doi:`10.1016/j.jcp.2003.08.010`
|
1433
|
+
.. [3] A.H. Baker and E.R. Jessup and T. Manteuffel,
|
1434
|
+
SIAM J. Matrix Anal. Appl. 26, 962 (2005).
|
1435
|
+
:doi:`10.1137/S0895479803422014`
|
1436
|
+
|
1437
|
+
Examples
|
1438
|
+
--------
|
1439
|
+
The following functions define a system of nonlinear equations
|
1440
|
+
|
1441
|
+
>>> def fun(x):
|
1442
|
+
... return [x[0] + 0.5 * x[1] - 1.0,
|
1443
|
+
... 0.5 * (x[1] - x[0]) ** 2]
|
1444
|
+
|
1445
|
+
A solution can be obtained as follows.
|
1446
|
+
|
1447
|
+
>>> from scipy import optimize
|
1448
|
+
>>> sol = optimize.newton_krylov(fun, [0, 0])
|
1449
|
+
>>> sol
|
1450
|
+
array([0.66731771, 0.66536458])
|
1451
|
+
|
1452
|
+
"""
|
1453
|
+
|
1454
|
+
def __init__(self, rdiff=None, method='lgmres', inner_maxiter=20,
|
1455
|
+
inner_M=None, outer_k=10, **kw):
|
1456
|
+
self.preconditioner = inner_M
|
1457
|
+
self.rdiff = rdiff
|
1458
|
+
# Note that this retrieves one of the named functions, or otherwise
|
1459
|
+
# uses `method` as is (i.e., for a user-provided callable).
|
1460
|
+
self.method = dict(
|
1461
|
+
bicgstab=scipy.sparse.linalg.bicgstab,
|
1462
|
+
gmres=scipy.sparse.linalg.gmres,
|
1463
|
+
lgmres=scipy.sparse.linalg.lgmres,
|
1464
|
+
cgs=scipy.sparse.linalg.cgs,
|
1465
|
+
minres=scipy.sparse.linalg.minres,
|
1466
|
+
tfqmr=scipy.sparse.linalg.tfqmr,
|
1467
|
+
).get(method, method)
|
1468
|
+
|
1469
|
+
self.method_kw = dict(maxiter=inner_maxiter, M=self.preconditioner)
|
1470
|
+
|
1471
|
+
if self.method is scipy.sparse.linalg.gmres:
|
1472
|
+
# Replace GMRES's outer iteration with Newton steps
|
1473
|
+
self.method_kw['restart'] = inner_maxiter
|
1474
|
+
self.method_kw['maxiter'] = 1
|
1475
|
+
self.method_kw.setdefault('atol', 0)
|
1476
|
+
elif self.method in (scipy.sparse.linalg.gcrotmk,
|
1477
|
+
scipy.sparse.linalg.bicgstab,
|
1478
|
+
scipy.sparse.linalg.cgs):
|
1479
|
+
self.method_kw.setdefault('atol', 0)
|
1480
|
+
elif self.method is scipy.sparse.linalg.lgmres:
|
1481
|
+
self.method_kw['outer_k'] = outer_k
|
1482
|
+
# Replace LGMRES's outer iteration with Newton steps
|
1483
|
+
self.method_kw['maxiter'] = 1
|
1484
|
+
# Carry LGMRES's `outer_v` vectors across nonlinear iterations
|
1485
|
+
self.method_kw.setdefault('outer_v', [])
|
1486
|
+
self.method_kw.setdefault('prepend_outer_v', True)
|
1487
|
+
# But don't carry the corresponding Jacobian*v products, in case
|
1488
|
+
# the Jacobian changes a lot in the nonlinear step
|
1489
|
+
#
|
1490
|
+
# XXX: some trust-region inspired ideas might be more efficient...
|
1491
|
+
# See e.g., Brown & Saad. But needs to be implemented separately
|
1492
|
+
# since it's not an inexact Newton method.
|
1493
|
+
self.method_kw.setdefault('store_outer_Av', False)
|
1494
|
+
self.method_kw.setdefault('atol', 0)
|
1495
|
+
|
1496
|
+
# Retrieve the signature of the method to find the valid parameters
|
1497
|
+
valid_inner_params = [
|
1498
|
+
k for k in signature(self.method).parameters
|
1499
|
+
if k not in ('self', 'args', 'kwargs')
|
1500
|
+
]
|
1501
|
+
|
1502
|
+
for key, value in kw.items():
|
1503
|
+
if not key.startswith("inner_"):
|
1504
|
+
raise ValueError(f"Unknown parameter {key}")
|
1505
|
+
if key[6:] not in valid_inner_params:
|
1506
|
+
# Use difflib to find close matches to the invalid key
|
1507
|
+
inner_param_suggestions = get_close_matches(key[6:],
|
1508
|
+
valid_inner_params,
|
1509
|
+
n=1)
|
1510
|
+
if inner_param_suggestions:
|
1511
|
+
suggestion_msg = (f" Did you mean '"
|
1512
|
+
f"{inner_param_suggestions[0]}'?")
|
1513
|
+
else:
|
1514
|
+
suggestion_msg = ""
|
1515
|
+
|
1516
|
+
# warn user that the parameter is not valid for the inner method
|
1517
|
+
warnings.warn(
|
1518
|
+
f"Option '{key}' is invalid for the inner method: {method}."
|
1519
|
+
" It will be ignored."
|
1520
|
+
"Please check inner method documentation for valid options."
|
1521
|
+
+ suggestion_msg,
|
1522
|
+
stacklevel=3,
|
1523
|
+
category=UserWarning,
|
1524
|
+
# using `skip_file_prefixes` would be a good idea
|
1525
|
+
# and should be added once we drop support for Python 3.11
|
1526
|
+
)
|
1527
|
+
# ignore this parameter and continue
|
1528
|
+
continue
|
1529
|
+
self.method_kw[key[6:]] = value
|
1530
|
+
|
1531
|
+
def _update_diff_step(self):
|
1532
|
+
mx = abs(self.x0).max()
|
1533
|
+
mf = abs(self.f0).max()
|
1534
|
+
self.omega = self.rdiff * max(1, mx) / max(1, mf)
|
1535
|
+
|
1536
|
+
def matvec(self, v):
|
1537
|
+
nv = norm(v)
|
1538
|
+
if nv == 0:
|
1539
|
+
return 0*v
|
1540
|
+
sc = self.omega / nv
|
1541
|
+
r = (self.func(self.x0 + sc*v) - self.f0) / sc
|
1542
|
+
if not np.all(np.isfinite(r)) and np.all(np.isfinite(v)):
|
1543
|
+
raise ValueError('Function returned non-finite results')
|
1544
|
+
return r
|
1545
|
+
|
1546
|
+
def solve(self, rhs, tol=0):
|
1547
|
+
if 'rtol' in self.method_kw:
|
1548
|
+
sol, info = self.method(self.op, rhs, **self.method_kw)
|
1549
|
+
else:
|
1550
|
+
sol, info = self.method(self.op, rhs, rtol=tol, **self.method_kw)
|
1551
|
+
return sol
|
1552
|
+
|
1553
|
+
def update(self, x, f):
|
1554
|
+
self.x0 = x
|
1555
|
+
self.f0 = f
|
1556
|
+
self._update_diff_step()
|
1557
|
+
|
1558
|
+
# Update also the preconditioner, if possible
|
1559
|
+
if self.preconditioner is not None:
|
1560
|
+
if hasattr(self.preconditioner, 'update'):
|
1561
|
+
self.preconditioner.update(x, f)
|
1562
|
+
|
1563
|
+
def setup(self, x, f, func):
|
1564
|
+
Jacobian.setup(self, x, f, func)
|
1565
|
+
self.x0 = x
|
1566
|
+
self.f0 = f
|
1567
|
+
self.op = scipy.sparse.linalg.aslinearoperator(self)
|
1568
|
+
|
1569
|
+
if self.rdiff is None:
|
1570
|
+
self.rdiff = np.finfo(x.dtype).eps ** (1./2)
|
1571
|
+
|
1572
|
+
self._update_diff_step()
|
1573
|
+
|
1574
|
+
# Setup also the preconditioner, if possible
|
1575
|
+
if self.preconditioner is not None:
|
1576
|
+
if hasattr(self.preconditioner, 'setup'):
|
1577
|
+
self.preconditioner.setup(x, f, func)
|
1578
|
+
|
1579
|
+
|
1580
|
+
#------------------------------------------------------------------------------
|
1581
|
+
# Wrapper functions
|
1582
|
+
#------------------------------------------------------------------------------
|
1583
|
+
|
1584
|
+
def _nonlin_wrapper(name, jac):
|
1585
|
+
"""
|
1586
|
+
Construct a solver wrapper with given name and Jacobian approx.
|
1587
|
+
|
1588
|
+
It inspects the keyword arguments of ``jac.__init__``, and allows to
|
1589
|
+
use the same arguments in the wrapper function, in addition to the
|
1590
|
+
keyword arguments of `nonlin_solve`
|
1591
|
+
|
1592
|
+
"""
|
1593
|
+
signature = _getfullargspec(jac.__init__)
|
1594
|
+
args, varargs, varkw, defaults, kwonlyargs, kwdefaults, _ = signature
|
1595
|
+
kwargs = list(zip(args[-len(defaults):], defaults))
|
1596
|
+
kw_str = ", ".join([f"{k}={v!r}" for k, v in kwargs])
|
1597
|
+
if kw_str:
|
1598
|
+
kw_str = ", " + kw_str
|
1599
|
+
kwkw_str = ", ".join([f"{k}={k}" for k, v in kwargs])
|
1600
|
+
if kwkw_str:
|
1601
|
+
kwkw_str = kwkw_str + ", "
|
1602
|
+
if kwonlyargs:
|
1603
|
+
raise ValueError(f'Unexpected signature {signature}')
|
1604
|
+
|
1605
|
+
# Construct the wrapper function so that its keyword arguments
|
1606
|
+
# are visible in pydoc.help etc.
|
1607
|
+
wrapper = """
|
1608
|
+
def %(name)s(F, xin, iter=None %(kw)s, verbose=False, maxiter=None,
|
1609
|
+
f_tol=None, f_rtol=None, x_tol=None, x_rtol=None,
|
1610
|
+
tol_norm=None, line_search='armijo', callback=None, **kw):
|
1611
|
+
jac = %(jac)s(%(kwkw)s **kw)
|
1612
|
+
return nonlin_solve(F, xin, jac, iter, verbose, maxiter,
|
1613
|
+
f_tol, f_rtol, x_tol, x_rtol, tol_norm, line_search,
|
1614
|
+
callback)
|
1615
|
+
"""
|
1616
|
+
|
1617
|
+
wrapper = wrapper % dict(name=name, kw=kw_str, jac=jac.__name__,
|
1618
|
+
kwkw=kwkw_str)
|
1619
|
+
ns = {}
|
1620
|
+
ns.update(globals())
|
1621
|
+
exec(wrapper, ns)
|
1622
|
+
func = ns[name]
|
1623
|
+
func.__doc__ = jac.__doc__
|
1624
|
+
_set_doc(func)
|
1625
|
+
return func
|
1626
|
+
|
1627
|
+
|
1628
|
+
broyden1 = _nonlin_wrapper('broyden1', BroydenFirst)
|
1629
|
+
broyden2 = _nonlin_wrapper('broyden2', BroydenSecond)
|
1630
|
+
anderson = _nonlin_wrapper('anderson', Anderson)
|
1631
|
+
linearmixing = _nonlin_wrapper('linearmixing', LinearMixing)
|
1632
|
+
diagbroyden = _nonlin_wrapper('diagbroyden', DiagBroyden)
|
1633
|
+
excitingmixing = _nonlin_wrapper('excitingmixing', ExcitingMixing)
|
1634
|
+
newton_krylov = _nonlin_wrapper('newton_krylov', KrylovJacobian)
|