scipy 1.15.3__cp313-cp313t-macosx_14_0_arm64.whl → 1.16.0rc1__cp313-cp313t-macosx_14_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (626) hide show
  1. scipy/__config__.py +3 -3
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cpython-313t-darwin.so +0 -0
  4. scipy/_lib/_array_api.py +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-313t-darwin.so +0 -0
  8. scipy/_lib/_docscrape.py +1 -1
  9. scipy/_lib/_elementwise_iterative_method.py +15 -26
  10. scipy/_lib/_sparse.py +41 -0
  11. scipy/_lib/_test_deprecation_call.cpython-313t-darwin.so +0 -0
  12. scipy/_lib/_testutils.py +6 -2
  13. scipy/_lib/_util.py +222 -125
  14. scipy/_lib/array_api_compat/__init__.py +4 -4
  15. scipy/_lib/array_api_compat/_internal.py +19 -6
  16. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  17. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  18. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  19. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  20. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  21. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  22. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  23. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  24. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  25. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  26. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  27. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  28. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  29. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  30. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  31. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  32. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  33. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  34. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  35. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  36. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  37. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  38. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  39. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  40. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  41. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  42. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  43. scipy/_lib/array_api_extra/__init__.py +26 -3
  44. scipy/_lib/array_api_extra/_delegation.py +171 -0
  45. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  46. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  47. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  48. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  49. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  50. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  51. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  52. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  53. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  54. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  57. scipy/_lib/array_api_extra/testing.py +359 -0
  58. scipy/_lib/decorator.py +2 -2
  59. scipy/_lib/doccer.py +1 -7
  60. scipy/_lib/messagestream.cpython-313t-darwin.so +0 -0
  61. scipy/_lib/pyprima/__init__.py +212 -0
  62. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  63. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  64. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  65. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  66. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  67. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  68. scipy/_lib/pyprima/cobyla/update.py +289 -0
  69. scipy/_lib/pyprima/common/__init__.py +0 -0
  70. scipy/_lib/pyprima/common/_bounds.py +34 -0
  71. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  72. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  73. scipy/_lib/pyprima/common/_project.py +173 -0
  74. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  75. scipy/_lib/pyprima/common/consts.py +47 -0
  76. scipy/_lib/pyprima/common/evaluate.py +99 -0
  77. scipy/_lib/pyprima/common/history.py +38 -0
  78. scipy/_lib/pyprima/common/infos.py +30 -0
  79. scipy/_lib/pyprima/common/linalg.py +435 -0
  80. scipy/_lib/pyprima/common/message.py +290 -0
  81. scipy/_lib/pyprima/common/powalg.py +131 -0
  82. scipy/_lib/pyprima/common/preproc.py +277 -0
  83. scipy/_lib/pyprima/common/present.py +5 -0
  84. scipy/_lib/pyprima/common/ratio.py +54 -0
  85. scipy/_lib/pyprima/common/redrho.py +47 -0
  86. scipy/_lib/pyprima/common/selectx.py +296 -0
  87. scipy/_lib/tests/test__util.py +105 -121
  88. scipy/_lib/tests/test_array_api.py +166 -35
  89. scipy/_lib/tests/test_bunch.py +7 -0
  90. scipy/_lib/tests/test_ccallback.py +2 -10
  91. scipy/_lib/tests/test_public_api.py +13 -0
  92. scipy/cluster/_hierarchy.cpython-313t-darwin.so +0 -0
  93. scipy/cluster/_optimal_leaf_ordering.cpython-313t-darwin.so +0 -0
  94. scipy/cluster/_vq.cpython-313t-darwin.so +0 -0
  95. scipy/cluster/hierarchy.py +393 -223
  96. scipy/cluster/tests/test_hierarchy.py +273 -335
  97. scipy/cluster/tests/test_vq.py +45 -61
  98. scipy/cluster/vq.py +39 -35
  99. scipy/conftest.py +263 -157
  100. scipy/constants/_constants.py +4 -1
  101. scipy/constants/tests/test_codata.py +2 -2
  102. scipy/constants/tests/test_constants.py +11 -18
  103. scipy/datasets/_download_all.py +15 -1
  104. scipy/datasets/_fetchers.py +7 -1
  105. scipy/datasets/_utils.py +1 -1
  106. scipy/differentiate/_differentiate.py +25 -25
  107. scipy/differentiate/tests/test_differentiate.py +24 -25
  108. scipy/fft/_basic.py +20 -0
  109. scipy/fft/_helper.py +3 -34
  110. scipy/fft/_pocketfft/helper.py +29 -1
  111. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  112. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  113. scipy/fft/_realtransforms.py +13 -0
  114. scipy/fft/tests/test_basic.py +27 -25
  115. scipy/fft/tests/test_fftlog.py +16 -7
  116. scipy/fft/tests/test_helper.py +18 -34
  117. scipy/fft/tests/test_real_transforms.py +8 -10
  118. scipy/fftpack/convolve.cpython-313t-darwin.so +0 -0
  119. scipy/fftpack/tests/test_basic.py +2 -4
  120. scipy/fftpack/tests/test_real_transforms.py +8 -9
  121. scipy/integrate/_bvp.py +9 -3
  122. scipy/integrate/_cubature.py +3 -2
  123. scipy/integrate/_dop.cpython-313t-darwin.so +0 -0
  124. scipy/integrate/_lsoda.cpython-313t-darwin.so +0 -0
  125. scipy/integrate/_ode.py +9 -2
  126. scipy/integrate/_odepack.cpython-313t-darwin.so +0 -0
  127. scipy/integrate/_quad_vec.py +21 -29
  128. scipy/integrate/_quadpack.cpython-313t-darwin.so +0 -0
  129. scipy/integrate/_quadpack_py.py +11 -7
  130. scipy/integrate/_quadrature.py +3 -3
  131. scipy/integrate/_rules/_base.py +2 -2
  132. scipy/integrate/_tanhsinh.py +48 -47
  133. scipy/integrate/_test_odeint_banded.cpython-313t-darwin.so +0 -0
  134. scipy/integrate/_vode.cpython-313t-darwin.so +0 -0
  135. scipy/integrate/tests/test__quad_vec.py +0 -6
  136. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  137. scipy/integrate/tests/test_cubature.py +21 -35
  138. scipy/integrate/tests/test_quadrature.py +6 -8
  139. scipy/integrate/tests/test_tanhsinh.py +56 -48
  140. scipy/interpolate/__init__.py +70 -58
  141. scipy/interpolate/_bary_rational.py +22 -22
  142. scipy/interpolate/_bsplines.py +119 -66
  143. scipy/interpolate/_cubic.py +65 -50
  144. scipy/interpolate/_dfitpack.cpython-313t-darwin.so +0 -0
  145. scipy/interpolate/_dierckx.cpython-313t-darwin.so +0 -0
  146. scipy/interpolate/_fitpack.cpython-313t-darwin.so +0 -0
  147. scipy/interpolate/_fitpack2.py +9 -6
  148. scipy/interpolate/_fitpack_impl.py +32 -26
  149. scipy/interpolate/_fitpack_repro.py +23 -19
  150. scipy/interpolate/_interpnd.cpython-313t-darwin.so +0 -0
  151. scipy/interpolate/_interpolate.py +30 -12
  152. scipy/interpolate/_ndbspline.py +13 -18
  153. scipy/interpolate/_ndgriddata.py +5 -8
  154. scipy/interpolate/_polyint.py +95 -31
  155. scipy/interpolate/_ppoly.cpython-313t-darwin.so +0 -0
  156. scipy/interpolate/_rbf.py +2 -2
  157. scipy/interpolate/_rbfinterp.py +1 -1
  158. scipy/interpolate/_rbfinterp_pythran.cpython-313t-darwin.so +0 -0
  159. scipy/interpolate/_rgi.py +31 -26
  160. scipy/interpolate/_rgi_cython.cpython-313t-darwin.so +0 -0
  161. scipy/interpolate/dfitpack.py +0 -20
  162. scipy/interpolate/interpnd.py +1 -2
  163. scipy/interpolate/tests/test_bary_rational.py +2 -2
  164. scipy/interpolate/tests/test_bsplines.py +97 -1
  165. scipy/interpolate/tests/test_fitpack2.py +39 -1
  166. scipy/interpolate/tests/test_interpnd.py +32 -20
  167. scipy/interpolate/tests/test_interpolate.py +48 -4
  168. scipy/interpolate/tests/test_rgi.py +2 -1
  169. scipy/io/_fast_matrix_market/__init__.py +2 -0
  170. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  171. scipy/io/_harwell_boeing/hb.py +7 -11
  172. scipy/io/_idl.py +5 -7
  173. scipy/io/_netcdf.py +15 -5
  174. scipy/io/_test_fortran.cpython-313t-darwin.so +0 -0
  175. scipy/io/arff/tests/test_arffread.py +3 -3
  176. scipy/io/matlab/__init__.py +5 -3
  177. scipy/io/matlab/_mio.py +4 -1
  178. scipy/io/matlab/_mio5.py +19 -13
  179. scipy/io/matlab/_mio5_utils.cpython-313t-darwin.so +0 -0
  180. scipy/io/matlab/_mio_utils.cpython-313t-darwin.so +0 -0
  181. scipy/io/matlab/_miobase.py +4 -1
  182. scipy/io/matlab/_streams.cpython-313t-darwin.so +0 -0
  183. scipy/io/matlab/tests/test_mio.py +46 -18
  184. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  185. scipy/io/tests/test_mmio.py +7 -1
  186. scipy/io/tests/test_wavfile.py +41 -0
  187. scipy/io/wavfile.py +57 -10
  188. scipy/linalg/_basic.py +113 -86
  189. scipy/linalg/_cythonized_array_utils.cpython-313t-darwin.so +0 -0
  190. scipy/linalg/_decomp.py +22 -9
  191. scipy/linalg/_decomp_cholesky.py +28 -13
  192. scipy/linalg/_decomp_cossin.py +45 -30
  193. scipy/linalg/_decomp_interpolative.cpython-313t-darwin.so +0 -0
  194. scipy/linalg/_decomp_ldl.py +4 -1
  195. scipy/linalg/_decomp_lu.py +18 -6
  196. scipy/linalg/_decomp_lu_cython.cpython-313t-darwin.so +0 -0
  197. scipy/linalg/_decomp_polar.py +2 -0
  198. scipy/linalg/_decomp_qr.py +6 -2
  199. scipy/linalg/_decomp_qz.py +3 -0
  200. scipy/linalg/_decomp_schur.py +3 -1
  201. scipy/linalg/_decomp_svd.py +13 -2
  202. scipy/linalg/_decomp_update.cpython-313t-darwin.so +0 -0
  203. scipy/linalg/_expm_frechet.py +4 -0
  204. scipy/linalg/_fblas.cpython-313t-darwin.so +0 -0
  205. scipy/linalg/_flapack.cpython-313t-darwin.so +0 -0
  206. scipy/linalg/_linalg_pythran.cpython-313t-darwin.so +0 -0
  207. scipy/linalg/_matfuncs.py +187 -4
  208. scipy/linalg/_matfuncs_expm.cpython-313t-darwin.so +0 -0
  209. scipy/linalg/_matfuncs_schur_sqrtm.cpython-313t-darwin.so +0 -0
  210. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  211. scipy/linalg/_matfuncs_sqrtm_triu.cpython-313t-darwin.so +0 -0
  212. scipy/linalg/_procrustes.py +2 -0
  213. scipy/linalg/_sketches.py +17 -6
  214. scipy/linalg/_solve_toeplitz.cpython-313t-darwin.so +0 -0
  215. scipy/linalg/_solvers.py +7 -2
  216. scipy/linalg/_special_matrices.py +26 -36
  217. scipy/linalg/cython_blas.cpython-313t-darwin.so +0 -0
  218. scipy/linalg/cython_lapack.cpython-313t-darwin.so +0 -0
  219. scipy/linalg/lapack.py +22 -2
  220. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  221. scipy/linalg/tests/test_basic.py +31 -16
  222. scipy/linalg/tests/test_batch.py +588 -0
  223. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  224. scipy/linalg/tests/test_decomp.py +40 -3
  225. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  226. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  227. scipy/linalg/tests/test_lapack.py +115 -7
  228. scipy/linalg/tests/test_matfuncs.py +157 -102
  229. scipy/linalg/tests/test_procrustes.py +0 -7
  230. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  231. scipy/linalg/tests/test_special_matrices.py +1 -5
  232. scipy/ndimage/__init__.py +1 -0
  233. scipy/ndimage/_cytest.cpython-313t-darwin.so +0 -0
  234. scipy/ndimage/_delegators.py +8 -2
  235. scipy/ndimage/_filters.py +433 -5
  236. scipy/ndimage/_interpolation.py +36 -6
  237. scipy/ndimage/_measurements.py +4 -2
  238. scipy/ndimage/_morphology.py +5 -0
  239. scipy/ndimage/_nd_image.cpython-313t-darwin.so +0 -0
  240. scipy/ndimage/_ni_docstrings.py +5 -1
  241. scipy/ndimage/_ni_label.cpython-313t-darwin.so +0 -0
  242. scipy/ndimage/_ni_support.py +1 -5
  243. scipy/ndimage/_rank_filter_1d.cpython-313t-darwin.so +0 -0
  244. scipy/ndimage/_support_alternative_backends.py +18 -6
  245. scipy/ndimage/tests/test_filters.py +337 -259
  246. scipy/ndimage/tests/test_fourier.py +7 -9
  247. scipy/ndimage/tests/test_interpolation.py +68 -61
  248. scipy/ndimage/tests/test_measurements.py +18 -35
  249. scipy/ndimage/tests/test_morphology.py +143 -131
  250. scipy/ndimage/tests/test_splines.py +1 -3
  251. scipy/odr/__odrpack.cpython-313t-darwin.so +0 -0
  252. scipy/optimize/_basinhopping.py +13 -7
  253. scipy/optimize/_bglu_dense.cpython-313t-darwin.so +0 -0
  254. scipy/optimize/_bracket.py +17 -24
  255. scipy/optimize/_chandrupatla.py +9 -10
  256. scipy/optimize/_cobyla_py.py +104 -123
  257. scipy/optimize/_constraints.py +14 -10
  258. scipy/optimize/_differentiable_functions.py +371 -230
  259. scipy/optimize/_differentialevolution.py +4 -3
  260. scipy/optimize/_direct.cpython-313t-darwin.so +0 -0
  261. scipy/optimize/_dual_annealing.py +1 -1
  262. scipy/optimize/_elementwise.py +1 -4
  263. scipy/optimize/_group_columns.cpython-313t-darwin.so +0 -0
  264. scipy/optimize/_lbfgsb.cpython-313t-darwin.so +0 -0
  265. scipy/optimize/_lbfgsb_py.py +57 -16
  266. scipy/optimize/_linprog_doc.py +2 -2
  267. scipy/optimize/_linprog_highs.py +2 -2
  268. scipy/optimize/_linprog_ip.py +25 -10
  269. scipy/optimize/_linprog_util.py +14 -16
  270. scipy/optimize/_lsap.cpython-313t-darwin.so +0 -0
  271. scipy/optimize/_lsq/common.py +3 -3
  272. scipy/optimize/_lsq/dogbox.py +16 -2
  273. scipy/optimize/_lsq/givens_elimination.cpython-313t-darwin.so +0 -0
  274. scipy/optimize/_lsq/least_squares.py +198 -126
  275. scipy/optimize/_lsq/lsq_linear.py +6 -6
  276. scipy/optimize/_lsq/trf.py +35 -8
  277. scipy/optimize/_milp.py +3 -1
  278. scipy/optimize/_minimize.py +105 -36
  279. scipy/optimize/_minpack.cpython-313t-darwin.so +0 -0
  280. scipy/optimize/_minpack_py.py +21 -14
  281. scipy/optimize/_moduleTNC.cpython-313t-darwin.so +0 -0
  282. scipy/optimize/_nnls.py +20 -21
  283. scipy/optimize/_nonlin.py +34 -3
  284. scipy/optimize/_numdiff.py +288 -110
  285. scipy/optimize/_optimize.py +86 -48
  286. scipy/optimize/_pava_pybind.cpython-313t-darwin.so +0 -0
  287. scipy/optimize/_remove_redundancy.py +5 -5
  288. scipy/optimize/_root_scalar.py +1 -1
  289. scipy/optimize/_shgo.py +6 -0
  290. scipy/optimize/_shgo_lib/_complex.py +1 -1
  291. scipy/optimize/_slsqp_py.py +216 -124
  292. scipy/optimize/_slsqplib.cpython-313t-darwin.so +0 -0
  293. scipy/optimize/_spectral.py +1 -1
  294. scipy/optimize/_tnc.py +8 -1
  295. scipy/optimize/_trlib/_trlib.cpython-313t-darwin.so +0 -0
  296. scipy/optimize/_trustregion.py +20 -6
  297. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  298. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  299. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  300. scipy/optimize/_trustregion_constr/projections.py +12 -8
  301. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  302. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  303. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  304. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  305. scipy/optimize/_trustregion_exact.py +0 -1
  306. scipy/optimize/_zeros.cpython-313t-darwin.so +0 -0
  307. scipy/optimize/_zeros_py.py +97 -17
  308. scipy/optimize/cython_optimize/_zeros.cpython-313t-darwin.so +0 -0
  309. scipy/optimize/slsqp.py +0 -1
  310. scipy/optimize/tests/test__basinhopping.py +1 -1
  311. scipy/optimize/tests/test__differential_evolution.py +4 -4
  312. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  313. scipy/optimize/tests/test__numdiff.py +66 -22
  314. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  315. scipy/optimize/tests/test__shgo.py +9 -1
  316. scipy/optimize/tests/test_bracket.py +36 -46
  317. scipy/optimize/tests/test_chandrupatla.py +133 -135
  318. scipy/optimize/tests/test_cobyla.py +74 -45
  319. scipy/optimize/tests/test_constraints.py +1 -1
  320. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  321. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  322. scipy/optimize/tests/test_least_squares.py +125 -13
  323. scipy/optimize/tests/test_linear_assignment.py +3 -3
  324. scipy/optimize/tests/test_linprog.py +3 -3
  325. scipy/optimize/tests/test_lsq_linear.py +5 -5
  326. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  327. scipy/optimize/tests/test_minpack.py +4 -4
  328. scipy/optimize/tests/test_nnls.py +43 -3
  329. scipy/optimize/tests/test_nonlin.py +36 -0
  330. scipy/optimize/tests/test_optimize.py +95 -17
  331. scipy/optimize/tests/test_slsqp.py +36 -4
  332. scipy/optimize/tests/test_zeros.py +34 -1
  333. scipy/signal/__init__.py +12 -23
  334. scipy/signal/_delegators.py +568 -0
  335. scipy/signal/_filter_design.py +459 -241
  336. scipy/signal/_fir_filter_design.py +262 -90
  337. scipy/signal/_lti_conversion.py +3 -2
  338. scipy/signal/_ltisys.py +118 -91
  339. scipy/signal/_max_len_seq_inner.cpython-313t-darwin.so +0 -0
  340. scipy/signal/_peak_finding_utils.cpython-313t-darwin.so +0 -0
  341. scipy/signal/_polyutils.py +172 -0
  342. scipy/signal/_short_time_fft.py +519 -70
  343. scipy/signal/_signal_api.py +30 -0
  344. scipy/signal/_signaltools.py +719 -399
  345. scipy/signal/_sigtools.cpython-313t-darwin.so +0 -0
  346. scipy/signal/_sosfilt.cpython-313t-darwin.so +0 -0
  347. scipy/signal/_spectral_py.py +221 -50
  348. scipy/signal/_spline.cpython-313t-darwin.so +0 -0
  349. scipy/signal/_spline_filters.py +108 -68
  350. scipy/signal/_support_alternative_backends.py +73 -0
  351. scipy/signal/_upfirdn.py +4 -1
  352. scipy/signal/_upfirdn_apply.cpython-313t-darwin.so +0 -0
  353. scipy/signal/_waveforms.py +2 -11
  354. scipy/signal/_wavelets.py +1 -1
  355. scipy/signal/fir_filter_design.py +1 -0
  356. scipy/signal/spline.py +4 -11
  357. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  358. scipy/signal/tests/test_bsplines.py +114 -79
  359. scipy/signal/tests/test_cont2discrete.py +9 -2
  360. scipy/signal/tests/test_filter_design.py +721 -481
  361. scipy/signal/tests/test_fir_filter_design.py +332 -140
  362. scipy/signal/tests/test_savitzky_golay.py +4 -3
  363. scipy/signal/tests/test_short_time_fft.py +221 -3
  364. scipy/signal/tests/test_signaltools.py +2144 -1348
  365. scipy/signal/tests/test_spectral.py +19 -6
  366. scipy/signal/tests/test_splines.py +161 -96
  367. scipy/signal/tests/test_upfirdn.py +84 -50
  368. scipy/signal/tests/test_waveforms.py +20 -0
  369. scipy/signal/tests/test_windows.py +607 -466
  370. scipy/signal/windows/_windows.py +287 -148
  371. scipy/sparse/__init__.py +23 -4
  372. scipy/sparse/_base.py +270 -108
  373. scipy/sparse/_bsr.py +7 -4
  374. scipy/sparse/_compressed.py +59 -231
  375. scipy/sparse/_construct.py +90 -38
  376. scipy/sparse/_coo.py +115 -181
  377. scipy/sparse/_csc.py +4 -4
  378. scipy/sparse/_csparsetools.cpython-313t-darwin.so +0 -0
  379. scipy/sparse/_csr.py +2 -2
  380. scipy/sparse/_data.py +48 -48
  381. scipy/sparse/_dia.py +105 -18
  382. scipy/sparse/_dok.py +0 -23
  383. scipy/sparse/_index.py +4 -4
  384. scipy/sparse/_matrix.py +23 -0
  385. scipy/sparse/_sparsetools.cpython-313t-darwin.so +0 -0
  386. scipy/sparse/_sputils.py +37 -22
  387. scipy/sparse/base.py +0 -9
  388. scipy/sparse/bsr.py +0 -14
  389. scipy/sparse/compressed.py +0 -23
  390. scipy/sparse/construct.py +0 -6
  391. scipy/sparse/coo.py +0 -14
  392. scipy/sparse/csc.py +0 -3
  393. scipy/sparse/csgraph/_flow.cpython-313t-darwin.so +0 -0
  394. scipy/sparse/csgraph/_matching.cpython-313t-darwin.so +0 -0
  395. scipy/sparse/csgraph/_min_spanning_tree.cpython-313t-darwin.so +0 -0
  396. scipy/sparse/csgraph/_reordering.cpython-313t-darwin.so +0 -0
  397. scipy/sparse/csgraph/_shortest_path.cpython-313t-darwin.so +0 -0
  398. scipy/sparse/csgraph/_tools.cpython-313t-darwin.so +0 -0
  399. scipy/sparse/csgraph/_traversal.cpython-313t-darwin.so +0 -0
  400. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  401. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  402. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  403. scipy/sparse/csr.py +0 -5
  404. scipy/sparse/data.py +1 -6
  405. scipy/sparse/dia.py +0 -7
  406. scipy/sparse/dok.py +0 -10
  407. scipy/sparse/linalg/_dsolve/_superlu.cpython-313t-darwin.so +0 -0
  408. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  409. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  410. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313t-darwin.so +0 -0
  411. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  412. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  413. scipy/sparse/linalg/_interface.py +17 -18
  414. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  415. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  416. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  417. scipy/sparse/linalg/_isolve/minres.py +5 -5
  418. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  419. scipy/sparse/linalg/_isolve/utils.py +2 -8
  420. scipy/sparse/linalg/_matfuncs.py +1 -1
  421. scipy/sparse/linalg/_norm.py +1 -1
  422. scipy/sparse/linalg/_propack/_cpropack.cpython-313t-darwin.so +0 -0
  423. scipy/sparse/linalg/_propack/_dpropack.cpython-313t-darwin.so +0 -0
  424. scipy/sparse/linalg/_propack/_spropack.cpython-313t-darwin.so +0 -0
  425. scipy/sparse/linalg/_propack/_zpropack.cpython-313t-darwin.so +0 -0
  426. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  427. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  428. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  429. scipy/sparse/tests/test_base.py +207 -42
  430. scipy/sparse/tests/test_common1d.py +7 -7
  431. scipy/sparse/tests/test_construct.py +1 -1
  432. scipy/sparse/tests/test_coo.py +272 -4
  433. scipy/sparse/tests/test_sparsetools.py +5 -0
  434. scipy/sparse/tests/test_sputils.py +36 -7
  435. scipy/spatial/_ckdtree.cpython-313t-darwin.so +0 -0
  436. scipy/spatial/_distance_pybind.cpython-313t-darwin.so +0 -0
  437. scipy/spatial/_distance_wrap.cpython-313t-darwin.so +0 -0
  438. scipy/spatial/_hausdorff.cpython-313t-darwin.so +0 -0
  439. scipy/spatial/_qhull.cpython-313t-darwin.so +0 -0
  440. scipy/spatial/_voronoi.cpython-313t-darwin.so +0 -0
  441. scipy/spatial/distance.py +49 -42
  442. scipy/spatial/tests/test_distance.py +3 -1
  443. scipy/spatial/tests/test_kdtree.py +1 -0
  444. scipy/spatial/tests/test_qhull.py +7 -2
  445. scipy/spatial/transform/__init__.py +5 -3
  446. scipy/spatial/transform/_rigid_transform.cpython-313t-darwin.so +0 -0
  447. scipy/spatial/transform/_rotation.cpython-313t-darwin.so +0 -0
  448. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  449. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  450. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  451. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  452. scipy/special/__init__.py +1 -47
  453. scipy/special/_add_newdocs.py +34 -772
  454. scipy/special/_basic.py +22 -25
  455. scipy/special/_comb.cpython-313t-darwin.so +0 -0
  456. scipy/special/_ellip_harm_2.cpython-313t-darwin.so +0 -0
  457. scipy/special/_gufuncs.cpython-313t-darwin.so +0 -0
  458. scipy/special/_logsumexp.py +67 -58
  459. scipy/special/_orthogonal.pyi +1 -1
  460. scipy/special/_specfun.cpython-313t-darwin.so +0 -0
  461. scipy/special/_special_ufuncs.cpython-313t-darwin.so +0 -0
  462. scipy/special/_spherical_bessel.py +4 -4
  463. scipy/special/_support_alternative_backends.py +212 -119
  464. scipy/special/_test_internal.cpython-313t-darwin.so +0 -0
  465. scipy/special/_testutils.py +4 -4
  466. scipy/special/_ufuncs.cpython-313t-darwin.so +0 -0
  467. scipy/special/_ufuncs.pyi +1 -0
  468. scipy/special/_ufuncs.pyx +215 -1400
  469. scipy/special/_ufuncs_cxx.cpython-313t-darwin.so +0 -0
  470. scipy/special/_ufuncs_cxx.pxd +2 -15
  471. scipy/special/_ufuncs_cxx.pyx +5 -44
  472. scipy/special/_ufuncs_cxx_defs.h +2 -16
  473. scipy/special/_ufuncs_defs.h +0 -8
  474. scipy/special/cython_special.cpython-313t-darwin.so +0 -0
  475. scipy/special/cython_special.pxd +1 -1
  476. scipy/special/tests/_cython_examples/meson.build +10 -1
  477. scipy/special/tests/test_basic.py +153 -20
  478. scipy/special/tests/test_boost_ufuncs.py +3 -0
  479. scipy/special/tests/test_cdflib.py +35 -11
  480. scipy/special/tests/test_gammainc.py +16 -0
  481. scipy/special/tests/test_hyp2f1.py +2 -2
  482. scipy/special/tests/test_log1mexp.py +85 -0
  483. scipy/special/tests/test_logsumexp.py +206 -64
  484. scipy/special/tests/test_mpmath.py +1 -0
  485. scipy/special/tests/test_nan_inputs.py +1 -1
  486. scipy/special/tests/test_orthogonal.py +17 -18
  487. scipy/special/tests/test_sf_error.py +3 -2
  488. scipy/special/tests/test_sph_harm.py +6 -7
  489. scipy/special/tests/test_support_alternative_backends.py +211 -76
  490. scipy/stats/__init__.py +4 -1
  491. scipy/stats/_ansari_swilk_statistics.cpython-313t-darwin.so +0 -0
  492. scipy/stats/_axis_nan_policy.py +4 -3
  493. scipy/stats/_biasedurn.cpython-313t-darwin.so +0 -0
  494. scipy/stats/_continued_fraction.py +387 -0
  495. scipy/stats/_continuous_distns.py +277 -310
  496. scipy/stats/_covariance.py +6 -3
  497. scipy/stats/_discrete_distns.py +39 -32
  498. scipy/stats/_distn_infrastructure.py +39 -12
  499. scipy/stats/_distribution_infrastructure.py +900 -238
  500. scipy/stats/_entropy.py +7 -8
  501. scipy/{_lib → stats}/_finite_differences.py +1 -1
  502. scipy/stats/_hypotests.py +82 -49
  503. scipy/stats/_kde.py +53 -49
  504. scipy/stats/_ksstats.py +1 -1
  505. scipy/stats/_levy_stable/__init__.py +7 -15
  506. scipy/stats/_levy_stable/levyst.cpython-313t-darwin.so +0 -0
  507. scipy/stats/_morestats.py +112 -67
  508. scipy/stats/_mstats_basic.py +13 -17
  509. scipy/stats/_mstats_extras.py +8 -8
  510. scipy/stats/_multivariate.py +89 -113
  511. scipy/stats/_new_distributions.py +97 -20
  512. scipy/stats/_page_trend_test.py +12 -5
  513. scipy/stats/_probability_distribution.py +265 -43
  514. scipy/stats/_qmc.py +14 -9
  515. scipy/stats/_qmc_cy.cpython-313t-darwin.so +0 -0
  516. scipy/stats/_qmvnt.py +16 -95
  517. scipy/stats/_qmvnt_cy.cpython-313t-darwin.so +0 -0
  518. scipy/stats/_quantile.py +335 -0
  519. scipy/stats/_rcont/rcont.cpython-313t-darwin.so +0 -0
  520. scipy/stats/_resampling.py +4 -29
  521. scipy/stats/_sampling.py +1 -1
  522. scipy/stats/_sobol.cpython-313t-darwin.so +0 -0
  523. scipy/stats/_stats.cpython-313t-darwin.so +0 -0
  524. scipy/stats/_stats_mstats_common.py +19 -2
  525. scipy/stats/_stats_py.py +534 -460
  526. scipy/stats/_stats_pythran.cpython-313t-darwin.so +0 -0
  527. scipy/stats/_unuran/unuran_wrapper.cpython-313t-darwin.so +0 -0
  528. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  529. scipy/stats/_variation.py +5 -7
  530. scipy/stats/_wilcoxon.py +13 -7
  531. scipy/stats/tests/common_tests.py +6 -4
  532. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  533. scipy/stats/tests/test_continued_fraction.py +173 -0
  534. scipy/stats/tests/test_continuous.py +379 -60
  535. scipy/stats/tests/test_continuous_basic.py +18 -12
  536. scipy/stats/tests/test_discrete_basic.py +14 -8
  537. scipy/stats/tests/test_discrete_distns.py +16 -16
  538. scipy/stats/tests/test_distributions.py +95 -75
  539. scipy/stats/tests/test_entropy.py +40 -48
  540. scipy/stats/tests/test_fit.py +4 -3
  541. scipy/stats/tests/test_hypotests.py +153 -24
  542. scipy/stats/tests/test_kdeoth.py +109 -41
  543. scipy/stats/tests/test_marray.py +289 -0
  544. scipy/stats/tests/test_morestats.py +79 -47
  545. scipy/stats/tests/test_mstats_basic.py +3 -3
  546. scipy/stats/tests/test_multivariate.py +434 -83
  547. scipy/stats/tests/test_qmc.py +13 -10
  548. scipy/stats/tests/test_quantile.py +199 -0
  549. scipy/stats/tests/test_rank.py +119 -112
  550. scipy/stats/tests/test_resampling.py +47 -56
  551. scipy/stats/tests/test_sampling.py +9 -4
  552. scipy/stats/tests/test_stats.py +799 -939
  553. scipy/stats/tests/test_variation.py +8 -6
  554. scipy/version.py +2 -2
  555. {scipy-1.15.3.dist-info → scipy-1.16.0rc1.dist-info}/LICENSE.txt +1 -1
  556. {scipy-1.15.3.dist-info → scipy-1.16.0rc1.dist-info}/METADATA +8 -8
  557. {scipy-1.15.3.dist-info → scipy-1.16.0rc1.dist-info}/RECORD +558 -565
  558. scipy-1.16.0rc1.dist-info/WHEEL +6 -0
  559. scipy/_lib/array_api_extra/_funcs.py +0 -484
  560. scipy/_lib/array_api_extra/_typing.py +0 -8
  561. scipy/interpolate/_bspl.cpython-313t-darwin.so +0 -0
  562. scipy/optimize/_cobyla.cpython-313t-darwin.so +0 -0
  563. scipy/optimize/_cython_nnls.cpython-313t-darwin.so +0 -0
  564. scipy/optimize/_slsqp.cpython-313t-darwin.so +0 -0
  565. scipy/spatial/qhull_src/COPYING.txt +0 -38
  566. scipy/special/libsf_error_state.dylib +0 -0
  567. scipy/special/tests/test_log_softmax.py +0 -109
  568. scipy/special/tests/test_xsf_cuda.py +0 -114
  569. scipy/special/xsf/binom.h +0 -89
  570. scipy/special/xsf/cdflib.h +0 -100
  571. scipy/special/xsf/cephes/airy.h +0 -307
  572. scipy/special/xsf/cephes/besselpoly.h +0 -51
  573. scipy/special/xsf/cephes/beta.h +0 -257
  574. scipy/special/xsf/cephes/cbrt.h +0 -131
  575. scipy/special/xsf/cephes/chbevl.h +0 -85
  576. scipy/special/xsf/cephes/chdtr.h +0 -193
  577. scipy/special/xsf/cephes/const.h +0 -87
  578. scipy/special/xsf/cephes/ellie.h +0 -293
  579. scipy/special/xsf/cephes/ellik.h +0 -251
  580. scipy/special/xsf/cephes/ellpe.h +0 -107
  581. scipy/special/xsf/cephes/ellpk.h +0 -117
  582. scipy/special/xsf/cephes/expn.h +0 -260
  583. scipy/special/xsf/cephes/gamma.h +0 -398
  584. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  585. scipy/special/xsf/cephes/hyperg.h +0 -361
  586. scipy/special/xsf/cephes/i0.h +0 -149
  587. scipy/special/xsf/cephes/i1.h +0 -158
  588. scipy/special/xsf/cephes/igam.h +0 -421
  589. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  590. scipy/special/xsf/cephes/igami.h +0 -313
  591. scipy/special/xsf/cephes/j0.h +0 -225
  592. scipy/special/xsf/cephes/j1.h +0 -198
  593. scipy/special/xsf/cephes/jv.h +0 -715
  594. scipy/special/xsf/cephes/k0.h +0 -164
  595. scipy/special/xsf/cephes/k1.h +0 -163
  596. scipy/special/xsf/cephes/kn.h +0 -243
  597. scipy/special/xsf/cephes/lanczos.h +0 -112
  598. scipy/special/xsf/cephes/ndtr.h +0 -275
  599. scipy/special/xsf/cephes/poch.h +0 -85
  600. scipy/special/xsf/cephes/polevl.h +0 -167
  601. scipy/special/xsf/cephes/psi.h +0 -194
  602. scipy/special/xsf/cephes/rgamma.h +0 -111
  603. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  604. scipy/special/xsf/cephes/shichi.h +0 -248
  605. scipy/special/xsf/cephes/sici.h +0 -224
  606. scipy/special/xsf/cephes/sindg.h +0 -221
  607. scipy/special/xsf/cephes/tandg.h +0 -139
  608. scipy/special/xsf/cephes/trig.h +0 -58
  609. scipy/special/xsf/cephes/unity.h +0 -186
  610. scipy/special/xsf/cephes/zeta.h +0 -172
  611. scipy/special/xsf/config.h +0 -304
  612. scipy/special/xsf/digamma.h +0 -205
  613. scipy/special/xsf/error.h +0 -57
  614. scipy/special/xsf/evalpoly.h +0 -47
  615. scipy/special/xsf/expint.h +0 -266
  616. scipy/special/xsf/hyp2f1.h +0 -694
  617. scipy/special/xsf/iv_ratio.h +0 -173
  618. scipy/special/xsf/lambertw.h +0 -150
  619. scipy/special/xsf/loggamma.h +0 -163
  620. scipy/special/xsf/sici.h +0 -200
  621. scipy/special/xsf/tools.h +0 -427
  622. scipy/special/xsf/trig.h +0 -164
  623. scipy/special/xsf/wright_bessel.h +0 -843
  624. scipy/special/xsf/zlog1.h +0 -35
  625. scipy/stats/_mvn.cpython-313t-darwin.so +0 -0
  626. scipy-1.15.3.dist-info/WHEEL +0 -4
