scipy 1.16.2__cp311-cp311-win_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1530) hide show
  1. scipy/__config__.py +161 -0
  2. scipy/__init__.py +150 -0
  3. scipy/_cyutility.cp311-win_arm64.lib +0 -0
  4. scipy/_cyutility.cp311-win_arm64.pyd +0 -0
  5. scipy/_distributor_init.py +18 -0
  6. scipy/_lib/__init__.py +14 -0
  7. scipy/_lib/_array_api.py +931 -0
  8. scipy/_lib/_array_api_compat_vendor.py +9 -0
  9. scipy/_lib/_array_api_no_0d.py +103 -0
  10. scipy/_lib/_bunch.py +229 -0
  11. scipy/_lib/_ccallback.py +251 -0
  12. scipy/_lib/_ccallback_c.cp311-win_arm64.lib +0 -0
  13. scipy/_lib/_ccallback_c.cp311-win_arm64.pyd +0 -0
  14. scipy/_lib/_disjoint_set.py +254 -0
  15. scipy/_lib/_docscrape.py +761 -0
  16. scipy/_lib/_elementwise_iterative_method.py +346 -0
  17. scipy/_lib/_fpumode.cp311-win_arm64.lib +0 -0
  18. scipy/_lib/_fpumode.cp311-win_arm64.pyd +0 -0
  19. scipy/_lib/_gcutils.py +105 -0
  20. scipy/_lib/_pep440.py +487 -0
  21. scipy/_lib/_sparse.py +41 -0
  22. scipy/_lib/_test_ccallback.cp311-win_arm64.lib +0 -0
  23. scipy/_lib/_test_ccallback.cp311-win_arm64.pyd +0 -0
  24. scipy/_lib/_test_deprecation_call.cp311-win_arm64.lib +0 -0
  25. scipy/_lib/_test_deprecation_call.cp311-win_arm64.pyd +0 -0
  26. scipy/_lib/_test_deprecation_def.cp311-win_arm64.lib +0 -0
  27. scipy/_lib/_test_deprecation_def.cp311-win_arm64.pyd +0 -0
  28. scipy/_lib/_testutils.py +373 -0
  29. scipy/_lib/_threadsafety.py +58 -0
  30. scipy/_lib/_tmpdirs.py +86 -0
  31. scipy/_lib/_uarray/LICENSE +29 -0
  32. scipy/_lib/_uarray/__init__.py +116 -0
  33. scipy/_lib/_uarray/_backend.py +707 -0
  34. scipy/_lib/_uarray/_uarray.cp311-win_arm64.lib +0 -0
  35. scipy/_lib/_uarray/_uarray.cp311-win_arm64.pyd +0 -0
  36. scipy/_lib/_util.py +1283 -0
  37. scipy/_lib/array_api_compat/__init__.py +22 -0
  38. scipy/_lib/array_api_compat/_internal.py +59 -0
  39. scipy/_lib/array_api_compat/common/__init__.py +1 -0
  40. scipy/_lib/array_api_compat/common/_aliases.py +727 -0
  41. scipy/_lib/array_api_compat/common/_fft.py +213 -0
  42. scipy/_lib/array_api_compat/common/_helpers.py +1058 -0
  43. scipy/_lib/array_api_compat/common/_linalg.py +232 -0
  44. scipy/_lib/array_api_compat/common/_typing.py +192 -0
  45. scipy/_lib/array_api_compat/cupy/__init__.py +13 -0
  46. scipy/_lib/array_api_compat/cupy/_aliases.py +156 -0
  47. scipy/_lib/array_api_compat/cupy/_info.py +336 -0
  48. scipy/_lib/array_api_compat/cupy/_typing.py +31 -0
  49. scipy/_lib/array_api_compat/cupy/fft.py +36 -0
  50. scipy/_lib/array_api_compat/cupy/linalg.py +49 -0
  51. scipy/_lib/array_api_compat/dask/__init__.py +0 -0
  52. scipy/_lib/array_api_compat/dask/array/__init__.py +12 -0
  53. scipy/_lib/array_api_compat/dask/array/_aliases.py +376 -0
  54. scipy/_lib/array_api_compat/dask/array/_info.py +416 -0
  55. scipy/_lib/array_api_compat/dask/array/fft.py +21 -0
  56. scipy/_lib/array_api_compat/dask/array/linalg.py +72 -0
  57. scipy/_lib/array_api_compat/numpy/__init__.py +28 -0
  58. scipy/_lib/array_api_compat/numpy/_aliases.py +190 -0
  59. scipy/_lib/array_api_compat/numpy/_info.py +366 -0
  60. scipy/_lib/array_api_compat/numpy/_typing.py +30 -0
  61. scipy/_lib/array_api_compat/numpy/fft.py +35 -0
  62. scipy/_lib/array_api_compat/numpy/linalg.py +143 -0
  63. scipy/_lib/array_api_compat/torch/__init__.py +22 -0
  64. scipy/_lib/array_api_compat/torch/_aliases.py +855 -0
  65. scipy/_lib/array_api_compat/torch/_info.py +369 -0
  66. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  67. scipy/_lib/array_api_compat/torch/fft.py +85 -0
  68. scipy/_lib/array_api_compat/torch/linalg.py +121 -0
  69. scipy/_lib/array_api_extra/__init__.py +38 -0
  70. scipy/_lib/array_api_extra/_delegation.py +171 -0
  71. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  72. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  73. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  74. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  75. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  76. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  77. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  78. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  79. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  80. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  81. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  82. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  83. scipy/_lib/array_api_extra/testing.py +359 -0
  84. scipy/_lib/cobyqa/__init__.py +20 -0
  85. scipy/_lib/cobyqa/framework.py +1240 -0
  86. scipy/_lib/cobyqa/main.py +1506 -0
  87. scipy/_lib/cobyqa/models.py +1529 -0
  88. scipy/_lib/cobyqa/problem.py +1296 -0
  89. scipy/_lib/cobyqa/settings.py +132 -0
  90. scipy/_lib/cobyqa/subsolvers/__init__.py +14 -0
  91. scipy/_lib/cobyqa/subsolvers/geometry.py +387 -0
  92. scipy/_lib/cobyqa/subsolvers/optim.py +1203 -0
  93. scipy/_lib/cobyqa/utils/__init__.py +18 -0
  94. scipy/_lib/cobyqa/utils/exceptions.py +22 -0
  95. scipy/_lib/cobyqa/utils/math.py +77 -0
  96. scipy/_lib/cobyqa/utils/versions.py +67 -0
  97. scipy/_lib/decorator.py +399 -0
  98. scipy/_lib/deprecation.py +274 -0
  99. scipy/_lib/doccer.py +366 -0
  100. scipy/_lib/messagestream.cp311-win_arm64.lib +0 -0
  101. scipy/_lib/messagestream.cp311-win_arm64.pyd +0 -0
  102. scipy/_lib/pyprima/__init__.py +212 -0
  103. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  104. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  105. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  106. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  107. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  108. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  109. scipy/_lib/pyprima/cobyla/update.py +289 -0
  110. scipy/_lib/pyprima/common/__init__.py +0 -0
  111. scipy/_lib/pyprima/common/_bounds.py +34 -0
  112. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  113. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  114. scipy/_lib/pyprima/common/_project.py +173 -0
  115. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  116. scipy/_lib/pyprima/common/consts.py +47 -0
  117. scipy/_lib/pyprima/common/evaluate.py +99 -0
  118. scipy/_lib/pyprima/common/history.py +38 -0
  119. scipy/_lib/pyprima/common/infos.py +30 -0
  120. scipy/_lib/pyprima/common/linalg.py +435 -0
  121. scipy/_lib/pyprima/common/message.py +290 -0
  122. scipy/_lib/pyprima/common/powalg.py +131 -0
  123. scipy/_lib/pyprima/common/preproc.py +277 -0
  124. scipy/_lib/pyprima/common/present.py +5 -0
  125. scipy/_lib/pyprima/common/ratio.py +54 -0
  126. scipy/_lib/pyprima/common/redrho.py +47 -0
  127. scipy/_lib/pyprima/common/selectx.py +296 -0
  128. scipy/_lib/tests/__init__.py +0 -0
  129. scipy/_lib/tests/test__gcutils.py +110 -0
  130. scipy/_lib/tests/test__pep440.py +67 -0
  131. scipy/_lib/tests/test__testutils.py +32 -0
  132. scipy/_lib/tests/test__threadsafety.py +51 -0
  133. scipy/_lib/tests/test__util.py +641 -0
  134. scipy/_lib/tests/test_array_api.py +322 -0
  135. scipy/_lib/tests/test_bunch.py +169 -0
  136. scipy/_lib/tests/test_ccallback.py +196 -0
  137. scipy/_lib/tests/test_config.py +45 -0
  138. scipy/_lib/tests/test_deprecation.py +10 -0
  139. scipy/_lib/tests/test_doccer.py +143 -0
  140. scipy/_lib/tests/test_import_cycles.py +18 -0
  141. scipy/_lib/tests/test_public_api.py +482 -0
  142. scipy/_lib/tests/test_scipy_version.py +28 -0
  143. scipy/_lib/tests/test_tmpdirs.py +48 -0
  144. scipy/_lib/tests/test_warnings.py +137 -0
  145. scipy/_lib/uarray.py +31 -0
  146. scipy/cluster/__init__.py +31 -0
  147. scipy/cluster/_hierarchy.cp311-win_arm64.lib +0 -0
  148. scipy/cluster/_hierarchy.cp311-win_arm64.pyd +0 -0
  149. scipy/cluster/_optimal_leaf_ordering.cp311-win_arm64.lib +0 -0
  150. scipy/cluster/_optimal_leaf_ordering.cp311-win_arm64.pyd +0 -0
  151. scipy/cluster/_vq.cp311-win_arm64.lib +0 -0
  152. scipy/cluster/_vq.cp311-win_arm64.pyd +0 -0
  153. scipy/cluster/hierarchy.py +4348 -0
  154. scipy/cluster/tests/__init__.py +0 -0
  155. scipy/cluster/tests/hierarchy_test_data.py +145 -0
  156. scipy/cluster/tests/test_disjoint_set.py +202 -0
  157. scipy/cluster/tests/test_hierarchy.py +1238 -0
  158. scipy/cluster/tests/test_vq.py +434 -0
  159. scipy/cluster/vq.py +832 -0
  160. scipy/conftest.py +683 -0
  161. scipy/constants/__init__.py +358 -0
  162. scipy/constants/_codata.py +2266 -0
  163. scipy/constants/_constants.py +369 -0
  164. scipy/constants/codata.py +21 -0
  165. scipy/constants/constants.py +53 -0
  166. scipy/constants/tests/__init__.py +0 -0
  167. scipy/constants/tests/test_codata.py +78 -0
  168. scipy/constants/tests/test_constants.py +83 -0
  169. scipy/datasets/__init__.py +90 -0
  170. scipy/datasets/_download_all.py +71 -0
  171. scipy/datasets/_fetchers.py +225 -0
  172. scipy/datasets/_registry.py +26 -0
  173. scipy/datasets/_utils.py +81 -0
  174. scipy/datasets/tests/__init__.py +0 -0
  175. scipy/datasets/tests/test_data.py +128 -0
  176. scipy/differentiate/__init__.py +27 -0
  177. scipy/differentiate/_differentiate.py +1129 -0
  178. scipy/differentiate/tests/__init__.py +0 -0
  179. scipy/differentiate/tests/test_differentiate.py +694 -0
  180. scipy/fft/__init__.py +114 -0
  181. scipy/fft/_backend.py +196 -0
  182. scipy/fft/_basic.py +1650 -0
  183. scipy/fft/_basic_backend.py +197 -0
  184. scipy/fft/_debug_backends.py +22 -0
  185. scipy/fft/_fftlog.py +223 -0
  186. scipy/fft/_fftlog_backend.py +200 -0
  187. scipy/fft/_helper.py +348 -0
  188. scipy/fft/_pocketfft/LICENSE.md +25 -0
  189. scipy/fft/_pocketfft/__init__.py +9 -0
  190. scipy/fft/_pocketfft/basic.py +251 -0
  191. scipy/fft/_pocketfft/helper.py +249 -0
  192. scipy/fft/_pocketfft/pypocketfft.cp311-win_arm64.lib +0 -0
  193. scipy/fft/_pocketfft/pypocketfft.cp311-win_arm64.pyd +0 -0
  194. scipy/fft/_pocketfft/realtransforms.py +109 -0
  195. scipy/fft/_pocketfft/tests/__init__.py +0 -0
  196. scipy/fft/_pocketfft/tests/test_basic.py +1011 -0
  197. scipy/fft/_pocketfft/tests/test_real_transforms.py +505 -0
  198. scipy/fft/_realtransforms.py +706 -0
  199. scipy/fft/_realtransforms_backend.py +63 -0
  200. scipy/fft/tests/__init__.py +0 -0
  201. scipy/fft/tests/mock_backend.py +96 -0
  202. scipy/fft/tests/test_backend.py +98 -0
  203. scipy/fft/tests/test_basic.py +504 -0
  204. scipy/fft/tests/test_fftlog.py +215 -0
  205. scipy/fft/tests/test_helper.py +558 -0
  206. scipy/fft/tests/test_multithreading.py +84 -0
  207. scipy/fft/tests/test_real_transforms.py +247 -0
  208. scipy/fftpack/__init__.py +103 -0
  209. scipy/fftpack/_basic.py +428 -0
  210. scipy/fftpack/_helper.py +115 -0
  211. scipy/fftpack/_pseudo_diffs.py +554 -0
  212. scipy/fftpack/_realtransforms.py +598 -0
  213. scipy/fftpack/basic.py +20 -0
  214. scipy/fftpack/convolve.cp311-win_arm64.lib +0 -0
  215. scipy/fftpack/convolve.cp311-win_arm64.pyd +0 -0
  216. scipy/fftpack/helper.py +19 -0
  217. scipy/fftpack/pseudo_diffs.py +22 -0
  218. scipy/fftpack/realtransforms.py +19 -0
  219. scipy/fftpack/tests/__init__.py +0 -0
  220. scipy/fftpack/tests/fftw_double_ref.npz +0 -0
  221. scipy/fftpack/tests/fftw_longdouble_ref.npz +0 -0
  222. scipy/fftpack/tests/fftw_single_ref.npz +0 -0
  223. scipy/fftpack/tests/test.npz +0 -0
  224. scipy/fftpack/tests/test_basic.py +877 -0
  225. scipy/fftpack/tests/test_helper.py +54 -0
  226. scipy/fftpack/tests/test_import.py +33 -0
  227. scipy/fftpack/tests/test_pseudo_diffs.py +388 -0
  228. scipy/fftpack/tests/test_real_transforms.py +836 -0
  229. scipy/integrate/__init__.py +122 -0
  230. scipy/integrate/_bvp.py +1160 -0
  231. scipy/integrate/_cubature.py +729 -0
  232. scipy/integrate/_dop.cp311-win_arm64.lib +0 -0
  233. scipy/integrate/_dop.cp311-win_arm64.pyd +0 -0
  234. scipy/integrate/_ivp/__init__.py +8 -0
  235. scipy/integrate/_ivp/base.py +290 -0
  236. scipy/integrate/_ivp/bdf.py +478 -0
  237. scipy/integrate/_ivp/common.py +451 -0
  238. scipy/integrate/_ivp/dop853_coefficients.py +193 -0
  239. scipy/integrate/_ivp/ivp.py +755 -0
  240. scipy/integrate/_ivp/lsoda.py +224 -0
  241. scipy/integrate/_ivp/radau.py +572 -0
  242. scipy/integrate/_ivp/rk.py +601 -0
  243. scipy/integrate/_ivp/tests/__init__.py +0 -0
  244. scipy/integrate/_ivp/tests/test_ivp.py +1287 -0
  245. scipy/integrate/_ivp/tests/test_rk.py +37 -0
  246. scipy/integrate/_lebedev.py +5450 -0
  247. scipy/integrate/_lsoda.cp311-win_arm64.lib +0 -0
  248. scipy/integrate/_lsoda.cp311-win_arm64.pyd +0 -0
  249. scipy/integrate/_ode.py +1395 -0
  250. scipy/integrate/_odepack.cp311-win_arm64.lib +0 -0
  251. scipy/integrate/_odepack.cp311-win_arm64.pyd +0 -0
  252. scipy/integrate/_odepack_py.py +273 -0
  253. scipy/integrate/_quad_vec.py +674 -0
  254. scipy/integrate/_quadpack.cp311-win_arm64.lib +0 -0
  255. scipy/integrate/_quadpack.cp311-win_arm64.pyd +0 -0
  256. scipy/integrate/_quadpack_py.py +1283 -0
  257. scipy/integrate/_quadrature.py +1336 -0
  258. scipy/integrate/_rules/__init__.py +12 -0
  259. scipy/integrate/_rules/_base.py +518 -0
  260. scipy/integrate/_rules/_gauss_kronrod.py +202 -0
  261. scipy/integrate/_rules/_gauss_legendre.py +62 -0
  262. scipy/integrate/_rules/_genz_malik.py +210 -0
  263. scipy/integrate/_tanhsinh.py +1385 -0
  264. scipy/integrate/_test_multivariate.cp311-win_arm64.lib +0 -0
  265. scipy/integrate/_test_multivariate.cp311-win_arm64.pyd +0 -0
  266. scipy/integrate/_test_odeint_banded.cp311-win_arm64.lib +0 -0
  267. scipy/integrate/_test_odeint_banded.cp311-win_arm64.pyd +0 -0
  268. scipy/integrate/_vode.cp311-win_arm64.lib +0 -0
  269. scipy/integrate/_vode.cp311-win_arm64.pyd +0 -0
  270. scipy/integrate/dop.py +15 -0
  271. scipy/integrate/lsoda.py +15 -0
  272. scipy/integrate/odepack.py +17 -0
  273. scipy/integrate/quadpack.py +23 -0
  274. scipy/integrate/tests/__init__.py +0 -0
  275. scipy/integrate/tests/test__quad_vec.py +211 -0
  276. scipy/integrate/tests/test_banded_ode_solvers.py +305 -0
  277. scipy/integrate/tests/test_bvp.py +714 -0
  278. scipy/integrate/tests/test_cubature.py +1375 -0
  279. scipy/integrate/tests/test_integrate.py +840 -0
  280. scipy/integrate/tests/test_odeint_jac.py +74 -0
  281. scipy/integrate/tests/test_quadpack.py +680 -0
  282. scipy/integrate/tests/test_quadrature.py +730 -0
  283. scipy/integrate/tests/test_tanhsinh.py +1171 -0
  284. scipy/integrate/vode.py +15 -0
  285. scipy/interpolate/__init__.py +228 -0
  286. scipy/interpolate/_bary_rational.py +715 -0
  287. scipy/interpolate/_bsplines.py +2469 -0
  288. scipy/interpolate/_cubic.py +973 -0
  289. scipy/interpolate/_dfitpack.cp311-win_arm64.lib +0 -0
  290. scipy/interpolate/_dfitpack.cp311-win_arm64.pyd +0 -0
  291. scipy/interpolate/_dierckx.cp311-win_arm64.lib +0 -0
  292. scipy/interpolate/_dierckx.cp311-win_arm64.pyd +0 -0
  293. scipy/interpolate/_fitpack.cp311-win_arm64.lib +0 -0
  294. scipy/interpolate/_fitpack.cp311-win_arm64.pyd +0 -0
  295. scipy/interpolate/_fitpack2.py +2397 -0
  296. scipy/interpolate/_fitpack_impl.py +811 -0
  297. scipy/interpolate/_fitpack_py.py +898 -0
  298. scipy/interpolate/_fitpack_repro.py +996 -0
  299. scipy/interpolate/_interpnd.cp311-win_arm64.lib +0 -0
  300. scipy/interpolate/_interpnd.cp311-win_arm64.pyd +0 -0
  301. scipy/interpolate/_interpolate.py +2266 -0
  302. scipy/interpolate/_ndbspline.py +415 -0
  303. scipy/interpolate/_ndgriddata.py +329 -0
  304. scipy/interpolate/_pade.py +67 -0
  305. scipy/interpolate/_polyint.py +1025 -0
  306. scipy/interpolate/_ppoly.cp311-win_arm64.lib +0 -0
  307. scipy/interpolate/_ppoly.cp311-win_arm64.pyd +0 -0
  308. scipy/interpolate/_rbf.py +290 -0
  309. scipy/interpolate/_rbfinterp.py +550 -0
  310. scipy/interpolate/_rbfinterp_pythran.cp311-win_arm64.lib +0 -0
  311. scipy/interpolate/_rbfinterp_pythran.cp311-win_arm64.pyd +0 -0
  312. scipy/interpolate/_rgi.py +764 -0
  313. scipy/interpolate/_rgi_cython.cp311-win_arm64.lib +0 -0
  314. scipy/interpolate/_rgi_cython.cp311-win_arm64.pyd +0 -0
  315. scipy/interpolate/dfitpack.py +24 -0
  316. scipy/interpolate/fitpack.py +31 -0
  317. scipy/interpolate/fitpack2.py +29 -0
  318. scipy/interpolate/interpnd.py +24 -0
  319. scipy/interpolate/interpolate.py +30 -0
  320. scipy/interpolate/ndgriddata.py +23 -0
  321. scipy/interpolate/polyint.py +24 -0
  322. scipy/interpolate/rbf.py +18 -0
  323. scipy/interpolate/tests/__init__.py +0 -0
  324. scipy/interpolate/tests/data/bug-1310.npz +0 -0
  325. scipy/interpolate/tests/data/estimate_gradients_hang.npy +0 -0
  326. scipy/interpolate/tests/data/gcvspl.npz +0 -0
  327. scipy/interpolate/tests/test_bary_rational.py +368 -0
  328. scipy/interpolate/tests/test_bsplines.py +3754 -0
  329. scipy/interpolate/tests/test_fitpack.py +519 -0
  330. scipy/interpolate/tests/test_fitpack2.py +1431 -0
  331. scipy/interpolate/tests/test_gil.py +64 -0
  332. scipy/interpolate/tests/test_interpnd.py +452 -0
  333. scipy/interpolate/tests/test_interpolate.py +2630 -0
  334. scipy/interpolate/tests/test_ndgriddata.py +308 -0
  335. scipy/interpolate/tests/test_pade.py +107 -0
  336. scipy/interpolate/tests/test_polyint.py +972 -0
  337. scipy/interpolate/tests/test_rbf.py +246 -0
  338. scipy/interpolate/tests/test_rbfinterp.py +534 -0
  339. scipy/interpolate/tests/test_rgi.py +1151 -0
  340. scipy/io/__init__.py +116 -0
  341. scipy/io/_fast_matrix_market/__init__.py +600 -0
  342. scipy/io/_fast_matrix_market/_fmm_core.cp311-win_arm64.lib +0 -0
  343. scipy/io/_fast_matrix_market/_fmm_core.cp311-win_arm64.pyd +0 -0
  344. scipy/io/_fortran.py +354 -0
  345. scipy/io/_harwell_boeing/__init__.py +7 -0
  346. scipy/io/_harwell_boeing/_fortran_format_parser.py +316 -0
  347. scipy/io/_harwell_boeing/hb.py +571 -0
  348. scipy/io/_harwell_boeing/tests/__init__.py +0 -0
  349. scipy/io/_harwell_boeing/tests/test_fortran_format.py +74 -0
  350. scipy/io/_harwell_boeing/tests/test_hb.py +70 -0
  351. scipy/io/_idl.py +917 -0
  352. scipy/io/_mmio.py +968 -0
  353. scipy/io/_netcdf.py +1104 -0
  354. scipy/io/_test_fortran.cp311-win_arm64.lib +0 -0
  355. scipy/io/_test_fortran.cp311-win_arm64.pyd +0 -0
  356. scipy/io/arff/__init__.py +28 -0
  357. scipy/io/arff/_arffread.py +873 -0
  358. scipy/io/arff/arffread.py +19 -0
  359. scipy/io/arff/tests/__init__.py +0 -0
  360. scipy/io/arff/tests/data/iris.arff +225 -0
  361. scipy/io/arff/tests/data/missing.arff +8 -0
  362. scipy/io/arff/tests/data/nodata.arff +11 -0
  363. scipy/io/arff/tests/data/quoted_nominal.arff +13 -0
  364. scipy/io/arff/tests/data/quoted_nominal_spaces.arff +13 -0
  365. scipy/io/arff/tests/data/test1.arff +10 -0
  366. scipy/io/arff/tests/data/test10.arff +8 -0
  367. scipy/io/arff/tests/data/test11.arff +11 -0
  368. scipy/io/arff/tests/data/test2.arff +15 -0
  369. scipy/io/arff/tests/data/test3.arff +6 -0
  370. scipy/io/arff/tests/data/test4.arff +11 -0
  371. scipy/io/arff/tests/data/test5.arff +26 -0
  372. scipy/io/arff/tests/data/test6.arff +12 -0
  373. scipy/io/arff/tests/data/test7.arff +15 -0
  374. scipy/io/arff/tests/data/test8.arff +12 -0
  375. scipy/io/arff/tests/data/test9.arff +14 -0
  376. scipy/io/arff/tests/test_arffread.py +421 -0
  377. scipy/io/harwell_boeing.py +17 -0
  378. scipy/io/idl.py +17 -0
  379. scipy/io/matlab/__init__.py +66 -0
  380. scipy/io/matlab/_byteordercodes.py +75 -0
  381. scipy/io/matlab/_mio.py +375 -0
  382. scipy/io/matlab/_mio4.py +632 -0
  383. scipy/io/matlab/_mio5.py +901 -0
  384. scipy/io/matlab/_mio5_params.py +281 -0
  385. scipy/io/matlab/_mio5_utils.cp311-win_arm64.lib +0 -0
  386. scipy/io/matlab/_mio5_utils.cp311-win_arm64.pyd +0 -0
  387. scipy/io/matlab/_mio_utils.cp311-win_arm64.lib +0 -0
  388. scipy/io/matlab/_mio_utils.cp311-win_arm64.pyd +0 -0
  389. scipy/io/matlab/_miobase.py +435 -0
  390. scipy/io/matlab/_streams.cp311-win_arm64.lib +0 -0
  391. scipy/io/matlab/_streams.cp311-win_arm64.pyd +0 -0
  392. scipy/io/matlab/byteordercodes.py +17 -0
  393. scipy/io/matlab/mio.py +16 -0
  394. scipy/io/matlab/mio4.py +17 -0
  395. scipy/io/matlab/mio5.py +19 -0
  396. scipy/io/matlab/mio5_params.py +18 -0
  397. scipy/io/matlab/mio5_utils.py +17 -0
  398. scipy/io/matlab/mio_utils.py +17 -0
  399. scipy/io/matlab/miobase.py +16 -0
  400. scipy/io/matlab/streams.py +16 -0
  401. scipy/io/matlab/tests/__init__.py +0 -0
  402. scipy/io/matlab/tests/data/bad_miuint32.mat +0 -0
  403. scipy/io/matlab/tests/data/bad_miutf8_array_name.mat +0 -0
  404. scipy/io/matlab/tests/data/big_endian.mat +0 -0
  405. scipy/io/matlab/tests/data/broken_utf8.mat +0 -0
  406. scipy/io/matlab/tests/data/corrupted_zlib_checksum.mat +0 -0
  407. scipy/io/matlab/tests/data/corrupted_zlib_data.mat +0 -0
  408. scipy/io/matlab/tests/data/debigged_m4.mat +0 -0
  409. scipy/io/matlab/tests/data/japanese_utf8.txt +5 -0
  410. scipy/io/matlab/tests/data/little_endian.mat +0 -0
  411. scipy/io/matlab/tests/data/logical_sparse.mat +0 -0
  412. scipy/io/matlab/tests/data/malformed1.mat +0 -0
  413. scipy/io/matlab/tests/data/miuint32_for_miint32.mat +0 -0
  414. scipy/io/matlab/tests/data/miutf8_array_name.mat +0 -0
  415. scipy/io/matlab/tests/data/nasty_duplicate_fieldnames.mat +0 -0
  416. scipy/io/matlab/tests/data/one_by_zero_char.mat +0 -0
  417. scipy/io/matlab/tests/data/parabola.mat +0 -0
  418. scipy/io/matlab/tests/data/single_empty_string.mat +0 -0
  419. scipy/io/matlab/tests/data/some_functions.mat +0 -0
  420. scipy/io/matlab/tests/data/sqr.mat +0 -0
  421. scipy/io/matlab/tests/data/test3dmatrix_6.1_SOL2.mat +0 -0
  422. scipy/io/matlab/tests/data/test3dmatrix_6.5.1_GLNX86.mat +0 -0
  423. scipy/io/matlab/tests/data/test3dmatrix_7.1_GLNX86.mat +0 -0
  424. scipy/io/matlab/tests/data/test3dmatrix_7.4_GLNX86.mat +0 -0
  425. scipy/io/matlab/tests/data/test_empty_struct.mat +0 -0
  426. scipy/io/matlab/tests/data/test_mat4_le_floats.mat +0 -0
  427. scipy/io/matlab/tests/data/test_skip_variable.mat +0 -0
  428. scipy/io/matlab/tests/data/testbool_8_WIN64.mat +0 -0
  429. scipy/io/matlab/tests/data/testcell_6.1_SOL2.mat +0 -0
  430. scipy/io/matlab/tests/data/testcell_6.5.1_GLNX86.mat +0 -0
  431. scipy/io/matlab/tests/data/testcell_7.1_GLNX86.mat +0 -0
  432. scipy/io/matlab/tests/data/testcell_7.4_GLNX86.mat +0 -0
  433. scipy/io/matlab/tests/data/testcellnest_6.1_SOL2.mat +0 -0
  434. scipy/io/matlab/tests/data/testcellnest_6.5.1_GLNX86.mat +0 -0
  435. scipy/io/matlab/tests/data/testcellnest_7.1_GLNX86.mat +0 -0
  436. scipy/io/matlab/tests/data/testcellnest_7.4_GLNX86.mat +0 -0
  437. scipy/io/matlab/tests/data/testcomplex_4.2c_SOL2.mat +0 -0
  438. scipy/io/matlab/tests/data/testcomplex_6.1_SOL2.mat +0 -0
  439. scipy/io/matlab/tests/data/testcomplex_6.5.1_GLNX86.mat +0 -0
  440. scipy/io/matlab/tests/data/testcomplex_7.1_GLNX86.mat +0 -0
  441. scipy/io/matlab/tests/data/testcomplex_7.4_GLNX86.mat +0 -0
  442. scipy/io/matlab/tests/data/testdouble_4.2c_SOL2.mat +0 -0
  443. scipy/io/matlab/tests/data/testdouble_6.1_SOL2.mat +0 -0
  444. scipy/io/matlab/tests/data/testdouble_6.5.1_GLNX86.mat +0 -0
  445. scipy/io/matlab/tests/data/testdouble_7.1_GLNX86.mat +0 -0
  446. scipy/io/matlab/tests/data/testdouble_7.4_GLNX86.mat +0 -0
  447. scipy/io/matlab/tests/data/testemptycell_5.3_SOL2.mat +0 -0
  448. scipy/io/matlab/tests/data/testemptycell_6.5.1_GLNX86.mat +0 -0
  449. scipy/io/matlab/tests/data/testemptycell_7.1_GLNX86.mat +0 -0
  450. scipy/io/matlab/tests/data/testemptycell_7.4_GLNX86.mat +0 -0
  451. scipy/io/matlab/tests/data/testfunc_7.4_GLNX86.mat +0 -0
  452. scipy/io/matlab/tests/data/testhdf5_7.4_GLNX86.mat +0 -0
  453. scipy/io/matlab/tests/data/testmatrix_4.2c_SOL2.mat +0 -0
  454. scipy/io/matlab/tests/data/testmatrix_6.1_SOL2.mat +0 -0
  455. scipy/io/matlab/tests/data/testmatrix_6.5.1_GLNX86.mat +0 -0
  456. scipy/io/matlab/tests/data/testmatrix_7.1_GLNX86.mat +0 -0
  457. scipy/io/matlab/tests/data/testmatrix_7.4_GLNX86.mat +0 -0
  458. scipy/io/matlab/tests/data/testminus_4.2c_SOL2.mat +0 -0
  459. scipy/io/matlab/tests/data/testminus_6.1_SOL2.mat +0 -0
  460. scipy/io/matlab/tests/data/testminus_6.5.1_GLNX86.mat +0 -0
  461. scipy/io/matlab/tests/data/testminus_7.1_GLNX86.mat +0 -0
  462. scipy/io/matlab/tests/data/testminus_7.4_GLNX86.mat +0 -0
  463. scipy/io/matlab/tests/data/testmulti_4.2c_SOL2.mat +0 -0
  464. scipy/io/matlab/tests/data/testmulti_7.1_GLNX86.mat +0 -0
  465. scipy/io/matlab/tests/data/testmulti_7.4_GLNX86.mat +0 -0
  466. scipy/io/matlab/tests/data/testobject_6.1_SOL2.mat +0 -0
  467. scipy/io/matlab/tests/data/testobject_6.5.1_GLNX86.mat +0 -0
  468. scipy/io/matlab/tests/data/testobject_7.1_GLNX86.mat +0 -0
  469. scipy/io/matlab/tests/data/testobject_7.4_GLNX86.mat +0 -0
  470. scipy/io/matlab/tests/data/testonechar_4.2c_SOL2.mat +0 -0
  471. scipy/io/matlab/tests/data/testonechar_6.1_SOL2.mat +0 -0
  472. scipy/io/matlab/tests/data/testonechar_6.5.1_GLNX86.mat +0 -0
  473. scipy/io/matlab/tests/data/testonechar_7.1_GLNX86.mat +0 -0
  474. scipy/io/matlab/tests/data/testonechar_7.4_GLNX86.mat +0 -0
  475. scipy/io/matlab/tests/data/testscalarcell_7.4_GLNX86.mat +0 -0
  476. scipy/io/matlab/tests/data/testsimplecell.mat +0 -0
  477. scipy/io/matlab/tests/data/testsparse_4.2c_SOL2.mat +0 -0
  478. scipy/io/matlab/tests/data/testsparse_6.1_SOL2.mat +0 -0
  479. scipy/io/matlab/tests/data/testsparse_6.5.1_GLNX86.mat +0 -0
  480. scipy/io/matlab/tests/data/testsparse_7.1_GLNX86.mat +0 -0
  481. scipy/io/matlab/tests/data/testsparse_7.4_GLNX86.mat +0 -0
  482. scipy/io/matlab/tests/data/testsparsecomplex_4.2c_SOL2.mat +0 -0
  483. scipy/io/matlab/tests/data/testsparsecomplex_6.1_SOL2.mat +0 -0
  484. scipy/io/matlab/tests/data/testsparsecomplex_6.5.1_GLNX86.mat +0 -0
  485. scipy/io/matlab/tests/data/testsparsecomplex_7.1_GLNX86.mat +0 -0
  486. scipy/io/matlab/tests/data/testsparsecomplex_7.4_GLNX86.mat +0 -0
  487. scipy/io/matlab/tests/data/testsparsefloat_7.4_GLNX86.mat +0 -0
  488. scipy/io/matlab/tests/data/teststring_4.2c_SOL2.mat +0 -0
  489. scipy/io/matlab/tests/data/teststring_6.1_SOL2.mat +0 -0
  490. scipy/io/matlab/tests/data/teststring_6.5.1_GLNX86.mat +0 -0
  491. scipy/io/matlab/tests/data/teststring_7.1_GLNX86.mat +0 -0
  492. scipy/io/matlab/tests/data/teststring_7.4_GLNX86.mat +0 -0
  493. scipy/io/matlab/tests/data/teststringarray_4.2c_SOL2.mat +0 -0
  494. scipy/io/matlab/tests/data/teststringarray_6.1_SOL2.mat +0 -0
  495. scipy/io/matlab/tests/data/teststringarray_6.5.1_GLNX86.mat +0 -0
  496. scipy/io/matlab/tests/data/teststringarray_7.1_GLNX86.mat +0 -0
  497. scipy/io/matlab/tests/data/teststringarray_7.4_GLNX86.mat +0 -0
  498. scipy/io/matlab/tests/data/teststruct_6.1_SOL2.mat +0 -0
  499. scipy/io/matlab/tests/data/teststruct_6.5.1_GLNX86.mat +0 -0
  500. scipy/io/matlab/tests/data/teststruct_7.1_GLNX86.mat +0 -0
  501. scipy/io/matlab/tests/data/teststruct_7.4_GLNX86.mat +0 -0
  502. scipy/io/matlab/tests/data/teststructarr_6.1_SOL2.mat +0 -0
  503. scipy/io/matlab/tests/data/teststructarr_6.5.1_GLNX86.mat +0 -0
  504. scipy/io/matlab/tests/data/teststructarr_7.1_GLNX86.mat +0 -0
  505. scipy/io/matlab/tests/data/teststructarr_7.4_GLNX86.mat +0 -0
  506. scipy/io/matlab/tests/data/teststructnest_6.1_SOL2.mat +0 -0
  507. scipy/io/matlab/tests/data/teststructnest_6.5.1_GLNX86.mat +0 -0
  508. scipy/io/matlab/tests/data/teststructnest_7.1_GLNX86.mat +0 -0
  509. scipy/io/matlab/tests/data/teststructnest_7.4_GLNX86.mat +0 -0
  510. scipy/io/matlab/tests/data/testunicode_7.1_GLNX86.mat +0 -0
  511. scipy/io/matlab/tests/data/testunicode_7.4_GLNX86.mat +0 -0
  512. scipy/io/matlab/tests/data/testvec_4_GLNX86.mat +0 -0
  513. scipy/io/matlab/tests/test_byteordercodes.py +29 -0
  514. scipy/io/matlab/tests/test_mio.py +1399 -0
  515. scipy/io/matlab/tests/test_mio5_utils.py +179 -0
  516. scipy/io/matlab/tests/test_mio_funcs.py +51 -0
  517. scipy/io/matlab/tests/test_mio_utils.py +45 -0
  518. scipy/io/matlab/tests/test_miobase.py +32 -0
  519. scipy/io/matlab/tests/test_pathological.py +33 -0
  520. scipy/io/matlab/tests/test_streams.py +241 -0
  521. scipy/io/mmio.py +17 -0
  522. scipy/io/netcdf.py +17 -0
  523. scipy/io/tests/__init__.py +0 -0
  524. scipy/io/tests/data/Transparent Busy.ani +0 -0
  525. scipy/io/tests/data/array_float32_1d.sav +0 -0
  526. scipy/io/tests/data/array_float32_2d.sav +0 -0
  527. scipy/io/tests/data/array_float32_3d.sav +0 -0
  528. scipy/io/tests/data/array_float32_4d.sav +0 -0
  529. scipy/io/tests/data/array_float32_5d.sav +0 -0
  530. scipy/io/tests/data/array_float32_6d.sav +0 -0
  531. scipy/io/tests/data/array_float32_7d.sav +0 -0
  532. scipy/io/tests/data/array_float32_8d.sav +0 -0
  533. scipy/io/tests/data/array_float32_pointer_1d.sav +0 -0
  534. scipy/io/tests/data/array_float32_pointer_2d.sav +0 -0
  535. scipy/io/tests/data/array_float32_pointer_3d.sav +0 -0
  536. scipy/io/tests/data/array_float32_pointer_4d.sav +0 -0
  537. scipy/io/tests/data/array_float32_pointer_5d.sav +0 -0
  538. scipy/io/tests/data/array_float32_pointer_6d.sav +0 -0
  539. scipy/io/tests/data/array_float32_pointer_7d.sav +0 -0
  540. scipy/io/tests/data/array_float32_pointer_8d.sav +0 -0
  541. scipy/io/tests/data/example_1.nc +0 -0
  542. scipy/io/tests/data/example_2.nc +0 -0
  543. scipy/io/tests/data/example_3_maskedvals.nc +0 -0
  544. scipy/io/tests/data/fortran-3x3d-2i.dat +0 -0
  545. scipy/io/tests/data/fortran-mixed.dat +0 -0
  546. scipy/io/tests/data/fortran-sf8-11x1x10.dat +0 -0
  547. scipy/io/tests/data/fortran-sf8-15x10x22.dat +0 -0
  548. scipy/io/tests/data/fortran-sf8-1x1x1.dat +0 -0
  549. scipy/io/tests/data/fortran-sf8-1x1x5.dat +0 -0
  550. scipy/io/tests/data/fortran-sf8-1x1x7.dat +0 -0
  551. scipy/io/tests/data/fortran-sf8-1x3x5.dat +0 -0
  552. scipy/io/tests/data/fortran-si4-11x1x10.dat +0 -0
  553. scipy/io/tests/data/fortran-si4-15x10x22.dat +0 -0
  554. scipy/io/tests/data/fortran-si4-1x1x1.dat +0 -0
  555. scipy/io/tests/data/fortran-si4-1x1x5.dat +0 -0
  556. scipy/io/tests/data/fortran-si4-1x1x7.dat +0 -0
  557. scipy/io/tests/data/fortran-si4-1x3x5.dat +0 -0
  558. scipy/io/tests/data/invalid_pointer.sav +0 -0
  559. scipy/io/tests/data/null_pointer.sav +0 -0
  560. scipy/io/tests/data/scalar_byte.sav +0 -0
  561. scipy/io/tests/data/scalar_byte_descr.sav +0 -0
  562. scipy/io/tests/data/scalar_complex32.sav +0 -0
  563. scipy/io/tests/data/scalar_complex64.sav +0 -0
  564. scipy/io/tests/data/scalar_float32.sav +0 -0
  565. scipy/io/tests/data/scalar_float64.sav +0 -0
  566. scipy/io/tests/data/scalar_heap_pointer.sav +0 -0
  567. scipy/io/tests/data/scalar_int16.sav +0 -0
  568. scipy/io/tests/data/scalar_int32.sav +0 -0
  569. scipy/io/tests/data/scalar_int64.sav +0 -0
  570. scipy/io/tests/data/scalar_string.sav +0 -0
  571. scipy/io/tests/data/scalar_uint16.sav +0 -0
  572. scipy/io/tests/data/scalar_uint32.sav +0 -0
  573. scipy/io/tests/data/scalar_uint64.sav +0 -0
  574. scipy/io/tests/data/struct_arrays.sav +0 -0
  575. scipy/io/tests/data/struct_arrays_byte_idl80.sav +0 -0
  576. scipy/io/tests/data/struct_arrays_replicated.sav +0 -0
  577. scipy/io/tests/data/struct_arrays_replicated_3d.sav +0 -0
  578. scipy/io/tests/data/struct_inherit.sav +0 -0
  579. scipy/io/tests/data/struct_pointer_arrays.sav +0 -0
  580. scipy/io/tests/data/struct_pointer_arrays_replicated.sav +0 -0
  581. scipy/io/tests/data/struct_pointer_arrays_replicated_3d.sav +0 -0
  582. scipy/io/tests/data/struct_pointers.sav +0 -0
  583. scipy/io/tests/data/struct_pointers_replicated.sav +0 -0
  584. scipy/io/tests/data/struct_pointers_replicated_3d.sav +0 -0
  585. scipy/io/tests/data/struct_scalars.sav +0 -0
  586. scipy/io/tests/data/struct_scalars_replicated.sav +0 -0
  587. scipy/io/tests/data/struct_scalars_replicated_3d.sav +0 -0
  588. scipy/io/tests/data/test-1234Hz-le-1ch-10S-20bit-extra.wav +0 -0
  589. scipy/io/tests/data/test-44100Hz-2ch-32bit-float-be.wav +0 -0
  590. scipy/io/tests/data/test-44100Hz-2ch-32bit-float-le.wav +0 -0
  591. scipy/io/tests/data/test-44100Hz-be-1ch-4bytes.wav +0 -0
  592. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-early-eof-no-data.wav +0 -0
  593. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-early-eof.wav +0 -0
  594. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-incomplete-chunk.wav +0 -0
  595. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-rf64.wav +0 -0
  596. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes.wav +0 -0
  597. scipy/io/tests/data/test-48000Hz-2ch-64bit-float-le-wavex.wav +0 -0
  598. scipy/io/tests/data/test-8000Hz-be-3ch-5S-24bit.wav +0 -0
  599. scipy/io/tests/data/test-8000Hz-le-1ch-1byte-ulaw.wav +0 -0
  600. scipy/io/tests/data/test-8000Hz-le-2ch-1byteu.wav +0 -0
  601. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit-inconsistent.wav +0 -0
  602. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit-rf64.wav +0 -0
  603. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit.wav +0 -0
  604. scipy/io/tests/data/test-8000Hz-le-3ch-5S-36bit.wav +0 -0
  605. scipy/io/tests/data/test-8000Hz-le-3ch-5S-45bit.wav +0 -0
  606. scipy/io/tests/data/test-8000Hz-le-3ch-5S-53bit.wav +0 -0
  607. scipy/io/tests/data/test-8000Hz-le-3ch-5S-64bit.wav +0 -0
  608. scipy/io/tests/data/test-8000Hz-le-4ch-9S-12bit.wav +0 -0
  609. scipy/io/tests/data/test-8000Hz-le-5ch-9S-5bit.wav +0 -0
  610. scipy/io/tests/data/various_compressed.sav +0 -0
  611. scipy/io/tests/test_fortran.py +264 -0
  612. scipy/io/tests/test_idl.py +483 -0
  613. scipy/io/tests/test_mmio.py +831 -0
  614. scipy/io/tests/test_netcdf.py +550 -0
  615. scipy/io/tests/test_paths.py +93 -0
  616. scipy/io/tests/test_wavfile.py +501 -0
  617. scipy/io/wavfile.py +938 -0
  618. scipy/linalg/__init__.pxd +1 -0
  619. scipy/linalg/__init__.py +236 -0
  620. scipy/linalg/_basic.py +2146 -0
  621. scipy/linalg/_blas_subroutines.h +164 -0
  622. scipy/linalg/_cythonized_array_utils.cp311-win_arm64.lib +0 -0
  623. scipy/linalg/_cythonized_array_utils.cp311-win_arm64.pyd +0 -0
  624. scipy/linalg/_cythonized_array_utils.pxd +40 -0
  625. scipy/linalg/_cythonized_array_utils.pyi +16 -0
  626. scipy/linalg/_decomp.py +1645 -0
  627. scipy/linalg/_decomp_cholesky.py +413 -0
  628. scipy/linalg/_decomp_cossin.py +236 -0
  629. scipy/linalg/_decomp_interpolative.cp311-win_arm64.lib +0 -0
  630. scipy/linalg/_decomp_interpolative.cp311-win_arm64.pyd +0 -0
  631. scipy/linalg/_decomp_ldl.py +356 -0
  632. scipy/linalg/_decomp_lu.py +401 -0
  633. scipy/linalg/_decomp_lu_cython.cp311-win_arm64.lib +0 -0
  634. scipy/linalg/_decomp_lu_cython.cp311-win_arm64.pyd +0 -0
  635. scipy/linalg/_decomp_lu_cython.pyi +6 -0
  636. scipy/linalg/_decomp_polar.py +113 -0
  637. scipy/linalg/_decomp_qr.py +494 -0
  638. scipy/linalg/_decomp_qz.py +452 -0
  639. scipy/linalg/_decomp_schur.py +336 -0
  640. scipy/linalg/_decomp_svd.py +545 -0
  641. scipy/linalg/_decomp_update.cp311-win_arm64.lib +0 -0
  642. scipy/linalg/_decomp_update.cp311-win_arm64.pyd +0 -0
  643. scipy/linalg/_expm_frechet.py +417 -0
  644. scipy/linalg/_fblas.cp311-win_arm64.lib +0 -0
  645. scipy/linalg/_fblas.cp311-win_arm64.pyd +0 -0
  646. scipy/linalg/_flapack.cp311-win_arm64.lib +0 -0
  647. scipy/linalg/_flapack.cp311-win_arm64.pyd +0 -0
  648. scipy/linalg/_lapack_subroutines.h +1521 -0
  649. scipy/linalg/_linalg_pythran.cp311-win_arm64.lib +0 -0
  650. scipy/linalg/_linalg_pythran.cp311-win_arm64.pyd +0 -0
  651. scipy/linalg/_matfuncs.py +1050 -0
  652. scipy/linalg/_matfuncs_expm.cp311-win_arm64.lib +0 -0
  653. scipy/linalg/_matfuncs_expm.cp311-win_arm64.pyd +0 -0
  654. scipy/linalg/_matfuncs_expm.pyi +6 -0
  655. scipy/linalg/_matfuncs_inv_ssq.py +886 -0
  656. scipy/linalg/_matfuncs_schur_sqrtm.cp311-win_arm64.lib +0 -0
  657. scipy/linalg/_matfuncs_schur_sqrtm.cp311-win_arm64.pyd +0 -0
  658. scipy/linalg/_matfuncs_sqrtm.py +107 -0
  659. scipy/linalg/_matfuncs_sqrtm_triu.cp311-win_arm64.lib +0 -0
  660. scipy/linalg/_matfuncs_sqrtm_triu.cp311-win_arm64.pyd +0 -0
  661. scipy/linalg/_misc.py +191 -0
  662. scipy/linalg/_procrustes.py +113 -0
  663. scipy/linalg/_sketches.py +189 -0
  664. scipy/linalg/_solve_toeplitz.cp311-win_arm64.lib +0 -0
  665. scipy/linalg/_solve_toeplitz.cp311-win_arm64.pyd +0 -0
  666. scipy/linalg/_solvers.py +862 -0
  667. scipy/linalg/_special_matrices.py +1322 -0
  668. scipy/linalg/_testutils.py +65 -0
  669. scipy/linalg/basic.py +23 -0
  670. scipy/linalg/blas.py +495 -0
  671. scipy/linalg/cython_blas.cp311-win_arm64.lib +0 -0
  672. scipy/linalg/cython_blas.cp311-win_arm64.pyd +0 -0
  673. scipy/linalg/cython_blas.pxd +169 -0
  674. scipy/linalg/cython_blas.pyx +1432 -0
  675. scipy/linalg/cython_lapack.cp311-win_arm64.lib +0 -0
  676. scipy/linalg/cython_lapack.cp311-win_arm64.pyd +0 -0
  677. scipy/linalg/cython_lapack.pxd +1528 -0
  678. scipy/linalg/cython_lapack.pyx +12045 -0
  679. scipy/linalg/decomp.py +23 -0
  680. scipy/linalg/decomp_cholesky.py +21 -0
  681. scipy/linalg/decomp_lu.py +21 -0
  682. scipy/linalg/decomp_qr.py +20 -0
  683. scipy/linalg/decomp_schur.py +21 -0
  684. scipy/linalg/decomp_svd.py +21 -0
  685. scipy/linalg/interpolative.py +989 -0
  686. scipy/linalg/lapack.py +1081 -0
  687. scipy/linalg/matfuncs.py +23 -0
  688. scipy/linalg/misc.py +21 -0
  689. scipy/linalg/special_matrices.py +22 -0
  690. scipy/linalg/tests/__init__.py +0 -0
  691. scipy/linalg/tests/_cython_examples/extending.pyx +23 -0
  692. scipy/linalg/tests/_cython_examples/meson.build +34 -0
  693. scipy/linalg/tests/data/carex_15_data.npz +0 -0
  694. scipy/linalg/tests/data/carex_18_data.npz +0 -0
  695. scipy/linalg/tests/data/carex_19_data.npz +0 -0
  696. scipy/linalg/tests/data/carex_20_data.npz +0 -0
  697. scipy/linalg/tests/data/carex_6_data.npz +0 -0
  698. scipy/linalg/tests/data/gendare_20170120_data.npz +0 -0
  699. scipy/linalg/tests/test_basic.py +2074 -0
  700. scipy/linalg/tests/test_batch.py +588 -0
  701. scipy/linalg/tests/test_blas.py +1127 -0
  702. scipy/linalg/tests/test_cython_blas.py +118 -0
  703. scipy/linalg/tests/test_cython_lapack.py +22 -0
  704. scipy/linalg/tests/test_cythonized_array_utils.py +130 -0
  705. scipy/linalg/tests/test_decomp.py +3189 -0
  706. scipy/linalg/tests/test_decomp_cholesky.py +268 -0
  707. scipy/linalg/tests/test_decomp_cossin.py +314 -0
  708. scipy/linalg/tests/test_decomp_ldl.py +137 -0
  709. scipy/linalg/tests/test_decomp_lu.py +308 -0
  710. scipy/linalg/tests/test_decomp_polar.py +110 -0
  711. scipy/linalg/tests/test_decomp_update.py +1701 -0
  712. scipy/linalg/tests/test_extending.py +46 -0
  713. scipy/linalg/tests/test_fblas.py +607 -0
  714. scipy/linalg/tests/test_interpolative.py +232 -0
  715. scipy/linalg/tests/test_lapack.py +3620 -0
  716. scipy/linalg/tests/test_matfuncs.py +1125 -0
  717. scipy/linalg/tests/test_matmul_toeplitz.py +136 -0
  718. scipy/linalg/tests/test_procrustes.py +214 -0
  719. scipy/linalg/tests/test_sketches.py +118 -0
  720. scipy/linalg/tests/test_solve_toeplitz.py +150 -0
  721. scipy/linalg/tests/test_solvers.py +844 -0
  722. scipy/linalg/tests/test_special_matrices.py +636 -0
  723. scipy/misc/__init__.py +6 -0
  724. scipy/misc/common.py +6 -0
  725. scipy/misc/doccer.py +6 -0
  726. scipy/ndimage/__init__.py +174 -0
  727. scipy/ndimage/_ctest.cp311-win_arm64.lib +0 -0
  728. scipy/ndimage/_ctest.cp311-win_arm64.pyd +0 -0
  729. scipy/ndimage/_cytest.cp311-win_arm64.lib +0 -0
  730. scipy/ndimage/_cytest.cp311-win_arm64.pyd +0 -0
  731. scipy/ndimage/_delegators.py +303 -0
  732. scipy/ndimage/_filters.py +2422 -0
  733. scipy/ndimage/_fourier.py +306 -0
  734. scipy/ndimage/_interpolation.py +1033 -0
  735. scipy/ndimage/_measurements.py +1689 -0
  736. scipy/ndimage/_morphology.py +2634 -0
  737. scipy/ndimage/_nd_image.cp311-win_arm64.lib +0 -0
  738. scipy/ndimage/_nd_image.cp311-win_arm64.pyd +0 -0
  739. scipy/ndimage/_ndimage_api.py +16 -0
  740. scipy/ndimage/_ni_docstrings.py +214 -0
  741. scipy/ndimage/_ni_label.cp311-win_arm64.lib +0 -0
  742. scipy/ndimage/_ni_label.cp311-win_arm64.pyd +0 -0
  743. scipy/ndimage/_ni_support.py +139 -0
  744. scipy/ndimage/_rank_filter_1d.cp311-win_arm64.lib +0 -0
  745. scipy/ndimage/_rank_filter_1d.cp311-win_arm64.pyd +0 -0
  746. scipy/ndimage/_support_alternative_backends.py +84 -0
  747. scipy/ndimage/filters.py +27 -0
  748. scipy/ndimage/fourier.py +21 -0
  749. scipy/ndimage/interpolation.py +22 -0
  750. scipy/ndimage/measurements.py +24 -0
  751. scipy/ndimage/morphology.py +27 -0
  752. scipy/ndimage/tests/__init__.py +12 -0
  753. scipy/ndimage/tests/data/label_inputs.txt +21 -0
  754. scipy/ndimage/tests/data/label_results.txt +294 -0
  755. scipy/ndimage/tests/data/label_strels.txt +42 -0
  756. scipy/ndimage/tests/dots.png +0 -0
  757. scipy/ndimage/tests/test_c_api.py +102 -0
  758. scipy/ndimage/tests/test_datatypes.py +67 -0
  759. scipy/ndimage/tests/test_filters.py +3083 -0
  760. scipy/ndimage/tests/test_fourier.py +187 -0
  761. scipy/ndimage/tests/test_interpolation.py +1491 -0
  762. scipy/ndimage/tests/test_measurements.py +1592 -0
  763. scipy/ndimage/tests/test_morphology.py +2950 -0
  764. scipy/ndimage/tests/test_ni_support.py +78 -0
  765. scipy/ndimage/tests/test_splines.py +70 -0
  766. scipy/odr/__init__.py +131 -0
  767. scipy/odr/__odrpack.cp311-win_arm64.lib +0 -0
  768. scipy/odr/__odrpack.cp311-win_arm64.pyd +0 -0
  769. scipy/odr/_add_newdocs.py +34 -0
  770. scipy/odr/_models.py +315 -0
  771. scipy/odr/_odrpack.py +1154 -0
  772. scipy/odr/models.py +20 -0
  773. scipy/odr/odrpack.py +21 -0
  774. scipy/odr/tests/__init__.py +0 -0
  775. scipy/odr/tests/test_odr.py +607 -0
  776. scipy/optimize/__init__.pxd +1 -0
  777. scipy/optimize/__init__.py +460 -0
  778. scipy/optimize/_basinhopping.py +741 -0
  779. scipy/optimize/_bglu_dense.cp311-win_arm64.lib +0 -0
  780. scipy/optimize/_bglu_dense.cp311-win_arm64.pyd +0 -0
  781. scipy/optimize/_bracket.py +706 -0
  782. scipy/optimize/_chandrupatla.py +551 -0
  783. scipy/optimize/_cobyla_py.py +297 -0
  784. scipy/optimize/_cobyqa_py.py +72 -0
  785. scipy/optimize/_constraints.py +598 -0
  786. scipy/optimize/_dcsrch.py +728 -0
  787. scipy/optimize/_differentiable_functions.py +835 -0
  788. scipy/optimize/_differentialevolution.py +1970 -0
  789. scipy/optimize/_direct.cp311-win_arm64.lib +0 -0
  790. scipy/optimize/_direct.cp311-win_arm64.pyd +0 -0
  791. scipy/optimize/_direct_py.py +280 -0
  792. scipy/optimize/_dual_annealing.py +732 -0
  793. scipy/optimize/_elementwise.py +798 -0
  794. scipy/optimize/_group_columns.cp311-win_arm64.lib +0 -0
  795. scipy/optimize/_group_columns.cp311-win_arm64.pyd +0 -0
  796. scipy/optimize/_hessian_update_strategy.py +479 -0
  797. scipy/optimize/_highspy/__init__.py +0 -0
  798. scipy/optimize/_highspy/_core.cp311-win_arm64.lib +0 -0
  799. scipy/optimize/_highspy/_core.cp311-win_arm64.pyd +0 -0
  800. scipy/optimize/_highspy/_highs_options.cp311-win_arm64.lib +0 -0
  801. scipy/optimize/_highspy/_highs_options.cp311-win_arm64.pyd +0 -0
  802. scipy/optimize/_highspy/_highs_wrapper.py +338 -0
  803. scipy/optimize/_isotonic.py +157 -0
  804. scipy/optimize/_lbfgsb.cp311-win_arm64.lib +0 -0
  805. scipy/optimize/_lbfgsb.cp311-win_arm64.pyd +0 -0
  806. scipy/optimize/_lbfgsb_py.py +634 -0
  807. scipy/optimize/_linesearch.py +896 -0
  808. scipy/optimize/_linprog.py +733 -0
  809. scipy/optimize/_linprog_doc.py +1434 -0
  810. scipy/optimize/_linprog_highs.py +422 -0
  811. scipy/optimize/_linprog_ip.py +1141 -0
  812. scipy/optimize/_linprog_rs.py +572 -0
  813. scipy/optimize/_linprog_simplex.py +663 -0
  814. scipy/optimize/_linprog_util.py +1521 -0
  815. scipy/optimize/_lsap.cp311-win_arm64.lib +0 -0
  816. scipy/optimize/_lsap.cp311-win_arm64.pyd +0 -0
  817. scipy/optimize/_lsq/__init__.py +5 -0
  818. scipy/optimize/_lsq/bvls.py +183 -0
  819. scipy/optimize/_lsq/common.py +731 -0
  820. scipy/optimize/_lsq/dogbox.py +345 -0
  821. scipy/optimize/_lsq/givens_elimination.cp311-win_arm64.lib +0 -0
  822. scipy/optimize/_lsq/givens_elimination.cp311-win_arm64.pyd +0 -0
  823. scipy/optimize/_lsq/least_squares.py +1044 -0
  824. scipy/optimize/_lsq/lsq_linear.py +361 -0
  825. scipy/optimize/_lsq/trf.py +587 -0
  826. scipy/optimize/_lsq/trf_linear.py +249 -0
  827. scipy/optimize/_milp.py +394 -0
  828. scipy/optimize/_minimize.py +1199 -0
  829. scipy/optimize/_minpack.cp311-win_arm64.lib +0 -0
  830. scipy/optimize/_minpack.cp311-win_arm64.pyd +0 -0
  831. scipy/optimize/_minpack_py.py +1178 -0
  832. scipy/optimize/_moduleTNC.cp311-win_arm64.lib +0 -0
  833. scipy/optimize/_moduleTNC.cp311-win_arm64.pyd +0 -0
  834. scipy/optimize/_nnls.py +96 -0
  835. scipy/optimize/_nonlin.py +1634 -0
  836. scipy/optimize/_numdiff.py +963 -0
  837. scipy/optimize/_optimize.py +4169 -0
  838. scipy/optimize/_pava_pybind.cp311-win_arm64.lib +0 -0
  839. scipy/optimize/_pava_pybind.cp311-win_arm64.pyd +0 -0
  840. scipy/optimize/_qap.py +760 -0
  841. scipy/optimize/_remove_redundancy.py +522 -0
  842. scipy/optimize/_root.py +732 -0
  843. scipy/optimize/_root_scalar.py +538 -0
  844. scipy/optimize/_shgo.py +1606 -0
  845. scipy/optimize/_shgo_lib/__init__.py +0 -0
  846. scipy/optimize/_shgo_lib/_complex.py +1225 -0
  847. scipy/optimize/_shgo_lib/_vertex.py +460 -0
  848. scipy/optimize/_slsqp_py.py +603 -0
  849. scipy/optimize/_slsqplib.cp311-win_arm64.lib +0 -0
  850. scipy/optimize/_slsqplib.cp311-win_arm64.pyd +0 -0
  851. scipy/optimize/_spectral.py +260 -0
  852. scipy/optimize/_tnc.py +438 -0
  853. scipy/optimize/_trlib/__init__.py +12 -0
  854. scipy/optimize/_trlib/_trlib.cp311-win_arm64.lib +0 -0
  855. scipy/optimize/_trlib/_trlib.cp311-win_arm64.pyd +0 -0
  856. scipy/optimize/_trustregion.py +318 -0
  857. scipy/optimize/_trustregion_constr/__init__.py +6 -0
  858. scipy/optimize/_trustregion_constr/canonical_constraint.py +390 -0
  859. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +231 -0
  860. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +584 -0
  861. scipy/optimize/_trustregion_constr/projections.py +411 -0
  862. scipy/optimize/_trustregion_constr/qp_subproblem.py +637 -0
  863. scipy/optimize/_trustregion_constr/report.py +49 -0
  864. scipy/optimize/_trustregion_constr/tests/__init__.py +0 -0
  865. scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py +296 -0
  866. scipy/optimize/_trustregion_constr/tests/test_nested_minimize.py +39 -0
  867. scipy/optimize/_trustregion_constr/tests/test_projections.py +214 -0
  868. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +645 -0
  869. scipy/optimize/_trustregion_constr/tests/test_report.py +34 -0
  870. scipy/optimize/_trustregion_constr/tr_interior_point.py +361 -0
  871. scipy/optimize/_trustregion_dogleg.py +122 -0
  872. scipy/optimize/_trustregion_exact.py +437 -0
  873. scipy/optimize/_trustregion_krylov.py +65 -0
  874. scipy/optimize/_trustregion_ncg.py +126 -0
  875. scipy/optimize/_tstutils.py +972 -0
  876. scipy/optimize/_zeros.cp311-win_arm64.lib +0 -0
  877. scipy/optimize/_zeros.cp311-win_arm64.pyd +0 -0
  878. scipy/optimize/_zeros_py.py +1475 -0
  879. scipy/optimize/cobyla.py +19 -0
  880. scipy/optimize/cython_optimize/__init__.py +133 -0
  881. scipy/optimize/cython_optimize/_zeros.cp311-win_arm64.lib +0 -0
  882. scipy/optimize/cython_optimize/_zeros.cp311-win_arm64.pyd +0 -0
  883. scipy/optimize/cython_optimize/_zeros.pxd +33 -0
  884. scipy/optimize/cython_optimize/c_zeros.pxd +26 -0
  885. scipy/optimize/cython_optimize.pxd +11 -0
  886. scipy/optimize/elementwise.py +38 -0
  887. scipy/optimize/lbfgsb.py +23 -0
  888. scipy/optimize/linesearch.py +18 -0
  889. scipy/optimize/minpack.py +27 -0
  890. scipy/optimize/minpack2.py +17 -0
  891. scipy/optimize/moduleTNC.py +19 -0
  892. scipy/optimize/nonlin.py +29 -0
  893. scipy/optimize/optimize.py +40 -0
  894. scipy/optimize/slsqp.py +22 -0
  895. scipy/optimize/tests/__init__.py +0 -0
  896. scipy/optimize/tests/_cython_examples/extending.pyx +43 -0
  897. scipy/optimize/tests/_cython_examples/meson.build +32 -0
  898. scipy/optimize/tests/test__basinhopping.py +535 -0
  899. scipy/optimize/tests/test__differential_evolution.py +1703 -0
  900. scipy/optimize/tests/test__dual_annealing.py +416 -0
  901. scipy/optimize/tests/test__linprog_clean_inputs.py +312 -0
  902. scipy/optimize/tests/test__numdiff.py +885 -0
  903. scipy/optimize/tests/test__remove_redundancy.py +228 -0
  904. scipy/optimize/tests/test__root.py +124 -0
  905. scipy/optimize/tests/test__shgo.py +1164 -0
  906. scipy/optimize/tests/test__spectral.py +226 -0
  907. scipy/optimize/tests/test_bracket.py +896 -0
  908. scipy/optimize/tests/test_chandrupatla.py +982 -0
  909. scipy/optimize/tests/test_cobyla.py +195 -0
  910. scipy/optimize/tests/test_cobyqa.py +252 -0
  911. scipy/optimize/tests/test_constraint_conversion.py +286 -0
  912. scipy/optimize/tests/test_constraints.py +255 -0
  913. scipy/optimize/tests/test_cython_optimize.py +92 -0
  914. scipy/optimize/tests/test_differentiable_functions.py +1025 -0
  915. scipy/optimize/tests/test_direct.py +321 -0
  916. scipy/optimize/tests/test_extending.py +28 -0
  917. scipy/optimize/tests/test_hessian_update_strategy.py +300 -0
  918. scipy/optimize/tests/test_isotonic_regression.py +167 -0
  919. scipy/optimize/tests/test_lbfgsb_hessinv.py +65 -0
  920. scipy/optimize/tests/test_lbfgsb_setulb.py +122 -0
  921. scipy/optimize/tests/test_least_squares.py +986 -0
  922. scipy/optimize/tests/test_linear_assignment.py +116 -0
  923. scipy/optimize/tests/test_linesearch.py +328 -0
  924. scipy/optimize/tests/test_linprog.py +2577 -0
  925. scipy/optimize/tests/test_lsq_common.py +297 -0
  926. scipy/optimize/tests/test_lsq_linear.py +287 -0
  927. scipy/optimize/tests/test_milp.py +459 -0
  928. scipy/optimize/tests/test_minimize_constrained.py +845 -0
  929. scipy/optimize/tests/test_minpack.py +1194 -0
  930. scipy/optimize/tests/test_nnls.py +469 -0
  931. scipy/optimize/tests/test_nonlin.py +572 -0
  932. scipy/optimize/tests/test_optimize.py +3344 -0
  933. scipy/optimize/tests/test_quadratic_assignment.py +455 -0
  934. scipy/optimize/tests/test_regression.py +40 -0
  935. scipy/optimize/tests/test_slsqp.py +645 -0
  936. scipy/optimize/tests/test_tnc.py +345 -0
  937. scipy/optimize/tests/test_trustregion.py +110 -0
  938. scipy/optimize/tests/test_trustregion_exact.py +351 -0
  939. scipy/optimize/tests/test_trustregion_krylov.py +170 -0
  940. scipy/optimize/tests/test_zeros.py +998 -0
  941. scipy/optimize/tnc.py +22 -0
  942. scipy/optimize/zeros.py +26 -0
  943. scipy/signal/__init__.py +316 -0
  944. scipy/signal/_arraytools.py +264 -0
  945. scipy/signal/_czt.py +575 -0
  946. scipy/signal/_delegators.py +568 -0
  947. scipy/signal/_filter_design.py +5893 -0
  948. scipy/signal/_fir_filter_design.py +1458 -0
  949. scipy/signal/_lti_conversion.py +534 -0
  950. scipy/signal/_ltisys.py +3546 -0
  951. scipy/signal/_max_len_seq.py +139 -0
  952. scipy/signal/_max_len_seq_inner.cp311-win_arm64.lib +0 -0
  953. scipy/signal/_max_len_seq_inner.cp311-win_arm64.pyd +0 -0
  954. scipy/signal/_peak_finding.py +1310 -0
  955. scipy/signal/_peak_finding_utils.cp311-win_arm64.lib +0 -0
  956. scipy/signal/_peak_finding_utils.cp311-win_arm64.pyd +0 -0
  957. scipy/signal/_polyutils.py +172 -0
  958. scipy/signal/_savitzky_golay.py +357 -0
  959. scipy/signal/_short_time_fft.py +2228 -0
  960. scipy/signal/_signal_api.py +30 -0
  961. scipy/signal/_signaltools.py +5309 -0
  962. scipy/signal/_sigtools.cp311-win_arm64.lib +0 -0
  963. scipy/signal/_sigtools.cp311-win_arm64.pyd +0 -0
  964. scipy/signal/_sosfilt.cp311-win_arm64.lib +0 -0
  965. scipy/signal/_sosfilt.cp311-win_arm64.pyd +0 -0
  966. scipy/signal/_spectral_py.py +2471 -0
  967. scipy/signal/_spline.cp311-win_arm64.lib +0 -0
  968. scipy/signal/_spline.cp311-win_arm64.pyd +0 -0
  969. scipy/signal/_spline.pyi +34 -0
  970. scipy/signal/_spline_filters.py +848 -0
  971. scipy/signal/_support_alternative_backends.py +73 -0
  972. scipy/signal/_upfirdn.py +219 -0
  973. scipy/signal/_upfirdn_apply.cp311-win_arm64.lib +0 -0
  974. scipy/signal/_upfirdn_apply.cp311-win_arm64.pyd +0 -0
  975. scipy/signal/_waveforms.py +687 -0
  976. scipy/signal/_wavelets.py +29 -0
  977. scipy/signal/bsplines.py +21 -0
  978. scipy/signal/filter_design.py +28 -0
  979. scipy/signal/fir_filter_design.py +21 -0
  980. scipy/signal/lti_conversion.py +20 -0
  981. scipy/signal/ltisys.py +25 -0
  982. scipy/signal/signaltools.py +27 -0
  983. scipy/signal/spectral.py +21 -0
  984. scipy/signal/spline.py +18 -0
  985. scipy/signal/tests/__init__.py +0 -0
  986. scipy/signal/tests/_scipy_spectral_test_shim.py +311 -0
  987. scipy/signal/tests/mpsig.py +122 -0
  988. scipy/signal/tests/test_array_tools.py +111 -0
  989. scipy/signal/tests/test_bsplines.py +365 -0
  990. scipy/signal/tests/test_cont2discrete.py +424 -0
  991. scipy/signal/tests/test_czt.py +221 -0
  992. scipy/signal/tests/test_dltisys.py +599 -0
  993. scipy/signal/tests/test_filter_design.py +4744 -0
  994. scipy/signal/tests/test_fir_filter_design.py +851 -0
  995. scipy/signal/tests/test_ltisys.py +1225 -0
  996. scipy/signal/tests/test_max_len_seq.py +71 -0
  997. scipy/signal/tests/test_peak_finding.py +915 -0
  998. scipy/signal/tests/test_result_type.py +51 -0
  999. scipy/signal/tests/test_savitzky_golay.py +363 -0
  1000. scipy/signal/tests/test_short_time_fft.py +1107 -0
  1001. scipy/signal/tests/test_signaltools.py +4735 -0
  1002. scipy/signal/tests/test_spectral.py +2141 -0
  1003. scipy/signal/tests/test_splines.py +427 -0
  1004. scipy/signal/tests/test_upfirdn.py +322 -0
  1005. scipy/signal/tests/test_waveforms.py +400 -0
  1006. scipy/signal/tests/test_wavelets.py +59 -0
  1007. scipy/signal/tests/test_windows.py +987 -0
  1008. scipy/signal/waveforms.py +20 -0
  1009. scipy/signal/wavelets.py +17 -0
  1010. scipy/signal/windows/__init__.py +52 -0
  1011. scipy/signal/windows/_windows.py +2513 -0
  1012. scipy/signal/windows/windows.py +23 -0
  1013. scipy/sparse/__init__.py +350 -0
  1014. scipy/sparse/_base.py +1613 -0
  1015. scipy/sparse/_bsr.py +880 -0
  1016. scipy/sparse/_compressed.py +1328 -0
  1017. scipy/sparse/_construct.py +1454 -0
  1018. scipy/sparse/_coo.py +1581 -0
  1019. scipy/sparse/_csc.py +367 -0
  1020. scipy/sparse/_csparsetools.cp311-win_arm64.lib +0 -0
  1021. scipy/sparse/_csparsetools.cp311-win_arm64.pyd +0 -0
  1022. scipy/sparse/_csr.py +558 -0
  1023. scipy/sparse/_data.py +569 -0
  1024. scipy/sparse/_dia.py +677 -0
  1025. scipy/sparse/_dok.py +669 -0
  1026. scipy/sparse/_extract.py +178 -0
  1027. scipy/sparse/_index.py +444 -0
  1028. scipy/sparse/_lil.py +632 -0
  1029. scipy/sparse/_matrix.py +169 -0
  1030. scipy/sparse/_matrix_io.py +167 -0
  1031. scipy/sparse/_sparsetools.cp311-win_arm64.lib +0 -0
  1032. scipy/sparse/_sparsetools.cp311-win_arm64.pyd +0 -0
  1033. scipy/sparse/_spfuncs.py +76 -0
  1034. scipy/sparse/_sputils.py +632 -0
  1035. scipy/sparse/base.py +24 -0
  1036. scipy/sparse/bsr.py +22 -0
  1037. scipy/sparse/compressed.py +20 -0
  1038. scipy/sparse/construct.py +38 -0
  1039. scipy/sparse/coo.py +23 -0
  1040. scipy/sparse/csc.py +22 -0
  1041. scipy/sparse/csgraph/__init__.py +210 -0
  1042. scipy/sparse/csgraph/_flow.cp311-win_arm64.lib +0 -0
  1043. scipy/sparse/csgraph/_flow.cp311-win_arm64.pyd +0 -0
  1044. scipy/sparse/csgraph/_laplacian.py +563 -0
  1045. scipy/sparse/csgraph/_matching.cp311-win_arm64.lib +0 -0
  1046. scipy/sparse/csgraph/_matching.cp311-win_arm64.pyd +0 -0
  1047. scipy/sparse/csgraph/_min_spanning_tree.cp311-win_arm64.lib +0 -0
  1048. scipy/sparse/csgraph/_min_spanning_tree.cp311-win_arm64.pyd +0 -0
  1049. scipy/sparse/csgraph/_reordering.cp311-win_arm64.lib +0 -0
  1050. scipy/sparse/csgraph/_reordering.cp311-win_arm64.pyd +0 -0
  1051. scipy/sparse/csgraph/_shortest_path.cp311-win_arm64.lib +0 -0
  1052. scipy/sparse/csgraph/_shortest_path.cp311-win_arm64.pyd +0 -0
  1053. scipy/sparse/csgraph/_tools.cp311-win_arm64.lib +0 -0
  1054. scipy/sparse/csgraph/_tools.cp311-win_arm64.pyd +0 -0
  1055. scipy/sparse/csgraph/_traversal.cp311-win_arm64.lib +0 -0
  1056. scipy/sparse/csgraph/_traversal.cp311-win_arm64.pyd +0 -0
  1057. scipy/sparse/csgraph/_validation.py +66 -0
  1058. scipy/sparse/csgraph/tests/__init__.py +0 -0
  1059. scipy/sparse/csgraph/tests/test_connected_components.py +119 -0
  1060. scipy/sparse/csgraph/tests/test_conversions.py +61 -0
  1061. scipy/sparse/csgraph/tests/test_flow.py +209 -0
  1062. scipy/sparse/csgraph/tests/test_graph_laplacian.py +368 -0
  1063. scipy/sparse/csgraph/tests/test_matching.py +307 -0
  1064. scipy/sparse/csgraph/tests/test_pydata_sparse.py +197 -0
  1065. scipy/sparse/csgraph/tests/test_reordering.py +70 -0
  1066. scipy/sparse/csgraph/tests/test_shortest_path.py +540 -0
  1067. scipy/sparse/csgraph/tests/test_spanning_tree.py +66 -0
  1068. scipy/sparse/csgraph/tests/test_traversal.py +148 -0
  1069. scipy/sparse/csr.py +22 -0
  1070. scipy/sparse/data.py +18 -0
  1071. scipy/sparse/dia.py +22 -0
  1072. scipy/sparse/dok.py +22 -0
  1073. scipy/sparse/extract.py +23 -0
  1074. scipy/sparse/lil.py +22 -0
  1075. scipy/sparse/linalg/__init__.py +148 -0
  1076. scipy/sparse/linalg/_dsolve/__init__.py +71 -0
  1077. scipy/sparse/linalg/_dsolve/_add_newdocs.py +147 -0
  1078. scipy/sparse/linalg/_dsolve/_superlu.cp311-win_arm64.lib +0 -0
  1079. scipy/sparse/linalg/_dsolve/_superlu.cp311-win_arm64.pyd +0 -0
  1080. scipy/sparse/linalg/_dsolve/linsolve.py +882 -0
  1081. scipy/sparse/linalg/_dsolve/tests/__init__.py +0 -0
  1082. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +928 -0
  1083. scipy/sparse/linalg/_eigen/__init__.py +22 -0
  1084. scipy/sparse/linalg/_eigen/_svds.py +540 -0
  1085. scipy/sparse/linalg/_eigen/_svds_doc.py +382 -0
  1086. scipy/sparse/linalg/_eigen/arpack/COPYING +45 -0
  1087. scipy/sparse/linalg/_eigen/arpack/__init__.py +20 -0
  1088. scipy/sparse/linalg/_eigen/arpack/_arpack.cp311-win_arm64.lib +0 -0
  1089. scipy/sparse/linalg/_eigen/arpack/_arpack.cp311-win_arm64.pyd +0 -0
  1090. scipy/sparse/linalg/_eigen/arpack/arpack.py +1706 -0
  1091. scipy/sparse/linalg/_eigen/arpack/tests/__init__.py +0 -0
  1092. scipy/sparse/linalg/_eigen/arpack/tests/test_arpack.py +717 -0
  1093. scipy/sparse/linalg/_eigen/lobpcg/__init__.py +16 -0
  1094. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +1110 -0
  1095. scipy/sparse/linalg/_eigen/lobpcg/tests/__init__.py +0 -0
  1096. scipy/sparse/linalg/_eigen/lobpcg/tests/test_lobpcg.py +725 -0
  1097. scipy/sparse/linalg/_eigen/tests/__init__.py +0 -0
  1098. scipy/sparse/linalg/_eigen/tests/test_svds.py +886 -0
  1099. scipy/sparse/linalg/_expm_multiply.py +816 -0
  1100. scipy/sparse/linalg/_interface.py +920 -0
  1101. scipy/sparse/linalg/_isolve/__init__.py +20 -0
  1102. scipy/sparse/linalg/_isolve/_gcrotmk.py +503 -0
  1103. scipy/sparse/linalg/_isolve/iterative.py +1051 -0
  1104. scipy/sparse/linalg/_isolve/lgmres.py +230 -0
  1105. scipy/sparse/linalg/_isolve/lsmr.py +486 -0
  1106. scipy/sparse/linalg/_isolve/lsqr.py +589 -0
  1107. scipy/sparse/linalg/_isolve/minres.py +372 -0
  1108. scipy/sparse/linalg/_isolve/tests/__init__.py +0 -0
  1109. scipy/sparse/linalg/_isolve/tests/test_gcrotmk.py +183 -0
  1110. scipy/sparse/linalg/_isolve/tests/test_iterative.py +809 -0
  1111. scipy/sparse/linalg/_isolve/tests/test_lgmres.py +225 -0
  1112. scipy/sparse/linalg/_isolve/tests/test_lsmr.py +185 -0
  1113. scipy/sparse/linalg/_isolve/tests/test_lsqr.py +120 -0
  1114. scipy/sparse/linalg/_isolve/tests/test_minres.py +97 -0
  1115. scipy/sparse/linalg/_isolve/tests/test_utils.py +9 -0
  1116. scipy/sparse/linalg/_isolve/tfqmr.py +179 -0
  1117. scipy/sparse/linalg/_isolve/utils.py +121 -0
  1118. scipy/sparse/linalg/_matfuncs.py +940 -0
  1119. scipy/sparse/linalg/_norm.py +195 -0
  1120. scipy/sparse/linalg/_onenormest.py +467 -0
  1121. scipy/sparse/linalg/_propack/_cpropack.cp311-win_arm64.lib +0 -0
  1122. scipy/sparse/linalg/_propack/_cpropack.cp311-win_arm64.pyd +0 -0
  1123. scipy/sparse/linalg/_propack/_dpropack.cp311-win_arm64.lib +0 -0
  1124. scipy/sparse/linalg/_propack/_dpropack.cp311-win_arm64.pyd +0 -0
  1125. scipy/sparse/linalg/_propack/_spropack.cp311-win_arm64.lib +0 -0
  1126. scipy/sparse/linalg/_propack/_spropack.cp311-win_arm64.pyd +0 -0
  1127. scipy/sparse/linalg/_propack/_zpropack.cp311-win_arm64.lib +0 -0
  1128. scipy/sparse/linalg/_propack/_zpropack.cp311-win_arm64.pyd +0 -0
  1129. scipy/sparse/linalg/_special_sparse_arrays.py +949 -0
  1130. scipy/sparse/linalg/_svdp.py +309 -0
  1131. scipy/sparse/linalg/dsolve.py +22 -0
  1132. scipy/sparse/linalg/eigen.py +21 -0
  1133. scipy/sparse/linalg/interface.py +20 -0
  1134. scipy/sparse/linalg/isolve.py +22 -0
  1135. scipy/sparse/linalg/matfuncs.py +18 -0
  1136. scipy/sparse/linalg/tests/__init__.py +0 -0
  1137. scipy/sparse/linalg/tests/propack_test_data.npz +0 -0
  1138. scipy/sparse/linalg/tests/test_expm_multiply.py +367 -0
  1139. scipy/sparse/linalg/tests/test_interface.py +561 -0
  1140. scipy/sparse/linalg/tests/test_matfuncs.py +592 -0
  1141. scipy/sparse/linalg/tests/test_norm.py +154 -0
  1142. scipy/sparse/linalg/tests/test_onenormest.py +252 -0
  1143. scipy/sparse/linalg/tests/test_propack.py +165 -0
  1144. scipy/sparse/linalg/tests/test_pydata_sparse.py +272 -0
  1145. scipy/sparse/linalg/tests/test_special_sparse_arrays.py +337 -0
  1146. scipy/sparse/sparsetools.py +17 -0
  1147. scipy/sparse/spfuncs.py +17 -0
  1148. scipy/sparse/sputils.py +17 -0
  1149. scipy/sparse/tests/__init__.py +0 -0
  1150. scipy/sparse/tests/data/csc_py2.npz +0 -0
  1151. scipy/sparse/tests/data/csc_py3.npz +0 -0
  1152. scipy/sparse/tests/test_arithmetic1d.py +341 -0
  1153. scipy/sparse/tests/test_array_api.py +561 -0
  1154. scipy/sparse/tests/test_base.py +5870 -0
  1155. scipy/sparse/tests/test_common1d.py +447 -0
  1156. scipy/sparse/tests/test_construct.py +872 -0
  1157. scipy/sparse/tests/test_coo.py +1119 -0
  1158. scipy/sparse/tests/test_csc.py +98 -0
  1159. scipy/sparse/tests/test_csr.py +214 -0
  1160. scipy/sparse/tests/test_dok.py +209 -0
  1161. scipy/sparse/tests/test_extract.py +51 -0
  1162. scipy/sparse/tests/test_indexing1d.py +603 -0
  1163. scipy/sparse/tests/test_matrix_io.py +109 -0
  1164. scipy/sparse/tests/test_minmax1d.py +128 -0
  1165. scipy/sparse/tests/test_sparsetools.py +344 -0
  1166. scipy/sparse/tests/test_spfuncs.py +97 -0
  1167. scipy/sparse/tests/test_sputils.py +424 -0
  1168. scipy/spatial/__init__.py +129 -0
  1169. scipy/spatial/_ckdtree.cp311-win_arm64.lib +0 -0
  1170. scipy/spatial/_ckdtree.cp311-win_arm64.pyd +0 -0
  1171. scipy/spatial/_distance_pybind.cp311-win_arm64.lib +0 -0
  1172. scipy/spatial/_distance_pybind.cp311-win_arm64.pyd +0 -0
  1173. scipy/spatial/_distance_wrap.cp311-win_arm64.lib +0 -0
  1174. scipy/spatial/_distance_wrap.cp311-win_arm64.pyd +0 -0
  1175. scipy/spatial/_geometric_slerp.py +238 -0
  1176. scipy/spatial/_hausdorff.cp311-win_arm64.lib +0 -0
  1177. scipy/spatial/_hausdorff.cp311-win_arm64.pyd +0 -0
  1178. scipy/spatial/_kdtree.py +920 -0
  1179. scipy/spatial/_plotutils.py +274 -0
  1180. scipy/spatial/_procrustes.py +132 -0
  1181. scipy/spatial/_qhull.cp311-win_arm64.lib +0 -0
  1182. scipy/spatial/_qhull.cp311-win_arm64.pyd +0 -0
  1183. scipy/spatial/_qhull.pyi +213 -0
  1184. scipy/spatial/_spherical_voronoi.py +341 -0
  1185. scipy/spatial/_voronoi.cp311-win_arm64.lib +0 -0
  1186. scipy/spatial/_voronoi.cp311-win_arm64.pyd +0 -0
  1187. scipy/spatial/_voronoi.pyi +4 -0
  1188. scipy/spatial/ckdtree.py +18 -0
  1189. scipy/spatial/distance.py +3147 -0
  1190. scipy/spatial/distance.pyi +210 -0
  1191. scipy/spatial/kdtree.py +25 -0
  1192. scipy/spatial/qhull.py +25 -0
  1193. scipy/spatial/qhull_src/COPYING_QHULL.txt +39 -0
  1194. scipy/spatial/tests/__init__.py +0 -0
  1195. scipy/spatial/tests/data/cdist-X1.txt +10 -0
  1196. scipy/spatial/tests/data/cdist-X2.txt +20 -0
  1197. scipy/spatial/tests/data/degenerate_pointset.npz +0 -0
  1198. scipy/spatial/tests/data/iris.txt +150 -0
  1199. scipy/spatial/tests/data/pdist-boolean-inp.txt +20 -0
  1200. scipy/spatial/tests/data/pdist-chebyshev-ml-iris.txt +1 -0
  1201. scipy/spatial/tests/data/pdist-chebyshev-ml.txt +1 -0
  1202. scipy/spatial/tests/data/pdist-cityblock-ml-iris.txt +1 -0
  1203. scipy/spatial/tests/data/pdist-cityblock-ml.txt +1 -0
  1204. scipy/spatial/tests/data/pdist-correlation-ml-iris.txt +1 -0
  1205. scipy/spatial/tests/data/pdist-correlation-ml.txt +1 -0
  1206. scipy/spatial/tests/data/pdist-cosine-ml-iris.txt +1 -0
  1207. scipy/spatial/tests/data/pdist-cosine-ml.txt +1 -0
  1208. scipy/spatial/tests/data/pdist-double-inp.txt +20 -0
  1209. scipy/spatial/tests/data/pdist-euclidean-ml-iris.txt +1 -0
  1210. scipy/spatial/tests/data/pdist-euclidean-ml.txt +1 -0
  1211. scipy/spatial/tests/data/pdist-hamming-ml.txt +1 -0
  1212. scipy/spatial/tests/data/pdist-jaccard-ml.txt +1 -0
  1213. scipy/spatial/tests/data/pdist-jensenshannon-ml-iris.txt +1 -0
  1214. scipy/spatial/tests/data/pdist-jensenshannon-ml.txt +1 -0
  1215. scipy/spatial/tests/data/pdist-minkowski-3.2-ml-iris.txt +1 -0
  1216. scipy/spatial/tests/data/pdist-minkowski-3.2-ml.txt +1 -0
  1217. scipy/spatial/tests/data/pdist-minkowski-5.8-ml-iris.txt +1 -0
  1218. scipy/spatial/tests/data/pdist-seuclidean-ml-iris.txt +1 -0
  1219. scipy/spatial/tests/data/pdist-seuclidean-ml.txt +1 -0
  1220. scipy/spatial/tests/data/pdist-spearman-ml.txt +1 -0
  1221. scipy/spatial/tests/data/random-bool-data.txt +100 -0
  1222. scipy/spatial/tests/data/random-double-data.txt +100 -0
  1223. scipy/spatial/tests/data/random-int-data.txt +100 -0
  1224. scipy/spatial/tests/data/random-uint-data.txt +100 -0
  1225. scipy/spatial/tests/data/selfdual-4d-polytope.txt +27 -0
  1226. scipy/spatial/tests/test__plotutils.py +91 -0
  1227. scipy/spatial/tests/test__procrustes.py +116 -0
  1228. scipy/spatial/tests/test_distance.py +2389 -0
  1229. scipy/spatial/tests/test_hausdorff.py +199 -0
  1230. scipy/spatial/tests/test_kdtree.py +1536 -0
  1231. scipy/spatial/tests/test_qhull.py +1313 -0
  1232. scipy/spatial/tests/test_slerp.py +417 -0
  1233. scipy/spatial/tests/test_spherical_voronoi.py +358 -0
  1234. scipy/spatial/transform/__init__.py +31 -0
  1235. scipy/spatial/transform/_rigid_transform.cp311-win_arm64.lib +0 -0
  1236. scipy/spatial/transform/_rigid_transform.cp311-win_arm64.pyd +0 -0
  1237. scipy/spatial/transform/_rotation.cp311-win_arm64.lib +0 -0
  1238. scipy/spatial/transform/_rotation.cp311-win_arm64.pyd +0 -0
  1239. scipy/spatial/transform/_rotation_groups.py +140 -0
  1240. scipy/spatial/transform/_rotation_spline.py +460 -0
  1241. scipy/spatial/transform/rotation.py +21 -0
  1242. scipy/spatial/transform/tests/__init__.py +0 -0
  1243. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  1244. scipy/spatial/transform/tests/test_rotation.py +2569 -0
  1245. scipy/spatial/transform/tests/test_rotation_groups.py +169 -0
  1246. scipy/spatial/transform/tests/test_rotation_spline.py +183 -0
  1247. scipy/special/__init__.pxd +1 -0
  1248. scipy/special/__init__.py +841 -0
  1249. scipy/special/_add_newdocs.py +9961 -0
  1250. scipy/special/_basic.py +3576 -0
  1251. scipy/special/_comb.cp311-win_arm64.lib +0 -0
  1252. scipy/special/_comb.cp311-win_arm64.pyd +0 -0
  1253. scipy/special/_ellip_harm.py +214 -0
  1254. scipy/special/_ellip_harm_2.cp311-win_arm64.lib +0 -0
  1255. scipy/special/_ellip_harm_2.cp311-win_arm64.pyd +0 -0
  1256. scipy/special/_gufuncs.cp311-win_arm64.lib +0 -0
  1257. scipy/special/_gufuncs.cp311-win_arm64.pyd +0 -0
  1258. scipy/special/_input_validation.py +17 -0
  1259. scipy/special/_lambertw.py +149 -0
  1260. scipy/special/_logsumexp.py +426 -0
  1261. scipy/special/_mptestutils.py +453 -0
  1262. scipy/special/_multiufuncs.py +610 -0
  1263. scipy/special/_orthogonal.py +2592 -0
  1264. scipy/special/_orthogonal.pyi +330 -0
  1265. scipy/special/_precompute/__init__.py +0 -0
  1266. scipy/special/_precompute/cosine_cdf.py +17 -0
  1267. scipy/special/_precompute/expn_asy.py +54 -0
  1268. scipy/special/_precompute/gammainc_asy.py +116 -0
  1269. scipy/special/_precompute/gammainc_data.py +124 -0
  1270. scipy/special/_precompute/hyp2f1_data.py +484 -0
  1271. scipy/special/_precompute/lambertw.py +68 -0
  1272. scipy/special/_precompute/loggamma.py +43 -0
  1273. scipy/special/_precompute/struve_convergence.py +131 -0
  1274. scipy/special/_precompute/utils.py +38 -0
  1275. scipy/special/_precompute/wright_bessel.py +342 -0
  1276. scipy/special/_precompute/wright_bessel_data.py +152 -0
  1277. scipy/special/_precompute/wrightomega.py +41 -0
  1278. scipy/special/_precompute/zetac.py +27 -0
  1279. scipy/special/_sf_error.py +15 -0
  1280. scipy/special/_specfun.cp311-win_arm64.lib +0 -0
  1281. scipy/special/_specfun.cp311-win_arm64.pyd +0 -0
  1282. scipy/special/_special_ufuncs.cp311-win_arm64.lib +0 -0
  1283. scipy/special/_special_ufuncs.cp311-win_arm64.pyd +0 -0
  1284. scipy/special/_spfun_stats.py +106 -0
  1285. scipy/special/_spherical_bessel.py +397 -0
  1286. scipy/special/_support_alternative_backends.py +295 -0
  1287. scipy/special/_test_internal.cp311-win_arm64.lib +0 -0
  1288. scipy/special/_test_internal.cp311-win_arm64.pyd +0 -0
  1289. scipy/special/_test_internal.pyi +9 -0
  1290. scipy/special/_testutils.py +321 -0
  1291. scipy/special/_ufuncs.cp311-win_arm64.lib +0 -0
  1292. scipy/special/_ufuncs.cp311-win_arm64.pyd +0 -0
  1293. scipy/special/_ufuncs.pyi +522 -0
  1294. scipy/special/_ufuncs.pyx +13173 -0
  1295. scipy/special/_ufuncs_cxx.cp311-win_arm64.lib +0 -0
  1296. scipy/special/_ufuncs_cxx.cp311-win_arm64.pyd +0 -0
  1297. scipy/special/_ufuncs_cxx.pxd +142 -0
  1298. scipy/special/_ufuncs_cxx.pyx +427 -0
  1299. scipy/special/_ufuncs_cxx_defs.h +147 -0
  1300. scipy/special/_ufuncs_defs.h +57 -0
  1301. scipy/special/add_newdocs.py +15 -0
  1302. scipy/special/basic.py +87 -0
  1303. scipy/special/cython_special.cp311-win_arm64.lib +0 -0
  1304. scipy/special/cython_special.cp311-win_arm64.pyd +0 -0
  1305. scipy/special/cython_special.pxd +259 -0
  1306. scipy/special/cython_special.pyi +3 -0
  1307. scipy/special/orthogonal.py +45 -0
  1308. scipy/special/sf_error.py +20 -0
  1309. scipy/special/specfun.py +24 -0
  1310. scipy/special/spfun_stats.py +17 -0
  1311. scipy/special/tests/__init__.py +0 -0
  1312. scipy/special/tests/_cython_examples/extending.pyx +12 -0
  1313. scipy/special/tests/_cython_examples/meson.build +34 -0
  1314. scipy/special/tests/data/__init__.py +0 -0
  1315. scipy/special/tests/data/boost.npz +0 -0
  1316. scipy/special/tests/data/gsl.npz +0 -0
  1317. scipy/special/tests/data/local.npz +0 -0
  1318. scipy/special/tests/test_basic.py +4815 -0
  1319. scipy/special/tests/test_bdtr.py +112 -0
  1320. scipy/special/tests/test_boost_ufuncs.py +64 -0
  1321. scipy/special/tests/test_boxcox.py +125 -0
  1322. scipy/special/tests/test_cdflib.py +712 -0
  1323. scipy/special/tests/test_cdft_asymptotic.py +49 -0
  1324. scipy/special/tests/test_cephes_intp_cast.py +29 -0
  1325. scipy/special/tests/test_cosine_distr.py +83 -0
  1326. scipy/special/tests/test_cython_special.py +363 -0
  1327. scipy/special/tests/test_data.py +719 -0
  1328. scipy/special/tests/test_dd.py +42 -0
  1329. scipy/special/tests/test_digamma.py +45 -0
  1330. scipy/special/tests/test_ellip_harm.py +278 -0
  1331. scipy/special/tests/test_erfinv.py +89 -0
  1332. scipy/special/tests/test_exponential_integrals.py +118 -0
  1333. scipy/special/tests/test_extending.py +28 -0
  1334. scipy/special/tests/test_faddeeva.py +85 -0
  1335. scipy/special/tests/test_gamma.py +12 -0
  1336. scipy/special/tests/test_gammainc.py +152 -0
  1337. scipy/special/tests/test_hyp2f1.py +2566 -0
  1338. scipy/special/tests/test_hypergeometric.py +234 -0
  1339. scipy/special/tests/test_iv_ratio.py +249 -0
  1340. scipy/special/tests/test_kolmogorov.py +491 -0
  1341. scipy/special/tests/test_lambertw.py +109 -0
  1342. scipy/special/tests/test_legendre.py +1518 -0
  1343. scipy/special/tests/test_log1mexp.py +85 -0
  1344. scipy/special/tests/test_loggamma.py +70 -0
  1345. scipy/special/tests/test_logit.py +162 -0
  1346. scipy/special/tests/test_logsumexp.py +469 -0
  1347. scipy/special/tests/test_mpmath.py +2293 -0
  1348. scipy/special/tests/test_nan_inputs.py +65 -0
  1349. scipy/special/tests/test_ndtr.py +77 -0
  1350. scipy/special/tests/test_ndtri_exp.py +94 -0
  1351. scipy/special/tests/test_orthogonal.py +821 -0
  1352. scipy/special/tests/test_orthogonal_eval.py +275 -0
  1353. scipy/special/tests/test_owens_t.py +53 -0
  1354. scipy/special/tests/test_pcf.py +24 -0
  1355. scipy/special/tests/test_pdtr.py +48 -0
  1356. scipy/special/tests/test_powm1.py +65 -0
  1357. scipy/special/tests/test_precompute_expn_asy.py +24 -0
  1358. scipy/special/tests/test_precompute_gammainc.py +108 -0
  1359. scipy/special/tests/test_precompute_utils.py +36 -0
  1360. scipy/special/tests/test_round.py +18 -0
  1361. scipy/special/tests/test_sf_error.py +146 -0
  1362. scipy/special/tests/test_sici.py +36 -0
  1363. scipy/special/tests/test_specfun.py +48 -0
  1364. scipy/special/tests/test_spence.py +32 -0
  1365. scipy/special/tests/test_spfun_stats.py +61 -0
  1366. scipy/special/tests/test_sph_harm.py +85 -0
  1367. scipy/special/tests/test_spherical_bessel.py +400 -0
  1368. scipy/special/tests/test_support_alternative_backends.py +248 -0
  1369. scipy/special/tests/test_trig.py +72 -0
  1370. scipy/special/tests/test_ufunc_signatures.py +46 -0
  1371. scipy/special/tests/test_wright_bessel.py +205 -0
  1372. scipy/special/tests/test_wrightomega.py +117 -0
  1373. scipy/special/tests/test_zeta.py +301 -0
  1374. scipy/stats/__init__.py +670 -0
  1375. scipy/stats/_ansari_swilk_statistics.cp311-win_arm64.lib +0 -0
  1376. scipy/stats/_ansari_swilk_statistics.cp311-win_arm64.pyd +0 -0
  1377. scipy/stats/_axis_nan_policy.py +692 -0
  1378. scipy/stats/_biasedurn.cp311-win_arm64.lib +0 -0
  1379. scipy/stats/_biasedurn.cp311-win_arm64.pyd +0 -0
  1380. scipy/stats/_biasedurn.pxd +27 -0
  1381. scipy/stats/_binned_statistic.py +795 -0
  1382. scipy/stats/_binomtest.py +375 -0
  1383. scipy/stats/_bws_test.py +177 -0
  1384. scipy/stats/_censored_data.py +459 -0
  1385. scipy/stats/_common.py +5 -0
  1386. scipy/stats/_constants.py +42 -0
  1387. scipy/stats/_continued_fraction.py +387 -0
  1388. scipy/stats/_continuous_distns.py +12486 -0
  1389. scipy/stats/_correlation.py +210 -0
  1390. scipy/stats/_covariance.py +636 -0
  1391. scipy/stats/_crosstab.py +204 -0
  1392. scipy/stats/_discrete_distns.py +2098 -0
  1393. scipy/stats/_distn_infrastructure.py +4201 -0
  1394. scipy/stats/_distr_params.py +299 -0
  1395. scipy/stats/_distribution_infrastructure.py +5750 -0
  1396. scipy/stats/_entropy.py +428 -0
  1397. scipy/stats/_finite_differences.py +145 -0
  1398. scipy/stats/_fit.py +1351 -0
  1399. scipy/stats/_hypotests.py +2060 -0
  1400. scipy/stats/_kde.py +732 -0
  1401. scipy/stats/_ksstats.py +600 -0
  1402. scipy/stats/_levy_stable/__init__.py +1231 -0
  1403. scipy/stats/_levy_stable/levyst.cp311-win_arm64.lib +0 -0
  1404. scipy/stats/_levy_stable/levyst.cp311-win_arm64.pyd +0 -0
  1405. scipy/stats/_mannwhitneyu.py +492 -0
  1406. scipy/stats/_mgc.py +550 -0
  1407. scipy/stats/_morestats.py +4626 -0
  1408. scipy/stats/_mstats_basic.py +3658 -0
  1409. scipy/stats/_mstats_extras.py +521 -0
  1410. scipy/stats/_multicomp.py +449 -0
  1411. scipy/stats/_multivariate.py +7281 -0
  1412. scipy/stats/_new_distributions.py +452 -0
  1413. scipy/stats/_odds_ratio.py +466 -0
  1414. scipy/stats/_page_trend_test.py +486 -0
  1415. scipy/stats/_probability_distribution.py +1964 -0
  1416. scipy/stats/_qmc.py +2956 -0
  1417. scipy/stats/_qmc_cy.cp311-win_arm64.lib +0 -0
  1418. scipy/stats/_qmc_cy.cp311-win_arm64.pyd +0 -0
  1419. scipy/stats/_qmc_cy.pyi +54 -0
  1420. scipy/stats/_qmvnt.py +454 -0
  1421. scipy/stats/_qmvnt_cy.cp311-win_arm64.lib +0 -0
  1422. scipy/stats/_qmvnt_cy.cp311-win_arm64.pyd +0 -0
  1423. scipy/stats/_quantile.py +335 -0
  1424. scipy/stats/_rcont/__init__.py +4 -0
  1425. scipy/stats/_rcont/rcont.cp311-win_arm64.lib +0 -0
  1426. scipy/stats/_rcont/rcont.cp311-win_arm64.pyd +0 -0
  1427. scipy/stats/_relative_risk.py +263 -0
  1428. scipy/stats/_resampling.py +2352 -0
  1429. scipy/stats/_result_classes.py +40 -0
  1430. scipy/stats/_sampling.py +1314 -0
  1431. scipy/stats/_sensitivity_analysis.py +713 -0
  1432. scipy/stats/_sobol.cp311-win_arm64.lib +0 -0
  1433. scipy/stats/_sobol.cp311-win_arm64.pyd +0 -0
  1434. scipy/stats/_sobol.pyi +54 -0
  1435. scipy/stats/_sobol_direction_numbers.npz +0 -0
  1436. scipy/stats/_stats.cp311-win_arm64.lib +0 -0
  1437. scipy/stats/_stats.cp311-win_arm64.pyd +0 -0
  1438. scipy/stats/_stats.pxd +10 -0
  1439. scipy/stats/_stats_mstats_common.py +322 -0
  1440. scipy/stats/_stats_py.py +11089 -0
  1441. scipy/stats/_stats_pythran.cp311-win_arm64.lib +0 -0
  1442. scipy/stats/_stats_pythran.cp311-win_arm64.pyd +0 -0
  1443. scipy/stats/_survival.py +683 -0
  1444. scipy/stats/_tukeylambda_stats.py +199 -0
  1445. scipy/stats/_unuran/__init__.py +0 -0
  1446. scipy/stats/_unuran/unuran_wrapper.cp311-win_arm64.lib +0 -0
  1447. scipy/stats/_unuran/unuran_wrapper.cp311-win_arm64.pyd +0 -0
  1448. scipy/stats/_unuran/unuran_wrapper.pyi +179 -0
  1449. scipy/stats/_variation.py +126 -0
  1450. scipy/stats/_warnings_errors.py +38 -0
  1451. scipy/stats/_wilcoxon.py +265 -0
  1452. scipy/stats/biasedurn.py +16 -0
  1453. scipy/stats/contingency.py +521 -0
  1454. scipy/stats/distributions.py +24 -0
  1455. scipy/stats/kde.py +18 -0
  1456. scipy/stats/morestats.py +27 -0
  1457. scipy/stats/mstats.py +140 -0
  1458. scipy/stats/mstats_basic.py +42 -0
  1459. scipy/stats/mstats_extras.py +25 -0
  1460. scipy/stats/mvn.py +17 -0
  1461. scipy/stats/qmc.py +236 -0
  1462. scipy/stats/sampling.py +73 -0
  1463. scipy/stats/stats.py +41 -0
  1464. scipy/stats/tests/__init__.py +0 -0
  1465. scipy/stats/tests/common_tests.py +356 -0
  1466. scipy/stats/tests/data/_mvt.py +171 -0
  1467. scipy/stats/tests/data/fisher_exact_results_from_r.py +607 -0
  1468. scipy/stats/tests/data/jf_skew_t_gamlss_pdf_data.npy +0 -0
  1469. scipy/stats/tests/data/levy_stable/stable-Z1-cdf-sample-data.npy +0 -0
  1470. scipy/stats/tests/data/levy_stable/stable-Z1-pdf-sample-data.npy +0 -0
  1471. scipy/stats/tests/data/levy_stable/stable-loc-scale-sample-data.npy +0 -0
  1472. scipy/stats/tests/data/nist_anova/AtmWtAg.dat +108 -0
  1473. scipy/stats/tests/data/nist_anova/SiRstv.dat +85 -0
  1474. scipy/stats/tests/data/nist_anova/SmLs01.dat +249 -0
  1475. scipy/stats/tests/data/nist_anova/SmLs02.dat +1869 -0
  1476. scipy/stats/tests/data/nist_anova/SmLs03.dat +18069 -0
  1477. scipy/stats/tests/data/nist_anova/SmLs04.dat +249 -0
  1478. scipy/stats/tests/data/nist_anova/SmLs05.dat +1869 -0
  1479. scipy/stats/tests/data/nist_anova/SmLs06.dat +18069 -0
  1480. scipy/stats/tests/data/nist_anova/SmLs07.dat +249 -0
  1481. scipy/stats/tests/data/nist_anova/SmLs08.dat +1869 -0
  1482. scipy/stats/tests/data/nist_anova/SmLs09.dat +18069 -0
  1483. scipy/stats/tests/data/nist_linregress/Norris.dat +97 -0
  1484. scipy/stats/tests/data/rel_breitwigner_pdf_sample_data_ROOT.npy +0 -0
  1485. scipy/stats/tests/data/studentized_range_mpmath_ref.json +1499 -0
  1486. scipy/stats/tests/test_axis_nan_policy.py +1388 -0
  1487. scipy/stats/tests/test_binned_statistic.py +568 -0
  1488. scipy/stats/tests/test_censored_data.py +152 -0
  1489. scipy/stats/tests/test_contingency.py +294 -0
  1490. scipy/stats/tests/test_continued_fraction.py +173 -0
  1491. scipy/stats/tests/test_continuous.py +2198 -0
  1492. scipy/stats/tests/test_continuous_basic.py +1053 -0
  1493. scipy/stats/tests/test_continuous_fit_censored.py +683 -0
  1494. scipy/stats/tests/test_correlation.py +80 -0
  1495. scipy/stats/tests/test_crosstab.py +115 -0
  1496. scipy/stats/tests/test_discrete_basic.py +580 -0
  1497. scipy/stats/tests/test_discrete_distns.py +700 -0
  1498. scipy/stats/tests/test_distributions.py +10413 -0
  1499. scipy/stats/tests/test_entropy.py +322 -0
  1500. scipy/stats/tests/test_fast_gen_inversion.py +435 -0
  1501. scipy/stats/tests/test_fit.py +1090 -0
  1502. scipy/stats/tests/test_hypotests.py +1991 -0
  1503. scipy/stats/tests/test_kdeoth.py +676 -0
  1504. scipy/stats/tests/test_marray.py +289 -0
  1505. scipy/stats/tests/test_mgc.py +217 -0
  1506. scipy/stats/tests/test_morestats.py +3259 -0
  1507. scipy/stats/tests/test_mstats_basic.py +2071 -0
  1508. scipy/stats/tests/test_mstats_extras.py +172 -0
  1509. scipy/stats/tests/test_multicomp.py +405 -0
  1510. scipy/stats/tests/test_multivariate.py +4381 -0
  1511. scipy/stats/tests/test_odds_ratio.py +148 -0
  1512. scipy/stats/tests/test_qmc.py +1492 -0
  1513. scipy/stats/tests/test_quantile.py +199 -0
  1514. scipy/stats/tests/test_rank.py +345 -0
  1515. scipy/stats/tests/test_relative_risk.py +95 -0
  1516. scipy/stats/tests/test_resampling.py +2000 -0
  1517. scipy/stats/tests/test_sampling.py +1450 -0
  1518. scipy/stats/tests/test_sensitivity_analysis.py +310 -0
  1519. scipy/stats/tests/test_stats.py +9707 -0
  1520. scipy/stats/tests/test_survival.py +466 -0
  1521. scipy/stats/tests/test_tukeylambda_stats.py +85 -0
  1522. scipy/stats/tests/test_variation.py +216 -0
  1523. scipy/version.py +12 -0
  1524. scipy-1.16.2.dist-info/DELVEWHEEL +2 -0
  1525. scipy-1.16.2.dist-info/LICENSE.txt +912 -0
  1526. scipy-1.16.2.dist-info/METADATA +1061 -0
  1527. scipy-1.16.2.dist-info/RECORD +1530 -0
  1528. scipy-1.16.2.dist-info/WHEEL +4 -0
  1529. scipy.libs/msvcp140-5f1c5dd31916990d94181e07bc3afb32.dll +0 -0
  1530. scipy.libs/scipy_openblas-f3ac85b1f412f7e86514c923dc4058d1.dll +0 -0
