scipy 1.15.2__cp311-cp311-macosx_12_0_arm64.whl → 1.16.0__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 (640) hide show
  1. scipy/.dylibs/libscipy_openblas.dylib +0 -0
  2. scipy/__config__.py +8 -8
  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 +282 -151
  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/_fitpack.cpython-311-darwin.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-311-darwin.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-311-darwin.so +0 -0
  162. scipy/interpolate/_rbf.py +2 -2
  163. scipy/interpolate/_rbfinterp.py +1 -1
  164. scipy/interpolate/_rbfinterp_pythran.cpython-311-darwin.so +0 -0
  165. scipy/interpolate/_rgi.py +31 -26
  166. scipy/interpolate/_rgi_cython.cpython-311-darwin.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/_harwell_boeing/_fortran_format_parser.py +19 -16
  177. scipy/io/_harwell_boeing/hb.py +7 -11
  178. scipy/io/_idl.py +5 -7
  179. scipy/io/_netcdf.py +15 -5
  180. scipy/io/_test_fortran.cpython-311-darwin.so +0 -0
  181. scipy/io/arff/tests/test_arffread.py +3 -3
  182. scipy/io/matlab/__init__.py +5 -3
  183. scipy/io/matlab/_mio.py +4 -1
  184. scipy/io/matlab/_mio5.py +19 -13
  185. scipy/io/matlab/_mio5_utils.cpython-311-darwin.so +0 -0
  186. scipy/io/matlab/_mio_utils.cpython-311-darwin.so +0 -0
  187. scipy/io/matlab/_miobase.py +4 -1
  188. scipy/io/matlab/_streams.cpython-311-darwin.so +0 -0
  189. scipy/io/matlab/tests/test_mio.py +46 -18
  190. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  191. scipy/io/tests/test_mmio.py +7 -1
  192. scipy/io/tests/test_wavfile.py +41 -0
  193. scipy/io/wavfile.py +57 -10
  194. scipy/linalg/_basic.py +113 -86
  195. scipy/linalg/_cythonized_array_utils.cpython-311-darwin.so +0 -0
  196. scipy/linalg/_decomp.py +22 -9
  197. scipy/linalg/_decomp_cholesky.py +28 -13
  198. scipy/linalg/_decomp_cossin.py +45 -30
  199. scipy/linalg/_decomp_interpolative.cpython-311-darwin.so +0 -0
  200. scipy/linalg/_decomp_ldl.py +4 -1
  201. scipy/linalg/_decomp_lu.py +18 -6
  202. scipy/linalg/_decomp_lu_cython.cpython-311-darwin.so +0 -0
  203. scipy/linalg/_decomp_polar.py +2 -0
  204. scipy/linalg/_decomp_qr.py +6 -2
  205. scipy/linalg/_decomp_qz.py +3 -0
  206. scipy/linalg/_decomp_schur.py +3 -1
  207. scipy/linalg/_decomp_svd.py +13 -2
  208. scipy/linalg/_decomp_update.cpython-311-darwin.so +0 -0
  209. scipy/linalg/_expm_frechet.py +4 -0
  210. scipy/linalg/_fblas.cpython-311-darwin.so +0 -0
  211. scipy/linalg/_flapack.cpython-311-darwin.so +0 -0
  212. scipy/linalg/_linalg_pythran.cpython-311-darwin.so +0 -0
  213. scipy/linalg/_matfuncs.py +187 -4
  214. scipy/linalg/_matfuncs_expm.cpython-311-darwin.so +0 -0
  215. scipy/linalg/_matfuncs_schur_sqrtm.cpython-311-darwin.so +0 -0
  216. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  217. scipy/linalg/_matfuncs_sqrtm_triu.cpython-311-darwin.so +0 -0
  218. scipy/linalg/_procrustes.py +2 -0
  219. scipy/linalg/_sketches.py +17 -6
  220. scipy/linalg/_solve_toeplitz.cpython-311-darwin.so +0 -0
  221. scipy/linalg/_solvers.py +7 -2
  222. scipy/linalg/_special_matrices.py +26 -36
  223. scipy/linalg/blas.py +35 -24
  224. scipy/linalg/cython_blas.cpython-311-darwin.so +0 -0
  225. scipy/linalg/cython_lapack.cpython-311-darwin.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_interpolative.py +17 -0
  235. scipy/linalg/tests/test_lapack.py +115 -7
  236. scipy/linalg/tests/test_matfuncs.py +157 -102
  237. scipy/linalg/tests/test_procrustes.py +0 -7
  238. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  239. scipy/linalg/tests/test_special_matrices.py +1 -5
  240. scipy/ndimage/__init__.py +1 -0
  241. scipy/ndimage/_cytest.cpython-311-darwin.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-311-darwin.so +0 -0
  248. scipy/ndimage/_ndimage_api.py +2 -1
  249. scipy/ndimage/_ni_docstrings.py +5 -1
  250. scipy/ndimage/_ni_label.cpython-311-darwin.so +0 -0
  251. scipy/ndimage/_ni_support.py +1 -5
  252. scipy/ndimage/_rank_filter_1d.cpython-311-darwin.so +0 -0
  253. scipy/ndimage/_support_alternative_backends.py +18 -6
  254. scipy/ndimage/tests/test_filters.py +384 -259
  255. scipy/ndimage/tests/test_fourier.py +7 -9
  256. scipy/ndimage/tests/test_interpolation.py +68 -61
  257. scipy/ndimage/tests/test_measurements.py +18 -35
  258. scipy/ndimage/tests/test_morphology.py +143 -131
  259. scipy/ndimage/tests/test_splines.py +1 -3
  260. scipy/odr/__odrpack.cpython-311-darwin.so +0 -0
  261. scipy/optimize/_basinhopping.py +13 -7
  262. scipy/optimize/_bglu_dense.cpython-311-darwin.so +0 -0
  263. scipy/optimize/_bracket.py +46 -26
  264. scipy/optimize/_chandrupatla.py +9 -10
  265. scipy/optimize/_cobyla_py.py +104 -123
  266. scipy/optimize/_constraints.py +14 -10
  267. scipy/optimize/_differentiable_functions.py +371 -230
  268. scipy/optimize/_differentialevolution.py +4 -3
  269. scipy/optimize/_direct.cpython-311-darwin.so +0 -0
  270. scipy/optimize/_dual_annealing.py +1 -1
  271. scipy/optimize/_elementwise.py +1 -4
  272. scipy/optimize/_group_columns.cpython-311-darwin.so +0 -0
  273. scipy/optimize/_highspy/_highs_wrapper.py +6 -4
  274. scipy/optimize/_lbfgsb.cpython-311-darwin.so +0 -0
  275. scipy/optimize/_lbfgsb_py.py +80 -24
  276. scipy/optimize/_linprog_doc.py +2 -2
  277. scipy/optimize/_linprog_highs.py +11 -11
  278. scipy/optimize/_linprog_ip.py +25 -10
  279. scipy/optimize/_linprog_util.py +18 -19
  280. scipy/optimize/_lsap.cpython-311-darwin.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-311-darwin.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-311-darwin.so +0 -0
  290. scipy/optimize/_minpack_py.py +21 -14
  291. scipy/optimize/_moduleTNC.cpython-311-darwin.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-311-darwin.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-311-darwin.so +0 -0
  303. scipy/optimize/_spectral.py +1 -1
  304. scipy/optimize/_tnc.py +8 -1
  305. scipy/optimize/_trlib/_trlib.cpython-311-darwin.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-311-darwin.so +0 -0
  317. scipy/optimize/_zeros_py.py +97 -17
  318. scipy/optimize/cython_optimize/_zeros.cpython-311-darwin.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 +71 -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 +98 -20
  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-311-darwin.so +0 -0
  350. scipy/signal/_peak_finding_utils.cpython-311-darwin.so +0 -0
  351. scipy/signal/_polyutils.py +172 -0
  352. scipy/signal/_short_time_fft.py +553 -76
  353. scipy/signal/_signal_api.py +30 -0
  354. scipy/signal/_signaltools.py +719 -396
  355. scipy/signal/_sigtools.cpython-311-darwin.so +0 -0
  356. scipy/signal/_sosfilt.cpython-311-darwin.so +0 -0
  357. scipy/signal/_spectral_py.py +230 -50
  358. scipy/signal/_spline.cpython-311-darwin.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-311-darwin.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 +5 -182
  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 +231 -5
  374. scipy/signal/tests/test_signaltools.py +2150 -1349
  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 +269 -120
  383. scipy/sparse/_bsr.py +7 -4
  384. scipy/sparse/_compressed.py +59 -234
  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-311-darwin.so +0 -0
  389. scipy/sparse/_csr.py +2 -2
  390. scipy/sparse/_data.py +48 -48
  391. scipy/sparse/_dia.py +105 -21
  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-311-darwin.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-311-darwin.so +0 -0
  404. scipy/sparse/csgraph/_matching.cpython-311-darwin.so +0 -0
  405. scipy/sparse/csgraph/_min_spanning_tree.cpython-311-darwin.so +0 -0
  406. scipy/sparse/csgraph/_reordering.cpython-311-darwin.so +0 -0
  407. scipy/sparse/csgraph/_shortest_path.cpython-311-darwin.so +0 -0
  408. scipy/sparse/csgraph/_tools.cpython-311-darwin.so +0 -0
  409. scipy/sparse/csgraph/_traversal.cpython-311-darwin.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-311-darwin.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-311-darwin.so +0 -0
  421. scipy/sparse/linalg/_eigen/arpack/arpack.py +28 -20
  422. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  423. scipy/sparse/linalg/_expm_multiply.py +8 -3
  424. scipy/sparse/linalg/_interface.py +29 -26
  425. scipy/sparse/linalg/_isolve/_gcrotmk.py +6 -5
  426. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  427. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  428. scipy/sparse/linalg/_isolve/minres.py +5 -5
  429. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  430. scipy/sparse/linalg/_isolve/utils.py +2 -8
  431. scipy/sparse/linalg/_matfuncs.py +1 -1
  432. scipy/sparse/linalg/_norm.py +1 -1
  433. scipy/sparse/linalg/_propack/_cpropack.cpython-311-darwin.so +0 -0
  434. scipy/sparse/linalg/_propack/_dpropack.cpython-311-darwin.so +0 -0
  435. scipy/sparse/linalg/_propack/_spropack.cpython-311-darwin.so +0 -0
  436. scipy/sparse/linalg/_propack/_zpropack.cpython-311-darwin.so +0 -0
  437. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  438. scipy/sparse/linalg/tests/test_expm_multiply.py +10 -0
  439. scipy/sparse/linalg/tests/test_interface.py +35 -0
  440. scipy/sparse/linalg/tests/test_pydata_sparse.py +18 -0
  441. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  442. scipy/sparse/tests/test_base.py +224 -40
  443. scipy/sparse/tests/test_common1d.py +17 -12
  444. scipy/sparse/tests/test_construct.py +1 -1
  445. scipy/sparse/tests/test_coo.py +272 -4
  446. scipy/sparse/tests/test_sparsetools.py +5 -0
  447. scipy/sparse/tests/test_sputils.py +36 -7
  448. scipy/spatial/_ckdtree.cpython-311-darwin.so +0 -0
  449. scipy/spatial/_distance_pybind.cpython-311-darwin.so +0 -0
  450. scipy/spatial/_distance_wrap.cpython-311-darwin.so +0 -0
  451. scipy/spatial/_hausdorff.cpython-311-darwin.so +0 -0
  452. scipy/spatial/_qhull.cpython-311-darwin.so +0 -0
  453. scipy/spatial/_voronoi.cpython-311-darwin.so +0 -0
  454. scipy/spatial/distance.py +49 -42
  455. scipy/spatial/tests/test_distance.py +15 -1
  456. scipy/spatial/tests/test_kdtree.py +1 -0
  457. scipy/spatial/tests/test_qhull.py +106 -2
  458. scipy/spatial/transform/__init__.py +5 -3
  459. scipy/spatial/transform/_rigid_transform.cpython-311-darwin.so +0 -0
  460. scipy/spatial/transform/_rotation.cpython-311-darwin.so +0 -0
  461. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  462. scipy/spatial/transform/tests/test_rotation.py +1342 -790
  463. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  464. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  465. scipy/special/__init__.py +1 -47
  466. scipy/special/_add_newdocs.py +34 -772
  467. scipy/special/_basic.py +22 -25
  468. scipy/special/_comb.cpython-311-darwin.so +0 -0
  469. scipy/special/_ellip_harm_2.cpython-311-darwin.so +0 -0
  470. scipy/special/_gufuncs.cpython-311-darwin.so +0 -0
  471. scipy/special/_logsumexp.py +83 -69
  472. scipy/special/_orthogonal.pyi +1 -1
  473. scipy/special/_specfun.cpython-311-darwin.so +0 -0
  474. scipy/special/_special_ufuncs.cpython-311-darwin.so +0 -0
  475. scipy/special/_spherical_bessel.py +4 -4
  476. scipy/special/_support_alternative_backends.py +212 -119
  477. scipy/special/_test_internal.cpython-311-darwin.so +0 -0
  478. scipy/special/_testutils.py +4 -4
  479. scipy/special/_ufuncs.cpython-311-darwin.so +0 -0
  480. scipy/special/_ufuncs.pyi +1 -0
  481. scipy/special/_ufuncs.pyx +215 -1400
  482. scipy/special/_ufuncs_cxx.cpython-311-darwin.so +0 -0
  483. scipy/special/_ufuncs_cxx.pxd +2 -15
  484. scipy/special/_ufuncs_cxx.pyx +5 -44
  485. scipy/special/_ufuncs_cxx_defs.h +2 -16
  486. scipy/special/_ufuncs_defs.h +0 -8
  487. scipy/special/cython_special.cpython-311-darwin.so +0 -0
  488. scipy/special/cython_special.pxd +1 -1
  489. scipy/special/tests/_cython_examples/meson.build +10 -1
  490. scipy/special/tests/test_basic.py +153 -20
  491. scipy/special/tests/test_boost_ufuncs.py +3 -0
  492. scipy/special/tests/test_cdflib.py +35 -11
  493. scipy/special/tests/test_gammainc.py +16 -0
  494. scipy/special/tests/test_hyp2f1.py +23 -2
  495. scipy/special/tests/test_log1mexp.py +85 -0
  496. scipy/special/tests/test_logsumexp.py +220 -64
  497. scipy/special/tests/test_mpmath.py +1 -0
  498. scipy/special/tests/test_nan_inputs.py +1 -1
  499. scipy/special/tests/test_orthogonal.py +17 -18
  500. scipy/special/tests/test_sf_error.py +3 -2
  501. scipy/special/tests/test_sph_harm.py +6 -7
  502. scipy/special/tests/test_support_alternative_backends.py +211 -76
  503. scipy/stats/__init__.py +4 -1
  504. scipy/stats/_ansari_swilk_statistics.cpython-311-darwin.so +0 -0
  505. scipy/stats/_axis_nan_policy.py +5 -12
  506. scipy/stats/_biasedurn.cpython-311-darwin.so +0 -0
  507. scipy/stats/_continued_fraction.py +387 -0
  508. scipy/stats/_continuous_distns.py +296 -319
  509. scipy/stats/_correlation.py +1 -1
  510. scipy/stats/_covariance.py +6 -3
  511. scipy/stats/_discrete_distns.py +39 -32
  512. scipy/stats/_distn_infrastructure.py +39 -12
  513. scipy/stats/_distribution_infrastructure.py +920 -238
  514. scipy/stats/_entropy.py +9 -10
  515. scipy/{_lib → stats}/_finite_differences.py +1 -1
  516. scipy/stats/_hypotests.py +83 -50
  517. scipy/stats/_kde.py +53 -49
  518. scipy/stats/_ksstats.py +1 -1
  519. scipy/stats/_levy_stable/__init__.py +7 -15
  520. scipy/stats/_levy_stable/levyst.cpython-311-darwin.so +0 -0
  521. scipy/stats/_morestats.py +118 -73
  522. scipy/stats/_mstats_basic.py +13 -17
  523. scipy/stats/_mstats_extras.py +8 -8
  524. scipy/stats/_multivariate.py +89 -113
  525. scipy/stats/_new_distributions.py +97 -20
  526. scipy/stats/_page_trend_test.py +12 -5
  527. scipy/stats/_probability_distribution.py +265 -43
  528. scipy/stats/_qmc.py +14 -9
  529. scipy/stats/_qmc_cy.cpython-311-darwin.so +0 -0
  530. scipy/stats/_qmvnt.py +16 -95
  531. scipy/stats/_qmvnt_cy.cpython-311-darwin.so +0 -0
  532. scipy/stats/_quantile.py +335 -0
  533. scipy/stats/_rcont/rcont.cpython-311-darwin.so +0 -0
  534. scipy/stats/_resampling.py +5 -30
  535. scipy/stats/_sampling.py +1 -1
  536. scipy/stats/_sobol.cpython-311-darwin.so +0 -0
  537. scipy/stats/_stats.cpython-311-darwin.so +0 -0
  538. scipy/stats/_stats_mstats_common.py +21 -2
  539. scipy/stats/_stats_py.py +551 -477
  540. scipy/stats/_stats_pythran.cpython-311-darwin.so +0 -0
  541. scipy/stats/_unuran/unuran_wrapper.cpython-311-darwin.so +0 -0
  542. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  543. scipy/stats/_variation.py +6 -8
  544. scipy/stats/_wilcoxon.py +13 -7
  545. scipy/stats/tests/common_tests.py +6 -4
  546. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  547. scipy/stats/tests/test_continued_fraction.py +173 -0
  548. scipy/stats/tests/test_continuous.py +379 -60
  549. scipy/stats/tests/test_continuous_basic.py +18 -12
  550. scipy/stats/tests/test_discrete_basic.py +14 -8
  551. scipy/stats/tests/test_discrete_distns.py +16 -16
  552. scipy/stats/tests/test_distributions.py +117 -75
  553. scipy/stats/tests/test_entropy.py +40 -48
  554. scipy/stats/tests/test_fit.py +4 -3
  555. scipy/stats/tests/test_hypotests.py +153 -24
  556. scipy/stats/tests/test_kdeoth.py +109 -41
  557. scipy/stats/tests/test_marray.py +289 -0
  558. scipy/stats/tests/test_morestats.py +81 -49
  559. scipy/stats/tests/test_mstats_basic.py +3 -3
  560. scipy/stats/tests/test_multivariate.py +434 -83
  561. scipy/stats/tests/test_qmc.py +13 -10
  562. scipy/stats/tests/test_quantile.py +199 -0
  563. scipy/stats/tests/test_rank.py +119 -112
  564. scipy/stats/tests/test_resampling.py +47 -56
  565. scipy/stats/tests/test_sampling.py +9 -4
  566. scipy/stats/tests/test_stats.py +799 -939
  567. scipy/stats/tests/test_variation.py +8 -6
  568. scipy/version.py +2 -2
  569. {scipy-1.15.2.dist-info → scipy-1.16.0.dist-info}/LICENSE.txt +4 -4
  570. {scipy-1.15.2.dist-info → scipy-1.16.0.dist-info}/METADATA +12 -12
  571. {scipy-1.15.2.dist-info → scipy-1.16.0.dist-info}/RECORD +572 -579
  572. scipy-1.16.0.dist-info/WHEEL +6 -0
  573. scipy/_lib/array_api_extra/_funcs.py +0 -484
  574. scipy/_lib/array_api_extra/_typing.py +0 -8
  575. scipy/interpolate/_bspl.cpython-311-darwin.so +0 -0
  576. scipy/optimize/_cobyla.cpython-311-darwin.so +0 -0
  577. scipy/optimize/_cython_nnls.cpython-311-darwin.so +0 -0
  578. scipy/optimize/_slsqp.cpython-311-darwin.so +0 -0
  579. scipy/spatial/qhull_src/COPYING.txt +0 -38
  580. scipy/special/libsf_error_state.dylib +0 -0
  581. scipy/special/tests/test_log_softmax.py +0 -109
  582. scipy/special/tests/test_xsf_cuda.py +0 -114
  583. scipy/special/xsf/binom.h +0 -89
  584. scipy/special/xsf/cdflib.h +0 -100
  585. scipy/special/xsf/cephes/airy.h +0 -307
  586. scipy/special/xsf/cephes/besselpoly.h +0 -51
  587. scipy/special/xsf/cephes/beta.h +0 -257
  588. scipy/special/xsf/cephes/cbrt.h +0 -131
  589. scipy/special/xsf/cephes/chbevl.h +0 -85
  590. scipy/special/xsf/cephes/chdtr.h +0 -193
  591. scipy/special/xsf/cephes/const.h +0 -87
  592. scipy/special/xsf/cephes/ellie.h +0 -293
  593. scipy/special/xsf/cephes/ellik.h +0 -251
  594. scipy/special/xsf/cephes/ellpe.h +0 -107
  595. scipy/special/xsf/cephes/ellpk.h +0 -117
  596. scipy/special/xsf/cephes/expn.h +0 -260
  597. scipy/special/xsf/cephes/gamma.h +0 -398
  598. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  599. scipy/special/xsf/cephes/hyperg.h +0 -361
  600. scipy/special/xsf/cephes/i0.h +0 -149
  601. scipy/special/xsf/cephes/i1.h +0 -158
  602. scipy/special/xsf/cephes/igam.h +0 -421
  603. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  604. scipy/special/xsf/cephes/igami.h +0 -313
  605. scipy/special/xsf/cephes/j0.h +0 -225
  606. scipy/special/xsf/cephes/j1.h +0 -198
  607. scipy/special/xsf/cephes/jv.h +0 -715
  608. scipy/special/xsf/cephes/k0.h +0 -164
  609. scipy/special/xsf/cephes/k1.h +0 -163
  610. scipy/special/xsf/cephes/kn.h +0 -243
  611. scipy/special/xsf/cephes/lanczos.h +0 -112
  612. scipy/special/xsf/cephes/ndtr.h +0 -275
  613. scipy/special/xsf/cephes/poch.h +0 -85
  614. scipy/special/xsf/cephes/polevl.h +0 -167
  615. scipy/special/xsf/cephes/psi.h +0 -194
  616. scipy/special/xsf/cephes/rgamma.h +0 -111
  617. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  618. scipy/special/xsf/cephes/shichi.h +0 -248
  619. scipy/special/xsf/cephes/sici.h +0 -224
  620. scipy/special/xsf/cephes/sindg.h +0 -221
  621. scipy/special/xsf/cephes/tandg.h +0 -139
  622. scipy/special/xsf/cephes/trig.h +0 -58
  623. scipy/special/xsf/cephes/unity.h +0 -186
  624. scipy/special/xsf/cephes/zeta.h +0 -172
  625. scipy/special/xsf/config.h +0 -304
  626. scipy/special/xsf/digamma.h +0 -205
  627. scipy/special/xsf/error.h +0 -57
  628. scipy/special/xsf/evalpoly.h +0 -47
  629. scipy/special/xsf/expint.h +0 -266
  630. scipy/special/xsf/hyp2f1.h +0 -694
  631. scipy/special/xsf/iv_ratio.h +0 -173
  632. scipy/special/xsf/lambertw.h +0 -150
  633. scipy/special/xsf/loggamma.h +0 -163
  634. scipy/special/xsf/sici.h +0 -200
  635. scipy/special/xsf/tools.h +0 -427
  636. scipy/special/xsf/trig.h +0 -164
  637. scipy/special/xsf/wright_bessel.h +0 -843
  638. scipy/special/xsf/zlog1.h +0 -35
  639. scipy/stats/_mvn.cpython-311-darwin.so +0 -0
  640. scipy-1.15.2.dist-info/WHEEL +0 -4
