scipy 1.15.2__cp313-cp313t-musllinux_1_2_aarch64.whl → 1.16.0__cp313-cp313t-musllinux_1_2_aarch64.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 (651) hide show
  1. scipy/__config__.py +13 -13
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cpython-313t-aarch64-linux-musl.so +0 -0
  4. scipy/_lib/_array_api.py +497 -161
  5. scipy/_lib/_array_api_compat_vendor.py +9 -0
  6. scipy/_lib/_bunch.py +4 -0
  7. scipy/_lib/_ccallback_c.cpython-313t-aarch64-linux-musl.so +0 -0
  8. scipy/_lib/_docscrape.py +1 -1
  9. scipy/_lib/_elementwise_iterative_method.py +15 -26
  10. scipy/_lib/_fpumode.cpython-313t-aarch64-linux-musl.so +0 -0
  11. scipy/_lib/_sparse.py +41 -0
  12. scipy/_lib/_test_ccallback.cpython-313t-aarch64-linux-musl.so +0 -0
  13. scipy/_lib/_test_deprecation_call.cpython-313t-aarch64-linux-musl.so +0 -0
  14. scipy/_lib/_test_deprecation_def.cpython-313t-aarch64-linux-musl.so +0 -0
  15. scipy/_lib/_testutils.py +6 -2
  16. scipy/_lib/_uarray/_uarray.cpython-313t-aarch64-linux-musl.so +0 -0
  17. scipy/_lib/_util.py +222 -125
  18. scipy/_lib/array_api_compat/__init__.py +4 -4
  19. scipy/_lib/array_api_compat/_internal.py +19 -6
  20. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  21. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  22. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  23. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  24. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  25. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  26. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  27. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  28. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  29. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  30. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  31. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  32. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  33. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  34. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  35. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  36. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  37. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  38. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  39. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  40. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  41. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  42. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  43. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  44. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  45. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  46. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  47. scipy/_lib/array_api_extra/__init__.py +26 -3
  48. scipy/_lib/array_api_extra/_delegation.py +171 -0
  49. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  50. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  51. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  52. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  53. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  54. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  58. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  59. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  60. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  61. scipy/_lib/array_api_extra/testing.py +359 -0
  62. scipy/_lib/decorator.py +2 -2
  63. scipy/_lib/doccer.py +1 -7
  64. scipy/_lib/messagestream.cpython-313t-aarch64-linux-musl.so +0 -0
  65. scipy/_lib/pyprima/__init__.py +212 -0
  66. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  67. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  68. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  69. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  70. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  71. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  72. scipy/_lib/pyprima/cobyla/update.py +289 -0
  73. scipy/_lib/pyprima/common/__init__.py +0 -0
  74. scipy/_lib/pyprima/common/_bounds.py +34 -0
  75. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  76. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  77. scipy/_lib/pyprima/common/_project.py +173 -0
  78. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  79. scipy/_lib/pyprima/common/consts.py +47 -0
  80. scipy/_lib/pyprima/common/evaluate.py +99 -0
  81. scipy/_lib/pyprima/common/history.py +38 -0
  82. scipy/_lib/pyprima/common/infos.py +30 -0
  83. scipy/_lib/pyprima/common/linalg.py +435 -0
  84. scipy/_lib/pyprima/common/message.py +290 -0
  85. scipy/_lib/pyprima/common/powalg.py +131 -0
  86. scipy/_lib/pyprima/common/preproc.py +277 -0
  87. scipy/_lib/pyprima/common/present.py +5 -0
  88. scipy/_lib/pyprima/common/ratio.py +54 -0
  89. scipy/_lib/pyprima/common/redrho.py +47 -0
  90. scipy/_lib/pyprima/common/selectx.py +296 -0
  91. scipy/_lib/tests/test__util.py +105 -121
  92. scipy/_lib/tests/test_array_api.py +169 -34
  93. scipy/_lib/tests/test_bunch.py +7 -0
  94. scipy/_lib/tests/test_ccallback.py +2 -10
  95. scipy/_lib/tests/test_public_api.py +13 -0
  96. scipy/cluster/_hierarchy.cpython-313t-aarch64-linux-musl.so +0 -0
  97. scipy/cluster/_optimal_leaf_ordering.cpython-313t-aarch64-linux-musl.so +0 -0
  98. scipy/cluster/_vq.cpython-313t-aarch64-linux-musl.so +0 -0
  99. scipy/cluster/hierarchy.py +393 -223
  100. scipy/cluster/tests/test_hierarchy.py +273 -335
  101. scipy/cluster/tests/test_vq.py +45 -61
  102. scipy/cluster/vq.py +39 -35
  103. scipy/conftest.py +282 -151
  104. scipy/constants/_constants.py +4 -1
  105. scipy/constants/tests/test_codata.py +2 -2
  106. scipy/constants/tests/test_constants.py +11 -18
  107. scipy/datasets/_download_all.py +15 -1
  108. scipy/datasets/_fetchers.py +7 -1
  109. scipy/datasets/_utils.py +1 -1
  110. scipy/differentiate/_differentiate.py +25 -25
  111. scipy/differentiate/tests/test_differentiate.py +24 -25
  112. scipy/fft/_basic.py +20 -0
  113. scipy/fft/_helper.py +3 -34
  114. scipy/fft/_pocketfft/helper.py +29 -1
  115. scipy/fft/_pocketfft/pypocketfft.cpython-313t-aarch64-linux-musl.so +0 -0
  116. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  117. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  118. scipy/fft/_realtransforms.py +13 -0
  119. scipy/fft/tests/test_basic.py +27 -25
  120. scipy/fft/tests/test_fftlog.py +16 -7
  121. scipy/fft/tests/test_helper.py +18 -34
  122. scipy/fft/tests/test_real_transforms.py +8 -10
  123. scipy/fftpack/convolve.cpython-313t-aarch64-linux-musl.so +0 -0
  124. scipy/fftpack/tests/test_basic.py +2 -4
  125. scipy/fftpack/tests/test_real_transforms.py +8 -9
  126. scipy/integrate/_bvp.py +9 -3
  127. scipy/integrate/_cubature.py +3 -2
  128. scipy/integrate/_dop.cpython-313t-aarch64-linux-musl.so +0 -0
  129. scipy/integrate/_ivp/common.py +3 -3
  130. scipy/integrate/_ivp/ivp.py +9 -2
  131. scipy/integrate/_ivp/tests/test_ivp.py +19 -0
  132. scipy/integrate/_lsoda.cpython-313t-aarch64-linux-musl.so +0 -0
  133. scipy/integrate/_ode.py +9 -2
  134. scipy/integrate/_odepack.cpython-313t-aarch64-linux-musl.so +0 -0
  135. scipy/integrate/_quad_vec.py +21 -29
  136. scipy/integrate/_quadpack.cpython-313t-aarch64-linux-musl.so +0 -0
  137. scipy/integrate/_quadpack_py.py +11 -7
  138. scipy/integrate/_quadrature.py +3 -3
  139. scipy/integrate/_rules/_base.py +2 -2
  140. scipy/integrate/_tanhsinh.py +57 -54
  141. scipy/integrate/_test_multivariate.cpython-313t-aarch64-linux-musl.so +0 -0
  142. scipy/integrate/_test_odeint_banded.cpython-313t-aarch64-linux-musl.so +0 -0
  143. scipy/integrate/_vode.cpython-313t-aarch64-linux-musl.so +0 -0
  144. scipy/integrate/tests/test__quad_vec.py +0 -6
  145. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  146. scipy/integrate/tests/test_cubature.py +21 -35
  147. scipy/integrate/tests/test_quadrature.py +6 -8
  148. scipy/integrate/tests/test_tanhsinh.py +61 -43
  149. scipy/interpolate/__init__.py +70 -58
  150. scipy/interpolate/_bary_rational.py +22 -22
  151. scipy/interpolate/_bsplines.py +119 -66
  152. scipy/interpolate/_cubic.py +65 -50
  153. scipy/interpolate/_dfitpack.cpython-313t-aarch64-linux-musl.so +0 -0
  154. scipy/interpolate/_dierckx.cpython-313t-aarch64-linux-musl.so +0 -0
  155. scipy/interpolate/_fitpack.cpython-313t-aarch64-linux-musl.so +0 -0
  156. scipy/interpolate/_fitpack2.py +9 -6
  157. scipy/interpolate/_fitpack_impl.py +32 -26
  158. scipy/interpolate/_fitpack_repro.py +23 -19
  159. scipy/interpolate/_interpnd.cpython-313t-aarch64-linux-musl.so +0 -0
  160. scipy/interpolate/_interpolate.py +30 -12
  161. scipy/interpolate/_ndbspline.py +13 -18
  162. scipy/interpolate/_ndgriddata.py +5 -8
  163. scipy/interpolate/_polyint.py +95 -31
  164. scipy/interpolate/_ppoly.cpython-313t-aarch64-linux-musl.so +0 -0
  165. scipy/interpolate/_rbf.py +2 -2
  166. scipy/interpolate/_rbfinterp.py +1 -1
  167. scipy/interpolate/_rbfinterp_pythran.cpython-313t-aarch64-linux-musl.so +0 -0
  168. scipy/interpolate/_rgi.py +31 -26
  169. scipy/interpolate/_rgi_cython.cpython-313t-aarch64-linux-musl.so +0 -0
  170. scipy/interpolate/dfitpack.py +0 -20
  171. scipy/interpolate/interpnd.py +1 -2
  172. scipy/interpolate/tests/test_bary_rational.py +2 -2
  173. scipy/interpolate/tests/test_bsplines.py +97 -1
  174. scipy/interpolate/tests/test_fitpack2.py +39 -1
  175. scipy/interpolate/tests/test_interpnd.py +32 -20
  176. scipy/interpolate/tests/test_interpolate.py +48 -4
  177. scipy/interpolate/tests/test_rgi.py +2 -1
  178. scipy/io/_fast_matrix_market/__init__.py +2 -0
  179. scipy/io/_fast_matrix_market/_fmm_core.cpython-313t-aarch64-linux-musl.so +0 -0
  180. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  181. scipy/io/_harwell_boeing/hb.py +7 -11
  182. scipy/io/_idl.py +5 -7
  183. scipy/io/_netcdf.py +15 -5
  184. scipy/io/_test_fortran.cpython-313t-aarch64-linux-musl.so +0 -0
  185. scipy/io/arff/tests/test_arffread.py +3 -3
  186. scipy/io/matlab/__init__.py +5 -3
  187. scipy/io/matlab/_mio.py +4 -1
  188. scipy/io/matlab/_mio5.py +19 -13
  189. scipy/io/matlab/_mio5_utils.cpython-313t-aarch64-linux-musl.so +0 -0
  190. scipy/io/matlab/_mio_utils.cpython-313t-aarch64-linux-musl.so +0 -0
  191. scipy/io/matlab/_miobase.py +4 -1
  192. scipy/io/matlab/_streams.cpython-313t-aarch64-linux-musl.so +0 -0
  193. scipy/io/matlab/tests/test_mio.py +46 -18
  194. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  195. scipy/io/tests/test_mmio.py +7 -1
  196. scipy/io/tests/test_wavfile.py +41 -0
  197. scipy/io/wavfile.py +57 -10
  198. scipy/linalg/_basic.py +113 -86
  199. scipy/linalg/_cythonized_array_utils.cpython-313t-aarch64-linux-musl.so +0 -0
  200. scipy/linalg/_decomp.py +22 -9
  201. scipy/linalg/_decomp_cholesky.py +28 -13
  202. scipy/linalg/_decomp_cossin.py +45 -30
  203. scipy/linalg/_decomp_interpolative.cpython-313t-aarch64-linux-musl.so +0 -0
  204. scipy/linalg/_decomp_ldl.py +4 -1
  205. scipy/linalg/_decomp_lu.py +18 -6
  206. scipy/linalg/_decomp_lu_cython.cpython-313t-aarch64-linux-musl.so +0 -0
  207. scipy/linalg/_decomp_polar.py +2 -0
  208. scipy/linalg/_decomp_qr.py +6 -2
  209. scipy/linalg/_decomp_qz.py +3 -0
  210. scipy/linalg/_decomp_schur.py +3 -1
  211. scipy/linalg/_decomp_svd.py +13 -2
  212. scipy/linalg/_decomp_update.cpython-313t-aarch64-linux-musl.so +0 -0
  213. scipy/linalg/_expm_frechet.py +4 -0
  214. scipy/linalg/_fblas.cpython-313t-aarch64-linux-musl.so +0 -0
  215. scipy/linalg/_flapack.cpython-313t-aarch64-linux-musl.so +0 -0
  216. scipy/linalg/_linalg_pythran.cpython-313t-aarch64-linux-musl.so +0 -0
  217. scipy/linalg/_matfuncs.py +187 -4
  218. scipy/linalg/_matfuncs_expm.cpython-313t-aarch64-linux-musl.so +0 -0
  219. scipy/linalg/_matfuncs_schur_sqrtm.cpython-313t-aarch64-linux-musl.so +0 -0
  220. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  221. scipy/linalg/_matfuncs_sqrtm_triu.cpython-313t-aarch64-linux-musl.so +0 -0
  222. scipy/linalg/_procrustes.py +2 -0
  223. scipy/linalg/_sketches.py +17 -6
  224. scipy/linalg/_solve_toeplitz.cpython-313t-aarch64-linux-musl.so +0 -0
  225. scipy/linalg/_solvers.py +7 -2
  226. scipy/linalg/_special_matrices.py +26 -36
  227. scipy/linalg/blas.py +35 -24
  228. scipy/linalg/cython_blas.cpython-313t-aarch64-linux-musl.so +0 -0
  229. scipy/linalg/cython_lapack.cpython-313t-aarch64-linux-musl.so +0 -0
  230. scipy/linalg/lapack.py +22 -2
  231. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  232. scipy/linalg/tests/test_basic.py +31 -16
  233. scipy/linalg/tests/test_batch.py +588 -0
  234. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  235. scipy/linalg/tests/test_decomp.py +40 -3
  236. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  237. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  238. scipy/linalg/tests/test_interpolative.py +17 -0
  239. scipy/linalg/tests/test_lapack.py +115 -7
  240. scipy/linalg/tests/test_matfuncs.py +157 -102
  241. scipy/linalg/tests/test_procrustes.py +0 -7
  242. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  243. scipy/linalg/tests/test_special_matrices.py +1 -5
  244. scipy/ndimage/__init__.py +1 -0
  245. scipy/ndimage/_ctest.cpython-313t-aarch64-linux-musl.so +0 -0
  246. scipy/ndimage/_cytest.cpython-313t-aarch64-linux-musl.so +0 -0
  247. scipy/ndimage/_delegators.py +8 -2
  248. scipy/ndimage/_filters.py +453 -5
  249. scipy/ndimage/_interpolation.py +36 -6
  250. scipy/ndimage/_measurements.py +4 -2
  251. scipy/ndimage/_morphology.py +5 -0
  252. scipy/ndimage/_nd_image.cpython-313t-aarch64-linux-musl.so +0 -0
  253. scipy/ndimage/_ndimage_api.py +2 -1
  254. scipy/ndimage/_ni_docstrings.py +5 -1
  255. scipy/ndimage/_ni_label.cpython-313t-aarch64-linux-musl.so +0 -0
  256. scipy/ndimage/_ni_support.py +1 -5
  257. scipy/ndimage/_rank_filter_1d.cpython-313t-aarch64-linux-musl.so +0 -0
  258. scipy/ndimage/_support_alternative_backends.py +18 -6
  259. scipy/ndimage/tests/test_filters.py +384 -259
  260. scipy/ndimage/tests/test_fourier.py +7 -9
  261. scipy/ndimage/tests/test_interpolation.py +68 -61
  262. scipy/ndimage/tests/test_measurements.py +18 -35
  263. scipy/ndimage/tests/test_morphology.py +143 -131
  264. scipy/ndimage/tests/test_splines.py +1 -3
  265. scipy/odr/__odrpack.cpython-313t-aarch64-linux-musl.so +0 -0
  266. scipy/optimize/_basinhopping.py +13 -7
  267. scipy/optimize/_bglu_dense.cpython-313t-aarch64-linux-musl.so +0 -0
  268. scipy/optimize/_bracket.py +46 -26
  269. scipy/optimize/_chandrupatla.py +9 -10
  270. scipy/optimize/_cobyla_py.py +104 -123
  271. scipy/optimize/_constraints.py +14 -10
  272. scipy/optimize/_differentiable_functions.py +371 -230
  273. scipy/optimize/_differentialevolution.py +4 -3
  274. scipy/optimize/_direct.cpython-313t-aarch64-linux-musl.so +0 -0
  275. scipy/optimize/_dual_annealing.py +1 -1
  276. scipy/optimize/_elementwise.py +1 -4
  277. scipy/optimize/_group_columns.cpython-313t-aarch64-linux-musl.so +0 -0
  278. scipy/optimize/_highspy/_core.cpython-313t-aarch64-linux-musl.so +0 -0
  279. scipy/optimize/_highspy/_highs_options.cpython-313t-aarch64-linux-musl.so +0 -0
  280. scipy/optimize/_highspy/_highs_wrapper.py +6 -4
  281. scipy/optimize/_lbfgsb.cpython-313t-aarch64-linux-musl.so +0 -0
  282. scipy/optimize/_lbfgsb_py.py +80 -24
  283. scipy/optimize/_linprog_doc.py +2 -2
  284. scipy/optimize/_linprog_highs.py +11 -11
  285. scipy/optimize/_linprog_ip.py +25 -10
  286. scipy/optimize/_linprog_util.py +18 -19
  287. scipy/optimize/_lsap.cpython-313t-aarch64-linux-musl.so +0 -0
  288. scipy/optimize/_lsq/common.py +3 -3
  289. scipy/optimize/_lsq/dogbox.py +16 -2
  290. scipy/optimize/_lsq/givens_elimination.cpython-313t-aarch64-linux-musl.so +0 -0
  291. scipy/optimize/_lsq/least_squares.py +198 -126
  292. scipy/optimize/_lsq/lsq_linear.py +6 -6
  293. scipy/optimize/_lsq/trf.py +35 -8
  294. scipy/optimize/_milp.py +3 -1
  295. scipy/optimize/_minimize.py +105 -36
  296. scipy/optimize/_minpack.cpython-313t-aarch64-linux-musl.so +0 -0
  297. scipy/optimize/_minpack_py.py +21 -14
  298. scipy/optimize/_moduleTNC.cpython-313t-aarch64-linux-musl.so +0 -0
  299. scipy/optimize/_nnls.py +20 -21
  300. scipy/optimize/_nonlin.py +34 -3
  301. scipy/optimize/_numdiff.py +288 -110
  302. scipy/optimize/_optimize.py +86 -48
  303. scipy/optimize/_pava_pybind.cpython-313t-aarch64-linux-musl.so +0 -0
  304. scipy/optimize/_remove_redundancy.py +5 -5
  305. scipy/optimize/_root_scalar.py +1 -1
  306. scipy/optimize/_shgo.py +6 -0
  307. scipy/optimize/_shgo_lib/_complex.py +1 -1
  308. scipy/optimize/_slsqp_py.py +216 -124
  309. scipy/optimize/_slsqplib.cpython-313t-aarch64-linux-musl.so +0 -0
  310. scipy/optimize/_spectral.py +1 -1
  311. scipy/optimize/_tnc.py +8 -1
  312. scipy/optimize/_trlib/_trlib.cpython-313t-aarch64-linux-musl.so +0 -0
  313. scipy/optimize/_trustregion.py +20 -6
  314. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  315. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  316. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  317. scipy/optimize/_trustregion_constr/projections.py +12 -8
  318. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  319. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  320. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  321. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  322. scipy/optimize/_trustregion_exact.py +0 -1
  323. scipy/optimize/_zeros.cpython-313t-aarch64-linux-musl.so +0 -0
  324. scipy/optimize/_zeros_py.py +97 -17
  325. scipy/optimize/cython_optimize/_zeros.cpython-313t-aarch64-linux-musl.so +0 -0
  326. scipy/optimize/slsqp.py +0 -1
  327. scipy/optimize/tests/test__basinhopping.py +1 -1
  328. scipy/optimize/tests/test__differential_evolution.py +4 -4
  329. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  330. scipy/optimize/tests/test__numdiff.py +66 -22
  331. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  332. scipy/optimize/tests/test__shgo.py +9 -1
  333. scipy/optimize/tests/test_bracket.py +71 -46
  334. scipy/optimize/tests/test_chandrupatla.py +133 -135
  335. scipy/optimize/tests/test_cobyla.py +74 -45
  336. scipy/optimize/tests/test_constraints.py +1 -1
  337. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  338. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  339. scipy/optimize/tests/test_least_squares.py +125 -13
  340. scipy/optimize/tests/test_linear_assignment.py +3 -3
  341. scipy/optimize/tests/test_linprog.py +3 -3
  342. scipy/optimize/tests/test_lsq_linear.py +6 -6
  343. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  344. scipy/optimize/tests/test_minpack.py +4 -4
  345. scipy/optimize/tests/test_nnls.py +43 -3
  346. scipy/optimize/tests/test_nonlin.py +36 -0
  347. scipy/optimize/tests/test_optimize.py +98 -20
  348. scipy/optimize/tests/test_slsqp.py +36 -4
  349. scipy/optimize/tests/test_zeros.py +34 -1
  350. scipy/signal/__init__.py +12 -23
  351. scipy/signal/_delegators.py +568 -0
  352. scipy/signal/_filter_design.py +459 -241
  353. scipy/signal/_fir_filter_design.py +262 -90
  354. scipy/signal/_lti_conversion.py +3 -2
  355. scipy/signal/_ltisys.py +118 -91
  356. scipy/signal/_max_len_seq_inner.cpython-313t-aarch64-linux-musl.so +0 -0
  357. scipy/signal/_peak_finding_utils.cpython-313t-aarch64-linux-musl.so +0 -0
  358. scipy/signal/_polyutils.py +172 -0
  359. scipy/signal/_short_time_fft.py +553 -76
  360. scipy/signal/_signal_api.py +30 -0
  361. scipy/signal/_signaltools.py +719 -396
  362. scipy/signal/_sigtools.cpython-313t-aarch64-linux-musl.so +0 -0
  363. scipy/signal/_sosfilt.cpython-313t-aarch64-linux-musl.so +0 -0
  364. scipy/signal/_spectral_py.py +230 -50
  365. scipy/signal/_spline.cpython-313t-aarch64-linux-musl.so +0 -0
  366. scipy/signal/_spline_filters.py +108 -68
  367. scipy/signal/_support_alternative_backends.py +73 -0
  368. scipy/signal/_upfirdn.py +4 -1
  369. scipy/signal/_upfirdn_apply.cpython-313t-aarch64-linux-musl.so +0 -0
  370. scipy/signal/_waveforms.py +2 -11
  371. scipy/signal/_wavelets.py +1 -1
  372. scipy/signal/fir_filter_design.py +1 -0
  373. scipy/signal/spline.py +4 -11
  374. scipy/signal/tests/_scipy_spectral_test_shim.py +5 -182
  375. scipy/signal/tests/test_bsplines.py +114 -79
  376. scipy/signal/tests/test_cont2discrete.py +9 -2
  377. scipy/signal/tests/test_filter_design.py +721 -481
  378. scipy/signal/tests/test_fir_filter_design.py +332 -140
  379. scipy/signal/tests/test_savitzky_golay.py +4 -3
  380. scipy/signal/tests/test_short_time_fft.py +231 -5
  381. scipy/signal/tests/test_signaltools.py +2150 -1349
  382. scipy/signal/tests/test_spectral.py +50 -6
  383. scipy/signal/tests/test_splines.py +161 -96
  384. scipy/signal/tests/test_upfirdn.py +84 -50
  385. scipy/signal/tests/test_waveforms.py +20 -0
  386. scipy/signal/tests/test_windows.py +607 -466
  387. scipy/signal/windows/_windows.py +287 -148
  388. scipy/sparse/__init__.py +23 -4
  389. scipy/sparse/_base.py +269 -120
  390. scipy/sparse/_bsr.py +7 -4
  391. scipy/sparse/_compressed.py +59 -234
  392. scipy/sparse/_construct.py +90 -38
  393. scipy/sparse/_coo.py +115 -181
  394. scipy/sparse/_csc.py +4 -4
  395. scipy/sparse/_csparsetools.cpython-313t-aarch64-linux-musl.so +0 -0
  396. scipy/sparse/_csr.py +2 -2
  397. scipy/sparse/_data.py +48 -48
  398. scipy/sparse/_dia.py +105 -21
  399. scipy/sparse/_dok.py +0 -23
  400. scipy/sparse/_index.py +4 -4
  401. scipy/sparse/_matrix.py +23 -0
  402. scipy/sparse/_sparsetools.cpython-313t-aarch64-linux-musl.so +0 -0
  403. scipy/sparse/_sputils.py +37 -22
  404. scipy/sparse/base.py +0 -9
  405. scipy/sparse/bsr.py +0 -14
  406. scipy/sparse/compressed.py +0 -23
  407. scipy/sparse/construct.py +0 -6
  408. scipy/sparse/coo.py +0 -14
  409. scipy/sparse/csc.py +0 -3
  410. scipy/sparse/csgraph/_flow.cpython-313t-aarch64-linux-musl.so +0 -0
  411. scipy/sparse/csgraph/_matching.cpython-313t-aarch64-linux-musl.so +0 -0
  412. scipy/sparse/csgraph/_min_spanning_tree.cpython-313t-aarch64-linux-musl.so +0 -0
  413. scipy/sparse/csgraph/_reordering.cpython-313t-aarch64-linux-musl.so +0 -0
  414. scipy/sparse/csgraph/_shortest_path.cpython-313t-aarch64-linux-musl.so +0 -0
  415. scipy/sparse/csgraph/_tools.cpython-313t-aarch64-linux-musl.so +0 -0
  416. scipy/sparse/csgraph/_traversal.cpython-313t-aarch64-linux-musl.so +0 -0
  417. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  418. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  419. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  420. scipy/sparse/csr.py +0 -5
  421. scipy/sparse/data.py +1 -6
  422. scipy/sparse/dia.py +0 -7
  423. scipy/sparse/dok.py +0 -10
  424. scipy/sparse/linalg/_dsolve/_superlu.cpython-313t-aarch64-linux-musl.so +0 -0
  425. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  426. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  427. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313t-aarch64-linux-musl.so +0 -0
  428. scipy/sparse/linalg/_eigen/arpack/arpack.py +28 -20
  429. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  430. scipy/sparse/linalg/_expm_multiply.py +8 -3
  431. scipy/sparse/linalg/_interface.py +29 -26
  432. scipy/sparse/linalg/_isolve/_gcrotmk.py +6 -5
  433. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  434. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  435. scipy/sparse/linalg/_isolve/minres.py +5 -5
  436. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  437. scipy/sparse/linalg/_isolve/utils.py +2 -8
  438. scipy/sparse/linalg/_matfuncs.py +1 -1
  439. scipy/sparse/linalg/_norm.py +1 -1
  440. scipy/sparse/linalg/_propack/_cpropack.cpython-313t-aarch64-linux-musl.so +0 -0
  441. scipy/sparse/linalg/_propack/_dpropack.cpython-313t-aarch64-linux-musl.so +0 -0
  442. scipy/sparse/linalg/_propack/_spropack.cpython-313t-aarch64-linux-musl.so +0 -0
  443. scipy/sparse/linalg/_propack/_zpropack.cpython-313t-aarch64-linux-musl.so +0 -0
  444. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  445. scipy/sparse/linalg/tests/test_expm_multiply.py +10 -0
  446. scipy/sparse/linalg/tests/test_interface.py +35 -0
  447. scipy/sparse/linalg/tests/test_pydata_sparse.py +18 -0
  448. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  449. scipy/sparse/tests/test_base.py +224 -40
  450. scipy/sparse/tests/test_common1d.py +17 -12
  451. scipy/sparse/tests/test_construct.py +1 -1
  452. scipy/sparse/tests/test_coo.py +272 -4
  453. scipy/sparse/tests/test_sparsetools.py +5 -0
  454. scipy/sparse/tests/test_sputils.py +36 -7
  455. scipy/spatial/_ckdtree.cpython-313t-aarch64-linux-musl.so +0 -0
  456. scipy/spatial/_distance_pybind.cpython-313t-aarch64-linux-musl.so +0 -0
  457. scipy/spatial/_distance_wrap.cpython-313t-aarch64-linux-musl.so +0 -0
  458. scipy/spatial/_hausdorff.cpython-313t-aarch64-linux-musl.so +0 -0
  459. scipy/spatial/_qhull.cpython-313t-aarch64-linux-musl.so +0 -0
  460. scipy/spatial/_voronoi.cpython-313t-aarch64-linux-musl.so +0 -0
  461. scipy/spatial/distance.py +49 -42
  462. scipy/spatial/tests/test_distance.py +15 -1
  463. scipy/spatial/tests/test_kdtree.py +1 -0
  464. scipy/spatial/tests/test_qhull.py +106 -2
  465. scipy/spatial/transform/__init__.py +5 -3
  466. scipy/spatial/transform/_rigid_transform.cpython-313t-aarch64-linux-musl.so +0 -0
  467. scipy/spatial/transform/_rotation.cpython-313t-aarch64-linux-musl.so +0 -0
  468. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  469. scipy/spatial/transform/tests/test_rotation.py +1342 -790
  470. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  471. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  472. scipy/special/__init__.py +1 -47
  473. scipy/special/_add_newdocs.py +34 -772
  474. scipy/special/_basic.py +22 -25
  475. scipy/special/_comb.cpython-313t-aarch64-linux-musl.so +0 -0
  476. scipy/special/_ellip_harm_2.cpython-313t-aarch64-linux-musl.so +0 -0
  477. scipy/special/_gufuncs.cpython-313t-aarch64-linux-musl.so +0 -0
  478. scipy/special/_logsumexp.py +83 -69
  479. scipy/special/_orthogonal.pyi +1 -1
  480. scipy/special/_specfun.cpython-313t-aarch64-linux-musl.so +0 -0
  481. scipy/special/_special_ufuncs.cpython-313t-aarch64-linux-musl.so +0 -0
  482. scipy/special/_spherical_bessel.py +4 -4
  483. scipy/special/_support_alternative_backends.py +212 -119
  484. scipy/special/_test_internal.cpython-313t-aarch64-linux-musl.so +0 -0
  485. scipy/special/_testutils.py +4 -4
  486. scipy/special/_ufuncs.cpython-313t-aarch64-linux-musl.so +0 -0
  487. scipy/special/_ufuncs.pyi +1 -0
  488. scipy/special/_ufuncs.pyx +215 -1400
  489. scipy/special/_ufuncs_cxx.cpython-313t-aarch64-linux-musl.so +0 -0
  490. scipy/special/_ufuncs_cxx.pxd +2 -15
  491. scipy/special/_ufuncs_cxx.pyx +5 -44
  492. scipy/special/_ufuncs_cxx_defs.h +2 -16
  493. scipy/special/_ufuncs_defs.h +0 -8
  494. scipy/special/cython_special.cpython-313t-aarch64-linux-musl.so +0 -0
  495. scipy/special/cython_special.pxd +1 -1
  496. scipy/special/tests/_cython_examples/meson.build +10 -1
  497. scipy/special/tests/test_basic.py +153 -20
  498. scipy/special/tests/test_boost_ufuncs.py +3 -0
  499. scipy/special/tests/test_cdflib.py +35 -11
  500. scipy/special/tests/test_gammainc.py +16 -0
  501. scipy/special/tests/test_hyp2f1.py +23 -2
  502. scipy/special/tests/test_log1mexp.py +85 -0
  503. scipy/special/tests/test_logsumexp.py +220 -64
  504. scipy/special/tests/test_mpmath.py +1 -0
  505. scipy/special/tests/test_nan_inputs.py +1 -1
  506. scipy/special/tests/test_orthogonal.py +17 -18
  507. scipy/special/tests/test_sf_error.py +3 -2
  508. scipy/special/tests/test_sph_harm.py +6 -7
  509. scipy/special/tests/test_support_alternative_backends.py +211 -76
  510. scipy/stats/__init__.py +4 -1
  511. scipy/stats/_ansari_swilk_statistics.cpython-313t-aarch64-linux-musl.so +0 -0
  512. scipy/stats/_axis_nan_policy.py +5 -12
  513. scipy/stats/_biasedurn.cpython-313t-aarch64-linux-musl.so +0 -0
  514. scipy/stats/_continued_fraction.py +387 -0
  515. scipy/stats/_continuous_distns.py +296 -319
  516. scipy/stats/_correlation.py +1 -1
  517. scipy/stats/_covariance.py +6 -3
  518. scipy/stats/_discrete_distns.py +39 -32
  519. scipy/stats/_distn_infrastructure.py +39 -12
  520. scipy/stats/_distribution_infrastructure.py +920 -238
  521. scipy/stats/_entropy.py +9 -10
  522. scipy/{_lib → stats}/_finite_differences.py +1 -1
  523. scipy/stats/_hypotests.py +83 -50
  524. scipy/stats/_kde.py +53 -49
  525. scipy/stats/_ksstats.py +1 -1
  526. scipy/stats/_levy_stable/__init__.py +7 -15
  527. scipy/stats/_levy_stable/levyst.cpython-313t-aarch64-linux-musl.so +0 -0
  528. scipy/stats/_morestats.py +118 -73
  529. scipy/stats/_mstats_basic.py +13 -17
  530. scipy/stats/_mstats_extras.py +8 -8
  531. scipy/stats/_multivariate.py +89 -113
  532. scipy/stats/_new_distributions.py +97 -20
  533. scipy/stats/_page_trend_test.py +12 -5
  534. scipy/stats/_probability_distribution.py +265 -43
  535. scipy/stats/_qmc.py +14 -9
  536. scipy/stats/_qmc_cy.cpython-313t-aarch64-linux-musl.so +0 -0
  537. scipy/stats/_qmvnt.py +16 -95
  538. scipy/stats/_qmvnt_cy.cpython-313t-aarch64-linux-musl.so +0 -0
  539. scipy/stats/_quantile.py +335 -0
  540. scipy/stats/_rcont/rcont.cpython-313t-aarch64-linux-musl.so +0 -0
  541. scipy/stats/_resampling.py +5 -30
  542. scipy/stats/_sampling.py +1 -1
  543. scipy/stats/_sobol.cpython-313t-aarch64-linux-musl.so +0 -0
  544. scipy/stats/_stats.cpython-313t-aarch64-linux-musl.so +0 -0
  545. scipy/stats/_stats_mstats_common.py +21 -2
  546. scipy/stats/_stats_py.py +551 -477
  547. scipy/stats/_stats_pythran.cpython-313t-aarch64-linux-musl.so +0 -0
  548. scipy/stats/_unuran/unuran_wrapper.cpython-313t-aarch64-linux-musl.so +0 -0
  549. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  550. scipy/stats/_variation.py +6 -8
  551. scipy/stats/_wilcoxon.py +13 -7
  552. scipy/stats/tests/common_tests.py +6 -4
  553. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  554. scipy/stats/tests/test_continued_fraction.py +173 -0
  555. scipy/stats/tests/test_continuous.py +379 -60
  556. scipy/stats/tests/test_continuous_basic.py +18 -12
  557. scipy/stats/tests/test_discrete_basic.py +14 -8
  558. scipy/stats/tests/test_discrete_distns.py +16 -16
  559. scipy/stats/tests/test_distributions.py +117 -75
  560. scipy/stats/tests/test_entropy.py +40 -48
  561. scipy/stats/tests/test_fit.py +4 -3
  562. scipy/stats/tests/test_hypotests.py +153 -24
  563. scipy/stats/tests/test_kdeoth.py +109 -41
  564. scipy/stats/tests/test_marray.py +289 -0
  565. scipy/stats/tests/test_morestats.py +81 -49
  566. scipy/stats/tests/test_mstats_basic.py +3 -3
  567. scipy/stats/tests/test_multivariate.py +434 -83
  568. scipy/stats/tests/test_qmc.py +13 -10
  569. scipy/stats/tests/test_quantile.py +199 -0
  570. scipy/stats/tests/test_rank.py +119 -112
  571. scipy/stats/tests/test_resampling.py +47 -56
  572. scipy/stats/tests/test_sampling.py +9 -4
  573. scipy/stats/tests/test_stats.py +799 -939
  574. scipy/stats/tests/test_variation.py +8 -6
  575. scipy/version.py +2 -2
  576. {scipy-1.15.2.dist-info → scipy-1.16.0.dist-info}/LICENSE.txt +4 -4
  577. {scipy-1.15.2.dist-info → scipy-1.16.0.dist-info}/METADATA +12 -12
  578. {scipy-1.15.2.dist-info → scipy-1.16.0.dist-info}/RECORD +1316 -1323
  579. scipy.libs/libgcc_s-2d945d6c.so.1 +0 -0
  580. scipy.libs/libgfortran-67378ab2.so.5.0.0 +0 -0
  581. scipy.libs/{libstdc++-1b614e01.so.6.0.32 → libstdc++-85f2cd6d.so.6.0.33} +0 -0
  582. scipy/_lib/array_api_extra/_funcs.py +0 -484
  583. scipy/_lib/array_api_extra/_typing.py +0 -8
  584. scipy/interpolate/_bspl.cpython-313t-aarch64-linux-musl.so +0 -0
  585. scipy/optimize/_cobyla.cpython-313t-aarch64-linux-musl.so +0 -0
  586. scipy/optimize/_cython_nnls.cpython-313t-aarch64-linux-musl.so +0 -0
  587. scipy/optimize/_slsqp.cpython-313t-aarch64-linux-musl.so +0 -0
  588. scipy/spatial/qhull_src/COPYING.txt +0 -38
  589. scipy/special/libsf_error_state.so +0 -0
  590. scipy/special/tests/test_log_softmax.py +0 -109
  591. scipy/special/tests/test_xsf_cuda.py +0 -114
  592. scipy/special/xsf/binom.h +0 -89
  593. scipy/special/xsf/cdflib.h +0 -100
  594. scipy/special/xsf/cephes/airy.h +0 -307
  595. scipy/special/xsf/cephes/besselpoly.h +0 -51
  596. scipy/special/xsf/cephes/beta.h +0 -257
  597. scipy/special/xsf/cephes/cbrt.h +0 -131
  598. scipy/special/xsf/cephes/chbevl.h +0 -85
  599. scipy/special/xsf/cephes/chdtr.h +0 -193
  600. scipy/special/xsf/cephes/const.h +0 -87
  601. scipy/special/xsf/cephes/ellie.h +0 -293
  602. scipy/special/xsf/cephes/ellik.h +0 -251
  603. scipy/special/xsf/cephes/ellpe.h +0 -107
  604. scipy/special/xsf/cephes/ellpk.h +0 -117
  605. scipy/special/xsf/cephes/expn.h +0 -260
  606. scipy/special/xsf/cephes/gamma.h +0 -398
  607. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  608. scipy/special/xsf/cephes/hyperg.h +0 -361
  609. scipy/special/xsf/cephes/i0.h +0 -149
  610. scipy/special/xsf/cephes/i1.h +0 -158
  611. scipy/special/xsf/cephes/igam.h +0 -421
  612. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  613. scipy/special/xsf/cephes/igami.h +0 -313
  614. scipy/special/xsf/cephes/j0.h +0 -225
  615. scipy/special/xsf/cephes/j1.h +0 -198
  616. scipy/special/xsf/cephes/jv.h +0 -715
  617. scipy/special/xsf/cephes/k0.h +0 -164
  618. scipy/special/xsf/cephes/k1.h +0 -163
  619. scipy/special/xsf/cephes/kn.h +0 -243
  620. scipy/special/xsf/cephes/lanczos.h +0 -112
  621. scipy/special/xsf/cephes/ndtr.h +0 -275
  622. scipy/special/xsf/cephes/poch.h +0 -85
  623. scipy/special/xsf/cephes/polevl.h +0 -167
  624. scipy/special/xsf/cephes/psi.h +0 -194
  625. scipy/special/xsf/cephes/rgamma.h +0 -111
  626. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  627. scipy/special/xsf/cephes/shichi.h +0 -248
  628. scipy/special/xsf/cephes/sici.h +0 -224
  629. scipy/special/xsf/cephes/sindg.h +0 -221
  630. scipy/special/xsf/cephes/tandg.h +0 -139
  631. scipy/special/xsf/cephes/trig.h +0 -58
  632. scipy/special/xsf/cephes/unity.h +0 -186
  633. scipy/special/xsf/cephes/zeta.h +0 -172
  634. scipy/special/xsf/config.h +0 -304
  635. scipy/special/xsf/digamma.h +0 -205
  636. scipy/special/xsf/error.h +0 -57
  637. scipy/special/xsf/evalpoly.h +0 -47
  638. scipy/special/xsf/expint.h +0 -266
  639. scipy/special/xsf/hyp2f1.h +0 -694
  640. scipy/special/xsf/iv_ratio.h +0 -173
  641. scipy/special/xsf/lambertw.h +0 -150
  642. scipy/special/xsf/loggamma.h +0 -163
  643. scipy/special/xsf/sici.h +0 -200
  644. scipy/special/xsf/tools.h +0 -427
  645. scipy/special/xsf/trig.h +0 -164
  646. scipy/special/xsf/wright_bessel.h +0 -843
  647. scipy/special/xsf/zlog1.h +0 -35
  648. scipy/stats/_mvn.cpython-313t-aarch64-linux-musl.so +0 -0
  649. scipy.libs/libgcc_s-7393e603.so.1 +0 -0
  650. scipy.libs/libgfortran-eb933d8e.so.5.0.0 +0 -0
  651. {scipy-1.15.2.dist-info → scipy-1.16.0.dist-info}/WHEEL +0 -0