scipy/_lib/_util.py ADDED
@@ -0,0 +1,1283 @@
1
+ import re
2
+ from contextlib import contextmanager
3
+ import functools
4
+ import operator
5
+ import warnings
6
+ import numbers
7
+ from collections import namedtuple
8
+ import inspect
9
+ import math
10
+ from types import ModuleType
11
+ from typing import Literal, TypeAlias, TypeVar
12
+
13
+ import numpy as np
14
+ from scipy._lib._array_api import (Array, array_namespace, is_lazy_array,
15
+ is_numpy, is_marray, xp_result_device,
16
+ xp_size, xp_result_type)
17
+ from scipy._lib._docscrape import FunctionDoc, Parameter
18
+ from scipy._lib._sparse import issparse
19
+
20
+ from numpy.exceptions import AxisError
21
+
22
+
23
+ np_long: type
24
+ np_ulong: type
25
+
26
+ if np.lib.NumpyVersion(np.__version__) >= "2.0.0.dev0":
27
+ try:
28
+ with warnings.catch_warnings():
29
+ warnings.filterwarnings(
30
+ "ignore",
31
+ r".*In the future `np\.long` will be defined as.*",
32
+ FutureWarning,
33
+ )
34
+ np_long = np.long # type: ignore[attr-defined]
35
+ np_ulong = np.ulong # type: ignore[attr-defined]
36
+ except AttributeError:
37
+ np_long = np.int_
38
+ np_ulong = np.uint
39
+ else:
40
+ np_long = np.int_
41
+ np_ulong = np.uint
42
+
43
+ IntNumber = int | np.integer
44
+ DecimalNumber = float | np.floating | np.integer
45
+
46
+ copy_if_needed: bool | None
47
+
48
+ if np.lib.NumpyVersion(np.__version__) >= "2.0.0":
49
+ copy_if_needed = None
50
+ elif np.lib.NumpyVersion(np.__version__) < "1.28.0":
51
+ copy_if_needed = False
52
+ else:
53
+ # 2.0.0 dev versions, handle cases where copy may or may not exist
54
+ try:
55
+ np.array([1]).__array__(copy=None) # type: ignore[call-overload]
56
+ copy_if_needed = None
57
+ except TypeError:
58
+ copy_if_needed = False
59
+
60
+
61
+ _RNG: TypeAlias = np.random.Generator | np.random.RandomState
62
+ SeedType: TypeAlias = IntNumber | _RNG | None
63
+
64
+ GeneratorType = TypeVar("GeneratorType", bound=_RNG)
65
+
66
+ # Since Generator was introduced in numpy 1.17, the following condition is needed for
67
+ # backward compatibility
68
+ try:
69
+ from numpy.random import Generator as Generator
70
+ except ImportError:
71
+ class Generator: # type: ignore[no-redef]
72
+ pass
73
+
74
+
75
+ def _lazyselect(condlist, choicelist, arrays, default=0):
76
+ """
77
+ Mimic `np.select(condlist, choicelist)`.
78
+
79
+ Notice, it assumes that all `arrays` are of the same shape or can be
80
+ broadcasted together.
81
+
82
+ All functions in `choicelist` must accept array arguments in the order
83
+ given in `arrays` and must return an array of the same shape as broadcasted
84
+ `arrays`.
85
+
86
+ Examples
87
+ --------
88
+ >>> import numpy as np
89
+ >>> x = np.arange(6)
90
+ >>> np.select([x <3, x > 3], [x**2, x**3], default=0)
91
+ array([ 0, 1, 4, 0, 64, 125])
92
+
93
+ >>> _lazyselect([x < 3, x > 3], [lambda x: x**2, lambda x: x**3], (x,))
94
+ array([ 0., 1., 4., 0., 64., 125.])
95
+
96
+ >>> a = -np.ones_like(x)
97
+ >>> _lazyselect([x < 3, x > 3],
98
+ ... [lambda x, a: x**2, lambda x, a: a * x**3],
99
+ ... (x, a), default=np.nan)
100
+ array([ 0., 1., 4., nan, -64., -125.])
101
+
102
+ """
103
+ arrays = np.broadcast_arrays(*arrays)
104
+ tcode = np.mintypecode([a.dtype.char for a in arrays])
105
+ out = np.full(np.shape(arrays[0]), fill_value=default, dtype=tcode)
106
+ for func, cond in zip(choicelist, condlist):
107
+ if np.all(cond is False):
108
+ continue
109
+ cond, _ = np.broadcast_arrays(cond, arrays[0])
110
+ temp = tuple(np.extract(cond, arr) for arr in arrays)
111
+ np.place(out, cond, func(*temp))
112
+ return out
113
+
114
+
115
+ def _aligned_zeros(shape, dtype=float, order="C", align=None):
116
+ """Allocate a new ndarray with aligned memory.
117
+
118
+ Primary use case for this currently is working around a f2py issue
119
+ in NumPy 1.9.1, where dtype.alignment is such that np.zeros() does
120
+ not necessarily create arrays aligned up to it.
121
+
122
+ """
123
+ dtype = np.dtype(dtype)
124
+ if align is None:
125
+ align = dtype.alignment
126
+ if not hasattr(shape, '__len__'):
127
+ shape = (shape,)
128
+ size = functools.reduce(operator.mul, shape) * dtype.itemsize
129
+ buf = np.empty(size + align + 1, np.uint8)
130
+ offset = buf.__array_interface__['data'][0] % align
131
+ if offset != 0:
132
+ offset = align - offset
133
+ # Note: slices producing 0-size arrays do not necessarily change
134
+ # data pointer --- so we use and allocate size+1
135
+ buf = buf[offset:offset+size+1][:-1]
136
+ data = np.ndarray(shape, dtype, buf, order=order)
137
+ data.fill(0)
138
+ return data
139
+
140
+
141
+ def _prune_array(array):
142
+ """Return an array equivalent to the input array. If the input
143
+ array is a view of a much larger array, copy its contents to a
144
+ newly allocated array. Otherwise, return the input unchanged.
145
+ """
146
+ if array.base is not None and array.size < array.base.size // 2:
147
+ return array.copy()
148
+ return array
149
+
150
+
151
+ def float_factorial(n: int) -> float:
152
+ """Compute the factorial and return as a float
153
+
154
+ Returns infinity when result is too large for a double
155
+ """
156
+ return float(math.factorial(n)) if n < 171 else np.inf
157
+
158
+
159
+ _rng_desc = (
160
+ r"""If `rng` is passed by keyword, types other than `numpy.random.Generator` are
161
+ passed to `numpy.random.default_rng` to instantiate a ``Generator``.
162
+ If `rng` is already a ``Generator`` instance, then the provided instance is
163
+ used. Specify `rng` for repeatable function behavior.
164
+
165
+ If this argument is passed by position or `{old_name}` is passed by keyword,
166
+ legacy behavior for the argument `{old_name}` applies:
167
+
168
+ - If `{old_name}` is None (or `numpy.random`), the `numpy.random.RandomState`
169
+ singleton is used.
170
+ - If `{old_name}` is an int, a new ``RandomState`` instance is used,
171
+ seeded with `{old_name}`.
172
+ - If `{old_name}` is already a ``Generator`` or ``RandomState`` instance then
173
+ that instance is used.
174
+
175
+ .. versionchanged:: 1.15.0
176
+ As part of the `SPEC-007 <https://scientific-python.org/specs/spec-0007/>`_
177
+ transition from use of `numpy.random.RandomState` to
178
+ `numpy.random.Generator`, this keyword was changed from `{old_name}` to `rng`.
179
+ For an interim period, both keywords will continue to work, although only one
180
+ may be specified at a time. After the interim period, function calls using the
181
+ `{old_name}` keyword will emit warnings. The behavior of both `{old_name}` and
182
+ `rng` are outlined above, but only the `rng` keyword should be used in new code.
183
+ """
184
+ )
185
+
186
+
187
+ # SPEC 7
188
+ def _transition_to_rng(old_name, *, position_num=None, end_version=None,
189
+ replace_doc=True):
190
+ """Example decorator to transition from old PRNG usage to new `rng` behavior
191
+
192
+ Suppose the decorator is applied to a function that used to accept parameter
193
+ `old_name='random_state'` either by keyword or as a positional argument at
194
+ `position_num=1`. At the time of application, the name of the argument in the
195
+ function signature is manually changed to the new name, `rng`. If positional
196
+ use was allowed before, this is not changed.*
197
+
198
+ - If the function is called with both `random_state` and `rng`, the decorator
199
+ raises an error.
200
+ - If `random_state` is provided as a keyword argument, the decorator passes
201
+ `random_state` to the function's `rng` argument as a keyword. If `end_version`
202
+ is specified, the decorator will emit a `DeprecationWarning` about the
203
+ deprecation of keyword `random_state`.
204
+ - If `random_state` is provided as a positional argument, the decorator passes
205
+ `random_state` to the function's `rng` argument by position. If `end_version`
206
+ is specified, the decorator will emit a `FutureWarning` about the changing
207
+ interpretation of the argument.
208
+ - If `rng` is provided as a keyword argument, the decorator validates `rng` using
209
+ `numpy.random.default_rng` before passing it to the function.
210
+ - If `end_version` is specified and neither `random_state` nor `rng` is provided
211
+ by the user, the decorator checks whether `np.random.seed` has been used to set
212
+ the global seed. If so, it emits a `FutureWarning`, noting that usage of
213
+ `numpy.random.seed` will eventually have no effect. Either way, the decorator
214
+ calls the function without explicitly passing the `rng` argument.
215
+
216
+ If `end_version` is specified, a user must pass `rng` as a keyword to avoid
217
+ warnings.
218
+
219
+ After the deprecation period, the decorator can be removed, and the function
220
+ can simply validate the `rng` argument by calling `np.random.default_rng(rng)`.
221
+
222
+ * A `FutureWarning` is emitted when the PRNG argument is used by
223
+ position. It indicates that the "Hinsen principle" (same
224
+ code yielding different results in two versions of the software)
225
+ will be violated, unless positional use is deprecated. Specifically:
226
+
227
+ - If `None` is passed by position and `np.random.seed` has been used,
228
+ the function will change from being seeded to being unseeded.
229
+ - If an integer is passed by position, the random stream will change.
230
+ - If `np.random` or an instance of `RandomState` is passed by position,
231
+ an error will be raised.
232
+
233
+ We suggest that projects consider deprecating positional use of
234
+ `random_state`/`rng` (i.e., change their function signatures to
235
+ ``def my_func(..., *, rng=None)``); that might not make sense
236
+ for all projects, so this SPEC does not make that
237
+ recommendation, neither does this decorator enforce it.
238
+
239
+ Parameters
240
+ ----------
241
+ old_name : str
242
+ The old name of the PRNG argument (e.g. `seed` or `random_state`).
243
+ position_num : int, optional
244
+ The (0-indexed) position of the old PRNG argument (if accepted by position).
245
+ Maintainers are welcome to eliminate this argument and use, for example,
246
+ `inspect`, if preferred.
247
+ end_version : str, optional
248
+ The full version number of the library when the behavior described in
249
+ `DeprecationWarning`s and `FutureWarning`s will take effect. If left
250
+ unspecified, no warnings will be emitted by the decorator.
251
+ replace_doc : bool, default: True
252
+ Whether the decorator should replace the documentation for parameter `rng` with
253
+ `_rng_desc` (defined above), which documents both new `rng` keyword behavior
254
+ and typical legacy `random_state`/`seed` behavior. If True, manually replace
255
+ the first paragraph of the function's old `random_state`/`seed` documentation
256
+ with the desired *final* `rng` documentation; this way, no changes to
257
+ documentation are needed when the decorator is removed. Documentation of `rng`
258
+ after the first blank line is preserved. Use False if the function's old
259
+ `random_state`/`seed` behavior does not match that described by `_rng_desc`.
260
+
261
+ """
262
+ NEW_NAME = "rng"
263
+
264
+ cmn_msg = (
265
+ "To silence this warning and ensure consistent behavior in SciPy "
266
+ f"{end_version}, control the RNG using argument `{NEW_NAME}`. Arguments passed "
267
+ f"to keyword `{NEW_NAME}` will be validated by `np.random.default_rng`, so the "
268
+ "behavior corresponding with a given value may change compared to use of "
269
+ f"`{old_name}`. For example, "
270
+ "1) `None` will result in unpredictable random numbers, "
271
+ "2) an integer will result in a different stream of random numbers, (with the "
272
+ "same distribution), and "
273
+ "3) `np.random` or `RandomState` instances will result in an error. "
274
+ "See the documentation of `default_rng` for more information."
275
+ )
276
+
277
+ def decorator(fun):
278
+ @functools.wraps(fun)
279
+ def wrapper(*args, **kwargs):
280
+ # Determine how PRNG was passed
281
+ as_old_kwarg = old_name in kwargs
282
+ as_new_kwarg = NEW_NAME in kwargs
283
+ as_pos_arg = position_num is not None and len(args) >= position_num + 1
284
+ emit_warning = end_version is not None
285
+
286
+ # Can only specify PRNG one of the three ways
287
+ if int(as_old_kwarg) + int(as_new_kwarg) + int(as_pos_arg) > 1:
288
+ message = (
289
+ f"{fun.__name__}() got multiple values for "
290
+ f"argument now known as `{NEW_NAME}`. Specify one of "
291
+ f"`{NEW_NAME}` or `{old_name}`."
292
+ )
293
+ raise TypeError(message)
294
+
295
+ # Check whether global random state has been set
296
+ global_seed_set = np.random.mtrand._rand._bit_generator._seed_seq is None
297
+
298
+ if as_old_kwarg: # warn about deprecated use of old kwarg
299
+ kwargs[NEW_NAME] = kwargs.pop(old_name)
300
+ if emit_warning:
301
+ message = (
302
+ f"Use of keyword argument `{old_name}` is "
303
+ f"deprecated and replaced by `{NEW_NAME}`. "
304
+ f"Support for `{old_name}` will be removed "
305
+ f"in SciPy {end_version}. "
306
+ ) + cmn_msg
307
+ warnings.warn(message, DeprecationWarning, stacklevel=2)
308
+
309
+ elif as_pos_arg:
310
+ # Warn about changing meaning of positional arg
311
+
312
+ # Note that this decorator does not deprecate positional use of the
313
+ # argument; it only warns that the behavior will change in the future.
314
+ # Simultaneously transitioning to keyword-only use is another option.
315
+
316
+ arg = args[position_num]
317
+ # If the argument is None and the global seed wasn't set, or if the
318
+ # argument is one of a few new classes, the user will not notice change
319
+ # in behavior.
320
+ ok_classes = (
321
+ np.random.Generator,
322
+ np.random.SeedSequence,
323
+ np.random.BitGenerator,
324
+ )
325
+ if (arg is None and not global_seed_set) or isinstance(arg, ok_classes):
326
+ pass
327
+ elif emit_warning:
328
+ message = (
329
+ f"Positional use of `{NEW_NAME}` (formerly known as "
330
+ f"`{old_name}`) is still allowed, but the behavior is "
331
+ "changing: the argument will be normalized using "
332
+ f"`np.random.default_rng` beginning in SciPy {end_version}, "
333
+ "and the resulting `Generator` will be used to generate "
334
+ "random numbers."
335
+ ) + cmn_msg
336
+ warnings.warn(message, FutureWarning, stacklevel=2)
337
+
338
+ elif as_new_kwarg: # no warnings; this is the preferred use
339
+ # After the removal of the decorator, normalization with
340
+ # np.random.default_rng will be done inside the decorated function
341
+ kwargs[NEW_NAME] = np.random.default_rng(kwargs[NEW_NAME])
342
+
343
+ elif global_seed_set and emit_warning:
344
+ # Emit FutureWarning if `np.random.seed` was used and no PRNG was passed
345
+ message = (
346
+ "The NumPy global RNG was seeded by calling "
347
+ f"`np.random.seed`. Beginning in {end_version}, this "
348
+ "function will no longer use the global RNG."
349
+ ) + cmn_msg
350
+ warnings.warn(message, FutureWarning, stacklevel=2)
351
+
352
+ return fun(*args, **kwargs)
353
+
354
+ # Add the old parameter name to the function signature
355
+ wrapped_signature = inspect.signature(fun)
356
+ wrapper.__signature__ = wrapped_signature.replace(parameters=[
357
+ *wrapped_signature.parameters.values(),
358
+ inspect.Parameter(old_name, inspect.Parameter.KEYWORD_ONLY, default=None),
359
+ ])
360
+
361
+ if replace_doc:
362
+ doc = FunctionDoc(wrapper)
363
+ parameter_names = [param.name for param in doc['Parameters']]
364
+ if 'rng' in parameter_names:
365
+ _type = "{None, int, `numpy.random.Generator`}, optional"
366
+ _desc = _rng_desc.replace("{old_name}", old_name)
367
+ old_doc = doc['Parameters'][parameter_names.index('rng')].desc
368
+ old_doc_keep = old_doc[old_doc.index("") + 1:] if "" in old_doc else []
369
+ new_doc = [_desc] + old_doc_keep
370
+ _rng_parameter_doc = Parameter('rng', _type, new_doc)
371
+ doc['Parameters'][parameter_names.index('rng')] = _rng_parameter_doc
372
+ doc = str(doc).split("\n", 1)[1] # remove signature
373
+ wrapper.__doc__ = str(doc)
374
+ return wrapper
375
+
376
+ return decorator
377
+
378
+
379
+ # copy-pasted from scikit-learn utils/validation.py
380
+ def check_random_state(seed):
381
+ """Turn `seed` into a `np.random.RandomState` instance.
382
+
383
+ Parameters
384
+ ----------
385
+ seed : {None, int, `numpy.random.Generator`, `numpy.random.RandomState`}, optional
386
+ If `seed` is None (or `np.random`), the `numpy.random.RandomState`
387
+ singleton is used.
388
+ If `seed` is an int, a new ``RandomState`` instance is used,
389
+ seeded with `seed`.
390
+ If `seed` is already a ``Generator`` or ``RandomState`` instance then
391
+ that instance is used.
392
+
393
+ Returns
394
+ -------
395
+ seed : {`numpy.random.Generator`, `numpy.random.RandomState`}
396
+ Random number generator.
397
+
398
+ """
399
+ if seed is None or seed is np.random:
400
+ return np.random.mtrand._rand
401
+ if isinstance(seed, numbers.Integral | np.integer):
402
+ return np.random.RandomState(seed)
403
+ if isinstance(seed, np.random.RandomState | np.random.Generator):
404
+ return seed
405
+
406
+ raise ValueError(f"'{seed}' cannot be used to seed a numpy.random.RandomState"
407
+ " instance")
408
+
409
+
410
+ def _asarray_validated(a, check_finite=True,
411
+ sparse_ok=False, objects_ok=False, mask_ok=False,
412
+ as_inexact=False):
413
+ """
414
+ Helper function for SciPy argument validation.
415
+
416
+ Many SciPy linear algebra functions do support arbitrary array-like
417
+ input arguments. Examples of commonly unsupported inputs include
418
+ matrices containing inf/nan, sparse matrix representations, and
419
+ matrices with complicated elements.
420
+
421
+ Parameters
422
+ ----------
423
+ a : array_like
424
+ The array-like input.
425
+ check_finite : bool, optional
426
+ Whether to check that the input matrices contain only finite numbers.
427
+ Disabling may give a performance gain, but may result in problems
428
+ (crashes, non-termination) if the inputs do contain infinities or NaNs.
429
+ Default: True
430
+ sparse_ok : bool, optional
431
+ True if scipy sparse matrices are allowed.
432
+ objects_ok : bool, optional
433
+ True if arrays with dype('O') are allowed.
434
+ mask_ok : bool, optional
435
+ True if masked arrays are allowed.
436
+ as_inexact : bool, optional
437
+ True to convert the input array to a np.inexact dtype.
438
+
439
+ Returns
440
+ -------
441
+ ret : ndarray
442
+ The converted validated array.
443
+
444
+ """
445
+ if not sparse_ok:
446
+ if issparse(a):
447
+ msg = ('Sparse arrays/matrices are not supported by this function. '
448
+ 'Perhaps one of the `scipy.sparse.linalg` functions '
449
+ 'would work instead.')
450
+ raise ValueError(msg)
451
+ if not mask_ok:
452
+ if np.ma.isMaskedArray(a):
453
+ raise ValueError('masked arrays are not supported')
454
+ toarray = np.asarray_chkfinite if check_finite else np.asarray
455
+ a = toarray(a)
456
+ if not objects_ok:
457
+ if a.dtype is np.dtype('O'):
458
+ raise ValueError('object arrays are not supported')
459
+ if as_inexact:
460
+ if not np.issubdtype(a.dtype, np.inexact):
461
+ a = toarray(a, dtype=np.float64)
462
+ return a
463
+
464
+
465
+ def _validate_int(k, name, minimum=None):
466
+ """
467
+ Validate a scalar integer.
468
+
469
+ This function can be used to validate an argument to a function
470
+ that expects the value to be an integer. It uses `operator.index`
471
+ to validate the value (so, for example, k=2.0 results in a
472
+ TypeError).
473
+
474
+ Parameters
475
+ ----------
476
+ k : int
477
+ The value to be validated.
478
+ name : str
479
+ The name of the parameter.
480
+ minimum : int, optional
481
+ An optional lower bound.
482
+ """
483
+ try:
484
+ k = operator.index(k)
485
+ except TypeError:
486
+ raise TypeError(f'{name} must be an integer.') from None
487
+ if minimum is not None and k < minimum:
488
+ raise ValueError(f'{name} must be an integer not less '
489
+ f'than {minimum}') from None
490
+ return k
491
+
492
+
493
+ # Add a replacement for inspect.getfullargspec()/
494
+ # The version below is borrowed from Django,
495
+ # https://github.com/django/django/pull/4846.
496
+
497
+ # Note an inconsistency between inspect.getfullargspec(func) and
498
+ # inspect.signature(func). If `func` is a bound method, the latter does *not*
499
+ # list `self` as a first argument, while the former *does*.
500
+ # Hence, cook up a common ground replacement: `getfullargspec_no_self` which
501
+ # mimics `inspect.getfullargspec` but does not list `self`.
502
+ #
503
+ # This way, the caller code does not need to know whether it uses a legacy
504
+ # .getfullargspec or a bright and shiny .signature.
505
+
506
+ FullArgSpec = namedtuple('FullArgSpec',
507
+ ['args', 'varargs', 'varkw', 'defaults',
508
+ 'kwonlyargs', 'kwonlydefaults', 'annotations'])
509
+
510
+
511
+ def getfullargspec_no_self(func):
512
+ """inspect.getfullargspec replacement using inspect.signature.
513
+
514
+ If func is a bound method, do not list the 'self' parameter.
515
+
516
+ Parameters
517
+ ----------
518
+ func : callable
519
+ A callable to inspect
520
+
521
+ Returns
522
+ -------
523
+ fullargspec : FullArgSpec(args, varargs, varkw, defaults, kwonlyargs,
524
+ kwonlydefaults, annotations)
525
+
526
+ NOTE: if the first argument of `func` is self, it is *not*, I repeat
527
+ *not*, included in fullargspec.args.
528
+ This is done for consistency between inspect.getargspec() under
529
+ Python 2.x, and inspect.signature() under Python 3.x.
530
+
531
+ """
532
+ sig = inspect.signature(func)
533
+ args = [
534
+ p.name for p in sig.parameters.values()
535
+ if p.kind in [inspect.Parameter.POSITIONAL_OR_KEYWORD,
536
+ inspect.Parameter.POSITIONAL_ONLY]
537
+ ]
538
+ varargs = [
539
+ p.name for p in sig.parameters.values()
540
+ if p.kind == inspect.Parameter.VAR_POSITIONAL
541
+ ]
542
+ varargs = varargs[0] if varargs else None
543
+ varkw = [
544
+ p.name for p in sig.parameters.values()
545
+ if p.kind == inspect.Parameter.VAR_KEYWORD
546
+ ]
547
+ varkw = varkw[0] if varkw else None
548
+ defaults = tuple(
549
+ p.default for p in sig.parameters.values()
550
+ if (p.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD and
551
+ p.default is not p.empty)
552
+ ) or None
553
+ kwonlyargs = [
554
+ p.name for p in sig.parameters.values()
555
+ if p.kind == inspect.Parameter.KEYWORD_ONLY
556
+ ]
557
+ kwdefaults = {p.name: p.default for p in sig.parameters.values()
558
+ if p.kind == inspect.Parameter.KEYWORD_ONLY and
559
+ p.default is not p.empty}
560
+ annotations = {p.name: p.annotation for p in sig.parameters.values()
561
+ if p.annotation is not p.empty}
562
+ return FullArgSpec(args, varargs, varkw, defaults, kwonlyargs,
563
+ kwdefaults or None, annotations)
564
+
565
+
566
+ class _FunctionWrapper:
567
+ """
568
+ Object to wrap user's function, allowing picklability
569
+ """
570
+ def __init__(self, f, args):
571
+ self.f = f
572
+ self.args = [] if args is None else args
573
+
574
+ def __call__(self, x):
575
+ return self.f(x, *self.args)
576
+
577
+
578
+ class _ScalarFunctionWrapper:
579
+ """
580
+ Object to wrap scalar user function, allowing picklability
581
+ """
582
+ def __init__(self, f, args=None):
583
+ self.f = f
584
+ self.args = [] if args is None else args
585
+ self.nfev = 0
586
+
587
+ def __call__(self, x):
588
+ # Send a copy because the user may overwrite it.
589
+ # The user of this class might want `x` to remain unchanged.
590
+ fx = self.f(np.copy(x), *self.args)
591
+ self.nfev += 1
592
+
593
+ # Make sure the function returns a true scalar
594
+ if not np.isscalar(fx):
595
+ try:
596
+ fx = np.asarray(fx).item()
597
+ except (TypeError, ValueError) as e:
598
+ raise ValueError(
599
+ "The user-provided objective function "
600
+ "must return a scalar value."
601
+ ) from e
602
+ return fx
603
+
604
+ class MapWrapper:
605
+ """
606
+ Parallelisation wrapper for working with map-like callables, such as
607
+ `multiprocessing.Pool.map`.
608
+
609
+ Parameters
610
+ ----------
611
+ pool : int or map-like callable
612
+ If `pool` is an integer, then it specifies the number of threads to
613
+ use for parallelization. If ``int(pool) == 1``, then no parallel
614
+ processing is used and the map builtin is used.
615
+ If ``pool == -1``, then the pool will utilize all available CPUs.
616
+ If `pool` is a map-like callable that follows the same
617
+ calling sequence as the built-in map function, then this callable is
618
+ used for parallelization.
619
+ """
620
+ def __init__(self, pool=1):
621
+ self.pool = None
622
+ self._mapfunc = map
623
+ self._own_pool = False
624
+
625
+ if callable(pool):
626
+ self.pool = pool
627
+ self._mapfunc = self.pool
628
+ else:
629
+ from multiprocessing import Pool
630
+ # user supplies a number
631
+ if int(pool) == -1:
632
+ # use as many processors as possible
633
+ self.pool = Pool()
634
+ self._mapfunc = self.pool.map
635
+ self._own_pool = True
636
+ elif int(pool) == 1:
637
+ pass
638
+ elif int(pool) > 1:
639
+ # use the number of processors requested
640
+ self.pool = Pool(processes=int(pool))
641
+ self._mapfunc = self.pool.map
642
+ self._own_pool = True
643
+ else:
644
+ raise RuntimeError("Number of workers specified must be -1,"
645
+ " an int >= 1, or an object with a 'map' "
646
+ "method")
647
+
648
+ def __enter__(self):
649
+ return self
650
+
651
+ def terminate(self):
652
+ if self._own_pool:
653
+ self.pool.terminate()
654
+
655
+ def join(self):
656
+ if self._own_pool:
657
+ self.pool.join()
658
+
659
+ def close(self):
660
+ if self._own_pool:
661
+ self.pool.close()
662
+
663
+ def __exit__(self, exc_type, exc_value, traceback):
664
+ if self._own_pool:
665
+ self.pool.close()
666
+ self.pool.terminate()
667
+
668
+ def __call__(self, func, iterable):
669
+ # only accept one iterable because that's all Pool.map accepts
670
+ try:
671
+ return self._mapfunc(func, iterable)
672
+ except TypeError as e:
673
+ # wrong number of arguments
674
+ raise TypeError("The map-like callable must be of the"
675
+ " form f(func, iterable)") from e
676
+
677
+
678
+ def _workers_wrapper(func):
679
+ """
680
+ Wrapper to deal with setup-cleanup of workers outside a user function via a
681
+ ContextManager. It saves having to do the setup/tear down with within that
682
+ function, which can be messy.
683
+ """
684
+ @functools.wraps(func)
685
+ def inner(*args, **kwds):
686
+ kwargs = kwds.copy()
687
+ if 'workers' not in kwargs:
688
+ _workers = map
689
+ elif 'workers' in kwargs and kwargs['workers'] is None:
690
+ _workers = map
691
+ else:
692
+ _workers = kwargs['workers']
693
+
694
+ with MapWrapper(_workers) as mf:
695
+ kwargs['workers'] = mf
696
+ return func(*args, **kwargs)
697
+
698
+ return inner
699
+
700
+
701
+ def rng_integers(gen, low, high=None, size=None, dtype='int64',
702
+ endpoint=False):
703
+ """
704
+ Return random integers from low (inclusive) to high (exclusive), or if
705
+ endpoint=True, low (inclusive) to high (inclusive). Replaces
706
+ `RandomState.randint` (with endpoint=False) and
707
+ `RandomState.random_integers` (with endpoint=True).
708
+
709
+ Return random integers from the "discrete uniform" distribution of the
710
+ specified dtype. If high is None (the default), then results are from
711
+ 0 to low.
712
+
713
+ Parameters
714
+ ----------
715
+ gen : {None, np.random.RandomState, np.random.Generator}
716
+ Random number generator. If None, then the np.random.RandomState
717
+ singleton is used.
718
+ low : int or array-like of ints
719
+ Lowest (signed) integers to be drawn from the distribution (unless
720
+ high=None, in which case this parameter is 0 and this value is used
721
+ for high).
722
+ high : int or array-like of ints
723
+ If provided, one above the largest (signed) integer to be drawn from
724
+ the distribution (see above for behavior if high=None). If array-like,
725
+ must contain integer values.
726
+ size : array-like of ints, optional
727
+ Output shape. If the given shape is, e.g., (m, n, k), then m * n * k
728
+ samples are drawn. Default is None, in which case a single value is
729
+ returned.
730
+ dtype : {str, dtype}, optional
731
+ Desired dtype of the result. All dtypes are determined by their name,
732
+ i.e., 'int64', 'int', etc, so byteorder is not available and a specific
733
+ precision may have different C types depending on the platform.
734
+ The default value is 'int64'.
735
+ endpoint : bool, optional
736
+ If True, sample from the interval [low, high] instead of the default
737
+ [low, high) Defaults to False.
738
+
739
+ Returns
740
+ -------
741
+ out: int or ndarray of ints
742
+ size-shaped array of random integers from the appropriate distribution,
743
+ or a single such random int if size not provided.
744
+ """
745
+ if isinstance(gen, Generator):
746
+ return gen.integers(low, high=high, size=size, dtype=dtype,
747
+ endpoint=endpoint)
748
+ else:
749
+ if gen is None:
750
+ # default is RandomState singleton used by np.random.
751
+ gen = np.random.mtrand._rand
752
+ if endpoint:
753
+ # inclusive of endpoint
754
+ # remember that low and high can be arrays, so don't modify in
755
+ # place
756
+ if high is None:
757
+ return gen.randint(low + 1, size=size, dtype=dtype)
758
+ if high is not None:
759
+ return gen.randint(low, high=high + 1, size=size, dtype=dtype)
760
+
761
+ # exclusive
762
+ return gen.randint(low, high=high, size=size, dtype=dtype)
763
+
764
+
765
+ @contextmanager
766
+ def _fixed_default_rng(seed=1638083107694713882823079058616272161):
767
+ """Context with a fixed np.random.default_rng seed."""
768
+ orig_fun = np.random.default_rng
769
+ np.random.default_rng = lambda seed=seed: orig_fun(seed)
770
+ try:
771
+ yield
772
+ finally:
773
+ np.random.default_rng = orig_fun
774
+
775
+
776
+ def _rng_html_rewrite(func):
777
+ """Rewrite the HTML rendering of ``np.random.default_rng``.
778
+
779
+ This is intended to decorate
780
+ ``numpydoc.docscrape_sphinx.SphinxDocString._str_examples``.
781
+
782
+ Examples are only run by Sphinx when there are plot involved. Even so,
783
+ it does not change the result values getting printed.
784
+ """
785
+ # hexadecimal or number seed, case-insensitive
786
+ pattern = re.compile(r'np.random.default_rng\((0x[0-9A-F]+|\d+)\)', re.I)
787
+
788
+ def _wrapped(*args, **kwargs):
789
+ res = func(*args, **kwargs)
790
+ lines = [
791
+ re.sub(pattern, 'np.random.default_rng()', line)
792
+ for line in res
793
+ ]
794
+ return lines
795
+
796
+ return _wrapped
797
+
798
+
799
+ def _argmin(a, keepdims=False, axis=None):
800
+ """
801
+ argmin with a `keepdims` parameter.
802
+
803
+ See https://github.com/numpy/numpy/issues/8710
804
+
805
+ If axis is not None, a.shape[axis] must be greater than 0.
806
+ """
807
+ res = np.argmin(a, axis=axis)
808
+ if keepdims and axis is not None:
809
+ res = np.expand_dims(res, axis=axis)
810
+ return res
811
+
812
+
813
+ def _first_nonnan(a, axis):
814
+ """
815
+ Return the first non-nan value along the given axis.
816
+
817
+ If a slice is all nan, nan is returned for that slice.
818
+
819
+ The shape of the return value corresponds to ``keepdims=True``.
820
+
821
+ Examples
822
+ --------
823
+ >>> import numpy as np
824
+ >>> nan = np.nan
825
+ >>> a = np.array([[ 3., 3., nan, 3.],
826
+ [ 1., nan, 2., 4.],
827
+ [nan, nan, 9., -1.],
828
+ [nan, 5., 4., 3.],
829
+ [ 2., 2., 2., 2.],
830
+ [nan, nan, nan, nan]])
831
+ >>> _first_nonnan(a, axis=0)
832
+ array([[3., 3., 2., 3.]])
833
+ >>> _first_nonnan(a, axis=1)
834
+ array([[ 3.],
835
+ [ 1.],
836
+ [ 9.],
837
+ [ 5.],
838
+ [ 2.],
839
+ [nan]])
840
+ """
841
+ k = _argmin(np.isnan(a), axis=axis, keepdims=True)
842
+ return np.take_along_axis(a, k, axis=axis)
843
+
844
+
845
+ def _nan_allsame(a, axis, keepdims=False):
846
+ """
847
+ Determine if the values along an axis are all the same.
848
+
849
+ nan values are ignored.
850
+
851
+ `a` must be a numpy array.
852
+
853
+ `axis` is assumed to be normalized; that is, 0 <= axis < a.ndim.
854
+
855
+ For an axis of length 0, the result is True. That is, we adopt the
856
+ convention that ``allsame([])`` is True. (There are no values in the
857
+ input that are different.)
858
+
859
+ `True` is returned for slices that are all nan--not because all the
860
+ values are the same, but because this is equivalent to ``allsame([])``.
861
+
862
+ Examples
863
+ --------
864
+ >>> from numpy import nan, array
865
+ >>> a = array([[ 3., 3., nan, 3.],
866
+ ... [ 1., nan, 2., 4.],
867
+ ... [nan, nan, 9., -1.],
868
+ ... [nan, 5., 4., 3.],
869
+ ... [ 2., 2., 2., 2.],
870
+ ... [nan, nan, nan, nan]])
871
+ >>> _nan_allsame(a, axis=1, keepdims=True)
872
+ array([[ True],
873
+ [False],
874
+ [False],
875
+ [False],
876
+ [ True],
877
+ [ True]])
878
+ """
879
+ if axis is None:
880
+ if a.size == 0:
881
+ return True
882
+ a = a.ravel()
883
+ axis = 0
884
+ else:
885
+ shp = a.shape
886
+ if shp[axis] == 0:
887
+ shp = shp[:axis] + (1,)*keepdims + shp[axis + 1:]
888
+ return np.full(shp, fill_value=True, dtype=bool)
889
+ a0 = _first_nonnan(a, axis=axis)
890
+ return ((a0 == a) | np.isnan(a)).all(axis=axis, keepdims=keepdims)
891
+
892
+
893
+ def _contains_nan(
894
+ a: Array,
895
+ nan_policy: Literal["propagate", "raise", "omit"] = "propagate",
896
+ *,
897
+ xp_omit_okay: bool = False,
898
+ xp: ModuleType | None = None,
899
+ ) -> Array | bool:
900
+ # Regarding `xp_omit_okay`: Temporarily, while `_axis_nan_policy` does not
901
+ # handle non-NumPy arrays, most functions that call `_contains_nan` want
902
+ # it to raise an error if `nan_policy='omit'` and `xp` is not `np`.
903
+ # Some functions support `nan_policy='omit'` natively, so setting this to
904
+ # `True` prevents the error from being raised.
905
+ policies = {"propagate", "raise", "omit"}
906
+ if nan_policy not in policies:
907
+ msg = f"nan_policy must be one of {policies}."
908
+ raise ValueError(msg)
909
+
910
+ if xp_size(a) == 0:
911
+ return False
912
+
913
+ if xp is None:
914
+ xp = array_namespace(a)
915
+
916
+ if xp.isdtype(a.dtype, "real floating"):
917
+ # Faster and less memory-intensive than xp.any(xp.isnan(a)), and unlike other
918
+ # reductions, `max`/`min` won't return NaN unless there is a NaN in the data.
919
+ contains_nan = xp.isnan(xp.max(a))
920
+ elif xp.isdtype(a.dtype, "complex floating"):
921
+ # Typically `real` and `imag` produce views; otherwise, `xp.any(xp.isnan(a))`
922
+ # would be more efficient.
923
+ contains_nan = xp.isnan(xp.max(xp.real(a))) | xp.isnan(xp.max(xp.imag(a)))
924
+ elif is_numpy(xp) and np.issubdtype(a.dtype, object):
925
+ contains_nan = False
926
+ for el in a.ravel():
927
+ # isnan doesn't work on non-numeric elements
928
+ if np.issubdtype(type(el), np.number) and np.isnan(el):
929
+ contains_nan = True
930
+ break
931
+ else:
932
+ # Only `object` and `inexact` arrays can have NaNs
933
+ return False
934
+
935
+ # The implicit call to bool(contains_nan) must happen after testing
936
+ # nan_policy to prevent lazy and device-bound xps from raising in the
937
+ # default policy='propagate' case.
938
+ if nan_policy == 'raise':
939
+ if is_lazy_array(a):
940
+ msg = "nan_policy='raise' is not supported for lazy arrays."
941
+ raise TypeError(msg)
942
+ if contains_nan:
943
+ msg = "The input contains nan values"
944
+ raise ValueError(msg)
945
+ elif nan_policy == 'omit' and not xp_omit_okay and not is_numpy(xp):
946
+ if is_lazy_array(a):
947
+ msg = "nan_policy='omit' is not supported for lazy arrays."
948
+ raise TypeError(msg)
949
+ if contains_nan:
950
+ msg = "nan_policy='omit' is incompatible with non-NumPy arrays."
951
+ raise ValueError(msg)
952
+
953
+ return contains_nan
954
+
955
+
956
+ def _rename_parameter(old_name, new_name, dep_version=None):
957
+ """
958
+ Generate decorator for backward-compatible keyword renaming.
959
+
960
+ Apply the decorator generated by `_rename_parameter` to functions with a
961
+ recently renamed parameter to maintain backward-compatibility.
962
+
963
+ After decoration, the function behaves as follows:
964
+ If only the new parameter is passed into the function, behave as usual.
965
+ If only the old parameter is passed into the function (as a keyword), raise
966
+ a DeprecationWarning if `dep_version` is provided, and behave as usual
967
+ otherwise.
968
+ If both old and new parameters are passed into the function, raise a
969
+ DeprecationWarning if `dep_version` is provided, and raise the appropriate
970
+ TypeError (function got multiple values for argument).
971
+
972
+ Parameters
973
+ ----------
974
+ old_name : str
975
+ Old name of parameter
976
+ new_name : str
977
+ New name of parameter
978
+ dep_version : str, optional
979
+ Version of SciPy in which old parameter was deprecated in the format
980
+ 'X.Y.Z'. If supplied, the deprecation message will indicate that
981
+ support for the old parameter will be removed in version 'X.Y+2.Z'
982
+
983
+ Notes
984
+ -----
985
+ Untested with functions that accept *args. Probably won't work as written.
986
+
987
+ """
988
+ def decorator(fun):
989
+ @functools.wraps(fun)
990
+ def wrapper(*args, **kwargs):
991
+ if old_name in kwargs:
992
+ if dep_version:
993
+ end_version = dep_version.split('.')
994
+ end_version[1] = str(int(end_version[1]) + 2)
995
+ end_version = '.'.join(end_version)
996
+ message = (f"Use of keyword argument `{old_name}` is "
997
+ f"deprecated and replaced by `{new_name}`. "
998
+ f"Support for `{old_name}` will be removed "
999
+ f"in SciPy {end_version}.")
1000
+ warnings.warn(message, DeprecationWarning, stacklevel=2)
1001
+ if new_name in kwargs:
1002
+ message = (f"{fun.__name__}() got multiple values for "
1003
+ f"argument now known as `{new_name}`")
1004
+ raise TypeError(message)
1005
+ kwargs[new_name] = kwargs.pop(old_name)
1006
+ return fun(*args, **kwargs)
1007
+ return wrapper
1008
+ return decorator
1009
+
1010
+
1011
+ def _rng_spawn(rng, n_children):
1012
+ # spawns independent RNGs from a parent RNG
1013
+ bg = rng._bit_generator
1014
+ ss = bg._seed_seq
1015
+ child_rngs = [np.random.Generator(type(bg)(child_ss))
1016
+ for child_ss in ss.spawn(n_children)]
1017
+ return child_rngs
1018
+
1019
+
1020
+ def _get_nan(*data, shape=(), xp=None):
1021
+ xp = array_namespace(*data) if xp is None else xp
1022
+ # Get NaN of appropriate dtype for data
1023
+ dtype = xp_result_type(*data, force_floating=True, xp=xp)
1024
+ device = xp_result_device(*data)
1025
+ res = xp.full(shape, xp.nan, dtype=dtype, device=device)
1026
+ if not shape:
1027
+ res = res[()]
1028
+ # whenever mdhaber/marray#89 is resolved, could just return `res`
1029
+ return res.data if is_marray(xp) else res
1030
+
1031
+
1032
+ def normalize_axis_index(axis, ndim):
1033
+ # Check if `axis` is in the correct range and normalize it
1034
+ if axis < -ndim or axis >= ndim:
1035
+ msg = f"axis {axis} is out of bounds for array of dimension {ndim}"
1036
+ raise AxisError(msg)
1037
+
1038
+ if axis < 0:
1039
+ axis = axis + ndim
1040
+ return axis
1041
+
1042
+
1043
+ def _call_callback_maybe_halt(callback, res):
1044
+ """Call wrapped callback; return True if algorithm should stop.
1045
+
1046
+ Parameters
1047
+ ----------
1048
+ callback : callable or None
1049
+ A user-provided callback wrapped with `_wrap_callback`
1050
+ res : OptimizeResult
1051
+ Information about the current iterate
1052
+
1053
+ Returns
1054
+ -------
1055
+ halt : bool
1056
+ True if minimization should stop
1057
+
1058
+ """
1059
+ if callback is None:
1060
+ return False
1061
+ try:
1062
+ callback(res)
1063
+ return False
1064
+ except StopIteration:
1065
+ callback.stop_iteration = True
1066
+ return True
1067
+
1068
+
1069
+ class _RichResult(dict):
1070
+ """ Container for multiple outputs with pretty-printing """
1071
+ def __getattr__(self, name):
1072
+ try:
1073
+ return self[name]
1074
+ except KeyError as e:
1075
+ raise AttributeError(name) from e
1076
+
1077
+ __setattr__ = dict.__setitem__ # type: ignore[assignment]
1078
+ __delattr__ = dict.__delitem__ # type: ignore[assignment]
1079
+
1080
+ def __repr__(self):
1081
+ order_keys = ['message', 'success', 'status', 'fun', 'funl', 'x', 'xl',
1082
+ 'col_ind', 'nit', 'lower', 'upper', 'eqlin', 'ineqlin',
1083
+ 'converged', 'flag', 'function_calls', 'iterations',
1084
+ 'root']
1085
+ order_keys = getattr(self, '_order_keys', order_keys)
1086
+ # 'slack', 'con' are redundant with residuals
1087
+ # 'crossover_nit' is probably not interesting to most users
1088
+ omit_keys = {'slack', 'con', 'crossover_nit', '_order_keys'}
1089
+
1090
+ def key(item):
1091
+ try:
1092
+ return order_keys.index(item[0].lower())
1093
+ except ValueError: # item not in list
1094
+ return np.inf
1095
+
1096
+ def omit_redundant(items):
1097
+ for item in items:
1098
+ if item[0] in omit_keys:
1099
+ continue
1100
+ yield item
1101
+
1102
+ def item_sorter(d):
1103
+ return sorted(omit_redundant(d.items()), key=key)
1104
+
1105
+ if self.keys():
1106
+ return _dict_formatter(self, sorter=item_sorter)
1107
+ else:
1108
+ return self.__class__.__name__ + "()"
1109
+
1110
+ def __dir__(self):
1111
+ return list(self.keys())
1112
+
1113
+
1114
+ def _indenter(s, n=0):
1115
+ """
1116
+ Ensures that lines after the first are indented by the specified amount
1117
+ """
1118
+ split = s.split("\n")
1119
+ indent = " "*n
1120
+ return ("\n" + indent).join(split)
1121
+
1122
+
1123
+ def _float_formatter_10(x):
1124
+ """
1125
+ Returns a string representation of a float with exactly ten characters
1126
+ """
1127
+ if np.isposinf(x):
1128
+ return " inf"
1129
+ elif np.isneginf(x):
1130
+ return " -inf"
1131
+ elif np.isnan(x):
1132
+ return " nan"
1133
+ return np.format_float_scientific(x, precision=3, pad_left=2, unique=False)
1134
+
1135
+
1136
+ def _dict_formatter(d, n=0, mplus=1, sorter=None):
1137
+ """
1138
+ Pretty printer for dictionaries
1139
+
1140
+ `n` keeps track of the starting indentation;
1141
+ lines are indented by this much after a line break.
1142
+ `mplus` is additional left padding applied to keys
1143
+ """
1144
+ if isinstance(d, dict):
1145
+ m = max(map(len, list(d.keys()))) + mplus # width to print keys
1146
+ s = '\n'.join([k.rjust(m) + ': ' + # right justified, width m
1147
+ _indenter(_dict_formatter(v, m+n+2, 0, sorter), m+2)
1148
+ for k, v in sorter(d)]) # +2 for ': '
1149
+ else:
1150
+ # By default, NumPy arrays print with linewidth=76. `n` is
1151
+ # the indent at which a line begins printing, so it is subtracted
1152
+ # from the default to avoid exceeding 76 characters total.
1153
+ # `edgeitems` is the number of elements to include before and after
1154
+ # ellipses when arrays are not shown in full.
1155
+ # `threshold` is the maximum number of elements for which an
1156
+ # array is shown in full.
1157
+ # These values tend to work well for use with OptimizeResult.
1158
+ with np.printoptions(linewidth=76-n, edgeitems=2, threshold=12,
1159
+ formatter={'float_kind': _float_formatter_10}):
1160
+ s = str(d)
1161
+ return s
1162
+
1163
+
1164
+ _batch_note = """
1165
+ The documentation is written assuming array arguments are of specified
1166
+ "core" shapes. However, array argument(s) of this function may have additional
1167
+ "batch" dimensions prepended to the core shape. In this case, the array is treated
1168
+ as a batch of lower-dimensional slices; see :ref:`linalg_batch` for details.
1169
+ """
1170
+
1171
+
1172
+ def _apply_over_batch(*argdefs):
1173
+ """
1174
+ Factory for decorator that applies a function over batched arguments.
1175
+
1176
+ Array arguments may have any number of core dimensions (typically 0,
1177
+ 1, or 2) and any broadcastable batch shapes. There may be any
1178
+ number of array outputs of any number of dimensions. Assumptions
1179
+ right now - which are satisfied by all functions of interest in `linalg` -
1180
+ are that all array inputs are consecutive keyword or positional arguments,
1181
+ and that the wrapped function returns either a single array or a tuple of
1182
+ arrays. It's only as general as it needs to be right now - it can be extended.
1183
+
1184
+ Parameters
1185
+ ----------
1186
+ *argdefs : tuple of (str, int)
1187
+ Definitions of array arguments: the keyword name of the argument, and
1188
+ the number of core dimensions.
1189
+
1190
+ Example:
1191
+ --------
1192
+ `linalg.eig` accepts two matrices as the first two arguments `a` and `b`, where
1193
+ `b` is optional, and returns one array or a tuple of arrays, depending on the
1194
+ values of other positional or keyword arguments. To generate a wrapper that applies
1195
+ the function over batches of `a` and optionally `b` :
1196
+
1197
+ >>> _apply_over_batch(('a', 2), ('b', 2))
1198
+ """
1199
+ names, ndims = list(zip(*argdefs))
1200
+ n_arrays = len(names)
1201
+
1202
+ def decorator(f):
1203
+ @functools.wraps(f)
1204
+ def wrapper(*args, **kwargs):
1205
+ args = list(args)
1206
+
1207
+ # Ensure all arrays in `arrays`, other arguments in `other_args`/`kwargs`
1208
+ arrays, other_args = args[:n_arrays], args[n_arrays:]
1209
+ for i, name in enumerate(names):
1210
+ if name in kwargs:
1211
+ if i + 1 <= len(args):
1212
+ raise ValueError(f'{f.__name__}() got multiple values '
1213
+ f'for argument `{name}`.')
1214
+ else:
1215
+ arrays.append(kwargs.pop(name))
1216
+
1217
+ # Determine core and batch shapes
1218
+ batch_shapes = []
1219
+ core_shapes = []
1220
+ for i, (array, ndim) in enumerate(zip(arrays, ndims)):
1221
+ array = None if array is None else np.asarray(array)
1222
+ shape = () if array is None else array.shape
1223
+
1224
+ if ndim == "1|2": # special case for `solve`, etc.
1225
+ ndim = 2 if array.ndim >= 2 else 1
1226
+
1227
+ arrays[i] = array
1228
+ batch_shapes.append(shape[:-ndim] if ndim > 0 else shape)
1229
+ core_shapes.append(shape[-ndim:] if ndim > 0 else ())
1230
+
1231
+ # Early exit if call is not batched
1232
+ if not any(batch_shapes):
1233
+ return f(*arrays, *other_args, **kwargs)
1234
+
1235
+ # Determine broadcasted batch shape
1236
+ batch_shape = np.broadcast_shapes(*batch_shapes) # Gives OK error message
1237
+
1238
+ # Broadcast arrays to appropriate shape
1239
+ for i, (array, core_shape) in enumerate(zip(arrays, core_shapes)):
1240
+ if array is None:
1241
+ continue
1242
+ arrays[i] = np.broadcast_to(array, batch_shape + core_shape)
1243
+
1244
+ # Main loop
1245
+ results = []
1246
+ for index in np.ndindex(batch_shape):
1247
+ result = f(*(array[index] for array in arrays), *other_args, **kwargs)
1248
+ # Assume `result` is either a tuple or single array. This is easily
1249
+ # generalized by allowing the contributor to pass an `unpack_result`
1250
+ # callable to the decorator factory.
1251
+ result = (result,) if not isinstance(result, tuple) else result
1252
+ results.append(result)
1253
+ results = list(zip(*results))
1254
+
1255
+ # Reshape results
1256
+ for i, result in enumerate(results):
1257
+ result = np.stack(result)
1258
+ core_shape = result.shape[1:]
1259
+ results[i] = np.reshape(result, batch_shape + core_shape)
1260
+
1261
+ # Assume `result` should be a single array if there is only one element or
1262
+ # a `tuple` otherwise. This is easily generalized by allowing the
1263
+ # contributor to pass an `pack_result` callable to the decorator factory.
1264
+ return results[0] if len(results) == 1 else results
1265
+
1266
+ doc = FunctionDoc(wrapper)
1267
+ doc['Extended Summary'].append(_batch_note.rstrip())
1268
+ wrapper.__doc__ = str(doc).split("\n", 1)[1] # remove signature
1269
+
1270
+ return wrapper
1271
+ return decorator
1272
+
1273
+
1274
+ def np_vecdot(x1, x2, /, *, axis=-1):
1275
+ # `np.vecdot` has advantages (e.g. see gh-22462), so let's use it when
1276
+ # available. As functions are translated to Array API, `np_vecdot` can be
1277
+ # replaced with `xp.vecdot`.
1278
+ if np.__version__ > "2.0":
1279
+ return np.vecdot(x1, x2, axis=axis)
1280
+ else:
1281
+ # of course there are other fancy ways of doing this (e.g. `einsum`)
1282
+ # but let's keep it simple since it's temporary
1283
+ return np.sum(x1 * x2, axis=axis)