scipy 1.15.2__cp313-cp313t-macosx_14_0_arm64.whl → 1.16.0rc1__cp313-cp313t-macosx_14_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 (637) hide show
  1. scipy/__config__.py +3 -3
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cpython-313t-darwin.so +0 -0
  4. scipy/_lib/_array_api.py +497 -161
  5. scipy/_lib/_array_api_compat_vendor.py +9 -0
  6. scipy/_lib/_bunch.py +4 -0
  7. scipy/_lib/_ccallback_c.cpython-313t-darwin.so +0 -0
  8. scipy/_lib/_docscrape.py +1 -1
  9. scipy/_lib/_elementwise_iterative_method.py +15 -26
  10. scipy/_lib/_sparse.py +41 -0
  11. scipy/_lib/_test_ccallback.cpython-313t-darwin.so +0 -0
  12. scipy/_lib/_test_deprecation_call.cpython-313t-darwin.so +0 -0
  13. scipy/_lib/_test_deprecation_def.cpython-313t-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-313t-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 +169 -34
  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-313t-darwin.so +0 -0
  95. scipy/cluster/_optimal_leaf_ordering.cpython-313t-darwin.so +0 -0
  96. scipy/cluster/_vq.cpython-313t-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-313t-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-313t-darwin.so +0 -0
  126. scipy/integrate/_ivp/common.py +3 -3
  127. scipy/integrate/_ivp/ivp.py +9 -2
  128. scipy/integrate/_ivp/tests/test_ivp.py +19 -0
  129. scipy/integrate/_lsoda.cpython-313t-darwin.so +0 -0
  130. scipy/integrate/_ode.py +9 -2
  131. scipy/integrate/_odepack.cpython-313t-darwin.so +0 -0
  132. scipy/integrate/_quad_vec.py +21 -29
  133. scipy/integrate/_quadpack.cpython-313t-darwin.so +0 -0
  134. scipy/integrate/_quadpack_py.py +11 -7
  135. scipy/integrate/_quadrature.py +3 -3
  136. scipy/integrate/_rules/_base.py +2 -2
  137. scipy/integrate/_tanhsinh.py +57 -54
  138. scipy/integrate/_test_odeint_banded.cpython-313t-darwin.so +0 -0
  139. scipy/integrate/_vode.cpython-313t-darwin.so +0 -0
  140. scipy/integrate/tests/test__quad_vec.py +0 -6
  141. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  142. scipy/integrate/tests/test_cubature.py +21 -35
  143. scipy/integrate/tests/test_quadrature.py +6 -8
  144. scipy/integrate/tests/test_tanhsinh.py +61 -43
  145. scipy/interpolate/__init__.py +70 -58
  146. scipy/interpolate/_bary_rational.py +22 -22
  147. scipy/interpolate/_bsplines.py +119 -66
  148. scipy/interpolate/_cubic.py +65 -50
  149. scipy/interpolate/_dfitpack.cpython-313t-darwin.so +0 -0
  150. scipy/interpolate/_dierckx.cpython-313t-darwin.so +0 -0
  151. scipy/interpolate/_fitpack.cpython-313t-darwin.so +0 -0
  152. scipy/interpolate/_fitpack2.py +9 -6
  153. scipy/interpolate/_fitpack_impl.py +32 -26
  154. scipy/interpolate/_fitpack_repro.py +23 -19
  155. scipy/interpolate/_interpnd.cpython-313t-darwin.so +0 -0
  156. scipy/interpolate/_interpolate.py +30 -12
  157. scipy/interpolate/_ndbspline.py +13 -18
  158. scipy/interpolate/_ndgriddata.py +5 -8
  159. scipy/interpolate/_polyint.py +95 -31
  160. scipy/interpolate/_ppoly.cpython-313t-darwin.so +0 -0
  161. scipy/interpolate/_rbf.py +2 -2
  162. scipy/interpolate/_rbfinterp.py +1 -1
  163. scipy/interpolate/_rbfinterp_pythran.cpython-313t-darwin.so +0 -0
  164. scipy/interpolate/_rgi.py +31 -26
  165. scipy/interpolate/_rgi_cython.cpython-313t-darwin.so +0 -0
  166. scipy/interpolate/dfitpack.py +0 -20
  167. scipy/interpolate/interpnd.py +1 -2
  168. scipy/interpolate/tests/test_bary_rational.py +2 -2
  169. scipy/interpolate/tests/test_bsplines.py +97 -1
  170. scipy/interpolate/tests/test_fitpack2.py +39 -1
  171. scipy/interpolate/tests/test_interpnd.py +32 -20
  172. scipy/interpolate/tests/test_interpolate.py +48 -4
  173. scipy/interpolate/tests/test_rgi.py +2 -1
  174. scipy/io/_fast_matrix_market/__init__.py +2 -0
  175. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  176. scipy/io/_harwell_boeing/hb.py +7 -11
  177. scipy/io/_idl.py +5 -7
  178. scipy/io/_netcdf.py +15 -5
  179. scipy/io/_test_fortran.cpython-313t-darwin.so +0 -0
  180. scipy/io/arff/tests/test_arffread.py +3 -3
  181. scipy/io/matlab/__init__.py +5 -3
  182. scipy/io/matlab/_mio.py +4 -1
  183. scipy/io/matlab/_mio5.py +19 -13
  184. scipy/io/matlab/_mio5_utils.cpython-313t-darwin.so +0 -0
  185. scipy/io/matlab/_mio_utils.cpython-313t-darwin.so +0 -0
  186. scipy/io/matlab/_miobase.py +4 -1
  187. scipy/io/matlab/_streams.cpython-313t-darwin.so +0 -0
  188. scipy/io/matlab/tests/test_mio.py +46 -18
  189. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  190. scipy/io/tests/test_mmio.py +7 -1
  191. scipy/io/tests/test_wavfile.py +41 -0
  192. scipy/io/wavfile.py +57 -10
  193. scipy/linalg/_basic.py +113 -86
  194. scipy/linalg/_cythonized_array_utils.cpython-313t-darwin.so +0 -0
  195. scipy/linalg/_decomp.py +22 -9
  196. scipy/linalg/_decomp_cholesky.py +28 -13
  197. scipy/linalg/_decomp_cossin.py +45 -30
  198. scipy/linalg/_decomp_interpolative.cpython-313t-darwin.so +0 -0
  199. scipy/linalg/_decomp_ldl.py +4 -1
  200. scipy/linalg/_decomp_lu.py +18 -6
  201. scipy/linalg/_decomp_lu_cython.cpython-313t-darwin.so +0 -0
  202. scipy/linalg/_decomp_polar.py +2 -0
  203. scipy/linalg/_decomp_qr.py +6 -2
  204. scipy/linalg/_decomp_qz.py +3 -0
  205. scipy/linalg/_decomp_schur.py +3 -1
  206. scipy/linalg/_decomp_svd.py +13 -2
  207. scipy/linalg/_decomp_update.cpython-313t-darwin.so +0 -0
  208. scipy/linalg/_expm_frechet.py +4 -0
  209. scipy/linalg/_fblas.cpython-313t-darwin.so +0 -0
  210. scipy/linalg/_flapack.cpython-313t-darwin.so +0 -0
  211. scipy/linalg/_linalg_pythran.cpython-313t-darwin.so +0 -0
  212. scipy/linalg/_matfuncs.py +187 -4
  213. scipy/linalg/_matfuncs_expm.cpython-313t-darwin.so +0 -0
  214. scipy/linalg/_matfuncs_schur_sqrtm.cpython-313t-darwin.so +0 -0
  215. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  216. scipy/linalg/_matfuncs_sqrtm_triu.cpython-313t-darwin.so +0 -0
  217. scipy/linalg/_procrustes.py +2 -0
  218. scipy/linalg/_sketches.py +17 -6
  219. scipy/linalg/_solve_toeplitz.cpython-313t-darwin.so +0 -0
  220. scipy/linalg/_solvers.py +7 -2
  221. scipy/linalg/_special_matrices.py +26 -36
  222. scipy/linalg/cython_blas.cpython-313t-darwin.so +0 -0
  223. scipy/linalg/cython_lapack.cpython-313t-darwin.so +0 -0
  224. scipy/linalg/lapack.py +22 -2
  225. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  226. scipy/linalg/tests/test_basic.py +31 -16
  227. scipy/linalg/tests/test_batch.py +588 -0
  228. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  229. scipy/linalg/tests/test_decomp.py +40 -3
  230. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  231. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  232. scipy/linalg/tests/test_interpolative.py +17 -0
  233. scipy/linalg/tests/test_lapack.py +115 -7
  234. scipy/linalg/tests/test_matfuncs.py +157 -102
  235. scipy/linalg/tests/test_procrustes.py +0 -7
  236. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  237. scipy/linalg/tests/test_special_matrices.py +1 -5
  238. scipy/ndimage/__init__.py +1 -0
  239. scipy/ndimage/_cytest.cpython-313t-darwin.so +0 -0
  240. scipy/ndimage/_delegators.py +8 -2
  241. scipy/ndimage/_filters.py +433 -5
  242. scipy/ndimage/_interpolation.py +36 -6
  243. scipy/ndimage/_measurements.py +4 -2
  244. scipy/ndimage/_morphology.py +5 -0
  245. scipy/ndimage/_nd_image.cpython-313t-darwin.so +0 -0
  246. scipy/ndimage/_ndimage_api.py +2 -1
  247. scipy/ndimage/_ni_docstrings.py +5 -1
  248. scipy/ndimage/_ni_label.cpython-313t-darwin.so +0 -0
  249. scipy/ndimage/_ni_support.py +1 -5
  250. scipy/ndimage/_rank_filter_1d.cpython-313t-darwin.so +0 -0
  251. scipy/ndimage/_support_alternative_backends.py +18 -6
  252. scipy/ndimage/tests/test_filters.py +351 -259
  253. scipy/ndimage/tests/test_fourier.py +7 -9
  254. scipy/ndimage/tests/test_interpolation.py +68 -61
  255. scipy/ndimage/tests/test_measurements.py +18 -35
  256. scipy/ndimage/tests/test_morphology.py +143 -131
  257. scipy/ndimage/tests/test_splines.py +1 -3
  258. scipy/odr/__odrpack.cpython-313t-darwin.so +0 -0
  259. scipy/optimize/_basinhopping.py +13 -7
  260. scipy/optimize/_bglu_dense.cpython-313t-darwin.so +0 -0
  261. scipy/optimize/_bracket.py +46 -26
  262. scipy/optimize/_chandrupatla.py +9 -10
  263. scipy/optimize/_cobyla_py.py +104 -123
  264. scipy/optimize/_constraints.py +14 -10
  265. scipy/optimize/_differentiable_functions.py +371 -230
  266. scipy/optimize/_differentialevolution.py +4 -3
  267. scipy/optimize/_direct.cpython-313t-darwin.so +0 -0
  268. scipy/optimize/_dual_annealing.py +1 -1
  269. scipy/optimize/_elementwise.py +1 -4
  270. scipy/optimize/_group_columns.cpython-313t-darwin.so +0 -0
  271. scipy/optimize/_highspy/_highs_wrapper.py +6 -4
  272. scipy/optimize/_lbfgsb.cpython-313t-darwin.so +0 -0
  273. scipy/optimize/_lbfgsb_py.py +57 -16
  274. scipy/optimize/_linprog_doc.py +2 -2
  275. scipy/optimize/_linprog_highs.py +11 -11
  276. scipy/optimize/_linprog_ip.py +25 -10
  277. scipy/optimize/_linprog_util.py +18 -19
  278. scipy/optimize/_lsap.cpython-313t-darwin.so +0 -0
  279. scipy/optimize/_lsq/common.py +3 -3
  280. scipy/optimize/_lsq/dogbox.py +16 -2
  281. scipy/optimize/_lsq/givens_elimination.cpython-313t-darwin.so +0 -0
  282. scipy/optimize/_lsq/least_squares.py +198 -126
  283. scipy/optimize/_lsq/lsq_linear.py +6 -6
  284. scipy/optimize/_lsq/trf.py +35 -8
  285. scipy/optimize/_milp.py +3 -1
  286. scipy/optimize/_minimize.py +105 -36
  287. scipy/optimize/_minpack.cpython-313t-darwin.so +0 -0
  288. scipy/optimize/_minpack_py.py +21 -14
  289. scipy/optimize/_moduleTNC.cpython-313t-darwin.so +0 -0
  290. scipy/optimize/_nnls.py +20 -21
  291. scipy/optimize/_nonlin.py +34 -3
  292. scipy/optimize/_numdiff.py +288 -110
  293. scipy/optimize/_optimize.py +86 -48
  294. scipy/optimize/_pava_pybind.cpython-313t-darwin.so +0 -0
  295. scipy/optimize/_remove_redundancy.py +5 -5
  296. scipy/optimize/_root_scalar.py +1 -1
  297. scipy/optimize/_shgo.py +6 -0
  298. scipy/optimize/_shgo_lib/_complex.py +1 -1
  299. scipy/optimize/_slsqp_py.py +216 -124
  300. scipy/optimize/_slsqplib.cpython-313t-darwin.so +0 -0
  301. scipy/optimize/_spectral.py +1 -1
  302. scipy/optimize/_tnc.py +8 -1
  303. scipy/optimize/_trlib/_trlib.cpython-313t-darwin.so +0 -0
  304. scipy/optimize/_trustregion.py +20 -6
  305. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  306. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  307. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  308. scipy/optimize/_trustregion_constr/projections.py +12 -8
  309. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  310. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  311. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  312. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  313. scipy/optimize/_trustregion_exact.py +0 -1
  314. scipy/optimize/_zeros.cpython-313t-darwin.so +0 -0
  315. scipy/optimize/_zeros_py.py +97 -17
  316. scipy/optimize/cython_optimize/_zeros.cpython-313t-darwin.so +0 -0
  317. scipy/optimize/slsqp.py +0 -1
  318. scipy/optimize/tests/test__basinhopping.py +1 -1
  319. scipy/optimize/tests/test__differential_evolution.py +4 -4
  320. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  321. scipy/optimize/tests/test__numdiff.py +66 -22
  322. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  323. scipy/optimize/tests/test__shgo.py +9 -1
  324. scipy/optimize/tests/test_bracket.py +71 -46
  325. scipy/optimize/tests/test_chandrupatla.py +133 -135
  326. scipy/optimize/tests/test_cobyla.py +74 -45
  327. scipy/optimize/tests/test_constraints.py +1 -1
  328. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  329. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  330. scipy/optimize/tests/test_least_squares.py +125 -13
  331. scipy/optimize/tests/test_linear_assignment.py +3 -3
  332. scipy/optimize/tests/test_linprog.py +3 -3
  333. scipy/optimize/tests/test_lsq_linear.py +5 -5
  334. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  335. scipy/optimize/tests/test_minpack.py +4 -4
  336. scipy/optimize/tests/test_nnls.py +43 -3
  337. scipy/optimize/tests/test_nonlin.py +36 -0
  338. scipy/optimize/tests/test_optimize.py +95 -17
  339. scipy/optimize/tests/test_slsqp.py +36 -4
  340. scipy/optimize/tests/test_zeros.py +34 -1
  341. scipy/signal/__init__.py +12 -23
  342. scipy/signal/_delegators.py +568 -0
  343. scipy/signal/_filter_design.py +459 -241
  344. scipy/signal/_fir_filter_design.py +262 -90
  345. scipy/signal/_lti_conversion.py +3 -2
  346. scipy/signal/_ltisys.py +118 -91
  347. scipy/signal/_max_len_seq_inner.cpython-313t-darwin.so +0 -0
  348. scipy/signal/_peak_finding_utils.cpython-313t-darwin.so +0 -0
  349. scipy/signal/_polyutils.py +172 -0
  350. scipy/signal/_short_time_fft.py +553 -76
  351. scipy/signal/_signal_api.py +30 -0
  352. scipy/signal/_signaltools.py +719 -396
  353. scipy/signal/_sigtools.cpython-313t-darwin.so +0 -0
  354. scipy/signal/_sosfilt.cpython-313t-darwin.so +0 -0
  355. scipy/signal/_spectral_py.py +221 -50
  356. scipy/signal/_spline.cpython-313t-darwin.so +0 -0
  357. scipy/signal/_spline_filters.py +108 -68
  358. scipy/signal/_support_alternative_backends.py +73 -0
  359. scipy/signal/_upfirdn.py +4 -1
  360. scipy/signal/_upfirdn_apply.cpython-313t-darwin.so +0 -0
  361. scipy/signal/_waveforms.py +2 -11
  362. scipy/signal/_wavelets.py +1 -1
  363. scipy/signal/fir_filter_design.py +1 -0
  364. scipy/signal/spline.py +4 -11
  365. scipy/signal/tests/_scipy_spectral_test_shim.py +5 -182
  366. scipy/signal/tests/test_bsplines.py +114 -79
  367. scipy/signal/tests/test_cont2discrete.py +9 -2
  368. scipy/signal/tests/test_filter_design.py +721 -481
  369. scipy/signal/tests/test_fir_filter_design.py +332 -140
  370. scipy/signal/tests/test_savitzky_golay.py +4 -3
  371. scipy/signal/tests/test_short_time_fft.py +231 -5
  372. scipy/signal/tests/test_signaltools.py +2149 -1348
  373. scipy/signal/tests/test_spectral.py +19 -6
  374. scipy/signal/tests/test_splines.py +161 -96
  375. scipy/signal/tests/test_upfirdn.py +84 -50
  376. scipy/signal/tests/test_waveforms.py +20 -0
  377. scipy/signal/tests/test_windows.py +607 -466
  378. scipy/signal/windows/_windows.py +287 -148
  379. scipy/sparse/__init__.py +23 -4
  380. scipy/sparse/_base.py +269 -120
  381. scipy/sparse/_bsr.py +7 -4
  382. scipy/sparse/_compressed.py +59 -234
  383. scipy/sparse/_construct.py +90 -38
  384. scipy/sparse/_coo.py +115 -181
  385. scipy/sparse/_csc.py +4 -4
  386. scipy/sparse/_csparsetools.cpython-313t-darwin.so +0 -0
  387. scipy/sparse/_csr.py +2 -2
  388. scipy/sparse/_data.py +48 -48
  389. scipy/sparse/_dia.py +105 -21
  390. scipy/sparse/_dok.py +0 -23
  391. scipy/sparse/_index.py +4 -4
  392. scipy/sparse/_matrix.py +23 -0
  393. scipy/sparse/_sparsetools.cpython-313t-darwin.so +0 -0
  394. scipy/sparse/_sputils.py +37 -22
  395. scipy/sparse/base.py +0 -9
  396. scipy/sparse/bsr.py +0 -14
  397. scipy/sparse/compressed.py +0 -23
  398. scipy/sparse/construct.py +0 -6
  399. scipy/sparse/coo.py +0 -14
  400. scipy/sparse/csc.py +0 -3
  401. scipy/sparse/csgraph/_flow.cpython-313t-darwin.so +0 -0
  402. scipy/sparse/csgraph/_matching.cpython-313t-darwin.so +0 -0
  403. scipy/sparse/csgraph/_min_spanning_tree.cpython-313t-darwin.so +0 -0
  404. scipy/sparse/csgraph/_reordering.cpython-313t-darwin.so +0 -0
  405. scipy/sparse/csgraph/_shortest_path.cpython-313t-darwin.so +0 -0
  406. scipy/sparse/csgraph/_tools.cpython-313t-darwin.so +0 -0
  407. scipy/sparse/csgraph/_traversal.cpython-313t-darwin.so +0 -0
  408. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  409. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  410. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  411. scipy/sparse/csr.py +0 -5
  412. scipy/sparse/data.py +1 -6
  413. scipy/sparse/dia.py +0 -7
  414. scipy/sparse/dok.py +0 -10
  415. scipy/sparse/linalg/_dsolve/_superlu.cpython-313t-darwin.so +0 -0
  416. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  417. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  418. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313t-darwin.so +0 -0
  419. scipy/sparse/linalg/_eigen/arpack/arpack.py +28 -20
  420. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  421. scipy/sparse/linalg/_expm_multiply.py +8 -3
  422. scipy/sparse/linalg/_interface.py +29 -26
  423. scipy/sparse/linalg/_isolve/_gcrotmk.py +6 -5
  424. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  425. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  426. scipy/sparse/linalg/_isolve/minres.py +5 -5
  427. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  428. scipy/sparse/linalg/_isolve/utils.py +2 -8
  429. scipy/sparse/linalg/_matfuncs.py +1 -1
  430. scipy/sparse/linalg/_norm.py +1 -1
  431. scipy/sparse/linalg/_propack/_cpropack.cpython-313t-darwin.so +0 -0
  432. scipy/sparse/linalg/_propack/_dpropack.cpython-313t-darwin.so +0 -0
  433. scipy/sparse/linalg/_propack/_spropack.cpython-313t-darwin.so +0 -0
  434. scipy/sparse/linalg/_propack/_zpropack.cpython-313t-darwin.so +0 -0
  435. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  436. scipy/sparse/linalg/tests/test_expm_multiply.py +10 -0
  437. scipy/sparse/linalg/tests/test_interface.py +35 -0
  438. scipy/sparse/linalg/tests/test_pydata_sparse.py +18 -0
  439. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  440. scipy/sparse/tests/test_base.py +217 -40
  441. scipy/sparse/tests/test_common1d.py +17 -12
  442. scipy/sparse/tests/test_construct.py +1 -1
  443. scipy/sparse/tests/test_coo.py +272 -4
  444. scipy/sparse/tests/test_sparsetools.py +5 -0
  445. scipy/sparse/tests/test_sputils.py +36 -7
  446. scipy/spatial/_ckdtree.cpython-313t-darwin.so +0 -0
  447. scipy/spatial/_distance_pybind.cpython-313t-darwin.so +0 -0
  448. scipy/spatial/_distance_wrap.cpython-313t-darwin.so +0 -0
  449. scipy/spatial/_hausdorff.cpython-313t-darwin.so +0 -0
  450. scipy/spatial/_qhull.cpython-313t-darwin.so +0 -0
  451. scipy/spatial/_voronoi.cpython-313t-darwin.so +0 -0
  452. scipy/spatial/distance.py +49 -42
  453. scipy/spatial/tests/test_distance.py +3 -1
  454. scipy/spatial/tests/test_kdtree.py +1 -0
  455. scipy/spatial/tests/test_qhull.py +106 -2
  456. scipy/spatial/transform/__init__.py +5 -3
  457. scipy/spatial/transform/_rigid_transform.cpython-313t-darwin.so +0 -0
  458. scipy/spatial/transform/_rotation.cpython-313t-darwin.so +0 -0
  459. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  460. scipy/spatial/transform/tests/test_rotation.py +1342 -790
  461. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  462. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  463. scipy/special/__init__.py +1 -47
  464. scipy/special/_add_newdocs.py +34 -772
  465. scipy/special/_basic.py +22 -25
  466. scipy/special/_comb.cpython-313t-darwin.so +0 -0
  467. scipy/special/_ellip_harm_2.cpython-313t-darwin.so +0 -0
  468. scipy/special/_gufuncs.cpython-313t-darwin.so +0 -0
  469. scipy/special/_logsumexp.py +83 -69
  470. scipy/special/_orthogonal.pyi +1 -1
  471. scipy/special/_specfun.cpython-313t-darwin.so +0 -0
  472. scipy/special/_special_ufuncs.cpython-313t-darwin.so +0 -0
  473. scipy/special/_spherical_bessel.py +4 -4
  474. scipy/special/_support_alternative_backends.py +212 -119
  475. scipy/special/_test_internal.cpython-313t-darwin.so +0 -0
  476. scipy/special/_testutils.py +4 -4
  477. scipy/special/_ufuncs.cpython-313t-darwin.so +0 -0
  478. scipy/special/_ufuncs.pyi +1 -0
  479. scipy/special/_ufuncs.pyx +215 -1400
  480. scipy/special/_ufuncs_cxx.cpython-313t-darwin.so +0 -0
  481. scipy/special/_ufuncs_cxx.pxd +2 -15
  482. scipy/special/_ufuncs_cxx.pyx +5 -44
  483. scipy/special/_ufuncs_cxx_defs.h +2 -16
  484. scipy/special/_ufuncs_defs.h +0 -8
  485. scipy/special/cython_special.cpython-313t-darwin.so +0 -0
  486. scipy/special/cython_special.pxd +1 -1
  487. scipy/special/tests/_cython_examples/meson.build +10 -1
  488. scipy/special/tests/test_basic.py +153 -20
  489. scipy/special/tests/test_boost_ufuncs.py +3 -0
  490. scipy/special/tests/test_cdflib.py +35 -11
  491. scipy/special/tests/test_gammainc.py +16 -0
  492. scipy/special/tests/test_hyp2f1.py +23 -2
  493. scipy/special/tests/test_log1mexp.py +85 -0
  494. scipy/special/tests/test_logsumexp.py +220 -64
  495. scipy/special/tests/test_mpmath.py +1 -0
  496. scipy/special/tests/test_nan_inputs.py +1 -1
  497. scipy/special/tests/test_orthogonal.py +17 -18
  498. scipy/special/tests/test_sf_error.py +3 -2
  499. scipy/special/tests/test_sph_harm.py +6 -7
  500. scipy/special/tests/test_support_alternative_backends.py +211 -76
  501. scipy/stats/__init__.py +4 -1
  502. scipy/stats/_ansari_swilk_statistics.cpython-313t-darwin.so +0 -0
  503. scipy/stats/_axis_nan_policy.py +4 -3
  504. scipy/stats/_biasedurn.cpython-313t-darwin.so +0 -0
  505. scipy/stats/_continued_fraction.py +387 -0
  506. scipy/stats/_continuous_distns.py +296 -319
  507. scipy/stats/_covariance.py +6 -3
  508. scipy/stats/_discrete_distns.py +39 -32
  509. scipy/stats/_distn_infrastructure.py +39 -12
  510. scipy/stats/_distribution_infrastructure.py +900 -238
  511. scipy/stats/_entropy.py +7 -8
  512. scipy/{_lib → stats}/_finite_differences.py +1 -1
  513. scipy/stats/_hypotests.py +82 -49
  514. scipy/stats/_kde.py +53 -49
  515. scipy/stats/_ksstats.py +1 -1
  516. scipy/stats/_levy_stable/__init__.py +7 -15
  517. scipy/stats/_levy_stable/levyst.cpython-313t-darwin.so +0 -0
  518. scipy/stats/_morestats.py +112 -67
  519. scipy/stats/_mstats_basic.py +13 -17
  520. scipy/stats/_mstats_extras.py +8 -8
  521. scipy/stats/_multivariate.py +89 -113
  522. scipy/stats/_new_distributions.py +97 -20
  523. scipy/stats/_page_trend_test.py +12 -5
  524. scipy/stats/_probability_distribution.py +265 -43
  525. scipy/stats/_qmc.py +14 -9
  526. scipy/stats/_qmc_cy.cpython-313t-darwin.so +0 -0
  527. scipy/stats/_qmvnt.py +16 -95
  528. scipy/stats/_qmvnt_cy.cpython-313t-darwin.so +0 -0
  529. scipy/stats/_quantile.py +335 -0
  530. scipy/stats/_rcont/rcont.cpython-313t-darwin.so +0 -0
  531. scipy/stats/_resampling.py +4 -29
  532. scipy/stats/_sampling.py +1 -1
  533. scipy/stats/_sobol.cpython-313t-darwin.so +0 -0
  534. scipy/stats/_stats.cpython-313t-darwin.so +0 -0
  535. scipy/stats/_stats_mstats_common.py +19 -2
  536. scipy/stats/_stats_py.py +534 -460
  537. scipy/stats/_stats_pythran.cpython-313t-darwin.so +0 -0
  538. scipy/stats/_unuran/unuran_wrapper.cpython-313t-darwin.so +0 -0
  539. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  540. scipy/stats/_variation.py +5 -7
  541. scipy/stats/_wilcoxon.py +13 -7
  542. scipy/stats/tests/common_tests.py +6 -4
  543. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  544. scipy/stats/tests/test_continued_fraction.py +173 -0
  545. scipy/stats/tests/test_continuous.py +379 -60
  546. scipy/stats/tests/test_continuous_basic.py +18 -12
  547. scipy/stats/tests/test_discrete_basic.py +14 -8
  548. scipy/stats/tests/test_discrete_distns.py +16 -16
  549. scipy/stats/tests/test_distributions.py +117 -75
  550. scipy/stats/tests/test_entropy.py +40 -48
  551. scipy/stats/tests/test_fit.py +4 -3
  552. scipy/stats/tests/test_hypotests.py +153 -24
  553. scipy/stats/tests/test_kdeoth.py +109 -41
  554. scipy/stats/tests/test_marray.py +289 -0
  555. scipy/stats/tests/test_morestats.py +79 -47
  556. scipy/stats/tests/test_mstats_basic.py +3 -3
  557. scipy/stats/tests/test_multivariate.py +434 -83
  558. scipy/stats/tests/test_qmc.py +13 -10
  559. scipy/stats/tests/test_quantile.py +199 -0
  560. scipy/stats/tests/test_rank.py +119 -112
  561. scipy/stats/tests/test_resampling.py +47 -56
  562. scipy/stats/tests/test_sampling.py +9 -4
  563. scipy/stats/tests/test_stats.py +799 -939
  564. scipy/stats/tests/test_variation.py +8 -6
  565. scipy/version.py +2 -2
  566. {scipy-1.15.2.dist-info → scipy-1.16.0rc1.dist-info}/LICENSE.txt +1 -1
  567. {scipy-1.15.2.dist-info → scipy-1.16.0rc1.dist-info}/METADATA +9 -9
  568. {scipy-1.15.2.dist-info → scipy-1.16.0rc1.dist-info}/RECORD +569 -576
  569. scipy-1.16.0rc1.dist-info/WHEEL +6 -0
  570. scipy/_lib/array_api_extra/_funcs.py +0 -484
  571. scipy/_lib/array_api_extra/_typing.py +0 -8
  572. scipy/interpolate/_bspl.cpython-313t-darwin.so +0 -0
  573. scipy/optimize/_cobyla.cpython-313t-darwin.so +0 -0
  574. scipy/optimize/_cython_nnls.cpython-313t-darwin.so +0 -0
  575. scipy/optimize/_slsqp.cpython-313t-darwin.so +0 -0
  576. scipy/spatial/qhull_src/COPYING.txt +0 -38
  577. scipy/special/libsf_error_state.dylib +0 -0
  578. scipy/special/tests/test_log_softmax.py +0 -109
  579. scipy/special/tests/test_xsf_cuda.py +0 -114
  580. scipy/special/xsf/binom.h +0 -89
  581. scipy/special/xsf/cdflib.h +0 -100
  582. scipy/special/xsf/cephes/airy.h +0 -307
  583. scipy/special/xsf/cephes/besselpoly.h +0 -51
  584. scipy/special/xsf/cephes/beta.h +0 -257
  585. scipy/special/xsf/cephes/cbrt.h +0 -131
  586. scipy/special/xsf/cephes/chbevl.h +0 -85
  587. scipy/special/xsf/cephes/chdtr.h +0 -193
  588. scipy/special/xsf/cephes/const.h +0 -87
  589. scipy/special/xsf/cephes/ellie.h +0 -293
  590. scipy/special/xsf/cephes/ellik.h +0 -251
  591. scipy/special/xsf/cephes/ellpe.h +0 -107
  592. scipy/special/xsf/cephes/ellpk.h +0 -117
  593. scipy/special/xsf/cephes/expn.h +0 -260
  594. scipy/special/xsf/cephes/gamma.h +0 -398
  595. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  596. scipy/special/xsf/cephes/hyperg.h +0 -361
  597. scipy/special/xsf/cephes/i0.h +0 -149
  598. scipy/special/xsf/cephes/i1.h +0 -158
  599. scipy/special/xsf/cephes/igam.h +0 -421
  600. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  601. scipy/special/xsf/cephes/igami.h +0 -313
  602. scipy/special/xsf/cephes/j0.h +0 -225
  603. scipy/special/xsf/cephes/j1.h +0 -198
  604. scipy/special/xsf/cephes/jv.h +0 -715
  605. scipy/special/xsf/cephes/k0.h +0 -164
  606. scipy/special/xsf/cephes/k1.h +0 -163
  607. scipy/special/xsf/cephes/kn.h +0 -243
  608. scipy/special/xsf/cephes/lanczos.h +0 -112
  609. scipy/special/xsf/cephes/ndtr.h +0 -275
  610. scipy/special/xsf/cephes/poch.h +0 -85
  611. scipy/special/xsf/cephes/polevl.h +0 -167
  612. scipy/special/xsf/cephes/psi.h +0 -194
  613. scipy/special/xsf/cephes/rgamma.h +0 -111
  614. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  615. scipy/special/xsf/cephes/shichi.h +0 -248
  616. scipy/special/xsf/cephes/sici.h +0 -224
  617. scipy/special/xsf/cephes/sindg.h +0 -221
  618. scipy/special/xsf/cephes/tandg.h +0 -139
  619. scipy/special/xsf/cephes/trig.h +0 -58
  620. scipy/special/xsf/cephes/unity.h +0 -186
  621. scipy/special/xsf/cephes/zeta.h +0 -172
  622. scipy/special/xsf/config.h +0 -304
  623. scipy/special/xsf/digamma.h +0 -205
  624. scipy/special/xsf/error.h +0 -57
  625. scipy/special/xsf/evalpoly.h +0 -47
  626. scipy/special/xsf/expint.h +0 -266
  627. scipy/special/xsf/hyp2f1.h +0 -694
  628. scipy/special/xsf/iv_ratio.h +0 -173
  629. scipy/special/xsf/lambertw.h +0 -150
  630. scipy/special/xsf/loggamma.h +0 -163
  631. scipy/special/xsf/sici.h +0 -200
  632. scipy/special/xsf/tools.h +0 -427
  633. scipy/special/xsf/trig.h +0 -164
  634. scipy/special/xsf/wright_bessel.h +0 -843
  635. scipy/special/xsf/zlog1.h +0 -35
  636. scipy/stats/_mvn.cpython-313t-darwin.so +0 -0
  637. scipy-1.15.2.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(
@@ -2543,3 +2543,24 @@ class TestHyp2f1:
2543
2543
  if mark.name == 'parametrize'
2544
2544
  for case in mark.args[1]
2545
2545
  ]
