scipy 1.16.1__cp314-cp314-musllinux_1_2_x86_64.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 (1420) hide show
  1. scipy/__config__.py +161 -0
  2. scipy/__init__.py +138 -0
  3. scipy/_cyutility.cpython-314-x86_64-linux-musl.so +0 -0
  4. scipy/_distributor_init.py +18 -0
  5. scipy/_lib/__init__.py +14 -0
  6. scipy/_lib/_array_api.py +931 -0
  7. scipy/_lib/_array_api_compat_vendor.py +9 -0
  8. scipy/_lib/_array_api_no_0d.py +103 -0
  9. scipy/_lib/_bunch.py +229 -0
  10. scipy/_lib/_ccallback.py +251 -0
  11. scipy/_lib/_ccallback_c.cpython-314-x86_64-linux-musl.so +0 -0
  12. scipy/_lib/_disjoint_set.py +254 -0
  13. scipy/_lib/_docscrape.py +761 -0
  14. scipy/_lib/_elementwise_iterative_method.py +346 -0
  15. scipy/_lib/_fpumode.cpython-314-x86_64-linux-musl.so +0 -0
  16. scipy/_lib/_gcutils.py +105 -0
  17. scipy/_lib/_pep440.py +487 -0
  18. scipy/_lib/_sparse.py +41 -0
  19. scipy/_lib/_test_ccallback.cpython-314-x86_64-linux-musl.so +0 -0
  20. scipy/_lib/_test_deprecation_call.cpython-314-x86_64-linux-musl.so +0 -0
  21. scipy/_lib/_test_deprecation_def.cpython-314-x86_64-linux-musl.so +0 -0
  22. scipy/_lib/_testutils.py +373 -0
  23. scipy/_lib/_threadsafety.py +58 -0
  24. scipy/_lib/_tmpdirs.py +86 -0
  25. scipy/_lib/_uarray/LICENSE +29 -0
  26. scipy/_lib/_uarray/__init__.py +116 -0
  27. scipy/_lib/_uarray/_backend.py +707 -0
  28. scipy/_lib/_uarray/_uarray.cpython-314-x86_64-linux-musl.so +0 -0
  29. scipy/_lib/_util.py +1283 -0
  30. scipy/_lib/array_api_compat/__init__.py +22 -0
  31. scipy/_lib/array_api_compat/_internal.py +59 -0
  32. scipy/_lib/array_api_compat/common/__init__.py +1 -0
  33. scipy/_lib/array_api_compat/common/_aliases.py +727 -0
  34. scipy/_lib/array_api_compat/common/_fft.py +213 -0
  35. scipy/_lib/array_api_compat/common/_helpers.py +1058 -0
  36. scipy/_lib/array_api_compat/common/_linalg.py +232 -0
  37. scipy/_lib/array_api_compat/common/_typing.py +192 -0
  38. scipy/_lib/array_api_compat/cupy/__init__.py +13 -0
  39. scipy/_lib/array_api_compat/cupy/_aliases.py +156 -0
  40. scipy/_lib/array_api_compat/cupy/_info.py +336 -0
  41. scipy/_lib/array_api_compat/cupy/_typing.py +31 -0
  42. scipy/_lib/array_api_compat/cupy/fft.py +36 -0
  43. scipy/_lib/array_api_compat/cupy/linalg.py +49 -0
  44. scipy/_lib/array_api_compat/dask/__init__.py +0 -0
  45. scipy/_lib/array_api_compat/dask/array/__init__.py +12 -0
  46. scipy/_lib/array_api_compat/dask/array/_aliases.py +376 -0
  47. scipy/_lib/array_api_compat/dask/array/_info.py +416 -0
  48. scipy/_lib/array_api_compat/dask/array/fft.py +21 -0
  49. scipy/_lib/array_api_compat/dask/array/linalg.py +72 -0
  50. scipy/_lib/array_api_compat/numpy/__init__.py +28 -0
  51. scipy/_lib/array_api_compat/numpy/_aliases.py +190 -0
  52. scipy/_lib/array_api_compat/numpy/_info.py +366 -0
  53. scipy/_lib/array_api_compat/numpy/_typing.py +30 -0
  54. scipy/_lib/array_api_compat/numpy/fft.py +35 -0
  55. scipy/_lib/array_api_compat/numpy/linalg.py +143 -0
  56. scipy/_lib/array_api_compat/torch/__init__.py +22 -0
  57. scipy/_lib/array_api_compat/torch/_aliases.py +855 -0
  58. scipy/_lib/array_api_compat/torch/_info.py +369 -0
  59. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  60. scipy/_lib/array_api_compat/torch/fft.py +85 -0
  61. scipy/_lib/array_api_compat/torch/linalg.py +121 -0
  62. scipy/_lib/array_api_extra/__init__.py +38 -0
  63. scipy/_lib/array_api_extra/_delegation.py +171 -0
  64. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  65. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  66. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  67. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  68. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  69. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  70. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  71. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  72. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  73. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  74. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  75. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  76. scipy/_lib/array_api_extra/testing.py +359 -0
  77. scipy/_lib/cobyqa/__init__.py +20 -0
  78. scipy/_lib/cobyqa/framework.py +1240 -0
  79. scipy/_lib/cobyqa/main.py +1506 -0
  80. scipy/_lib/cobyqa/models.py +1529 -0
  81. scipy/_lib/cobyqa/problem.py +1296 -0
  82. scipy/_lib/cobyqa/settings.py +132 -0
  83. scipy/_lib/cobyqa/subsolvers/__init__.py +14 -0
  84. scipy/_lib/cobyqa/subsolvers/geometry.py +387 -0
  85. scipy/_lib/cobyqa/subsolvers/optim.py +1203 -0
  86. scipy/_lib/cobyqa/utils/__init__.py +18 -0
  87. scipy/_lib/cobyqa/utils/exceptions.py +22 -0
  88. scipy/_lib/cobyqa/utils/math.py +77 -0
  89. scipy/_lib/cobyqa/utils/versions.py +67 -0
  90. scipy/_lib/decorator.py +399 -0
  91. scipy/_lib/deprecation.py +274 -0
  92. scipy/_lib/doccer.py +366 -0
  93. scipy/_lib/messagestream.cpython-314-x86_64-linux-musl.so +0 -0
  94. scipy/_lib/pyprima/__init__.py +212 -0
  95. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  96. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  97. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  98. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  99. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  100. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  101. scipy/_lib/pyprima/cobyla/update.py +289 -0
  102. scipy/_lib/pyprima/common/__init__.py +0 -0
  103. scipy/_lib/pyprima/common/_bounds.py +34 -0
  104. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  105. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  106. scipy/_lib/pyprima/common/_project.py +173 -0
  107. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  108. scipy/_lib/pyprima/common/consts.py +47 -0
  109. scipy/_lib/pyprima/common/evaluate.py +99 -0
  110. scipy/_lib/pyprima/common/history.py +38 -0
  111. scipy/_lib/pyprima/common/infos.py +30 -0
  112. scipy/_lib/pyprima/common/linalg.py +435 -0
  113. scipy/_lib/pyprima/common/message.py +290 -0
  114. scipy/_lib/pyprima/common/powalg.py +131 -0
  115. scipy/_lib/pyprima/common/preproc.py +277 -0
  116. scipy/_lib/pyprima/common/present.py +5 -0
  117. scipy/_lib/pyprima/common/ratio.py +54 -0
  118. scipy/_lib/pyprima/common/redrho.py +47 -0
  119. scipy/_lib/pyprima/common/selectx.py +296 -0
  120. scipy/_lib/tests/__init__.py +0 -0
  121. scipy/_lib/tests/test__gcutils.py +110 -0
  122. scipy/_lib/tests/test__pep440.py +67 -0
  123. scipy/_lib/tests/test__testutils.py +32 -0
  124. scipy/_lib/tests/test__threadsafety.py +51 -0
  125. scipy/_lib/tests/test__util.py +641 -0
  126. scipy/_lib/tests/test_array_api.py +322 -0
  127. scipy/_lib/tests/test_bunch.py +169 -0
  128. scipy/_lib/tests/test_ccallback.py +196 -0
  129. scipy/_lib/tests/test_config.py +45 -0
  130. scipy/_lib/tests/test_deprecation.py +10 -0
  131. scipy/_lib/tests/test_doccer.py +143 -0
  132. scipy/_lib/tests/test_import_cycles.py +18 -0
  133. scipy/_lib/tests/test_public_api.py +482 -0
  134. scipy/_lib/tests/test_scipy_version.py +28 -0
  135. scipy/_lib/tests/test_tmpdirs.py +48 -0
  136. scipy/_lib/tests/test_warnings.py +137 -0
  137. scipy/_lib/uarray.py +31 -0
  138. scipy/cluster/__init__.py +31 -0
  139. scipy/cluster/_hierarchy.cpython-314-x86_64-linux-musl.so +0 -0
  140. scipy/cluster/_optimal_leaf_ordering.cpython-314-x86_64-linux-musl.so +0 -0
  141. scipy/cluster/_vq.cpython-314-x86_64-linux-musl.so +0 -0
  142. scipy/cluster/hierarchy.py +4348 -0
  143. scipy/cluster/tests/__init__.py +0 -0
  144. scipy/cluster/tests/hierarchy_test_data.py +145 -0
  145. scipy/cluster/tests/test_disjoint_set.py +202 -0
  146. scipy/cluster/tests/test_hierarchy.py +1238 -0
  147. scipy/cluster/tests/test_vq.py +434 -0
  148. scipy/cluster/vq.py +832 -0
  149. scipy/conftest.py +683 -0
  150. scipy/constants/__init__.py +358 -0
  151. scipy/constants/_codata.py +2266 -0
  152. scipy/constants/_constants.py +369 -0
  153. scipy/constants/codata.py +21 -0
  154. scipy/constants/constants.py +53 -0
  155. scipy/constants/tests/__init__.py +0 -0
  156. scipy/constants/tests/test_codata.py +78 -0
  157. scipy/constants/tests/test_constants.py +83 -0
  158. scipy/datasets/__init__.py +90 -0
  159. scipy/datasets/_download_all.py +71 -0
  160. scipy/datasets/_fetchers.py +225 -0
  161. scipy/datasets/_registry.py +26 -0
  162. scipy/datasets/_utils.py +81 -0
  163. scipy/datasets/tests/__init__.py +0 -0
  164. scipy/datasets/tests/test_data.py +128 -0
  165. scipy/differentiate/__init__.py +27 -0
  166. scipy/differentiate/_differentiate.py +1129 -0
  167. scipy/differentiate/tests/__init__.py +0 -0
  168. scipy/differentiate/tests/test_differentiate.py +694 -0
  169. scipy/fft/__init__.py +114 -0
  170. scipy/fft/_backend.py +196 -0
  171. scipy/fft/_basic.py +1650 -0
  172. scipy/fft/_basic_backend.py +197 -0
  173. scipy/fft/_debug_backends.py +22 -0
  174. scipy/fft/_fftlog.py +223 -0
  175. scipy/fft/_fftlog_backend.py +200 -0
  176. scipy/fft/_helper.py +348 -0
  177. scipy/fft/_pocketfft/LICENSE.md +25 -0
  178. scipy/fft/_pocketfft/__init__.py +9 -0
  179. scipy/fft/_pocketfft/basic.py +251 -0
  180. scipy/fft/_pocketfft/helper.py +249 -0
  181. scipy/fft/_pocketfft/pypocketfft.cpython-314-x86_64-linux-musl.so +0 -0
  182. scipy/fft/_pocketfft/realtransforms.py +109 -0
  183. scipy/fft/_pocketfft/tests/__init__.py +0 -0
  184. scipy/fft/_pocketfft/tests/test_basic.py +1011 -0
  185. scipy/fft/_pocketfft/tests/test_real_transforms.py +505 -0
  186. scipy/fft/_realtransforms.py +706 -0
  187. scipy/fft/_realtransforms_backend.py +63 -0
  188. scipy/fft/tests/__init__.py +0 -0
  189. scipy/fft/tests/mock_backend.py +96 -0
  190. scipy/fft/tests/test_backend.py +98 -0
  191. scipy/fft/tests/test_basic.py +504 -0
  192. scipy/fft/tests/test_fftlog.py +215 -0
  193. scipy/fft/tests/test_helper.py +558 -0
  194. scipy/fft/tests/test_multithreading.py +84 -0
  195. scipy/fft/tests/test_real_transforms.py +247 -0
  196. scipy/fftpack/__init__.py +103 -0
  197. scipy/fftpack/_basic.py +428 -0
  198. scipy/fftpack/_helper.py +115 -0
  199. scipy/fftpack/_pseudo_diffs.py +554 -0
  200. scipy/fftpack/_realtransforms.py +598 -0
  201. scipy/fftpack/basic.py +20 -0
  202. scipy/fftpack/convolve.cpython-314-x86_64-linux-musl.so +0 -0
  203. scipy/fftpack/helper.py +19 -0
  204. scipy/fftpack/pseudo_diffs.py +22 -0
  205. scipy/fftpack/realtransforms.py +19 -0
  206. scipy/fftpack/tests/__init__.py +0 -0
  207. scipy/fftpack/tests/fftw_double_ref.npz +0 -0
  208. scipy/fftpack/tests/fftw_longdouble_ref.npz +0 -0
  209. scipy/fftpack/tests/fftw_single_ref.npz +0 -0
  210. scipy/fftpack/tests/test.npz +0 -0
  211. scipy/fftpack/tests/test_basic.py +877 -0
  212. scipy/fftpack/tests/test_helper.py +54 -0
  213. scipy/fftpack/tests/test_import.py +33 -0
  214. scipy/fftpack/tests/test_pseudo_diffs.py +388 -0
  215. scipy/fftpack/tests/test_real_transforms.py +836 -0
  216. scipy/integrate/__init__.py +122 -0
  217. scipy/integrate/_bvp.py +1160 -0
  218. scipy/integrate/_cubature.py +729 -0
  219. scipy/integrate/_dop.cpython-314-x86_64-linux-musl.so +0 -0
  220. scipy/integrate/_ivp/__init__.py +8 -0
  221. scipy/integrate/_ivp/base.py +290 -0
  222. scipy/integrate/_ivp/bdf.py +478 -0
  223. scipy/integrate/_ivp/common.py +451 -0
  224. scipy/integrate/_ivp/dop853_coefficients.py +193 -0
  225. scipy/integrate/_ivp/ivp.py +755 -0
  226. scipy/integrate/_ivp/lsoda.py +224 -0
  227. scipy/integrate/_ivp/radau.py +572 -0
  228. scipy/integrate/_ivp/rk.py +601 -0
  229. scipy/integrate/_ivp/tests/__init__.py +0 -0
  230. scipy/integrate/_ivp/tests/test_ivp.py +1287 -0
  231. scipy/integrate/_ivp/tests/test_rk.py +37 -0
  232. scipy/integrate/_lebedev.py +5450 -0
  233. scipy/integrate/_lsoda.cpython-314-x86_64-linux-musl.so +0 -0
  234. scipy/integrate/_ode.py +1395 -0
  235. scipy/integrate/_odepack.cpython-314-x86_64-linux-musl.so +0 -0
  236. scipy/integrate/_odepack_py.py +273 -0
  237. scipy/integrate/_quad_vec.py +674 -0
  238. scipy/integrate/_quadpack.cpython-314-x86_64-linux-musl.so +0 -0
  239. scipy/integrate/_quadpack_py.py +1283 -0
  240. scipy/integrate/_quadrature.py +1336 -0
  241. scipy/integrate/_rules/__init__.py +12 -0
  242. scipy/integrate/_rules/_base.py +518 -0
  243. scipy/integrate/_rules/_gauss_kronrod.py +202 -0
  244. scipy/integrate/_rules/_gauss_legendre.py +62 -0
  245. scipy/integrate/_rules/_genz_malik.py +210 -0
  246. scipy/integrate/_tanhsinh.py +1385 -0
  247. scipy/integrate/_test_multivariate.cpython-314-x86_64-linux-musl.so +0 -0
  248. scipy/integrate/_test_odeint_banded.cpython-314-x86_64-linux-musl.so +0 -0
  249. scipy/integrate/_vode.cpython-314-x86_64-linux-musl.so +0 -0
  250. scipy/integrate/dop.py +15 -0
  251. scipy/integrate/lsoda.py +15 -0
  252. scipy/integrate/odepack.py +17 -0
  253. scipy/integrate/quadpack.py +23 -0
  254. scipy/integrate/tests/__init__.py +0 -0
  255. scipy/integrate/tests/test__quad_vec.py +211 -0
  256. scipy/integrate/tests/test_banded_ode_solvers.py +305 -0
  257. scipy/integrate/tests/test_bvp.py +714 -0
  258. scipy/integrate/tests/test_cubature.py +1375 -0
  259. scipy/integrate/tests/test_integrate.py +840 -0
  260. scipy/integrate/tests/test_odeint_jac.py +74 -0
  261. scipy/integrate/tests/test_quadpack.py +680 -0
  262. scipy/integrate/tests/test_quadrature.py +730 -0
  263. scipy/integrate/tests/test_tanhsinh.py +1171 -0
  264. scipy/integrate/vode.py +15 -0
  265. scipy/interpolate/__init__.py +228 -0
  266. scipy/interpolate/_bary_rational.py +715 -0
  267. scipy/interpolate/_bsplines.py +2469 -0
  268. scipy/interpolate/_cubic.py +973 -0
  269. scipy/interpolate/_dfitpack.cpython-314-x86_64-linux-musl.so +0 -0
  270. scipy/interpolate/_dierckx.cpython-314-x86_64-linux-musl.so +0 -0
  271. scipy/interpolate/_fitpack.cpython-314-x86_64-linux-musl.so +0 -0
  272. scipy/interpolate/_fitpack2.py +2397 -0
  273. scipy/interpolate/_fitpack_impl.py +811 -0
  274. scipy/interpolate/_fitpack_py.py +898 -0
  275. scipy/interpolate/_fitpack_repro.py +996 -0
  276. scipy/interpolate/_interpnd.cpython-314-x86_64-linux-musl.so +0 -0
  277. scipy/interpolate/_interpolate.py +2266 -0
  278. scipy/interpolate/_ndbspline.py +415 -0
  279. scipy/interpolate/_ndgriddata.py +329 -0
  280. scipy/interpolate/_pade.py +67 -0
  281. scipy/interpolate/_polyint.py +1025 -0
  282. scipy/interpolate/_ppoly.cpython-314-x86_64-linux-musl.so +0 -0
  283. scipy/interpolate/_rbf.py +290 -0
  284. scipy/interpolate/_rbfinterp.py +550 -0
  285. scipy/interpolate/_rbfinterp_pythran.cpython-314-x86_64-linux-musl.so +0 -0
  286. scipy/interpolate/_rgi.py +764 -0
  287. scipy/interpolate/_rgi_cython.cpython-314-x86_64-linux-musl.so +0 -0
  288. scipy/interpolate/dfitpack.py +24 -0
  289. scipy/interpolate/fitpack.py +31 -0
  290. scipy/interpolate/fitpack2.py +29 -0
  291. scipy/interpolate/interpnd.py +24 -0
  292. scipy/interpolate/interpolate.py +30 -0
  293. scipy/interpolate/ndgriddata.py +23 -0
  294. scipy/interpolate/polyint.py +24 -0
  295. scipy/interpolate/rbf.py +18 -0
  296. scipy/interpolate/tests/__init__.py +0 -0
  297. scipy/interpolate/tests/data/bug-1310.npz +0 -0
  298. scipy/interpolate/tests/data/estimate_gradients_hang.npy +0 -0
  299. scipy/interpolate/tests/data/gcvspl.npz +0 -0
  300. scipy/interpolate/tests/test_bary_rational.py +368 -0
  301. scipy/interpolate/tests/test_bsplines.py +3754 -0
  302. scipy/interpolate/tests/test_fitpack.py +519 -0
  303. scipy/interpolate/tests/test_fitpack2.py +1431 -0
  304. scipy/interpolate/tests/test_gil.py +64 -0
  305. scipy/interpolate/tests/test_interpnd.py +452 -0
  306. scipy/interpolate/tests/test_interpolate.py +2630 -0
  307. scipy/interpolate/tests/test_ndgriddata.py +308 -0
  308. scipy/interpolate/tests/test_pade.py +107 -0
  309. scipy/interpolate/tests/test_polyint.py +972 -0
  310. scipy/interpolate/tests/test_rbf.py +246 -0
  311. scipy/interpolate/tests/test_rbfinterp.py +534 -0
  312. scipy/interpolate/tests/test_rgi.py +1151 -0
  313. scipy/io/__init__.py +116 -0
  314. scipy/io/_fast_matrix_market/__init__.py +600 -0
  315. scipy/io/_fast_matrix_market/_fmm_core.cpython-314-x86_64-linux-musl.so +0 -0
  316. scipy/io/_fortran.py +354 -0
  317. scipy/io/_harwell_boeing/__init__.py +7 -0
  318. scipy/io/_harwell_boeing/_fortran_format_parser.py +316 -0
  319. scipy/io/_harwell_boeing/hb.py +571 -0
  320. scipy/io/_harwell_boeing/tests/__init__.py +0 -0
  321. scipy/io/_harwell_boeing/tests/test_fortran_format.py +74 -0
  322. scipy/io/_harwell_boeing/tests/test_hb.py +70 -0
  323. scipy/io/_idl.py +917 -0
  324. scipy/io/_mmio.py +968 -0
  325. scipy/io/_netcdf.py +1104 -0
  326. scipy/io/_test_fortran.cpython-314-x86_64-linux-musl.so +0 -0
  327. scipy/io/arff/__init__.py +28 -0
  328. scipy/io/arff/_arffread.py +873 -0
  329. scipy/io/arff/arffread.py +19 -0
  330. scipy/io/arff/tests/__init__.py +0 -0
  331. scipy/io/arff/tests/data/iris.arff +225 -0
  332. scipy/io/arff/tests/data/missing.arff +8 -0
  333. scipy/io/arff/tests/data/nodata.arff +11 -0
  334. scipy/io/arff/tests/data/quoted_nominal.arff +13 -0
  335. scipy/io/arff/tests/data/quoted_nominal_spaces.arff +13 -0
  336. scipy/io/arff/tests/data/test1.arff +10 -0
  337. scipy/io/arff/tests/data/test10.arff +8 -0
  338. scipy/io/arff/tests/data/test11.arff +11 -0
  339. scipy/io/arff/tests/data/test2.arff +15 -0
  340. scipy/io/arff/tests/data/test3.arff +6 -0
  341. scipy/io/arff/tests/data/test4.arff +11 -0
  342. scipy/io/arff/tests/data/test5.arff +26 -0
  343. scipy/io/arff/tests/data/test6.arff +12 -0
  344. scipy/io/arff/tests/data/test7.arff +15 -0
  345. scipy/io/arff/tests/data/test8.arff +12 -0
  346. scipy/io/arff/tests/data/test9.arff +14 -0
  347. scipy/io/arff/tests/test_arffread.py +421 -0
  348. scipy/io/harwell_boeing.py +17 -0
  349. scipy/io/idl.py +17 -0
  350. scipy/io/matlab/__init__.py +66 -0
  351. scipy/io/matlab/_byteordercodes.py +75 -0
  352. scipy/io/matlab/_mio.py +375 -0
  353. scipy/io/matlab/_mio4.py +632 -0
  354. scipy/io/matlab/_mio5.py +901 -0
  355. scipy/io/matlab/_mio5_params.py +281 -0
  356. scipy/io/matlab/_mio5_utils.cpython-314-x86_64-linux-musl.so +0 -0
  357. scipy/io/matlab/_mio_utils.cpython-314-x86_64-linux-musl.so +0 -0
  358. scipy/io/matlab/_miobase.py +435 -0
  359. scipy/io/matlab/_streams.cpython-314-x86_64-linux-musl.so +0 -0
  360. scipy/io/matlab/byteordercodes.py +17 -0
  361. scipy/io/matlab/mio.py +16 -0
  362. scipy/io/matlab/mio4.py +17 -0
  363. scipy/io/matlab/mio5.py +19 -0
  364. scipy/io/matlab/mio5_params.py +18 -0
  365. scipy/io/matlab/mio5_utils.py +17 -0
  366. scipy/io/matlab/mio_utils.py +17 -0
  367. scipy/io/matlab/miobase.py +16 -0
  368. scipy/io/matlab/streams.py +16 -0
  369. scipy/io/matlab/tests/__init__.py +0 -0
  370. scipy/io/matlab/tests/data/bad_miuint32.mat +0 -0
  371. scipy/io/matlab/tests/data/bad_miutf8_array_name.mat +0 -0
  372. scipy/io/matlab/tests/data/big_endian.mat +0 -0
  373. scipy/io/matlab/tests/data/broken_utf8.mat +0 -0
  374. scipy/io/matlab/tests/data/corrupted_zlib_checksum.mat +0 -0
  375. scipy/io/matlab/tests/data/corrupted_zlib_data.mat +0 -0
  376. scipy/io/matlab/tests/data/debigged_m4.mat +0 -0
  377. scipy/io/matlab/tests/data/japanese_utf8.txt +5 -0
  378. scipy/io/matlab/tests/data/little_endian.mat +0 -0
  379. scipy/io/matlab/tests/data/logical_sparse.mat +0 -0
  380. scipy/io/matlab/tests/data/malformed1.mat +0 -0
  381. scipy/io/matlab/tests/data/miuint32_for_miint32.mat +0 -0
  382. scipy/io/matlab/tests/data/miutf8_array_name.mat +0 -0
  383. scipy/io/matlab/tests/data/nasty_duplicate_fieldnames.mat +0 -0
  384. scipy/io/matlab/tests/data/one_by_zero_char.mat +0 -0
  385. scipy/io/matlab/tests/data/parabola.mat +0 -0
  386. scipy/io/matlab/tests/data/single_empty_string.mat +0 -0
  387. scipy/io/matlab/tests/data/some_functions.mat +0 -0
  388. scipy/io/matlab/tests/data/sqr.mat +0 -0
  389. scipy/io/matlab/tests/data/test3dmatrix_6.1_SOL2.mat +0 -0
  390. scipy/io/matlab/tests/data/test3dmatrix_6.5.1_GLNX86.mat +0 -0
  391. scipy/io/matlab/tests/data/test3dmatrix_7.1_GLNX86.mat +0 -0
  392. scipy/io/matlab/tests/data/test3dmatrix_7.4_GLNX86.mat +0 -0
  393. scipy/io/matlab/tests/data/test_empty_struct.mat +0 -0
  394. scipy/io/matlab/tests/data/test_mat4_le_floats.mat +0 -0
  395. scipy/io/matlab/tests/data/test_skip_variable.mat +0 -0
  396. scipy/io/matlab/tests/data/testbool_8_WIN64.mat +0 -0
  397. scipy/io/matlab/tests/data/testcell_6.1_SOL2.mat +0 -0
  398. scipy/io/matlab/tests/data/testcell_6.5.1_GLNX86.mat +0 -0
  399. scipy/io/matlab/tests/data/testcell_7.1_GLNX86.mat +0 -0
  400. scipy/io/matlab/tests/data/testcell_7.4_GLNX86.mat +0 -0
  401. scipy/io/matlab/tests/data/testcellnest_6.1_SOL2.mat +0 -0
  402. scipy/io/matlab/tests/data/testcellnest_6.5.1_GLNX86.mat +0 -0
  403. scipy/io/matlab/tests/data/testcellnest_7.1_GLNX86.mat +0 -0
  404. scipy/io/matlab/tests/data/testcellnest_7.4_GLNX86.mat +0 -0
  405. scipy/io/matlab/tests/data/testcomplex_4.2c_SOL2.mat +0 -0
  406. scipy/io/matlab/tests/data/testcomplex_6.1_SOL2.mat +0 -0
  407. scipy/io/matlab/tests/data/testcomplex_6.5.1_GLNX86.mat +0 -0
  408. scipy/io/matlab/tests/data/testcomplex_7.1_GLNX86.mat +0 -0
  409. scipy/io/matlab/tests/data/testcomplex_7.4_GLNX86.mat +0 -0
  410. scipy/io/matlab/tests/data/testdouble_4.2c_SOL2.mat +0 -0
  411. scipy/io/matlab/tests/data/testdouble_6.1_SOL2.mat +0 -0
  412. scipy/io/matlab/tests/data/testdouble_6.5.1_GLNX86.mat +0 -0
  413. scipy/io/matlab/tests/data/testdouble_7.1_GLNX86.mat +0 -0
  414. scipy/io/matlab/tests/data/testdouble_7.4_GLNX86.mat +0 -0
  415. scipy/io/matlab/tests/data/testemptycell_5.3_SOL2.mat +0 -0
  416. scipy/io/matlab/tests/data/testemptycell_6.5.1_GLNX86.mat +0 -0
  417. scipy/io/matlab/tests/data/testemptycell_7.1_GLNX86.mat +0 -0
  418. scipy/io/matlab/tests/data/testemptycell_7.4_GLNX86.mat +0 -0
  419. scipy/io/matlab/tests/data/testfunc_7.4_GLNX86.mat +0 -0
  420. scipy/io/matlab/tests/data/testhdf5_7.4_GLNX86.mat +0 -0
  421. scipy/io/matlab/tests/data/testmatrix_4.2c_SOL2.mat +0 -0
  422. scipy/io/matlab/tests/data/testmatrix_6.1_SOL2.mat +0 -0
  423. scipy/io/matlab/tests/data/testmatrix_6.5.1_GLNX86.mat +0 -0
  424. scipy/io/matlab/tests/data/testmatrix_7.1_GLNX86.mat +0 -0
  425. scipy/io/matlab/tests/data/testmatrix_7.4_GLNX86.mat +0 -0
  426. scipy/io/matlab/tests/data/testminus_4.2c_SOL2.mat +0 -0
  427. scipy/io/matlab/tests/data/testminus_6.1_SOL2.mat +0 -0
  428. scipy/io/matlab/tests/data/testminus_6.5.1_GLNX86.mat +0 -0
  429. scipy/io/matlab/tests/data/testminus_7.1_GLNX86.mat +0 -0
  430. scipy/io/matlab/tests/data/testminus_7.4_GLNX86.mat +0 -0
  431. scipy/io/matlab/tests/data/testmulti_4.2c_SOL2.mat +0 -0
  432. scipy/io/matlab/tests/data/testmulti_7.1_GLNX86.mat +0 -0
  433. scipy/io/matlab/tests/data/testmulti_7.4_GLNX86.mat +0 -0
  434. scipy/io/matlab/tests/data/testobject_6.1_SOL2.mat +0 -0
  435. scipy/io/matlab/tests/data/testobject_6.5.1_GLNX86.mat +0 -0
  436. scipy/io/matlab/tests/data/testobject_7.1_GLNX86.mat +0 -0
  437. scipy/io/matlab/tests/data/testobject_7.4_GLNX86.mat +0 -0
  438. scipy/io/matlab/tests/data/testonechar_4.2c_SOL2.mat +0 -0
  439. scipy/io/matlab/tests/data/testonechar_6.1_SOL2.mat +0 -0
  440. scipy/io/matlab/tests/data/testonechar_6.5.1_GLNX86.mat +0 -0
  441. scipy/io/matlab/tests/data/testonechar_7.1_GLNX86.mat +0 -0
  442. scipy/io/matlab/tests/data/testonechar_7.4_GLNX86.mat +0 -0
  443. scipy/io/matlab/tests/data/testscalarcell_7.4_GLNX86.mat +0 -0
  444. scipy/io/matlab/tests/data/testsimplecell.mat +0 -0
  445. scipy/io/matlab/tests/data/testsparse_4.2c_SOL2.mat +0 -0
  446. scipy/io/matlab/tests/data/testsparse_6.1_SOL2.mat +0 -0
  447. scipy/io/matlab/tests/data/testsparse_6.5.1_GLNX86.mat +0 -0
  448. scipy/io/matlab/tests/data/testsparse_7.1_GLNX86.mat +0 -0
  449. scipy/io/matlab/tests/data/testsparse_7.4_GLNX86.mat +0 -0
  450. scipy/io/matlab/tests/data/testsparsecomplex_4.2c_SOL2.mat +0 -0
  451. scipy/io/matlab/tests/data/testsparsecomplex_6.1_SOL2.mat +0 -0
  452. scipy/io/matlab/tests/data/testsparsecomplex_6.5.1_GLNX86.mat +0 -0
  453. scipy/io/matlab/tests/data/testsparsecomplex_7.1_GLNX86.mat +0 -0
  454. scipy/io/matlab/tests/data/testsparsecomplex_7.4_GLNX86.mat +0 -0
  455. scipy/io/matlab/tests/data/testsparsefloat_7.4_GLNX86.mat +0 -0
  456. scipy/io/matlab/tests/data/teststring_4.2c_SOL2.mat +0 -0
  457. scipy/io/matlab/tests/data/teststring_6.1_SOL2.mat +0 -0
  458. scipy/io/matlab/tests/data/teststring_6.5.1_GLNX86.mat +0 -0
  459. scipy/io/matlab/tests/data/teststring_7.1_GLNX86.mat +0 -0
  460. scipy/io/matlab/tests/data/teststring_7.4_GLNX86.mat +0 -0
  461. scipy/io/matlab/tests/data/teststringarray_4.2c_SOL2.mat +0 -0
  462. scipy/io/matlab/tests/data/teststringarray_6.1_SOL2.mat +0 -0
  463. scipy/io/matlab/tests/data/teststringarray_6.5.1_GLNX86.mat +0 -0
  464. scipy/io/matlab/tests/data/teststringarray_7.1_GLNX86.mat +0 -0
  465. scipy/io/matlab/tests/data/teststringarray_7.4_GLNX86.mat +0 -0
  466. scipy/io/matlab/tests/data/teststruct_6.1_SOL2.mat +0 -0
  467. scipy/io/matlab/tests/data/teststruct_6.5.1_GLNX86.mat +0 -0
  468. scipy/io/matlab/tests/data/teststruct_7.1_GLNX86.mat +0 -0
  469. scipy/io/matlab/tests/data/teststruct_7.4_GLNX86.mat +0 -0
  470. scipy/io/matlab/tests/data/teststructarr_6.1_SOL2.mat +0 -0
  471. scipy/io/matlab/tests/data/teststructarr_6.5.1_GLNX86.mat +0 -0
  472. scipy/io/matlab/tests/data/teststructarr_7.1_GLNX86.mat +0 -0
  473. scipy/io/matlab/tests/data/teststructarr_7.4_GLNX86.mat +0 -0
  474. scipy/io/matlab/tests/data/teststructnest_6.1_SOL2.mat +0 -0
  475. scipy/io/matlab/tests/data/teststructnest_6.5.1_GLNX86.mat +0 -0
  476. scipy/io/matlab/tests/data/teststructnest_7.1_GLNX86.mat +0 -0
  477. scipy/io/matlab/tests/data/teststructnest_7.4_GLNX86.mat +0 -0
  478. scipy/io/matlab/tests/data/testunicode_7.1_GLNX86.mat +0 -0
  479. scipy/io/matlab/tests/data/testunicode_7.4_GLNX86.mat +0 -0
  480. scipy/io/matlab/tests/data/testvec_4_GLNX86.mat +0 -0
  481. scipy/io/matlab/tests/test_byteordercodes.py +29 -0
  482. scipy/io/matlab/tests/test_mio.py +1399 -0
  483. scipy/io/matlab/tests/test_mio5_utils.py +179 -0
  484. scipy/io/matlab/tests/test_mio_funcs.py +51 -0
  485. scipy/io/matlab/tests/test_mio_utils.py +45 -0
  486. scipy/io/matlab/tests/test_miobase.py +32 -0
  487. scipy/io/matlab/tests/test_pathological.py +33 -0
  488. scipy/io/matlab/tests/test_streams.py +241 -0
  489. scipy/io/mmio.py +17 -0
  490. scipy/io/netcdf.py +17 -0
  491. scipy/io/tests/__init__.py +0 -0
  492. scipy/io/tests/data/Transparent Busy.ani +0 -0
  493. scipy/io/tests/data/array_float32_1d.sav +0 -0
  494. scipy/io/tests/data/array_float32_2d.sav +0 -0
  495. scipy/io/tests/data/array_float32_3d.sav +0 -0
  496. scipy/io/tests/data/array_float32_4d.sav +0 -0
  497. scipy/io/tests/data/array_float32_5d.sav +0 -0
  498. scipy/io/tests/data/array_float32_6d.sav +0 -0
  499. scipy/io/tests/data/array_float32_7d.sav +0 -0
  500. scipy/io/tests/data/array_float32_8d.sav +0 -0
  501. scipy/io/tests/data/array_float32_pointer_1d.sav +0 -0
  502. scipy/io/tests/data/array_float32_pointer_2d.sav +0 -0
  503. scipy/io/tests/data/array_float32_pointer_3d.sav +0 -0
  504. scipy/io/tests/data/array_float32_pointer_4d.sav +0 -0
  505. scipy/io/tests/data/array_float32_pointer_5d.sav +0 -0
  506. scipy/io/tests/data/array_float32_pointer_6d.sav +0 -0
  507. scipy/io/tests/data/array_float32_pointer_7d.sav +0 -0
  508. scipy/io/tests/data/array_float32_pointer_8d.sav +0 -0
  509. scipy/io/tests/data/example_1.nc +0 -0
  510. scipy/io/tests/data/example_2.nc +0 -0
  511. scipy/io/tests/data/example_3_maskedvals.nc +0 -0
  512. scipy/io/tests/data/fortran-3x3d-2i.dat +0 -0
  513. scipy/io/tests/data/fortran-mixed.dat +0 -0
  514. scipy/io/tests/data/fortran-sf8-11x1x10.dat +0 -0
  515. scipy/io/tests/data/fortran-sf8-15x10x22.dat +0 -0
  516. scipy/io/tests/data/fortran-sf8-1x1x1.dat +0 -0
  517. scipy/io/tests/data/fortran-sf8-1x1x5.dat +0 -0
  518. scipy/io/tests/data/fortran-sf8-1x1x7.dat +0 -0
  519. scipy/io/tests/data/fortran-sf8-1x3x5.dat +0 -0
  520. scipy/io/tests/data/fortran-si4-11x1x10.dat +0 -0
  521. scipy/io/tests/data/fortran-si4-15x10x22.dat +0 -0
  522. scipy/io/tests/data/fortran-si4-1x1x1.dat +0 -0
  523. scipy/io/tests/data/fortran-si4-1x1x5.dat +0 -0
  524. scipy/io/tests/data/fortran-si4-1x1x7.dat +0 -0
  525. scipy/io/tests/data/fortran-si4-1x3x5.dat +0 -0
  526. scipy/io/tests/data/invalid_pointer.sav +0 -0
  527. scipy/io/tests/data/null_pointer.sav +0 -0
  528. scipy/io/tests/data/scalar_byte.sav +0 -0
  529. scipy/io/tests/data/scalar_byte_descr.sav +0 -0
  530. scipy/io/tests/data/scalar_complex32.sav +0 -0
  531. scipy/io/tests/data/scalar_complex64.sav +0 -0
  532. scipy/io/tests/data/scalar_float32.sav +0 -0
  533. scipy/io/tests/data/scalar_float64.sav +0 -0
  534. scipy/io/tests/data/scalar_heap_pointer.sav +0 -0
  535. scipy/io/tests/data/scalar_int16.sav +0 -0
  536. scipy/io/tests/data/scalar_int32.sav +0 -0
  537. scipy/io/tests/data/scalar_int64.sav +0 -0
  538. scipy/io/tests/data/scalar_string.sav +0 -0
  539. scipy/io/tests/data/scalar_uint16.sav +0 -0
  540. scipy/io/tests/data/scalar_uint32.sav +0 -0
  541. scipy/io/tests/data/scalar_uint64.sav +0 -0
  542. scipy/io/tests/data/struct_arrays.sav +0 -0
  543. scipy/io/tests/data/struct_arrays_byte_idl80.sav +0 -0
  544. scipy/io/tests/data/struct_arrays_replicated.sav +0 -0
  545. scipy/io/tests/data/struct_arrays_replicated_3d.sav +0 -0
  546. scipy/io/tests/data/struct_inherit.sav +0 -0
  547. scipy/io/tests/data/struct_pointer_arrays.sav +0 -0
  548. scipy/io/tests/data/struct_pointer_arrays_replicated.sav +0 -0
  549. scipy/io/tests/data/struct_pointer_arrays_replicated_3d.sav +0 -0
  550. scipy/io/tests/data/struct_pointers.sav +0 -0
  551. scipy/io/tests/data/struct_pointers_replicated.sav +0 -0
  552. scipy/io/tests/data/struct_pointers_replicated_3d.sav +0 -0
  553. scipy/io/tests/data/struct_scalars.sav +0 -0
  554. scipy/io/tests/data/struct_scalars_replicated.sav +0 -0
  555. scipy/io/tests/data/struct_scalars_replicated_3d.sav +0 -0
  556. scipy/io/tests/data/test-1234Hz-le-1ch-10S-20bit-extra.wav +0 -0
  557. scipy/io/tests/data/test-44100Hz-2ch-32bit-float-be.wav +0 -0
  558. scipy/io/tests/data/test-44100Hz-2ch-32bit-float-le.wav +0 -0
  559. scipy/io/tests/data/test-44100Hz-be-1ch-4bytes.wav +0 -0
  560. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-early-eof-no-data.wav +0 -0
  561. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-early-eof.wav +0 -0
  562. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-incomplete-chunk.wav +0 -0
  563. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-rf64.wav +0 -0
  564. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes.wav +0 -0
  565. scipy/io/tests/data/test-48000Hz-2ch-64bit-float-le-wavex.wav +0 -0
  566. scipy/io/tests/data/test-8000Hz-be-3ch-5S-24bit.wav +0 -0
  567. scipy/io/tests/data/test-8000Hz-le-1ch-1byte-ulaw.wav +0 -0
  568. scipy/io/tests/data/test-8000Hz-le-2ch-1byteu.wav +0 -0
  569. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit-inconsistent.wav +0 -0
  570. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit-rf64.wav +0 -0
  571. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit.wav +0 -0
  572. scipy/io/tests/data/test-8000Hz-le-3ch-5S-36bit.wav +0 -0
  573. scipy/io/tests/data/test-8000Hz-le-3ch-5S-45bit.wav +0 -0
  574. scipy/io/tests/data/test-8000Hz-le-3ch-5S-53bit.wav +0 -0
  575. scipy/io/tests/data/test-8000Hz-le-3ch-5S-64bit.wav +0 -0
  576. scipy/io/tests/data/test-8000Hz-le-4ch-9S-12bit.wav +0 -0
  577. scipy/io/tests/data/test-8000Hz-le-5ch-9S-5bit.wav +0 -0
  578. scipy/io/tests/data/various_compressed.sav +0 -0
  579. scipy/io/tests/test_fortran.py +264 -0
  580. scipy/io/tests/test_idl.py +483 -0
  581. scipy/io/tests/test_mmio.py +831 -0
  582. scipy/io/tests/test_netcdf.py +550 -0
  583. scipy/io/tests/test_paths.py +93 -0
  584. scipy/io/tests/test_wavfile.py +501 -0
  585. scipy/io/wavfile.py +938 -0
  586. scipy/linalg/__init__.pxd +1 -0
  587. scipy/linalg/__init__.py +236 -0
  588. scipy/linalg/_basic.py +2146 -0
  589. scipy/linalg/_blas_subroutines.h +164 -0
  590. scipy/linalg/_cythonized_array_utils.cpython-314-x86_64-linux-musl.so +0 -0
  591. scipy/linalg/_cythonized_array_utils.pxd +40 -0
  592. scipy/linalg/_cythonized_array_utils.pyi +16 -0
  593. scipy/linalg/_decomp.py +1645 -0
  594. scipy/linalg/_decomp_cholesky.py +413 -0
  595. scipy/linalg/_decomp_cossin.py +236 -0
  596. scipy/linalg/_decomp_interpolative.cpython-314-x86_64-linux-musl.so +0 -0
  597. scipy/linalg/_decomp_ldl.py +356 -0
  598. scipy/linalg/_decomp_lu.py +401 -0
  599. scipy/linalg/_decomp_lu_cython.cpython-314-x86_64-linux-musl.so +0 -0
  600. scipy/linalg/_decomp_lu_cython.pyi +6 -0
  601. scipy/linalg/_decomp_polar.py +113 -0
  602. scipy/linalg/_decomp_qr.py +494 -0
  603. scipy/linalg/_decomp_qz.py +452 -0
  604. scipy/linalg/_decomp_schur.py +336 -0
  605. scipy/linalg/_decomp_svd.py +545 -0
  606. scipy/linalg/_decomp_update.cpython-314-x86_64-linux-musl.so +0 -0
  607. scipy/linalg/_expm_frechet.py +417 -0
  608. scipy/linalg/_fblas.cpython-314-x86_64-linux-musl.so +0 -0
  609. scipy/linalg/_flapack.cpython-314-x86_64-linux-musl.so +0 -0
  610. scipy/linalg/_lapack_subroutines.h +1521 -0
  611. scipy/linalg/_linalg_pythran.cpython-314-x86_64-linux-musl.so +0 -0
  612. scipy/linalg/_matfuncs.py +1050 -0
  613. scipy/linalg/_matfuncs_expm.cpython-314-x86_64-linux-musl.so +0 -0
  614. scipy/linalg/_matfuncs_expm.pyi +6 -0
  615. scipy/linalg/_matfuncs_inv_ssq.py +886 -0
  616. scipy/linalg/_matfuncs_schur_sqrtm.cpython-314-x86_64-linux-musl.so +0 -0
  617. scipy/linalg/_matfuncs_sqrtm.py +107 -0
  618. scipy/linalg/_matfuncs_sqrtm_triu.cpython-314-x86_64-linux-musl.so +0 -0
  619. scipy/linalg/_misc.py +191 -0
  620. scipy/linalg/_procrustes.py +113 -0
  621. scipy/linalg/_sketches.py +189 -0
  622. scipy/linalg/_solve_toeplitz.cpython-314-x86_64-linux-musl.so +0 -0
  623. scipy/linalg/_solvers.py +862 -0
  624. scipy/linalg/_special_matrices.py +1322 -0
  625. scipy/linalg/_testutils.py +65 -0
  626. scipy/linalg/basic.py +23 -0
  627. scipy/linalg/blas.py +495 -0
  628. scipy/linalg/cython_blas.cpython-314-x86_64-linux-musl.so +0 -0
  629. scipy/linalg/cython_blas.pxd +169 -0
  630. scipy/linalg/cython_blas.pyx +1432 -0
  631. scipy/linalg/cython_lapack.cpython-314-x86_64-linux-musl.so +0 -0
  632. scipy/linalg/cython_lapack.pxd +1528 -0
  633. scipy/linalg/cython_lapack.pyx +12045 -0
  634. scipy/linalg/decomp.py +23 -0
  635. scipy/linalg/decomp_cholesky.py +21 -0
  636. scipy/linalg/decomp_lu.py +21 -0
  637. scipy/linalg/decomp_qr.py +20 -0
  638. scipy/linalg/decomp_schur.py +21 -0
  639. scipy/linalg/decomp_svd.py +21 -0
  640. scipy/linalg/interpolative.py +989 -0
  641. scipy/linalg/lapack.py +1081 -0
  642. scipy/linalg/matfuncs.py +23 -0
  643. scipy/linalg/misc.py +21 -0
  644. scipy/linalg/special_matrices.py +22 -0
  645. scipy/linalg/tests/__init__.py +0 -0
  646. scipy/linalg/tests/_cython_examples/extending.pyx +23 -0
  647. scipy/linalg/tests/_cython_examples/meson.build +34 -0
  648. scipy/linalg/tests/data/carex_15_data.npz +0 -0
  649. scipy/linalg/tests/data/carex_18_data.npz +0 -0
  650. scipy/linalg/tests/data/carex_19_data.npz +0 -0
  651. scipy/linalg/tests/data/carex_20_data.npz +0 -0
  652. scipy/linalg/tests/data/carex_6_data.npz +0 -0
  653. scipy/linalg/tests/data/gendare_20170120_data.npz +0 -0
  654. scipy/linalg/tests/test_basic.py +2074 -0
  655. scipy/linalg/tests/test_batch.py +588 -0
  656. scipy/linalg/tests/test_blas.py +1127 -0
  657. scipy/linalg/tests/test_cython_blas.py +118 -0
  658. scipy/linalg/tests/test_cython_lapack.py +22 -0
  659. scipy/linalg/tests/test_cythonized_array_utils.py +130 -0
  660. scipy/linalg/tests/test_decomp.py +3189 -0
  661. scipy/linalg/tests/test_decomp_cholesky.py +268 -0
  662. scipy/linalg/tests/test_decomp_cossin.py +314 -0
  663. scipy/linalg/tests/test_decomp_ldl.py +137 -0
  664. scipy/linalg/tests/test_decomp_lu.py +308 -0
  665. scipy/linalg/tests/test_decomp_polar.py +110 -0
  666. scipy/linalg/tests/test_decomp_update.py +1701 -0
  667. scipy/linalg/tests/test_extending.py +46 -0
  668. scipy/linalg/tests/test_fblas.py +607 -0
  669. scipy/linalg/tests/test_interpolative.py +232 -0
  670. scipy/linalg/tests/test_lapack.py +3616 -0
  671. scipy/linalg/tests/test_matfuncs.py +1125 -0
  672. scipy/linalg/tests/test_matmul_toeplitz.py +136 -0
  673. scipy/linalg/tests/test_procrustes.py +214 -0
  674. scipy/linalg/tests/test_sketches.py +118 -0
  675. scipy/linalg/tests/test_solve_toeplitz.py +150 -0
  676. scipy/linalg/tests/test_solvers.py +844 -0
  677. scipy/linalg/tests/test_special_matrices.py +636 -0
  678. scipy/misc/__init__.py +6 -0
  679. scipy/misc/common.py +6 -0
  680. scipy/misc/doccer.py +6 -0
  681. scipy/ndimage/__init__.py +174 -0
  682. scipy/ndimage/_ctest.cpython-314-x86_64-linux-musl.so +0 -0
  683. scipy/ndimage/_cytest.cpython-314-x86_64-linux-musl.so +0 -0
  684. scipy/ndimage/_delegators.py +303 -0
  685. scipy/ndimage/_filters.py +2422 -0
  686. scipy/ndimage/_fourier.py +306 -0
  687. scipy/ndimage/_interpolation.py +1033 -0
  688. scipy/ndimage/_measurements.py +1689 -0
  689. scipy/ndimage/_morphology.py +2634 -0
  690. scipy/ndimage/_nd_image.cpython-314-x86_64-linux-musl.so +0 -0
  691. scipy/ndimage/_ndimage_api.py +16 -0
  692. scipy/ndimage/_ni_docstrings.py +214 -0
  693. scipy/ndimage/_ni_label.cpython-314-x86_64-linux-musl.so +0 -0
  694. scipy/ndimage/_ni_support.py +139 -0
  695. scipy/ndimage/_rank_filter_1d.cpython-314-x86_64-linux-musl.so +0 -0
  696. scipy/ndimage/_support_alternative_backends.py +84 -0
  697. scipy/ndimage/filters.py +27 -0
  698. scipy/ndimage/fourier.py +21 -0
  699. scipy/ndimage/interpolation.py +22 -0
  700. scipy/ndimage/measurements.py +24 -0
  701. scipy/ndimage/morphology.py +27 -0
  702. scipy/ndimage/tests/__init__.py +12 -0
  703. scipy/ndimage/tests/data/label_inputs.txt +21 -0
  704. scipy/ndimage/tests/data/label_results.txt +294 -0
  705. scipy/ndimage/tests/data/label_strels.txt +42 -0
  706. scipy/ndimage/tests/dots.png +0 -0
  707. scipy/ndimage/tests/test_c_api.py +102 -0
  708. scipy/ndimage/tests/test_datatypes.py +67 -0
  709. scipy/ndimage/tests/test_filters.py +3083 -0
  710. scipy/ndimage/tests/test_fourier.py +187 -0
  711. scipy/ndimage/tests/test_interpolation.py +1491 -0
  712. scipy/ndimage/tests/test_measurements.py +1592 -0
  713. scipy/ndimage/tests/test_morphology.py +2950 -0
  714. scipy/ndimage/tests/test_ni_support.py +78 -0
  715. scipy/ndimage/tests/test_splines.py +70 -0
  716. scipy/odr/__init__.py +131 -0
  717. scipy/odr/__odrpack.cpython-314-x86_64-linux-musl.so +0 -0
  718. scipy/odr/_add_newdocs.py +34 -0
  719. scipy/odr/_models.py +315 -0
  720. scipy/odr/_odrpack.py +1154 -0
  721. scipy/odr/models.py +20 -0
  722. scipy/odr/odrpack.py +21 -0
  723. scipy/odr/tests/__init__.py +0 -0
  724. scipy/odr/tests/test_odr.py +607 -0
  725. scipy/optimize/__init__.pxd +1 -0
  726. scipy/optimize/__init__.py +460 -0
  727. scipy/optimize/_basinhopping.py +741 -0
  728. scipy/optimize/_bglu_dense.cpython-314-x86_64-linux-musl.so +0 -0
  729. scipy/optimize/_bracket.py +706 -0
  730. scipy/optimize/_chandrupatla.py +551 -0
  731. scipy/optimize/_cobyla_py.py +297 -0
  732. scipy/optimize/_cobyqa_py.py +72 -0
  733. scipy/optimize/_constraints.py +598 -0
  734. scipy/optimize/_dcsrch.py +728 -0
  735. scipy/optimize/_differentiable_functions.py +835 -0
  736. scipy/optimize/_differentialevolution.py +1970 -0
  737. scipy/optimize/_direct.cpython-314-x86_64-linux-musl.so +0 -0
  738. scipy/optimize/_direct_py.py +280 -0
  739. scipy/optimize/_dual_annealing.py +732 -0
  740. scipy/optimize/_elementwise.py +798 -0
  741. scipy/optimize/_group_columns.cpython-314-x86_64-linux-musl.so +0 -0
  742. scipy/optimize/_hessian_update_strategy.py +479 -0
  743. scipy/optimize/_highspy/__init__.py +0 -0
  744. scipy/optimize/_highspy/_core.cpython-314-x86_64-linux-musl.so +0 -0
  745. scipy/optimize/_highspy/_highs_options.cpython-314-x86_64-linux-musl.so +0 -0
  746. scipy/optimize/_highspy/_highs_wrapper.py +338 -0
  747. scipy/optimize/_isotonic.py +157 -0
  748. scipy/optimize/_lbfgsb.cpython-314-x86_64-linux-musl.so +0 -0
  749. scipy/optimize/_lbfgsb_py.py +634 -0
  750. scipy/optimize/_linesearch.py +896 -0
  751. scipy/optimize/_linprog.py +733 -0
  752. scipy/optimize/_linprog_doc.py +1434 -0
  753. scipy/optimize/_linprog_highs.py +422 -0
  754. scipy/optimize/_linprog_ip.py +1141 -0
  755. scipy/optimize/_linprog_rs.py +572 -0
  756. scipy/optimize/_linprog_simplex.py +663 -0
  757. scipy/optimize/_linprog_util.py +1521 -0
  758. scipy/optimize/_lsap.cpython-314-x86_64-linux-musl.so +0 -0
  759. scipy/optimize/_lsq/__init__.py +5 -0
  760. scipy/optimize/_lsq/bvls.py +183 -0
  761. scipy/optimize/_lsq/common.py +731 -0
  762. scipy/optimize/_lsq/dogbox.py +345 -0
  763. scipy/optimize/_lsq/givens_elimination.cpython-314-x86_64-linux-musl.so +0 -0
  764. scipy/optimize/_lsq/least_squares.py +1044 -0
  765. scipy/optimize/_lsq/lsq_linear.py +361 -0
  766. scipy/optimize/_lsq/trf.py +587 -0
  767. scipy/optimize/_lsq/trf_linear.py +249 -0
  768. scipy/optimize/_milp.py +394 -0
  769. scipy/optimize/_minimize.py +1199 -0
  770. scipy/optimize/_minpack.cpython-314-x86_64-linux-musl.so +0 -0
  771. scipy/optimize/_minpack_py.py +1178 -0
  772. scipy/optimize/_moduleTNC.cpython-314-x86_64-linux-musl.so +0 -0
  773. scipy/optimize/_nnls.py +96 -0
  774. scipy/optimize/_nonlin.py +1634 -0
  775. scipy/optimize/_numdiff.py +963 -0
  776. scipy/optimize/_optimize.py +4169 -0
  777. scipy/optimize/_pava_pybind.cpython-314-x86_64-linux-musl.so +0 -0
  778. scipy/optimize/_qap.py +760 -0
  779. scipy/optimize/_remove_redundancy.py +522 -0
  780. scipy/optimize/_root.py +732 -0
  781. scipy/optimize/_root_scalar.py +538 -0
  782. scipy/optimize/_shgo.py +1606 -0
  783. scipy/optimize/_shgo_lib/__init__.py +0 -0
  784. scipy/optimize/_shgo_lib/_complex.py +1225 -0
  785. scipy/optimize/_shgo_lib/_vertex.py +460 -0
  786. scipy/optimize/_slsqp_py.py +603 -0
  787. scipy/optimize/_slsqplib.cpython-314-x86_64-linux-musl.so +0 -0
  788. scipy/optimize/_spectral.py +260 -0
  789. scipy/optimize/_tnc.py +438 -0
  790. scipy/optimize/_trlib/__init__.py +12 -0
  791. scipy/optimize/_trlib/_trlib.cpython-314-x86_64-linux-musl.so +0 -0
  792. scipy/optimize/_trustregion.py +318 -0
  793. scipy/optimize/_trustregion_constr/__init__.py +6 -0
  794. scipy/optimize/_trustregion_constr/canonical_constraint.py +390 -0
  795. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +231 -0
  796. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +584 -0
  797. scipy/optimize/_trustregion_constr/projections.py +411 -0
  798. scipy/optimize/_trustregion_constr/qp_subproblem.py +637 -0
  799. scipy/optimize/_trustregion_constr/report.py +49 -0
  800. scipy/optimize/_trustregion_constr/tests/__init__.py +0 -0
  801. scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py +296 -0
  802. scipy/optimize/_trustregion_constr/tests/test_nested_minimize.py +39 -0
  803. scipy/optimize/_trustregion_constr/tests/test_projections.py +214 -0
  804. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +645 -0
  805. scipy/optimize/_trustregion_constr/tests/test_report.py +34 -0
  806. scipy/optimize/_trustregion_constr/tr_interior_point.py +361 -0
  807. scipy/optimize/_trustregion_dogleg.py +122 -0
  808. scipy/optimize/_trustregion_exact.py +437 -0
  809. scipy/optimize/_trustregion_krylov.py +65 -0
  810. scipy/optimize/_trustregion_ncg.py +126 -0
  811. scipy/optimize/_tstutils.py +972 -0
  812. scipy/optimize/_zeros.cpython-314-x86_64-linux-musl.so +0 -0
  813. scipy/optimize/_zeros_py.py +1475 -0
  814. scipy/optimize/cobyla.py +19 -0
  815. scipy/optimize/cython_optimize/__init__.py +133 -0
  816. scipy/optimize/cython_optimize/_zeros.cpython-314-x86_64-linux-musl.so +0 -0
  817. scipy/optimize/cython_optimize/_zeros.pxd +33 -0
  818. scipy/optimize/cython_optimize/c_zeros.pxd +26 -0
  819. scipy/optimize/cython_optimize.pxd +11 -0
  820. scipy/optimize/elementwise.py +38 -0
  821. scipy/optimize/lbfgsb.py +23 -0
  822. scipy/optimize/linesearch.py +18 -0
  823. scipy/optimize/minpack.py +27 -0
  824. scipy/optimize/minpack2.py +17 -0
  825. scipy/optimize/moduleTNC.py +19 -0
  826. scipy/optimize/nonlin.py +29 -0
  827. scipy/optimize/optimize.py +40 -0
  828. scipy/optimize/slsqp.py +22 -0
  829. scipy/optimize/tests/__init__.py +0 -0
  830. scipy/optimize/tests/_cython_examples/extending.pyx +43 -0
  831. scipy/optimize/tests/_cython_examples/meson.build +32 -0
  832. scipy/optimize/tests/test__basinhopping.py +535 -0
  833. scipy/optimize/tests/test__differential_evolution.py +1703 -0
  834. scipy/optimize/tests/test__dual_annealing.py +416 -0
  835. scipy/optimize/tests/test__linprog_clean_inputs.py +312 -0
  836. scipy/optimize/tests/test__numdiff.py +885 -0
  837. scipy/optimize/tests/test__remove_redundancy.py +228 -0
  838. scipy/optimize/tests/test__root.py +124 -0
  839. scipy/optimize/tests/test__shgo.py +1164 -0
  840. scipy/optimize/tests/test__spectral.py +226 -0
  841. scipy/optimize/tests/test_bracket.py +896 -0
  842. scipy/optimize/tests/test_chandrupatla.py +982 -0
  843. scipy/optimize/tests/test_cobyla.py +195 -0
  844. scipy/optimize/tests/test_cobyqa.py +252 -0
  845. scipy/optimize/tests/test_constraint_conversion.py +286 -0
  846. scipy/optimize/tests/test_constraints.py +255 -0
  847. scipy/optimize/tests/test_cython_optimize.py +92 -0
  848. scipy/optimize/tests/test_differentiable_functions.py +1025 -0
  849. scipy/optimize/tests/test_direct.py +321 -0
  850. scipy/optimize/tests/test_extending.py +28 -0
  851. scipy/optimize/tests/test_hessian_update_strategy.py +300 -0
  852. scipy/optimize/tests/test_isotonic_regression.py +167 -0
  853. scipy/optimize/tests/test_lbfgsb_hessinv.py +65 -0
  854. scipy/optimize/tests/test_lbfgsb_setulb.py +122 -0
  855. scipy/optimize/tests/test_least_squares.py +986 -0
  856. scipy/optimize/tests/test_linear_assignment.py +116 -0
  857. scipy/optimize/tests/test_linesearch.py +328 -0
  858. scipy/optimize/tests/test_linprog.py +2577 -0
  859. scipy/optimize/tests/test_lsq_common.py +297 -0
  860. scipy/optimize/tests/test_lsq_linear.py +287 -0
  861. scipy/optimize/tests/test_milp.py +459 -0
  862. scipy/optimize/tests/test_minimize_constrained.py +845 -0
  863. scipy/optimize/tests/test_minpack.py +1194 -0
  864. scipy/optimize/tests/test_nnls.py +469 -0
  865. scipy/optimize/tests/test_nonlin.py +572 -0
  866. scipy/optimize/tests/test_optimize.py +3335 -0
  867. scipy/optimize/tests/test_quadratic_assignment.py +455 -0
  868. scipy/optimize/tests/test_regression.py +40 -0
  869. scipy/optimize/tests/test_slsqp.py +645 -0
  870. scipy/optimize/tests/test_tnc.py +345 -0
  871. scipy/optimize/tests/test_trustregion.py +110 -0
  872. scipy/optimize/tests/test_trustregion_exact.py +351 -0
  873. scipy/optimize/tests/test_trustregion_krylov.py +170 -0
  874. scipy/optimize/tests/test_zeros.py +998 -0
  875. scipy/optimize/tnc.py +22 -0
  876. scipy/optimize/zeros.py +26 -0
  877. scipy/signal/__init__.py +316 -0
  878. scipy/signal/_arraytools.py +264 -0
  879. scipy/signal/_czt.py +575 -0
  880. scipy/signal/_delegators.py +568 -0
  881. scipy/signal/_filter_design.py +5893 -0
  882. scipy/signal/_fir_filter_design.py +1458 -0
  883. scipy/signal/_lti_conversion.py +534 -0
  884. scipy/signal/_ltisys.py +3546 -0
  885. scipy/signal/_max_len_seq.py +139 -0
  886. scipy/signal/_max_len_seq_inner.cpython-314-x86_64-linux-musl.so +0 -0
  887. scipy/signal/_peak_finding.py +1310 -0
  888. scipy/signal/_peak_finding_utils.cpython-314-x86_64-linux-musl.so +0 -0
  889. scipy/signal/_polyutils.py +172 -0
  890. scipy/signal/_savitzky_golay.py +357 -0
  891. scipy/signal/_short_time_fft.py +2187 -0
  892. scipy/signal/_signal_api.py +30 -0
  893. scipy/signal/_signaltools.py +5309 -0
  894. scipy/signal/_sigtools.cpython-314-x86_64-linux-musl.so +0 -0
  895. scipy/signal/_sosfilt.cpython-314-x86_64-linux-musl.so +0 -0
  896. scipy/signal/_spectral_py.py +2471 -0
  897. scipy/signal/_spline.cpython-314-x86_64-linux-musl.so +0 -0
  898. scipy/signal/_spline.pyi +34 -0
  899. scipy/signal/_spline_filters.py +848 -0
  900. scipy/signal/_support_alternative_backends.py +73 -0
  901. scipy/signal/_upfirdn.py +219 -0
  902. scipy/signal/_upfirdn_apply.cpython-314-x86_64-linux-musl.so +0 -0
  903. scipy/signal/_waveforms.py +687 -0
  904. scipy/signal/_wavelets.py +29 -0
  905. scipy/signal/bsplines.py +21 -0
  906. scipy/signal/filter_design.py +28 -0
  907. scipy/signal/fir_filter_design.py +21 -0
  908. scipy/signal/lti_conversion.py +20 -0
  909. scipy/signal/ltisys.py +25 -0
  910. scipy/signal/signaltools.py +27 -0
  911. scipy/signal/spectral.py +21 -0
  912. scipy/signal/spline.py +18 -0
  913. scipy/signal/tests/__init__.py +0 -0
  914. scipy/signal/tests/_scipy_spectral_test_shim.py +311 -0
  915. scipy/signal/tests/mpsig.py +122 -0
  916. scipy/signal/tests/test_array_tools.py +111 -0
  917. scipy/signal/tests/test_bsplines.py +365 -0
  918. scipy/signal/tests/test_cont2discrete.py +424 -0
  919. scipy/signal/tests/test_czt.py +221 -0
  920. scipy/signal/tests/test_dltisys.py +599 -0
  921. scipy/signal/tests/test_filter_design.py +4744 -0
  922. scipy/signal/tests/test_fir_filter_design.py +851 -0
  923. scipy/signal/tests/test_ltisys.py +1225 -0
  924. scipy/signal/tests/test_max_len_seq.py +71 -0
  925. scipy/signal/tests/test_peak_finding.py +915 -0
  926. scipy/signal/tests/test_result_type.py +51 -0
  927. scipy/signal/tests/test_savitzky_golay.py +363 -0
  928. scipy/signal/tests/test_short_time_fft.py +1098 -0
  929. scipy/signal/tests/test_signaltools.py +4729 -0
  930. scipy/signal/tests/test_spectral.py +2103 -0
  931. scipy/signal/tests/test_splines.py +427 -0
  932. scipy/signal/tests/test_upfirdn.py +322 -0
  933. scipy/signal/tests/test_waveforms.py +400 -0
  934. scipy/signal/tests/test_wavelets.py +59 -0
  935. scipy/signal/tests/test_windows.py +987 -0
  936. scipy/signal/waveforms.py +20 -0
  937. scipy/signal/wavelets.py +17 -0
  938. scipy/signal/windows/__init__.py +52 -0
  939. scipy/signal/windows/_windows.py +2513 -0
  940. scipy/signal/windows/windows.py +23 -0
  941. scipy/sparse/__init__.py +350 -0
  942. scipy/sparse/_base.py +1613 -0
  943. scipy/sparse/_bsr.py +880 -0
  944. scipy/sparse/_compressed.py +1328 -0
  945. scipy/sparse/_construct.py +1454 -0
  946. scipy/sparse/_coo.py +1581 -0
  947. scipy/sparse/_csc.py +367 -0
  948. scipy/sparse/_csparsetools.cpython-314-x86_64-linux-musl.so +0 -0
  949. scipy/sparse/_csr.py +558 -0
  950. scipy/sparse/_data.py +569 -0
  951. scipy/sparse/_dia.py +677 -0
  952. scipy/sparse/_dok.py +669 -0
  953. scipy/sparse/_extract.py +178 -0
  954. scipy/sparse/_index.py +444 -0
  955. scipy/sparse/_lil.py +632 -0
  956. scipy/sparse/_matrix.py +169 -0
  957. scipy/sparse/_matrix_io.py +167 -0
  958. scipy/sparse/_sparsetools.cpython-314-x86_64-linux-musl.so +0 -0
  959. scipy/sparse/_spfuncs.py +76 -0
  960. scipy/sparse/_sputils.py +632 -0
  961. scipy/sparse/base.py +24 -0
  962. scipy/sparse/bsr.py +22 -0
  963. scipy/sparse/compressed.py +20 -0
  964. scipy/sparse/construct.py +38 -0
  965. scipy/sparse/coo.py +23 -0
  966. scipy/sparse/csc.py +22 -0
  967. scipy/sparse/csgraph/__init__.py +210 -0
  968. scipy/sparse/csgraph/_flow.cpython-314-x86_64-linux-musl.so +0 -0
  969. scipy/sparse/csgraph/_laplacian.py +563 -0
  970. scipy/sparse/csgraph/_matching.cpython-314-x86_64-linux-musl.so +0 -0
  971. scipy/sparse/csgraph/_min_spanning_tree.cpython-314-x86_64-linux-musl.so +0 -0
  972. scipy/sparse/csgraph/_reordering.cpython-314-x86_64-linux-musl.so +0 -0
  973. scipy/sparse/csgraph/_shortest_path.cpython-314-x86_64-linux-musl.so +0 -0
  974. scipy/sparse/csgraph/_tools.cpython-314-x86_64-linux-musl.so +0 -0
  975. scipy/sparse/csgraph/_traversal.cpython-314-x86_64-linux-musl.so +0 -0
  976. scipy/sparse/csgraph/_validation.py +66 -0
  977. scipy/sparse/csgraph/tests/__init__.py +0 -0
  978. scipy/sparse/csgraph/tests/test_connected_components.py +119 -0
  979. scipy/sparse/csgraph/tests/test_conversions.py +61 -0
  980. scipy/sparse/csgraph/tests/test_flow.py +209 -0
  981. scipy/sparse/csgraph/tests/test_graph_laplacian.py +368 -0
  982. scipy/sparse/csgraph/tests/test_matching.py +307 -0
  983. scipy/sparse/csgraph/tests/test_pydata_sparse.py +197 -0
  984. scipy/sparse/csgraph/tests/test_reordering.py +70 -0
  985. scipy/sparse/csgraph/tests/test_shortest_path.py +540 -0
  986. scipy/sparse/csgraph/tests/test_spanning_tree.py +66 -0
  987. scipy/sparse/csgraph/tests/test_traversal.py +148 -0
  988. scipy/sparse/csr.py +22 -0
  989. scipy/sparse/data.py +18 -0
  990. scipy/sparse/dia.py +22 -0
  991. scipy/sparse/dok.py +22 -0
  992. scipy/sparse/extract.py +23 -0
  993. scipy/sparse/lil.py +22 -0
  994. scipy/sparse/linalg/__init__.py +148 -0
  995. scipy/sparse/linalg/_dsolve/__init__.py +71 -0
  996. scipy/sparse/linalg/_dsolve/_add_newdocs.py +147 -0
  997. scipy/sparse/linalg/_dsolve/_superlu.cpython-314-x86_64-linux-musl.so +0 -0
  998. scipy/sparse/linalg/_dsolve/linsolve.py +882 -0
  999. scipy/sparse/linalg/_dsolve/tests/__init__.py +0 -0
  1000. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +928 -0
  1001. scipy/sparse/linalg/_eigen/__init__.py +22 -0
  1002. scipy/sparse/linalg/_eigen/_svds.py +540 -0
  1003. scipy/sparse/linalg/_eigen/_svds_doc.py +382 -0
  1004. scipy/sparse/linalg/_eigen/arpack/COPYING +45 -0
  1005. scipy/sparse/linalg/_eigen/arpack/__init__.py +20 -0
  1006. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-314-x86_64-linux-musl.so +0 -0
  1007. scipy/sparse/linalg/_eigen/arpack/arpack.py +1706 -0
  1008. scipy/sparse/linalg/_eigen/arpack/tests/__init__.py +0 -0
  1009. scipy/sparse/linalg/_eigen/arpack/tests/test_arpack.py +717 -0
  1010. scipy/sparse/linalg/_eigen/lobpcg/__init__.py +16 -0
  1011. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +1110 -0
  1012. scipy/sparse/linalg/_eigen/lobpcg/tests/__init__.py +0 -0
  1013. scipy/sparse/linalg/_eigen/lobpcg/tests/test_lobpcg.py +725 -0
  1014. scipy/sparse/linalg/_eigen/tests/__init__.py +0 -0
  1015. scipy/sparse/linalg/_eigen/tests/test_svds.py +886 -0
  1016. scipy/sparse/linalg/_expm_multiply.py +816 -0
  1017. scipy/sparse/linalg/_interface.py +920 -0
  1018. scipy/sparse/linalg/_isolve/__init__.py +20 -0
  1019. scipy/sparse/linalg/_isolve/_gcrotmk.py +503 -0
  1020. scipy/sparse/linalg/_isolve/iterative.py +1051 -0
  1021. scipy/sparse/linalg/_isolve/lgmres.py +230 -0
  1022. scipy/sparse/linalg/_isolve/lsmr.py +486 -0
  1023. scipy/sparse/linalg/_isolve/lsqr.py +589 -0
  1024. scipy/sparse/linalg/_isolve/minres.py +372 -0
  1025. scipy/sparse/linalg/_isolve/tests/__init__.py +0 -0
  1026. scipy/sparse/linalg/_isolve/tests/test_gcrotmk.py +183 -0
  1027. scipy/sparse/linalg/_isolve/tests/test_iterative.py +809 -0
  1028. scipy/sparse/linalg/_isolve/tests/test_lgmres.py +225 -0
  1029. scipy/sparse/linalg/_isolve/tests/test_lsmr.py +185 -0
  1030. scipy/sparse/linalg/_isolve/tests/test_lsqr.py +120 -0
  1031. scipy/sparse/linalg/_isolve/tests/test_minres.py +97 -0
  1032. scipy/sparse/linalg/_isolve/tests/test_utils.py +9 -0
  1033. scipy/sparse/linalg/_isolve/tfqmr.py +179 -0
  1034. scipy/sparse/linalg/_isolve/utils.py +121 -0
  1035. scipy/sparse/linalg/_matfuncs.py +940 -0
  1036. scipy/sparse/linalg/_norm.py +195 -0
  1037. scipy/sparse/linalg/_onenormest.py +467 -0
  1038. scipy/sparse/linalg/_propack/_cpropack.cpython-314-x86_64-linux-musl.so +0 -0
  1039. scipy/sparse/linalg/_propack/_dpropack.cpython-314-x86_64-linux-musl.so +0 -0
  1040. scipy/sparse/linalg/_propack/_spropack.cpython-314-x86_64-linux-musl.so +0 -0
  1041. scipy/sparse/linalg/_propack/_zpropack.cpython-314-x86_64-linux-musl.so +0 -0
  1042. scipy/sparse/linalg/_special_sparse_arrays.py +949 -0
  1043. scipy/sparse/linalg/_svdp.py +309 -0
  1044. scipy/sparse/linalg/dsolve.py +22 -0
  1045. scipy/sparse/linalg/eigen.py +21 -0
  1046. scipy/sparse/linalg/interface.py +20 -0
  1047. scipy/sparse/linalg/isolve.py +22 -0
  1048. scipy/sparse/linalg/matfuncs.py +18 -0
  1049. scipy/sparse/linalg/tests/__init__.py +0 -0
  1050. scipy/sparse/linalg/tests/propack_test_data.npz +0 -0
  1051. scipy/sparse/linalg/tests/test_expm_multiply.py +367 -0
  1052. scipy/sparse/linalg/tests/test_interface.py +561 -0
  1053. scipy/sparse/linalg/tests/test_matfuncs.py +592 -0
  1054. scipy/sparse/linalg/tests/test_norm.py +154 -0
  1055. scipy/sparse/linalg/tests/test_onenormest.py +252 -0
  1056. scipy/sparse/linalg/tests/test_propack.py +165 -0
  1057. scipy/sparse/linalg/tests/test_pydata_sparse.py +272 -0
  1058. scipy/sparse/linalg/tests/test_special_sparse_arrays.py +337 -0
  1059. scipy/sparse/sparsetools.py +17 -0
  1060. scipy/sparse/spfuncs.py +17 -0
  1061. scipy/sparse/sputils.py +17 -0
  1062. scipy/sparse/tests/__init__.py +0 -0
  1063. scipy/sparse/tests/data/csc_py2.npz +0 -0
  1064. scipy/sparse/tests/data/csc_py3.npz +0 -0
  1065. scipy/sparse/tests/test_arithmetic1d.py +341 -0
  1066. scipy/sparse/tests/test_array_api.py +561 -0
  1067. scipy/sparse/tests/test_base.py +5870 -0
  1068. scipy/sparse/tests/test_common1d.py +447 -0
  1069. scipy/sparse/tests/test_construct.py +872 -0
  1070. scipy/sparse/tests/test_coo.py +1119 -0
  1071. scipy/sparse/tests/test_csc.py +98 -0
  1072. scipy/sparse/tests/test_csr.py +214 -0
  1073. scipy/sparse/tests/test_dok.py +209 -0
  1074. scipy/sparse/tests/test_extract.py +51 -0
  1075. scipy/sparse/tests/test_indexing1d.py +603 -0
  1076. scipy/sparse/tests/test_matrix_io.py +109 -0
  1077. scipy/sparse/tests/test_minmax1d.py +128 -0
  1078. scipy/sparse/tests/test_sparsetools.py +344 -0
  1079. scipy/sparse/tests/test_spfuncs.py +97 -0
  1080. scipy/sparse/tests/test_sputils.py +424 -0
  1081. scipy/spatial/__init__.py +129 -0
  1082. scipy/spatial/_ckdtree.cpython-314-x86_64-linux-musl.so +0 -0
  1083. scipy/spatial/_distance_pybind.cpython-314-x86_64-linux-musl.so +0 -0
  1084. scipy/spatial/_distance_wrap.cpython-314-x86_64-linux-musl.so +0 -0
  1085. scipy/spatial/_geometric_slerp.py +238 -0
  1086. scipy/spatial/_hausdorff.cpython-314-x86_64-linux-musl.so +0 -0
  1087. scipy/spatial/_kdtree.py +920 -0
  1088. scipy/spatial/_plotutils.py +274 -0
  1089. scipy/spatial/_procrustes.py +132 -0
  1090. scipy/spatial/_qhull.cpython-314-x86_64-linux-musl.so +0 -0
  1091. scipy/spatial/_qhull.pyi +213 -0
  1092. scipy/spatial/_spherical_voronoi.py +341 -0
  1093. scipy/spatial/_voronoi.cpython-314-x86_64-linux-musl.so +0 -0
  1094. scipy/spatial/_voronoi.pyi +4 -0
  1095. scipy/spatial/ckdtree.py +18 -0
  1096. scipy/spatial/distance.py +3147 -0
  1097. scipy/spatial/distance.pyi +210 -0
  1098. scipy/spatial/kdtree.py +25 -0
  1099. scipy/spatial/qhull.py +25 -0
  1100. scipy/spatial/tests/__init__.py +0 -0
  1101. scipy/spatial/tests/data/cdist-X1.txt +10 -0
  1102. scipy/spatial/tests/data/cdist-X2.txt +20 -0
  1103. scipy/spatial/tests/data/degenerate_pointset.npz +0 -0
  1104. scipy/spatial/tests/data/iris.txt +150 -0
  1105. scipy/spatial/tests/data/pdist-boolean-inp.txt +20 -0
  1106. scipy/spatial/tests/data/pdist-chebyshev-ml-iris.txt +1 -0
  1107. scipy/spatial/tests/data/pdist-chebyshev-ml.txt +1 -0
  1108. scipy/spatial/tests/data/pdist-cityblock-ml-iris.txt +1 -0
  1109. scipy/spatial/tests/data/pdist-cityblock-ml.txt +1 -0
  1110. scipy/spatial/tests/data/pdist-correlation-ml-iris.txt +1 -0
  1111. scipy/spatial/tests/data/pdist-correlation-ml.txt +1 -0
  1112. scipy/spatial/tests/data/pdist-cosine-ml-iris.txt +1 -0
  1113. scipy/spatial/tests/data/pdist-cosine-ml.txt +1 -0
  1114. scipy/spatial/tests/data/pdist-double-inp.txt +20 -0
  1115. scipy/spatial/tests/data/pdist-euclidean-ml-iris.txt +1 -0
  1116. scipy/spatial/tests/data/pdist-euclidean-ml.txt +1 -0
  1117. scipy/spatial/tests/data/pdist-hamming-ml.txt +1 -0
  1118. scipy/spatial/tests/data/pdist-jaccard-ml.txt +1 -0
  1119. scipy/spatial/tests/data/pdist-jensenshannon-ml-iris.txt +1 -0
  1120. scipy/spatial/tests/data/pdist-jensenshannon-ml.txt +1 -0
  1121. scipy/spatial/tests/data/pdist-minkowski-3.2-ml-iris.txt +1 -0
  1122. scipy/spatial/tests/data/pdist-minkowski-3.2-ml.txt +1 -0
  1123. scipy/spatial/tests/data/pdist-minkowski-5.8-ml-iris.txt +1 -0
  1124. scipy/spatial/tests/data/pdist-seuclidean-ml-iris.txt +1 -0
  1125. scipy/spatial/tests/data/pdist-seuclidean-ml.txt +1 -0
  1126. scipy/spatial/tests/data/pdist-spearman-ml.txt +1 -0
  1127. scipy/spatial/tests/data/random-bool-data.txt +100 -0
  1128. scipy/spatial/tests/data/random-double-data.txt +100 -0
  1129. scipy/spatial/tests/data/random-int-data.txt +100 -0
  1130. scipy/spatial/tests/data/random-uint-data.txt +100 -0
  1131. scipy/spatial/tests/data/selfdual-4d-polytope.txt +27 -0
  1132. scipy/spatial/tests/test__plotutils.py +91 -0
  1133. scipy/spatial/tests/test__procrustes.py +116 -0
  1134. scipy/spatial/tests/test_distance.py +2388 -0
  1135. scipy/spatial/tests/test_hausdorff.py +199 -0
  1136. scipy/spatial/tests/test_kdtree.py +1536 -0
  1137. scipy/spatial/tests/test_qhull.py +1313 -0
  1138. scipy/spatial/tests/test_slerp.py +417 -0
  1139. scipy/spatial/tests/test_spherical_voronoi.py +358 -0
  1140. scipy/spatial/transform/__init__.py +31 -0
  1141. scipy/spatial/transform/_rigid_transform.cpython-314-x86_64-linux-musl.so +0 -0
  1142. scipy/spatial/transform/_rotation.cpython-314-x86_64-linux-musl.so +0 -0
  1143. scipy/spatial/transform/_rotation_groups.py +140 -0
  1144. scipy/spatial/transform/_rotation_spline.py +460 -0
  1145. scipy/spatial/transform/rotation.py +21 -0
  1146. scipy/spatial/transform/tests/__init__.py +0 -0
  1147. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  1148. scipy/spatial/transform/tests/test_rotation.py +2569 -0
  1149. scipy/spatial/transform/tests/test_rotation_groups.py +169 -0
  1150. scipy/spatial/transform/tests/test_rotation_spline.py +183 -0
  1151. scipy/special/__init__.pxd +1 -0
  1152. scipy/special/__init__.py +841 -0
  1153. scipy/special/_add_newdocs.py +9961 -0
  1154. scipy/special/_basic.py +3576 -0
  1155. scipy/special/_comb.cpython-314-x86_64-linux-musl.so +0 -0
  1156. scipy/special/_ellip_harm.py +214 -0
  1157. scipy/special/_ellip_harm_2.cpython-314-x86_64-linux-musl.so +0 -0
  1158. scipy/special/_gufuncs.cpython-314-x86_64-linux-musl.so +0 -0
  1159. scipy/special/_input_validation.py +17 -0
  1160. scipy/special/_lambertw.py +149 -0
  1161. scipy/special/_logsumexp.py +426 -0
  1162. scipy/special/_mptestutils.py +453 -0
  1163. scipy/special/_multiufuncs.py +610 -0
  1164. scipy/special/_orthogonal.py +2592 -0
  1165. scipy/special/_orthogonal.pyi +330 -0
  1166. scipy/special/_precompute/__init__.py +0 -0
  1167. scipy/special/_precompute/cosine_cdf.py +17 -0
  1168. scipy/special/_precompute/expn_asy.py +54 -0
  1169. scipy/special/_precompute/gammainc_asy.py +116 -0
  1170. scipy/special/_precompute/gammainc_data.py +124 -0
  1171. scipy/special/_precompute/hyp2f1_data.py +484 -0
  1172. scipy/special/_precompute/lambertw.py +68 -0
  1173. scipy/special/_precompute/loggamma.py +43 -0
  1174. scipy/special/_precompute/struve_convergence.py +131 -0
  1175. scipy/special/_precompute/utils.py +38 -0
  1176. scipy/special/_precompute/wright_bessel.py +342 -0
  1177. scipy/special/_precompute/wright_bessel_data.py +152 -0
  1178. scipy/special/_precompute/wrightomega.py +41 -0
  1179. scipy/special/_precompute/zetac.py +27 -0
  1180. scipy/special/_sf_error.py +15 -0
  1181. scipy/special/_specfun.cpython-314-x86_64-linux-musl.so +0 -0
  1182. scipy/special/_special_ufuncs.cpython-314-x86_64-linux-musl.so +0 -0
  1183. scipy/special/_spfun_stats.py +106 -0
  1184. scipy/special/_spherical_bessel.py +397 -0
  1185. scipy/special/_support_alternative_backends.py +295 -0
  1186. scipy/special/_test_internal.cpython-314-x86_64-linux-musl.so +0 -0
  1187. scipy/special/_test_internal.pyi +9 -0
  1188. scipy/special/_testutils.py +321 -0
  1189. scipy/special/_ufuncs.cpython-314-x86_64-linux-musl.so +0 -0
  1190. scipy/special/_ufuncs.pyi +522 -0
  1191. scipy/special/_ufuncs.pyx +13173 -0
  1192. scipy/special/_ufuncs_cxx.cpython-314-x86_64-linux-musl.so +0 -0
  1193. scipy/special/_ufuncs_cxx.pxd +142 -0
  1194. scipy/special/_ufuncs_cxx.pyx +427 -0
  1195. scipy/special/_ufuncs_cxx_defs.h +147 -0
  1196. scipy/special/_ufuncs_defs.h +57 -0
  1197. scipy/special/add_newdocs.py +15 -0
  1198. scipy/special/basic.py +87 -0
  1199. scipy/special/cython_special.cpython-314-x86_64-linux-musl.so +0 -0
  1200. scipy/special/cython_special.pxd +259 -0
  1201. scipy/special/cython_special.pyi +3 -0
  1202. scipy/special/orthogonal.py +45 -0
  1203. scipy/special/sf_error.py +20 -0
  1204. scipy/special/specfun.py +24 -0
  1205. scipy/special/spfun_stats.py +17 -0
  1206. scipy/special/tests/__init__.py +0 -0
  1207. scipy/special/tests/_cython_examples/extending.pyx +12 -0
  1208. scipy/special/tests/_cython_examples/meson.build +34 -0
  1209. scipy/special/tests/data/__init__.py +0 -0
  1210. scipy/special/tests/data/boost.npz +0 -0
  1211. scipy/special/tests/data/gsl.npz +0 -0
  1212. scipy/special/tests/data/local.npz +0 -0
  1213. scipy/special/tests/test_basic.py +4815 -0
  1214. scipy/special/tests/test_bdtr.py +112 -0
  1215. scipy/special/tests/test_boost_ufuncs.py +64 -0
  1216. scipy/special/tests/test_boxcox.py +125 -0
  1217. scipy/special/tests/test_cdflib.py +712 -0
  1218. scipy/special/tests/test_cdft_asymptotic.py +49 -0
  1219. scipy/special/tests/test_cephes_intp_cast.py +29 -0
  1220. scipy/special/tests/test_cosine_distr.py +83 -0
  1221. scipy/special/tests/test_cython_special.py +363 -0
  1222. scipy/special/tests/test_data.py +719 -0
  1223. scipy/special/tests/test_dd.py +42 -0
  1224. scipy/special/tests/test_digamma.py +45 -0
  1225. scipy/special/tests/test_ellip_harm.py +278 -0
  1226. scipy/special/tests/test_erfinv.py +89 -0
  1227. scipy/special/tests/test_exponential_integrals.py +118 -0
  1228. scipy/special/tests/test_extending.py +28 -0
  1229. scipy/special/tests/test_faddeeva.py +85 -0
  1230. scipy/special/tests/test_gamma.py +12 -0
  1231. scipy/special/tests/test_gammainc.py +152 -0
  1232. scipy/special/tests/test_hyp2f1.py +2566 -0
  1233. scipy/special/tests/test_hypergeometric.py +234 -0
  1234. scipy/special/tests/test_iv_ratio.py +249 -0
  1235. scipy/special/tests/test_kolmogorov.py +491 -0
  1236. scipy/special/tests/test_lambertw.py +109 -0
  1237. scipy/special/tests/test_legendre.py +1518 -0
  1238. scipy/special/tests/test_log1mexp.py +85 -0
  1239. scipy/special/tests/test_loggamma.py +70 -0
  1240. scipy/special/tests/test_logit.py +162 -0
  1241. scipy/special/tests/test_logsumexp.py +469 -0
  1242. scipy/special/tests/test_mpmath.py +2293 -0
  1243. scipy/special/tests/test_nan_inputs.py +65 -0
  1244. scipy/special/tests/test_ndtr.py +77 -0
  1245. scipy/special/tests/test_ndtri_exp.py +94 -0
  1246. scipy/special/tests/test_orthogonal.py +821 -0
  1247. scipy/special/tests/test_orthogonal_eval.py +275 -0
  1248. scipy/special/tests/test_owens_t.py +53 -0
  1249. scipy/special/tests/test_pcf.py +24 -0
  1250. scipy/special/tests/test_pdtr.py +48 -0
  1251. scipy/special/tests/test_powm1.py +65 -0
  1252. scipy/special/tests/test_precompute_expn_asy.py +24 -0
  1253. scipy/special/tests/test_precompute_gammainc.py +108 -0
  1254. scipy/special/tests/test_precompute_utils.py +36 -0
  1255. scipy/special/tests/test_round.py +18 -0
  1256. scipy/special/tests/test_sf_error.py +146 -0
  1257. scipy/special/tests/test_sici.py +36 -0
  1258. scipy/special/tests/test_specfun.py +48 -0
  1259. scipy/special/tests/test_spence.py +32 -0
  1260. scipy/special/tests/test_spfun_stats.py +61 -0
  1261. scipy/special/tests/test_sph_harm.py +85 -0
  1262. scipy/special/tests/test_spherical_bessel.py +400 -0
  1263. scipy/special/tests/test_support_alternative_backends.py +248 -0
  1264. scipy/special/tests/test_trig.py +72 -0
  1265. scipy/special/tests/test_ufunc_signatures.py +46 -0
  1266. scipy/special/tests/test_wright_bessel.py +205 -0
  1267. scipy/special/tests/test_wrightomega.py +117 -0
  1268. scipy/special/tests/test_zeta.py +301 -0
  1269. scipy/stats/__init__.py +670 -0
  1270. scipy/stats/_ansari_swilk_statistics.cpython-314-x86_64-linux-musl.so +0 -0
  1271. scipy/stats/_axis_nan_policy.py +692 -0
  1272. scipy/stats/_biasedurn.cpython-314-x86_64-linux-musl.so +0 -0
  1273. scipy/stats/_biasedurn.pxd +27 -0
  1274. scipy/stats/_binned_statistic.py +795 -0
  1275. scipy/stats/_binomtest.py +375 -0
  1276. scipy/stats/_bws_test.py +177 -0
  1277. scipy/stats/_censored_data.py +459 -0
  1278. scipy/stats/_common.py +5 -0
  1279. scipy/stats/_constants.py +42 -0
  1280. scipy/stats/_continued_fraction.py +387 -0
  1281. scipy/stats/_continuous_distns.py +12486 -0
  1282. scipy/stats/_correlation.py +210 -0
  1283. scipy/stats/_covariance.py +636 -0
  1284. scipy/stats/_crosstab.py +204 -0
  1285. scipy/stats/_discrete_distns.py +2098 -0
  1286. scipy/stats/_distn_infrastructure.py +4201 -0
  1287. scipy/stats/_distr_params.py +299 -0
  1288. scipy/stats/_distribution_infrastructure.py +5750 -0
  1289. scipy/stats/_entropy.py +428 -0
  1290. scipy/stats/_finite_differences.py +145 -0
  1291. scipy/stats/_fit.py +1351 -0
  1292. scipy/stats/_hypotests.py +2060 -0
  1293. scipy/stats/_kde.py +732 -0
  1294. scipy/stats/_ksstats.py +600 -0
  1295. scipy/stats/_levy_stable/__init__.py +1231 -0
  1296. scipy/stats/_levy_stable/levyst.cpython-314-x86_64-linux-musl.so +0 -0
  1297. scipy/stats/_mannwhitneyu.py +492 -0
  1298. scipy/stats/_mgc.py +550 -0
  1299. scipy/stats/_morestats.py +4626 -0
  1300. scipy/stats/_mstats_basic.py +3658 -0
  1301. scipy/stats/_mstats_extras.py +521 -0
  1302. scipy/stats/_multicomp.py +449 -0
  1303. scipy/stats/_multivariate.py +7281 -0
  1304. scipy/stats/_new_distributions.py +452 -0
  1305. scipy/stats/_odds_ratio.py +466 -0
  1306. scipy/stats/_page_trend_test.py +486 -0
  1307. scipy/stats/_probability_distribution.py +1964 -0
  1308. scipy/stats/_qmc.py +2956 -0
  1309. scipy/stats/_qmc_cy.cpython-314-x86_64-linux-musl.so +0 -0
  1310. scipy/stats/_qmc_cy.pyi +54 -0
  1311. scipy/stats/_qmvnt.py +454 -0
  1312. scipy/stats/_qmvnt_cy.cpython-314-x86_64-linux-musl.so +0 -0
  1313. scipy/stats/_quantile.py +335 -0
  1314. scipy/stats/_rcont/__init__.py +4 -0
  1315. scipy/stats/_rcont/rcont.cpython-314-x86_64-linux-musl.so +0 -0
  1316. scipy/stats/_relative_risk.py +263 -0
  1317. scipy/stats/_resampling.py +2352 -0
  1318. scipy/stats/_result_classes.py +40 -0
  1319. scipy/stats/_sampling.py +1314 -0
  1320. scipy/stats/_sensitivity_analysis.py +713 -0
  1321. scipy/stats/_sobol.cpython-314-x86_64-linux-musl.so +0 -0
  1322. scipy/stats/_sobol.pyi +54 -0
  1323. scipy/stats/_sobol_direction_numbers.npz +0 -0
  1324. scipy/stats/_stats.cpython-314-x86_64-linux-musl.so +0 -0
  1325. scipy/stats/_stats.pxd +10 -0
  1326. scipy/stats/_stats_mstats_common.py +322 -0
  1327. scipy/stats/_stats_py.py +11089 -0
  1328. scipy/stats/_stats_pythran.cpython-314-x86_64-linux-musl.so +0 -0
  1329. scipy/stats/_survival.py +683 -0
  1330. scipy/stats/_tukeylambda_stats.py +199 -0
  1331. scipy/stats/_unuran/__init__.py +0 -0
  1332. scipy/stats/_unuran/unuran_wrapper.cpython-314-x86_64-linux-musl.so +0 -0
  1333. scipy/stats/_unuran/unuran_wrapper.pyi +179 -0
  1334. scipy/stats/_variation.py +126 -0
  1335. scipy/stats/_warnings_errors.py +38 -0
  1336. scipy/stats/_wilcoxon.py +265 -0
  1337. scipy/stats/biasedurn.py +16 -0
  1338. scipy/stats/contingency.py +521 -0
  1339. scipy/stats/distributions.py +24 -0
  1340. scipy/stats/kde.py +18 -0
  1341. scipy/stats/morestats.py +27 -0
  1342. scipy/stats/mstats.py +140 -0
  1343. scipy/stats/mstats_basic.py +42 -0
  1344. scipy/stats/mstats_extras.py +25 -0
  1345. scipy/stats/mvn.py +17 -0
  1346. scipy/stats/qmc.py +236 -0
  1347. scipy/stats/sampling.py +73 -0
  1348. scipy/stats/stats.py +41 -0
  1349. scipy/stats/tests/__init__.py +0 -0
  1350. scipy/stats/tests/common_tests.py +356 -0
  1351. scipy/stats/tests/data/_mvt.py +171 -0
  1352. scipy/stats/tests/data/fisher_exact_results_from_r.py +607 -0
  1353. scipy/stats/tests/data/jf_skew_t_gamlss_pdf_data.npy +0 -0
  1354. scipy/stats/tests/data/levy_stable/stable-Z1-cdf-sample-data.npy +0 -0
  1355. scipy/stats/tests/data/levy_stable/stable-Z1-pdf-sample-data.npy +0 -0
  1356. scipy/stats/tests/data/levy_stable/stable-loc-scale-sample-data.npy +0 -0
  1357. scipy/stats/tests/data/nist_anova/AtmWtAg.dat +108 -0
  1358. scipy/stats/tests/data/nist_anova/SiRstv.dat +85 -0
  1359. scipy/stats/tests/data/nist_anova/SmLs01.dat +249 -0
  1360. scipy/stats/tests/data/nist_anova/SmLs02.dat +1869 -0
  1361. scipy/stats/tests/data/nist_anova/SmLs03.dat +18069 -0
  1362. scipy/stats/tests/data/nist_anova/SmLs04.dat +249 -0
  1363. scipy/stats/tests/data/nist_anova/SmLs05.dat +1869 -0
  1364. scipy/stats/tests/data/nist_anova/SmLs06.dat +18069 -0
  1365. scipy/stats/tests/data/nist_anova/SmLs07.dat +249 -0
  1366. scipy/stats/tests/data/nist_anova/SmLs08.dat +1869 -0
  1367. scipy/stats/tests/data/nist_anova/SmLs09.dat +18069 -0
  1368. scipy/stats/tests/data/nist_linregress/Norris.dat +97 -0
  1369. scipy/stats/tests/data/rel_breitwigner_pdf_sample_data_ROOT.npy +0 -0
  1370. scipy/stats/tests/data/studentized_range_mpmath_ref.json +1499 -0
  1371. scipy/stats/tests/test_axis_nan_policy.py +1388 -0
  1372. scipy/stats/tests/test_binned_statistic.py +568 -0
  1373. scipy/stats/tests/test_censored_data.py +152 -0
  1374. scipy/stats/tests/test_contingency.py +294 -0
  1375. scipy/stats/tests/test_continued_fraction.py +173 -0
  1376. scipy/stats/tests/test_continuous.py +2198 -0
  1377. scipy/stats/tests/test_continuous_basic.py +1053 -0
  1378. scipy/stats/tests/test_continuous_fit_censored.py +683 -0
  1379. scipy/stats/tests/test_correlation.py +80 -0
  1380. scipy/stats/tests/test_crosstab.py +115 -0
  1381. scipy/stats/tests/test_discrete_basic.py +580 -0
  1382. scipy/stats/tests/test_discrete_distns.py +700 -0
  1383. scipy/stats/tests/test_distributions.py +10413 -0
  1384. scipy/stats/tests/test_entropy.py +322 -0
  1385. scipy/stats/tests/test_fast_gen_inversion.py +435 -0
  1386. scipy/stats/tests/test_fit.py +1090 -0
  1387. scipy/stats/tests/test_hypotests.py +1991 -0
  1388. scipy/stats/tests/test_kdeoth.py +676 -0
  1389. scipy/stats/tests/test_marray.py +289 -0
  1390. scipy/stats/tests/test_mgc.py +217 -0
  1391. scipy/stats/tests/test_morestats.py +3259 -0
  1392. scipy/stats/tests/test_mstats_basic.py +2071 -0
  1393. scipy/stats/tests/test_mstats_extras.py +172 -0
  1394. scipy/stats/tests/test_multicomp.py +405 -0
  1395. scipy/stats/tests/test_multivariate.py +4381 -0
  1396. scipy/stats/tests/test_odds_ratio.py +148 -0
  1397. scipy/stats/tests/test_qmc.py +1492 -0
  1398. scipy/stats/tests/test_quantile.py +199 -0
  1399. scipy/stats/tests/test_rank.py +345 -0
  1400. scipy/stats/tests/test_relative_risk.py +95 -0
  1401. scipy/stats/tests/test_resampling.py +2000 -0
  1402. scipy/stats/tests/test_sampling.py +1450 -0
  1403. scipy/stats/tests/test_sensitivity_analysis.py +310 -0
  1404. scipy/stats/tests/test_stats.py +9707 -0
  1405. scipy/stats/tests/test_survival.py +466 -0
  1406. scipy/stats/tests/test_tukeylambda_stats.py +85 -0
  1407. scipy/stats/tests/test_variation.py +216 -0
  1408. scipy/version.py +12 -0
  1409. scipy-1.16.1.dist-info/LICENSE.txt +934 -0
  1410. scipy-1.16.1.dist-info/METADATA +1083 -0
  1411. scipy-1.16.1.dist-info/RECORD +1420 -0
  1412. scipy-1.16.1.dist-info/WHEEL +5 -0
  1413. scipy.libs/libgcc_s-0cd532bd.so.1 +0 -0
  1414. scipy.libs/libgcc_s-a3a07607-e69b4851.so.1 +0 -0
  1415. scipy.libs/libgfortran-2c33b284.so.5.0.0 +0 -0
  1416. scipy.libs/libgfortran-e686bd2c-8cec572a.so.5.0.0 +0 -0
  1417. scipy.libs/libquadmath-9b5eedf9-101a4297.so.0.0.0 +0 -0
  1418. scipy.libs/libquadmath-bb76a5fc.so.0.0.0 +0 -0
  1419. scipy.libs/libscipy_openblas-e00df7a9.so +0 -0
  1420. scipy.libs/libstdc++-5d72f927.so.6.0.33 +0 -0