@@ -83,9 +83,10 @@ def compare_coeffs_to_alt(window_length, order):
83
83
  for pos in [None] + list(range(window_length)):
84
84
  h1 = savgol_coeffs(window_length, order, pos=pos, use='dot')
85
85
  h2 = alt_sg_coeffs(window_length, order, pos=pos)
86
- xp_assert_close(h1, h2, atol=1e-10,
87
- err_msg=("window_length = %d, order = %d, pos = %s" %
88
- (window_length, order, pos)))
86
+ xp_assert_close(
87
+ h1, h2, atol=1e-10,
88
+ err_msg=f"window_length = {window_length}, order = {order}, pos = {pos}"
89
+ )
89
90
 
90
91
 
91
92
  def test_sg_coeffs_compare():
@@ -26,11 +26,11 @@ import pytest
26
26
  from scipy._lib._array_api import xp_assert_close, xp_assert_equal
27
27
  from scipy.fft import fftshift
28
28
  from scipy.stats import norm as normal_distribution # type: ignore
29
- from scipy.signal import get_window, welch, stft, istft, spectrogram
29
+ from scipy.signal import check_COLA, get_window, welch, stft, istft, spectrogram
30
30
 
31
31
  from scipy.signal._short_time_fft import FFT_MODE_TYPE, \
