scipy 1.15.3__cp312-cp312-win_amd64.whl → 1.16.0rc2__cp312-cp312-win_amd64.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 (759) hide show
  1. scipy/__config__.py +8 -8
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cp312-win_amd64.dll.a +0 -0
  4. scipy/_cyutility.cp312-win_amd64.pyd +0 -0
  5. scipy/_lib/_array_api.py +486 -161
  6. scipy/_lib/_array_api_compat_vendor.py +9 -0
  7. scipy/_lib/_bunch.py +4 -0
  8. scipy/_lib/_ccallback_c.cp312-win_amd64.dll.a +0 -0
  9. scipy/_lib/_ccallback_c.cp312-win_amd64.pyd +0 -0
  10. scipy/_lib/_docscrape.py +1 -1
  11. scipy/_lib/_elementwise_iterative_method.py +15 -26
  12. scipy/_lib/_fpumode.cp312-win_amd64.dll.a +0 -0
  13. scipy/_lib/_fpumode.cp312-win_amd64.pyd +0 -0
  14. scipy/_lib/_sparse.py +41 -0
  15. scipy/_lib/_test_ccallback.cp312-win_amd64.dll.a +0 -0
  16. scipy/_lib/_test_ccallback.cp312-win_amd64.pyd +0 -0
  17. scipy/_lib/_test_deprecation_call.cp312-win_amd64.dll.a +0 -0
  18. scipy/_lib/_test_deprecation_call.cp312-win_amd64.pyd +0 -0
  19. scipy/_lib/_test_deprecation_def.cp312-win_amd64.dll.a +0 -0
  20. scipy/_lib/_test_deprecation_def.cp312-win_amd64.pyd +0 -0
  21. scipy/_lib/_testutils.py +6 -2
  22. scipy/_lib/_uarray/_uarray.cp312-win_amd64.dll.a +0 -0
  23. scipy/_lib/_uarray/_uarray.cp312-win_amd64.pyd +0 -0
  24. scipy/_lib/_util.py +222 -125
  25. scipy/_lib/array_api_compat/__init__.py +4 -4
  26. scipy/_lib/array_api_compat/_internal.py +19 -6
  27. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  28. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  29. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  30. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  31. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  32. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  33. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  34. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  35. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  36. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  37. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  38. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  39. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  40. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  41. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  42. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  43. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  44. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  45. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  46. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  47. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  48. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  49. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  50. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  51. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  52. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  53. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  54. scipy/_lib/array_api_extra/__init__.py +26 -3
  55. scipy/_lib/array_api_extra/_delegation.py +171 -0
  56. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  57. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  58. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  59. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  60. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  61. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  62. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  63. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  64. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  65. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  66. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  67. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  68. scipy/_lib/array_api_extra/testing.py +359 -0
  69. scipy/_lib/decorator.py +2 -2
  70. scipy/_lib/doccer.py +1 -7
  71. scipy/_lib/messagestream.cp312-win_amd64.dll.a +0 -0
  72. scipy/_lib/messagestream.cp312-win_amd64.pyd +0 -0
  73. scipy/_lib/pyprima/__init__.py +212 -0
  74. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  75. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  76. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  77. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  78. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  79. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  80. scipy/_lib/pyprima/cobyla/update.py +289 -0
  81. scipy/_lib/pyprima/common/__init__.py +0 -0
  82. scipy/_lib/pyprima/common/_bounds.py +34 -0
  83. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  84. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  85. scipy/_lib/pyprima/common/_project.py +173 -0
  86. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  87. scipy/_lib/pyprima/common/consts.py +47 -0
  88. scipy/_lib/pyprima/common/evaluate.py +99 -0
  89. scipy/_lib/pyprima/common/history.py +38 -0
  90. scipy/_lib/pyprima/common/infos.py +30 -0
  91. scipy/_lib/pyprima/common/linalg.py +435 -0
  92. scipy/_lib/pyprima/common/message.py +290 -0
  93. scipy/_lib/pyprima/common/powalg.py +131 -0
  94. scipy/_lib/pyprima/common/preproc.py +277 -0
  95. scipy/_lib/pyprima/common/present.py +5 -0
  96. scipy/_lib/pyprima/common/ratio.py +54 -0
  97. scipy/_lib/pyprima/common/redrho.py +47 -0
  98. scipy/_lib/pyprima/common/selectx.py +296 -0
  99. scipy/_lib/tests/test__util.py +105 -121
  100. scipy/_lib/tests/test_array_api.py +166 -35
  101. scipy/_lib/tests/test_bunch.py +7 -0
  102. scipy/_lib/tests/test_ccallback.py +2 -10
  103. scipy/_lib/tests/test_public_api.py +13 -0
  104. scipy/cluster/_hierarchy.cp312-win_amd64.dll.a +0 -0
  105. scipy/cluster/_hierarchy.cp312-win_amd64.pyd +0 -0
  106. scipy/cluster/_optimal_leaf_ordering.cp312-win_amd64.dll.a +0 -0
  107. scipy/cluster/_optimal_leaf_ordering.cp312-win_amd64.pyd +0 -0
  108. scipy/cluster/_vq.cp312-win_amd64.dll.a +0 -0
  109. scipy/cluster/_vq.cp312-win_amd64.pyd +0 -0
  110. scipy/cluster/hierarchy.py +393 -223
  111. scipy/cluster/tests/test_hierarchy.py +273 -335
  112. scipy/cluster/tests/test_vq.py +45 -61
  113. scipy/cluster/vq.py +39 -35
  114. scipy/conftest.py +263 -157
  115. scipy/constants/_constants.py +4 -1
  116. scipy/constants/tests/test_codata.py +2 -2
  117. scipy/constants/tests/test_constants.py +11 -18
  118. scipy/datasets/_download_all.py +15 -1
  119. scipy/datasets/_fetchers.py +7 -1
  120. scipy/datasets/_utils.py +1 -1
  121. scipy/differentiate/_differentiate.py +25 -25
  122. scipy/differentiate/tests/test_differentiate.py +24 -25
  123. scipy/fft/_basic.py +20 -0
  124. scipy/fft/_helper.py +3 -34
  125. scipy/fft/_pocketfft/helper.py +29 -1
  126. scipy/fft/_pocketfft/pypocketfft.cp312-win_amd64.dll.a +0 -0
  127. scipy/fft/_pocketfft/pypocketfft.cp312-win_amd64.pyd +0 -0
  128. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  129. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  130. scipy/fft/_realtransforms.py +13 -0
  131. scipy/fft/tests/test_basic.py +27 -25
  132. scipy/fft/tests/test_fftlog.py +16 -7
  133. scipy/fft/tests/test_helper.py +18 -34
  134. scipy/fft/tests/test_real_transforms.py +8 -10
  135. scipy/fftpack/convolve.cp312-win_amd64.dll.a +0 -0
  136. scipy/fftpack/convolve.cp312-win_amd64.pyd +0 -0
  137. scipy/fftpack/tests/test_basic.py +2 -4
  138. scipy/fftpack/tests/test_real_transforms.py +8 -9
  139. scipy/integrate/_bvp.py +9 -3
  140. scipy/integrate/_cubature.py +3 -2
  141. scipy/integrate/_dop.cp312-win_amd64.dll.a +0 -0
  142. scipy/integrate/_dop.cp312-win_amd64.pyd +0 -0
  143. scipy/integrate/_lsoda.cp312-win_amd64.dll.a +0 -0
  144. scipy/integrate/_lsoda.cp312-win_amd64.pyd +0 -0
  145. scipy/integrate/_ode.py +9 -2
  146. scipy/integrate/_odepack.cp312-win_amd64.dll.a +0 -0
  147. scipy/integrate/_odepack.cp312-win_amd64.pyd +0 -0
  148. scipy/integrate/_quad_vec.py +21 -29
  149. scipy/integrate/_quadpack.cp312-win_amd64.dll.a +0 -0
  150. scipy/integrate/_quadpack.cp312-win_amd64.pyd +0 -0
  151. scipy/integrate/_quadpack_py.py +11 -7
  152. scipy/integrate/_quadrature.py +3 -3
  153. scipy/integrate/_rules/_base.py +2 -2
  154. scipy/integrate/_tanhsinh.py +48 -47
  155. scipy/integrate/_test_multivariate.cp312-win_amd64.dll.a +0 -0
  156. scipy/integrate/_test_multivariate.cp312-win_amd64.pyd +0 -0
  157. scipy/integrate/_test_odeint_banded.cp312-win_amd64.dll.a +0 -0
  158. scipy/integrate/_test_odeint_banded.cp312-win_amd64.pyd +0 -0
  159. scipy/integrate/_vode.cp312-win_amd64.dll.a +0 -0
  160. scipy/integrate/_vode.cp312-win_amd64.pyd +0 -0
  161. scipy/integrate/tests/test__quad_vec.py +0 -6
  162. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  163. scipy/integrate/tests/test_cubature.py +21 -35
  164. scipy/integrate/tests/test_quadrature.py +6 -8
  165. scipy/integrate/tests/test_tanhsinh.py +56 -48
  166. scipy/interpolate/__init__.py +70 -58
  167. scipy/interpolate/_bary_rational.py +22 -22
  168. scipy/interpolate/_bsplines.py +119 -66
  169. scipy/interpolate/_cubic.py +65 -50
  170. scipy/interpolate/_dfitpack.cp312-win_amd64.dll.a +0 -0
  171. scipy/interpolate/_dfitpack.cp312-win_amd64.pyd +0 -0
  172. scipy/interpolate/_dierckx.cp312-win_amd64.dll.a +0 -0
  173. scipy/interpolate/_dierckx.cp312-win_amd64.pyd +0 -0
  174. scipy/interpolate/_fitpack.cp312-win_amd64.dll.a +0 -0
  175. scipy/interpolate/_fitpack.cp312-win_amd64.pyd +0 -0
  176. scipy/interpolate/_fitpack2.py +9 -6
  177. scipy/interpolate/_fitpack_impl.py +32 -26
  178. scipy/interpolate/_fitpack_repro.py +23 -19
  179. scipy/interpolate/_interpnd.cp312-win_amd64.dll.a +0 -0
  180. scipy/interpolate/_interpnd.cp312-win_amd64.pyd +0 -0
  181. scipy/interpolate/_interpolate.py +30 -12
  182. scipy/interpolate/_ndbspline.py +13 -18
  183. scipy/interpolate/_ndgriddata.py +5 -8
  184. scipy/interpolate/_polyint.py +95 -31
  185. scipy/interpolate/_ppoly.cp312-win_amd64.dll.a +0 -0
  186. scipy/interpolate/_ppoly.cp312-win_amd64.pyd +0 -0
  187. scipy/interpolate/_rbf.py +2 -2
  188. scipy/interpolate/_rbfinterp.py +1 -1
  189. scipy/interpolate/_rbfinterp_pythran.cp312-win_amd64.dll.a +0 -0
  190. scipy/interpolate/_rbfinterp_pythran.cp312-win_amd64.pyd +0 -0
  191. scipy/interpolate/_rgi.py +31 -26
  192. scipy/interpolate/_rgi_cython.cp312-win_amd64.dll.a +0 -0
  193. scipy/interpolate/_rgi_cython.cp312-win_amd64.pyd +0 -0
  194. scipy/interpolate/dfitpack.py +0 -20
  195. scipy/interpolate/interpnd.py +1 -2
  196. scipy/interpolate/tests/test_bary_rational.py +2 -2
  197. scipy/interpolate/tests/test_bsplines.py +97 -1
  198. scipy/interpolate/tests/test_fitpack2.py +39 -1
  199. scipy/interpolate/tests/test_interpnd.py +32 -20
  200. scipy/interpolate/tests/test_interpolate.py +48 -4
  201. scipy/interpolate/tests/test_rgi.py +2 -1
  202. scipy/io/_fast_matrix_market/__init__.py +2 -0
  203. scipy/io/_fast_matrix_market/_fmm_core.cp312-win_amd64.dll.a +0 -0
  204. scipy/io/_fast_matrix_market/_fmm_core.cp312-win_amd64.pyd +0 -0
  205. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  206. scipy/io/_harwell_boeing/hb.py +7 -11
  207. scipy/io/_idl.py +5 -7
  208. scipy/io/_netcdf.py +15 -5
  209. scipy/io/_test_fortran.cp312-win_amd64.dll.a +0 -0
  210. scipy/io/_test_fortran.cp312-win_amd64.pyd +0 -0
  211. scipy/io/arff/tests/test_arffread.py +3 -3
  212. scipy/io/matlab/__init__.py +5 -3
  213. scipy/io/matlab/_mio.py +4 -1
  214. scipy/io/matlab/_mio5.py +19 -13
  215. scipy/io/matlab/_mio5_utils.cp312-win_amd64.dll.a +0 -0
  216. scipy/io/matlab/_mio5_utils.cp312-win_amd64.pyd +0 -0
  217. scipy/io/matlab/_mio_utils.cp312-win_amd64.dll.a +0 -0
  218. scipy/io/matlab/_mio_utils.cp312-win_amd64.pyd +0 -0
  219. scipy/io/matlab/_miobase.py +4 -1
  220. scipy/io/matlab/_streams.cp312-win_amd64.dll.a +0 -0
  221. scipy/io/matlab/_streams.cp312-win_amd64.pyd +0 -0
  222. scipy/io/matlab/tests/test_mio.py +46 -18
  223. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  224. scipy/io/tests/test_mmio.py +7 -1
  225. scipy/io/tests/test_wavfile.py +41 -0
  226. scipy/io/wavfile.py +57 -10
  227. scipy/linalg/_basic.py +113 -86
  228. scipy/linalg/_cythonized_array_utils.cp312-win_amd64.dll.a +0 -0
  229. scipy/linalg/_cythonized_array_utils.cp312-win_amd64.pyd +0 -0
  230. scipy/linalg/_decomp.py +22 -9
  231. scipy/linalg/_decomp_cholesky.py +28 -13
  232. scipy/linalg/_decomp_cossin.py +45 -30
  233. scipy/linalg/_decomp_interpolative.cp312-win_amd64.dll.a +0 -0
  234. scipy/linalg/_decomp_interpolative.cp312-win_amd64.pyd +0 -0
  235. scipy/linalg/_decomp_ldl.py +4 -1
  236. scipy/linalg/_decomp_lu.py +18 -6
  237. scipy/linalg/_decomp_lu_cython.cp312-win_amd64.dll.a +0 -0
  238. scipy/linalg/_decomp_lu_cython.cp312-win_amd64.pyd +0 -0
  239. scipy/linalg/_decomp_polar.py +2 -0
  240. scipy/linalg/_decomp_qr.py +6 -2
  241. scipy/linalg/_decomp_qz.py +3 -0
  242. scipy/linalg/_decomp_schur.py +3 -1
  243. scipy/linalg/_decomp_svd.py +13 -2
  244. scipy/linalg/_decomp_update.cp312-win_amd64.dll.a +0 -0
  245. scipy/linalg/_decomp_update.cp312-win_amd64.pyd +0 -0
  246. scipy/linalg/_expm_frechet.py +4 -0
  247. scipy/linalg/_fblas.cp312-win_amd64.dll.a +0 -0
  248. scipy/linalg/_fblas.cp312-win_amd64.pyd +0 -0
  249. scipy/linalg/_flapack.cp312-win_amd64.dll.a +0 -0
  250. scipy/linalg/_flapack.cp312-win_amd64.pyd +0 -0
  251. scipy/linalg/_linalg_pythran.cp312-win_amd64.dll.a +0 -0
  252. scipy/linalg/_linalg_pythran.cp312-win_amd64.pyd +0 -0
  253. scipy/linalg/_matfuncs.py +187 -4
  254. scipy/linalg/_matfuncs_expm.cp312-win_amd64.dll.a +0 -0
  255. scipy/linalg/_matfuncs_expm.cp312-win_amd64.pyd +0 -0
  256. scipy/linalg/_matfuncs_schur_sqrtm.cp312-win_amd64.dll.a +0 -0
  257. scipy/linalg/_matfuncs_schur_sqrtm.cp312-win_amd64.pyd +0 -0
  258. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  259. scipy/linalg/_matfuncs_sqrtm_triu.cp312-win_amd64.dll.a +0 -0
  260. scipy/linalg/_matfuncs_sqrtm_triu.cp312-win_amd64.pyd +0 -0
  261. scipy/linalg/_procrustes.py +2 -0
  262. scipy/linalg/_sketches.py +17 -6
  263. scipy/linalg/_solve_toeplitz.cp312-win_amd64.dll.a +0 -0
  264. scipy/linalg/_solve_toeplitz.cp312-win_amd64.pyd +0 -0
  265. scipy/linalg/_solvers.py +7 -2
  266. scipy/linalg/_special_matrices.py +26 -36
  267. scipy/linalg/cython_blas.cp312-win_amd64.dll.a +0 -0
  268. scipy/linalg/cython_blas.cp312-win_amd64.pyd +0 -0
  269. scipy/linalg/cython_lapack.cp312-win_amd64.dll.a +0 -0
  270. scipy/linalg/cython_lapack.cp312-win_amd64.pyd +0 -0
  271. scipy/linalg/lapack.py +22 -2
  272. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  273. scipy/linalg/tests/test_basic.py +31 -16
  274. scipy/linalg/tests/test_batch.py +588 -0
  275. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  276. scipy/linalg/tests/test_decomp.py +40 -3
  277. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  278. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  279. scipy/linalg/tests/test_lapack.py +115 -7
  280. scipy/linalg/tests/test_matfuncs.py +157 -102
  281. scipy/linalg/tests/test_procrustes.py +0 -7
  282. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  283. scipy/linalg/tests/test_special_matrices.py +1 -5
  284. scipy/ndimage/__init__.py +1 -0
  285. scipy/ndimage/_ctest.cp312-win_amd64.dll.a +0 -0
  286. scipy/ndimage/_ctest.cp312-win_amd64.pyd +0 -0
  287. scipy/ndimage/_cytest.cp312-win_amd64.dll.a +0 -0
  288. scipy/ndimage/_cytest.cp312-win_amd64.pyd +0 -0
  289. scipy/ndimage/_delegators.py +8 -2
  290. scipy/ndimage/_filters.py +453 -5
  291. scipy/ndimage/_interpolation.py +36 -6
  292. scipy/ndimage/_measurements.py +4 -2
  293. scipy/ndimage/_morphology.py +5 -0
  294. scipy/ndimage/_nd_image.cp312-win_amd64.dll.a +0 -0
  295. scipy/ndimage/_nd_image.cp312-win_amd64.pyd +0 -0
  296. scipy/ndimage/_ni_docstrings.py +5 -1
  297. scipy/ndimage/_ni_label.cp312-win_amd64.dll.a +0 -0
  298. scipy/ndimage/_ni_label.cp312-win_amd64.pyd +0 -0
  299. scipy/ndimage/_ni_support.py +1 -5
  300. scipy/ndimage/_rank_filter_1d.cp312-win_amd64.dll.a +0 -0
  301. scipy/ndimage/_rank_filter_1d.cp312-win_amd64.pyd +0 -0
  302. scipy/ndimage/_support_alternative_backends.py +18 -6
  303. scipy/ndimage/tests/test_filters.py +370 -259
  304. scipy/ndimage/tests/test_fourier.py +7 -9
  305. scipy/ndimage/tests/test_interpolation.py +68 -61
  306. scipy/ndimage/tests/test_measurements.py +18 -35
  307. scipy/ndimage/tests/test_morphology.py +143 -131
  308. scipy/ndimage/tests/test_splines.py +1 -3
  309. scipy/odr/__odrpack.cp312-win_amd64.dll.a +0 -0
  310. scipy/odr/__odrpack.cp312-win_amd64.pyd +0 -0
  311. scipy/optimize/_basinhopping.py +13 -7
  312. scipy/optimize/_bglu_dense.cp312-win_amd64.dll.a +0 -0
  313. scipy/optimize/_bglu_dense.cp312-win_amd64.pyd +0 -0
  314. scipy/optimize/_bracket.py +17 -24
  315. scipy/optimize/_chandrupatla.py +9 -10
  316. scipy/optimize/_cobyla_py.py +104 -123
  317. scipy/optimize/_constraints.py +14 -10
  318. scipy/optimize/_differentiable_functions.py +371 -230
  319. scipy/optimize/_differentialevolution.py +4 -3
  320. scipy/optimize/_direct.cp312-win_amd64.dll.a +0 -0
  321. scipy/optimize/_direct.cp312-win_amd64.pyd +0 -0
  322. scipy/optimize/_dual_annealing.py +1 -1
  323. scipy/optimize/_elementwise.py +1 -4
  324. scipy/optimize/_group_columns.cp312-win_amd64.dll.a +0 -0
  325. scipy/optimize/_group_columns.cp312-win_amd64.pyd +0 -0
  326. scipy/optimize/_highspy/_core.cp312-win_amd64.dll.a +0 -0
  327. scipy/optimize/_highspy/_core.cp312-win_amd64.pyd +0 -0
  328. scipy/optimize/_highspy/_highs_options.cp312-win_amd64.dll.a +0 -0
  329. scipy/optimize/_highspy/_highs_options.cp312-win_amd64.pyd +0 -0
  330. scipy/optimize/_lbfgsb.cp312-win_amd64.dll.a +0 -0
  331. scipy/optimize/_lbfgsb.cp312-win_amd64.pyd +0 -0
  332. scipy/optimize/_lbfgsb_py.py +57 -16
  333. scipy/optimize/_linprog_doc.py +2 -2
  334. scipy/optimize/_linprog_highs.py +2 -2
  335. scipy/optimize/_linprog_ip.py +25 -10
  336. scipy/optimize/_linprog_util.py +14 -16
  337. scipy/optimize/_lsap.cp312-win_amd64.dll.a +0 -0
  338. scipy/optimize/_lsap.cp312-win_amd64.pyd +0 -0
  339. scipy/optimize/_lsq/common.py +3 -3
  340. scipy/optimize/_lsq/dogbox.py +16 -2
  341. scipy/optimize/_lsq/givens_elimination.cp312-win_amd64.dll.a +0 -0
  342. scipy/optimize/_lsq/givens_elimination.cp312-win_amd64.pyd +0 -0
  343. scipy/optimize/_lsq/least_squares.py +198 -126
  344. scipy/optimize/_lsq/lsq_linear.py +6 -6
  345. scipy/optimize/_lsq/trf.py +35 -8
  346. scipy/optimize/_milp.py +3 -1
  347. scipy/optimize/_minimize.py +105 -36
  348. scipy/optimize/_minpack.cp312-win_amd64.dll.a +0 -0
  349. scipy/optimize/_minpack.cp312-win_amd64.pyd +0 -0
  350. scipy/optimize/_minpack_py.py +21 -14
  351. scipy/optimize/_moduleTNC.cp312-win_amd64.dll.a +0 -0
  352. scipy/optimize/_moduleTNC.cp312-win_amd64.pyd +0 -0
  353. scipy/optimize/_nnls.py +20 -21
  354. scipy/optimize/_nonlin.py +34 -3
  355. scipy/optimize/_numdiff.py +288 -110
  356. scipy/optimize/_optimize.py +86 -48
  357. scipy/optimize/_pava_pybind.cp312-win_amd64.dll.a +0 -0
  358. scipy/optimize/_pava_pybind.cp312-win_amd64.pyd +0 -0
  359. scipy/optimize/_remove_redundancy.py +5 -5
  360. scipy/optimize/_root_scalar.py +1 -1
  361. scipy/optimize/_shgo.py +6 -0
  362. scipy/optimize/_shgo_lib/_complex.py +1 -1
  363. scipy/optimize/_slsqp_py.py +216 -124
  364. scipy/optimize/_slsqplib.cp312-win_amd64.dll.a +0 -0
  365. scipy/optimize/_slsqplib.cp312-win_amd64.pyd +0 -0
  366. scipy/optimize/_spectral.py +1 -1
  367. scipy/optimize/_tnc.py +8 -1
  368. scipy/optimize/_trlib/_trlib.cp312-win_amd64.dll.a +0 -0
  369. scipy/optimize/_trlib/_trlib.cp312-win_amd64.pyd +0 -0
  370. scipy/optimize/_trustregion.py +20 -6
  371. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  372. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  373. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  374. scipy/optimize/_trustregion_constr/projections.py +12 -8
  375. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  376. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  377. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  378. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  379. scipy/optimize/_trustregion_exact.py +0 -1
  380. scipy/optimize/_zeros.cp312-win_amd64.dll.a +0 -0
  381. scipy/optimize/_zeros.cp312-win_amd64.pyd +0 -0
  382. scipy/optimize/_zeros_py.py +97 -17
  383. scipy/optimize/cython_optimize/_zeros.cp312-win_amd64.dll.a +0 -0
  384. scipy/optimize/cython_optimize/_zeros.cp312-win_amd64.pyd +0 -0
  385. scipy/optimize/slsqp.py +0 -1
  386. scipy/optimize/tests/test__basinhopping.py +1 -1
  387. scipy/optimize/tests/test__differential_evolution.py +4 -4
  388. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  389. scipy/optimize/tests/test__numdiff.py +66 -22
  390. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  391. scipy/optimize/tests/test__shgo.py +9 -1
  392. scipy/optimize/tests/test_bracket.py +36 -46
  393. scipy/optimize/tests/test_chandrupatla.py +133 -135
  394. scipy/optimize/tests/test_cobyla.py +74 -45
  395. scipy/optimize/tests/test_constraints.py +1 -1
  396. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  397. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  398. scipy/optimize/tests/test_least_squares.py +125 -13
  399. scipy/optimize/tests/test_linear_assignment.py +3 -3
  400. scipy/optimize/tests/test_linprog.py +3 -3
  401. scipy/optimize/tests/test_lsq_linear.py +6 -6
  402. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  403. scipy/optimize/tests/test_minpack.py +4 -4
  404. scipy/optimize/tests/test_nnls.py +43 -3
  405. scipy/optimize/tests/test_nonlin.py +36 -0
  406. scipy/optimize/tests/test_optimize.py +95 -17
  407. scipy/optimize/tests/test_slsqp.py +36 -4
  408. scipy/optimize/tests/test_zeros.py +34 -1
  409. scipy/signal/__init__.py +12 -23
  410. scipy/signal/_delegators.py +568 -0
  411. scipy/signal/_filter_design.py +459 -241
  412. scipy/signal/_fir_filter_design.py +262 -90
  413. scipy/signal/_lti_conversion.py +3 -2
  414. scipy/signal/_ltisys.py +118 -91
  415. scipy/signal/_max_len_seq_inner.cp312-win_amd64.dll.a +0 -0
  416. scipy/signal/_max_len_seq_inner.cp312-win_amd64.pyd +0 -0
  417. scipy/signal/_peak_finding_utils.cp312-win_amd64.dll.a +0 -0
  418. scipy/signal/_peak_finding_utils.cp312-win_amd64.pyd +0 -0
  419. scipy/signal/_polyutils.py +172 -0
  420. scipy/signal/_short_time_fft.py +519 -70
  421. scipy/signal/_signal_api.py +30 -0
  422. scipy/signal/_signaltools.py +719 -399
  423. scipy/signal/_sigtools.cp312-win_amd64.dll.a +0 -0
  424. scipy/signal/_sigtools.cp312-win_amd64.pyd +0 -0
  425. scipy/signal/_sosfilt.cp312-win_amd64.dll.a +0 -0
  426. scipy/signal/_sosfilt.cp312-win_amd64.pyd +0 -0
  427. scipy/signal/_spectral_py.py +230 -50
  428. scipy/signal/_spline.cp312-win_amd64.dll.a +0 -0
  429. scipy/signal/_spline.cp312-win_amd64.pyd +0 -0
  430. scipy/signal/_spline_filters.py +108 -68
  431. scipy/signal/_support_alternative_backends.py +73 -0
  432. scipy/signal/_upfirdn.py +4 -1
  433. scipy/signal/_upfirdn_apply.cp312-win_amd64.dll.a +0 -0
  434. scipy/signal/_upfirdn_apply.cp312-win_amd64.pyd +0 -0
  435. scipy/signal/_waveforms.py +2 -11
  436. scipy/signal/_wavelets.py +1 -1
  437. scipy/signal/fir_filter_design.py +1 -0
  438. scipy/signal/spline.py +4 -11
  439. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  440. scipy/signal/tests/test_bsplines.py +114 -79
  441. scipy/signal/tests/test_cont2discrete.py +9 -2
  442. scipy/signal/tests/test_filter_design.py +721 -481
  443. scipy/signal/tests/test_fir_filter_design.py +332 -140
  444. scipy/signal/tests/test_savitzky_golay.py +4 -3
  445. scipy/signal/tests/test_short_time_fft.py +221 -3
  446. scipy/signal/tests/test_signaltools.py +2144 -1348
  447. scipy/signal/tests/test_spectral.py +50 -6
  448. scipy/signal/tests/test_splines.py +161 -96
  449. scipy/signal/tests/test_upfirdn.py +84 -50
  450. scipy/signal/tests/test_waveforms.py +20 -0
  451. scipy/signal/tests/test_windows.py +607 -466
  452. scipy/signal/windows/_windows.py +287 -148
  453. scipy/sparse/__init__.py +23 -4
  454. scipy/sparse/_base.py +270 -108
  455. scipy/sparse/_bsr.py +7 -4
  456. scipy/sparse/_compressed.py +59 -231
  457. scipy/sparse/_construct.py +90 -38
  458. scipy/sparse/_coo.py +115 -181
  459. scipy/sparse/_csc.py +4 -4
  460. scipy/sparse/_csparsetools.cp312-win_amd64.dll.a +0 -0
  461. scipy/sparse/_csparsetools.cp312-win_amd64.pyd +0 -0
  462. scipy/sparse/_csr.py +2 -2
  463. scipy/sparse/_data.py +48 -48
  464. scipy/sparse/_dia.py +105 -18
  465. scipy/sparse/_dok.py +0 -23
  466. scipy/sparse/_index.py +4 -4
  467. scipy/sparse/_matrix.py +23 -0
  468. scipy/sparse/_sparsetools.cp312-win_amd64.dll.a +0 -0
  469. scipy/sparse/_sparsetools.cp312-win_amd64.pyd +0 -0
  470. scipy/sparse/_sputils.py +37 -22
  471. scipy/sparse/base.py +0 -9
  472. scipy/sparse/bsr.py +0 -14
  473. scipy/sparse/compressed.py +0 -23
  474. scipy/sparse/construct.py +0 -6
  475. scipy/sparse/coo.py +0 -14
  476. scipy/sparse/csc.py +0 -3
  477. scipy/sparse/csgraph/_flow.cp312-win_amd64.dll.a +0 -0
  478. scipy/sparse/csgraph/_flow.cp312-win_amd64.pyd +0 -0
  479. scipy/sparse/csgraph/_matching.cp312-win_amd64.dll.a +0 -0
  480. scipy/sparse/csgraph/_matching.cp312-win_amd64.pyd +0 -0
  481. scipy/sparse/csgraph/_min_spanning_tree.cp312-win_amd64.dll.a +0 -0
  482. scipy/sparse/csgraph/_min_spanning_tree.cp312-win_amd64.pyd +0 -0
  483. scipy/sparse/csgraph/_reordering.cp312-win_amd64.dll.a +0 -0
  484. scipy/sparse/csgraph/_reordering.cp312-win_amd64.pyd +0 -0
  485. scipy/sparse/csgraph/_shortest_path.cp312-win_amd64.dll.a +0 -0
  486. scipy/sparse/csgraph/_shortest_path.cp312-win_amd64.pyd +0 -0
  487. scipy/sparse/csgraph/_tools.cp312-win_amd64.dll.a +0 -0
  488. scipy/sparse/csgraph/_tools.cp312-win_amd64.pyd +0 -0
  489. scipy/sparse/csgraph/_traversal.cp312-win_amd64.dll.a +0 -0
  490. scipy/sparse/csgraph/_traversal.cp312-win_amd64.pyd +0 -0
  491. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  492. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  493. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  494. scipy/sparse/csr.py +0 -5
  495. scipy/sparse/data.py +1 -6
  496. scipy/sparse/dia.py +0 -7
  497. scipy/sparse/dok.py +0 -10
  498. scipy/sparse/linalg/_dsolve/_superlu.cp312-win_amd64.dll.a +0 -0
  499. scipy/sparse/linalg/_dsolve/_superlu.cp312-win_amd64.pyd +0 -0
  500. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  501. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  502. scipy/sparse/linalg/_eigen/arpack/_arpack.cp312-win_amd64.dll.a +0 -0
  503. scipy/sparse/linalg/_eigen/arpack/_arpack.cp312-win_amd64.pyd +0 -0
  504. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  505. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  506. scipy/sparse/linalg/_interface.py +17 -18
  507. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  508. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  509. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  510. scipy/sparse/linalg/_isolve/minres.py +5 -5
  511. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  512. scipy/sparse/linalg/_isolve/utils.py +2 -8
  513. scipy/sparse/linalg/_matfuncs.py +1 -1
  514. scipy/sparse/linalg/_norm.py +1 -1
  515. scipy/sparse/linalg/_propack/_cpropack.cp312-win_amd64.dll.a +0 -0
  516. scipy/sparse/linalg/_propack/_cpropack.cp312-win_amd64.pyd +0 -0
  517. scipy/sparse/linalg/_propack/_dpropack.cp312-win_amd64.dll.a +0 -0
  518. scipy/sparse/linalg/_propack/_dpropack.cp312-win_amd64.pyd +0 -0
  519. scipy/sparse/linalg/_propack/_spropack.cp312-win_amd64.dll.a +0 -0
  520. scipy/sparse/linalg/_propack/_spropack.cp312-win_amd64.pyd +0 -0
  521. scipy/sparse/linalg/_propack/_zpropack.cp312-win_amd64.dll.a +0 -0
  522. scipy/sparse/linalg/_propack/_zpropack.cp312-win_amd64.pyd +0 -0
  523. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  524. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  525. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  526. scipy/sparse/tests/test_base.py +214 -42
  527. scipy/sparse/tests/test_common1d.py +7 -7
  528. scipy/sparse/tests/test_construct.py +1 -1
  529. scipy/sparse/tests/test_coo.py +272 -4
  530. scipy/sparse/tests/test_sparsetools.py +5 -0
  531. scipy/sparse/tests/test_sputils.py +36 -7
  532. scipy/spatial/_ckdtree.cp312-win_amd64.dll.a +0 -0
  533. scipy/spatial/_ckdtree.cp312-win_amd64.pyd +0 -0
  534. scipy/spatial/_distance_pybind.cp312-win_amd64.dll.a +0 -0
  535. scipy/spatial/_distance_pybind.cp312-win_amd64.pyd +0 -0
  536. scipy/spatial/_distance_wrap.cp312-win_amd64.dll.a +0 -0
  537. scipy/spatial/_distance_wrap.cp312-win_amd64.pyd +0 -0
  538. scipy/spatial/_hausdorff.cp312-win_amd64.dll.a +0 -0
  539. scipy/spatial/_hausdorff.cp312-win_amd64.pyd +0 -0
  540. scipy/spatial/_qhull.cp312-win_amd64.dll.a +0 -0
  541. scipy/spatial/_qhull.cp312-win_amd64.pyd +0 -0
  542. scipy/spatial/_voronoi.cp312-win_amd64.dll.a +0 -0
  543. scipy/spatial/_voronoi.cp312-win_amd64.pyd +0 -0
  544. scipy/spatial/distance.py +49 -42
  545. scipy/spatial/tests/test_distance.py +15 -1
  546. scipy/spatial/tests/test_kdtree.py +1 -0
  547. scipy/spatial/tests/test_qhull.py +7 -2
  548. scipy/spatial/transform/__init__.py +5 -3
  549. scipy/spatial/transform/_rigid_transform.cp312-win_amd64.dll.a +0 -0
  550. scipy/spatial/transform/_rigid_transform.cp312-win_amd64.pyd +0 -0
  551. scipy/spatial/transform/_rotation.cp312-win_amd64.dll.a +0 -0
  552. scipy/spatial/transform/_rotation.cp312-win_amd64.pyd +0 -0
  553. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  554. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  555. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  556. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  557. scipy/special/__init__.py +1 -47
  558. scipy/special/_add_newdocs.py +34 -772
  559. scipy/special/_basic.py +22 -25
  560. scipy/special/_comb.cp312-win_amd64.dll.a +0 -0
  561. scipy/special/_comb.cp312-win_amd64.pyd +0 -0
  562. scipy/special/_ellip_harm_2.cp312-win_amd64.dll.a +0 -0
  563. scipy/special/_ellip_harm_2.cp312-win_amd64.pyd +0 -0
  564. scipy/special/_gufuncs.cp312-win_amd64.dll.a +0 -0
  565. scipy/special/_gufuncs.cp312-win_amd64.pyd +0 -0
  566. scipy/special/_logsumexp.py +67 -58
  567. scipy/special/_orthogonal.pyi +1 -1
  568. scipy/special/_specfun.cp312-win_amd64.dll.a +0 -0
  569. scipy/special/_specfun.cp312-win_amd64.pyd +0 -0
  570. scipy/special/_special_ufuncs.cp312-win_amd64.dll.a +0 -0
  571. scipy/special/_special_ufuncs.cp312-win_amd64.pyd +0 -0
  572. scipy/special/_spherical_bessel.py +4 -4
  573. scipy/special/_support_alternative_backends.py +212 -119
  574. scipy/special/_test_internal.cp312-win_amd64.dll.a +0 -0
  575. scipy/special/_test_internal.cp312-win_amd64.pyd +0 -0
  576. scipy/special/_testutils.py +4 -4
  577. scipy/special/_ufuncs.cp312-win_amd64.dll.a +0 -0
  578. scipy/special/_ufuncs.cp312-win_amd64.pyd +0 -0
  579. scipy/special/_ufuncs.pyi +1 -0
  580. scipy/special/_ufuncs.pyx +215 -1400
  581. scipy/special/_ufuncs_cxx.cp312-win_amd64.dll.a +0 -0
  582. scipy/special/_ufuncs_cxx.cp312-win_amd64.pyd +0 -0
  583. scipy/special/_ufuncs_cxx.pxd +2 -15
  584. scipy/special/_ufuncs_cxx.pyx +5 -44
  585. scipy/special/_ufuncs_cxx_defs.h +2 -16
  586. scipy/special/_ufuncs_defs.h +0 -8
  587. scipy/special/cython_special.cp312-win_amd64.dll.a +0 -0
  588. scipy/special/cython_special.cp312-win_amd64.pyd +0 -0
  589. scipy/special/cython_special.pxd +1 -1
  590. scipy/special/tests/_cython_examples/meson.build +10 -1
  591. scipy/special/tests/test_basic.py +153 -20
  592. scipy/special/tests/test_boost_ufuncs.py +3 -0
  593. scipy/special/tests/test_cdflib.py +35 -11
  594. scipy/special/tests/test_gammainc.py +16 -0
  595. scipy/special/tests/test_hyp2f1.py +2 -2
  596. scipy/special/tests/test_log1mexp.py +85 -0
  597. scipy/special/tests/test_logsumexp.py +206 -64
  598. scipy/special/tests/test_mpmath.py +1 -0
  599. scipy/special/tests/test_nan_inputs.py +1 -1
  600. scipy/special/tests/test_orthogonal.py +17 -18
  601. scipy/special/tests/test_sf_error.py +3 -2
  602. scipy/special/tests/test_sph_harm.py +6 -7
  603. scipy/special/tests/test_support_alternative_backends.py +211 -76
  604. scipy/stats/__init__.py +4 -1
  605. scipy/stats/_ansari_swilk_statistics.cp312-win_amd64.dll.a +0 -0
  606. scipy/stats/_ansari_swilk_statistics.cp312-win_amd64.pyd +0 -0
  607. scipy/stats/_axis_nan_policy.py +5 -12
  608. scipy/stats/_biasedurn.cp312-win_amd64.dll.a +0 -0
  609. scipy/stats/_biasedurn.cp312-win_amd64.pyd +0 -0
  610. scipy/stats/_continued_fraction.py +387 -0
  611. scipy/stats/_continuous_distns.py +277 -310
  612. scipy/stats/_correlation.py +1 -1
  613. scipy/stats/_covariance.py +6 -3
  614. scipy/stats/_discrete_distns.py +39 -32
  615. scipy/stats/_distn_infrastructure.py +39 -12
  616. scipy/stats/_distribution_infrastructure.py +900 -238
  617. scipy/stats/_entropy.py +9 -10
  618. scipy/{_lib → stats}/_finite_differences.py +1 -1
  619. scipy/stats/_hypotests.py +83 -50
  620. scipy/stats/_kde.py +53 -49
  621. scipy/stats/_ksstats.py +1 -1
  622. scipy/stats/_levy_stable/__init__.py +7 -15
  623. scipy/stats/_levy_stable/levyst.cp312-win_amd64.dll.a +0 -0
  624. scipy/stats/_levy_stable/levyst.cp312-win_amd64.pyd +0 -0
  625. scipy/stats/_morestats.py +118 -73
  626. scipy/stats/_mstats_basic.py +13 -17
  627. scipy/stats/_mstats_extras.py +8 -8
  628. scipy/stats/_multivariate.py +89 -113
  629. scipy/stats/_new_distributions.py +97 -20
  630. scipy/stats/_page_trend_test.py +12 -5
  631. scipy/stats/_probability_distribution.py +265 -43
  632. scipy/stats/_qmc.py +14 -9
  633. scipy/stats/_qmc_cy.cp312-win_amd64.dll.a +0 -0
  634. scipy/stats/_qmc_cy.cp312-win_amd64.pyd +0 -0
  635. scipy/stats/_qmvnt.py +16 -95
  636. scipy/stats/_qmvnt_cy.cp312-win_amd64.dll.a +0 -0
  637. scipy/stats/_qmvnt_cy.cp312-win_amd64.pyd +0 -0
  638. scipy/stats/_quantile.py +335 -0
  639. scipy/stats/_rcont/rcont.cp312-win_amd64.dll.a +0 -0
  640. scipy/stats/_rcont/rcont.cp312-win_amd64.pyd +0 -0
  641. scipy/stats/_resampling.py +4 -29
  642. scipy/stats/_sampling.py +1 -1
  643. scipy/stats/_sobol.cp312-win_amd64.dll.a +0 -0
  644. scipy/stats/_sobol.cp312-win_amd64.pyd +0 -0
  645. scipy/stats/_stats.cp312-win_amd64.dll.a +0 -0
  646. scipy/stats/_stats.cp312-win_amd64.pyd +0 -0
  647. scipy/stats/_stats_mstats_common.py +21 -2
  648. scipy/stats/_stats_py.py +550 -476
  649. scipy/stats/_stats_pythran.cp312-win_amd64.dll.a +0 -0
  650. scipy/stats/_stats_pythran.cp312-win_amd64.pyd +0 -0
  651. scipy/stats/_unuran/unuran_wrapper.cp312-win_amd64.dll.a +0 -0
  652. scipy/stats/_unuran/unuran_wrapper.cp312-win_amd64.pyd +0 -0
  653. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  654. scipy/stats/_variation.py +6 -8
  655. scipy/stats/_wilcoxon.py +13 -7
  656. scipy/stats/tests/common_tests.py +6 -4
  657. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  658. scipy/stats/tests/test_continued_fraction.py +173 -0
  659. scipy/stats/tests/test_continuous.py +379 -60
  660. scipy/stats/tests/test_continuous_basic.py +18 -12
  661. scipy/stats/tests/test_discrete_basic.py +14 -8
  662. scipy/stats/tests/test_discrete_distns.py +16 -16
  663. scipy/stats/tests/test_distributions.py +95 -75
  664. scipy/stats/tests/test_entropy.py +40 -48
  665. scipy/stats/tests/test_fit.py +4 -3
  666. scipy/stats/tests/test_hypotests.py +153 -24
  667. scipy/stats/tests/test_kdeoth.py +109 -41
  668. scipy/stats/tests/test_marray.py +289 -0
  669. scipy/stats/tests/test_morestats.py +79 -47
  670. scipy/stats/tests/test_mstats_basic.py +3 -3
  671. scipy/stats/tests/test_multivariate.py +434 -83
  672. scipy/stats/tests/test_qmc.py +13 -10
  673. scipy/stats/tests/test_quantile.py +199 -0
  674. scipy/stats/tests/test_rank.py +119 -112
  675. scipy/stats/tests/test_resampling.py +47 -56
  676. scipy/stats/tests/test_sampling.py +9 -4
  677. scipy/stats/tests/test_stats.py +799 -939
  678. scipy/stats/tests/test_variation.py +8 -6
  679. scipy/version.py +2 -2
  680. scipy-1.16.0rc2.dist-info/DELVEWHEEL +2 -0
  681. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  682. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  683. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +685 -693
  684. scipy/_lib/array_api_extra/_funcs.py +0 -484
  685. scipy/_lib/array_api_extra/_typing.py +0 -8
  686. scipy/interpolate/_bspl.cp312-win_amd64.dll.a +0 -0
  687. scipy/interpolate/_bspl.cp312-win_amd64.pyd +0 -0
  688. scipy/optimize/_cobyla.cp312-win_amd64.dll.a +0 -0
  689. scipy/optimize/_cobyla.cp312-win_amd64.pyd +0 -0
  690. scipy/optimize/_cython_nnls.cp312-win_amd64.dll.a +0 -0
  691. scipy/optimize/_cython_nnls.cp312-win_amd64.pyd +0 -0
  692. scipy/optimize/_slsqp.cp312-win_amd64.dll.a +0 -0
  693. scipy/optimize/_slsqp.cp312-win_amd64.pyd +0 -0
  694. scipy/spatial/qhull_src/COPYING.txt +0 -38
  695. scipy/special/libsf_error_state.dll +0 -0
  696. scipy/special/libsf_error_state.dll.a +0 -0
  697. scipy/special/tests/test_log_softmax.py +0 -109
  698. scipy/special/tests/test_xsf_cuda.py +0 -114
  699. scipy/special/xsf/binom.h +0 -89
  700. scipy/special/xsf/cdflib.h +0 -100
  701. scipy/special/xsf/cephes/airy.h +0 -307
  702. scipy/special/xsf/cephes/besselpoly.h +0 -51
  703. scipy/special/xsf/cephes/beta.h +0 -257
  704. scipy/special/xsf/cephes/cbrt.h +0 -131
  705. scipy/special/xsf/cephes/chbevl.h +0 -85
  706. scipy/special/xsf/cephes/chdtr.h +0 -193
  707. scipy/special/xsf/cephes/const.h +0 -87
  708. scipy/special/xsf/cephes/ellie.h +0 -293
  709. scipy/special/xsf/cephes/ellik.h +0 -251
  710. scipy/special/xsf/cephes/ellpe.h +0 -107
  711. scipy/special/xsf/cephes/ellpk.h +0 -117
  712. scipy/special/xsf/cephes/expn.h +0 -260
  713. scipy/special/xsf/cephes/gamma.h +0 -398
  714. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  715. scipy/special/xsf/cephes/hyperg.h +0 -361
  716. scipy/special/xsf/cephes/i0.h +0 -149
  717. scipy/special/xsf/cephes/i1.h +0 -158
  718. scipy/special/xsf/cephes/igam.h +0 -421
  719. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  720. scipy/special/xsf/cephes/igami.h +0 -313
  721. scipy/special/xsf/cephes/j0.h +0 -225
  722. scipy/special/xsf/cephes/j1.h +0 -198
  723. scipy/special/xsf/cephes/jv.h +0 -715
  724. scipy/special/xsf/cephes/k0.h +0 -164
  725. scipy/special/xsf/cephes/k1.h +0 -163
  726. scipy/special/xsf/cephes/kn.h +0 -243
  727. scipy/special/xsf/cephes/lanczos.h +0 -112
  728. scipy/special/xsf/cephes/ndtr.h +0 -275
  729. scipy/special/xsf/cephes/poch.h +0 -85
  730. scipy/special/xsf/cephes/polevl.h +0 -167
  731. scipy/special/xsf/cephes/psi.h +0 -194
  732. scipy/special/xsf/cephes/rgamma.h +0 -111
  733. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  734. scipy/special/xsf/cephes/shichi.h +0 -248
  735. scipy/special/xsf/cephes/sici.h +0 -224
  736. scipy/special/xsf/cephes/sindg.h +0 -221
  737. scipy/special/xsf/cephes/tandg.h +0 -139
  738. scipy/special/xsf/cephes/trig.h +0 -58
  739. scipy/special/xsf/cephes/unity.h +0 -186
  740. scipy/special/xsf/cephes/zeta.h +0 -172
  741. scipy/special/xsf/config.h +0 -304
  742. scipy/special/xsf/digamma.h +0 -205
  743. scipy/special/xsf/error.h +0 -57
  744. scipy/special/xsf/evalpoly.h +0 -47
  745. scipy/special/xsf/expint.h +0 -266
  746. scipy/special/xsf/hyp2f1.h +0 -694
  747. scipy/special/xsf/iv_ratio.h +0 -173
  748. scipy/special/xsf/lambertw.h +0 -150
  749. scipy/special/xsf/loggamma.h +0 -163
  750. scipy/special/xsf/sici.h +0 -200
  751. scipy/special/xsf/tools.h +0 -427
  752. scipy/special/xsf/trig.h +0 -164
  753. scipy/special/xsf/wright_bessel.h +0 -843
  754. scipy/special/xsf/zlog1.h +0 -35
  755. scipy/stats/_mvn.cp312-win_amd64.dll.a +0 -0
  756. scipy/stats/_mvn.cp312-win_amd64.pyd +0 -0
  757. scipy-1.15.3.dist-info/DELVEWHEEL +0 -2
  758. /scipy-1.15.3-cp312-cp312-win_amd64.whl → /scipy-1.16.0rc2-cp312-cp312-win_amd64.whl +0 -0
  759. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
