scipy 1.16.2__cp314-cp314-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.cp314-win_arm64.lib +0 -0
  4. scipy/_cyutility.cp314-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.cp314-win_arm64.lib +0 -0
  13. scipy/_lib/_ccallback_c.cp314-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.cp314-win_arm64.lib +0 -0
  18. scipy/_lib/_fpumode.cp314-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.cp314-win_arm64.lib +0 -0
  23. scipy/_lib/_test_ccallback.cp314-win_arm64.pyd +0 -0
  24. scipy/_lib/_test_deprecation_call.cp314-win_arm64.lib +0 -0
  25. scipy/_lib/_test_deprecation_call.cp314-win_arm64.pyd +0 -0
  26. scipy/_lib/_test_deprecation_def.cp314-win_arm64.lib +0 -0
  27. scipy/_lib/_test_deprecation_def.cp314-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.cp314-win_arm64.lib +0 -0
  35. scipy/_lib/_uarray/_uarray.cp314-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.cp314-win_arm64.lib +0 -0
  101. scipy/_lib/messagestream.cp314-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.cp314-win_arm64.lib +0 -0
  148. scipy/cluster/_hierarchy.cp314-win_arm64.pyd +0 -0
  149. scipy/cluster/_optimal_leaf_ordering.cp314-win_arm64.lib +0 -0
  150. scipy/cluster/_optimal_leaf_ordering.cp314-win_arm64.pyd +0 -0
  151. scipy/cluster/_vq.cp314-win_arm64.lib +0 -0
  152. scipy/cluster/_vq.cp314-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.cp314-win_arm64.lib +0 -0
  193. scipy/fft/_pocketfft/pypocketfft.cp314-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.cp314-win_arm64.lib +0 -0
  215. scipy/fftpack/convolve.cp314-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.cp314-win_arm64.lib +0 -0
  233. scipy/integrate/_dop.cp314-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.cp314-win_arm64.lib +0 -0
  248. scipy/integrate/_lsoda.cp314-win_arm64.pyd +0 -0
  249. scipy/integrate/_ode.py +1395 -0
  250. scipy/integrate/_odepack.cp314-win_arm64.lib +0 -0
  251. scipy/integrate/_odepack.cp314-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.cp314-win_arm64.lib +0 -0
  255. scipy/integrate/_quadpack.cp314-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.cp314-win_arm64.lib +0 -0
  265. scipy/integrate/_test_multivariate.cp314-win_arm64.pyd +0 -0
  266. scipy/integrate/_test_odeint_banded.cp314-win_arm64.lib +0 -0
  267. scipy/integrate/_test_odeint_banded.cp314-win_arm64.pyd +0 -0
  268. scipy/integrate/_vode.cp314-win_arm64.lib +0 -0
  269. scipy/integrate/_vode.cp314-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.cp314-win_arm64.lib +0 -0
  290. scipy/interpolate/_dfitpack.cp314-win_arm64.pyd +0 -0
  291. scipy/interpolate/_dierckx.cp314-win_arm64.lib +0 -0
  292. scipy/interpolate/_dierckx.cp314-win_arm64.pyd +0 -0
  293. scipy/interpolate/_fitpack.cp314-win_arm64.lib +0 -0
  294. scipy/interpolate/_fitpack.cp314-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.cp314-win_arm64.lib +0 -0
  300. scipy/interpolate/_interpnd.cp314-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.cp314-win_arm64.lib +0 -0
  307. scipy/interpolate/_ppoly.cp314-win_arm64.pyd +0 -0
  308. scipy/interpolate/_rbf.py +290 -0
  309. scipy/interpolate/_rbfinterp.py +550 -0
  310. scipy/interpolate/_rbfinterp_pythran.cp314-win_arm64.lib +0 -0
  311. scipy/interpolate/_rbfinterp_pythran.cp314-win_arm64.pyd +0 -0
  312. scipy/interpolate/_rgi.py +764 -0
  313. scipy/interpolate/_rgi_cython.cp314-win_arm64.lib +0 -0
  314. scipy/interpolate/_rgi_cython.cp314-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.cp314-win_arm64.lib +0 -0
  343. scipy/io/_fast_matrix_market/_fmm_core.cp314-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.cp314-win_arm64.lib +0 -0
  355. scipy/io/_test_fortran.cp314-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.cp314-win_arm64.lib +0 -0
  386. scipy/io/matlab/_mio5_utils.cp314-win_arm64.pyd +0 -0
  387. scipy/io/matlab/_mio_utils.cp314-win_arm64.lib +0 -0
  388. scipy/io/matlab/_mio_utils.cp314-win_arm64.pyd +0 -0
  389. scipy/io/matlab/_miobase.py +435 -0
  390. scipy/io/matlab/_streams.cp314-win_arm64.lib +0 -0
  391. scipy/io/matlab/_streams.cp314-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.cp314-win_arm64.lib +0 -0
  623. scipy/linalg/_cythonized_array_utils.cp314-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.cp314-win_arm64.lib +0 -0
  630. scipy/linalg/_decomp_interpolative.cp314-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.cp314-win_arm64.lib +0 -0
  634. scipy/linalg/_decomp_lu_cython.cp314-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.cp314-win_arm64.lib +0 -0
  642. scipy/linalg/_decomp_update.cp314-win_arm64.pyd +0 -0
  643. scipy/linalg/_expm_frechet.py +417 -0
  644. scipy/linalg/_fblas.cp314-win_arm64.lib +0 -0
  645. scipy/linalg/_fblas.cp314-win_arm64.pyd +0 -0
  646. scipy/linalg/_flapack.cp314-win_arm64.lib +0 -0
  647. scipy/linalg/_flapack.cp314-win_arm64.pyd +0 -0
  648. scipy/linalg/_lapack_subroutines.h +1521 -0
  649. scipy/linalg/_linalg_pythran.cp314-win_arm64.lib +0 -0
  650. scipy/linalg/_linalg_pythran.cp314-win_arm64.pyd +0 -0
  651. scipy/linalg/_matfuncs.py +1050 -0
  652. scipy/linalg/_matfuncs_expm.cp314-win_arm64.lib +0 -0
  653. scipy/linalg/_matfuncs_expm.cp314-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.cp314-win_arm64.lib +0 -0
  657. scipy/linalg/_matfuncs_schur_sqrtm.cp314-win_arm64.pyd +0 -0
  658. scipy/linalg/_matfuncs_sqrtm.py +107 -0
  659. scipy/linalg/_matfuncs_sqrtm_triu.cp314-win_arm64.lib +0 -0
  660. scipy/linalg/_matfuncs_sqrtm_triu.cp314-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.cp314-win_arm64.lib +0 -0
  665. scipy/linalg/_solve_toeplitz.cp314-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.cp314-win_arm64.lib +0 -0
  672. scipy/linalg/cython_blas.cp314-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.cp314-win_arm64.lib +0 -0
  676. scipy/linalg/cython_lapack.cp314-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.cp314-win_arm64.lib +0 -0
  728. scipy/ndimage/_ctest.cp314-win_arm64.pyd +0 -0
  729. scipy/ndimage/_cytest.cp314-win_arm64.lib +0 -0
  730. scipy/ndimage/_cytest.cp314-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.cp314-win_arm64.lib +0 -0
  738. scipy/ndimage/_nd_image.cp314-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.cp314-win_arm64.lib +0 -0
  742. scipy/ndimage/_ni_label.cp314-win_arm64.pyd +0 -0
  743. scipy/ndimage/_ni_support.py +139 -0
  744. scipy/ndimage/_rank_filter_1d.cp314-win_arm64.lib +0 -0
  745. scipy/ndimage/_rank_filter_1d.cp314-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.cp314-win_arm64.lib +0 -0
  768. scipy/odr/__odrpack.cp314-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.cp314-win_arm64.lib +0 -0
  780. scipy/optimize/_bglu_dense.cp314-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.cp314-win_arm64.lib +0 -0
  790. scipy/optimize/_direct.cp314-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.cp314-win_arm64.lib +0 -0
  795. scipy/optimize/_group_columns.cp314-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.cp314-win_arm64.lib +0 -0
  799. scipy/optimize/_highspy/_core.cp314-win_arm64.pyd +0 -0
  800. scipy/optimize/_highspy/_highs_options.cp314-win_arm64.lib +0 -0
  801. scipy/optimize/_highspy/_highs_options.cp314-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.cp314-win_arm64.lib +0 -0
  805. scipy/optimize/_lbfgsb.cp314-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.cp314-win_arm64.lib +0 -0
  816. scipy/optimize/_lsap.cp314-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.cp314-win_arm64.lib +0 -0
  822. scipy/optimize/_lsq/givens_elimination.cp314-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.cp314-win_arm64.lib +0 -0
  830. scipy/optimize/_minpack.cp314-win_arm64.pyd +0 -0
  831. scipy/optimize/_minpack_py.py +1178 -0
  832. scipy/optimize/_moduleTNC.cp314-win_arm64.lib +0 -0
  833. scipy/optimize/_moduleTNC.cp314-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.cp314-win_arm64.lib +0 -0
  839. scipy/optimize/_pava_pybind.cp314-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.cp314-win_arm64.lib +0 -0
  850. scipy/optimize/_slsqplib.cp314-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.cp314-win_arm64.lib +0 -0
  855. scipy/optimize/_trlib/_trlib.cp314-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.cp314-win_arm64.lib +0 -0
  877. scipy/optimize/_zeros.cp314-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.cp314-win_arm64.lib +0 -0
  882. scipy/optimize/cython_optimize/_zeros.cp314-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.cp314-win_arm64.lib +0 -0
  953. scipy/signal/_max_len_seq_inner.cp314-win_arm64.pyd +0 -0
  954. scipy/signal/_peak_finding.py +1310 -0
  955. scipy/signal/_peak_finding_utils.cp314-win_arm64.lib +0 -0
  956. scipy/signal/_peak_finding_utils.cp314-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.cp314-win_arm64.lib +0 -0
  963. scipy/signal/_sigtools.cp314-win_arm64.pyd +0 -0
  964. scipy/signal/_sosfilt.cp314-win_arm64.lib +0 -0
  965. scipy/signal/_sosfilt.cp314-win_arm64.pyd +0 -0
  966. scipy/signal/_spectral_py.py +2471 -0
  967. scipy/signal/_spline.cp314-win_arm64.lib +0 -0
  968. scipy/signal/_spline.cp314-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.cp314-win_arm64.lib +0 -0
  974. scipy/signal/_upfirdn_apply.cp314-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.cp314-win_arm64.lib +0 -0
  1021. scipy/sparse/_csparsetools.cp314-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.cp314-win_arm64.lib +0 -0
  1032. scipy/sparse/_sparsetools.cp314-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.cp314-win_arm64.lib +0 -0
  1043. scipy/sparse/csgraph/_flow.cp314-win_arm64.pyd +0 -0
  1044. scipy/sparse/csgraph/_laplacian.py +563 -0
  1045. scipy/sparse/csgraph/_matching.cp314-win_arm64.lib +0 -0
  1046. scipy/sparse/csgraph/_matching.cp314-win_arm64.pyd +0 -0
  1047. scipy/sparse/csgraph/_min_spanning_tree.cp314-win_arm64.lib +0 -0
  1048. scipy/sparse/csgraph/_min_spanning_tree.cp314-win_arm64.pyd +0 -0
  1049. scipy/sparse/csgraph/_reordering.cp314-win_arm64.lib +0 -0
  1050. scipy/sparse/csgraph/_reordering.cp314-win_arm64.pyd +0 -0
  1051. scipy/sparse/csgraph/_shortest_path.cp314-win_arm64.lib +0 -0
  1052. scipy/sparse/csgraph/_shortest_path.cp314-win_arm64.pyd +0 -0
  1053. scipy/sparse/csgraph/_tools.cp314-win_arm64.lib +0 -0
  1054. scipy/sparse/csgraph/_tools.cp314-win_arm64.pyd +0 -0
  1055. scipy/sparse/csgraph/_traversal.cp314-win_arm64.lib +0 -0
  1056. scipy/sparse/csgraph/_traversal.cp314-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.cp314-win_arm64.lib +0 -0
  1079. scipy/sparse/linalg/_dsolve/_superlu.cp314-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.cp314-win_arm64.lib +0 -0
  1089. scipy/sparse/linalg/_eigen/arpack/_arpack.cp314-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.cp314-win_arm64.lib +0 -0
  1122. scipy/sparse/linalg/_propack/_cpropack.cp314-win_arm64.pyd +0 -0
  1123. scipy/sparse/linalg/_propack/_dpropack.cp314-win_arm64.lib +0 -0
  1124. scipy/sparse/linalg/_propack/_dpropack.cp314-win_arm64.pyd +0 -0
  1125. scipy/sparse/linalg/_propack/_spropack.cp314-win_arm64.lib +0 -0
  1126. scipy/sparse/linalg/_propack/_spropack.cp314-win_arm64.pyd +0 -0
  1127. scipy/sparse/linalg/_propack/_zpropack.cp314-win_arm64.lib +0 -0
  1128. scipy/sparse/linalg/_propack/_zpropack.cp314-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.cp314-win_arm64.lib +0 -0
  1170. scipy/spatial/_ckdtree.cp314-win_arm64.pyd +0 -0
  1171. scipy/spatial/_distance_pybind.cp314-win_arm64.lib +0 -0
  1172. scipy/spatial/_distance_pybind.cp314-win_arm64.pyd +0 -0
  1173. scipy/spatial/_distance_wrap.cp314-win_arm64.lib +0 -0
  1174. scipy/spatial/_distance_wrap.cp314-win_arm64.pyd +0 -0
  1175. scipy/spatial/_geometric_slerp.py +238 -0
  1176. scipy/spatial/_hausdorff.cp314-win_arm64.lib +0 -0
  1177. scipy/spatial/_hausdorff.cp314-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.cp314-win_arm64.lib +0 -0
  1182. scipy/spatial/_qhull.cp314-win_arm64.pyd +0 -0
  1183. scipy/spatial/_qhull.pyi +213 -0
  1184. scipy/spatial/_spherical_voronoi.py +341 -0
  1185. scipy/spatial/_voronoi.cp314-win_arm64.lib +0 -0
  1186. scipy/spatial/_voronoi.cp314-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.cp314-win_arm64.lib +0 -0
  1236. scipy/spatial/transform/_rigid_transform.cp314-win_arm64.pyd +0 -0
  1237. scipy/spatial/transform/_rotation.cp314-win_arm64.lib +0 -0
  1238. scipy/spatial/transform/_rotation.cp314-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.cp314-win_arm64.lib +0 -0
  1252. scipy/special/_comb.cp314-win_arm64.pyd +0 -0
  1253. scipy/special/_ellip_harm.py +214 -0
  1254. scipy/special/_ellip_harm_2.cp314-win_arm64.lib +0 -0
  1255. scipy/special/_ellip_harm_2.cp314-win_arm64.pyd +0 -0
  1256. scipy/special/_gufuncs.cp314-win_arm64.lib +0 -0
  1257. scipy/special/_gufuncs.cp314-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.cp314-win_arm64.lib +0 -0
  1281. scipy/special/_specfun.cp314-win_arm64.pyd +0 -0
  1282. scipy/special/_special_ufuncs.cp314-win_arm64.lib +0 -0
  1283. scipy/special/_special_ufuncs.cp314-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.cp314-win_arm64.lib +0 -0
  1288. scipy/special/_test_internal.cp314-win_arm64.pyd +0 -0
  1289. scipy/special/_test_internal.pyi +9 -0
  1290. scipy/special/_testutils.py +321 -0
  1291. scipy/special/_ufuncs.cp314-win_arm64.lib +0 -0
  1292. scipy/special/_ufuncs.cp314-win_arm64.pyd +0 -0
  1293. scipy/special/_ufuncs.pyi +522 -0
  1294. scipy/special/_ufuncs.pyx +13173 -0
  1295. scipy/special/_ufuncs_cxx.cp314-win_arm64.lib +0 -0
  1296. scipy/special/_ufuncs_cxx.cp314-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.cp314-win_arm64.lib +0 -0
  1304. scipy/special/cython_special.cp314-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.cp314-win_arm64.lib +0 -0
  1376. scipy/stats/_ansari_swilk_statistics.cp314-win_arm64.pyd +0 -0
  1377. scipy/stats/_axis_nan_policy.py +692 -0
  1378. scipy/stats/_biasedurn.cp314-win_arm64.lib +0 -0
  1379. scipy/stats/_biasedurn.cp314-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.cp314-win_arm64.lib +0 -0
  1404. scipy/stats/_levy_stable/levyst.cp314-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.cp314-win_arm64.lib +0 -0
  1418. scipy/stats/_qmc_cy.cp314-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.cp314-win_arm64.lib +0 -0
  1422. scipy/stats/_qmvnt_cy.cp314-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.cp314-win_arm64.lib +0 -0
  1426. scipy/stats/_rcont/rcont.cp314-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.cp314-win_arm64.lib +0 -0
  1433. scipy/stats/_sobol.cp314-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.cp314-win_arm64.lib +0 -0
  1437. scipy/stats/_stats.cp314-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.cp314-win_arm64.lib +0 -0
  1442. scipy/stats/_stats_pythran.cp314-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.cp314-win_arm64.lib +0 -0
  1447. scipy/stats/_unuran/unuran_wrapper.cp314-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