32
- _calc_dual_canonical_window, ShortTimeFFT, PAD_TYPE
33
- from scipy.signal.windows import gaussian
32
+ _calc_dual_canonical_window, closest_STFT_dual_window, ShortTimeFFT, PAD_TYPE
33
+ from scipy.signal.windows import blackman, gaussian, hamming, nuttall, triang
34
34
 
35
35
 
36
36
  def test__calc_dual_canonical_window_roundtrip():
@@ -59,6 +59,132 @@ def test__calc_dual_canonical_window_exceptions():
59
59
  with pytest.raises(ValueError, match="Parameter 'win' cannot be of int.*"):
60
60
  _calc_dual_canonical_window(np.ones(4, dtype=int), 1)
61
61
 
62
+ def test_closest_STFT_dual_window_exceptions():
63
+ """Raise all exceptions in `closest_STFT_dual_window`."""
64
+ with pytest.raises(ValueError, match="Parameters `win` and `desired_dual` are.*"):
65
+ closest_STFT_dual_window(np.ones(4), 2, np.ones(5))
66
+ with pytest.raises(ValueError, match="Parameters `win` and `desired_dual` are.*"):
67
+ closest_STFT_dual_window(np.ones((4, 1)), 2, np.ones(4))
68
+ with pytest.raises(ValueError, match="Parameter win must have finite entries!"):
69
+ closest_STFT_dual_window(np.ones(4)*np.nan, 2, np.ones(4))
70
+ with pytest.raises(ValueError, match="Parameter desired_dual must have finite.*"):
71
+ closest_STFT_dual_window(np.ones(4), 2, np.ones(4)*np.nan)
72
+ with pytest.raises(ValueError, match="Parameter hop=20 is not an integer.*"):
73
+ closest_STFT_dual_window(np.ones(4), 20, np.ones(4))
74
+ with pytest.raises(ValueError, match="Parameter hop=2.0 is not an integer.*"):
75
+ # noinspection PyTypeChecker
76
+ closest_STFT_dual_window(np.ones(4), 2., np.ones(4))
77
+
78
+ with pytest.raises(ValueError, match="Unable to calculate scaled closest dual.*"):
79
+ closest_STFT_dual_window(np.ones(4), 2, np.zeros(4), scaled=True)
80
+
81
+
82
+ @pytest.mark.parametrize("scaled", (True, False))
83
+ @pytest.mark.parametrize('sym_win', (False, True))
84
+ @pytest.mark.parametrize('hop', (8, 9))
85
+ @pytest.mark.parametrize('m', (16, 17))
86
+ @pytest.mark.parametrize('win_name', ('hann', 'hamming'))
87
+ def test_closest_STFT_dual_window_roundtrip(win_name, m, hop, sym_win, scaled):
88
+ """Do roundtrip, i.e., compare dual of dual windows.
89
+
90
+ The default for parameter `desired_dual` is also verified.
91
+ """
92
+ win = get_window(win_name, m, not sym_win)
93
+ d1, s1 = closest_STFT_dual_window(win, hop, np.ones_like(win), scaled=scaled)
94
+ d2, s2 = closest_STFT_dual_window(win, hop, scaled=scaled) # equals d1, s1
95
+ d3, s3 = closest_STFT_dual_window(d1, hop, win * s1, scaled=True) # roundtrip
96
+
97
+ # Validate default for parameter `desired_dual` works (hard coded => assert ok):
98
+ xp_assert_equal(d2, d1, err_msg="Default for parameter `desired_dual` is not ok!")
99
+ assert s2 == s1, "Default for parameter `desired_dual` is not ok!"
100
+
101
+ res = np.finfo(win.dtype).resolution * 5
102
+ xp_assert_close(s1*s3, 1., atol=res, err_msg="Invalid Scale factors")
103
+ xp_assert_close(d3, win, atol=res, err_msg="Roundtrip failed!")
104
+
105
+ if scaled: # check that scaling factor is correct:
106
+ d3, _ = closest_STFT_dual_window(win, hop, np.ones(m) * s1, scaled=False)
107
+ xp_assert_close(d3, d1, atol=res, err_msg="Roundtrip failed!")
108
+
109
+
110
+ @pytest.mark.parametrize('scaled', (False, True))
111
+ def test_closest_STFT_dual_window_STFT_roundtrip(scaled):
112
+ """STFT Roundtrip correctness of closest dual window. """
113
+ np.random.seed(5613830)
114
+ n, m_num, hop = 15, 7, 3
115
+ w, desires_dual = hamming(m_num), triang(m_num)
116
+ d, _ = closest_STFT_dual_window(w, hop, desires_dual, scaled=scaled)
117
+
118
+ SFT = ShortTimeFFT(w, hop=hop, dual_win=d, fs=1, scale_to=None, phase_shift=None)
119
+ x = 10 * np.random.randn(n)
120
+ Sx = SFT.stft(x)
121
+ y = SFT.istft(Sx, 0, n)
122
+
123
+ atol = np.finfo(w.dtype).resolution * 10
124
+ xp_assert_close(y, x, atol=atol, err_msg="Invalid closest window")
125
+
126
+
127
+ @pytest.mark.parametrize('scaled', (False, True))
128
+ def test_closest_STFT_dual_window_STFT_roundtrip_complex(scaled):
129
+ """STFT Roundtrip correctness of closest dual window with complex values. """
130
+ np.random.seed(34905436)
131
+ n, m_num, hop = 15, 7, 3
132
+ win = 1j*hamming(m_num) + nuttall(m_num)
133
+ desires_dual = 1j*triang(m_num) + blackman(m_num)
134
+ dual, s = closest_STFT_dual_window(win, hop, desires_dual, scaled=scaled)
135
+
136
+ SFT = ShortTimeFFT(win, hop=hop, dual_win=dual, fs=1, fft_mode='twosided',
137
+ scale_to=None, phase_shift=None)
138
+ x = 10 * np.random.randn(n) + 10j * np.random.randn(n)
139
+ Sx = SFT.stft(x)
140
+ y = SFT.istft(Sx, 0, n)
141
+
142
+ atol = np.finfo(win.dtype).resolution * 10
143
+ xp_assert_close(y, x, atol=atol, err_msg=f"Invalid complex closest window ({s=})")
144
+
145
+
146
+ @pytest.mark.parametrize("win_name, nperseg, noverlap, scale_fac", ([
147
+ ('boxcar', 16, 8, 1/2),
148
+ ('boxcar', 18, 12, 1/3),
149
+ ('boxcar', 16, 12, 1/4),
150
+ ('bartlett', 16, 8, 1.),
151
+ ('bartlett', 16, 12, 1/2),
152
+ ('bartlett', 30, 25, 1/3),
153
+ ('hann', 16, 8, 1.),
154
+ ('hann', 18, 12, 2/3),
155
+ ('hann', 16, 12, 1/2),
156
+ ('blackman', 9, 6, 50/63),
157
+ ('boxcar', 8, 7, 1/8)])) # hop = 1
158
+ def test_closest_STFT_dual_window_cola(win_name, nperseg, noverlap, scale_fac):
159
+ """Test if `closest_STFT_dual_window` generalizes `check_COLA`.
160
+
161
+ The parameters were taken from the `check_COLA` documentation.
162
+ Note that `check_COLA` only guarantees the existence of a dual window with constant
163
+ values but not that those values are unity (which is clear, when investigating the
164
+ 'boxcar' examples). The values for `scale_fac` were determined empirically.
165
+ """
166
+ desired_dual = get_window(win_name, nperseg, fftbins=True)
167
+ assert check_COLA(desired_dual, nperseg, noverlap), "COLA cond. violated!"
168
+
169
+ win = np.ones(nperseg) # check scaled window:
170
+ d_s, s = closest_STFT_dual_window(win, nperseg-noverlap, desired_dual, scaled=True)
171
+
172
+ res = np.finfo(desired_dual.dtype).resolution
173
+ rel_tol_d = max(abs(d_s))*res*3
174
+ xp_assert_close(s, scale_fac, atol=res*10,
175
+ err_msg=f"Scale factor off by {s/scale_fac}")
176
+ xp_assert_close(d_s, desired_dual*scale_fac, atol=res*10, rtol=rel_tol_d,
177
+ err_msg="Calculated incorrect scaled window!")
178
+
179
+ # check unscaled window:
180
+ d_u, u = closest_STFT_dual_window(win * scale_fac, nperseg - noverlap,
181
+ desired_dual, scaled=False)
182
+
183
+ # this should be hard-coded not computed, so no need for allclose
184
+ assert u == 1., "Scaling factor not 1 for parameter `scaled=True`!"
185
+ xp_assert_close(d_u, desired_dual, atol=res*10, rtol=rel_tol_d,
186
+ err_msg="Calculated incorrect unscaled window!")
187
+
62
188
 
