scipy 1.16.2__cp312-cp312-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.cp312-win_arm64.lib +0 -0
  4. scipy/_cyutility.cp312-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.cp312-win_arm64.lib +0 -0
  13. scipy/_lib/_ccallback_c.cp312-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.cp312-win_arm64.lib +0 -0
  18. scipy/_lib/_fpumode.cp312-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.cp312-win_arm64.lib +0 -0
  23. scipy/_lib/_test_ccallback.cp312-win_arm64.pyd +0 -0
  24. scipy/_lib/_test_deprecation_call.cp312-win_arm64.lib +0 -0
  25. scipy/_lib/_test_deprecation_call.cp312-win_arm64.pyd +0 -0
  26. scipy/_lib/_test_deprecation_def.cp312-win_arm64.lib +0 -0
  27. scipy/_lib/_test_deprecation_def.cp312-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.cp312-win_arm64.lib +0 -0
  35. scipy/_lib/_uarray/_uarray.cp312-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.cp312-win_arm64.lib +0 -0
  101. scipy/_lib/messagestream.cp312-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.cp312-win_arm64.lib +0 -0
  148. scipy/cluster/_hierarchy.cp312-win_arm64.pyd +0 -0
  149. scipy/cluster/_optimal_leaf_ordering.cp312-win_arm64.lib +0 -0
  150. scipy/cluster/_optimal_leaf_ordering.cp312-win_arm64.pyd +0 -0
  151. scipy/cluster/_vq.cp312-win_arm64.lib +0 -0
  152. scipy/cluster/_vq.cp312-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.cp312-win_arm64.lib +0 -0
  193. scipy/fft/_pocketfft/pypocketfft.cp312-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.cp312-win_arm64.lib +0 -0
  215. scipy/fftpack/convolve.cp312-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.cp312-win_arm64.lib +0 -0
  233. scipy/integrate/_dop.cp312-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.cp312-win_arm64.lib +0 -0
  248. scipy/integrate/_lsoda.cp312-win_arm64.pyd +0 -0
  249. scipy/integrate/_ode.py +1395 -0
  250. scipy/integrate/_odepack.cp312-win_arm64.lib +0 -0
  251. scipy/integrate/_odepack.cp312-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.cp312-win_arm64.lib +0 -0
  255. scipy/integrate/_quadpack.cp312-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.cp312-win_arm64.lib +0 -0
  265. scipy/integrate/_test_multivariate.cp312-win_arm64.pyd +0 -0
  266. scipy/integrate/_test_odeint_banded.cp312-win_arm64.lib +0 -0
  267. scipy/integrate/_test_odeint_banded.cp312-win_arm64.pyd +0 -0
  268. scipy/integrate/_vode.cp312-win_arm64.lib +0 -0
  269. scipy/integrate/_vode.cp312-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.cp312-win_arm64.lib +0 -0
  290. scipy/interpolate/_dfitpack.cp312-win_arm64.pyd +0 -0
  291. scipy/interpolate/_dierckx.cp312-win_arm64.lib +0 -0
  292. scipy/interpolate/_dierckx.cp312-win_arm64.pyd +0 -0
  293. scipy/interpolate/_fitpack.cp312-win_arm64.lib +0 -0
  294. scipy/interpolate/_fitpack.cp312-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.cp312-win_arm64.lib +0 -0
  300. scipy/interpolate/_interpnd.cp312-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.cp312-win_arm64.lib +0 -0
  307. scipy/interpolate/_ppoly.cp312-win_arm64.pyd +0 -0
  308. scipy/interpolate/_rbf.py +290 -0
  309. scipy/interpolate/_rbfinterp.py +550 -0
  310. scipy/interpolate/_rbfinterp_pythran.cp312-win_arm64.lib +0 -0
  311. scipy/interpolate/_rbfinterp_pythran.cp312-win_arm64.pyd +0 -0
  312. scipy/interpolate/_rgi.py +764 -0
  313. scipy/interpolate/_rgi_cython.cp312-win_arm64.lib +0 -0
  314. scipy/interpolate/_rgi_cython.cp312-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.cp312-win_arm64.lib +0 -0
  343. scipy/io/_fast_matrix_market/_fmm_core.cp312-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.cp312-win_arm64.lib +0 -0
  355. scipy/io/_test_fortran.cp312-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.cp312-win_arm64.lib +0 -0
  386. scipy/io/matlab/_mio5_utils.cp312-win_arm64.pyd +0 -0
  387. scipy/io/matlab/_mio_utils.cp312-win_arm64.lib +0 -0
  388. scipy/io/matlab/_mio_utils.cp312-win_arm64.pyd +0 -0
  389. scipy/io/matlab/_miobase.py +435 -0
  390. scipy/io/matlab/_streams.cp312-win_arm64.lib +0 -0
  391. scipy/io/matlab/_streams.cp312-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.cp312-win_arm64.lib +0 -0
  623. scipy/linalg/_cythonized_array_utils.cp312-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.cp312-win_arm64.lib +0 -0
  630. scipy/linalg/_decomp_interpolative.cp312-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.cp312-win_arm64.lib +0 -0
  634. scipy/linalg/_decomp_lu_cython.cp312-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.cp312-win_arm64.lib +0 -0
  642. scipy/linalg/_decomp_update.cp312-win_arm64.pyd +0 -0
  643. scipy/linalg/_expm_frechet.py +417 -0
  644. scipy/linalg/_fblas.cp312-win_arm64.lib +0 -0
  645. scipy/linalg/_fblas.cp312-win_arm64.pyd +0 -0
  646. scipy/linalg/_flapack.cp312-win_arm64.lib +0 -0
  647. scipy/linalg/_flapack.cp312-win_arm64.pyd +0 -0
  648. scipy/linalg/_lapack_subroutines.h +1521 -0
  649. scipy/linalg/_linalg_pythran.cp312-win_arm64.lib +0 -0
  650. scipy/linalg/_linalg_pythran.cp312-win_arm64.pyd +0 -0
  651. scipy/linalg/_matfuncs.py +1050 -0
  652. scipy/linalg/_matfuncs_expm.cp312-win_arm64.lib +0 -0
  653. scipy/linalg/_matfuncs_expm.cp312-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.cp312-win_arm64.lib +0 -0
  657. scipy/linalg/_matfuncs_schur_sqrtm.cp312-win_arm64.pyd +0 -0
  658. scipy/linalg/_matfuncs_sqrtm.py +107 -0
  659. scipy/linalg/_matfuncs_sqrtm_triu.cp312-win_arm64.lib +0 -0
  660. scipy/linalg/_matfuncs_sqrtm_triu.cp312-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.cp312-win_arm64.lib +0 -0
  665. scipy/linalg/_solve_toeplitz.cp312-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.cp312-win_arm64.lib +0 -0
  672. scipy/linalg/cython_blas.cp312-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.cp312-win_arm64.lib +0 -0
  676. scipy/linalg/cython_lapack.cp312-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.cp312-win_arm64.lib +0 -0
  728. scipy/ndimage/_ctest.cp312-win_arm64.pyd +0 -0
  729. scipy/ndimage/_cytest.cp312-win_arm64.lib +0 -0
  730. scipy/ndimage/_cytest.cp312-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.cp312-win_arm64.lib +0 -0
  738. scipy/ndimage/_nd_image.cp312-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.cp312-win_arm64.lib +0 -0
  742. scipy/ndimage/_ni_label.cp312-win_arm64.pyd +0 -0
  743. scipy/ndimage/_ni_support.py +139 -0
  744. scipy/ndimage/_rank_filter_1d.cp312-win_arm64.lib +0 -0
  745. scipy/ndimage/_rank_filter_1d.cp312-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.cp312-win_arm64.lib +0 -0
  768. scipy/odr/__odrpack.cp312-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.cp312-win_arm64.lib +0 -0
  780. scipy/optimize/_bglu_dense.cp312-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.cp312-win_arm64.lib +0 -0
  790. scipy/optimize/_direct.cp312-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.cp312-win_arm64.lib +0 -0
  795. scipy/optimize/_group_columns.cp312-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.cp312-win_arm64.lib +0 -0
  799. scipy/optimize/_highspy/_core.cp312-win_arm64.pyd +0 -0
  800. scipy/optimize/_highspy/_highs_options.cp312-win_arm64.lib +0 -0
  801. scipy/optimize/_highspy/_highs_options.cp312-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.cp312-win_arm64.lib +0 -0
  805. scipy/optimize/_lbfgsb.cp312-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.cp312-win_arm64.lib +0 -0
  816. scipy/optimize/_lsap.cp312-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.cp312-win_arm64.lib +0 -0
  822. scipy/optimize/_lsq/givens_elimination.cp312-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.cp312-win_arm64.lib +0 -0
  830. scipy/optimize/_minpack.cp312-win_arm64.pyd +0 -0
  831. scipy/optimize/_minpack_py.py +1178 -0
  832. scipy/optimize/_moduleTNC.cp312-win_arm64.lib +0 -0
  833. scipy/optimize/_moduleTNC.cp312-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.cp312-win_arm64.lib +0 -0
  839. scipy/optimize/_pava_pybind.cp312-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.cp312-win_arm64.lib +0 -0
  850. scipy/optimize/_slsqplib.cp312-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.cp312-win_arm64.lib +0 -0
  855. scipy/optimize/_trlib/_trlib.cp312-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.cp312-win_arm64.lib +0 -0
  877. scipy/optimize/_zeros.cp312-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.cp312-win_arm64.lib +0 -0
  882. scipy/optimize/cython_optimize/_zeros.cp312-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.cp312-win_arm64.lib +0 -0
  953. scipy/signal/_max_len_seq_inner.cp312-win_arm64.pyd +0 -0
  954. scipy/signal/_peak_finding.py +1310 -0
  955. scipy/signal/_peak_finding_utils.cp312-win_arm64.lib +0 -0
  956. scipy/signal/_peak_finding_utils.cp312-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.cp312-win_arm64.lib +0 -0
  963. scipy/signal/_sigtools.cp312-win_arm64.pyd +0 -0
  964. scipy/signal/_sosfilt.cp312-win_arm64.lib +0 -0
  965. scipy/signal/_sosfilt.cp312-win_arm64.pyd +0 -0
  966. scipy/signal/_spectral_py.py +2471 -0
  967. scipy/signal/_spline.cp312-win_arm64.lib +0 -0
  968. scipy/signal/_spline.cp312-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.cp312-win_arm64.lib +0 -0
  974. scipy/signal/_upfirdn_apply.cp312-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.cp312-win_arm64.lib +0 -0
  1021. scipy/sparse/_csparsetools.cp312-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.cp312-win_arm64.lib +0 -0
  1032. scipy/sparse/_sparsetools.cp312-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.cp312-win_arm64.lib +0 -0
  1043. scipy/sparse/csgraph/_flow.cp312-win_arm64.pyd +0 -0
  1044. scipy/sparse/csgraph/_laplacian.py +563 -0
  1045. scipy/sparse/csgraph/_matching.cp312-win_arm64.lib +0 -0
  1046. scipy/sparse/csgraph/_matching.cp312-win_arm64.pyd +0 -0
  1047. scipy/sparse/csgraph/_min_spanning_tree.cp312-win_arm64.lib +0 -0
  1048. scipy/sparse/csgraph/_min_spanning_tree.cp312-win_arm64.pyd +0 -0
  1049. scipy/sparse/csgraph/_reordering.cp312-win_arm64.lib +0 -0
  1050. scipy/sparse/csgraph/_reordering.cp312-win_arm64.pyd +0 -0
  1051. scipy/sparse/csgraph/_shortest_path.cp312-win_arm64.lib +0 -0
  1052. scipy/sparse/csgraph/_shortest_path.cp312-win_arm64.pyd +0 -0
  1053. scipy/sparse/csgraph/_tools.cp312-win_arm64.lib +0 -0
  1054. scipy/sparse/csgraph/_tools.cp312-win_arm64.pyd +0 -0
  1055. scipy/sparse/csgraph/_traversal.cp312-win_arm64.lib +0 -0
  1056. scipy/sparse/csgraph/_traversal.cp312-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.cp312-win_arm64.lib +0 -0
  1079. scipy/sparse/linalg/_dsolve/_superlu.cp312-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.cp312-win_arm64.lib +0 -0
  1089. scipy/sparse/linalg/_eigen/arpack/_arpack.cp312-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.cp312-win_arm64.lib +0 -0
  1122. scipy/sparse/linalg/_propack/_cpropack.cp312-win_arm64.pyd +0 -0
  1123. scipy/sparse/linalg/_propack/_dpropack.cp312-win_arm64.lib +0 -0
  1124. scipy/sparse/linalg/_propack/_dpropack.cp312-win_arm64.pyd +0 -0
  1125. scipy/sparse/linalg/_propack/_spropack.cp312-win_arm64.lib +0 -0
  1126. scipy/sparse/linalg/_propack/_spropack.cp312-win_arm64.pyd +0 -0
  1127. scipy/sparse/linalg/_propack/_zpropack.cp312-win_arm64.lib +0 -0
  1128. scipy/sparse/linalg/_propack/_zpropack.cp312-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.cp312-win_arm64.lib +0 -0
  1170. scipy/spatial/_ckdtree.cp312-win_arm64.pyd +0 -0
  1171. scipy/spatial/_distance_pybind.cp312-win_arm64.lib +0 -0
  1172. scipy/spatial/_distance_pybind.cp312-win_arm64.pyd +0 -0
  1173. scipy/spatial/_distance_wrap.cp312-win_arm64.lib +0 -0
  1174. scipy/spatial/_distance_wrap.cp312-win_arm64.pyd +0 -0
  1175. scipy/spatial/_geometric_slerp.py +238 -0
  1176. scipy/spatial/_hausdorff.cp312-win_arm64.lib +0 -0
  1177. scipy/spatial/_hausdorff.cp312-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.cp312-win_arm64.lib +0 -0
  1182. scipy/spatial/_qhull.cp312-win_arm64.pyd +0 -0
  1183. scipy/spatial/_qhull.pyi +213 -0
  1184. scipy/spatial/_spherical_voronoi.py +341 -0
  1185. scipy/spatial/_voronoi.cp312-win_arm64.lib +0 -0
  1186. scipy/spatial/_voronoi.cp312-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.cp312-win_arm64.lib +0 -0
  1236. scipy/spatial/transform/_rigid_transform.cp312-win_arm64.pyd +0 -0
  1237. scipy/spatial/transform/_rotation.cp312-win_arm64.lib +0 -0
  1238. scipy/spatial/transform/_rotation.cp312-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.cp312-win_arm64.lib +0 -0
  1252. scipy/special/_comb.cp312-win_arm64.pyd +0 -0
  1253. scipy/special/_ellip_harm.py +214 -0
  1254. scipy/special/_ellip_harm_2.cp312-win_arm64.lib +0 -0
  1255. scipy/special/_ellip_harm_2.cp312-win_arm64.pyd +0 -0
  1256. scipy/special/_gufuncs.cp312-win_arm64.lib +0 -0
  1257. scipy/special/_gufuncs.cp312-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.cp312-win_arm64.lib +0 -0
  1281. scipy/special/_specfun.cp312-win_arm64.pyd +0 -0
  1282. scipy/special/_special_ufuncs.cp312-win_arm64.lib +0 -0
  1283. scipy/special/_special_ufuncs.cp312-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.cp312-win_arm64.lib +0 -0
  1288. scipy/special/_test_internal.cp312-win_arm64.pyd +0 -0
  1289. scipy/special/_test_internal.pyi +9 -0
  1290. scipy/special/_testutils.py +321 -0
  1291. scipy/special/_ufuncs.cp312-win_arm64.lib +0 -0
  1292. scipy/special/_ufuncs.cp312-win_arm64.pyd +0 -0
  1293. scipy/special/_ufuncs.pyi +522 -0
  1294. scipy/special/_ufuncs.pyx +13173 -0
  1295. scipy/special/_ufuncs_cxx.cp312-win_arm64.lib +0 -0
  1296. scipy/special/_ufuncs_cxx.cp312-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.cp312-win_arm64.lib +0 -0
  1304. scipy/special/cython_special.cp312-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.cp312-win_arm64.lib +0 -0
  1376. scipy/stats/_ansari_swilk_statistics.cp312-win_arm64.pyd +0 -0
  1377. scipy/stats/_axis_nan_policy.py +692 -0
  1378. scipy/stats/_biasedurn.cp312-win_arm64.lib +0 -0
  1379. scipy/stats/_biasedurn.cp312-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.cp312-win_arm64.lib +0 -0
  1404. scipy/stats/_levy_stable/levyst.cp312-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.cp312-win_arm64.lib +0 -0
  1418. scipy/stats/_qmc_cy.cp312-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.cp312-win_arm64.lib +0 -0
  1422. scipy/stats/_qmvnt_cy.cp312-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.cp312-win_arm64.lib +0 -0
  1426. scipy/stats/_rcont/rcont.cp312-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.cp312-win_arm64.lib +0 -0
  1433. scipy/stats/_sobol.cp312-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.cp312-win_arm64.lib +0 -0
  1437. scipy/stats/_stats.cp312-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.cp312-win_arm64.lib +0 -0
  1442. scipy/stats/_stats_pythran.cp312-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.cp312-win_arm64.lib +0 -0
  1447. scipy/stats/_unuran/unuran_wrapper.cp312-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,2389 @@
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
+
35
+ from functools import wraps, partial
36
+ import os.path
37
+ import sys
38
+ import sysconfig
39
+ import warnings
40
+ import weakref
41
+
42
+ import numpy as np
43
+ from numpy.linalg import norm
44
+ from numpy.testing import (verbose, assert_,
45
+ assert_array_equal, assert_equal,
46
+ assert_almost_equal, assert_allclose,
47
+ break_cycles, IS_PYPY)
48
+ import pytest
49
+
50
+ import scipy.spatial.distance
51
+
52
+ from scipy.spatial.distance import (
53
+ squareform, pdist, cdist, num_obs_y, num_obs_dm, is_valid_dm, is_valid_y,
54
+ _validate_vector, _METRICS_NAMES)
55
+
56
+ # these were missing: chebyshev cityblock
57
+ # jensenshannon and seuclidean are referenced by string name.
58
+ from scipy.spatial.distance import (braycurtis, canberra, chebyshev, cityblock,
59
+ correlation, cosine, dice, euclidean,
60
+ hamming, jaccard, jensenshannon,
61
+ kulczynski1, mahalanobis,
62
+ minkowski, rogerstanimoto,
63
+ russellrao, seuclidean, sokalmichener, # noqa: F401
64
+ sokalsneath, sqeuclidean, yule)
65
+ from scipy._lib._util import np_long, np_ulong
66
+ from scipy.conftest import skip_xp_invalid_arg
67
+
68
+
69
+ @pytest.fixture(params=_METRICS_NAMES, scope="session")
70
+ def metric(request):
71
+ """
72
+ Fixture for all metrics in scipy.spatial.distance
73
+ """
74
+ return request.param
75
+
76
+
77
+ _filenames = [
78
+ "cdist-X1.txt",
79
+ "cdist-X2.txt",
80
+ "iris.txt",
81
+ "pdist-boolean-inp.txt",
82
+ "pdist-chebyshev-ml-iris.txt",
83
+ "pdist-chebyshev-ml.txt",
84
+ "pdist-cityblock-ml-iris.txt",
85
+ "pdist-cityblock-ml.txt",
86
+ "pdist-correlation-ml-iris.txt",
87
+ "pdist-correlation-ml.txt",
88
+ "pdist-cosine-ml-iris.txt",
89
+ "pdist-cosine-ml.txt",
90
+ "pdist-double-inp.txt",
91
+ "pdist-euclidean-ml-iris.txt",
92
+ "pdist-euclidean-ml.txt",
93
+ "pdist-hamming-ml.txt",
94
+ "pdist-jaccard-ml.txt",
95
+ "pdist-jensenshannon-ml-iris.txt",
96
+ "pdist-jensenshannon-ml.txt",
97
+ "pdist-minkowski-3.2-ml-iris.txt",
98
+ "pdist-minkowski-3.2-ml.txt",
99
+ "pdist-minkowski-5.8-ml-iris.txt",
100
+ "pdist-seuclidean-ml-iris.txt",
101
+ "pdist-seuclidean-ml.txt",
102
+ "pdist-spearman-ml.txt",
103
+ "random-bool-data.txt",
104
+ "random-double-data.txt",
105
+ "random-int-data.txt",
106
+ "random-uint-data.txt",
107
+ ]
108
+
109
+ _tdist = np.array([[0, 662, 877, 255, 412, 996],
110
+ [662, 0, 295, 468, 268, 400],
111
+ [877, 295, 0, 754, 564, 138],
112
+ [255, 468, 754, 0, 219, 869],
113
+ [412, 268, 564, 219, 0, 669],
114
+ [996, 400, 138, 869, 669, 0]], dtype='double')
115
+
116
+ _ytdist = squareform(_tdist)
117
+
118
+ # A hashmap of expected output arrays for the tests. These arrays
119
+ # come from a list of text files, which are read prior to testing.
120
+ # Each test loads inputs and outputs from this dictionary.
121
+ eo = {}
122
+
123
+
124
+ def load_testing_files():
125
+ for fn in _filenames:
126
+ name = fn.replace(".txt", "").replace("-ml", "")
127
+ fqfn = os.path.join(os.path.dirname(__file__), 'data', fn)
128
+ fp = open(fqfn)
129
+ eo[name] = np.loadtxt(fp)
130
+ fp.close()
131
+ eo['pdist-boolean-inp'] = np.bool_(eo['pdist-boolean-inp'])
132
+ eo['random-bool-data'] = np.bool_(eo['random-bool-data'])
133
+ eo['random-float32-data'] = np.float32(eo['random-double-data'])
134
+ eo['random-int-data'] = np_long(eo['random-int-data'])
135
+ eo['random-uint-data'] = np_ulong(eo['random-uint-data'])
136
+
137
+
138
+ load_testing_files()
139
+
140
+
141
+ def _is_32bit():
142
+ return np.intp(0).itemsize < 8
143
+
144
+
145
+ def _chk_asarrays(arrays, axis=None):
146
+ arrays = [np.asanyarray(a) for a in arrays]
147
+ if axis is None:
148
+ # np < 1.10 ravel removes subclass from arrays
149
+ arrays = [np.ravel(a) if a.ndim != 1 else a
150
+ for a in arrays]
151
+ axis = 0
152
+ arrays = tuple(np.atleast_1d(a) for a in arrays)
153
+ if axis < 0:
154
+ if not all(a.ndim == arrays[0].ndim for a in arrays):
155
+ raise ValueError("array ndim must be the same for neg axis")
156
+ axis = range(arrays[0].ndim)[axis]
157
+ return arrays + (axis,)
158
+
159
+
160
+ def _chk_weights(arrays, weights=None, axis=None,
161
+ force_weights=False, simplify_weights=True,
162
+ pos_only=False, neg_check=False,
163
+ nan_screen=False, mask_screen=False,
164
+ ddof=None):
165
+ chked = _chk_asarrays(arrays, axis=axis)
166
+ arrays, axis = chked[:-1], chked[-1]
167
+
168
+ simplify_weights = simplify_weights and not force_weights
169
+ if not force_weights and mask_screen:
170
+ force_weights = any(np.ma.getmask(a) is not np.ma.nomask for a in arrays)
171
+
172
+ if nan_screen:
173
+ has_nans = [np.isnan(np.sum(a)) for a in arrays]
174
+ if any(has_nans):
175
+ mask_screen = True
176
+ force_weights = True
177
+ arrays = tuple(np.ma.masked_invalid(a) if has_nan else a
178
+ for a, has_nan in zip(arrays, has_nans))
179
+
180
+ if weights is not None:
181
+ weights = np.asanyarray(weights)
182
+ elif force_weights:
183
+ weights = np.ones(arrays[0].shape[axis])
184
+ else:
185
+ return arrays + (weights, axis)
186
+
187
+ if ddof:
188
+ weights = _freq_weights(weights)
189
+
190
+ if mask_screen:
191
+ weights = _weight_masked(arrays, weights, axis)
192
+
193
+ if not all(weights.shape == (a.shape[axis],) for a in arrays):
194
+ raise ValueError("weights shape must match arrays along axis")
195
+ if neg_check and (weights < 0).any():
196
+ raise ValueError("weights cannot be negative")
197
+
198
+ if pos_only:
199
+ pos_weights = np.nonzero(weights > 0)[0]
200
+ if pos_weights.size < weights.size:
201
+ arrays = tuple(np.take(a, pos_weights, axis=axis) for a in arrays)
202
+ weights = weights[pos_weights]
203
+ if simplify_weights and (weights == 1).all():
204
+ weights = None
205
+ return arrays + (weights, axis)
206
+
207
+
208
+ def _freq_weights(weights):
209
+ if weights is None:
210
+ return weights
211
+ int_weights = weights.astype(int)
212
+ if (weights != int_weights).any():
213
+ raise ValueError(f"frequency (integer count-type) weights required {weights}")
214
+ return int_weights
215
+
216
+
217
+ def _weight_masked(arrays, weights, axis):
218
+ if axis is None:
219
+ axis = 0
220
+ weights = np.asanyarray(weights)
221
+ for a in arrays:
222
+ axis_mask = np.ma.getmask(a)
223
+ if axis_mask is np.ma.nomask:
224
+ continue
225
+ if a.ndim > 1:
226
+ not_axes = tuple(i for i in range(a.ndim) if i != axis)
227
+ axis_mask = axis_mask.any(axis=not_axes)
228
+ weights *= 1 - axis_mask.astype(int)
229
+ return weights
230
+
231
+
232
+ def _rand_split(arrays, weights, axis, split_per, seed=None):
233
+ # Coerce `arrays` to float64 if integer, to avoid nan-to-integer issues
234
+ arrays = [arr.astype(np.float64) if np.issubdtype(arr.dtype, np.integer)
235
+ else arr for arr in arrays]
236
+
237
+ # inverse operation for stats.collapse_weights
238
+ weights = np.array(weights, dtype=np.float64) # modified inplace; need a copy
239
+ seeded_rand = np.random.RandomState(seed)
240
+
241
+ def mytake(a, ix, axis):
242
+ record = np.asanyarray(np.take(a, ix, axis=axis))
243
+ return record.reshape([a.shape[i] if i != axis else 1
244
+ for i in range(a.ndim)])
245
+
246
+ n_obs = arrays[0].shape[axis]
247
+ assert all(a.shape[axis] == n_obs for a in arrays), \
248
+ "data must be aligned on sample axis"
249
+ for i in range(int(split_per) * n_obs):
250
+ split_ix = seeded_rand.randint(n_obs + i)
251
+ prev_w = weights[split_ix]
252
+ q = seeded_rand.rand()
253
+ weights[split_ix] = q * prev_w
254
+ weights = np.append(weights, (1. - q) * prev_w)
255
+ arrays = [np.append(a, mytake(a, split_ix, axis=axis),
256
+ axis=axis) for a in arrays]
257
+ return arrays, weights
258
+
259
+
260
+ assert_allclose_forgiving = partial(assert_allclose, atol=1e-5)
261
+
262
+
263
+ def _rough_check(a, b, compare_assert=assert_allclose_forgiving,
264
+ key=lambda x: x, w=None):
265
+ check_a = key(a)
266
+ check_b = key(b)
267
+ try:
268
+ if np.array(check_a != check_b).any(): # try strict equality for string types
269
+ compare_assert(check_a, check_b)
270
+ except AttributeError: # masked array
271
+ compare_assert(check_a, check_b)
272
+ except (TypeError, ValueError): # nested data structure
273
+ for a_i, b_i in zip(check_a, check_b):
274
+ _rough_check(a_i, b_i, compare_assert=compare_assert)
275
+
276
+ # diff from test_stats:
277
+ # n_args=2, weight_arg='w', default_axis=None
278
+ # ma_safe = False, nan_safe = False
279
+ def _weight_checked(fn, n_args=2, default_axis=None, key=lambda x: x, weight_arg='w',
280
+ squeeze=True, silent=False,
281
+ ones_test=True, const_test=True, dup_test=True,
282
+ split_test=True, dud_test=True, ma_safe=False, ma_very_safe=False,
283
+ nan_safe=False, split_per=1.0, seed=0,
284
+ compare_assert=assert_allclose_forgiving):
285
+ """runs fn on its arguments 2 or 3 ways, checks that the results are the same,
286
+ then returns the same thing it would have returned before"""
287
+ @wraps(fn)
288
+ def wrapped(*args, **kwargs):
289
+ result = fn(*args, **kwargs)
290
+
291
+ arrays = args[:n_args]
292
+ rest = args[n_args:]
293
+ weights = kwargs.get(weight_arg, None)
294
+ axis = kwargs.get('axis', default_axis)
295
+
296
+ chked = _chk_weights(arrays, weights=weights, axis=axis,
297
+ force_weights=True, mask_screen=True)
298
+ arrays, weights, axis = chked[:-2], chked[-2], chked[-1]
299
+ if squeeze:
300
+ arrays = [np.atleast_1d(a.squeeze()) for a in arrays]
301
+
302
+ try:
303
+ # WEIGHTS CHECK 1: EQUAL WEIGHTED OBSERVATIONS
304
+ args = tuple(arrays) + rest
305
+ if ones_test:
306
+ kwargs[weight_arg] = weights
307
+ _rough_check(result, fn(*args, **kwargs), key=key)
308
+ if const_test:
309
+ kwargs[weight_arg] = weights * 101.0
310
+ _rough_check(result, fn(*args, **kwargs), key=key)
311
+ kwargs[weight_arg] = weights * 0.101
312
+ try:
313
+ _rough_check(result, fn(*args, **kwargs), key=key)
314
+ except Exception as e:
315
+ raise type(e)((e, arrays, weights)) from e
316
+
317
+ # WEIGHTS CHECK 2: ADDL 0-WEIGHTED OBS
318
+ if dud_test:
319
+ # add randomly resampled rows, weighted at 0
320
+ dud_arrays, dud_weights = _rand_split(arrays, weights, axis,
321
+ split_per=split_per, seed=seed)
322
+ dud_weights[:weights.size] = weights # not exactly 1 because of masked arrays # noqa: E501
323
+ dud_weights[weights.size:] = 0
324
+ dud_args = tuple(dud_arrays) + rest
325
+ kwargs[weight_arg] = dud_weights
326
+ _rough_check(result, fn(*dud_args, **kwargs), key=key)
327
+ # increase the value of those 0-weighted rows
328
+ for a in dud_arrays:
329
+ indexer = [slice(None)] * a.ndim
330
+ indexer[axis] = slice(weights.size, None)
331
+ indexer = tuple(indexer)
332
+ a[indexer] = a[indexer] * 101
333
+ dud_args = tuple(dud_arrays) + rest
334
+ _rough_check(result, fn(*dud_args, **kwargs), key=key)
335
+ # set those 0-weighted rows to NaNs
336
+ for a in dud_arrays:
337
+ indexer = [slice(None)] * a.ndim
338
+ indexer[axis] = slice(weights.size, None)
339
+ indexer = tuple(indexer)
340
+ a[indexer] = a[indexer] * np.nan
341
+ if kwargs.get("nan_policy", None) == "omit" and nan_safe:
342
+ dud_args = tuple(dud_arrays) + rest
343
+ _rough_check(result, fn(*dud_args, **kwargs), key=key)
344
+ # mask out those nan values
345
+ if ma_safe:
346
+ dud_arrays = [np.ma.masked_invalid(a) for a in dud_arrays]
347
+ dud_args = tuple(dud_arrays) + rest
348
+ _rough_check(result, fn(*dud_args, **kwargs), key=key)
349
+ if ma_very_safe:
350
+ kwargs[weight_arg] = None
351
+ _rough_check(result, fn(*dud_args, **kwargs), key=key)
352
+ del dud_arrays, dud_args, dud_weights
353
+
354
+ # WEIGHTS CHECK 3: DUPLICATE DATA (DUMB SPLITTING)
355
+ if dup_test:
356
+ dup_arrays = [np.append(a, a, axis=axis) for a in arrays]
357
+ dup_weights = np.append(weights, weights) / 2.0
358
+ dup_args = tuple(dup_arrays) + rest
359
+ kwargs[weight_arg] = dup_weights
360
+ _rough_check(result, fn(*dup_args, **kwargs), key=key)
361
+ del dup_args, dup_arrays, dup_weights
362
+
363
+ # WEIGHT CHECK 3: RANDOM SPLITTING
364
+ if split_test and split_per > 0:
365
+ split = _rand_split(arrays, weights, axis,
366
+ split_per=split_per, seed=seed)
367
+ split_arrays, split_weights = split
368
+ split_args = tuple(split_arrays) + rest
369
+ kwargs[weight_arg] = split_weights
370
+ _rough_check(result, fn(*split_args, **kwargs), key=key)
371
+ except NotImplementedError as e:
372
+ # when some combination of arguments makes weighting impossible,
373
+ # this is the desired response
374
+ if not silent:
375
+ warnings.warn(f"{fn.__name__} NotImplemented weights: {e}",
376
+ stacklevel=3)
377
+ return result
378
+ return wrapped
379
+
380
+
381
+ class DummyContextManager:
382
+ def __enter__(self):
383
+ pass
384
+ def __exit__(self, *args):
385
+ pass
386
+
387
+
388
+ def maybe_deprecated(metric: str):
389
+ if metric in ('kulczynski1', 'sokalmichener'):
390
+ return pytest.deprecated_call()
391
+ else:
392
+ return DummyContextManager()
393
+
394
+
395
+ wcdist = _weight_checked(cdist, default_axis=1, squeeze=False)
396
+ wcdist_no_const = _weight_checked(cdist, default_axis=1,
397
+ squeeze=False, const_test=False)
398
+ wpdist = _weight_checked(pdist, default_axis=1, squeeze=False, n_args=1)
399
+ wpdist_no_const = _weight_checked(pdist, default_axis=1, squeeze=False,
400
+ const_test=False, n_args=1)
401
+ wrogerstanimoto = _weight_checked(rogerstanimoto)
402
+ wmatching = whamming = _weight_checked(hamming, dud_test=False)
403
+ wyule = _weight_checked(yule)
404
+ wdice = _weight_checked(dice)
405
+ wcityblock = _weight_checked(cityblock)
406
+ wchebyshev = _weight_checked(chebyshev)
407
+ wcosine = _weight_checked(cosine)
408
+ wcorrelation = _weight_checked(correlation)
409
+ wkulczynski1 = _weight_checked(kulczynski1)
410
+ wjaccard = _weight_checked(jaccard)
411
+ weuclidean = _weight_checked(euclidean, const_test=False)
412
+ wsqeuclidean = _weight_checked(sqeuclidean, const_test=False)
413
+ wbraycurtis = _weight_checked(braycurtis)
414
+ wcanberra = _weight_checked(canberra, const_test=False)
415
+ wsokalsneath = _weight_checked(sokalsneath)
416
+ wsokalmichener = _weight_checked(sokalmichener)
417
+ wrussellrao = _weight_checked(russellrao)
418
+
419
+
420
+ class TestCdist:
421
+
422
+ def setup_method(self):
423
+ self.rnd_eo_names = ['random-float32-data', 'random-int-data',
424
+ 'random-uint-data', 'random-double-data',
425
+ 'random-bool-data']
426
+ self.valid_upcasts = {'bool': [np_ulong, np_long, np.float32, np.float64],
427
+ 'uint': [np_long, np.float32, np.float64],
428
+ 'int': [np.float32, np.float64],
429
+ 'float32': [np.float64]}
430
+
431
+ @pytest.mark.thread_unsafe
432
+ def test_cdist_extra_args(self, metric):
433
+ # Tests that args and kwargs are correctly handled
434
+
435
+ X1 = [[1., 2., 3.], [1.2, 2.3, 3.4], [2.2, 2.3, 4.4]]
436
+ X2 = [[7., 5., 8.], [7.5, 5.8, 8.4], [5.5, 5.8, 4.4]]
437
+ kwargs = {"N0tV4l1D_p4raM": 3.14, "w": np.arange(3)}
438
+ args = [3.14] * 200
439
+
440
+ with pytest.raises(TypeError):
441
+ with maybe_deprecated(metric):
442
+ cdist(X1, X2, metric=metric, **kwargs)
443
+ with pytest.raises(TypeError):
444
+ with maybe_deprecated(metric):
445
+ cdist(X1, X2, metric=eval(metric), **kwargs)
446
+ with pytest.raises(TypeError):
447
+ with maybe_deprecated(metric):
448
+ cdist(X1, X2, metric="test_" + metric, **kwargs)
449
+ with pytest.raises(TypeError):
450
+ cdist(X1, X2, metric=metric, *args)
451
+ with pytest.raises(TypeError):
452
+ cdist(X1, X2, metric=eval(metric), *args)
453
+ with pytest.raises(TypeError):
454
+ cdist(X1, X2, metric="test_" + metric, *args)
455
+
456
+ def test_cdist_extra_args_custom(self):
457
+ # Tests that args and kwargs are correctly handled
458
+ # also for custom metric
459
+ def _my_metric(x, y, arg, kwarg=1, kwarg2=2):
460
+ return arg + kwarg + kwarg2
461
+
462
+ X1 = [[1., 2., 3.], [1.2, 2.3, 3.4], [2.2, 2.3, 4.4]]
463
+ X2 = [[7., 5., 8.], [7.5, 5.8, 8.4], [5.5, 5.8, 4.4]]
464
+ kwargs = {"N0tV4l1D_p4raM": 3.14, "w": np.arange(3)}
465
+ args = [3.14] * 200
466
+
467
+ with pytest.raises(TypeError):
468
+ cdist(X1, X2, _my_metric)
469
+ with pytest.raises(TypeError):
470
+ cdist(X1, X2, _my_metric, *args)
471
+ with pytest.raises(TypeError):
472
+ cdist(X1, X2, _my_metric, **kwargs)
473
+ with pytest.raises(TypeError):
474
+ cdist(X1, X2, _my_metric, kwarg=2.2, kwarg2=3.3)
475
+ with pytest.raises(TypeError):
476
+ cdist(X1, X2, _my_metric, 1, 2, kwarg=2.2)
477
+ with pytest.raises(TypeError):
478
+ cdist(X1, X2, _my_metric, 1, 2, kwarg=2.2)
479
+ with pytest.raises(TypeError):
480
+ cdist(X1, X2, _my_metric, 1.1, 2.2, 3.3)
481
+ with pytest.raises(TypeError):
482
+ cdist(X1, X2, _my_metric, 1.1, 2.2)
483
+ with pytest.raises(TypeError):
484
+ cdist(X1, X2, _my_metric, 1.1)
485
+ with pytest.raises(TypeError):
486
+ cdist(X1, X2, _my_metric, 1.1, kwarg=2.2, kwarg2=3.3)
487
+
488
+ # this should work
489
+ assert_allclose(cdist(X1, X2, metric=_my_metric,
490
+ arg=1.1, kwarg2=3.3), 5.4)
491
+
492
+ def test_cdist_euclidean_random_unicode(self):
493
+ eps = 1e-15
494
+ X1 = eo['cdist-X1']
495
+ X2 = eo['cdist-X2']
496
+ Y1 = wcdist_no_const(X1, X2, 'euclidean')
497
+ Y2 = wcdist_no_const(X1, X2, 'test_euclidean')
498
+ assert_allclose(Y1, Y2, rtol=eps, verbose=verbose > 2)
499
+
500
+ @pytest.mark.parametrize("p", [0.1, 0.25, 1.0, 1.23,
501
+ 2.0, 3.8, 4.6, np.inf])
502
+ def test_cdist_minkowski_random(self, p):
503
+ eps = 1e-13
504
+ X1 = eo['cdist-X1']
505
+ X2 = eo['cdist-X2']
506
+ Y1 = wcdist_no_const(X1, X2, 'minkowski', p=p)
507
+ Y2 = wcdist_no_const(X1, X2, 'test_minkowski', p=p)
508
+ assert_allclose(Y1, Y2, atol=0, rtol=eps, verbose=verbose > 2)
509
+
510
+ def test_cdist_cosine_random(self):
511
+ eps = 1e-14
512
+ X1 = eo['cdist-X1']
513
+ X2 = eo['cdist-X2']
514
+ Y1 = wcdist(X1, X2, 'cosine')
515
+
516
+ # Naive implementation
517
+ def norms(X):
518
+ return np.linalg.norm(X, axis=1).reshape(-1, 1)
519
+
520
+ Y2 = 1 - np.dot((X1 / norms(X1)), (X2 / norms(X2)).T)
521
+
522
+ assert_allclose(Y1, Y2, rtol=eps, verbose=verbose > 2)
523
+
524
+ def test_cdist_mahalanobis(self):
525
+ # 1-dimensional observations
526
+ x1 = np.array([[2], [3]])
527
+ x2 = np.array([[2], [5]])
528
+ dist = cdist(x1, x2, metric='mahalanobis')
529
+ assert_allclose(dist, [[0.0, np.sqrt(4.5)], [np.sqrt(0.5), np.sqrt(2)]])
530
+
531
+ # 2-dimensional observations
532
+ x1 = np.array([[0, 0], [-1, 0]])
533
+ x2 = np.array([[0, 2], [1, 0], [0, -2]])
534
+ dist = cdist(x1, x2, metric='mahalanobis')
535
+ rt2 = np.sqrt(2)
536
+ assert_allclose(dist, [[rt2, rt2, rt2], [2, 2 * rt2, 2]])
537
+
538
+ # Too few observations
539
+ with pytest.raises(ValueError):
540
+ cdist([[0, 1]], [[2, 3]], metric='mahalanobis')
541
+
542
+ def test_cdist_custom_notdouble(self):
543
+ class myclass:
544
+ pass
545
+
546
+ def _my_metric(x, y):
547
+ if not isinstance(x[0], myclass) or not isinstance(y[0], myclass):
548
+ raise ValueError("Type has been changed")
549
+ return 1.123
550
+ data = np.array([[myclass()]], dtype=object)
551
+ cdist_y = cdist(data, data, metric=_my_metric)
552
+ right_y = 1.123
553
+ assert_equal(cdist_y, right_y, verbose=verbose > 2)
554
+
555
+ def _check_calling_conventions(self, X1, X2, metric, eps=1e-07, **kwargs):
556
+ # helper function for test_cdist_calling_conventions
557
+ try:
558
+ y1 = cdist(X1, X2, metric=metric, **kwargs)
559
+ y2 = cdist(X1, X2, metric=eval(metric), **kwargs)
560
+ y3 = cdist(X1, X2, metric="test_" + metric, **kwargs)
561
+ except Exception as e:
562
+ e_cls = e.__class__
563
+ if verbose > 2:
564
+ print(e_cls.__name__)
565
+ print(e)
566
+ with pytest.raises(e_cls):
567
+ cdist(X1, X2, metric=metric, **kwargs)
568
+ with pytest.raises(e_cls):
569
+ cdist(X1, X2, metric=eval(metric), **kwargs)
570
+ with pytest.raises(e_cls):
571
+ cdist(X1, X2, metric="test_" + metric, **kwargs)
572
+ else:
573
+ assert_allclose(y1, y2, rtol=eps, verbose=verbose > 2)
574
+ assert_allclose(y1, y3, rtol=eps, verbose=verbose > 2)
575
+
576
+ def test_cdist_calling_conventions(self, metric):
577
+ # Ensures that specifying the metric with a str or scipy function
578
+ # gives the same behaviour (i.e. same result or same exception).
579
+ # NOTE: The correctness should be checked within each metric tests.
580
+ for eo_name in self.rnd_eo_names:
581
+ # subsampling input data to speed-up tests
582
+ # NOTE: num samples needs to be > than dimensions for mahalanobis
583
+ X1 = eo[eo_name][::5, ::-2]
584
+ X2 = eo[eo_name][1::5, ::2]
585
+ if verbose > 2:
586
+ print("testing: ", metric, " with: ", eo_name)
587
+ if metric in {'dice', 'yule',
588
+ 'rogerstanimoto',
589
+ 'russellrao', 'sokalmichener',
590
+ 'sokalsneath',
591
+ 'kulczynski1'} and 'bool' not in eo_name:
592
+ # python version permits non-bools e.g. for fuzzy logic
593
+ continue
594
+ self._check_calling_conventions(X1, X2, metric)
595
+
596
+ # Testing built-in metrics with extra args
597
+ if metric == "seuclidean":
598
+ X12 = np.vstack([X1, X2]).astype(np.float64)
599
+ V = np.var(X12, axis=0, ddof=1)
600
+ self._check_calling_conventions(X1, X2, metric, V=V)
601
+ elif metric == "mahalanobis":
602
+ X12 = np.vstack([X1, X2]).astype(np.float64)
603
+ V = np.atleast_2d(np.cov(X12.T))
604
+ VI = np.array(np.linalg.inv(V).T)
605
+ self._check_calling_conventions(X1, X2, metric, VI=VI)
606
+
607
+ def test_cdist_dtype_equivalence(self, metric):
608
+ # Tests that the result is not affected by type up-casting
609
+ eps = 1e-07
610
+ tests = [(eo['random-bool-data'], self.valid_upcasts['bool']),
611
+ (eo['random-uint-data'], self.valid_upcasts['uint']),
612
+ (eo['random-int-data'], self.valid_upcasts['int']),
613
+ (eo['random-float32-data'], self.valid_upcasts['float32'])]
614
+ for test in tests:
615
+ X1 = test[0][::5, ::-2]
616
+ X2 = test[0][1::5, ::2]
617
+ try:
618
+ y1 = cdist(X1, X2, metric=metric)
619
+ except Exception as e:
620
+ e_cls = e.__class__
621
+ if verbose > 2:
622
+ print(e_cls.__name__)
623
+ print(e)
624
+ for new_type in test[1]:
625
+ X1new = new_type(X1)
626
+ X2new = new_type(X2)
627
+ with pytest.raises(e_cls):
628
+ cdist(X1new, X2new, metric=metric)
629
+ else:
630
+ for new_type in test[1]:
631
+ y2 = cdist(new_type(X1), new_type(X2), metric=metric)
632
+ assert_allclose(y1, y2, rtol=eps, verbose=verbose > 2)
633
+
634
+ @pytest.mark.thread_unsafe
635
+ @pytest.mark.skipif(sysconfig.get_platform() == 'win-arm64', reason="numpy#29442")
636
+ def test_cdist_out(self, metric):
637
+ # Test that out parameter works properly
638
+ eps = 1e-15
639
+ X1 = eo['cdist-X1']
640
+ X2 = eo['cdist-X2']
641
+ out_r, out_c = X1.shape[0], X2.shape[0]
642
+
643
+ kwargs = dict()
644
+ if metric == 'minkowski':
645
+ kwargs['p'] = 1.23
646
+ out1 = np.empty((out_r, out_c), dtype=np.float64)
647
+ with maybe_deprecated(metric):
648
+ Y1 = cdist(X1, X2, metric, **kwargs)
649
+ with maybe_deprecated(metric):
650
+ Y2 = cdist(X1, X2, metric, out=out1, **kwargs)
651
+
652
+ # test that output is numerically equivalent
653
+ assert_allclose(Y1, Y2, rtol=eps, verbose=verbose > 2)
654
+
655
+ # test that Y_test1 and out1 are the same object
656
+ assert_(Y2 is out1)
657
+
658
+ # test for incorrect shape
659
+ out2 = np.empty((out_r-1, out_c+1), dtype=np.float64)
660
+ with pytest.raises(ValueError):
661
+ with maybe_deprecated(metric):
662
+ cdist(X1, X2, metric, out=out2, **kwargs)
663
+
664
+ # test for C-contiguous order
665
+ out3 = np.empty(
666
+ (2 * out_r, 2 * out_c), dtype=np.float64)[::2, ::2]
667
+ out4 = np.empty((out_r, out_c), dtype=np.float64, order='F')
668
+ with pytest.raises(ValueError):
669
+ with maybe_deprecated(metric):
670
+ cdist(X1, X2, metric, out=out3, **kwargs)
671
+ with pytest.raises(ValueError):
672
+ with maybe_deprecated(metric):
673
+ cdist(X1, X2, metric, out=out4, **kwargs)
674
+
675
+ # test for incorrect dtype
676
+ out5 = np.empty((out_r, out_c), dtype=np.int64)
677
+ with pytest.raises(ValueError):
678
+ with maybe_deprecated(metric):
679
+ cdist(X1, X2, metric, out=out5, **kwargs)
680
+
681
+ @pytest.mark.thread_unsafe
682
+ def test_striding(self, metric):
683
+ # test that striding is handled correct with calls to
684
+ # _copy_array_if_base_present
685
+ eps = 1e-15
686
+ X1 = eo['cdist-X1'][::2, ::2]
687
+ X2 = eo['cdist-X2'][::2, ::2]
688
+ X1_copy = X1.copy()
689
+ X2_copy = X2.copy()
690
+
691
+ # confirm equivalence
692
+ assert_equal(X1, X1_copy)
693
+ assert_equal(X2, X2_copy)
694
+ # confirm contiguity
695
+ assert_(not X1.flags.c_contiguous)
696
+ assert_(not X2.flags.c_contiguous)
697
+ assert_(X1_copy.flags.c_contiguous)
698
+ assert_(X2_copy.flags.c_contiguous)
699
+
700
+ kwargs = dict()
701
+ if metric == 'minkowski':
702
+ kwargs['p'] = 1.23
703
+ with maybe_deprecated(metric):
704
+ Y1 = cdist(X1, X2, metric, **kwargs)
705
+ with maybe_deprecated(metric):
706
+ Y2 = cdist(X1_copy, X2_copy, metric, **kwargs)
707
+ # test that output is numerically equivalent
708
+ assert_allclose(Y1, Y2, rtol=eps, verbose=verbose > 2)
709
+
710
+ @pytest.mark.thread_unsafe
711
+ def test_cdist_refcount(self, metric):
712
+ x1 = np.random.rand(10, 10)
713
+ x2 = np.random.rand(10, 10)
714
+
715
+ kwargs = dict()
716
+ if metric == 'minkowski':
717
+ kwargs['p'] = 1.23
718
+
719
+ with maybe_deprecated(metric):
720
+ out = cdist(x1, x2, metric=metric, **kwargs)
721
+
722
+ # Check reference counts aren't messed up. If we only hold weak
723
+ # references, the arrays should be deallocated.
724
+ weak_refs = [weakref.ref(v) for v in (x1, x2, out)]
725
+ del x1, x2, out
726
+
727
+ if IS_PYPY:
728
+ break_cycles()
729
+ assert all(weak_ref() is None for weak_ref in weak_refs)
730
+
731
+
732
+ class TestPdist:
733
+
734
+ def setup_method(self):
735
+ self.rnd_eo_names = ['random-float32-data', 'random-int-data',
736
+ 'random-uint-data', 'random-double-data',
737
+ 'random-bool-data']
738
+ self.valid_upcasts = {'bool': [np_ulong, np_long, np.float32, np.float64],
739
+ 'uint': [np_long, np.float32, np.float64],
740
+ 'int': [np.float32, np.float64],
741
+ 'float32': [np.float64]}
742
+
743
+ @pytest.mark.thread_unsafe
744
+ def test_pdist_extra_args(self, metric):
745
+ # Tests that args and kwargs are correctly handled
746
+ X1 = [[1., 2.], [1.2, 2.3], [2.2, 2.3]]
747
+ kwargs = {"N0tV4l1D_p4raM": 3.14, "w": np.arange(2)}
748
+ args = [3.14] * 200
749
+
750
+ with pytest.raises(TypeError):
751
+ with maybe_deprecated(metric):
752
+ pdist(X1, metric=metric, **kwargs)
753
+ with pytest.raises(TypeError):
754
+ with maybe_deprecated(metric):
755
+ pdist(X1, metric=eval(metric), **kwargs)
756
+ with pytest.raises(TypeError):
757
+ with maybe_deprecated(metric):
758
+ pdist(X1, metric="test_" + metric, **kwargs)
759
+ with pytest.raises(TypeError):
760
+ pdist(X1, metric=metric, *args)
761
+ with pytest.raises(TypeError):
762
+ pdist(X1, metric=eval(metric), *args)
763
+ with pytest.raises(TypeError):
764
+ pdist(X1, metric="test_" + metric, *args)
765
+
766
+ def test_pdist_extra_args_custom(self):
767
+ # Tests that args and kwargs are correctly handled
768
+ # also for custom metric
769
+ def _my_metric(x, y, arg, kwarg=1, kwarg2=2):
770
+ return arg + kwarg + kwarg2
771
+
772
+ X1 = [[1., 2.], [1.2, 2.3], [2.2, 2.3]]
773
+ kwargs = {"N0tV4l1D_p4raM": 3.14, "w": np.arange(2)}
774
+ args = [3.14] * 200
775
+
776
+ with pytest.raises(TypeError):
777
+ pdist(X1, _my_metric)
778
+ with pytest.raises(TypeError):
779
+ pdist(X1, _my_metric, *args)
780
+ with pytest.raises(TypeError):
781
+ pdist(X1, _my_metric, **kwargs)
782
+ with pytest.raises(TypeError):
783
+ pdist(X1, _my_metric, kwarg=2.2, kwarg2=3.3)
784
+ with pytest.raises(TypeError):
785
+ pdist(X1, _my_metric, 1, 2, kwarg=2.2)
786
+ with pytest.raises(TypeError):
787
+ pdist(X1, _my_metric, 1, 2, kwarg=2.2)
788
+ with pytest.raises(TypeError):
789
+ pdist(X1, _my_metric, 1.1, 2.2, 3.3)
790
+ with pytest.raises(TypeError):
791
+ pdist(X1, _my_metric, 1.1, 2.2)
792
+ with pytest.raises(TypeError):
793
+ pdist(X1, _my_metric, 1.1)
794
+ with pytest.raises(TypeError):
795
+ pdist(X1, _my_metric, 1.1, kwarg=2.2, kwarg2=3.3)
796
+
797
+ # these should work
798
+ assert_allclose(pdist(X1, metric=_my_metric,
799
+ arg=1.1, kwarg2=3.3), 5.4)
800
+
801
+ def test_pdist_euclidean_random(self):
802
+ eps = 1e-07
803
+ X = eo['pdist-double-inp']
804
+ Y_right = eo['pdist-euclidean']
805
+ Y_test1 = wpdist_no_const(X, 'euclidean')
806
+ assert_allclose(Y_test1, Y_right, rtol=eps)
807
+
808
+ def test_pdist_euclidean_random_u(self):
809
+ eps = 1e-07
810
+ X = eo['pdist-double-inp']
811
+ Y_right = eo['pdist-euclidean']
812
+ Y_test1 = wpdist_no_const(X, 'euclidean')
813
+ assert_allclose(Y_test1, Y_right, rtol=eps)
814
+
815
+ def test_pdist_euclidean_random_float32(self):
816
+ eps = 1e-07
817
+ X = np.float32(eo['pdist-double-inp'])
818
+ Y_right = eo['pdist-euclidean']
819
+ Y_test1 = wpdist_no_const(X, 'euclidean')
820
+ assert_allclose(Y_test1, Y_right, rtol=eps)
821
+
822
+ def test_pdist_euclidean_random_nonC(self):
823
+ eps = 1e-07
824
+ X = eo['pdist-double-inp']
825
+ Y_right = eo['pdist-euclidean']
826
+ Y_test2 = wpdist_no_const(X, 'test_euclidean')
827
+ assert_allclose(Y_test2, Y_right, rtol=eps)
828
+
829
+ @pytest.mark.slow
830
+ def test_pdist_euclidean_iris_double(self):
831
+ eps = 1e-7
832
+ X = eo['iris']
833
+ Y_right = eo['pdist-euclidean-iris']
834
+ Y_test1 = wpdist_no_const(X, 'euclidean')
835
+ assert_allclose(Y_test1, Y_right, rtol=eps)
836
+
837
+ @pytest.mark.slow
838
+ def test_pdist_euclidean_iris_float32(self):
839
+ eps = 1e-5
840
+ X = np.float32(eo['iris'])
841
+ Y_right = eo['pdist-euclidean-iris']
842
+ Y_test1 = wpdist_no_const(X, 'euclidean')
843
+ assert_allclose(Y_test1, Y_right, rtol=eps, verbose=verbose > 2)
844
+
845
+ @pytest.mark.slow
846
+ def test_pdist_euclidean_iris_nonC(self):
847
+ # Test pdist(X, 'test_euclidean') [the non-C implementation] on the
848
+ # Iris data set.
849
+ eps = 1e-7
850
+ X = eo['iris']
851
+ Y_right = eo['pdist-euclidean-iris']
852
+ Y_test2 = wpdist_no_const(X, 'test_euclidean')
853
+ assert_allclose(Y_test2, Y_right, rtol=eps)
854
+
855
+ def test_pdist_seuclidean_random(self):
856
+ eps = 1e-7
857
+ X = eo['pdist-double-inp']
858
+ Y_right = eo['pdist-seuclidean']
859
+ Y_test1 = pdist(X, 'seuclidean')
860
+ assert_allclose(Y_test1, Y_right, rtol=eps)
861
+
862
+ def test_pdist_seuclidean_random_float32(self):
863
+ eps = 1e-7
864
+ X = np.float32(eo['pdist-double-inp'])
865
+ Y_right = eo['pdist-seuclidean']
866
+ Y_test1 = pdist(X, 'seuclidean')
867
+ assert_allclose(Y_test1, Y_right, rtol=eps)
868
+
869
+ # Check no error is raise when V has float32 dtype (#11171).
870
+ V = np.var(X, axis=0, ddof=1)
871
+ Y_test2 = pdist(X, 'seuclidean', V=V)
872
+ assert_allclose(Y_test2, Y_right, rtol=eps)
873
+
874
+ def test_pdist_seuclidean_random_nonC(self):
875
+ # Test pdist(X, 'test_sqeuclidean') [the non-C implementation]
876
+ eps = 1e-07
877
+ X = eo['pdist-double-inp']
878
+ Y_right = eo['pdist-seuclidean']
879
+ Y_test2 = pdist(X, 'test_seuclidean')
880
+ assert_allclose(Y_test2, Y_right, rtol=eps)
881
+
882
+ def test_pdist_seuclidean_iris(self):
883
+ eps = 1e-7
884
+ X = eo['iris']
885
+ Y_right = eo['pdist-seuclidean-iris']
886
+ Y_test1 = pdist(X, 'seuclidean')
887
+ assert_allclose(Y_test1, Y_right, rtol=eps)
888
+
889
+ def test_pdist_seuclidean_iris_float32(self):
890
+ # Tests pdist(X, 'seuclidean') on the Iris data set (float32).
891
+ eps = 1e-5
892
+ X = np.float32(eo['iris'])
893
+ Y_right = eo['pdist-seuclidean-iris']
894
+ Y_test1 = pdist(X, 'seuclidean')
895
+ assert_allclose(Y_test1, Y_right, rtol=eps)
896
+
897
+ def test_pdist_seuclidean_iris_nonC(self):
898
+ # Test pdist(X, 'test_seuclidean') [the non-C implementation] on the
899
+ # Iris data set.
900
+ eps = 1e-7
901
+ X = eo['iris']
902
+ Y_right = eo['pdist-seuclidean-iris']
903
+ Y_test2 = pdist(X, 'test_seuclidean')
904
+ assert_allclose(Y_test2, Y_right, rtol=eps)
905
+
906
+ def test_pdist_cosine_random(self):
907
+ eps = 1e-7
908
+ X = eo['pdist-double-inp']
909
+ Y_right = eo['pdist-cosine']
910
+ Y_test1 = wpdist(X, 'cosine')
911
+ assert_allclose(Y_test1, Y_right, rtol=eps)
912
+
913
+ def test_pdist_cosine_random_float32(self):
914
+ eps = 1e-7
915
+ X = np.float32(eo['pdist-double-inp'])
916
+ Y_right = eo['pdist-cosine']
917
+ Y_test1 = wpdist(X, 'cosine')
918
+ assert_allclose(Y_test1, Y_right, rtol=eps)
919
+
920
+ def test_pdist_cosine_random_nonC(self):
921
+ # Test pdist(X, 'test_cosine') [the non-C implementation]
922
+ eps = 1e-7
923
+ X = eo['pdist-double-inp']
924
+ Y_right = eo['pdist-cosine']
925
+ Y_test2 = wpdist(X, 'test_cosine')
926
+ assert_allclose(Y_test2, Y_right, rtol=eps)
927
+
928
+ @pytest.mark.slow
929
+ def test_pdist_cosine_iris(self):
930
+ eps = 1e-05
931
+ X = eo['iris']
932
+ Y_right = eo['pdist-cosine-iris']
933
+ Y_test1 = wpdist(X, 'cosine')
934
+ assert_allclose(Y_test1, Y_right, atol=eps)
935
+
936
+ @pytest.mark.slow
937
+ def test_pdist_cosine_iris_float32(self):
938
+ eps = 1e-05
939
+ X = np.float32(eo['iris'])
940
+ Y_right = eo['pdist-cosine-iris']
941
+ Y_test1 = wpdist(X, 'cosine')
942
+ assert_allclose(Y_test1, Y_right, atol=eps, verbose=verbose > 2)
943
+
944
+ @pytest.mark.slow
945
+ def test_pdist_cosine_iris_nonC(self):
946
+ eps = 1e-05
947
+ X = eo['iris']
948
+ Y_right = eo['pdist-cosine-iris']
949
+ Y_test2 = wpdist(X, 'test_cosine')
950
+ assert_allclose(Y_test2, Y_right, atol=eps)
951
+
952
+ def test_pdist_cosine_bounds(self):
953
+ # Test adapted from @joernhees's example at gh-5208: case where
954
+ # cosine distance used to be negative. XXX: very sensitive to the
955
+ # specific norm computation.
956
+ x = np.abs(np.random.RandomState(1337).rand(91))
957
+ X = np.vstack([x, x])
958
+ assert_(wpdist(X, 'cosine')[0] >= 0,
959
+ msg='cosine distance should be non-negative')
960
+
961
+ def test_pdist_cityblock_random(self):
962
+ eps = 1e-7
963
+ X = eo['pdist-double-inp']
964
+ Y_right = eo['pdist-cityblock']
965
+ Y_test1 = wpdist_no_const(X, 'cityblock')
966
+ assert_allclose(Y_test1, Y_right, rtol=eps)
967
+
968
+ def test_pdist_cityblock_random_float32(self):
969
+ eps = 1e-7
970
+ X = np.float32(eo['pdist-double-inp'])
971
+ Y_right = eo['pdist-cityblock']
972
+ Y_test1 = wpdist_no_const(X, 'cityblock')
973
+ assert_allclose(Y_test1, Y_right, rtol=eps)
974
+
975
+ def test_pdist_cityblock_random_nonC(self):
976
+ eps = 1e-7
977
+ X = eo['pdist-double-inp']
978
+ Y_right = eo['pdist-cityblock']
979
+ Y_test2 = wpdist_no_const(X, 'test_cityblock')
980
+ assert_allclose(Y_test2, Y_right, rtol=eps)
981
+
982
+ @pytest.mark.slow
983
+ def test_pdist_cityblock_iris(self):
984
+ eps = 1e-14
985
+ X = eo['iris']
986
+ Y_right = eo['pdist-cityblock-iris']
987
+ Y_test1 = wpdist_no_const(X, 'cityblock')
988
+ assert_allclose(Y_test1, Y_right, rtol=eps)
989
+
990
+ @pytest.mark.slow
991
+ def test_pdist_cityblock_iris_float32(self):
992
+ eps = 1e-5
993
+ X = np.float32(eo['iris'])
994
+ Y_right = eo['pdist-cityblock-iris']
995
+ Y_test1 = wpdist_no_const(X, 'cityblock')
996
+ assert_allclose(Y_test1, Y_right, rtol=eps, verbose=verbose > 2)
997
+
998
+ @pytest.mark.slow
999
+ def test_pdist_cityblock_iris_nonC(self):
1000
+ # Test pdist(X, 'test_cityblock') [the non-C implementation] on the
1001
+ # Iris data set.
1002
+ eps = 1e-14
1003
+ X = eo['iris']
1004
+ Y_right = eo['pdist-cityblock-iris']
1005
+ Y_test2 = wpdist_no_const(X, 'test_cityblock')
1006
+ assert_allclose(Y_test2, Y_right, rtol=eps)
1007
+
1008
+ def test_pdist_correlation_random(self):
1009
+ eps = 1e-7
1010
+ X = eo['pdist-double-inp']
1011
+ Y_right = eo['pdist-correlation']
1012
+ Y_test1 = wpdist(X, 'correlation')
1013
+ assert_allclose(Y_test1, Y_right, rtol=eps)
1014
+
1015
+ def test_pdist_correlation_random_float32(self):
1016
+ eps = 1e-7
1017
+ X = np.float32(eo['pdist-double-inp'])
1018
+ Y_right = eo['pdist-correlation']
1019
+ Y_test1 = wpdist(X, 'correlation')
1020
+ assert_allclose(Y_test1, Y_right, rtol=eps)
1021
+
1022
+ def test_pdist_correlation_random_nonC(self):
1023
+ eps = 1e-7
1024
+ X = eo['pdist-double-inp']
1025
+ Y_right = eo['pdist-correlation']
1026
+ Y_test2 = wpdist(X, 'test_correlation')
1027
+ assert_allclose(Y_test2, Y_right, rtol=eps)
1028
+
1029
+ @pytest.mark.slow
1030
+ def test_pdist_correlation_iris(self):
1031
+ eps = 1e-7
1032
+ X = eo['iris']
1033
+ Y_right = eo['pdist-correlation-iris']
1034
+ Y_test1 = wpdist(X, 'correlation')
1035
+ assert_allclose(Y_test1, Y_right, rtol=eps)
1036
+
1037
+ @pytest.mark.slow
1038
+ def test_pdist_correlation_iris_float32(self):
1039
+ eps = 1e-7
1040
+ X = eo['iris']
1041
+ Y_right = np.float32(eo['pdist-correlation-iris'])
1042
+ Y_test1 = wpdist(X, 'correlation')
1043
+ assert_allclose(Y_test1, Y_right, rtol=eps, verbose=verbose > 2)
1044
+
1045
+ @pytest.mark.slow
1046
+ def test_pdist_correlation_iris_nonC(self):
1047
+ if sys.maxsize > 2**32:
1048
+ eps = 1e-7
1049
+ else:
1050
+ pytest.skip("see gh-16456")
1051
+ X = eo['iris']
1052
+ Y_right = eo['pdist-correlation-iris']
1053
+ Y_test2 = wpdist(X, 'test_correlation')
1054
+ assert_allclose(Y_test2, Y_right, rtol=eps)
1055
+
1056
+ @pytest.mark.parametrize("p", [0.1, 0.25, 1.0, 2.0, 3.2, np.inf])
1057
+ def test_pdist_minkowski_random_p(self, p):
1058
+ eps = 1e-13
1059
+ X = eo['pdist-double-inp']
1060
+ Y1 = wpdist_no_const(X, 'minkowski', p=p)
1061
+ Y2 = wpdist_no_const(X, 'test_minkowski', p=p)
1062
+ assert_allclose(Y1, Y2, atol=0, rtol=eps)
1063
+
1064
+ def test_pdist_minkowski_random(self):
1065
+ eps = 1e-7
1066
+ X = eo['pdist-double-inp']
1067
+ Y_right = eo['pdist-minkowski-3.2']
1068
+ Y_test1 = wpdist_no_const(X, 'minkowski', p=3.2)
1069
+ assert_allclose(Y_test1, Y_right, rtol=eps)
1070
+
1071
+ def test_pdist_minkowski_random_float32(self):
1072
+ eps = 1e-7
1073
+ X = np.float32(eo['pdist-double-inp'])
1074
+ Y_right = eo['pdist-minkowski-3.2']
1075
+ Y_test1 = wpdist_no_const(X, 'minkowski', p=3.2)
1076
+ assert_allclose(Y_test1, Y_right, rtol=eps)
1077
+
1078
+ def test_pdist_minkowski_random_nonC(self):
1079
+ eps = 1e-7
1080
+ X = eo['pdist-double-inp']
1081
+ Y_right = eo['pdist-minkowski-3.2']
1082
+ Y_test2 = wpdist_no_const(X, 'test_minkowski', p=3.2)
1083
+ assert_allclose(Y_test2, Y_right, rtol=eps)
1084
+
1085
+ @pytest.mark.slow
1086
+ def test_pdist_minkowski_3_2_iris(self):
1087
+ eps = 1e-7
1088
+ X = eo['iris']
1089
+ Y_right = eo['pdist-minkowski-3.2-iris']
1090
+ Y_test1 = wpdist_no_const(X, 'minkowski', p=3.2)
1091
+ assert_allclose(Y_test1, Y_right, rtol=eps)
1092
+
1093
+ @pytest.mark.slow
1094
+ def test_pdist_minkowski_3_2_iris_float32(self):
1095
+ eps = 1e-5
1096
+ X = np.float32(eo['iris'])
1097
+ Y_right = eo['pdist-minkowski-3.2-iris']
1098
+ Y_test1 = wpdist_no_const(X, 'minkowski', p=3.2)
1099
+ assert_allclose(Y_test1, Y_right, rtol=eps)
1100
+
1101
+ @pytest.mark.slow
1102
+ def test_pdist_minkowski_3_2_iris_nonC(self):
1103
+ eps = 1e-7
1104
+ X = eo['iris']
1105
+ Y_right = eo['pdist-minkowski-3.2-iris']
1106
+ Y_test2 = wpdist_no_const(X, 'test_minkowski', p=3.2)
1107
+ assert_allclose(Y_test2, Y_right, rtol=eps)
1108
+
1109
+ @pytest.mark.slow
1110
+ def test_pdist_minkowski_5_8_iris(self):
1111
+ eps = 1e-7
1112
+ X = eo['iris']
1113
+ Y_right = eo['pdist-minkowski-5.8-iris']
1114
+ Y_test1 = wpdist_no_const(X, 'minkowski', p=5.8)
1115
+ assert_allclose(Y_test1, Y_right, rtol=eps)
1116
+
1117
+ @pytest.mark.slow
1118
+ def test_pdist_minkowski_5_8_iris_float32(self):
1119
+ eps = 1e-5
1120
+ X = np.float32(eo['iris'])
1121
+ Y_right = eo['pdist-minkowski-5.8-iris']
1122
+ Y_test1 = wpdist_no_const(X, 'minkowski', p=5.8)
1123
+ assert_allclose(Y_test1, Y_right, rtol=eps, verbose=verbose > 2)
1124
+
1125
+ @pytest.mark.slow
1126
+ def test_pdist_minkowski_5_8_iris_nonC(self):
1127
+ eps = 1e-7
1128
+ X = eo['iris']
1129
+ Y_right = eo['pdist-minkowski-5.8-iris']
1130
+ Y_test2 = wpdist_no_const(X, 'test_minkowski', p=5.8)
1131
+ assert_allclose(Y_test2, Y_right, rtol=eps)
1132
+
1133
+ def test_pdist_mahalanobis(self):
1134
+ # 1-dimensional observations
1135
+ x = np.array([2.0, 2.0, 3.0, 5.0]).reshape(-1, 1)
1136
+ dist = pdist(x, metric='mahalanobis')
1137
+ assert_allclose(dist, [0.0, np.sqrt(0.5), np.sqrt(4.5),
1138
+ np.sqrt(0.5), np.sqrt(4.5), np.sqrt(2.0)])
1139
+
1140
+ # 2-dimensional observations
1141
+ x = np.array([[0, 0], [-1, 0], [0, 2], [1, 0], [0, -2]])
1142
+ dist = pdist(x, metric='mahalanobis')
1143
+ rt2 = np.sqrt(2)
1144
+ assert_allclose(dist, [rt2, rt2, rt2, rt2, 2, 2 * rt2, 2, 2, 2 * rt2, 2])
1145
+
1146
+ # Too few observations
1147
+ with pytest.raises(ValueError):
1148
+ wpdist([[0, 1], [2, 3]], metric='mahalanobis')
1149
+
1150
+ def test_pdist_hamming_random(self):
1151
+ eps = 1e-15
1152
+ X = eo['pdist-boolean-inp']
1153
+ Y_right = eo['pdist-hamming']
1154
+ Y_test1 = wpdist(X, 'hamming')
1155
+ assert_allclose(Y_test1, Y_right, rtol=eps)
1156
+
1157
+ def test_pdist_hamming_random_float32(self):
1158
+ eps = 1e-15
1159
+ X = np.float32(eo['pdist-boolean-inp'])
1160
+ Y_right = eo['pdist-hamming']
1161
+ Y_test1 = wpdist(X, 'hamming')
1162
+ assert_allclose(Y_test1, Y_right, rtol=eps)
1163
+
1164
+ def test_pdist_hamming_random_nonC(self):
1165
+ eps = 1e-15
1166
+ X = eo['pdist-boolean-inp']
1167
+ Y_right = eo['pdist-hamming']
1168
+ Y_test2 = wpdist(X, 'test_hamming')
1169
+ assert_allclose(Y_test2, Y_right, rtol=eps)
1170
+
1171
+ def test_pdist_dhamming_random(self):
1172
+ eps = 1e-15
1173
+ X = np.float64(eo['pdist-boolean-inp'])
1174
+ Y_right = eo['pdist-hamming']
1175
+ Y_test1 = wpdist(X, 'hamming')
1176
+ assert_allclose(Y_test1, Y_right, rtol=eps)
1177
+
1178
+ def test_pdist_dhamming_random_float32(self):
1179
+ eps = 1e-15
1180
+ X = np.float32(eo['pdist-boolean-inp'])
1181
+ Y_right = eo['pdist-hamming']
1182
+ Y_test1 = wpdist(X, 'hamming')
1183
+ assert_allclose(Y_test1, Y_right, rtol=eps)
1184
+
1185
+ def test_pdist_dhamming_random_nonC(self):
1186
+ eps = 1e-15
1187
+ X = np.float64(eo['pdist-boolean-inp'])
1188
+ Y_right = eo['pdist-hamming']
1189
+ Y_test2 = wpdist(X, 'test_hamming')
1190
+ assert_allclose(Y_test2, Y_right, rtol=eps)
1191
+
1192
+ def test_pdist_jensenshannon_random(self):
1193
+ eps = 1e-11
1194
+ X = eo['pdist-double-inp']
1195
+ Y_right = eo['pdist-jensenshannon']
1196
+ Y_test1 = pdist(X, 'jensenshannon')
1197
+ assert_allclose(Y_test1, Y_right, rtol=eps)
1198
+
1199
+ def test_pdist_jensenshannon_random_float32(self):
1200
+ eps = 1e-8
1201
+ X = np.float32(eo['pdist-double-inp'])
1202
+ Y_right = eo['pdist-jensenshannon']
1203
+ Y_test1 = pdist(X, 'jensenshannon')
1204
+ assert_allclose(Y_test1, Y_right, rtol=eps, verbose=verbose > 2)
1205
+
1206
+ def test_pdist_jensenshannon_random_nonC(self):
1207
+ eps = 1e-11
1208
+ X = eo['pdist-double-inp']
1209
+ Y_right = eo['pdist-jensenshannon']
1210
+ Y_test2 = pdist(X, 'test_jensenshannon')
1211
+ assert_allclose(Y_test2, Y_right, rtol=eps)
1212
+
1213
+ def test_pdist_jensenshannon_iris(self):
1214
+ if _is_32bit():
1215
+ # Test failing on 32-bit Linux on Azure otherwise, see gh-12810
1216
+ eps = 2.5e-10
1217
+ else:
1218
+ eps = 1e-12
1219
+
1220
+ X = eo['iris']
1221
+ Y_right = eo['pdist-jensenshannon-iris']
1222
+ Y_test1 = pdist(X, 'jensenshannon')
1223
+ assert_allclose(Y_test1, Y_right, atol=eps)
1224
+
1225
+ def test_pdist_jensenshannon_iris_float32(self):
1226
+ eps = 1e-06
1227
+ X = np.float32(eo['iris'])
1228
+ Y_right = eo['pdist-jensenshannon-iris']
1229
+ Y_test1 = pdist(X, 'jensenshannon')
1230
+ assert_allclose(Y_test1, Y_right, atol=eps, verbose=verbose > 2)
1231
+
1232
+ def test_pdist_jensenshannon_iris_nonC(self):
1233
+ eps = 5e-5
1234
+ X = eo['iris']
1235
+ Y_right = eo['pdist-jensenshannon-iris']
1236
+ Y_test2 = pdist(X, 'test_jensenshannon')
1237
+ assert_allclose(Y_test2, Y_right, rtol=eps)
1238
+
1239
+ def test_pdist_matching_mtica1(self):
1240
+ # Test matching(*,*) with mtica example #1 (nums).
1241
+ m = wmatching(np.array([1, 0, 1, 1, 0]),
1242
+ np.array([1, 1, 0, 1, 1]))
1243
+ m2 = wmatching(np.array([1, 0, 1, 1, 0], dtype=bool),
1244
+ np.array([1, 1, 0, 1, 1], dtype=bool))
1245
+ assert_allclose(m, 0.6, rtol=0, atol=1e-10)
1246
+ assert_allclose(m2, 0.6, rtol=0, atol=1e-10)
1247
+
1248
+ def test_pdist_matching_mtica2(self):
1249
+ # Test matching(*,*) with mtica example #2.
1250
+ m = wmatching(np.array([1, 0, 1]),
1251
+ np.array([1, 1, 0]))
1252
+ m2 = wmatching(np.array([1, 0, 1], dtype=bool),
1253
+ np.array([1, 1, 0], dtype=bool))
1254
+ assert_allclose(m, 2 / 3, rtol=0, atol=1e-10)
1255
+ assert_allclose(m2, 2 / 3, rtol=0, atol=1e-10)
1256
+
1257
+ def test_pdist_yule_mtica1(self):
1258
+ m = wyule(np.array([1, 0, 1, 1, 0]),
1259
+ np.array([1, 1, 0, 1, 1]))
1260
+ m2 = wyule(np.array([1, 0, 1, 1, 0], dtype=bool),
1261
+ np.array([1, 1, 0, 1, 1], dtype=bool))
1262
+ if verbose > 2:
1263
+ print(m)
1264
+ assert_allclose(m, 2, rtol=0, atol=1e-10)
1265
+ assert_allclose(m2, 2, rtol=0, atol=1e-10)
1266
+
1267
+ def test_pdist_yule_mtica2(self):
1268
+ m = wyule(np.array([1, 0, 1]),
1269
+ np.array([1, 1, 0]))
1270
+ m2 = wyule(np.array([1, 0, 1], dtype=bool),
1271
+ np.array([1, 1, 0], dtype=bool))
1272
+ if verbose > 2:
1273
+ print(m)
1274
+ assert_allclose(m, 2, rtol=0, atol=1e-10)
1275
+ assert_allclose(m2, 2, rtol=0, atol=1e-10)
1276
+
1277
+ def test_pdist_dice_mtica1(self):
1278
+ m = wdice(np.array([1, 0, 1, 1, 0]),
1279
+ np.array([1, 1, 0, 1, 1]))
1280
+ m2 = wdice(np.array([1, 0, 1, 1, 0], dtype=bool),
1281
+ np.array([1, 1, 0, 1, 1], dtype=bool))
1282
+ if verbose > 2:
1283
+ print(m)
1284
+ assert_allclose(m, 3 / 7, rtol=0, atol=1e-10)
1285
+ assert_allclose(m2, 3 / 7, rtol=0, atol=1e-10)
1286
+
1287
+ def test_pdist_dice_mtica2(self):
1288
+ m = wdice(np.array([1, 0, 1]),
1289
+ np.array([1, 1, 0]))
1290
+ m2 = wdice(np.array([1, 0, 1], dtype=bool),
1291
+ np.array([1, 1, 0], dtype=bool))
1292
+ if verbose > 2:
1293
+ print(m)
1294
+ assert_allclose(m, 0.5, rtol=0, atol=1e-10)
1295
+ assert_allclose(m2, 0.5, rtol=0, atol=1e-10)
1296
+
1297
+ def test_pdist_sokalsneath_mtica1(self):
1298
+ m = sokalsneath(np.array([1, 0, 1, 1, 0]),
1299
+ np.array([1, 1, 0, 1, 1]))
1300
+ m2 = sokalsneath(np.array([1, 0, 1, 1, 0], dtype=bool),
1301
+ np.array([1, 1, 0, 1, 1], dtype=bool))
1302
+ if verbose > 2:
1303
+ print(m)
1304
+ assert_allclose(m, 3 / 4, rtol=0, atol=1e-10)
1305
+ assert_allclose(m2, 3 / 4, rtol=0, atol=1e-10)
1306
+
1307
+ def test_pdist_sokalsneath_mtica2(self):
1308
+ m = wsokalsneath(np.array([1, 0, 1]),
1309
+ np.array([1, 1, 0]))
1310
+ m2 = wsokalsneath(np.array([1, 0, 1], dtype=bool),
1311
+ np.array([1, 1, 0], dtype=bool))
1312
+ if verbose > 2:
1313
+ print(m)
1314
+ assert_allclose(m, 4 / 5, rtol=0, atol=1e-10)
1315
+ assert_allclose(m2, 4 / 5, rtol=0, atol=1e-10)
1316
+
1317
+ def test_pdist_rogerstanimoto_mtica1(self):
1318
+ m = wrogerstanimoto(np.array([1, 0, 1, 1, 0]),
1319
+ np.array([1, 1, 0, 1, 1]))
1320
+ m2 = wrogerstanimoto(np.array([1, 0, 1, 1, 0], dtype=bool),
1321
+ np.array([1, 1, 0, 1, 1], dtype=bool))
1322
+ if verbose > 2:
1323
+ print(m)
1324
+ assert_allclose(m, 3 / 4, rtol=0, atol=1e-10)
1325
+ assert_allclose(m2, 3 / 4, rtol=0, atol=1e-10)
1326
+
1327
+ def test_pdist_rogerstanimoto_mtica2(self):
1328
+ m = wrogerstanimoto(np.array([1, 0, 1]),
1329
+ np.array([1, 1, 0]))
1330
+ m2 = wrogerstanimoto(np.array([1, 0, 1], dtype=bool),
1331
+ np.array([1, 1, 0], dtype=bool))
1332
+ if verbose > 2:
1333
+ print(m)
1334
+ assert_allclose(m, 4 / 5, rtol=0, atol=1e-10)
1335
+ assert_allclose(m2, 4 / 5, rtol=0, atol=1e-10)
1336
+
1337
+ def test_pdist_russellrao_mtica1(self):
1338
+ m = wrussellrao(np.array([1, 0, 1, 1, 0]),
1339
+ np.array([1, 1, 0, 1, 1]))
1340
+ m2 = wrussellrao(np.array([1, 0, 1, 1, 0], dtype=bool),
1341
+ np.array([1, 1, 0, 1, 1], dtype=bool))
1342
+ if verbose > 2:
1343
+ print(m)
1344
+ assert_allclose(m, 3 / 5, rtol=0, atol=1e-10)
1345
+ assert_allclose(m2, 3 / 5, rtol=0, atol=1e-10)
1346
+
1347
+ def test_pdist_russellrao_mtica2(self):
1348
+ m = wrussellrao(np.array([1, 0, 1]),
1349
+ np.array([1, 1, 0]))
1350
+ m2 = wrussellrao(np.array([1, 0, 1], dtype=bool),
1351
+ np.array([1, 1, 0], dtype=bool))
1352
+ if verbose > 2:
1353
+ print(m)
1354
+ assert_allclose(m, 2 / 3, rtol=0, atol=1e-10)
1355
+ assert_allclose(m2, 2 / 3, rtol=0, atol=1e-10)
1356
+
1357
+ @pytest.mark.slow
1358
+ def test_pdist_canberra_match(self):
1359
+ D = eo['iris']
1360
+ if verbose > 2:
1361
+ print(D.shape, D.dtype)
1362
+ eps = 1e-15
1363
+ y1 = wpdist_no_const(D, "canberra")
1364
+ y2 = wpdist_no_const(D, "test_canberra")
1365
+ assert_allclose(y1, y2, rtol=eps, verbose=verbose > 2)
1366
+
1367
+ def test_pdist_canberra_ticket_711(self):
1368
+ # Test pdist(X, 'canberra') to see if Canberra gives the right result
1369
+ # as reported on gh-1238.
1370
+ eps = 1e-8
1371
+ pdist_y = wpdist_no_const(([3.3], [3.4]), "canberra")
1372
+ right_y = 0.01492537
1373
+ assert_allclose(pdist_y, right_y, atol=eps, verbose=verbose > 2)
1374
+
1375
+ @skip_xp_invalid_arg
1376
+ def test_pdist_custom_notdouble(self):
1377
+ # tests that when using a custom metric the data type is not altered
1378
+ class myclass:
1379
+ pass
1380
+
1381
+ def _my_metric(x, y):
1382
+ if not isinstance(x[0], myclass) or not isinstance(y[0], myclass):
1383
+ raise ValueError("Type has been changed")
1384
+ return 1.123
1385
+ data = np.array([[myclass()], [myclass()]], dtype=object)
1386
+ pdist_y = pdist(data, metric=_my_metric)
1387
+ right_y = 1.123
1388
+ assert_equal(pdist_y, right_y, verbose=verbose > 2)
1389
+
1390
+ def _check_calling_conventions(self, X, metric, eps=1e-07, **kwargs):
1391
+ # helper function for test_pdist_calling_conventions
1392
+ try:
1393
+ y1 = pdist(X, metric=metric, **kwargs)
1394
+ y2 = pdist(X, metric=eval(metric), **kwargs)
1395
+ y3 = pdist(X, metric="test_" + metric, **kwargs)
1396
+ except Exception as e:
1397
+ e_cls = e.__class__
1398
+ if verbose > 2:
1399
+ print(e_cls.__name__)
1400
+ print(e)
1401
+ with pytest.raises(e_cls):
1402
+ pdist(X, metric=metric, **kwargs)
1403
+ with pytest.raises(e_cls):
1404
+ pdist(X, metric=eval(metric), **kwargs)
1405
+ with pytest.raises(e_cls):
1406
+ pdist(X, metric="test_" + metric, **kwargs)
1407
+ else:
1408
+ assert_allclose(y1, y2, rtol=eps, verbose=verbose > 2)
1409
+ assert_allclose(y1, y3, rtol=eps, verbose=verbose > 2)
1410
+
1411
+ def test_pdist_calling_conventions(self, metric):
1412
+ # Ensures that specifying the metric with a str or scipy function
1413
+ # gives the same behaviour (i.e. same result or same exception).
1414
+ # NOTE: The correctness should be checked within each metric tests.
1415
+ # NOTE: Extra args should be checked with a dedicated test
1416
+ for eo_name in self.rnd_eo_names:
1417
+ # subsampling input data to speed-up tests
1418
+ # NOTE: num samples needs to be > than dimensions for mahalanobis
1419
+ X = eo[eo_name][::5, ::2]
1420
+ if verbose > 2:
1421
+ print("testing: ", metric, " with: ", eo_name)
1422
+ if metric in {'dice', 'yule', 'matching',
1423
+ 'rogerstanimoto', 'russellrao', 'sokalmichener',
1424
+ 'sokalsneath',
1425
+ 'kulczynski1'} and 'bool' not in eo_name:
1426
+ # python version permits non-bools e.g. for fuzzy logic
1427
+ continue
1428
+ self._check_calling_conventions(X, metric)
1429
+
1430
+ # Testing built-in metrics with extra args
1431
+ if metric == "seuclidean":
1432
+ V = np.var(X.astype(np.float64), axis=0, ddof=1)
1433
+ self._check_calling_conventions(X, metric, V=V)
1434
+ elif metric == "mahalanobis":
1435
+ V = np.atleast_2d(np.cov(X.astype(np.float64).T))
1436
+ VI = np.array(np.linalg.inv(V).T)
1437
+ self._check_calling_conventions(X, metric, VI=VI)
1438
+
1439
+ def test_pdist_dtype_equivalence(self, metric):
1440
+ # Tests that the result is not affected by type up-casting
1441
+ eps = 1e-07
1442
+ tests = [(eo['random-bool-data'], self.valid_upcasts['bool']),
1443
+ (eo['random-uint-data'], self.valid_upcasts['uint']),
1444
+ (eo['random-int-data'], self.valid_upcasts['int']),
1445
+ (eo['random-float32-data'], self.valid_upcasts['float32'])]
1446
+ for test in tests:
1447
+ X1 = test[0][::5, ::2]
1448
+ try:
1449
+ y1 = pdist(X1, metric=metric)
1450
+ except Exception as e:
1451
+ e_cls = e.__class__
1452
+ if verbose > 2:
1453
+ print(e_cls.__name__)
1454
+ print(e)
1455
+ for new_type in test[1]:
1456
+ X2 = new_type(X1)
1457
+ with pytest.raises(e_cls):
1458
+ pdist(X2, metric=metric)
1459
+ else:
1460
+ for new_type in test[1]:
1461
+ y2 = pdist(new_type(X1), metric=metric)
1462
+ assert_allclose(y1, y2, rtol=eps, verbose=verbose > 2)
1463
+
1464
+ @pytest.mark.thread_unsafe
1465
+ def test_pdist_out(self, metric):
1466
+ # Test that out parameter works properly
1467
+ eps = 1e-15
1468
+ X = eo['random-float32-data'][::5, ::2]
1469
+ out_size = int((X.shape[0] * (X.shape[0] - 1)) / 2)
1470
+
1471
+ kwargs = dict()
1472
+ if metric == 'minkowski':
1473
+ kwargs['p'] = 1.23
1474
+ out1 = np.empty(out_size, dtype=np.float64)
1475
+ with maybe_deprecated(metric):
1476
+ Y_right = pdist(X, metric, **kwargs)
1477
+ with maybe_deprecated(metric):
1478
+ Y_test1 = pdist(X, metric, out=out1, **kwargs)
1479
+
1480
+ # test that output is numerically equivalent
1481
+ assert_allclose(Y_test1, Y_right, rtol=eps)
1482
+
1483
+ # test that Y_test1 and out1 are the same object
1484
+ assert_(Y_test1 is out1)
1485
+
1486
+ # test for incorrect shape
1487
+ out2 = np.empty(out_size + 3, dtype=np.float64)
1488
+ with pytest.raises(ValueError):
1489
+ with maybe_deprecated(metric):
1490
+ pdist(X, metric, out=out2, **kwargs)
1491
+
1492
+ # test for (C-)contiguous output
1493
+ out3 = np.empty(2 * out_size, dtype=np.float64)[::2]
1494
+ with pytest.raises(ValueError):
1495
+ with maybe_deprecated(metric):
1496
+ pdist(X, metric, out=out3, **kwargs)
1497
+
1498
+ # test for incorrect dtype
1499
+ out5 = np.empty(out_size, dtype=np.int64)
1500
+ with pytest.raises(ValueError):
1501
+ with maybe_deprecated(metric):
1502
+ pdist(X, metric, out=out5, **kwargs)
1503
+
1504
+ @pytest.mark.thread_unsafe
1505
+ def test_striding(self, metric):
1506
+ # test that striding is handled correct with calls to
1507
+ # _copy_array_if_base_present
1508
+ eps = 1e-15
1509
+ X = eo['random-float32-data'][::5, ::2]
1510
+ X_copy = X.copy()
1511
+
1512
+ # confirm contiguity
1513
+ assert_(not X.flags.c_contiguous)
1514
+ assert_(X_copy.flags.c_contiguous)
1515
+
1516
+ kwargs = dict()
1517
+ if metric == 'minkowski':
1518
+ kwargs['p'] = 1.23
1519
+ with maybe_deprecated(metric):
1520
+ Y1 = pdist(X, metric, **kwargs)
1521
+ with maybe_deprecated(metric):
1522
+ Y2 = pdist(X_copy, metric, **kwargs)
1523
+ # test that output is numerically equivalent
1524
+ assert_allclose(Y1, Y2, rtol=eps, verbose=verbose > 2)
1525
+
1526
+ class TestSomeDistanceFunctions:
1527
+
1528
+ def setup_method(self):
1529
+ # 1D arrays
1530
+ x = np.array([1.0, 2.0, 3.0])
1531
+ y = np.array([1.0, 1.0, 5.0])
1532
+
1533
+ self.cases = [(x, y)]
1534
+
1535
+ def test_minkowski(self):
1536
+ for x, y in self.cases:
1537
+ dist1 = minkowski(x, y, p=1)
1538
+ assert_almost_equal(dist1, 3.0)
1539
+ dist1p5 = minkowski(x, y, p=1.5)
1540
+ assert_almost_equal(dist1p5, (1.0 + 2.0**1.5)**(2. / 3))
1541
+ dist2 = minkowski(x, y, p=2)
1542
+ assert_almost_equal(dist2, 5.0 ** 0.5)
1543
+ dist0p25 = minkowski(x, y, p=0.25)
1544
+ assert_almost_equal(dist0p25, (1.0 + 2.0 ** 0.25) ** 4)
1545
+
1546
+ # Check that casting input to minimum scalar type doesn't affect result
1547
+ # (issue #10262). This could be extended to more test inputs with
1548
+ # np.min_scalar_type(np.max(input_matrix)).
1549
+ a = np.array([352, 916])
1550
+ b = np.array([350, 660])
1551
+ assert_equal(minkowski(a, b),
1552
+ minkowski(a.astype('uint16'), b.astype('uint16')))
1553
+
1554
+ def test_euclidean(self):
1555
+ for x, y in self.cases:
1556
+ dist = weuclidean(x, y)
1557
+ assert_almost_equal(dist, np.sqrt(5))
1558
+
1559
+ def test_sqeuclidean(self):
1560
+ for x, y in self.cases:
1561
+ dist = wsqeuclidean(x, y)
1562
+ assert_almost_equal(dist, 5.0)
1563
+
1564
+ def test_cosine(self):
1565
+ for x, y in self.cases:
1566
+ dist = wcosine(x, y)
1567
+ assert_almost_equal(dist, 1.0 - 18.0 / (np.sqrt(14) * np.sqrt(27)))
1568
+
1569
+ def test_cosine_output_dtype(self):
1570
+ # Regression test for gh-19541
1571
+ assert isinstance(wcorrelation([1, 1], [1, 1], centered=False), float)
1572
+ assert isinstance(wcosine([1, 1], [1, 1]), float)
1573
+
1574
+ def test_correlation(self):
1575
+ xm = np.array([-1.0, 0, 1.0])
1576
+ ym = np.array([-4.0 / 3, -4.0 / 3, 5.0 - 7.0 / 3])
1577
+ for x, y in self.cases:
1578
+ dist = wcorrelation(x, y)
1579
+ assert_almost_equal(dist, 1.0 - np.dot(xm, ym) / (norm(xm) * norm(ym)))
1580
+
1581
+ def test_correlation_positive(self):
1582
+ # Regression test for gh-12320 (negative return value due to rounding
1583
+ x = np.array([0., 0., 0., 0., 0., 0., -2., 0., 0., 0., -2., -2., -2.,
1584
+ 0., -2., 0., -2., 0., 0., -1., -2., 0., 1., 0., 0., -2.,
1585
+ 0., 0., -2., 0., -2., -2., -2., -2., -2., -2., 0.])
1586
+ y = np.array([1., 1., 1., 1., 1., 1., -1., 1., 1., 1., -1., -1., -1.,
1587
+ 1., -1., 1., -1., 1., 1., 0., -1., 1., 2., 1., 1., -1.,
1588
+ 1., 1., -1., 1., -1., -1., -1., -1., -1., -1., 1.])
1589
+ dist = correlation(x, y)
1590
+ assert 0 <= dist <= 10 * np.finfo(np.float64).eps
1591
+
1592
+ @pytest.mark.thread_unsafe
1593
+ @pytest.mark.filterwarnings('ignore:Casting complex')
1594
+ @pytest.mark.parametrize("func", [correlation, cosine])
1595
+ def test_corr_dep_complex(self, func):
1596
+ x = [1+0j, 2+0j]
1597
+ y = [3+0j, 4+0j]
1598
+ with pytest.deprecated_call(match="Complex `u` and `v` are deprecated"):
1599
+ func(x, y)
1600
+
1601
+ def test_mahalanobis(self):
1602
+ x = np.array([1.0, 2.0, 3.0])
1603
+ y = np.array([1.0, 1.0, 5.0])
1604
+ vi = np.array([[2.0, 1.0, 0.0], [1.0, 2.0, 1.0], [0.0, 1.0, 2.0]])
1605
+ for x, y in self.cases:
1606
+ dist = mahalanobis(x, y, vi)
1607
+ assert_almost_equal(dist, np.sqrt(6.0))
1608
+
1609
+
1610
+ class TestSquareForm:
1611
+ checked_dtypes = [np.float64, np.float32, np.int32, np.int8, bool]
1612
+
1613
+ def test_squareform_matrix(self):
1614
+ for dtype in self.checked_dtypes:
1615
+ self.check_squareform_matrix(dtype)
1616
+
1617
+ def test_squareform_vector(self):
1618
+ for dtype in self.checked_dtypes:
1619
+ self.check_squareform_vector(dtype)
1620
+
1621
+ def check_squareform_matrix(self, dtype):
1622
+ A = np.zeros((0, 0), dtype=dtype)
1623
+ rA = squareform(A)
1624
+ assert_equal(rA.shape, (0,))
1625
+ assert_equal(rA.dtype, dtype)
1626
+
1627
+ A = np.zeros((1, 1), dtype=dtype)
1628
+ rA = squareform(A)
1629
+ assert_equal(rA.shape, (0,))
1630
+ assert_equal(rA.dtype, dtype)
1631
+
1632
+ A = np.array([[0, 4.2], [4.2, 0]], dtype=dtype)
1633
+ rA = squareform(A)
1634
+ assert_equal(rA.shape, (1,))
1635
+ assert_equal(rA.dtype, dtype)
1636
+ assert_array_equal(rA, np.array([4.2], dtype=dtype))
1637
+
1638
+ def check_squareform_vector(self, dtype):
1639
+ v = np.zeros((0,), dtype=dtype)
1640
+ rv = squareform(v)
1641
+ assert_equal(rv.shape, (1, 1))
1642
+ assert_equal(rv.dtype, dtype)
1643
+ assert_array_equal(rv, [[0]])
1644
+
1645
+ v = np.array([8.3], dtype=dtype)
1646
+ rv = squareform(v)
1647
+ assert_equal(rv.shape, (2, 2))
1648
+ assert_equal(rv.dtype, dtype)
1649
+ assert_array_equal(rv, np.array([[0, 8.3], [8.3, 0]], dtype=dtype))
1650
+
1651
+ def test_squareform_multi_matrix(self):
1652
+ for n in range(2, 5):
1653
+ self.check_squareform_multi_matrix(n)
1654
+
1655
+ def check_squareform_multi_matrix(self, n):
1656
+ X = np.random.rand(n, 4)
1657
+ Y = wpdist_no_const(X)
1658
+ assert_equal(len(Y.shape), 1)
1659
+ A = squareform(Y)
1660
+ Yr = squareform(A)
1661
+ s = A.shape
1662
+ k = 0
1663
+ if verbose >= 3:
1664
+ print(A.shape, Y.shape, Yr.shape)
1665
+ assert_equal(len(s), 2)
1666
+ assert_equal(len(Yr.shape), 1)
1667
+ assert_equal(s[0], s[1])
1668
+ for i in range(0, s[0]):
1669
+ for j in range(i + 1, s[1]):
1670
+ if i != j:
1671
+ assert_equal(A[i, j], Y[k])
1672
+ k += 1
1673
+ else:
1674
+ assert_equal(A[i, j], 0)
1675
+
1676
+
1677
+ class TestNumObsY:
1678
+
1679
+ def test_num_obs_y_multi_matrix(self):
1680
+ for n in range(2, 10):
1681
+ X = np.random.rand(n, 4)
1682
+ Y = wpdist_no_const(X)
1683
+ assert_equal(num_obs_y(Y), n)
1684
+
1685
+ def test_num_obs_y_1(self):
1686
+ # Tests num_obs_y(y) on a condensed distance matrix over 1
1687
+ # observations. Expecting exception.
1688
+ with pytest.raises(ValueError):
1689
+ self.check_y(1)
1690
+
1691
+ def test_num_obs_y_2(self):
1692
+ # Tests num_obs_y(y) on a condensed distance matrix over 2
1693
+ # observations.
1694
+ assert_(self.check_y(2))
1695
+
1696
+ def test_num_obs_y_3(self):
1697
+ assert_(self.check_y(3))
1698
+
1699
+ def test_num_obs_y_4(self):
1700
+ assert_(self.check_y(4))
1701
+
1702
+ def test_num_obs_y_5_10(self):
1703
+ for i in range(5, 16):
1704
+ self.minit(i)
1705
+
1706
+ def test_num_obs_y_2_100(self):
1707
+ # Tests num_obs_y(y) on 100 improper condensed distance matrices.
1708
+ # Expecting exception.
1709
+ a = set()
1710
+ for n in range(2, 16):
1711
+ a.add(n * (n - 1) / 2)
1712
+ for i in range(5, 105):
1713
+ if i not in a:
1714
+ with pytest.raises(ValueError):
1715
+ self.bad_y(i)
1716
+
1717
+ def minit(self, n):
1718
+ assert_(self.check_y(n))
1719
+
1720
+ def bad_y(self, n):
1721
+ y = np.random.rand(n)
1722
+ return num_obs_y(y)
1723
+
1724
+ def check_y(self, n):
1725
+ return num_obs_y(self.make_y(n)) == n
1726
+
1727
+ def make_y(self, n):
1728
+ return np.random.rand((n * (n - 1)) // 2)
1729
+
1730
+
1731
+ class TestNumObsDM:
1732
+
1733
+ def test_num_obs_dm_multi_matrix(self):
1734
+ for n in range(1, 10):
1735
+ X = np.random.rand(n, 4)
1736
+ Y = wpdist_no_const(X)
1737
+ A = squareform(Y)
1738
+ if verbose >= 3:
1739
+ print(A.shape, Y.shape)
1740
+ assert_equal(num_obs_dm(A), n)
1741
+
1742
+ def test_num_obs_dm_0(self):
1743
+ # Tests num_obs_dm(D) on a 0x0 distance matrix. Expecting exception.
1744
+ assert_(self.check_D(0))
1745
+
1746
+ def test_num_obs_dm_1(self):
1747
+ # Tests num_obs_dm(D) on a 1x1 distance matrix.
1748
+ assert_(self.check_D(1))
1749
+
1750
+ def test_num_obs_dm_2(self):
1751
+ assert_(self.check_D(2))
1752
+
1753
+ def test_num_obs_dm_3(self):
1754
+ assert_(self.check_D(2))
1755
+
1756
+ def test_num_obs_dm_4(self):
1757
+ assert_(self.check_D(4))
1758
+
1759
+ def check_D(self, n):
1760
+ return num_obs_dm(self.make_D(n)) == n
1761
+
1762
+ def make_D(self, n):
1763
+ return np.random.rand(n, n)
1764
+
1765
+
1766
+ def is_valid_dm_throw(D):
1767
+ return is_valid_dm(D, throw=True)
1768
+
1769
+
1770
+ class TestIsValidDM:
1771
+
1772
+ def test_is_valid_dm_improper_shape_1D_E(self):
1773
+ D = np.zeros((5,), dtype=np.float64)
1774
+ with pytest.raises(ValueError):
1775
+ is_valid_dm_throw(D)
1776
+
1777
+ def test_is_valid_dm_improper_shape_1D_F(self):
1778
+ D = np.zeros((5,), dtype=np.float64)
1779
+ assert_equal(is_valid_dm(D), False)
1780
+
1781
+ def test_is_valid_dm_improper_shape_3D_E(self):
1782
+ D = np.zeros((3, 3, 3), dtype=np.float64)
1783
+ with pytest.raises(ValueError):
1784
+ is_valid_dm_throw(D)
1785
+
1786
+ def test_is_valid_dm_improper_shape_3D_F(self):
1787
+ D = np.zeros((3, 3, 3), dtype=np.float64)
1788
+ assert_equal(is_valid_dm(D), False)
1789
+
1790
+ def test_is_valid_dm_nonzero_diagonal_E(self):
1791
+ y = np.random.rand(10)
1792
+ D = squareform(y)
1793
+ for i in range(0, 5):
1794
+ D[i, i] = 2.0
1795
+ with pytest.raises(ValueError):
1796
+ is_valid_dm_throw(D)
1797
+
1798
+ def test_is_valid_dm_nonzero_diagonal_F(self):
1799
+ y = np.random.rand(10)
1800
+ D = squareform(y)
1801
+ for i in range(0, 5):
1802
+ D[i, i] = 2.0
1803
+ assert_equal(is_valid_dm(D), False)
1804
+
1805
+ def test_is_valid_dm_asymmetric_E(self):
1806
+ y = np.random.rand(10)
1807
+ D = squareform(y)
1808
+ D[1, 3] = D[3, 1] + 1
1809
+ with pytest.raises(ValueError):
1810
+ is_valid_dm_throw(D)
1811
+
1812
+ def test_is_valid_dm_asymmetric_F(self):
1813
+ y = np.random.rand(10)
1814
+ D = squareform(y)
1815
+ D[1, 3] = D[3, 1] + 1
1816
+ assert_equal(is_valid_dm(D), False)
1817
+
1818
+ def test_is_valid_dm_correct_1_by_1(self):
1819
+ D = np.zeros((1, 1), dtype=np.float64)
1820
+ assert_equal(is_valid_dm(D), True)
1821
+
1822
+ def test_is_valid_dm_correct_2_by_2(self):
1823
+ y = np.random.rand(1)
1824
+ D = squareform(y)
1825
+ assert_equal(is_valid_dm(D), True)
1826
+
1827
+ def test_is_valid_dm_correct_3_by_3(self):
1828
+ y = np.random.rand(3)
1829
+ D = squareform(y)
1830
+ assert_equal(is_valid_dm(D), True)
1831
+
1832
+ def test_is_valid_dm_correct_4_by_4(self):
1833
+ y = np.random.rand(6)
1834
+ D = squareform(y)
1835
+ assert_equal(is_valid_dm(D), True)
1836
+
1837
+ def test_is_valid_dm_correct_5_by_5(self):
1838
+ y = np.random.rand(10)
1839
+ D = squareform(y)
1840
+ assert_equal(is_valid_dm(D), True)
1841
+
1842
+
1843
+ def is_valid_y_throw(y):
1844
+ return is_valid_y(y, throw=True)
1845
+
1846
+
1847
+ class TestIsValidY:
1848
+ # If test case name ends on "_E" then an exception is expected for the
1849
+ # given input, if it ends in "_F" then False is expected for the is_valid_y
1850
+ # check. Otherwise the input is expected to be valid.
1851
+
1852
+ def test_is_valid_y_improper_shape_2D_E(self):
1853
+ y = np.zeros((3, 3,), dtype=np.float64)
1854
+ with pytest.raises(ValueError):
1855
+ is_valid_y_throw(y)
1856
+
1857
+ def test_is_valid_y_improper_shape_2D_F(self):
1858
+ y = np.zeros((3, 3,), dtype=np.float64)
1859
+ assert_equal(is_valid_y(y), False)
1860
+
1861
+ def test_is_valid_y_improper_shape_3D_E(self):
1862
+ y = np.zeros((3, 3, 3), dtype=np.float64)
1863
+ with pytest.raises(ValueError):
1864
+ is_valid_y_throw(y)
1865
+
1866
+ def test_is_valid_y_improper_shape_3D_F(self):
1867
+ y = np.zeros((3, 3, 3), dtype=np.float64)
1868
+ assert_equal(is_valid_y(y), False)
1869
+
1870
+ def test_is_valid_y_correct_2_by_2(self):
1871
+ y = self.correct_n_by_n(2)
1872
+ assert_equal(is_valid_y(y), True)
1873
+
1874
+ def test_is_valid_y_correct_3_by_3(self):
1875
+ y = self.correct_n_by_n(3)
1876
+ assert_equal(is_valid_y(y), True)
1877
+
1878
+ def test_is_valid_y_correct_4_by_4(self):
1879
+ y = self.correct_n_by_n(4)
1880
+ assert_equal(is_valid_y(y), True)
1881
+
1882
+ def test_is_valid_y_correct_5_by_5(self):
1883
+ y = self.correct_n_by_n(5)
1884
+ assert_equal(is_valid_y(y), True)
1885
+
1886
+ def test_is_valid_y_2_100(self):
1887
+ a = set()
1888
+ for n in range(2, 16):
1889
+ a.add(n * (n - 1) / 2)
1890
+ for i in range(5, 105):
1891
+ if i not in a:
1892
+ with pytest.raises(ValueError):
1893
+ self.bad_y(i)
1894
+
1895
+ def bad_y(self, n):
1896
+ y = np.random.rand(n)
1897
+ return is_valid_y(y, throw=True)
1898
+
1899
+ def correct_n_by_n(self, n):
1900
+ y = np.random.rand((n * (n - 1)) // 2)
1901
+ return y
1902
+
1903
+
1904
+ @pytest.mark.parametrize("p", [-10.0, -0.5, 0.0])
1905
+ def test_bad_p(p):
1906
+ # Raise ValueError if p <=0.
1907
+ with pytest.raises(ValueError):
1908
+ minkowski([1, 2], [3, 4], p)
1909
+ with pytest.raises(ValueError):
1910
+ minkowski([1, 2], [3, 4], p, [1, 1])
1911
+
1912
+
1913
+ def test_sokalsneath_all_false():
1914
+ # Regression test for ticket #876
1915
+ with pytest.raises(ValueError):
1916
+ sokalsneath([False, False, False], [False, False, False])
1917
+
1918
+
1919
+ def test_canberra():
1920
+ # Regression test for ticket #1430.
1921
+ assert_equal(wcanberra([1, 2, 3], [2, 4, 6]), 1)
1922
+ assert_equal(wcanberra([1, 1, 0, 0], [1, 0, 1, 0]), 2)
1923
+
1924
+
1925
+ def test_braycurtis():
1926
+ # Regression test for ticket #1430.
1927
+ assert_almost_equal(wbraycurtis([1, 2, 3], [2, 4, 6]), 1. / 3, decimal=15)
1928
+ assert_almost_equal(wbraycurtis([1, 1, 0, 0], [1, 0, 1, 0]), 0.5, decimal=15)
1929
+
1930
+
1931
+ def test_euclideans():
1932
+ # Regression test for ticket #1328.
1933
+ x1 = np.array([1, 1, 1])
1934
+ x2 = np.array([0, 0, 0])
1935
+
1936
+ # Basic test of the calculation.
1937
+ assert_almost_equal(wsqeuclidean(x1, x2), 3.0, decimal=14)
1938
+ assert_almost_equal(weuclidean(x1, x2), np.sqrt(3), decimal=14)
1939
+
1940
+ # Check flattening for (1, N) or (N, 1) inputs
1941
+ with pytest.raises(ValueError, match="Input vector should be 1-D"):
1942
+ weuclidean(x1[np.newaxis, :], x2[np.newaxis, :]), np.sqrt(3)
1943
+ with pytest.raises(ValueError, match="Input vector should be 1-D"):
1944
+ wsqeuclidean(x1[np.newaxis, :], x2[np.newaxis, :])
1945
+ with pytest.raises(ValueError, match="Input vector should be 1-D"):
1946
+ wsqeuclidean(x1[:, np.newaxis], x2[:, np.newaxis])
1947
+
1948
+ # Distance metrics only defined for vectors (= 1-D)
1949
+ x = np.arange(4).reshape(2, 2)
1950
+ with pytest.raises(ValueError):
1951
+ weuclidean(x, x)
1952
+ with pytest.raises(ValueError):
1953
+ wsqeuclidean(x, x)
1954
+
1955
+ # Another check, with random data.
1956
+ rs = np.random.RandomState(1234567890)
1957
+ x = rs.rand(10)
1958
+ y = rs.rand(10)
1959
+ d1 = weuclidean(x, y)
1960
+ d2 = wsqeuclidean(x, y)
1961
+ assert_almost_equal(d1**2, d2, decimal=14)
1962
+
1963
+
1964
+ def test_hamming_unequal_length():
1965
+ # Regression test for gh-4290.
1966
+ x = [0, 0, 1]
1967
+ y = [1, 0, 1, 0]
1968
+ # Used to give an AttributeError from ndarray.mean called on bool
1969
+ with pytest.raises(ValueError):
1970
+ whamming(x, y)
1971
+
1972
+
1973
+ def test_hamming_unequal_length_with_w():
1974
+ u = [0, 0, 1]
1975
+ v = [0, 0, 1]
1976
+ w = [1, 0, 1, 0]
1977
+ msg = "'w' should have the same length as 'u' and 'v'."
1978
+ with pytest.raises(ValueError, match=msg):
1979
+ whamming(u, v, w)
1980
+
1981
+
1982
+ def test_hamming_string_array():
1983
+ # https://github.com/scikit-learn/scikit-learn/issues/4014
1984
+ a = np.array(['eggs', 'spam', 'spam', 'eggs', 'spam', 'spam', 'spam',
1985
+ 'spam', 'spam', 'spam', 'spam', 'eggs', 'eggs', 'spam',
1986
+ 'eggs', 'eggs', 'eggs', 'eggs', 'eggs', 'spam'],
1987
+ dtype='|S4')
1988
+ b = np.array(['eggs', 'spam', 'spam', 'eggs', 'eggs', 'spam', 'spam',
1989
+ 'spam', 'spam', 'eggs', 'spam', 'eggs', 'spam', 'eggs',
1990
+ 'spam', 'spam', 'eggs', 'spam', 'spam', 'eggs'],
1991
+ dtype='|S4')
1992
+ desired = 0.45
1993
+ assert_allclose(whamming(a, b), desired)
1994
+
1995
+
1996
+ def test_minkowski_w():
1997
+ # Regression test for gh-8142.
1998
+ arr_in = np.array([[83.33333333, 100., 83.33333333, 100., 36.,
1999
+ 60., 90., 150., 24., 48.],
2000
+ [83.33333333, 100., 83.33333333, 100., 36.,
2001
+ 60., 90., 150., 24., 48.]])
2002
+ p0 = pdist(arr_in, metric='minkowski', p=1, w=None)
2003
+ c0 = cdist(arr_in, arr_in, metric='minkowski', p=1, w=None)
2004
+ p1 = pdist(arr_in, metric='minkowski', p=1)
2005
+ c1 = cdist(arr_in, arr_in, metric='minkowski', p=1)
2006
+
2007
+ assert_allclose(p0, p1, rtol=1e-15)
2008
+ assert_allclose(c0, c1, rtol=1e-15)
2009
+
2010
+
2011
+ def test_sqeuclidean_dtypes():
2012
+ # Assert that sqeuclidean returns the right types of values.
2013
+ # Integer types should be converted to floating for stability.
2014
+ # Floating point types should be the same as the input.
2015
+ x = [1, 2, 3]
2016
+ y = [4, 5, 6]
2017
+
2018
+ for dtype in [np.int8, np.int16, np.int32, np.int64]:
2019
+ d = wsqeuclidean(np.asarray(x, dtype=dtype), np.asarray(y, dtype=dtype))
2020
+ assert_(np.issubdtype(d.dtype, np.floating))
2021
+
2022
+ for dtype in [np.uint8, np.uint16, np.uint32, np.uint64]:
2023
+ umax = np.iinfo(dtype).max
2024
+ d1 = wsqeuclidean([0], np.asarray([umax], dtype=dtype))
2025
+ d2 = wsqeuclidean(np.asarray([umax], dtype=dtype), [0])
2026
+
2027
+ assert_equal(d1, d2)
2028
+ assert_equal(d1, np.float64(umax)**2)
2029
+
2030
+ dtypes = [np.float32, np.float64, np.complex64, np.complex128]
2031
+ for dtype in ['float16', 'float128']:
2032
+ # These aren't present in older numpy versions; float128 may also not
2033
+ # be present on all platforms.
2034
+ if hasattr(np, dtype):
2035
+ dtypes.append(getattr(np, dtype))
2036
+
2037
+ for dtype in dtypes:
2038
+ d = wsqeuclidean(np.asarray(x, dtype=dtype), np.asarray(y, dtype=dtype))
2039
+ assert_equal(d.dtype, dtype)
2040
+
2041
+
2042
+ @pytest.mark.thread_unsafe
2043
+ def test_sokalmichener():
2044
+ # Test that sokalmichener has the same result for bool and int inputs.
2045
+ p = [True, True, False]
2046
+ q = [True, False, True]
2047
+ x = [int(b) for b in p]
2048
+ y = [int(b) for b in q]
2049
+ with pytest.deprecated_call():
2050
+ dist1 = sokalmichener(p, q)
2051
+ with pytest.deprecated_call():
2052
+ dist2 = sokalmichener(x, y)
2053
+ # These should be exactly the same.
2054
+ assert_equal(dist1, dist2)
2055
+
2056
+
2057
+ @pytest.mark.thread_unsafe
2058
+ def test_sokalmichener_with_weight():
2059
+ # from: | 1 | | 0 |
2060
+ # to: | 1 | | 1 |
2061
+ # weight| | 1 | | 0.2
2062
+ ntf = 0 * 1 + 0 * 0.2
2063
+ nft = 0 * 1 + 1 * 0.2
2064
+ ntt = 1 * 1 + 0 * 0.2
2065
+ nff = 0 * 1 + 0 * 0.2
2066
+ expected = 2 * (nft + ntf) / (ntt + nff + 2 * (nft + ntf))
2067
+ assert_almost_equal(expected, 0.2857143)
2068
+ with pytest.deprecated_call():
2069
+ actual = sokalmichener([1, 0], [1, 1], w=[1, 0.2])
2070
+ assert_almost_equal(expected, actual)
2071
+
2072
+ a1 = [False, False, True, True, True, False, False, True, True, True, True,
2073
+ True, True, False, True, False, False, False, True, True]
2074
+ a2 = [True, True, True, False, False, True, True, True, False, True,
2075
+ True, True, True, True, False, False, False, True, True, True]
2076
+
2077
+ for w in [0.05, 0.1, 1.0, 20.0]:
2078
+ with pytest.deprecated_call():
2079
+ assert_almost_equal(sokalmichener(a2, a1, [w]), 0.6666666666666666)
2080
+
2081
+
2082
+ @pytest.mark.thread_unsafe
2083
+ def test_modifies_input(metric):
2084
+ # test whether cdist or pdist modifies input arrays
2085
+ X1 = np.asarray([[1., 2., 3.],
2086
+ [1.2, 2.3, 3.4],
2087
+ [2.2, 2.3, 4.4],
2088
+ [22.2, 23.3, 44.4]])
2089
+ X1_copy = X1.copy()
2090
+ with maybe_deprecated(metric):
2091
+ cdist(X1, X1, metric)
2092
+ with maybe_deprecated(metric):
2093
+ pdist(X1, metric)
2094
+ assert_array_equal(X1, X1_copy)
2095
+
2096
+
2097
+ @pytest.mark.thread_unsafe
2098
+ def test_Xdist_deprecated_args(metric):
2099
+ # testing both cdist and pdist deprecated warnings
2100
+ X1 = np.asarray([[1., 2., 3.],
2101
+ [1.2, 2.3, 3.4],
2102
+ [2.2, 2.3, 4.4],
2103
+ [22.2, 23.3, 44.4]])
2104
+
2105
+ with pytest.raises(TypeError):
2106
+ cdist(X1, X1, metric, 2.)
2107
+
2108
+ with pytest.raises(TypeError):
2109
+ pdist(X1, metric, 2.)
2110
+
2111
+ for arg in ["p", "V", "VI"]:
2112
+ kwargs = {arg: np.asarray(1.)}
2113
+
2114
+ if ((arg == "V" and metric == "seuclidean")
2115
+ or (arg == "VI" and metric == "mahalanobis")
2116
+ or (arg == "p" and metric == "minkowski")):
2117
+ continue
2118
+
2119
+ with pytest.raises(TypeError):
2120
+ with maybe_deprecated(metric):
2121
+ cdist(X1, X1, metric, **kwargs)
2122
+
2123
+ with pytest.raises(TypeError):
2124
+ with maybe_deprecated(metric):
2125
+ pdist(X1, metric, **kwargs)
2126
+
2127
+
2128
+ @pytest.mark.thread_unsafe
2129
+ def test_Xdist_non_negative_weights(metric):
2130
+ X = eo['random-float32-data'][::5, ::2]
2131
+ w = np.ones(X.shape[1])
2132
+ w[::5] = -w[::5]
2133
+
2134
+ if metric in ['seuclidean', 'mahalanobis', 'jensenshannon']:
2135
+ pytest.skip("not applicable")
2136
+
2137
+ for m in [metric, eval(metric), "test_" + metric]:
2138
+ with pytest.raises(ValueError):
2139
+ with maybe_deprecated(metric):
2140
+ pdist(X, m, w=w)
2141
+ with pytest.raises(ValueError):
2142
+ with maybe_deprecated(metric):
2143
+ cdist(X, X, m, w=w)
2144
+
2145
+
2146
+ def test__validate_vector():
2147
+ x = [1, 2, 3]
2148
+ y = _validate_vector(x)
2149
+ assert_array_equal(y, x)
2150
+
2151
+ y = _validate_vector(x, dtype=np.float64)
2152
+ assert_array_equal(y, x)
2153
+ assert_equal(y.dtype, np.float64)
2154
+
2155
+ x = [1]
2156
+ y = _validate_vector(x)
2157
+ assert_equal(y.ndim, 1)
2158
+ assert_equal(y, x)
2159
+
2160
+ x = 1
2161
+ with pytest.raises(ValueError, match="Input vector should be 1-D"):
2162
+ _validate_vector(x)
2163
+
2164
+ x = np.arange(5).reshape(1, -1, 1)
2165
+ with pytest.raises(ValueError, match="Input vector should be 1-D"):
2166
+ _validate_vector(x)
2167
+
2168
+ x = [[1, 2], [3, 4]]
2169
+ with pytest.raises(ValueError, match="Input vector should be 1-D"):
2170
+ _validate_vector(x)
2171
+
2172
+ def test_yule_all_same():
2173
+ # Test yule avoids a divide by zero when exactly equal
2174
+ x = np.ones((2, 6), dtype=bool)
2175
+ d = wyule(x[0], x[0])
2176
+ assert d == 0.0
2177
+
2178
+ d = pdist(x, 'yule')
2179
+ assert_equal(d, [0.0])
2180
+
2181
+ d = cdist(x[:1], x[:1], 'yule')
2182
+ assert_equal(d, [[0.0]])
2183
+
2184
+
2185
+ def test_jensenshannon():
2186
+ assert_almost_equal(jensenshannon([1.0, 0.0, 0.0], [0.0, 1.0, 0.0], 2.0),
2187
+ 1.0)
2188
+ assert_almost_equal(jensenshannon([1.0, 0.0], [0.5, 0.5]),
2189
+ 0.46450140402245893)
2190
+ assert_almost_equal(jensenshannon([1.0, 0.0, 0.0], [1.0, 0.0, 0.0]), 0.0)
2191
+
2192
+ assert_almost_equal(jensenshannon([[1.0, 2.0]], [[0.5, 1.5]], axis=0),
2193
+ [0.0, 0.0])
2194
+ assert_almost_equal(jensenshannon([[1.0, 2.0]], [[0.5, 1.5]], axis=1),
2195
+ [0.0649045])
2196
+ assert_almost_equal(jensenshannon([[1.0, 2.0]], [[0.5, 1.5]], axis=0,
2197
+ keepdims=True), [[0.0, 0.0]])
2198
+ assert_almost_equal(jensenshannon([[1.0, 2.0]], [[0.5, 1.5]], axis=1,
2199
+ keepdims=True), [[0.0649045]])
2200
+
2201
+ a = np.array([[1, 2, 3, 4],
2202
+ [5, 6, 7, 8],
2203
+ [9, 10, 11, 12]])
2204
+ b = np.array([[13, 14, 15, 16],
2205
+ [17, 18, 19, 20],
2206
+ [21, 22, 23, 24]])
2207
+
2208
+ assert_almost_equal(jensenshannon(a, b, axis=0),
2209
+ [0.1954288, 0.1447697, 0.1138377, 0.0927636])
2210
+ assert_almost_equal(jensenshannon(a, b, axis=1),
2211
+ [0.1402339, 0.0399106, 0.0201815])
2212
+
2213
+
2214
+ def test_gh_17703():
2215
+ arr_1 = np.array([1, 0, 0])
2216
+ arr_2 = np.array([2, 0, 0])
2217
+ expected = dice(arr_1, arr_2)
2218
+ actual = pdist([arr_1, arr_2], metric='dice')
2219
+ assert_allclose(actual, expected)
2220
+ actual = cdist(np.atleast_2d(arr_1),
2221
+ np.atleast_2d(arr_2), metric='dice')
2222
+ assert_allclose(actual, expected)
2223
+
2224
+
2225
+ @pytest.mark.thread_unsafe
2226
+ def test_immutable_input(metric):
2227
+ if metric in ("jensenshannon", "mahalanobis", "seuclidean"):
2228
+ pytest.skip("not applicable")
2229
+ x = np.arange(10, dtype=np.float64)
2230
+ x.setflags(write=False)
2231
+ with maybe_deprecated(metric):
2232
+ getattr(scipy.spatial.distance, metric)(x, x, w=x)
2233
+
2234
+
2235
+ def test_gh_23109():
2236
+ a = np.array([0, 0, 1, 1])
2237
+ b = np.array([0, 1, 1, 0])
2238
+ w = np.asarray([1.5, 1.2, 0.7, 1.3])
2239
+ expected = yule(a, b, w=w)
2240
+ assert_allclose(expected, 1.1954022988505748)
2241
+ actual = cdist(np.atleast_2d(a),
2242
+ np.atleast_2d(b),
2243
+ metric='yule', w=w)
2244
+ assert_allclose(actual, expected)
2245
+
2246
+
2247
+ class TestJaccard:
2248
+
2249
+ def test_pdist_jaccard_random(self):
2250
+ eps = 1e-8
2251
+ X = eo['pdist-boolean-inp']
2252
+ Y_right = eo['pdist-jaccard']
2253
+ Y_test1 = wpdist(X, 'jaccard')
2254
+ assert_allclose(Y_test1, Y_right, rtol=eps)
2255
+
2256
+ def test_pdist_jaccard_random_float32(self):
2257
+ eps = 1e-8
2258
+ X = np.float32(eo['pdist-boolean-inp'])
2259
+ Y_right = eo['pdist-jaccard']
2260
+ Y_test1 = wpdist(X, 'jaccard')
2261
+ assert_allclose(Y_test1, Y_right, rtol=eps)
2262
+
2263
+ def test_pdist_jaccard_random_nonC(self):
2264
+ eps = 1e-8
2265
+ X = eo['pdist-boolean-inp']
2266
+ Y_right = eo['pdist-jaccard']
2267
+ Y_test2 = wpdist(X, 'test_jaccard')
2268
+ assert_allclose(Y_test2, Y_right, rtol=eps)
2269
+
2270
+ def test_pdist_djaccard_random(self):
2271
+ eps = 1e-8
2272
+ X = np.float64(eo['pdist-boolean-inp'])
2273
+ Y_right = eo['pdist-jaccard']
2274
+ Y_test1 = wpdist(X, 'jaccard')
2275
+ assert_allclose(Y_test1, Y_right, rtol=eps)
2276
+
2277
+ def test_pdist_djaccard_random_float32(self):
2278
+ eps = 1e-8
2279
+ X = np.float32(eo['pdist-boolean-inp'])
2280
+ Y_right = eo['pdist-jaccard']
2281
+ Y_test1 = wpdist(X, 'jaccard')
2282
+ assert_allclose(Y_test1, Y_right, rtol=eps)
2283
+
2284
+ def test_pdist_djaccard_allzeros(self):
2285
+ eps = 1e-15
2286
+ Y = pdist(np.zeros((5, 3)), 'jaccard')
2287
+ assert_allclose(np.zeros(10), Y, rtol=eps)
2288
+
2289
+ def test_pdist_djaccard_random_nonC(self):
2290
+ eps = 1e-8
2291
+ X = np.float64(eo['pdist-boolean-inp'])
2292
+ Y_right = eo['pdist-jaccard']
2293
+ Y_test2 = wpdist(X, 'test_jaccard')
2294
+ assert_allclose(Y_test2, Y_right, rtol=eps)
2295
+
2296
+ def test_pdist_djaccard_allzeros_nonC(self):
2297
+ eps = 1e-15
2298
+ Y = pdist(np.zeros((5, 3)), 'test_jaccard')
2299
+ assert_allclose(np.zeros(10), Y, rtol=eps)
2300
+
2301
+ def test_pdist_jaccard_mtica1(self):
2302
+ m = wjaccard(np.array([1, 0, 1, 1, 0]),
2303
+ np.array([1, 1, 0, 1, 1]))
2304
+ m2 = wjaccard(np.array([1, 0, 1, 1, 0], dtype=bool),
2305
+ np.array([1, 1, 0, 1, 1], dtype=bool))
2306
+ assert_allclose(m, 0.6, rtol=0, atol=1e-10)
2307
+ assert_allclose(m2, 0.6, rtol=0, atol=1e-10)
2308
+
2309
+ def test_pdist_jaccard_mtica2(self):
2310
+ m = wjaccard(np.array([1, 0, 1]),
2311
+ np.array([1, 1, 0]))
2312
+ m2 = wjaccard(np.array([1, 0, 1], dtype=bool),
2313
+ np.array([1, 1, 0], dtype=bool))
2314
+ assert_allclose(m, 2 / 3, rtol=0, atol=1e-10)
2315
+ assert_allclose(m2, 2 / 3, rtol=0, atol=1e-10)
2316
+
2317
+ def test_non_01_input(self):
2318
+ # Non-0/1 numeric input should be cast to bool before computation.
2319
+ # See gh-21176.
2320
+ x = np.array([-10, 2.5, 0]) # [True, True, False]
2321
+ y = np.array([ 2, -5, 2]) # [True, True, True]
2322
+ eps = np.finfo(float).eps
2323
+ assert_allclose(jaccard(x, y), 1/3, rtol=eps)
2324
+ assert_allclose(cdist([x], [y], 'jaccard'), [[1/3]])
2325
+ assert_allclose(pdist([x, y], 'jaccard'), [1/3])
2326
+
2327
+
2328
+ class TestChebyshev:
2329
+
2330
+ def test_pdist_chebyshev_random(self):
2331
+ eps = 1e-8
2332
+ X = eo['pdist-double-inp']
2333
+ Y_right = eo['pdist-chebyshev']
2334
+ Y_test1 = pdist(X, 'chebyshev')
2335
+ assert_allclose(Y_test1, Y_right, rtol=eps)
2336
+
2337
+ def test_pdist_chebyshev_random_float32(self):
2338
+ eps = 1e-7
2339
+ X = np.float32(eo['pdist-double-inp'])
2340
+ Y_right = eo['pdist-chebyshev']
2341
+ Y_test1 = pdist(X, 'chebyshev')
2342
+ assert_allclose(Y_test1, Y_right, rtol=eps, verbose=verbose > 2)
2343
+
2344
+ def test_pdist_chebyshev_random_nonC(self):
2345
+ eps = 1e-8
2346
+ X = eo['pdist-double-inp']
2347
+ Y_right = eo['pdist-chebyshev']
2348
+ Y_test2 = pdist(X, 'test_chebyshev')
2349
+ assert_allclose(Y_test2, Y_right, rtol=eps)
2350
+
2351
+ def test_pdist_chebyshev_iris(self):
2352
+ eps = 1e-14
2353
+ X = eo['iris']
2354
+ Y_right = eo['pdist-chebyshev-iris']
2355
+ Y_test1 = pdist(X, 'chebyshev')
2356
+ assert_allclose(Y_test1, Y_right, rtol=eps)
2357
+
2358
+ def test_pdist_chebyshev_iris_float32(self):
2359
+ eps = 1e-5
2360
+ X = np.float32(eo['iris'])
2361
+ Y_right = eo['pdist-chebyshev-iris']
2362
+ Y_test1 = pdist(X, 'chebyshev')
2363
+ assert_allclose(Y_test1, Y_right, rtol=eps, verbose=verbose > 2)
2364
+
2365
+ def test_pdist_chebyshev_iris_nonC(self):
2366
+ eps = 1e-14
2367
+ X = eo['iris']
2368
+ Y_right = eo['pdist-chebyshev-iris']
2369
+ Y_test2 = pdist(X, 'test_chebyshev')
2370
+ assert_allclose(Y_test2, Y_right, rtol=eps)
2371
+
2372
+ def test_weighted(self):
2373
+ # Basic test for weighted Chebyshev. Only components with non-zero
2374
+ # weight participate in the 'max'.
2375
+ x = [1, 2, 3]
2376
+ y = [6, 5, 4]
2377
+ w = [0, 1, 5]
2378
+ assert_equal(chebyshev(x, y, w), 3)
2379
+ assert_equal(pdist([x, y], 'chebyshev', w=w), [3])
2380
+ assert_equal(cdist([x], [y], 'chebyshev', w=w), [[3]])
2381
+
2382
+ def test_zero_weight(self):
2383
+ # If the weight is identically zero, the distance should be zero.
2384
+ x = [1, 2, 3]
2385
+ y = [6, 5, 4]
2386
+ w = [0, 0, 0]
2387
+ assert_equal(chebyshev(x, y, w), 0)
2388
+ assert_equal(pdist([x, y], 'chebyshev', w=w), [0])
2389
+ assert_equal(cdist([x], [y], 'chebyshev', w=w), [[0]])