@@ -0,0 +1,1238 @@
1
+ #
2
+ # Author: Damian Eads
3
+ # Date: April 17, 2008
4
+ #
5
+ # Copyright (C) 2008 Damian Eads
6
+ #
7
+ # Redistribution and use in source and binary forms, with or without
8
+ # modification, are permitted provided that the following conditions
9
+ # are met:
10
+ #
11
+ # 1. Redistributions of source code must retain the above copyright
12
+ # notice, this list of conditions and the following disclaimer.
13
+ #
14
+ # 2. Redistributions in binary form must reproduce the above
15
+ # copyright notice, this list of conditions and the following
16
+ # disclaimer in the documentation and/or other materials provided
17
+ # with the distribution.
18
+ #
19
+ # 3. The name of the author may not be used to endorse or promote
20
+ # products derived from this software without specific prior
21
+ # written permission.
22
+ #
23
+ # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
24
+ # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
27
+ # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
29
+ # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
31
+ # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32
+ # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33
+ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
+ import numpy as np
35
+ from numpy.testing import assert_allclose, assert_equal, assert_array_equal, assert_
36
+ import pytest
37
+ from pytest import raises as assert_raises
38
+
39
+ from scipy.cluster.hierarchy import (
40
+ ClusterWarning, linkage, from_mlab_linkage, to_mlab_linkage,
41
+ num_obs_linkage, inconsistent, cophenet, fclusterdata, fcluster,
42
+ is_isomorphic, single, ward, leaders,
43
+ correspond, is_monotonic, maxdists, maxinconsts, maxRstat,
44
+ is_valid_linkage, is_valid_im, to_tree, leaves_list, dendrogram,
45
+ set_link_color_palette, cut_tree, optimal_leaf_ordering,
46
+ _order_cluster_tree, _hierarchy, _EUCLIDEAN_METHODS, _LINKAGE_METHODS)
47
+ from scipy.cluster._hierarchy import Heap
48
+ from scipy.spatial.distance import pdist
49
+ from scipy._lib._array_api import (eager_warns, make_xp_test_case,
50
+ xp_assert_close, xp_assert_equal)
51
+ import scipy._lib.array_api_extra as xpx
52
+
53
+ from threading import Lock
54
+
55
+ from . import hierarchy_test_data
56
+
57
+ class eager:
58
+ # Bypass xpx.testing.lazy_xp_function when calling
59
+ # these functions from this namespace
60
+ is_valid_im = is_valid_im
61
+ is_valid_linkage = is_valid_linkage
62
+
63
+
64
+ # Matplotlib is not a scipy dependency but is optionally used in dendrogram, so
65
+ # check if it's available
66
+ try:
67
+ import matplotlib
68
+ # and set the backend to be Agg (no gui)
69
+ matplotlib.use('Agg')
70
+ # before importing pyplot
71
+ import matplotlib.pyplot as plt
72
+ have_matplotlib = True
73
+ except Exception:
74
+ have_matplotlib = False
75
+
76
+ skip_xp_backends = pytest.mark.skip_xp_backends
77
+
78
+
79
+ @make_xp_test_case(linkage)
80
+ class TestLinkage:
81
+
82
+ @skip_xp_backends("jax.numpy", reason="Can't raise inside jax.pure_callback")
83
+ def test_linkage_non_finite_elements_in_distance_matrix(self, xp):
84
+ # Tests linkage(Y) where Y contains a non-finite element (e.g. NaN or Inf).
85
+ # Exception expected.
86
+ y = xp.asarray([xp.nan] + [0.0]*5)
87
+ assert_raises(ValueError, linkage, y)
88
+
89
+ def test_linkage_empty_distance_matrix(self, xp):
90
+ # Tests linkage(Y) where Y is a 0x4 linkage matrix. Exception expected.
91
+ y = xp.zeros((0,))
92
+ assert_raises(ValueError, linkage, y)
93
+
94
+ def test_linkage_tdist(self, xp):
95
+ for method in ['single', 'complete', 'average', 'weighted']:
96
+ self.check_linkage_tdist(method, xp)
97
+
98
+ def check_linkage_tdist(self, method, xp):
99
+ # Tests linkage(Y, method) on the tdist data set.
100
+ Z = linkage(xp.asarray(hierarchy_test_data.ytdist), method)
101
+ expectedZ = getattr(hierarchy_test_data, 'linkage_ytdist_' + method)
102
+ xp_assert_close(Z, xp.asarray(expectedZ), atol=1e-10)
103
+
104
+ def test_linkage_X(self, xp):
105
+ for method in ['centroid', 'median', 'ward']:
106
+ self.check_linkage_q(method, xp)
107
+
108
+ def check_linkage_q(self, method, xp):
109
+ # Tests linkage(Y, method) on the Q data set.
110
+ Z = linkage(xp.asarray(hierarchy_test_data.X), method)
111
+ expectedZ = getattr(hierarchy_test_data, 'linkage_X_' + method)
112
+ xp_assert_close(Z, xp.asarray(expectedZ), atol=1e-06)
113
+
114
+ X = xp.asarray(hierarchy_test_data.X)
115
+ y = pdist(X, metric="euclidean")
116
+ Z = linkage(y, method)
117
+ xp_assert_close(Z, xp.asarray(expectedZ), atol=1e-06)
118
+
119
+ def test_compare_with_trivial(self, xp):
120
+ rng = np.random.RandomState(0)
121
+ n = 20
122
+ X = rng.rand(n, 2)
123
+ d = pdist(X)
124
+
125
+ for method, code in _LINKAGE_METHODS.items():
126
+ Z_trivial = _hierarchy.linkage(d, n, code)
127
+ Z = linkage(xp.asarray(d), method)
128
+ xp_assert_close(Z, xp.asarray(Z_trivial), rtol=1e-14, atol=1e-15)
129
+
130
+ def test_optimal_leaf_ordering(self, xp):
131
+ Z = linkage(xp.asarray(hierarchy_test_data.ytdist), optimal_ordering=True)
132
+ expectedZ = getattr(hierarchy_test_data, 'linkage_ytdist_single_olo')
133
+ xp_assert_close(Z, xp.asarray(expectedZ), atol=1e-10)
134
+
135
+ @pytest.mark.parametrize("method,expect", [
136
+ ('single', [[0, 1, 1.41421356, 2],
137
+ [2, 3, 1.41421356, 3]]),
138
+ ('complete', [[0, 1, 1.41421356, 2],
139
+ [2, 3, 2.82842712, 3]]),
140
+ ('average', [[0, 1, 1.41421356, 2],
141
+ [2, 3, 2.12132034, 3]]),
142
+ ('weighted', [[0, 1, 1.41421356, 2],
143
+ [2, 3, 2.12132034, 3]]),
144
+ ('centroid', [[0, 1, 1.41421356, 2],
145
+ [2, 3, 2.12132034, 3]]),
146
+ ('median', [[0, 1, 1.41421356, 2],
147
+ [2, 3, 2.12132034, 3]]),
148
+ ('ward', [[0, 1, 1.41421356, 2],
149
+ [2, 3, 2.44948974, 3]]),
150
+ ])
151
+ def test_linkage_ties(self, method, expect, xp):
152
+ X = xp.asarray([[-1, -1], [0, 0], [1, 1]])
153
+ Z = linkage(X, method=method)
154
+ expect = xp.asarray(expect, dtype=xp.float64)
155
+ xp_assert_close(Z, expect, atol=1e-06)
156
+
157
+ def test_unsupported_uncondensed_distance_matrix_linkage_warning(self, xp):
158
+ X = xp.asarray([[0, 1], [1, 0]])
159
+ with eager_warns(X, ClusterWarning):
160
+ linkage(X)
161
+
162
+ @pytest.mark.parametrize("method", _EUCLIDEAN_METHODS)
163
+ def test_euclidean_linkage_value_error(self, method, xp):
164
+ X = xp.asarray([[1, 1], [1, 1]])
165
+ with pytest.raises(ValueError):
166
+ linkage(X, method=method, metric='cityblock')
167
+
168
+ def test_2x2_linkage(self, xp):
169
+ Z1 = linkage(xp.asarray([1]), method='single', metric='euclidean')
170
+ Z2 = linkage(xp.asarray([[0, 1], [0, 0]]), method='single', metric='euclidean')
171
+ xp_assert_close(Z1, Z2, rtol=1e-15)
172
+
173
+ @skip_xp_backends("jax.numpy", reason="Can't raise inside jax.pure_callback")
174
+ def test_centroid_neg_distance(self, xp):
175
+ # gh-21011
176
+ values = xp.asarray([0, 0, -1])
177
+ with pytest.raises(ValueError):
178
+ # This is just checking that this doesn't crash
179
+ linkage(values, method='centroid')
180
+
181
+
182
+ @make_xp_test_case(inconsistent)
183
+ class TestInconsistent:
184
+
185
+ def test_inconsistent_tdist(self, xp):
186
+ for depth in hierarchy_test_data.inconsistent_ytdist:
187
+ self.check_inconsistent_tdist(depth, xp)
188
+
189
+ def check_inconsistent_tdist(self, depth, xp):
190
+ Z = xp.asarray(hierarchy_test_data.linkage_ytdist_single)
191
+ xp_assert_close(inconsistent(Z, depth),
192
+ xp.asarray(hierarchy_test_data.inconsistent_ytdist[depth]))
193
+
194
+
195
+ @make_xp_test_case(cophenet)
196
+ class TestCopheneticDistance:
197
+
198
+ def test_linkage_cophenet_tdist_Z(self, xp):
199
+ # Tests cophenet(Z) on tdist data set.
200
+ expectedM = xp.asarray([268, 295, 255, 255, 295, 295, 268, 268, 295, 295,
201
+ 295, 138, 219, 295, 295])
202
+ Z = xp.asarray(hierarchy_test_data.linkage_ytdist_single)
203
+ M = cophenet(Z)
204
+ xp_assert_close(M, xp.asarray(expectedM, dtype=xp.float64), atol=1e-10)
205
+
206
+ def test_linkage_cophenet_tdist_Z_Y(self, xp):
207
+ # Tests cophenet(Z, Y) on tdist data set.
208
+ Z = xp.asarray(hierarchy_test_data.linkage_ytdist_single)
209
+ (c, M) = cophenet(Z, xp.asarray(hierarchy_test_data.ytdist))
210
+ expectedM = xp.asarray([268, 295, 255, 255, 295, 295, 268, 268, 295, 295,
211
+ 295, 138, 219, 295, 295], dtype=xp.float64)
212
+ expectedc = xp.asarray(0.639931296433393415057366837573, dtype=xp.float64)[()]
213
+ xp_assert_close(c, expectedc, atol=1e-10)
214
+ xp_assert_close(M, expectedM, atol=1e-10)
215
+
216
+ @skip_xp_backends("jax.numpy", reason="Can't raise inside jax.pure_callback")
217
+ def test_gh_22183(self, xp):
218
+ # check for lack of segfault
219
+ # (out of bounds memory access)
220
+ # and correct interception of
221
+ # invalid linkage matrix
222
+ arr=[[0.0, 1.0, 1.0, 2.0],
223
+ [2.0, 12.0, 1.0, 3.0],
224
+ [3.0, 4.0, 1.0, 2.0],
225
+ [5.0, 14.0, 1.0, 3.0],
226
+ [6.0, 7.0, 1.0, 2.0],
227
+ [8.0, 16.0, 1.0, 3.0],
228
+ [9.0, 10.0, 1.0, 2.0],
229
+ [11.0, 18.0, 1.0, 3.0],
230
+ [13.0, 15.0, 2.0, 6.0],
231
+ [17.0, 20.0, 2.0, 32.0],
232
+ [19.0, 21.0, 2.0, 12.0]]
233
+ with pytest.raises(ValueError, match="excessive observations"):
234
+ cophenet(xp.asarray(arr))
235
+
236
+
237
+ @make_xp_test_case(from_mlab_linkage, to_mlab_linkage)
238
+ class TestMLabLinkageConversion:
239
+
240
+ def test_mlab_linkage_conversion_empty(self, xp):
241
+ # Tests from/to_mlab_linkage on empty linkage array.
242
+ X = xp.asarray([], dtype=xp.float64)
243
+ xp_assert_equal(from_mlab_linkage(X), X)
244
+ xp_assert_equal(to_mlab_linkage(X), X)
245
+
246
+ def test_mlab_linkage_conversion_single_row(self, xp):
247
+ # Tests from/to_mlab_linkage on linkage array with single row.
248
+ Z = xp.asarray([[0., 1., 3., 2.]])
249
+ Zm = xp.asarray([[1, 2, 3]])
250
+ xp_assert_close(from_mlab_linkage(Zm), xp.asarray(Z, dtype=xp.float64),
251
+ rtol=1e-15)
252
+ xp_assert_close(to_mlab_linkage(Z), xp.asarray(Zm, dtype=xp.float64),
253
+ rtol=1e-15)
254
+
255
+ def test_mlab_linkage_conversion_multiple_rows(self, xp):
256
+ # Tests from/to_mlab_linkage on linkage array with multiple rows.
257
+ Zm = xp.asarray([[3, 6, 138], [4, 5, 219],
258
+ [1, 8, 255], [2, 9, 268], [7, 10, 295]])
259
+ Z = xp.asarray([[2., 5., 138., 2.],
260
+ [3., 4., 219., 2.],
261
+ [0., 7., 255., 3.],
262
+ [1., 8., 268., 4.],
263
+ [6., 9., 295., 6.]],
264
+ dtype=xp.float64)
265
+ xp_assert_close(from_mlab_linkage(Zm), Z, rtol=1e-15)
266
+ xp_assert_close(to_mlab_linkage(Z), xp.asarray(Zm, dtype=xp.float64),
267
+ rtol=1e-15)
268
+
269
+
270
+ @make_xp_test_case(fclusterdata)
271
+ class TestFclusterData:
272
+
273
+ @make_xp_test_case(is_isomorphic)
274
+ @pytest.mark.parametrize("criterion,t",
275
+ [("inconsistent", t) for t in hierarchy_test_data.fcluster_inconsistent]
276
+ + [("distance", t) for t in hierarchy_test_data.fcluster_distance]
277
+ + [("maxclust", t) for t in hierarchy_test_data.fcluster_maxclust]
278
+ )
279
+ def test_fclusterdata(self, t, criterion, xp):
280
+ # Tests fclusterdata(X, criterion=criterion, t=t) on a random 3-cluster data set
281
+ expectedT = xp.asarray(getattr(hierarchy_test_data, 'fcluster_' + criterion)[t])
282
+ X = xp.asarray(hierarchy_test_data.Q_X)
283
+ T = fclusterdata(X, criterion=criterion, t=t)
284
+ assert is_isomorphic(T, expectedT)
285
+
286
+
287
+ @make_xp_test_case(fcluster)
288
+ class TestFcluster:
289
+
290
+ @make_xp_test_case(single, is_isomorphic)
291
+ @pytest.mark.parametrize("criterion,t",
292
+ [("inconsistent", t) for t in hierarchy_test_data.fcluster_inconsistent]
293
+ + [("distance", t) for t in hierarchy_test_data.fcluster_distance]
294
+ + [("maxclust", t) for t in hierarchy_test_data.fcluster_maxclust]
295
+ )
296
+ def test_fcluster(self, t, criterion, xp):
297
+ # Tests fcluster(Z, criterion=criterion, t=t) on a random 3-cluster data set.
298
+ expectedT = xp.asarray(getattr(hierarchy_test_data, 'fcluster_' + criterion)[t])
299
+ Z = single(xp.asarray(hierarchy_test_data.Q_X))
300
+ T = fcluster(Z, criterion=criterion, t=t)
301
+ assert_(is_isomorphic(T, expectedT))
302
+
303
+ @make_xp_test_case(single, is_isomorphic, maxdists)
304
+ @pytest.mark.parametrize("t", hierarchy_test_data.fcluster_distance)
305
+ def test_fcluster_monocrit(self, t, xp):
306
+ expectedT = xp.asarray(hierarchy_test_data.fcluster_distance[t])
307
+ Z = single(xp.asarray(hierarchy_test_data.Q_X))
308
+ T = fcluster(Z, t, criterion='monocrit', monocrit=maxdists(Z))
309
+ assert_(is_isomorphic(T, expectedT))
310
+
311
+ @make_xp_test_case(single, is_isomorphic, maxdists)
312
+ @pytest.mark.parametrize("t", hierarchy_test_data.fcluster_maxclust)
313
+ def test_fcluster_maxclust_monocrit(self, t, xp):
314
+ expectedT = xp.asarray(hierarchy_test_data.fcluster_maxclust[t])
315
+ Z = single(xp.asarray(hierarchy_test_data.Q_X))
316
+ T = fcluster(Z, t, criterion='maxclust_monocrit', monocrit=maxdists(Z))
317
+ assert_(is_isomorphic(T, expectedT))
318
+
319
+ @make_xp_test_case(single)
320
+ def test_fcluster_maxclust_gh_12651(self, xp):
321
+ y = xp.asarray([[1], [4], [5]])
322
+ Z = single(y)
323
+ assert_array_equal(fcluster(Z, t=1, criterion="maxclust"),
324
+ xp.asarray([1, 1, 1]))
325
+ assert_array_equal(fcluster(Z, t=2, criterion="maxclust"),
326
+ xp.asarray([2, 1, 1]))
327
+ assert_array_equal(fcluster(Z, t=3, criterion="maxclust"),
328
+ xp.asarray([1, 2, 3]))
329
+ assert_array_equal(fcluster(Z, t=5, criterion="maxclust"),
330
+ xp.asarray([1, 2, 3]))
331
+
332
+
333
+ @make_xp_test_case(leaders)
334
+ class TestLeaders:
335
+
336
+ def test_leaders_single(self, xp):
337
+ # Tests leaders using a flat clustering generated by single linkage.
338
+ X = hierarchy_test_data.Q_X
339
+ Y = pdist(X)
340
+ Z = linkage(Y)
341
+ T = fcluster(Z, criterion='maxclust', t=3)
342
+ Z = xp.asarray(Z)
343
+ T = xp.asarray(T, dtype=xp.int32)
344
+ L = leaders(Z, T)
345
+ expect = xp.asarray([53, 55, 56, 2, 3, 1], dtype=xp.int32)
346
+ xp_assert_close(xp.concat(L), expect, rtol=1e-15)
347
+
348
+
349
+ @make_xp_test_case(is_isomorphic)
350
+ class TestIsIsomorphic:
351
+
352
+ def test_array_like(self):
353
+ assert is_isomorphic([1, 1, 1], [2, 2, 2])
354
+ assert is_isomorphic([], [])
355
+
356
+ def test_is_isomorphic_1(self, xp):
357
+ # Tests is_isomorphic on test case #1 (one flat cluster, different labellings)
358
+ a = xp.asarray([1, 1, 1])
359
+ b = xp.asarray([2, 2, 2])
360
+ assert is_isomorphic(a, b)
361
+ assert is_isomorphic(b, a)
362
+
363
+ def test_is_isomorphic_2(self, xp):
364
+ # Tests is_isomorphic on test case #2 (two flat clusters, different labelings)
365
+ a = xp.asarray([1, 7, 1])
366
+ b = xp.asarray([2, 3, 2])
367
+ assert is_isomorphic(a, b)
368
+ assert is_isomorphic(b, a)
369
+
370
+ def test_is_isomorphic_3(self, xp):
371
+ # Tests is_isomorphic on test case #3 (no flat clusters)
372
+ a = xp.asarray([])
373
+ b = xp.asarray([])
374
+ assert is_isomorphic(a, b)
375
+
376
+ def test_is_isomorphic_4A(self, xp):
377
+ # Tests is_isomorphic on test case #4A
378
+ # (3 flat clusters, different labelings, isomorphic)
379
+ a = xp.asarray([1, 2, 3])
380
+ b = xp.asarray([1, 3, 2])
381
+ assert is_isomorphic(a, b)
382
+ assert is_isomorphic(b, a)
383
+
384
+ def test_is_isomorphic_4B(self, xp):
385
+ # Tests is_isomorphic on test case #4B
386
+ # (3 flat clusters, different labelings, nonisomorphic)
387
+ a = xp.asarray([1, 2, 3, 3])
388
+ b = xp.asarray([1, 3, 2, 3])
389
+ assert not is_isomorphic(a, b)
390
+ assert not is_isomorphic(b, a)
391
+
392
+ def test_is_isomorphic_4C(self, xp):
393
+ # Tests is_isomorphic on test case #4C
394
+ # (3 flat clusters, different labelings, isomorphic)
395
+ a = xp.asarray([7, 2, 3])
396
+ b = xp.asarray([6, 3, 2])
397
+ assert is_isomorphic(a, b)
398
+ assert is_isomorphic(b, a)
399
+
400
+ @pytest.mark.parametrize("nclusters", [2, 3, 5])
401
+ def test_is_isomorphic_5(self, nclusters, xp):
402
+ # Tests is_isomorphic on test case #5 (1000 observations, 2/3/5 random
403
+ # clusters, random permutation of the labeling).
404
+ self.is_isomorphic_randperm(1000, nclusters, xp=xp)
405
+
406
+ @pytest.mark.parametrize("nclusters", [2, 3, 5])
407
+ def test_is_isomorphic_6(self, nclusters, xp):
408
+ # Tests is_isomorphic on test case #5A (1000 observations, 2/3/5 random
409
+ # clusters, random permutation of the labeling, slightly
410
+ # nonisomorphic.)
411
+ self.is_isomorphic_randperm(1000, nclusters, True, 5, xp=xp)
412
+
413
+ def test_is_isomorphic_7(self, xp):
414
+ # Regression test for gh-6271
415
+ a = xp.asarray([1, 2, 3])
416
+ b = xp.asarray([1, 1, 1])
417
+ assert not is_isomorphic(a, b)
418
+
419
+ def is_isomorphic_randperm(self, nobs, nclusters, noniso=False, nerrors=0, *, xp):
420
+ for _ in range(3):
421
+ a = (np.random.rand(nobs) * nclusters).astype(int)
422
+ b = np.zeros(a.size, dtype=int)
423
+ P = np.random.permutation(nclusters)
424
+ for i in range(0, a.shape[0]):
425
+ b[i] = P[a[i]]
426
+ if noniso:
427
+ Q = np.random.permutation(nobs)
428
+ b[Q[0:nerrors]] += 1
429
+ b[Q[0:nerrors]] %= nclusters
430
+ a = xp.asarray(a)
431
+ b = xp.asarray(b)
432
+ assert is_isomorphic(a, b) == (not noniso)
433
+ assert is_isomorphic(b, a) == (not noniso)
434
+
435
+
436
+ @make_xp_test_case(is_valid_linkage)
437
+ class TestIsValidLinkage:
438
+
439
+ @pytest.mark.parametrize("nrow, ncol, valid", [(2, 5, False), (2, 3, False),
440
+ (1, 4, True), (2, 4, True)])
441
+ def test_is_valid_linkage_various_size(self, nrow, ncol, valid, xp):
442
+ # Tests is_valid_linkage(Z) with linkage matrices of various sizes
443
+ Z = xp.asarray([[0, 1, 3.0, 2, 5],
444
+ [3, 2, 4.0, 3, 3]], dtype=xp.float64)
445
+ Z = Z[:nrow, :ncol]
446
+ xp_assert_equal(is_valid_linkage(Z), valid, check_namespace=False)
447
+ if not valid:
448
+ assert_raises(ValueError, is_valid_linkage, Z, throw=True)
449
+
450
+ def test_is_valid_linkage_int_type(self, xp):
451
+ # Tests is_valid_linkage(Z) with integer type.
452
+ Z = xp.asarray([[0, 1, 3.0, 2],
453
+ [3, 2, 4.0, 3]], dtype=xp.int64)
454
+ xp_assert_equal(is_valid_linkage(Z), False, check_namespace=False)
455
+ assert_raises(TypeError, is_valid_linkage, Z, throw=True)
456
+
457
+ def test_is_valid_linkage_empty(self, xp):
458
+ # Tests is_valid_linkage(Z) with empty linkage.
459
+ Z = xp.zeros((0, 4), dtype=xp.float64)
460
+ xp_assert_equal(is_valid_linkage(Z), False, check_namespace=False)
461
+ assert_raises(ValueError, is_valid_linkage, Z, throw=True)
462
+
463
+ def test_is_valid_linkage_4_and_up(self, xp):
464
+ # Tests is_valid_linkage(Z) on linkage on observation sets between
465
+ # sizes 4 and 15 (step size 3).
466
+ for i in range(4, 15, 3):
467
+ y = np.random.rand(i*(i-1)//2)
468
+ Z = xp.asarray(linkage(y))
469
+ y = xp.asarray(y)
470
+ xp_assert_equal(is_valid_linkage(Z), True, check_namespace=False)
471
+
472
+ def test_is_valid_linkage_4_and_up_neg_index_left(self, xp):
473
+ # Tests is_valid_linkage(Z) on linkage on observation sets between
474
+ # sizes 4 and 15 (step size 3) with negative indices (left).
475
+ for i in range(4, 15, 3):
476
+ y = np.random.rand(i*(i-1)//2)
477
+ Z = xp.asarray(linkage(y))
478
+ y = xp.asarray(y)
479
+ Z = xpx.at(Z)[i//2, 0].set(-2)
480
+ xp_assert_equal(is_valid_linkage(Z), False, check_namespace=False)
481
+ with pytest.raises(ValueError):
482
+ eager.is_valid_linkage(Z, throw=True)
483
+
484
+ def test_is_valid_linkage_4_and_up_neg_index_right(self, xp):
485
+ # Tests is_valid_linkage(Z) on linkage on observation sets between
486
+ # sizes 4 and 15 (step size 3) with negative indices (right).
487
+ for i in range(4, 15, 3):
488
+ y = np.random.rand(i*(i-1)//2)
489
+ Z = xp.asarray(linkage(y))
490
+ y = xp.asarray(y)
491
+ Z = xpx.at(Z)[i//2, 1].set(-2)
492
+ xp_assert_equal(is_valid_linkage(Z), False, check_namespace=False)
493
+ with pytest.raises(ValueError):
494
+ eager.is_valid_linkage(Z, throw=True)
495
+
496
+ def test_is_valid_linkage_4_and_up_neg_dist(self, xp):
497
+ # Tests is_valid_linkage(Z) on linkage on observation sets between
498
+ # sizes 4 and 15 (step size 3) with negative distances.
499
+ for i in range(4, 15, 3):
500
+ y = np.random.rand(i*(i-1)//2)
501
+ Z = xp.asarray(linkage(y))
502
+ y = xp.asarray(y)
503
+ Z = xpx.at(Z)[i//2, 2].set(-0.5)
504
+ xp_assert_equal(is_valid_linkage(Z), False, check_namespace=False)
505
+ with pytest.raises(ValueError):
506
+ eager.is_valid_linkage(Z, throw=True)
507
+
508
+ def test_is_valid_linkage_4_and_up_neg_counts(self, xp):
509
+ # Tests is_valid_linkage(Z) on linkage on observation sets between
510
+ # sizes 4 and 15 (step size 3) with negative counts.
511
+ for i in range(4, 15, 3):
512
+ y = np.random.rand(i*(i-1)//2)
513
+ Z = xp.asarray(linkage(y))
514
+ y = xp.asarray(y)
515
+ Z = xpx.at(Z)[i//2, 3].set(-2)
516
+ xp_assert_equal(is_valid_linkage(Z), False, check_namespace=False)
517
+ with pytest.raises(ValueError):
518
+ eager.is_valid_linkage(Z, throw=True)
519
+
520
+
521
+ @make_xp_test_case(is_valid_im)
522
+ class TestIsValidInconsistent:
523
+
524
+ def test_is_valid_im_int_type(self, xp):
525
+ # Tests is_valid_im(R) with integer type.
526
+ R = xp.asarray([[0, 1, 3.0, 2],
527
+ [3, 2, 4.0, 3]], dtype=xp.int64)
528
+ xp_assert_equal(is_valid_im(R), False, check_namespace=False)
529
+ assert_raises(TypeError, is_valid_im, R, throw=True)
530
+
531
+ @pytest.mark.parametrize("nrow, ncol, valid", [(2, 5, False), (2, 3, False),
532
+ (1, 4, True), (2, 4, True)])
533
+ def test_is_valid_im_various_size(self, nrow, ncol, valid, xp):
534
+ # Tests is_valid_im(R) with linkage matrices of various sizes
535
+ R = xp.asarray([[0, 1, 3.0, 2, 5],
536
+ [3, 2, 4.0, 3, 3]], dtype=xp.float64)
537
+ R = R[:nrow, :ncol]
538
+ xp_assert_equal(is_valid_im(R), valid, check_namespace=False)
539
+ if not valid:
540
+ assert_raises(ValueError, is_valid_im, R, throw=True)
541
+
542
+ def test_is_valid_im_empty(self, xp):
543
+ # Tests is_valid_im(R) with empty inconsistency matrix.
544
+ R = xp.zeros((0, 4), dtype=xp.float64)
545
+ xp_assert_equal(is_valid_im(R), False, check_namespace=False)
546
+ assert_raises(ValueError, is_valid_im, R, throw=True)
547
+
548
+ def test_is_valid_im_4_and_up(self, xp):
549
+ # Tests is_valid_im(R) on im on observation sets between sizes 4 and 15
550
+ # (step size 3).
551
+ for i in range(4, 15, 3):
552
+ y = np.random.rand(i*(i-1)//2)
553
+ Z = linkage(y)
554
+ R = inconsistent(Z)
555
+ R = xp.asarray(R)
556
+ xp_assert_equal(is_valid_im(R), True, check_namespace=False)
557
+
558
+ def test_is_valid_im_4_and_up_neg_index_left(self, xp):
559
+ # Tests is_valid_im(R) on im on observation sets between sizes 4 and 15
560
+ # (step size 3) with negative link height means.
561
+ for i in range(4, 15, 3):
562
+ y = np.random.rand(i*(i-1)//2)
563
+ Z = linkage(y)
564
+ R = inconsistent(Z)
565
+ R = xpx.at(R)[i//2 , 0].set(-2.0)
566
+ R = xp.asarray(R)
567
+ xp_assert_equal(is_valid_im(R), False, check_namespace=False)
568
+ with pytest.raises(ValueError):
569
+ eager.is_valid_im(R, throw=True)
570
+
571
+ def test_is_valid_im_4_and_up_neg_index_right(self, xp):
572
+ # Tests is_valid_im(R) on im on observation sets between sizes 4 and 15
573
+ # (step size 3) with negative link height standard deviations.
574
+ for i in range(4, 15, 3):
575
+ y = np.random.rand(i*(i-1)//2)
576
+ Z = linkage(y)
577
+ R = inconsistent(Z)
578
+ R = xpx.at(R)[i//2 , 1].set(-2.0)
579
+ R = xp.asarray(R)
580
+ xp_assert_equal(is_valid_im(R), False, check_namespace=False)
581
+ with pytest.raises(ValueError):
582
+ eager.is_valid_im(R, throw=True)
583
+
584
+ def test_is_valid_im_4_and_up_neg_dist(self, xp):
585
+ # Tests is_valid_im(R) on im on observation sets between sizes 4 and 15
586
+ # (step size 3) with negative link counts.
587
+ for i in range(4, 15, 3):
588
+ y = np.random.rand(i*(i-1)//2)
589
+ Z = linkage(y)
590
+ R = inconsistent(Z)
591
+ R = xpx.at(R)[i//2, 2].set(-0.5)
592
+ R = xp.asarray(R)
593
+ xp_assert_equal(is_valid_im(R), False, check_namespace=False)
594
+ with pytest.raises(ValueError):
595
+ eager.is_valid_im(R, throw=True)
596
+
597
+
598
+ class TestNumObsLinkage:
599
+
600
+ def test_num_obs_linkage_empty(self, xp):
601
+ # Tests num_obs_linkage(Z) with empty linkage.
602
+ Z = xp.zeros((0, 4), dtype=xp.float64)
603
+ assert_raises(ValueError, num_obs_linkage, Z)
604
+
605
+ def test_num_obs_linkage_1x4(self, xp):
606
+ # Tests num_obs_linkage(Z) on linkage over 2 observations.
607
+ Z = xp.asarray([[0, 1, 3.0, 2]], dtype=xp.float64)
608
+ assert num_obs_linkage(Z) == 2
609
+
610
+ def test_num_obs_linkage_2x4(self, xp):
611
+ # Tests num_obs_linkage(Z) on linkage over 3 observations.
612
+ Z = xp.asarray([[0, 1, 3.0, 2],
613
+ [3, 2, 4.0, 3]], dtype=xp.float64)
614
+ assert num_obs_linkage(Z) == 3
615
+
616
+ def test_num_obs_linkage_4_and_up(self, xp):
617
+ # Tests num_obs_linkage(Z) on linkage on observation sets between sizes
618
+ # 4 and 15 (step size 3).
619
+ for i in range(4, 15, 3):
620
+ y = np.random.rand(i*(i-1)//2)
621
+ Z = xp.asarray(linkage(y))
622
+ assert num_obs_linkage(Z) == i
623
+
624
+ def test_num_obs_linkage_multi_matrix(self, xp):
625
+ # Tests num_obs_linkage with observation matrices of multiple sizes.
626
+ for n in range(2, 10):
627
+ X = np.random.rand(n, 4)
628
+ Y = pdist(X)
629
+ Z = xp.asarray(linkage(Y))
630
+ assert num_obs_linkage(Z) == n
631
+
632
+
633
+ @make_xp_test_case(leaves_list, to_tree)
634
+ class TestLeavesList:
635
+
636
+ def test_leaves_list_1x4(self, xp):
637
+ # Tests leaves_list(Z) on a 1x4 linkage.
638
+ Z = xp.asarray([[0, 1, 3.0, 2]], dtype=xp.float64)
639
+ to_tree(Z)
640
+ assert_allclose(leaves_list(Z), [0, 1], rtol=1e-15)
641
+
642
+ def test_leaves_list_2x4(self, xp):
643
+ # Tests leaves_list(Z) on a 2x4 linkage.
644
+ Z = xp.asarray([[0, 1, 3.0, 2],
645
+ [3, 2, 4.0, 3]], dtype=xp.float64)
646
+ to_tree(Z)
647
+ assert_allclose(leaves_list(Z), [0, 1, 2], rtol=1e-15)
648
+
649
+ @pytest.mark.parametrize("method",
650
+ ['single', 'complete', 'average', 'weighted', 'centroid', 'median', 'ward'])
651
+ def test_leaves_list_Q(self, method, xp):
652
+ # Tests leaves_list(Z) on the Q data set
653
+ X = hierarchy_test_data.Q_X
654
+ Z = xp.asarray(linkage(X, method))
655
+ node = to_tree(Z)
656
+ assert_allclose(node.pre_order(), leaves_list(Z), rtol=1e-15)
657
+
658
+ def test_Q_subtree_pre_order(self, xp):
659
+ # Tests that pre_order() works when called on sub-trees.
660
+ X = hierarchy_test_data.Q_X
661
+ Z = xp.asarray(linkage(X, 'single'))
662
+ node = to_tree(Z)
663
+ assert_allclose(node.pre_order(),
664
+ (node.get_left().pre_order() + node.get_right().pre_order()),
665
+ rtol=1e-15)
666
+
667
+
668
+ @make_xp_test_case(correspond)
669
+ class TestCorrespond:
670
+
671
+ def test_correspond_empty(self, xp):
672
+ # Tests correspond(Z, y) with empty linkage and condensed distance matrix.
673
+ y = xp.zeros((0,), dtype=xp.float64)
674
+ Z = xp.zeros((0,4), dtype=xp.float64)
675
+ assert_raises(ValueError, correspond, Z, y)
676
+
677
+ def test_correspond_2_and_up(self, xp):
678
+ # Tests correspond(Z, y) on linkage and CDMs over observation sets of
679
+ # different sizes.
680
+ for i in range(2, 4):
681
+ y = np.random.rand(i*(i-1)//2)
682
+ Z = xp.asarray(linkage(y))
683
+ y = xp.asarray(y)
684
+ assert_(correspond(Z, y))
685
+ for i in range(4, 15, 3):
686
+ y = np.random.rand(i*(i-1)//2)
687
+ Z = xp.asarray(linkage(y))
688
+ y = xp.asarray(y)
689
+ assert_(correspond(Z, y))
690
+
691
+ def test_correspond_4_and_up(self, xp):
692
+ # Tests correspond(Z, y) on linkage and CDMs over observation sets of
693
+ # different sizes. Correspondence should be false.
694
+ for (i, j) in (list(zip(list(range(2, 4)), list(range(3, 5)))) +
695
+ list(zip(list(range(3, 5)), list(range(2, 4))))):
696
+ y = np.random.rand(i*(i-1)//2)
697
+ y2 = np.random.rand(j*(j-1)//2)
698
+ Z = xp.asarray(linkage(y))
699
+ Z2 = xp.asarray(linkage(y2))
700
+ y = xp.asarray(y)
701
+ y2 = xp.asarray(y2)
702
+ assert not correspond(Z, y2)
703
+ assert not correspond(Z2, y)
704
+
705
+ def test_correspond_4_and_up_2(self, xp):
706
+ # Tests correspond(Z, y) on linkage and CDMs over observation sets of
707
+ # different sizes. Correspondence should be false.
708
+ for (i, j) in (list(zip(list(range(2, 7)), list(range(16, 21)))) +
709
+ list(zip(list(range(2, 7)), list(range(16, 21))))):
710
+ y = np.random.rand(i*(i-1)//2)
711
+ y2 = np.random.rand(j*(j-1)//2)
712
+ Z = xp.asarray(linkage(y))
713
+ Z2 = xp.asarray(linkage(y2))
714
+ y = xp.asarray(y)
715
+ y2 = xp.asarray(y2)
716
+ assert not correspond(Z, y2)
717
+ assert not correspond(Z2, y)
718
+
719
+
720
+ @make_xp_test_case(is_monotonic)
721
+ class TestIsMonotonic:
722
+
723
+ def test_is_monotonic_empty(self, xp):
724
+ # Tests is_monotonic(Z) on an empty linkage.
725
+ Z = xp.zeros((0, 4), dtype=xp.float64)
726
+ assert_raises(ValueError, is_monotonic, Z)
727
+
728
+ def test_is_monotonic_1x4(self, xp):
729
+ # Tests is_monotonic(Z) on 1x4 linkage. Expecting True.
730
+ Z = xp.asarray([[0, 1, 0.3, 2]], dtype=xp.float64)
731
+ assert is_monotonic(Z)
732
+
733
+ def test_is_monotonic_2x4_T(self, xp):
734
+ # Tests is_monotonic(Z) on 2x4 linkage. Expecting True.
735
+ Z = xp.asarray([[0, 1, 0.3, 2],
736
+ [2, 3, 0.4, 3]], dtype=xp.float64)
737
+ assert is_monotonic(Z)
738
+
739
+ def test_is_monotonic_2x4_F(self, xp):
740
+ # Tests is_monotonic(Z) on 2x4 linkage. Expecting False.
741
+ Z = xp.asarray([[0, 1, 0.4, 2],
742
+ [2, 3, 0.3, 3]], dtype=xp.float64)
743
+ assert not is_monotonic(Z)
744
+
745
+ def test_is_monotonic_3x4_T(self, xp):
746
+ # Tests is_monotonic(Z) on 3x4 linkage. Expecting True.
747
+ Z = xp.asarray([[0, 1, 0.3, 2],
748
+ [2, 3, 0.4, 2],
749
+ [4, 5, 0.6, 4]], dtype=xp.float64)
750
+ assert is_monotonic(Z)
751
+
752
+ def test_is_monotonic_3x4_F1(self, xp):
753
+ # Tests is_monotonic(Z) on 3x4 linkage (case 1). Expecting False.
754
+ Z = xp.asarray([[0, 1, 0.3, 2],
755
+ [2, 3, 0.2, 2],
756
+ [4, 5, 0.6, 4]], dtype=xp.float64)
757
+ assert not is_monotonic(Z)
758
+
759
+ def test_is_monotonic_3x4_F2(self, xp):
760
+ # Tests is_monotonic(Z) on 3x4 linkage (case 2). Expecting False.
761
+ Z = xp.asarray([[0, 1, 0.8, 2],
762
+ [2, 3, 0.4, 2],
763
+ [4, 5, 0.6, 4]], dtype=xp.float64)
764
+ assert not is_monotonic(Z)
765
+
766
+ def test_is_monotonic_3x4_F3(self, xp):
767
+ # Tests is_monotonic(Z) on 3x4 linkage (case 3). Expecting False
768
+ Z = xp.asarray([[0, 1, 0.3, 2],
769
+ [2, 3, 0.4, 2],
770
+ [4, 5, 0.2, 4]], dtype=xp.float64)
771
+ assert not is_monotonic(Z)
772
+
773
+ def test_is_monotonic_tdist_linkage1(self, xp):
774
+ # Tests is_monotonic(Z) on clustering generated by single linkage on
775
+ # tdist data set. Expecting True.
776
+ Z = xp.asarray(linkage(hierarchy_test_data.ytdist, 'single'))
777
+ assert is_monotonic(Z)
778
+
779
+ def test_is_monotonic_tdist_linkage2(self, xp):
780
+ # Tests is_monotonic(Z) on clustering generated by single linkage on
781
+ # tdist data set. Perturbing. Expecting False.
782
+ Z = xp.asarray(linkage(hierarchy_test_data.ytdist, 'single'))
783
+ Z = xpx.at(Z)[2, 2].set(0.0)
784
+ assert not is_monotonic(Z)
785
+
786
+ def test_is_monotonic_Q_linkage(self, xp):
787
+ # Tests is_monotonic(Z) on clustering generated by single linkage on
788
+ # Q data set. Expecting True.
789
+ X = hierarchy_test_data.Q_X
790
+ Z = xp.asarray(linkage(X, 'single'))
791
+ assert is_monotonic(Z)
792
+
793
+
794
+ @make_xp_test_case(maxdists)
795
+ class TestMaxDists:
796
+
797
+ def test_maxdists_empty_linkage(self, xp):
798
+ # Tests maxdists(Z) on empty linkage. Expecting exception.
799
+ Z = xp.zeros((0, 4), dtype=xp.float64)
800
+ assert_raises(ValueError, maxdists, Z)
801
+
802
+ def test_maxdists_one_cluster_linkage(self, xp):
803
+ # Tests maxdists(Z) on linkage with one cluster.
804
+ Z = xp.asarray([[0, 1, 0.3, 4]], dtype=xp.float64)
805
+ MD = maxdists(Z)
806
+ expectedMD = calculate_maximum_distances(Z, xp)
807
+ xp_assert_close(MD, expectedMD, atol=1e-15)
808
+
809
+ @pytest.mark.parametrize(
810
+ "method", ['single', 'complete', 'ward', 'centroid', 'median'])
811
+ def test_maxdists_Q_linkage(self, method, xp):
812
+ # Tests maxdists(Z) on the Q data set
813
+ X = hierarchy_test_data.Q_X
814
+ Z = xp.asarray(linkage(X, method))
815
+ MD = maxdists(Z)
816
+ expectedMD = calculate_maximum_distances(Z, xp)
817
+ xp_assert_close(MD, expectedMD, atol=1e-15)
818
+
819
+
820
+ @make_xp_test_case(maxinconsts)
821
+ class TestMaxInconsts:
822
+
823
+ def test_maxinconsts_empty_linkage(self, xp):
824
+ # Tests maxinconsts(Z, R) on empty linkage. Expecting exception.
825
+ Z = xp.zeros((0, 4), dtype=xp.float64)
826
+ R = xp.zeros((0, 4), dtype=xp.float64)
827
+ assert_raises(ValueError, maxinconsts, Z, R)
828
+
829
+ def test_maxinconsts_difrow_linkage(self, xp):
830
+ # Tests maxinconsts(Z, R) on linkage and inconsistency matrices with
831
+ # different numbers of clusters. Expecting exception.
832
+ Z = xp.asarray([[0, 1, 0.3, 4]], dtype=xp.float64)
833
+ R = np.random.rand(2, 4)
834
+ R = xp.asarray(R)
835
+ assert_raises(ValueError, maxinconsts, Z, R)
836
+
837
+ def test_maxinconsts_one_cluster_linkage(self, xp):
838
+ # Tests maxinconsts(Z, R) on linkage with one cluster.
839
+ Z = xp.asarray([[0, 1, 0.3, 4]], dtype=xp.float64)
840
+ R = xp.asarray([[0, 0, 0, 0.3]], dtype=xp.float64)
841
+ MD = maxinconsts(Z, R)
842
+ expectedMD = calculate_maximum_inconsistencies(Z, R, xp=xp)
843
+ xp_assert_close(MD, expectedMD, atol=1e-15)
844
+
845
+ @pytest.mark.parametrize(
846
+ "method", ['single', 'complete', 'ward', 'centroid', 'median'])
847
+ def test_maxinconsts_Q_linkage(self, method, xp):
848
+ # Tests maxinconsts(Z, R) on the Q data set
849
+ X = hierarchy_test_data.Q_X
850
+ Z = linkage(X, method)
851
+ R = xp.asarray(inconsistent(Z))
852
+ Z = xp.asarray(Z)
853
+ MD = maxinconsts(Z, R)
854
+ expectedMD = calculate_maximum_inconsistencies(Z, R, xp=xp)
855
+ xp_assert_close(MD, expectedMD, atol=1e-15)
856
+
857
+
858
+ @make_xp_test_case(maxRstat)
859
+ class TestMaxRStat:
860
+
861
+ def test_maxRstat_invalid_index(self, xp):
862
+ # Tests maxRstat(Z, R, i). Expecting exception.
863
+ Z = xp.asarray([[0, 1, 0.3, 4]], dtype=xp.float64)
864
+ R = xp.asarray([[0, 0, 0, 0.3]], dtype=xp.float64)
865
+ with pytest.raises(TypeError):
866
+ maxRstat(Z, R, 3.3)
867
+ with pytest.raises(ValueError):
868
+ maxRstat(Z, R, -1)
869
+ with pytest.raises(ValueError):
870
+ maxRstat(Z, R, 4)
871
+
872
+ @pytest.mark.parametrize("i", range(4))
873
+ def test_maxRstat_empty_linkage(self, i, xp):
874
+ # Tests maxRstat(Z, R, i) on empty linkage. Expecting exception.
875
+ Z = xp.zeros((0, 4), dtype=xp.float64)
876
+ R = xp.zeros((0, 4), dtype=xp.float64)
877
+ assert_raises(ValueError, maxRstat, Z, R, i)
878
+
879
+ @pytest.mark.parametrize("i", range(4))
880
+ def test_maxRstat_difrow_linkage(self, i, xp):
881
+ # Tests maxRstat(Z, R, i) on linkage and inconsistency matrices with
882
+ # different numbers of clusters. Expecting exception.
883
+ Z = xp.asarray([[0, 1, 0.3, 4]], dtype=xp.float64)
884
+ R = np.random.rand(2, 4)
885
+ R = xp.asarray(R)
886
+ assert_raises(ValueError, maxRstat, Z, R, i)
887
+
888
+ def test_maxRstat_one_cluster_linkage(self, xp):
889
+ # Tests maxRstat(Z, R, i) on linkage with one cluster.
890
+ Z = xp.asarray([[0, 1, 0.3, 4]], dtype=xp.float64)
891
+ R = xp.asarray([[0, 0, 0, 0.3]], dtype=xp.float64)
892
+ MD = maxRstat(Z, R, 1)
893
+ expectedMD = calculate_maximum_inconsistencies(Z, R, 1, xp)
894
+ xp_assert_close(MD, expectedMD, atol=1e-15)
895
+
896
+ @pytest.mark.parametrize(
897
+ "method", ['single', 'complete', 'ward', 'centroid', 'median'])
898
+ def test_maxRstat_Q_linkage(self, method, xp):
899
+ # Tests maxRstat(Z, R, 1) on the Q data set
900
+ X = hierarchy_test_data.Q_X
901
+ Z = linkage(X, method)
902
+ R = xp.asarray(inconsistent(Z))
903
+ Z = xp.asarray(Z)
904
+ MD = maxRstat(Z, R, 1)
905
+ expectedMD = calculate_maximum_inconsistencies(Z, R, 1, xp)
906
+ xp_assert_close(MD, expectedMD, atol=1e-15)
907
+
908
+
909
+ @make_xp_test_case(dendrogram)
910
+ class TestDendrogram:
911
+
912
+ def test_dendrogram_single_linkage_tdist(self, xp):
913
+ # Tests dendrogram calculation on single linkage of the tdist data set.
914
+ Z = xp.asarray(linkage(hierarchy_test_data.ytdist, 'single'))
915
+ R = dendrogram(Z, no_plot=True)
916
+ leaves = R["leaves"]
917
+ assert_equal(leaves, [2, 5, 1, 0, 3, 4])
918
+
919
+ def test_valid_orientation(self, xp):
920
+ Z = xp.asarray(linkage(hierarchy_test_data.ytdist, 'single'))
921
+ assert_raises(ValueError, dendrogram, Z, orientation="foo")
922
+
923
+ def test_labels_as_array_or_list(self, xp):
924
+ # test for gh-12418
925
+ Z = xp.asarray(linkage(hierarchy_test_data.ytdist, 'single'))
926
+ labels = [1, 3, 2, 6, 4, 5]
927
+ result1 = dendrogram(Z, labels=xp.asarray(labels), no_plot=True)
928
+ result2 = dendrogram(Z, labels=labels, no_plot=True)
929
+ assert result1 == result2
930
+
931
+ @pytest.mark.skipif(not have_matplotlib, reason="no matplotlib")
932
+ def test_valid_label_size(self, xp):
933
+ link = xp.asarray([
934
+ [0, 1, 1.0, 4],
935
+ [2, 3, 1.0, 5],
936
+ [4, 5, 2.0, 6],
937
+ ])
938
+ plt.figure()
939
+ with pytest.raises(ValueError) as exc_info:
940
+ dendrogram(link, labels=list(range(100)))
941
+ assert "Dimensions of Z and labels must be consistent."\
942
+ in str(exc_info.value)
943
+
944
+ with pytest.raises(
945
+ ValueError,
946
+ match="Dimensions of Z and labels must be consistent."):
947
+ dendrogram(link, labels=[])
948
+
949
+ plt.close()
950
+
951
+ @skip_xp_backends('torch',
952
+ reason='MPL 3.9.2 & torch DeprecationWarning from __array_wrap__'
953
+ ' and NumPy 2.0'
954
+ )
955
+ @skip_xp_backends('dask.array',
956
+ reason='dask.array has bad interaction with matplotlib'
957
+ )
958
+ @pytest.mark.skipif(not have_matplotlib, reason="no matplotlib")
959
+ @pytest.mark.parametrize("orientation", ['top', 'bottom', 'left', 'right'])
960
+ def test_dendrogram_plot(self, orientation, xp):
961
+ # Tests dendrogram plotting.
962
+ Z = xp.asarray(linkage(hierarchy_test_data.ytdist, 'single'))
963
+ expected = {'color_list': ['C1', 'C0', 'C0', 'C0', 'C0'],
964
+ 'dcoord': [[0.0, 138.0, 138.0, 0.0],
965
+ [0.0, 219.0, 219.0, 0.0],
966
+ [0.0, 255.0, 255.0, 219.0],
967
+ [0.0, 268.0, 268.0, 255.0],
968
+ [138.0, 295.0, 295.0, 268.0]],
969
+ 'icoord': [[5.0, 5.0, 15.0, 15.0],
970
+ [45.0, 45.0, 55.0, 55.0],
971
+ [35.0, 35.0, 50.0, 50.0],
972
+ [25.0, 25.0, 42.5, 42.5],
973
+ [10.0, 10.0, 33.75, 33.75]],
974
+ 'ivl': ['2', '5', '1', '0', '3', '4'],
975
+ 'leaves': [2, 5, 1, 0, 3, 4],
976
+ 'leaves_color_list': ['C1', 'C1', 'C0', 'C0', 'C0', 'C0'],
977
+ }
978
+
979
+ fig = plt.figure()
980
+ ax = fig.add_subplot(221)
981
+
982
+ # test that dendrogram accepts ax keyword
983
+ R1 = dendrogram(Z, ax=ax, orientation=orientation)
984
+ R1['dcoord'] = np.asarray(R1['dcoord'])
985
+ assert_equal(R1, expected)
986
+
987
+ # test that dendrogram accepts and handle the leaf_font_size and
988
+ # leaf_rotation keywords
989
+ dendrogram(Z, ax=ax, orientation=orientation,
990
+ leaf_font_size=20, leaf_rotation=90)
991
+ testlabel = (
992
+ ax.get_xticklabels()[0]
993
+ if orientation in ['top', 'bottom']
994
+ else ax.get_yticklabels()[0]
995
+ )
996
+ assert_equal(testlabel.get_rotation(), 90)
997
+ assert_equal(testlabel.get_size(), 20)
998
+ dendrogram(Z, ax=ax, orientation=orientation,
999
+ leaf_rotation=90)
1000
+ testlabel = (
1001
+ ax.get_xticklabels()[0]
1002
+ if orientation in ['top', 'bottom']
1003
+ else ax.get_yticklabels()[0]
1004
+ )
1005
+ assert_equal(testlabel.get_rotation(), 90)
1006
+ dendrogram(Z, ax=ax, orientation=orientation,
1007
+ leaf_font_size=20)
1008
+ testlabel = (
1009
+ ax.get_xticklabels()[0]
1010
+ if orientation in ['top', 'bottom']
1011
+ else ax.get_yticklabels()[0]
1012
+ )
1013
+ assert_equal(testlabel.get_size(), 20)
1014
+ plt.close()
1015
+
1016
+ # test plotting to gca (will import pylab)
1017
+ R2 = dendrogram(Z, orientation=orientation)
1018
+ plt.close()
1019
+ R2['dcoord'] = np.asarray(R2['dcoord'])
1020
+ assert_equal(R2, expected)
1021
+
1022
+ @skip_xp_backends('torch',
1023
+ reason='MPL 3.9.2 & torch DeprecationWarning from __array_wrap__'
1024
+ ' and NumPy 2.0'
1025
+ )
1026
+ @skip_xp_backends('dask.array',
1027
+ reason='dask.array has bad interaction with matplotlib'
1028
+ )
1029
+ @pytest.mark.skipif(not have_matplotlib, reason="no matplotlib")
1030
+ def test_dendrogram_truncate_mode(self, xp):
1031
+ Z = xp.asarray(linkage(hierarchy_test_data.ytdist, 'single'))
1032
+
1033
+ R = dendrogram(Z, 2, 'lastp', show_contracted=True)
1034
+ plt.close()
1035
+ R['dcoord'] = np.asarray(R['dcoord'])
1036
+ assert_equal(R, {'color_list': ['C0'],
1037
+ 'dcoord': [[0.0, 295.0, 295.0, 0.0]],
1038
+ 'icoord': [[5.0, 5.0, 15.0, 15.0]],
1039
+ 'ivl': ['(2)', '(4)'],
1040
+ 'leaves': [6, 9],
1041
+ 'leaves_color_list': ['C0', 'C0'],
1042
+ })
1043
+
1044
+ R = dendrogram(Z, 2, 'mtica', show_contracted=True)
1045
+ plt.close()
1046
+ R['dcoord'] = np.asarray(R['dcoord'])
1047
+ assert_equal(R, {'color_list': ['C1', 'C0', 'C0', 'C0'],
1048
+ 'dcoord': [[0.0, 138.0, 138.0, 0.0],
1049
+ [0.0, 255.0, 255.0, 0.0],
1050
+ [0.0, 268.0, 268.0, 255.0],
1051
+ [138.0, 295.0, 295.0, 268.0]],
1052
+ 'icoord': [[5.0, 5.0, 15.0, 15.0],
1053
+ [35.0, 35.0, 45.0, 45.0],
1054
+ [25.0, 25.0, 40.0, 40.0],
1055
+ [10.0, 10.0, 32.5, 32.5]],
1056
+ 'ivl': ['2', '5', '1', '0', '(2)'],
1057
+ 'leaves': [2, 5, 1, 0, 7],
1058
+ 'leaves_color_list': ['C1', 'C1', 'C0', 'C0', 'C0'],
1059
+ })
1060
+
1061
+ @pytest.fixture
1062
+ def dendrogram_lock(self):
1063
+ return Lock()
1064
+
1065
+ def test_dendrogram_colors(self, xp, dendrogram_lock):
1066
+ # Tests dendrogram plots with alternate colors
1067
+ Z = xp.asarray(linkage(hierarchy_test_data.ytdist, 'single'))
1068
+
1069
+ with dendrogram_lock:
1070
+ # Global color palette might be changed concurrently
1071
+ set_link_color_palette(['c', 'm', 'y', 'k'])
1072
+ R = dendrogram(Z, no_plot=True,
1073
+ above_threshold_color='g', color_threshold=250)
1074
+ set_link_color_palette(['g', 'r', 'c', 'm', 'y', 'k'])
1075
+
1076
+ color_list = R['color_list']
1077
+ assert_equal(color_list, ['c', 'm', 'g', 'g', 'g'])
1078
+
1079
+ # reset color palette (global list)
1080
+ set_link_color_palette(None)
1081
+
1082
+ def test_dendrogram_leaf_colors_zero_dist(self, xp):
1083
+ # tests that the colors of leafs are correct for tree
1084
+ # with two identical points
1085
+ X = np.asarray([[1, 0, 0],
1086
+ [0, 0, 1],
1087
+ [0, 2, 0],
1088
+ [0, 0, 1],
1089
+ [0, 1, 0],
1090
+ [0, 1, 0]])
1091
+ Z = xp.asarray(linkage(X, "single"))
1092
+ d = dendrogram(Z, no_plot=True)
1093
+ exp_colors = ['C0', 'C1', 'C1', 'C0', 'C2', 'C2']
1094
+ colors = d["leaves_color_list"]
1095
+ assert_equal(colors, exp_colors)
1096
+
1097
+ def test_dendrogram_leaf_colors(self, xp):
1098
+ # tests that the colors are correct for a tree
1099
+ # with two near points ((0, 0, 1.1) and (0, 0, 1))
1100
+ X = np.asarray([[1, 0, 0],
1101
+ [0, 0, 1.1],
1102
+ [0, 2, 0],
1103
+ [0, 0, 1],
1104
+ [0, 1, 0],
1105
+ [0, 1, 0]])
1106
+ Z = xp.asarray(linkage(X, "single"))
1107
+ d = dendrogram(Z, no_plot=True)
1108
+ exp_colors = ['C0', 'C1', 'C1', 'C0', 'C2', 'C2']
1109
+ colors = d["leaves_color_list"]
1110
+ assert_equal(colors, exp_colors)
1111
+
1112
+
1113
+ def calculate_maximum_distances(Z, xp):
1114
+ # Used for testing correctness of maxdists.
1115
+ n = Z.shape[0] + 1
1116
+ B = xp.zeros((n-1,), dtype=Z.dtype)
1117
+ for i in range(0, n - 1):
1118
+ q = xp.zeros((3,))
1119
+ left = Z[i, 0]
1120
+ right = Z[i, 1]
1121
+ if left >= n:
1122
+ b_left = B[xp.asarray(left, dtype=xp.int64) - n]
1123
+ q = xpx.at(q, 0).set(b_left)
1124
+ if right >= n:
1125
+ b_right = B[xp.asarray(right, dtype=xp.int64) - n]
1126
+ q = xpx.at(q, 1).set(b_right)
1127
+ q = xpx.at(q, 2).set(Z[i, 2])
1128
+ B = xpx.at(B, i).set(xp.max(q))
1129
+ return B
1130
+
1131
+
1132
+ def calculate_maximum_inconsistencies(Z, R, k=3, xp=np):
1133
+ # Used for testing correctness of maxinconsts.
1134
+ n = Z.shape[0] + 1
1135
+ dtype = xp.result_type(Z, R)
1136
+ B = xp.zeros((n-1,), dtype=dtype)
1137
+ for i in range(0, n - 1):
1138
+ q = xp.zeros((3,))
1139
+ left = Z[i, 0]
1140
+ right = Z[i, 1]
1141
+ if left >= n:
1142
+ b_left = B[xp.asarray(left, dtype=xp.int64) - n]
1143
+ q = xpx.at(q, 0).set(b_left)
1144
+ if right >= n:
1145
+ b_right = B[xp.asarray(right, dtype=xp.int64) - n]
1146
+ q = xpx.at(q, 1).set(b_right)
1147
+ q = xpx.at(q, 2).set(R[i, k])
1148
+ B = xpx.at(B, i).set(xp.max(q))
1149
+ return B
1150
+
1151
+
1152
+ @make_xp_test_case(to_tree)
1153
+ def test_node_compare(xp):
1154
+ np.random.seed(23)
1155
+ nobs = 50
1156
+ X = np.random.randn(nobs, 4)
1157
+ Z = xp.asarray(ward(X))
1158
+ tree = to_tree(Z)
1159
+ assert_(tree > tree.get_left())
1160
+ assert_(tree.get_right() > tree.get_left())
1161
+ assert_(tree.get_right() == tree.get_right())
1162
+ assert_(tree.get_right() != tree.get_left())
1163
+
1164
+
1165
+ @make_xp_test_case(cut_tree)
1166
+ def test_cut_tree(xp):
1167
+ np.random.seed(23)
1168
+ nobs = 50
1169
+ X = np.random.randn(nobs, 4)
1170
+ Z = xp.asarray(ward(X))
1171
+ cutree = cut_tree(Z)
1172
+
1173
+ # cutree.dtype varies between int32 and int64 over platforms
1174
+ xp_assert_close(cutree[:, 0], xp.arange(nobs), rtol=1e-15, check_dtype=False)
1175
+ xp_assert_close(cutree[:, -1], xp.zeros(nobs), rtol=1e-15, check_dtype=False)
1176
+ assert_equal(np.asarray(cutree).max(0), np.arange(nobs - 1, -1, -1))
1177
+
1178
+ xp_assert_close(cutree[:, [-5]], cut_tree(Z, n_clusters=5), rtol=1e-15)
1179
+ xp_assert_close(cutree[:, [-5, -10]], cut_tree(Z, n_clusters=[5, 10]), rtol=1e-15)
1180
+ xp_assert_close(cutree[:, [-10, -5]], cut_tree(Z, n_clusters=[10, 5]), rtol=1e-15)
1181
+
1182
+ nodes = _order_cluster_tree(Z)
1183
+ heights = xp.asarray([node.dist for node in nodes])
1184
+
1185
+ xp_assert_close(cutree[:, np.searchsorted(heights, [5])],
1186
+ cut_tree(Z, height=5), rtol=1e-15)
1187
+ xp_assert_close(cutree[:, np.searchsorted(heights, [5, 10])],
1188
+ cut_tree(Z, height=[5, 10]), rtol=1e-15)
1189
+ xp_assert_close(cutree[:, np.searchsorted(heights, [10, 5])],
1190
+ cut_tree(Z, height=[10, 5]), rtol=1e-15)
1191
+
1192
+
1193
+ @make_xp_test_case(optimal_leaf_ordering)
1194
+ def test_optimal_leaf_ordering(xp):
1195
+ # test with the distance vector y
1196
+ Z = optimal_leaf_ordering(xp.asarray(linkage(hierarchy_test_data.ytdist)),
1197
+ xp.asarray(hierarchy_test_data.ytdist))
1198
+ expectedZ = hierarchy_test_data.linkage_ytdist_single_olo
1199
+ xp_assert_close(Z, xp.asarray(expectedZ), atol=1e-10)
1200
+
1201
+ # test with the observation matrix X
1202
+ Z = optimal_leaf_ordering(xp.asarray(linkage(hierarchy_test_data.X, 'ward')),
1203
+ xp.asarray(hierarchy_test_data.X))
1204
+ expectedZ = hierarchy_test_data.linkage_X_ward_olo
1205
+ xp_assert_close(Z, xp.asarray(expectedZ), atol=1e-06)
1206
+
1207
+
1208
+ @skip_xp_backends(np_only=True, reason='`Heap` only supports NumPy backend')
1209
+ def test_Heap(xp):
1210
+ values = xp.asarray([2, -1, 0, -1.5, 3])
1211
+ heap = Heap(values)
1212
+
1213
+ pair = heap.get_min()
1214
+ assert_equal(pair['key'], 3)
1215
+ assert_equal(pair['value'], -1.5)
1216
+
1217
+ heap.remove_min()
1218
+ pair = heap.get_min()
1219
+ assert_equal(pair['key'], 1)
1220
+ assert_equal(pair['value'], -1)
1221
+
1222
+ heap.change_value(1, 2.5)
1223
+ pair = heap.get_min()
1224
+ assert_equal(pair['key'], 2)
1225
+ assert_equal(pair['value'], 0)
1226
+
1227
+ heap.remove_min()
1228
+ heap.remove_min()
1229
+
1230
+ heap.change_value(1, 10)
1231
+ pair = heap.get_min()
1232
+ assert_equal(pair['key'], 4)
1233
+ assert_equal(pair['value'], 3)
1234
+
1235
+ heap.remove_min()
1236
+ pair = heap.get_min()
1237
+ assert_equal(pair['key'], 1)
1238
+ assert_equal(pair['value'], 10)