2546
+
2547
+ class TestHyp2f1ExtremeInputs:
2548
+
2549
+ @pytest.mark.parametrize("a", [1.0, 2.0, 3.0, -np.inf, np.inf])
2550
+ @pytest.mark.parametrize("b", [3.0, 4.0, 5.0, -np.inf, np.inf])
2551
+ @pytest.mark.parametrize("c", [3.0, 5.0, 6.0, 7.0])
2552
+ @pytest.mark.parametrize("z", [4.0 + 1.0j])
2553
+ def test_inf_a_b(self, a, b, c, z):
2554
+ if np.any(np.isinf(np.asarray([a, b]))):
2555
+ assert(np.isnan(hyp2f1(a, b, c, z)))
2556
+
2557
+ def test_large_a_b(self):
2558
+ assert(np.isnan(hyp2f1(10**7, 1.0, 3.0, 4.0 + 1.0j)))
2559
+ assert(np.isnan(hyp2f1(-10**7, 1.0, 3.0, 4.0 + 1.0j)))
2560
+
2561
+ assert(np.isnan(hyp2f1(1.0, 10**7, 3.0, 4.0 + 1.0j)))
2562
+ assert(np.isnan(hyp2f1(1.0, -10**7, 3.0, 4.0 + 1.0j)))
2563
+
2564
+ # Already correct in main but testing for surety
2565
+ assert(np.isnan(hyp2f1(np.inf, 1.0, 3.0, 4.0)))
2566
+ assert(np.isnan(hyp2f1(1.0, np.inf, 3.0, 4.0)))
@@ -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
 
