scipy 1.15.3__cp312-cp312-macosx_12_0_arm64.whl → 1.16.0rc2__cp312-cp312-macosx_12_0_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 (629) hide show
  1. scipy/.dylibs/libscipy_openblas.dylib +0 -0
  2. scipy/__config__.py +8 -8
  3. scipy/__init__.py +3 -6
  4. scipy/_cyutility.cpython-312-darwin.so +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.cpython-312-darwin.so +0 -0
  9. scipy/_lib/_docscrape.py +1 -1
  10. scipy/_lib/_elementwise_iterative_method.py +15 -26
  11. scipy/_lib/_sparse.py +41 -0
  12. scipy/_lib/_test_deprecation_call.cpython-312-darwin.so +0 -0
  13. scipy/_lib/_test_deprecation_def.cpython-312-darwin.so +0 -0
  14. scipy/_lib/_testutils.py +6 -2
  15. scipy/_lib/_util.py +222 -125
  16. scipy/_lib/array_api_compat/__init__.py +4 -4
  17. scipy/_lib/array_api_compat/_internal.py +19 -6
  18. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  19. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  20. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  21. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  22. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  23. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  24. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  25. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  26. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  27. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  28. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  29. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  30. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  31. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  32. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  33. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  34. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  35. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  36. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  37. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  38. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  39. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  40. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  41. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  42. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  43. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  44. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  45. scipy/_lib/array_api_extra/__init__.py +26 -3
  46. scipy/_lib/array_api_extra/_delegation.py +171 -0
  47. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  48. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  49. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  50. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  51. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  52. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  53. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  54. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  58. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  59. scipy/_lib/array_api_extra/testing.py +359 -0
  60. scipy/_lib/decorator.py +2 -2
  61. scipy/_lib/doccer.py +1 -7
  62. scipy/_lib/messagestream.cpython-312-darwin.so +0 -0
  63. scipy/_lib/pyprima/__init__.py +212 -0
  64. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  65. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  66. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  67. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  68. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  69. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  70. scipy/_lib/pyprima/cobyla/update.py +289 -0
  71. scipy/_lib/pyprima/common/__init__.py +0 -0
  72. scipy/_lib/pyprima/common/_bounds.py +34 -0
  73. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  74. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  75. scipy/_lib/pyprima/common/_project.py +173 -0
  76. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  77. scipy/_lib/pyprima/common/consts.py +47 -0
  78. scipy/_lib/pyprima/common/evaluate.py +99 -0
  79. scipy/_lib/pyprima/common/history.py +38 -0
  80. scipy/_lib/pyprima/common/infos.py +30 -0
  81. scipy/_lib/pyprima/common/linalg.py +435 -0
  82. scipy/_lib/pyprima/common/message.py +290 -0
  83. scipy/_lib/pyprima/common/powalg.py +131 -0
  84. scipy/_lib/pyprima/common/preproc.py +277 -0
  85. scipy/_lib/pyprima/common/present.py +5 -0
  86. scipy/_lib/pyprima/common/ratio.py +54 -0
  87. scipy/_lib/pyprima/common/redrho.py +47 -0
  88. scipy/_lib/pyprima/common/selectx.py +296 -0
  89. scipy/_lib/tests/test__util.py +105 -121
  90. scipy/_lib/tests/test_array_api.py +166 -35
  91. scipy/_lib/tests/test_bunch.py +7 -0
  92. scipy/_lib/tests/test_ccallback.py +2 -10
  93. scipy/_lib/tests/test_public_api.py +13 -0
  94. scipy/cluster/_hierarchy.cpython-312-darwin.so +0 -0
  95. scipy/cluster/_optimal_leaf_ordering.cpython-312-darwin.so +0 -0
  96. scipy/cluster/_vq.cpython-312-darwin.so +0 -0
  97. scipy/cluster/hierarchy.py +393 -223
  98. scipy/cluster/tests/test_hierarchy.py +273 -335
  99. scipy/cluster/tests/test_vq.py +45 -61
  100. scipy/cluster/vq.py +39 -35
  101. scipy/conftest.py +263 -157
  102. scipy/constants/_constants.py +4 -1
  103. scipy/constants/tests/test_codata.py +2 -2
  104. scipy/constants/tests/test_constants.py +11 -18
  105. scipy/datasets/_download_all.py +15 -1
  106. scipy/datasets/_fetchers.py +7 -1
  107. scipy/datasets/_utils.py +1 -1
  108. scipy/differentiate/_differentiate.py +25 -25
  109. scipy/differentiate/tests/test_differentiate.py +24 -25
  110. scipy/fft/_basic.py +20 -0
  111. scipy/fft/_helper.py +3 -34
  112. scipy/fft/_pocketfft/helper.py +29 -1
  113. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  114. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  115. scipy/fft/_realtransforms.py +13 -0
  116. scipy/fft/tests/test_basic.py +27 -25
  117. scipy/fft/tests/test_fftlog.py +16 -7
  118. scipy/fft/tests/test_helper.py +18 -34
  119. scipy/fft/tests/test_real_transforms.py +8 -10
  120. scipy/fftpack/convolve.cpython-312-darwin.so +0 -0
  121. scipy/fftpack/tests/test_basic.py +2 -4
  122. scipy/fftpack/tests/test_real_transforms.py +8 -9
  123. scipy/integrate/_bvp.py +9 -3
  124. scipy/integrate/_cubature.py +3 -2
  125. scipy/integrate/_dop.cpython-312-darwin.so +0 -0
  126. scipy/integrate/_lsoda.cpython-312-darwin.so +0 -0
  127. scipy/integrate/_ode.py +9 -2
  128. scipy/integrate/_odepack.cpython-312-darwin.so +0 -0
  129. scipy/integrate/_quad_vec.py +21 -29
  130. scipy/integrate/_quadpack.cpython-312-darwin.so +0 -0
  131. scipy/integrate/_quadpack_py.py +11 -7
  132. scipy/integrate/_quadrature.py +3 -3
  133. scipy/integrate/_rules/_base.py +2 -2
  134. scipy/integrate/_tanhsinh.py +48 -47
  135. scipy/integrate/_test_odeint_banded.cpython-312-darwin.so +0 -0
  136. scipy/integrate/_vode.cpython-312-darwin.so +0 -0
  137. scipy/integrate/tests/test__quad_vec.py +0 -6
  138. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  139. scipy/integrate/tests/test_cubature.py +21 -35
  140. scipy/integrate/tests/test_quadrature.py +6 -8
  141. scipy/integrate/tests/test_tanhsinh.py +56 -48
  142. scipy/interpolate/__init__.py +70 -58
  143. scipy/interpolate/_bary_rational.py +22 -22
  144. scipy/interpolate/_bsplines.py +119 -66
  145. scipy/interpolate/_cubic.py +65 -50
  146. scipy/interpolate/_dfitpack.cpython-312-darwin.so +0 -0
  147. scipy/interpolate/_dierckx.cpython-312-darwin.so +0 -0
  148. scipy/interpolate/_fitpack.cpython-312-darwin.so +0 -0
  149. scipy/interpolate/_fitpack2.py +9 -6
  150. scipy/interpolate/_fitpack_impl.py +32 -26
  151. scipy/interpolate/_fitpack_repro.py +23 -19
  152. scipy/interpolate/_interpnd.cpython-312-darwin.so +0 -0
  153. scipy/interpolate/_interpolate.py +30 -12
  154. scipy/interpolate/_ndbspline.py +13 -18
  155. scipy/interpolate/_ndgriddata.py +5 -8
  156. scipy/interpolate/_polyint.py +95 -31
  157. scipy/interpolate/_ppoly.cpython-312-darwin.so +0 -0
  158. scipy/interpolate/_rbf.py +2 -2
  159. scipy/interpolate/_rbfinterp.py +1 -1
  160. scipy/interpolate/_rbfinterp_pythran.cpython-312-darwin.so +0 -0
  161. scipy/interpolate/_rgi.py +31 -26
  162. scipy/interpolate/_rgi_cython.cpython-312-darwin.so +0 -0
  163. scipy/interpolate/dfitpack.py +0 -20
  164. scipy/interpolate/interpnd.py +1 -2
  165. scipy/interpolate/tests/test_bary_rational.py +2 -2
  166. scipy/interpolate/tests/test_bsplines.py +97 -1
  167. scipy/interpolate/tests/test_fitpack2.py +39 -1
  168. scipy/interpolate/tests/test_interpnd.py +32 -20
  169. scipy/interpolate/tests/test_interpolate.py +48 -4
  170. scipy/interpolate/tests/test_rgi.py +2 -1
  171. scipy/io/_fast_matrix_market/__init__.py +2 -0
  172. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  173. scipy/io/_harwell_boeing/hb.py +7 -11
  174. scipy/io/_idl.py +5 -7
  175. scipy/io/_netcdf.py +15 -5
  176. scipy/io/_test_fortran.cpython-312-darwin.so +0 -0
  177. scipy/io/arff/tests/test_arffread.py +3 -3
  178. scipy/io/matlab/__init__.py +5 -3
  179. scipy/io/matlab/_mio.py +4 -1
  180. scipy/io/matlab/_mio5.py +19 -13
  181. scipy/io/matlab/_mio5_utils.cpython-312-darwin.so +0 -0
  182. scipy/io/matlab/_mio_utils.cpython-312-darwin.so +0 -0
  183. scipy/io/matlab/_miobase.py +4 -1
  184. scipy/io/matlab/_streams.cpython-312-darwin.so +0 -0
  185. scipy/io/matlab/tests/test_mio.py +46 -18
  186. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  187. scipy/io/tests/test_mmio.py +7 -1
  188. scipy/io/tests/test_wavfile.py +41 -0
  189. scipy/io/wavfile.py +57 -10
  190. scipy/linalg/_basic.py +113 -86
  191. scipy/linalg/_cythonized_array_utils.cpython-312-darwin.so +0 -0
  192. scipy/linalg/_decomp.py +22 -9
  193. scipy/linalg/_decomp_cholesky.py +28 -13
  194. scipy/linalg/_decomp_cossin.py +45 -30
  195. scipy/linalg/_decomp_interpolative.cpython-312-darwin.so +0 -0
  196. scipy/linalg/_decomp_ldl.py +4 -1
  197. scipy/linalg/_decomp_lu.py +18 -6
  198. scipy/linalg/_decomp_lu_cython.cpython-312-darwin.so +0 -0
  199. scipy/linalg/_decomp_polar.py +2 -0
  200. scipy/linalg/_decomp_qr.py +6 -2
  201. scipy/linalg/_decomp_qz.py +3 -0
  202. scipy/linalg/_decomp_schur.py +3 -1
  203. scipy/linalg/_decomp_svd.py +13 -2
  204. scipy/linalg/_decomp_update.cpython-312-darwin.so +0 -0
  205. scipy/linalg/_expm_frechet.py +4 -0
  206. scipy/linalg/_fblas.cpython-312-darwin.so +0 -0
  207. scipy/linalg/_flapack.cpython-312-darwin.so +0 -0
  208. scipy/linalg/_linalg_pythran.cpython-312-darwin.so +0 -0
  209. scipy/linalg/_matfuncs.py +187 -4
  210. scipy/linalg/_matfuncs_expm.cpython-312-darwin.so +0 -0
  211. scipy/linalg/_matfuncs_schur_sqrtm.cpython-312-darwin.so +0 -0
  212. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  213. scipy/linalg/_matfuncs_sqrtm_triu.cpython-312-darwin.so +0 -0
  214. scipy/linalg/_procrustes.py +2 -0
  215. scipy/linalg/_sketches.py +17 -6
  216. scipy/linalg/_solve_toeplitz.cpython-312-darwin.so +0 -0
  217. scipy/linalg/_solvers.py +7 -2
  218. scipy/linalg/_special_matrices.py +26 -36
  219. scipy/linalg/cython_blas.cpython-312-darwin.so +0 -0
  220. scipy/linalg/cython_lapack.cpython-312-darwin.so +0 -0
  221. scipy/linalg/lapack.py +22 -2
  222. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  223. scipy/linalg/tests/test_basic.py +31 -16
  224. scipy/linalg/tests/test_batch.py +588 -0
  225. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  226. scipy/linalg/tests/test_decomp.py +40 -3
  227. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  228. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  229. scipy/linalg/tests/test_lapack.py +115 -7
  230. scipy/linalg/tests/test_matfuncs.py +157 -102
  231. scipy/linalg/tests/test_procrustes.py +0 -7
  232. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  233. scipy/linalg/tests/test_special_matrices.py +1 -5
  234. scipy/ndimage/__init__.py +1 -0
  235. scipy/ndimage/_cytest.cpython-312-darwin.so +0 -0
  236. scipy/ndimage/_delegators.py +8 -2
  237. scipy/ndimage/_filters.py +453 -5
  238. scipy/ndimage/_interpolation.py +36 -6
  239. scipy/ndimage/_measurements.py +4 -2
  240. scipy/ndimage/_morphology.py +5 -0
  241. scipy/ndimage/_nd_image.cpython-312-darwin.so +0 -0
  242. scipy/ndimage/_ni_docstrings.py +5 -1
  243. scipy/ndimage/_ni_label.cpython-312-darwin.so +0 -0
  244. scipy/ndimage/_ni_support.py +1 -5
  245. scipy/ndimage/_rank_filter_1d.cpython-312-darwin.so +0 -0
  246. scipy/ndimage/_support_alternative_backends.py +18 -6
  247. scipy/ndimage/tests/test_filters.py +370 -259
  248. scipy/ndimage/tests/test_fourier.py +7 -9
  249. scipy/ndimage/tests/test_interpolation.py +68 -61
  250. scipy/ndimage/tests/test_measurements.py +18 -35
  251. scipy/ndimage/tests/test_morphology.py +143 -131
  252. scipy/ndimage/tests/test_splines.py +1 -3
  253. scipy/odr/__odrpack.cpython-312-darwin.so +0 -0
  254. scipy/optimize/_basinhopping.py +13 -7
  255. scipy/optimize/_bglu_dense.cpython-312-darwin.so +0 -0
  256. scipy/optimize/_bracket.py +17 -24
  257. scipy/optimize/_chandrupatla.py +9 -10
  258. scipy/optimize/_cobyla_py.py +104 -123
  259. scipy/optimize/_constraints.py +14 -10
  260. scipy/optimize/_differentiable_functions.py +371 -230
  261. scipy/optimize/_differentialevolution.py +4 -3
  262. scipy/optimize/_direct.cpython-312-darwin.so +0 -0
  263. scipy/optimize/_dual_annealing.py +1 -1
  264. scipy/optimize/_elementwise.py +1 -4
  265. scipy/optimize/_group_columns.cpython-312-darwin.so +0 -0
  266. scipy/optimize/_lbfgsb.cpython-312-darwin.so +0 -0
  267. scipy/optimize/_lbfgsb_py.py +57 -16
  268. scipy/optimize/_linprog_doc.py +2 -2
  269. scipy/optimize/_linprog_highs.py +2 -2
  270. scipy/optimize/_linprog_ip.py +25 -10
  271. scipy/optimize/_linprog_util.py +14 -16
  272. scipy/optimize/_lsap.cpython-312-darwin.so +0 -0
  273. scipy/optimize/_lsq/common.py +3 -3
  274. scipy/optimize/_lsq/dogbox.py +16 -2
  275. scipy/optimize/_lsq/givens_elimination.cpython-312-darwin.so +0 -0
  276. scipy/optimize/_lsq/least_squares.py +198 -126
  277. scipy/optimize/_lsq/lsq_linear.py +6 -6
  278. scipy/optimize/_lsq/trf.py +35 -8
  279. scipy/optimize/_milp.py +3 -1
  280. scipy/optimize/_minimize.py +105 -36
  281. scipy/optimize/_minpack.cpython-312-darwin.so +0 -0
  282. scipy/optimize/_minpack_py.py +21 -14
  283. scipy/optimize/_moduleTNC.cpython-312-darwin.so +0 -0
  284. scipy/optimize/_nnls.py +20 -21
  285. scipy/optimize/_nonlin.py +34 -3
  286. scipy/optimize/_numdiff.py +288 -110
  287. scipy/optimize/_optimize.py +86 -48
  288. scipy/optimize/_pava_pybind.cpython-312-darwin.so +0 -0
  289. scipy/optimize/_remove_redundancy.py +5 -5
  290. scipy/optimize/_root_scalar.py +1 -1
  291. scipy/optimize/_shgo.py +6 -0
  292. scipy/optimize/_shgo_lib/_complex.py +1 -1
  293. scipy/optimize/_slsqp_py.py +216 -124
  294. scipy/optimize/_slsqplib.cpython-312-darwin.so +0 -0
  295. scipy/optimize/_spectral.py +1 -1
  296. scipy/optimize/_tnc.py +8 -1
  297. scipy/optimize/_trlib/_trlib.cpython-312-darwin.so +0 -0
  298. scipy/optimize/_trustregion.py +20 -6
  299. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  300. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  301. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  302. scipy/optimize/_trustregion_constr/projections.py +12 -8
  303. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  304. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  305. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  306. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  307. scipy/optimize/_trustregion_exact.py +0 -1
  308. scipy/optimize/_zeros.cpython-312-darwin.so +0 -0
  309. scipy/optimize/_zeros_py.py +97 -17
  310. scipy/optimize/cython_optimize/_zeros.cpython-312-darwin.so +0 -0
  311. scipy/optimize/slsqp.py +0 -1
  312. scipy/optimize/tests/test__basinhopping.py +1 -1
  313. scipy/optimize/tests/test__differential_evolution.py +4 -4
  314. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  315. scipy/optimize/tests/test__numdiff.py +66 -22
  316. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  317. scipy/optimize/tests/test__shgo.py +9 -1
  318. scipy/optimize/tests/test_bracket.py +36 -46
  319. scipy/optimize/tests/test_chandrupatla.py +133 -135
  320. scipy/optimize/tests/test_cobyla.py +74 -45
  321. scipy/optimize/tests/test_constraints.py +1 -1
  322. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  323. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  324. scipy/optimize/tests/test_least_squares.py +125 -13
  325. scipy/optimize/tests/test_linear_assignment.py +3 -3
  326. scipy/optimize/tests/test_linprog.py +3 -3
  327. scipy/optimize/tests/test_lsq_linear.py +6 -6
  328. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  329. scipy/optimize/tests/test_minpack.py +4 -4
  330. scipy/optimize/tests/test_nnls.py +43 -3
  331. scipy/optimize/tests/test_nonlin.py +36 -0
  332. scipy/optimize/tests/test_optimize.py +95 -17
  333. scipy/optimize/tests/test_slsqp.py +36 -4
  334. scipy/optimize/tests/test_zeros.py +34 -1
  335. scipy/signal/__init__.py +12 -23
  336. scipy/signal/_delegators.py +568 -0
  337. scipy/signal/_filter_design.py +459 -241
  338. scipy/signal/_fir_filter_design.py +262 -90
  339. scipy/signal/_lti_conversion.py +3 -2
  340. scipy/signal/_ltisys.py +118 -91
  341. scipy/signal/_max_len_seq_inner.cpython-312-darwin.so +0 -0
  342. scipy/signal/_peak_finding_utils.cpython-312-darwin.so +0 -0
  343. scipy/signal/_polyutils.py +172 -0
  344. scipy/signal/_short_time_fft.py +519 -70
  345. scipy/signal/_signal_api.py +30 -0
  346. scipy/signal/_signaltools.py +719 -399
  347. scipy/signal/_sigtools.cpython-312-darwin.so +0 -0
  348. scipy/signal/_sosfilt.cpython-312-darwin.so +0 -0
  349. scipy/signal/_spectral_py.py +230 -50
  350. scipy/signal/_spline.cpython-312-darwin.so +0 -0
  351. scipy/signal/_spline_filters.py +108 -68
  352. scipy/signal/_support_alternative_backends.py +73 -0
  353. scipy/signal/_upfirdn.py +4 -1
  354. scipy/signal/_upfirdn_apply.cpython-312-darwin.so +0 -0
  355. scipy/signal/_waveforms.py +2 -11
  356. scipy/signal/_wavelets.py +1 -1
  357. scipy/signal/fir_filter_design.py +1 -0
  358. scipy/signal/spline.py +4 -11
  359. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  360. scipy/signal/tests/test_bsplines.py +114 -79
  361. scipy/signal/tests/test_cont2discrete.py +9 -2
  362. scipy/signal/tests/test_filter_design.py +721 -481
  363. scipy/signal/tests/test_fir_filter_design.py +332 -140
  364. scipy/signal/tests/test_savitzky_golay.py +4 -3
  365. scipy/signal/tests/test_short_time_fft.py +221 -3
  366. scipy/signal/tests/test_signaltools.py +2144 -1348
  367. scipy/signal/tests/test_spectral.py +50 -6
  368. scipy/signal/tests/test_splines.py +161 -96
  369. scipy/signal/tests/test_upfirdn.py +84 -50
  370. scipy/signal/tests/test_waveforms.py +20 -0
  371. scipy/signal/tests/test_windows.py +607 -466
  372. scipy/signal/windows/_windows.py +287 -148
  373. scipy/sparse/__init__.py +23 -4
  374. scipy/sparse/_base.py +270 -108
  375. scipy/sparse/_bsr.py +7 -4
  376. scipy/sparse/_compressed.py +59 -231
  377. scipy/sparse/_construct.py +90 -38
  378. scipy/sparse/_coo.py +115 -181
  379. scipy/sparse/_csc.py +4 -4
  380. scipy/sparse/_csparsetools.cpython-312-darwin.so +0 -0
  381. scipy/sparse/_csr.py +2 -2
  382. scipy/sparse/_data.py +48 -48
  383. scipy/sparse/_dia.py +105 -18
  384. scipy/sparse/_dok.py +0 -23
  385. scipy/sparse/_index.py +4 -4
  386. scipy/sparse/_matrix.py +23 -0
  387. scipy/sparse/_sparsetools.cpython-312-darwin.so +0 -0
  388. scipy/sparse/_sputils.py +37 -22
  389. scipy/sparse/base.py +0 -9
  390. scipy/sparse/bsr.py +0 -14
  391. scipy/sparse/compressed.py +0 -23
  392. scipy/sparse/construct.py +0 -6
  393. scipy/sparse/coo.py +0 -14
  394. scipy/sparse/csc.py +0 -3
  395. scipy/sparse/csgraph/_flow.cpython-312-darwin.so +0 -0
  396. scipy/sparse/csgraph/_matching.cpython-312-darwin.so +0 -0
  397. scipy/sparse/csgraph/_min_spanning_tree.cpython-312-darwin.so +0 -0
  398. scipy/sparse/csgraph/_reordering.cpython-312-darwin.so +0 -0
  399. scipy/sparse/csgraph/_shortest_path.cpython-312-darwin.so +0 -0
  400. scipy/sparse/csgraph/_tools.cpython-312-darwin.so +0 -0
  401. scipy/sparse/csgraph/_traversal.cpython-312-darwin.so +0 -0
  402. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  403. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  404. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  405. scipy/sparse/csr.py +0 -5
  406. scipy/sparse/data.py +1 -6
  407. scipy/sparse/dia.py +0 -7
  408. scipy/sparse/dok.py +0 -10
  409. scipy/sparse/linalg/_dsolve/_superlu.cpython-312-darwin.so +0 -0
  410. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  411. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  412. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-312-darwin.so +0 -0
  413. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  414. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  415. scipy/sparse/linalg/_interface.py +17 -18
  416. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  417. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  418. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  419. scipy/sparse/linalg/_isolve/minres.py +5 -5
  420. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  421. scipy/sparse/linalg/_isolve/utils.py +2 -8
  422. scipy/sparse/linalg/_matfuncs.py +1 -1
  423. scipy/sparse/linalg/_norm.py +1 -1
  424. scipy/sparse/linalg/_propack/_cpropack.cpython-312-darwin.so +0 -0
  425. scipy/sparse/linalg/_propack/_dpropack.cpython-312-darwin.so +0 -0
  426. scipy/sparse/linalg/_propack/_spropack.cpython-312-darwin.so +0 -0
  427. scipy/sparse/linalg/_propack/_zpropack.cpython-312-darwin.so +0 -0
  428. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  429. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  430. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  431. scipy/sparse/tests/test_base.py +214 -42
  432. scipy/sparse/tests/test_common1d.py +7 -7
  433. scipy/sparse/tests/test_construct.py +1 -1
  434. scipy/sparse/tests/test_coo.py +272 -4
  435. scipy/sparse/tests/test_sparsetools.py +5 -0
  436. scipy/sparse/tests/test_sputils.py +36 -7
  437. scipy/spatial/_ckdtree.cpython-312-darwin.so +0 -0
  438. scipy/spatial/_distance_pybind.cpython-312-darwin.so +0 -0
  439. scipy/spatial/_distance_wrap.cpython-312-darwin.so +0 -0
  440. scipy/spatial/_hausdorff.cpython-312-darwin.so +0 -0
  441. scipy/spatial/_qhull.cpython-312-darwin.so +0 -0
  442. scipy/spatial/_voronoi.cpython-312-darwin.so +0 -0
  443. scipy/spatial/distance.py +49 -42
  444. scipy/spatial/tests/test_distance.py +15 -1
  445. scipy/spatial/tests/test_kdtree.py +1 -0
  446. scipy/spatial/tests/test_qhull.py +7 -2
  447. scipy/spatial/transform/__init__.py +5 -3
  448. scipy/spatial/transform/_rigid_transform.cpython-312-darwin.so +0 -0
  449. scipy/spatial/transform/_rotation.cpython-312-darwin.so +0 -0
  450. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  451. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  452. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  453. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  454. scipy/special/__init__.py +1 -47
  455. scipy/special/_add_newdocs.py +34 -772
  456. scipy/special/_basic.py +22 -25
  457. scipy/special/_comb.cpython-312-darwin.so +0 -0
  458. scipy/special/_ellip_harm_2.cpython-312-darwin.so +0 -0
  459. scipy/special/_gufuncs.cpython-312-darwin.so +0 -0
  460. scipy/special/_logsumexp.py +67 -58
  461. scipy/special/_orthogonal.pyi +1 -1
  462. scipy/special/_specfun.cpython-312-darwin.so +0 -0
  463. scipy/special/_special_ufuncs.cpython-312-darwin.so +0 -0
  464. scipy/special/_spherical_bessel.py +4 -4
  465. scipy/special/_support_alternative_backends.py +212 -119
  466. scipy/special/_test_internal.cpython-312-darwin.so +0 -0
  467. scipy/special/_testutils.py +4 -4
  468. scipy/special/_ufuncs.cpython-312-darwin.so +0 -0
  469. scipy/special/_ufuncs.pyi +1 -0
  470. scipy/special/_ufuncs.pyx +215 -1400
  471. scipy/special/_ufuncs_cxx.cpython-312-darwin.so +0 -0
  472. scipy/special/_ufuncs_cxx.pxd +2 -15
  473. scipy/special/_ufuncs_cxx.pyx +5 -44
  474. scipy/special/_ufuncs_cxx_defs.h +2 -16
  475. scipy/special/_ufuncs_defs.h +0 -8
  476. scipy/special/cython_special.cpython-312-darwin.so +0 -0
  477. scipy/special/cython_special.pxd +1 -1
  478. scipy/special/tests/_cython_examples/meson.build +10 -1
  479. scipy/special/tests/test_basic.py +153 -20
  480. scipy/special/tests/test_boost_ufuncs.py +3 -0
  481. scipy/special/tests/test_cdflib.py +35 -11
  482. scipy/special/tests/test_gammainc.py +16 -0
  483. scipy/special/tests/test_hyp2f1.py +2 -2
  484. scipy/special/tests/test_log1mexp.py +85 -0
  485. scipy/special/tests/test_logsumexp.py +206 -64
  486. scipy/special/tests/test_mpmath.py +1 -0
  487. scipy/special/tests/test_nan_inputs.py +1 -1
  488. scipy/special/tests/test_orthogonal.py +17 -18
  489. scipy/special/tests/test_sf_error.py +3 -2
  490. scipy/special/tests/test_sph_harm.py +6 -7
  491. scipy/special/tests/test_support_alternative_backends.py +211 -76
  492. scipy/stats/__init__.py +4 -1
  493. scipy/stats/_ansari_swilk_statistics.cpython-312-darwin.so +0 -0
  494. scipy/stats/_axis_nan_policy.py +5 -12
  495. scipy/stats/_biasedurn.cpython-312-darwin.so +0 -0
  496. scipy/stats/_continued_fraction.py +387 -0
  497. scipy/stats/_continuous_distns.py +277 -310
  498. scipy/stats/_correlation.py +1 -1
  499. scipy/stats/_covariance.py +6 -3
  500. scipy/stats/_discrete_distns.py +39 -32
  501. scipy/stats/_distn_infrastructure.py +39 -12
  502. scipy/stats/_distribution_infrastructure.py +900 -238
  503. scipy/stats/_entropy.py +9 -10
  504. scipy/{_lib → stats}/_finite_differences.py +1 -1
  505. scipy/stats/_hypotests.py +83 -50
  506. scipy/stats/_kde.py +53 -49
  507. scipy/stats/_ksstats.py +1 -1
  508. scipy/stats/_levy_stable/__init__.py +7 -15
  509. scipy/stats/_levy_stable/levyst.cpython-312-darwin.so +0 -0
  510. scipy/stats/_morestats.py +118 -73
  511. scipy/stats/_mstats_basic.py +13 -17
  512. scipy/stats/_mstats_extras.py +8 -8
  513. scipy/stats/_multivariate.py +89 -113
  514. scipy/stats/_new_distributions.py +97 -20
  515. scipy/stats/_page_trend_test.py +12 -5
  516. scipy/stats/_probability_distribution.py +265 -43
  517. scipy/stats/_qmc.py +14 -9
  518. scipy/stats/_qmc_cy.cpython-312-darwin.so +0 -0
  519. scipy/stats/_qmvnt.py +16 -95
  520. scipy/stats/_qmvnt_cy.cpython-312-darwin.so +0 -0
  521. scipy/stats/_quantile.py +335 -0
  522. scipy/stats/_rcont/rcont.cpython-312-darwin.so +0 -0
  523. scipy/stats/_resampling.py +4 -29
  524. scipy/stats/_sampling.py +1 -1
  525. scipy/stats/_sobol.cpython-312-darwin.so +0 -0
  526. scipy/stats/_stats.cpython-312-darwin.so +0 -0
  527. scipy/stats/_stats_mstats_common.py +21 -2
  528. scipy/stats/_stats_py.py +550 -476
  529. scipy/stats/_stats_pythran.cpython-312-darwin.so +0 -0
  530. scipy/stats/_unuran/unuran_wrapper.cpython-312-darwin.so +0 -0
  531. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  532. scipy/stats/_variation.py +6 -8
  533. scipy/stats/_wilcoxon.py +13 -7
  534. scipy/stats/tests/common_tests.py +6 -4
  535. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  536. scipy/stats/tests/test_continued_fraction.py +173 -0
  537. scipy/stats/tests/test_continuous.py +379 -60
  538. scipy/stats/tests/test_continuous_basic.py +18 -12
  539. scipy/stats/tests/test_discrete_basic.py +14 -8
  540. scipy/stats/tests/test_discrete_distns.py +16 -16
  541. scipy/stats/tests/test_distributions.py +95 -75
  542. scipy/stats/tests/test_entropy.py +40 -48
  543. scipy/stats/tests/test_fit.py +4 -3
  544. scipy/stats/tests/test_hypotests.py +153 -24
  545. scipy/stats/tests/test_kdeoth.py +109 -41
  546. scipy/stats/tests/test_marray.py +289 -0
  547. scipy/stats/tests/test_morestats.py +79 -47
  548. scipy/stats/tests/test_mstats_basic.py +3 -3
  549. scipy/stats/tests/test_multivariate.py +434 -83
  550. scipy/stats/tests/test_qmc.py +13 -10
  551. scipy/stats/tests/test_quantile.py +199 -0
  552. scipy/stats/tests/test_rank.py +119 -112
  553. scipy/stats/tests/test_resampling.py +47 -56
  554. scipy/stats/tests/test_sampling.py +9 -4
  555. scipy/stats/tests/test_stats.py +799 -939
  556. scipy/stats/tests/test_variation.py +8 -6
  557. scipy/version.py +2 -2
  558. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  559. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  560. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +561 -568
  561. scipy-1.16.0rc2.dist-info/WHEEL +6 -0
  562. scipy/_lib/array_api_extra/_funcs.py +0 -484
  563. scipy/_lib/array_api_extra/_typing.py +0 -8
  564. scipy/interpolate/_bspl.cpython-312-darwin.so +0 -0
  565. scipy/optimize/_cobyla.cpython-312-darwin.so +0 -0
  566. scipy/optimize/_cython_nnls.cpython-312-darwin.so +0 -0
  567. scipy/optimize/_slsqp.cpython-312-darwin.so +0 -0
  568. scipy/spatial/qhull_src/COPYING.txt +0 -38
  569. scipy/special/libsf_error_state.dylib +0 -0
  570. scipy/special/tests/test_log_softmax.py +0 -109
  571. scipy/special/tests/test_xsf_cuda.py +0 -114
  572. scipy/special/xsf/binom.h +0 -89
  573. scipy/special/xsf/cdflib.h +0 -100
  574. scipy/special/xsf/cephes/airy.h +0 -307
  575. scipy/special/xsf/cephes/besselpoly.h +0 -51
  576. scipy/special/xsf/cephes/beta.h +0 -257
  577. scipy/special/xsf/cephes/cbrt.h +0 -131
  578. scipy/special/xsf/cephes/chbevl.h +0 -85
  579. scipy/special/xsf/cephes/chdtr.h +0 -193
  580. scipy/special/xsf/cephes/const.h +0 -87
  581. scipy/special/xsf/cephes/ellie.h +0 -293
  582. scipy/special/xsf/cephes/ellik.h +0 -251
  583. scipy/special/xsf/cephes/ellpe.h +0 -107
  584. scipy/special/xsf/cephes/ellpk.h +0 -117
  585. scipy/special/xsf/cephes/expn.h +0 -260
  586. scipy/special/xsf/cephes/gamma.h +0 -398
  587. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  588. scipy/special/xsf/cephes/hyperg.h +0 -361
  589. scipy/special/xsf/cephes/i0.h +0 -149
  590. scipy/special/xsf/cephes/i1.h +0 -158
  591. scipy/special/xsf/cephes/igam.h +0 -421
  592. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  593. scipy/special/xsf/cephes/igami.h +0 -313
  594. scipy/special/xsf/cephes/j0.h +0 -225
  595. scipy/special/xsf/cephes/j1.h +0 -198
  596. scipy/special/xsf/cephes/jv.h +0 -715
  597. scipy/special/xsf/cephes/k0.h +0 -164
  598. scipy/special/xsf/cephes/k1.h +0 -163
  599. scipy/special/xsf/cephes/kn.h +0 -243
  600. scipy/special/xsf/cephes/lanczos.h +0 -112
  601. scipy/special/xsf/cephes/ndtr.h +0 -275
  602. scipy/special/xsf/cephes/poch.h +0 -85
  603. scipy/special/xsf/cephes/polevl.h +0 -167
  604. scipy/special/xsf/cephes/psi.h +0 -194
  605. scipy/special/xsf/cephes/rgamma.h +0 -111
  606. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  607. scipy/special/xsf/cephes/shichi.h +0 -248
  608. scipy/special/xsf/cephes/sici.h +0 -224
  609. scipy/special/xsf/cephes/sindg.h +0 -221
  610. scipy/special/xsf/cephes/tandg.h +0 -139
  611. scipy/special/xsf/cephes/trig.h +0 -58
  612. scipy/special/xsf/cephes/unity.h +0 -186
  613. scipy/special/xsf/cephes/zeta.h +0 -172
  614. scipy/special/xsf/config.h +0 -304
  615. scipy/special/xsf/digamma.h +0 -205
  616. scipy/special/xsf/error.h +0 -57
  617. scipy/special/xsf/evalpoly.h +0 -47
  618. scipy/special/xsf/expint.h +0 -266
  619. scipy/special/xsf/hyp2f1.h +0 -694
  620. scipy/special/xsf/iv_ratio.h +0 -173
  621. scipy/special/xsf/lambertw.h +0 -150
  622. scipy/special/xsf/loggamma.h +0 -163
  623. scipy/special/xsf/sici.h +0 -200
  624. scipy/special/xsf/tools.h +0 -427
  625. scipy/special/xsf/trig.h +0 -164
  626. scipy/special/xsf/wright_bessel.h +0 -843
  627. scipy/special/xsf/zlog1.h +0 -35
  628. scipy/stats/_mvn.cpython-312-darwin.so +0 -0
  629. scipy-1.15.3.dist-info/WHEEL +0 -4
