scipy 1.15.3__cp313-cp313-musllinux_1_2_aarch64.whl → 1.16.0rc2__cp313-cp313-musllinux_1_2_aarch64.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.
Files changed (641) hide show
  1. scipy/__config__.py +10 -10
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cpython-313-aarch64-linux-musl.so +0 -0
  4. scipy/_lib/_array_api.py +486 -161
  5. scipy/_lib/_array_api_compat_vendor.py +9 -0
  6. scipy/_lib/_bunch.py +4 -0
  7. scipy/_lib/_ccallback_c.cpython-313-aarch64-linux-musl.so +0 -0
  8. scipy/_lib/_docscrape.py +1 -1
  9. scipy/_lib/_elementwise_iterative_method.py +15 -26
  10. scipy/_lib/_fpumode.cpython-313-aarch64-linux-musl.so +0 -0
  11. scipy/_lib/_sparse.py +41 -0
  12. scipy/_lib/_test_ccallback.cpython-313-aarch64-linux-musl.so +0 -0
  13. scipy/_lib/_test_deprecation_call.cpython-313-aarch64-linux-musl.so +0 -0
  14. scipy/_lib/_test_deprecation_def.cpython-313-aarch64-linux-musl.so +0 -0
  15. scipy/_lib/_testutils.py +6 -2
  16. scipy/_lib/_uarray/_uarray.cpython-313-aarch64-linux-musl.so +0 -0
  17. scipy/_lib/_util.py +222 -125
  18. scipy/_lib/array_api_compat/__init__.py +4 -4
  19. scipy/_lib/array_api_compat/_internal.py +19 -6
  20. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  21. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  22. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  23. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  24. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  25. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  26. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  27. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  28. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  29. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  30. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  31. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  32. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  33. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  34. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  35. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  36. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  37. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  38. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  39. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  40. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  41. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  42. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  43. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  44. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  45. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  46. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  47. scipy/_lib/array_api_extra/__init__.py +26 -3
  48. scipy/_lib/array_api_extra/_delegation.py +171 -0
  49. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  50. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  51. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  52. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  53. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  54. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  58. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  59. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  60. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  61. scipy/_lib/array_api_extra/testing.py +359 -0
  62. scipy/_lib/decorator.py +2 -2
  63. scipy/_lib/doccer.py +1 -7
  64. scipy/_lib/messagestream.cpython-313-aarch64-linux-musl.so +0 -0
  65. scipy/_lib/pyprima/__init__.py +212 -0
  66. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  67. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  68. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  69. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  70. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  71. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  72. scipy/_lib/pyprima/cobyla/update.py +289 -0
  73. scipy/_lib/pyprima/common/__init__.py +0 -0
  74. scipy/_lib/pyprima/common/_bounds.py +34 -0
  75. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  76. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  77. scipy/_lib/pyprima/common/_project.py +173 -0
  78. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  79. scipy/_lib/pyprima/common/consts.py +47 -0
  80. scipy/_lib/pyprima/common/evaluate.py +99 -0
  81. scipy/_lib/pyprima/common/history.py +38 -0
  82. scipy/_lib/pyprima/common/infos.py +30 -0
  83. scipy/_lib/pyprima/common/linalg.py +435 -0
  84. scipy/_lib/pyprima/common/message.py +290 -0
  85. scipy/_lib/pyprima/common/powalg.py +131 -0
  86. scipy/_lib/pyprima/common/preproc.py +277 -0
  87. scipy/_lib/pyprima/common/present.py +5 -0
  88. scipy/_lib/pyprima/common/ratio.py +54 -0
  89. scipy/_lib/pyprima/common/redrho.py +47 -0
  90. scipy/_lib/pyprima/common/selectx.py +296 -0
  91. scipy/_lib/tests/test__util.py +105 -121
  92. scipy/_lib/tests/test_array_api.py +166 -35
  93. scipy/_lib/tests/test_bunch.py +7 -0
  94. scipy/_lib/tests/test_ccallback.py +2 -10
  95. scipy/_lib/tests/test_public_api.py +13 -0
  96. scipy/cluster/_hierarchy.cpython-313-aarch64-linux-musl.so +0 -0
  97. scipy/cluster/_optimal_leaf_ordering.cpython-313-aarch64-linux-musl.so +0 -0
  98. scipy/cluster/_vq.cpython-313-aarch64-linux-musl.so +0 -0
  99. scipy/cluster/hierarchy.py +393 -223
  100. scipy/cluster/tests/test_hierarchy.py +273 -335
  101. scipy/cluster/tests/test_vq.py +45 -61
  102. scipy/cluster/vq.py +39 -35
  103. scipy/conftest.py +263 -157
  104. scipy/constants/_constants.py +4 -1
  105. scipy/constants/tests/test_codata.py +2 -2
  106. scipy/constants/tests/test_constants.py +11 -18
  107. scipy/datasets/_download_all.py +15 -1
  108. scipy/datasets/_fetchers.py +7 -1
  109. scipy/datasets/_utils.py +1 -1
  110. scipy/differentiate/_differentiate.py +25 -25
  111. scipy/differentiate/tests/test_differentiate.py +24 -25
  112. scipy/fft/_basic.py +20 -0
  113. scipy/fft/_helper.py +3 -34
  114. scipy/fft/_pocketfft/helper.py +29 -1
  115. scipy/fft/_pocketfft/pypocketfft.cpython-313-aarch64-linux-musl.so +0 -0
  116. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  117. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  118. scipy/fft/_realtransforms.py +13 -0
  119. scipy/fft/tests/test_basic.py +27 -25
  120. scipy/fft/tests/test_fftlog.py +16 -7
  121. scipy/fft/tests/test_helper.py +18 -34
  122. scipy/fft/tests/test_real_transforms.py +8 -10
  123. scipy/fftpack/convolve.cpython-313-aarch64-linux-musl.so +0 -0
  124. scipy/fftpack/tests/test_basic.py +2 -4
  125. scipy/fftpack/tests/test_real_transforms.py +8 -9
  126. scipy/integrate/_bvp.py +9 -3
  127. scipy/integrate/_cubature.py +3 -2
  128. scipy/integrate/_dop.cpython-313-aarch64-linux-musl.so +0 -0
  129. scipy/integrate/_lsoda.cpython-313-aarch64-linux-musl.so +0 -0
  130. scipy/integrate/_ode.py +9 -2
  131. scipy/integrate/_odepack.cpython-313-aarch64-linux-musl.so +0 -0
  132. scipy/integrate/_quad_vec.py +21 -29
  133. scipy/integrate/_quadpack.cpython-313-aarch64-linux-musl.so +0 -0
  134. scipy/integrate/_quadpack_py.py +11 -7
  135. scipy/integrate/_quadrature.py +3 -3
  136. scipy/integrate/_rules/_base.py +2 -2
  137. scipy/integrate/_tanhsinh.py +48 -47
  138. scipy/integrate/_test_multivariate.cpython-313-aarch64-linux-musl.so +0 -0
  139. scipy/integrate/_test_odeint_banded.cpython-313-aarch64-linux-musl.so +0 -0
  140. scipy/integrate/_vode.cpython-313-aarch64-linux-musl.so +0 -0
  141. scipy/integrate/tests/test__quad_vec.py +0 -6
  142. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  143. scipy/integrate/tests/test_cubature.py +21 -35
  144. scipy/integrate/tests/test_quadrature.py +6 -8
  145. scipy/integrate/tests/test_tanhsinh.py +56 -48
  146. scipy/interpolate/__init__.py +70 -58
  147. scipy/interpolate/_bary_rational.py +22 -22
  148. scipy/interpolate/_bsplines.py +119 -66
  149. scipy/interpolate/_cubic.py +65 -50
  150. scipy/interpolate/_dfitpack.cpython-313-aarch64-linux-musl.so +0 -0
  151. scipy/interpolate/_dierckx.cpython-313-aarch64-linux-musl.so +0 -0
  152. scipy/interpolate/_fitpack.cpython-313-aarch64-linux-musl.so +0 -0
  153. scipy/interpolate/_fitpack2.py +9 -6
  154. scipy/interpolate/_fitpack_impl.py +32 -26
  155. scipy/interpolate/_fitpack_repro.py +23 -19
  156. scipy/interpolate/_interpnd.cpython-313-aarch64-linux-musl.so +0 -0
  157. scipy/interpolate/_interpolate.py +30 -12
  158. scipy/interpolate/_ndbspline.py +13 -18
  159. scipy/interpolate/_ndgriddata.py +5 -8
  160. scipy/interpolate/_polyint.py +95 -31
  161. scipy/interpolate/_ppoly.cpython-313-aarch64-linux-musl.so +0 -0
  162. scipy/interpolate/_rbf.py +2 -2
  163. scipy/interpolate/_rbfinterp.py +1 -1
  164. scipy/interpolate/_rbfinterp_pythran.cpython-313-aarch64-linux-musl.so +0 -0
  165. scipy/interpolate/_rgi.py +31 -26
  166. scipy/interpolate/_rgi_cython.cpython-313-aarch64-linux-musl.so +0 -0
  167. scipy/interpolate/dfitpack.py +0 -20
  168. scipy/interpolate/interpnd.py +1 -2
  169. scipy/interpolate/tests/test_bary_rational.py +2 -2
  170. scipy/interpolate/tests/test_bsplines.py +97 -1
  171. scipy/interpolate/tests/test_fitpack2.py +39 -1
  172. scipy/interpolate/tests/test_interpnd.py +32 -20
  173. scipy/interpolate/tests/test_interpolate.py +48 -4
  174. scipy/interpolate/tests/test_rgi.py +2 -1
  175. scipy/io/_fast_matrix_market/__init__.py +2 -0
  176. scipy/io/_fast_matrix_market/_fmm_core.cpython-313-aarch64-linux-musl.so +0 -0
  177. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  178. scipy/io/_harwell_boeing/hb.py +7 -11
  179. scipy/io/_idl.py +5 -7
  180. scipy/io/_netcdf.py +15 -5
  181. scipy/io/_test_fortran.cpython-313-aarch64-linux-musl.so +0 -0
  182. scipy/io/arff/tests/test_arffread.py +3 -3
  183. scipy/io/matlab/__init__.py +5 -3
  184. scipy/io/matlab/_mio.py +4 -1
  185. scipy/io/matlab/_mio5.py +19 -13
  186. scipy/io/matlab/_mio5_utils.cpython-313-aarch64-linux-musl.so +0 -0
  187. scipy/io/matlab/_mio_utils.cpython-313-aarch64-linux-musl.so +0 -0
  188. scipy/io/matlab/_miobase.py +4 -1
  189. scipy/io/matlab/_streams.cpython-313-aarch64-linux-musl.so +0 -0
  190. scipy/io/matlab/tests/test_mio.py +46 -18
  191. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  192. scipy/io/tests/test_mmio.py +7 -1
  193. scipy/io/tests/test_wavfile.py +41 -0
  194. scipy/io/wavfile.py +57 -10
  195. scipy/linalg/_basic.py +113 -86
  196. scipy/linalg/_cythonized_array_utils.cpython-313-aarch64-linux-musl.so +0 -0
  197. scipy/linalg/_decomp.py +22 -9
  198. scipy/linalg/_decomp_cholesky.py +28 -13
  199. scipy/linalg/_decomp_cossin.py +45 -30
  200. scipy/linalg/_decomp_interpolative.cpython-313-aarch64-linux-musl.so +0 -0
  201. scipy/linalg/_decomp_ldl.py +4 -1
  202. scipy/linalg/_decomp_lu.py +18 -6
  203. scipy/linalg/_decomp_lu_cython.cpython-313-aarch64-linux-musl.so +0 -0
  204. scipy/linalg/_decomp_polar.py +2 -0
  205. scipy/linalg/_decomp_qr.py +6 -2
  206. scipy/linalg/_decomp_qz.py +3 -0
  207. scipy/linalg/_decomp_schur.py +3 -1
  208. scipy/linalg/_decomp_svd.py +13 -2
  209. scipy/linalg/_decomp_update.cpython-313-aarch64-linux-musl.so +0 -0
  210. scipy/linalg/_expm_frechet.py +4 -0
  211. scipy/linalg/_fblas.cpython-313-aarch64-linux-musl.so +0 -0
  212. scipy/linalg/_flapack.cpython-313-aarch64-linux-musl.so +0 -0
  213. scipy/linalg/_linalg_pythran.cpython-313-aarch64-linux-musl.so +0 -0
  214. scipy/linalg/_matfuncs.py +187 -4
  215. scipy/linalg/_matfuncs_expm.cpython-313-aarch64-linux-musl.so +0 -0
  216. scipy/linalg/_matfuncs_schur_sqrtm.cpython-313-aarch64-linux-musl.so +0 -0
  217. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  218. scipy/linalg/_matfuncs_sqrtm_triu.cpython-313-aarch64-linux-musl.so +0 -0
  219. scipy/linalg/_procrustes.py +2 -0
  220. scipy/linalg/_sketches.py +17 -6
  221. scipy/linalg/_solve_toeplitz.cpython-313-aarch64-linux-musl.so +0 -0
  222. scipy/linalg/_solvers.py +7 -2
  223. scipy/linalg/_special_matrices.py +26 -36
  224. scipy/linalg/cython_blas.cpython-313-aarch64-linux-musl.so +0 -0
  225. scipy/linalg/cython_lapack.cpython-313-aarch64-linux-musl.so +0 -0
  226. scipy/linalg/lapack.py +22 -2
  227. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  228. scipy/linalg/tests/test_basic.py +31 -16
  229. scipy/linalg/tests/test_batch.py +588 -0
  230. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  231. scipy/linalg/tests/test_decomp.py +40 -3
  232. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  233. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  234. scipy/linalg/tests/test_lapack.py +115 -7
  235. scipy/linalg/tests/test_matfuncs.py +157 -102
  236. scipy/linalg/tests/test_procrustes.py +0 -7
  237. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  238. scipy/linalg/tests/test_special_matrices.py +1 -5
  239. scipy/ndimage/__init__.py +1 -0
  240. scipy/ndimage/_ctest.cpython-313-aarch64-linux-musl.so +0 -0
  241. scipy/ndimage/_cytest.cpython-313-aarch64-linux-musl.so +0 -0
  242. scipy/ndimage/_delegators.py +8 -2
  243. scipy/ndimage/_filters.py +453 -5
  244. scipy/ndimage/_interpolation.py +36 -6
  245. scipy/ndimage/_measurements.py +4 -2
  246. scipy/ndimage/_morphology.py +5 -0
  247. scipy/ndimage/_nd_image.cpython-313-aarch64-linux-musl.so +0 -0
  248. scipy/ndimage/_ni_docstrings.py +5 -1
  249. scipy/ndimage/_ni_label.cpython-313-aarch64-linux-musl.so +0 -0
  250. scipy/ndimage/_ni_support.py +1 -5
  251. scipy/ndimage/_rank_filter_1d.cpython-313-aarch64-linux-musl.so +0 -0
  252. scipy/ndimage/_support_alternative_backends.py +18 -6
  253. scipy/ndimage/tests/test_filters.py +370 -259
  254. scipy/ndimage/tests/test_fourier.py +7 -9
  255. scipy/ndimage/tests/test_interpolation.py +68 -61
  256. scipy/ndimage/tests/test_measurements.py +18 -35
  257. scipy/ndimage/tests/test_morphology.py +143 -131
  258. scipy/ndimage/tests/test_splines.py +1 -3
  259. scipy/odr/__odrpack.cpython-313-aarch64-linux-musl.so +0 -0
  260. scipy/optimize/_basinhopping.py +13 -7
  261. scipy/optimize/_bglu_dense.cpython-313-aarch64-linux-musl.so +0 -0
  262. scipy/optimize/_bracket.py +17 -24
  263. scipy/optimize/_chandrupatla.py +9 -10
  264. scipy/optimize/_cobyla_py.py +104 -123
  265. scipy/optimize/_constraints.py +14 -10
  266. scipy/optimize/_differentiable_functions.py +371 -230
  267. scipy/optimize/_differentialevolution.py +4 -3
  268. scipy/optimize/_direct.cpython-313-aarch64-linux-musl.so +0 -0
  269. scipy/optimize/_dual_annealing.py +1 -1
  270. scipy/optimize/_elementwise.py +1 -4
  271. scipy/optimize/_group_columns.cpython-313-aarch64-linux-musl.so +0 -0
  272. scipy/optimize/_highspy/_core.cpython-313-aarch64-linux-musl.so +0 -0
  273. scipy/optimize/_highspy/_highs_options.cpython-313-aarch64-linux-musl.so +0 -0
  274. scipy/optimize/_lbfgsb.cpython-313-aarch64-linux-musl.so +0 -0
  275. scipy/optimize/_lbfgsb_py.py +57 -16
  276. scipy/optimize/_linprog_doc.py +2 -2
  277. scipy/optimize/_linprog_highs.py +2 -2
  278. scipy/optimize/_linprog_ip.py +25 -10
  279. scipy/optimize/_linprog_util.py +14 -16
  280. scipy/optimize/_lsap.cpython-313-aarch64-linux-musl.so +0 -0
  281. scipy/optimize/_lsq/common.py +3 -3
  282. scipy/optimize/_lsq/dogbox.py +16 -2
  283. scipy/optimize/_lsq/givens_elimination.cpython-313-aarch64-linux-musl.so +0 -0
  284. scipy/optimize/_lsq/least_squares.py +198 -126
  285. scipy/optimize/_lsq/lsq_linear.py +6 -6
  286. scipy/optimize/_lsq/trf.py +35 -8
  287. scipy/optimize/_milp.py +3 -1
  288. scipy/optimize/_minimize.py +105 -36
  289. scipy/optimize/_minpack.cpython-313-aarch64-linux-musl.so +0 -0
  290. scipy/optimize/_minpack_py.py +21 -14
  291. scipy/optimize/_moduleTNC.cpython-313-aarch64-linux-musl.so +0 -0
  292. scipy/optimize/_nnls.py +20 -21
  293. scipy/optimize/_nonlin.py +34 -3
  294. scipy/optimize/_numdiff.py +288 -110
  295. scipy/optimize/_optimize.py +86 -48
  296. scipy/optimize/_pava_pybind.cpython-313-aarch64-linux-musl.so +0 -0
  297. scipy/optimize/_remove_redundancy.py +5 -5
  298. scipy/optimize/_root_scalar.py +1 -1
  299. scipy/optimize/_shgo.py +6 -0
  300. scipy/optimize/_shgo_lib/_complex.py +1 -1
  301. scipy/optimize/_slsqp_py.py +216 -124
  302. scipy/optimize/_slsqplib.cpython-313-aarch64-linux-musl.so +0 -0
  303. scipy/optimize/_spectral.py +1 -1
  304. scipy/optimize/_tnc.py +8 -1
  305. scipy/optimize/_trlib/_trlib.cpython-313-aarch64-linux-musl.so +0 -0
  306. scipy/optimize/_trustregion.py +20 -6
  307. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  308. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  309. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  310. scipy/optimize/_trustregion_constr/projections.py +12 -8
  311. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  312. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  313. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  314. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  315. scipy/optimize/_trustregion_exact.py +0 -1
  316. scipy/optimize/_zeros.cpython-313-aarch64-linux-musl.so +0 -0
  317. scipy/optimize/_zeros_py.py +97 -17
  318. scipy/optimize/cython_optimize/_zeros.cpython-313-aarch64-linux-musl.so +0 -0
  319. scipy/optimize/slsqp.py +0 -1
  320. scipy/optimize/tests/test__basinhopping.py +1 -1
  321. scipy/optimize/tests/test__differential_evolution.py +4 -4
  322. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  323. scipy/optimize/tests/test__numdiff.py +66 -22
  324. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  325. scipy/optimize/tests/test__shgo.py +9 -1
  326. scipy/optimize/tests/test_bracket.py +36 -46
  327. scipy/optimize/tests/test_chandrupatla.py +133 -135
  328. scipy/optimize/tests/test_cobyla.py +74 -45
  329. scipy/optimize/tests/test_constraints.py +1 -1
  330. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  331. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  332. scipy/optimize/tests/test_least_squares.py +125 -13
  333. scipy/optimize/tests/test_linear_assignment.py +3 -3
  334. scipy/optimize/tests/test_linprog.py +3 -3
  335. scipy/optimize/tests/test_lsq_linear.py +6 -6
  336. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  337. scipy/optimize/tests/test_minpack.py +4 -4
  338. scipy/optimize/tests/test_nnls.py +43 -3
  339. scipy/optimize/tests/test_nonlin.py +36 -0
  340. scipy/optimize/tests/test_optimize.py +95 -17
  341. scipy/optimize/tests/test_slsqp.py +36 -4
  342. scipy/optimize/tests/test_zeros.py +34 -1
  343. scipy/signal/__init__.py +12 -23
  344. scipy/signal/_delegators.py +568 -0
  345. scipy/signal/_filter_design.py +459 -241
  346. scipy/signal/_fir_filter_design.py +262 -90
  347. scipy/signal/_lti_conversion.py +3 -2
  348. scipy/signal/_ltisys.py +118 -91
  349. scipy/signal/_max_len_seq_inner.cpython-313-aarch64-linux-musl.so +0 -0
  350. scipy/signal/_peak_finding_utils.cpython-313-aarch64-linux-musl.so +0 -0
  351. scipy/signal/_polyutils.py +172 -0
  352. scipy/signal/_short_time_fft.py +519 -70
  353. scipy/signal/_signal_api.py +30 -0
  354. scipy/signal/_signaltools.py +719 -399
  355. scipy/signal/_sigtools.cpython-313-aarch64-linux-musl.so +0 -0
  356. scipy/signal/_sosfilt.cpython-313-aarch64-linux-musl.so +0 -0
  357. scipy/signal/_spectral_py.py +230 -50
  358. scipy/signal/_spline.cpython-313-aarch64-linux-musl.so +0 -0
  359. scipy/signal/_spline_filters.py +108 -68
  360. scipy/signal/_support_alternative_backends.py +73 -0
  361. scipy/signal/_upfirdn.py +4 -1
  362. scipy/signal/_upfirdn_apply.cpython-313-aarch64-linux-musl.so +0 -0
  363. scipy/signal/_waveforms.py +2 -11
  364. scipy/signal/_wavelets.py +1 -1
  365. scipy/signal/fir_filter_design.py +1 -0
  366. scipy/signal/spline.py +4 -11
  367. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  368. scipy/signal/tests/test_bsplines.py +114 -79
  369. scipy/signal/tests/test_cont2discrete.py +9 -2
  370. scipy/signal/tests/test_filter_design.py +721 -481
  371. scipy/signal/tests/test_fir_filter_design.py +332 -140
  372. scipy/signal/tests/test_savitzky_golay.py +4 -3
  373. scipy/signal/tests/test_short_time_fft.py +221 -3
  374. scipy/signal/tests/test_signaltools.py +2144 -1348
  375. scipy/signal/tests/test_spectral.py +50 -6
  376. scipy/signal/tests/test_splines.py +161 -96
  377. scipy/signal/tests/test_upfirdn.py +84 -50
  378. scipy/signal/tests/test_waveforms.py +20 -0
  379. scipy/signal/tests/test_windows.py +607 -466
  380. scipy/signal/windows/_windows.py +287 -148
  381. scipy/sparse/__init__.py +23 -4
  382. scipy/sparse/_base.py +270 -108
  383. scipy/sparse/_bsr.py +7 -4
  384. scipy/sparse/_compressed.py +59 -231
  385. scipy/sparse/_construct.py +90 -38
  386. scipy/sparse/_coo.py +115 -181
  387. scipy/sparse/_csc.py +4 -4
  388. scipy/sparse/_csparsetools.cpython-313-aarch64-linux-musl.so +0 -0
  389. scipy/sparse/_csr.py +2 -2
  390. scipy/sparse/_data.py +48 -48
  391. scipy/sparse/_dia.py +105 -18
  392. scipy/sparse/_dok.py +0 -23
  393. scipy/sparse/_index.py +4 -4
  394. scipy/sparse/_matrix.py +23 -0
  395. scipy/sparse/_sparsetools.cpython-313-aarch64-linux-musl.so +0 -0
  396. scipy/sparse/_sputils.py +37 -22
  397. scipy/sparse/base.py +0 -9
  398. scipy/sparse/bsr.py +0 -14
  399. scipy/sparse/compressed.py +0 -23
  400. scipy/sparse/construct.py +0 -6
  401. scipy/sparse/coo.py +0 -14
  402. scipy/sparse/csc.py +0 -3
  403. scipy/sparse/csgraph/_flow.cpython-313-aarch64-linux-musl.so +0 -0
  404. scipy/sparse/csgraph/_matching.cpython-313-aarch64-linux-musl.so +0 -0
  405. scipy/sparse/csgraph/_min_spanning_tree.cpython-313-aarch64-linux-musl.so +0 -0
  406. scipy/sparse/csgraph/_reordering.cpython-313-aarch64-linux-musl.so +0 -0
  407. scipy/sparse/csgraph/_shortest_path.cpython-313-aarch64-linux-musl.so +0 -0
  408. scipy/sparse/csgraph/_tools.cpython-313-aarch64-linux-musl.so +0 -0
  409. scipy/sparse/csgraph/_traversal.cpython-313-aarch64-linux-musl.so +0 -0
  410. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  411. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  412. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  413. scipy/sparse/csr.py +0 -5
  414. scipy/sparse/data.py +1 -6
  415. scipy/sparse/dia.py +0 -7
  416. scipy/sparse/dok.py +0 -10
  417. scipy/sparse/linalg/_dsolve/_superlu.cpython-313-aarch64-linux-musl.so +0 -0
  418. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  419. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  420. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313-aarch64-linux-musl.so +0 -0
  421. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  422. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  423. scipy/sparse/linalg/_interface.py +17 -18
  424. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  425. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  426. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  427. scipy/sparse/linalg/_isolve/minres.py +5 -5
  428. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  429. scipy/sparse/linalg/_isolve/utils.py +2 -8
  430. scipy/sparse/linalg/_matfuncs.py +1 -1
  431. scipy/sparse/linalg/_norm.py +1 -1
  432. scipy/sparse/linalg/_propack/_cpropack.cpython-313-aarch64-linux-musl.so +0 -0
  433. scipy/sparse/linalg/_propack/_dpropack.cpython-313-aarch64-linux-musl.so +0 -0
  434. scipy/sparse/linalg/_propack/_spropack.cpython-313-aarch64-linux-musl.so +0 -0
  435. scipy/sparse/linalg/_propack/_zpropack.cpython-313-aarch64-linux-musl.so +0 -0
  436. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  437. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  438. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  439. scipy/sparse/tests/test_base.py +214 -42
  440. scipy/sparse/tests/test_common1d.py +7 -7
  441. scipy/sparse/tests/test_construct.py +1 -1
  442. scipy/sparse/tests/test_coo.py +272 -4
  443. scipy/sparse/tests/test_sparsetools.py +5 -0
  444. scipy/sparse/tests/test_sputils.py +36 -7
  445. scipy/spatial/_ckdtree.cpython-313-aarch64-linux-musl.so +0 -0
  446. scipy/spatial/_distance_pybind.cpython-313-aarch64-linux-musl.so +0 -0
  447. scipy/spatial/_distance_wrap.cpython-313-aarch64-linux-musl.so +0 -0
  448. scipy/spatial/_hausdorff.cpython-313-aarch64-linux-musl.so +0 -0
  449. scipy/spatial/_qhull.cpython-313-aarch64-linux-musl.so +0 -0
  450. scipy/spatial/_voronoi.cpython-313-aarch64-linux-musl.so +0 -0
  451. scipy/spatial/distance.py +49 -42
  452. scipy/spatial/tests/test_distance.py +15 -1
  453. scipy/spatial/tests/test_kdtree.py +1 -0
  454. scipy/spatial/tests/test_qhull.py +7 -2
  455. scipy/spatial/transform/__init__.py +5 -3
  456. scipy/spatial/transform/_rigid_transform.cpython-313-aarch64-linux-musl.so +0 -0
  457. scipy/spatial/transform/_rotation.cpython-313-aarch64-linux-musl.so +0 -0
  458. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  459. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  460. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  461. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  462. scipy/special/__init__.py +1 -47
  463. scipy/special/_add_newdocs.py +34 -772
  464. scipy/special/_basic.py +22 -25
  465. scipy/special/_comb.cpython-313-aarch64-linux-musl.so +0 -0
  466. scipy/special/_ellip_harm_2.cpython-313-aarch64-linux-musl.so +0 -0
  467. scipy/special/_gufuncs.cpython-313-aarch64-linux-musl.so +0 -0
  468. scipy/special/_logsumexp.py +67 -58
  469. scipy/special/_orthogonal.pyi +1 -1
  470. scipy/special/_specfun.cpython-313-aarch64-linux-musl.so +0 -0
  471. scipy/special/_special_ufuncs.cpython-313-aarch64-linux-musl.so +0 -0
  472. scipy/special/_spherical_bessel.py +4 -4
  473. scipy/special/_support_alternative_backends.py +212 -119
  474. scipy/special/_test_internal.cpython-313-aarch64-linux-musl.so +0 -0
  475. scipy/special/_testutils.py +4 -4
  476. scipy/special/_ufuncs.cpython-313-aarch64-linux-musl.so +0 -0
  477. scipy/special/_ufuncs.pyi +1 -0
  478. scipy/special/_ufuncs.pyx +215 -1400
  479. scipy/special/_ufuncs_cxx.cpython-313-aarch64-linux-musl.so +0 -0
  480. scipy/special/_ufuncs_cxx.pxd +2 -15
  481. scipy/special/_ufuncs_cxx.pyx +5 -44
  482. scipy/special/_ufuncs_cxx_defs.h +2 -16
  483. scipy/special/_ufuncs_defs.h +0 -8
  484. scipy/special/cython_special.cpython-313-aarch64-linux-musl.so +0 -0
  485. scipy/special/cython_special.pxd +1 -1
  486. scipy/special/tests/_cython_examples/meson.build +10 -1
  487. scipy/special/tests/test_basic.py +153 -20
  488. scipy/special/tests/test_boost_ufuncs.py +3 -0
  489. scipy/special/tests/test_cdflib.py +35 -11
  490. scipy/special/tests/test_gammainc.py +16 -0
  491. scipy/special/tests/test_hyp2f1.py +2 -2
  492. scipy/special/tests/test_log1mexp.py +85 -0
  493. scipy/special/tests/test_logsumexp.py +206 -64
  494. scipy/special/tests/test_mpmath.py +1 -0
  495. scipy/special/tests/test_nan_inputs.py +1 -1
  496. scipy/special/tests/test_orthogonal.py +17 -18
  497. scipy/special/tests/test_sf_error.py +3 -2
  498. scipy/special/tests/test_sph_harm.py +6 -7
  499. scipy/special/tests/test_support_alternative_backends.py +211 -76
  500. scipy/stats/__init__.py +4 -1
  501. scipy/stats/_ansari_swilk_statistics.cpython-313-aarch64-linux-musl.so +0 -0
  502. scipy/stats/_axis_nan_policy.py +5 -12
  503. scipy/stats/_biasedurn.cpython-313-aarch64-linux-musl.so +0 -0
  504. scipy/stats/_continued_fraction.py +387 -0
  505. scipy/stats/_continuous_distns.py +277 -310
  506. scipy/stats/_correlation.py +1 -1
  507. scipy/stats/_covariance.py +6 -3
  508. scipy/stats/_discrete_distns.py +39 -32
  509. scipy/stats/_distn_infrastructure.py +39 -12
  510. scipy/stats/_distribution_infrastructure.py +900 -238
  511. scipy/stats/_entropy.py +9 -10
  512. scipy/{_lib → stats}/_finite_differences.py +1 -1
  513. scipy/stats/_hypotests.py +83 -50
  514. scipy/stats/_kde.py +53 -49
  515. scipy/stats/_ksstats.py +1 -1
  516. scipy/stats/_levy_stable/__init__.py +7 -15
  517. scipy/stats/_levy_stable/levyst.cpython-313-aarch64-linux-musl.so +0 -0
  518. scipy/stats/_morestats.py +118 -73
  519. scipy/stats/_mstats_basic.py +13 -17
  520. scipy/stats/_mstats_extras.py +8 -8
  521. scipy/stats/_multivariate.py +89 -113
  522. scipy/stats/_new_distributions.py +97 -20
  523. scipy/stats/_page_trend_test.py +12 -5
  524. scipy/stats/_probability_distribution.py +265 -43
  525. scipy/stats/_qmc.py +14 -9
  526. scipy/stats/_qmc_cy.cpython-313-aarch64-linux-musl.so +0 -0
  527. scipy/stats/_qmvnt.py +16 -95
  528. scipy/stats/_qmvnt_cy.cpython-313-aarch64-linux-musl.so +0 -0
  529. scipy/stats/_quantile.py +335 -0
  530. scipy/stats/_rcont/rcont.cpython-313-aarch64-linux-musl.so +0 -0
  531. scipy/stats/_resampling.py +4 -29
  532. scipy/stats/_sampling.py +1 -1
  533. scipy/stats/_sobol.cpython-313-aarch64-linux-musl.so +0 -0
  534. scipy/stats/_stats.cpython-313-aarch64-linux-musl.so +0 -0
  535. scipy/stats/_stats_mstats_common.py +21 -2
  536. scipy/stats/_stats_py.py +550 -476
  537. scipy/stats/_stats_pythran.cpython-313-aarch64-linux-musl.so +0 -0
  538. scipy/stats/_unuran/unuran_wrapper.cpython-313-aarch64-linux-musl.so +0 -0
  539. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  540. scipy/stats/_variation.py +6 -8
  541. scipy/stats/_wilcoxon.py +13 -7
  542. scipy/stats/tests/common_tests.py +6 -4
  543. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  544. scipy/stats/tests/test_continued_fraction.py +173 -0
  545. scipy/stats/tests/test_continuous.py +379 -60
  546. scipy/stats/tests/test_continuous_basic.py +18 -12
  547. scipy/stats/tests/test_discrete_basic.py +14 -8
  548. scipy/stats/tests/test_discrete_distns.py +16 -16
  549. scipy/stats/tests/test_distributions.py +95 -75
  550. scipy/stats/tests/test_entropy.py +40 -48
  551. scipy/stats/tests/test_fit.py +4 -3
  552. scipy/stats/tests/test_hypotests.py +153 -24
  553. scipy/stats/tests/test_kdeoth.py +109 -41
  554. scipy/stats/tests/test_marray.py +289 -0
  555. scipy/stats/tests/test_morestats.py +79 -47
  556. scipy/stats/tests/test_mstats_basic.py +3 -3
  557. scipy/stats/tests/test_multivariate.py +434 -83
  558. scipy/stats/tests/test_qmc.py +13 -10
  559. scipy/stats/tests/test_quantile.py +199 -0
  560. scipy/stats/tests/test_rank.py +119 -112
  561. scipy/stats/tests/test_resampling.py +47 -56
  562. scipy/stats/tests/test_sampling.py +9 -4
  563. scipy/stats/tests/test_stats.py +799 -939
  564. scipy/stats/tests/test_variation.py +8 -6
  565. scipy/version.py +2 -2
  566. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  567. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  568. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +1262 -1269
  569. scipy.libs/libgcc_s-69c45f16.so.1 +0 -0
  570. scipy.libs/libgfortran-db0b6589.so.5.0.0 +0 -0
  571. scipy.libs/{libstdc++-1b614e01.so.6.0.32 → libstdc++-1f1a71be.so.6.0.33} +0 -0
  572. scipy/_lib/array_api_extra/_funcs.py +0 -484
  573. scipy/_lib/array_api_extra/_typing.py +0 -8
  574. scipy/interpolate/_bspl.cpython-313-aarch64-linux-musl.so +0 -0
  575. scipy/optimize/_cobyla.cpython-313-aarch64-linux-musl.so +0 -0
  576. scipy/optimize/_cython_nnls.cpython-313-aarch64-linux-musl.so +0 -0
  577. scipy/optimize/_slsqp.cpython-313-aarch64-linux-musl.so +0 -0
  578. scipy/spatial/qhull_src/COPYING.txt +0 -38
  579. scipy/special/libsf_error_state.so +0 -0
  580. scipy/special/tests/test_log_softmax.py +0 -109
  581. scipy/special/tests/test_xsf_cuda.py +0 -114
  582. scipy/special/xsf/binom.h +0 -89
  583. scipy/special/xsf/cdflib.h +0 -100
  584. scipy/special/xsf/cephes/airy.h +0 -307
  585. scipy/special/xsf/cephes/besselpoly.h +0 -51
  586. scipy/special/xsf/cephes/beta.h +0 -257
  587. scipy/special/xsf/cephes/cbrt.h +0 -131
  588. scipy/special/xsf/cephes/chbevl.h +0 -85
  589. scipy/special/xsf/cephes/chdtr.h +0 -193
  590. scipy/special/xsf/cephes/const.h +0 -87
  591. scipy/special/xsf/cephes/ellie.h +0 -293
  592. scipy/special/xsf/cephes/ellik.h +0 -251
  593. scipy/special/xsf/cephes/ellpe.h +0 -107
  594. scipy/special/xsf/cephes/ellpk.h +0 -117
  595. scipy/special/xsf/cephes/expn.h +0 -260
  596. scipy/special/xsf/cephes/gamma.h +0 -398
  597. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  598. scipy/special/xsf/cephes/hyperg.h +0 -361
  599. scipy/special/xsf/cephes/i0.h +0 -149
  600. scipy/special/xsf/cephes/i1.h +0 -158
  601. scipy/special/xsf/cephes/igam.h +0 -421
  602. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  603. scipy/special/xsf/cephes/igami.h +0 -313
  604. scipy/special/xsf/cephes/j0.h +0 -225
  605. scipy/special/xsf/cephes/j1.h +0 -198
  606. scipy/special/xsf/cephes/jv.h +0 -715
  607. scipy/special/xsf/cephes/k0.h +0 -164
  608. scipy/special/xsf/cephes/k1.h +0 -163
  609. scipy/special/xsf/cephes/kn.h +0 -243
  610. scipy/special/xsf/cephes/lanczos.h +0 -112
  611. scipy/special/xsf/cephes/ndtr.h +0 -275
  612. scipy/special/xsf/cephes/poch.h +0 -85
  613. scipy/special/xsf/cephes/polevl.h +0 -167
  614. scipy/special/xsf/cephes/psi.h +0 -194
  615. scipy/special/xsf/cephes/rgamma.h +0 -111
  616. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  617. scipy/special/xsf/cephes/shichi.h +0 -248
  618. scipy/special/xsf/cephes/sici.h +0 -224
  619. scipy/special/xsf/cephes/sindg.h +0 -221
  620. scipy/special/xsf/cephes/tandg.h +0 -139
  621. scipy/special/xsf/cephes/trig.h +0 -58
  622. scipy/special/xsf/cephes/unity.h +0 -186
  623. scipy/special/xsf/cephes/zeta.h +0 -172
  624. scipy/special/xsf/config.h +0 -304
  625. scipy/special/xsf/digamma.h +0 -205
  626. scipy/special/xsf/error.h +0 -57
  627. scipy/special/xsf/evalpoly.h +0 -47
  628. scipy/special/xsf/expint.h +0 -266
  629. scipy/special/xsf/hyp2f1.h +0 -694
  630. scipy/special/xsf/iv_ratio.h +0 -173
  631. scipy/special/xsf/lambertw.h +0 -150
  632. scipy/special/xsf/loggamma.h +0 -163
  633. scipy/special/xsf/sici.h +0 -200
  634. scipy/special/xsf/tools.h +0 -427
  635. scipy/special/xsf/trig.h +0 -164
  636. scipy/special/xsf/wright_bessel.h +0 -843
  637. scipy/special/xsf/zlog1.h +0 -35
  638. scipy/stats/_mvn.cpython-313-aarch64-linux-musl.so +0 -0
  639. scipy.libs/libgcc_s-7393e603.so.1 +0 -0
  640. scipy.libs/libgfortran-eb933d8e.so.5.0.0 +0 -0
  641. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