@@ -258,56 +254,216 @@ class TestLogSumExp:
258
254
  xp_assert_close(xp.imag(res), xp.imag(ref), atol=0, rtol=1e-15)
259
255
 
260
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
+
304
+ def test_gh22903(self, xp):
305
+ # gh-22903 reported that `logsumexp` produced NaN where the weight associated
306
+ # with the max magnitude element was negative and `return_sign=False`, even if
307
+ # the net result should be the log of a positive number.
308
+
309
+ # result is log of positive number
310
+ a = xp.asarray([3.06409428, 0.37251854, 3.87471931])
311
+ b = xp.asarray([1.88190708, 2.84174795, -0.85016884])
312
+ xp_assert_close(logsumexp(a, b=b), logsumexp(a, b=b, return_sign=True)[0])
313
+
314
+ # result is log of negative number
315
+ b = xp.asarray([1.88190708, 2.84174795, -3.85016884])
316
+ xp_assert_close(logsumexp(a, b=b), xp.asarray(xp.nan))
317
+
318
+
319
+ @make_xp_test_case(softmax)
261
320
  class TestSoftmax:
262
- def test_softmax_fixtures(self):
263
- assert_allclose(softmax([1000, 0, 0, 0]), np.array([1, 0, 0, 0]),
264
- rtol=1e-13)
265
- assert_allclose(softmax([1, 1]), np.array([.5, .5]), rtol=1e-13)
266
- 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),
267
328
  rtol=1e-13)