@@ -121,19 +121,21 @@ def cases_test_cont_basic():
121
121
 
122
122
  @pytest.mark.parametrize('distname,arg', cases_test_cont_basic())
123
123
  @pytest.mark.parametrize('sn', [500])
124
- def test_cont_basic(distname, arg, sn):
124
+ def test_cont_basic(distname, arg, sn, num_parallel_threads):
125
125
  try:
126
126
  distfn = getattr(stats, distname)
127
127
  except TypeError:
128
128
  distfn = distname
129
129
  distname = 'rv_histogram_instance'
130
130
 
131
- rng = np.random.RandomState(765456)
131
+ rng = np.random.default_rng(7654565)
132
132
  rvs = distfn.rvs(size=sn, *arg, random_state=rng)
133
133
  m, v = distfn.stats(*arg)
134
134
 
135
135
  if distname not in {'laplace_asymmetric'}:
136
- check_sample_meanvar_(m, v, rvs)
136
+ # TODO: multiple checks in this function are not robust, tweaking the
137
+ # seed above will make different distributions fail.
138
+ check_sample_meanvar_(m, v, rvs, rng)
137
139
  check_cdf_ppf(distfn, arg, distname)
138
140
  check_sf_isf(distfn, arg, distname)
139
141
  check_cdf_sf(distfn, arg, distname)