@@ -1,9 +1,12 @@
1
+ from dataclasses import dataclass
1
2
  from itertools import permutations
2
- import numpy as np
3
3
  import math
4
+ import threading
5
+
6
+ import numpy as np
7
+
4
8
  from ._continuous_distns import norm
5
9
  import scipy.stats
6
- from dataclasses import dataclass
7
10
 
8
11
 
9
12
  @dataclass
@@ -304,6 +307,8 @@ def page_trend_test(data, ranked=False, predicted_ranks=None, method='auto'):
304
307
  method='exact')
305
308
 
306
309
  """
310
+ if not hasattr(_pagel_state, 'state'):
311
+ _pagel_state.state = _PageL()
307
312
 
308
313
  # Possible values of the method parameter and the corresponding function
309
314
  # used to evaluate the p value
@@ -405,8 +410,8 @@ def _l_p_exact(L, m, n):
405
410
  # [1] uses m, n; [5] uses n, k.
406
411
  # Switch convention here because exact calculation code references [5].
407
412
  L, n, k = int(L), int(m), int(n)
408
- _pagel_state.set_k(k)
409
- return _pagel_state.sf(L, n)
413
+ _pagel_state.state.set_k(k)
414
+ return _pagel_state.state.sf(L, n)
410
415
 
411
416
 
412
417
  class _PageL:
@@ -476,4 +481,6 @@ class _PageL:
476
481
 
477
482
 
478
483
  # Maintain state for faster repeat calls to page_trend_test w/ method='exact'
479
- _pagel_state = _PageL()
484
+ # _PageL() is calculated once per thread and stored as an attribute on
485
+ # this thread-local variable inside page_trend_test().
486
+ _pagel_state = threading.local()
@@ -30,8 +30,8 @@ class _ProbabilityDistribution(ABC):
30
30
  Notes
31
31
  -----
32
32
  Suppose a continuous probability distribution has support ``(l, r)``.
33
- The following table summarizes the value returned by methods
34
- of ``ContinuousDistribution`` for arguments outside the support.
33
+ The following table summarizes the value returned by several
34
+ methods when the argument is outside the support.
35
35
 
36
36
  +----------------+---------------------+---------------------+
37
37
  | Method | Value for ``x < l`` | Value for ``x > r`` |
@@ -49,13 +49,16 @@ class _ProbabilityDistribution(ABC):
49
49
  | ``logccdf(x)`` | 0 | -inf |
50
50
  +----------------+---------------------+---------------------+
51
51
 
52
- For the ``cdf`` and related methods, the inequality need not be
53
- strict; i.e. the tabulated value is returned when the method is
54
- evaluated *at* the corresponding boundary.
52
+ For discrete distributions, the same table is applicable with
53
+ ``pmf`` and ``logpmf`` substituted for ``pdf`` and ``logpdf``.
54
+
55
+ For the ``cdf`` and related methods of continuous distributions, the
56
+ inequality need not be strict; i.e. the tabulated value is returned
57
+ when the method is evaluated *at* the corresponding boundary.
55
58
 
56
59
  The following table summarizes the value returned by the inverse
57
- methods of ``ContinuousDistribution`` for arguments at the boundaries
58
- of the domain ``0`` to ``1``.
60
+ methods for arguments ``0`` and ``1``, whether the distribution
61
+ is continuous or discrete.
59
62
 
60
63
  +-------------+-----------+-----------+
61
64
  | Method | ``x = 0`` | ``x = 1`` |
@@ -65,7 +68,7 @@ class _ProbabilityDistribution(ABC):
65
68
  | ``icdf(x)`` | ``r`` | ``l`` |
66
69
  +-------------+-----------+-----------+
67
70
 
68
- For the inverse log-functions, the same values are returned for
71
+ For the inverse log-functions, the same values are returned
69
72
  for ``x = log(0)`` and ``x = log(1)``. All inverse functions return
70
73
  ``nan`` when evaluated at an argument outside the domain ``0`` to ``1``.
71
74
 
@@ -173,7 +176,7 @@ class _ProbabilityDistribution(ABC):
173
176
 
174
177
  In terms of probability density function :math:`f(x)` and support
175
178
  :math:`\chi`, the "raw" moment (about the origin) of order :math:`n` of
176
- a random variable :math:`X` is:
179
+ a continuous random variable :math:`X` is:
177
180
 
178
181
  .. math::
179
182
 
@@ -195,6 +198,9 @@ class _ProbabilityDistribution(ABC):
195
198
  \tilde{\mu}_n(X) = \frac{\mu_n(X)}
196
199
  {\sigma^n}
197
200
 
201
+ The definitions for discrete random variables are analogous, with
202
+ sums over the support replacing the integrals.
203
+
198
204
  Parameters
199
205
  ----------
200
206
  order : int
@@ -217,7 +223,8 @@ class _ProbabilityDistribution(ABC):
217
223
  vice versa (see Notes)
218
224
  - ``'normalize'``: normalize a central moment to get a standardized
219
225
  or vice versa
220
- - ``'quadrature'``: numerically integrate according to the definition
226
+ - ``'quadrature'``: numerically integrate (or, in the discrete case, sum)
227
+ according to the definition
221
228
 
222
229
  Not all `method` options are available for all orders, kinds, and
223
230
  distributions. If the selected `method` is not available, a
@@ -365,15 +372,19 @@ class _ProbabilityDistribution(ABC):
365
372
 
366
373
  @abstractmethod
367
374
  def median(self, *, method):
368
- r"""Median (50th percentil)
375
+ r"""Median (50th percentile)
369
376
 
370
377
  If a continuous random variable :math:`X` has probability :math:`0.5` of
371
378
  taking on a value less than :math:`m`, then :math:`m` is the median.
372
- That is, the median is the value :math:`m` for which:
379
+
380
+ More generally, a median is a value :math:`m` for which:
373
381
 
374
382
  .. math::
375
383
 
376
- P(X ≤ m) = 0.5 = P(X ≥ m)
384
+ P(X ≤ m) 0.5 P(X ≥ m)
385
+
386
+ For discrete random variables, the median may not be unique, in which
387
+ case the smallest value satisfying the definition is reported.
377
388
 
378
389
  Parameters
379
390
  ----------
@@ -428,8 +439,8 @@ class _ProbabilityDistribution(ABC):
428
439
 
429
440
  Informally, the mode is a value that a random variable has the highest
430
441
  probability (density) of assuming. That is, the mode is the element of
431
- the support :math:`\chi` that maximizes the probability density
432
- function :math:`f(x)`:
442
+ the support :math:`\chi` that maximizes the probability density (or mass,
443
+ for discrete random variables) function :math:`f(x)`:
433
444
 
434
445
  .. math::
435
446
 
@@ -443,7 +454,7 @@ class _ProbabilityDistribution(ABC):
443
454
  following options, listed in order of precedence.
444
455
 
445
456
  - ``'formula'``: use a formula for the median
446
- - ``'optimization'``: numerically maximize the PDF
457
+ - ``'optimization'``: numerically maximize the PDF/PMF
447
458
 
448
459
  Not all `method` options are available for all distributions.
449
460
  If the selected `method` is not available, a ``NotImplementedError``
@@ -465,7 +476,7 @@ class _ProbabilityDistribution(ABC):
465
476
  For some distributions
466
477
 
467
478
  #. the mode is not unique (e.g. the uniform distribution);
468
- #. the PDF has one or more singularities, and it is debateable whether
479
+ #. the PDF has one or more singularities, and it is debatable whether
469
480
  a singularity is considered to be in the domain and called the mode
470
481
  (e.g. the gamma distribution with shape parameter less than 1); and/or
471
482
  #. the probability density function may have one or more local maxima
@@ -737,9 +748,12 @@ class _ProbabilityDistribution(ABC):
737
748
  By definition of the support, the PDF evaluates to its minimum value
738
749
  of :math:`0` outside the support; i.e. for :math:`x < l` or
739
750
  :math:`x > r`. The maximum of the PDF may be less than or greater than
740
- :math:`1`; since the valus is a probability *density*, only its integral
751
+ :math:`1`; since the value is a probability *density*, only its integral
741
752
  over the support must equal :math:`1`.
742
753
 
754
+ For discrete distributions, `pdf` returns ``inf`` at supported points
755
+ and ``0`` elsewhere.
756
+
743
757
  References
744
758
  ----------
745
759
  .. [1] Probability density function, *Wikipedia*,
@@ -823,6 +837,9 @@ class _ProbabilityDistribution(ABC):
823
837
  to work with the logarithms of probabilities and probability densities to
824
838
  avoid underflow.
825
839
 
840
+ For discrete distributions, `logpdf` returns ``inf`` at supported points and
841
+ ``-inf`` (``log(0)``) elsewhere.
842
+
826
843
  References
827
844
  ----------
828
845
  .. [1] Probability density function, *Wikipedia*,
@@ -846,6 +863,156 @@ class _ProbabilityDistribution(ABC):
846
863
  """