268
329
 
269
330
  # Expected value computed using mpmath (with mpmath.mp.dps = 200) and then
270
331
  # converted to float.
271
- x = np.arange(4)
272
- expected = np.array([0.03205860328008499,
273
- 0.08714431874203256,
274
- 0.23688281808991013,
275
- 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)
276
337
 
277
- assert_allclose(softmax(x), expected, rtol=1e-13)
338
+ xp_assert_close(softmax(x), expected, rtol=1e-13)
278
339
 
279
340
  # Translation property. If all the values are changed by the same amount,
280
341
  # the softmax result does not change.
281
- assert_allclose(softmax(x + 100), expected, rtol=1e-13)
342
+ xp_assert_close(softmax(x + 100), expected, rtol=1e-13)
282
343
 
283
344
  # When axis=None, softmax operates on the entire array, and preserves
284
345
  # the shape.
285
- assert_allclose(softmax(x.reshape(2, 2)), expected.reshape(2, 2),
286
- rtol=1e-13)
287
-
346
+ xp_assert_close(softmax(xp.reshape(x, (2, 2))),
347
+ xp.reshape(expected, (2, 2)), rtol=1e-13)
288
348
 
289
- def test_softmax_multi_axes(self):
290
- assert_allclose(softmax([[1000, 0], [1000, 0]], axis=0),
291
- np.array([[.5, .5], [.5, .5]]), rtol=1e-13)
292
- assert_allclose(softmax([[1000, 0], [1000, 0]], axis=1),
293
- 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)
294
354
 
295
355
  # Expected value computed using mpmath (with mpmath.mp.dps = 200) and then
296
356
  # converted to float.
297
- x = np.array([[-25, 0, 25, 50],
298
- [1, 325, 749, 750]])
299
- expected = np.array([[2.678636961770877e-33,
300
- 1.9287498479371314e-22,
301
- 1.3887943864771144e-11,
302
- 0.999999999986112],
303
- [0.0,
304
- 1.9444526359919372e-185,
305
- 0.2689414213699951,
306
- 0.7310585786300048]])
307
- assert_allclose(softmax(x, axis=1), expected, rtol=1e-13)
308
- 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)
309
369
 
310
370
  # 3-d input, with a tuple for the axis.
311
- x3d = x.reshape(2, 2, 2)
312
- assert_allclose(softmax(x3d, axis=(1, 2)), expected.reshape(2, 2, 2),
313
- 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")