scipy 1.15.3__cp312-cp312-macosx_12_0_arm64.whl → 1.16.0rc2__cp312-cp312-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 (629) 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-312-darwin.so +0 -0
  5. scipy/_lib/_array_api.py +486 -161
  6. scipy/_lib/_array_api_compat_vendor.py +9 -0
  7. scipy/_lib/_bunch.py +4 -0
  8. scipy/_lib/_ccallback_c.cpython-312-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_deprecation_call.cpython-312-darwin.so +0 -0
  13. scipy/_lib/_test_deprecation_def.cpython-312-darwin.so +0 -0
  14. scipy/_lib/_testutils.py +6 -2
  15. scipy/_lib/_util.py +222 -125
  16. scipy/_lib/array_api_compat/__init__.py +4 -4
  17. scipy/_lib/array_api_compat/_internal.py +19 -6
  18. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  19. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  20. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  21. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  22. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  23. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  24. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  25. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  26. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  27. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  28. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  29. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  30. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  31. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  32. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  33. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  34. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  35. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  36. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  37. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  38. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  39. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  40. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  41. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  42. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  43. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  44. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  45. scipy/_lib/array_api_extra/__init__.py +26 -3
  46. scipy/_lib/array_api_extra/_delegation.py +171 -0
  47. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  48. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  49. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  50. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  51. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  52. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  53. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  54. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  58. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  59. scipy/_lib/array_api_extra/testing.py +359 -0
  60. scipy/_lib/decorator.py +2 -2
  61. scipy/_lib/doccer.py +1 -7
  62. scipy/_lib/messagestream.cpython-312-darwin.so +0 -0
  63. scipy/_lib/pyprima/__init__.py +212 -0
  64. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  65. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  66. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  67. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  68. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  69. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  70. scipy/_lib/pyprima/cobyla/update.py +289 -0
  71. scipy/_lib/pyprima/common/__init__.py +0 -0
  72. scipy/_lib/pyprima/common/_bounds.py +34 -0
  73. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  74. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  75. scipy/_lib/pyprima/common/_project.py +173 -0
  76. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  77. scipy/_lib/pyprima/common/consts.py +47 -0
  78. scipy/_lib/pyprima/common/evaluate.py +99 -0
  79. scipy/_lib/pyprima/common/history.py +38 -0
  80. scipy/_lib/pyprima/common/infos.py +30 -0
  81. scipy/_lib/pyprima/common/linalg.py +435 -0
  82. scipy/_lib/pyprima/common/message.py +290 -0
  83. scipy/_lib/pyprima/common/powalg.py +131 -0
  84. scipy/_lib/pyprima/common/preproc.py +277 -0
  85. scipy/_lib/pyprima/common/present.py +5 -0
  86. scipy/_lib/pyprima/common/ratio.py +54 -0
  87. scipy/_lib/pyprima/common/redrho.py +47 -0
  88. scipy/_lib/pyprima/common/selectx.py +296 -0
  89. scipy/_lib/tests/test__util.py +105 -121
  90. scipy/_lib/tests/test_array_api.py +166 -35
  91. scipy/_lib/tests/test_bunch.py +7 -0
  92. scipy/_lib/tests/test_ccallback.py +2 -10
  93. scipy/_lib/tests/test_public_api.py +13 -0
  94. scipy/cluster/_hierarchy.cpython-312-darwin.so +0 -0
  95. scipy/cluster/_optimal_leaf_ordering.cpython-312-darwin.so +0 -0
  96. scipy/cluster/_vq.cpython-312-darwin.so +0 -0
  97. scipy/cluster/hierarchy.py +393 -223
  98. scipy/cluster/tests/test_hierarchy.py +273 -335
  99. scipy/cluster/tests/test_vq.py +45 -61
  100. scipy/cluster/vq.py +39 -35
  101. scipy/conftest.py +263 -157
  102. scipy/constants/_constants.py +4 -1
  103. scipy/constants/tests/test_codata.py +2 -2
  104. scipy/constants/tests/test_constants.py +11 -18
  105. scipy/datasets/_download_all.py +15 -1
  106. scipy/datasets/_fetchers.py +7 -1
  107. scipy/datasets/_utils.py +1 -1
  108. scipy/differentiate/_differentiate.py +25 -25
  109. scipy/differentiate/tests/test_differentiate.py +24 -25
  110. scipy/fft/_basic.py +20 -0
  111. scipy/fft/_helper.py +3 -34
  112. scipy/fft/_pocketfft/helper.py +29 -1
  113. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  114. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  115. scipy/fft/_realtransforms.py +13 -0
  116. scipy/fft/tests/test_basic.py +27 -25
  117. scipy/fft/tests/test_fftlog.py +16 -7
  118. scipy/fft/tests/test_helper.py +18 -34
  119. scipy/fft/tests/test_real_transforms.py +8 -10
  120. scipy/fftpack/convolve.cpython-312-darwin.so +0 -0
  121. scipy/fftpack/tests/test_basic.py +2 -4
  122. scipy/fftpack/tests/test_real_transforms.py +8 -9
  123. scipy/integrate/_bvp.py +9 -3
  124. scipy/integrate/_cubature.py +3 -2
  125. scipy/integrate/_dop.cpython-312-darwin.so +0 -0
  126. scipy/integrate/_lsoda.cpython-312-darwin.so +0 -0
  127. scipy/integrate/_ode.py +9 -2
  128. scipy/integrate/_odepack.cpython-312-darwin.so +0 -0
  129. scipy/integrate/_quad_vec.py +21 -29
  130. scipy/integrate/_quadpack.cpython-312-darwin.so +0 -0
  131. scipy/integrate/_quadpack_py.py +11 -7
  132. scipy/integrate/_quadrature.py +3 -3
  133. scipy/integrate/_rules/_base.py +2 -2
  134. scipy/integrate/_tanhsinh.py +48 -47
  135. scipy/integrate/_test_odeint_banded.cpython-312-darwin.so +0 -0
  136. scipy/integrate/_vode.cpython-312-darwin.so +0 -0
  137. scipy/integrate/tests/test__quad_vec.py +0 -6
  138. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  139. scipy/integrate/tests/test_cubature.py +21 -35
  140. scipy/integrate/tests/test_quadrature.py +6 -8
  141. scipy/integrate/tests/test_tanhsinh.py +56 -48
  142. scipy/interpolate/__init__.py +70 -58
  143. scipy/interpolate/_bary_rational.py +22 -22
  144. scipy/interpolate/_bsplines.py +119 -66
  145. scipy/interpolate/_cubic.py +65 -50
  146. scipy/interpolate/_dfitpack.cpython-312-darwin.so +0 -0
  147. scipy/interpolate/_dierckx.cpython-312-darwin.so +0 -0
  148. scipy/interpolate/_fitpack.cpython-312-darwin.so +0 -0
  149. scipy/interpolate/_fitpack2.py +9 -6
  150. scipy/interpolate/_fitpack_impl.py +32 -26
  151. scipy/interpolate/_fitpack_repro.py +23 -19
  152. scipy/interpolate/_interpnd.cpython-312-darwin.so +0 -0
  153. scipy/interpolate/_interpolate.py +30 -12
  154. scipy/interpolate/_ndbspline.py +13 -18
  155. scipy/interpolate/_ndgriddata.py +5 -8
  156. scipy/interpolate/_polyint.py +95 -31
  157. scipy/interpolate/_ppoly.cpython-312-darwin.so +0 -0
  158. scipy/interpolate/_rbf.py +2 -2
  159. scipy/interpolate/_rbfinterp.py +1 -1
  160. scipy/interpolate/_rbfinterp_pythran.cpython-312-darwin.so +0 -0
  161. scipy/interpolate/_rgi.py +31 -26
  162. scipy/interpolate/_rgi_cython.cpython-312-darwin.so +0 -0
  163. scipy/interpolate/dfitpack.py +0 -20
  164. scipy/interpolate/interpnd.py +1 -2
  165. scipy/interpolate/tests/test_bary_rational.py +2 -2
  166. scipy/interpolate/tests/test_bsplines.py +97 -1
  167. scipy/interpolate/tests/test_fitpack2.py +39 -1
  168. scipy/interpolate/tests/test_interpnd.py +32 -20
  169. scipy/interpolate/tests/test_interpolate.py +48 -4
  170. scipy/interpolate/tests/test_rgi.py +2 -1
  171. scipy/io/_fast_matrix_market/__init__.py +2 -0
  172. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  173. scipy/io/_harwell_boeing/hb.py +7 -11
  174. scipy/io/_idl.py +5 -7
  175. scipy/io/_netcdf.py +15 -5
  176. scipy/io/_test_fortran.cpython-312-darwin.so +0 -0
  177. scipy/io/arff/tests/test_arffread.py +3 -3
  178. scipy/io/matlab/__init__.py +5 -3
  179. scipy/io/matlab/_mio.py +4 -1
  180. scipy/io/matlab/_mio5.py +19 -13
  181. scipy/io/matlab/_mio5_utils.cpython-312-darwin.so +0 -0
  182. scipy/io/matlab/_mio_utils.cpython-312-darwin.so +0 -0
  183. scipy/io/matlab/_miobase.py +4 -1
  184. scipy/io/matlab/_streams.cpython-312-darwin.so +0 -0
  185. scipy/io/matlab/tests/test_mio.py +46 -18
  186. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  187. scipy/io/tests/test_mmio.py +7 -1
  188. scipy/io/tests/test_wavfile.py +41 -0
  189. scipy/io/wavfile.py +57 -10
  190. scipy/linalg/_basic.py +113 -86
  191. scipy/linalg/_cythonized_array_utils.cpython-312-darwin.so +0 -0
  192. scipy/linalg/_decomp.py +22 -9
  193. scipy/linalg/_decomp_cholesky.py +28 -13
  194. scipy/linalg/_decomp_cossin.py +45 -30
  195. scipy/linalg/_decomp_interpolative.cpython-312-darwin.so +0 -0
  196. scipy/linalg/_decomp_ldl.py +4 -1
  197. scipy/linalg/_decomp_lu.py +18 -6
  198. scipy/linalg/_decomp_lu_cython.cpython-312-darwin.so +0 -0
  199. scipy/linalg/_decomp_polar.py +2 -0
  200. scipy/linalg/_decomp_qr.py +6 -2
  201. scipy/linalg/_decomp_qz.py +3 -0
  202. scipy/linalg/_decomp_schur.py +3 -1
  203. scipy/linalg/_decomp_svd.py +13 -2
  204. scipy/linalg/_decomp_update.cpython-312-darwin.so +0 -0
  205. scipy/linalg/_expm_frechet.py +4 -0
  206. scipy/linalg/_fblas.cpython-312-darwin.so +0 -0
  207. scipy/linalg/_flapack.cpython-312-darwin.so +0 -0
  208. scipy/linalg/_linalg_pythran.cpython-312-darwin.so +0 -0
  209. scipy/linalg/_matfuncs.py +187 -4
  210. scipy/linalg/_matfuncs_expm.cpython-312-darwin.so +0 -0
  211. scipy/linalg/_matfuncs_schur_sqrtm.cpython-312-darwin.so +0 -0
  212. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  213. scipy/linalg/_matfuncs_sqrtm_triu.cpython-312-darwin.so +0 -0
  214. scipy/linalg/_procrustes.py +2 -0
  215. scipy/linalg/_sketches.py +17 -6
  216. scipy/linalg/_solve_toeplitz.cpython-312-darwin.so +0 -0
  217. scipy/linalg/_solvers.py +7 -2
  218. scipy/linalg/_special_matrices.py +26 -36
  219. scipy/linalg/cython_blas.cpython-312-darwin.so +0 -0
  220. scipy/linalg/cython_lapack.cpython-312-darwin.so +0 -0
  221. scipy/linalg/lapack.py +22 -2
  222. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  223. scipy/linalg/tests/test_basic.py +31 -16
  224. scipy/linalg/tests/test_batch.py +588 -0
  225. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  226. scipy/linalg/tests/test_decomp.py +40 -3
  227. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  228. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  229. scipy/linalg/tests/test_lapack.py +115 -7
  230. scipy/linalg/tests/test_matfuncs.py +157 -102
  231. scipy/linalg/tests/test_procrustes.py +0 -7
  232. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  233. scipy/linalg/tests/test_special_matrices.py +1 -5
  234. scipy/ndimage/__init__.py +1 -0
  235. scipy/ndimage/_cytest.cpython-312-darwin.so +0 -0
  236. scipy/ndimage/_delegators.py +8 -2
  237. scipy/ndimage/_filters.py +453 -5
  238. scipy/ndimage/_interpolation.py +36 -6
  239. scipy/ndimage/_measurements.py +4 -2
  240. scipy/ndimage/_morphology.py +5 -0
  241. scipy/ndimage/_nd_image.cpython-312-darwin.so +0 -0
  242. scipy/ndimage/_ni_docstrings.py +5 -1
  243. scipy/ndimage/_ni_label.cpython-312-darwin.so +0 -0
  244. scipy/ndimage/_ni_support.py +1 -5
  245. scipy/ndimage/_rank_filter_1d.cpython-312-darwin.so +0 -0
  246. scipy/ndimage/_support_alternative_backends.py +18 -6
  247. scipy/ndimage/tests/test_filters.py +370 -259
  248. scipy/ndimage/tests/test_fourier.py +7 -9
  249. scipy/ndimage/tests/test_interpolation.py +68 -61
  250. scipy/ndimage/tests/test_measurements.py +18 -35
  251. scipy/ndimage/tests/test_morphology.py +143 -131
  252. scipy/ndimage/tests/test_splines.py +1 -3
  253. scipy/odr/__odrpack.cpython-312-darwin.so +0 -0
  254. scipy/optimize/_basinhopping.py +13 -7
  255. scipy/optimize/_bglu_dense.cpython-312-darwin.so +0 -0
  256. scipy/optimize/_bracket.py +17 -24
  257. scipy/optimize/_chandrupatla.py +9 -10
  258. scipy/optimize/_cobyla_py.py +104 -123
  259. scipy/optimize/_constraints.py +14 -10
  260. scipy/optimize/_differentiable_functions.py +371 -230
  261. scipy/optimize/_differentialevolution.py +4 -3
  262. scipy/optimize/_direct.cpython-312-darwin.so +0 -0
  263. scipy/optimize/_dual_annealing.py +1 -1
  264. scipy/optimize/_elementwise.py +1 -4
  265. scipy/optimize/_group_columns.cpython-312-darwin.so +0 -0
  266. scipy/optimize/_lbfgsb.cpython-312-darwin.so +0 -0
  267. scipy/optimize/_lbfgsb_py.py +57 -16
  268. scipy/optimize/_linprog_doc.py +2 -2
  269. scipy/optimize/_linprog_highs.py +2 -2
  270. scipy/optimize/_linprog_ip.py +25 -10
  271. scipy/optimize/_linprog_util.py +14 -16
  272. scipy/optimize/_lsap.cpython-312-darwin.so +0 -0
  273. scipy/optimize/_lsq/common.py +3 -3
  274. scipy/optimize/_lsq/dogbox.py +16 -2
  275. scipy/optimize/_lsq/givens_elimination.cpython-312-darwin.so +0 -0
  276. scipy/optimize/_lsq/least_squares.py +198 -126
  277. scipy/optimize/_lsq/lsq_linear.py +6 -6
  278. scipy/optimize/_lsq/trf.py +35 -8
  279. scipy/optimize/_milp.py +3 -1
  280. scipy/optimize/_minimize.py +105 -36
  281. scipy/optimize/_minpack.cpython-312-darwin.so +0 -0
  282. scipy/optimize/_minpack_py.py +21 -14
  283. scipy/optimize/_moduleTNC.cpython-312-darwin.so +0 -0
  284. scipy/optimize/_nnls.py +20 -21
  285. scipy/optimize/_nonlin.py +34 -3
  286. scipy/optimize/_numdiff.py +288 -110
  287. scipy/optimize/_optimize.py +86 -48
  288. scipy/optimize/_pava_pybind.cpython-312-darwin.so +0 -0
  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-312-darwin.so +0 -0
  295. scipy/optimize/_spectral.py +1 -1
  296. scipy/optimize/_tnc.py +8 -1
  297. scipy/optimize/_trlib/_trlib.cpython-312-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-312-darwin.so +0 -0
  309. scipy/optimize/_zeros_py.py +97 -17
  310. scipy/optimize/cython_optimize/_zeros.cpython-312-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 +36 -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 +6 -6
  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/_max_len_seq_inner.cpython-312-darwin.so +0 -0
  342. scipy/signal/_peak_finding_utils.cpython-312-darwin.so +0 -0
  343. scipy/signal/_polyutils.py +172 -0
  344. scipy/signal/_short_time_fft.py +519 -70
  345. scipy/signal/_signal_api.py +30 -0
  346. scipy/signal/_signaltools.py +719 -399
  347. scipy/signal/_sigtools.cpython-312-darwin.so +0 -0
  348. scipy/signal/_sosfilt.cpython-312-darwin.so +0 -0
  349. scipy/signal/_spectral_py.py +230 -50
  350. scipy/signal/_spline.cpython-312-darwin.so +0 -0
  351. scipy/signal/_spline_filters.py +108 -68
  352. scipy/signal/_support_alternative_backends.py +73 -0
  353. scipy/signal/_upfirdn.py +4 -1
  354. scipy/signal/_upfirdn_apply.cpython-312-darwin.so +0 -0
  355. scipy/signal/_waveforms.py +2 -11
  356. scipy/signal/_wavelets.py +1 -1
  357. scipy/signal/fir_filter_design.py +1 -0
  358. scipy/signal/spline.py +4 -11
  359. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  360. scipy/signal/tests/test_bsplines.py +114 -79
  361. scipy/signal/tests/test_cont2discrete.py +9 -2
  362. scipy/signal/tests/test_filter_design.py +721 -481
  363. scipy/signal/tests/test_fir_filter_design.py +332 -140
  364. scipy/signal/tests/test_savitzky_golay.py +4 -3
  365. scipy/signal/tests/test_short_time_fft.py +221 -3
  366. scipy/signal/tests/test_signaltools.py +2144 -1348
  367. scipy/signal/tests/test_spectral.py +50 -6
  368. scipy/signal/tests/test_splines.py +161 -96
  369. scipy/signal/tests/test_upfirdn.py +84 -50
  370. scipy/signal/tests/test_waveforms.py +20 -0
  371. scipy/signal/tests/test_windows.py +607 -466
  372. scipy/signal/windows/_windows.py +287 -148
  373. scipy/sparse/__init__.py +23 -4
  374. scipy/sparse/_base.py +270 -108
  375. scipy/sparse/_bsr.py +7 -4
  376. scipy/sparse/_compressed.py +59 -231
  377. scipy/sparse/_construct.py +90 -38
  378. scipy/sparse/_coo.py +115 -181
  379. scipy/sparse/_csc.py +4 -4
  380. scipy/sparse/_csparsetools.cpython-312-darwin.so +0 -0
  381. scipy/sparse/_csr.py +2 -2
  382. scipy/sparse/_data.py +48 -48
  383. scipy/sparse/_dia.py +105 -18
  384. scipy/sparse/_dok.py +0 -23
  385. scipy/sparse/_index.py +4 -4
  386. scipy/sparse/_matrix.py +23 -0
  387. scipy/sparse/_sparsetools.cpython-312-darwin.so +0 -0
  388. scipy/sparse/_sputils.py +37 -22
  389. scipy/sparse/base.py +0 -9
  390. scipy/sparse/bsr.py +0 -14
  391. scipy/sparse/compressed.py +0 -23
  392. scipy/sparse/construct.py +0 -6
  393. scipy/sparse/coo.py +0 -14
  394. scipy/sparse/csc.py +0 -3
  395. scipy/sparse/csgraph/_flow.cpython-312-darwin.so +0 -0
  396. scipy/sparse/csgraph/_matching.cpython-312-darwin.so +0 -0
  397. scipy/sparse/csgraph/_min_spanning_tree.cpython-312-darwin.so +0 -0
  398. scipy/sparse/csgraph/_reordering.cpython-312-darwin.so +0 -0
  399. scipy/sparse/csgraph/_shortest_path.cpython-312-darwin.so +0 -0
  400. scipy/sparse/csgraph/_tools.cpython-312-darwin.so +0 -0
  401. scipy/sparse/csgraph/_traversal.cpython-312-darwin.so +0 -0
  402. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  403. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  404. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  405. scipy/sparse/csr.py +0 -5
  406. scipy/sparse/data.py +1 -6
  407. scipy/sparse/dia.py +0 -7
  408. scipy/sparse/dok.py +0 -10
  409. scipy/sparse/linalg/_dsolve/_superlu.cpython-312-darwin.so +0 -0
  410. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  411. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  412. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-312-darwin.so +0 -0
  413. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  414. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  415. scipy/sparse/linalg/_interface.py +17 -18
  416. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  417. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  418. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  419. scipy/sparse/linalg/_isolve/minres.py +5 -5
  420. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  421. scipy/sparse/linalg/_isolve/utils.py +2 -8
  422. scipy/sparse/linalg/_matfuncs.py +1 -1
  423. scipy/sparse/linalg/_norm.py +1 -1
  424. scipy/sparse/linalg/_propack/_cpropack.cpython-312-darwin.so +0 -0
  425. scipy/sparse/linalg/_propack/_dpropack.cpython-312-darwin.so +0 -0
  426. scipy/sparse/linalg/_propack/_spropack.cpython-312-darwin.so +0 -0
  427. scipy/sparse/linalg/_propack/_zpropack.cpython-312-darwin.so +0 -0
  428. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  429. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  430. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  431. scipy/sparse/tests/test_base.py +214 -42
  432. scipy/sparse/tests/test_common1d.py +7 -7
  433. scipy/sparse/tests/test_construct.py +1 -1
  434. scipy/sparse/tests/test_coo.py +272 -4
  435. scipy/sparse/tests/test_sparsetools.py +5 -0
  436. scipy/sparse/tests/test_sputils.py +36 -7
  437. scipy/spatial/_ckdtree.cpython-312-darwin.so +0 -0
  438. scipy/spatial/_distance_pybind.cpython-312-darwin.so +0 -0
  439. scipy/spatial/_distance_wrap.cpython-312-darwin.so +0 -0
  440. scipy/spatial/_hausdorff.cpython-312-darwin.so +0 -0
  441. scipy/spatial/_qhull.cpython-312-darwin.so +0 -0
  442. scipy/spatial/_voronoi.cpython-312-darwin.so +0 -0
  443. scipy/spatial/distance.py +49 -42
  444. scipy/spatial/tests/test_distance.py +15 -1
  445. scipy/spatial/tests/test_kdtree.py +1 -0
  446. scipy/spatial/tests/test_qhull.py +7 -2
  447. scipy/spatial/transform/__init__.py +5 -3
  448. scipy/spatial/transform/_rigid_transform.cpython-312-darwin.so +0 -0
  449. scipy/spatial/transform/_rotation.cpython-312-darwin.so +0 -0
  450. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  451. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  452. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  453. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  454. scipy/special/__init__.py +1 -47
  455. scipy/special/_add_newdocs.py +34 -772
  456. scipy/special/_basic.py +22 -25
  457. scipy/special/_comb.cpython-312-darwin.so +0 -0
  458. scipy/special/_ellip_harm_2.cpython-312-darwin.so +0 -0
  459. scipy/special/_gufuncs.cpython-312-darwin.so +0 -0
  460. scipy/special/_logsumexp.py +67 -58
  461. scipy/special/_orthogonal.pyi +1 -1
  462. scipy/special/_specfun.cpython-312-darwin.so +0 -0
  463. scipy/special/_special_ufuncs.cpython-312-darwin.so +0 -0
  464. scipy/special/_spherical_bessel.py +4 -4
  465. scipy/special/_support_alternative_backends.py +212 -119
  466. scipy/special/_test_internal.cpython-312-darwin.so +0 -0
  467. scipy/special/_testutils.py +4 -4
  468. scipy/special/_ufuncs.cpython-312-darwin.so +0 -0
  469. scipy/special/_ufuncs.pyi +1 -0
  470. scipy/special/_ufuncs.pyx +215 -1400
  471. scipy/special/_ufuncs_cxx.cpython-312-darwin.so +0 -0
  472. scipy/special/_ufuncs_cxx.pxd +2 -15
  473. scipy/special/_ufuncs_cxx.pyx +5 -44
  474. scipy/special/_ufuncs_cxx_defs.h +2 -16
  475. scipy/special/_ufuncs_defs.h +0 -8
  476. scipy/special/cython_special.cpython-312-darwin.so +0 -0
  477. scipy/special/cython_special.pxd +1 -1
  478. scipy/special/tests/_cython_examples/meson.build +10 -1
  479. scipy/special/tests/test_basic.py +153 -20
  480. scipy/special/tests/test_boost_ufuncs.py +3 -0
  481. scipy/special/tests/test_cdflib.py +35 -11
  482. scipy/special/tests/test_gammainc.py +16 -0
  483. scipy/special/tests/test_hyp2f1.py +2 -2
  484. scipy/special/tests/test_log1mexp.py +85 -0
  485. scipy/special/tests/test_logsumexp.py +206 -64
  486. scipy/special/tests/test_mpmath.py +1 -0
  487. scipy/special/tests/test_nan_inputs.py +1 -1
  488. scipy/special/tests/test_orthogonal.py +17 -18
  489. scipy/special/tests/test_sf_error.py +3 -2
  490. scipy/special/tests/test_sph_harm.py +6 -7
  491. scipy/special/tests/test_support_alternative_backends.py +211 -76
  492. scipy/stats/__init__.py +4 -1
  493. scipy/stats/_ansari_swilk_statistics.cpython-312-darwin.so +0 -0
  494. scipy/stats/_axis_nan_policy.py +5 -12
  495. scipy/stats/_biasedurn.cpython-312-darwin.so +0 -0
  496. scipy/stats/_continued_fraction.py +387 -0
  497. scipy/stats/_continuous_distns.py +277 -310
  498. scipy/stats/_correlation.py +1 -1
  499. scipy/stats/_covariance.py +6 -3
  500. scipy/stats/_discrete_distns.py +39 -32
  501. scipy/stats/_distn_infrastructure.py +39 -12
  502. scipy/stats/_distribution_infrastructure.py +900 -238
  503. scipy/stats/_entropy.py +9 -10
  504. scipy/{_lib → stats}/_finite_differences.py +1 -1
  505. scipy/stats/_hypotests.py +83 -50
  506. scipy/stats/_kde.py +53 -49
  507. scipy/stats/_ksstats.py +1 -1
  508. scipy/stats/_levy_stable/__init__.py +7 -15
  509. scipy/stats/_levy_stable/levyst.cpython-312-darwin.so +0 -0
  510. scipy/stats/_morestats.py +118 -73
  511. scipy/stats/_mstats_basic.py +13 -17
  512. scipy/stats/_mstats_extras.py +8 -8
  513. scipy/stats/_multivariate.py +89 -113
  514. scipy/stats/_new_distributions.py +97 -20
  515. scipy/stats/_page_trend_test.py +12 -5
  516. scipy/stats/_probability_distribution.py +265 -43
  517. scipy/stats/_qmc.py +14 -9
  518. scipy/stats/_qmc_cy.cpython-312-darwin.so +0 -0
  519. scipy/stats/_qmvnt.py +16 -95
  520. scipy/stats/_qmvnt_cy.cpython-312-darwin.so +0 -0
  521. scipy/stats/_quantile.py +335 -0
  522. scipy/stats/_rcont/rcont.cpython-312-darwin.so +0 -0
  523. scipy/stats/_resampling.py +4 -29
  524. scipy/stats/_sampling.py +1 -1
  525. scipy/stats/_sobol.cpython-312-darwin.so +0 -0
  526. scipy/stats/_stats.cpython-312-darwin.so +0 -0
  527. scipy/stats/_stats_mstats_common.py +21 -2
  528. scipy/stats/_stats_py.py +550 -476
  529. scipy/stats/_stats_pythran.cpython-312-darwin.so +0 -0
  530. scipy/stats/_unuran/unuran_wrapper.cpython-312-darwin.so +0 -0
  531. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  532. scipy/stats/_variation.py +6 -8
  533. scipy/stats/_wilcoxon.py +13 -7
  534. scipy/stats/tests/common_tests.py +6 -4
  535. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  536. scipy/stats/tests/test_continued_fraction.py +173 -0
  537. scipy/stats/tests/test_continuous.py +379 -60
  538. scipy/stats/tests/test_continuous_basic.py +18 -12
  539. scipy/stats/tests/test_discrete_basic.py +14 -8
  540. scipy/stats/tests/test_discrete_distns.py +16 -16
  541. scipy/stats/tests/test_distributions.py +95 -75
  542. scipy/stats/tests/test_entropy.py +40 -48
  543. scipy/stats/tests/test_fit.py +4 -3
  544. scipy/stats/tests/test_hypotests.py +153 -24
  545. scipy/stats/tests/test_kdeoth.py +109 -41
  546. scipy/stats/tests/test_marray.py +289 -0
  547. scipy/stats/tests/test_morestats.py +79 -47
  548. scipy/stats/tests/test_mstats_basic.py +3 -3
  549. scipy/stats/tests/test_multivariate.py +434 -83
  550. scipy/stats/tests/test_qmc.py +13 -10
  551. scipy/stats/tests/test_quantile.py +199 -0
  552. scipy/stats/tests/test_rank.py +119 -112
  553. scipy/stats/tests/test_resampling.py +47 -56
  554. scipy/stats/tests/test_sampling.py +9 -4
  555. scipy/stats/tests/test_stats.py +799 -939
  556. scipy/stats/tests/test_variation.py +8 -6
  557. scipy/version.py +2 -2
  558. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  559. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  560. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +561 -568
  561. scipy-1.16.0rc2.dist-info/WHEEL +6 -0
  562. scipy/_lib/array_api_extra/_funcs.py +0 -484
  563. scipy/_lib/array_api_extra/_typing.py +0 -8
  564. scipy/interpolate/_bspl.cpython-312-darwin.so +0 -0
  565. scipy/optimize/_cobyla.cpython-312-darwin.so +0 -0
  566. scipy/optimize/_cython_nnls.cpython-312-darwin.so +0 -0
  567. scipy/optimize/_slsqp.cpython-312-darwin.so +0 -0
  568. scipy/spatial/qhull_src/COPYING.txt +0 -38
  569. scipy/special/libsf_error_state.dylib +0 -0
  570. scipy/special/tests/test_log_softmax.py +0 -109
  571. scipy/special/tests/test_xsf_cuda.py +0 -114
  572. scipy/special/xsf/binom.h +0 -89
  573. scipy/special/xsf/cdflib.h +0 -100
  574. scipy/special/xsf/cephes/airy.h +0 -307
  575. scipy/special/xsf/cephes/besselpoly.h +0 -51
  576. scipy/special/xsf/cephes/beta.h +0 -257
  577. scipy/special/xsf/cephes/cbrt.h +0 -131
  578. scipy/special/xsf/cephes/chbevl.h +0 -85
  579. scipy/special/xsf/cephes/chdtr.h +0 -193
  580. scipy/special/xsf/cephes/const.h +0 -87
  581. scipy/special/xsf/cephes/ellie.h +0 -293
  582. scipy/special/xsf/cephes/ellik.h +0 -251
  583. scipy/special/xsf/cephes/ellpe.h +0 -107
  584. scipy/special/xsf/cephes/ellpk.h +0 -117
  585. scipy/special/xsf/cephes/expn.h +0 -260
  586. scipy/special/xsf/cephes/gamma.h +0 -398
  587. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  588. scipy/special/xsf/cephes/hyperg.h +0 -361
  589. scipy/special/xsf/cephes/i0.h +0 -149
  590. scipy/special/xsf/cephes/i1.h +0 -158
  591. scipy/special/xsf/cephes/igam.h +0 -421
  592. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  593. scipy/special/xsf/cephes/igami.h +0 -313
  594. scipy/special/xsf/cephes/j0.h +0 -225
  595. scipy/special/xsf/cephes/j1.h +0 -198
  596. scipy/special/xsf/cephes/jv.h +0 -715
  597. scipy/special/xsf/cephes/k0.h +0 -164
  598. scipy/special/xsf/cephes/k1.h +0 -163
  599. scipy/special/xsf/cephes/kn.h +0 -243
  600. scipy/special/xsf/cephes/lanczos.h +0 -112
  601. scipy/special/xsf/cephes/ndtr.h +0 -275
  602. scipy/special/xsf/cephes/poch.h +0 -85
  603. scipy/special/xsf/cephes/polevl.h +0 -167
  604. scipy/special/xsf/cephes/psi.h +0 -194
  605. scipy/special/xsf/cephes/rgamma.h +0 -111
  606. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  607. scipy/special/xsf/cephes/shichi.h +0 -248
  608. scipy/special/xsf/cephes/sici.h +0 -224
  609. scipy/special/xsf/cephes/sindg.h +0 -221
  610. scipy/special/xsf/cephes/tandg.h +0 -139
  611. scipy/special/xsf/cephes/trig.h +0 -58
  612. scipy/special/xsf/cephes/unity.h +0 -186
  613. scipy/special/xsf/cephes/zeta.h +0 -172
  614. scipy/special/xsf/config.h +0 -304
  615. scipy/special/xsf/digamma.h +0 -205
  616. scipy/special/xsf/error.h +0 -57
  617. scipy/special/xsf/evalpoly.h +0 -47
  618. scipy/special/xsf/expint.h +0 -266
  619. scipy/special/xsf/hyp2f1.h +0 -694
  620. scipy/special/xsf/iv_ratio.h +0 -173
  621. scipy/special/xsf/lambertw.h +0 -150
  622. scipy/special/xsf/loggamma.h +0 -163
  623. scipy/special/xsf/sici.h +0 -200
  624. scipy/special/xsf/tools.h +0 -427
  625. scipy/special/xsf/trig.h +0 -164
  626. scipy/special/xsf/wright_bessel.h +0 -843
  627. scipy/special/xsf/zlog1.h +0 -35
  628. scipy/stats/_mvn.cpython-312-darwin.so +0 -0
  629. scipy-1.15.3.dist-info/WHEEL +0 -4
