scipy 1.15.3__cp313-cp313t-macosx_14_0_arm64.whl → 1.16.0rc2__cp313-cp313t-macosx_14_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.
- scipy/__config__.py +3 -3
- scipy/__init__.py +3 -6
- scipy/_cyutility.cpython-313t-darwin.so +0 -0
- scipy/_lib/_array_api.py +486 -161
- scipy/_lib/_array_api_compat_vendor.py +9 -0
- scipy/_lib/_bunch.py +4 -0
- scipy/_lib/_ccallback_c.cpython-313t-darwin.so +0 -0
- scipy/_lib/_docscrape.py +1 -1
- scipy/_lib/_elementwise_iterative_method.py +15 -26
- scipy/_lib/_sparse.py +41 -0
- scipy/_lib/_test_deprecation_call.cpython-313t-darwin.so +0 -0
- scipy/_lib/_testutils.py +6 -2
- scipy/_lib/_util.py +222 -125
- scipy/_lib/array_api_compat/__init__.py +4 -4
- scipy/_lib/array_api_compat/_internal.py +19 -6
- scipy/_lib/array_api_compat/common/__init__.py +1 -1
- scipy/_lib/array_api_compat/common/_aliases.py +365 -193
- scipy/_lib/array_api_compat/common/_fft.py +94 -64
- scipy/_lib/array_api_compat/common/_helpers.py +413 -180
- scipy/_lib/array_api_compat/common/_linalg.py +116 -40
- scipy/_lib/array_api_compat/common/_typing.py +179 -10
- scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
- scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
- scipy/_lib/array_api_compat/cupy/_info.py +16 -6
- scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
- scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
- scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
- scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
- scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
- scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
- scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
- scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
- scipy/_lib/array_api_compat/numpy/_info.py +36 -16
- scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
- scipy/_lib/array_api_compat/numpy/fft.py +11 -5
- scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
- scipy/_lib/array_api_compat/torch/__init__.py +3 -5
- scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
- scipy/_lib/array_api_compat/torch/_info.py +27 -16
- scipy/_lib/array_api_compat/torch/_typing.py +3 -0
- scipy/_lib/array_api_compat/torch/fft.py +17 -18
- scipy/_lib/array_api_compat/torch/linalg.py +16 -16
- scipy/_lib/array_api_extra/__init__.py +26 -3
- scipy/_lib/array_api_extra/_delegation.py +171 -0
- scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
- scipy/_lib/array_api_extra/_lib/_at.py +463 -0
- scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
- scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
- scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
- scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
- scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
- scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
- scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
- scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
- scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
- scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
- scipy/_lib/array_api_extra/testing.py +359 -0
- scipy/_lib/decorator.py +2 -2
- scipy/_lib/doccer.py +1 -7
- scipy/_lib/messagestream.cpython-313t-darwin.so +0 -0
- scipy/_lib/pyprima/__init__.py +212 -0
- scipy/_lib/pyprima/cobyla/__init__.py +0 -0
- scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
- scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
- scipy/_lib/pyprima/cobyla/geometry.py +226 -0
- scipy/_lib/pyprima/cobyla/initialize.py +215 -0
- scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
- scipy/_lib/pyprima/cobyla/update.py +289 -0
- scipy/_lib/pyprima/common/__init__.py +0 -0
- scipy/_lib/pyprima/common/_bounds.py +34 -0
- scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
- scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
- scipy/_lib/pyprima/common/_project.py +173 -0
- scipy/_lib/pyprima/common/checkbreak.py +93 -0
- scipy/_lib/pyprima/common/consts.py +47 -0
- scipy/_lib/pyprima/common/evaluate.py +99 -0
- scipy/_lib/pyprima/common/history.py +38 -0
- scipy/_lib/pyprima/common/infos.py +30 -0
- scipy/_lib/pyprima/common/linalg.py +435 -0
- scipy/_lib/pyprima/common/message.py +290 -0
- scipy/_lib/pyprima/common/powalg.py +131 -0
- scipy/_lib/pyprima/common/preproc.py +277 -0
- scipy/_lib/pyprima/common/present.py +5 -0
- scipy/_lib/pyprima/common/ratio.py +54 -0
- scipy/_lib/pyprima/common/redrho.py +47 -0
- scipy/_lib/pyprima/common/selectx.py +296 -0
- scipy/_lib/tests/test__util.py +105 -121
- scipy/_lib/tests/test_array_api.py +166 -35
- scipy/_lib/tests/test_bunch.py +7 -0
- scipy/_lib/tests/test_ccallback.py +2 -10
- scipy/_lib/tests/test_public_api.py +13 -0
- scipy/cluster/_hierarchy.cpython-313t-darwin.so +0 -0
- scipy/cluster/_optimal_leaf_ordering.cpython-313t-darwin.so +0 -0
- scipy/cluster/_vq.cpython-313t-darwin.so +0 -0
- scipy/cluster/hierarchy.py +393 -223
- scipy/cluster/tests/test_hierarchy.py +273 -335
- scipy/cluster/tests/test_vq.py +45 -61
- scipy/cluster/vq.py +39 -35
- scipy/conftest.py +263 -157
- scipy/constants/_constants.py +4 -1
- scipy/constants/tests/test_codata.py +2 -2
- scipy/constants/tests/test_constants.py +11 -18
- scipy/datasets/_download_all.py +15 -1
- scipy/datasets/_fetchers.py +7 -1
- scipy/datasets/_utils.py +1 -1
- scipy/differentiate/_differentiate.py +25 -25
- scipy/differentiate/tests/test_differentiate.py +24 -25
- scipy/fft/_basic.py +20 -0
- scipy/fft/_helper.py +3 -34
- scipy/fft/_pocketfft/helper.py +29 -1
- scipy/fft/_pocketfft/tests/test_basic.py +2 -4
- scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
- scipy/fft/_realtransforms.py +13 -0
- scipy/fft/tests/test_basic.py +27 -25
- scipy/fft/tests/test_fftlog.py +16 -7
- scipy/fft/tests/test_helper.py +18 -34
- scipy/fft/tests/test_real_transforms.py +8 -10
- scipy/fftpack/convolve.cpython-313t-darwin.so +0 -0
- scipy/fftpack/tests/test_basic.py +2 -4
- scipy/fftpack/tests/test_real_transforms.py +8 -9
- scipy/integrate/_bvp.py +9 -3
- scipy/integrate/_cubature.py +3 -2
- scipy/integrate/_dop.cpython-313t-darwin.so +0 -0
- scipy/integrate/_lsoda.cpython-313t-darwin.so +0 -0
- scipy/integrate/_ode.py +9 -2
- scipy/integrate/_odepack.cpython-313t-darwin.so +0 -0
- scipy/integrate/_quad_vec.py +21 -29
- scipy/integrate/_quadpack.cpython-313t-darwin.so +0 -0
- scipy/integrate/_quadpack_py.py +11 -7
- scipy/integrate/_quadrature.py +3 -3
- scipy/integrate/_rules/_base.py +2 -2
- scipy/integrate/_tanhsinh.py +48 -47
- scipy/integrate/_test_odeint_banded.cpython-313t-darwin.so +0 -0
- scipy/integrate/_vode.cpython-313t-darwin.so +0 -0
- scipy/integrate/tests/test__quad_vec.py +0 -6
- scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
- scipy/integrate/tests/test_cubature.py +21 -35
- scipy/integrate/tests/test_quadrature.py +6 -8
- scipy/integrate/tests/test_tanhsinh.py +56 -48
- scipy/interpolate/__init__.py +70 -58
- scipy/interpolate/_bary_rational.py +22 -22
- scipy/interpolate/_bsplines.py +119 -66
- scipy/interpolate/_cubic.py +65 -50
- scipy/interpolate/_dfitpack.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_dierckx.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_fitpack.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_fitpack2.py +9 -6
- scipy/interpolate/_fitpack_impl.py +32 -26
- scipy/interpolate/_fitpack_repro.py +23 -19
- scipy/interpolate/_interpnd.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_interpolate.py +30 -12
- scipy/interpolate/_ndbspline.py +13 -18
- scipy/interpolate/_ndgriddata.py +5 -8
- scipy/interpolate/_polyint.py +95 -31
- scipy/interpolate/_ppoly.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_rbf.py +2 -2
- scipy/interpolate/_rbfinterp.py +1 -1
- scipy/interpolate/_rbfinterp_pythran.cpython-313t-darwin.so +0 -0
- scipy/interpolate/_rgi.py +31 -26
- scipy/interpolate/_rgi_cython.cpython-313t-darwin.so +0 -0
- scipy/interpolate/dfitpack.py +0 -20
- scipy/interpolate/interpnd.py +1 -2
- scipy/interpolate/tests/test_bary_rational.py +2 -2
- scipy/interpolate/tests/test_bsplines.py +97 -1
- scipy/interpolate/tests/test_fitpack2.py +39 -1
- scipy/interpolate/tests/test_interpnd.py +32 -20
- scipy/interpolate/tests/test_interpolate.py +48 -4
- scipy/interpolate/tests/test_rgi.py +2 -1
- scipy/io/_fast_matrix_market/__init__.py +2 -0
- scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
- scipy/io/_harwell_boeing/hb.py +7 -11
- scipy/io/_idl.py +5 -7
- scipy/io/_netcdf.py +15 -5
- scipy/io/_test_fortran.cpython-313t-darwin.so +0 -0
- scipy/io/arff/tests/test_arffread.py +3 -3
- scipy/io/matlab/__init__.py +5 -3
- scipy/io/matlab/_mio.py +4 -1
- scipy/io/matlab/_mio5.py +19 -13
- scipy/io/matlab/_mio5_utils.cpython-313t-darwin.so +0 -0
- scipy/io/matlab/_mio_utils.cpython-313t-darwin.so +0 -0
- scipy/io/matlab/_miobase.py +4 -1
- scipy/io/matlab/_streams.cpython-313t-darwin.so +0 -0
- scipy/io/matlab/tests/test_mio.py +46 -18
- scipy/io/matlab/tests/test_mio_funcs.py +1 -1
- scipy/io/tests/test_mmio.py +7 -1
- scipy/io/tests/test_wavfile.py +41 -0
- scipy/io/wavfile.py +57 -10
- scipy/linalg/_basic.py +113 -86
- scipy/linalg/_cythonized_array_utils.cpython-313t-darwin.so +0 -0
- scipy/linalg/_decomp.py +22 -9
- scipy/linalg/_decomp_cholesky.py +28 -13
- scipy/linalg/_decomp_cossin.py +45 -30
- scipy/linalg/_decomp_interpolative.cpython-313t-darwin.so +0 -0
- scipy/linalg/_decomp_ldl.py +4 -1
- scipy/linalg/_decomp_lu.py +18 -6
- scipy/linalg/_decomp_lu_cython.cpython-313t-darwin.so +0 -0
- scipy/linalg/_decomp_polar.py +2 -0
- scipy/linalg/_decomp_qr.py +6 -2
- scipy/linalg/_decomp_qz.py +3 -0
- scipy/linalg/_decomp_schur.py +3 -1
- scipy/linalg/_decomp_svd.py +13 -2
- scipy/linalg/_decomp_update.cpython-313t-darwin.so +0 -0
- scipy/linalg/_expm_frechet.py +4 -0
- scipy/linalg/_fblas.cpython-313t-darwin.so +0 -0
- scipy/linalg/_flapack.cpython-313t-darwin.so +0 -0
- scipy/linalg/_linalg_pythran.cpython-313t-darwin.so +0 -0
- scipy/linalg/_matfuncs.py +187 -4
- scipy/linalg/_matfuncs_expm.cpython-313t-darwin.so +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cpython-313t-darwin.so +0 -0
- scipy/linalg/_matfuncs_sqrtm.py +1 -99
- scipy/linalg/_matfuncs_sqrtm_triu.cpython-313t-darwin.so +0 -0
- scipy/linalg/_procrustes.py +2 -0
- scipy/linalg/_sketches.py +17 -6
- scipy/linalg/_solve_toeplitz.cpython-313t-darwin.so +0 -0
- scipy/linalg/_solvers.py +7 -2
- scipy/linalg/_special_matrices.py +26 -36
- scipy/linalg/cython_blas.cpython-313t-darwin.so +0 -0
- scipy/linalg/cython_lapack.cpython-313t-darwin.so +0 -0
- scipy/linalg/lapack.py +22 -2
- scipy/linalg/tests/_cython_examples/meson.build +7 -0
- scipy/linalg/tests/test_basic.py +31 -16
- scipy/linalg/tests/test_batch.py +588 -0
- scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
- scipy/linalg/tests/test_decomp.py +40 -3
- scipy/linalg/tests/test_decomp_cossin.py +14 -0
- scipy/linalg/tests/test_decomp_ldl.py +1 -1
- scipy/linalg/tests/test_lapack.py +115 -7
- scipy/linalg/tests/test_matfuncs.py +157 -102
- scipy/linalg/tests/test_procrustes.py +0 -7
- scipy/linalg/tests/test_solve_toeplitz.py +1 -1
- scipy/linalg/tests/test_special_matrices.py +1 -5
- scipy/ndimage/__init__.py +1 -0
- scipy/ndimage/_cytest.cpython-313t-darwin.so +0 -0
- scipy/ndimage/_delegators.py +8 -2
- scipy/ndimage/_filters.py +453 -5
- scipy/ndimage/_interpolation.py +36 -6
- scipy/ndimage/_measurements.py +4 -2
- scipy/ndimage/_morphology.py +5 -0
- scipy/ndimage/_nd_image.cpython-313t-darwin.so +0 -0
- scipy/ndimage/_ni_docstrings.py +5 -1
- scipy/ndimage/_ni_label.cpython-313t-darwin.so +0 -0
- scipy/ndimage/_ni_support.py +1 -5
- scipy/ndimage/_rank_filter_1d.cpython-313t-darwin.so +0 -0
- scipy/ndimage/_support_alternative_backends.py +18 -6
- scipy/ndimage/tests/test_filters.py +370 -259
- scipy/ndimage/tests/test_fourier.py +7 -9
- scipy/ndimage/tests/test_interpolation.py +68 -61
- scipy/ndimage/tests/test_measurements.py +18 -35
- scipy/ndimage/tests/test_morphology.py +143 -131
- scipy/ndimage/tests/test_splines.py +1 -3
- scipy/odr/__odrpack.cpython-313t-darwin.so +0 -0
- scipy/optimize/_basinhopping.py +13 -7
- scipy/optimize/_bglu_dense.cpython-313t-darwin.so +0 -0
- scipy/optimize/_bracket.py +17 -24
- scipy/optimize/_chandrupatla.py +9 -10
- scipy/optimize/_cobyla_py.py +104 -123
- scipy/optimize/_constraints.py +14 -10
- scipy/optimize/_differentiable_functions.py +371 -230
- scipy/optimize/_differentialevolution.py +4 -3
- scipy/optimize/_direct.cpython-313t-darwin.so +0 -0
- scipy/optimize/_dual_annealing.py +1 -1
- scipy/optimize/_elementwise.py +1 -4
- scipy/optimize/_group_columns.cpython-313t-darwin.so +0 -0
- scipy/optimize/_lbfgsb.cpython-313t-darwin.so +0 -0
- scipy/optimize/_lbfgsb_py.py +57 -16
- scipy/optimize/_linprog_doc.py +2 -2
- scipy/optimize/_linprog_highs.py +2 -2
- scipy/optimize/_linprog_ip.py +25 -10
- scipy/optimize/_linprog_util.py +14 -16
- scipy/optimize/_lsap.cpython-313t-darwin.so +0 -0
- scipy/optimize/_lsq/common.py +3 -3
- scipy/optimize/_lsq/dogbox.py +16 -2
- scipy/optimize/_lsq/givens_elimination.cpython-313t-darwin.so +0 -0
- scipy/optimize/_lsq/least_squares.py +198 -126
- scipy/optimize/_lsq/lsq_linear.py +6 -6
- scipy/optimize/_lsq/trf.py +35 -8
- scipy/optimize/_milp.py +3 -1
- scipy/optimize/_minimize.py +105 -36
- scipy/optimize/_minpack.cpython-313t-darwin.so +0 -0
- scipy/optimize/_minpack_py.py +21 -14
- scipy/optimize/_moduleTNC.cpython-313t-darwin.so +0 -0
- scipy/optimize/_nnls.py +20 -21
- scipy/optimize/_nonlin.py +34 -3
- scipy/optimize/_numdiff.py +288 -110
- scipy/optimize/_optimize.py +86 -48
- scipy/optimize/_pava_pybind.cpython-313t-darwin.so +0 -0
- scipy/optimize/_remove_redundancy.py +5 -5
- scipy/optimize/_root_scalar.py +1 -1
- scipy/optimize/_shgo.py +6 -0
- scipy/optimize/_shgo_lib/_complex.py +1 -1
- scipy/optimize/_slsqp_py.py +216 -124
- scipy/optimize/_slsqplib.cpython-313t-darwin.so +0 -0
- scipy/optimize/_spectral.py +1 -1
- scipy/optimize/_tnc.py +8 -1
- scipy/optimize/_trlib/_trlib.cpython-313t-darwin.so +0 -0
- scipy/optimize/_trustregion.py +20 -6
- scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
- scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
- scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
- scipy/optimize/_trustregion_constr/projections.py +12 -8
- scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
- scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
- scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
- scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
- scipy/optimize/_trustregion_exact.py +0 -1
- scipy/optimize/_zeros.cpython-313t-darwin.so +0 -0
- scipy/optimize/_zeros_py.py +97 -17
- scipy/optimize/cython_optimize/_zeros.cpython-313t-darwin.so +0 -0
- scipy/optimize/slsqp.py +0 -1
- scipy/optimize/tests/test__basinhopping.py +1 -1
- scipy/optimize/tests/test__differential_evolution.py +4 -4
- scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
- scipy/optimize/tests/test__numdiff.py +66 -22
- scipy/optimize/tests/test__remove_redundancy.py +2 -2
- scipy/optimize/tests/test__shgo.py +9 -1
- scipy/optimize/tests/test_bracket.py +36 -46
- scipy/optimize/tests/test_chandrupatla.py +133 -135
- scipy/optimize/tests/test_cobyla.py +74 -45
- scipy/optimize/tests/test_constraints.py +1 -1
- scipy/optimize/tests/test_differentiable_functions.py +226 -6
- scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
- scipy/optimize/tests/test_least_squares.py +125 -13
- scipy/optimize/tests/test_linear_assignment.py +3 -3
- scipy/optimize/tests/test_linprog.py +3 -3
- scipy/optimize/tests/test_lsq_linear.py +6 -6
- scipy/optimize/tests/test_minimize_constrained.py +2 -2
- scipy/optimize/tests/test_minpack.py +4 -4
- scipy/optimize/tests/test_nnls.py +43 -3
- scipy/optimize/tests/test_nonlin.py +36 -0
- scipy/optimize/tests/test_optimize.py +95 -17
- scipy/optimize/tests/test_slsqp.py +36 -4
- scipy/optimize/tests/test_zeros.py +34 -1
- scipy/signal/__init__.py +12 -23
- scipy/signal/_delegators.py +568 -0
- scipy/signal/_filter_design.py +459 -241
- scipy/signal/_fir_filter_design.py +262 -90
- scipy/signal/_lti_conversion.py +3 -2
- scipy/signal/_ltisys.py +118 -91
- scipy/signal/_max_len_seq_inner.cpython-313t-darwin.so +0 -0
- scipy/signal/_peak_finding_utils.cpython-313t-darwin.so +0 -0
- scipy/signal/_polyutils.py +172 -0
- scipy/signal/_short_time_fft.py +519 -70
- scipy/signal/_signal_api.py +30 -0
- scipy/signal/_signaltools.py +719 -399
- scipy/signal/_sigtools.cpython-313t-darwin.so +0 -0
- scipy/signal/_sosfilt.cpython-313t-darwin.so +0 -0
- scipy/signal/_spectral_py.py +230 -50
- scipy/signal/_spline.cpython-313t-darwin.so +0 -0
- scipy/signal/_spline_filters.py +108 -68
- scipy/signal/_support_alternative_backends.py +73 -0
- scipy/signal/_upfirdn.py +4 -1
- scipy/signal/_upfirdn_apply.cpython-313t-darwin.so +0 -0
- scipy/signal/_waveforms.py +2 -11
- scipy/signal/_wavelets.py +1 -1
- scipy/signal/fir_filter_design.py +1 -0
- scipy/signal/spline.py +4 -11
- scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
- scipy/signal/tests/test_bsplines.py +114 -79
- scipy/signal/tests/test_cont2discrete.py +9 -2
- scipy/signal/tests/test_filter_design.py +721 -481
- scipy/signal/tests/test_fir_filter_design.py +332 -140
- scipy/signal/tests/test_savitzky_golay.py +4 -3
- scipy/signal/tests/test_short_time_fft.py +221 -3
- scipy/signal/tests/test_signaltools.py +2144 -1348
- scipy/signal/tests/test_spectral.py +50 -6
- scipy/signal/tests/test_splines.py +161 -96
- scipy/signal/tests/test_upfirdn.py +84 -50
- scipy/signal/tests/test_waveforms.py +20 -0
- scipy/signal/tests/test_windows.py +607 -466
- scipy/signal/windows/_windows.py +287 -148
- scipy/sparse/__init__.py +23 -4
- scipy/sparse/_base.py +270 -108
- scipy/sparse/_bsr.py +7 -4
- scipy/sparse/_compressed.py +59 -231
- scipy/sparse/_construct.py +90 -38
- scipy/sparse/_coo.py +115 -181
- scipy/sparse/_csc.py +4 -4
- scipy/sparse/_csparsetools.cpython-313t-darwin.so +0 -0
- scipy/sparse/_csr.py +2 -2
- scipy/sparse/_data.py +48 -48
- scipy/sparse/_dia.py +105 -18
- scipy/sparse/_dok.py +0 -23
- scipy/sparse/_index.py +4 -4
- scipy/sparse/_matrix.py +23 -0
- scipy/sparse/_sparsetools.cpython-313t-darwin.so +0 -0
- scipy/sparse/_sputils.py +37 -22
- scipy/sparse/base.py +0 -9
- scipy/sparse/bsr.py +0 -14
- scipy/sparse/compressed.py +0 -23
- scipy/sparse/construct.py +0 -6
- scipy/sparse/coo.py +0 -14
- scipy/sparse/csc.py +0 -3
- scipy/sparse/csgraph/_flow.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_matching.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_reordering.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_shortest_path.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_tools.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/_traversal.cpython-313t-darwin.so +0 -0
- scipy/sparse/csgraph/tests/test_matching.py +14 -2
- scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
- scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
- scipy/sparse/csr.py +0 -5
- scipy/sparse/data.py +1 -6
- scipy/sparse/dia.py +0 -7
- scipy/sparse/dok.py +0 -10
- scipy/sparse/linalg/_dsolve/_superlu.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
- scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
- scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
- scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
- scipy/sparse/linalg/_interface.py +17 -18
- scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
- scipy/sparse/linalg/_isolve/iterative.py +51 -45
- scipy/sparse/linalg/_isolve/lgmres.py +6 -6
- scipy/sparse/linalg/_isolve/minres.py +5 -5
- scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
- scipy/sparse/linalg/_isolve/utils.py +2 -8
- scipy/sparse/linalg/_matfuncs.py +1 -1
- scipy/sparse/linalg/_norm.py +1 -1
- scipy/sparse/linalg/_propack/_cpropack.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_spropack.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cpython-313t-darwin.so +0 -0
- scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
- scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
- scipy/sparse/tests/test_arithmetic1d.py +5 -2
- scipy/sparse/tests/test_base.py +214 -42
- scipy/sparse/tests/test_common1d.py +7 -7
- scipy/sparse/tests/test_construct.py +1 -1
- scipy/sparse/tests/test_coo.py +272 -4
- scipy/sparse/tests/test_sparsetools.py +5 -0
- scipy/sparse/tests/test_sputils.py +36 -7
- scipy/spatial/_ckdtree.cpython-313t-darwin.so +0 -0
- scipy/spatial/_distance_pybind.cpython-313t-darwin.so +0 -0
- scipy/spatial/_distance_wrap.cpython-313t-darwin.so +0 -0
- scipy/spatial/_hausdorff.cpython-313t-darwin.so +0 -0
- scipy/spatial/_qhull.cpython-313t-darwin.so +0 -0
- scipy/spatial/_voronoi.cpython-313t-darwin.so +0 -0
- scipy/spatial/distance.py +49 -42
- scipy/spatial/tests/test_distance.py +15 -1
- scipy/spatial/tests/test_kdtree.py +1 -0
- scipy/spatial/tests/test_qhull.py +7 -2
- scipy/spatial/transform/__init__.py +5 -3
- scipy/spatial/transform/_rigid_transform.cpython-313t-darwin.so +0 -0
- scipy/spatial/transform/_rotation.cpython-313t-darwin.so +0 -0
- scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
- scipy/spatial/transform/tests/test_rotation.py +1213 -832
- scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
- scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
- scipy/special/__init__.py +1 -47
- scipy/special/_add_newdocs.py +34 -772
- scipy/special/_basic.py +22 -25
- scipy/special/_comb.cpython-313t-darwin.so +0 -0
- scipy/special/_ellip_harm_2.cpython-313t-darwin.so +0 -0
- scipy/special/_gufuncs.cpython-313t-darwin.so +0 -0
- scipy/special/_logsumexp.py +67 -58
- scipy/special/_orthogonal.pyi +1 -1
- scipy/special/_specfun.cpython-313t-darwin.so +0 -0
- scipy/special/_special_ufuncs.cpython-313t-darwin.so +0 -0
- scipy/special/_spherical_bessel.py +4 -4
- scipy/special/_support_alternative_backends.py +212 -119
- scipy/special/_test_internal.cpython-313t-darwin.so +0 -0
- scipy/special/_testutils.py +4 -4
- scipy/special/_ufuncs.cpython-313t-darwin.so +0 -0
- scipy/special/_ufuncs.pyi +1 -0
- scipy/special/_ufuncs.pyx +215 -1400
- scipy/special/_ufuncs_cxx.cpython-313t-darwin.so +0 -0
- scipy/special/_ufuncs_cxx.pxd +2 -15
- scipy/special/_ufuncs_cxx.pyx +5 -44
- scipy/special/_ufuncs_cxx_defs.h +2 -16
- scipy/special/_ufuncs_defs.h +0 -8
- scipy/special/cython_special.cpython-313t-darwin.so +0 -0
- scipy/special/cython_special.pxd +1 -1
- scipy/special/tests/_cython_examples/meson.build +10 -1
- scipy/special/tests/test_basic.py +153 -20
- scipy/special/tests/test_boost_ufuncs.py +3 -0
- scipy/special/tests/test_cdflib.py +35 -11
- scipy/special/tests/test_gammainc.py +16 -0
- scipy/special/tests/test_hyp2f1.py +2 -2
- scipy/special/tests/test_log1mexp.py +85 -0
- scipy/special/tests/test_logsumexp.py +206 -64
- scipy/special/tests/test_mpmath.py +1 -0
- scipy/special/tests/test_nan_inputs.py +1 -1
- scipy/special/tests/test_orthogonal.py +17 -18
- scipy/special/tests/test_sf_error.py +3 -2
- scipy/special/tests/test_sph_harm.py +6 -7
- scipy/special/tests/test_support_alternative_backends.py +211 -76
- scipy/stats/__init__.py +4 -1
- scipy/stats/_ansari_swilk_statistics.cpython-313t-darwin.so +0 -0
- scipy/stats/_axis_nan_policy.py +5 -12
- scipy/stats/_biasedurn.cpython-313t-darwin.so +0 -0
- scipy/stats/_continued_fraction.py +387 -0
- scipy/stats/_continuous_distns.py +277 -310
- scipy/stats/_correlation.py +1 -1
- scipy/stats/_covariance.py +6 -3
- scipy/stats/_discrete_distns.py +39 -32
- scipy/stats/_distn_infrastructure.py +39 -12
- scipy/stats/_distribution_infrastructure.py +900 -238
- scipy/stats/_entropy.py +9 -10
- scipy/{_lib → stats}/_finite_differences.py +1 -1
- scipy/stats/_hypotests.py +83 -50
- scipy/stats/_kde.py +53 -49
- scipy/stats/_ksstats.py +1 -1
- scipy/stats/_levy_stable/__init__.py +7 -15
- scipy/stats/_levy_stable/levyst.cpython-313t-darwin.so +0 -0
- scipy/stats/_morestats.py +118 -73
- scipy/stats/_mstats_basic.py +13 -17
- scipy/stats/_mstats_extras.py +8 -8
- scipy/stats/_multivariate.py +89 -113
- scipy/stats/_new_distributions.py +97 -20
- scipy/stats/_page_trend_test.py +12 -5
- scipy/stats/_probability_distribution.py +265 -43
- scipy/stats/_qmc.py +14 -9
- scipy/stats/_qmc_cy.cpython-313t-darwin.so +0 -0
- scipy/stats/_qmvnt.py +16 -95
- scipy/stats/_qmvnt_cy.cpython-313t-darwin.so +0 -0
- scipy/stats/_quantile.py +335 -0
- scipy/stats/_rcont/rcont.cpython-313t-darwin.so +0 -0
- scipy/stats/_resampling.py +4 -29
- scipy/stats/_sampling.py +1 -1
- scipy/stats/_sobol.cpython-313t-darwin.so +0 -0
- scipy/stats/_stats.cpython-313t-darwin.so +0 -0
- scipy/stats/_stats_mstats_common.py +21 -2
- scipy/stats/_stats_py.py +550 -476
- scipy/stats/_stats_pythran.cpython-313t-darwin.so +0 -0
- scipy/stats/_unuran/unuran_wrapper.cpython-313t-darwin.so +0 -0
- scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
- scipy/stats/_variation.py +6 -8
- scipy/stats/_wilcoxon.py +13 -7
- scipy/stats/tests/common_tests.py +6 -4
- scipy/stats/tests/test_axis_nan_policy.py +62 -24
- scipy/stats/tests/test_continued_fraction.py +173 -0
- scipy/stats/tests/test_continuous.py +379 -60
- scipy/stats/tests/test_continuous_basic.py +18 -12
- scipy/stats/tests/test_discrete_basic.py +14 -8
- scipy/stats/tests/test_discrete_distns.py +16 -16
- scipy/stats/tests/test_distributions.py +95 -75
- scipy/stats/tests/test_entropy.py +40 -48
- scipy/stats/tests/test_fit.py +4 -3
- scipy/stats/tests/test_hypotests.py +153 -24
- scipy/stats/tests/test_kdeoth.py +109 -41
- scipy/stats/tests/test_marray.py +289 -0
- scipy/stats/tests/test_morestats.py +79 -47
- scipy/stats/tests/test_mstats_basic.py +3 -3
- scipy/stats/tests/test_multivariate.py +434 -83
- scipy/stats/tests/test_qmc.py +13 -10
- scipy/stats/tests/test_quantile.py +199 -0
- scipy/stats/tests/test_rank.py +119 -112
- scipy/stats/tests/test_resampling.py +47 -56
- scipy/stats/tests/test_sampling.py +9 -4
- scipy/stats/tests/test_stats.py +799 -939
- scipy/stats/tests/test_variation.py +8 -6
- scipy/version.py +2 -2
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +559 -566
- scipy-1.16.0rc2.dist-info/WHEEL +6 -0
- scipy/_lib/array_api_extra/_funcs.py +0 -484
- scipy/_lib/array_api_extra/_typing.py +0 -8
- scipy/interpolate/_bspl.cpython-313t-darwin.so +0 -0
- scipy/optimize/_cobyla.cpython-313t-darwin.so +0 -0
- scipy/optimize/_cython_nnls.cpython-313t-darwin.so +0 -0
- scipy/optimize/_slsqp.cpython-313t-darwin.so +0 -0
- scipy/spatial/qhull_src/COPYING.txt +0 -38
- scipy/special/libsf_error_state.dylib +0 -0
- scipy/special/tests/test_log_softmax.py +0 -109
- scipy/special/tests/test_xsf_cuda.py +0 -114
- scipy/special/xsf/binom.h +0 -89
- scipy/special/xsf/cdflib.h +0 -100
- scipy/special/xsf/cephes/airy.h +0 -307
- scipy/special/xsf/cephes/besselpoly.h +0 -51
- scipy/special/xsf/cephes/beta.h +0 -257
- scipy/special/xsf/cephes/cbrt.h +0 -131
- scipy/special/xsf/cephes/chbevl.h +0 -85
- scipy/special/xsf/cephes/chdtr.h +0 -193
- scipy/special/xsf/cephes/const.h +0 -87
- scipy/special/xsf/cephes/ellie.h +0 -293
- scipy/special/xsf/cephes/ellik.h +0 -251
- scipy/special/xsf/cephes/ellpe.h +0 -107
- scipy/special/xsf/cephes/ellpk.h +0 -117
- scipy/special/xsf/cephes/expn.h +0 -260
- scipy/special/xsf/cephes/gamma.h +0 -398
- scipy/special/xsf/cephes/hyp2f1.h +0 -596
- scipy/special/xsf/cephes/hyperg.h +0 -361
- scipy/special/xsf/cephes/i0.h +0 -149
- scipy/special/xsf/cephes/i1.h +0 -158
- scipy/special/xsf/cephes/igam.h +0 -421
- scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
- scipy/special/xsf/cephes/igami.h +0 -313
- scipy/special/xsf/cephes/j0.h +0 -225
- scipy/special/xsf/cephes/j1.h +0 -198
- scipy/special/xsf/cephes/jv.h +0 -715
- scipy/special/xsf/cephes/k0.h +0 -164
- scipy/special/xsf/cephes/k1.h +0 -163
- scipy/special/xsf/cephes/kn.h +0 -243
- scipy/special/xsf/cephes/lanczos.h +0 -112
- scipy/special/xsf/cephes/ndtr.h +0 -275
- scipy/special/xsf/cephes/poch.h +0 -85
- scipy/special/xsf/cephes/polevl.h +0 -167
- scipy/special/xsf/cephes/psi.h +0 -194
- scipy/special/xsf/cephes/rgamma.h +0 -111
- scipy/special/xsf/cephes/scipy_iv.h +0 -811
- scipy/special/xsf/cephes/shichi.h +0 -248
- scipy/special/xsf/cephes/sici.h +0 -224
- scipy/special/xsf/cephes/sindg.h +0 -221
- scipy/special/xsf/cephes/tandg.h +0 -139
- scipy/special/xsf/cephes/trig.h +0 -58
- scipy/special/xsf/cephes/unity.h +0 -186
- scipy/special/xsf/cephes/zeta.h +0 -172
- scipy/special/xsf/config.h +0 -304
- scipy/special/xsf/digamma.h +0 -205
- scipy/special/xsf/error.h +0 -57
- scipy/special/xsf/evalpoly.h +0 -47
- scipy/special/xsf/expint.h +0 -266
- scipy/special/xsf/hyp2f1.h +0 -694
- scipy/special/xsf/iv_ratio.h +0 -173
- scipy/special/xsf/lambertw.h +0 -150
- scipy/special/xsf/loggamma.h +0 -163
- scipy/special/xsf/sici.h +0 -200
- scipy/special/xsf/tools.h +0 -427
- scipy/special/xsf/trig.h +0 -164
- scipy/special/xsf/wright_bessel.h +0 -843
- scipy/special/xsf/zlog1.h +0 -35
- scipy/stats/_mvn.cpython-313t-darwin.so +0 -0
- scipy-1.15.3.dist-info/WHEEL +0 -4
scipy/cluster/tests/test_vq.py
CHANGED
@@ -1,27 +1,25 @@
|
|
1
|
-
import
|
1
|
+
import math
|
2
2
|
import sys
|
3
3
|
from copy import deepcopy
|
4
4
|
from threading import Lock
|
5
5
|
|
6
6
|
import numpy as np
|
7
|
-
from numpy.testing import
|
8
|
-
assert_array_equal, assert_equal, assert_, suppress_warnings
|
9
|
-
)
|
7
|
+
from numpy.testing import assert_array_equal, suppress_warnings
|
10
8
|
import pytest
|
11
9
|
from pytest import raises as assert_raises
|
12
10
|
|
13
11
|
from scipy.cluster.vq import (kmeans, kmeans2, py_vq, vq, whiten,
|
14
12
|
ClusterError, _krandinit)
|
15
13
|
from scipy.cluster import _vq
|
16
|
-
from scipy.conftest import array_api_compatible
|
17
14
|
from scipy.sparse._sputils import matrix
|
18
15
|
|
19
16
|
from scipy._lib import array_api_extra as xpx
|
20
17
|
from scipy._lib._array_api import (
|
21
|
-
SCIPY_ARRAY_API,
|
18
|
+
SCIPY_ARRAY_API, eager_warns, is_lazy_array, make_xp_test_case,
|
19
|
+
xp_copy, xp_assert_close, xp_assert_equal
|
22
20
|
)
|
23
21
|
|
24
|
-
|
22
|
+
xfail_xp_backends = pytest.mark.xfail_xp_backends
|
25
23
|
skip_xp_backends = pytest.mark.skip_xp_backends
|
26
24
|
|
27
25
|
TESTDATA_2D = np.array([
|
@@ -80,6 +78,7 @@ CODET2 = np.array([[11.0/3, 8.0/3],
|
|
80
78
|
LABEL1 = np.array([0, 1, 2, 2, 2, 2, 1, 2, 1, 1, 1])
|
81
79
|
|
82
80
|
|
81
|
+
@make_xp_test_case(whiten)
|
83
82
|
class TestWhiten:
|
84
83
|
|
85
84
|
def test_whiten(self, xp):
|
@@ -96,13 +95,7 @@ class TestWhiten:
|
|
96
95
|
[0.45067590, 0.45464607]])
|
97
96
|
xp_assert_close(whiten(obs), desired, rtol=1e-5)
|
98
97
|
|
99
|
-
|
100
|
-
def whiten_lock(self):
|
101
|
-
return Lock()
|
102
|
-
|
103
|
-
@skip_xp_backends('jax.numpy',
|
104
|
-
reason='jax arrays do not support item assignment')
|
105
|
-
def test_whiten_zero_std(self, xp, whiten_lock):
|
98
|
+
def test_whiten_zero_std(self, xp):
|
106
99
|
desired = xp.asarray([[0., 1.0, 2.86666544],
|
107
100
|
[0., 1.0, 1.32460034],
|
108
101
|
[0., 1.0, 3.74382172]])
|
@@ -111,27 +104,32 @@ class TestWhiten:
|
|
111
104
|
[0., 1., 0.34243798],
|
112
105
|
[0., 1., 0.96785929]])
|
113
106
|
|
114
|
-
with
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
xp_assert_close(whiten(obs), desired, rtol=1e-5)
|
107
|
+
with eager_warns(obs, RuntimeWarning, match="standard deviation zero"):
|
108
|
+
actual = whiten(obs)
|
109
|
+
xp_assert_close(actual, desired, rtol=1e-5)
|
119
110
|
|
120
|
-
|
121
|
-
|
111
|
+
@pytest.mark.filterwarnings("ignore:invalid value encountered:RuntimeWarning:dask")
|
112
|
+
@pytest.mark.parametrize("bad_value", [math.nan, math.inf, -math.inf])
|
113
|
+
def test_whiten_not_finite(self, bad_value, xp):
|
114
|
+
obs = xp.asarray([[0.98744510, bad_value],
|
115
|
+
[0.62093317, 0.19406729],
|
116
|
+
[0.87545741, 0.00735733],
|
117
|
+
[0.85124403, 0.26499712],
|
118
|
+
[0.45067590, 0.45464607]])
|
122
119
|
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
120
|
+
if is_lazy_array(obs):
|
121
|
+
desired = xp.asarray([[5.08738849, math.nan],
|
122
|
+
[3.19909255, math.nan],
|
123
|
+
[4.51041982, math.nan],
|
124
|
+
[4.38567074, math.nan],
|
125
|
+
[2.32191480, math.nan]])
|
126
|
+
xp_assert_close(whiten(obs), desired, rtol=1e-5)
|
127
|
+
else:
|
130
128
|
assert_raises(ValueError, whiten, obs)
|
131
129
|
|
132
130
|
@pytest.mark.skipif(SCIPY_ARRAY_API,
|
133
131
|
reason='`np.matrix` unsupported in array API mode')
|
134
|
-
def test_whiten_not_finite_matrix(self
|
132
|
+
def test_whiten_not_finite_matrix(self):
|
135
133
|
for bad_value in np.nan, np.inf, -np.inf:
|
136
134
|
obs = matrix([[0.98744510, bad_value],
|
137
135
|
[0.62093317, 0.19406729],
|
@@ -141,9 +139,9 @@ class TestWhiten:
|
|
141
139
|
assert_raises(ValueError, whiten, obs)
|
142
140
|
|
143
141
|
|
142
|
+
@make_xp_test_case(vq)
|
144
143
|
class TestVq:
|
145
144
|
|
146
|
-
@skip_xp_backends(cpu_only=True)
|
147
145
|
def test_py_vq(self, xp):
|
148
146
|
initc = np.concatenate([[X[0]], [X[1]], [X[2]]])
|
149
147
|
# label1.dtype varies between int32 and int64 over platforms
|
@@ -153,28 +151,26 @@ class TestVq:
|
|
153
151
|
|
154
152
|
@pytest.mark.skipif(SCIPY_ARRAY_API,
|
155
153
|
reason='`np.matrix` unsupported in array API mode')
|
156
|
-
def test_py_vq_matrix(self
|
154
|
+
def test_py_vq_matrix(self):
|
157
155
|
initc = np.concatenate([[X[0]], [X[1]], [X[2]]])
|
158
156
|
# label1.dtype varies between int32 and int64 over platforms
|
159
157
|
label1 = py_vq(matrix(X), matrix(initc))[0]
|
160
158
|
assert_array_equal(label1, LABEL1)
|
161
159
|
|
162
|
-
@skip_xp_backends(np_only=True, reason='`_vq` only supports NumPy backend')
|
163
160
|
def test_vq(self, xp):
|
164
161
|
initc = np.concatenate([[X[0]], [X[1]], [X[2]]])
|
165
|
-
label1, _ = _vq.vq(
|
162
|
+
label1, _ = _vq.vq(X, initc)
|
166
163
|
assert_array_equal(label1, LABEL1)
|
167
164
|
_, _ = vq(xp.asarray(X), xp.asarray(initc))
|
168
165
|
|
169
166
|
@pytest.mark.skipif(SCIPY_ARRAY_API,
|
170
167
|
reason='`np.matrix` unsupported in array API mode')
|
171
|
-
def test_vq_matrix(self
|
168
|
+
def test_vq_matrix(self):
|
172
169
|
initc = np.concatenate([[X[0]], [X[1]], [X[2]]])
|
173
170
|
label1, _ = _vq.vq(matrix(X), matrix(initc))
|
174
171
|
assert_array_equal(label1, LABEL1)
|
175
172
|
_, _ = vq(matrix(X), matrix(initc))
|
176
173
|
|
177
|
-
@skip_xp_backends(cpu_only=True)
|
178
174
|
def test_vq_1d(self, xp):
|
179
175
|
# Test special rank 1 vq algo, python implementation.
|
180
176
|
data = X[:, 0]
|
@@ -187,18 +183,15 @@ class TestVq:
|
|
187
183
|
xp_assert_equal(ta, xp.asarray(a, dtype=xp.int64), check_dtype=False)
|
188
184
|
xp_assert_equal(tb, xp.asarray(b))
|
189
185
|
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
b = a.astype(xp.float32)
|
186
|
+
def test__vq_sametype(self):
|
187
|
+
a = np.asarray([1.0, 2.0])
|
188
|
+
b = a.astype(np.float32)
|
194
189
|
assert_raises(TypeError, _vq.vq, a, b)
|
195
190
|
|
196
|
-
|
197
|
-
|
198
|
-
a = xp.asarray([1, 2], dtype=int)
|
191
|
+
def test__vq_invalid_type(self):
|
192
|
+
a = np.asarray([1, 2], dtype=int)
|
199
193
|
assert_raises(TypeError, _vq.vq, a, a)
|
200
194
|
|
201
|
-
@skip_xp_backends(cpu_only=True)
|
202
195
|
def test_vq_large_nfeat(self, xp):
|
203
196
|
X = np.random.rand(20, 20)
|
204
197
|
code_book = np.random.rand(3, 20)
|
@@ -222,7 +215,6 @@ class TestVq:
|
|
222
215
|
# codes1.dtype varies between int32 and int64 over platforms
|
223
216
|
xp_assert_equal(codes1, xp.asarray(codes0, dtype=xp.int64), check_dtype=False)
|
224
217
|
|
225
|
-
@skip_xp_backends(cpu_only=True)
|
226
218
|
def test_vq_large_features(self, xp):
|
227
219
|
X = np.random.rand(10, 5) * 1000000
|
228
220
|
code_book = np.random.rand(2, 5) * 1000000
|
@@ -238,8 +230,8 @@ class TestVq:
|
|
238
230
|
|
239
231
|
# Whole class skipped on GPU for now;
|
240
232
|
# once pdist/cdist are hooked up for CuPy, more tests will work
|
241
|
-
@
|
242
|
-
class
|
233
|
+
@make_xp_test_case(kmeans, kmeans2)
|
234
|
+
class TestKMeans:
|
243
235
|
|
244
236
|
def test_large_features(self, xp):
|
245
237
|
# Generate a data set with large values, and run kmeans on it to
|
@@ -267,7 +259,7 @@ class TestKMean:
|
|
267
259
|
|
268
260
|
@pytest.mark.skipif(SCIPY_ARRAY_API,
|
269
261
|
reason='`np.matrix` unsupported in array API mode')
|
270
|
-
def test_kmeans_simple_matrix(self
|
262
|
+
def test_kmeans_simple_matrix(self):
|
271
263
|
rng = np.random.default_rng(54321)
|
272
264
|
initc = np.concatenate([[X[0]], [X[1]], [X[2]]])
|
273
265
|
code1 = kmeans(matrix(X), matrix(initc), iter=1, rng=rng)[0]
|
@@ -302,9 +294,9 @@ class TestKMean:
|
|
302
294
|
|
303
295
|
@pytest.mark.skipif(SCIPY_ARRAY_API,
|
304
296
|
reason='`np.matrix` unsupported in array API mode')
|
305
|
-
def test_kmeans2_simple_matrix(self
|
297
|
+
def test_kmeans2_simple_matrix(self):
|
306
298
|
rng = np.random.default_rng(12345678)
|
307
|
-
initc =
|
299
|
+
initc = np.concatenate([[X[0]], [X[1]], [X[2]]])
|
308
300
|
code1 = kmeans2(matrix(X), matrix(initc), iter=1, rng=rng)[0]
|
309
301
|
code2 = kmeans2(matrix(X), matrix(initc), iter=2, rng=rng)[0]
|
310
302
|
|
@@ -334,8 +326,6 @@ class TestKMean:
|
|
334
326
|
data = xp.reshape(data, (20, 20))[:10, :]
|
335
327
|
kmeans2(data, 2)
|
336
328
|
|
337
|
-
@skip_xp_backends('jax.numpy',
|
338
|
-
reason='jax arrays do not support item assignment')
|
339
329
|
def test_kmeans2_init(self, xp):
|
340
330
|
rng = np.random.default_rng(12345678)
|
341
331
|
data = xp.asarray(TESTDATA_2D)
|
@@ -357,6 +347,7 @@ class TestKMean:
|
|
357
347
|
def krand_lock(self):
|
358
348
|
return Lock()
|
359
349
|
|
350
|
+
@xfail_xp_backends('dask.array', reason="Wrong answer")
|
360
351
|
@pytest.mark.skipif(sys.platform == 'win32',
|
361
352
|
reason='Fails with MemoryError in Wine.')
|
362
353
|
def test_krandinit(self, xp, krand_lock):
|
@@ -364,13 +355,12 @@ class TestKMean:
|
|
364
355
|
datas = [xp.reshape(data, (200, 2)),
|
365
356
|
xp.reshape(data, (20, 20))[:10, :]]
|
366
357
|
k = int(1e6)
|
367
|
-
xp_test = array_namespace(data)
|
368
358
|
with krand_lock:
|
369
359
|
for data in datas:
|
370
360
|
rng = np.random.default_rng(1234)
|
371
|
-
init = _krandinit(data, k, rng,
|
372
|
-
orig_cov = xpx.cov(data.T, xp=
|
373
|
-
init_cov = xpx.cov(init.T, xp=
|
361
|
+
init = _krandinit(data, k, rng, xp)
|
362
|
+
orig_cov = xpx.cov(data.T, xp=xp)
|
363
|
+
init_cov = xpx.cov(init.T, xp=xp)
|
374
364
|
xp_assert_close(orig_cov, init_cov, atol=1.1e-2)
|
375
365
|
|
376
366
|
def test_kmeans2_empty(self, xp):
|
@@ -390,8 +380,6 @@ class TestKMean:
|
|
390
380
|
xp_assert_close(res[0], xp.asarray([4.], dtype=xp.float64))
|
391
381
|
xp_assert_close(res[1], xp.asarray(2.3999999999999999, dtype=xp.float64)[()])
|
392
382
|
|
393
|
-
@skip_xp_backends('jax.numpy',
|
394
|
-
reason='jax arrays do not support item assignment')
|
395
383
|
def test_kmeans2_kpp_low_dim(self, xp):
|
396
384
|
# Regression test for gh-11462
|
397
385
|
rng = np.random.default_rng(2358792345678234568)
|
@@ -401,8 +389,6 @@ class TestKMean:
|
|
401
389
|
xp_assert_close(res, prev_res)
|
402
390
|
|
403
391
|
@pytest.mark.thread_unsafe
|
404
|
-
@skip_xp_backends('jax.numpy',
|
405
|
-
reason='jax arrays do not support item assignment')
|
406
392
|
def test_kmeans2_kpp_high_dim(self, xp):
|
407
393
|
# Regression test for gh-11462
|
408
394
|
rng = np.random.default_rng(23587923456834568)
|
@@ -427,8 +413,6 @@ class TestKMean:
|
|
427
413
|
xp_assert_close(res[0], xp.asarray([-0.4, 8.], dtype=xp.float64))
|
428
414
|
xp_assert_close(res[1], xp.asarray(1.0666666666666667, dtype=xp.float64)[()])
|
429
415
|
|
430
|
-
@skip_xp_backends('jax.numpy',
|
431
|
-
reason='jax arrays do not support item assignment')
|
432
416
|
def test_kmeans_and_kmeans2_random_seed(self, xp):
|
433
417
|
|
434
418
|
seed_list = [
|
scipy/cluster/vq.py
CHANGED
@@ -67,9 +67,8 @@ code book.
|
|
67
67
|
import warnings
|
68
68
|
import numpy as np
|
69
69
|
from collections import deque
|
70
|
-
from scipy._lib._array_api import (
|
71
|
-
|
72
|
-
)
|
70
|
+
from scipy._lib._array_api import (_asarray, array_namespace, is_lazy_array,
|
71
|
+
xp_capabilities, xp_copy, xp_size)
|
73
72
|
from scipy._lib._util import (check_random_state, rng_integers,
|
74
73
|
_transition_to_rng)
|
75
74
|
from scipy._lib import array_api_extra as xpx
|
@@ -86,7 +85,8 @@ class ClusterError(Exception):
|
|
86
85
|
pass
|
87
86
|
|
88
87
|
|
89
|
-
|
88
|
+
@xp_capabilities()
|
89
|
+
def whiten(obs, check_finite=None):
|
90
90
|
"""
|
91
91
|
Normalize a group of observations on a per feature basis.
|
92
92
|
|
@@ -100,19 +100,19 @@ def whiten(obs, check_finite=True):
|
|
100
100
|
----------
|
101
101
|
obs : ndarray
|
102
102
|
Each row of the array is an observation. The
|
103
|
-
columns are the features seen during each observation
|
103
|
+
columns are the features seen during each observation::
|
104
104
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
105
|
+
# f0 f1 f2
|
106
|
+
obs = [[ 1., 1., 1.], #o0
|
107
|
+
[ 2., 2., 2.], #o1
|
108
|
+
[ 3., 3., 3.], #o2
|
109
|
+
[ 4., 4., 4.]] #o3
|
110
110
|
|
111
111
|
check_finite : bool, optional
|
112
112
|
Whether to check that the input matrices contain only finite numbers.
|
113
113
|
Disabling may give a performance gain, but may result in problems
|
114
114
|
(crashes, non-termination) if the inputs do contain infinities or NaNs.
|
115
|
-
Default: True
|
115
|
+
Default: True for eager backends and False for lazy ones.
|
116
116
|
|
117
117
|
Returns
|
118
118
|
-------
|
@@ -134,17 +134,21 @@ def whiten(obs, check_finite=True):
|
|
134
134
|
|
135
135
|
"""
|
136
136
|
xp = array_namespace(obs)
|
137
|
+
if check_finite is None:
|
138
|
+
check_finite = not is_lazy_array(obs)
|
137
139
|
obs = _asarray(obs, check_finite=check_finite, xp=xp)
|
138
140
|
std_dev = xp.std(obs, axis=0)
|
139
141
|
zero_std_mask = std_dev == 0
|
140
|
-
|
141
|
-
|
142
|
+
std_dev = xpx.at(std_dev, zero_std_mask).set(1.0)
|
143
|
+
if check_finite and xp.any(zero_std_mask):
|
142
144
|
warnings.warn("Some columns have standard deviation zero. "
|
143
145
|
"The values of these columns will not change.",
|
144
146
|
RuntimeWarning, stacklevel=2)
|
145
147
|
return obs / std_dev
|
146
148
|
|
147
149
|
|
150
|
+
@xp_capabilities(cpu_only=True, reason="uses spatial.distance.cdist",
|
151
|
+
jax_jit=False, allow_dask_compute=True)
|
148
152
|
def vq(obs, code_book, check_finite=True):
|
149
153
|
"""
|
150
154
|
Assign codes from a code book to observations.
|
@@ -168,13 +172,12 @@ def vq(obs, code_book, check_finite=True):
|
|
168
172
|
code_book : ndarray
|
169
173
|
The code book is usually generated using the k-means algorithm.
|
170
174
|
Each row of the array holds a different code, and the columns are
|
171
|
-
the features of the code
|
175
|
+
the features of the code::
|
172
176
|
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
... [ 1., 2., 3., 4.]] #c2
|
177
|
+
# f0 f1 f2 f3
|
178
|
+
code_book = [[ 1., 2., 3., 4.], #c0
|
179
|
+
[ 1., 2., 3., 4.], #c1
|
180
|
+
[ 1., 2., 3., 4.]] #c2
|
178
181
|
|
179
182
|
check_finite : bool, optional
|
180
183
|
Whether to check that the input matrices contain only finite numbers.
|
@@ -208,10 +211,9 @@ def vq(obs, code_book, check_finite=True):
|
|
208
211
|
code_book = _asarray(code_book, xp=xp, check_finite=check_finite)
|
209
212
|
ct = xp.result_type(obs, code_book)
|
210
213
|
|
211
|
-
c_obs = xp.astype(obs, ct, copy=False)
|
212
|
-
c_code_book = xp.astype(code_book, ct, copy=False)
|
213
|
-
|
214
214
|
if xp.isdtype(ct, kind='real floating'):
|
215
|
+
c_obs = xp.astype(obs, ct, copy=False)
|
216
|
+
c_code_book = xp.astype(code_book, ct, copy=False)
|
215
217
|
c_obs = np.asarray(c_obs)
|
216
218
|
c_code_book = np.asarray(c_code_book)
|
217
219
|
result = _vq.vq(c_obs, c_code_book)
|
@@ -310,25 +312,24 @@ def _kmeans(obs, guess, thresh=1e-5, xp=None):
|
|
310
312
|
code_book = guess
|
311
313
|
diff = xp.inf
|
312
314
|
prev_avg_dists = deque([diff], maxlen=2)
|
315
|
+
|
316
|
+
np_obs = np.asarray(obs)
|
313
317
|
while diff > thresh:
|
314
318
|
# compute membership and distances between obs and code_book
|
315
319
|
obs_code, distort = vq(obs, code_book, check_finite=False)
|
316
320
|
prev_avg_dists.append(xp.mean(distort, axis=-1))
|
317
321
|
# recalc code_book as centroids of associated obs
|
318
|
-
obs = np.asarray(obs)
|
319
322
|
obs_code = np.asarray(obs_code)
|
320
|
-
code_book, has_members = _vq.update_cluster_means(
|
323
|
+
code_book, has_members = _vq.update_cluster_means(np_obs, obs_code,
|
321
324
|
code_book.shape[0])
|
322
|
-
obs = xp.asarray(obs)
|
323
|
-
obs_code = xp.asarray(obs_code)
|
324
|
-
code_book = xp.asarray(code_book)
|
325
|
-
has_members = xp.asarray(has_members)
|
326
325
|
code_book = code_book[has_members]
|
326
|
+
code_book = xp.asarray(code_book)
|
327
327
|
diff = xp.abs(prev_avg_dists[0] - prev_avg_dists[1])
|
328
328
|
|
329
329
|
return code_book, prev_avg_dists[1]
|
330
330
|
|
331
331
|
|
332
|
+
@xp_capabilities(cpu_only=True, jax_jit=False, allow_dask_compute=True)
|
332
333
|
@_transition_to_rng("seed")
|
333
334
|
def kmeans(obs, k_or_guess, iter=20, thresh=1e-5, check_finite=True,
|
334
335
|
*, rng=None):
|
@@ -480,7 +481,7 @@ def kmeans(obs, k_or_guess, iter=20, thresh=1e-5, check_finite=True,
|
|
480
481
|
if k != guess:
|
481
482
|
raise ValueError("If k_or_guess is a scalar, it must be an integer.")
|
482
483
|
if k < 1:
|
483
|
-
raise ValueError("Asked for
|
484
|
+
raise ValueError(f"Asked for {k} clusters.")
|
484
485
|
|
485
486
|
rng = check_random_state(rng)
|
486
487
|
|
@@ -609,15 +610,16 @@ def _kpp(data, k, rng, xp):
|
|
609
610
|
|
610
611
|
for i in range(k):
|
611
612
|
if i == 0:
|
612
|
-
|
613
|
-
|
613
|
+
data_idx = rng_integers(rng, data.shape[0])
|
614
614
|
else:
|
615
615
|
D2 = cdist(init[:i,:], data, metric='sqeuclidean').min(axis=0)
|
616
616
|
probs = D2/D2.sum()
|
617
617
|
cumprobs = probs.cumsum()
|
618
618
|
r = rng.uniform()
|
619
619
|
cumprobs = np.asarray(cumprobs)
|
620
|
-
|
620
|
+
data_idx = int(np.searchsorted(cumprobs, r))
|
621
|
+
|
622
|
+
init = xpx.at(init)[i, :].set(data[data_idx, :])
|
621
623
|
|
622
624
|
if ndim == 1:
|
623
625
|
init = init[:, 0]
|
@@ -643,6 +645,7 @@ def _missing_raise():
|
|
643
645
|
_valid_miss_meth = {'warn': _missing_warn, 'raise': _missing_raise}
|
644
646
|
|
645
647
|
|
648
|
+
@xp_capabilities(cpu_only=True, jax_jit=False, allow_dask_compute=True)
|
646
649
|
@_transition_to_rng("seed")
|
647
650
|
def kmeans2(data, k, iter=10, thresh=1e-5, minit='random',
|
648
651
|
missing='warn', check_finite=True, *, rng=None):
|
@@ -799,8 +802,9 @@ def kmeans2(data, k, iter=10, thresh=1e-5, minit='random',
|
|
799
802
|
nc = int(code_book)
|
800
803
|
|
801
804
|
if nc < 1:
|
802
|
-
raise ValueError(
|
803
|
-
|
805
|
+
raise ValueError(
|
806
|
+
f"Cannot ask kmeans2 for {nc} clusters (k was {code_book})"
|
807
|
+
)
|
804
808
|
elif nc != code_book:
|
805
809
|
warnings.warn("k was not an integer, was converted.", stacklevel=2)
|
806
810
|
|
@@ -814,7 +818,7 @@ def kmeans2(data, k, iter=10, thresh=1e-5, minit='random',
|
|
814
818
|
|
815
819
|
data = np.asarray(data)
|
816
820
|
code_book = np.asarray(code_book)
|
817
|
-
for
|
821
|
+
for _ in range(iter):
|
818
822
|
# Compute the nearest neighbor for each obs using the current code book
|
819
823
|
label = vq(data, code_book, check_finite=check_finite)[0]
|
820
824
|
# Update the code book by computing centroids
|