scipy 1.15.2__cp311-cp311-macosx_12_0_arm64.whl → 1.16.0rc1__cp311-cp311-macosx_12_0_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.
Files changed (626) hide show
  1. scipy/.dylibs/libscipy_openblas.dylib +0 -0
  2. scipy/__config__.py +7 -7
  3. scipy/__init__.py +3 -6
  4. scipy/_cyutility.cpython-311-darwin.so +0 -0
  5. scipy/_lib/_array_api.py +497 -161
  6. scipy/_lib/_array_api_compat_vendor.py +9 -0
  7. scipy/_lib/_bunch.py +4 -0
  8. scipy/_lib/_ccallback_c.cpython-311-darwin.so +0 -0
  9. scipy/_lib/_docscrape.py +1 -1
  10. scipy/_lib/_elementwise_iterative_method.py +15 -26
  11. scipy/_lib/_sparse.py +41 -0
  12. scipy/_lib/_test_ccallback.cpython-311-darwin.so +0 -0
  13. scipy/_lib/_test_deprecation_call.cpython-311-darwin.so +0 -0
  14. scipy/_lib/_test_deprecation_def.cpython-311-darwin.so +0 -0
  15. scipy/_lib/_testutils.py +6 -2
  16. scipy/_lib/_util.py +222 -125
  17. scipy/_lib/array_api_compat/__init__.py +4 -4
  18. scipy/_lib/array_api_compat/_internal.py +19 -6
  19. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  20. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  21. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  22. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  23. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  24. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  25. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  26. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  27. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  28. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  29. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  30. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  31. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  32. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  33. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  34. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  35. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  36. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  37. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  38. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  39. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  40. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  41. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  42. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  43. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  44. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  45. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  46. scipy/_lib/array_api_extra/__init__.py +26 -3
  47. scipy/_lib/array_api_extra/_delegation.py +171 -0
  48. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  49. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  50. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  51. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  52. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  53. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  54. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  58. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  59. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  60. scipy/_lib/array_api_extra/testing.py +359 -0
  61. scipy/_lib/decorator.py +2 -2
  62. scipy/_lib/doccer.py +1 -7
  63. scipy/_lib/messagestream.cpython-311-darwin.so +0 -0
  64. scipy/_lib/pyprima/__init__.py +212 -0
  65. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  66. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  67. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  68. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  69. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  70. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  71. scipy/_lib/pyprima/cobyla/update.py +289 -0
  72. scipy/_lib/pyprima/common/__init__.py +0 -0
  73. scipy/_lib/pyprima/common/_bounds.py +34 -0
  74. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  75. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  76. scipy/_lib/pyprima/common/_project.py +173 -0
  77. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  78. scipy/_lib/pyprima/common/consts.py +47 -0
  79. scipy/_lib/pyprima/common/evaluate.py +99 -0
  80. scipy/_lib/pyprima/common/history.py +38 -0
  81. scipy/_lib/pyprima/common/infos.py +30 -0
  82. scipy/_lib/pyprima/common/linalg.py +435 -0
  83. scipy/_lib/pyprima/common/message.py +290 -0
  84. scipy/_lib/pyprima/common/powalg.py +131 -0
  85. scipy/_lib/pyprima/common/preproc.py +277 -0
  86. scipy/_lib/pyprima/common/present.py +5 -0
  87. scipy/_lib/pyprima/common/ratio.py +54 -0
  88. scipy/_lib/pyprima/common/redrho.py +47 -0
  89. scipy/_lib/pyprima/common/selectx.py +296 -0
  90. scipy/_lib/tests/test__util.py +105 -121
  91. scipy/_lib/tests/test_array_api.py +169 -34
  92. scipy/_lib/tests/test_bunch.py +7 -0
  93. scipy/_lib/tests/test_ccallback.py +2 -10
  94. scipy/_lib/tests/test_public_api.py +13 -0
  95. scipy/cluster/_hierarchy.cpython-311-darwin.so +0 -0
  96. scipy/cluster/_optimal_leaf_ordering.cpython-311-darwin.so +0 -0
  97. scipy/cluster/_vq.cpython-311-darwin.so +0 -0
  98. scipy/cluster/hierarchy.py +393 -223
  99. scipy/cluster/tests/test_hierarchy.py +273 -335
  100. scipy/cluster/tests/test_vq.py +45 -61
  101. scipy/cluster/vq.py +39 -35
  102. scipy/conftest.py +263 -157
  103. scipy/constants/_constants.py +4 -1
  104. scipy/constants/tests/test_codata.py +2 -2
  105. scipy/constants/tests/test_constants.py +11 -18
  106. scipy/datasets/_download_all.py +15 -1
  107. scipy/datasets/_fetchers.py +7 -1
  108. scipy/datasets/_utils.py +1 -1
  109. scipy/differentiate/_differentiate.py +25 -25
  110. scipy/differentiate/tests/test_differentiate.py +24 -25
  111. scipy/fft/_basic.py +20 -0
  112. scipy/fft/_helper.py +3 -34
  113. scipy/fft/_pocketfft/helper.py +29 -1
  114. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  115. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  116. scipy/fft/_realtransforms.py +13 -0
  117. scipy/fft/tests/test_basic.py +27 -25
  118. scipy/fft/tests/test_fftlog.py +16 -7
  119. scipy/fft/tests/test_helper.py +18 -34
  120. scipy/fft/tests/test_real_transforms.py +8 -10
  121. scipy/fftpack/convolve.cpython-311-darwin.so +0 -0
  122. scipy/fftpack/tests/test_basic.py +2 -4
  123. scipy/fftpack/tests/test_real_transforms.py +8 -9
  124. scipy/integrate/_bvp.py +9 -3
  125. scipy/integrate/_cubature.py +3 -2
  126. scipy/integrate/_dop.cpython-311-darwin.so +0 -0
  127. scipy/integrate/_ivp/common.py +3 -3
  128. scipy/integrate/_ivp/ivp.py +9 -2
  129. scipy/integrate/_ivp/tests/test_ivp.py +19 -0
  130. scipy/integrate/_lsoda.cpython-311-darwin.so +0 -0
  131. scipy/integrate/_ode.py +9 -2
  132. scipy/integrate/_odepack.cpython-311-darwin.so +0 -0
  133. scipy/integrate/_quad_vec.py +21 -29
  134. scipy/integrate/_quadpack.cpython-311-darwin.so +0 -0
  135. scipy/integrate/_quadpack_py.py +11 -7
  136. scipy/integrate/_quadrature.py +3 -3
  137. scipy/integrate/_rules/_base.py +2 -2
  138. scipy/integrate/_tanhsinh.py +57 -54
  139. scipy/integrate/_test_odeint_banded.cpython-311-darwin.so +0 -0
  140. scipy/integrate/_vode.cpython-311-darwin.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 +61 -43
  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-311-darwin.so +0 -0
  151. scipy/interpolate/_dierckx.cpython-311-darwin.so +0 -0
  152. scipy/interpolate/_fitpack2.py +9 -6
  153. scipy/interpolate/_fitpack_impl.py +32 -26
  154. scipy/interpolate/_fitpack_repro.py +23 -19
  155. scipy/interpolate/_interpnd.cpython-311-darwin.so +0 -0
  156. scipy/interpolate/_interpolate.py +30 -12
  157. scipy/interpolate/_ndbspline.py +13 -18
  158. scipy/interpolate/_ndgriddata.py +5 -8
  159. scipy/interpolate/_polyint.py +95 -31
  160. scipy/interpolate/_ppoly.cpython-311-darwin.so +0 -0
  161. scipy/interpolate/_rbf.py +2 -2
  162. scipy/interpolate/_rbfinterp.py +1 -1
  163. scipy/interpolate/_rgi.py +31 -26
  164. scipy/interpolate/_rgi_cython.cpython-311-darwin.so +0 -0
  165. scipy/interpolate/dfitpack.py +0 -20
  166. scipy/interpolate/interpnd.py +1 -2
  167. scipy/interpolate/tests/test_bary_rational.py +2 -2
  168. scipy/interpolate/tests/test_bsplines.py +97 -1
  169. scipy/interpolate/tests/test_fitpack2.py +39 -1
  170. scipy/interpolate/tests/test_interpnd.py +32 -20
  171. scipy/interpolate/tests/test_interpolate.py +48 -4
  172. scipy/interpolate/tests/test_rgi.py +2 -1
  173. scipy/io/_fast_matrix_market/__init__.py +2 -0
  174. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  175. scipy/io/_harwell_boeing/hb.py +7 -11
  176. scipy/io/_idl.py +5 -7
  177. scipy/io/_netcdf.py +15 -5
  178. scipy/io/_test_fortran.cpython-311-darwin.so +0 -0
  179. scipy/io/arff/tests/test_arffread.py +3 -3
  180. scipy/io/matlab/__init__.py +5 -3
  181. scipy/io/matlab/_mio.py +4 -1
  182. scipy/io/matlab/_mio5.py +19 -13
  183. scipy/io/matlab/_mio5_utils.cpython-311-darwin.so +0 -0
  184. scipy/io/matlab/_mio_utils.cpython-311-darwin.so +0 -0
  185. scipy/io/matlab/_miobase.py +4 -1
  186. scipy/io/matlab/_streams.cpython-311-darwin.so +0 -0
  187. scipy/io/matlab/tests/test_mio.py +46 -18
  188. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  189. scipy/io/tests/test_mmio.py +7 -1
  190. scipy/io/tests/test_wavfile.py +41 -0
  191. scipy/io/wavfile.py +57 -10
  192. scipy/linalg/_basic.py +113 -86
  193. scipy/linalg/_cythonized_array_utils.cpython-311-darwin.so +0 -0
  194. scipy/linalg/_decomp.py +22 -9
  195. scipy/linalg/_decomp_cholesky.py +28 -13
  196. scipy/linalg/_decomp_cossin.py +45 -30
  197. scipy/linalg/_decomp_interpolative.cpython-311-darwin.so +0 -0
  198. scipy/linalg/_decomp_ldl.py +4 -1
  199. scipy/linalg/_decomp_lu.py +18 -6
  200. scipy/linalg/_decomp_lu_cython.cpython-311-darwin.so +0 -0
  201. scipy/linalg/_decomp_polar.py +2 -0
  202. scipy/linalg/_decomp_qr.py +6 -2
  203. scipy/linalg/_decomp_qz.py +3 -0
  204. scipy/linalg/_decomp_schur.py +3 -1
  205. scipy/linalg/_decomp_svd.py +13 -2
  206. scipy/linalg/_decomp_update.cpython-311-darwin.so +0 -0
  207. scipy/linalg/_expm_frechet.py +4 -0
  208. scipy/linalg/_fblas.cpython-311-darwin.so +0 -0
  209. scipy/linalg/_flapack.cpython-311-darwin.so +0 -0
  210. scipy/linalg/_matfuncs.py +187 -4
  211. scipy/linalg/_matfuncs_expm.cpython-311-darwin.so +0 -0
  212. scipy/linalg/_matfuncs_schur_sqrtm.cpython-311-darwin.so +0 -0
  213. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  214. scipy/linalg/_matfuncs_sqrtm_triu.cpython-311-darwin.so +0 -0
  215. scipy/linalg/_procrustes.py +2 -0
  216. scipy/linalg/_sketches.py +17 -6
  217. scipy/linalg/_solve_toeplitz.cpython-311-darwin.so +0 -0
  218. scipy/linalg/_solvers.py +7 -2
  219. scipy/linalg/_special_matrices.py +26 -36
  220. scipy/linalg/cython_blas.cpython-311-darwin.so +0 -0
  221. scipy/linalg/cython_lapack.cpython-311-darwin.so +0 -0
  222. scipy/linalg/lapack.py +22 -2
  223. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  224. scipy/linalg/tests/test_basic.py +31 -16
  225. scipy/linalg/tests/test_batch.py +588 -0
  226. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  227. scipy/linalg/tests/test_decomp.py +40 -3
  228. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  229. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  230. scipy/linalg/tests/test_interpolative.py +17 -0
  231. scipy/linalg/tests/test_lapack.py +115 -7
  232. scipy/linalg/tests/test_matfuncs.py +157 -102
  233. scipy/linalg/tests/test_procrustes.py +0 -7
  234. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  235. scipy/linalg/tests/test_special_matrices.py +1 -5
  236. scipy/ndimage/__init__.py +1 -0
  237. scipy/ndimage/_cytest.cpython-311-darwin.so +0 -0
  238. scipy/ndimage/_delegators.py +8 -2
  239. scipy/ndimage/_filters.py +433 -5
  240. scipy/ndimage/_interpolation.py +36 -6
  241. scipy/ndimage/_measurements.py +4 -2
  242. scipy/ndimage/_morphology.py +5 -0
  243. scipy/ndimage/_nd_image.cpython-311-darwin.so +0 -0
  244. scipy/ndimage/_ndimage_api.py +2 -1
  245. scipy/ndimage/_ni_docstrings.py +5 -1
  246. scipy/ndimage/_ni_label.cpython-311-darwin.so +0 -0
  247. scipy/ndimage/_ni_support.py +1 -5
  248. scipy/ndimage/_rank_filter_1d.cpython-311-darwin.so +0 -0
  249. scipy/ndimage/_support_alternative_backends.py +18 -6
  250. scipy/ndimage/tests/test_filters.py +351 -259
  251. scipy/ndimage/tests/test_fourier.py +7 -9
  252. scipy/ndimage/tests/test_interpolation.py +68 -61
  253. scipy/ndimage/tests/test_measurements.py +18 -35
  254. scipy/ndimage/tests/test_morphology.py +143 -131
  255. scipy/ndimage/tests/test_splines.py +1 -3
  256. scipy/odr/__odrpack.cpython-311-darwin.so +0 -0
  257. scipy/optimize/_basinhopping.py +13 -7
  258. scipy/optimize/_bglu_dense.cpython-311-darwin.so +0 -0
  259. scipy/optimize/_bracket.py +46 -26
  260. scipy/optimize/_chandrupatla.py +9 -10
  261. scipy/optimize/_cobyla_py.py +104 -123
  262. scipy/optimize/_constraints.py +14 -10
  263. scipy/optimize/_differentiable_functions.py +371 -230
  264. scipy/optimize/_differentialevolution.py +4 -3
  265. scipy/optimize/_dual_annealing.py +1 -1
  266. scipy/optimize/_elementwise.py +1 -4
  267. scipy/optimize/_highspy/_highs_wrapper.py +6 -4
  268. scipy/optimize/_lbfgsb.cpython-311-darwin.so +0 -0
  269. scipy/optimize/_lbfgsb_py.py +57 -16
  270. scipy/optimize/_linprog_doc.py +2 -2
  271. scipy/optimize/_linprog_highs.py +11 -11
  272. scipy/optimize/_linprog_ip.py +25 -10
  273. scipy/optimize/_linprog_util.py +18 -19
  274. scipy/optimize/_lsq/common.py +3 -3
  275. scipy/optimize/_lsq/dogbox.py +16 -2
  276. scipy/optimize/_lsq/givens_elimination.cpython-311-darwin.so +0 -0
  277. scipy/optimize/_lsq/least_squares.py +198 -126
  278. scipy/optimize/_lsq/lsq_linear.py +6 -6
  279. scipy/optimize/_lsq/trf.py +35 -8
  280. scipy/optimize/_milp.py +3 -1
  281. scipy/optimize/_minimize.py +105 -36
  282. scipy/optimize/_minpack.cpython-311-darwin.so +0 -0
  283. scipy/optimize/_minpack_py.py +21 -14
  284. scipy/optimize/_moduleTNC.cpython-311-darwin.so +0 -0
  285. scipy/optimize/_nnls.py +20 -21
  286. scipy/optimize/_nonlin.py +34 -3
  287. scipy/optimize/_numdiff.py +288 -110
  288. scipy/optimize/_optimize.py +86 -48
  289. scipy/optimize/_remove_redundancy.py +5 -5
  290. scipy/optimize/_root_scalar.py +1 -1
  291. scipy/optimize/_shgo.py +6 -0
  292. scipy/optimize/_shgo_lib/_complex.py +1 -1
  293. scipy/optimize/_slsqp_py.py +216 -124
  294. scipy/optimize/_slsqplib.cpython-311-darwin.so +0 -0
  295. scipy/optimize/_spectral.py +1 -1
  296. scipy/optimize/_tnc.py +8 -1
  297. scipy/optimize/_trlib/_trlib.cpython-311-darwin.so +0 -0
  298. scipy/optimize/_trustregion.py +20 -6
  299. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  300. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  301. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  302. scipy/optimize/_trustregion_constr/projections.py +12 -8
  303. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  304. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  305. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  306. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  307. scipy/optimize/_trustregion_exact.py +0 -1
  308. scipy/optimize/_zeros.cpython-311-darwin.so +0 -0
  309. scipy/optimize/_zeros_py.py +97 -17
  310. scipy/optimize/cython_optimize/_zeros.cpython-311-darwin.so +0 -0
  311. scipy/optimize/slsqp.py +0 -1
  312. scipy/optimize/tests/test__basinhopping.py +1 -1
  313. scipy/optimize/tests/test__differential_evolution.py +4 -4
  314. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  315. scipy/optimize/tests/test__numdiff.py +66 -22
  316. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  317. scipy/optimize/tests/test__shgo.py +9 -1
  318. scipy/optimize/tests/test_bracket.py +71 -46
  319. scipy/optimize/tests/test_chandrupatla.py +133 -135
  320. scipy/optimize/tests/test_cobyla.py +74 -45
  321. scipy/optimize/tests/test_constraints.py +1 -1
  322. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  323. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  324. scipy/optimize/tests/test_least_squares.py +125 -13
  325. scipy/optimize/tests/test_linear_assignment.py +3 -3
  326. scipy/optimize/tests/test_linprog.py +3 -3
  327. scipy/optimize/tests/test_lsq_linear.py +5 -5
  328. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  329. scipy/optimize/tests/test_minpack.py +4 -4
  330. scipy/optimize/tests/test_nnls.py +43 -3
  331. scipy/optimize/tests/test_nonlin.py +36 -0
  332. scipy/optimize/tests/test_optimize.py +95 -17
  333. scipy/optimize/tests/test_slsqp.py +36 -4
  334. scipy/optimize/tests/test_zeros.py +34 -1
  335. scipy/signal/__init__.py +12 -23
  336. scipy/signal/_delegators.py +568 -0
  337. scipy/signal/_filter_design.py +459 -241
  338. scipy/signal/_fir_filter_design.py +262 -90
  339. scipy/signal/_lti_conversion.py +3 -2
  340. scipy/signal/_ltisys.py +118 -91
  341. scipy/signal/_peak_finding_utils.cpython-311-darwin.so +0 -0
  342. scipy/signal/_polyutils.py +172 -0
  343. scipy/signal/_short_time_fft.py +553 -76
  344. scipy/signal/_signal_api.py +30 -0
  345. scipy/signal/_signaltools.py +719 -396
  346. scipy/signal/_sigtools.cpython-311-darwin.so +0 -0
  347. scipy/signal/_sosfilt.cpython-311-darwin.so +0 -0
  348. scipy/signal/_spectral_py.py +221 -50
  349. scipy/signal/_spline_filters.py +108 -68
  350. scipy/signal/_support_alternative_backends.py +73 -0
  351. scipy/signal/_upfirdn.py +4 -1
  352. scipy/signal/_upfirdn_apply.cpython-311-darwin.so +0 -0
  353. scipy/signal/_waveforms.py +2 -11
  354. scipy/signal/_wavelets.py +1 -1
  355. scipy/signal/fir_filter_design.py +1 -0
  356. scipy/signal/spline.py +4 -11
  357. scipy/signal/tests/_scipy_spectral_test_shim.py +5 -182
  358. scipy/signal/tests/test_bsplines.py +114 -79
  359. scipy/signal/tests/test_cont2discrete.py +9 -2
  360. scipy/signal/tests/test_filter_design.py +721 -481
  361. scipy/signal/tests/test_fir_filter_design.py +332 -140
  362. scipy/signal/tests/test_savitzky_golay.py +4 -3
  363. scipy/signal/tests/test_short_time_fft.py +231 -5
  364. scipy/signal/tests/test_signaltools.py +2149 -1348
  365. scipy/signal/tests/test_spectral.py +19 -6
  366. scipy/signal/tests/test_splines.py +161 -96
  367. scipy/signal/tests/test_upfirdn.py +84 -50
  368. scipy/signal/tests/test_waveforms.py +20 -0
  369. scipy/signal/tests/test_windows.py +607 -466
  370. scipy/signal/windows/_windows.py +287 -148
  371. scipy/sparse/__init__.py +23 -4
  372. scipy/sparse/_base.py +269 -120
  373. scipy/sparse/_bsr.py +7 -4
  374. scipy/sparse/_compressed.py +59 -234
  375. scipy/sparse/_construct.py +90 -38
  376. scipy/sparse/_coo.py +115 -181
  377. scipy/sparse/_csc.py +4 -4
  378. scipy/sparse/_csparsetools.cpython-311-darwin.so +0 -0
  379. scipy/sparse/_csr.py +2 -2
  380. scipy/sparse/_data.py +48 -48
  381. scipy/sparse/_dia.py +105 -21
  382. scipy/sparse/_dok.py +0 -23
  383. scipy/sparse/_index.py +4 -4
  384. scipy/sparse/_matrix.py +23 -0
  385. scipy/sparse/_sparsetools.cpython-311-darwin.so +0 -0
  386. scipy/sparse/_sputils.py +37 -22
  387. scipy/sparse/base.py +0 -9
  388. scipy/sparse/bsr.py +0 -14
  389. scipy/sparse/compressed.py +0 -23
  390. scipy/sparse/construct.py +0 -6
  391. scipy/sparse/coo.py +0 -14
  392. scipy/sparse/csc.py +0 -3
  393. scipy/sparse/csgraph/_flow.cpython-311-darwin.so +0 -0
  394. scipy/sparse/csgraph/_matching.cpython-311-darwin.so +0 -0
  395. scipy/sparse/csgraph/_min_spanning_tree.cpython-311-darwin.so +0 -0
  396. scipy/sparse/csgraph/_reordering.cpython-311-darwin.so +0 -0
  397. scipy/sparse/csgraph/_shortest_path.cpython-311-darwin.so +0 -0
  398. scipy/sparse/csgraph/_tools.cpython-311-darwin.so +0 -0
  399. scipy/sparse/csgraph/_traversal.cpython-311-darwin.so +0 -0
  400. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  401. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  402. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  403. scipy/sparse/csr.py +0 -5
  404. scipy/sparse/data.py +1 -6
  405. scipy/sparse/dia.py +0 -7
  406. scipy/sparse/dok.py +0 -10
  407. scipy/sparse/linalg/_dsolve/_superlu.cpython-311-darwin.so +0 -0
  408. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  409. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  410. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-311-darwin.so +0 -0
  411. scipy/sparse/linalg/_eigen/arpack/arpack.py +28 -20
  412. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  413. scipy/sparse/linalg/_expm_multiply.py +8 -3
  414. scipy/sparse/linalg/_interface.py +29 -26
  415. scipy/sparse/linalg/_isolve/_gcrotmk.py +6 -5
  416. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  417. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  418. scipy/sparse/linalg/_isolve/minres.py +5 -5
  419. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  420. scipy/sparse/linalg/_isolve/utils.py +2 -8
  421. scipy/sparse/linalg/_matfuncs.py +1 -1
  422. scipy/sparse/linalg/_norm.py +1 -1
  423. scipy/sparse/linalg/_propack/_cpropack.cpython-311-darwin.so +0 -0
  424. scipy/sparse/linalg/_propack/_dpropack.cpython-311-darwin.so +0 -0
  425. scipy/sparse/linalg/_propack/_spropack.cpython-311-darwin.so +0 -0
  426. scipy/sparse/linalg/_propack/_zpropack.cpython-311-darwin.so +0 -0
  427. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  428. scipy/sparse/linalg/tests/test_expm_multiply.py +10 -0
  429. scipy/sparse/linalg/tests/test_interface.py +35 -0
  430. scipy/sparse/linalg/tests/test_pydata_sparse.py +18 -0
  431. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  432. scipy/sparse/tests/test_base.py +217 -40
  433. scipy/sparse/tests/test_common1d.py +17 -12
  434. scipy/sparse/tests/test_construct.py +1 -1
  435. scipy/sparse/tests/test_coo.py +272 -4
  436. scipy/sparse/tests/test_sparsetools.py +5 -0
  437. scipy/sparse/tests/test_sputils.py +36 -7
  438. scipy/spatial/_ckdtree.cpython-311-darwin.so +0 -0
  439. scipy/spatial/_hausdorff.cpython-311-darwin.so +0 -0
  440. scipy/spatial/_qhull.cpython-311-darwin.so +0 -0
  441. scipy/spatial/_voronoi.cpython-311-darwin.so +0 -0
  442. scipy/spatial/distance.py +49 -42
  443. scipy/spatial/tests/test_distance.py +3 -1
  444. scipy/spatial/tests/test_kdtree.py +1 -0
  445. scipy/spatial/tests/test_qhull.py +106 -2
  446. scipy/spatial/transform/__init__.py +5 -3
  447. scipy/spatial/transform/_rigid_transform.cpython-311-darwin.so +0 -0
  448. scipy/spatial/transform/_rotation.cpython-311-darwin.so +0 -0
  449. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  450. scipy/spatial/transform/tests/test_rotation.py +1342 -790
  451. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  452. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  453. scipy/special/__init__.py +1 -47
  454. scipy/special/_add_newdocs.py +34 -772
  455. scipy/special/_basic.py +22 -25
  456. scipy/special/_comb.cpython-311-darwin.so +0 -0
  457. scipy/special/_ellip_harm_2.cpython-311-darwin.so +0 -0
  458. scipy/special/_gufuncs.cpython-311-darwin.so +0 -0
  459. scipy/special/_logsumexp.py +83 -69
  460. scipy/special/_orthogonal.pyi +1 -1
  461. scipy/special/_specfun.cpython-311-darwin.so +0 -0
  462. scipy/special/_special_ufuncs.cpython-311-darwin.so +0 -0
  463. scipy/special/_spherical_bessel.py +4 -4
  464. scipy/special/_support_alternative_backends.py +212 -119
  465. scipy/special/_test_internal.cpython-311-darwin.so +0 -0
  466. scipy/special/_testutils.py +4 -4
  467. scipy/special/_ufuncs.cpython-311-darwin.so +0 -0
  468. scipy/special/_ufuncs.pyi +1 -0
  469. scipy/special/_ufuncs.pyx +215 -1400
  470. scipy/special/_ufuncs_cxx.cpython-311-darwin.so +0 -0
  471. scipy/special/_ufuncs_cxx.pxd +2 -15
  472. scipy/special/_ufuncs_cxx.pyx +5 -44
  473. scipy/special/_ufuncs_cxx_defs.h +2 -16
  474. scipy/special/_ufuncs_defs.h +0 -8
  475. scipy/special/cython_special.cpython-311-darwin.so +0 -0
  476. scipy/special/cython_special.pxd +1 -1
  477. scipy/special/tests/_cython_examples/meson.build +10 -1
  478. scipy/special/tests/test_basic.py +153 -20
  479. scipy/special/tests/test_boost_ufuncs.py +3 -0
  480. scipy/special/tests/test_cdflib.py +35 -11
  481. scipy/special/tests/test_gammainc.py +16 -0
  482. scipy/special/tests/test_hyp2f1.py +23 -2
  483. scipy/special/tests/test_log1mexp.py +85 -0
  484. scipy/special/tests/test_logsumexp.py +220 -64
  485. scipy/special/tests/test_mpmath.py +1 -0
  486. scipy/special/tests/test_nan_inputs.py +1 -1
  487. scipy/special/tests/test_orthogonal.py +17 -18
  488. scipy/special/tests/test_sf_error.py +3 -2
  489. scipy/special/tests/test_sph_harm.py +6 -7
  490. scipy/special/tests/test_support_alternative_backends.py +211 -76
  491. scipy/stats/__init__.py +4 -1
  492. scipy/stats/_ansari_swilk_statistics.cpython-311-darwin.so +0 -0
  493. scipy/stats/_axis_nan_policy.py +4 -3
  494. scipy/stats/_biasedurn.cpython-311-darwin.so +0 -0
  495. scipy/stats/_continued_fraction.py +387 -0
  496. scipy/stats/_continuous_distns.py +296 -319
  497. scipy/stats/_covariance.py +6 -3
  498. scipy/stats/_discrete_distns.py +39 -32
  499. scipy/stats/_distn_infrastructure.py +39 -12
  500. scipy/stats/_distribution_infrastructure.py +900 -238
  501. scipy/stats/_entropy.py +7 -8
  502. scipy/{_lib → stats}/_finite_differences.py +1 -1
  503. scipy/stats/_hypotests.py +82 -49
  504. scipy/stats/_kde.py +53 -49
  505. scipy/stats/_ksstats.py +1 -1
  506. scipy/stats/_levy_stable/__init__.py +7 -15
  507. scipy/stats/_levy_stable/levyst.cpython-311-darwin.so +0 -0
  508. scipy/stats/_morestats.py +112 -67
  509. scipy/stats/_mstats_basic.py +13 -17
  510. scipy/stats/_mstats_extras.py +8 -8
  511. scipy/stats/_multivariate.py +89 -113
  512. scipy/stats/_new_distributions.py +97 -20
  513. scipy/stats/_page_trend_test.py +12 -5
  514. scipy/stats/_probability_distribution.py +265 -43
  515. scipy/stats/_qmc.py +14 -9
  516. scipy/stats/_qmc_cy.cpython-311-darwin.so +0 -0
  517. scipy/stats/_qmvnt.py +16 -95
  518. scipy/stats/_qmvnt_cy.cpython-311-darwin.so +0 -0
  519. scipy/stats/_quantile.py +335 -0
  520. scipy/stats/_rcont/rcont.cpython-311-darwin.so +0 -0
  521. scipy/stats/_resampling.py +4 -29
  522. scipy/stats/_sampling.py +1 -1
  523. scipy/stats/_sobol.cpython-311-darwin.so +0 -0
  524. scipy/stats/_stats.cpython-311-darwin.so +0 -0
  525. scipy/stats/_stats_mstats_common.py +19 -2
  526. scipy/stats/_stats_py.py +534 -460
  527. scipy/stats/_unuran/unuran_wrapper.cpython-311-darwin.so +0 -0
  528. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  529. scipy/stats/_variation.py +5 -7
  530. scipy/stats/_wilcoxon.py +13 -7
  531. scipy/stats/tests/common_tests.py +6 -4
  532. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  533. scipy/stats/tests/test_continued_fraction.py +173 -0
  534. scipy/stats/tests/test_continuous.py +379 -60
  535. scipy/stats/tests/test_continuous_basic.py +18 -12
  536. scipy/stats/tests/test_discrete_basic.py +14 -8
  537. scipy/stats/tests/test_discrete_distns.py +16 -16
  538. scipy/stats/tests/test_distributions.py +117 -75
  539. scipy/stats/tests/test_entropy.py +40 -48
  540. scipy/stats/tests/test_fit.py +4 -3
  541. scipy/stats/tests/test_hypotests.py +153 -24
  542. scipy/stats/tests/test_kdeoth.py +109 -41
  543. scipy/stats/tests/test_marray.py +289 -0
  544. scipy/stats/tests/test_morestats.py +79 -47
  545. scipy/stats/tests/test_mstats_basic.py +3 -3
  546. scipy/stats/tests/test_multivariate.py +434 -83
  547. scipy/stats/tests/test_qmc.py +13 -10
  548. scipy/stats/tests/test_quantile.py +199 -0
  549. scipy/stats/tests/test_rank.py +119 -112
  550. scipy/stats/tests/test_resampling.py +47 -56
  551. scipy/stats/tests/test_sampling.py +9 -4
  552. scipy/stats/tests/test_stats.py +799 -939
  553. scipy/stats/tests/test_variation.py +8 -6
  554. scipy/version.py +2 -2
  555. {scipy-1.15.2.dist-info → scipy-1.16.0rc1.dist-info}/LICENSE.txt +1 -1
  556. {scipy-1.15.2.dist-info → scipy-1.16.0rc1.dist-info}/METADATA +9 -9
  557. {scipy-1.15.2.dist-info → scipy-1.16.0rc1.dist-info}/RECORD +558 -565
  558. scipy-1.16.0rc1.dist-info/WHEEL +6 -0
  559. scipy/_lib/array_api_extra/_funcs.py +0 -484
  560. scipy/_lib/array_api_extra/_typing.py +0 -8
  561. scipy/interpolate/_bspl.cpython-311-darwin.so +0 -0
  562. scipy/optimize/_cobyla.cpython-311-darwin.so +0 -0
  563. scipy/optimize/_cython_nnls.cpython-311-darwin.so +0 -0
  564. scipy/optimize/_slsqp.cpython-311-darwin.so +0 -0
  565. scipy/spatial/qhull_src/COPYING.txt +0 -38
  566. scipy/special/libsf_error_state.dylib +0 -0
  567. scipy/special/tests/test_log_softmax.py +0 -109
  568. scipy/special/tests/test_xsf_cuda.py +0 -114
  569. scipy/special/xsf/binom.h +0 -89
  570. scipy/special/xsf/cdflib.h +0 -100
  571. scipy/special/xsf/cephes/airy.h +0 -307
  572. scipy/special/xsf/cephes/besselpoly.h +0 -51
  573. scipy/special/xsf/cephes/beta.h +0 -257
  574. scipy/special/xsf/cephes/cbrt.h +0 -131
  575. scipy/special/xsf/cephes/chbevl.h +0 -85
  576. scipy/special/xsf/cephes/chdtr.h +0 -193
  577. scipy/special/xsf/cephes/const.h +0 -87
  578. scipy/special/xsf/cephes/ellie.h +0 -293
  579. scipy/special/xsf/cephes/ellik.h +0 -251
  580. scipy/special/xsf/cephes/ellpe.h +0 -107
  581. scipy/special/xsf/cephes/ellpk.h +0 -117
  582. scipy/special/xsf/cephes/expn.h +0 -260
  583. scipy/special/xsf/cephes/gamma.h +0 -398
  584. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  585. scipy/special/xsf/cephes/hyperg.h +0 -361
  586. scipy/special/xsf/cephes/i0.h +0 -149
  587. scipy/special/xsf/cephes/i1.h +0 -158
  588. scipy/special/xsf/cephes/igam.h +0 -421
  589. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  590. scipy/special/xsf/cephes/igami.h +0 -313
  591. scipy/special/xsf/cephes/j0.h +0 -225
  592. scipy/special/xsf/cephes/j1.h +0 -198
  593. scipy/special/xsf/cephes/jv.h +0 -715
  594. scipy/special/xsf/cephes/k0.h +0 -164
  595. scipy/special/xsf/cephes/k1.h +0 -163
  596. scipy/special/xsf/cephes/kn.h +0 -243
  597. scipy/special/xsf/cephes/lanczos.h +0 -112
  598. scipy/special/xsf/cephes/ndtr.h +0 -275
  599. scipy/special/xsf/cephes/poch.h +0 -85
  600. scipy/special/xsf/cephes/polevl.h +0 -167
  601. scipy/special/xsf/cephes/psi.h +0 -194
  602. scipy/special/xsf/cephes/rgamma.h +0 -111
  603. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  604. scipy/special/xsf/cephes/shichi.h +0 -248
  605. scipy/special/xsf/cephes/sici.h +0 -224
  606. scipy/special/xsf/cephes/sindg.h +0 -221
  607. scipy/special/xsf/cephes/tandg.h +0 -139
  608. scipy/special/xsf/cephes/trig.h +0 -58
  609. scipy/special/xsf/cephes/unity.h +0 -186
  610. scipy/special/xsf/cephes/zeta.h +0 -172
  611. scipy/special/xsf/config.h +0 -304
  612. scipy/special/xsf/digamma.h +0 -205
  613. scipy/special/xsf/error.h +0 -57
  614. scipy/special/xsf/evalpoly.h +0 -47
  615. scipy/special/xsf/expint.h +0 -266
  616. scipy/special/xsf/hyp2f1.h +0 -694
  617. scipy/special/xsf/iv_ratio.h +0 -173
  618. scipy/special/xsf/lambertw.h +0 -150
  619. scipy/special/xsf/loggamma.h +0 -163
  620. scipy/special/xsf/sici.h +0 -200
  621. scipy/special/xsf/tools.h +0 -427
  622. scipy/special/xsf/trig.h +0 -164
  623. scipy/special/xsf/wright_bessel.h +0 -843
  624. scipy/special/xsf/zlog1.h +0 -35
  625. scipy/stats/_mvn.cpython-311-darwin.so +0 -0
  626. scipy-1.15.2.dist-info/WHEEL +0 -4