@@ -1135,7 +1135,7 @@ class TestHyp2f1:
1135
1135
  c=8.5,
1136
1136
  z=(0.7368421052631575+0.5263157894736841j),
1137
1137
  expected=(6.468457061368628+24.190040684917374j),
1138
- rtol=5e-16,
1138
+ rtol=6e-16,
1139
1139
  ),
1140
1140
  ),
1141
1141
  pytest.param(
@@ -1662,7 +1662,7 @@ class TestHyp2f1:
1662
1662
  c=4.0013768449590685,
1663
1663
  z=(0.3413793103448277-0.8724137931034484j),
1664
1664
  expected=(0.2722302180888523-0.21790187837266162j),
1665
- rtol=1e-12,
1665
+ rtol=1.2e-12,
1666
1666
  ),
1667
1667
  ),
1668
1668
  pytest.param(
@@ -0,0 +1,85 @@
1
+ import numpy as np
2
+ import pytest
3
+
4
+ from numpy.testing import assert_allclose, assert_equal
5
+
6
+ from scipy.special._ufuncs import _log1mexp
7
+
8
+ # # Test cases generated with the script
9
+ #
10
+ # import numpy as np
11
+
12
+ # from mpmath import mp
13
+
14
+
15
+ # def mp_log1mexp(x):
16
+ # with mp.workdps(324):
17
+ # return float(mp.log(mp.one - mp.exp(x)))
18
+
19
+ # X = np.concat([-np.logspace(-1, -300, 20), np.linspace(-745, -1, 20)])
20
+
21
+ # cases = [(float(x), mp_log1mexp(x)) for x in X]
22
+
23
+ @pytest.mark.parametrize(
24
+ "x,expected",
25
+ [
26
+ (-0.1, -2.3521684610440907),
27
+ (-1.8329807108324374e-17, -38.538003135374026),
28
+ (-3.359818286283788e-33, -74.773421177754),
29
+ (-6.1584821106602796e-49, -111.00883922013399),
30
+ (-1.1288378916846929e-64, -147.24425726251397),
31
+ (-2.0691380811148324e-80, -183.47967530489393),
32
+ (-3.792690190732269e-96, -219.71509334727392),
33
+ (-6.951927961775534e-112, -255.95051138965394),
34
+ (-1.2742749857031425e-127, -292.1859294320339),
35
+ (-2.3357214690901785e-143, -328.42134747441384),
36
+ (-4.281332398719571e-159, -364.6567655167938),
37
+ (-7.847599703514559e-175, -400.8921835591739),
38
+ (-1.4384498882876776e-190, -437.1276016015538),
39
+ (-2.6366508987304307e-206, -473.3630196439338),
40
+ (-4.832930238571653e-222, -509.59843768631384),
41
+ (-8.858667904100796e-238, -545.8338557286938),
42
+ (-1.623776739188744e-253, -582.0692737710738),
43
+ (-2.9763514416312156e-269, -618.3046918134538),
44
+ (-5.455594781168782e-285, -654.5401098558336),
45
+ (-1e-300, -690.7755278982137),
46
+ (-745.0, -5e-324),
47
+ (-705.8421052631579, -2.8619931451743316e-307),
48
+ (-666.6842105263158, -2.9021923726875757e-290),
49
+ (-627.5263157894738, -2.9429562339405562e-273),
50
+ (-588.3684210526316, -2.9842926597143714e-256),
51
+ (-549.2105263157895, -3.0262096921839423e-239),
52
+ (-510.0526315789474, -3.0687154864846747e-222),
53
+ (-470.89473684210526, -3.1118183122979086e-205),
54
+ (-431.7368421052632, -3.155526555459449e-188),
55
+ (-392.5789473684211, -3.1998487195921207e-171),
56
+ (-353.42105263157896, -3.2447934277596653e-154),
57
+ (-314.2631578947369, -3.2903694241438367e-137),
58
+ (-275.1052631578948, -3.3365855757467166e-120),
59
+ (-235.94736842105266, -3.3834508741152875e-103),
60
+ (-196.78947368421052, -3.4309744370903894e-86),
61
+ (-157.63157894736844, -3.4791655105810003e-69),
62
+ (-118.47368421052636, -3.528033470363468e-52),
63
+ (-79.31578947368428, -3.577587823905024e-35),
64
+ (-40.157894736842195, -3.627838212213697e-18),
65
+ (-1.0, -0.4586751453870819),
66
+ ]
67
+ )
68
+ def test_log1mexp(x, expected):
69
+ observed = _log1mexp(x)
70
+ assert_allclose(observed, expected, rtol=1e-15)
71
+
72
+
73
+ @pytest.mark.parametrize("x", [1.1, 1e10, np.inf])
74
+ def test_log1mexp_out_of_domain(x):
75
+ observed = _log1mexp(x)
76
+ assert np.isnan(observed)
77
+
78
+
79
+ @pytest.mark.parametrize(
80
+ "x,expected",
81
+ [(-np.inf, -0.0), (0.0, -np.inf), (-0.0, -np.inf), (np.nan, np.nan)]
82
+ )
83
+ def test_log1mexp_extreme(x, expected):
84
+ observed = _log1mexp(x)
85
+ assert_equal(expected, observed)
@@ -1,15 +1,15 @@
1
+ import itertools as it
1
2
  import math
2
3
  import pytest
3
4
 
4
5
  import numpy as np
5
- from numpy.testing import assert_allclose
6
6
 
7
- from scipy.conftest import array_api_compatible
8
- from scipy._lib._array_api import array_namespace, is_array_api_strict
7
+ from scipy._lib._array_api import (is_array_api_strict, make_xp_test_case,
8
+ xp_default_dtype, xp_device)
9
9
  from scipy._lib._array_api_no_0d import (xp_assert_equal, xp_assert_close,
10
10
  xp_assert_less)
11
11
 
12
- from scipy.special import logsumexp, softmax
12
+ from scipy.special import log_softmax, logsumexp, softmax
13
13
  from scipy.special._logsumexp import _wrap_radians
14
14
 
15
15
 
@@ -17,23 +17,22 @@ dtypes = ['float32', 'float64', 'int32', 'int64', 'complex64', 'complex128']
17
17
  integral_dtypes = ['int32', 'int64']
18
18
 
19
19
 
20
- @array_api_compatible
21
- @pytest.mark.usefixtures("skip_xp_backends")
22
- @pytest.mark.skip_xp_backends('jax.numpy',
23
- reason="JAX arrays do not support item assignment")
24
20
  def test_wrap_radians(xp):
25
21
  x = xp.asarray([-math.pi-1, -math.pi, -1, -1e-300,
26
22
  0, 1e-300, 1, math.pi, math.pi+1])
27
23
  ref = xp.asarray([math.pi-1, math.pi, -1, -1e-300,
28
24
  0, 1e-300, 1, math.pi, -math.pi+1])
29
- res = _wrap_radians(x, xp)
25
+ res = _wrap_radians(x, xp=xp)
30
26
  xp_assert_close(res, ref, atol=0)
31
27
 
32
28
 
33
- @array_api_compatible
34
- @pytest.mark.usefixtures("skip_xp_backends")
35
- @pytest.mark.skip_xp_backends('jax.numpy',
36
- reason="JAX arrays do not support item assignment")
29
+ # numpy warning filters don't work for dask (dask/dask#3245)
30
+ # (also we should not expect the numpy warning filter to work for any Array API
31
+ # library)
32
+ @pytest.mark.filterwarnings("ignore:invalid value encountered:RuntimeWarning")
33
+ @pytest.mark.filterwarnings("ignore:divide by zero encountered:RuntimeWarning")
34
+ @pytest.mark.filterwarnings("ignore:overflow encountered:RuntimeWarning")
35
+ @make_xp_test_case(logsumexp)
37
36
  class TestLogSumExp:
38
37
  def test_logsumexp(self, xp):
39
38
  # Test with zero-size array
@@ -79,8 +78,7 @@ class TestLogSumExp:
79
78
  xp_assert_close(logsumexp(a, axis=-1), ref)
80
79
 
81
80
  # Test keeping dimensions
82
- xp_test = array_namespace(a) # `torch` needs `expand_dims`
83
- ref = xp_test.expand_dims(ref, axis=-1)
81
+ ref = xp.expand_dims(ref, axis=-1)
84
82
  xp_assert_close(logsumexp(a, axis=-1, keepdims=True), ref)
85
83
 
86
84
  # Test multiple axes
@@ -170,23 +168,19 @@ class TestLogSumExp:
170
168
  logsumexp(a, b=b)
171
169
 
172
170
  @pytest.mark.parametrize('arg', (1, [1, 2, 3]))
173
- @pytest.mark.skip_xp_backends(np_only=True)
174
- def test_xp_invalid_input(self, arg, xp):
171
+ def test_xp_invalid_input(self, arg):
175
172
  assert logsumexp(arg) == logsumexp(np.asarray(np.atleast_1d(arg)))
176
173
 
177
- @pytest.mark.skip_xp_backends(np_only=True,
178
- reason="Lists correspond with NumPy backend")
179
- def test_list(self, xp):
174
+ def test_array_like(self):
180
175
  a = [1000, 1000]
181
- desired = xp.asarray(1000.0 + math.log(2.0), dtype=np.float64)
176
+ desired = np.asarray(1000.0 + math.log(2.0))
182
177
  xp_assert_close(logsumexp(a), desired)
183
178
 
184
179
  @pytest.mark.parametrize('dtype', dtypes)
185
180
  def test_dtypes_a(self, dtype, xp):
186
181
  dtype = getattr(xp, dtype)
187
182
  a = xp.asarray([1000., 1000.], dtype=dtype)
188
- xp_test = array_namespace(a) # torch needs compatible `isdtype`
189
- desired_dtype = (xp.asarray(1.).dtype if xp_test.isdtype(dtype, 'integral')
183
+ desired_dtype = (xp.asarray(1.).dtype if xp.isdtype(dtype, 'integral')
190
184
  else dtype) # true for all libraries tested
191
185
  desired = xp.asarray(1000.0 + math.log(2.0), dtype=desired_dtype)
192
186
  xp_assert_close(logsumexp(a), desired)
@@ -198,16 +192,18 @@ class TestLogSumExp:
198
192
  xp_dtype_b = getattr(xp, dtype_b)
199
193
  a = xp.asarray([2, 1], dtype=xp_dtype_a)
200
194
  b = xp.asarray([1, -1], dtype=xp_dtype_b)
201
- xp_test = array_namespace(a, b) # torch needs compatible result_type
202
195
  if is_array_api_strict(xp):
196
+ # special-case for `TypeError: array_api_strict.float32 and
197
+ # and array_api_strict.int64 cannot be type promoted together`
203
198
  xp_float_dtypes = [dtype for dtype in [xp_dtype_a, xp_dtype_b]
204
- if not xp_test.isdtype(dtype, 'integral')]
199
+ if not xp.isdtype(dtype, 'integral')]
205
200
  if len(xp_float_dtypes) < 2: # at least one is integral
206
201
  xp_float_dtypes.append(xp.asarray(1.).dtype)
207
- desired_dtype = xp_test.result_type(*xp_float_dtypes)
202
+ desired_dtype = xp.result_type(*xp_float_dtypes)
208
203
  else:
209
- # True for all libraries tested
210
- desired_dtype = xp_test.result_type(xp_dtype_a, xp_dtype_b, xp.float32)
204
+ desired_dtype = xp.result_type(xp_dtype_a, xp_dtype_b)
205
+ if xp.isdtype(desired_dtype, 'integral'):
206
+ desired_dtype = xp_default_dtype(xp)
211
207
  desired = xp.asarray(math.log(math.exp(2) - math.exp(1)), dtype=desired_dtype)
212
208
  xp_assert_close(logsumexp(a, b=b), desired)
213
209
 
@@ -234,7 +230,7 @@ class TestLogSumExp:
234
230
 
235
231
  res = logsumexp(x, axis=1)
236
232
  ref = xp.log(xp.sum(xp.exp(x), axis=1))
237
- max = xp.full_like(xp.imag(res), xp.asarray(xp.pi))
233
+ max = xp.full_like(xp.imag(res), xp.pi)
238
234
  xp_assert_less(xp.abs(xp.imag(res)), max)
239
235
  xp_assert_close(res, ref)
240
236
 
@@ -257,6 +253,54 @@ class TestLogSumExp:
257
253
  xp_assert_close(xp.real(res), xp.real(ref))
258
254
  xp_assert_close(xp.imag(res), xp.imag(ref), atol=0, rtol=1e-15)
259
255
 
256
+
257
+ @pytest.mark.parametrize('x,y', it.product(
258
+ [
259
+ -np.inf,
260
+ np.inf,
261
+ complex(-np.inf, 0.),
262
+ complex(-np.inf, -0.),
263
+ complex(-np.inf, np.inf),
264
+ complex(-np.inf, -np.inf),
265
+ complex(np.inf, 0.),
266
+ complex(np.inf, -0.),
267
+ complex(np.inf, np.inf),
268
+ complex(np.inf, -np.inf),
269
+ # Phase in each quadrant.
270
+ complex(-np.inf, 0.7533),
271
+ complex(-np.inf, 2.3562),
272
+ complex(-np.inf, 3.9270),
273
+ complex(-np.inf, 5.4978),
274
+ complex(np.inf, 0.7533),
275
+ complex(np.inf, 2.3562),
276
+ complex(np.inf, 3.9270),
277
+ complex(np.inf, 5.4978),
278
+ ], repeat=2)
279
+ )
280
+ def test_gh22601_infinite_elements(self, x, y, xp):
281
+ # Test that `logsumexp` does reasonable things in the presence of
282
+ # real and complex infinities.
283
+ res = logsumexp(xp.asarray([x, y]))
284
+ ref = xp.log(xp.sum(xp.exp(xp.asarray([x, y]))))
285
+ xp_assert_equal(res, ref)
286
+
287
+ def test_no_writeback(self, xp):
288
+ """Test that logsumexp doesn't accidentally write back to its parameters."""
289
+ a = xp.asarray([5., 4.])
290
+ b = xp.asarray([3., 2.])
291
+ logsumexp(a)
292
+ logsumexp(a, b=b)
293
+ xp_assert_equal(a, xp.asarray([5., 4.]))
294
+ xp_assert_equal(b, xp.asarray([3., 2.]))
295
+
296
+ @pytest.mark.parametrize("x_raw", [1.0, 1.0j, []])
297
+ def test_device(self, x_raw, xp, devices):
298
+ """Test input device propagation to output."""
299
+ for d in devices:
300
+ x = xp.asarray(x_raw, device=d)
301
+ assert xp_device(logsumexp(x)) == xp_device(x)
302
+ assert xp_device(logsumexp(x, b=x)) == xp_device(x)
303
+
260
304
  def test_gh22903(self, xp):
261
305
  # gh-22903 reported that `logsumexp` produced NaN where the weight associated
262
306
  # with the max magnitude element was negative and `return_sign=False`, even if
@@ -272,56 +316,154 @@ class TestLogSumExp:
272
316
  xp_assert_close(logsumexp(a, b=b), xp.asarray(xp.nan))
273
317
 
274
318
 
319
+ @make_xp_test_case(softmax)
275
320
  class TestSoftmax:
276
- def test_softmax_fixtures(self):
277
- assert_allclose(softmax([1000, 0, 0, 0]), np.array([1, 0, 0, 0]),
278
- rtol=1e-13)
279
- assert_allclose(softmax([1, 1]), np.array([.5, .5]), rtol=1e-13)
280
- assert_allclose(softmax([0, 1]), np.array([1, np.e])/(1 + np.e),
321
+ def test_softmax_fixtures(self, xp):
322
+ xp_assert_close(softmax(xp.asarray([1000., 0., 0., 0.])),
323
+ xp.asarray([1., 0., 0., 0.]), rtol=1e-13)
324
+ xp_assert_close(softmax(xp.asarray([1., 1.])),
325
+ xp.asarray([.5, .5]), rtol=1e-13)
326
+ xp_assert_close(softmax(xp.asarray([0., 1.])),
327
+ xp.asarray([1., np.e])/(1 + np.e),
281
328
  rtol=1e-13)
282
329
 
283
330
  # Expected value computed using mpmath (with mpmath.mp.dps = 200) and then
284
331
  # converted to float.
285
- x = np.arange(4)
286
- expected = np.array([0.03205860328008499,
287
- 0.08714431874203256,
288
- 0.23688281808991013,
289
- 0.6439142598879722])
332
+ x = xp.arange(4, dtype=xp.float64)
333
+ expected = xp.asarray([0.03205860328008499,
334
+ 0.08714431874203256,
335
+ 0.23688281808991013,
336
+ 0.6439142598879722], dtype=xp.float64)
290
337
 
291
- assert_allclose(softmax(x), expected, rtol=1e-13)
338
+ xp_assert_close(softmax(x), expected, rtol=1e-13)
292
339
 
293
340
  # Translation property. If all the values are changed by the same amount,
294
341
  # the softmax result does not change.
295
- assert_allclose(softmax(x + 100), expected, rtol=1e-13)
342
+ xp_assert_close(softmax(x + 100), expected, rtol=1e-13)
296
343
 
297
344
  # When axis=None, softmax operates on the entire array, and preserves
298
345
  # the shape.
299
- assert_allclose(softmax(x.reshape(2, 2)), expected.reshape(2, 2),
300
- rtol=1e-13)
301
-
346
+ xp_assert_close(softmax(xp.reshape(x, (2, 2))),
347
+ xp.reshape(expected, (2, 2)), rtol=1e-13)
302
348
 
303
- def test_softmax_multi_axes(self):
304
- assert_allclose(softmax([[1000, 0], [1000, 0]], axis=0),
305
- np.array([[.5, .5], [.5, .5]]), rtol=1e-13)
306
- assert_allclose(softmax([[1000, 0], [1000, 0]], axis=1),
307
- np.array([[1, 0], [1, 0]]), rtol=1e-13)
349
+ def test_softmax_multi_axes(self, xp):
350
+ xp_assert_close(softmax(xp.asarray([[1000., 0.], [1000., 0.]]), axis=0),
351
+ xp.asarray([[.5, .5], [.5, .5]]), rtol=1e-13)
352
+ xp_assert_close(softmax(xp.asarray([[1000., 0.], [1000., 0.]]), axis=1),
353
+ xp.asarray([[1., 0.], [1., 0.]]), rtol=1e-13)
308
354
 
309
355
  # Expected value computed using mpmath (with mpmath.mp.dps = 200) and then
310
356
  # converted to float.
311
- x = np.array([[-25, 0, 25, 50],
312
- [1, 325, 749, 750]])
313
- expected = np.array([[2.678636961770877e-33,
314
- 1.9287498479371314e-22,
315
- 1.3887943864771144e-11,
316
- 0.999999999986112],
317
- [0.0,
318
- 1.9444526359919372e-185,
319
- 0.2689414213699951,
320
- 0.7310585786300048]])
321
- assert_allclose(softmax(x, axis=1), expected, rtol=1e-13)
322
- assert_allclose(softmax(x.T, axis=0), expected.T, rtol=1e-13)
357
+ x = xp.asarray([[-25., 0., 25., 50.],
358
+ [ 1., 325., 749., 750.]])
359
+ expected = xp.asarray([[2.678636961770877e-33,
360
+ 1.9287498479371314e-22,
361
+ 1.3887943864771144e-11,
362
+ 0.999999999986112],
363
+ [0.0,
364
+ 1.9444526359919372e-185,
365
+ 0.2689414213699951,
366
+ 0.7310585786300048]])
367
+ xp_assert_close(softmax(x, axis=1), expected, rtol=1e-13)
368
+ xp_assert_close(softmax(x.T, axis=0), expected.T, rtol=1e-13)
323
369
 
324
370
  # 3-d input, with a tuple for the axis.
325
- x3d = x.reshape(2, 2, 2)
326
- assert_allclose(softmax(x3d, axis=(1, 2)), expected.reshape(2, 2, 2),
327
- rtol=1e-13)
371
+ x3d = xp.reshape(x, (2, 2, 2))
372
+ xp_assert_close(softmax(x3d, axis=(1, 2)),
373
+ xp.reshape(expected, (2, 2, 2)), rtol=1e-13)
374
+
375
+ @pytest.mark.xfail_xp_backends("array_api_strict", reason="int->float promotion")
376
+ def test_softmax_int_array(self, xp):
377
+ xp_assert_close(softmax(xp.asarray([1000, 0, 0, 0])),
378
+ xp.asarray([1., 0., 0., 0.]), rtol=1e-13)
379
+
380
+ def test_softmax_scalar(self):
381
+ xp_assert_close(softmax(1000), np.asarray(1.), rtol=1e-13)
382
+
383
+ def test_softmax_array_like(self):
384
+ xp_assert_close(softmax([1000, 0, 0, 0]),
385
+ np.asarray([1., 0., 0., 0.]), rtol=1e-13)
386
+
387
+
388
+ @make_xp_test_case(log_softmax)
389
+ class TestLogSoftmax:
390
+ def test_log_softmax_basic(self, xp):
391
+ xp_assert_close(log_softmax(xp.asarray([1000., 1.])),
392
+ xp.asarray([0., -999.]), rtol=1e-13)
393
+
394
+ @pytest.mark.xfail_xp_backends("array_api_strict", reason="int->float promotion")
395
+ def test_log_softmax_int_array(self, xp):
396
+ xp_assert_close(log_softmax(xp.asarray([1000, 1])),
397
+ xp.asarray([0., -999.]), rtol=1e-13)
398
+
399
+ def test_log_softmax_scalar(self):
400
+ xp_assert_close(log_softmax(1.0), 0.0, rtol=1e-13)
401
+
402
+ def test_log_softmax_array_like(self):
403
+ xp_assert_close(log_softmax([1000, 1]),
404
+ np.asarray([0., -999.]), rtol=1e-13)
405
+
406
+ @staticmethod
407
+ def data_1d(xp):
408
+ x = xp.arange(4, dtype=xp.float64)
409
+ # Expected value computed using mpmath (with mpmath.mp.dps = 200)
410
+ expect = [-3.4401896985611953,
411
+ -2.4401896985611953,
412
+ -1.4401896985611953,
413
+ -0.44018969856119533]
414
+ return x, xp.asarray(expect, dtype=xp.float64)
415
+
416
+ @staticmethod
417
+ def data_2d(xp):
418
+ x = xp.reshape(xp.arange(8, dtype=xp.float64), (2, 4))
419
+
420
+ # Expected value computed using mpmath (with mpmath.mp.dps = 200)
421
+ expect = [[-3.4401896985611953,
422
+ -2.4401896985611953,
423
+ -1.4401896985611953,
424
+ -0.44018969856119533],
425
+ [-3.4401896985611953,
426
+ -2.4401896985611953,
427
+ -1.4401896985611953,
428
+ -0.44018969856119533]]
429
+ return x, xp.asarray(expect, dtype=xp.float64)
430
+
431
+ @pytest.mark.parametrize("offset", [0, 100])
432
+ def test_log_softmax_translation(self, offset, xp):
433
+ # Translation property. If all the values are changed by the same amount,
434
+ # the softmax result does not change.
435
+ x, expect = self.data_1d(xp)
436
+ x += offset
437
+ xp_assert_close(log_softmax(x), expect, rtol=1e-13)
438
+
439
+ def test_log_softmax_noneaxis(self, xp):
440
+ # When axis=None, softmax operates on the entire array, and preserves
441
+ # the shape.
442
+ x, expect = self.data_1d(xp)
443
+ x = xp.reshape(x, (2, 2))
444
+ expect = xp.reshape(expect, (2, 2))
445
+ xp_assert_close(log_softmax(x), expect, rtol=1e-13)
446
+
447
+ @pytest.mark.parametrize('axis_2d, expected_2d', [
448
+ (0, np.log(0.5) * np.ones((2, 2))),
449
+ (1, [[0., -999.], [0., -999.]]),
450
+ ])
451
+ def test_axes(self, axis_2d, expected_2d, xp):
452
+ x = xp.asarray([[1000., 1.], [1000., 1.]])
453
+ xp_assert_close(log_softmax(x, axis=axis_2d),
454
+ xp.asarray(expected_2d, dtype=x.dtype), rtol=1e-13)
455
+
456
+ def test_log_softmax_2d_axis1(self, xp):
457
+ x, expect = self.data_2d(xp)
458
+ xp_assert_close(log_softmax(x, axis=1), expect, rtol=1e-13)
459
+
460
+ def test_log_softmax_2d_axis0(self, xp):
461
+ x, expect = self.data_2d(xp)
462
+ xp_assert_close(log_softmax(x.T, axis=0), expect.T, rtol=1e-13)
463
+
464
+ def test_log_softmax_3d(self, xp):
465
+ # 3D input, with a tuple for the axis.
466
+ x, expect = self.data_2d(xp)
467
+ x = xp.reshape(x, (2, 2, 2))
468
+ expect = xp.reshape(expect, (2, 2, 2))
469
+ xp_assert_close(log_softmax(x, axis=(1, 2)), expect, rtol=1e-13)
@@ -321,6 +321,7 @@ def test_lpmv():
321
321
  # beta
322
322
  # ------------------------------------------------------------------------------
323
323
 
324
+ @pytest.mark.slow
324
325
  @check_version(mpmath, '0.15')
325
326
  def test_beta():
326
327
  np.random.seed(1234)
@@ -1,7 +1,7 @@
1
1
  """Test how the ufuncs in special handle nan inputs.
2
2
 
3
3
  """
4
- from typing import Callable
4
+ from collections.abc import Callable
5
5
 
6
6
  import numpy as np
7
7
  from numpy.testing import assert_array_equal, assert_, suppress_warnings
@@ -258,24 +258,23 @@ class TestCall:
258
258
  poly = []
259
259
  for n in range(5):
260
260
  poly.extend([x.strip() for x in
261
- ("""
262
- orth.jacobi(%(n)d,0.3,0.9)
263
- orth.sh_jacobi(%(n)d,0.3,0.9)
264
- orth.genlaguerre(%(n)d,0.3)
265
- orth.laguerre(%(n)d)
266
- orth.hermite(%(n)d)
267
- orth.hermitenorm(%(n)d)
268
- orth.gegenbauer(%(n)d,0.3)
269
- orth.chebyt(%(n)d)
270
- orth.chebyu(%(n)d)
271
- orth.chebyc(%(n)d)
272
- orth.chebys(%(n)d)
273
- orth.sh_chebyt(%(n)d)
274
- orth.sh_chebyu(%(n)d)
275
- orth.legendre(%(n)d)
276
- orth.sh_legendre(%(n)d)
277
- """ % dict(n=n)).split()
278
- ])
261
+ (f"""
262
+ orth.jacobi({n},0.3,0.9)
263
+ orth.sh_jacobi({n},0.3,0.9)
264
+ orth.genlaguerre({n},0.3)
265
+ orth.laguerre({n})
266
+ orth.hermite({n})
267
+ orth.hermitenorm({n})
268
+ orth.gegenbauer({n},0.3)
269
+ orth.chebyt({n})
270
+ orth.chebyu({n})
271
+ orth.chebyc({n})
272
+ orth.chebys({n})
273
+ orth.sh_chebyt({n})
274
+ orth.sh_chebyu({n})
275
+ orth.legendre({n})
276
+ orth.sh_legendre({n})
277
+ """).split()])
279
278
  with np.errstate(all='ignore'):