847
864
  raise NotImplementedError()
848
865
 
866
+ def pmf(self, x, /, *, method=None):
867
+ r"""Probability mass function
868
+
869
+ The probability mass function ("PMF"), denoted :math:`f(x)`, is the
870
+ probability that the random variable :math:`X` will assume the value :math:`x`.
871
+
872
+ .. math::
873
+
874
+ f(x) = P(X = x)
875
+
876
+ `pmf` accepts `x` for :math:`x`.
877
+
878
+ Parameters
879
+ ----------
880
+ x : array_like
881
+ The argument of the PMF.
882
+ method : {None, 'formula', 'logexp'}
883
+ The strategy used to evaluate the PMF. By default (``None``), the
884
+ infrastructure chooses between the following options, listed in
885
+ order of precedence.
886
+
887
+ - ``'formula'``: use a formula for the PMF itself
888
+ - ``'logexp'``: evaluate the log-PMF and exponentiate
889
+
890
+ Not all `method` options are available for all distributions.
891
+ If the selected `method` is not available, a ``NotImplementedError``
892
+ will be raised.
893
+
894
+ Returns
895
+ -------
896
+ out : array
897
+ The PMF evaluated at the argument `x`.
898
+
899
+ See Also
900
+ --------
901
+ cdf
902
+ logpmf
903
+
904
+ Notes
905
+ -----
906
+ Suppose a discrete probability distribution has support over the integers
907
+ :math:`{l, l+1, ..., r-1, r}`.
908
+ By definition of the support, the PMF evaluates to its minimum value
909
+ of :math:`0` for non-integral :math:`x` and for :math:`x` outside the support;
910
+ i.e. for :math:`x < l` or :math:`x > r`.
911
+
912
+ For continuous distributions, `pmf` returns ``0`` at all real arguments.
913
+
914
+ References
915
+ ----------
916
+ .. [1] Probability mass function, *Wikipedia*,
917
+ https://en.wikipedia.org/wiki/Probability_mass_function
918
+
919
+ Examples
920
+ --------
921
+ Instantiate a distribution with the desired parameters:
922
+
923
+ >>> from scipy import stats
924
+ >>> X = stats.Binomial(n=10, p=0.5)
925
+
926
+ Evaluate the PMF at the desired argument:
927
+
928
+ >>> X.pmf(5)
929
+ np.float64(0.24609375)
930
+
931
+ """
932
+ raise NotImplementedError()
933
+
934
+ def logpmf(self, x, /, *, method=None):
935
+ r"""Log of the probability mass function
936
+
937
+ The probability mass function ("PMF"), denoted :math:`f(x)`, is the
938
+ probability that the random variable :math:`X` will assume the value :math:`x`.
939
+
940
+ .. math::
941
+
942
+ f(x) = \frac{d}{dx} F(x)
943
+
944
+ `logpmf` computes the logarithm of the probability mass function
945
+ ("log-PMF"), :math:`\log(f(x))`, but it may be numerically favorable
946
+ compared to the naive implementation (computing :math:`f(x)` and
947
+ taking the logarithm).
948
+
949
+ `logpmf` accepts `x` for :math:`x`.
950
+
951
+ Parameters
952
+ ----------
953
+ x : array_like
954
+ The argument of the log-PMF.
955
+ method : {None, 'formula', 'logexp'}
956
+ The strategy used to evaluate the log-PMF. By default (``None``), the
957
+ infrastructure chooses between the following options, listed in order
958
+ of precedence.
959
+
960
+ - ``'formula'``: use a formula for the log-PMF itself
961
+ - ``'logexp'``: evaluate the PMF and takes its logarithm
962
+
963
+ Not all `method` options are available for all distributions.
964
+ If the selected `method` is not available, a ``NotImplementedError``
965
+ will be raised.
966
+
967
+ Returns
968
+ -------
969
+ out : array
970
+ The log-PMF evaluated at the argument `x`.
971
+
972
+ See Also
973
+ --------
974
+ pmf
975
+ logcdf
976
+
977
+ Notes
978
+ -----
979
+ Suppose a discrete probability distribution has support over the integers
980
+ :math:`{l, l+1, ..., r-1, r}`.
981
+ By definition of the support, the log-PMF evaluates to its minimum value
982
+ of :math:`-\infty` (i.e. :math:`\log(0)`) for non-integral :math:`x` and
983
+ for :math:`x` outside the support; i.e. for :math:`x < l` or :math:`x > r`.
984
+
985
+ For distributions with infinite support, it is common for `pmf` to return
986
+ a value of ``0`` when the argument is theoretically within the support;
987
+ this can occur because the true value of the PMF is too small to be
988
+ represented by the chosen dtype. The log-PMF, however, will often be finite
989
+ (not ``-inf``) over a much larger domain. Consequently, it may be preferred
990
+ to work with the logarithms of probabilities and probability densities to
991
+ avoid underflow.
992
+
993
+ References
994
+ ----------
995
+ .. [1] Probability density function, *Wikipedia*,
996
+ https://en.wikipedia.org/wiki/Probability_density_function
997
+
998
+ Examples
999
+ --------
1000
+ Instantiate a distribution with the desired parameters:
1001
+
1002
+ >>> import numpy as np
1003
+ >>> from scipy import stats
1004
+ >>> X = stats.Binomial(n=10, p=0.5)
1005
+
1006
+ Evaluate the log-PMF at the desired argument:
1007
+
1008
+ >>> X.logpmf(5)
1009
+ np.float64(-1.4020427180880297)
1010
+ >>> np.allclose(X.logpmf(5), np.log(X.pmf(5)))
1011
+ True
1012
+
1013
+ """
1014
+ raise NotImplementedError()
1015
+
849
1016
  @abstractmethod