@@ -167,13 +169,14 @@ def test_cont_basic(distname, arg, sn):
167
169
  arg = (3,)
168
170
 
169
171
  check_named_args(distfn, x, arg, locscale_defaults, meths)
170
- check_random_state_property(distfn, arg)
172
+ if num_parallel_threads == 1:
173
+ check_random_state_property(distfn, arg)
171
174
 
172
- if distname in ['rel_breitwigner'] and _IS_32BIT:
173
- # gh18414
174
- pytest.skip("fails on Linux 32-bit")
175
- else:
176
- check_pickling(distfn, arg)
175
+ if distname in ['rel_breitwigner'] and _IS_32BIT:
176
+ # gh18414
177
+ pytest.skip("fails on Linux 32-bit")
178
+ else:
179
+ check_pickling(distfn, arg)
177
180
  check_freezing(distfn, arg)
178
181
 
179
182
  # Entropy
@@ -281,6 +284,7 @@ def test_rvs_scalar(distname, arg):
281
284
  assert np.isscalar(distfn.rvs(*arg, size=None))
282
285
 
283
286
 
287
+ @pytest.mark.parallel_threads(1)
284
288
  def test_levy_stable_random_state_property():
285
289
  # levy_stable only implements rvs(), so it is skipped in the
286
290
  # main loop in test_cont_basic(). Here we apply just the test