@@ -7,9 +7,8 @@ from scipy.optimize.elementwise import bracket_root, bracket_minimum
7
7
  import scipy._lib._elementwise_iterative_method as eim
8
8
  from scipy import stats
9
9
  from scipy._lib._array_api_no_0d import (xp_assert_close, xp_assert_equal,
10
- xp_assert_less, array_namespace)
10
+ xp_assert_less)
11
11
  from scipy._lib._array_api import xp_ravel
12
- from scipy.conftest import array_api_compatible
13
12
 
14
13
 
15
14
  # These tests were originally written for the private `optimize._bracket`
@@ -42,12 +41,11 @@ def _bracket_minimum(*args, **kwargs):
42
41
 
43
42
 
44
43
  array_api_strict_skip_reason = 'Array API does not support fancy indexing assignment.'
45
- jax_skip_reason = 'JAX arrays do not support item assignment.'
44
+ boolean_index_skip_reason = 'JAX/Dask arrays do not support boolean assignment.'
46
45
 
47
46
  @pytest.mark.skip_xp_backends('array_api_strict', reason=array_api_strict_skip_reason)
48
- @pytest.mark.skip_xp_backends('jax.numpy', reason=jax_skip_reason)
49
- @array_api_compatible
50
- @pytest.mark.usefixtures("skip_xp_backends")
47
+ @pytest.mark.skip_xp_backends('jax.numpy', reason=boolean_index_skip_reason)
48
+ @pytest.mark.skip_xp_backends('dask.array', reason=boolean_index_skip_reason)
51
49
  class TestBracketRoot:
52
50
  @pytest.mark.parametrize("seed", (615655101, 3141866013, 238075752))
53
51
  @pytest.mark.parametrize("use_xmin", (False, True))
@@ -179,10 +177,9 @@ class TestBracketRoot:
179
177
  ref_attr = [xp.asarray(getattr(ref, attr)) for ref in refs]
180
178
  res_attr = getattr(res, attr)
181
179
  xp_assert_close(xp_ravel(res_attr, xp=xp), xp.stack(ref_attr))
182
- xp_assert_equal(res_attr.shape, shape)
180
+ assert res_attr.shape == shape
183
181
 
184
- xp_test = array_namespace(xp.asarray(1.))
185
- assert res.success.dtype == xp_test.bool
182
+ assert res.success.dtype == xp.bool
186
183
  if shape:
187
184
  assert xp.all(res.success[1:-1])
188
185
  assert res.status.dtype == xp.int32
@@ -229,13 +226,11 @@ class TestBracketRoot:
229
226
  def test_dtype(self, root, xmin, xmax, dtype, xp):
230
227
  # Test that dtypes are preserved
231
228
  dtype = getattr(xp, dtype)
232
- xp_test = array_namespace(xp.asarray(1.))
233
-
234
229
  xmin = xmin if xmin is None else xp.asarray(xmin, dtype=dtype)