850
1017
  def cdf(self, x, y, /, *, method):
851
1018
  r"""Cumulative distribution function
@@ -880,7 +1047,8 @@ class _ProbabilityDistribution(ABC):
880
1047
  - ``'formula'``: use a formula for the CDF itself
881
1048
  - ``'logexp'``: evaluate the log-CDF and exponentiate
882
1049
  - ``'complement'``: evaluate the CCDF and take the complement
883
- - ``'quadrature'``: numerically integrate the PDF
1050
+ - ``'quadrature'``: numerically integrate the PDF (or, in the discrete
1051
+ case, sum the PMF)
884
1052
 
885
1053
  In place of ``'complement'``, the two-argument form accepts:
886
1054
 
@@ -920,6 +1088,17 @@ class _ProbabilityDistribution(ABC):
920
1088
  The CDF evaluates to its minimum value of :math:`0` for :math:`x ≤ l`
921
1089
  and its maximum value of :math:`1` for :math:`x ≥ r`.
922
1090
 
1091
+ Suppose a discrete probability distribution has support :math:`[l, r]`.
1092
+ The CDF :math:`F(x)` is related to the probability mass function
1093
+ :math:`f(x)` by:
1094
+
1095
+ .. math::
1096
+
1097
+ F(x) = \sum_{u=l}^{\lfloor x \rfloor} f(u)
1098
+
1099
+ The CDF evaluates to its minimum value of :math:`0` for :math:`x < l`
1100
+ and its maximum value of :math:`1` for :math:`x ≥ r`.
1101
+
923
1102
  The CDF is also known simply as the "distribution function".
924
1103
 
925
1104
  References
@@ -951,14 +1130,24 @@ class _ProbabilityDistribution(ABC):
951
1130
  def icdf(self, p, /, *, method):
952
1131
  r"""Inverse of the cumulative distribution function.