@@ -581,11 +585,11 @@ def test_method_of_moments():
581
585
  npt.assert_almost_equal(loc+scale, b, decimal=4)
582
586
 
583
587
 
584
- def check_sample_meanvar_(popmean, popvar, sample):
588
+ def check_sample_meanvar_(popmean, popvar, sample, rng):
585
589
  if np.isfinite(popmean):
586
590
  check_sample_mean(sample, popmean)
587
591
  if np.isfinite(popvar):
588
- check_sample_var(sample, popvar)
592
+ check_sample_var(sample, popvar, rng)
589
593
 
590
594
 
591
595
  def check_sample_mean(sample, popmean):
@@ -594,7 +598,7 @@ def check_sample_mean(sample, popmean):
594
598
  assert prob > 0.01
595
599
 
596
600
 
597
- def check_sample_var(sample, popvar):
601
+ def check_sample_var(sample, popvar, rng):
598
602
  # check that population mean lies within the CI bootstrapped from the
599
603
  # sample. This used to be a chi-squared test for variance, but there were
600
604
  # too many false positives
@@ -602,6 +606,7 @@ def check_sample_var(sample, popvar):
602
606
  (sample,),
603
607
  lambda x, axis: x.var(ddof=1, axis=axis),
604
608
  confidence_level=0.995,