63
189
  def test_invalid_initializer_parameters():
64
190
  """Verify that exceptions get raised on invalid parameters when
@@ -180,6 +306,7 @@ def test_exceptions_fft_mode_complex_win(m: FFT_MODE_TYPE):
180
306
  def test_invalid_fft_mode_RuntimeError():
181
307
  """Ensure exception gets raised when property `fft_mode` is invalid. """
182
308
  SFT = ShortTimeFFT(np.ones(8), hop=4, fs=1)
309
+ # noinspection PyTypeChecker
183
310
  SFT._fft_mode = 'invalid_typ'
184
311
 
185
312
  with pytest.raises(RuntimeError):
@@ -222,6 +349,78 @@ def test_from_window(win_params, Nx: int):
222
349
  assert v2 == v0, f"SFT2.{n_}={v2} does not equal SFT0.{n_}={v0}"
223
350
 
224
351
 
352
+ def test_from_win_equals_dual_exceptions():
353
+ """Raise all occurring exceptions in `ShortTimeFFT.from_closest_win_equals_dual`.
354
+ """
355
+ with pytest.raises(ValueError, match="Parameter desired_win is not 1d, but.*"):
356
+ ShortTimeFFT.from_win_equals_dual(np.ones((3, 4)), hop=1, fs=1)
357
+ with pytest.raises(ValueError, match="Parameter desired_win cannot be of int.*"):
358
+ ShortTimeFFT.from_win_equals_dual(np.ones(4, dtype=int), hop=1, fs=1)
359
+ with pytest.raises(ValueError, match="Parameter desired_win is not 1d, but.*"):
360
+ ShortTimeFFT.from_win_equals_dual(np.array([]), hop=1, fs=1)
361
+ with pytest.raises(ValueError, match="Parameter desired_win must have finite.*"):
362
+ ShortTimeFFT.from_win_equals_dual(np.ones(3) * np.inf, hop=1, fs=1)
363
+ with pytest.raises(ValueError, match="Parameter hop=0 is not an integer .*"):
364
+ ShortTimeFFT.from_win_equals_dual(np.ones(4), hop=0, fs=1)
365
+ with pytest.raises(ValueError, match="Parameter hop=5 is not an integer .*"):
366
+ ShortTimeFFT.from_win_equals_dual(np.ones(4), hop=5, fs=1)
367
+
368
+ with pytest.raises(ValueError, match="P.+ desired_win does not have valid.*"):
369
+ w = np.array([1, 0, 1, 0, 1], dtype=float)
370
+ ShortTimeFFT.from_win_equals_dual(w, hop=2, fs=1)
371
+ with pytest.raises(ValueError, match="Parameter scale_to='invalid' not in.*"):
372
+ # noinspection PyTypeChecker
373
+ ShortTimeFFT.from_win_equals_dual(w, hop=2, fs=1, scale_to='invalid')
374
+
375
+ @pytest.mark.parametrize('fft_bins', (True, False))
376
+ @pytest.mark.parametrize('m, hop', [(16, 8), (16, 7), (17, 8), (17, 9), (16, 16)])
377
+ def test_from_win_equals_dual_params(m, hop, fft_bins):
378
+ """Test windows parameterizations for `ShortTimeFFT.from_closest_win_equals_dual`.
379
+
380
+ The flattop window is used since it also has negative values.
381
+ """
382
+ desired_win = get_window('flattop', m, fftbins=fft_bins)
383
+ SFT0 = ShortTimeFFT.from_win_equals_dual(desired_win, hop, fs=1)
384
+ xp_assert_close(SFT0.dual_win, SFT0.win, err_msg="win must equals dual window!")
385
+
386
+ SFT1 = ShortTimeFFT(SFT0.win, hop, fs=1)
387
+ xp_assert_close(SFT1.dual_win, SFT0.win, err_msg="dual win isn't canonical win!")
388
+
389
+
390
+ @pytest.mark.parametrize('fft_bins', (True, False))
391
+ @pytest.mark.parametrize('m, hop', [(16, 8), (16, 7), (17, 8), (17, 9), (16, 16)])
392
+ @pytest.mark.parametrize('scale_to', (None, 'unitary'))
393
+ def test_from_win_equals_dual_roundtrip(m, hop, fft_bins, scale_to):
394
+ """Testing roundtrip verifies that the dual window is correct.
395
+ """
396
+ desired_win = get_window('flattop', m, fftbins=fft_bins)
397
+ SFT0 = ShortTimeFFT.from_win_equals_dual(desired_win, hop, fs=1)
398
+
399
+ x = np.cos(np.arange(2*m)**2)
400
+ x1 = SFT0.istft(SFT0.stft(x), 0, len(x))
401
+ xp_assert_close(x1, x, err_msg="Roundtrip for win equaling its dual failed!")
402
+
403
+
404
+ def test_from_win_equals_dual_unitary():
405
+ """Check that STFT can be unitary mapping. """
406
+ m, hop = 8, 4
407
+ des_win = get_window('hann', m)
408
+ SFT = ShortTimeFFT.from_win_equals_dual(des_win, hop, 1, fft_mode='twosided',
409
+ scale_to='unitary')
410
+ # Orthogonal signals:
411
+ x, y = np.tile([-1, -1, 1, 1], 4), np.tile([1, -1, -1, 1], 4)
412
+ Sxx, Sxy = SFT.spectrogram(x), SFT.spectrogram(x, y)
413
+
414
+ atol = np.finfo(Sxx.dtype).resolution
415
+ assert sum(x * y) == 0
416
+ xp_assert_close(np.sum(Sxx), np.sum(x ** 2, dtype=Sxx.dtype), atol=atol,
417
+ err_msg="Energies do not match!")
418
+ xp_assert_close(np.sum(Sxy), 0.0j, atol=atol,
419
+ err_msg="STFT scalar product of Sx and Sy not 0!")
420
+ xp_assert_close(SFT.dual_win, SFT.win*SFT.m_num, atol=atol,
421
+ err_msg="Wrong factor for dual_win/win!")
422
+
423
+
225
424
  def test_dual_win_roundtrip():
226
425
  """Verify the duality of `win` and `dual_win`.
