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/interpolate/_polyint.py
CHANGED
@@ -243,8 +243,7 @@ class _Interpolator1DWithDerivatives(_Interpolator1D):
|
|
243
243
|
|
244
244
|
|
245
245
|
class KroghInterpolator(_Interpolator1DWithDerivatives):
|
246
|
-
"""
|
247
|
-
Interpolating polynomial for a set of points.
|
246
|
+
"""Krogh interpolator (C∞ smooth).
|
248
247
|
|
249
248
|
The polynomial passes through all the pairs ``(xi, yi)``. One may
|
250
249
|
additionally specify a number of derivatives at each point `xi`;
|
@@ -391,8 +390,7 @@ class KroghInterpolator(_Interpolator1DWithDerivatives):
|
|
391
390
|
|
392
391
|
|
393
392
|
def krogh_interpolate(xi, yi, x, der=0, axis=0):
|
394
|
-
"""
|
395
|
-
Convenience function for polynomial interpolation.
|
393
|
+
"""Convenience function for Krogh interpolation.
|
396
394
|
|
397
395
|
See `KroghInterpolator` for more details.
|
398
396
|
|
@@ -533,27 +531,23 @@ def approximate_taylor_polynomial(f,x,degree,scale,order=None):
|
|
533
531
|
|
534
532
|
|
535
533
|
class BarycentricInterpolator(_Interpolator1DWithDerivatives):
|
536
|
-
r"""
|
534
|
+
r"""Barycentric (Lagrange with improved stability) interpolator (C∞ smooth).
|
537
535
|
|
538
536
|
Constructs a polynomial that passes through a given set of points.
|
539
537
|
Allows evaluation of the polynomial and all its derivatives,
|
540
538
|
efficient changing of the y-values to be interpolated,
|
541
|
-
and updating by adding more x- and y-values.
|
539
|
+
and updating by adding more x- and y-values. For numerical stability, a barycentric
|
540
|
+
representation is used rather than computing the coefficients of the polynomial
|
541
|
+
directly.
|
542
542
|
|
543
|
-
For reasons of numerical stability, this function does not compute
|
544
|
-
the coefficients of the polynomial.
|
545
|
-
|
546
|
-
The values `yi` need to be provided before the function is
|
547
|
-
evaluated, but none of the preprocessing depends on them, so rapid
|
548
|
-
updates are possible.
|
549
543
|
|
550
544
|
Parameters
|
551
545
|
----------
|
552
546
|
xi : array_like, shape (npoints, )
|
553
|
-
1-D array of x
|
547
|
+
1-D array of x-coordinates of the points the polynomial
|
554
548
|
should pass through
|
555
549
|
yi : array_like, shape (..., npoints, ...), optional
|
556
|
-
N-D array of y
|
550
|
+
N-D array of y-coordinates of the points the polynomial should pass through.
|
557
551
|
If None, the y values will be supplied later via the `set_y` method.
|
558
552
|
The length of `yi` along the interpolation axis must be equal to the length
|
559
553
|
of `xi`. Use the ``axis`` parameter to select correct axis.
|
@@ -564,7 +558,9 @@ class BarycentricInterpolator(_Interpolator1DWithDerivatives):
|
|
564
558
|
The barycentric weights for the chosen interpolation points `xi`.
|
565
559
|
If absent or None, the weights will be computed from `xi` (default).
|
566
560
|
This allows for the reuse of the weights `wi` if several interpolants
|
567
|
-
are being calculated using the same nodes `xi`, without re-computation.
|
561
|
+
are being calculated using the same nodes `xi`, without re-computation. This
|
562
|
+
also allows for computing the weights explicitly for some choices of
|
563
|
+
`xi` (see notes).
|
568
564
|
rng : {None, int, `numpy.random.Generator`}, optional
|
569
565
|
If `rng` is passed by keyword, types other than `numpy.random.Generator` are
|
570
566
|
passed to `numpy.random.default_rng` to instantiate a ``Generator``.
|
@@ -591,21 +587,71 @@ class BarycentricInterpolator(_Interpolator1DWithDerivatives):
|
|
591
587
|
|
592
588
|
Notes
|
593
589
|
-----
|
594
|
-
This
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
590
|
+
This method is a variant of Lagrange polynomial interpolation [1]_ based on [2]_.
|
591
|
+
Instead of using Lagrange's or Newton's formula, the polynomial is represented by
|
592
|
+
the barycentric formula
|
593
|
+
|
594
|
+
.. math::
|
595
|
+
|
596
|
+
p(x) =
|
597
|
+
\frac{\sum_{i=1}^m\ w_i y_i / (x - x_i)}{\sum_{i=1}^m w_i / (x - x_i)},
|
598
|
+
|
599
|
+
where :math:`w_i` are the barycentric weights computed with the general formula
|
600
|
+
|
601
|
+
.. math::
|
602
|
+
|
603
|
+
w_i = \left( \prod_{k \neq i} x_i - x_k \right)^{-1}.
|
604
|
+
|
605
|
+
This is the same barycentric form used by `AAA` and `FloaterHormannInterpolator`.
|
606
|
+
However, in contrast, the weights :math:`w_i` are defined such that
|
607
|
+
:math:`p(x)` is a polynomial rather than a rational function.
|
608
|
+
|
609
|
+
The barycentric representation avoids many of the problems associated with
|
610
|
+
polynomial interpolation caused by floating-point arithmetic. However, it does not
|
611
|
+
avoid issues that are intrinsic to polynomial interpolation. Namely, if the
|
612
|
+
x-coordinates are equally spaced, then the weights can be computed explicitly using
|
613
|
+
the formula from [2]_
|
601
614
|
|
602
|
-
|
615
|
+
.. math::
|
616
|
+
|
617
|
+
w_i = (-1)^i {n \choose i},
|
618
|
+
|
619
|
+
where :math:`n` is the number of x-coordinates. As noted in [2]_, this means that
|
620
|
+
for large :math:`n` the weights vary by exponentially large factors, leading to the
|
621
|
+
Runge phenomenon.
|
622
|
+
|
623
|
+
To avoid this ill-conditioning, the x-coordinates should be clustered at the
|
624
|
+
endpoints of the interval. An excellent choice of points on the interval
|
625
|
+
:math:`[a,b]` are Chebyshev points of the second kind
|
626
|
+
|
627
|
+
.. math::
|
628
|
+
|
629
|
+
x_i = \frac{a + b}{2} + \frac{a - b}{2}\cos(i\pi/n).
|
630
|
+
|
631
|
+
in which case the weights can be computed explicitly as
|
632
|
+
|
633
|
+
.. math::
|
634
|
+
|
635
|
+
w_i = \begin{cases}
|
636
|
+
(-1)^i/2 & i = 0,n \\
|
637
|
+
(-1)^i & \text{otherwise}
|
638
|
+
\end{cases}.
|
639
|
+
|
640
|
+
See [2]_ for more infomation. Note that for large :math:`n`, computing the weights
|
641
|
+
explicitly (see examples) will be faster than the generic formula.
|
642
|
+
|
643
|
+
References
|
644
|
+
----------
|
645
|
+
.. [1] https://en.wikipedia.org/wiki/Lagrange_polynomial
|
646
|
+
.. [2] Jean-Paul Berrut and Lloyd N. Trefethen, "Barycentric Lagrange
|
647
|
+
Interpolation", SIAM Review 2004 46:3, 501-517
|
648
|
+
:doi:`10.1137/S0036144502417715`
|
603
649
|
|
604
650
|
Examples
|
605
651
|
--------
|
606
652
|
To produce a quintic barycentric interpolant approximating the function
|
607
653
|
:math:`\sin x`, and its first four derivatives, using six randomly-spaced
|
608
|
-
nodes in :math:`(0, \
|
654
|
+
nodes in :math:`(0, \pi/2)`:
|
609
655
|
|
610
656
|
>>> import numpy as np
|
611
657
|
>>> import matplotlib.pyplot as plt
|
@@ -625,15 +671,34 @@ class BarycentricInterpolator(_Interpolator1DWithDerivatives):
|
|
625
671
|
>>> axs[4].set_xlabel(r"$x$")
|
626
672
|
>>> axs[4].set_xticks([i * np.pi / 4 for i in range(5)],
|
627
673
|
... ["0", r"$\frac{\pi}{4}$", r"$\frac{\pi}{2}$", r"$\frac{3\pi}{4}$", r"$\pi$"])
|
628
|
-
>>> axs
|
629
|
-
|
630
|
-
>>> axs[2].set_ylabel("$f''(x)$")
|
631
|
-
>>> axs[3].set_ylabel("$f^{(3)}(x)$")
|
632
|
-
>>> axs[4].set_ylabel("$f^{(4)}(x)$")
|
674
|
+
>>> for ax, label in zip(axs, ("$f(x)$", "$f'(x)$", "$f''(x)$", "$f^{(3)}(x)$", "$f^{(4)}(x)$")):
|
675
|
+
... ax.set_ylabel(label)
|
633
676
|
>>> labels = ['Interpolation nodes', 'True function $f$', 'Barycentric interpolation']
|
634
677
|
>>> axs[0].legend(axs[0].get_lines()[::-1], labels, bbox_to_anchor=(0., 1.02, 1., .102),
|
635
678
|
... loc='lower left', ncols=3, mode="expand", borderaxespad=0., frameon=False)
|
636
679
|
>>> plt.show()
|
680
|
+
|
681
|
+
Next, we show how using Chebyshev points of the second kind avoids the avoids the
|
682
|
+
Runge phenomenon. In this example, we also compute the weights explicitly.
|
683
|
+
|
684
|
+
>>> n = 20
|
685
|
+
>>> def f(x): return np.abs(x) + 0.5*x - x**2
|
686
|
+
>>> i = np.arange(n)
|
687
|
+
>>> x_cheb = np.cos(i*np.pi/(n - 1)) # Chebyshev points on [-1, 1]
|
688
|
+
>>> w_i_cheb = (-1.)**i # Explicit formula for weights of Chebyshev points
|
689
|
+
>>> w_i_cheb[[0, -1]] /= 2
|
690
|
+
>>> p_cheb = BarycentricInterpolator(x_cheb, f(x_cheb), wi=w_i_cheb)
|
691
|
+
>>> x_equi = np.linspace(-1, 1, n)
|
692
|
+
>>> p_equi = BarycentricInterpolator(x_equi, f(x_equi))
|
693
|
+
>>> xx = np.linspace(-1, 1, 1000)
|
694
|
+
>>> fig, ax = plt.subplots()
|
695
|
+
>>> ax.plot(xx, f(xx), label="Original Function")
|
696
|
+
>>> ax.plot(xx, p_cheb(xx), "--", label="Chebshev Points")
|
697
|
+
>>> ax.plot(xx, p_equi(xx), "--", label="Equally Spaced Points")
|
698
|
+
>>> ax.set(xlabel="$x$", ylabel="$f(x)$", xlim=[-1, 1])
|
699
|
+
>>> ax.legend()
|
700
|
+
>>> plt.show()
|
701
|
+
|
637
702
|
""" # numpy/numpydoc#87 # noqa: E501
|
638
703
|
|
639
704
|
@_transition_to_rng("random_state", replace_doc=False)
|
@@ -881,8 +946,7 @@ class BarycentricInterpolator(_Interpolator1DWithDerivatives):
|
|
881
946
|
|
882
947
|
|
883
948
|
def barycentric_interpolate(xi, yi, x, axis=0, *, der=0, rng=None):
|
884
|
-
"""
|
885
|
-
Convenience function for polynomial interpolation.
|
949
|
+
"""Convenience function for barycentric interpolation.
|
886
950
|
|
887
951
|
Constructs a polynomial that passes through a given set of points,
|
888
952
|
then evaluates the polynomial. For reasons of numerical stability,
|
Binary file
|
scipy/interpolate/_rbf.py
CHANGED
@@ -56,8 +56,8 @@ class Rbf:
|
|
56
56
|
"""
|
57
57
|
Rbf(*args, **kwargs)
|
58
58
|
|
59
|
-
|
60
|
-
N-D scattered data to an M-D domain.
|
59
|
+
Class for radial basis function interpolation of functions from
|
60
|
+
N-D scattered data to an M-D domain (legacy).
|
61
61
|
|
62
62
|
.. legacy:: class
|
63
63
|
|
scipy/interpolate/_rbfinterp.py
CHANGED
@@ -132,7 +132,7 @@ def _build_and_solve_system(y, d, smoothing, kernel, epsilon, powers):
|
|
132
132
|
|
133
133
|
|
134
134
|
class RBFInterpolator:
|
135
|
-
"""Radial basis function
|
135
|
+
"""Radial basis function interpolator in N ≥ 1 dimensions.
|
136
136
|
|
137
137
|
Parameters
|
138
138
|
----------
|
Binary file
|
scipy/interpolate/_rgi.py
CHANGED
@@ -28,8 +28,9 @@ def _check_points(points):
|
|
28
28
|
p = np.flip(p)
|
29
29
|
else:
|
30
30
|
raise ValueError(
|
31
|
-
"The points in dimension
|
32
|
-
"
|
31
|
+
f"The points in dimension {i} must be strictly ascending or "
|
32
|
+
f"descending"
|
33
|
+
)
|
33
34
|
# see https://github.com/scipy/scipy/issues/17716
|
34
35
|
p = np.ascontiguousarray(p)
|
35
36
|
grid.append(p)
|
@@ -38,20 +39,22 @@ def _check_points(points):
|
|
38
39
|
|
39
40
|
def _check_dimensionality(points, values):
|
40
41
|
if len(points) > values.ndim:
|
41
|
-
raise ValueError(
|
42
|
-
|
42
|
+
raise ValueError(
|
43
|
+
f"There are {len(points)} point arrays, but values has "
|
44
|
+
f"{values.ndim} dimensions"
|
45
|
+
)
|
43
46
|
for i, p in enumerate(points):
|
44
47
|
if not np.asarray(p).ndim == 1:
|
45
|
-
raise ValueError("The points in dimension
|
46
|
-
"1-dimensional" % i)
|
48
|
+
raise ValueError(f"The points in dimension {i} must be 1-dimensional")
|
47
49
|
if not values.shape[i] == len(p):
|
48
|
-
raise ValueError(
|
49
|
-
|
50
|
+
raise ValueError(
|
51
|
+
f"There are {len(p)} points and {values.shape[i]} values in "
|
52
|
+
f"dimension {i}"
|
53
|
+
)
|
50
54
|
|
51
55
|
|
52
56
|
class RegularGridInterpolator:
|
53
|
-
"""
|
54
|
-
Interpolator on a regular or rectilinear grid in arbitrary dimensions.
|
57
|
+
"""Interpolator of specified order on a rectilinear grid in N ≥ 1 dimensions.
|
55
58
|
|
56
59
|
The data must be defined on a rectilinear grid; that is, a rectangular
|
57
60
|
grid with even or uneven spacing. Linear, nearest-neighbor, spline
|
@@ -154,6 +157,11 @@ class RegularGridInterpolator:
|
|
154
157
|
"cubic_legacy" and "quintic_legacy". These methods allow faster construction
|
155
158
|
but evaluations will be much slower.
|
156
159
|
|
160
|
+
**Rounding rule at half points with `nearest` method**
|
161
|
+
|
162
|
+
The rounding rule with the `nearest` method at half points is rounding *down*.
|
163
|
+
|
164
|
+
|
157
165
|
Examples
|
158
166
|
--------
|
159
167
|
**Evaluate a function on the points of a 3-D grid**
|
@@ -459,8 +467,9 @@ class RegularGridInterpolator:
|
|
459
467
|
for i, p in enumerate(xi.T):
|
460
468
|
if not np.logical_and(np.all(self.grid[i][0] <= p),
|
461
469
|
np.all(p <= self.grid[i][-1])):
|
462
|
-
raise ValueError(
|
463
|
-
|
470
|
+
raise ValueError(
|
471
|
+
f"One of the requested xi is out of bounds in dimension {i}"
|
472
|
+
)
|
464
473
|
out_of_bounds = None
|
465
474
|
else:
|
466
475
|
out_of_bounds = self._find_out_of_bounds(xi.T)
|
@@ -611,13 +620,6 @@ def interpn(points, values, xi, method="linear", bounds_error=True,
|
|
611
620
|
values : array_like, shape (m1, ..., mn, ...)
|
612
621
|
The data on the regular grid in n dimensions. Complex data is
|
613
622
|
accepted.
|
614
|
-
|
615
|
-
.. deprecated:: 1.13.0
|
616
|
-
Complex data is deprecated with ``method="pchip"`` and will raise an
|
617
|
-
error in SciPy 1.15.0. This is because ``PchipInterpolator`` only
|
618
|
-
works with real values. If you are trying to use the real components of
|
619
|
-
the passed array, use ``np.real`` on ``values``.
|
620
|
-
|
621
623
|
xi : ndarray of shape (..., ndim)
|
622
624
|
The coordinates to sample the gridded data at
|
623
625
|
|
@@ -710,8 +712,9 @@ def interpn(points, values, xi, method="linear", bounds_error=True,
|
|
710
712
|
|
711
713
|
# sanity check consistency of input dimensions
|
712
714
|
if len(points) > ndim:
|
713
|
-
raise ValueError(
|
714
|
-
|
715
|
+
raise ValueError(
|
716
|
+
f"There are {len(points)} point arrays, but values has {ndim} dimensions"
|
717
|
+
)
|
715
718
|
if len(points) != ndim and method == 'splinef2d':
|
716
719
|
raise ValueError("The method splinef2d can only be used for "
|
717
720
|
"scalar data with one point per coordinate")
|
@@ -722,16 +725,18 @@ def interpn(points, values, xi, method="linear", bounds_error=True,
|
|
722
725
|
# sanity check requested xi
|
723
726
|
xi = _ndim_coords_from_arrays(xi, ndim=len(grid))
|
724
727
|
if xi.shape[-1] != len(grid):
|
725
|
-
raise ValueError(
|
726
|
-
|
727
|
-
|
728
|
+
raise ValueError(
|
729
|
+
f"The requested sample points xi have dimension {xi.shape[-1]}, "
|
730
|
+
f"but this RegularGridInterpolator has dimension {len(grid)}"
|
731
|
+
)
|
728
732
|
|
729
733
|
if bounds_error:
|
730
734
|
for i, p in enumerate(xi.T):
|
731
735
|
if not np.logical_and(np.all(grid[i][0] <= p),
|
732
736
|
np.all(p <= grid[i][-1])):
|
733
|
-
raise ValueError(
|
734
|
-
|
737
|
+
raise ValueError(
|
738
|
+
f"One of the requested xi is out of bounds in dimension {i}"
|
739
|
+
)
|
735
740
|
|
736
741
|
# perform interpolation
|
737
742
|
if method in RegularGridInterpolator._ALL_METHODS:
|
Binary file
|
scipy/interpolate/dfitpack.py
CHANGED
@@ -6,31 +6,11 @@ from scipy._lib.deprecation import _sub_module_deprecation
|
|
6
6
|
|
7
7
|
|
8
8
|
__all__ = [ # noqa: F822
|
9
|
-
'bispeu',
|
10
|
-
'bispev',
|
11
|
-
'curfit',
|
12
|
-
'dblint',
|
13
|
-
'fpchec',
|
14
|
-
'fpcurf0',
|
15
|
-
'fpcurf1',
|
16
|
-
'fpcurfm1',
|
17
|
-
'parcur',
|
18
|
-
'parder',
|
19
|
-
'pardeu',
|
20
|
-
'pardtc',
|
21
|
-
'percur',
|
22
|
-
'regrid_smth',
|
23
|
-
'regrid_smth_spher',
|
24
9
|
'spalde',
|
25
|
-
'spherfit_lsq',
|
26
|
-
'spherfit_smth',
|
27
10
|
'splder',
|
28
11
|
'splev',
|
29
12
|
'splint',
|
30
13
|
'sproot',
|
31
|
-
'surfit_lsq',
|
32
|
-
'surfit_smth',
|
33
|
-
'types',
|
34
14
|
]
|
35
15
|
|
36
16
|
|
scipy/interpolate/interpnd.py
CHANGED
@@ -200,8 +200,8 @@ class TestAAA:
|
|
200
200
|
@pytest.mark.parametrize("func,atol,rtol",
|
201
201
|
[(lambda x: np.abs(x + 0.5 + 0.01j), 5e-13, 1e-7),
|
202
202
|
(lambda x: np.sin(1/(1.05 - x)), 2e-13, 1e-7),
|
203
|
-
(lambda x: np.exp(-1/(x**2)), 3.5e-
|
204
|
-
(lambda x: np.exp(-100*x**2),
|
203
|
+
(lambda x: np.exp(-1/(x**2)), 3.5e-12, 0),
|
204
|
+
(lambda x: np.exp(-100*x**2), 2e-12, 0),
|
205
205
|
(lambda x: np.exp(-10/(1.2 - x)), 1e-14, 0),
|
206
206
|
(lambda x: 1/(1+np.exp(100*(x + 0.5))), 2e-13, 1e-7),
|
207
207
|
(lambda x: np.abs(x - 0.95), 1e-6, 1e-7)])
|
@@ -3,6 +3,7 @@ import operator
|
|
3
3
|
import itertools
|
4
4
|
import math
|
5
5
|
import threading
|
6
|
+
import copy
|
6
7
|
|
7
8
|
import numpy as np
|
8
9
|
from numpy.testing import suppress_warnings
|
@@ -671,6 +672,7 @@ class TestBSpline:
|
|
671
672
|
|
672
673
|
xp_assert_close(b(xx), expected)
|
673
674
|
|
675
|
+
|
674
676
|
class TestInsert:
|
675
677
|
|
676
678
|
@pytest.mark.parametrize('xval', [0.0, 1.0, 2.5, 4, 6.5, 7.0])
|
@@ -2165,7 +2167,7 @@ class TestSmoothingSpline:
|
|
2165
2167
|
# using an iterative algorithm for minimizing the GCV criteria. These
|
2166
2168
|
# algorithms may vary, so the tolerance should be rather low.
|
2167
2169
|
# Not checking dtypes as gcvspl.npz stores little endian arrays, which
|
2168
|
-
# result in conflicting dtypes on big endian systems.
|
2170
|
+
# result in conflicting dtypes on big endian systems.
|
2169
2171
|
xp_assert_close(y_compr, y_GCVSPL, atol=1e-4, rtol=1e-4, check_dtype=False)
|
2170
2172
|
|
2171
2173
|
def test_non_regularized_case(self):
|
@@ -2375,6 +2377,11 @@ class TestNdBSpline:
|
|
2375
2377
|
xp_assert_close(bspl2(xi),
|
2376
2378
|
target, atol=1e-14)
|
2377
2379
|
|
2380
|
+
# test that a nan in -> nan out
|
2381
|
+
xi = np.asarray(xi)
|
2382
|
+
xi[0, 1] = np.nan
|
2383
|
+
xp_assert_equal(np.isnan(bspl2(xi)), np.asarray([True, False, False]))
|
2384
|
+
|
2378
2385
|
# now check on a multidim xi
|
2379
2386
|
rng = np.random.default_rng(12345)
|
2380
2387
|
xi = rng.uniform(size=(4, 3, 2)) * 5
|
@@ -2826,6 +2833,15 @@ class TestMakeND:
|
|
2826
2833
|
bspl = make_ndbspl((x, y), values, k=k, solver=ssl.spsolve)
|
2827
2834
|
xp_assert_close(bspl(xi), values.ravel(), atol=1e-15)
|
2828
2835
|
|
2836
|
+
def test_2D_nans(self):
|
2837
|
+
x = np.arange(6)
|
2838
|
+
y = np.arange(6) + 0.5
|
2839
|
+
y[-1] = np.nan
|
2840
|
+
values = x[:, None]**3 * (y**3 + 2*y)[None, :]
|
2841
|
+
|
2842
|
+
with assert_raises(ValueError):
|
2843
|
+
make_ndbspl((x, y), values, k=1)
|
2844
|
+
|
2829
2845
|
def _get_sample_2d_data(self):
|
2830
2846
|
# from test_rgi.py::TestIntepN
|
2831
2847
|
x = np.array([.5, 2., 3., 4., 5.5, 6.])
|
@@ -3517,6 +3533,20 @@ class TestMakeSplrep:
|
|
3517
3533
|
xp_assert_close(np.r_[spl.c, [0]*(spl.k+1)],
|
3518
3534
|
tck[1], atol=5e-13)
|
3519
3535
|
|
3536
|
+
def test_issue_22704(self):
|
3537
|
+
# Reference - https://github.com/scipy/scipy/issues/22704
|
3538
|
+
x = np.asarray([20.00, 153.81, 175.57, 202.47, 237.11,
|
3539
|
+
253.61, 258.56, 273.40, 284.54, 293.61,
|
3540
|
+
298.56, 301.86, 305.57, 307.22, 308.45,
|
3541
|
+
310.10, 310.10, 310.50], dtype=np.float64)
|
3542
|
+
y = np.asarray([53.00, 49.50, 48.60, 46.80, 43.20,
|
3543
|
+
40.32, 39.60, 36.00, 32.40, 28.80,
|
3544
|
+
25.20, 21.60, 18.00, 14.40, 10.80,
|
3545
|
+
7.20, 3.60, 0.0], dtype=np.float64)
|
3546
|
+
w = np.asarray([1.38723] * y.shape[0], dtype=np.float64)
|
3547
|
+
with assert_raises(ValueError):
|
3548
|
+
make_splrep(x, y, w=w, k=2, s=12)
|
3549
|
+
|
3520
3550
|
def test_shape(self):
|
3521
3551
|
# make sure coefficients have the right shape (not extra dims)
|
3522
3552
|
n, k = 10, 3
|
@@ -3656,3 +3686,69 @@ class TestMakeSplprep:
|
|
3656
3686
|
assert spl(u).shape == (1, 8)
|
3657
3687
|
xp_assert_close(spl(u), [x], atol=1e-15)
|
3658
3688
|
|
3689
|
+
|
3690
|
+
class BatchSpline:
|
3691
|
+
# BSpline-line class with reference batch behavior
|
3692
|
+
def __init__(self, x, y, axis, *, spline, **kwargs):
|
3693
|
+
y = np.moveaxis(y, axis, -1)
|
3694
|
+
self._batch_shape = y.shape[:-1]
|
3695
|
+
self._splines = [spline(x, yi, **kwargs) for yi in y.reshape(-1, y.shape[-1])]
|
3696
|
+
self._axis = axis
|
3697
|
+
|
3698
|
+
def __call__(self, x):
|
3699
|
+
y = [spline(x) for spline in self._splines]
|
3700
|
+
y = np.reshape(y, self._batch_shape + x.shape)
|
3701
|
+
return np.moveaxis(y, -1, self._axis) if x.shape else y
|
3702
|
+
|
3703
|
+
def integrate(self, a, b, extrapolate=None):
|
3704
|
+
y = [spline.integrate(a, b, extrapolate) for spline in self._splines]
|
3705
|
+
return np.reshape(y, self._batch_shape)
|
3706
|
+
|
3707
|
+
def derivative(self, nu):
|
3708
|
+
res = copy.deepcopy(self)
|
3709
|
+
res._splines = [spline.derivative(nu) for spline in res._splines]
|
3710
|
+
return res
|
3711
|
+
|
3712
|
+
def antiderivative(self, nu):
|
3713
|
+
res = copy.deepcopy(self)
|
3714
|
+
res._splines = [spline.antiderivative(nu) for spline in res._splines]
|
3715
|
+
return res
|
3716
|
+
|
3717
|
+
|
3718
|
+
class TestBatch:
|
3719
|
+
@pytest.mark.parametrize('make_spline, kwargs',
|
3720
|
+
[(make_interp_spline, {}),
|
3721
|
+
(make_smoothing_spline, {}),
|
3722
|
+
(make_smoothing_spline, {'lam': 1.0}),
|
3723
|
+
(make_lsq_spline, {'method': "norm-eq"}),
|
3724
|
+
(make_lsq_spline, {'method': "qr"}),
|
3725
|
+
])
|
3726
|
+
@pytest.mark.parametrize('eval_shape', [(), (1,), (3,)])
|
3727
|
+
@pytest.mark.parametrize('axis', [-1, 0, 1])
|
3728
|
+
def test_batch(self, make_spline, kwargs, axis, eval_shape):
|
3729
|
+
rng = np.random.default_rng(4329872134985134)
|
3730
|
+
n = 10
|
3731
|
+
shape = (2, 3, 4, n)
|
3732
|
+
domain = (0, 10)
|
3733
|
+
|
3734
|
+
x = np.linspace(*domain, n)
|
3735
|
+
y = np.moveaxis(rng.random(shape), -1, axis)
|
3736
|
+
|
3737
|
+
if make_spline == make_lsq_spline:
|
3738
|
+
k = 3 # spline degree, if needed
|
3739
|
+
t = (x[0],) * (k + 1) + (x[-1],) * (k + 1) # valid knots, if needed
|
3740
|
+
kwargs = kwargs | dict(t=t, k=k)
|
3741
|
+
|
3742
|
+
res = make_spline(x, y, axis=axis, **kwargs)
|
3743
|
+
ref = BatchSpline(x, y, axis=axis, spline=make_spline, **kwargs)
|
3744
|
+
|
3745
|
+
x = rng.uniform(*domain, size=eval_shape)
|
3746
|
+
np.testing.assert_allclose(res(x), ref(x))
|
3747
|
+
|
3748
|
+
res, ref = res.antiderivative(1), ref.antiderivative(1)
|
3749
|
+
np.testing.assert_allclose(res(x), ref(x))
|
3750
|
+
|
3751
|
+
res, ref = res.derivative(2), ref.derivative(2)
|
3752
|
+
np.testing.assert_allclose(res(x), ref(x))
|
3753
|
+
|
3754
|
+
np.testing.assert_allclose(res.integrate(*domain), ref.integrate(*domain))
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# Created by Pearu Peterson, June 2003
|
2
2
|
import itertools
|
3
|
-
|
3
|
+
import sys
|
4
4
|
import numpy as np
|
5
5
|
from numpy.testing import suppress_warnings
|
6
6
|
import pytest
|
@@ -1132,6 +1132,44 @@ class TestRectBivariateSpline:
|
|
1132
1132
|
Interpolator(GridPosLats, nonGridPosLons)
|
1133
1133
|
assert "y must be strictly increasing" in str(exc_info.value)
|
1134
1134
|
|
1135
|
+
def _sample_large_2d_data(self, nx, ny):
|
1136
|
+
rng = np.random.default_rng(1)
|
1137
|
+
x = np.arange(nx)
|
1138
|
+
y = np.arange(ny)
|
1139
|
+
z = rng.integers(0, 100, (nx, ny))
|
1140
|
+
|
1141
|
+
return x, y, z.astype(np.float64)
|
1142
|
+
|
1143
|
+
@pytest.mark.slow()
|
1144
|
+
@pytest.mark.parametrize('shape', [(350, 850), (2000, 170)])
|
1145
|
+
@pytest.mark.parametrize('s_tols', [(0, 1e-12, 1e-7),
|
1146
|
+
(1, 7e-3, 1e-4),
|
1147
|
+
(3, 2e-2, 1e-4)])
|
1148
|
+
def test_spline_large_2d(self, shape, s_tols):
|
1149
|
+
# Reference - https://github.com/scipy/scipy/issues/17787
|
1150
|
+
nx, ny = shape
|
1151
|
+
s, atol, rtol = s_tols
|
1152
|
+
x, y, z = self._sample_large_2d_data(nx, ny)
|
1153
|
+
|
1154
|
+
spl = RectBivariateSpline(x, y, z, s=s)
|
1155
|
+
z_spl = spl(x, y)
|
1156
|
+
assert(not np.isnan(z_spl).any())
|
1157
|
+
xp_assert_close(z_spl, z, atol=atol, rtol=rtol)
|
1158
|
+
|
1159
|
+
@pytest.mark.slow()
|
1160
|
+
@pytest.mark.skipif(sys.maxsize <= 2**32, reason="Segfaults on 32-bit system "
|
1161
|
+
"due to large input data")
|
1162
|
+
def test_spline_large_2d_maxit(self):
|
1163
|
+
# Reference - for https://github.com/scipy/scipy/issues/17787
|
1164
|
+
nx, ny = 1000, 1700
|
1165
|
+
s, atol, rtol = 2, 2e-2, 1e-12
|
1166
|
+
x, y, z = self._sample_large_2d_data(nx, ny)
|
1167
|
+
|
1168
|
+
spl = RectBivariateSpline(x, y, z, s=s, maxit=25)
|
1169
|
+
z_spl = spl(x, y)
|
1170
|
+
assert(not np.isnan(z_spl).any())
|
1171
|
+
xp_assert_close(z_spl, z, atol=atol, rtol=rtol)
|
1172
|
+
|
1135
1173
|
|
1136
1174
|
class TestRectSphereBivariateSpline:
|
1137
1175
|
def test_defaults(self):
|
@@ -238,8 +238,10 @@ class TestEstimateGradients2DGlobal:
|
|
238
238
|
dz = interpnd.estimate_gradients_2d_global(tri, z, tol=1e-6)
|
239
239
|
|
240
240
|
assert dz.shape == (6, 2)
|
241
|
-
xp_assert_close(
|
242
|
-
|
241
|
+
xp_assert_close(
|
242
|
+
dz, np.array(grad)[None, :] + 0*dz, rtol=1e-5, atol=1e-5,
|
243
|
+
err_msg=f"item {j}"
|
244
|
+
)
|
243
245
|
|
244
246
|
def test_regression_2359(self):
|
245
247
|
# Check regression --- for certain point sets, gradient
|
@@ -300,17 +302,22 @@ class TestCloughTocher2DInterpolator:
|
|
300
302
|
]
|
301
303
|
|
302
304
|
for j, func in enumerate(funcs):
|
303
|
-
self._check_accuracy(
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
305
|
+
self._check_accuracy(
|
306
|
+
func, tol=1e-13, atol=1e-7, rtol=1e-7, err_msg=f"Function {j}"
|
307
|
+
)
|
308
|
+
self._check_accuracy(
|
309
|
+
func, tol=1e-13, atol=1e-7, rtol=1e-7, alternate=True,
|
310
|
+
err_msg=f"Function (alternate) {j}"
|
311
|
+
)
|
308
312
|
# check rescaling
|
309
|
-
self._check_accuracy(
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
313
|
+
self._check_accuracy(
|
314
|
+
func, tol=1e-13, atol=1e-7, rtol=1e-7,
|
315
|
+
err_msg=f"Function (rescaled) {j}", rescale=True
|
316
|
+
)
|
317
|
+
self._check_accuracy(
|
318
|
+
func, tol=1e-13, atol=1e-7, rtol=1e-7, alternate=True, rescale=True,
|
319
|
+
err_msg=f"Function (alternate, rescaled) {j}"
|
320
|
+
)
|
314
321
|
|
315
322
|
def test_quadratic_smoketest(self):
|
316
323
|
# Should be reasonably accurate for quadratic functions
|
@@ -322,10 +329,12 @@ class TestCloughTocher2DInterpolator:
|
|
322
329
|
]
|
323
330
|
|
324
331
|
for j, func in enumerate(funcs):
|
325
|
-
self._check_accuracy(
|
326
|
-
|
327
|
-
|
328
|
-
|
332
|
+
self._check_accuracy(
|
333
|
+
func, tol=1e-9, atol=0.22, rtol=0, err_msg=f"Function {j}"
|
334
|
+
)
|
335
|
+
self._check_accuracy(
|
336
|
+
func, tol=1e-9, atol=0.22, rtol=0, err_msg=f"Function {j}", rescale=True
|
337
|
+
)
|
329
338
|
|
330
339
|
def test_tri_input(self):
|
331
340
|
# Test at single points
|
@@ -379,10 +388,13 @@ class TestCloughTocher2DInterpolator:
|
|
379
388
|
rng.rand(30*30, 2)]
|
380
389
|
|
381
390
|
for j, func in enumerate(funcs):
|
382
|
-
self._check_accuracy(
|
383
|
-
|
384
|
-
|
385
|
-
|
391
|
+
self._check_accuracy(
|
392
|
+
func, x=grid, tol=1e-9, atol=5e-3, rtol=1e-2, err_msg=f"Function {j}"
|
393
|
+
)
|
394
|
+
self._check_accuracy(
|
395
|
+
func, x=grid, tol=1e-9, atol=5e-3, rtol=1e-2,
|
396
|
+
err_msg=f"Function {j}", rescale=True
|
397
|
+
)
|
386
398
|
|
387
399
|
def test_wrong_ndim(self):
|
388
400
|
x = np.random.randn(30, 3)
|