609
+ rng=rng,
605
610
  )
606
611
  conf = res.confidence_interval
607
612
  low, high = conf.low, conf.high
@@ -986,6 +991,7 @@ def test_kappa4_array_gh13582():
986
991
  assert res2.shape == (4, 4, 3)
987
992
 
988
993
 
994
+ @pytest.mark.parallel_threads(1)
989
995
  def test_frozen_attributes():
990
996
  # gh-14827 reported that all frozen distributions had both pmf and pdf
991
997
  # attributes; continuous should have pdf and discrete should have pmf.
@@ -36,14 +36,18 @@ def cases_test_discrete_basic():
36
36
 
37
37
 
38
38
  @pytest.mark.parametrize('distname,arg,first_case', cases_test_discrete_basic())
39
- def test_discrete_basic(distname, arg, first_case):
39
+ def test_discrete_basic(distname, arg, first_case, num_parallel_threads):
40
+ if (isinstance(distname, str) and distname.startswith('nchypergeom')
41
+ and num_parallel_threads > 1):
42
+ pytest.skip(reason='nchypergeom has a global random generator')
43
+
40
44
  try:
41
45
  distfn = getattr(stats, distname)
42
46
  except TypeError:
43
47
  distfn = distname
44
48
  distname = 'sample distribution'
45
- np.random.seed(9765456)
46
- rvs = distfn.rvs(size=2000, *arg)
49
+ rng = np.random.RandomState(9765456)
50
+ rvs = distfn.rvs(*arg, size=2000, random_state=rng)
47
51
  supp = np.unique(rvs)
48
52
  m, v = distfn.stats(*arg)
49
53
  check_cdf_ppf(distfn, arg, supp, distname + ' cdf_ppf')
@@ -68,9 +72,10 @@ def test_discrete_basic(distname, arg, first_case):
68
72
  check_named_args(distfn, k, arg, locscale_defaults, meths)
69
73
  if distname != 'sample distribution':
70
74
  check_scale_docstring(distfn)
71
- check_random_state_property(distfn, arg)
72
- if distname not in {'poisson_binom'}: # can't be pickled
73
- check_pickling(distfn, arg)
75
+ if num_parallel_threads == 1:
76
+ check_random_state_property(distfn, arg)
77
+ if distname not in {'poisson_binom'}: # can't be pickled
78
+ check_pickling(distfn, arg)
74
79
  check_freezing(distfn, arg)