227
426
 
@@ -516,6 +715,25 @@ def test_minimal_length_signal(m_num):
516
715
  SFT.istft(Sx[:, :-1], k1=n)
517
716
 
518
717
 
718
+ def test_compare_stft_detrend():
719
+ """Test the detrending in `ShortTimeFFT.stft_detrend()`. """
720
+ SFT = ShortTimeFFT(np.ones(4), 4, fs=1)
721
+ x0 = np.zeros(4) # signal without trend
722
+ x1 = x0 + 3 # signal with constant trend
723
+ x2 = x0 + np.arange(len(x0)) # signal with linear trend
724
+
725
+ kw = dict(k_offset=2, p1=1) # we want only one slice
726
+ Sx0 = SFT.stft(x0, **kw) # no trend
727
+ Sx1 = SFT.stft_detrend(x1, detr='constant', **kw)
728
+ Sx2 = SFT.stft_detrend(x2, detr='linear', **kw)
729
+ Sx3 = SFT.stft_detrend(x1, detr=lambda x: x - np.mean(x), **kw)
730
+
731
+ atol = np.finfo(Sx0.dtype).resolution * 5 # needed to compare with array of zeros
732
+ xp_assert_close(Sx1, Sx0, atol=atol, err_msg="Constant detrending failed!")
733
+ xp_assert_close(Sx0, Sx2, atol=atol, err_msg="Linear detrending failed!")
734
+ xp_assert_close(Sx0, Sx3, atol=atol, err_msg="Detrending using a function failed!")
735
+
736
+
519
737
  def test_tutorial_stft_sliding_win():
520
738
  """Verify example in "Sliding Windows" subsection from the "User Guide".
521
739