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