75
80
 
76
81
  # Entropy
@@ -413,6 +418,7 @@ def test_integer_shapes(distname, shapename, shapes):
413
418
  assert not np.any(np.isnan(pmf[2, :]))
414
419
 
415
420
 
421
+ @pytest.mark.parallel_threads(1)
416
422
  def test_frozen_attributes():
417
423
  # gh-14827 reported that all frozen distributions had both pmf and pdf
418
424
  # attributes; continuous should have pdf and discrete should have pmf.
@@ -564,11 +570,11 @@ def test_rv_sample():
564
570
  def test__pmf_float_input():
565
571
  # gh-21272
566
572
  # test that `rvs()` can be computed when `_pmf` requires float input
567
-
573
+
568
574
  class rv_exponential(stats.rv_discrete):
569
575
  def _pmf(self, i):
570
576
  return (2/3)*3**(1 - i)
571
-
577
+
572
578
  rv = rv_exponential(a=0.0, b=float('inf'))
573
579
  rvs = rv.rvs(random_state=42) # should not crash due to integer input to `_pmf`
574
580
  assert_allclose(rvs, 0)
@@ -109,10 +109,10 @@ def test_nhypergeom_rvs_shape():
109
109
  def test_nhypergeom_accuracy():
110
110
  # Check that nhypergeom.rvs post-gh-13431 gives the same values as
111
111
  # inverse transform sampling
112
- np.random.seed(0)
113
- x = nhypergeom.rvs(22, 7, 11, size=100)
114
- np.random.seed(0)
115
- p = np.random.uniform(size=100)
112
+ rng = np.random.RandomState(0)
113
+ x = nhypergeom.rvs(22, 7, 11, size=100, random_state=rng)
114
+ rng = np.random.RandomState(0)
115
+ p = rng.uniform(size=100)
116
116
  y = nhypergeom.ppf(p, 22, 7, 11)
117
117
  assert_equal(x, y)
118
118
 
@@ -305,10 +305,10 @@ class TestZipfian:
305
305
  # cdf <- pzipf(k, N = n, shape = a)
306
306
  # print(pmf)
307
307
  # print(cdf)
308
- np.random.seed(0)
309
- k = np.random.randint(1, 20, size=10)
310
- a = np.random.rand(10)*10 + 1
311
- n = np.random.randint(1, 100, size=10)
308
+ rng = np.random.RandomState(0)
309
+ k = rng.randint(1, 20, size=10)
310
+ a = rng.rand(10)*10 + 1
311
+ n = rng.randint(1, 100, size=10)
312
312
  pmf = [8.076972e-03, 2.950214e-05, 9.799333e-01, 3.216601e-06,
313
313
  3.158895e-04, 3.412497e-05, 4.350472e-10, 2.405773e-06,
314
314
  5.860662e-06, 1.053948e-04]
@@ -318,9 +318,9 @@ class TestZipfian:
318
318
  assert_allclose(zipfian.pmf(k, a, n)[1:], pmf[1:], rtol=1e-6)
319
319
  assert_allclose(zipfian.cdf(k, a, n)[1:], cdf[1:], rtol=5e-5)
320
320
 
321
- np.random.seed(0)
321
+ rng = np.random.RandomState(0)
322
322
  naive_tests = np.vstack((np.logspace(-2, 1, 10),
323
- np.random.randint(2, 40, 10))).T
323
+ rng.randint(2, 40, 10))).T
324
324
 
325
325
  @pytest.mark.parametrize("a, n", naive_tests)
326
326
  def test_zipfian_naive(self, a, n):
@@ -424,17 +424,17 @@ class TestNCH:
424
424
  def test_nchypergeom_wallenius_naive(self):
425
425
  # test against a very simple implementation
426
426
 
427
- np.random.seed(2)
427
+ rng = np.random.RandomState(2)
428
428
  shape = (2, 4, 3)
429
429
  max_m = 100
430
- m1 = np.random.randint(1, max_m, size=shape)
431
- m2 = np.random.randint(1, max_m, size=shape)
430
+ m1 = rng.randint(1, max_m, size=shape)
431
+ m2 = rng.randint(1, max_m, size=shape)
432
432
  N = m1 + m2
433
- n = randint.rvs(0, N, size=N.shape)
433
+ n = randint.rvs(0, N, size=N.shape, random_state=rng)
434
434
  xl = np.maximum(0, n-m2)
435
435
  xu = np.minimum(n, m1)
436
- x = randint.rvs(xl, xu, size=xl.shape)
437
- w = np.random.rand(*x.shape)*2
436
+ x = randint.rvs(xl, xu, size=xl.shape, random_state=rng)
437
+ w = rng.rand(*x.shape)*2
438
438
 
439
439
  def support(N, m1, n, w):
440
440
  m2 = N - m1
@@ -5,6 +5,7 @@ import warnings
5
5
  import re
6
6
  import sys
7
7
  import pickle
8
+ import threading
8
9
  from pathlib import Path
9
10
  import os
10
11
  import json
@@ -66,7 +67,7 @@ def test_distributions_submodule():
66
67
  continuous = [dist[0] for dist in distcont] # continuous dist names
67
68
  discrete = [dist[0] for dist in distdiscrete] # discrete dist names
68
69
  other = ['rv_discrete', 'rv_continuous', 'rv_histogram',
69
- 'entropy', 'trapz']
70
+ 'entropy']
70
71
  expected = continuous + discrete + other
71
72
 
72
73
  # need to remove, e.g.,
@@ -1365,25 +1366,27 @@ class TestGennorm:
1365
1366
  assert_almost_equal(pdf1, pdf2)
1366
1367
 
1367
1368
  def test_rvs(self):
1368
- np.random.seed(0)
1369
+ rng = np.random.RandomState(0)
1369
1370
  # 0 < beta < 1
1370
1371
  dist = stats.gennorm(0.5)
1371
- rvs = dist.rvs(size=1000)
1372
+ rvs = dist.rvs(size=1000, random_state=rng)
1372
1373
  assert stats.kstest(rvs, dist.cdf).pvalue > 0.1
1373
1374
  # beta = 1
1374
1375
  dist = stats.gennorm(1)
1375
- rvs = dist.rvs(size=1000)
1376
- rvs_laplace = stats.laplace.rvs(size=1000)
1376
+ rvs = dist.rvs(size=1000, random_state=rng)
1377
+ rvs_laplace = stats.laplace.rvs(size=1000, random_state=rng)
1377
1378
  assert stats.ks_2samp(rvs, rvs_laplace).pvalue > 0.1
1378
1379
  # beta = 2
1379
1380
  dist = stats.gennorm(2)
1380
- rvs = dist.rvs(size=1000)
1381
- rvs_norm = stats.norm.rvs(scale=1/2**0.5, size=1000)
1381
+ dist.random_state = rng
1382
+ rvs = dist.rvs(size=1000, random_state=rng)
1383
+ rvs_norm = stats.norm.rvs(scale=1/2**0.5, size=1000, random_state=rng)
1382
1384
  assert stats.ks_2samp(rvs, rvs_norm).pvalue > 0.1
1383
1385
 
1384
1386
  def test_rvs_broadcasting(self):
1385
- np.random.seed(0)
1387
+ rng = np.random.default_rng(0)
1386
1388
  dist = stats.gennorm([[0.5, 1.], [2., 5.]])
1389
+ dist.random_state = rng
1387
1390
  rvs = dist.rvs(size=[1000, 2, 2])
1388
1391
  assert stats.kstest(rvs[:, 0, 0], stats.gennorm(0.5).cdf)[1] > 0.1
1389
1392
  assert stats.kstest(rvs[:, 0, 1], stats.gennorm(1.0).cdf)[1] > 0.1
@@ -2601,16 +2604,13 @@ class TestPareto:
2601
2604
  expected = (scale/x)**b # 2.25e-18
2602
2605
  assert_allclose(p, expected)
2603
2606
 
2604
- @pytest.fixture(scope='function')
2605
- def rng(self):
2606
- return np.random.default_rng(1234)
2607
-
2608
2607
  @pytest.mark.filterwarnings("ignore:invalid value encountered in "
2609
2608
  "double_scalars")
2610
2609
  @pytest.mark.parametrize("rvs_shape", [1, 2])
2611
2610
  @pytest.mark.parametrize("rvs_loc", [0, 2])
2612
2611
  @pytest.mark.parametrize("rvs_scale", [1, 5])
2613
- def test_fit(self, rvs_shape, rvs_loc, rvs_scale, rng):
2612
+ def test_fit(self, rvs_shape, rvs_loc, rvs_scale):
2613
+ rng = np.random.default_rng(1234)
2614
2614
  data = stats.pareto.rvs(size=100, b=rvs_shape, scale=rvs_scale,
2615
2615
  loc=rvs_loc, random_state=rng)
