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