scipy 1.15.3__cp313-cp313-macosx_12_0_arm64.whl → 1.16.0rc2__cp313-cp313-macosx_12_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (629) hide show
  1. scipy/.dylibs/libscipy_openblas.dylib +0 -0
  2. scipy/__config__.py +8 -8
  3. scipy/__init__.py +3 -6
  4. scipy/_cyutility.cpython-313-darwin.so +0 -0
  5. scipy/_lib/_array_api.py +486 -161
  6. scipy/_lib/_array_api_compat_vendor.py +9 -0
  7. scipy/_lib/_bunch.py +4 -0
  8. scipy/_lib/_ccallback_c.cpython-313-darwin.so +0 -0
  9. scipy/_lib/_docscrape.py +1 -1
  10. scipy/_lib/_elementwise_iterative_method.py +15 -26
  11. scipy/_lib/_sparse.py +41 -0
  12. scipy/_lib/_test_deprecation_call.cpython-313-darwin.so +0 -0
  13. scipy/_lib/_test_deprecation_def.cpython-313-darwin.so +0 -0
  14. scipy/_lib/_testutils.py +6 -2
  15. scipy/_lib/_util.py +222 -125
  16. scipy/_lib/array_api_compat/__init__.py +4 -4
  17. scipy/_lib/array_api_compat/_internal.py +19 -6
  18. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  19. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  20. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  21. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  22. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  23. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  24. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  25. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  26. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  27. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  28. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  29. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  30. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  31. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  32. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  33. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  34. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  35. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  36. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  37. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  38. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  39. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  40. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  41. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  42. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  43. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  44. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  45. scipy/_lib/array_api_extra/__init__.py +26 -3
  46. scipy/_lib/array_api_extra/_delegation.py +171 -0
  47. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  48. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  49. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  50. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  51. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  52. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  53. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  54. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  58. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  59. scipy/_lib/array_api_extra/testing.py +359 -0
  60. scipy/_lib/decorator.py +2 -2
  61. scipy/_lib/doccer.py +1 -7
  62. scipy/_lib/messagestream.cpython-313-darwin.so +0 -0
  63. scipy/_lib/pyprima/__init__.py +212 -0
  64. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  65. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  66. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  67. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  68. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  69. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  70. scipy/_lib/pyprima/cobyla/update.py +289 -0
  71. scipy/_lib/pyprima/common/__init__.py +0 -0
  72. scipy/_lib/pyprima/common/_bounds.py +34 -0
  73. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  74. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  75. scipy/_lib/pyprima/common/_project.py +173 -0
  76. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  77. scipy/_lib/pyprima/common/consts.py +47 -0
  78. scipy/_lib/pyprima/common/evaluate.py +99 -0
  79. scipy/_lib/pyprima/common/history.py +38 -0
  80. scipy/_lib/pyprima/common/infos.py +30 -0
  81. scipy/_lib/pyprima/common/linalg.py +435 -0
  82. scipy/_lib/pyprima/common/message.py +290 -0
  83. scipy/_lib/pyprima/common/powalg.py +131 -0
  84. scipy/_lib/pyprima/common/preproc.py +277 -0
  85. scipy/_lib/pyprima/common/present.py +5 -0
  86. scipy/_lib/pyprima/common/ratio.py +54 -0
  87. scipy/_lib/pyprima/common/redrho.py +47 -0
  88. scipy/_lib/pyprima/common/selectx.py +296 -0
  89. scipy/_lib/tests/test__util.py +105 -121
  90. scipy/_lib/tests/test_array_api.py +166 -35
  91. scipy/_lib/tests/test_bunch.py +7 -0
  92. scipy/_lib/tests/test_ccallback.py +2 -10
  93. scipy/_lib/tests/test_public_api.py +13 -0
  94. scipy/cluster/_hierarchy.cpython-313-darwin.so +0 -0
  95. scipy/cluster/_optimal_leaf_ordering.cpython-313-darwin.so +0 -0
  96. scipy/cluster/_vq.cpython-313-darwin.so +0 -0
  97. scipy/cluster/hierarchy.py +393 -223
  98. scipy/cluster/tests/test_hierarchy.py +273 -335
  99. scipy/cluster/tests/test_vq.py +45 -61
  100. scipy/cluster/vq.py +39 -35
  101. scipy/conftest.py +263 -157
  102. scipy/constants/_constants.py +4 -1
  103. scipy/constants/tests/test_codata.py +2 -2
  104. scipy/constants/tests/test_constants.py +11 -18
  105. scipy/datasets/_download_all.py +15 -1
  106. scipy/datasets/_fetchers.py +7 -1
  107. scipy/datasets/_utils.py +1 -1
  108. scipy/differentiate/_differentiate.py +25 -25
  109. scipy/differentiate/tests/test_differentiate.py +24 -25
  110. scipy/fft/_basic.py +20 -0
  111. scipy/fft/_helper.py +3 -34
  112. scipy/fft/_pocketfft/helper.py +29 -1
  113. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  114. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  115. scipy/fft/_realtransforms.py +13 -0
  116. scipy/fft/tests/test_basic.py +27 -25
  117. scipy/fft/tests/test_fftlog.py +16 -7
  118. scipy/fft/tests/test_helper.py +18 -34
  119. scipy/fft/tests/test_real_transforms.py +8 -10
  120. scipy/fftpack/convolve.cpython-313-darwin.so +0 -0
  121. scipy/fftpack/tests/test_basic.py +2 -4
  122. scipy/fftpack/tests/test_real_transforms.py +8 -9
  123. scipy/integrate/_bvp.py +9 -3
  124. scipy/integrate/_cubature.py +3 -2
  125. scipy/integrate/_dop.cpython-313-darwin.so +0 -0
  126. scipy/integrate/_lsoda.cpython-313-darwin.so +0 -0
  127. scipy/integrate/_ode.py +9 -2
  128. scipy/integrate/_odepack.cpython-313-darwin.so +0 -0
  129. scipy/integrate/_quad_vec.py +21 -29
  130. scipy/integrate/_quadpack.cpython-313-darwin.so +0 -0
  131. scipy/integrate/_quadpack_py.py +11 -7
  132. scipy/integrate/_quadrature.py +3 -3
  133. scipy/integrate/_rules/_base.py +2 -2
  134. scipy/integrate/_tanhsinh.py +48 -47
  135. scipy/integrate/_test_odeint_banded.cpython-313-darwin.so +0 -0
  136. scipy/integrate/_vode.cpython-313-darwin.so +0 -0
  137. scipy/integrate/tests/test__quad_vec.py +0 -6
  138. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  139. scipy/integrate/tests/test_cubature.py +21 -35
  140. scipy/integrate/tests/test_quadrature.py +6 -8
  141. scipy/integrate/tests/test_tanhsinh.py +56 -48
  142. scipy/interpolate/__init__.py +70 -58
  143. scipy/interpolate/_bary_rational.py +22 -22
  144. scipy/interpolate/_bsplines.py +119 -66
  145. scipy/interpolate/_cubic.py +65 -50
  146. scipy/interpolate/_dfitpack.cpython-313-darwin.so +0 -0
  147. scipy/interpolate/_dierckx.cpython-313-darwin.so +0 -0
  148. scipy/interpolate/_fitpack.cpython-313-darwin.so +0 -0
  149. scipy/interpolate/_fitpack2.py +9 -6
  150. scipy/interpolate/_fitpack_impl.py +32 -26
  151. scipy/interpolate/_fitpack_repro.py +23 -19
  152. scipy/interpolate/_interpnd.cpython-313-darwin.so +0 -0
  153. scipy/interpolate/_interpolate.py +30 -12
  154. scipy/interpolate/_ndbspline.py +13 -18
  155. scipy/interpolate/_ndgriddata.py +5 -8
  156. scipy/interpolate/_polyint.py +95 -31
  157. scipy/interpolate/_ppoly.cpython-313-darwin.so +0 -0
  158. scipy/interpolate/_rbf.py +2 -2
  159. scipy/interpolate/_rbfinterp.py +1 -1
  160. scipy/interpolate/_rbfinterp_pythran.cpython-313-darwin.so +0 -0
  161. scipy/interpolate/_rgi.py +31 -26
  162. scipy/interpolate/_rgi_cython.cpython-313-darwin.so +0 -0
  163. scipy/interpolate/dfitpack.py +0 -20
  164. scipy/interpolate/interpnd.py +1 -2
  165. scipy/interpolate/tests/test_bary_rational.py +2 -2
  166. scipy/interpolate/tests/test_bsplines.py +97 -1
  167. scipy/interpolate/tests/test_fitpack2.py +39 -1
  168. scipy/interpolate/tests/test_interpnd.py +32 -20
  169. scipy/interpolate/tests/test_interpolate.py +48 -4
  170. scipy/interpolate/tests/test_rgi.py +2 -1
  171. scipy/io/_fast_matrix_market/__init__.py +2 -0
  172. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  173. scipy/io/_harwell_boeing/hb.py +7 -11
  174. scipy/io/_idl.py +5 -7
  175. scipy/io/_netcdf.py +15 -5
  176. scipy/io/_test_fortran.cpython-313-darwin.so +0 -0
  177. scipy/io/arff/tests/test_arffread.py +3 -3
  178. scipy/io/matlab/__init__.py +5 -3
  179. scipy/io/matlab/_mio.py +4 -1
  180. scipy/io/matlab/_mio5.py +19 -13
  181. scipy/io/matlab/_mio5_utils.cpython-313-darwin.so +0 -0
  182. scipy/io/matlab/_mio_utils.cpython-313-darwin.so +0 -0
  183. scipy/io/matlab/_miobase.py +4 -1
  184. scipy/io/matlab/_streams.cpython-313-darwin.so +0 -0
  185. scipy/io/matlab/tests/test_mio.py +46 -18
  186. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  187. scipy/io/tests/test_mmio.py +7 -1
  188. scipy/io/tests/test_wavfile.py +41 -0
  189. scipy/io/wavfile.py +57 -10
  190. scipy/linalg/_basic.py +113 -86
  191. scipy/linalg/_cythonized_array_utils.cpython-313-darwin.so +0 -0
  192. scipy/linalg/_decomp.py +22 -9
  193. scipy/linalg/_decomp_cholesky.py +28 -13
  194. scipy/linalg/_decomp_cossin.py +45 -30
  195. scipy/linalg/_decomp_interpolative.cpython-313-darwin.so +0 -0
  196. scipy/linalg/_decomp_ldl.py +4 -1
  197. scipy/linalg/_decomp_lu.py +18 -6
  198. scipy/linalg/_decomp_lu_cython.cpython-313-darwin.so +0 -0
  199. scipy/linalg/_decomp_polar.py +2 -0
  200. scipy/linalg/_decomp_qr.py +6 -2
  201. scipy/linalg/_decomp_qz.py +3 -0
  202. scipy/linalg/_decomp_schur.py +3 -1
  203. scipy/linalg/_decomp_svd.py +13 -2
  204. scipy/linalg/_decomp_update.cpython-313-darwin.so +0 -0
  205. scipy/linalg/_expm_frechet.py +4 -0
  206. scipy/linalg/_fblas.cpython-313-darwin.so +0 -0
  207. scipy/linalg/_flapack.cpython-313-darwin.so +0 -0
  208. scipy/linalg/_linalg_pythran.cpython-313-darwin.so +0 -0
  209. scipy/linalg/_matfuncs.py +187 -4
  210. scipy/linalg/_matfuncs_expm.cpython-313-darwin.so +0 -0
  211. scipy/linalg/_matfuncs_schur_sqrtm.cpython-313-darwin.so +0 -0
  212. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  213. scipy/linalg/_matfuncs_sqrtm_triu.cpython-313-darwin.so +0 -0
  214. scipy/linalg/_procrustes.py +2 -0
  215. scipy/linalg/_sketches.py +17 -6
  216. scipy/linalg/_solve_toeplitz.cpython-313-darwin.so +0 -0
  217. scipy/linalg/_solvers.py +7 -2
  218. scipy/linalg/_special_matrices.py +26 -36
  219. scipy/linalg/cython_blas.cpython-313-darwin.so +0 -0
  220. scipy/linalg/cython_lapack.cpython-313-darwin.so +0 -0
  221. scipy/linalg/lapack.py +22 -2
  222. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  223. scipy/linalg/tests/test_basic.py +31 -16
  224. scipy/linalg/tests/test_batch.py +588 -0
  225. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  226. scipy/linalg/tests/test_decomp.py +40 -3
  227. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  228. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  229. scipy/linalg/tests/test_lapack.py +115 -7
  230. scipy/linalg/tests/test_matfuncs.py +157 -102
  231. scipy/linalg/tests/test_procrustes.py +0 -7
  232. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  233. scipy/linalg/tests/test_special_matrices.py +1 -5
  234. scipy/ndimage/__init__.py +1 -0
  235. scipy/ndimage/_cytest.cpython-313-darwin.so +0 -0
  236. scipy/ndimage/_delegators.py +8 -2
  237. scipy/ndimage/_filters.py +453 -5
  238. scipy/ndimage/_interpolation.py +36 -6
  239. scipy/ndimage/_measurements.py +4 -2
  240. scipy/ndimage/_morphology.py +5 -0
  241. scipy/ndimage/_nd_image.cpython-313-darwin.so +0 -0
  242. scipy/ndimage/_ni_docstrings.py +5 -1
  243. scipy/ndimage/_ni_label.cpython-313-darwin.so +0 -0
  244. scipy/ndimage/_ni_support.py +1 -5
  245. scipy/ndimage/_rank_filter_1d.cpython-313-darwin.so +0 -0
  246. scipy/ndimage/_support_alternative_backends.py +18 -6
  247. scipy/ndimage/tests/test_filters.py +370 -259
  248. scipy/ndimage/tests/test_fourier.py +7 -9
  249. scipy/ndimage/tests/test_interpolation.py +68 -61
  250. scipy/ndimage/tests/test_measurements.py +18 -35
  251. scipy/ndimage/tests/test_morphology.py +143 -131
  252. scipy/ndimage/tests/test_splines.py +1 -3
  253. scipy/odr/__odrpack.cpython-313-darwin.so +0 -0
  254. scipy/optimize/_basinhopping.py +13 -7
  255. scipy/optimize/_bglu_dense.cpython-313-darwin.so +0 -0
  256. scipy/optimize/_bracket.py +17 -24
  257. scipy/optimize/_chandrupatla.py +9 -10
  258. scipy/optimize/_cobyla_py.py +104 -123
  259. scipy/optimize/_constraints.py +14 -10
  260. scipy/optimize/_differentiable_functions.py +371 -230
  261. scipy/optimize/_differentialevolution.py +4 -3
  262. scipy/optimize/_direct.cpython-313-darwin.so +0 -0
  263. scipy/optimize/_dual_annealing.py +1 -1
  264. scipy/optimize/_elementwise.py +1 -4
  265. scipy/optimize/_group_columns.cpython-313-darwin.so +0 -0
  266. scipy/optimize/_lbfgsb.cpython-313-darwin.so +0 -0
  267. scipy/optimize/_lbfgsb_py.py +57 -16
  268. scipy/optimize/_linprog_doc.py +2 -2
  269. scipy/optimize/_linprog_highs.py +2 -2
  270. scipy/optimize/_linprog_ip.py +25 -10
  271. scipy/optimize/_linprog_util.py +14 -16
  272. scipy/optimize/_lsap.cpython-313-darwin.so +0 -0
  273. scipy/optimize/_lsq/common.py +3 -3
  274. scipy/optimize/_lsq/dogbox.py +16 -2
  275. scipy/optimize/_lsq/givens_elimination.cpython-313-darwin.so +0 -0
  276. scipy/optimize/_lsq/least_squares.py +198 -126
  277. scipy/optimize/_lsq/lsq_linear.py +6 -6
  278. scipy/optimize/_lsq/trf.py +35 -8
  279. scipy/optimize/_milp.py +3 -1
  280. scipy/optimize/_minimize.py +105 -36
  281. scipy/optimize/_minpack.cpython-313-darwin.so +0 -0
  282. scipy/optimize/_minpack_py.py +21 -14
  283. scipy/optimize/_moduleTNC.cpython-313-darwin.so +0 -0
  284. scipy/optimize/_nnls.py +20 -21
  285. scipy/optimize/_nonlin.py +34 -3
  286. scipy/optimize/_numdiff.py +288 -110
  287. scipy/optimize/_optimize.py +86 -48
  288. scipy/optimize/_pava_pybind.cpython-313-darwin.so +0 -0
  289. scipy/optimize/_remove_redundancy.py +5 -5
  290. scipy/optimize/_root_scalar.py +1 -1
  291. scipy/optimize/_shgo.py +6 -0
  292. scipy/optimize/_shgo_lib/_complex.py +1 -1
  293. scipy/optimize/_slsqp_py.py +216 -124
  294. scipy/optimize/_slsqplib.cpython-313-darwin.so +0 -0
  295. scipy/optimize/_spectral.py +1 -1
  296. scipy/optimize/_tnc.py +8 -1
  297. scipy/optimize/_trlib/_trlib.cpython-313-darwin.so +0 -0
  298. scipy/optimize/_trustregion.py +20 -6
  299. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  300. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  301. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  302. scipy/optimize/_trustregion_constr/projections.py +12 -8
  303. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  304. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  305. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  306. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  307. scipy/optimize/_trustregion_exact.py +0 -1
  308. scipy/optimize/_zeros.cpython-313-darwin.so +0 -0
  309. scipy/optimize/_zeros_py.py +97 -17
  310. scipy/optimize/cython_optimize/_zeros.cpython-313-darwin.so +0 -0
  311. scipy/optimize/slsqp.py +0 -1
  312. scipy/optimize/tests/test__basinhopping.py +1 -1
  313. scipy/optimize/tests/test__differential_evolution.py +4 -4
  314. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  315. scipy/optimize/tests/test__numdiff.py +66 -22
  316. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  317. scipy/optimize/tests/test__shgo.py +9 -1
  318. scipy/optimize/tests/test_bracket.py +36 -46
  319. scipy/optimize/tests/test_chandrupatla.py +133 -135
  320. scipy/optimize/tests/test_cobyla.py +74 -45
  321. scipy/optimize/tests/test_constraints.py +1 -1
  322. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  323. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  324. scipy/optimize/tests/test_least_squares.py +125 -13
  325. scipy/optimize/tests/test_linear_assignment.py +3 -3
  326. scipy/optimize/tests/test_linprog.py +3 -3
  327. scipy/optimize/tests/test_lsq_linear.py +6 -6
  328. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  329. scipy/optimize/tests/test_minpack.py +4 -4
  330. scipy/optimize/tests/test_nnls.py +43 -3
  331. scipy/optimize/tests/test_nonlin.py +36 -0
  332. scipy/optimize/tests/test_optimize.py +95 -17
  333. scipy/optimize/tests/test_slsqp.py +36 -4
  334. scipy/optimize/tests/test_zeros.py +34 -1
  335. scipy/signal/__init__.py +12 -23
  336. scipy/signal/_delegators.py +568 -0
  337. scipy/signal/_filter_design.py +459 -241
  338. scipy/signal/_fir_filter_design.py +262 -90
  339. scipy/signal/_lti_conversion.py +3 -2
  340. scipy/signal/_ltisys.py +118 -91
  341. scipy/signal/_max_len_seq_inner.cpython-313-darwin.so +0 -0
  342. scipy/signal/_peak_finding_utils.cpython-313-darwin.so +0 -0
  343. scipy/signal/_polyutils.py +172 -0
  344. scipy/signal/_short_time_fft.py +519 -70
  345. scipy/signal/_signal_api.py +30 -0
  346. scipy/signal/_signaltools.py +719 -399
  347. scipy/signal/_sigtools.cpython-313-darwin.so +0 -0
  348. scipy/signal/_sosfilt.cpython-313-darwin.so +0 -0
  349. scipy/signal/_spectral_py.py +230 -50
  350. scipy/signal/_spline.cpython-313-darwin.so +0 -0
  351. scipy/signal/_spline_filters.py +108 -68
  352. scipy/signal/_support_alternative_backends.py +73 -0
  353. scipy/signal/_upfirdn.py +4 -1
  354. scipy/signal/_upfirdn_apply.cpython-313-darwin.so +0 -0
  355. scipy/signal/_waveforms.py +2 -11
  356. scipy/signal/_wavelets.py +1 -1
  357. scipy/signal/fir_filter_design.py +1 -0
  358. scipy/signal/spline.py +4 -11
  359. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  360. scipy/signal/tests/test_bsplines.py +114 -79
  361. scipy/signal/tests/test_cont2discrete.py +9 -2
  362. scipy/signal/tests/test_filter_design.py +721 -481
  363. scipy/signal/tests/test_fir_filter_design.py +332 -140
  364. scipy/signal/tests/test_savitzky_golay.py +4 -3
  365. scipy/signal/tests/test_short_time_fft.py +221 -3
  366. scipy/signal/tests/test_signaltools.py +2144 -1348
  367. scipy/signal/tests/test_spectral.py +50 -6
  368. scipy/signal/tests/test_splines.py +161 -96
  369. scipy/signal/tests/test_upfirdn.py +84 -50
  370. scipy/signal/tests/test_waveforms.py +20 -0
  371. scipy/signal/tests/test_windows.py +607 -466
  372. scipy/signal/windows/_windows.py +287 -148
  373. scipy/sparse/__init__.py +23 -4
  374. scipy/sparse/_base.py +270 -108
  375. scipy/sparse/_bsr.py +7 -4
  376. scipy/sparse/_compressed.py +59 -231
  377. scipy/sparse/_construct.py +90 -38
  378. scipy/sparse/_coo.py +115 -181
  379. scipy/sparse/_csc.py +4 -4
  380. scipy/sparse/_csparsetools.cpython-313-darwin.so +0 -0
  381. scipy/sparse/_csr.py +2 -2
  382. scipy/sparse/_data.py +48 -48
  383. scipy/sparse/_dia.py +105 -18
  384. scipy/sparse/_dok.py +0 -23
  385. scipy/sparse/_index.py +4 -4
  386. scipy/sparse/_matrix.py +23 -0
  387. scipy/sparse/_sparsetools.cpython-313-darwin.so +0 -0
  388. scipy/sparse/_sputils.py +37 -22
  389. scipy/sparse/base.py +0 -9
  390. scipy/sparse/bsr.py +0 -14
  391. scipy/sparse/compressed.py +0 -23
  392. scipy/sparse/construct.py +0 -6
  393. scipy/sparse/coo.py +0 -14
  394. scipy/sparse/csc.py +0 -3
  395. scipy/sparse/csgraph/_flow.cpython-313-darwin.so +0 -0
  396. scipy/sparse/csgraph/_matching.cpython-313-darwin.so +0 -0
  397. scipy/sparse/csgraph/_min_spanning_tree.cpython-313-darwin.so +0 -0
  398. scipy/sparse/csgraph/_reordering.cpython-313-darwin.so +0 -0
  399. scipy/sparse/csgraph/_shortest_path.cpython-313-darwin.so +0 -0
  400. scipy/sparse/csgraph/_tools.cpython-313-darwin.so +0 -0
  401. scipy/sparse/csgraph/_traversal.cpython-313-darwin.so +0 -0
  402. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  403. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  404. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  405. scipy/sparse/csr.py +0 -5
  406. scipy/sparse/data.py +1 -6
  407. scipy/sparse/dia.py +0 -7
  408. scipy/sparse/dok.py +0 -10
  409. scipy/sparse/linalg/_dsolve/_superlu.cpython-313-darwin.so +0 -0
  410. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  411. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  412. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313-darwin.so +0 -0
  413. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  414. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  415. scipy/sparse/linalg/_interface.py +17 -18
  416. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  417. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  418. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  419. scipy/sparse/linalg/_isolve/minres.py +5 -5
  420. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  421. scipy/sparse/linalg/_isolve/utils.py +2 -8
  422. scipy/sparse/linalg/_matfuncs.py +1 -1
  423. scipy/sparse/linalg/_norm.py +1 -1
  424. scipy/sparse/linalg/_propack/_cpropack.cpython-313-darwin.so +0 -0
  425. scipy/sparse/linalg/_propack/_dpropack.cpython-313-darwin.so +0 -0
  426. scipy/sparse/linalg/_propack/_spropack.cpython-313-darwin.so +0 -0
  427. scipy/sparse/linalg/_propack/_zpropack.cpython-313-darwin.so +0 -0
  428. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  429. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  430. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  431. scipy/sparse/tests/test_base.py +214 -42
  432. scipy/sparse/tests/test_common1d.py +7 -7
  433. scipy/sparse/tests/test_construct.py +1 -1
  434. scipy/sparse/tests/test_coo.py +272 -4
  435. scipy/sparse/tests/test_sparsetools.py +5 -0
  436. scipy/sparse/tests/test_sputils.py +36 -7
  437. scipy/spatial/_ckdtree.cpython-313-darwin.so +0 -0
  438. scipy/spatial/_distance_pybind.cpython-313-darwin.so +0 -0
  439. scipy/spatial/_distance_wrap.cpython-313-darwin.so +0 -0
  440. scipy/spatial/_hausdorff.cpython-313-darwin.so +0 -0
  441. scipy/spatial/_qhull.cpython-313-darwin.so +0 -0
  442. scipy/spatial/_voronoi.cpython-313-darwin.so +0 -0
  443. scipy/spatial/distance.py +49 -42
  444. scipy/spatial/tests/test_distance.py +15 -1
  445. scipy/spatial/tests/test_kdtree.py +1 -0
  446. scipy/spatial/tests/test_qhull.py +7 -2
  447. scipy/spatial/transform/__init__.py +5 -3
  448. scipy/spatial/transform/_rigid_transform.cpython-313-darwin.so +0 -0
  449. scipy/spatial/transform/_rotation.cpython-313-darwin.so +0 -0
  450. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  451. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  452. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  453. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  454. scipy/special/__init__.py +1 -47
  455. scipy/special/_add_newdocs.py +34 -772
  456. scipy/special/_basic.py +22 -25
  457. scipy/special/_comb.cpython-313-darwin.so +0 -0
  458. scipy/special/_ellip_harm_2.cpython-313-darwin.so +0 -0
  459. scipy/special/_gufuncs.cpython-313-darwin.so +0 -0
  460. scipy/special/_logsumexp.py +67 -58
  461. scipy/special/_orthogonal.pyi +1 -1
  462. scipy/special/_specfun.cpython-313-darwin.so +0 -0
  463. scipy/special/_special_ufuncs.cpython-313-darwin.so +0 -0
  464. scipy/special/_spherical_bessel.py +4 -4
  465. scipy/special/_support_alternative_backends.py +212 -119
  466. scipy/special/_test_internal.cpython-313-darwin.so +0 -0
  467. scipy/special/_testutils.py +4 -4
  468. scipy/special/_ufuncs.cpython-313-darwin.so +0 -0
  469. scipy/special/_ufuncs.pyi +1 -0
  470. scipy/special/_ufuncs.pyx +215 -1400
  471. scipy/special/_ufuncs_cxx.cpython-313-darwin.so +0 -0
  472. scipy/special/_ufuncs_cxx.pxd +2 -15
  473. scipy/special/_ufuncs_cxx.pyx +5 -44
  474. scipy/special/_ufuncs_cxx_defs.h +2 -16
  475. scipy/special/_ufuncs_defs.h +0 -8
  476. scipy/special/cython_special.cpython-313-darwin.so +0 -0
  477. scipy/special/cython_special.pxd +1 -1
  478. scipy/special/tests/_cython_examples/meson.build +10 -1
  479. scipy/special/tests/test_basic.py +153 -20
  480. scipy/special/tests/test_boost_ufuncs.py +3 -0
  481. scipy/special/tests/test_cdflib.py +35 -11
  482. scipy/special/tests/test_gammainc.py +16 -0
  483. scipy/special/tests/test_hyp2f1.py +2 -2
  484. scipy/special/tests/test_log1mexp.py +85 -0
  485. scipy/special/tests/test_logsumexp.py +206 -64
  486. scipy/special/tests/test_mpmath.py +1 -0
  487. scipy/special/tests/test_nan_inputs.py +1 -1
  488. scipy/special/tests/test_orthogonal.py +17 -18
  489. scipy/special/tests/test_sf_error.py +3 -2
  490. scipy/special/tests/test_sph_harm.py +6 -7
  491. scipy/special/tests/test_support_alternative_backends.py +211 -76
  492. scipy/stats/__init__.py +4 -1
  493. scipy/stats/_ansari_swilk_statistics.cpython-313-darwin.so +0 -0
  494. scipy/stats/_axis_nan_policy.py +5 -12
  495. scipy/stats/_biasedurn.cpython-313-darwin.so +0 -0
  496. scipy/stats/_continued_fraction.py +387 -0
  497. scipy/stats/_continuous_distns.py +277 -310
  498. scipy/stats/_correlation.py +1 -1
  499. scipy/stats/_covariance.py +6 -3
  500. scipy/stats/_discrete_distns.py +39 -32
  501. scipy/stats/_distn_infrastructure.py +39 -12
  502. scipy/stats/_distribution_infrastructure.py +900 -238
  503. scipy/stats/_entropy.py +9 -10
  504. scipy/{_lib → stats}/_finite_differences.py +1 -1
  505. scipy/stats/_hypotests.py +83 -50
  506. scipy/stats/_kde.py +53 -49
  507. scipy/stats/_ksstats.py +1 -1
  508. scipy/stats/_levy_stable/__init__.py +7 -15
  509. scipy/stats/_levy_stable/levyst.cpython-313-darwin.so +0 -0
  510. scipy/stats/_morestats.py +118 -73
  511. scipy/stats/_mstats_basic.py +13 -17
  512. scipy/stats/_mstats_extras.py +8 -8
  513. scipy/stats/_multivariate.py +89 -113
  514. scipy/stats/_new_distributions.py +97 -20
  515. scipy/stats/_page_trend_test.py +12 -5
  516. scipy/stats/_probability_distribution.py +265 -43
  517. scipy/stats/_qmc.py +14 -9
  518. scipy/stats/_qmc_cy.cpython-313-darwin.so +0 -0
  519. scipy/stats/_qmvnt.py +16 -95
  520. scipy/stats/_qmvnt_cy.cpython-313-darwin.so +0 -0
  521. scipy/stats/_quantile.py +335 -0
  522. scipy/stats/_rcont/rcont.cpython-313-darwin.so +0 -0
  523. scipy/stats/_resampling.py +4 -29
  524. scipy/stats/_sampling.py +1 -1
  525. scipy/stats/_sobol.cpython-313-darwin.so +0 -0
  526. scipy/stats/_stats.cpython-313-darwin.so +0 -0
  527. scipy/stats/_stats_mstats_common.py +21 -2
  528. scipy/stats/_stats_py.py +550 -476
  529. scipy/stats/_stats_pythran.cpython-313-darwin.so +0 -0
  530. scipy/stats/_unuran/unuran_wrapper.cpython-313-darwin.so +0 -0
  531. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  532. scipy/stats/_variation.py +6 -8
  533. scipy/stats/_wilcoxon.py +13 -7
  534. scipy/stats/tests/common_tests.py +6 -4
  535. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  536. scipy/stats/tests/test_continued_fraction.py +173 -0
  537. scipy/stats/tests/test_continuous.py +379 -60
  538. scipy/stats/tests/test_continuous_basic.py +18 -12
  539. scipy/stats/tests/test_discrete_basic.py +14 -8
  540. scipy/stats/tests/test_discrete_distns.py +16 -16
  541. scipy/stats/tests/test_distributions.py +95 -75
  542. scipy/stats/tests/test_entropy.py +40 -48
  543. scipy/stats/tests/test_fit.py +4 -3
  544. scipy/stats/tests/test_hypotests.py +153 -24
  545. scipy/stats/tests/test_kdeoth.py +109 -41
  546. scipy/stats/tests/test_marray.py +289 -0
  547. scipy/stats/tests/test_morestats.py +79 -47
  548. scipy/stats/tests/test_mstats_basic.py +3 -3
  549. scipy/stats/tests/test_multivariate.py +434 -83
  550. scipy/stats/tests/test_qmc.py +13 -10
  551. scipy/stats/tests/test_quantile.py +199 -0
  552. scipy/stats/tests/test_rank.py +119 -112
  553. scipy/stats/tests/test_resampling.py +47 -56
  554. scipy/stats/tests/test_sampling.py +9 -4
  555. scipy/stats/tests/test_stats.py +799 -939
  556. scipy/stats/tests/test_variation.py +8 -6
  557. scipy/version.py +2 -2
  558. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  559. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  560. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +561 -568
  561. scipy-1.16.0rc2.dist-info/WHEEL +6 -0
  562. scipy/_lib/array_api_extra/_funcs.py +0 -484
  563. scipy/_lib/array_api_extra/_typing.py +0 -8
  564. scipy/interpolate/_bspl.cpython-313-darwin.so +0 -0
  565. scipy/optimize/_cobyla.cpython-313-darwin.so +0 -0
  566. scipy/optimize/_cython_nnls.cpython-313-darwin.so +0 -0
  567. scipy/optimize/_slsqp.cpython-313-darwin.so +0 -0
  568. scipy/spatial/qhull_src/COPYING.txt +0 -38
  569. scipy/special/libsf_error_state.dylib +0 -0
  570. scipy/special/tests/test_log_softmax.py +0 -109
  571. scipy/special/tests/test_xsf_cuda.py +0 -114
  572. scipy/special/xsf/binom.h +0 -89
  573. scipy/special/xsf/cdflib.h +0 -100
  574. scipy/special/xsf/cephes/airy.h +0 -307
  575. scipy/special/xsf/cephes/besselpoly.h +0 -51
  576. scipy/special/xsf/cephes/beta.h +0 -257
  577. scipy/special/xsf/cephes/cbrt.h +0 -131
  578. scipy/special/xsf/cephes/chbevl.h +0 -85
  579. scipy/special/xsf/cephes/chdtr.h +0 -193
  580. scipy/special/xsf/cephes/const.h +0 -87
  581. scipy/special/xsf/cephes/ellie.h +0 -293
  582. scipy/special/xsf/cephes/ellik.h +0 -251
  583. scipy/special/xsf/cephes/ellpe.h +0 -107
  584. scipy/special/xsf/cephes/ellpk.h +0 -117
  585. scipy/special/xsf/cephes/expn.h +0 -260
  586. scipy/special/xsf/cephes/gamma.h +0 -398
  587. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  588. scipy/special/xsf/cephes/hyperg.h +0 -361
  589. scipy/special/xsf/cephes/i0.h +0 -149
  590. scipy/special/xsf/cephes/i1.h +0 -158
  591. scipy/special/xsf/cephes/igam.h +0 -421
  592. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  593. scipy/special/xsf/cephes/igami.h +0 -313
  594. scipy/special/xsf/cephes/j0.h +0 -225
  595. scipy/special/xsf/cephes/j1.h +0 -198
  596. scipy/special/xsf/cephes/jv.h +0 -715
  597. scipy/special/xsf/cephes/k0.h +0 -164
  598. scipy/special/xsf/cephes/k1.h +0 -163
  599. scipy/special/xsf/cephes/kn.h +0 -243
  600. scipy/special/xsf/cephes/lanczos.h +0 -112
  601. scipy/special/xsf/cephes/ndtr.h +0 -275
  602. scipy/special/xsf/cephes/poch.h +0 -85
  603. scipy/special/xsf/cephes/polevl.h +0 -167
  604. scipy/special/xsf/cephes/psi.h +0 -194
  605. scipy/special/xsf/cephes/rgamma.h +0 -111
  606. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  607. scipy/special/xsf/cephes/shichi.h +0 -248
  608. scipy/special/xsf/cephes/sici.h +0 -224
  609. scipy/special/xsf/cephes/sindg.h +0 -221
  610. scipy/special/xsf/cephes/tandg.h +0 -139
  611. scipy/special/xsf/cephes/trig.h +0 -58
  612. scipy/special/xsf/cephes/unity.h +0 -186
  613. scipy/special/xsf/cephes/zeta.h +0 -172
  614. scipy/special/xsf/config.h +0 -304
  615. scipy/special/xsf/digamma.h +0 -205
  616. scipy/special/xsf/error.h +0 -57
  617. scipy/special/xsf/evalpoly.h +0 -47
  618. scipy/special/xsf/expint.h +0 -266
  619. scipy/special/xsf/hyp2f1.h +0 -694
  620. scipy/special/xsf/iv_ratio.h +0 -173
  621. scipy/special/xsf/lambertw.h +0 -150
  622. scipy/special/xsf/loggamma.h +0 -163
  623. scipy/special/xsf/sici.h +0 -200
  624. scipy/special/xsf/tools.h +0 -427
  625. scipy/special/xsf/trig.h +0 -164
  626. scipy/special/xsf/wright_bessel.h +0 -843
  627. scipy/special/xsf/zlog1.h +0 -35
  628. scipy/stats/_mvn.cpython-313-darwin.so +0 -0
  629. scipy-1.15.3.dist-info/WHEEL +0 -4