953
1132
 
954
- The inverse of the cumulative distribution function ("inverse CDF"),
955
- denoted :math:`F^{-1}(p)`, is the argument :math:`x` for which the
956
- cumulative distribution function :math:`F(x)` evaluates to :math:`p`.
1133
+ For monotonic continuous distributions, the inverse of the cumulative
1134
+ distribution function ("inverse CDF"), denoted :math:`F^{-1}(p)`, is the
1135
+ argument :math:`x` for which the cumulative distribution function
1136
+ :math:`F(x)` evaluates to :math:`p`.
957
1137
 
958
1138
  .. math::
959
1139
 
960
1140
  F^{-1}(p) = x \quad \text{s.t.} \quad F(x) = p
961
1141
 
1142
+ When a strict "inverse" of the cumulative distribution function does not
1143
+ exist (e.g. discrete random variables), the "inverse CDF" is defined by
1144
+ convention as the smallest value within the support :math:`\chi` for which
1145
+ :math:`F(x)` is at least :math:`p`.
1146
+
1147
+ .. math::
1148
+
1149
+ F^{-1}(p) = \min_\chi \quad \text{s.t.} \quad F(x) ≥ p
1150
+
962
1151
  `icdf` accepts `p` for :math:`p \in [0, 1]`.
963
1152
 