235
230
  xmax = xmax if xmax is None else xp.asarray(xmax, dtype=dtype)
236
231
  root = xp.asarray(root, dtype=dtype)
237
232
  def f(x, root):
238
- return xp_test.astype((x - root) ** 3, dtype)
233
+ return xp.astype((x - root) ** 3, dtype)
239
234
 
240
235
  bracket = xp.asarray([-0.01, 0.01], dtype=dtype)
241
236
  res = _bracket_root(f, *bracket, xmin=xmin, xmax=xmax, args=(root,))
@@ -254,13 +249,13 @@ class TestBracketRoot:
254
249
  with pytest.raises(ValueError, match=message):
255
250
  _bracket_root(lambda x: x, -4+1j, 4)
256
251
  with pytest.raises(ValueError, match=message):
257
- _bracket_root(lambda x: x, -4, 'hello')
252
+ _bracket_root(lambda x: x, -4, 4+1j)
258
253
  with pytest.raises(ValueError, match=message):
259
- _bracket_root(lambda x: x, -4, 4, xmin=np)
254
+ _bracket_root(lambda x: x, -4, 4, xmin=4+1j)
260
255
  with pytest.raises(ValueError, match=message):
261
- _bracket_root(lambda x: x, -4, 4, xmax=object())
256
+ _bracket_root(lambda x: x, -4, 4, xmax=4+1j)
262
257
  with pytest.raises(ValueError, match=message):