@@ -1,17 +1,21 @@
1
1
  import math
2
2
 
3
3
  import numpy as np
4
- from numpy.testing import assert_allclose, assert_, assert_array_equal
5
- import pytest
4
+ from numpy.testing import assert_allclose, assert_array_almost_equal
6
5
 
7
- from scipy.optimize import fmin_cobyla, minimize, Bounds
6
+ from scipy.optimize import (
7
+ fmin_cobyla, minimize, Bounds, NonlinearConstraint, LinearConstraint,
8
+ OptimizeResult
9
+ )
8
10
 
9
11
 
10
12
  class TestCobyla:
11
13
  def setup_method(self):
12
- self.x0 = [4.95, 0.66]
14
+ # The algorithm is very fragile on 32 bit, so unfortunately we need to start
15
+ # very near the solution in order for the test to pass.
16
+ self.x0 = [np.sqrt(25 - (2.0/3)**2), 2.0/3 + 1e-4]
13
17
  self.solution = [math.sqrt(25 - (2.0/3)**2), 2.0/3]
14
- self.opts = {'disp': False, 'rhobeg': 1, 'tol': 1e-5,
18
+ self.opts = {'disp': 0, 'rhobeg': 1, 'tol': 1e-6,
15
19
  'maxiter': 100}
16
20
 
17
21
  def fun(self, x):
@@ -23,11 +27,10 @@ class TestCobyla:
23
27
  def con2(self, x):
24
28
  return -self.con1(x)
25
29
 
26
- @pytest.mark.xslow(True, reason='not slow, but noisy so only run rarely')
27
- def test_simple(self, capfd):
30
+ def test_simple(self):
28
31
  # use disp=True as smoke test for gh-8118
29
32
  x = fmin_cobyla(self.fun, self.x0, [self.con1, self.con2], rhobeg=1,
30
- rhoend=1e-5, maxfun=100, disp=True)
33
+ rhoend=1e-5, maxfun=100, disp=1)
31
34
  assert_allclose(x, self.solution, atol=1e-4)