@@ -10,6 +10,7 @@ Functions
10
10
  __all__ = ['minimize', 'minimize_scalar']
11
11
 
12
12
 
13
+ import inspect
13
14
  from warnings import warn
14
15
 
15
16
  import numpy as np
@@ -46,7 +47,7 @@ MINIMIZE_METHODS = ['nelder-mead', 'powell', 'cg', 'bfgs', 'newton-cg',
46
47
  # These methods support the new callback interface (passed an OptimizeResult)
47
48
  MINIMIZE_METHODS_NEW_CB = ['nelder-mead', 'powell', 'cg', 'bfgs', 'newton-cg',
48
49
  'l-bfgs-b', 'trust-constr', 'dogleg', 'trust-ncg',
49
- 'trust-exact', 'trust-krylov', 'cobyqa']
50
+ 'trust-exact', 'trust-krylov', 'cobyqa', 'cobyla']
50
51
 
51
52
  MINIMIZE_SCALAR_METHODS = ['brent', 'bounded', 'golden']
52
53
 
@@ -166,8 +167,8 @@ def minimize(fun, x0, args=(), method=None, jac=None, hess=None,
166
167
  constraints : {Constraint, dict} or List of {Constraint, dict}, optional
167
168
  Constraints definition. Only for COBYLA, COBYQA, SLSQP and trust-constr.
168
169
 
169
- Constraints for 'trust-constr' and 'cobyqa' are defined as a single object
170
- or a list of objects specifying constraints to the optimization problem.
170
+ Constraints for 'trust-constr', 'cobyqa', and 'cobyla' are defined as a single
171
+ object or a list of objects specifying constraints to the optimization problem.
171
172
  Available constraints are:
172
173
 
173
174
  - `LinearConstraint`
@@ -210,17 +211,17 @@ def minimize(fun, x0, args=(), method=None, jac=None, hess=None,
210
211
  callback : callable, optional
211
212
  A callable called after each iteration.
212
213
 
213
- All methods except TNC, SLSQP, and COBYLA support a callable with
214
+ All methods except TNC and SLSQP support a callable with
214
215
  the signature::
215
216
 
216
217
  callback(intermediate_result: OptimizeResult)
217
218
 
218
219
  where ``intermediate_result`` is a keyword parameter containing an
219
220
  `OptimizeResult` with attributes ``x`` and ``fun``, the present values
220
- of the parameter vector and objective function. Note that the name
221
- of the parameter must be ``intermediate_result`` for the callback
222
- to be passed an `OptimizeResult`. These methods will also terminate if
223
- the callback raises ``StopIteration``.
221
+ of the parameter vector and objective function. Not all attributes of
222
+ `OptimizeResult` may be present. The name of the parameter must be
223
+ ``intermediate_result`` for the callback to be passed an `OptimizeResult`.
224
+ These methods will also terminate if the callback raises ``StopIteration``.
224
225
 
225
226
  All methods except trust-constr (also) support a signature like::
226
227
 
@@ -338,13 +339,11 @@ def minimize(fun, x0, args=(), method=None, jac=None, hess=None,
338
339
 
339
340
  **Constrained Minimization**
340
341
 
341
- Method :ref:`COBYLA <optimize.minimize-cobyla>` uses the
342
+ Method :ref:`COBYLA <optimize.minimize-cobyla>` uses the PRIMA
343
+ implementation [19]_ of the
342
344
  Constrained Optimization BY Linear Approximation (COBYLA) method
343
345
  [9]_, [10]_, [11]_. The algorithm is based on linear
344
- approximations to the objective function and each constraint. The
345
- method wraps a FORTRAN implementation of the algorithm. The
346
- constraints functions 'fun' may return either a single number
347
- or an array or list of numbers.
346
+ approximations to the objective function and each constraint.
348
347
 
349
348
  Method :ref:`COBYQA <optimize.minimize-cobyqa>` uses the Constrained
350
349
  Optimization BY Quadratic Approximations (COBYQA) method [18]_. The
@@ -488,6 +487,11 @@ def minimize(fun, x0, args=(), method=None, jac=None, hess=None,
488
487
  and Software*. PhD thesis, Department of Applied Mathematics, The Hong
489
488
  Kong Polytechnic University, Hong Kong, China, 2022. URL:
490
489
  https://theses.lib.polyu.edu.hk/handle/200/12294.
490
+ .. [19] Zhang, Z. "PRIMA: Reference Implementation for Powell's Methods with
491
+ Modernization and Amelioration", https://www.libprima.net,
492
+ :doi:`10.5281/zenodo.8052654`
493
+ .. [20] Karush-Kuhn-Tucker conditions,
494
+ https://en.wikipedia.org/wiki/Karush%E2%80%93Kuhn%E2%80%93Tucker_conditions
491
495
 
492
496
  Examples
493
497
  --------
@@ -527,7 +531,6 @@ def minimize(fun, x0, args=(), method=None, jac=None, hess=None,
527
531
  [ 0.09495377, 0.18996269, 0.38165151, 0.7664427, 1.53713523]
528
532
  ])
529
533
 
530
-
531
534
  Next, consider a minimization problem with several constraints (namely
532
535
  Example 16.4 from [5]_). The objective function is:
533
536
 
@@ -545,10 +548,42 @@ def minimize(fun, x0, args=(), method=None, jac=None, hess=None,
545
548
 
546
549
  The optimization problem is solved using the SLSQP method as:
547
550
 
548
- >>> res = minimize(fun, (2, 0), method='SLSQP', bounds=bnds,
549
- ... constraints=cons)
551
+ >>> res = minimize(fun, (2, 0), method='SLSQP', bounds=bnds, constraints=cons)
552
+
553
+ It should converge to the theoretical solution ``[1.4 ,1.7]``. *SLSQP* also
554
+ returns the multipliers that are used in the solution of the problem. These
555
+ multipliers, when the problem constraints are linear, can be thought of as the
556
+ Karush-Kuhn-Tucker (KKT) multipliers, which are a generalization
557
+ of Lagrange multipliers to inequality-constrained optimization problems ([20]_).
558
+
559
+ Notice that at the solution, the first constraint is active. Let's evaluate the
560
+ function at solution:
561
+
562
+ >>> cons[0]['fun'](res.x)
563
+ np.float64(1.4901224698604665e-09)
564
+
565
+ Also, notice that at optimality there is a non-zero multiplier:
566
+
567
+ >>> res.multipliers
568
+ array([0.8, 0. , 0. ])
569
+
570
+ This can be understood as the local sensitivity of the optimal value of the
571
+ objective function with respect to changes in the first constraint. If we
572
+ tighten the constraint by a small amount ``eps``:
550
573
 
551
- It should converge to the theoretical solution (1.4 ,1.7).
574
+ >>> eps = 0.01
575
+ >>> cons[0]['fun'] = lambda x: x[0] - 2 * x[1] + 2 - eps
576
+
577
+ we expect the optimal value of the objective function to increase by
578
+ approximately ``eps * res.multipliers[0]``:
579
+
580
+ >>> eps * res.multipliers[0] # Expected change in f0
581
+ np.float64(0.008000000027153205)
582
+ >>> f0 = res.fun # Keep track of the previous optimal value
583
+ >>> res = minimize(fun, (2, 0), method='SLSQP', bounds=bnds, constraints=cons)
584
+ >>> f1 = res.fun # New optimal value
585
+ >>> f1 - f0
586
+ np.float64(0.008019998807885509)
552
587
 
553
588
  """
554
589
  x0 = np.atleast_1d(np.asarray(x0))
@@ -701,25 +736,37 @@ def minimize(fun, x0, args=(), method=None, jac=None, hess=None,
701
736
  x_fixed = (bounds.lb)[i_fixed]
702
737
  x0 = x0[~i_fixed]
703
738
  bounds = _remove_from_bounds(bounds, i_fixed)
704
- fun = _remove_from_func(fun, i_fixed, x_fixed)
739
+ fun = _Remove_From_Func(fun, i_fixed, x_fixed)
740
+
705
741
  if callable(callback):
706
- callback = _remove_from_func(callback, i_fixed, x_fixed)
742
+ sig = inspect.signature(callback)
743
+ if set(sig.parameters) == {'intermediate_result'}:
744
+ # callback(intermediate_result)
745
+ print(callback)
746
+ callback = _Patch_Callback_Equal_Variables(
747
+ callback, i_fixed, x_fixed
748
+ )
749
+ else:
750
+ # callback(x)
751
+ callback = _Remove_From_Func(callback, i_fixed, x_fixed)
752
+
707
753
  if callable(jac):
708
- jac = _remove_from_func(jac, i_fixed, x_fixed, remove=1)
754
+ jac = _Remove_From_Func(jac, i_fixed, x_fixed, remove=1)
709
755
 
710
756
  # make a copy of the constraints so the user's version doesn't
711
757
  # get changed. (Shallow copy is ok)
712
758
  constraints = [con.copy() for con in constraints]
713
759
  for con in constraints: # yes, guaranteed to be a list
714
- con['fun'] = _remove_from_func(con['fun'], i_fixed,
760
+ con['fun'] = _Remove_From_Func(con['fun'], i_fixed,
715
761
  x_fixed, min_dim=1,
716
762
  remove=0)
717
763
  if callable(con.get('jac', None)):
718
- con['jac'] = _remove_from_func(con['jac'], i_fixed,
764
+ con['jac'] = _Remove_From_Func(con['jac'], i_fixed,
719
765
  x_fixed, min_dim=2,
720
766
  remove=1)
721
767
  bounds = standardize_bounds(bounds, x0, meth)
722
768
 
769
+ # selects whether to use callback(x) or callback(intermediate_result)
723
770
  callback = _wrap_callback(callback, meth)
724
771
 
725
772
  if meth == 'nelder-mead':
@@ -1000,27 +1047,49 @@ def _remove_from_bounds(bounds, i_fixed):
1000
1047
  return Bounds(lb, ub) # don't mutate original Bounds object
1001
1048
 
1002
1049
 
1003
- def _remove_from_func(fun_in, i_fixed, x_fixed, min_dim=None, remove=0):
1050
+ class _Patch_Callback_Equal_Variables:
1051
+ # Patches a callback that accepts an intermediate_result
1052
+ def __init__(self, callback, i_fixed, x_fixed):
1053
+ self.callback = callback
1054
+ self.i_fixed = i_fixed
1055
+ self.x_fixed = x_fixed
1056
+
1057
+ def __call__(self, intermediate_result):
1058
+ x_in = intermediate_result.x
1059
+ x_out = np.zeros_like(self.i_fixed, dtype=x_in.dtype)
1060
+ x_out[self.i_fixed] = self.x_fixed
1061
+ x_out[~self.i_fixed] = x_in
1062
+ intermediate_result.x = x_out
1063
+ return self.callback(intermediate_result)
1064
+
1065
+
1066
+ class _Remove_From_Func:
1004
1067
  """Wraps a function such that fixed variables need not be passed in"""
1005
- def fun_out(x_in, *args, **kwargs):
1006
- x_out = np.zeros_like(i_fixed, dtype=x_in.dtype)
1007
- x_out[i_fixed] = x_fixed
1008
- x_out[~i_fixed] = x_in
1009
- y_out = fun_in(x_out, *args, **kwargs)
1068
+ def __init__(self, fun_in, i_fixed, x_fixed, min_dim=None, remove=0):
1069
+ self.fun_in = fun_in
1070
+ self.i_fixed = i_fixed
1071
+ self.x_fixed = x_fixed
1072
+ self.min_dim = min_dim
1073
+ self.remove = remove
1074
+
1075
+ def __call__(self, x_in, *args, **kwargs):
1076
+ x_out = np.zeros_like(self.i_fixed, dtype=x_in.dtype)
1077
+ x_out[self.i_fixed] = self.x_fixed
1078
+ x_out[~self.i_fixed] = x_in
1079
+ y_out = self.fun_in(x_out, *args, **kwargs)
1010
1080
  y_out = np.array(y_out)
1011
1081
 
1012
- if min_dim == 1:
1082
+ if self.min_dim == 1:
1013
1083
  y_out = np.atleast_1d(y_out)
1014
- elif min_dim == 2:
1084
+ elif self.min_dim == 2:
1015
1085
  y_out = np.atleast_2d(y_out)
1016
1086
 
1017
- if remove == 1:
1018
- y_out = y_out[..., ~i_fixed]
1019
- elif remove == 2:
1020
- y_out = y_out[~i_fixed, ~i_fixed]
1087
+ if self.remove == 1:
1088
+ y_out = y_out[..., ~self.i_fixed]
1089
+ elif self.remove == 2:
1090
+ y_out = y_out[~self.i_fixed, ~self.i_fixed]
1021
1091
 
1022
1092
  return y_out
1023
- return fun_out
1024
1093
 
1025
1094
 
1026
1095
  def _add_to_array(x_in, i_fixed, x_fixed):
@@ -1074,7 +1143,7 @@ def standardize_constraints(constraints, x0, meth):
1074
1143
  else:
1075
1144
  constraints = list(constraints) # ensure it's a mutable sequence
1076
1145
 
1077
- if meth in ['trust-constr', 'cobyqa', 'new']:
1146
+ if meth in ['trust-constr', 'cobyqa', 'new', 'cobyla']:
1078
1147
  for i, con in enumerate(constraints):
1079
1148
  if not isinstance(con, new_constraint_types):
1080
1149
  constraints[i] = old_constraint_to_new(i, con)
@@ -7,8 +7,9 @@ from numpy import (atleast_1d, triu, shape, transpose, zeros, prod, greater,
7
7
  finfo, inexact, issubdtype, dtype)
8
8
  from scipy import linalg
9
9
  from scipy.linalg import svd, cholesky, solve_triangular, LinAlgError
10
- from scipy._lib._util import _asarray_validated, _lazywhere, _contains_nan
10
+ from scipy._lib._util import _asarray_validated, _contains_nan
11
11
  from scipy._lib._util import getfullargspec_no_self as _getfullargspec
12
+ import scipy._lib.array_api_extra as xpx
12
13
  from ._optimize import OptimizeResult, _check_unknown_options, OptimizeWarning
13
14
  from ._lsq import least_squares
14
15
  # from ._lsq.common import make_strictly_feasible
@@ -260,7 +261,7 @@ def _root_hybr(func, x0, args=(), jac=None,
260
261
  errors = {0: "Improper input parameters were entered.",
261
262
  1: "The solution converged.",
262
263
  2: "The number of calls to function has "
263
- "reached maxfev = %d." % maxfev,
264
+ f"reached maxfev = {maxfev}.",
264
265
  3: f"xtol={xtol:f} is too small, no further improvement "
265
266
  "in the approximate\n solution is possible.",
266
267
  4: "The iteration is not making good progress, as measured "
@@ -461,7 +462,7 @@ def leastsq(func, x0, args=(), Dfun=None, full_output=False,
461
462
  f"column of the\n Jacobian is at most {gtol:f} in "
462
463
  "absolute value", None],
463
464
  5: ["Number of calls to function has reached "
464
- "maxfev = %d." % maxfev, ValueError],
465
+ f"maxfev = {maxfev}.", ValueError],
465
466
  6: [f"ftol={ftol:f} is too small, no further reduction "
466
467
  "in the sum of squares\n is possible.",
467
468
  ValueError],
@@ -799,6 +800,11 @@ def curve_fit(f, xdata, ydata, p0=None, sigma=None, absolute_sigma=False,
799
800
  'dogbox' methods, the `x_scale` keyword argument can be used to scale
800
801
  the parameters.
801
802
 
803
+ `curve_fit` is for local optimization of parameters to minimize the sum of squares
804
+ of residuals. For global optimization, other choices of objective function, and
805
+ other advanced features, consider using SciPy's :ref:`tutorial_optimize_global`
806
+ tools or the `LMFIT <https://lmfit.github.io/lmfit-py/index.html>`_ package.
807
+
802
808
  References
803
809
  ----------
804
810
  .. [1] K. Vugrin et al. Confidence region estimation techniques for nonlinear
@@ -931,7 +937,7 @@ def curve_fit(f, xdata, ydata, p0=None, sigma=None, absolute_sigma=False,
931
937
  else:
932
938
  ydata = np.asarray(ydata, float)
933
939
 
934
- if isinstance(xdata, (list, tuple, np.ndarray)):
940
+ if isinstance(xdata, list | tuple | np.ndarray):
935
941
  # `xdata` is passed straight to the user-defined `f`, so allow
936
942
  # non-array_like `xdata`.
937
943
  if check_finite:
@@ -946,14 +952,15 @@ def curve_fit(f, xdata, ydata, p0=None, sigma=None, absolute_sigma=False,
946
952
  # the x-y data are already checked, and they don't contain nans.
947
953
  if not check_finite and nan_policy is not None:
948
954
  if nan_policy == "propagate":
949
- raise ValueError("`nan_policy='propagate'` is not supported "
950
- "by this function.")
955
+ msg = "`nan_policy='propagate'` is not supported by this function."
956
+ raise ValueError(msg)
957
+ if nan_policy not in ("raise", "omit"):
958
+ # Override error message raised by _contains_nan
959
+ msg = "nan_policy must be one of {None, 'raise', 'omit'}"
960
+ raise ValueError(msg)
951
961
 
952
- policies = [None, 'raise', 'omit']
953
- x_contains_nan, nan_policy = _contains_nan(xdata, nan_policy,
954
- policies=policies)
955
- y_contains_nan, nan_policy = _contains_nan(ydata, nan_policy,
956
- policies=policies)
962
+ x_contains_nan = _contains_nan(xdata, nan_policy)
963
+ y_contains_nan = _contains_nan(ydata, nan_policy)
957
964
 
958
965
  if (x_contains_nan or y_contains_nan) and nan_policy == 'omit':
959
966
  # ignore NaNs for N dimensional arrays
@@ -1113,14 +1120,14 @@ def _fixed_point_helper(func, x0, args, xtol, maxiter, use_accel):
1113
1120
  if use_accel:
1114
1121
  p2 = func(p1, *args)
1115
1122
  d = p2 - 2.0 * p1 + p0
1116
- p = _lazywhere(d != 0, (p0, p1, d), f=_del2, fillvalue=p2)
1123
+ p = xpx.apply_where(d != 0, (p0, p1, d), _del2, fill_value=p2)
1117
1124
  else:
1118
1125
  p = p1
1119
- relerr = _lazywhere(p0 != 0, (p, p0), f=_relerr, fillvalue=p)
1126
+ relerr = xpx.apply_where(p0 != 0, (p, p0), _relerr, fill_value=p)
1120
1127
  if np.all(np.abs(relerr) < xtol):
1121
1128
  return p
1122
1129
  p0 = p
1123
- msg = "Failed to converge after %d iterations, value is %s" % (maxiter, p)
1130
+ msg = f"Failed to converge after {maxiter} iterations, value is {p}"
1124
1131
  raise RuntimeError(msg)
1125
1132
 
1126
1133
 
scipy/optimize/_nnls.py CHANGED
@@ -1,11 +1,14 @@
1
1
  import numpy as np
2
- from ._cython_nnls import _nnls
2
+ from ._slsqplib import nnls as _nnls
3
+ from scipy._lib.deprecation import _deprecate_positional_args, _NoValue
3
4
 
4
5
 
5
6
  __all__ = ['nnls']
6
7
 
7
8
 
8
- def nnls(A, b, maxiter=None, *, atol=None):
9
+ @_deprecate_positional_args(version='1.18.0',
10
+ deprecated_args={'atol'})
11
+ def nnls(A, b, *, maxiter=None, atol=_NoValue):
9
12
  """
10
13
  Solve ``argmin_x || Ax - b ||_2`` for ``x>=0``.
11
14
 
@@ -22,13 +25,10 @@ def nnls(A, b, maxiter=None, *, atol=None):
22
25
  Right-hand side vector.
23
26
  maxiter: int, optional
24
27
  Maximum number of iterations, optional. Default value is ``3 * n``.
25
- atol: float
26
- Tolerance value used in the algorithm to assess closeness to zero in
27
- the projected residual ``(A.T @ (A x - b)`` entries. Increasing this
28
- value relaxes the solution constraints. A typical relaxation value can
29
- be selected as ``max(m, n) * np.linalg.norm(a, 1) * np.spacing(1.)``.
30
- This value is not set as default since the norm operation becomes
31
- expensive for large problems hence can be used only when necessary.
28
+ atol : float, optional
29
+ .. deprecated:: 1.18.0
30
+ This parameter is deprecated and will be removed in SciPy 1.18.0.
31
+ It is not used in the implementation.
32
32
 
33
33
  Returns
34
34
  -------
@@ -43,17 +43,14 @@ def nnls(A, b, maxiter=None, *, atol=None):
43
43
 
44
44
  Notes
45
45
  -----
46
- The code is based on [2]_ which is an improved version of the classical
47
- algorithm of [1]_. It utilizes an active set method and solves the KKT
48
- (Karush-Kuhn-Tucker) conditions for the non-negative least squares problem.
46
+ The code is based on the classical algorithm of [1]_. It utilizes an active
47
+ set method and solves the KKK (Karush-Kuhn-Tucker) conditions for the
48
+ non-negative least squares problem.
49
49
 
50
50
  References
51
51
  ----------
52
52
  .. [1] : Lawson C., Hanson R.J., "Solving Least Squares Problems", SIAM,
53
53
  1995, :doi:`10.1137/1.9781611971217`
54
- .. [2] : Bro, Rasmus and de Jong, Sijmen, "A Fast Non-Negativity-
55
- Constrained Least Squares Algorithm", Journal Of Chemometrics, 1997,
56
- :doi:`10.1002/(SICI)1099-128X(199709/10)11:5<393::AID-CEM483>3.0.CO;2-L`
57
54
 
58
55
  Examples
59
56
  --------
@@ -75,11 +72,13 @@ def nnls(A, b, maxiter=None, *, atol=None):
75
72
  b = np.asarray_chkfinite(b, dtype=np.float64)
76
73
 
77
74
  if len(A.shape) != 2:
78
- raise ValueError("Expected a two-dimensional array (matrix)" +
79
- f", but the shape of A is {A.shape}")
80
- if len(b.shape) != 1:
81
- raise ValueError("Expected a one-dimensional array (vector)" +
82
- f", but the shape of b is {b.shape}")
75
+ raise ValueError(f"Expected a 2D array, but the shape of A is {A.shape}")
76
+
77
+ if (b.ndim > 2) or ((b.ndim == 2) and (b.shape[1] != 1)):
78
+ raise ValueError("Expected a 1D array,(or 2D with one column), but the,"
79
+ f" shape of b is {b.shape}")
80
+ elif (b.ndim == 2) and (b.shape[1] == 1):
81
+ b = b.ravel()
83
82
 
84
83
  m, n = A.shape
85
84
 
@@ -91,7 +90,7 @@ def nnls(A, b, maxiter=None, *, atol=None):
91
90
  if not maxiter:
92
91
  maxiter = 3*n
93
92
  x, rnorm, info = _nnls(A, b, maxiter)
94
- if info == -1:
93
+ if info == 3:
95
94
  raise RuntimeError("Maximum number of iterations reached.")
96
95
 
97
96
  return x, rnorm
scipy/optimize/_nonlin.py CHANGED
@@ -15,6 +15,8 @@ from scipy.linalg import get_blas_funcs
15
15
  from scipy._lib._util import copy_if_needed
16
16
  from scipy._lib._util import getfullargspec_no_self as _getfullargspec
17
17
  from ._linesearch import scalar_search_wolfe1, scalar_search_armijo
18
+ from inspect import signature
19
+ from difflib import get_close_matches
18
20
 
19
21
 
20
22
  __all__ = [
@@ -241,8 +243,7 @@ def nonlin_solve(F, x0, jacobian='krylov', iter=None, verbose=False,
241
243
 
242
244
  # Print status
243
245
  if verbose:
244
- sys.stdout.write("%d: |F(x)| = %g; step %g\n" % (
245
- n, tol_norm(Fx), s))
246
+ sys.stdout.write(f"{n}: |F(x)| = {tol_norm(Fx):g}; step {s:g}\n")
246
247
  sys.stdout.flush()
247
248
  else:
248
249
  if raise_exception:
@@ -1492,9 +1493,39 @@ class KrylovJacobian(Jacobian):
1492
1493
  self.method_kw.setdefault('store_outer_Av', False)
1493
1494
  self.method_kw.setdefault('atol', 0)
1494
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
+
1495
1502
  for key, value in kw.items():
1496
- if not key.startswith('inner_'):
1503
+ if not key.startswith("inner_"):
1497
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
1498
1529
  self.method_kw[key[6:]] = value
1499
1530
 
1500
1531
  def _update_diff_step(self):