@@ -1,4 +1,5 @@
1
1
  from itertools import product
2
+ from multiprocessing import Pool
2
3
 
3
4
  import numpy as np
4
5
  from numpy.linalg import norm
@@ -6,13 +7,14 @@ from numpy.testing import (assert_, assert_allclose,
6
7
  assert_equal, suppress_warnings)
7
8
  import pytest
8
9
  from pytest import raises as assert_raises
9
- from scipy.sparse import issparse, lil_matrix
10
+ from scipy.sparse import issparse, lil_array
10
11
  from scipy.sparse.linalg import aslinearoperator
11
12
 
12
13
  from scipy.optimize import least_squares, Bounds
13
14
  from scipy.optimize._lsq.least_squares import IMPLEMENTED_LOSSES
14
15
  from scipy.optimize._lsq.common import EPS, make_strictly_feasible, CL_scaling_vector
15
16
 
17
+ from scipy.optimize import OptimizeResult
16
18
 
17
19
  def fun_trivial(x, a=0):
18
20
  return (x - a)**2 + 5.0
@@ -34,6 +36,15 @@ def fun_rosenbrock(x):
34
36
  return np.array([10 * (x[1] - x[0]**2), (1 - x[0])])
35
37
 
36
38
 
39
+ class Fun_Rosenbrock:
40
+ def __init__(self):
41
+ self.nfev = 0
42
+
43
+ def __call__(self, x, a=0):
44
+ self.nfev += 1
45
+ return fun_rosenbrock(x)
46
+
47
+
37
48
  def jac_rosenbrock(x):