32
35
 
33
36
  def test_minimize_simple(self):
@@ -40,54 +43,80 @@ class TestCobyla:
40
43
  self.n_calls += 1
41
44
  self.last_x = x
42
45
 
46
+ class CallbackNewSyntax:
47
+ def __init__(self):
48
+ self.n_calls = 0
49
+
50
+ def __call__(self, intermediate_result):
51
+ assert isinstance(intermediate_result, OptimizeResult)
52
+ self.n_calls += 1
53
+
43
54
  callback = Callback()
55
+ callback_new_syntax = CallbackNewSyntax()
44
56
 
45
57
  # Minimize with method='COBYLA'
46
- cons = ({'type': 'ineq', 'fun': self.con1},
58
+ cons = (NonlinearConstraint(self.con1, 0, np.inf),
47
59
  {'type': 'ineq', 'fun': self.con2})
48
60
  sol = minimize(self.fun, self.x0, method='cobyla', constraints=cons,
49
61
  callback=callback, options=self.opts)
62
+ sol_new = minimize(self.fun, self.x0, method='cobyla', constraints=cons,
63
+ callback=callback_new_syntax, options=self.opts)
50
64
  assert_allclose(sol.x, self.solution, atol=1e-4)
51
- assert_(sol.success, sol.message)
52
- assert_(sol.maxcv < 1e-5, sol)
53
- assert_(sol.nfev < 70, sol)
54
- assert_(sol.fun < self.fun(self.solution) + 1e-3, sol)
55
- assert_(sol.nfev == callback.n_calls,
56
- "Callback is not called exactly once for every function eval.")
57
- assert_array_equal(
65
+ assert sol.success, sol.message
66
+ assert sol.maxcv < 1e-5, sol
67
+ assert sol.nfev < 70, sol
68
+ assert sol.fun < self.fun(self.solution) + 1e-3, sol
69
+ assert_array_almost_equal(
58
70
  sol.x,
59
71
  callback.last_x,
60
- "Last design vector sent to the callback is not equal to returned value.",
72
+ decimal=5,
73
+ err_msg="Last design vector sent to the callback is not equal to"
74
+ " returned value.",
61
75
  )
76
+ assert sol_new.success, sol_new.message
77
+ assert sol.fun == sol_new.fun
78
+ assert sol.maxcv == sol_new.maxcv
79
+ assert sol.nfev == sol_new.nfev
80
+ assert callback.n_calls == callback_new_syntax.n_calls, \
81
+ "Callback is not called the same amount of times for old and new syntax."
62
82
 
63
83
  def test_minimize_constraint_violation(self):
64
- rng = np.random.RandomState(1234)
65
- pb = rng.rand(10, 10)
66
- spread = rng.rand(10)
67
-
68
- def p(w):
69
- return pb.dot(w)
70
-
71
- def f(w):
72
- return -(w * spread).sum()
73
-
74
- def c1(w):
75
- return 500 - abs(p(w)).sum()
76
-
77
- def c2(w):
78
- return 5 - abs(p(w).sum())
79
-
80
- def c3(w):
81
- return 5 - abs(p(w)).max()
82
-
83
- cons = ({'type': 'ineq', 'fun': c1},
84
- {'type': 'ineq', 'fun': c2},
85
- {'type': 'ineq', 'fun': c3})
86
- w0 = np.zeros((10,))
87
- sol = minimize(f, w0, method='cobyla', constraints=cons,
88
- options={'catol': 1e-6})
89
- assert_(sol.maxcv > 1e-6)
90
- assert_(not sol.success)
84
+ # We set up conflicting constraints so that the algorithm will be
85
+ # guaranteed to end up with maxcv > 0.
86
+ cons = ({'type': 'ineq', 'fun': lambda x: 4 - x},
87
+ {'type': 'ineq', 'fun': lambda x: x - 5})
88
+ sol = minimize(lambda x: x, [0], method='cobyla', constraints=cons,
89
+ options={'catol': 0.6})
90
+ assert sol.maxcv > 0.1
91
+ assert sol.success
92
+ sol = minimize(lambda x: x, [0], method='cobyla', constraints=cons,
93
+ options={'catol': 0.4})
94
+ assert sol.maxcv > 0.1
95
+ assert not sol.success
96
+
97
+ def test_f_target(self):
98
+ f_target = 250
99
+ sol = minimize(lambda x: x**2, [500], method='cobyla',
100
+ options={'f_target': f_target})
101
+ assert sol.status == 1
102
+ assert sol.success
103
+ assert sol.fun <= f_target
104
+
105
+ def test_minimize_linear_constraints(self):
106
+ constraints = LinearConstraint([1.0, 1.0], 1.0, 1.0)
107
+ sol = minimize(
108
+ self.fun,
109
+ self.x0,
110
+ method='cobyla',
111
+ constraints=constraints,
112
+ options=self.opts,
113
+ )
114
+ solution = [(4 - np.sqrt(7)) / 3, (np.sqrt(7) - 1) / 3]
115
+ assert_allclose(sol.x, solution, atol=1e-4)
116
+ assert sol.success, sol.message
117
+ assert sol.maxcv < 1e-8, sol
118
+ assert sol.nfev <= 100, sol
119
+ assert sol.fun < self.fun(solution) + 1e-3, sol
91
120
 
92
121
 
93
122
  def test_vector_constraints():
@@ -124,7 +153,7 @@ def test_vector_constraints():
124
153
  constraints = [{'type': 'ineq', 'fun': cons} for cons in cons_list]
125
154
  sol = minimize(fun, x0, constraints=constraints, tol=1e-5)
126
155
  assert_allclose(sol.x, xsol, atol=1e-4)
127
- assert_(sol.success, sol.message)
156
+ assert sol.success, sol.message
128
157
  assert_allclose(sol.fun, fsol, atol=1e-4)
129
158
 
130
159
  constraints = {'type': 'ineq', 'fun': fmin}
@@ -97,7 +97,7 @@ def test_prepare_constraint_infeasible_x0():
97
97
  return A
98
98
 
99
99
  def hess(x, v):
100
- return sps.csr_matrix((4, 4))
100
+ return sps.csr_array((4, 4))
101
101
 
102
102
  nonlinear = NonlinearConstraint(fun, -np.inf, 0, jac, hess,
103
103
  enforce_feasibility)
@@ -5,7 +5,8 @@ from numpy.testing import (TestCase, assert_array_almost_equal,
5
5
  assert_array_equal, assert_, assert_allclose,
6
6
  assert_equal)
7
7
  from scipy._lib._gcutils import assert_deallocated
8
- from scipy.sparse import csr_matrix
8
+ from scipy._lib._util import MapWrapper
9
+ from scipy.sparse import csr_array
9
10
  from scipy.sparse.linalg import LinearOperator
10
11
  from scipy.optimize._differentiable_functions import (ScalarFunction,
11
12
  VectorFunction,
@@ -130,6 +131,67 @@ class TestScalarFunction(TestCase):
130
131
  assert_array_almost_equal(f_analit, f_approx)
131
132
  assert_array_almost_equal(g_analit, g_approx)
132
133
 
134
+ @pytest.mark.fail_slow(5.0)
135
+ def test_workers(self):
136
+ x0 = np.array([2.0, 0.3])
137
+ ex = ExScalarFunction()
138
+ ex2 = ExScalarFunction()
139
+ with MapWrapper(2) as mapper:
140
+ approx = ScalarFunction(ex.fun, x0, (), '2-point',
141
+ ex.hess, None, (-np.inf, np.inf),
142
+ workers=mapper)
143
+ approx_series = ScalarFunction(ex2.fun, x0, (), '2-point',
144
+ ex2.hess, None, (-np.inf, np.inf),
145
+ )
146
+ assert_allclose(approx.grad(x0), ex.grad(x0))
147
+ assert_allclose(approx_series.grad(x0), ex.grad(x0))
148
+ assert_allclose(approx_series.hess(x0), ex.hess(x0))
149
+ assert_allclose(approx.hess(x0), ex.hess(x0))
150
+ assert_equal(approx.nfev, approx_series.nfev)
151
+ assert_equal(approx_series.nfev, ex2.nfev)
152
+ assert_equal(approx.ngev, approx_series.ngev)
153
+ assert_equal(approx.nhev, approx_series.nhev)
154
+ assert_equal(approx_series.nhev, ex2.nhev)
155
+
156
+ ex = ExScalarFunction()
157
+ ex2 = ExScalarFunction()
158
+ approx = ScalarFunction(ex.fun, x0, (), '3-point',
159
+ ex.hess, None, (-np.inf, np.inf),
160
+ workers=mapper)
161
+ approx_series = ScalarFunction(ex2.fun, x0, (), '3-point',
162
+ ex2.hess, None, (-np.inf, np.inf),
163
+ )
164
+ assert_allclose(approx.grad(x0), ex.grad(x0))
165
+ assert_allclose(approx_series.grad(x0), ex.grad(x0))
166
+ assert_allclose(approx_series.hess(x0), ex.hess(x0))
167
+ assert_allclose(approx.hess(x0), ex.hess(x0))
168
+ assert_equal(approx.nfev, approx_series.nfev)
169
+ assert_equal(approx_series.nfev, ex2.nfev)
170
+ assert_equal(approx.ngev, approx_series.ngev)
171
+ assert_equal(approx.nhev, approx_series.nhev)
172
+ assert_equal(approx_series.nhev, ex2.nhev)
173
+
174
+ ex = ExScalarFunction()
175
+ ex2 = ExScalarFunction()
176
+ x1 = np.array([3.0, 4.0])
177
+
178
+ approx = ScalarFunction(ex.fun, x0, (), ex.grad,
179
+ '3-point', None, (-np.inf, np.inf),
180
+ workers=mapper)
181
+ approx_series = ScalarFunction(ex2.fun, x0, (), ex2.grad,
182
+ '3-point', None, (-np.inf, np.inf),
183
+ )
184
+ assert_allclose(approx.grad(x1), ex.grad(x1))
185
+ assert_allclose(approx_series.grad(x1), ex.grad(x1))
186
+ approx_series.hess(x1)
187
+ approx.hess(x1)
188
+ assert_equal(approx.nfev, approx_series.nfev)
189
+ assert_equal(approx_series.nfev, ex2.nfev)
190
+ assert_equal(approx.ngev, approx_series.ngev)
191
+ assert_equal(approx_series.ngev, ex2.ngev)
192
+ assert_equal(approx.nhev, approx_series.nhev)
193
+ assert_equal(approx_series.nhev, ex2.nhev)
194
+
133
195
  def test_fun_and_grad(self):
134
196
  ex = ExScalarFunction()
135
197
 
@@ -419,8 +481,9 @@ class TestVectorialFunction(TestCase):
419
481
  assert_array_equal(analit.nfev, nfev)
420
482
  assert_array_equal(ex.njev, njev)
421
483
  assert_array_equal(analit.njev, njev)
422
- approx = VectorFunction(ex.fun, x0, '2-point', ex.hess, None, None,
423
- (-np.inf, np.inf), None)
484
+ # create with defaults for the keyword arguments, to
485
+ # ensure that the defaults work
486
+ approx = VectorFunction(ex.fun, x0, '2-point', ex.hess)
424
487
  nfev += 3
425
488
  assert_array_equal(ex.nfev, nfev)
426
489
  assert_array_equal(analit.nfev+approx.nfev, nfev)
@@ -501,6 +564,94 @@ class TestVectorialFunction(TestCase):
501
564
  assert_array_almost_equal(f_analit, f_approx)
502
565
  assert_array_almost_equal(J_analit, J_approx)
503
566
 
567
+ def test_updating_on_initial_setup(self):
568
+ # Check that memoisation works with the freshly created VectorFunction
569
+ # On initialization vf.f_updated attribute wasn't being set correctly.
570
+ x0 = np.array([2.5, 3.0])
571
+ ex = ExVectorialFunction()
572
+ vf = VectorFunction(ex.fun, x0, ex.jac, ex.hess)
573
+ assert vf.f_updated
574
+ assert vf.nfev == 1
575
+ assert vf.njev == 1
576
+ assert ex.nfev == 1
577
+ assert ex.njev == 1
578
+ vf.fun(x0)
579
+ vf.jac(x0)
580
+ assert vf.nfev == 1
581
+ assert vf.njev == 1
582
+ assert ex.nfev == 1
583
+ assert ex.njev == 1
584
+
585
+ @pytest.mark.fail_slow(5.0)
586
+ def test_workers(self):
587
+ x0 = np.array([2.5, 3.0])
588
+ ex = ExVectorialFunction()
589
+ ex2 = ExVectorialFunction()
590
+ v = np.array([1.0, 2.0])
591
+
592
+ with MapWrapper(2) as mapper:
593
+ approx = VectorFunction(ex.fun, x0, '2-point',
594
+ ex.hess, None, None, (-np.inf, np.inf),
595
+ False, workers=mapper)
596
+ approx_series = VectorFunction(ex2.fun, x0, '2-point',
597
+ ex2.hess, None, None, (-np.inf, np.inf),
598
+ False)
599
+
600
+ assert_allclose(approx.jac(x0), ex.jac(x0))
601
+ assert_allclose(approx_series.jac(x0), ex.jac(x0))
602
+ assert_allclose(approx_series.hess(x0, v), ex.hess(x0, v))
603
+ assert_allclose(approx.hess(x0, v), ex.hess(x0, v))
604
+ assert_equal(approx.nfev, approx_series.nfev)
605
+ assert_equal(approx_series.nfev, ex2.nfev)
606
+ assert_equal(approx.njev, approx_series.njev)
607
+ assert_equal(approx.nhev, approx_series.nhev)
608
+ assert_equal(approx_series.nhev, ex2.nhev)
609
+
610
+ ex.nfev = ex.njev = ex.nhev = 0
611
+ ex2.nfev = ex2.njev = ex2.nhev = 0
612
+ approx = VectorFunction(ex.fun, x0, '3-point',
613
+ ex.hess, None, None, (-np.inf, np.inf),
614
+ False, workers=mapper)
615
+ approx_series = VectorFunction(ex2.fun, x0, '3-point',
616
+ ex2.hess, None, None, (-np.inf, np.inf),
617
+ False)
618
+ assert_allclose(approx.jac(x0), ex.jac(x0))
619
+ assert_allclose(approx_series.jac(x0), ex.jac(x0))
620
+ assert_allclose(approx_series.hess(x0, v), ex.hess(x0, v))
621
+ assert_allclose(approx.hess(x0, v), ex.hess(x0, v))
622
+
623
+ assert_equal(approx.nfev, approx_series.nfev)
624
+ assert_equal(approx_series.nfev, ex2.nfev)
625
+ assert_equal(approx.njev, approx_series.njev)
626
+ assert_equal(approx.nhev, approx_series.nhev)
627
+ assert_equal(approx_series.nhev, ex2.nhev)
628
+
629
+ # The following tests are somewhat redundant because the LinearOperator
630
+ # produced by VectorFunction.hess does not use any parallelisation.
631
+ # The tests are left for completeness, in case that situation changes.
632
+ ex.nfev = ex.njev = ex.nhev = 0
633
+ ex2.nfev = ex2.njev = ex2.nhev = 0
634
+ approx = VectorFunction(ex.fun, x0, ex.jac,
635
+ '2-point', None, None, (-np.inf, np.inf),
636
+ False, workers=mapper)
637
+ approx_series = VectorFunction(ex2.fun, x0, ex2.jac,
638
+ '2-point', None, None, (-np.inf, np.inf),
639
+ False)
640
+ assert_allclose(approx.jac(x0), ex.jac(x0))
641
+ assert_allclose(approx_series.jac(x0), ex.jac(x0))
642
+
643
+ H_analit = ex2.hess(x0, v)
644
+ H_approx_series = approx_series.hess(x0, v)
645
+ H_approx = approx.hess(x0, v)
646
+ x = [5, 2.0]
647
+ assert_allclose(H_approx.dot(x), H_analit.dot(x))
648
+ assert_allclose(H_approx_series.dot(x), H_analit.dot(x))
649
+
650
+ assert_equal(approx.nfev, approx_series.nfev)
651
+ assert_equal(approx_series.nfev, ex2.nfev)
652
+ assert_equal(approx.njev, approx_series.njev)
653
+ assert_equal(approx.nhev, approx_series.nhev)
654
+
504
655
  def test_finite_difference_hess_linear_operator(self):
505
656
  ex = ExVectorialFunction()
506
657
  nfev = 0
@@ -629,6 +780,38 @@ class TestVectorialFunction(TestCase):
629
780
  assert_array_equal(ex.nhev, nhev)
630
781
  assert_array_equal(analit.nhev+approx.nhev, nhev)
631
782
 
783
+ # Test VectorFunction.hess_wrapped with J0=None
784
+ x = np.array([1.5, 0.5])
785
+ v = np.array([1.0, 2.0])
786
+ njev_before = approx.hess_wrapped.njev
787
+ H = approx.hess_wrapped(x, v, J0=None)
788
+ assert isinstance(H, LinearOperator)
789
+ # The njev counter should be incremented by exactly 1
790
+ assert approx.hess_wrapped.njev == njev_before + 1
791
+
792
+ def test_fgh_overlap(self):
793
+ # VectorFunction.fun/jac should return copies to internal attributes
794
+ ex = ExVectorialFunction()
795
+ x0 = np.array([1.0, 0.0])
796
+
797
+ vf = VectorFunction(ex.fun, x0, '3-point', ex.hess, None, None,
798
+ (-np.inf, np.inf), None)
799
+ f = vf.fun(np.array([1.1, 0.1]))
800
+ J = vf.jac([1.1, 0.1])
801
+ assert vf.f is not f
802
+ assert vf.J is not J
803
+ assert_equal(f, vf.f)
804
+ assert_equal(J, vf.J)
805
+
806
+ vf = VectorFunction(ex.fun, x0, ex.jac, ex.hess, None, None,
807
+ (-np.inf, np.inf), None)
808
+ f = vf.fun(np.array([1.1, 0.1]))
809
+ J = vf.jac([1.1, 0.1])
810
+ assert vf.f is not f
811
+ assert vf.J is not J
812
+ assert_equal(f, vf.f)
813
+ assert_equal(J, vf.J)
814
+
632
815
  @pytest.mark.thread_unsafe
633
816
  def test_x_storage_overlap(self):
634
817
  # VectorFunction should not store references to arrays, it should
@@ -686,6 +869,44 @@ class TestVectorialFunction(TestCase):
686
869
  res = vf.jac(x0)
687
870
  assert res.dtype == np.float32
688
871
 
872
+ def test_sparse_analytic_jac(self):
873
+ ex = ExVectorialFunction()
874
+ x0 = np.array([1.0, 0.0])
875
+ def sparse_adapter(func):
876
+ def inner(x):
877
+ f_x = func(x)
878
+ return csr_array(f_x)
879
+ return inner
880
+
881
+ # jac(x) returns dense jacobian
882
+ vf1 = VectorFunction(ex.fun, x0, ex.jac, ex.hess, None, None,
883
+ (-np.inf, np.inf), sparse_jacobian=None)
884
+ # jac(x) returns sparse jacobian, but sparse_jacobian=False requests dense
885
+ vf2 = VectorFunction(ex.fun, x0, sparse_adapter(ex.jac), ex.hess, None, None,
886
+ (-np.inf, np.inf), sparse_jacobian=False)
887
+
888
+ res1 = vf1.jac(x0 + 1)
889
+ res2 = vf2.jac(x0 + 1)
890
+ assert_equal(res1, res2)
891
+
892
+ def test_sparse_numerical_jac(self):
893
+ ex = ExVectorialFunction()
894
+ x0 = np.array([1.0, 0.0])
895
+ N = len(x0)
896
+
897
+ # normal dense numerical difference
898
+ vf1 = VectorFunction(ex.fun, x0, '2-point', ex.hess, None, None,
899
+ (-np.inf, np.inf), sparse_jacobian=None)
900
+ # use sparse numerical difference, but ask it to be converted to dense
901
+ finite_diff_jac_sparsity = csr_array(np.ones((N, N)))
902
+ vf2 = VectorFunction(ex.fun, x0, '2-point', ex.hess, None,
903
+ finite_diff_jac_sparsity, (-np.inf, np.inf),
904
+ sparse_jacobian=False)
905
+
906
+ res1 = vf1.jac(x0 + 1)
907
+ res2 = vf2.jac(x0 + 1)
908
+ assert_equal(res1, res2)
909
+
689
910
 
690
911
  def test_LinearVectorFunction():
691
912
  A_dense = np.array([
@@ -693,7 +914,7 @@ def test_LinearVectorFunction():
693
914
  [0, 4, 2]
694
915
  ])
695
916
  x0 = np.zeros(3)
696
- A_sparse = csr_matrix(A_dense)
917
+ A_sparse = csr_array(A_dense)
697
918
  x = np.array([1, -1, 0])
698
919
  v = np.array([-1, 1])
699
920
  Ax = np.array([-3, -4])
@@ -779,7 +1000,6 @@ def test_ScalarFunctionNoReferenceCycle():
779
1000
  platform.python_implementation() == "PyPy",
780
1001
  reason="assert_deallocate not available on PyPy"
781
1002
  )
782
- @pytest.mark.xfail(reason="TODO remove reference cycle from VectorFunction")
783
1003
  def test_VectorFunctionNoReferenceCycle():
784
1004
  """Regression test for gh-20768."""
785
1005
  ex = ExVectorialFunction()
@@ -800,6 +1020,6 @@ def test_LinearVectorFunctionNoReferenceCycle():
800
1020
  [0, 4, 2]
801
1021
  ])