@@ -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"""Interpolating polynomial for a set of points.
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 coordinates of the points the polynomial
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 coordinates of the points the polynomial should pass through.
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 class uses a "barycentric interpolation" method that treats
595
- the problem as a special case of rational function interpolation.
596
- This algorithm is quite stable, numerically, but even in a world of
597
- exact computation, unless the x coordinates are chosen very
598
- carefully - Chebyshev zeros (e.g., cos(i*pi/n)) are a good choice -
599
- polynomial interpolation itself is a very ill-conditioned process
600
- due to the Runge phenomenon.
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
- Based on Berrut and Trefethen 2004, "Barycentric Lagrange Interpolation".
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, \frac{\pi}{2})`:
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[0].set_ylabel("$f(x)$")
629
- >>> axs[1].set_ylabel("$f'(x)$")
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,
scipy/interpolate/_rbf.py CHANGED
@@ -56,8 +56,8 @@ class Rbf:
56
56
  """
57
57
  Rbf(*args, **kwargs)
58
58
 
59
- A class for radial basis function interpolation of functions from
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
 
@@ -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 (RBF) interpolation in N dimensions.
135
+ """Radial basis function interpolator in N ≥ 1 dimensions.
136
136
 
137
137
  Parameters
138
138
  ----------
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 %d must be strictly "
32
- "ascending or descending" % i)
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("There are %d point arrays, but values has %d "
42
- "dimensions" % (len(points), values.ndim))
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 %d must be "
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("There are %d points and %d values in "
49
- "dimension %d" % (len(p), values.shape[i], i))
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("One of the requested xi is out of bounds "
463
- "in dimension %d" % i)
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("There are %d point arrays, but values has %d "
714
- "dimensions" % (len(points), ndim))
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("The requested sample points xi have dimension "
726
- "%d, but this RegularGridInterpolator has "
727
- "dimension %d" % (xi.shape[-1], len(grid)))
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("One of the requested xi is out of bounds "
734
- "in dimension %d" % i)
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:
@@ -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
 
@@ -21,5 +21,4 @@ def __dir__():
21
21
  def __getattr__(name):
22
22
  return _sub_module_deprecation(sub_package="interpolate", module="interpnd",
23
23
  private_modules=["_interpnd"], all=__all__,
24
- attribute=name)
25
-
24
+ attribute=name, dep_version="1.17.0")
@@ -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-13, 0),
204
- (lambda x: np.exp(-100*x**2), 8e-13, 0),
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
- from threading import Lock
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(dz, np.array(grad)[None,:] + 0*dz,
242
- rtol=1e-5, atol=1e-5, err_msg="item %d" % j)
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(func, tol=1e-13, atol=1e-7, rtol=1e-7,
304
- err_msg="Function %d" % j)
305
- self._check_accuracy(func, tol=1e-13, atol=1e-7, rtol=1e-7,
306
- alternate=True,
307
- err_msg="Function (alternate) %d" % j)
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(func, tol=1e-13, atol=1e-7, rtol=1e-7,
310
- err_msg="Function (rescaled) %d" % j, rescale=True)
311
- self._check_accuracy(func, tol=1e-13, atol=1e-7, rtol=1e-7,
312
- alternate=True, rescale=True,
313
- err_msg="Function (alternate, rescaled) %d" % j)
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(func, tol=1e-9, atol=0.22, rtol=0,
326
- err_msg="Function %d" % j)
327
- self._check_accuracy(func, tol=1e-9, atol=0.22, rtol=0,
328
- err_msg="Function %d" % j, rescale=True)
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(func, x=grid, tol=1e-9, atol=5e-3, rtol=1e-2,
383
- err_msg="Function %d" % j)
384
- self._check_accuracy(func, x=grid, tol=1e-9, atol=5e-3, rtol=1e-2,
385
- err_msg="Function %d" % j, rescale=True)
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)