scipy 1.15.3__cp313-cp313-musllinux_1_2_aarch64.whl → 1.16.0rc2__cp313-cp313-musllinux_1_2_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (641) hide show
  1. scipy/__config__.py +10 -10
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cpython-313-aarch64-linux-musl.so +0 -0
  4. scipy/_lib/_array_api.py +486 -161
  5. scipy/_lib/_array_api_compat_vendor.py +9 -0
  6. scipy/_lib/_bunch.py +4 -0
  7. scipy/_lib/_ccallback_c.cpython-313-aarch64-linux-musl.so +0 -0
  8. scipy/_lib/_docscrape.py +1 -1
  9. scipy/_lib/_elementwise_iterative_method.py +15 -26
  10. scipy/_lib/_fpumode.cpython-313-aarch64-linux-musl.so +0 -0
  11. scipy/_lib/_sparse.py +41 -0
  12. scipy/_lib/_test_ccallback.cpython-313-aarch64-linux-musl.so +0 -0
  13. scipy/_lib/_test_deprecation_call.cpython-313-aarch64-linux-musl.so +0 -0
  14. scipy/_lib/_test_deprecation_def.cpython-313-aarch64-linux-musl.so +0 -0
  15. scipy/_lib/_testutils.py +6 -2
  16. scipy/_lib/_uarray/_uarray.cpython-313-aarch64-linux-musl.so +0 -0
  17. scipy/_lib/_util.py +222 -125
  18. scipy/_lib/array_api_compat/__init__.py +4 -4
  19. scipy/_lib/array_api_compat/_internal.py +19 -6
  20. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  21. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  22. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  23. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  24. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  25. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  26. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  27. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  28. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  29. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  30. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  31. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  32. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  33. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  34. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  35. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  36. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  37. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  38. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  39. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  40. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  41. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  42. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  43. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  44. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  45. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  46. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  47. scipy/_lib/array_api_extra/__init__.py +26 -3
  48. scipy/_lib/array_api_extra/_delegation.py +171 -0
  49. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  50. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  51. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  52. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  53. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  54. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  58. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  59. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  60. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  61. scipy/_lib/array_api_extra/testing.py +359 -0
  62. scipy/_lib/decorator.py +2 -2
  63. scipy/_lib/doccer.py +1 -7
  64. scipy/_lib/messagestream.cpython-313-aarch64-linux-musl.so +0 -0
  65. scipy/_lib/pyprima/__init__.py +212 -0
  66. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  67. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  68. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  69. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  70. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  71. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  72. scipy/_lib/pyprima/cobyla/update.py +289 -0
  73. scipy/_lib/pyprima/common/__init__.py +0 -0
  74. scipy/_lib/pyprima/common/_bounds.py +34 -0
  75. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  76. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  77. scipy/_lib/pyprima/common/_project.py +173 -0
  78. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  79. scipy/_lib/pyprima/common/consts.py +47 -0
  80. scipy/_lib/pyprima/common/evaluate.py +99 -0
  81. scipy/_lib/pyprima/common/history.py +38 -0
  82. scipy/_lib/pyprima/common/infos.py +30 -0
  83. scipy/_lib/pyprima/common/linalg.py +435 -0
  84. scipy/_lib/pyprima/common/message.py +290 -0
  85. scipy/_lib/pyprima/common/powalg.py +131 -0
  86. scipy/_lib/pyprima/common/preproc.py +277 -0
  87. scipy/_lib/pyprima/common/present.py +5 -0
  88. scipy/_lib/pyprima/common/ratio.py +54 -0
  89. scipy/_lib/pyprima/common/redrho.py +47 -0
  90. scipy/_lib/pyprima/common/selectx.py +296 -0
  91. scipy/_lib/tests/test__util.py +105 -121
  92. scipy/_lib/tests/test_array_api.py +166 -35
  93. scipy/_lib/tests/test_bunch.py +7 -0
  94. scipy/_lib/tests/test_ccallback.py +2 -10
  95. scipy/_lib/tests/test_public_api.py +13 -0
  96. scipy/cluster/_hierarchy.cpython-313-aarch64-linux-musl.so +0 -0
  97. scipy/cluster/_optimal_leaf_ordering.cpython-313-aarch64-linux-musl.so +0 -0
  98. scipy/cluster/_vq.cpython-313-aarch64-linux-musl.so +0 -0
  99. scipy/cluster/hierarchy.py +393 -223
  100. scipy/cluster/tests/test_hierarchy.py +273 -335
  101. scipy/cluster/tests/test_vq.py +45 -61
  102. scipy/cluster/vq.py +39 -35
  103. scipy/conftest.py +263 -157
  104. scipy/constants/_constants.py +4 -1
  105. scipy/constants/tests/test_codata.py +2 -2
  106. scipy/constants/tests/test_constants.py +11 -18
  107. scipy/datasets/_download_all.py +15 -1
  108. scipy/datasets/_fetchers.py +7 -1
  109. scipy/datasets/_utils.py +1 -1
  110. scipy/differentiate/_differentiate.py +25 -25
  111. scipy/differentiate/tests/test_differentiate.py +24 -25
  112. scipy/fft/_basic.py +20 -0
  113. scipy/fft/_helper.py +3 -34
  114. scipy/fft/_pocketfft/helper.py +29 -1
  115. scipy/fft/_pocketfft/pypocketfft.cpython-313-aarch64-linux-musl.so +0 -0
  116. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  117. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  118. scipy/fft/_realtransforms.py +13 -0
  119. scipy/fft/tests/test_basic.py +27 -25
  120. scipy/fft/tests/test_fftlog.py +16 -7
  121. scipy/fft/tests/test_helper.py +18 -34
  122. scipy/fft/tests/test_real_transforms.py +8 -10
  123. scipy/fftpack/convolve.cpython-313-aarch64-linux-musl.so +0 -0
  124. scipy/fftpack/tests/test_basic.py +2 -4
  125. scipy/fftpack/tests/test_real_transforms.py +8 -9
  126. scipy/integrate/_bvp.py +9 -3
  127. scipy/integrate/_cubature.py +3 -2
  128. scipy/integrate/_dop.cpython-313-aarch64-linux-musl.so +0 -0
  129. scipy/integrate/_lsoda.cpython-313-aarch64-linux-musl.so +0 -0
  130. scipy/integrate/_ode.py +9 -2
  131. scipy/integrate/_odepack.cpython-313-aarch64-linux-musl.so +0 -0
  132. scipy/integrate/_quad_vec.py +21 -29
  133. scipy/integrate/_quadpack.cpython-313-aarch64-linux-musl.so +0 -0
  134. scipy/integrate/_quadpack_py.py +11 -7
  135. scipy/integrate/_quadrature.py +3 -3
  136. scipy/integrate/_rules/_base.py +2 -2
  137. scipy/integrate/_tanhsinh.py +48 -47
  138. scipy/integrate/_test_multivariate.cpython-313-aarch64-linux-musl.so +0 -0
  139. scipy/integrate/_test_odeint_banded.cpython-313-aarch64-linux-musl.so +0 -0
  140. scipy/integrate/_vode.cpython-313-aarch64-linux-musl.so +0 -0
  141. scipy/integrate/tests/test__quad_vec.py +0 -6
  142. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  143. scipy/integrate/tests/test_cubature.py +21 -35
  144. scipy/integrate/tests/test_quadrature.py +6 -8
  145. scipy/integrate/tests/test_tanhsinh.py +56 -48
  146. scipy/interpolate/__init__.py +70 -58
  147. scipy/interpolate/_bary_rational.py +22 -22
  148. scipy/interpolate/_bsplines.py +119 -66
  149. scipy/interpolate/_cubic.py +65 -50
  150. scipy/interpolate/_dfitpack.cpython-313-aarch64-linux-musl.so +0 -0
  151. scipy/interpolate/_dierckx.cpython-313-aarch64-linux-musl.so +0 -0
  152. scipy/interpolate/_fitpack.cpython-313-aarch64-linux-musl.so +0 -0
  153. scipy/interpolate/_fitpack2.py +9 -6
  154. scipy/interpolate/_fitpack_impl.py +32 -26
  155. scipy/interpolate/_fitpack_repro.py +23 -19
  156. scipy/interpolate/_interpnd.cpython-313-aarch64-linux-musl.so +0 -0
  157. scipy/interpolate/_interpolate.py +30 -12
  158. scipy/interpolate/_ndbspline.py +13 -18
  159. scipy/interpolate/_ndgriddata.py +5 -8
  160. scipy/interpolate/_polyint.py +95 -31
  161. scipy/interpolate/_ppoly.cpython-313-aarch64-linux-musl.so +0 -0
  162. scipy/interpolate/_rbf.py +2 -2
  163. scipy/interpolate/_rbfinterp.py +1 -1
  164. scipy/interpolate/_rbfinterp_pythran.cpython-313-aarch64-linux-musl.so +0 -0
  165. scipy/interpolate/_rgi.py +31 -26
  166. scipy/interpolate/_rgi_cython.cpython-313-aarch64-linux-musl.so +0 -0
  167. scipy/interpolate/dfitpack.py +0 -20
  168. scipy/interpolate/interpnd.py +1 -2
  169. scipy/interpolate/tests/test_bary_rational.py +2 -2
  170. scipy/interpolate/tests/test_bsplines.py +97 -1
  171. scipy/interpolate/tests/test_fitpack2.py +39 -1
  172. scipy/interpolate/tests/test_interpnd.py +32 -20
  173. scipy/interpolate/tests/test_interpolate.py +48 -4
  174. scipy/interpolate/tests/test_rgi.py +2 -1
  175. scipy/io/_fast_matrix_market/__init__.py +2 -0
  176. scipy/io/_fast_matrix_market/_fmm_core.cpython-313-aarch64-linux-musl.so +0 -0
  177. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  178. scipy/io/_harwell_boeing/hb.py +7 -11
  179. scipy/io/_idl.py +5 -7
  180. scipy/io/_netcdf.py +15 -5
  181. scipy/io/_test_fortran.cpython-313-aarch64-linux-musl.so +0 -0
  182. scipy/io/arff/tests/test_arffread.py +3 -3
  183. scipy/io/matlab/__init__.py +5 -3
  184. scipy/io/matlab/_mio.py +4 -1
  185. scipy/io/matlab/_mio5.py +19 -13
  186. scipy/io/matlab/_mio5_utils.cpython-313-aarch64-linux-musl.so +0 -0
  187. scipy/io/matlab/_mio_utils.cpython-313-aarch64-linux-musl.so +0 -0
  188. scipy/io/matlab/_miobase.py +4 -1
  189. scipy/io/matlab/_streams.cpython-313-aarch64-linux-musl.so +0 -0
  190. scipy/io/matlab/tests/test_mio.py +46 -18
  191. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  192. scipy/io/tests/test_mmio.py +7 -1
  193. scipy/io/tests/test_wavfile.py +41 -0
  194. scipy/io/wavfile.py +57 -10
  195. scipy/linalg/_basic.py +113 -86
  196. scipy/linalg/_cythonized_array_utils.cpython-313-aarch64-linux-musl.so +0 -0
  197. scipy/linalg/_decomp.py +22 -9
  198. scipy/linalg/_decomp_cholesky.py +28 -13
  199. scipy/linalg/_decomp_cossin.py +45 -30
  200. scipy/linalg/_decomp_interpolative.cpython-313-aarch64-linux-musl.so +0 -0
  201. scipy/linalg/_decomp_ldl.py +4 -1
  202. scipy/linalg/_decomp_lu.py +18 -6
  203. scipy/linalg/_decomp_lu_cython.cpython-313-aarch64-linux-musl.so +0 -0
  204. scipy/linalg/_decomp_polar.py +2 -0
  205. scipy/linalg/_decomp_qr.py +6 -2
  206. scipy/linalg/_decomp_qz.py +3 -0
  207. scipy/linalg/_decomp_schur.py +3 -1
  208. scipy/linalg/_decomp_svd.py +13 -2
  209. scipy/linalg/_decomp_update.cpython-313-aarch64-linux-musl.so +0 -0
  210. scipy/linalg/_expm_frechet.py +4 -0
  211. scipy/linalg/_fblas.cpython-313-aarch64-linux-musl.so +0 -0
  212. scipy/linalg/_flapack.cpython-313-aarch64-linux-musl.so +0 -0
  213. scipy/linalg/_linalg_pythran.cpython-313-aarch64-linux-musl.so +0 -0
  214. scipy/linalg/_matfuncs.py +187 -4
  215. scipy/linalg/_matfuncs_expm.cpython-313-aarch64-linux-musl.so +0 -0
  216. scipy/linalg/_matfuncs_schur_sqrtm.cpython-313-aarch64-linux-musl.so +0 -0
  217. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  218. scipy/linalg/_matfuncs_sqrtm_triu.cpython-313-aarch64-linux-musl.so +0 -0
  219. scipy/linalg/_procrustes.py +2 -0
  220. scipy/linalg/_sketches.py +17 -6
  221. scipy/linalg/_solve_toeplitz.cpython-313-aarch64-linux-musl.so +0 -0
  222. scipy/linalg/_solvers.py +7 -2
  223. scipy/linalg/_special_matrices.py +26 -36
  224. scipy/linalg/cython_blas.cpython-313-aarch64-linux-musl.so +0 -0
  225. scipy/linalg/cython_lapack.cpython-313-aarch64-linux-musl.so +0 -0
  226. scipy/linalg/lapack.py +22 -2
  227. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  228. scipy/linalg/tests/test_basic.py +31 -16
  229. scipy/linalg/tests/test_batch.py +588 -0
  230. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  231. scipy/linalg/tests/test_decomp.py +40 -3
  232. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  233. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  234. scipy/linalg/tests/test_lapack.py +115 -7
  235. scipy/linalg/tests/test_matfuncs.py +157 -102
  236. scipy/linalg/tests/test_procrustes.py +0 -7
  237. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  238. scipy/linalg/tests/test_special_matrices.py +1 -5
  239. scipy/ndimage/__init__.py +1 -0
  240. scipy/ndimage/_ctest.cpython-313-aarch64-linux-musl.so +0 -0
  241. scipy/ndimage/_cytest.cpython-313-aarch64-linux-musl.so +0 -0
  242. scipy/ndimage/_delegators.py +8 -2
  243. scipy/ndimage/_filters.py +453 -5
  244. scipy/ndimage/_interpolation.py +36 -6
  245. scipy/ndimage/_measurements.py +4 -2
  246. scipy/ndimage/_morphology.py +5 -0
  247. scipy/ndimage/_nd_image.cpython-313-aarch64-linux-musl.so +0 -0
  248. scipy/ndimage/_ni_docstrings.py +5 -1
  249. scipy/ndimage/_ni_label.cpython-313-aarch64-linux-musl.so +0 -0
  250. scipy/ndimage/_ni_support.py +1 -5
  251. scipy/ndimage/_rank_filter_1d.cpython-313-aarch64-linux-musl.so +0 -0
  252. scipy/ndimage/_support_alternative_backends.py +18 -6
  253. scipy/ndimage/tests/test_filters.py +370 -259
  254. scipy/ndimage/tests/test_fourier.py +7 -9
  255. scipy/ndimage/tests/test_interpolation.py +68 -61
  256. scipy/ndimage/tests/test_measurements.py +18 -35
  257. scipy/ndimage/tests/test_morphology.py +143 -131
  258. scipy/ndimage/tests/test_splines.py +1 -3
  259. scipy/odr/__odrpack.cpython-313-aarch64-linux-musl.so +0 -0
  260. scipy/optimize/_basinhopping.py +13 -7
  261. scipy/optimize/_bglu_dense.cpython-313-aarch64-linux-musl.so +0 -0
  262. scipy/optimize/_bracket.py +17 -24
  263. scipy/optimize/_chandrupatla.py +9 -10
  264. scipy/optimize/_cobyla_py.py +104 -123
  265. scipy/optimize/_constraints.py +14 -10
  266. scipy/optimize/_differentiable_functions.py +371 -230
  267. scipy/optimize/_differentialevolution.py +4 -3
  268. scipy/optimize/_direct.cpython-313-aarch64-linux-musl.so +0 -0
  269. scipy/optimize/_dual_annealing.py +1 -1
  270. scipy/optimize/_elementwise.py +1 -4
  271. scipy/optimize/_group_columns.cpython-313-aarch64-linux-musl.so +0 -0
  272. scipy/optimize/_highspy/_core.cpython-313-aarch64-linux-musl.so +0 -0
  273. scipy/optimize/_highspy/_highs_options.cpython-313-aarch64-linux-musl.so +0 -0
  274. scipy/optimize/_lbfgsb.cpython-313-aarch64-linux-musl.so +0 -0
  275. scipy/optimize/_lbfgsb_py.py +57 -16
  276. scipy/optimize/_linprog_doc.py +2 -2
  277. scipy/optimize/_linprog_highs.py +2 -2
  278. scipy/optimize/_linprog_ip.py +25 -10
  279. scipy/optimize/_linprog_util.py +14 -16
  280. scipy/optimize/_lsap.cpython-313-aarch64-linux-musl.so +0 -0
  281. scipy/optimize/_lsq/common.py +3 -3
  282. scipy/optimize/_lsq/dogbox.py +16 -2
  283. scipy/optimize/_lsq/givens_elimination.cpython-313-aarch64-linux-musl.so +0 -0
  284. scipy/optimize/_lsq/least_squares.py +198 -126
  285. scipy/optimize/_lsq/lsq_linear.py +6 -6
  286. scipy/optimize/_lsq/trf.py +35 -8
  287. scipy/optimize/_milp.py +3 -1
  288. scipy/optimize/_minimize.py +105 -36
  289. scipy/optimize/_minpack.cpython-313-aarch64-linux-musl.so +0 -0
  290. scipy/optimize/_minpack_py.py +21 -14
  291. scipy/optimize/_moduleTNC.cpython-313-aarch64-linux-musl.so +0 -0
  292. scipy/optimize/_nnls.py +20 -21
  293. scipy/optimize/_nonlin.py +34 -3
  294. scipy/optimize/_numdiff.py +288 -110
  295. scipy/optimize/_optimize.py +86 -48
  296. scipy/optimize/_pava_pybind.cpython-313-aarch64-linux-musl.so +0 -0
  297. scipy/optimize/_remove_redundancy.py +5 -5
  298. scipy/optimize/_root_scalar.py +1 -1
  299. scipy/optimize/_shgo.py +6 -0
  300. scipy/optimize/_shgo_lib/_complex.py +1 -1
  301. scipy/optimize/_slsqp_py.py +216 -124
  302. scipy/optimize/_slsqplib.cpython-313-aarch64-linux-musl.so +0 -0
  303. scipy/optimize/_spectral.py +1 -1
  304. scipy/optimize/_tnc.py +8 -1
  305. scipy/optimize/_trlib/_trlib.cpython-313-aarch64-linux-musl.so +0 -0
  306. scipy/optimize/_trustregion.py +20 -6
  307. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  308. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  309. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  310. scipy/optimize/_trustregion_constr/projections.py +12 -8
  311. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  312. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  313. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  314. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  315. scipy/optimize/_trustregion_exact.py +0 -1
  316. scipy/optimize/_zeros.cpython-313-aarch64-linux-musl.so +0 -0
  317. scipy/optimize/_zeros_py.py +97 -17
  318. scipy/optimize/cython_optimize/_zeros.cpython-313-aarch64-linux-musl.so +0 -0
  319. scipy/optimize/slsqp.py +0 -1
  320. scipy/optimize/tests/test__basinhopping.py +1 -1
  321. scipy/optimize/tests/test__differential_evolution.py +4 -4
  322. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  323. scipy/optimize/tests/test__numdiff.py +66 -22
  324. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  325. scipy/optimize/tests/test__shgo.py +9 -1
  326. scipy/optimize/tests/test_bracket.py +36 -46
  327. scipy/optimize/tests/test_chandrupatla.py +133 -135
  328. scipy/optimize/tests/test_cobyla.py +74 -45
  329. scipy/optimize/tests/test_constraints.py +1 -1
  330. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  331. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  332. scipy/optimize/tests/test_least_squares.py +125 -13
  333. scipy/optimize/tests/test_linear_assignment.py +3 -3
  334. scipy/optimize/tests/test_linprog.py +3 -3
  335. scipy/optimize/tests/test_lsq_linear.py +6 -6
  336. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  337. scipy/optimize/tests/test_minpack.py +4 -4
  338. scipy/optimize/tests/test_nnls.py +43 -3
  339. scipy/optimize/tests/test_nonlin.py +36 -0
  340. scipy/optimize/tests/test_optimize.py +95 -17
  341. scipy/optimize/tests/test_slsqp.py +36 -4
  342. scipy/optimize/tests/test_zeros.py +34 -1
  343. scipy/signal/__init__.py +12 -23
  344. scipy/signal/_delegators.py +568 -0
  345. scipy/signal/_filter_design.py +459 -241
  346. scipy/signal/_fir_filter_design.py +262 -90
  347. scipy/signal/_lti_conversion.py +3 -2
  348. scipy/signal/_ltisys.py +118 -91
  349. scipy/signal/_max_len_seq_inner.cpython-313-aarch64-linux-musl.so +0 -0
  350. scipy/signal/_peak_finding_utils.cpython-313-aarch64-linux-musl.so +0 -0
  351. scipy/signal/_polyutils.py +172 -0
  352. scipy/signal/_short_time_fft.py +519 -70
  353. scipy/signal/_signal_api.py +30 -0
  354. scipy/signal/_signaltools.py +719 -399
  355. scipy/signal/_sigtools.cpython-313-aarch64-linux-musl.so +0 -0
  356. scipy/signal/_sosfilt.cpython-313-aarch64-linux-musl.so +0 -0
  357. scipy/signal/_spectral_py.py +230 -50
  358. scipy/signal/_spline.cpython-313-aarch64-linux-musl.so +0 -0
  359. scipy/signal/_spline_filters.py +108 -68
  360. scipy/signal/_support_alternative_backends.py +73 -0
  361. scipy/signal/_upfirdn.py +4 -1
  362. scipy/signal/_upfirdn_apply.cpython-313-aarch64-linux-musl.so +0 -0
  363. scipy/signal/_waveforms.py +2 -11
  364. scipy/signal/_wavelets.py +1 -1
  365. scipy/signal/fir_filter_design.py +1 -0
  366. scipy/signal/spline.py +4 -11
  367. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  368. scipy/signal/tests/test_bsplines.py +114 -79
  369. scipy/signal/tests/test_cont2discrete.py +9 -2
  370. scipy/signal/tests/test_filter_design.py +721 -481
  371. scipy/signal/tests/test_fir_filter_design.py +332 -140
  372. scipy/signal/tests/test_savitzky_golay.py +4 -3
  373. scipy/signal/tests/test_short_time_fft.py +221 -3
  374. scipy/signal/tests/test_signaltools.py +2144 -1348
  375. scipy/signal/tests/test_spectral.py +50 -6
  376. scipy/signal/tests/test_splines.py +161 -96
  377. scipy/signal/tests/test_upfirdn.py +84 -50
  378. scipy/signal/tests/test_waveforms.py +20 -0
  379. scipy/signal/tests/test_windows.py +607 -466
  380. scipy/signal/windows/_windows.py +287 -148
  381. scipy/sparse/__init__.py +23 -4
  382. scipy/sparse/_base.py +270 -108
  383. scipy/sparse/_bsr.py +7 -4
  384. scipy/sparse/_compressed.py +59 -231
  385. scipy/sparse/_construct.py +90 -38
  386. scipy/sparse/_coo.py +115 -181
  387. scipy/sparse/_csc.py +4 -4
  388. scipy/sparse/_csparsetools.cpython-313-aarch64-linux-musl.so +0 -0
  389. scipy/sparse/_csr.py +2 -2
  390. scipy/sparse/_data.py +48 -48
  391. scipy/sparse/_dia.py +105 -18
  392. scipy/sparse/_dok.py +0 -23
  393. scipy/sparse/_index.py +4 -4
  394. scipy/sparse/_matrix.py +23 -0
  395. scipy/sparse/_sparsetools.cpython-313-aarch64-linux-musl.so +0 -0
  396. scipy/sparse/_sputils.py +37 -22
  397. scipy/sparse/base.py +0 -9
  398. scipy/sparse/bsr.py +0 -14
  399. scipy/sparse/compressed.py +0 -23
  400. scipy/sparse/construct.py +0 -6
  401. scipy/sparse/coo.py +0 -14
  402. scipy/sparse/csc.py +0 -3
  403. scipy/sparse/csgraph/_flow.cpython-313-aarch64-linux-musl.so +0 -0
  404. scipy/sparse/csgraph/_matching.cpython-313-aarch64-linux-musl.so +0 -0
  405. scipy/sparse/csgraph/_min_spanning_tree.cpython-313-aarch64-linux-musl.so +0 -0
  406. scipy/sparse/csgraph/_reordering.cpython-313-aarch64-linux-musl.so +0 -0
  407. scipy/sparse/csgraph/_shortest_path.cpython-313-aarch64-linux-musl.so +0 -0
  408. scipy/sparse/csgraph/_tools.cpython-313-aarch64-linux-musl.so +0 -0
  409. scipy/sparse/csgraph/_traversal.cpython-313-aarch64-linux-musl.so +0 -0
  410. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  411. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  412. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  413. scipy/sparse/csr.py +0 -5
  414. scipy/sparse/data.py +1 -6
  415. scipy/sparse/dia.py +0 -7
  416. scipy/sparse/dok.py +0 -10
  417. scipy/sparse/linalg/_dsolve/_superlu.cpython-313-aarch64-linux-musl.so +0 -0
  418. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  419. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  420. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313-aarch64-linux-musl.so +0 -0
  421. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  422. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  423. scipy/sparse/linalg/_interface.py +17 -18
  424. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  425. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  426. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  427. scipy/sparse/linalg/_isolve/minres.py +5 -5
  428. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  429. scipy/sparse/linalg/_isolve/utils.py +2 -8
  430. scipy/sparse/linalg/_matfuncs.py +1 -1
  431. scipy/sparse/linalg/_norm.py +1 -1
  432. scipy/sparse/linalg/_propack/_cpropack.cpython-313-aarch64-linux-musl.so +0 -0
  433. scipy/sparse/linalg/_propack/_dpropack.cpython-313-aarch64-linux-musl.so +0 -0
  434. scipy/sparse/linalg/_propack/_spropack.cpython-313-aarch64-linux-musl.so +0 -0
  435. scipy/sparse/linalg/_propack/_zpropack.cpython-313-aarch64-linux-musl.so +0 -0
  436. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  437. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  438. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  439. scipy/sparse/tests/test_base.py +214 -42
  440. scipy/sparse/tests/test_common1d.py +7 -7
  441. scipy/sparse/tests/test_construct.py +1 -1
  442. scipy/sparse/tests/test_coo.py +272 -4
  443. scipy/sparse/tests/test_sparsetools.py +5 -0
  444. scipy/sparse/tests/test_sputils.py +36 -7
  445. scipy/spatial/_ckdtree.cpython-313-aarch64-linux-musl.so +0 -0
  446. scipy/spatial/_distance_pybind.cpython-313-aarch64-linux-musl.so +0 -0
  447. scipy/spatial/_distance_wrap.cpython-313-aarch64-linux-musl.so +0 -0
  448. scipy/spatial/_hausdorff.cpython-313-aarch64-linux-musl.so +0 -0
  449. scipy/spatial/_qhull.cpython-313-aarch64-linux-musl.so +0 -0
  450. scipy/spatial/_voronoi.cpython-313-aarch64-linux-musl.so +0 -0
  451. scipy/spatial/distance.py +49 -42
  452. scipy/spatial/tests/test_distance.py +15 -1
  453. scipy/spatial/tests/test_kdtree.py +1 -0
  454. scipy/spatial/tests/test_qhull.py +7 -2
  455. scipy/spatial/transform/__init__.py +5 -3
  456. scipy/spatial/transform/_rigid_transform.cpython-313-aarch64-linux-musl.so +0 -0
  457. scipy/spatial/transform/_rotation.cpython-313-aarch64-linux-musl.so +0 -0
  458. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  459. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  460. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  461. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  462. scipy/special/__init__.py +1 -47
  463. scipy/special/_add_newdocs.py +34 -772
  464. scipy/special/_basic.py +22 -25
  465. scipy/special/_comb.cpython-313-aarch64-linux-musl.so +0 -0
  466. scipy/special/_ellip_harm_2.cpython-313-aarch64-linux-musl.so +0 -0
  467. scipy/special/_gufuncs.cpython-313-aarch64-linux-musl.so +0 -0
  468. scipy/special/_logsumexp.py +67 -58
  469. scipy/special/_orthogonal.pyi +1 -1
  470. scipy/special/_specfun.cpython-313-aarch64-linux-musl.so +0 -0
  471. scipy/special/_special_ufuncs.cpython-313-aarch64-linux-musl.so +0 -0
  472. scipy/special/_spherical_bessel.py +4 -4
  473. scipy/special/_support_alternative_backends.py +212 -119
  474. scipy/special/_test_internal.cpython-313-aarch64-linux-musl.so +0 -0
  475. scipy/special/_testutils.py +4 -4
  476. scipy/special/_ufuncs.cpython-313-aarch64-linux-musl.so +0 -0
  477. scipy/special/_ufuncs.pyi +1 -0
  478. scipy/special/_ufuncs.pyx +215 -1400
  479. scipy/special/_ufuncs_cxx.cpython-313-aarch64-linux-musl.so +0 -0
  480. scipy/special/_ufuncs_cxx.pxd +2 -15
  481. scipy/special/_ufuncs_cxx.pyx +5 -44
  482. scipy/special/_ufuncs_cxx_defs.h +2 -16
  483. scipy/special/_ufuncs_defs.h +0 -8
  484. scipy/special/cython_special.cpython-313-aarch64-linux-musl.so +0 -0
  485. scipy/special/cython_special.pxd +1 -1
  486. scipy/special/tests/_cython_examples/meson.build +10 -1
  487. scipy/special/tests/test_basic.py +153 -20
  488. scipy/special/tests/test_boost_ufuncs.py +3 -0
  489. scipy/special/tests/test_cdflib.py +35 -11
  490. scipy/special/tests/test_gammainc.py +16 -0
  491. scipy/special/tests/test_hyp2f1.py +2 -2
  492. scipy/special/tests/test_log1mexp.py +85 -0
  493. scipy/special/tests/test_logsumexp.py +206 -64
  494. scipy/special/tests/test_mpmath.py +1 -0
  495. scipy/special/tests/test_nan_inputs.py +1 -1
  496. scipy/special/tests/test_orthogonal.py +17 -18
  497. scipy/special/tests/test_sf_error.py +3 -2
  498. scipy/special/tests/test_sph_harm.py +6 -7
  499. scipy/special/tests/test_support_alternative_backends.py +211 -76
  500. scipy/stats/__init__.py +4 -1
  501. scipy/stats/_ansari_swilk_statistics.cpython-313-aarch64-linux-musl.so +0 -0
  502. scipy/stats/_axis_nan_policy.py +5 -12
  503. scipy/stats/_biasedurn.cpython-313-aarch64-linux-musl.so +0 -0
  504. scipy/stats/_continued_fraction.py +387 -0
  505. scipy/stats/_continuous_distns.py +277 -310
  506. scipy/stats/_correlation.py +1 -1
  507. scipy/stats/_covariance.py +6 -3
  508. scipy/stats/_discrete_distns.py +39 -32
  509. scipy/stats/_distn_infrastructure.py +39 -12
  510. scipy/stats/_distribution_infrastructure.py +900 -238
  511. scipy/stats/_entropy.py +9 -10
  512. scipy/{_lib → stats}/_finite_differences.py +1 -1
  513. scipy/stats/_hypotests.py +83 -50
  514. scipy/stats/_kde.py +53 -49
  515. scipy/stats/_ksstats.py +1 -1
  516. scipy/stats/_levy_stable/__init__.py +7 -15
  517. scipy/stats/_levy_stable/levyst.cpython-313-aarch64-linux-musl.so +0 -0
  518. scipy/stats/_morestats.py +118 -73
  519. scipy/stats/_mstats_basic.py +13 -17
  520. scipy/stats/_mstats_extras.py +8 -8
  521. scipy/stats/_multivariate.py +89 -113
  522. scipy/stats/_new_distributions.py +97 -20
  523. scipy/stats/_page_trend_test.py +12 -5
  524. scipy/stats/_probability_distribution.py +265 -43
  525. scipy/stats/_qmc.py +14 -9
  526. scipy/stats/_qmc_cy.cpython-313-aarch64-linux-musl.so +0 -0
  527. scipy/stats/_qmvnt.py +16 -95
  528. scipy/stats/_qmvnt_cy.cpython-313-aarch64-linux-musl.so +0 -0
  529. scipy/stats/_quantile.py +335 -0
  530. scipy/stats/_rcont/rcont.cpython-313-aarch64-linux-musl.so +0 -0
  531. scipy/stats/_resampling.py +4 -29
  532. scipy/stats/_sampling.py +1 -1
  533. scipy/stats/_sobol.cpython-313-aarch64-linux-musl.so +0 -0
  534. scipy/stats/_stats.cpython-313-aarch64-linux-musl.so +0 -0
  535. scipy/stats/_stats_mstats_common.py +21 -2
  536. scipy/stats/_stats_py.py +550 -476
  537. scipy/stats/_stats_pythran.cpython-313-aarch64-linux-musl.so +0 -0
  538. scipy/stats/_unuran/unuran_wrapper.cpython-313-aarch64-linux-musl.so +0 -0
  539. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  540. scipy/stats/_variation.py +6 -8
  541. scipy/stats/_wilcoxon.py +13 -7
  542. scipy/stats/tests/common_tests.py +6 -4
  543. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  544. scipy/stats/tests/test_continued_fraction.py +173 -0
  545. scipy/stats/tests/test_continuous.py +379 -60
  546. scipy/stats/tests/test_continuous_basic.py +18 -12
  547. scipy/stats/tests/test_discrete_basic.py +14 -8
  548. scipy/stats/tests/test_discrete_distns.py +16 -16
  549. scipy/stats/tests/test_distributions.py +95 -75
  550. scipy/stats/tests/test_entropy.py +40 -48
  551. scipy/stats/tests/test_fit.py +4 -3
  552. scipy/stats/tests/test_hypotests.py +153 -24
  553. scipy/stats/tests/test_kdeoth.py +109 -41
  554. scipy/stats/tests/test_marray.py +289 -0
  555. scipy/stats/tests/test_morestats.py +79 -47
  556. scipy/stats/tests/test_mstats_basic.py +3 -3
  557. scipy/stats/tests/test_multivariate.py +434 -83
  558. scipy/stats/tests/test_qmc.py +13 -10
  559. scipy/stats/tests/test_quantile.py +199 -0
  560. scipy/stats/tests/test_rank.py +119 -112
  561. scipy/stats/tests/test_resampling.py +47 -56
  562. scipy/stats/tests/test_sampling.py +9 -4
  563. scipy/stats/tests/test_stats.py +799 -939
  564. scipy/stats/tests/test_variation.py +8 -6
  565. scipy/version.py +2 -2
  566. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  567. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  568. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +1262 -1269
  569. scipy.libs/libgcc_s-69c45f16.so.1 +0 -0
  570. scipy.libs/libgfortran-db0b6589.so.5.0.0 +0 -0
  571. scipy.libs/{libstdc++-1b614e01.so.6.0.32 → libstdc++-1f1a71be.so.6.0.33} +0 -0
  572. scipy/_lib/array_api_extra/_funcs.py +0 -484
  573. scipy/_lib/array_api_extra/_typing.py +0 -8
  574. scipy/interpolate/_bspl.cpython-313-aarch64-linux-musl.so +0 -0
  575. scipy/optimize/_cobyla.cpython-313-aarch64-linux-musl.so +0 -0
  576. scipy/optimize/_cython_nnls.cpython-313-aarch64-linux-musl.so +0 -0
  577. scipy/optimize/_slsqp.cpython-313-aarch64-linux-musl.so +0 -0
  578. scipy/spatial/qhull_src/COPYING.txt +0 -38
  579. scipy/special/libsf_error_state.so +0 -0
  580. scipy/special/tests/test_log_softmax.py +0 -109
  581. scipy/special/tests/test_xsf_cuda.py +0 -114
  582. scipy/special/xsf/binom.h +0 -89
  583. scipy/special/xsf/cdflib.h +0 -100
  584. scipy/special/xsf/cephes/airy.h +0 -307
  585. scipy/special/xsf/cephes/besselpoly.h +0 -51
  586. scipy/special/xsf/cephes/beta.h +0 -257
  587. scipy/special/xsf/cephes/cbrt.h +0 -131
  588. scipy/special/xsf/cephes/chbevl.h +0 -85
  589. scipy/special/xsf/cephes/chdtr.h +0 -193
  590. scipy/special/xsf/cephes/const.h +0 -87
  591. scipy/special/xsf/cephes/ellie.h +0 -293
  592. scipy/special/xsf/cephes/ellik.h +0 -251
  593. scipy/special/xsf/cephes/ellpe.h +0 -107
  594. scipy/special/xsf/cephes/ellpk.h +0 -117
  595. scipy/special/xsf/cephes/expn.h +0 -260
  596. scipy/special/xsf/cephes/gamma.h +0 -398
  597. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  598. scipy/special/xsf/cephes/hyperg.h +0 -361
  599. scipy/special/xsf/cephes/i0.h +0 -149
  600. scipy/special/xsf/cephes/i1.h +0 -158
  601. scipy/special/xsf/cephes/igam.h +0 -421
  602. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  603. scipy/special/xsf/cephes/igami.h +0 -313
  604. scipy/special/xsf/cephes/j0.h +0 -225
  605. scipy/special/xsf/cephes/j1.h +0 -198
  606. scipy/special/xsf/cephes/jv.h +0 -715
  607. scipy/special/xsf/cephes/k0.h +0 -164
  608. scipy/special/xsf/cephes/k1.h +0 -163
  609. scipy/special/xsf/cephes/kn.h +0 -243
  610. scipy/special/xsf/cephes/lanczos.h +0 -112
  611. scipy/special/xsf/cephes/ndtr.h +0 -275
  612. scipy/special/xsf/cephes/poch.h +0 -85
  613. scipy/special/xsf/cephes/polevl.h +0 -167
  614. scipy/special/xsf/cephes/psi.h +0 -194
  615. scipy/special/xsf/cephes/rgamma.h +0 -111
  616. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  617. scipy/special/xsf/cephes/shichi.h +0 -248
  618. scipy/special/xsf/cephes/sici.h +0 -224
  619. scipy/special/xsf/cephes/sindg.h +0 -221
  620. scipy/special/xsf/cephes/tandg.h +0 -139
  621. scipy/special/xsf/cephes/trig.h +0 -58
  622. scipy/special/xsf/cephes/unity.h +0 -186
  623. scipy/special/xsf/cephes/zeta.h +0 -172
  624. scipy/special/xsf/config.h +0 -304
  625. scipy/special/xsf/digamma.h +0 -205
  626. scipy/special/xsf/error.h +0 -57
  627. scipy/special/xsf/evalpoly.h +0 -47
  628. scipy/special/xsf/expint.h +0 -266
  629. scipy/special/xsf/hyp2f1.h +0 -694
  630. scipy/special/xsf/iv_ratio.h +0 -173
  631. scipy/special/xsf/lambertw.h +0 -150
  632. scipy/special/xsf/loggamma.h +0 -163
  633. scipy/special/xsf/sici.h +0 -200
  634. scipy/special/xsf/tools.h +0 -427
  635. scipy/special/xsf/trig.h +0 -164
  636. scipy/special/xsf/wright_bessel.h +0 -843
  637. scipy/special/xsf/zlog1.h +0 -35
  638. scipy/stats/_mvn.cpython-313-aarch64-linux-musl.so +0 -0
  639. scipy.libs/libgcc_s-7393e603.so.1 +0 -0
  640. scipy.libs/libgfortran-eb933d8e.so.5.0.0 +0 -0
  641. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