38
49
  return np.array([
39
50
  [-20 * x[0], 10],
@@ -92,7 +103,7 @@ class BroydenTridiagonal:
92
103
  self.x0 = make_strictly_feasible(self.x0, self.lb, self.ub)
93
104
 
94
105
  if mode == 'sparse':
95
- self.sparsity = lil_matrix((n, n), dtype=int)
106
+ self.sparsity = lil_array((n, n), dtype=int)
96
107
  i = np.arange(n)
97
108
  self.sparsity[i, i] = 1
98
109
  i = np.arange(1, n)
@@ -116,7 +127,7 @@ class BroydenTridiagonal:
116
127
  return f
117
128
 
118
129
  def _jac(self, x):
119
- J = lil_matrix((self.n, self.n))
130
+ J = lil_array((self.n, self.n))
120
131
  i = np.arange(self.n)
121
132
  J[i, i] = 3 - 2 * x
122
133
  i = np.arange(1, self.n)
@@ -227,25 +238,17 @@ class BaseMixin:
227
238
  2.0, x_scale='auto', method=self.method)
228
239
  assert_raises(ValueError, least_squares, fun_trivial,
229
240
  2.0, x_scale=-1.0, method=self.method)
230
- assert_raises(ValueError, least_squares, fun_trivial,
231
- 2.0, x_scale=None, method=self.method)
232
241
  assert_raises(ValueError, least_squares, fun_trivial,
233
242
  2.0, x_scale=1.0+2.0j, method=self.method)
234
243
 
235
244
  def test_diff_step(self):
236
- # res1 and res2 should be equivalent.
237
- # res2 and res3 should be different.
238
245
  res1 = least_squares(fun_trivial, 2.0, diff_step=1e-1,
239
246
  method=self.method)
240
- res2 = least_squares(fun_trivial, 2.0, diff_step=-1e-1,
241
- method=self.method)
242
247
  res3 = least_squares(fun_trivial, 2.0,
243
248
  diff_step=None, method=self.method)
244
249
  assert_allclose(res1.x, 0, atol=1e-4)
245
- assert_allclose(res2.x, 0, atol=1e-4)
246
250
  assert_allclose(res3.x, 0, atol=1e-4)
247
- assert_equal(res1.x, res2.x)
248
- assert_equal(res1.nfev, res2.nfev)
251
+
249
252
 
250
253
  def test_incorrect_options_usage(self):
251
254
  assert_raises(TypeError, least_squares, fun_trivial, 2.0,
@@ -265,7 +268,6 @@ class BaseMixin:
265
268
  assert_allclose(res.optimality, 0, atol=1e-2)
266
269
  assert_equal(res.active_mask, 0)
267
270
  if self.method == 'lm':
268
- assert_(res.nfev < 30)
269
271
  assert_(res.njev is None)
270
272
  else:
271
273
  assert_(res.nfev < 10)
@@ -293,6 +295,17 @@ class BaseMixin:
293
295
  assert_equal(res.status, 0)
294
296
  assert_equal(res.success, 0)
295
297
 
298
+ def test_nfev(self):
299
+ # checks that the true number of nfev are being consumed
300
+ for i in range(1, 3):
301
+ rng = np.random.default_rng(128908)
302
+ x0 = rng.uniform(size=2) * 10
303
+ ftrivial = Fun_Rosenbrock()
304
+ res = least_squares(
305
+ ftrivial, x0, jac=jac_rosenbrock, method=self.method, max_nfev=i
306
+ )
307
+ assert res.nfev == ftrivial.nfev
308
+
296
309
  def test_rosenbrock(self):
297
310
  x0 = [-2, 1]
298
311
  x_opt = [1, 1]
@@ -387,6 +400,27 @@ class BaseMixin:
387
400
  method=self.method)
388
401
  assert_allclose(res.x, x_opt)
389
402
 
403
+ @pytest.mark.fail_slow(5.0)
404
+ def test_workers(self):
405
+ serial = least_squares(fun_trivial, 2.0, method=self.method)
406
+
407
+ reses = []
408
+ for workers in [None, 2]:
409
+ res = least_squares(
410
+ fun_trivial, 2.0, method=self.method, workers=workers
411
+ )
412
+ reses.append(res)
413
+ with Pool() as workers:
414
+ res = least_squares(
415
+ fun_trivial, 2.0, method=self.method, workers=workers.map
416
+ )
417
+ reses.append(res)
418
+ for res in reses:
419
+ assert res.success
420
+ assert_equal(res.x, serial.x)
421
+ assert_equal(res.nfev, serial.nfev)
422
+ assert_equal(res.njev, serial.njev)
423
+
390
424
 
391
425
  class BoundsMixin:
392
426
  def test_inconsistent(self):
@@ -779,6 +813,17 @@ class TestLM(BaseMixin):
779
813
 
780
814
  assert_raises(ValueError, least_squares, fun_trivial, 2.0,
781
815
  method='lm', loss='huber')
816
+
817
+ def test_callback_with_lm_method(self):
818
+ def callback(x):
819
+ assert(False) # Dummy callback function
820
+
821
+ with suppress_warnings() as sup:
822
+ sup.filter(
823
+ UserWarning,
824
+ "Callback function specified, but not supported with `lm` method."
825
+ )
826
+ least_squares(fun_trivial, x0=[0], method='lm', callback=callback)
782
827
 
783
828
 
784
829
  def test_basic():
@@ -787,6 +832,73 @@ def test_basic():
787
832
  assert_allclose(res.x, 0, atol=1e-10)
788
833
 
789
834
 
835
+ def test_callback():
836
+ # test that callback function works as expected
837
+
838
+ results = []
839
+
840
+ def my_callback_optimresult(intermediate_result: OptimizeResult):
841
+ results.append(intermediate_result)
842
+
843
+ def my_callback_x(x):
844
+ r = OptimizeResult()
845
+ r.nit = 1
846
+ r.x = x
847
+ results.append(r)
848
+ return False
849
+
850
+ def my_callback_optimresult_stop_exception(
851
+ intermediate_result: OptimizeResult):
852
+ results.append(intermediate_result)
853
+ raise StopIteration
854
+
855
+ def my_callback_x_stop_exception(x):
856
+ r = OptimizeResult()
857
+ r.nit = 1
858
+ r.x = x
859
+ results.append(r)
860
+ raise StopIteration
861
+
862
+ # Try for different function signatures and stop methods
863
+ callbacks_nostop = [my_callback_optimresult, my_callback_x]
864
+ callbacks_stop = [my_callback_optimresult_stop_exception,
865
+ my_callback_x_stop_exception]
866
+
867
+ # Try for all the implemented methods: trf, trf_bounds and dogbox
868
+ calls = [
869
+ lambda callback: least_squares(fun_trivial, 5.0, method='trf',
870
+ callback=callback),
871
+ lambda callback: least_squares(fun_trivial, 5.0, method='trf',
872
+ bounds=(-8.0, 8.0), callback=callback),
873
+ lambda callback: least_squares(fun_trivial, 5.0, method='dogbox',
874
+ callback=callback)
875
+ ]
876
+
877
+ for mycallback, call in product(callbacks_nostop, calls):
878
+ results.clear()
879
+ # Call the different implemented methods
880
+ res = call(mycallback)
881
+ # Check that callback was called
882
+ assert len(results) > 0
883
+ # Check that results data makes sense
884
+ assert results[-1].nit > 0
885
+ # Check that it didn't stop because of the callback
886
+ assert res.status != -2
887
+ # final callback x should be same as final result
888
+ assert_allclose(results[-1].x, res.x)
889
+
890
+ for mycallback, call in product(callbacks_stop, calls):
891
+ results.clear()
892
+ # Call the different implemented methods
893
+ res = call(mycallback)
894
+ # Check that callback was called
895
+ assert len(results) > 0
896
+ # Check that only one iteration was run
897
+ assert results[-1].nit == 1
898
+ # Check that it stopped because of the callback
899
+ assert res.status == -2
900
+
901
+
790
902
  def test_small_tolerances_for_lm():
791
903
  for ftol, xtol, gtol in [(None, 1e-13, 1e-13),
792
904
  (1e-13, None, 1e-13),
@@ -7,7 +7,7 @@ import pytest
7
7
  import numpy as np
8
8
 
9
9
  from scipy.optimize import linear_sum_assignment
10
- from scipy.sparse import random
10
+ from scipy.sparse import random_array
11
11
  from scipy.sparse._sputils import matrix
12
12
  from scipy.sparse.csgraph import min_weight_full_bipartite_matching
13
13
  from scipy.sparse.csgraph.tests.test_matching import (
@@ -93,8 +93,8 @@ def test_two_methods_give_same_result_on_many_sparse_inputs():
93
93
  for _ in range(100):
94
94
  lsa_raises = False
95
95
  mwfbm_raises = False
96
- sparse = random(100, 100, density=0.06,
97
- data_rvs=lambda size: np.random.randint(1, 100, size))
96
+ sparse = random_array((100, 100), density=0.06,
97
+ data_sampler=lambda size: np.random.randint(1, 100, size))
98
98
  # In csgraph, zeros correspond to missing edges, so we explicitly
99
99
  # replace those with infinities
100
100
  dense = np.full(sparse.shape, np.inf)
@@ -5,6 +5,7 @@ import sys
5
5
  import platform
6
6
 
7
7
  import numpy as np
8
+ from numpy.exceptions import VisibleDeprecationWarning
8
9
  from numpy.testing import (assert_, assert_allclose, assert_equal,
9
10
  assert_array_less, assert_warns, suppress_warnings)
10
11
  from pytest import raises as assert_raises
@@ -12,7 +13,6 @@ from scipy.optimize import linprog, OptimizeWarning
12
13
  from scipy.optimize._numdiff import approx_derivative
13
14
  from scipy.sparse.linalg import MatrixRankWarning
14
15
  from scipy.linalg import LinAlgWarning
15
- from scipy._lib._util import VisibleDeprecationWarning
16
16
  import scipy.sparse
17
17
  import pytest
18
18
 
@@ -220,7 +220,7 @@ def l1_regression_prob(seed=0, m=8, d=9, n=100):
220
220
  # construct the problem
221
221
  c = np.ones(m+n)
222
222
  c[:m] = 0
223
- A_ub = scipy.sparse.lil_matrix((2*n, n+m))
223
+ A_ub = scipy.sparse.lil_array((2*n, n+m))
224
224
  idx = 0
225
225
  for ii in range(n):
226
226
  A_ub[idx, :m] = phi @ x[:, ii]
@@ -519,7 +519,7 @@ class LinprogCommonTests:
519
519
  rng = np.random.RandomState(0)
520
520
  m = 100
521
521
  n = 150
522
- A_eq = scipy.sparse.rand(m, n, 0.5)
522
+ A_eq = scipy.sparse.random_array((m, n), density=0.5)
523
523
  x_valid = rng.randn(n)
524
524
  c = rng.randn(n)
525
525
  ub = x_valid + rng.rand(n)
@@ -4,7 +4,7 @@ import numpy as np
4
4
  from numpy.linalg import lstsq
5
5
  from numpy.testing import assert_allclose, assert_equal, assert_
6
6
 
7
- from scipy.sparse import rand, coo_matrix
7
+ from scipy.sparse import random_array, coo_array
8
8
  from scipy.sparse.linalg import aslinearoperator
9
9
  from scipy.optimize import lsq_linear
10
10
  from scipy.optimize._minimize import Bounds
@@ -177,7 +177,7 @@ class BaseMixin:
177
177
 
178
178
  assert_(abs(cost_bvls - cost_trf) < cost_trf*1e-10)
179
179
 
180
- def test_convergence_small_matrix(self):
180
+ def test_convergence_small_array(self):
181
181
  A = np.array([[49.0, 41.0, -32.0],
182
182
  [-19.0, -32.0, -8.0],
183
183
  [-13.0, 10.0, 69.0]])
@@ -199,7 +199,7 @@ class SparseMixin:
199
199
  m = 5000
200
200
  n = 1000
201
201
  rng = np.random.RandomState(0)
202
- A = rand(m, n, random_state=rng)
202
+ A = random_array((m, n), random_state=rng)
203
203
  b = rng.randn(m)
204
204
  res = lsq_linear(A, b)
205
205
  assert_allclose(res.optimality, 0, atol=1e-6)
@@ -213,7 +213,7 @@ class SparseMixin:
213
213
  m = 5000
214
214
  n = 1000
215
215
  rng = np.random.RandomState(0)
216
- A = rand(m, n, random_state=rng)
216
+ A = random_array((m, n), random_state=rng)
217
217
  b = rng.randn(m)
218
218
  lb = rng.randn(n)
219
219
  ub = lb + 1
@@ -232,7 +232,7 @@ class SparseMixin:
232
232
  data = np.array([1., 1., 1., 1. + 1e-6, 1.])
233
233
  row = np.array([0, 0, 1, 2, 2])
234
234
  col = np.array([0, 2, 1, 0, 2])
235
- A = coo_matrix((data, (row, col)), shape=(3, 3))
235
+ A = coo_array((data, (row, col)), shape=(3, 3))
236
236
 
237
237
  # Get the exact solution
238
238
  exact_sol = lsq_linear(A.toarray(), b, lsq_solver='exact')
@@ -1,7 +1,7 @@
1
1
  import numpy as np
2
2
  import pytest
3
3
  from scipy.linalg import block_diag
4
- from scipy.sparse import csc_matrix
4
+ from scipy.sparse import csc_array
5
5
  from numpy.testing import (assert_array_almost_equal,
6
6
  assert_array_less, assert_,
7
7
  suppress_warnings)
@@ -430,7 +430,7 @@ class Elec:
430
430
  Jx = 2 * np.diag(x_coord)
431
431
  Jy = 2 * np.diag(y_coord)
432
432
  Jz = 2 * np.diag(z_coord)
433
- return csc_matrix(np.hstack((Jx, Jy, Jz)))
433
+ return csc_array(np.hstack((Jx, Jy, Jz)))
434
434
  else:
435
435
  jac = self.constr_jac
436
436
 
@@ -308,7 +308,7 @@ class TestLeastSq:
308
308
  p0 = array([0,0,0])
309
309
  params_fit, ier = leastsq(self.residuals, p0,
310
310
  args=(self.y_meas, self.x))
311
- assert_(ier in (1,2,3,4), 'solution not found (ier=%d)' % ier)
311
+ assert_(ier in (1, 2, 3, 4), f'solution not found (ier={ier})')
312
312
  # low precision due to random
313
313
  assert_array_almost_equal(params_fit, self.abc, decimal=2)
314
314
 
@@ -317,7 +317,7 @@ class TestLeastSq:
317
317
  params_fit, ier = leastsq(self.residuals, p0,
318
318
  args=(self.y_meas, self.x),
319
319
  Dfun=self.residuals_jacobian)
320
- assert_(ier in (1,2,3,4), 'solution not found (ier=%d)' % ier)
320
+ assert_(ier in (1, 2, 3, 4), f'solution not found (ier={ier})')
321
321
  # low precision due to random
322
322
  assert_array_almost_equal(params_fit, self.abc, decimal=2)
323
323
 
@@ -405,7 +405,7 @@ class TestLeastSq:
405
405
  p0 = array([0,0,0])
406
406
  params_fit, ier = leastsq(func, p0,
407
407
  args=(self.y_meas, self.x))
408
- assert_(ier in (1,2,3,4), 'solution not found (ier=%d)' % ier)
408
+ assert_(ier in (1, 2, 3, 4), f'solution not found (ier={ier})')
409
409
  # low precision due to random
410
410
  assert_array_almost_equal(params_fit, self.abc, decimal=2)
411
411
 
@@ -418,7 +418,7 @@ class TestLeastSq:
418
418
  params_fit, ier = leastsq(self.residuals, p0,
419
419
  args=(self.y_meas, self.x),
420
420
  Dfun=deriv_func)
421
- assert_(ier in (1,2,3,4), 'solution not found (ier=%d)' % ier)
421
+ assert_(ier in (1, 2, 3, 4), f'solution not found (ier={ier})')
422
422
  # low precision due to random
423
423
  assert_array_almost_equal(params_fit, self.abc, decimal=2)
424
424
 
@@ -2,6 +2,7 @@ import numpy as np
2
2
  from numpy.testing import assert_allclose
3
3
  from pytest import raises as assert_raises
4
4
  from scipy.optimize import nnls
5
+ import pytest
5
6
 
6
7
 
7
8
  class TestNNLS:
@@ -21,7 +22,7 @@ class TestNNLS:
21
22
  x = np.abs(self.rng.uniform(low=-2, high=2, size=[10]))
22
23
  x[::2] = 0
23
24
  b = a @ x
24
- xact, rnorm = nnls(a, b, atol=500*np.linalg.norm(a, 1)*np.spacing(1.))
25
+ xact, rnorm = nnls(a, b)
25
26
  assert_allclose(xact, x, rtol=0., atol=1e-10)
26
27
  assert rnorm < 1e-12
27
28
 
@@ -32,7 +33,7 @@ class TestNNLS:
32
33
  x = np.abs(self.rng.uniform(low=-2, high=2, size=[120]))
33
34
  x[::2] = 0
34
35
  b = a @ x
35
- xact, rnorm = nnls(a, b, atol=500*np.linalg.norm(a, 1)*np.spacing(1.))
36
+ xact, rnorm = nnls(a, b)
36
37
  assert_allclose(xact, x, rtol=0., atol=1e-10)
37
38
  assert rnorm < 1e-12
38
39
 
@@ -153,7 +154,7 @@ class TestNNLS:
153
154
  k[nz] = 0
154
155
  W = np.diag(w)
155
156
 
156
- dact, _ = nnls(W @ A, W @ k, atol=1e-7)
157
+ dact, _ = nnls(W @ A, W @ k)
157
158
 
158
159
  p = np.cumsum(dact)
159
160
  assert np.all(dact >= 0)
@@ -427,3 +428,42 @@ class TestNNLS:
427
428
  assert_allclose(sol, np.array([0.0, 0.0, 76.3611306173957, 0.0, 0.0]),
428
429
  atol=5e-14)
429
430
  assert np.abs(np.linalg.norm(A@sol - b) - res) < 5e-14
431
+
432
+ def test_atol_deprecation_warning(self):
433
+ """Test that using atol parameter triggers deprecation warning"""
434
+ a = np.array([[1, 0], [1, 0], [0, 1]])
435
+ b = np.array([2, 1, 1])
436
+
437
+ with pytest.warns(DeprecationWarning, match="{'atol'}"):
438
+ nnls(a, b, atol=1e-8)
439
+
440
+ def test_2D_singleton_RHS_input(self):
441
+ # Test that a 2D singleton RHS input is accepted
442
+ A = np.array([[1.0, 0.5, -1.],
443
+ [1.0, 0.5, 0.0],
444
+ [-1., 0.0, 1.0]])
445
+ b = np.array([[-1.0, 2.0, 2.0]]).T
446
+ x, r = nnls(A, b)
447
+ assert_allclose(x, np.array([1.0, 2.0, 3.0]))
448
+ assert_allclose(r, 0.0)
449
+
450
+ def test_2D_not_singleton_RHS_input_2(self):
451
+ # Test that a 2D but not a column vector RHS input is rejected
452
+ A = np.array([[1.0, 0.5, -1.],
453
+ [1.0, 0.5, 0.0],
454
+ [1.0, 0.5, 0.0],
455
+ [0.0, 0.0, 1.0]])
456
+ b = np.ones(shape=[4, 2], dtype=np.float64)
457
+ with pytest.raises(ValueError, match="Expected a 1D array"):
458
+ nnls(A, b)
459
+
460
+ def test_gh_22791_32bit(self):
461
+ # Scikit-learn got hit by this problem on 32-bit arch.
462
+ desired = [0, 0, 1.05617285, 0, 0, 0, 0, 0.23123048, 0, 0, 0, 0.26128651]
463
+ rng = np.random.RandomState(42)
464
+ n_samples, n_features = 5, 12
465
+ X = rng.randn(n_samples, n_features)
466
+ X[:2, :] = 0
467
+ y = rng.randn(n_samples)
468
+ coef, _ = nnls(X, y)
469
+ assert_allclose(coef, desired)
@@ -12,6 +12,7 @@ from numpy import diag, dot
12
12
  from numpy.linalg import inv
13
13
  import numpy as np
14
14
  import scipy
15
+ from scipy.sparse.linalg import minres
15
16
 
16
17
  from .test_minpack import pressure_network
17
18
 
@@ -217,6 +218,41 @@ class TestNonlin:
217
218
  with pytest.raises(scipy.optimize.NoConvergence):
218
219
  nonlin.newton_krylov(wont_converge, xin=[0], maxiter=1)
219
220
 
221
+ def test_warnings_invalid_inner_param(self):
222
+ """
223
+ Test for ENH #21986, for behavior of `nonlin.newton_krylov`
224
+ Test the following scenarios:
225
+ 1. Raise warning for invalid inner param
226
+ 2. No warning for valid inner param
227
+ 3. No warning for user-provided callable method
228
+ """
229
+ # This should raise exactly one warning
230
+ # (`inner_atol` is not valid for `minres`)
231
+ with pytest.warns(UserWarning,
232
+ match="Please check inner method documentation"):
233
+ nonlin.newton_krylov(F, F.xin, method="minres", inner_atol=1e-5)
234
+
235
+ # This should not raise a warning (`minres` without `inner_atol`,
236
+ # but with `inner_maxiter` which is valid)
237
+ nonlin.newton_krylov(F, F.xin, method="minres", inner_maxiter=100,
238
+ inner_callback= lambda _ : ...)
239
+
240
+ # Test newton_krylov with a user-provided callable method
241
+ def user_provided_callable_method_enh_21986(op, rhs, **kwargs):
242
+ """A dummy user-provided callable method for testing."""
243
+ # Return a dummy result (mimicking minres)
244
+ return minres(op, rhs, **kwargs)
245
+ # This should not raise any warnings
246
+ nonlin.newton_krylov(F, F.xin,
247
+ method=user_provided_callable_method_enh_21986)
248
+
249
+ def test_non_inner_prefix(self):
250
+ with pytest.raises(ValueError,
251
+ match="Unknown parameter"
252
+ ):
253
+ # Pass a parameter without 'inner_' prefix
254
+ nonlin.newton_krylov(F, F.xin, method="minres", invalid_param=1e-5)
255
+
220
256
 
221
257
  class TestSecant:
222
258
  """Check that some Jacobian approximations satisfy the secant condition"""