802
1022
  x0 = np.zeros(3)
803
- A_sparse = csr_matrix(A_dense)
1023
+ A_sparse = csr_array(A_dense)
804
1024
  with assert_deallocated(lambda: LinearVectorFunction(A_sparse, x0, None)):
805
1025
  pass
@@ -41,3 +41,25 @@ def test_2():
41
41
  assert_allclose(H1, result2.hess_inv, rtol=1e-2, atol=0.03)
42
42
 
43
43
 
44
+ def test_3():
45
+
46
+ def todense_old_impl(self):
47
+ s, y, n_corrs, rho = self.sk, self.yk, self.n_corrs, self.rho
48
+ I_arr = np.eye(*self.shape, dtype=self.dtype)
49
+ Hk = I_arr
50
+
51
+ for i in range(n_corrs):
52
+ A1 = I_arr - s[i][:, np.newaxis] * y[i][np.newaxis, :] * rho[i]
53
+ A2 = I_arr - y[i][:, np.newaxis] * s[i][np.newaxis, :] * rho[i]
54
+
55
+ Hk = np.dot(A1, np.dot(Hk, A2)) + (rho[i] * s[i][:, np.newaxis] *
56
+ s[i][np.newaxis, :])
57
+ return Hk
58
+
59
+ H0 = [[3, 0], [1, 2]]
60
+
61
+ def f(x):
62
+ return np.dot(x, np.dot(scipy.linalg.inv(H0), x))
63
+
64
+ result1 = minimize(fun=f, method='L-BFGS-B', x0=[10, 20])
65
+ assert_allclose(result1.hess_inv.todense(), todense_old_impl(result1.hess_inv))