@@ -38,6 +38,14 @@ class TestGammainc:
38
38
  else:
39
39
  assert result == desired
40
40
 
41
+ @pytest.mark.parametrize("x", [-np.inf, -1.0, -0.0, 0.0, np.inf, np.nan])
42
+ def test_a_nan(self, x):
43
+ assert np.isnan(sc.gammainc(np.nan, x))
44
+
45
+ @pytest.mark.parametrize("a", [-np.inf, -1.0, -0.0, 0.0, np.inf, np.nan])
46
+ def test_x_nan(self, a):
47
+ assert np.isnan(sc.gammainc(a, np.nan))
48
+
41
49
  def test_infinite_limits(self):
42
50
  # Test that large arguments converge to the hard-coded limits
43
51
  # at infinity.
@@ -108,6 +116,14 @@ class TestGammaincc:
108
116
  else:
109
117
  assert result == desired
110
118
 
119
+ @pytest.mark.parametrize("x", [-np.inf, -1.0, -0.0, 0.0, np.inf, np.nan])
120
+ def test_a_nan(self, x):
121
+ assert np.isnan(sc.gammaincc(np.nan, x))
122
+
123
+ @pytest.mark.parametrize("a", [-np.inf, -1.0, -0.0, 0.0, np.inf, np.nan])
124
+ def test_x_nan(self, a):
125
+ assert np.isnan(sc.gammaincc(a, np.nan))
126
+
111
127
  def test_infinite_limits(self):
112
128
  # Test that large arguments converge to the hard-coded limits
113
129
  # at infinity.
@@ -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")