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.
- scipy/.dylibs/libscipy_openblas.dylib +0 -0
- scipy/__config__.py +8 -8
- scipy/__init__.py +3 -6
- scipy/_cyutility.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/_lib/_test_deprecation_def.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/cluster/_optimal_leaf_ordering.cpython-312-darwin.so +0 -0
- scipy/cluster/_vq.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/integrate/_lsoda.cpython-312-darwin.so +0 -0
- scipy/integrate/_ode.py +9 -2
- scipy/integrate/_odepack.cpython-312-darwin.so +0 -0
- scipy/integrate/_quad_vec.py +21 -29
- scipy/integrate/_quadpack.cpython-312-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-312-darwin.so +0 -0
- scipy/integrate/_vode.cpython-312-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-312-darwin.so +0 -0
- scipy/interpolate/_dierckx.cpython-312-darwin.so +0 -0
- scipy/interpolate/_fitpack.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/interpolate/_rbf.py +2 -2
- scipy/interpolate/_rbfinterp.py +1 -1
- scipy/interpolate/_rbfinterp_pythran.cpython-312-darwin.so +0 -0
- scipy/interpolate/_rgi.py +31 -26
- scipy/interpolate/_rgi_cython.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/io/matlab/_mio_utils.cpython-312-darwin.so +0 -0
- scipy/io/matlab/_miobase.py +4 -1
- scipy/io/matlab/_streams.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/linalg/_decomp_ldl.py +4 -1
- scipy/linalg/_decomp_lu.py +18 -6
- scipy/linalg/_decomp_lu_cython.cpython-312-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-312-darwin.so +0 -0
- scipy/linalg/_expm_frechet.py +4 -0
- scipy/linalg/_fblas.cpython-312-darwin.so +0 -0
- scipy/linalg/_flapack.cpython-312-darwin.so +0 -0
- scipy/linalg/_linalg_pythran.cpython-312-darwin.so +0 -0
- scipy/linalg/_matfuncs.py +187 -4
- scipy/linalg/_matfuncs_expm.cpython-312-darwin.so +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cpython-312-darwin.so +0 -0
- scipy/linalg/_matfuncs_sqrtm.py +1 -99
- scipy/linalg/_matfuncs_sqrtm_triu.cpython-312-darwin.so +0 -0
- scipy/linalg/_procrustes.py +2 -0
- scipy/linalg/_sketches.py +17 -6
- scipy/linalg/_solve_toeplitz.cpython-312-darwin.so +0 -0
- scipy/linalg/_solvers.py +7 -2
- scipy/linalg/_special_matrices.py +26 -36
- scipy/linalg/cython_blas.cpython-312-darwin.so +0 -0
- scipy/linalg/cython_lapack.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/ndimage/_ni_docstrings.py +5 -1
- scipy/ndimage/_ni_label.cpython-312-darwin.so +0 -0
- scipy/ndimage/_ni_support.py +1 -5
- scipy/ndimage/_rank_filter_1d.cpython-312-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-312-darwin.so +0 -0
- scipy/optimize/_basinhopping.py +13 -7
- scipy/optimize/_bglu_dense.cpython-312-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-312-darwin.so +0 -0
- scipy/optimize/_dual_annealing.py +1 -1
- scipy/optimize/_elementwise.py +1 -4
- scipy/optimize/_group_columns.cpython-312-darwin.so +0 -0
- scipy/optimize/_lbfgsb.cpython-312-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-312-darwin.so +0 -0
- scipy/optimize/_lsq/common.py +3 -3
- scipy/optimize/_lsq/dogbox.py +16 -2
- scipy/optimize/_lsq/givens_elimination.cpython-312-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-312-darwin.so +0 -0
- scipy/optimize/_minpack_py.py +21 -14
- scipy/optimize/_moduleTNC.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/optimize/_spectral.py +1 -1
- scipy/optimize/_tnc.py +8 -1
- scipy/optimize/_trlib/_trlib.cpython-312-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-312-darwin.so +0 -0
- scipy/optimize/_zeros_py.py +97 -17
- scipy/optimize/cython_optimize/_zeros.cpython-312-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-312-darwin.so +0 -0
- scipy/signal/_peak_finding_utils.cpython-312-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-312-darwin.so +0 -0
- scipy/signal/_sosfilt.cpython-312-darwin.so +0 -0
- scipy/signal/_spectral_py.py +230 -50
- scipy/signal/_spline.cpython-312-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-312-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-312-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-312-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-312-darwin.so +0 -0
- scipy/sparse/csgraph/_matching.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_reordering.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_shortest_path.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_tools.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_traversal.cpython-312-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-312-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-312-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-312-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cpython-312-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_spropack.cpython-312-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cpython-312-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-312-darwin.so +0 -0
- scipy/spatial/_distance_pybind.cpython-312-darwin.so +0 -0
- scipy/spatial/_distance_wrap.cpython-312-darwin.so +0 -0
- scipy/spatial/_hausdorff.cpython-312-darwin.so +0 -0
- scipy/spatial/_qhull.cpython-312-darwin.so +0 -0
- scipy/spatial/_voronoi.cpython-312-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-312-darwin.so +0 -0
- scipy/spatial/transform/_rotation.cpython-312-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-312-darwin.so +0 -0
- scipy/special/_ellip_harm_2.cpython-312-darwin.so +0 -0
- scipy/special/_gufuncs.cpython-312-darwin.so +0 -0
- scipy/special/_logsumexp.py +67 -58
- scipy/special/_orthogonal.pyi +1 -1
- scipy/special/_specfun.cpython-312-darwin.so +0 -0
- scipy/special/_special_ufuncs.cpython-312-darwin.so +0 -0
- scipy/special/_spherical_bessel.py +4 -4
- scipy/special/_support_alternative_backends.py +212 -119
- scipy/special/_test_internal.cpython-312-darwin.so +0 -0
- scipy/special/_testutils.py +4 -4
- scipy/special/_ufuncs.cpython-312-darwin.so +0 -0
- scipy/special/_ufuncs.pyi +1 -0
- scipy/special/_ufuncs.pyx +215 -1400
- scipy/special/_ufuncs_cxx.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/stats/_axis_nan_policy.py +5 -12
- scipy/stats/_biasedurn.cpython-312-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-312-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-312-darwin.so +0 -0
- scipy/stats/_qmvnt.py +16 -95
- scipy/stats/_qmvnt_cy.cpython-312-darwin.so +0 -0
- scipy/stats/_quantile.py +335 -0
- scipy/stats/_rcont/rcont.cpython-312-darwin.so +0 -0
- scipy/stats/_resampling.py +4 -29
- scipy/stats/_sampling.py +1 -1
- scipy/stats/_sobol.cpython-312-darwin.so +0 -0
- scipy/stats/_stats.cpython-312-darwin.so +0 -0
- scipy/stats/_stats_mstats_common.py +21 -2
- scipy/stats/_stats_py.py +550 -476
- scipy/stats/_stats_pythran.cpython-312-darwin.so +0 -0
- scipy/stats/_unuran/unuran_wrapper.cpython-312-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 +561 -568
- 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-312-darwin.so +0 -0
- scipy/optimize/_cobyla.cpython-312-darwin.so +0 -0
- scipy/optimize/_cython_nnls.cpython-312-darwin.so +0 -0
- scipy/optimize/_slsqp.cpython-312-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-312-darwin.so +0 -0
- scipy-1.15.3.dist-info/WHEEL +0 -4
scipy/io/tests/test_wavfile.py
CHANGED
@@ -334,6 +334,47 @@ def test_write_roundtrip_rf64(tmpdir):
|
|
334
334
|
data2[0] = 0
|
335
335
|
|
336
336
|
|
337
|
+
# Fake a non-seekable file-like object without resorting to subprocesses.
|
338
|
+
class Nonseekable:
|
339
|
+
def __init__(self, fp):
|
340
|
+
self.fp = fp
|
341
|
+
|
342
|
+
def seekable(self):
|
343
|
+
return False
|
344
|
+
|
345
|
+
def read(self, size=-1, /):
|
346
|
+
return self.fp.read(size)
|
347
|
+
|
348
|
+
def close(self):
|
349
|
+
self.fp.close()
|
350
|
+
|
351
|
+
|
352
|
+
def test_streams():
|
353
|
+
for filename in ['test-44100Hz-le-1ch-4bytes.wav',
|
354
|
+
'test-8000Hz-le-2ch-1byteu.wav',
|
355
|
+
'test-44100Hz-2ch-32bit-float-le.wav',
|
356
|
+
'test-44100Hz-2ch-32bit-float-be.wav',
|
357
|
+
'test-8000Hz-le-5ch-9S-5bit.wav',
|
358
|
+
'test-8000Hz-le-4ch-9S-12bit.wav',
|
359
|
+
'test-8000Hz-le-3ch-5S-24bit.wav',
|
360
|
+
'test-1234Hz-le-1ch-10S-20bit-extra.wav',
|
361
|
+
'test-8000Hz-le-3ch-5S-36bit.wav',
|
362
|
+
'test-8000Hz-le-3ch-5S-45bit.wav',
|
363
|
+
'test-8000Hz-le-3ch-5S-53bit.wav',
|
364
|
+
'test-8000Hz-le-3ch-5S-64bit.wav',
|
365
|
+
'test-44100Hz-be-1ch-4bytes.wav', # RIFX
|
366
|
+
'test-44100Hz-le-1ch-4bytes-rf64.wav']:
|
367
|
+
dfname = datafile(filename)
|
368
|
+
with open(dfname, 'rb') as fp1, open(dfname, 'rb') as fp2:
|
369
|
+
rate1, data1 = wavfile.read(fp1)
|
370
|
+
rate2, data2 = wavfile.read(Nonseekable(fp2))
|
371
|
+
rate3, data3 = wavfile.read(dfname, mmap=False)
|
372
|
+
assert_equal(rate1, rate3)
|
373
|
+
assert_equal(rate2, rate3)
|
374
|
+
assert_equal(data1, data3)
|
375
|
+
assert_equal(data2, data3)
|
376
|
+
|
377
|
+
|
337
378
|
def test_read_unknown_filetype_fail():
|
338
379
|
# Not an RIFF
|
339
380
|
for mmap in [False, True]:
|
scipy/io/wavfile.py
CHANGED
@@ -9,6 +9,7 @@ Functions
|
|
9
9
|
|
10
10
|
"""
|
11
11
|
import io
|
12
|
+
import os
|
12
13
|
import sys
|
13
14
|
import numpy as np
|
14
15
|
import struct
|
@@ -27,6 +28,47 @@ class WavFileWarning(UserWarning):
|
|
27
28
|
pass
|
28
29
|
|
29
30
|
|
31
|
+
class SeekEmulatingReader:
|
32
|
+
"""
|
33
|
+
Tracks stream position, provides tell(), and emulates only those
|
34
|
+
seeks that can be supported by reading forward. Other seeks raise
|
35
|
+
io.UnsupportedOperation. Note that this class implements only the
|
36
|
+
minimum necessary to keep wavfile.read() happy.
|
37
|
+
"""
|
38
|
+
def __init__(self, reader):
|
39
|
+
self.reader = reader
|
40
|
+
self.pos = 0
|
41
|
+
|
42
|
+
def read(self, size=-1, /):
|
43
|
+
data = self.reader.read(size)
|
44
|
+
self.pos += len(data)
|
45
|
+
return data
|
46
|
+
|
47
|
+
def seek(self, offset, whence=os.SEEK_SET, /):
|
48
|
+
match whence:
|
49
|
+
case os.SEEK_SET if offset >= self.pos:
|
50
|
+
self.read(offset - self.pos) # convert to relative
|
51
|
+
case os.SEEK_CUR if offset >= 0:
|
52
|
+
self.read(offset) # advance by offset
|
53
|
+
case os.SEEK_END if offset == 0:
|
54
|
+
self.read() # advance to end of stream
|
55
|
+
case _:
|
56
|
+
raise io.UnsupportedOperation("SeekEmulatingReader was asked to emulate"
|
57
|
+
" a seek operation it does not support.")
|
58
|
+
return self.pos
|
59
|
+
|
60
|
+
def tell(self):
|
61
|
+
return self.pos
|
62
|
+
|
63
|
+
def close(self):
|
64
|
+
self.reader.close()
|
65
|
+
|
66
|
+
# np.fromfile expects to be able to call flush(), and _read_data_chunk
|
67
|
+
# expects to catch io.UnsupportedOperation if np.fromfile fails.
|
68
|
+
def flush(self):
|
69
|
+
raise io.UnsupportedOperation("SeekEmulatingReader can't flush.")
|
70
|
+
|
71
|
+
|
30
72
|
class WAVE_FORMAT(IntEnum):
|
31
73
|
"""
|
32
74
|
WAVE form wFormatTag IDs
|
@@ -397,7 +439,7 @@ def _read_fmt_chunk(fid, is_big_endian):
|
|
397
439
|
|
398
440
|
|
399
441
|
def _read_data_chunk(fid, format_tag, channels, bit_depth, is_big_endian, is_rf64,
|
400
|
-
block_align, mmap=False):
|
442
|
+
block_align, mmap=False, rf64_chunk_size=None):
|
401
443
|
"""
|
402
444
|
Notes
|
403
445
|
-----
|
@@ -431,11 +473,8 @@ def _read_data_chunk(fid, format_tag, channels, bit_depth, is_big_endian, is_rf6
|
|
431
473
|
if not is_rf64:
|
432
474
|
size = struct.unpack(fmt+'I', fid.read(4))[0]
|
433
475
|
else:
|
434
|
-
pos = fid.tell()
|
435
476
|
# chunk size is stored in global file header for RF64
|
436
|
-
|
437
|
-
size = struct.unpack('<Q', fid.read(8))[0]
|
438
|
-
fid.seek(pos)
|
477
|
+
size = rf64_chunk_size
|
439
478
|
# skip data chunk size as it is 0xFFFFFFF
|
440
479
|
fid.read(4)
|
441
480
|
|
@@ -538,6 +577,7 @@ def _read_riff_chunk(fid):
|
|
538
577
|
# Size of entire file
|
539
578
|
if not is_rf64:
|
540
579
|
file_size = struct.unpack(fmt, fid.read(4))[0] + 8
|
580
|
+
rf64_chunk_size = None
|
541
581
|
str2 = fid.read(4)
|
542
582
|
else:
|
543
583
|
# Skip 0xFFFFFFFF (-1) bytes
|
@@ -548,14 +588,15 @@ def _read_riff_chunk(fid):
|
|
548
588
|
raise ValueError("Invalid RF64 file: ds64 chunk not found.")
|
549
589
|
ds64_size = struct.unpack("<I", fid.read(4))[0]
|
550
590
|
file_size = struct.unpack(fmt, fid.read(8))[0] + 8
|
591
|
+
rf64_chunk_size = struct.unpack('<Q', fid.read(8))[0]
|
551
592
|
# Ignore additional attributes of ds64 chunk like sample count, tables, etc.
|
552
593
|
# and just skip to the next chunk
|
553
|
-
fid.seek(ds64_size -
|
594
|
+
fid.seek(ds64_size - 16, 1)
|
554
595
|
|
555
596
|
if str2 != b'WAVE':
|
556
597
|
raise ValueError(f"Not a WAV file. RIFF form type is {repr(str2)}.")
|
557
598
|
|
558
|
-
return file_size, is_big_endian, is_rf64
|
599
|
+
return file_size, is_big_endian, is_rf64, rf64_chunk_size
|
559
600
|
|
560
601
|
|
561
602
|
def _handle_pad_byte(fid, size):
|
@@ -672,9 +713,12 @@ def read(filename, mmap=False):
|
|
672
713
|
mmap = False
|
673
714
|
else:
|
674
715
|
fid = open(filename, 'rb')
|
716
|
+
|
717
|
+
if not (was_seekable := fid.seekable()):
|
718
|
+
fid = SeekEmulatingReader(fid)
|
675
719
|
|
676
720
|
try:
|
677
|
-
file_size, is_big_endian, is_rf64 = _read_riff_chunk(fid)
|
721
|
+
file_size, is_big_endian, is_rf64, rf64_chunk_size = _read_riff_chunk(fid)
|
678
722
|
fmt_chunk_received = False
|
679
723
|
data_chunk_received = False
|
680
724
|
while fid.tell() < file_size:
|
@@ -713,7 +757,8 @@ def read(filename, mmap=False):
|
|
713
757
|
if not fmt_chunk_received:
|
714
758
|
raise ValueError("No fmt chunk before data")
|
715
759
|
data = _read_data_chunk(fid, format_tag, channels, bit_depth,
|
716
|
-
is_big_endian, is_rf64, block_align,
|
760
|
+
is_big_endian, is_rf64, block_align,
|
761
|
+
mmap, rf64_chunk_size)
|
717
762
|
elif chunk_id == b'LIST':
|
718
763
|
# Someday this could be handled properly but for now skip it
|
719
764
|
_skip_unknown_chunk(fid, is_big_endian)
|
@@ -727,7 +772,9 @@ def read(filename, mmap=False):
|
|
727
772
|
finally:
|
728
773
|
if not hasattr(filename, 'read'):
|
729
774
|
fid.close()
|
730
|
-
|
775
|
+
elif was_seekable:
|
776
|
+
# Rewind, if we are able, so that caller can do something
|
777
|
+
# else with the raw WAV stream.
|
731
778
|
fid.seek(0)
|
732
779
|
|
733
780
|
return fs, data
|
scipy/linalg/_basic.py
CHANGED
@@ -9,6 +9,7 @@ from warnings import warn
|
|
9
9
|
from itertools import product
|
10
10
|
import numpy as np
|
11
11
|
from numpy import atleast_1d, atleast_2d
|
12
|
+
from scipy._lib._util import _apply_over_batch
|
12
13
|
from .lapack import get_lapack_funcs, _compute_lwork
|
13
14
|
from ._misc import LinAlgError, _datacopied, LinAlgWarning
|
14
15
|
from ._decomp import _asarray_validated
|
@@ -38,13 +39,13 @@ def _solve_check(n, info, lamch=None, rcond=None):
|
|
38
39
|
""" Check arguments during the different steps of the solution phase """
|
39
40
|
if info < 0:
|
40
41
|
raise ValueError(f'LAPACK reported an illegal value in {-info}-th argument.')
|
41
|
-
elif 0 < info:
|
42
|
+
elif 0 < info or rcond == 0:
|
42
43
|
raise LinAlgError('Matrix is singular.')
|
43
44
|
|
44
45
|
if lamch is None:
|
45
46
|
return
|
46
47
|
E = lamch('E')
|
47
|
-
if rcond < E
|
48
|
+
if not (rcond >= E): # `rcond < E` doesn't handle NaN
|
48
49
|
warn(f'Ill-conditioned matrix (rcond={rcond:.6g}): '
|
49
50
|
'result may not be accurate.',
|
50
51
|
LinAlgWarning, stacklevel=3)
|
@@ -72,28 +73,29 @@ def _find_matrix_structure(a):
|
|
72
73
|
return kind, n_below, n_above
|
73
74
|
|
74
75
|
|
76
|
+
@_apply_over_batch(('a', 2), ('b', '1|2'))
|
75
77
|
def solve(a, b, lower=False, overwrite_a=False,
|
76
78
|
overwrite_b=False, check_finite=True, assume_a=None,
|
77
79
|
transposed=False):
|
78
80
|
"""
|
79
|
-
|
80
|
-
|
81
|
+
Solve the equation ``a @ x = b`` for ``x``,
|
82
|
+
where `a` is a square matrix.
|
81
83
|
|
82
84
|
If the data matrix is known to be a particular type then supplying the
|
83
85
|
corresponding string to ``assume_a`` key chooses the dedicated solver.
|
84
86
|
The available options are
|
85
87
|
|
86
|
-
|
87
|
-
diagonal
|
88
|
-
tridiagonal
|
89
|
-
banded
|
90
|
-
upper triangular
|
91
|
-
lower triangular
|
92
|
-
symmetric
|
93
|
-
hermitian
|
94
|
-
positive definite 'positive definite' (or 'pos')
|
95
|
-
general
|
96
|
-
|
88
|
+
============================= ================================
|
89
|
+
diagonal 'diagonal'
|
90
|
+
tridiagonal 'tridiagonal'
|
91
|
+
banded 'banded'
|
92
|
+
upper triangular 'upper triangular'
|
93
|
+
lower triangular 'lower triangular'
|
94
|
+
symmetric 'symmetric' (or 'sym')
|
95
|
+
hermitian 'hermitian' (or 'her')
|
96
|
+
symmetric positive definite 'positive definite' (or 'pos')
|
97
|
+
general 'general' (or 'gen')
|
98
|
+
============================= ================================
|
97
99
|
|
98
100
|
Parameters
|
99
101
|
----------
|
@@ -133,7 +135,7 @@ def solve(a, b, lower=False, overwrite_a=False,
|
|
133
135
|
ValueError
|
134
136
|
If size mismatches detected or input a is not square.
|
135
137
|
LinAlgError
|
136
|
-
If the matrix
|
138
|
+
If the computation fails because of matrix singularity.
|
137
139
|
LinAlgWarning
|
138
140
|
If an ill-conditioned input a is detected.
|
139
141
|
NotImplementedError
|
@@ -226,17 +228,6 @@ def solve(a, b, lower=False, overwrite_a=False,
|
|
226
228
|
else:
|
227
229
|
lamch = get_lapack_funcs('lamch', dtype='d')
|
228
230
|
|
229
|
-
# Currently we do not have the other forms of the norm calculators
|
230
|
-
# lansy, lanpo, lanhe.
|
231
|
-
# However, in any case they only reduce computations slightly...
|
232
|
-
if assume_a == 'diagonal':
|
233
|
-
_matrix_norm = _matrix_norm_diagonal
|
234
|
-
elif assume_a == 'tridiagonal':
|
235
|
-
_matrix_norm = _matrix_norm_tridiagonal
|
236
|
-
elif assume_a in {'lower triangular', 'upper triangular'}:
|
237
|
-
_matrix_norm = _matrix_norm_triangular(assume_a)
|
238
|
-
else:
|
239
|
-
_matrix_norm = _matrix_norm_general
|
240
231
|
|
241
232
|
# Since the I-norm and 1-norm are the same for symmetric matrices
|
242
233
|
# we can collect them all in this one call
|
@@ -253,7 +244,23 @@ def solve(a, b, lower=False, overwrite_a=False,
|
|
253
244
|
trans = 0
|
254
245
|
norm = '1'
|
255
246
|
|
256
|
-
|
247
|
+
# Currently we do not have the other forms of the norm calculators
|
248
|
+
# lansy, lanpo, lanhe.
|
249
|
+
# However, in any case they only reduce computations slightly...
|
250
|
+
if assume_a == 'diagonal':
|
251
|
+
anorm = _matrix_norm_diagonal(a1, check_finite)
|
252
|
+
elif assume_a == 'tridiagonal':
|
253
|
+
anorm = _matrix_norm_tridiagonal(norm, a1, check_finite)
|
254
|
+
elif assume_a == 'banded':
|
255
|
+
n_below, n_above = bandwidth(a1) if n_below is None else (n_below, n_above)
|
256
|
+
a2, n_below, n_above = ((a1.T, n_above, n_below) if transposed
|
257
|
+
else (a1, n_below, n_above))
|
258
|
+
ab = _to_banded(n_below, n_above, a2)
|
259
|
+
anorm = _matrix_norm_banded(n_below, n_above, norm, ab, check_finite)
|
260
|
+
elif assume_a in {'lower triangular', 'upper triangular'}:
|
261
|
+
anorm = _matrix_norm_triangular(assume_a, norm, a1, check_finite)
|
262
|
+
else:
|
263
|
+
anorm = _matrix_norm_general(norm, a1, check_finite)
|
257
264
|
|
258
265
|
info, rcond = 0, np.inf
|
259
266
|
|
@@ -277,7 +284,7 @@ def solve(a, b, lower=False, overwrite_a=False,
|
|
277
284
|
overwrite_a=overwrite_a,
|
278
285
|
overwrite_b=overwrite_b)
|
279
286
|
_solve_check(n, info)
|
280
|
-
rcond, info = hecon(lu, ipvt, anorm)
|
287
|
+
rcond, info = hecon(lu, ipvt, anorm, lower=lower)
|
281
288
|
# Symmetric case 'sysv'
|
282
289
|
elif assume_a in {'symmetric', 'sym'}:
|
283
290
|
sycon, sysv, sysv_lw = get_lapack_funcs(('sycon', 'sysv',
|
@@ -288,13 +295,14 @@ def solve(a, b, lower=False, overwrite_a=False,
|
|
288
295
|
overwrite_a=overwrite_a,
|
289
296
|
overwrite_b=overwrite_b)
|
290
297
|
_solve_check(n, info)
|
291
|
-
rcond, info = sycon(lu, ipvt, anorm)
|
298
|
+
rcond, info = sycon(lu, ipvt, anorm, lower=lower)
|
292
299
|
# Diagonal case
|
293
300
|
elif assume_a == 'diagonal':
|
294
301
|
diag_a = np.diag(a1)
|
295
302
|
x = (b1.T / diag_a).T
|
296
303
|
abs_diag_a = np.abs(diag_a)
|
297
|
-
|
304
|
+
diag_min = abs_diag_a.min()
|
305
|
+
rcond = diag_min if diag_min == 0 else diag_min / abs_diag_a.max()
|
298
306
|
# Tri-diagonal case
|
299
307
|
elif assume_a == 'tridiagonal':
|
300
308
|
a1 = a1.T if transposed else a1
|
@@ -307,18 +315,14 @@ def solve(a, b, lower=False, overwrite_a=False,
|
|
307
315
|
rcond, info = _gtcon(dl, d, du, du2, ipiv, anorm)
|
308
316
|
# Banded case
|
309
317
|
elif assume_a == 'banded':
|
310
|
-
|
311
|
-
else (a1, n_below, n_above))
|
312
|
-
n_below, n_above = bandwidth(a1) if n_below is None else (n_below, n_above)
|
313
|
-
ab = _to_banded(n_below, n_above, a1)
|
314
|
-
gbsv, = get_lapack_funcs(('gbsv',), (a1, b1))
|
318
|
+
gbsv, gbcon = get_lapack_funcs(('gbsv', 'gbcon'), (a1, b1))
|
315
319
|
# Next two lines copied from `solve_banded`
|
316
320
|
a2 = np.zeros((2*n_below + n_above + 1, ab.shape[1]), dtype=gbsv.dtype)
|
317
321
|
a2[n_below:, :] = ab
|
318
|
-
|
319
|
-
|
322
|
+
lu, piv, x, info = gbsv(n_below, n_above, a2, b1,
|
323
|
+
overwrite_ab=True, overwrite_b=overwrite_b)
|
320
324
|
_solve_check(n, info)
|
321
|
-
|
325
|
+
rcond, info = gbcon(n_below, n_above, lu, piv, anorm)
|
322
326
|
# Triangular case
|
323
327
|
elif assume_a in {'lower triangular', 'upper triangular'}:
|
324
328
|
lower = assume_a == 'lower triangular'
|
@@ -345,7 +349,7 @@ def solve(a, b, lower=False, overwrite_a=False,
|
|
345
349
|
return x
|
346
350
|
|
347
351
|
|
348
|
-
def _matrix_norm_diagonal(
|
352
|
+
def _matrix_norm_diagonal(a, check_finite):
|
349
353
|
# Equivalent of dlange for diagonal matrix, assuming
|
350
354
|
# norm is either 'I' or '1' (really just not the Frobenius norm)
|
351
355
|
d = np.diag(a)
|
@@ -367,12 +371,16 @@ def _matrix_norm_tridiagonal(norm, a, check_finite):
|
|
367
371
|
return d.max()
|
368
372
|
|
369
373
|
|
370
|
-
def _matrix_norm_triangular(structure):
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
374
|
+
def _matrix_norm_triangular(structure, norm, a, check_finite):
|
375
|
+
a = np.asarray_chkfinite(a) if check_finite else a
|
376
|
+
lantr = get_lapack_funcs('lantr', (a,))
|
377
|
+
return lantr(norm, a, 'L' if structure == 'lower triangular' else 'U' )
|
378
|
+
|
379
|
+
|
380
|
+
def _matrix_norm_banded(kl, ku, norm, ab, check_finite):
|
381
|
+
ab = np.asarray_chkfinite(ab) if check_finite else ab
|
382
|
+
langb = get_lapack_funcs('langb', (ab,))
|
383
|
+
return langb(norm, kl, ku, ab)
|
376
384
|
|
377
385
|
|
378
386
|
def _matrix_norm_general(norm, a, check_finite):
|
@@ -408,10 +416,11 @@ def _ensure_dtype_cdsz(*arrays):
|
|
408
416
|
return (array.astype(dtype, copy=False) for array in arrays)
|
409
417
|
|
410
418
|
|
419
|
+
@_apply_over_batch(('a', 2), ('b', '1|2'))
|
411
420
|
def solve_triangular(a, b, trans=0, lower=False, unit_diagonal=False,
|
412
421
|
overwrite_b=False, check_finite=True):
|
413
422
|
"""
|
414
|
-
Solve the equation ``a x = b`` for
|
423
|
+
Solve the equation ``a @ x = b`` for ``x``, where `a` is a triangular matrix.
|
415
424
|
|
416
425
|
Parameters
|
417
426
|
----------
|
@@ -516,16 +525,15 @@ def _solve_triangular(a1, b1, trans=0, lower=False, unit_diagonal=False,
|
|
516
525
|
if info == 0:
|
517
526
|
return x, info
|
518
527
|
if info > 0:
|
519
|
-
raise LinAlgError("singular matrix: resolution failed at diagonal
|
520
|
-
|
521
|
-
raise ValueError('illegal value in %dth argument of internal trtrs' %
|
522
|
-
(-info))
|
528
|
+
raise LinAlgError(f"singular matrix: resolution failed at diagonal {info-1}")
|
529
|
+
raise ValueError(f'illegal value in {-info}-th argument of internal trtrs')
|
523
530
|
|
524
531
|
|
525
532
|
def solve_banded(l_and_u, ab, b, overwrite_ab=False, overwrite_b=False,
|
526
533
|
check_finite=True):
|
527
534
|
"""
|
528
|
-
Solve the equation a x = b for x
|
535
|
+
Solve the equation ``a @ x = b`` for ``x``, where ``a`` is the banded matrix
|
536
|
+
defined by `ab`.
|
529
537
|
|
530
538
|
The matrix a is stored in `ab` using the matrix diagonal ordered form::
|
531
539
|
|
@@ -591,7 +599,13 @@ def solve_banded(l_and_u, ab, b, overwrite_ab=False, overwrite_b=False,
|
|
591
599
|
array([-2.37288136, 3.93220339, -4. , 4.3559322 , -1.3559322 ])
|
592
600
|
|
593
601
|
"""
|
602
|
+
(nlower, nupper) = l_and_u
|
603
|
+
return _solve_banded(nlower, nupper, ab, b, overwrite_ab=overwrite_ab,
|
604
|
+
overwrite_b=overwrite_b, check_finite=check_finite)
|
605
|
+
|
594
606
|
|
607
|
+
@_apply_over_batch(('nlower', 0), ('nupper', 0), ('ab', 2), ('b', '1|2'))
|
608
|
+
def _solve_banded(nlower, nupper, ab, b, overwrite_ab, overwrite_b, check_finite):
|
595
609
|
a1 = _asarray_validated(ab, check_finite=check_finite, as_inexact=True)
|
596
610
|
b1 = _asarray_validated(b, check_finite=check_finite, as_inexact=True)
|
597
611
|
|
@@ -599,11 +613,11 @@ def solve_banded(l_and_u, ab, b, overwrite_ab=False, overwrite_b=False,
|
|
599
613
|
if a1.shape[-1] != b1.shape[0]:
|
600
614
|
raise ValueError("shapes of ab and b are not compatible.")
|
601
615
|
|
602
|
-
(nlower, nupper) = l_and_u
|
603
616
|
if nlower + nupper + 1 != a1.shape[0]:
|
604
|
-
raise ValueError(
|
605
|
-
|
606
|
-
|
617
|
+
raise ValueError(
|
618
|
+
f"invalid values for the number of lower and upper diagonals: l+u+1 "
|
619
|
+
f"({nlower + nupper + 1}) does not equal ab.shape[0] ({ab.shape[0]})"
|
620
|
+
)
|
607
621
|
|
608
622
|
# accommodate empty arrays
|
609
623
|
if b1.size == 0:
|
@@ -638,14 +652,15 @@ def solve_banded(l_and_u, ab, b, overwrite_ab=False, overwrite_b=False,
|
|
638
652
|
return x
|
639
653
|
if info > 0:
|
640
654
|
raise LinAlgError("singular matrix")
|
641
|
-
raise ValueError('illegal value in
|
642
|
-
'gbsv/gtsv' % -info)
|
655
|
+
raise ValueError(f'illegal value in {-info}-th argument of internal gbsv/gtsv')
|
643
656
|
|
644
657
|
|
658
|
+
@_apply_over_batch(('a', 2), ('b', '1|2'))
|
645
659
|
def solveh_banded(ab, b, overwrite_ab=False, overwrite_b=False, lower=False,
|
646
660
|
check_finite=True):
|
647
661
|
"""
|
648
|
-
Solve equation a x = b
|
662
|
+
Solve the equation ``a @ x = b`` for ``x``, where ``a`` is the
|
663
|
+
Hermitian positive-definite banded matrix defined by `ab`.
|
649
664
|
|
650
665
|
Uses Thomas' Algorithm, which is more efficient than standard LU
|
651
666
|
factorization, but should only be used for Hermitian positive-definite
|
@@ -775,18 +790,18 @@ def solveh_banded(ab, b, overwrite_ab=False, overwrite_b=False, lower=False,
|
|
775
790
|
c, x, info = pbsv(a1, b1, lower=lower, overwrite_ab=overwrite_ab,
|
776
791
|
overwrite_b=overwrite_b)
|
777
792
|
if info > 0:
|
778
|
-
raise LinAlgError("
|
793
|
+
raise LinAlgError(f"{info}th leading minor not positive definite")
|
779
794
|
if info < 0:
|
780
|
-
raise ValueError('illegal value in
|
781
|
-
'pbsv' % -info)
|
795
|
+
raise ValueError(f'illegal value in {-info}th argument of internal pbsv')
|
782
796
|
return x
|
783
797
|
|
784
798
|
|
785
799
|
def solve_toeplitz(c_or_cr, b, check_finite=True):
|
786
|
-
r"""Solve
|
800
|
+
r"""Solve the equation ``T @ x = b`` for ``x``, where ``T`` is a Toeplitz
|
801
|
+
matrix defined by `c_or_cr`.
|
787
802
|
|
788
|
-
The Toeplitz matrix has constant diagonals, with c as its first column
|
789
|
-
and r as its first row. If r is not given, ``r == conjugate(c)`` is
|
803
|
+
The Toeplitz matrix has constant diagonals, with ``c`` as its first column
|
804
|
+
and ``r`` as its first row. If ``r`` is not given, ``r == conjugate(c)`` is
|
790
805
|
assumed.
|
791
806
|
|
792
807
|
.. warning::
|
@@ -812,7 +827,7 @@ def solve_toeplitz(c_or_cr, b, check_finite=True):
|
|
812
827
|
Returns
|
813
828
|
-------
|
814
829
|
x : (M,) or (M, K) ndarray
|
815
|
-
The solution to the system ``T x = b``. Shape of return matches shape
|
830
|
+
The solution to the system ``T @ x = b``. Shape of return matches shape
|
816
831
|
of `b`.
|
817
832
|
|
818
833
|
See Also
|
@@ -826,7 +841,7 @@ def solve_toeplitz(c_or_cr, b, check_finite=True):
|
|
826
841
|
|
827
842
|
Examples
|
828
843
|
--------
|
829
|
-
Solve the Toeplitz system T x = b
|
844
|
+
Solve the Toeplitz system ``T @ x = b``, where::
|
830
845
|
|
831
846
|
[ 1 -1 -2 -3] [1]
|
832
847
|
T = [ 3 1 -1 -2] b = [2]
|
@@ -847,7 +862,7 @@ def solve_toeplitz(c_or_cr, b, check_finite=True):
|
|
847
862
|
array([ 1.66666667, -1. , -2.66666667, 2.33333333])
|
848
863
|
|
849
864
|
Check the result by creating the full Toeplitz matrix and
|
850
|
-
multiplying it by
|
865
|
+
multiplying it by ``x``. We should get `b`.
|
851
866
|
|
852
867
|
>>> T = toeplitz(c, r)
|
853
868
|
>>> T.dot(x)
|
@@ -857,9 +872,15 @@ def solve_toeplitz(c_or_cr, b, check_finite=True):
|
|
857
872
|
# If numerical stability of this algorithm is a problem, a future
|
858
873
|
# developer might consider implementing other O(N^2) Toeplitz solvers,
|
859
874
|
# such as GKO (https://www.jstor.org/stable/2153371) or Bareiss.
|
875
|
+
c, r = c_or_cr if isinstance(c_or_cr, tuple) else (c_or_cr, np.conjugate(c_or_cr))
|
876
|
+
return _solve_toeplitz(c, r, b, check_finite)
|
860
877
|
|
878
|
+
|
879
|
+
# Can uncomment when `solve_toeplitz` deprecation is done (SciPy 1.17)
|
880
|
+
# @_apply_over_batch(('c', 1), ('r', 1), ('b', '1|2'))
|
881
|
+
def _solve_toeplitz(c, r, b, check_finite):
|
861
882
|
r, c, b, dtype, b_shape = _validate_args_for_toeplitz_ops(
|
862
|
-
|
883
|
+
(c, r), b, check_finite, keep_b_shape=True)
|
863
884
|
|
864
885
|
# accommodate empty arrays
|
865
886
|
if b.size == 0:
|
@@ -892,7 +913,8 @@ def _get_axis_len(aname, a, axis):
|
|
892
913
|
|
893
914
|
def solve_circulant(c, b, singular='raise', tol=None,
|
894
915
|
caxis=-1, baxis=0, outaxis=0):
|
895
|
-
"""Solve C x = b for x
|
916
|
+
"""Solve the equation ``C @ x = b`` for ``x``, where ``C`` is a
|
917
|
+
circulant matrix defined by `c`.
|
896
918
|
|
897
919
|
`C` is the circulant matrix associated with the vector `c`.
|
898
920
|
|
@@ -1094,6 +1116,7 @@ def solve_circulant(c, b, singular='raise', tol=None,
|
|
1094
1116
|
|
1095
1117
|
|
1096
1118
|
# matrix inversion
|
1119
|
+
@_apply_over_batch(('a', 2))
|
1097
1120
|
def inv(a, overwrite_a=False, check_finite=True):
|
1098
1121
|
"""
|
1099
1122
|
Compute the inverse of a matrix.
|
@@ -1162,8 +1185,9 @@ def inv(a, overwrite_a=False, check_finite=True):
|
|
1162
1185
|
if info > 0:
|
1163
1186
|
raise LinAlgError("singular matrix")
|
1164
1187
|
if info < 0:
|
1165
|
-
raise ValueError(
|
1166
|
-
|
1188
|
+
raise ValueError(
|
1189
|
+
f'illegal value in {-info}-th argument of internal getrf|getri'
|
1190
|
+
)
|
1167
1191
|
return inv_a
|
1168
1192
|
|
1169
1193
|
|
@@ -1298,10 +1322,11 @@ def det(a, overwrite_a=False, check_finite=True):
|
|
1298
1322
|
|
1299
1323
|
|
1300
1324
|
# Linear Least Squares
|
1325
|
+
@_apply_over_batch(('a', 2), ('b', '1|2'))
|
1301
1326
|
def lstsq(a, b, cond=None, overwrite_a=False, overwrite_b=False,
|
1302
1327
|
check_finite=True, lapack_driver=None):
|
1303
1328
|
"""
|
1304
|
-
Compute least-squares solution to equation
|
1329
|
+
Compute least-squares solution to the equation ``a @ x = b``.
|
1305
1330
|
|
1306
1331
|
Compute a vector x such that the 2-norm ``|b - A x|`` is minimized.
|
1307
1332
|
|
@@ -1477,8 +1502,9 @@ def lstsq(a, b, cond=None, overwrite_a=False, overwrite_b=False,
|
|
1477
1502
|
if info > 0:
|
1478
1503
|
raise LinAlgError("SVD did not converge in Linear Least Squares")
|
1479
1504
|
if info < 0:
|
1480
|
-
raise ValueError(
|
1481
|
-
|
1505
|
+
raise ValueError(
|
1506
|
+
f'illegal value in {-info}-th argument of internal {lapack_driver}'
|
1507
|
+
)
|
1482
1508
|
resids = np.asarray([], dtype=x.dtype)
|
1483
1509
|
if m > n:
|
1484
1510
|
x1 = x[:n]
|
@@ -1493,8 +1519,7 @@ def lstsq(a, b, cond=None, overwrite_a=False, overwrite_b=False,
|
|
1493
1519
|
v, x, j, rank, info = lapack_func(a1, b1, jptv, cond,
|
1494
1520
|
lwork, False, False)
|
1495
1521
|
if info < 0:
|
1496
|
-
raise ValueError(
|
1497
|
-
"gelsy" % -info)
|
1522
|
+
raise ValueError(f'illegal value in {-info}-th argument of internal gelsy')
|
1498
1523
|
if m > n:
|
1499
1524
|
x1 = x[:n]
|
1500
1525
|
x = x1
|
@@ -1504,6 +1529,7 @@ def lstsq(a, b, cond=None, overwrite_a=False, overwrite_b=False,
|
|
1504
1529
|
lstsq.default_lapack_driver = 'gelsd'
|
1505
1530
|
|
1506
1531
|
|
1532
|
+
@_apply_over_batch(('a', 2))
|
1507
1533
|
def pinv(a, *, atol=None, rtol=None, return_rank=False, check_finite=True):
|
1508
1534
|
"""
|
1509
1535
|
Compute the (Moore-Penrose) pseudo-inverse of a matrix.
|
@@ -1627,6 +1653,7 @@ def pinv(a, *, atol=None, rtol=None, return_rank=False, check_finite=True):
|
|
1627
1653
|
return B
|
1628
1654
|
|
1629
1655
|
|
1656
|
+
@_apply_over_batch(('a', 2))
|
1630
1657
|
def pinvh(a, atol=None, rtol=None, lower=True, return_rank=False,
|
1631
1658
|
check_finite=True):
|
1632
1659
|
"""
|
@@ -1720,6 +1747,7 @@ def pinvh(a, atol=None, rtol=None, lower=True, return_rank=False,
|
|
1720
1747
|
return B
|
1721
1748
|
|
1722
1749
|
|
1750
|
+
@_apply_over_batch(('A', 2))
|
1723
1751
|
def matrix_balance(A, permute=True, scale=True, separate=False,
|
1724
1752
|
overwrite_a=False):
|
1725
1753
|
"""
|
@@ -1733,15 +1761,6 @@ def matrix_balance(A, permute=True, scale=True, separate=False,
|
|
1733
1761
|
triangular parts of the matrix and, again if scaling is also enabled,
|
1734
1762
|
only the remaining subblocks are subjected to scaling.
|
1735
1763
|
|
1736
|
-
The balanced matrix satisfies the following equality
|
1737
|
-
|
1738
|
-
.. math::
|
1739
|
-
|
1740
|
-
B = T^{-1} A T
|
1741
|
-
|
1742
|
-
The scaling coefficients are approximated to the nearest power of 2
|
1743
|
-
to avoid round-off errors.
|
1744
|
-
|
1745
1764
|
Parameters
|
1746
1765
|
----------
|
1747
1766
|
A : (n, n) array_like
|
@@ -1774,6 +1793,14 @@ def matrix_balance(A, permute=True, scale=True, separate=False,
|
|
1774
1793
|
|
1775
1794
|
Notes
|
1776
1795
|
-----
|
1796
|
+
The balanced matrix satisfies the following equality
|
1797
|
+
|
1798
|
+
.. math::
|
1799
|
+
B = T^{-1} A T
|
1800
|
+
|
1801
|
+
The scaling coefficients are approximated to the nearest power of 2
|
1802
|
+
to avoid round-off errors.
|
1803
|
+
|
1777
1804
|
This algorithm is particularly useful for eigenvalue and matrix
|
1778
1805
|
decompositions and in many cases it is already called by various
|
1779
1806
|
LAPACK routines.
|
Binary file
|