@@ -0,0 +1,2103 @@
1
+ import sys
2
+
3
+ import numpy as np
4
+ from numpy.testing import (assert_,
5
+ assert_allclose, assert_array_equal, assert_equal,
6
+ assert_array_almost_equal_nulp, suppress_warnings)
7
+ import pytest
8
+ from pytest import raises as assert_raises
9
+
10
+ from scipy import signal
11
+ from scipy._lib._array_api import xp_assert_close
12
+ from scipy.fft import fftfreq, rfftfreq, fft, irfft
13
+ from scipy.integrate import trapezoid
14
+ from scipy.signal import (periodogram, welch, lombscargle, coherence, csd,
15
+ spectrogram, check_COLA, check_NOLA)
16
+ from scipy.signal.windows import hann
17
+ from scipy.signal._spectral_py import _spectral_helper
18
+
19
+ # Compare ShortTimeFFT.stft() / ShortTimeFFT.istft() with stft() / istft():
20
+ from scipy.signal.tests._scipy_spectral_test_shim import stft_compare as stft
21
+ from scipy.signal.tests._scipy_spectral_test_shim import istft_compare as istft
22
+
23
+
24
+ class TestPeriodogram:
25
+ def test_real_onesided_even(self):
26
+ x = np.zeros(16)
27
+ x[0] = 1
28
+ f, p = periodogram(x)
29
+ assert_allclose(f, np.linspace(0, 0.5, 9))
30
+ q = np.ones(9)
31
+ q[0] = 0
32
+ q[-1] /= 2.0
33
+ q /= 8
34
+ assert_allclose(p, q)
35
+
36
+ def test_real_onesided_odd(self):
37
+ x = np.zeros(15)
38
+ x[0] = 1
39
+ f, p = periodogram(x)
40
+ assert_allclose(f, np.arange(8.0)/15.0)
41
+ q = np.ones(8)
42
+ q[0] = 0
43
+ q *= 2.0/15.0
44
+ assert_allclose(p, q, atol=1e-15)
45
+
46
+ def test_real_twosided(self):
47
+ x = np.zeros(16)
48
+ x[0] = 1
49
+ f, p = periodogram(x, return_onesided=False)
50
+ assert_allclose(f, fftfreq(16, 1.0))
51
+ q = np.full(16, 1/16.0)
52
+ q[0] = 0
53
+ assert_allclose(p, q)
54
+
55
+ def test_real_spectrum(self):
56
+ x = np.zeros(16)
57
+ x[0] = 1
58
+ f, p = periodogram(x, scaling='spectrum')
59
+ g, q = periodogram(x, scaling='density')
60
+ assert_allclose(f, np.linspace(0, 0.5, 9))
61
+ assert_allclose(p, q/16.0)
62
+
63
+ def test_integer_even(self):
64
+ x = np.zeros(16, dtype=int)
65
+ x[0] = 1
66
+ f, p = periodogram(x)
67
+ assert_allclose(f, np.linspace(0, 0.5, 9))
68
+ q = np.ones(9)
69
+ q[0] = 0
70
+ q[-1] /= 2.0
71
+ q /= 8
72
+ assert_allclose(p, q)
73
+
74
+ def test_integer_odd(self):
75
+ x = np.zeros(15, dtype=int)
76
+ x[0] = 1
77
+ f, p = periodogram(x)
78
+ assert_allclose(f, np.arange(8.0)/15.0)
79
+ q = np.ones(8)
80
+ q[0] = 0
81
+ q *= 2.0/15.0
82
+ assert_allclose(p, q, atol=1e-15)
83
+
84
+ def test_integer_twosided(self):
85
+ x = np.zeros(16, dtype=int)
86
+ x[0] = 1
87
+ f, p = periodogram(x, return_onesided=False)
88
+ assert_allclose(f, fftfreq(16, 1.0))
89
+ q = np.full(16, 1/16.0)
90
+ q[0] = 0
91
+ assert_allclose(p, q)
92
+
93
+ def test_complex(self):
94
+ x = np.zeros(16, np.complex128)
95
+ x[0] = 1.0 + 2.0j
96
+ f, p = periodogram(x, return_onesided=False)
97
+ assert_allclose(f, fftfreq(16, 1.0))
98
+ q = np.full(16, 5.0/16.0)
99
+ q[0] = 0
100
+ assert_allclose(p, q)
101
+
102
+ def test_unk_scaling(self):
103
+ assert_raises(ValueError, periodogram, np.zeros(4, np.complex128),
104
+ scaling='foo')
105
+
106
+ @pytest.mark.skipif(
107
+ sys.maxsize <= 2**32,
108
+ reason="On some 32-bit tolerance issue"
109
+ )
110
+ def test_nd_axis_m1(self):
111
+ x = np.zeros(20, dtype=np.float64)
112
+ x = x.reshape((2,1,10))
113
+ x[:,:,0] = 1.0
114
+ f, p = periodogram(x)
115
+ assert_array_equal(p.shape, (2, 1, 6))
116
+ assert_array_almost_equal_nulp(p[0,0,:], p[1,0,:], 60)
117
+ f0, p0 = periodogram(x[0,0,:])
118
+ assert_array_almost_equal_nulp(p0[np.newaxis,:], p[1,:], 60)
119
+
120
+ @pytest.mark.skipif(
121
+ sys.maxsize <= 2**32,
122
+ reason="On some 32-bit tolerance issue"
123
+ )
124
+ def test_nd_axis_0(self):
125
+ x = np.zeros(20, dtype=np.float64)
126
+ x = x.reshape((10,2,1))
127
+ x[0,:,:] = 1.0
128
+ f, p = periodogram(x, axis=0)
129
+ assert_array_equal(p.shape, (6,2,1))
130
+ assert_array_almost_equal_nulp(p[:,0,0], p[:,1,0], 60)
131
+ f0, p0 = periodogram(x[:,0,0])
132
+ assert_array_almost_equal_nulp(p0, p[:,1,0])
133
+
134
+ def test_window_external(self):
135
+ x = np.zeros(16)
136
+ x[0] = 1
137
+ f, p = periodogram(x, 10, 'hann')
138
+ win = signal.get_window('hann', 16)
139
+ fe, pe = periodogram(x, 10, win)
140
+ assert_array_almost_equal_nulp(p, pe)
141
+ assert_array_almost_equal_nulp(f, fe)
142
+ win_err = signal.get_window('hann', 32)
143
+ assert_raises(ValueError, periodogram, x,
144
+ 10, win_err) # win longer than signal
145
+
146
+ def test_padded_fft(self):
147
+ x = np.zeros(16)
148
+ x[0] = 1
149
+ f, p = periodogram(x)
150
+ fp, pp = periodogram(x, nfft=32)
151
+ assert_allclose(f, fp[::2])
152
+ assert_allclose(p, pp[::2])
153
+ assert_array_equal(pp.shape, (17,))
154
+
155
+ def test_empty_input(self):
156
+ f, p = periodogram([])
157
+ assert_array_equal(f.shape, (0,))
158
+ assert_array_equal(p.shape, (0,))
159
+ for shape in [(0,), (3,0), (0,5,2)]:
160
+ f, p = periodogram(np.empty(shape))
161
+ assert_array_equal(f.shape, shape)
162
+ assert_array_equal(p.shape, shape)
163
+
164
+ def test_empty_input_other_axis(self):
165
+ for shape in [(3,0), (0,5,2)]:
166
+ f, p = periodogram(np.empty(shape), axis=1)
167
+ assert_array_equal(f.shape, shape)
168
+ assert_array_equal(p.shape, shape)
169
+
170
+ def test_short_nfft(self):
171
+ x = np.zeros(18)
172
+ x[0] = 1
173
+ f, p = periodogram(x, nfft=16)
174
+ assert_allclose(f, np.linspace(0, 0.5, 9))
175
+ q = np.ones(9)
176
+ q[0] = 0
177
+ q[-1] /= 2.0
178
+ q /= 8
179
+ assert_allclose(p, q)
180
+
181
+ def test_nfft_is_xshape(self):
182
+ x = np.zeros(16)
183
+ x[0] = 1
184
+ f, p = periodogram(x, nfft=16)
185
+ assert_allclose(f, np.linspace(0, 0.5, 9))
186
+ q = np.ones(9)
187
+ q[0] = 0
188
+ q[-1] /= 2.0
189
+ q /= 8
190
+ assert_allclose(p, q)
191
+
192
+ def test_real_onesided_even_32(self):
193
+ x = np.zeros(16, 'f')
194
+ x[0] = 1
195
+ f, p = periodogram(x)
196
+ assert_allclose(f, np.linspace(0, 0.5, 9))
197
+ q = np.ones(9, 'f')
198
+ q[0] = 0
199
+ q[-1] /= 2.0
200
+ q /= 8
201
+ assert_allclose(p, q)
202
+ assert_(p.dtype == q.dtype)
203
+
204
+ def test_real_onesided_odd_32(self):
205
+ x = np.zeros(15, 'f')
206
+ x[0] = 1
207
+ f, p = periodogram(x)
208
+ assert_allclose(f, np.arange(8.0)/15.0)
209
+ q = np.ones(8, 'f')
210
+ q[0] = 0
211
+ q *= 2.0/15.0
212
+ assert_allclose(p, q, atol=1e-7)
213
+ assert_(p.dtype == q.dtype)
214
+
215
+ def test_real_twosided_32(self):
216
+ x = np.zeros(16, 'f')
217
+ x[0] = 1
218
+ f, p = periodogram(x, return_onesided=False)
219
+ assert_allclose(f, fftfreq(16, 1.0))
220
+ q = np.full(16, 1/16.0, 'f')
221
+ q[0] = 0
222
+ assert_allclose(p, q)
223
+ assert_(p.dtype == q.dtype)
224
+
225
+ def test_complex_32(self):
226
+ x = np.zeros(16, 'F')
227
+ x[0] = 1.0 + 2.0j
228
+ f, p = periodogram(x, return_onesided=False)
229
+ assert_allclose(f, fftfreq(16, 1.0))
230
+ q = np.full(16, 5.0/16.0, 'f')
231
+ q[0] = 0
232
+ assert_allclose(p, q)
233
+ assert_(p.dtype == q.dtype)
234
+
235
+ def test_shorter_window_error(self):
236
+ x = np.zeros(16)
237
+ x[0] = 1
238
+ win = signal.get_window('hann', 10)
239
+ expected_msg = ('the size of the window must be the same size '
240
+ 'of the input on the specified axis')
241
+ with assert_raises(ValueError, match=expected_msg):
242
+ periodogram(x, window=win)
243
+
244
+
245
+ class TestWelch:
246
+ def test_real_onesided_even(self):
247
+ x = np.zeros(16)
248
+ x[0] = 1
249
+ x[8] = 1
250
+ f, p = welch(x, nperseg=8)
251
+ assert_allclose(f, np.linspace(0, 0.5, 5))
252
+ q = np.array([0.08333333, 0.15277778, 0.22222222, 0.22222222,
253
+ 0.11111111])
254
+ assert_allclose(p, q, atol=1e-7, rtol=1e-7)
255
+
256
+ def test_real_onesided_odd(self):
257
+ x = np.zeros(16)
258
+ x[0] = 1
259
+ x[8] = 1
260
+ f, p = welch(x, nperseg=9)
261
+ assert_allclose(f, np.arange(5.0)/9.0)
262
+ q = np.array([0.12477455, 0.23430933, 0.17072113, 0.17072113,
263
+ 0.17072113])
264
+ assert_allclose(p, q, atol=1e-7, rtol=1e-7)
265
+
266
+ def test_real_twosided(self):
267
+ x = np.zeros(16)
268
+ x[0] = 1
269
+ x[8] = 1
270
+ f, p = welch(x, nperseg=8, return_onesided=False)
271
+ assert_allclose(f, fftfreq(8, 1.0))
272
+ q = np.array([0.08333333, 0.07638889, 0.11111111, 0.11111111,
273
+ 0.11111111, 0.11111111, 0.11111111, 0.07638889])
274
+ assert_allclose(p, q, atol=1e-7, rtol=1e-7)
275
+
276
+ def test_real_spectrum(self):
277
+ x = np.zeros(16)
278
+ x[0] = 1
279
+ x[8] = 1
280
+ f, p = welch(x, nperseg=8, scaling='spectrum')
281
+ assert_allclose(f, np.linspace(0, 0.5, 5))
282
+ q = np.array([0.015625, 0.02864583, 0.04166667, 0.04166667,
283
+ 0.02083333])
284
+ assert_allclose(p, q, atol=1e-7, rtol=1e-7)
285
+
286
+ def test_integer_onesided_even(self):
287
+ x = np.zeros(16, dtype=int)
288
+ x[0] = 1
289
+ x[8] = 1
290
+ f, p = welch(x, nperseg=8)
291
+ assert_allclose(f, np.linspace(0, 0.5, 5))
292
+ q = np.array([0.08333333, 0.15277778, 0.22222222, 0.22222222,
293
+ 0.11111111])
294
+ assert_allclose(p, q, atol=1e-7, rtol=1e-7)
295
+
296
+ def test_integer_onesided_odd(self):
297
+ x = np.zeros(16, dtype=int)
298
+ x[0] = 1
299
+ x[8] = 1
300
+ f, p = welch(x, nperseg=9)
301
+ assert_allclose(f, np.arange(5.0)/9.0)
302
+ q = np.array([0.12477455, 0.23430933, 0.17072113, 0.17072113,
303
+ 0.17072113])
304
+ assert_allclose(p, q, atol=1e-7, rtol=1e-7)
305
+
306
+ def test_integer_twosided(self):
307
+ x = np.zeros(16, dtype=int)
308
+ x[0] = 1
309
+ x[8] = 1
310
+ f, p = welch(x, nperseg=8, return_onesided=False)
311
+ assert_allclose(f, fftfreq(8, 1.0))
312
+ q = np.array([0.08333333, 0.07638889, 0.11111111, 0.11111111,
313
+ 0.11111111, 0.11111111, 0.11111111, 0.07638889])
314
+ assert_allclose(p, q, atol=1e-7, rtol=1e-7)
315
+
316
+ def test_complex(self):
317
+ x = np.zeros(16, np.complex128)
318
+ x[0] = 1.0 + 2.0j
319
+ x[8] = 1.0 + 2.0j
320
+ f, p = welch(x, nperseg=8, return_onesided=False)
321
+ assert_allclose(f, fftfreq(8, 1.0))
322
+ q = np.array([0.41666667, 0.38194444, 0.55555556, 0.55555556,
323
+ 0.55555556, 0.55555556, 0.55555556, 0.38194444])
324
+ assert_allclose(p, q, atol=1e-7, rtol=1e-7)
325
+
326
+ def test_unk_scaling(self):
327
+ assert_raises(ValueError, welch, np.zeros(4, np.complex128),
328
+ scaling='foo', nperseg=4)
329
+
330
+ def test_detrend_linear(self):
331
+ x = np.arange(10, dtype=np.float64) + 0.04
332
+ f, p = welch(x, nperseg=10, detrend='linear')
333
+ assert_allclose(p, np.zeros_like(p), atol=1e-15)
334
+
335
+ def test_no_detrending(self):
336
+ x = np.arange(10, dtype=np.float64) + 0.04
337
+ f1, p1 = welch(x, nperseg=10, detrend=False)
338
+ f2, p2 = welch(x, nperseg=10, detrend=lambda x: x)
339
+ assert_allclose(f1, f2, atol=1e-15)
340
+ assert_allclose(p1, p2, atol=1e-15)
341
+
342
+ def test_detrend_external(self):
343
+ x = np.arange(10, dtype=np.float64) + 0.04
344
+ f, p = welch(x, nperseg=10,
345
+ detrend=lambda seg: signal.detrend(seg, type='l'))
346
+ assert_allclose(p, np.zeros_like(p), atol=1e-15)
347
+
348
+ def test_detrend_external_nd_m1(self):
349
+ x = np.arange(40, dtype=np.float64) + 0.04
350
+ x = x.reshape((2,2,10))
351
+ f, p = welch(x, nperseg=10,
352
+ detrend=lambda seg: signal.detrend(seg, type='l'))
353
+ assert_allclose(p, np.zeros_like(p), atol=1e-15)
354
+
355
+ def test_detrend_external_nd_0(self):
356
+ x = np.arange(20, dtype=np.float64) + 0.04
357
+ x = x.reshape((2,1,10))
358
+ x = np.moveaxis(x, 2, 0)
359
+ f, p = welch(x, nperseg=10, axis=0,
360
+ detrend=lambda seg: signal.detrend(seg, axis=0, type='l'))
361
+ assert_allclose(p, np.zeros_like(p), atol=1e-15)
362
+
363
+ def test_nd_axis_m1(self):
364
+ x = np.arange(20, dtype=np.float64) + 0.04
365
+ x = x.reshape((2,1,10))
366
+ f, p = welch(x, nperseg=10)
367
+ assert_array_equal(p.shape, (2, 1, 6))
368
+ assert_allclose(p[0,0,:], p[1,0,:], atol=1e-13, rtol=1e-13)
369
+ f0, p0 = welch(x[0,0,:], nperseg=10)
370
+ assert_allclose(p0[np.newaxis,:], p[1,:], atol=1e-13, rtol=1e-13)
371
+
372
+ def test_nd_axis_0(self):
373
+ x = np.arange(20, dtype=np.float64) + 0.04
374
+ x = x.reshape((10,2,1))
375
+ f, p = welch(x, nperseg=10, axis=0)
376
+ assert_array_equal(p.shape, (6,2,1))
377
+ assert_allclose(p[:,0,0], p[:,1,0], atol=1e-13, rtol=1e-13)
378
+ f0, p0 = welch(x[:,0,0], nperseg=10)
379
+ assert_allclose(p0, p[:,1,0], atol=1e-13, rtol=1e-13)
380
+
381
+ def test_window_external(self):
382
+ x = np.zeros(16)
383
+ x[0] = 1
384
+ x[8] = 1
385
+ f, p = welch(x, 10, 'hann', nperseg=8)
386
+ win = signal.get_window('hann', 8)
387
+ fe, pe = welch(x, 10, win, nperseg=None)
388
+ assert_array_almost_equal_nulp(p, pe)
389
+ assert_array_almost_equal_nulp(f, fe)
390
+ assert_array_equal(fe.shape, (5,)) # because win length used as nperseg
391
+ assert_array_equal(pe.shape, (5,))
392
+ assert_raises(ValueError, welch, x,
393
+ 10, win, nperseg=4) # because nperseg != win.shape[-1]
394
+ win_err = signal.get_window('hann', 32)
395
+ assert_raises(ValueError, welch, x,
396
+ 10, win_err, nperseg=None) # win longer than signal
397
+
398
+ def test_empty_input(self):
399
+ f, p = welch([])
400
+ assert_array_equal(f.shape, (0,))
401
+ assert_array_equal(p.shape, (0,))
402
+ for shape in [(0,), (3,0), (0,5,2)]:
403
+ f, p = welch(np.empty(shape))
404
+ assert_array_equal(f.shape, shape)
405
+ assert_array_equal(p.shape, shape)
406
+
407
+ def test_empty_input_other_axis(self):
408
+ for shape in [(3,0), (0,5,2)]:
409
+ f, p = welch(np.empty(shape), axis=1)
410
+ assert_array_equal(f.shape, shape)
411
+ assert_array_equal(p.shape, shape)
412
+
413
+ def test_short_data(self):
414
+ x = np.zeros(8)
415
+ x[0] = 1
416
+ #for string-like window, input signal length < nperseg value gives
417
+ #UserWarning, sets nperseg to x.shape[-1]
418
+ with suppress_warnings() as sup:
419
+ sup.filter(UserWarning, "nperseg=256 is greater than signal.*")
420
+ f, p = welch(x,window='hann') # default nperseg
421
+ f1, p1 = welch(x,window='hann', nperseg=256) # user-specified nperseg
422
+ f2, p2 = welch(x, nperseg=8) # valid nperseg, doesn't give warning
423
+ assert_allclose(f, f2)
424
+ assert_allclose(p, p2)
425
+ assert_allclose(f1, f2)
426
+ assert_allclose(p1, p2)
427
+
428
+ def test_window_long_or_nd(self):
429
+ assert_raises(ValueError, welch, np.zeros(4), 1, np.array([1,1,1,1,1]))
430
+ assert_raises(ValueError, welch, np.zeros(4), 1,
431
+ np.arange(6).reshape((2,3)))
432
+
433
+ def test_nondefault_noverlap(self):
434
+ x = np.zeros(64)
435
+ x[::8] = 1
436
+ f, p = welch(x, nperseg=16, noverlap=4)
437
+ q = np.array([0, 1./12., 1./3., 1./5., 1./3., 1./5., 1./3., 1./5.,
438
+ 1./6.])
439
+ assert_allclose(p, q, atol=1e-12)
440
+
441
+ def test_bad_noverlap(self):
442
+ assert_raises(ValueError, welch, np.zeros(4), 1, 'hann', 2, 7)
443
+
444
+ def test_nfft_too_short(self):
445
+ assert_raises(ValueError, welch, np.ones(12), nfft=3, nperseg=4)
446
+
447
+ def test_real_onesided_even_32(self):
448
+ x = np.zeros(16, 'f')
449
+ x[0] = 1
450
+ x[8] = 1
451
+ f, p = welch(x, nperseg=8)
452
+ assert_allclose(f, np.linspace(0, 0.5, 5))
453
+ q = np.array([0.08333333, 0.15277778, 0.22222222, 0.22222222,
454
+ 0.11111111], 'f')
455
+ assert_allclose(p, q, atol=1e-7, rtol=1e-7)
456
+ assert_(p.dtype == q.dtype)
457
+
458
+ def test_real_onesided_odd_32(self):
459
+ x = np.zeros(16, 'f')
460
+ x[0] = 1
461
+ x[8] = 1
462
+ f, p = welch(x, nperseg=9)
463
+ assert_allclose(f, np.arange(5.0)/9.0)
464
+ q = np.array([0.12477458, 0.23430935, 0.17072113, 0.17072116,
465
+ 0.17072113], 'f')
466
+ assert_allclose(p, q, atol=1e-7, rtol=1e-7)
467
+ assert_(p.dtype == q.dtype)
468
+
469
+ def test_real_twosided_32(self):
470
+ x = np.zeros(16, 'f')
471
+ x[0] = 1
472
+ x[8] = 1
473
+ f, p = welch(x, nperseg=8, return_onesided=False)
474
+ assert_allclose(f, fftfreq(8, 1.0))
475
+ q = np.array([0.08333333, 0.07638889, 0.11111111,
476
+ 0.11111111, 0.11111111, 0.11111111, 0.11111111,
477
+ 0.07638889], 'f')
478
+ assert_allclose(p, q, atol=1e-7, rtol=1e-7)
479
+ assert_(p.dtype == q.dtype)
480
+
481
+ def test_complex_32(self):
482
+ x = np.zeros(16, 'F')
483
+ x[0] = 1.0 + 2.0j
484
+ x[8] = 1.0 + 2.0j
485
+ f, p = welch(x, nperseg=8, return_onesided=False)
486
+ assert_allclose(f, fftfreq(8, 1.0))
487
+ q = np.array([0.41666666, 0.38194442, 0.55555552, 0.55555552,
488
+ 0.55555558, 0.55555552, 0.55555552, 0.38194442], 'f')
489
+ assert_allclose(p, q, atol=1e-7, rtol=1e-7)
490
+ assert_(p.dtype == q.dtype,
491
+ f'dtype mismatch, {p.dtype}, {q.dtype}')
492
+
493
+ def test_padded_freqs(self):
494
+ x = np.zeros(12)
495
+
496
+ nfft = 24
497
+ f = fftfreq(nfft, 1.0)[:nfft//2+1]
498
+ f[-1] *= -1
499
+ fodd, _ = welch(x, nperseg=5, nfft=nfft)
500
+ feven, _ = welch(x, nperseg=6, nfft=nfft)
501
+ assert_allclose(f, fodd)
502
+ assert_allclose(f, feven)
503
+
504
+ nfft = 25
505
+ f = fftfreq(nfft, 1.0)[:(nfft + 1)//2]
506
+ fodd, _ = welch(x, nperseg=5, nfft=nfft)
507
+ feven, _ = welch(x, nperseg=6, nfft=nfft)
508
+ assert_allclose(f, fodd)
509
+ assert_allclose(f, feven)
510
+
511
+ def test_window_correction(self):
512
+ A = 20
513
+ fs = 1e4
514
+ nperseg = int(fs//10)
515
+ fsig = 300
516
+ ii = int(fsig*nperseg//fs) # Freq index of fsig
517
+
518
+ tt = np.arange(fs)/fs
519
+ x = A*np.sin(2*np.pi*fsig*tt)
520
+
521
+ for window in ['hann', 'bartlett', ('tukey', 0.1), 'flattop']:
522
+ _, p_spec = welch(x, fs=fs, nperseg=nperseg, window=window,
523
+ scaling='spectrum')
524
+ freq, p_dens = welch(x, fs=fs, nperseg=nperseg, window=window,
525
+ scaling='density')
526
+
527
+ # Check peak height at signal frequency for 'spectrum'
528
+ assert_allclose(p_spec[ii], A**2/2.0)
529
+ # Check integrated spectrum RMS for 'density'
530
+ assert_allclose(np.sqrt(trapezoid(p_dens, freq)), A*np.sqrt(2)/2,
531
+ rtol=1e-3)
532
+
533
+ def test_axis_rolling(self):
534
+ np.random.seed(1234)
535
+
536
+ x_flat = np.random.randn(1024)
537
+ _, p_flat = welch(x_flat)
538
+
539
+ for a in range(3):
540
+ newshape = [1,]*3
541
+ newshape[a] = -1
542
+ x = x_flat.reshape(newshape)
543
+
544
+ _, p_plus = welch(x, axis=a) # Positive axis index
545
+ _, p_minus = welch(x, axis=a-x.ndim) # Negative axis index
546
+
547
+ assert_equal(p_flat, p_plus.squeeze(), err_msg=a)
548
+ assert_equal(p_flat, p_minus.squeeze(), err_msg=a-x.ndim)
549
+
550
+ def test_average(self):
551
+ x = np.zeros(16)
552
+ x[0] = 1
553
+ x[8] = 1
554
+ f, p = welch(x, nperseg=8, average='median')
555
+ assert_allclose(f, np.linspace(0, 0.5, 5))
556
+ q = np.array([.1, .05, 0., 1.54074396e-33, 0.])
557
+ assert_allclose(p, q, atol=1e-7, rtol=1e-7)
558
+
559
+ assert_raises(ValueError, welch, x, nperseg=8,
560
+ average='unrecognised-average')
561
+
562
+ def test_ratio_scale_to(self):
563
+ """Verify the factor of ``sum(abs(window)**2)*fs / abs(sum(window))**2``
564
+ used in the `welch` and `csd` docstrs. """
565
+ x, win, fs = np.array([1., 0, 0, 0]), np.ones(4), 12
566
+ params = dict(fs=fs, window=win, return_onesided=False, detrend=None)
567
+ p_dens = welch(x, scaling='density', **params)[1]
568
+ p_spec = welch(x, scaling='spectrum', **params)[1]
569
+ p_fac = sum(win**2)*fs / abs(sum(win))**2
570
+ assert_allclose(p_spec / p_dens, p_fac)
571
+
572
+ class TestCSD:
573
+ def test_pad_shorter_x(self):
574
+ x = np.zeros(8)
575
+ y = np.zeros(12)
576
+
577
+ f = np.linspace(0, 0.5, 7)
578
+ c = np.zeros(7,dtype=np.complex128)
579
+ f1, c1 = csd(x, y, nperseg=12)
580
+
581
+ assert_allclose(f, f1)
582
+ assert_allclose(c, c1)
583
+
584
+ def test_pad_shorter_y(self):
585
+ x = np.zeros(12)
586
+ y = np.zeros(8)
587
+
588
+ f = np.linspace(0, 0.5, 7)
589
+ c = np.zeros(7,dtype=np.complex128)
590
+ f1, c1 = csd(x, y, nperseg=12)
591
+
592
+ assert_allclose(f, f1)
593
+ assert_allclose(c, c1)
594
+
595
+ def test_unequal_length_input_1D(self):
596
+ """Test zero-padding for input `x.shape[axis] != y.shape[axis]` for 1d arrays.
597
+
598
+ This test ensures that issue 23036 is fixed.
599
+ """
600
+ x = np.tile([4, 0, -4, 0], 4)
601
+
602
+ kw = dict(fs=len(x), window='boxcar', nperseg=4)
603
+ X0 = signal.csd(x, np.copy(x), **kw)[1] # `x is x` must be False
604
+ X1 = signal.csd(x, x[:8], **kw)[1]
605
+ X2 = signal.csd(x[:8], x, **kw)[1]
606
+ xp_assert_close(X1, X0 / 2)
607
+ xp_assert_close(X2, X0 / 2)
608
+
609
+ def test_unequal_length_input_3D(self):
610
+ """Test zero-padding for input `x.shape[axis] != y.shape[axis]` for 3d arrays.
611
+
612
+ This test ensures that issue 23036 is fixed.
613
+ """
614
+ n = 8
615
+ x = np.zeros(2 * 3 * n).reshape(2, n, 3)
616
+ x[:, 0, :] = n
617
+
618
+ kw = dict(fs=n, window='boxcar', nperseg=n, detrend=None, axis=1)
619
+ X0 = signal.csd(x, x.copy(), **kw)[1] # `x is x` must be False
620
+ X1 = signal.csd(x, x[:, :2, :], **kw)[1]
621
+ X2 = signal.csd(x[:, :2, :], x, **kw)[1]
622
+ xp_assert_close(X1, X0)
623
+ xp_assert_close(X2, X0)
624
+
625
+ def test_real_onesided_even(self):
626
+ x = np.zeros(16)
627
+ x[0] = 1
628
+ x[8] = 1
629
+ f, p = csd(x, x, nperseg=8)
630
+ assert_allclose(f, np.linspace(0, 0.5, 5))
631
+ q = np.array([0.08333333, 0.15277778, 0.22222222, 0.22222222,
632
+ 0.11111111])
633
+ assert_allclose(p, q, atol=1e-7, rtol=1e-7)
634
+
635
+ def test_real_onesided_odd(self):
636
+ x = np.zeros(16)
637
+ x[0] = 1
638
+ x[8] = 1
639
+ f, p = csd(x, x, nperseg=9)
640
+ assert_allclose(f, np.arange(5.0)/9.0)
641
+ q = np.array([0.12477455, 0.23430933, 0.17072113, 0.17072113,
642
+ 0.17072113])
643
+ assert_allclose(p, q, atol=1e-7, rtol=1e-7)
644
+
645
+ def test_real_twosided(self):
646
+ x = np.zeros(16)
647
+ x[0] = 1
648
+ x[8] = 1
649
+ f, p = csd(x, x, nperseg=8, return_onesided=False)
650
+ assert_allclose(f, fftfreq(8, 1.0))
651
+ q = np.array([0.08333333, 0.07638889, 0.11111111, 0.11111111,
652
+ 0.11111111, 0.11111111, 0.11111111, 0.07638889])
653
+ assert_allclose(p, q, atol=1e-7, rtol=1e-7)
654
+
655
+ def test_real_spectrum(self):
656
+ x = np.zeros(16)
657
+ x[0] = 1
658
+ x[8] = 1
659
+ f, p = csd(x, x, nperseg=8, scaling='spectrum')
660
+ assert_allclose(f, np.linspace(0, 0.5, 5))
661
+ q = np.array([0.015625, 0.02864583, 0.04166667, 0.04166667,
662
+ 0.02083333])
663
+ assert_allclose(p, q, atol=1e-7, rtol=1e-7)
664
+
665
+ def test_integer_onesided_even(self):
666
+ x = np.zeros(16, dtype=int)
667
+ x[0] = 1
668
+ x[8] = 1
669
+ f, p = csd(x, x, nperseg=8)
670
+ assert_allclose(f, np.linspace(0, 0.5, 5))
671
+ q = np.array([0.08333333, 0.15277778, 0.22222222, 0.22222222,
672
+ 0.11111111])
673
+ assert_allclose(p, q, atol=1e-7, rtol=1e-7)
674
+
675
+ def test_integer_onesided_odd(self):
676
+ x = np.zeros(16, dtype=int)
677
+ x[0] = 1
678
+ x[8] = 1
679
+ f, p = csd(x, x, nperseg=9)
680
+ assert_allclose(f, np.arange(5.0)/9.0)
681
+ q = np.array([0.12477455, 0.23430933, 0.17072113, 0.17072113,
682
+ 0.17072113])
683
+ assert_allclose(p, q, atol=1e-7, rtol=1e-7)
684
+
685
+ def test_integer_twosided(self):
686
+ x = np.zeros(16, dtype=int)
687
+ x[0] = 1
688
+ x[8] = 1
689
+ f, p = csd(x, x, nperseg=8, return_onesided=False)
690
+ assert_allclose(f, fftfreq(8, 1.0))
691
+ q = np.array([0.08333333, 0.07638889, 0.11111111, 0.11111111,
692
+ 0.11111111, 0.11111111, 0.11111111, 0.07638889])
693
+ assert_allclose(p, q, atol=1e-7, rtol=1e-7)
694
+
695
+ def test_complex(self):
696
+ x = np.zeros(16, np.complex128)
697
+ x[0] = 1.0 + 2.0j
698
+ x[8] = 1.0 + 2.0j
699
+ f, p = csd(x, x, nperseg=8, return_onesided=False)
700
+ assert_allclose(f, fftfreq(8, 1.0))
701
+ q = np.array([0.41666667, 0.38194444, 0.55555556, 0.55555556,
702
+ 0.55555556, 0.55555556, 0.55555556, 0.38194444])
703
+ assert_allclose(p, q, atol=1e-7, rtol=1e-7)
704
+
705
+ def test_unk_scaling(self):
706
+ assert_raises(ValueError, csd, np.zeros(4, np.complex128),
707
+ np.ones(4, np.complex128), scaling='foo', nperseg=4)
708
+
709
+ def test_detrend_linear(self):
710
+ x = np.arange(10, dtype=np.float64) + 0.04
711
+ f, p = csd(x, x, nperseg=10, detrend='linear')
712
+ assert_allclose(p, np.zeros_like(p), atol=1e-15)
713
+
714
+ def test_no_detrending(self):
715
+ x = np.arange(10, dtype=np.float64) + 0.04
716
+ f1, p1 = csd(x, x, nperseg=10, detrend=False)
717
+ f2, p2 = csd(x, x, nperseg=10, detrend=lambda x: x)
718
+ assert_allclose(f1, f2, atol=1e-15)
719
+ assert_allclose(p1, p2, atol=1e-15)
720
+
721
+ def test_detrend_external(self):
722
+ x = np.arange(10, dtype=np.float64) + 0.04
723
+ f, p = csd(x, x, nperseg=10,
724
+ detrend=lambda seg: signal.detrend(seg, type='l'))
725
+ assert_allclose(p, np.zeros_like(p), atol=1e-15)
726
+
727
+ def test_detrend_external_nd_m1(self):
728
+ x = np.arange(40, dtype=np.float64) + 0.04
729
+ x = x.reshape((2,2,10))
730
+ f, p = csd(x, x, nperseg=10,
731
+ detrend=lambda seg: signal.detrend(seg, type='l'))
732
+ assert_allclose(p, np.zeros_like(p), atol=1e-15)
733
+
734
+ def test_detrend_external_nd_0(self):
735
+ x = np.arange(20, dtype=np.float64) + 0.04
736
+ x = x.reshape((2,1,10))
737
+ x = np.moveaxis(x, 2, 0)
738
+ f, p = csd(x, x, nperseg=10, axis=0,
739
+ detrend=lambda seg: signal.detrend(seg, axis=0, type='l'))
740
+ assert_allclose(p, np.zeros_like(p), atol=1e-15)
741
+
742
+ def test_nd_axis_m1(self):
743
+ x = np.arange(20, dtype=np.float64) + 0.04
744
+ x = x.reshape((2,1,10))
745
+ f, p = csd(x, x, nperseg=10)
746
+ assert_array_equal(p.shape, (2, 1, 6))
747
+ assert_allclose(p[0,0,:], p[1,0,:], atol=1e-13, rtol=1e-13)
748
+ f0, p0 = csd(x[0,0,:], x[0,0,:], nperseg=10)
749
+ assert_allclose(p0[np.newaxis,:], p[1,:], atol=1e-13, rtol=1e-13)
750
+
751
+ def test_nd_axis_0(self):
752
+ x = np.arange(20, dtype=np.float64) + 0.04
753
+ x = x.reshape((10,2,1))
754
+ f, p = csd(x, x, nperseg=10, axis=0)
755
+ assert_array_equal(p.shape, (6,2,1))
756
+ assert_allclose(p[:,0,0], p[:,1,0], atol=1e-13, rtol=1e-13)
757
+ f0, p0 = csd(x[:,0,0], x[:,0,0], nperseg=10)
758
+ assert_allclose(p0, p[:,1,0], atol=1e-13, rtol=1e-13)
759
+
760
+ def test_window_external(self):
761
+ x = np.zeros(16)
762
+ x[0] = 1
763
+ x[8] = 1
764
+ f, p = csd(x, x, 10, 'hann', 8)
765
+ win = signal.get_window('hann', 8)
766
+ fe, pe = csd(x, x, 10, win, nperseg=None)
767
+ assert_array_almost_equal_nulp(p, pe)
768
+ assert_array_almost_equal_nulp(f, fe)
769
+ assert_array_equal(fe.shape, (5,)) # because win length used as nperseg
770
+ assert_array_equal(pe.shape, (5,))
771
+ assert_raises(ValueError, csd, x, x,
772
+ 10, win, nperseg=256) # because nperseg != win.shape[-1]
773
+ win_err = signal.get_window('hann', 32)
774
+ assert_raises(ValueError, csd, x, x,
775
+ 10, win_err, nperseg=None) # because win longer than signal
776
+ with pytest.raises(ValueError, match="Parameter nperseg=0.*"):
777
+ csd(x, x, 0, nperseg=0)
778
+
779
+ def test_empty_input(self):
780
+ f, p = csd([],np.zeros(10))
781
+ assert_array_equal(f.shape, (0,))
782
+ assert_array_equal(p.shape, (0,))
783
+
784
+ f, p = csd(np.zeros(10),[])
785
+ assert_array_equal(f.shape, (0,))
786
+ assert_array_equal(p.shape, (0,))
787
+
788
+ for shape in [(0,), (3,0), (0,5,2)]:
789
+ f, p = csd(np.empty(shape), np.empty(shape))
790
+ assert_array_equal(f.shape, shape)
791
+ assert_array_equal(p.shape, shape)
792
+
793
+ f, p = csd(np.ones(10), np.empty((5,0)))
794
+ assert_array_equal(f.shape, (5,0))
795
+ assert_array_equal(p.shape, (5,0))
796
+
797
+ f, p = csd(np.empty((5,0)), np.ones(10))
798
+ assert_array_equal(f.shape, (5,0))
799
+ assert_array_equal(p.shape, (5,0))
800
+
801
+ def test_empty_input_other_axis(self):
802
+ for shape in [(3,0), (0,5,2)]:
803
+ f, p = csd(np.empty(shape), np.empty(shape), axis=1)
804
+ assert_array_equal(f.shape, shape)
805
+ assert_array_equal(p.shape, shape)
806
+
807
+ f, p = csd(np.empty((10,10,3)), np.zeros((10,0,1)), axis=1)
808
+ assert_array_equal(f.shape, (10,0,3))
809
+ assert_array_equal(p.shape, (10,0,3))
810
+
811
+ f, p = csd(np.empty((10,0,1)), np.zeros((10,10,3)), axis=1)
812
+ assert_array_equal(f.shape, (10,0,3))
813
+ assert_array_equal(p.shape, (10,0,3))
814
+
815
+ def test_short_data(self):
816
+ x = np.zeros(8)
817
+ x[0] = 1
818
+
819
+ #for string-like window, input signal length < nperseg value gives
820
+ #UserWarning, sets nperseg to x.shape[-1]
821
+ with suppress_warnings() as sup:
822
+ sup.filter(UserWarning, "nperseg=256 is greater than signal length.*")
823
+ f, p = csd(x, x, window='hann') # default nperseg
824
+ f1, p1 = csd(x, x, window='hann', nperseg=256) # user-specified nperseg
825
+ f2, p2 = csd(x, x, nperseg=8) # valid nperseg, doesn't give warning
826
+ assert_allclose(f, f2)
827
+ assert_allclose(p, p2)
828
+ assert_allclose(f1, f2)
829
+ assert_allclose(p1, p2)
830
+
831
+ def test_window_long_or_nd(self):
832
+ assert_raises(ValueError, csd, np.zeros(4), np.ones(4), 1,
833
+ np.array([1,1,1,1,1]))
834
+ assert_raises(ValueError, csd, np.zeros(4), np.ones(4), 1,
835
+ np.arange(6).reshape((2,3)))
836
+
837
+ def test_nondefault_noverlap(self):
838
+ x = np.zeros(64)
839
+ x[::8] = 1
840
+ f, p = csd(x, x, nperseg=16, noverlap=4)
841
+ q = np.array([0, 1./12., 1./3., 1./5., 1./3., 1./5., 1./3., 1./5.,
842
+ 1./6.])
843
+ assert_allclose(p, q, atol=1e-12)
844
+
845
+ def test_bad_noverlap(self):
846
+ assert_raises(ValueError, csd, np.zeros(4), np.ones(4), 1, 'hann',
847
+ 2, 7)
848
+
849
+ def test_nfft_too_short(self):
850
+ assert_raises(ValueError, csd, np.ones(12), np.zeros(12), nfft=3,
851
+ nperseg=4)
852
+
853
+ def test_incompatible_inputs(self):
854
+ with pytest.raises(ValueError, match='x and y cannot be broadcast.*'):
855
+ csd(np.ones((1, 8, 1)), np.ones((2, 8)), nperseg=4)
856
+
857
+
858
+ def test_real_onesided_even_32(self):
859
+ x = np.zeros(16, 'f')
860
+ x[0] = 1
861
+ x[8] = 1
862
+ f, p = csd(x, x, nperseg=8)
863
+ assert_allclose(f, np.linspace(0, 0.5, 5))
864
+ q = np.array([0.08333333, 0.15277778, 0.22222222, 0.22222222,
865
+ 0.11111111], 'f')
866
+ assert_allclose(p, q, atol=1e-7, rtol=1e-7)
867
+ assert_(p.dtype == q.dtype)
868
+
869
+ def test_real_onesided_odd_32(self):
870
+ x = np.zeros(16, 'f')
871
+ x[0] = 1
872
+ x[8] = 1
873
+ f, p = csd(x, x, nperseg=9)
874
+ assert_allclose(f, np.arange(5.0)/9.0)
875
+ q = np.array([0.12477458, 0.23430935, 0.17072113, 0.17072116,
876
+ 0.17072113], 'f')
877
+ assert_allclose(p, q, atol=1e-7, rtol=1e-7)
878
+ assert_(p.dtype == q.dtype)
879
+
880
+ def test_real_twosided_32(self):
881
+ x = np.zeros(16, 'f')
882
+ x[0] = 1
883
+ x[8] = 1
884
+ f, p = csd(x, x, nperseg=8, return_onesided=False)
885
+ assert_allclose(f, fftfreq(8, 1.0))
886
+ q = np.array([0.08333333, 0.07638889, 0.11111111,
887
+ 0.11111111, 0.11111111, 0.11111111, 0.11111111,
888
+ 0.07638889], 'f')
889
+ assert_allclose(p, q, atol=1e-7, rtol=1e-7)
890
+ assert_(p.dtype == q.dtype)
891
+
892
+ def test_complex_32(self):
893
+ x = np.zeros(16, 'F')
894
+ x[0] = 1.0 + 2.0j
895
+ x[8] = 1.0 + 2.0j
896
+ f, p = csd(x, x, nperseg=8, return_onesided=False)
897
+ assert_allclose(f, fftfreq(8, 1.0))
898
+ q = np.array([0.41666666, 0.38194442, 0.55555552, 0.55555552,
899
+ 0.55555558, 0.55555552, 0.55555552, 0.38194442], 'f')
900
+ assert_allclose(p, q, atol=1e-7, rtol=1e-7)
901
+ assert_(p.dtype == q.dtype,
902
+ f'dtype mismatch, {p.dtype}, {q.dtype}')
903
+
904
+ def test_padded_freqs(self):
905
+ x = np.zeros(12)
906
+ y = np.ones(12)
907
+
908
+ nfft = 24
909
+ f = fftfreq(nfft, 1.0)[:nfft//2+1]
910
+ f[-1] *= -1
911
+ fodd, _ = csd(x, y, nperseg=5, nfft=nfft)
912
+ feven, _ = csd(x, y, nperseg=6, nfft=nfft)
913
+ assert_allclose(f, fodd)
914
+ assert_allclose(f, feven)
915
+
916
+ nfft = 25
917
+ f = fftfreq(nfft, 1.0)[:(nfft + 1)//2]
918
+ fodd, _ = csd(x, y, nperseg=5, nfft=nfft)
919
+ feven, _ = csd(x, y, nperseg=6, nfft=nfft)
920
+ assert_allclose(f, fodd)
921
+ assert_allclose(f, feven)
922
+
923
+ def test_copied_data(self):
924
+ x = np.random.randn(64)
925
+ y = x.copy()
926
+
927
+ _, p_same = csd(x, x, nperseg=8, average='mean',
928
+ return_onesided=False)
929
+ _, p_copied = csd(x, y, nperseg=8, average='mean',
930
+ return_onesided=False)
931
+ assert_allclose(p_same, p_copied)
932
+
933
+ _, p_same = csd(x, x, nperseg=8, average='median',
934
+ return_onesided=False)
935
+ _, p_copied = csd(x, y, nperseg=8, average='median',
936
+ return_onesided=False)
937
+ assert_allclose(p_same, p_copied)
938
+
939
+
940
+ class TestCoherence:
941
+ def test_identical_input(self):
942
+ x = np.random.randn(20)
943
+ y = np.copy(x) # So `y is x` -> False
944
+
945
+ f = np.linspace(0, 0.5, 6)
946
+ C = np.ones(6)
947
+ f1, C1 = coherence(x, y, nperseg=10)
948
+
949
+ assert_allclose(f, f1)
950
+ assert_allclose(C, C1)
951
+
952
+ def test_phase_shifted_input(self):
953
+ x = np.random.randn(20)
954
+ y = -x
955
+
956
+ f = np.linspace(0, 0.5, 6)
957
+ C = np.ones(6)
958
+ f1, C1 = coherence(x, y, nperseg=10)
959
+
960
+ assert_allclose(f, f1)
961
+ assert_allclose(C, C1)
962
+
963
+
964
+ class TestSpectrogram:
965
+ def test_average_all_segments(self):
966
+ x = np.random.randn(1024)
967
+
968
+ fs = 1.0
969
+ window = ('tukey', 0.25)
970
+ nperseg = 16
971
+ noverlap = 2
972
+
973
+ f, _, P = spectrogram(x, fs, window, nperseg, noverlap)
974
+ fw, Pw = welch(x, fs, window, nperseg, noverlap)
975
+ assert_allclose(f, fw)
976
+ assert_allclose(np.mean(P, axis=-1), Pw)
977
+
978
+ def test_window_external(self):
979
+ x = np.random.randn(1024)
980
+
981
+ fs = 1.0
982
+ window = ('tukey', 0.25)
983
+ nperseg = 16
984
+ noverlap = 2
985
+ f, _, P = spectrogram(x, fs, window, nperseg, noverlap)
986
+
987
+ win = signal.get_window(('tukey', 0.25), 16)
988
+ fe, _, Pe = spectrogram(x, fs, win, nperseg=None, noverlap=2)
989
+ assert_array_equal(fe.shape, (9,)) # because win length used as nperseg
990
+ assert_array_equal(Pe.shape, (9,73))
991
+ assert_raises(ValueError, spectrogram, x,
992
+ fs, win, nperseg=8) # because nperseg != win.shape[-1]
993
+ win_err = signal.get_window(('tukey', 0.25), 2048)
994
+ assert_raises(ValueError, spectrogram, x,
995
+ fs, win_err, nperseg=None) # win longer than signal
996
+
997
+ def test_short_data(self):
998
+ x = np.random.randn(1024)
999
+ fs = 1.0
1000
+
1001
+ #for string-like window, input signal length < nperseg value gives
1002
+ #UserWarning, sets nperseg to x.shape[-1]
1003
+ f, _, p = spectrogram(x, fs, window=('tukey',0.25)) # default nperseg
1004
+ with suppress_warnings() as sup:
1005
+ sup.filter(UserWarning,
1006
+ "nperseg = 1025 is greater than input length = 1024, "
1007
+ "using nperseg = 1024",)
1008
+ f1, _, p1 = spectrogram(x, fs, window=('tukey',0.25),
1009
+ nperseg=1025) # user-specified nperseg
1010
+ f2, _, p2 = spectrogram(x, fs, nperseg=256) # to compare w/default
1011
+ f3, _, p3 = spectrogram(x, fs, nperseg=1024) # compare w/user-spec'd
1012
+ assert_allclose(f, f2)
1013
+ assert_allclose(p, p2)
1014
+ assert_allclose(f1, f3)
1015
+ assert_allclose(p1, p3)
1016
+
1017
+ class TestLombscargle:
1018
+ def test_frequency(self):
1019
+ """Test if frequency location of peak corresponds to frequency of
1020
+ generated input signal.
1021
+ """
1022
+
1023
+ # Input parameters
1024
+ ampl = 2.
1025
+ w = 1.
1026
+ phi = 0.5 * np.pi
1027
+ nin = 100
1028
+ nout = 1000
1029
+ p = 0.7 # Fraction of points to select
1030
+
1031
+ # Randomly select a fraction of an array with timesteps
1032
+ rng = np.random.RandomState(2353425)
1033
+ r = rng.rand(nin)
1034
+ t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
1035
+
1036
+ # Plot a sine wave for the selected times
1037
+ y = ampl * np.sin(w*t + phi)
1038
+
1039
+ # Define the array of frequencies for which to compute the periodogram
1040
+ f = np.linspace(0.01, 10., nout)
1041
+
1042
+ # Calculate Lomb-Scargle periodogram
1043
+ P = lombscargle(t, y, f)
1044
+
1045
+ # Check if difference between found frequency maximum and input
1046
+ # frequency is less than accuracy
1047
+ delta = f[1] - f[0]
1048
+ assert(w - f[np.argmax(P)] < (delta/2.))
1049
+
1050
+ # also, check that it works with weights
1051
+ P = lombscargle(t, y, f, weights=np.ones_like(t, dtype=f.dtype))
1052
+
1053
+ # Check if difference between found frequency maximum and input
1054
+ # frequency is less than accuracy
1055
+ delta = f[1] - f[0]
1056
+ assert(w - f[np.argmax(P)] < (delta/2.))
1057
+
1058
+
1059
+ def test_amplitude(self):
1060
+ # Test if height of peak in unnormalized Lomb-Scargle periodogram
1061
+ # corresponds to amplitude of the generated input signal.
1062
+
1063
+ # Input parameters
1064
+ ampl = 2.
1065
+ w = 1.
1066
+ phi = 0.5 * np.pi
1067
+ nin = 1000
1068
+ nout = 1000
1069
+ p = 0.7 # Fraction of points to select
1070
+
1071
+ # Randomly select a fraction of an array with timesteps
1072
+ rng = np.random.RandomState(2353425)
1073
+ r = rng.rand(nin)
1074
+ t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
1075
+
1076
+ # Plot a sine wave for the selected times
1077
+ y = ampl * np.sin(w*t + phi)
1078
+
1079
+ # Define the array of frequencies for which to compute the periodogram
1080
+ f = np.linspace(0.01, 10., nout)
1081
+
1082
+ # Calculate Lomb-Scargle periodogram
1083
+ pgram = lombscargle(t, y, f)
1084
+
1085
+ # convert to the amplitude
1086
+ pgram = np.sqrt(4.0 * pgram / t.shape[0])
1087
+
1088
+ # Check if amplitude is correct (this will not exactly match, due to
1089
+ # numerical differences when data is removed)
1090
+ assert_allclose(pgram[f==w], ampl, rtol=5e-2)
1091
+
1092
+ def test_precenter(self):
1093
+ # Test if precenter gives the same result as manually precentering
1094
+ # (for a very simple offset)
1095
+
1096
+ # Input parameters
1097
+ ampl = 2.
1098
+ w = 1.
1099
+ phi = 0.5 * np.pi
1100
+ nin = 100
1101
+ nout = 1000
1102
+ p = 0.7 # Fraction of points to select
1103
+ offset = 0.15 # Offset to be subtracted in pre-centering
1104
+
1105
+ # Randomly select a fraction of an array with timesteps
1106
+ rng = np.random.RandomState(2353425)
1107
+ r = rng.rand(nin)
1108
+ t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
1109
+
1110
+ # Plot a sine wave for the selected times
1111
+ y = ampl * np.sin(w*t + phi) + offset
1112
+
1113
+ # Define the array of frequencies for which to compute the periodogram
1114
+ f = np.linspace(0.01, 10., nout)
1115
+
1116
+ # Calculate Lomb-Scargle periodogram
1117
+ pgram = lombscargle(t, y, f, precenter=True)
1118
+ pgram2 = lombscargle(t, y - y.mean(), f, precenter=False)
1119
+
1120
+ # check if centering worked
1121
+ assert_allclose(pgram, pgram2)
1122
+
1123
+ # do this again, but with floating_mean=True
1124
+
1125
+ # Calculate Lomb-Scargle periodogram
1126
+ pgram = lombscargle(t, y, f, precenter=True, floating_mean=True)
1127
+ pgram2 = lombscargle(t, y - y.mean(), f, precenter=False, floating_mean=True)
1128
+
1129
+ # check if centering worked
1130
+ assert_allclose(pgram, pgram2)
1131
+
1132
+ def test_normalize(self):
1133
+ # Test normalize option of Lomb-Scarge.
1134
+
1135
+ # Input parameters
1136
+ ampl = 2.
1137
+ w = 1.
1138
+ phi = 0.5 * np.pi
1139
+ nin = 100
1140
+ nout = 1000
1141
+ p = 0.7 # Fraction of points to select
1142
+
1143
+ # Randomly select a fraction of an array with timesteps
1144
+ rng = np.random.RandomState(2353425)
1145
+ r = rng.rand(nin)
1146
+ t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
1147
+
1148
+ # Plot a sine wave for the selected times
1149
+ y = ampl * np.sin(w*t + phi)
1150
+
1151
+ # Define the array of frequencies for which to compute the periodogram
1152
+ f = np.linspace(0.01, 10., nout)
1153
+
1154
+ # Calculate Lomb-Scargle periodogram
1155
+ pgram = lombscargle(t, y, f)
1156
+ pgram2 = lombscargle(t, y, f, normalize=True)
1157
+
1158
+ # Calculate the scale to convert from unnormalized to normalized
1159
+ weights = np.ones_like(t)/float(t.shape[0])
1160
+ YY_hat = (weights * y * y).sum()
1161
+ YY = YY_hat # correct formula for floating_mean=False
1162
+ scale_to_use = 2/(YY*t.shape[0])
1163
+
1164
+ # check if normalization works as expected
1165
+ assert_allclose(pgram * scale_to_use, pgram2)
1166
+ assert_allclose(np.max(pgram2), 1.0)
1167
+
1168
+ def test_wrong_shape(self):
1169
+
1170
+ # different length t and y
1171
+ t = np.linspace(0, 1, 1)
1172
+ y = np.linspace(0, 1, 2)
1173
+ f = np.linspace(0, 1, 3) + 0.1
1174
+ assert_raises(ValueError, lombscargle, t, y, f)
1175
+
1176
+ # t is 2D, with both axes length > 1
1177
+ t = np.repeat(np.expand_dims(np.linspace(0, 1, 2), 1), 2, axis=1)
1178
+ y = np.linspace(0, 1, 2)
1179
+ f = np.linspace(0, 1, 3) + 0.1
1180
+ assert_raises(ValueError, lombscargle, t, y, f)
1181
+
1182
+ # y is 2D, with both axes length > 1
1183
+ t = np.linspace(0, 1, 2)
1184
+ y = np.repeat(np.expand_dims(np.linspace(0, 1, 2), 1), 2, axis=1)
1185
+ f = np.linspace(0, 1, 3) + 0.1
1186
+ assert_raises(ValueError, lombscargle, t, y, f)
1187
+
1188
+ # f is 2D, with both axes length > 1
1189
+ t = np.linspace(0, 1, 2)
1190
+ y = np.linspace(0, 1, 2)
1191
+ f = np.repeat(np.expand_dims(np.linspace(0, 1, 3), 1) + 0.1, 2, axis=1)
1192
+ assert_raises(ValueError, lombscargle, t, y, f)
1193
+
1194
+ # weights is 2D, with both axes length > 1
1195
+ t = np.linspace(0, 1, 2)
1196
+ y = np.linspace(0, 1, 2)
1197
+ f = np.linspace(0, 1, 3) + 0.1
1198
+ weights = np.repeat(np.expand_dims(np.linspace(0, 1, 2), 1), 2, axis=1)
1199
+ assert_raises(ValueError, lombscargle, t, y, f, weights=weights)
1200
+
1201
+ def test_lombscargle_atan_vs_atan2(self):
1202
+ # https://github.com/scipy/scipy/issues/3787
1203
+ # This raised a ZeroDivisionError.
1204
+ t = np.linspace(0, 10, 1000, endpoint=False)
1205
+ y = np.sin(4*t)
1206
+ f = np.linspace(0, 50, 500, endpoint=False) + 0.1
1207
+ lombscargle(t, y, f*2*np.pi)
1208
+
1209
+ def test_wrong_shape_weights(self):
1210
+ # Weights must be the same shape as t
1211
+
1212
+ t = np.linspace(0, 1, 1)
1213
+ y = np.linspace(0, 1, 1)
1214
+ f = np.linspace(0, 1, 3) + 0.1
1215
+ weights = np.linspace(1, 2, 2)
1216
+ assert_raises(ValueError, lombscargle, t, y, f, weights=weights)
1217
+
1218
+ def test_zero_division_weights(self):
1219
+ # Weights cannot sum to 0
1220
+
1221
+ t = np.zeros(1)
1222
+ y = np.zeros(1)
1223
+ f = np.ones(1)
1224
+ weights = np.zeros(1)
1225
+ assert_raises(ValueError, lombscargle, t, y, f, weights=weights)
1226
+
1227
+ def test_normalize_parameter(self):
1228
+ # Test the validity of the normalize parameter input
1229
+
1230
+ # Input parameters
1231
+ ampl = 2.
1232
+ w = 1.
1233
+ phi = 0
1234
+ nin = 100
1235
+ nout = 1000
1236
+ p = 0.7 # Fraction of points to select
1237
+
1238
+ # Randomly select a fraction of an array with timesteps
1239
+ rng = np.random.RandomState(2353425)
1240
+ r = rng.rand(nin)
1241
+ t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
1242
+
1243
+ # Plot a sine wave for the selected times
1244
+ y = ampl * np.sin(w*t + phi)
1245
+
1246
+ # Define the array of frequencies for which to compute the periodogram
1247
+ f = np.linspace(0.01, 10., nout)
1248
+
1249
+ # check each of the valid inputs
1250
+ pgram_false = lombscargle(t, y, f, normalize=False)
1251
+ pgram_true = lombscargle(t, y, f, normalize=True)
1252
+ pgram_power = lombscargle(t, y, f, normalize='power')
1253
+ pgram_norm = lombscargle(t, y, f, normalize='normalize')
1254
+ pgram_amp = lombscargle(t, y, f, normalize='amplitude')
1255
+
1256
+ # validate the results that should be the same
1257
+ assert_allclose(pgram_false, pgram_power)
1258
+ assert_allclose(pgram_true, pgram_norm)
1259
+
1260
+ # validate that the power and norm outputs are proper wrt each other
1261
+ weights = np.ones_like(y)/float(y.shape[0])
1262
+ YY_hat = (weights * y * y).sum()
1263
+ YY = YY_hat # correct formula for floating_mean=False
1264
+ assert_allclose(pgram_power * 2.0 / (float(t.shape[0]) * YY), pgram_norm)
1265
+
1266
+ # validate that the amp output is correct for the given input
1267
+ f_i = np.where(f==w)[0][0]
1268
+ assert_allclose(np.abs(pgram_amp[f_i]), ampl)
1269
+
1270
+ # check invalid inputs
1271
+ # 1) a string that is not allowed
1272
+ assert_raises(ValueError, lombscargle, t, y, f, normalize='lomb')
1273
+ # 2) something besides a bool or str
1274
+ assert_raises(ValueError, lombscargle, t, y, f, normalize=2)
1275
+
1276
+ def test_offset_removal(self):
1277
+ # Verify that the amplitude is the same, even with an offset
1278
+ # must use floating_mean=True, otherwise it will not remove an offset
1279
+
1280
+ # Input parameters
1281
+ ampl = 2.
1282
+ w = 1.
1283
+ phi = 0.5 * np.pi
1284
+ nin = 100
1285
+ nout = 1000
1286
+ p = 0.7 # Fraction of points to select
1287
+ offset = 2.15 # Large offset
1288
+
1289
+ # Randomly select a fraction of an array with timesteps
1290
+ rng = np.random.RandomState(2353425)
1291
+ r = rng.rand(nin)
1292
+ t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
1293
+
1294
+ # Plot a sine wave for the selected times
1295
+ y = ampl * np.sin(w*t + phi)
1296
+
1297
+ # Define the array of frequencies for which to compute the periodogram
1298
+ f = np.linspace(0.01, 10., nout)
1299
+
1300
+ # Calculate Lomb-Scargle periodogram
1301
+ pgram = lombscargle(t, y, f, floating_mean=True)
1302
+ pgram_offset = lombscargle(t, y + offset, f, floating_mean=True)
1303
+
1304
+ # check if offset removal works as expected
1305
+ assert_allclose(pgram, pgram_offset)
1306
+
1307
+ def test_floating_mean_false(self):
1308
+ # Verify that when disabling the floating_mean, the calculations are correct
1309
+
1310
+ # Input parameters
1311
+ ampl = 2.
1312
+ w = 1.
1313
+ phi = 0
1314
+ nin = 1000
1315
+ nout = 1000
1316
+ p = 0.7 # Fraction of points to select
1317
+ offset = 2 # Large offset
1318
+
1319
+ # Randomly select a fraction of an array with timesteps
1320
+ rng = np.random.RandomState(2353425)
1321
+ r = rng.rand(nin)
1322
+ t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
1323
+
1324
+ # Plot a cos wave for the selected times
1325
+ y = ampl * np.cos(w*t + phi)
1326
+
1327
+ # Define the array of frequencies for which to compute the periodogram
1328
+ f = np.linspace(0.01, 10., nout)
1329
+
1330
+ # Calculate Lomb-Scargle periodogram
1331
+ pgram = lombscargle(t, y, f, normalize=True, floating_mean=False)
1332
+ pgram_offset = lombscargle(t, y + offset, f, normalize=True,
1333
+ floating_mean=False)
1334
+
1335
+ # check if disabling floating_mean works as expected
1336
+ # nearly-zero for no offset, exact value will change based on seed
1337
+ assert(pgram[0] < 0.01)
1338
+ # significant value with offset, exact value will change based on seed
1339
+ assert(pgram_offset[0] > 0.5)
1340
+
1341
+ def test_amplitude_is_correct(self):
1342
+ # Verify that the amplitude is correct (when normalize='amplitude')
1343
+
1344
+ # Input parameters
1345
+ ampl = 2.
1346
+ w = 1.
1347
+ phi = 0.12
1348
+ nin = 100
1349
+ nout = 1000
1350
+ p = 0.7 # Fraction of points to select
1351
+ offset = 2.15 # Large offset
1352
+
1353
+ # Randomly select a fraction of an array with timesteps
1354
+ rng = np.random.RandomState(2353425)
1355
+ r = rng.rand(nin)
1356
+ t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
1357
+
1358
+ # Plot a sine wave for the selected times
1359
+ y = ampl * np.cos(w*t + phi) + offset
1360
+
1361
+ # Define the array of frequencies for which to compute the periodogram
1362
+ f = np.linspace(0.01, 10., nout)
1363
+
1364
+ # Get the index of where the exact result should be
1365
+ f_indx = np.where(f==w)[0][0]
1366
+
1367
+ # Calculate Lomb-Scargle periodogram (amplitude + phase)
1368
+ pgram = lombscargle(t, y, f, normalize='amplitude', floating_mean=True)
1369
+
1370
+ # Check if amplitude is correct
1371
+ assert_allclose(np.abs(pgram[f_indx]), ampl)
1372
+
1373
+ # Check if phase is correct
1374
+ # (phase angle is the negative of the phase offset)
1375
+ assert_allclose(-np.angle(pgram[f_indx]), phi)
1376
+
1377
+ def test_negative_weight(self):
1378
+ # Test that a negative weight produces an error
1379
+
1380
+ t = np.zeros(1)
1381
+ y = np.zeros(1)
1382
+ f = np.ones(1)
1383
+ weights = -np.ones(1)
1384
+ assert_raises(ValueError, lombscargle, t, y, f, weights=weights)
1385
+
1386
+ def test_list_input(self):
1387
+ # Test that input can be passsed in as lists and with a numerical issue
1388
+ # https://github.com/scipy/scipy/issues/8787
1389
+
1390
+ t = [1.98201652e+09, 1.98201752e+09, 1.98201852e+09, 1.98201952e+09,
1391
+ 1.98202052e+09, 1.98202152e+09, 1.98202252e+09, 1.98202352e+09,
1392
+ 1.98202452e+09, 1.98202552e+09, 1.98202652e+09, 1.98202752e+09,
1393
+ 1.98202852e+09, 1.98202952e+09, 1.98203052e+09, 1.98203152e+09,
1394
+ 1.98203252e+09, 1.98203352e+09, 1.98203452e+09, 1.98203552e+09,
1395
+ 1.98205452e+09, 1.98205552e+09, 1.98205652e+09, 1.98205752e+09,
1396
+ 1.98205852e+09, 1.98205952e+09, 1.98206052e+09, 1.98206152e+09,
1397
+ 1.98206252e+09, 1.98206352e+09, 1.98206452e+09, 1.98206552e+09,
1398
+ 1.98206652e+09, 1.98206752e+09, 1.98206852e+09, 1.98206952e+09,
1399
+ 1.98207052e+09, 1.98207152e+09, 1.98207252e+09, 1.98207352e+09,
1400
+ 1.98209652e+09, 1.98209752e+09, 1.98209852e+09, 1.98209952e+09,
1401
+ 1.98210052e+09, 1.98210152e+09, 1.98210252e+09, 1.98210352e+09,
1402
+ 1.98210452e+09, 1.98210552e+09, 1.98210652e+09, 1.98210752e+09,
1403
+ 1.98210852e+09, 1.98210952e+09, 1.98211052e+09, 1.98211152e+09,
1404
+ 1.98211252e+09, 1.98211352e+09, 1.98211452e+09, 1.98211552e+09,
1405
+ 1.98217252e+09, 1.98217352e+09, 1.98217452e+09, 1.98217552e+09,
1406
+ 1.98217652e+09, 1.98217752e+09, 1.98217852e+09, 1.98217952e+09,
1407
+ 1.98218052e+09, 1.98218152e+09, 1.98218252e+09, 1.98218352e+09,
1408
+ 1.98218452e+09, 1.98218552e+09, 1.98218652e+09, 1.98218752e+09,
1409
+ 1.98218852e+09, 1.98218952e+09, 1.98219052e+09, 1.98219152e+09,
1410
+ 1.98219352e+09, 1.98219452e+09, 1.98219552e+09, 1.98219652e+09,
1411
+ 1.98219752e+09, 1.98219852e+09, 1.98219952e+09, 1.98220052e+09,
1412
+ 1.98220152e+09, 1.98220252e+09, 1.98220352e+09, 1.98220452e+09,
1413
+ 1.98220552e+09, 1.98220652e+09, 1.98220752e+09, 1.98220852e+09,
1414
+ 1.98220952e+09, 1.98221052e+09, 1.98221152e+09, 1.98221252e+09,
1415
+ 1.98222752e+09, 1.98222852e+09, 1.98222952e+09, 1.98223052e+09,
1416
+ 1.98223152e+09, 1.98223252e+09, 1.98223352e+09, 1.98223452e+09,
1417
+ 1.98223552e+09, 1.98223652e+09, 1.98223752e+09, 1.98223852e+09,
1418
+ 1.98223952e+09, 1.98224052e+09, 1.98224152e+09, 1.98224252e+09,
1419
+ 1.98224352e+09, 1.98224452e+09, 1.98224552e+09, 1.98224652e+09,
1420
+ 1.98224752e+09]
1421
+ y = [2.97600000e+03, 3.18200000e+03, 3.74900000e+03, 4.53500000e+03,
1422
+ 5.43300000e+03, 6.38000000e+03, 7.34000000e+03, 8.29200000e+03,
1423
+ 9.21900000e+03, 1.01120000e+04, 1.09620000e+04, 1.17600000e+04,
1424
+ 1.25010000e+04, 1.31790000e+04, 1.37900000e+04, 1.43290000e+04,
1425
+ 1.47940000e+04, 1.51800000e+04, 1.54870000e+04, 1.57110000e+04,
1426
+ 5.74200000e+03, 4.82300000e+03, 3.99100000e+03, 3.33600000e+03,
1427
+ 2.99600000e+03, 3.08400000e+03, 3.56700000e+03, 4.30700000e+03,
1428
+ 5.18200000e+03, 6.11900000e+03, 7.07900000e+03, 8.03400000e+03,
1429
+ 8.97000000e+03, 9.87300000e+03, 1.07350000e+04, 1.15480000e+04,
1430
+ 1.23050000e+04, 1.30010000e+04, 1.36300000e+04, 1.41890000e+04,
1431
+ 6.00000000e+03, 5.06800000e+03, 4.20500000e+03, 3.49000000e+03,
1432
+ 3.04900000e+03, 3.01600000e+03, 3.40400000e+03, 4.08800000e+03,
1433
+ 4.93500000e+03, 5.86000000e+03, 6.81700000e+03, 7.77500000e+03,
1434
+ 8.71800000e+03, 9.63100000e+03, 1.05050000e+04, 1.13320000e+04,
1435
+ 1.21050000e+04, 1.28170000e+04, 1.34660000e+04, 1.40440000e+04,
1436
+ 1.32730000e+04, 1.26040000e+04, 1.18720000e+04, 1.10820000e+04,
1437
+ 1.02400000e+04, 9.35300000e+03, 8.43000000e+03, 7.48100000e+03,
1438
+ 6.52100000e+03, 5.57000000e+03, 4.66200000e+03, 3.85400000e+03,
1439
+ 3.24600000e+03, 2.97900000e+03, 3.14700000e+03, 3.68800000e+03,
1440
+ 4.45900000e+03, 5.35000000e+03, 6.29400000e+03, 7.25400000e+03,
1441
+ 9.13800000e+03, 1.00340000e+04, 1.08880000e+04, 1.16910000e+04,
1442
+ 1.24370000e+04, 1.31210000e+04, 1.37380000e+04, 1.42840000e+04,
1443
+ 1.47550000e+04, 1.51490000e+04, 1.54630000e+04, 1.56950000e+04,
1444
+ 1.58430000e+04, 1.59070000e+04, 1.58860000e+04, 1.57800000e+04,
1445
+ 1.55910000e+04, 1.53190000e+04, 1.49650000e+04, 1.45330000e+04,
1446
+ 3.01000000e+03, 3.05900000e+03, 3.51200000e+03, 4.23400000e+03,
1447
+ 5.10000000e+03, 6.03400000e+03, 6.99300000e+03, 7.95000000e+03,
1448
+ 8.88800000e+03, 9.79400000e+03, 1.06600000e+04, 1.14770000e+04,
1449
+ 1.22400000e+04, 1.29410000e+04, 1.35770000e+04, 1.41430000e+04,
1450
+ 1.46350000e+04, 1.50500000e+04, 1.53850000e+04, 1.56400000e+04,
1451
+ 1.58110000e+04]
1452
+
1453
+ periods = np.linspace(400, 120, 1000)
1454
+ angular_freq = 2 * np.pi / periods
1455
+
1456
+ lombscargle(t, y, angular_freq, precenter=True, normalize=True)
1457
+
1458
+ def test_zero_freq(self):
1459
+ # Verify that function works when freqs includes 0
1460
+ # The value at f=0 will depend on the seed
1461
+
1462
+ # Input parameters
1463
+ ampl = 2.
1464
+ w = 1.
1465
+ phi = 0.12
1466
+ nin = 100
1467
+ nout = 1001
1468
+ p = 0.7 # Fraction of points to select
1469
+ offset = 0
1470
+
1471
+ # Randomly select a fraction of an array with timesteps
1472
+ rng = np.random.RandomState(2353425)
1473
+ r = rng.rand(nin)
1474
+ t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
1475
+
1476
+ # Plot a sine wave for the selected times
1477
+ y = ampl * np.cos(w*t + phi) + offset
1478
+
1479
+ # Define the array of frequencies for which to compute the periodogram
1480
+ f = np.linspace(0, 10., nout)
1481
+
1482
+ # Calculate Lomb-Scargle periodogram
1483
+ pgram = lombscargle(t, y, f, normalize=True, floating_mean=True)
1484
+
1485
+ # exact value will change based on seed
1486
+ # testing to make sure it is very small
1487
+ assert(pgram[0] < 1e-4)
1488
+
1489
+ def test_simple_div_zero(self):
1490
+ # these are bare-minimum examples that would, without the eps adjustments,
1491
+ # cause division-by-zero errors
1492
+
1493
+ # first, test with example that will cause first SS sum to be 0.0
1494
+ t = [t + 1 for t in range(0, 32)]
1495
+ y = np.ones(len(t))
1496
+ freqs = [2.0*np.pi] * 2 # must have 2+ elements
1497
+ lombscargle(t, y, freqs)
1498
+
1499
+ # second, test with example that will cause first CC sum to be 0.0
1500
+ t = [t*4 + 1 for t in range(0, 32)]
1501
+ y = np.ones(len(t))
1502
+ freqs = [np.pi/2.0] * 2 # must have 2+ elements
1503
+
1504
+ lombscargle(t, y, freqs)
1505
+
1506
+
1507
+ class TestSTFT:
1508
+ @pytest.mark.thread_unsafe
1509
+ def test_input_validation(self):
1510
+
1511
+ def chk_VE(match):
1512
+ """Assert for a ValueError matching regexp `match`.
1513
+
1514
+ This little wrapper allows a more concise code layout.
1515
+ """
1516
+ return pytest.raises(ValueError, match=match)
1517
+
1518
+ # Checks for check_COLA():
1519
+ with chk_VE('nperseg must be a positive integer'):
1520
+ check_COLA('hann', -10, 0)
1521
+ with chk_VE('noverlap must be less than nperseg.'):
1522
+ check_COLA('hann', 10, 20)
1523
+ with chk_VE('window must be 1-D'):
1524
+ check_COLA(np.ones((2, 2)), 10, 0)
1525
+ with chk_VE('window must have length of nperseg'):
1526
+ check_COLA(np.ones(20), 10, 0)
1527
+
1528
+ # Checks for check_NOLA():
1529
+ with chk_VE('nperseg must be a positive integer'):
1530
+ check_NOLA('hann', -10, 0)
1531
+ with chk_VE('noverlap must be less than nperseg'):
1532
+ check_NOLA('hann', 10, 20)
1533
+ with chk_VE('window must be 1-D'):
1534
+ check_NOLA(np.ones((2, 2)), 10, 0)
1535
+ with chk_VE('window must have length of nperseg'):
1536
+ check_NOLA(np.ones(20), 10, 0)
1537
+ with chk_VE('noverlap must be a nonnegative integer'):
1538
+ check_NOLA('hann', 64, -32)
1539
+
1540
+ x = np.zeros(1024)
1541
+ z = stft(x)[2]
1542
+
1543
+ # Checks for stft():
1544
+ with chk_VE('window must be 1-D'):
1545
+ stft(x, window=np.ones((2, 2)))
1546
+ with chk_VE('value specified for nperseg is different ' +
1547
+ 'from length of window'):
1548
+ stft(x, window=np.ones(10), nperseg=256)
1549
+ with chk_VE('nperseg must be a positive integer'):
1550
+ stft(x, nperseg=-256)
1551
+ with chk_VE('noverlap must be less than nperseg.'):
1552
+ stft(x, nperseg=256, noverlap=1024)
1553
+ with chk_VE('nfft must be greater than or equal to nperseg.'):
1554
+ stft(x, nperseg=256, nfft=8)
1555
+
1556
+ # Checks for istft():
1557
+ with chk_VE('Input stft must be at least 2d!'):
1558
+ istft(x)
1559
+ with chk_VE('window must be 1-D'):
1560
+ istft(z, window=np.ones((2, 2)))
1561
+ with chk_VE('window must have length of 256'):
1562
+ istft(z, window=np.ones(10), nperseg=256)
1563
+ with chk_VE('nperseg must be a positive integer'):
1564
+ istft(z, nperseg=-256)
1565
+ with chk_VE('noverlap must be less than nperseg.'):
1566
+ istft(z, nperseg=256, noverlap=1024)
1567
+ with chk_VE('nfft must be greater than or equal to nperseg.'):
1568
+ istft(z, nperseg=256, nfft=8)
1569
+ with pytest.warns(UserWarning, match="NOLA condition failed, " +
1570
+ "STFT may not be invertible"):
1571
+ istft(z, nperseg=256, noverlap=0, window='hann')
1572
+ with chk_VE('Must specify differing time and frequency axes!'):
1573
+ istft(z, time_axis=0, freq_axis=0)
1574
+
1575
+ # Checks for _spectral_helper():
1576
+ with chk_VE("Unknown value for mode foo, must be one of: " +
1577
+ r"\{'psd', 'stft'\}"):
1578
+ _spectral_helper(x, x, mode='foo')
1579
+ with chk_VE("x and y must be equal if mode is 'stft'"):
1580
+ _spectral_helper(x[:512], x[512:], mode='stft')
1581
+ with chk_VE("Unknown boundary option 'foo', must be one of: " +
1582
+ r"\['even', 'odd', 'constant', 'zeros', None\]"):
1583
+ _spectral_helper(x, x, boundary='foo')
1584
+
1585
+ scaling = "not_valid"
1586
+ with chk_VE(fr"Parameter {scaling=} not in \['spectrum', 'psd'\]!"):
1587
+ stft(x, scaling=scaling)
1588
+ with chk_VE(fr"Parameter {scaling=} not in \['spectrum', 'psd'\]!"):
1589
+ istft(z, scaling=scaling)
1590
+
1591
+ def test_check_COLA(self):
1592
+ settings = [
1593
+ ('boxcar', 10, 0),
1594
+ ('boxcar', 10, 9),
1595
+ ('bartlett', 51, 26),
1596
+ ('hann', 256, 128),
1597
+ ('hann', 256, 192),
1598
+ ('blackman', 300, 200),
1599
+ (('tukey', 0.5), 256, 64),
1600
+ ('hann', 256, 255),
1601
+ ]
1602
+
1603
+ for setting in settings:
1604
+ msg = '{}, {}, {}'.format(*setting)
1605
+ assert_equal(True, check_COLA(*setting), err_msg=msg)
1606
+
1607
+ def test_check_NOLA(self):
1608
+ settings_pass = [
1609
+ ('boxcar', 10, 0),
1610
+ ('boxcar', 10, 9),
1611
+ ('boxcar', 10, 7),
1612
+ ('bartlett', 51, 26),
1613
+ ('bartlett', 51, 10),
1614
+ ('hann', 256, 128),
1615
+ ('hann', 256, 192),
1616
+ ('hann', 256, 37),
1617
+ ('blackman', 300, 200),
1618
+ ('blackman', 300, 123),
1619
+ (('tukey', 0.5), 256, 64),
1620
+ (('tukey', 0.5), 256, 38),
1621
+ ('hann', 256, 255),
1622
+ ('hann', 256, 39),
1623
+ ]
1624
+ for setting in settings_pass:
1625
+ msg = '{}, {}, {}'.format(*setting)
1626
+ assert_equal(True, check_NOLA(*setting), err_msg=msg)
1627
+
1628
+ w_fail = np.ones(16)
1629
+ w_fail[::2] = 0
1630
+ settings_fail = [
1631
+ (w_fail, len(w_fail), len(w_fail) // 2),
1632
+ ('hann', 64, 0),
1633
+ ]
1634
+ for setting in settings_fail:
1635
+ msg = '{}, {}, {}'.format(*setting)
1636
+ assert_equal(False, check_NOLA(*setting), err_msg=msg)
1637
+
1638
+ def test_average_all_segments(self):
1639
+ rng = np.random.RandomState(1234)
1640
+ x = rng.randn(1024)
1641
+
1642
+ fs = 1.0
1643
+ window = 'hann'
1644
+ nperseg = 16
1645
+ noverlap = 8
1646
+
1647
+ # Compare twosided, because onesided welch doubles non-DC terms to
1648
+ # account for power at negative frequencies. stft doesn't do this,
1649
+ # because it breaks invertibility.
1650
+ f, _, Z = stft(x, fs, window, nperseg, noverlap, padded=False,
1651
+ return_onesided=False, boundary=None)
1652
+ fw, Pw = welch(x, fs, window, nperseg, noverlap, return_onesided=False,
1653
+ scaling='spectrum', detrend=False)
1654
+
1655
+ assert_allclose(f, fw)
1656
+ assert_allclose(np.mean(np.abs(Z)**2, axis=-1), Pw)
1657
+
1658
+ def test_permute_axes(self):
1659
+ rng = np.random.RandomState(1234)
1660
+ x = rng.randn(1024)
1661
+
1662
+ fs = 1.0
1663
+ window = 'hann'
1664
+ nperseg = 16
1665
+ noverlap = 8
1666
+
1667
+ f1, t1, Z1 = stft(x, fs, window, nperseg, noverlap)
1668
+ f2, t2, Z2 = stft(x.reshape((-1, 1, 1)), fs, window, nperseg, noverlap,
1669
+ axis=0)
1670
+
1671
+ t3, x1 = istft(Z1, fs, window, nperseg, noverlap)
1672
+ t4, x2 = istft(Z2.T, fs, window, nperseg, noverlap, time_axis=0,
1673
+ freq_axis=-1)
1674
+
1675
+ assert_allclose(f1, f2)
1676
+ assert_allclose(t1, t2)
1677
+ assert_allclose(t3, t4)
1678
+ assert_allclose(Z1, Z2[:, 0, 0, :])
1679
+ assert_allclose(x1, x2[:, 0, 0])
1680
+
1681
+ @pytest.mark.parametrize('scaling', ['spectrum', 'psd'])
1682
+ def test_roundtrip_real(self, scaling):
1683
+ rng = np.random.RandomState(1234)
1684
+
1685
+ settings = [
1686
+ ('boxcar', 100, 10, 0), # Test no overlap
1687
+ ('boxcar', 100, 10, 9), # Test high overlap
1688
+ ('bartlett', 101, 51, 26), # Test odd nperseg
1689
+ ('hann', 1024, 256, 128), # Test defaults
1690
+ (('tukey', 0.5), 1152, 256, 64), # Test Tukey
1691
+ ('hann', 1024, 256, 255), # Test overlapped hann
1692
+ ]
1693
+
1694
+ for window, N, nperseg, noverlap in settings:
1695
+ t = np.arange(N)
1696
+ x = 10*rng.randn(t.size)
1697
+
1698
+ _, _, zz = stft(x, nperseg=nperseg, noverlap=noverlap,
1699
+ window=window, detrend=None, padded=False,
1700
+ scaling=scaling)
1701
+
1702
+ tr, xr = istft(zz, nperseg=nperseg, noverlap=noverlap,
1703
+ window=window, scaling=scaling)
1704
+
1705
+ msg = f'{window}, {noverlap}'
1706
+ assert_allclose(t, tr, err_msg=msg)
1707
+ assert_allclose(x, xr, err_msg=msg)
1708
+
1709
+ @pytest.mark.thread_unsafe
1710
+ def test_roundtrip_not_nola(self):
1711
+ rng = np.random.RandomState(1234)
1712
+
1713
+ w_fail = np.ones(16)
1714
+ w_fail[::2] = 0
1715
+ settings = [
1716
+ (w_fail, 256, len(w_fail), len(w_fail) // 2),
1717
+ ('hann', 256, 64, 0),
1718
+ ]
1719
+
1720
+ for window, N, nperseg, noverlap in settings:
1721
+ msg = f'{window}, {N}, {nperseg}, {noverlap}'
1722
+ assert not check_NOLA(window, nperseg, noverlap), msg
1723
+
1724
+ t = np.arange(N)
1725
+ x = 10 * rng.randn(t.size)
1726
+
1727
+ _, _, zz = stft(x, nperseg=nperseg, noverlap=noverlap,
1728
+ window=window, detrend=None, padded=True,
1729
+ boundary='zeros')
1730
+ with pytest.warns(UserWarning, match='NOLA'):
1731
+ tr, xr = istft(zz, nperseg=nperseg, noverlap=noverlap,
1732
+ window=window, boundary=True)
1733
+
1734
+ assert np.allclose(t, tr[:len(t)]), msg
1735
+ assert not np.allclose(x, xr[:len(x)]), msg
1736
+
1737
+ def test_roundtrip_nola_not_cola(self):
1738
+ rng = np.random.RandomState(1234)
1739
+
1740
+ settings = [
1741
+ ('boxcar', 100, 10, 3), # NOLA True, COLA False
1742
+ ('bartlett', 101, 51, 37), # NOLA True, COLA False
1743
+ ('hann', 1024, 256, 127), # NOLA True, COLA False
1744
+ (('tukey', 0.5), 1152, 256, 14), # NOLA True, COLA False
1745
+ ('hann', 1024, 256, 5), # NOLA True, COLA False
1746
+ ]
1747
+
1748
+ for window, N, nperseg, noverlap in settings:
1749
+ msg = f'{window}, {nperseg}, {noverlap}'
1750
+ assert check_NOLA(window, nperseg, noverlap), msg
1751
+ assert not check_COLA(window, nperseg, noverlap), msg
1752
+
1753
+ t = np.arange(N)
1754
+ x = 10 * rng.randn(t.size)
1755
+
1756
+ _, _, zz = stft(x, nperseg=nperseg, noverlap=noverlap,
1757
+ window=window, detrend=None, padded=True,
1758
+ boundary='zeros')
1759
+
1760
+ tr, xr = istft(zz, nperseg=nperseg, noverlap=noverlap,
1761
+ window=window, boundary=True)
1762
+
1763
+ msg = f'{window}, {noverlap}'
1764
+ assert_allclose(t, tr[:len(t)], err_msg=msg)
1765
+ assert_allclose(x, xr[:len(x)], err_msg=msg)
1766
+
1767
+ def test_roundtrip_float32(self):
1768
+ rng = np.random.RandomState(1234)
1769
+
1770
+ settings = [('hann', 1024, 256, 128)]
1771
+
1772
+ for window, N, nperseg, noverlap in settings:
1773
+ t = np.arange(N)
1774
+ x = 10*rng.randn(t.size)
1775
+ x = x.astype(np.float32)
1776
+
1777
+ _, _, zz = stft(x, nperseg=nperseg, noverlap=noverlap,
1778
+ window=window, detrend=None, padded=False)
1779
+
1780
+ tr, xr = istft(zz, nperseg=nperseg, noverlap=noverlap,
1781
+ window=window)
1782
+
1783
+ msg = f'{window}, {noverlap}'
1784
+ assert_allclose(t, t, err_msg=msg)
1785
+ assert_allclose(x, xr, err_msg=msg, rtol=1e-4, atol=1e-5)
1786
+ assert_(x.dtype == xr.dtype)
1787
+
1788
+ @pytest.mark.thread_unsafe
1789
+ @pytest.mark.parametrize('scaling', ['spectrum', 'psd'])
1790
+ def test_roundtrip_complex(self, scaling):
1791
+ rng = np.random.RandomState(1234)
1792
+
1793
+ settings = [
1794
+ ('boxcar', 100, 10, 0), # Test no overlap
1795
+ ('boxcar', 100, 10, 9), # Test high overlap
1796
+ ('bartlett', 101, 51, 26), # Test odd nperseg
1797
+ ('hann', 1024, 256, 128), # Test defaults
1798
+ (('tukey', 0.5), 1152, 256, 64), # Test Tukey
1799
+ ('hann', 1024, 256, 255), # Test overlapped hann
1800
+ ]
1801
+
1802
+ for window, N, nperseg, noverlap in settings:
1803
+ t = np.arange(N)
1804
+ x = 10*rng.randn(t.size) + 10j*rng.randn(t.size)
1805
+
1806
+ _, _, zz = stft(x, nperseg=nperseg, noverlap=noverlap,
1807
+ window=window, detrend=None, padded=False,
1808
+ return_onesided=False, scaling=scaling)
1809
+
1810
+ tr, xr = istft(zz, nperseg=nperseg, noverlap=noverlap,
1811
+ window=window, input_onesided=False,
1812
+ scaling=scaling)
1813
+
1814
+ msg = f'{window}, {nperseg}, {noverlap}'
1815
+ assert_allclose(t, tr, err_msg=msg)
1816
+ assert_allclose(x, xr, err_msg=msg)
1817
+
1818
+ # Check that asking for onesided switches to twosided
1819
+ with suppress_warnings() as sup:
1820
+ sup.filter(UserWarning,
1821
+ "Input data is complex, switching to return_onesided=False")
1822
+ _, _, zz = stft(x, nperseg=nperseg, noverlap=noverlap,
1823
+ window=window, detrend=None, padded=False,
1824
+ return_onesided=True, scaling=scaling)
1825
+
1826
+ tr, xr = istft(zz, nperseg=nperseg, noverlap=noverlap,
1827
+ window=window, input_onesided=False, scaling=scaling)
1828
+
1829
+ msg = f'{window}, {nperseg}, {noverlap}'
1830
+ assert_allclose(t, tr, err_msg=msg)
1831
+ assert_allclose(x, xr, err_msg=msg)
1832
+
1833
+ def test_roundtrip_boundary_extension(self):
1834
+ rng = np.random.RandomState(1234)
1835
+
1836
+ # Test against boxcar, since window is all ones, and thus can be fully
1837
+ # recovered with no boundary extension
1838
+
1839
+ settings = [
1840
+ ('boxcar', 100, 10, 0), # Test no overlap
1841
+ ('boxcar', 100, 10, 9), # Test high overlap
1842
+ ]
1843
+
1844
+ for window, N, nperseg, noverlap in settings:
1845
+ t = np.arange(N)
1846
+ x = 10*rng.randn(t.size)
1847
+
1848
+ _, _, zz = stft(x, nperseg=nperseg, noverlap=noverlap,
1849
+ window=window, detrend=None, padded=True,
1850
+ boundary=None)
1851
+
1852
+ _, xr = istft(zz, noverlap=noverlap, window=window, boundary=False)
1853
+
1854
+ for boundary in ['even', 'odd', 'constant', 'zeros']:
1855
+ _, _, zz_ext = stft(x, nperseg=nperseg, noverlap=noverlap,
1856
+ window=window, detrend=None, padded=True,
1857
+ boundary=boundary)
1858
+
1859
+ _, xr_ext = istft(zz_ext, noverlap=noverlap, window=window,
1860
+ boundary=True)
1861
+
1862
+ msg = f'{window}, {noverlap}, {boundary}'
1863
+ assert_allclose(x, xr, err_msg=msg)
1864
+ assert_allclose(x, xr_ext, err_msg=msg)
1865
+
1866
+ def test_roundtrip_padded_signal(self):
1867
+ rng = np.random.RandomState(1234)
1868
+
1869
+ settings = [
1870
+ ('boxcar', 101, 10, 0),
1871
+ ('hann', 1000, 256, 128),
1872
+ ]
1873
+
1874
+ for window, N, nperseg, noverlap in settings:
1875
+ t = np.arange(N)
1876
+ x = 10*rng.randn(t.size)
1877
+
1878
+ _, _, zz = stft(x, nperseg=nperseg, noverlap=noverlap,
1879
+ window=window, detrend=None, padded=True)
1880
+
1881
+ tr, xr = istft(zz, noverlap=noverlap, window=window)
1882
+
1883
+ msg = f'{window}, {noverlap}'
1884
+ # Account for possible zero-padding at the end
1885
+ assert_allclose(t, tr[:t.size], err_msg=msg)
1886
+ assert_allclose(x, xr[:x.size], err_msg=msg)
1887
+
1888
+ def test_roundtrip_padded_FFT(self):
1889
+ rng = np.random.RandomState(1234)
1890
+
1891
+ settings = [
1892
+ ('hann', 1024, 256, 128, 512),
1893
+ ('hann', 1024, 256, 128, 501),
1894
+ ('boxcar', 100, 10, 0, 33),
1895
+ (('tukey', 0.5), 1152, 256, 64, 1024),
1896
+ ]
1897
+
1898
+ for window, N, nperseg, noverlap, nfft in settings:
1899
+ t = np.arange(N)
1900
+ x = 10*rng.randn(t.size)
1901
+ xc = x*np.exp(1j*np.pi/4)
1902
+
1903
+ # real signal
1904
+ _, _, z = stft(x, nperseg=nperseg, noverlap=noverlap, nfft=nfft,
1905
+ window=window, detrend=None, padded=True)
1906
+
1907
+ # complex signal
1908
+ _, _, zc = stft(xc, nperseg=nperseg, noverlap=noverlap, nfft=nfft,
1909
+ window=window, detrend=None, padded=True,
1910
+ return_onesided=False)
1911
+
1912
+ tr, xr = istft(z, nperseg=nperseg, noverlap=noverlap, nfft=nfft,
1913
+ window=window)
1914
+
1915
+ tr, xcr = istft(zc, nperseg=nperseg, noverlap=noverlap, nfft=nfft,
1916
+ window=window, input_onesided=False)
1917
+
1918
+ msg = f'{window}, {noverlap}'
1919
+ assert_allclose(t, tr, err_msg=msg)
1920
+ assert_allclose(x, xr, err_msg=msg)
1921
+ assert_allclose(xc, xcr, err_msg=msg)
1922
+
1923
+ def test_axis_rolling(self):
1924
+ rng = np.random.RandomState(1234)
1925
+
1926
+ x_flat = rng.randn(1024)
1927
+ _, _, z_flat = stft(x_flat)
1928
+
1929
+ for a in range(3):
1930
+ newshape = [1,]*3
1931
+ newshape[a] = -1
1932
+ x = x_flat.reshape(newshape)
1933
+
1934
+ _, _, z_plus = stft(x, axis=a) # Positive axis index
1935
+ _, _, z_minus = stft(x, axis=a-x.ndim) # Negative axis index
1936
+
1937
+ assert_equal(z_flat, z_plus.squeeze(), err_msg=a)
1938
+ assert_equal(z_flat, z_minus.squeeze(), err_msg=a-x.ndim)
1939
+
1940
+ # z_flat has shape [n_freq, n_time]
1941
+
1942
+ # Test vs. transpose
1943
+ _, x_transpose_m = istft(z_flat.T, time_axis=-2, freq_axis=-1)
1944
+ _, x_transpose_p = istft(z_flat.T, time_axis=0, freq_axis=1)
1945
+
1946
+ assert_allclose(x_flat, x_transpose_m, err_msg='istft transpose minus')
1947
+ assert_allclose(x_flat, x_transpose_p, err_msg='istft transpose plus')
1948
+
1949
+ def test_roundtrip_scaling(self):
1950
+ """Verify behavior of scaling parameter. """
1951
+ # Create 1024 sample cosine signal with amplitude 2:
1952
+ X = np.zeros(513, dtype=complex)
1953
+ X[256] = 1024
1954
+ x = np.fft.irfft(X)
1955
+ power_x = sum(x**2) / len(x) # power of signal x is 2
1956
+
1957
+ # Calculate magnitude-scaled STFT:
1958
+ Zs = stft(x, boundary='even', scaling='spectrum')[2]
1959
+
1960
+ # Test round trip:
1961
+ x1 = istft(Zs, boundary=True, scaling='spectrum')[1]
1962
+ assert_allclose(x1, x)
1963
+
1964
+ # For a Hann-windowed 256 sample length FFT, we expect a peak at
1965
+ # frequency 64 (since it is 1/4 the length of X) with a height of 1
1966
+ # (half the amplitude). A Hann window of a perfectly centered sine has
1967
+ # the magnitude [..., 0, 0, 0.5, 1, 0.5, 0, 0, ...].
1968
+ # Note that in this case the 'even' padding works for the beginning
1969
+ # but not for the end of the STFT.
1970
+ assert_allclose(abs(Zs[63, :-1]), 0.5)
1971
+ assert_allclose(abs(Zs[64, :-1]), 1)
1972
+ assert_allclose(abs(Zs[65, :-1]), 0.5)
1973
+ # All other values should be zero:
1974
+ Zs[63:66, :-1] = 0
1975
+ # Note since 'rtol' does not have influence here, atol needs to be set:
1976
+ assert_allclose(Zs[:, :-1], 0, atol=np.finfo(Zs.dtype).resolution)
1977
+
1978
+ # Calculate two-sided psd-scaled STFT:
1979
+ # - using 'even' padding since signal is axis symmetric - this ensures
1980
+ # stationary behavior on the boundaries
1981
+ # - using the two-sided transform allows determining the spectral
1982
+ # power by `sum(abs(Zp[:, k])**2) / len(f)` for the k-th time slot.
1983
+ Zp = stft(x, return_onesided=False, boundary='even', scaling='psd')[2]
1984
+
1985
+ # Calculate spectral power of Zd by summing over the frequency axis:
1986
+ psd_Zp = np.sum(Zp.real**2 + Zp.imag**2, axis=0) / Zp.shape[0]
1987
+ # Spectral power of Zp should be equal to the signal's power:
1988
+ assert_allclose(psd_Zp, power_x)
1989
+
1990
+ # Test round trip:
1991
+ x1 = istft(Zp, input_onesided=False, boundary=True, scaling='psd')[1]
1992
+ assert_allclose(x1, x)
1993
+
1994
+ # The power of the one-sided psd-scaled STFT can be determined
1995
+ # analogously (note that the two sides are not of equal shape):
1996
+ Zp0 = stft(x, return_onesided=True, boundary='even', scaling='psd')[2]
1997
+
1998
+ # Since x is real, its Fourier transform is conjugate symmetric, i.e.,
1999
+ # the missing 'second side' can be expressed through the 'first side':
2000
+ Zp1 = np.conj(Zp0[-2:0:-1, :]) # 'second side' is conjugate reversed
2001
+ assert_allclose(Zp[:129, :], Zp0)
2002
+ assert_allclose(Zp[129:, :], Zp1)
2003
+
2004
+ # Calculate the spectral power:
2005
+ s2 = (np.sum(Zp0.real ** 2 + Zp0.imag ** 2, axis=0) +
2006
+ np.sum(Zp1.real ** 2 + Zp1.imag ** 2, axis=0))
2007
+ psd_Zp01 = s2 / (Zp0.shape[0] + Zp1.shape[0])
2008
+ assert_allclose(psd_Zp01, power_x)
2009
+
2010
+ # Test round trip:
2011
+ x1 = istft(Zp0, input_onesided=True, boundary=True, scaling='psd')[1]
2012
+ assert_allclose(x1, x)
2013
+
2014
+
2015
+ class TestSampledSpectralRepresentations:
2016
+ """Check energy/power relations from `Spectral Analysis` section in the user guide.
2017
+
2018
+ A 32 sample cosine signal is used to compare the numerical to the expected results
2019
+ stated in :ref:`tutorial_SpectralAnalysis` in
2020
+ file ``doc/source/tutorial/signal.rst``
2021
+ """
2022
+ n: int = 32 #: number of samples
2023
+ T: float = 1/16 #: sampling interval
2024
+ a_ref: float = 3 #: amplitude of reference
2025
+ l_a: int = 3 #: index in fft for defining frequency of test signal
2026
+
2027
+ x_ref: np.ndarray #: reference signal
2028
+ X_ref: np.ndarray #: two-sided FFT of x_ref
2029
+ E_ref: float #: energy of signal
2030
+ P_ref: float #: power of signal
2031
+
2032
+ def setup_method(self):
2033
+ """Create Cosine signal with amplitude a from spectrum. """
2034
+ f = rfftfreq(self.n, self.T)
2035
+ X_ref = np.zeros_like(f)
2036
+ self.l_a = 3
2037
+ X_ref[self.l_a] = self.a_ref/2 * self.n # set amplitude
2038
+ self.x_ref = irfft(X_ref)
2039
+ self.X_ref = fft(self.x_ref)
2040
+
2041
+ # Closed form expression for continuous-time signal:
2042
+ self.E_ref = self.tau * self.a_ref**2 / 2 # energy of signal
2043
+ self.P_ref = self.a_ref**2 / 2 # power of signal
2044
+
2045
+ @property
2046
+ def tau(self) -> float:
2047
+ """Duration of signal. """
2048
+ return self.n * self.T
2049
+
2050
+ @property
2051
+ def delta_f(self) -> float:
2052
+ """Bin width """
2053
+ return 1 / (self.n * self.T)
2054
+
2055
+ def test_reference_signal(self):
2056
+ """Test energy and power formulas. """
2057
+ # Verify that amplitude is a:
2058
+ assert_allclose(2*self.a_ref, np.ptp(self.x_ref), rtol=0.1)
2059
+ # Verify that energy expression for sampled signal:
2060
+ assert_allclose(self.T * sum(self.x_ref ** 2), self.E_ref)
2061
+
2062
+ # Verify that spectral energy and power formulas are correct:
2063
+ sum_X_ref_squared = sum(self.X_ref.real**2 + self.X_ref.imag**2)
2064
+ assert_allclose(self.T/self.n * sum_X_ref_squared, self.E_ref)
2065
+ assert_allclose(1/self.n**2 * sum_X_ref_squared, self.P_ref)
2066
+
2067
+ def test_windowed_DFT(self):
2068
+ """Verify spectral representations of windowed DFT.
2069
+
2070
+ Furthermore, the scalings of `periodogram` and `welch` are verified.
2071
+ """
2072
+ w = hann(self.n, sym=False)
2073
+ c_amp, c_rms = abs(sum(w)), np.sqrt(sum(w.real**2 + w.imag**2))
2074
+ Xw = fft(self.x_ref*w) # unnormalized windowed DFT
2075
+
2076
+ # Verify that the *spectrum* peak is consistent:
2077
+ assert_allclose(self.tau * Xw[self.l_a] / c_amp, self.a_ref * self.tau / 2)
2078
+ # Verify that the *amplitude spectrum* peak is consistent:
2079
+ assert_allclose(Xw[self.l_a] / c_amp, self.a_ref/2)
2080
+
2081
+ # Verify spectral power/energy equals signal's power/energy:
2082
+ X_ESD = self.tau * self.T * abs(Xw / c_rms)**2 # Energy Spectral Density
2083
+ X_PSD = self.T * abs(Xw / c_rms)**2 # Power Spectral Density
2084
+ assert_allclose(self.delta_f * sum(X_ESD), self.E_ref)
2085
+ assert_allclose(self.delta_f * sum(X_PSD), self.P_ref)
2086
+
2087
+ # Verify scalings of periodogram:
2088
+ kw = dict(fs=1/self.T, window=w, detrend=False, return_onesided=False)
2089
+ _, P_mag = periodogram(self.x_ref, scaling='spectrum', **kw)
2090
+ _, P_psd = periodogram(self.x_ref, scaling='density', **kw)
2091
+
2092
+ # Verify that periodogram calculates a squared magnitude spectrum:
2093
+ float_res = np.finfo(P_mag.dtype).resolution
2094
+ assert_allclose(P_mag, abs(Xw/c_amp)**2, atol=float_res*max(P_mag))
2095
+ # Verify that periodogram calculates a PSD:
2096
+ assert_allclose(P_psd, X_PSD, atol=float_res*max(P_psd))
2097
+
2098
+ # Ensure that scaling of welch is the same as of periodogram:
2099
+ kw = dict(nperseg=len(self.x_ref), noverlap=0, **kw)
2100
+ assert_allclose(welch(self.x_ref, scaling='spectrum', **kw)[1], P_mag,
2101
+ atol=float_res*max(P_mag))
2102
+ assert_allclose(welch(self.x_ref, scaling='density', **kw)[1], P_psd,
2103
+ atol=float_res*max(P_psd))