964
1153
  Parameters
@@ -992,7 +1181,7 @@ class _ProbabilityDistribution(ABC):
992
1181
 
993
1182
  Notes
994
1183
  -----
995
- Suppose a continuous probability distribution has support :math:`[l, r]`. The
1184
+ Suppose a probability distribution has support :math:`[l, r]`. The
996
1185
  inverse CDF returns its minimum value of :math:`l` at :math:`p = 0`
997
1186
  and its maximum value of :math:`r` at :math:`p = 1`. Because the CDF
998
1187
  has range :math:`[0, 1]`, the inverse CDF is only defined on the
@@ -1063,7 +1252,8 @@ class _ProbabilityDistribution(ABC):
1063
1252
  - ``'formula'``: use a formula for the CCDF itself
1064
1253
  - ``'logexp'``: evaluate the log-CCDF and exponentiate
1065
1254
  - ``'complement'``: evaluate the CDF and take the complement
1066
- - ``'quadrature'``: numerically integrate the PDF
1255
+ - ``'quadrature'``: numerically integrate the PDF (or, in the discrete
1256
+ case, sum the PMF)
1067
1257
 
1068
1258
  The two-argument form chooses between:
1069
1259
 
@@ -1103,6 +1293,17 @@ class _ProbabilityDistribution(ABC):
1103
1293
  The CCDF returns its minimum value of :math:`0` for :math:`x ≥ r`