2616
2616
 
@@ -2641,7 +2641,8 @@ class TestPareto:
2641
2641
  if False in p])
2642
2642
  @np.errstate(invalid="ignore")
2643
2643
  def test_fit_MLE_comp_optimizer(self, rvs_shape, rvs_loc, rvs_scale,
2644
- fix_shape, fix_loc, fix_scale, rng):
2644
+ fix_shape, fix_loc, fix_scale):
2645
+ rng = np.random.default_rng(1234)
2645
2646
  data = stats.pareto.rvs(size=100, b=rvs_shape, scale=rvs_scale,
2646
2647
  loc=rvs_loc, random_state=rng)
2647
2648
 
@@ -2673,7 +2674,8 @@ class TestPareto:
2673
2674
  assert_raises(FitDataError, stats.pareto.fit, [5, 2, 3], floc=1,
2674
2675
  fscale=3)
2675
2676
 
2676
- def test_negative_data(self, rng):
2677
+ def test_negative_data(self):
2678
+ rng = np.random.default_rng(1234)
2677
2679
  data = stats.pareto.rvs(loc=-130, b=1, size=100, random_state=rng)
2678
2680
  assert_array_less(data, 0)
2679
2681
  # The purpose of this test is to make sure that no runtime warnings are
@@ -3345,6 +3347,22 @@ class TestInvgauss:
3345
3347
  def test_entropy(self, mu, ref):
3346
3348
  assert_allclose(stats.invgauss.entropy(mu), ref, rtol=5e-14)
3347
3349
 
3350
+ def test_mu_inf_gh13666(self):
3351
+ # invgauss methods should return correct result when mu=inf
3352
+ # invgauss as mu -> oo is invgamma with shape and scale 0.5;
3353
+ # see gh-13666 and gh-22496
3354
+ dist = stats.invgauss(mu=np.inf)
3355
+ dist0 = stats.invgamma(0.5, scale=0.5)
3356
+ x, p = 1., 0.5
3357
+ assert_allclose(dist.logpdf(x), dist0.logpdf(x))
3358
+ assert_allclose(dist.pdf(x), dist0.pdf(x))
3359
+ assert_allclose(dist.logcdf(x), dist0.logcdf(x))
3360
+ assert_allclose(dist.cdf(x), dist0.cdf(x))
3361
+ assert_allclose(dist.logsf(x), dist0.logsf(x))
3362
+ assert_allclose(dist.sf(x), dist0.sf(x))
3363
+ assert_allclose(dist.ppf(p), dist0.ppf(p))
3364
+ assert_allclose(dist.isf(p), dist0.isf(p))
3365
+
3348
3366
 
3349
3367
  class TestLandau:
3350
3368
  @pytest.mark.parametrize('name', ['pdf', 'cdf', 'sf', 'ppf', 'isf'])
@@ -4168,9 +4186,9 @@ class TestSkewCauchy:
4168
4186
  # qsgt(cdf, mu=0, lambda=lambda, sigma=1, q=1/2, mean.cent=FALSE,
4169
4187
  # var.adj = sqrt(2))
4170
4188
 
4171
- np.random.seed(0)
4172
- a = np.random.rand(10) * 2 - 1
4173
- x = np.random.rand(10) * 10 - 5
4189
+ rng = np.random.RandomState(0)
4190
+ a = rng.rand(10) * 2 - 1
4191
+ x = rng.rand(10) * 10 - 5
4174
4192
  pdf = [0.039473975217333909, 0.305829714049903223, 0.24140158118994162,
4175
4193
  0.019585772402693054, 0.021436553695989482, 0.00909817103867518,
4176
4194
  0.01658423410016873, 0.071083288030394126, 0.103250045941454524,
@@ -4284,22 +4302,24 @@ class TestSkewNorm:
4284
4302
  stats.norm.pdf(x))
4285
4303
 
4286
4304
  def test_rvs(self):
4305
+ rng = check_random_state(1234)
4287
4306
  shape = (3, 4, 5)
4288
- x = stats.skewnorm.rvs(a=0.75, size=shape, random_state=self.rng)
4307
+ x = stats.skewnorm.rvs(a=0.75, size=shape, random_state=rng)
4289
4308
  assert_equal(shape, x.shape)
4290
4309
 
4291
- x = stats.skewnorm.rvs(a=-3, size=shape, random_state=self.rng)
4310
+ x = stats.skewnorm.rvs(a=-3, size=shape, random_state=rng)
4292
4311
  assert_equal(shape, x.shape)
4293
4312
 
4294
4313
  def test_moments(self):
4314
+ rng = check_random_state(1234)
4295
4315
  X = stats.skewnorm.rvs(a=4, size=int(1e6), loc=5, scale=2,
4296
- random_state=self.rng)
4316
+ random_state=rng)
4297
4317
  expected = [np.mean(X), np.var(X), stats.skew(X), stats.kurtosis(X)]
4298
4318
  computed = stats.skewnorm.stats(a=4, loc=5, scale=2, moments='mvsk')
4299
4319
  assert_array_almost_equal(computed, expected, decimal=2)
4300
4320
 
4301
4321
  X = stats.skewnorm.rvs(a=-4, size=int(1e6), loc=5, scale=2,
4302
- random_state=self.rng)
4322
+ random_state=rng)
4303
4323
  expected = [np.mean(X), np.var(X), stats.skew(X), stats.kurtosis(X)]
4304
4324
  computed = stats.skewnorm.stats(a=-4, loc=5, scale=2, moments='mvsk')
4305
4325
  assert_array_almost_equal(computed, expected, decimal=2)
@@ -5145,8 +5165,8 @@ class TestBetaPrime:
5145
5165
  # Testing for gh-18634 revealed that `betaprime` raised a
5146
5166
  # NotImplementedError for higher moments. Check that this is
5147
5167
  # resolved. Parameters are arbitrary but lie on either side of the
5148
- # moment order (5) to test both branches of `_lazywhere`. Reference
5149
- # values produced with Mathematica, e.g.
5168
+ # moment order (5) to test both branches of `xpx.apply_where`.
5169
+ # Reference values produced with Mathematica, e.g.
5150
5170
  # `Moment[BetaPrimeDistribution[2,7],5]`
5151
5171
  ref = [np.inf, 0.867096912929055]
5152
5172
  res = stats.betaprime(2, [4.2, 7.1]).moment(5)
@@ -5742,6 +5762,7 @@ class TestLevyStable:
5742
5762
  ),
5743
5763
  ]
5744
5764
  )
5765
+ @pytest.mark.thread_unsafe
5745
5766
  def test_pdf_nolan_samples(
5746
5767
  self, nolan_pdf_sample_data, pct_range, alpha_range, beta_range
5747
5768
  ):
@@ -5957,6 +5978,7 @@ class TestLevyStable:
5957
5978
  ),
5958
5979
  ]
5959
5980
  )
5981
+ @pytest.mark.thread_unsafe
5960
5982
  def test_cdf_nolan_samples(
5961
5983
  self, nolan_cdf_sample_data, pct_range, alpha_range, beta_range
5962
5984
  ):
@@ -6307,7 +6329,11 @@ class TestLevyStable:
6307
6329
  expected,
6308
6330
  )
6309
6331
 
6310
- def test_frozen_parameterization_gh20821(self):
6332
+ @pytest.fixture
6333
+ def levy_stable_lock(self):
6334
+ return threading.Lock()
6335
+
6336
+ def test_frozen_parameterization_gh20821(self, levy_stable_lock):
6311
6337
  # gh-20821 reported that frozen distributions ignore the parameterization.
6312
6338
  # Check that this is resolved and that the frozen distribution's
6313
6339
  # parameterization can be changed independently of stats.levy_stable
@@ -6316,37 +6342,39 @@ class TestLevyStable:
6316
6342
  unfrozen = stats.levy_stable
6317
6343
  frozen = stats.levy_stable(**shapes)
6318
6344
 