263
- _bracket_root(lambda x: x, -4, 4, factor=sum)
258
+ _bracket_root(lambda x: x, -4, 4, factor=4+1j)
264
259
 
265
260
  message = "All elements of `factor` must be greater than 1."
266
261
  with pytest.raises(ValueError, match=message):
@@ -284,12 +279,10 @@ class TestBracketRoot:
284
279
 
285
280
  def test_special_cases(self, xp):
286
281
  # Test edge cases and other special cases
287
- xp_test = array_namespace(xp.asarray(1.))
288
-
289
282
  # Test that integers are not passed to `f`
290
283
  # (otherwise this would overflow)
291
284
  def f(x):
292
- assert xp_test.isdtype(x.dtype, "real floating")
285
+ assert xp.isdtype(x.dtype, "real floating")
293
286
  return x ** 99 - 1
294
287
 
295
288
  res = _bracket_root(f, xp.asarray(-7.), xp.asarray(5.))
@@ -328,7 +321,7 @@ class TestBracketRoot:
328
321
 
329
322
  # 2. bracket endpoint hits root exactly
330
323
  f.count = 0
331
- res = _bracket_root(f, xp.asarray(5.), xp.asarray(10.),
324
+ res = _bracket_root(f, xp.asarray(5.), xp.asarray(10.),
332
325
  factor=2)
333
326
 
334
327
  assert res.nfev == 4
@@ -337,12 +330,12 @@ class TestBracketRoot:
337
330
 
338
331
  # 3. bracket limit hits root exactly
339
332
  with np.errstate(over='ignore'):
340
- res = _bracket_root(f, xp.asarray(5.), xp.asarray(10.),
333
+ res = _bracket_root(f, xp.asarray(5.), xp.asarray(10.),
341
334
  xmin=0)
342
335
  xp_assert_close(res.xl, xp.asarray(0.), atol=1e-15)
343
336
 
344
337
  with np.errstate(over='ignore'):
345
- res = _bracket_root(f, xp.asarray(-10.), xp.asarray(-5.),
338
+ res = _bracket_root(f, xp.asarray(-10.), xp.asarray(-5.),
346
339
  xmax=0)
347
340
  xp_assert_close(res.xr, xp.asarray(0.), atol=1e-15)
348
341
 
@@ -352,11 +345,46 @@ class TestBracketRoot:
352
345
  xmin=1)
353
346
  assert not res.success
354
347
 
348
+ def test_bug_fixes(self):
349
+ # 1. Bug in double sided bracket search.
350
+ # Happened in some cases where there are terminations on one side
351
+ # after corresponding searches on other side failed due to reaching the
352
+ # boundary.
353
+
354
+ # https://github.com/scipy/scipy/pull/22560#discussion_r1962853839
355
+ def f(x, p):
356
+ return np.exp(x) - p
357
+
358
+ p = np.asarray([0.29, 0.35])
359
+ res = _bracket_root(f, xl0=-1, xmin=-np.inf, xmax=0, args=(p, ))
360
+
361
+ # https://github.com/scipy/scipy/pull/22560/files#r1962952517
362
+ def f(x, p, c):
363
+ return np.exp(x*c) - p
364
+
365
+ p = [0.32061201, 0.39175242, 0.40047535, 0.50527218, 0.55654373,
366
+ 0.11911647, 0.37507896, 0.66554191]
367
+ c = [1., -1., 1., 1., -1., 1., 1., 1.]
368
+ xl0 = [-7.63108551, 3.27840947, -8.36968526, -1.78124372,
369
+ 0.92201295, -2.48930123, -0.66733533, -0.44606749]
370
+ xr0 = [-6.63108551, 4.27840947, -7.36968526, -0.78124372,
371
+ 1.92201295, -1.48930123, 0., 0.]
372
+ xmin = [-np.inf, 0., -np.inf, -np.inf, 0., -np.inf, -np.inf,
373
+ -np.inf]
374
+ xmax = [0., np.inf, 0., 0., np.inf, 0., 0., 0.]
375
+
376
+ res = _bracket_root(f, xl0=xl0, xr0=xr0, xmin=xmin, xmax=xmax, args=(p, c))
377
+
378
+ # 2. Default xl0 + 1 for xr0 exceeds xmax.
379
+ # https://github.com/scipy/scipy/pull/22560#discussion_r1962947434
380
+ res = _bracket_root(lambda x: x + 0.25, xl0=-0.5, xmin=-np.inf, xmax=0)
381
+ assert res.success
355
382
 
383
+
384
+ @pytest.mark.skip_xp_backends('torch', reason='data-apis/array-api-compat#271')
356
385
  @pytest.mark.skip_xp_backends('array_api_strict', reason=array_api_strict_skip_reason)
357
- @pytest.mark.skip_xp_backends('jax.numpy', reason=jax_skip_reason)
358
- @array_api_compatible
359
- @pytest.mark.usefixtures("skip_xp_backends")
386
+ @pytest.mark.skip_xp_backends('jax.numpy', reason=boolean_index_skip_reason)
387
+ @pytest.mark.skip_xp_backends('dask.array', reason=boolean_index_skip_reason)
360
388
  class TestBracketMinimum:
361
389
  def init_f(self):
362
390
  def f(x, a, b):
@@ -471,10 +499,10 @@ class TestBracketMinimum:
471
499
  funcs = [lambda x: (x - 1.5)**2,
472
500
  lambda x: x,
473
501
  lambda x: x,
474
- lambda x: xp.nan,
502
+ lambda x: xp.asarray(xp.nan),
475
503
  lambda x: x**2]
476
504
 
477
- return [funcs[j](x) for x, j in zip(xs, js)]
505
+ return [funcs[int(j)](x) for x, j in zip(xs, js)]
478
506
 
479
507
  args = (xp.arange(5, dtype=xp.int64),)
480
508
  xl0 = xp.asarray([-1.0, -1.0, -1.0, -1.0, 6.0])
@@ -496,13 +524,12 @@ class TestBracketMinimum:
496
524
  @pytest.mark.parametrize("xmax", [5, None])
497
525
  def test_dtypes(self, minimum, xmin, xmax, dtype, xp):
498
526
  dtype = getattr(xp, dtype)
499
- xp_test = array_namespace(xp.asarray(1.))
500
527
  xmin = xmin if xmin is None else xp.asarray(xmin, dtype=dtype)
501
528
  xmax = xmax if xmax is None else xp.asarray(xmax, dtype=dtype)
502
529
  minimum = xp.asarray(minimum, dtype=dtype)
503
530
 
504
531
  def f(x, minimum):
505
- return xp_test.astype((x - minimum)**2, dtype)
532
+ return xp.astype((x - minimum)**2, dtype)
506
533
 
507
534
  xl0, xm0, xr0 = [-0.01, 0.0, 0.01]
508
535
  result = _bracket_minimum(
@@ -525,23 +552,21 @@ class TestBracketMinimum:
525
552
  with pytest.raises(ValueError, match=message):
526
553
  _bracket_minimum(lambda x: x**2, xp.asarray(4+1j))
527
554
  with pytest.raises(ValueError, match=message):
528
- _bracket_minimum(lambda x: x**2, xp.asarray(-4), xl0='hello')
555
+ _bracket_minimum(lambda x: x**2, xp.asarray(-4), xl0=4+1j)
529
556
  with pytest.raises(ValueError, match=message):
530
- _bracket_minimum(lambda x: x**2, xp.asarray(-4),
531
- xr0='farcical aquatic ceremony')
557
+ _bracket_minimum(lambda x: x**2, xp.asarray(-4), xr0=4+1j)
532
558
  with pytest.raises(ValueError, match=message):
533
- _bracket_minimum(lambda x: x**2, xp.asarray(-4), xmin=np)
559
+ _bracket_minimum(lambda x: x**2, xp.asarray(-4), xmin=4+1j)
534
560
  with pytest.raises(ValueError, match=message):
535
- _bracket_minimum(lambda x: x**2, xp.asarray(-4), xmax=object())
561
+ _bracket_minimum(lambda x: x**2, xp.asarray(-4), xmax=4+1j)
536
562
  with pytest.raises(ValueError, match=message):
537
- _bracket_minimum(lambda x: x**2, xp.asarray(-4), factor=sum)
563
+ _bracket_minimum(lambda x: x**2, xp.asarray(-4), factor=4+1j)
538
564
 
539
565
  message = "All elements of `factor` must be greater than 1."
540
566
  with pytest.raises(ValueError, match=message):
541
567
  _bracket_minimum(lambda x: x, xp.asarray(-4), factor=0.5)
542
568
 
543
- message = "shape mismatch: objects cannot be broadcast"
544
- # raised by `xp.broadcast, but the traceback is readable IMO
569
+ message = "Array shapes are incompatible for broadcasting."
545
570
  with pytest.raises(ValueError, match=message):
546
571
  _bracket_minimum(lambda x: x**2, xp.asarray([-2, -3]), xl0=[-3, -4, -5])
547
572
 
@@ -776,18 +801,19 @@ class TestBracketMinimum:
776
801
  factor = rng.random(size=shape) + 1.5
777
802
  refs = bracket_minimum_single(xm0, xl0, xr0, xmin, xmax, factor, a).ravel()
778
803
  args = tuple(xp.asarray(arg, dtype=xp.float64) for arg in args)
779
- res = _bracket_minimum(f, xp.asarray(xm0), xl0=xl0, xr0=xr0, xmin=xmin,
780
- xmax=xmax, factor=factor, args=args, maxiter=maxiter)
804
+ res = _bracket_minimum(f, xp.asarray(xm0), xl0=xp.asarray(xl0),
805
+ xr0=xp.asarray(xr0), xmin=xp.asarray(xmin),
806
+ xmax=xp.asarray(xmax), factor=xp.asarray(factor),
807
+ args=args, maxiter=maxiter)
781
808
 
782
809
  attrs = ['xl', 'xm', 'xr', 'fl', 'fm', 'fr', 'success', 'nfev', 'nit']
783
810
  for attr in attrs:
784
811
  ref_attr = [xp.asarray(getattr(ref, attr)) for ref in refs]
785
812
  res_attr = getattr(res, attr)
786
813
  xp_assert_close(xp_ravel(res_attr, xp=xp), xp.stack(ref_attr))
787
- xp_assert_equal(res_attr.shape, shape)
814
+ assert res_attr.shape == shape
788
815
 
789
- xp_test = array_namespace(xp.asarray(1.))
790
- assert res.success.dtype == xp_test.bool
816
+ assert res.success.dtype == xp.bool
791
817
  if shape:
792
818
  assert xp.all(res.success[1:-1])
793
819
  assert res.status.dtype == xp.int32
@@ -801,12 +827,11 @@ class TestBracketMinimum:
801
827
 
802
828
  def test_special_cases(self, xp):
803
829
  # Test edge cases and other special cases.
804
- xp_test = array_namespace(xp.asarray(1.))
805
830
 
806
831
  # Test that integers are not passed to `f`
807
832
  # (otherwise this would overflow)
808
833
  def f(x):
809
- assert xp_test.isdtype(x.dtype, "numeric")
834
+ assert xp.isdtype(x.dtype, "numeric")
810
835
  return x ** 98 - 1
811
836
 
812
837
  result = _bracket_minimum(f, xp.asarray(-7., dtype=xp.float64), xr0=5)
@@ -855,7 +880,7 @@ class TestBracketMinimum:
855
880
 
856
881
  result = _bracket_minimum(f, xp.asarray(0.5535723499480897), xmin=xmin,
857
882
  xmax=xmax)
858
- assert xmin == result.xl
883
+ xp_assert_close(result.xl, xmin)
859
884
 
860
885
  def test_gh_20562_right(self, xp):
861
886
  # Regression test for https://github.com/scipy/scipy/issues/20562
@@ -868,4 +893,4 @@ class TestBracketMinimum:
868
893
 
869
894
  result = _bracket_minimum(f, xp.asarray(-0.5535723499480897),
870
895
  xmin=xmin, xmax=xmax)
871
- assert xmax == result.xr
896
+ xp_assert_close(result.xr, xmax)