1104
1294
  and its maximum value of :math:`1` for :math:`x ≤ l`.
1105
1295
 
1296
+ Suppose a discrete probability distribution has support :math:`[l, r]`.
1297
+ The CCDF :math:`G(x)` is related to the probability mass function
1298
+ :math:`f(x)` by:
1299
+
1300
+ .. math::
1301
+
1302
+ G(x) = \sum_{u=\lfloor x + 1 \rfloor}^{r} f(u)
1303
+
1304
+ The CCDF evaluates to its minimum value of :math:`0` for :math:`x ≥ r`
1305
+ and its maximum value of :math:`1` for :math:`x < l`.
1306
+
1106
1307
  The CCDF is also known as the "survival function".
1107
1308
 
1108
1309
  References
@@ -1146,6 +1347,15 @@ class _ProbabilityDistribution(ABC):
1146
1347
 
1147
1348
  G^{-1}(p) = x \quad \text{s.t.} \quad G(x) = p
1148
1349
 
1350
+ When a strict "inverse" of the complementary cumulative distribution function
1351
+ does not exist (e.g. discrete random variables), the "inverse CCDF" is defined
1352
+ by convention as the smallest value within the support :math:`\chi` for which
1353
+ :math:`G(x)` is no greater than :math:`p`.
1354
+
1355
+ .. math::
1356
+
1357
+ G^{-1}(p) = \min_\chi \quad \text{s.t.} \quad G(x) ≤ p
1358
+
1149
1359
  `iccdf` accepts `p` for :math:`p \in [0, 1]`.
1150
1360
 
1151
1361
  Parameters
@@ -1174,7 +1384,7 @@ class _ProbabilityDistribution(ABC):
1174
1384
 
1175
1385
  Notes
1176
1386
  -----
1177
- Suppose a continuous probability distribution has support :math:`[l, r]`. The
1387
+ Suppose a probability distribution has support :math:`[l, r]`. The
1178
1388
  inverse CCDF returns its minimum value of :math:`l` at :math:`p = 1`
1179
1389
  and its maximum value of :math:`r` at :math:`p = 0`. Because the CCDF
1180
1390
  has range :math:`[0, 1]`, the inverse CCDF is only defined on the
@@ -1249,7 +1459,8 @@ class _ProbabilityDistribution(ABC):
1249
1459
  - ``'logexp'``: evaluate the CDF and take the logarithm
1250
1460
  - ``'complement'``: evaluate the log-CCDF and take the
1251
1461
  logarithmic complement (see Notes)
1252
- - ``'quadrature'``: numerically log-integrate the log-PDF
1462
+ - ``'quadrature'``: numerically log-integrate the log-PDF (or, in the
1463
+ discrete case, log-sum the log-PMF)
1253
1464
 
1254
1465
  In place of ``'complement'``, the two-argument form accepts:
1255
1466
 
@@ -1275,7 +1486,8 @@ class _ProbabilityDistribution(ABC):
1275
1486
  Suppose a continuous probability distribution has support :math:`[l, r]`.
1276
1487
  The log-CDF evaluates to its minimum value of :math:`\log(0) = -\infty`
1277
1488
  for :math:`x ≤ l` and its maximum value of :math:`\log(1) = 0` for
1278
- :math:`x ≥ r`.
1489
+ :math:`x ≥ r`. An analogous statement can be made for discrete distributions,
1490
+ but the inequality governing the minimum value is strict.
1279
1491
 
1280
1492
  For distributions with infinite support, it is common for
1281
1493
  `cdf` to return a value of ``0`` when the argument
@@ -1368,7 +1580,7 @@ class _ProbabilityDistribution(ABC):
1368
1580
 
1369
1581
  Notes
1370
1582
  -----
1371
- Suppose a continuous probability distribution has support :math:`[l, r]`.
1583
+ Suppose a probability distribution has support :math:`[l, r]`.
1372
1584
  The inverse log-CDF returns its minimum value of :math:`l` at
1373
1585
  :math:`\log(p) = \log(0) = -\infty` and its maximum value of :math:`r` at
1374
1586
  :math:`\log(p) = \log(1) = 0`. Because the log-CDF has range
@@ -1418,7 +1630,7 @@ class _ProbabilityDistribution(ABC):
1418
1630
 
1419
1631
  G(x) = 1 - F(x) = P(X > x)
1420
1632
 
1421
- A two-argument variant of this function is:
1633
+ A two-argument variant of this function is:
1422
1634
 
1423
1635
  .. math::
1424
1636
 
@@ -1444,7 +1656,8 @@ class _ProbabilityDistribution(ABC):
1444
1656
  - ``'logexp'``: evaluate the CCDF and take the logarithm