6319
- unfrozen.parameterization = "S0"
6320
- frozen.parameterization = "S1"
6321
- unfrozen_a = unfrozen.rvs(**shapes, size=10, random_state=rng(329823498))
6322
- frozen_a = frozen.rvs(size=10, random_state=rng(329823498))
6323
- assert not np.any(frozen_a == unfrozen_a)
6324
-
6325
- unfrozen.parameterization = "S1"
6326
- frozen.parameterization = "S0"
6327
- unfrozen_b = unfrozen.rvs(**shapes, size=10, random_state=rng(329823498))
6328
- frozen_b = frozen.rvs(size=10, random_state=rng(329823498))
6329
- assert_equal(frozen_b, unfrozen_a)
6330
- assert_equal(unfrozen_b, frozen_a)
6331
-
6332
- def test_frozen_parameterization_gh20821b(self):
6345
+ with levy_stable_lock:
6346
+ unfrozen.parameterization = "S0"
6347
+ frozen.parameterization = "S1"
6348
+ unfrozen_a = unfrozen.rvs(**shapes, size=10, random_state=rng(329823498))
6349
+ frozen_a = frozen.rvs(size=10, random_state=rng(329823498))
6350
+ assert not np.any(frozen_a == unfrozen_a)
6351
+
6352
+ unfrozen.parameterization = "S1"
6353
+ frozen.parameterization = "S0"
6354
+ unfrozen_b = unfrozen.rvs(**shapes, size=10, random_state=rng(329823498))
6355
+ frozen_b = frozen.rvs(size=10, random_state=rng(329823498))
6356
+ assert_equal(frozen_b, unfrozen_a)
6357
+ assert_equal(unfrozen_b, frozen_a)
6358
+
6359
+ def test_frozen_parameterization_gh20821b(self, levy_stable_lock):
6333
6360
  # Check that the parameterization of the frozen distribution is that of
6334
6361
  # the unfrozen distribution at the time of freezing
6335
6362
  rng = np.random.default_rng
6336
6363
  shapes = dict(alpha=1.9, beta=0.1, loc=0.0, scale=1.0)
6337
6364
  unfrozen = stats.levy_stable
6338
6365
 
6339
- unfrozen.parameterization = "S0"
6340
- frozen = stats.levy_stable(**shapes)
6341
- unfrozen_a = unfrozen.rvs(**shapes, size=10, random_state=rng(329823498))
6342
- frozen_a = frozen.rvs(size=10, random_state=rng(329823498))
6343
- assert_equal(frozen_a, unfrozen_a)
6366
+ with levy_stable_lock:
6367
+ unfrozen.parameterization = "S0"
6368
+ frozen = stats.levy_stable(**shapes)
6369
+ unfrozen_a = unfrozen.rvs(**shapes, size=10, random_state=rng(329823498))
6370
+ frozen_a = frozen.rvs(size=10, random_state=rng(329823498))
6371
+ assert_equal(frozen_a, unfrozen_a)
6344
6372
 
6345
- unfrozen.parameterization = "S1"
6346
- frozen = stats.levy_stable(**shapes)
6347
- unfrozen_b = unfrozen.rvs(**shapes, size=10, random_state=rng(329823498))
6348
- frozen_b = frozen.rvs(size=10, random_state=rng(329823498))
6349
- assert_equal(frozen_b, unfrozen_b)
6373
+ unfrozen.parameterization = "S1"
6374
+ frozen = stats.levy_stable(**shapes)
6375
+ unfrozen_b = unfrozen.rvs(**shapes, size=10, random_state=rng(329823498))
6376
+ frozen_b = frozen.rvs(size=10, random_state=rng(329823498))
6377
+ assert_equal(frozen_b, unfrozen_b)
6350
6378
 
6351
6379
 
6352
6380
  class TestArrayArgument: # test for ticket:992
@@ -6994,6 +7022,7 @@ class TestExpect:
6994
7022
  assert_allclose(res,
6995
7023
  sum(_ for _ in range(lo, hi)) / (hi - lo), atol=1e-15)
6996
7024
 
7025
+ @pytest.mark.thread_unsafe
6997
7026
  def test_zipf(self):
6998
7027
  # Test that there is no infinite loop even if the sum diverges
6999
7028
  assert_warns(RuntimeWarning, stats.zipf.expect,
@@ -7921,24 +7950,6 @@ class TestTrapezoid:
7921
7950
 
7922
7951
  assert_allclose(v, res.T.reshape(v.shape), atol=1e-15)
7923
7952
 
7924
- def test_trapz(self):
7925
- # Basic test for alias
7926
- x = np.linspace(0, 1, 10)
7927
- with pytest.deprecated_call(match="`trapz.pdf` is deprecated"):
7928
- result = stats.trapz.pdf(x, 0, 1)
7929
- assert_almost_equal(result, stats.uniform.pdf(x))
7930
-
7931
- @pytest.mark.parametrize('method', ['pdf', 'logpdf', 'cdf', 'logcdf',
7932
- 'sf', 'logsf', 'ppf', 'isf'])
7933
- def test_trapz_deprecation(self, method):
7934
- c, d = 0.2, 0.8
7935
- expected = getattr(stats.trapezoid, method)(1, c, d)
7936
- with pytest.deprecated_call(
7937
- match=f"`trapz.{method}` is deprecated",
7938
- ):
7939
- result = getattr(stats.trapz, method)(1, c, d)
7940
- assert result == expected
7941
-
7942
7953
 
7943
7954
  class TestTriang:
7944
7955
  def test_edge_cases(self):
@@ -8520,9 +8531,9 @@ def test_nan_arguments_gh_issue_1362():
8520
8531
 
8521
8532
 
8522
8533
  def test_frozen_fit_ticket_1536():
8523
- np.random.seed(5678)
8534
+ rng = np.random.default_rng(5678)
8524
8535
  true = np.array([0.25, 0., 0.5])
8525
- x = stats.lognorm.rvs(true[0], true[1], true[2], size=100)
8536
+ x = stats.lognorm.rvs(true[0], true[1], true[2], size=100, random_state=rng)
8526
8537
 
8527
8538
  with np.errstate(divide='ignore'):
8528
8539
  params = np.array(stats.lognorm.fit(x, floc=0.))
@@ -8538,10 +8549,10 @@ def test_frozen_fit_ticket_1536():
8538
8549
  params = np.array(stats.lognorm.fit(x, f0=0.25, floc=0))
8539
8550
  assert_almost_equal(params, true, decimal=2)
8540
8551
 
8541
- np.random.seed(5678)
8552
+ rng = np.random.default_rng(5678)
8542
8553
  loc = 1
8543
8554
  floc = 0.9
8544
- x = stats.norm.rvs(loc, 2., size=100)
8555
+ x = stats.norm.rvs(loc, 2., size=100, random_state=rng)
8545
8556
  params = np.array(stats.norm.fit(x, floc=floc))
8546
8557
  expected = np.array([floc, np.sqrt(((x-floc)**2).mean())])
8547
8558
  assert_almost_equal(params, expected, decimal=4)
@@ -8549,8 +8560,8 @@ def test_frozen_fit_ticket_1536():
8549
8560
 
8550
8561
  def test_regression_ticket_1530():
8551
8562
  # Check the starting value works for Cauchy distribution fit.
8552
- np.random.seed(654321)
8553
- rvs = stats.cauchy.rvs(size=100)
8563
+ rng = np.random.default_rng(654321)
8564
+ rvs = stats.cauchy.rvs(size=100, random_state=rng)
8554
8565
  params = stats.cauchy.fit(rvs)
8555
8566
  expected = (0.045, 1.142)
8556
8567
  assert_almost_equal(params, expected, decimal=1)
@@ -8558,8 +8569,8 @@ def test_regression_ticket_1530():
8558
8569
 
8559
8570
  def test_gh_pr_4806():
8560
8571
  # Check starting values for Cauchy distribution fit.
8561
- np.random.seed(1234)
8562
- x = np.random.randn(42)
8572
+ rng = np.random.RandomState(1234)
8573
+ x = rng.randn(42)
8563
8574
  for offset in 10000.0, 1222333444.0:
8564
8575
  loc, scale = stats.cauchy.fit(x + offset)
8565
8576
  assert_allclose(loc, offset, atol=1.0)
@@ -9940,6 +9951,15 @@ class TestWrapCauchy:
9940
9951
  assert_allclose(p[0], np.arctan(cr*np.tan(x1/2))/np.pi)
9941
9952
  assert_allclose(p[1], 1 - np.arctan(cr*np.tan(np.pi - x2/2))/np.pi)
9942
9953
 
9954
+ @pytest.mark.parametrize('c', [1e-10, 1e-1])
9955
+ @pytest.mark.parametrize('loc', [-100, -2*np.pi, -np.pi, 0, np.pi, 2*np.pi, 100])
9956
+ @pytest.mark.parametrize('scale', [1e-10, 1, 1e10])
9957
+ def test_rvs_lie_on_circle(self, c, loc, scale):
9958
+ # Check that the random variates lie in range [0, 2*pi]
9959
+ x = stats.wrapcauchy.rvs(c=c, loc=loc, scale=scale, size=1000)
9960
+ assert np.all(x >= 0)
9961
+ assert np.all(x <= 2 * np.pi)
9962
+
9943
9963
 
9944
9964
  def test_rvs_no_size_error():
9945
9965
  # _rvs methods must have parameter `size`; see gh-11394