280
279
  for pstr in poly:
281
280
  p = eval(pstr)
@@ -2,7 +2,7 @@ import sys
2
2
  import warnings
3
3
 
4
4
  import numpy as np
5
- from numpy.testing import assert_, assert_equal, IS_PYPY
5
+ from numpy.testing import assert_, assert_equal, HAS_REFCOUNT
6
6
  import pytest
7
7
  from pytest import raises as assert_raises
8
8
 
@@ -73,7 +73,8 @@ def test_seterr():
73
73
  sc.seterr(**entry_err)
74
74
 
75
75
 
76
- @pytest.mark.skipif(IS_PYPY, reason="Test not meaningful on PyPy")
76
+ @pytest.mark.thread_unsafe
77
+ @pytest.mark.skipif(not HAS_REFCOUNT, reason="Python lacks refcounts")
77
78
  def test_sf_error_special_refcount():
78
79
  # Regression test for gh-16233.
79
80
  # Check that the reference count of scipy.special is not increased
@@ -1,7 +1,7 @@
1
1
  import numpy as np
2
2
  import pytest
3
3
 
4
- from numpy.testing import assert_allclose, suppress_warnings
4
+ from numpy.testing import assert_allclose
5
5
  import scipy.special as sc
6
6
 
7
7
  class TestSphHarm:
@@ -47,6 +47,7 @@ class TestSphHarm:
47
47
 
48
48
  np.testing.assert_allclose(y_actual, y_desired, rtol=1e-05)
49
49
 
50
+ @pytest.mark.filterwarnings("ignore::DeprecationWarning")
50
51
  def test_first_harmonics():
51
52
  # Test against explicit representations of the first four
52
53
  # spherical harmonics which use `theta` as the azimuthal angle,
@@ -78,9 +79,7 @@ def test_first_harmonics():
78
79
  theta, phi = np.meshgrid(theta, phi)
79
80
 
80
81
  for harm, m, n in zip(harms, m, n):
81
- with suppress_warnings() as sup:
82
- sup.filter(category=DeprecationWarning)
83
- assert_allclose(sc.sph_harm(m, n, theta, phi),
84
- harm(theta, phi),
85
- rtol=1e-15, atol=1e-15,
86
- err_msg=f"Y^{m}_{n} incorrect")
82
+ assert_allclose(sc.sph_harm(m, n, theta, phi),
83
+ harm(theta, phi),
84
+ rtol=1e-15, atol=1e-15,
85
+ err_msg=f"Y^{m}_{n} incorrect")