1445
1657
  - ``'complement'``: evaluate the log-CDF and take the
1446
1658
  logarithmic complement (see Notes)
1447
- - ``'quadrature'``: numerically log-integrate the log-PDF
1659
+ - ``'quadrature'``: numerically log-integrate the log-PDF (or, in the
1660
+ discrete case, log-sum the log-PMF)
1448
1661
 
1449
1662
  The two-argument form chooses between:
1450
1663
 
@@ -1471,7 +1684,8 @@ class _ProbabilityDistribution(ABC):
1471
1684
  Suppose a continuous probability distribution has support :math:`[l, r]`.
1472
1685
  The log-CCDF returns its minimum value of :math:`\log(0)=-\infty` for
1473
1686
  :math:`x ≥ r` and its maximum value of :math:`\log(1) = 0` for
1474
- :math:`x ≤ l`.
1687
+ :math:`x ≤ l`. An analogous statement can be made for discrete distributions,
1688
+ but the inequality governing the maximum value is strict.
1475
1689
 
1476
1690
  For distributions with infinite support, it is common for
1477
1691
  `ccdf` to return a value of ``0`` when the argument
@@ -1554,7 +1768,7 @@ class _ProbabilityDistribution(ABC):
1554
1768
 
1555
1769
  Notes
1556
1770
  -----
1557
- Suppose a continuous probability distribution has support :math:`[l, r]`. The
1771
+ Suppose a probability distribution has support :math:`[l, r]`. The
1558
1772
  inverse log-CCDF returns its minimum value of :math:`l` at
1559
1773
  :math:`\log(p) = \log(1) = 0` and its maximum value of :math:`r` at
1560
1774
  :math:`\log(p) = \log(0) = -\infty`. Because the log-CCDF has range
@@ -1567,7 +1781,7 @@ class _ProbabilityDistribution(ABC):
1567
1781
  however, the *logarithm* of this resulting probability may be
1568
1782
  represented in floating point arithmetic, in which case this function
1569
1783
  may be used to find the argument of the CCDF for which the *logarithm*
1570
- of the resulting probability is `y = \log(p)`.
1784
+ of the resulting probability is :math:`y = \log(p)`.
1571
1785
 
1572
1786
  The "logarithmic complement" of a number :math:`z` is mathematically
1573
1787
  equivalent to :math:`\log(1-\exp(z))`, but it is computed to avoid loss
@@ -1601,15 +1815,18 @@ class _ProbabilityDistribution(ABC):
1601
1815
  r"""Logarithm of the differential entropy
1602
1816
 
1603
1817
  In terms of probability density function :math:`f(x)` and support
1604
- :math:`\chi`, the differential entropy (or simply "entropy") of a random
1605
- variable :math:`X` is:
1818
+ :math:`\chi`, the differential entropy (or simply "entropy") of a
1819
+ continuous random variable :math:`X` is:
1606
1820
 
1607
1821
  .. math::
1608
1822
 
1609
1823
  h(X) = - \int_{\chi} f(x) \log f(x) dx
1610
1824
 
1825
+ The definition for a discrete random variable is analogous, with the PMF
1826
+ replacing the PDF and a sum over the support replacing the integral.
1827
+
1611
1828
  `logentropy` computes the logarithm of the differential entropy
1612
- ("log-entropy"), :math:`log(h(X))`, but it may be numerically favorable
1829
+ ("log-entropy"), :math:`\log(h(X))`, but it may be numerically favorable
1613
1830
  compared to the naive implementation (computing :math:`h(X)` then
1614
1831
  taking the logarithm).
1615
1832
 
@@ -1622,8 +1839,8 @@ class _ProbabilityDistribution(ABC):
1622
1839
 
1623
1840
  - ``'formula'``: use a formula for the log-entropy itself
1624
1841
  - ``'logexp'``: evaluate the entropy and take the logarithm
1625
- - ``'quadrature'``: numerically log-integrate the logarithm of the
1626
- entropy integrand
1842
+ - ``'quadrature'``: numerically log-integrate (or, in the discrete
1843
+ case, log-sum) the logarithm of the entropy integrand (summand)
1627
1844
 
1628
1845
  Not all `method` options are available for all distributions.
1629
1846
  If the selected `method` is not available, a ``NotImplementedError``
@@ -1641,9 +1858,9 @@ class _ProbabilityDistribution(ABC):
1641
1858
 
1642
1859
  Notes
1643
1860
  -----
1644
- If the entropy of a distribution is negative, then the log-entropy
1645
- is complex with imaginary part :math:`\pi`. For
1646
- consistency, the result of this function always has complex dtype,
1861
+ The differential entropy of a continuous distribution can be negative.
1862
+ In this case, the log-entropy is complex with imaginary part :math:`\pi`.
1863
+ For consistency, the result of this function always has complex dtype,
1647
1864
  regardless of the value of the imaginary part.
1648
1865
 
1649
1866
  References
@@ -1675,7 +1892,7 @@ class _ProbabilityDistribution(ABC):
1675
1892
 
1676
1893
  """
1677
1894
  raise NotImplementedError()
1678
-
1895
+
1679
1896
  @abstractmethod
1680
1897
  def entropy(self, *, method):
1681
1898
  r"""Differential entropy
@@ -1688,6 +1905,9 @@ class _ProbabilityDistribution(ABC):
1688
1905
 
1689
1906
  h(X) = - \int_{\chi} f(x) \log f(x) dx
1690
1907
 
1908
+ The definition for a discrete random variable is analogous, with the
1909
+ PMF replacing the PDF and a sum over the support replacing the integral.
1910
+
1691
1911
  Parameters
1692
1912
  ----------
1693
1913
  method : {None, 'formula', 'logexp', 'quadrature'}
@@ -1697,7 +1917,9 @@ class _ProbabilityDistribution(ABC):
1697
1917
 
1698
1918
  - ``'formula'``: use a formula for the entropy itself
1699
1919
  - ``'logexp'``: evaluate the log-entropy and exponentiate
1700
- - ``'quadrature'``: use numerical integration
1920
+ - ``'quadrature'``: numerically integrate (or, in the discrete
1921
+ case, sum) the entropy integrand (summand)
1922
+
1701
1923
 
1702
1924
  Not all `method` options are available for all distributions.
1703
1925
  If the selected `method` is not available, a ``NotImplementedError``
scipy/stats/_qmc.py CHANGED
@@ -20,7 +20,7 @@ from scipy._lib._util import DecimalNumber, GeneratorType, IntNumber, SeedType
20
20
 
21
21
  if TYPE_CHECKING:
22
22
  import numpy.typing as npt
23
-
23
+
24
24
  import scipy.stats as stats
25
25
  from scipy._lib._util import rng_integers, _rng_spawn, _transition_to_rng
26
26
  from scipy.sparse.csgraph import minimum_spanning_tree
@@ -76,9 +76,9 @@ def check_random_state(seed=None):
76
76
  Random number generator.
77
77
 
78
78
  """
79
- if seed is None or isinstance(seed, (numbers.Integral, np.integer)):
79
+ if seed is None or isinstance(seed, numbers.Integral | np.integer):
80
80
  return np.random.default_rng(seed)
81
- elif isinstance(seed, (np.random.RandomState, np.random.Generator)):
81
+ elif isinstance(seed, np.random.RandomState | np.random.Generator):
82
82
  return seed
83
83
  else:
84
84
  raise ValueError(f'{seed!r} cannot be used to seed a'
@@ -266,7 +266,10 @@ def discrepancy(
266
266
  * ``MD``: Mixture Discrepancy - mix between CD/WD covering more criteria
267
267
  * ``L2-star``: L2-star discrepancy - like CD BUT variant to rotation
268
268
 
269
- See [2]_ for precise definitions of each method.
269
+ Methods ``CD``, ``WD``, and ``MD`` implement the right hand side of equations
270
+ 9, 10, and 18 of [2]_, respectively; the square root is not taken. On the
271
+ other hand, ``L2-star`` computes the quantity given by equation 10 of
272
+ [3]_ as implemented by subsequent equations; the square root is taken.
270
273
 
271
274
  Lastly, using ``iterative=True``, it is possible to compute the
272
275
  discrepancy as if we had :math:`n+1` samples. This is useful if we want
@@ -1117,14 +1120,16 @@ class Halton(QMCEngine):
1117
1120
  Pseudo-random number generator that generalize the Van der Corput sequence
1118
1121
  for multiple dimensions. The Halton sequence uses the base-two Van der
1119
1122
  Corput sequence for the first dimension, base-three for its second and
1120
- base-:math:`n` for its n-dimension.
1123
+ base-:math:`p` for its :math:`n`-dimension, with :math:`p` the
1124
+ :math:`n`'th prime.
1121
1125
 
1122
1126
  Parameters
1123
1127
  ----------
1124
1128
  d : int
1125
1129
  Dimension of the parameter space.
1126
1130
  scramble : bool, optional
1127
- If True, use Owen scrambling. Otherwise no scrambling is done.
1131
+ If True, use random scrambling from [2]_. Otherwise no scrambling
1132
+ is done.
1128
1133
  Default is True.
1129
1134
  optimization : {None, "random-cd", "lloyd"}, optional
1130
1135
  Whether to use an optimization scheme to improve the quality after
@@ -1584,7 +1589,7 @@ class LatinHypercube(QMCEngine):
1584
1589
  for j in range(n_col):
1585
1590
  perms = self.rng.permutation(p)
1586
1591
  oa_sample_[:, j] = perms[oa_sample[:, j]]
1587
-
1592
+
1588
1593
  oa_sample = oa_sample_
1589
1594
  # following is making a scrambled OA into an OA-LHS
1590
1595
  oa_lhs_sample = np.zeros(shape=(n_row, n_col))
@@ -1858,7 +1863,7 @@ class Sobol(QMCEngine):
1858
1863
  # verify n is 2**n
1859
1864
  if not (n & (n - 1) == 0):
1860
1865
  warnings.warn("The balance properties of Sobol' points require"
1861
- " n to be a power of 2.", stacklevel=2)
1866
+ " n to be a power of 2.", stacklevel=3)
1862
1867
 
1863
1868
  if n == 1:
1864
1869
  sample = self._first_point
@@ -2121,7 +2126,7 @@ class PoissonDisk(QMCEngine):
2121
2126
 
2122
2127
  # sample to generate per iteration in the hypersphere around center
2123
2128
  self.ncandidates = ncandidates
2124
-
2129
+
2125
2130
  if u_bounds is None:
2126
2131
  u_bounds = np.ones(d)
2127
2132
  if l_bounds is None:
Binary file