scipy 1.15.3__cp313-cp313t-macosx_14_0_arm64.whl → 1.16.0rc2__cp313-cp313t-macosx_14_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (627) hide show
  1. scipy/__config__.py +3 -3
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cpython-313t-darwin.so +0 -0
  4. scipy/_lib/_array_api.py +486 -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-darwin.so +0 -0
  8. scipy/_lib/_docscrape.py +1 -1
  9. scipy/_lib/_elementwise_iterative_method.py +15 -26
  10. scipy/_lib/_sparse.py +41 -0
  11. scipy/_lib/_test_deprecation_call.cpython-313t-darwin.so +0 -0
  12. scipy/_lib/_testutils.py +6 -2
  13. scipy/_lib/_util.py +222 -125
  14. scipy/_lib/array_api_compat/__init__.py +4 -4
  15. scipy/_lib/array_api_compat/_internal.py +19 -6
  16. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  17. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  18. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  19. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  20. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  21. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  22. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  23. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  24. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  25. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  26. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  27. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  28. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  29. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  30. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  31. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  32. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  33. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  34. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  35. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  36. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  37. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  38. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  39. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  40. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  41. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  42. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  43. scipy/_lib/array_api_extra/__init__.py +26 -3
  44. scipy/_lib/array_api_extra/_delegation.py +171 -0
  45. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  46. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  47. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  48. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  49. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  50. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  51. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  52. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  53. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  54. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  57. scipy/_lib/array_api_extra/testing.py +359 -0
  58. scipy/_lib/decorator.py +2 -2
  59. scipy/_lib/doccer.py +1 -7
  60. scipy/_lib/messagestream.cpython-313t-darwin.so +0 -0
  61. scipy/_lib/pyprima/__init__.py +212 -0
  62. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  63. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  64. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  65. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  66. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  67. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  68. scipy/_lib/pyprima/cobyla/update.py +289 -0
  69. scipy/_lib/pyprima/common/__init__.py +0 -0
  70. scipy/_lib/pyprima/common/_bounds.py +34 -0
  71. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  72. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  73. scipy/_lib/pyprima/common/_project.py +173 -0
  74. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  75. scipy/_lib/pyprima/common/consts.py +47 -0
  76. scipy/_lib/pyprima/common/evaluate.py +99 -0
  77. scipy/_lib/pyprima/common/history.py +38 -0
  78. scipy/_lib/pyprima/common/infos.py +30 -0
  79. scipy/_lib/pyprima/common/linalg.py +435 -0
  80. scipy/_lib/pyprima/common/message.py +290 -0
  81. scipy/_lib/pyprima/common/powalg.py +131 -0
  82. scipy/_lib/pyprima/common/preproc.py +277 -0
  83. scipy/_lib/pyprima/common/present.py +5 -0
  84. scipy/_lib/pyprima/common/ratio.py +54 -0
  85. scipy/_lib/pyprima/common/redrho.py +47 -0
  86. scipy/_lib/pyprima/common/selectx.py +296 -0
  87. scipy/_lib/tests/test__util.py +105 -121
  88. scipy/_lib/tests/test_array_api.py +166 -35
  89. scipy/_lib/tests/test_bunch.py +7 -0
  90. scipy/_lib/tests/test_ccallback.py +2 -10
  91. scipy/_lib/tests/test_public_api.py +13 -0
  92. scipy/cluster/_hierarchy.cpython-313t-darwin.so +0 -0
  93. scipy/cluster/_optimal_leaf_ordering.cpython-313t-darwin.so +0 -0
  94. scipy/cluster/_vq.cpython-313t-darwin.so +0 -0
  95. scipy/cluster/hierarchy.py +393 -223
  96. scipy/cluster/tests/test_hierarchy.py +273 -335
  97. scipy/cluster/tests/test_vq.py +45 -61
  98. scipy/cluster/vq.py +39 -35
  99. scipy/conftest.py +263 -157
  100. scipy/constants/_constants.py +4 -1
  101. scipy/constants/tests/test_codata.py +2 -2
  102. scipy/constants/tests/test_constants.py +11 -18
  103. scipy/datasets/_download_all.py +15 -1
  104. scipy/datasets/_fetchers.py +7 -1
  105. scipy/datasets/_utils.py +1 -1
  106. scipy/differentiate/_differentiate.py +25 -25
  107. scipy/differentiate/tests/test_differentiate.py +24 -25
  108. scipy/fft/_basic.py +20 -0
  109. scipy/fft/_helper.py +3 -34
  110. scipy/fft/_pocketfft/helper.py +29 -1
  111. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  112. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  113. scipy/fft/_realtransforms.py +13 -0
  114. scipy/fft/tests/test_basic.py +27 -25
  115. scipy/fft/tests/test_fftlog.py +16 -7
  116. scipy/fft/tests/test_helper.py +18 -34
  117. scipy/fft/tests/test_real_transforms.py +8 -10
  118. scipy/fftpack/convolve.cpython-313t-darwin.so +0 -0
  119. scipy/fftpack/tests/test_basic.py +2 -4
  120. scipy/fftpack/tests/test_real_transforms.py +8 -9
  121. scipy/integrate/_bvp.py +9 -3
  122. scipy/integrate/_cubature.py +3 -2
  123. scipy/integrate/_dop.cpython-313t-darwin.so +0 -0
  124. scipy/integrate/_lsoda.cpython-313t-darwin.so +0 -0
  125. scipy/integrate/_ode.py +9 -2
  126. scipy/integrate/_odepack.cpython-313t-darwin.so +0 -0
  127. scipy/integrate/_quad_vec.py +21 -29
  128. scipy/integrate/_quadpack.cpython-313t-darwin.so +0 -0
  129. scipy/integrate/_quadpack_py.py +11 -7
  130. scipy/integrate/_quadrature.py +3 -3
  131. scipy/integrate/_rules/_base.py +2 -2
  132. scipy/integrate/_tanhsinh.py +48 -47
  133. scipy/integrate/_test_odeint_banded.cpython-313t-darwin.so +0 -0
  134. scipy/integrate/_vode.cpython-313t-darwin.so +0 -0
  135. scipy/integrate/tests/test__quad_vec.py +0 -6
  136. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  137. scipy/integrate/tests/test_cubature.py +21 -35
  138. scipy/integrate/tests/test_quadrature.py +6 -8
  139. scipy/integrate/tests/test_tanhsinh.py +56 -48
  140. scipy/interpolate/__init__.py +70 -58
  141. scipy/interpolate/_bary_rational.py +22 -22
  142. scipy/interpolate/_bsplines.py +119 -66
  143. scipy/interpolate/_cubic.py +65 -50
  144. scipy/interpolate/_dfitpack.cpython-313t-darwin.so +0 -0
  145. scipy/interpolate/_dierckx.cpython-313t-darwin.so +0 -0
  146. scipy/interpolate/_fitpack.cpython-313t-darwin.so +0 -0
  147. scipy/interpolate/_fitpack2.py +9 -6
  148. scipy/interpolate/_fitpack_impl.py +32 -26
  149. scipy/interpolate/_fitpack_repro.py +23 -19
  150. scipy/interpolate/_interpnd.cpython-313t-darwin.so +0 -0
  151. scipy/interpolate/_interpolate.py +30 -12
  152. scipy/interpolate/_ndbspline.py +13 -18
  153. scipy/interpolate/_ndgriddata.py +5 -8
  154. scipy/interpolate/_polyint.py +95 -31
  155. scipy/interpolate/_ppoly.cpython-313t-darwin.so +0 -0
  156. scipy/interpolate/_rbf.py +2 -2
  157. scipy/interpolate/_rbfinterp.py +1 -1
  158. scipy/interpolate/_rbfinterp_pythran.cpython-313t-darwin.so +0 -0
  159. scipy/interpolate/_rgi.py +31 -26
  160. scipy/interpolate/_rgi_cython.cpython-313t-darwin.so +0 -0
  161. scipy/interpolate/dfitpack.py +0 -20
  162. scipy/interpolate/interpnd.py +1 -2
  163. scipy/interpolate/tests/test_bary_rational.py +2 -2
  164. scipy/interpolate/tests/test_bsplines.py +97 -1
  165. scipy/interpolate/tests/test_fitpack2.py +39 -1
  166. scipy/interpolate/tests/test_interpnd.py +32 -20
  167. scipy/interpolate/tests/test_interpolate.py +48 -4
  168. scipy/interpolate/tests/test_rgi.py +2 -1
  169. scipy/io/_fast_matrix_market/__init__.py +2 -0
  170. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  171. scipy/io/_harwell_boeing/hb.py +7 -11
  172. scipy/io/_idl.py +5 -7
  173. scipy/io/_netcdf.py +15 -5
  174. scipy/io/_test_fortran.cpython-313t-darwin.so +0 -0
  175. scipy/io/arff/tests/test_arffread.py +3 -3
  176. scipy/io/matlab/__init__.py +5 -3
  177. scipy/io/matlab/_mio.py +4 -1
  178. scipy/io/matlab/_mio5.py +19 -13
  179. scipy/io/matlab/_mio5_utils.cpython-313t-darwin.so +0 -0
  180. scipy/io/matlab/_mio_utils.cpython-313t-darwin.so +0 -0
  181. scipy/io/matlab/_miobase.py +4 -1
  182. scipy/io/matlab/_streams.cpython-313t-darwin.so +0 -0
  183. scipy/io/matlab/tests/test_mio.py +46 -18
  184. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  185. scipy/io/tests/test_mmio.py +7 -1
  186. scipy/io/tests/test_wavfile.py +41 -0
  187. scipy/io/wavfile.py +57 -10
  188. scipy/linalg/_basic.py +113 -86
  189. scipy/linalg/_cythonized_array_utils.cpython-313t-darwin.so +0 -0
  190. scipy/linalg/_decomp.py +22 -9
  191. scipy/linalg/_decomp_cholesky.py +28 -13
  192. scipy/linalg/_decomp_cossin.py +45 -30
  193. scipy/linalg/_decomp_interpolative.cpython-313t-darwin.so +0 -0
  194. scipy/linalg/_decomp_ldl.py +4 -1
  195. scipy/linalg/_decomp_lu.py +18 -6
  196. scipy/linalg/_decomp_lu_cython.cpython-313t-darwin.so +0 -0
  197. scipy/linalg/_decomp_polar.py +2 -0
  198. scipy/linalg/_decomp_qr.py +6 -2
  199. scipy/linalg/_decomp_qz.py +3 -0
  200. scipy/linalg/_decomp_schur.py +3 -1
  201. scipy/linalg/_decomp_svd.py +13 -2
  202. scipy/linalg/_decomp_update.cpython-313t-darwin.so +0 -0
  203. scipy/linalg/_expm_frechet.py +4 -0
  204. scipy/linalg/_fblas.cpython-313t-darwin.so +0 -0
  205. scipy/linalg/_flapack.cpython-313t-darwin.so +0 -0
  206. scipy/linalg/_linalg_pythran.cpython-313t-darwin.so +0 -0
  207. scipy/linalg/_matfuncs.py +187 -4
  208. scipy/linalg/_matfuncs_expm.cpython-313t-darwin.so +0 -0
  209. scipy/linalg/_matfuncs_schur_sqrtm.cpython-313t-darwin.so +0 -0
  210. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  211. scipy/linalg/_matfuncs_sqrtm_triu.cpython-313t-darwin.so +0 -0
  212. scipy/linalg/_procrustes.py +2 -0
  213. scipy/linalg/_sketches.py +17 -6
  214. scipy/linalg/_solve_toeplitz.cpython-313t-darwin.so +0 -0
  215. scipy/linalg/_solvers.py +7 -2
  216. scipy/linalg/_special_matrices.py +26 -36
  217. scipy/linalg/cython_blas.cpython-313t-darwin.so +0 -0
  218. scipy/linalg/cython_lapack.cpython-313t-darwin.so +0 -0
  219. scipy/linalg/lapack.py +22 -2
  220. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  221. scipy/linalg/tests/test_basic.py +31 -16
  222. scipy/linalg/tests/test_batch.py +588 -0
  223. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  224. scipy/linalg/tests/test_decomp.py +40 -3
  225. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  226. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  227. scipy/linalg/tests/test_lapack.py +115 -7
  228. scipy/linalg/tests/test_matfuncs.py +157 -102
  229. scipy/linalg/tests/test_procrustes.py +0 -7
  230. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  231. scipy/linalg/tests/test_special_matrices.py +1 -5
  232. scipy/ndimage/__init__.py +1 -0
  233. scipy/ndimage/_cytest.cpython-313t-darwin.so +0 -0
  234. scipy/ndimage/_delegators.py +8 -2
  235. scipy/ndimage/_filters.py +453 -5
  236. scipy/ndimage/_interpolation.py +36 -6
  237. scipy/ndimage/_measurements.py +4 -2
  238. scipy/ndimage/_morphology.py +5 -0
  239. scipy/ndimage/_nd_image.cpython-313t-darwin.so +0 -0
  240. scipy/ndimage/_ni_docstrings.py +5 -1
  241. scipy/ndimage/_ni_label.cpython-313t-darwin.so +0 -0
  242. scipy/ndimage/_ni_support.py +1 -5
  243. scipy/ndimage/_rank_filter_1d.cpython-313t-darwin.so +0 -0
  244. scipy/ndimage/_support_alternative_backends.py +18 -6
  245. scipy/ndimage/tests/test_filters.py +370 -259
  246. scipy/ndimage/tests/test_fourier.py +7 -9
  247. scipy/ndimage/tests/test_interpolation.py +68 -61
  248. scipy/ndimage/tests/test_measurements.py +18 -35
  249. scipy/ndimage/tests/test_morphology.py +143 -131
  250. scipy/ndimage/tests/test_splines.py +1 -3
  251. scipy/odr/__odrpack.cpython-313t-darwin.so +0 -0
  252. scipy/optimize/_basinhopping.py +13 -7
  253. scipy/optimize/_bglu_dense.cpython-313t-darwin.so +0 -0
  254. scipy/optimize/_bracket.py +17 -24
  255. scipy/optimize/_chandrupatla.py +9 -10
  256. scipy/optimize/_cobyla_py.py +104 -123
  257. scipy/optimize/_constraints.py +14 -10
  258. scipy/optimize/_differentiable_functions.py +371 -230
  259. scipy/optimize/_differentialevolution.py +4 -3
  260. scipy/optimize/_direct.cpython-313t-darwin.so +0 -0
  261. scipy/optimize/_dual_annealing.py +1 -1
  262. scipy/optimize/_elementwise.py +1 -4
  263. scipy/optimize/_group_columns.cpython-313t-darwin.so +0 -0
  264. scipy/optimize/_lbfgsb.cpython-313t-darwin.so +0 -0
  265. scipy/optimize/_lbfgsb_py.py +57 -16
  266. scipy/optimize/_linprog_doc.py +2 -2
  267. scipy/optimize/_linprog_highs.py +2 -2
  268. scipy/optimize/_linprog_ip.py +25 -10
  269. scipy/optimize/_linprog_util.py +14 -16
  270. scipy/optimize/_lsap.cpython-313t-darwin.so +0 -0
  271. scipy/optimize/_lsq/common.py +3 -3
  272. scipy/optimize/_lsq/dogbox.py +16 -2
  273. scipy/optimize/_lsq/givens_elimination.cpython-313t-darwin.so +0 -0
  274. scipy/optimize/_lsq/least_squares.py +198 -126
  275. scipy/optimize/_lsq/lsq_linear.py +6 -6
  276. scipy/optimize/_lsq/trf.py +35 -8
  277. scipy/optimize/_milp.py +3 -1
  278. scipy/optimize/_minimize.py +105 -36
  279. scipy/optimize/_minpack.cpython-313t-darwin.so +0 -0
  280. scipy/optimize/_minpack_py.py +21 -14
  281. scipy/optimize/_moduleTNC.cpython-313t-darwin.so +0 -0
  282. scipy/optimize/_nnls.py +20 -21
  283. scipy/optimize/_nonlin.py +34 -3
  284. scipy/optimize/_numdiff.py +288 -110
  285. scipy/optimize/_optimize.py +86 -48
  286. scipy/optimize/_pava_pybind.cpython-313t-darwin.so +0 -0
  287. scipy/optimize/_remove_redundancy.py +5 -5
  288. scipy/optimize/_root_scalar.py +1 -1
  289. scipy/optimize/_shgo.py +6 -0
  290. scipy/optimize/_shgo_lib/_complex.py +1 -1
  291. scipy/optimize/_slsqp_py.py +216 -124
  292. scipy/optimize/_slsqplib.cpython-313t-darwin.so +0 -0
  293. scipy/optimize/_spectral.py +1 -1
  294. scipy/optimize/_tnc.py +8 -1
  295. scipy/optimize/_trlib/_trlib.cpython-313t-darwin.so +0 -0
  296. scipy/optimize/_trustregion.py +20 -6
  297. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  298. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  299. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  300. scipy/optimize/_trustregion_constr/projections.py +12 -8
  301. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  302. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  303. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  304. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  305. scipy/optimize/_trustregion_exact.py +0 -1
  306. scipy/optimize/_zeros.cpython-313t-darwin.so +0 -0
  307. scipy/optimize/_zeros_py.py +97 -17
  308. scipy/optimize/cython_optimize/_zeros.cpython-313t-darwin.so +0 -0
  309. scipy/optimize/slsqp.py +0 -1
  310. scipy/optimize/tests/test__basinhopping.py +1 -1
  311. scipy/optimize/tests/test__differential_evolution.py +4 -4
  312. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  313. scipy/optimize/tests/test__numdiff.py +66 -22
  314. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  315. scipy/optimize/tests/test__shgo.py +9 -1
  316. scipy/optimize/tests/test_bracket.py +36 -46
  317. scipy/optimize/tests/test_chandrupatla.py +133 -135
  318. scipy/optimize/tests/test_cobyla.py +74 -45
  319. scipy/optimize/tests/test_constraints.py +1 -1
  320. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  321. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  322. scipy/optimize/tests/test_least_squares.py +125 -13
  323. scipy/optimize/tests/test_linear_assignment.py +3 -3
  324. scipy/optimize/tests/test_linprog.py +3 -3
  325. scipy/optimize/tests/test_lsq_linear.py +6 -6
  326. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  327. scipy/optimize/tests/test_minpack.py +4 -4
  328. scipy/optimize/tests/test_nnls.py +43 -3
  329. scipy/optimize/tests/test_nonlin.py +36 -0
  330. scipy/optimize/tests/test_optimize.py +95 -17
  331. scipy/optimize/tests/test_slsqp.py +36 -4
  332. scipy/optimize/tests/test_zeros.py +34 -1
  333. scipy/signal/__init__.py +12 -23
  334. scipy/signal/_delegators.py +568 -0
  335. scipy/signal/_filter_design.py +459 -241
  336. scipy/signal/_fir_filter_design.py +262 -90
  337. scipy/signal/_lti_conversion.py +3 -2
  338. scipy/signal/_ltisys.py +118 -91
  339. scipy/signal/_max_len_seq_inner.cpython-313t-darwin.so +0 -0
  340. scipy/signal/_peak_finding_utils.cpython-313t-darwin.so +0 -0
  341. scipy/signal/_polyutils.py +172 -0
  342. scipy/signal/_short_time_fft.py +519 -70
  343. scipy/signal/_signal_api.py +30 -0
  344. scipy/signal/_signaltools.py +719 -399
  345. scipy/signal/_sigtools.cpython-313t-darwin.so +0 -0
  346. scipy/signal/_sosfilt.cpython-313t-darwin.so +0 -0
  347. scipy/signal/_spectral_py.py +230 -50
  348. scipy/signal/_spline.cpython-313t-darwin.so +0 -0
  349. scipy/signal/_spline_filters.py +108 -68
  350. scipy/signal/_support_alternative_backends.py +73 -0
  351. scipy/signal/_upfirdn.py +4 -1
  352. scipy/signal/_upfirdn_apply.cpython-313t-darwin.so +0 -0
  353. scipy/signal/_waveforms.py +2 -11
  354. scipy/signal/_wavelets.py +1 -1
  355. scipy/signal/fir_filter_design.py +1 -0
  356. scipy/signal/spline.py +4 -11
  357. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  358. scipy/signal/tests/test_bsplines.py +114 -79
  359. scipy/signal/tests/test_cont2discrete.py +9 -2
  360. scipy/signal/tests/test_filter_design.py +721 -481
  361. scipy/signal/tests/test_fir_filter_design.py +332 -140
  362. scipy/signal/tests/test_savitzky_golay.py +4 -3
  363. scipy/signal/tests/test_short_time_fft.py +221 -3
  364. scipy/signal/tests/test_signaltools.py +2144 -1348
  365. scipy/signal/tests/test_spectral.py +50 -6
  366. scipy/signal/tests/test_splines.py +161 -96
  367. scipy/signal/tests/test_upfirdn.py +84 -50
  368. scipy/signal/tests/test_waveforms.py +20 -0
  369. scipy/signal/tests/test_windows.py +607 -466
  370. scipy/signal/windows/_windows.py +287 -148
  371. scipy/sparse/__init__.py +23 -4
  372. scipy/sparse/_base.py +270 -108
  373. scipy/sparse/_bsr.py +7 -4
  374. scipy/sparse/_compressed.py +59 -231
  375. scipy/sparse/_construct.py +90 -38
  376. scipy/sparse/_coo.py +115 -181
  377. scipy/sparse/_csc.py +4 -4
  378. scipy/sparse/_csparsetools.cpython-313t-darwin.so +0 -0
  379. scipy/sparse/_csr.py +2 -2
  380. scipy/sparse/_data.py +48 -48
  381. scipy/sparse/_dia.py +105 -18
  382. scipy/sparse/_dok.py +0 -23
  383. scipy/sparse/_index.py +4 -4
  384. scipy/sparse/_matrix.py +23 -0
  385. scipy/sparse/_sparsetools.cpython-313t-darwin.so +0 -0
  386. scipy/sparse/_sputils.py +37 -22
  387. scipy/sparse/base.py +0 -9
  388. scipy/sparse/bsr.py +0 -14
  389. scipy/sparse/compressed.py +0 -23
  390. scipy/sparse/construct.py +0 -6
  391. scipy/sparse/coo.py +0 -14
  392. scipy/sparse/csc.py +0 -3
  393. scipy/sparse/csgraph/_flow.cpython-313t-darwin.so +0 -0
  394. scipy/sparse/csgraph/_matching.cpython-313t-darwin.so +0 -0
  395. scipy/sparse/csgraph/_min_spanning_tree.cpython-313t-darwin.so +0 -0
  396. scipy/sparse/csgraph/_reordering.cpython-313t-darwin.so +0 -0
  397. scipy/sparse/csgraph/_shortest_path.cpython-313t-darwin.so +0 -0
  398. scipy/sparse/csgraph/_tools.cpython-313t-darwin.so +0 -0
  399. scipy/sparse/csgraph/_traversal.cpython-313t-darwin.so +0 -0
  400. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  401. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  402. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  403. scipy/sparse/csr.py +0 -5
  404. scipy/sparse/data.py +1 -6
  405. scipy/sparse/dia.py +0 -7
  406. scipy/sparse/dok.py +0 -10
  407. scipy/sparse/linalg/_dsolve/_superlu.cpython-313t-darwin.so +0 -0
  408. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  409. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  410. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313t-darwin.so +0 -0
  411. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  412. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  413. scipy/sparse/linalg/_interface.py +17 -18
  414. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  415. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  416. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  417. scipy/sparse/linalg/_isolve/minres.py +5 -5
  418. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  419. scipy/sparse/linalg/_isolve/utils.py +2 -8
  420. scipy/sparse/linalg/_matfuncs.py +1 -1
  421. scipy/sparse/linalg/_norm.py +1 -1
  422. scipy/sparse/linalg/_propack/_cpropack.cpython-313t-darwin.so +0 -0
  423. scipy/sparse/linalg/_propack/_dpropack.cpython-313t-darwin.so +0 -0
  424. scipy/sparse/linalg/_propack/_spropack.cpython-313t-darwin.so +0 -0
  425. scipy/sparse/linalg/_propack/_zpropack.cpython-313t-darwin.so +0 -0
  426. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  427. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  428. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  429. scipy/sparse/tests/test_base.py +214 -42
  430. scipy/sparse/tests/test_common1d.py +7 -7
  431. scipy/sparse/tests/test_construct.py +1 -1
  432. scipy/sparse/tests/test_coo.py +272 -4
  433. scipy/sparse/tests/test_sparsetools.py +5 -0
  434. scipy/sparse/tests/test_sputils.py +36 -7
  435. scipy/spatial/_ckdtree.cpython-313t-darwin.so +0 -0
  436. scipy/spatial/_distance_pybind.cpython-313t-darwin.so +0 -0
  437. scipy/spatial/_distance_wrap.cpython-313t-darwin.so +0 -0
  438. scipy/spatial/_hausdorff.cpython-313t-darwin.so +0 -0
  439. scipy/spatial/_qhull.cpython-313t-darwin.so +0 -0
  440. scipy/spatial/_voronoi.cpython-313t-darwin.so +0 -0
  441. scipy/spatial/distance.py +49 -42
  442. scipy/spatial/tests/test_distance.py +15 -1
  443. scipy/spatial/tests/test_kdtree.py +1 -0
  444. scipy/spatial/tests/test_qhull.py +7 -2
  445. scipy/spatial/transform/__init__.py +5 -3
  446. scipy/spatial/transform/_rigid_transform.cpython-313t-darwin.so +0 -0
  447. scipy/spatial/transform/_rotation.cpython-313t-darwin.so +0 -0
  448. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  449. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  450. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  451. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  452. scipy/special/__init__.py +1 -47
  453. scipy/special/_add_newdocs.py +34 -772
  454. scipy/special/_basic.py +22 -25
  455. scipy/special/_comb.cpython-313t-darwin.so +0 -0
  456. scipy/special/_ellip_harm_2.cpython-313t-darwin.so +0 -0
  457. scipy/special/_gufuncs.cpython-313t-darwin.so +0 -0
  458. scipy/special/_logsumexp.py +67 -58
  459. scipy/special/_orthogonal.pyi +1 -1
  460. scipy/special/_specfun.cpython-313t-darwin.so +0 -0
  461. scipy/special/_special_ufuncs.cpython-313t-darwin.so +0 -0
  462. scipy/special/_spherical_bessel.py +4 -4
  463. scipy/special/_support_alternative_backends.py +212 -119
  464. scipy/special/_test_internal.cpython-313t-darwin.so +0 -0
  465. scipy/special/_testutils.py +4 -4
  466. scipy/special/_ufuncs.cpython-313t-darwin.so +0 -0
  467. scipy/special/_ufuncs.pyi +1 -0
  468. scipy/special/_ufuncs.pyx +215 -1400
  469. scipy/special/_ufuncs_cxx.cpython-313t-darwin.so +0 -0
  470. scipy/special/_ufuncs_cxx.pxd +2 -15
  471. scipy/special/_ufuncs_cxx.pyx +5 -44
  472. scipy/special/_ufuncs_cxx_defs.h +2 -16
  473. scipy/special/_ufuncs_defs.h +0 -8
  474. scipy/special/cython_special.cpython-313t-darwin.so +0 -0
  475. scipy/special/cython_special.pxd +1 -1
  476. scipy/special/tests/_cython_examples/meson.build +10 -1
  477. scipy/special/tests/test_basic.py +153 -20
  478. scipy/special/tests/test_boost_ufuncs.py +3 -0
  479. scipy/special/tests/test_cdflib.py +35 -11
  480. scipy/special/tests/test_gammainc.py +16 -0
  481. scipy/special/tests/test_hyp2f1.py +2 -2
  482. scipy/special/tests/test_log1mexp.py +85 -0
  483. scipy/special/tests/test_logsumexp.py +206 -64
  484. scipy/special/tests/test_mpmath.py +1 -0
  485. scipy/special/tests/test_nan_inputs.py +1 -1
  486. scipy/special/tests/test_orthogonal.py +17 -18
  487. scipy/special/tests/test_sf_error.py +3 -2
  488. scipy/special/tests/test_sph_harm.py +6 -7
  489. scipy/special/tests/test_support_alternative_backends.py +211 -76
  490. scipy/stats/__init__.py +4 -1
  491. scipy/stats/_ansari_swilk_statistics.cpython-313t-darwin.so +0 -0
  492. scipy/stats/_axis_nan_policy.py +5 -12
  493. scipy/stats/_biasedurn.cpython-313t-darwin.so +0 -0
  494. scipy/stats/_continued_fraction.py +387 -0
  495. scipy/stats/_continuous_distns.py +277 -310
  496. scipy/stats/_correlation.py +1 -1
  497. scipy/stats/_covariance.py +6 -3
  498. scipy/stats/_discrete_distns.py +39 -32
  499. scipy/stats/_distn_infrastructure.py +39 -12
  500. scipy/stats/_distribution_infrastructure.py +900 -238
  501. scipy/stats/_entropy.py +9 -10
  502. scipy/{_lib → stats}/_finite_differences.py +1 -1
  503. scipy/stats/_hypotests.py +83 -50
  504. scipy/stats/_kde.py +53 -49
  505. scipy/stats/_ksstats.py +1 -1
  506. scipy/stats/_levy_stable/__init__.py +7 -15
  507. scipy/stats/_levy_stable/levyst.cpython-313t-darwin.so +0 -0
  508. scipy/stats/_morestats.py +118 -73
  509. scipy/stats/_mstats_basic.py +13 -17
  510. scipy/stats/_mstats_extras.py +8 -8
  511. scipy/stats/_multivariate.py +89 -113
  512. scipy/stats/_new_distributions.py +97 -20
  513. scipy/stats/_page_trend_test.py +12 -5
  514. scipy/stats/_probability_distribution.py +265 -43
  515. scipy/stats/_qmc.py +14 -9
  516. scipy/stats/_qmc_cy.cpython-313t-darwin.so +0 -0
  517. scipy/stats/_qmvnt.py +16 -95
  518. scipy/stats/_qmvnt_cy.cpython-313t-darwin.so +0 -0
  519. scipy/stats/_quantile.py +335 -0
  520. scipy/stats/_rcont/rcont.cpython-313t-darwin.so +0 -0
  521. scipy/stats/_resampling.py +4 -29
  522. scipy/stats/_sampling.py +1 -1
  523. scipy/stats/_sobol.cpython-313t-darwin.so +0 -0
  524. scipy/stats/_stats.cpython-313t-darwin.so +0 -0
  525. scipy/stats/_stats_mstats_common.py +21 -2
  526. scipy/stats/_stats_py.py +550 -476
  527. scipy/stats/_stats_pythran.cpython-313t-darwin.so +0 -0
  528. scipy/stats/_unuran/unuran_wrapper.cpython-313t-darwin.so +0 -0
  529. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  530. scipy/stats/_variation.py +6 -8
  531. scipy/stats/_wilcoxon.py +13 -7
  532. scipy/stats/tests/common_tests.py +6 -4
  533. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  534. scipy/stats/tests/test_continued_fraction.py +173 -0
  535. scipy/stats/tests/test_continuous.py +379 -60
  536. scipy/stats/tests/test_continuous_basic.py +18 -12
  537. scipy/stats/tests/test_discrete_basic.py +14 -8
  538. scipy/stats/tests/test_discrete_distns.py +16 -16
  539. scipy/stats/tests/test_distributions.py +95 -75
  540. scipy/stats/tests/test_entropy.py +40 -48
  541. scipy/stats/tests/test_fit.py +4 -3
  542. scipy/stats/tests/test_hypotests.py +153 -24
  543. scipy/stats/tests/test_kdeoth.py +109 -41
  544. scipy/stats/tests/test_marray.py +289 -0
  545. scipy/stats/tests/test_morestats.py +79 -47
  546. scipy/stats/tests/test_mstats_basic.py +3 -3
  547. scipy/stats/tests/test_multivariate.py +434 -83
  548. scipy/stats/tests/test_qmc.py +13 -10
  549. scipy/stats/tests/test_quantile.py +199 -0
  550. scipy/stats/tests/test_rank.py +119 -112
  551. scipy/stats/tests/test_resampling.py +47 -56
  552. scipy/stats/tests/test_sampling.py +9 -4
  553. scipy/stats/tests/test_stats.py +799 -939
  554. scipy/stats/tests/test_variation.py +8 -6
  555. scipy/version.py +2 -2
  556. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  557. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  558. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +559 -566
  559. scipy-1.16.0rc2.dist-info/WHEEL +6 -0
  560. scipy/_lib/array_api_extra/_funcs.py +0 -484
  561. scipy/_lib/array_api_extra/_typing.py +0 -8
  562. scipy/interpolate/_bspl.cpython-313t-darwin.so +0 -0
  563. scipy/optimize/_cobyla.cpython-313t-darwin.so +0 -0
  564. scipy/optimize/_cython_nnls.cpython-313t-darwin.so +0 -0
  565. scipy/optimize/_slsqp.cpython-313t-darwin.so +0 -0
  566. scipy/spatial/qhull_src/COPYING.txt +0 -38
  567. scipy/special/libsf_error_state.dylib +0 -0
  568. scipy/special/tests/test_log_softmax.py +0 -109
  569. scipy/special/tests/test_xsf_cuda.py +0 -114
  570. scipy/special/xsf/binom.h +0 -89
  571. scipy/special/xsf/cdflib.h +0 -100
  572. scipy/special/xsf/cephes/airy.h +0 -307
  573. scipy/special/xsf/cephes/besselpoly.h +0 -51
  574. scipy/special/xsf/cephes/beta.h +0 -257
  575. scipy/special/xsf/cephes/cbrt.h +0 -131
  576. scipy/special/xsf/cephes/chbevl.h +0 -85
  577. scipy/special/xsf/cephes/chdtr.h +0 -193
  578. scipy/special/xsf/cephes/const.h +0 -87
  579. scipy/special/xsf/cephes/ellie.h +0 -293
  580. scipy/special/xsf/cephes/ellik.h +0 -251
  581. scipy/special/xsf/cephes/ellpe.h +0 -107
  582. scipy/special/xsf/cephes/ellpk.h +0 -117
  583. scipy/special/xsf/cephes/expn.h +0 -260
  584. scipy/special/xsf/cephes/gamma.h +0 -398
  585. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  586. scipy/special/xsf/cephes/hyperg.h +0 -361
  587. scipy/special/xsf/cephes/i0.h +0 -149
  588. scipy/special/xsf/cephes/i1.h +0 -158
  589. scipy/special/xsf/cephes/igam.h +0 -421
  590. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  591. scipy/special/xsf/cephes/igami.h +0 -313
  592. scipy/special/xsf/cephes/j0.h +0 -225
  593. scipy/special/xsf/cephes/j1.h +0 -198
  594. scipy/special/xsf/cephes/jv.h +0 -715
  595. scipy/special/xsf/cephes/k0.h +0 -164
  596. scipy/special/xsf/cephes/k1.h +0 -163
  597. scipy/special/xsf/cephes/kn.h +0 -243
  598. scipy/special/xsf/cephes/lanczos.h +0 -112
  599. scipy/special/xsf/cephes/ndtr.h +0 -275
  600. scipy/special/xsf/cephes/poch.h +0 -85
  601. scipy/special/xsf/cephes/polevl.h +0 -167
  602. scipy/special/xsf/cephes/psi.h +0 -194
  603. scipy/special/xsf/cephes/rgamma.h +0 -111
  604. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  605. scipy/special/xsf/cephes/shichi.h +0 -248
  606. scipy/special/xsf/cephes/sici.h +0 -224
  607. scipy/special/xsf/cephes/sindg.h +0 -221
  608. scipy/special/xsf/cephes/tandg.h +0 -139
  609. scipy/special/xsf/cephes/trig.h +0 -58
  610. scipy/special/xsf/cephes/unity.h +0 -186
  611. scipy/special/xsf/cephes/zeta.h +0 -172
  612. scipy/special/xsf/config.h +0 -304
  613. scipy/special/xsf/digamma.h +0 -205
  614. scipy/special/xsf/error.h +0 -57
  615. scipy/special/xsf/evalpoly.h +0 -47
  616. scipy/special/xsf/expint.h +0 -266
  617. scipy/special/xsf/hyp2f1.h +0 -694
  618. scipy/special/xsf/iv_ratio.h +0 -173
  619. scipy/special/xsf/lambertw.h +0 -150
  620. scipy/special/xsf/loggamma.h +0 -163
  621. scipy/special/xsf/sici.h +0 -200
  622. scipy/special/xsf/tools.h +0 -427
  623. scipy/special/xsf/trig.h +0 -164
  624. scipy/special/xsf/wright_bessel.h +0 -843
  625. scipy/special/xsf/zlog1.h +0 -35
  626. scipy/stats/_mvn.cpython-313t-darwin.so +0 -0
  627. scipy-1.15.3.dist-info/WHEEL +0 -4
@@ -16,9 +16,8 @@ Functions
16
16
  __all__ = ['approx_jacobian', 'fmin_slsqp']
17
17
 
18
18
  import numpy as np
19
- from scipy.optimize._slsqp import slsqp
20
- from numpy import (zeros, array, linalg, append, concatenate, finfo,
21
- sqrt, vstack, isfinite, atleast_1d)
19
+ from ._slsqplib import slsqp
20
+ from scipy.linalg import norm as lanorm
22
21
  from ._optimize import (OptimizeResult, _check_unknown_options,
23
22
  _prepare_scalar_function, _clip_x_for_func,
24
23
  _check_clip_x)
@@ -26,11 +25,11 @@ from ._numdiff import approx_derivative
26
25
  from ._constraints import old_bound_to_new, _arr_to_scalar
27
26
  from scipy._lib._array_api import array_namespace
28
27
  from scipy._lib import array_api_extra as xpx
29
-
28
+ from numpy.typing import NDArray
30
29
 
31
30
  __docformat__ = "restructuredtext en"
32
31
 
33
- _epsilon = sqrt(finfo(float).eps)
32
+ _epsilon = np.sqrt(np.finfo(np.float64).eps)
34
33
 
35
34
 
36
35
  def approx_jacobian(x, func, epsilon, *args):
@@ -217,15 +216,19 @@ def _minimize_slsqp(func, x0, args=(), jac=None, bounds=None,
217
216
  constraints=(),
218
217
  maxiter=100, ftol=1.0E-6, iprint=1, disp=False,
219
218
  eps=_epsilon, callback=None, finite_diff_rel_step=None,
220
- **unknown_options):
219
+ workers=None, **unknown_options):
221
220
  """
222
221
  Minimize a scalar function of one or more variables using Sequential
223
222
  Least Squares Programming (SLSQP).
224
223
 
225
- Options
226
- -------
224
+ Parameters
225
+ ----------
227
226
  ftol : float
228
- Precision goal for the value of f in the stopping criterion.
227
+ Precision target for the value of f in the stopping criterion. This value
228
+ controls the final accuracy for checking various optimality conditions;
229
+ gradient of the lagrangian and absolute sum of the constraint violations
230
+ should be lower than ``ftol``. Similarly, computed step size and the
231
+ objective function changes are checked against this value. Default is 1e-6.
229
232
  eps : float
230
233
  Step size used for numerical approximation of the Jacobian.
231
234
  disp : bool
@@ -240,9 +243,55 @@ def _minimize_slsqp(func, x0, args=(), jac=None, bounds=None,
240
243
  possibly adjusted to fit into the bounds. For ``method='3-point'``
241
244
  the sign of `h` is ignored. If None (default) then step is selected
242
245
  automatically.
246
+ workers : int, map-like callable, optional
247
+ A map-like callable, such as `multiprocessing.Pool.map` for evaluating
248
+ any numerical differentiation in parallel.
249
+ This evaluation is carried out as ``workers(fun, iterable)``.
250
+
251
+ .. versionadded:: 1.16.0
252
+
253
+ Returns
254
+ -------
255
+ res : OptimizeResult
256
+ The optimization result represented as an `OptimizeResult` object.
257
+ In this dict-like object the following fields are of particular importance:
258
+ ``x`` the solution array, ``success`` a Boolean flag indicating if the
259
+ optimizer exited successfully, ``message`` which describes the reason for
260
+ termination, and ``multipliers`` which contains the Karush-Kuhn-Tucker
261
+ (KKT) multipliers for the QP approximation used in solving the original
262
+ nonlinear problem. See ``Notes`` below. See also `OptimizeResult` for a
263
+ description of other attributes.
264
+
265
+ Notes
266
+ -----
267
+ The KKT multipliers are returned in the ``OptimizeResult.multipliers``
268
+ attribute as a NumPy array. Denoting the dimension of the equality constraints
269
+ with ``meq``, and of inequality constraints with ``mineq``, then the returned
270
+ array slice ``m[:meq]`` contains the multipliers for the equality constraints,
271
+ and the remaining ``m[meq:meq + mineq]`` contains the multipliers for the
272
+ inequality constraints. The multipliers corresponding to bound inequalities
273
+ are not returned. See [1]_ pp. 321 or [2]_ for an explanation of how to interpret
274
+ these multipliers. The internal QP problem is solved using the methods given
275
+ in [3]_ Chapter 25.
276
+
277
+ Note that if new-style `NonlinearConstraint` or `LinearConstraint` were
278
+ used, then ``minimize`` converts them first to old-style constraint dicts.
279
+ It is possible for a single new-style constraint to simultaneously contain
280
+ both inequality and equality constraints. This means that if there is mixing
281
+ within a single constraint, then the returned list of multipliers will have
282
+ a different length than the original new-style constraints.
283
+
284
+ References
285
+ ----------
286
+ .. [1] Nocedal, J., and S J Wright, 2006, "Numerical Optimization", Springer,
287
+ New York.
288
+ .. [2] Kraft, D., "A software package for sequential quadratic programming",
289
+ 1988, Tech. Rep. DFVLR-FB 88-28, DLR German Aerospace Center, Germany.
290
+ .. [3] Lawson, C. L., and R. J. Hanson, 1995, "Solving Least Squares Problems",
291
+ SIAM, Philadelphia, PA.
292
+
243
293
  """
244
294
  _check_unknown_options(unknown_options)
245
- iter = maxiter - 1
246
295
  acc = ftol
247
296
  epsilon = eps
248
297
 
@@ -277,7 +326,7 @@ def _minimize_slsqp(func, x0, args=(), jac=None, bounds=None,
277
326
  try:
278
327
  ctype = con['type'].lower()
279
328
  except KeyError as e:
280
- raise KeyError('Constraint %d has no type defined.' % ic) from e
329
+ raise KeyError(f'Constraint {ic} has no type defined.') from e
281
330
  except TypeError as e:
282
331
  raise TypeError('Constraints must be defined using a '
283
332
  'dictionary.') from e
@@ -289,7 +338,7 @@ def _minimize_slsqp(func, x0, args=(), jac=None, bounds=None,
289
338
 
290
339
  # check function
291
340
  if 'fun' not in con:
292
- raise ValueError('Constraint %d has no function defined.' % ic)
341
+ raise ValueError(f'Constraint {ic} has no function defined.')
293
342
 
294
343
  # check Jacobian
295
344
  cjac = con.get('jac')
@@ -331,26 +380,15 @@ def _minimize_slsqp(func, x0, args=(), jac=None, bounds=None,
331
380
 
332
381
  # Set the parameters that SLSQP will need
333
382
  # meq, mieq: number of equality and inequality constraints
334
- meq = sum(map(len, [atleast_1d(c['fun'](x, *c['args']))
383
+ meq = sum(map(len, [np.atleast_1d(c['fun'](x, *c['args']))
335
384
  for c in cons['eq']]))
336
- mieq = sum(map(len, [atleast_1d(c['fun'](x, *c['args']))
385
+ mieq = sum(map(len, [np.atleast_1d(c['fun'](x, *c['args']))
337
386
  for c in cons['ineq']]))
338
387
  # m = The total number of constraints
339
388
  m = meq + mieq
340
- # la = The number of constraints, or 1 if there are no constraints
341
- la = array([1, m]).max()
342
389
  # n = The number of independent variables
343
390
  n = len(x)
344
391
 
345
- # Define the workspaces for SLSQP
346
- n1 = n + 1
347
- mineq = m - meq + n1 + n1
348
- len_w = (3*n1+m)*(n1+1)+(n1-meq+1)*(mineq+2) + 2*mineq+(n1+mineq)*(n1-meq) \
349
- + 2*meq + n1 + ((n+1)*n)//2 + 2*m + 3*n + 3*n1 + 1
350
- len_jw = mineq
351
- w = zeros(len_w)
352
- jw = zeros(len_jw)
353
-
354
392
  # Decompose bounds into xl and xu
355
393
  if bounds is None or len(bounds) == 0:
356
394
  xl = np.empty(n, dtype=float)
@@ -358,8 +396,8 @@ def _minimize_slsqp(func, x0, args=(), jac=None, bounds=None,
358
396
  xl.fill(np.nan)
359
397
  xu.fill(np.nan)
360
398
  else:
361
- bnds = array([(_arr_to_scalar(l), _arr_to_scalar(u))
362
- for (l, u) in bounds], float)
399
+ bnds = np.array([(_arr_to_scalar(lo), _arr_to_scalar(up))
400
+ for (lo, up) in bounds], float)
363
401
  if bnds.shape[0] != n:
364
402
  raise IndexError('SLSQP Error: the length of bounds is not '
365
403
  'compatible with that of x0.')
@@ -370,142 +408,196 @@ def _minimize_slsqp(func, x0, args=(), jac=None, bounds=None,
370
408
  if bnderr.any():
371
409
  raise ValueError("SLSQP Error: lb > ub in bounds "
372
410
  f"{', '.join(str(b) for b in bnderr)}.")
373
- xl, xu = bnds[:, 0], bnds[:, 1]
411
+ xl, xu = bnds[:, 0].copy(), bnds[:, 1].copy()
374
412
 
375
- # Mark infinite bounds with nans; the Fortran code understands this
376
- infbnd = ~isfinite(bnds)
413
+ # Mark infinite bounds with nans; the C code expects this
414
+ infbnd = ~np.isfinite(bnds)
377
415
  xl[infbnd[:, 0]] = np.nan
378
416
  xu[infbnd[:, 1]] = np.nan
379
417
 
380
418
  # ScalarFunction provides function and gradient evaluation
381
419
  sf = _prepare_scalar_function(func, x, jac=jac, args=args, epsilon=eps,
382
420
  finite_diff_rel_step=finite_diff_rel_step,
383
- bounds=new_bounds)
421
+ bounds=new_bounds, workers=workers)
384
422
  # gh11403 SLSQP sometimes exceeds bounds by 1 or 2 ULP, make sure this
385
423
  # doesn't get sent to the func/grad evaluator.
386
424
  wrapped_fun = _clip_x_for_func(sf.fun, new_bounds)
387
425
  wrapped_grad = _clip_x_for_func(sf.grad, new_bounds)
388
426
 
389
- # Initialize the iteration counter and the mode value
390
- mode = array(0, int)
391
- acc = array(acc, float)
392
- majiter = array(iter, int)
393
- majiter_prev = 0
394
-
395
- # Initialize internal SLSQP state variables
396
- alpha = array(0, float)
397
- f0 = array(0, float)
398
- gs = array(0, float)
399
- h1 = array(0, float)
400
- h2 = array(0, float)
401
- h3 = array(0, float)
402
- h4 = array(0, float)
403
- t = array(0, float)
404
- t0 = array(0, float)
405
- tol = array(0, float)
406
- iexact = array(0, int)
407
- incons = array(0, int)
408
- ireset = array(0, int)
409
- itermx = array(0, int)
410
- line = array(0, int)
411
- n1 = array(0, int)
412
- n2 = array(0, int)
413
- n3 = array(0, int)
427
+ # Initialize internal SLSQP state variables dictionary
428
+ # This dictionary is passed to the SLSQP matching the C struct defined as
429
+ #
430
+ # struct SLSQP_static_vars {
431
+ # double acc, alpha, f0, gs, h1, h2, h3, h4, t, t0, tol;
432
+ # int exact, inconsistent, reset, iter, itermax, line, mode, meq;
433
+ # };
434
+ #
435
+ # exact : a dummy variable and should be kept 0 since the underlying code
436
+ # always uses an inexact search.
437
+ # inconsistent: a boolean set to 1 if the linearized QP is not well-defined
438
+ # while the original nonlinear problem is still solvable. Then
439
+ # the problem is augmented with a regularizing dummy variable.
440
+ # reset: holds the count of resetting bfgs to identity matrix.
441
+ # iter : the current and itermax is the maximum number of iterations.
442
+ # line : the current line search iteration.
443
+ # mode : the exit mode of the solver.
444
+ # alpha, f0, gs, h1, h2, h3, h4, t, t0 : internal variables used by the solver.
445
+ #
446
+ # The dict holds the intermediate state of the solver. The keys are the same
447
+ # as the C struct members and will be modified in-place.
448
+ state_dict = {
449
+ "acc": acc,
450
+ "alpha": 0.0,
451
+ "f0": 0.0,
452
+ "gs": 0.0,
453
+ "h1": 0.0,
454
+ "h2": 0.0,
455
+ "h3": 0.0,
456
+ "h4": 0.0,
457
+ "t": 0.0,
458
+ "t0": 0.0,
459
+ "tol": 10.0*acc,
460
+ "exact": 0,
461
+ "inconsistent": 0,
462
+ "reset": 0,
463
+ "iter": 0,
464
+ "itermax": maxiter,
465
+ "line": 0,
466
+ "m": m,
467
+ "meq": meq,
468
+ "mode": 0,
469
+ "n": n
470
+ }
414
471
 
415
472
  # Print the header if iprint >= 2
416
473
  if iprint >= 2:
417
- print("%5s %5s %16s %16s" % ("NIT", "FC", "OBJFUN", "GNORM"))
474
+ print(f"{'NIT':>5} {'FC':>5} {'OBJFUN':>16} {'GNORM':>16}")
475
+
476
+ # Internal buffer and int array
477
+ indices = np.zeros([max(m + 2*n + 2, 1)], dtype=np.int32)
478
+
479
+ # The worst case workspace requirements for the buffer are:
480
+
481
+ # n*(n+1)//2 + m + 4*n + 3 # SLSQP
482
+ # (n+1)*(n+2) + (n+1)*meq + m + (mineq + 2*n + 2)*(n+1) + 3*n + 3 # LSQ
483
+ # mineq + 2n + 2 + 2*meq + (n+1) + (mineq + 3n + 3)*(n + 1 - meq) # LSEI
484
+ # (mineq + 2n + 2 + 2)*(n + 2) + mineq + 2n + 2 # LDP
485
+ # mineq + 2n + 2 # NNLS
486
+
487
+ # If we sum all up and simplify by the help of sympy we get the following
488
+ buffer_size = (
489
+ n*(n+1)//2 + 3*m*n - (m + 5*n + 7)*meq + 9*m + 8*n*n + 35*n + meq*meq + 28
490
+ )
491
+ # If no inequality constraints are given, top up workspace for the missing
492
+ # terms.
493
+ if mieq == 0:
494
+ buffer_size += 2*n*(n + 1)
495
+ buffer = np.zeros(max(buffer_size, 1), dtype=np.float64)
418
496
 
419
497
  # mode is zero on entry, so call objective, constraints and gradients
420
498
  # there should be no func evaluations here because it's cached from
421
499
  # ScalarFunction
422
500
  fx = wrapped_fun(x)
423
- g = append(wrapped_grad(x), 0.0)
424
- c = _eval_constraint(x, cons)
425
- a = _eval_con_normals(x, cons, la, n, m, meq, mieq)
501
+ g = wrapped_grad(x)
502
+
503
+ # Allocate the multiplier array both for constraints and user specified
504
+ # bounds (extra +2 is for a possible augmented problem).
505
+ mult = np.zeros([max(1, m + 2*n + 2)], dtype=np.float64)
506
+
507
+ # Allocate the constraints and normals once and repopulate as needed
508
+ C = np.zeros([max(1, m), n], dtype=np.float64, order='F')
509
+ d = np.zeros([max(1, m)], dtype=np.float64)
510
+ _eval_con_normals(C, x, cons, m, meq)
511
+ _eval_constraint(d, x, cons, m, meq)
512
+
513
+ iter_prev = 0
426
514
 
427
- while 1:
515
+ while True:
428
516
  # Call SLSQP
429
- slsqp(m, meq, x, xl, xu, fx, c, g, a, acc, majiter, mode, w, jw,
430
- alpha, f0, gs, h1, h2, h3, h4, t, t0, tol,
431
- iexact, incons, ireset, itermx, line,
432
- n1, n2, n3)
517
+ slsqp(state_dict, fx, g, C, d, x, mult, xl, xu, buffer, indices)
433
518
 
434
- if mode == 1: # objective and constraint evaluation required
435
- fx = wrapped_fun(x)
436
- c = _eval_constraint(x, cons)
519
+ if state_dict['mode'] == 1: # objective and constraint evaluation required
520
+ fx = sf.fun(x)
521
+ _eval_constraint(d, x, cons, m, meq)
437
522
 
438
- if mode == -1: # gradient evaluation required
439
- g = append(wrapped_grad(x), 0.0)
440
- a = _eval_con_normals(x, cons, la, n, m, meq, mieq)
523
+ if state_dict['mode'] == -1: # gradient evaluation required
524
+ g = sf.grad(x)
525
+ _eval_con_normals(C, x, cons, m, meq)
441
526
 
442
- if majiter > majiter_prev:
527
+ if state_dict['iter'] > iter_prev:
443
528
  # call callback if major iteration has incremented
444
529
  if callback is not None:
445
530
  callback(np.copy(x))
446
531
 
447
532
  # Print the status of the current iterate if iprint > 2
448
533
  if iprint >= 2:
449
- print("%5i %5i % 16.6E % 16.6E" % (majiter, sf.nfev,
450
- fx, linalg.norm(g)))
534
+ print(f"{state_dict['iter']:5d} {sf.nfev:5d} "
535
+ f"{fx:16.6E} {lanorm(g):16.6E}")
451
536
 
452
537
  # If exit mode is not -1 or 1, slsqp has completed
453
- if abs(mode) != 1:
538
+ if abs(state_dict['mode']) != 1:
454
539
  break
455
540
 
456
- majiter_prev = int(majiter)
541
+ iter_prev = state_dict['iter']
457
542
 
458
543
  # Optimization loop complete. Print status if requested
459
544
  if iprint >= 1:
460
- print(exit_modes[int(mode)] + " (Exit mode " + str(mode) + ')')
545
+ print(
546
+ exit_modes[state_dict['mode']] + f" (Exit mode {state_dict['mode']})"
547
+ )
461
548
  print(" Current function value:", fx)
462
- print(" Iterations:", majiter)
549
+ print(" Iterations:", state_dict['iter'])
463
550
  print(" Function evaluations:", sf.nfev)
464
551
  print(" Gradient evaluations:", sf.ngev)
465
552
 
466
- return OptimizeResult(x=x, fun=fx, jac=g[:-1], nit=int(majiter),
467
- nfev=sf.nfev, njev=sf.ngev, status=int(mode),
468
- message=exit_modes[int(mode)], success=(mode == 0))
469
-
470
-
471
- def _eval_constraint(x, cons):
472
- # Compute constraints
473
- if cons['eq']:
474
- c_eq = concatenate([atleast_1d(con['fun'](x, *con['args']))
475
- for con in cons['eq']])
476
- else:
477
- c_eq = zeros(0)
478
-
479
- if cons['ineq']:
480
- c_ieq = concatenate([atleast_1d(con['fun'](x, *con['args']))
481
- for con in cons['ineq']])
482
- else:
483
- c_ieq = zeros(0)
484
-
485
- # Now combine c_eq and c_ieq into a single matrix
486
- c = concatenate((c_eq, c_ieq))
487
- return c
488
-
489
-
490
- def _eval_con_normals(x, cons, la, n, m, meq, mieq):
491
- # Compute the normals of the constraints
492
- if cons['eq']:
493
- a_eq = vstack([con['jac'](x, *con['args'])
494
- for con in cons['eq']])
495
- else: # no equality constraint
496
- a_eq = zeros((meq, n))
497
-
498
- if cons['ineq']:
499
- a_ieq = vstack([con['jac'](x, *con['args'])
500
- for con in cons['ineq']])
501
- else: # no inequality constraint
502
- a_ieq = zeros((mieq, n))
503
-
504
- # Now combine a_eq and a_ieq into a single a matrix
505
- if m == 0: # no constraints
506
- a = zeros((la, n))
507
- else:
508
- a = vstack((a_eq, a_ieq))
509
- a = concatenate((a, zeros([la, 1])), 1)
510
-
511
- return a
553
+ return OptimizeResult(
554
+ x=x, fun=fx, jac=g, nit=state_dict['iter'], nfev=sf.nfev, njev=sf.ngev,
555
+ status=state_dict['mode'], message=exit_modes[state_dict['mode']],
556
+ success=(state_dict['mode'] == 0), multipliers=mult[:m]
557
+ )
558
+
559
+ # The following functions modify their first input argument in-place.
560
+ def _eval_constraint(d: NDArray, x: NDArray, cons: dict, m: int, meq: int):
561
+ if m == 0:
562
+ return
563
+
564
+ # The reason why we don't use regular increments with a sane for loop is that
565
+ # the constraint evaluations do not necessarily return scalars. Their
566
+ # output length needs to be taken into account while placing them in d.
567
+
568
+ if meq > 0:
569
+ row = 0
570
+ for con in cons['eq']:
571
+ temp = np.atleast_1d(con['fun'](x, *con['args'])).ravel()
572
+ d[row:row + len(temp)] = temp
573
+ row += len(temp)
574
+
575
+ if m > meq:
576
+ row = meq
577
+ for con in cons['ineq']:
578
+ temp = np.atleast_1d(con['fun'](x, *con['args'])).ravel()
579
+ d[row:row + len(temp)] = temp
580
+ row += len(temp)
581
+
582
+ return
583
+
584
+
585
+ def _eval_con_normals(C: NDArray, x: NDArray, cons: dict, m: int, meq: int):
586
+ if m == 0:
587
+ return
588
+
589
+ if meq > 0:
590
+ row = 0
591
+ for con in cons['eq']:
592
+ temp = np.atleast_2d(con['jac'](x, *con['args']))
593
+ C[row:row + temp.shape[0], :] = temp
594
+ row += temp.shape[0]
595
+
596
+ if m > meq:
597
+ row = meq
598
+ for con in cons['ineq']:
599
+ temp = np.atleast_2d(con['jac'](x, *con['args']))
600
+ C[row:row + temp.shape[0], :] = temp
601
+ row += temp.shape[0]
602
+
603
+ return
@@ -107,7 +107,7 @@ def _root_df_sane(func, x0, args=(), ftol=1e-8, fatol=1e-300, maxfev=1000,
107
107
  F_k_norm = fnorm(F_k)
108
108
 
109
109
  if disp:
110
- print("iter %d: ||F|| = %g, sigma = %g" % (k, F_k_norm, sigma_k))
110
+ print(f"iter {k}: ||F|| = {F_k_norm:g}, sigma = {sigma_k:g}")
111
111
 
112
112
  if callback is not None:
113
113
  callback(x_k, F_k)
scipy/optimize/_tnc.py CHANGED
@@ -287,6 +287,7 @@ def _minimize_tnc(fun, x0, args=(), jac=None, bounds=None,
287
287
  maxCGit=-1, eta=-1, stepmx=0, accuracy=0,
288
288
  minfev=0, ftol=-1, xtol=-1, gtol=-1, rescale=-1, disp=False,
289
289
  callback=None, finite_diff_rel_step=None, maxfun=None,
290
+ workers=None,
290
291
  **unknown_options):
291
292
  """
292
293
  Minimize a scalar function of one or more variables using a truncated
@@ -351,6 +352,12 @@ def _minimize_tnc(fun, x0, args=(), jac=None, bounds=None,
351
352
  maxfun : int
352
353
  Maximum number of function evaluations. If None, `maxfun` is
353
354
  set to max(100, 10*len(x0)). Defaults to None.
355
+ workers : int, map-like callable, optional
356
+ A map-like callable, such as `multiprocessing.Pool.map` for evaluating
357
+ any numerical differentiation in parallel.
358
+ This evaluation is carried out as ``workers(fun, iterable)``.
359
+
360
+ .. versionadded:: 1.16.0
354
361
  """
355
362
  _check_unknown_options(unknown_options)
356
363
  fmin = minfev
@@ -381,7 +388,7 @@ def _minimize_tnc(fun, x0, args=(), jac=None, bounds=None,
381
388
 
382
389
  sf = _prepare_scalar_function(fun, x0, jac=jac, args=args, epsilon=eps,
383
390
  finite_diff_rel_step=finite_diff_rel_step,
384
- bounds=new_bounds)
391
+ bounds=new_bounds, workers=workers)
385
392
  func_and_grad = sf.fun_and_grad
386
393
 
387
394
  """
@@ -119,7 +119,8 @@ def _minimize_trust_region(fun, x0, args=(), jac=None, hess=None, hessp=None,
119
119
  subproblem=None, initial_trust_radius=1.0,
120
120
  max_trust_radius=1000.0, eta=0.15, gtol=1e-4,
121
121
  maxiter=None, disp=False, return_all=False,
122
- callback=None, inexact=True, **unknown_options):
122
+ callback=None, inexact=True, workers=None,
123
+ **unknown_options):
123
124
  """
124
125
  Minimization of scalar function of one or more variables using a
125
126
  trust-region algorithm.
@@ -142,6 +143,13 @@ def _minimize_trust_region(fun, x0, args=(), jac=None, hess=None, hessp=None,
142
143
  Accuracy to solve subproblems. If True requires less nonlinear
143
144
  iterations, but more vector products. Only effective for method
144
145
  trust-krylov.
146
+ workers : int, map-like callable, optional
147
+ A map-like callable, such as `multiprocessing.Pool.map` for evaluating
148
+ any numerical differentiation in parallel.
149
+ This evaluation is carried out as ``workers(fun, iterable)``.
150
+ Only for 'trust-krylov', 'trust-ncg'.
151
+
152
+ .. versionadded:: 1.16.0
145
153
 
146
154
  This function is called by the `minimize` function.
147
155
  It is not supposed to be called directly.
@@ -172,7 +180,13 @@ def _minimize_trust_region(fun, x0, args=(), jac=None, hess=None, hessp=None,
172
180
 
173
181
  # A ScalarFunction representing the problem. This caches calls to fun, jac,
174
182
  # hess.
175
- sf = _prepare_scalar_function(fun, x0, jac=jac, hess=hess, args=args)
183
+ # the workers kwd only has an effect for trust-ncg, trust-krylov when
184
+ # estimating the Hessian with finite-differences. It's never used
185
+ # during calculation of jacobian, because callables are required for all
186
+ # methods.
187
+ sf = _prepare_scalar_function(
188
+ fun, x0, jac=jac, hess=hess, args=args, workers=workers
189
+ )
176
190
  fun = sf.fun
177
191
  jac = sf.grad
178
192
  if callable(hess):
@@ -285,10 +299,10 @@ def _minimize_trust_region(fun, x0, args=(), jac=None, hess=None, hessp=None,
285
299
  else:
286
300
  warnings.warn(status_messages[warnflag], RuntimeWarning, stacklevel=3)
287
301
  print(f" Current function value: {m.fun:f}")
288
- print(" Iterations: %d" % k)
289
- print(" Function evaluations: %d" % sf.nfev)
290
- print(" Gradient evaluations: %d" % sf.ngev)
291
- print(" Hessian evaluations: %d" % (sf.nhev + nhessp[0]))
302
+ print(f" Iterations: {k:d}")
303
+ print(f" Function evaluations: {sf.nfev:d}")
304
+ print(f" Gradient evaluations: {sf.ngev:d}")
305
+ print(f" Hessian evaluations: {sf.nhev + nhessp[0]:d}")
292
306
 
293
307
  result = OptimizeResult(x=x, success=(warnflag == 0), status=warnflag,
294
308
  fun=m.fun, jac=m.jac, nfev=sf.nfev, njev=sf.ngev,
@@ -27,7 +27,7 @@ class CanonicalConstraint:
27
27
  jac : callable
28
28
  Function to evaluate the Jacobian of the constraint. The signature
29
29
  is ``jac(x) -> J_eq, J_ineq``, where ``J_eq`` and ``J_ineq`` are
30
- either ndarray of csr_matrix of shapes (n_eq, n) and (n_ineq, n),
30
+ either ndarray of csr_array of shapes (n_eq, n) and (n_ineq, n),
31
31
  respectively.
32
32
  hess : callable
33
33
  Function to evaluate the Hessian of the constraints multiplied
@@ -77,7 +77,7 @@ class CanonicalConstraint:
77
77
  """
78
78
  empty_fun = np.empty(0)
79
79
  empty_jac = np.empty((0, n))
80
- empty_hess = sps.csr_matrix((n, n))
80
+ empty_hess = sps.csr_array((n, n))
81
81
 
82
82
  def fun(x):
83
83
  return empty_fun, empty_fun
@@ -158,7 +158,7 @@ class CanonicalConstraint:
158
158
  keep_feasible = np.empty(0, dtype=bool)
159
159
 
160
160
  if cfun.sparse_jacobian:
161
- empty_jac = sps.csr_matrix((0, n))
161
+ empty_jac = sps.csr_array((0, n))
162
162
  else:
163
163
  empty_jac = np.empty((0, n))
164
164
 
@@ -174,7 +174,7 @@ class CanonicalConstraint:
174
174
  empty_fun = np.empty(0)
175
175
  n = cfun.n
176
176
  if cfun.sparse_jacobian:
177
- empty_jac = sps.csr_matrix((0, n))
177
+ empty_jac = sps.csr_array((0, n))
178
178
  else:
179
179
  empty_jac = np.empty((0, n))
180
180
 
@@ -185,7 +185,7 @@ class CanonicalConstraint:
185
185
  empty_fun = np.empty(0)
186
186
  n = cfun.n
187
187
  if cfun.sparse_jacobian:
188
- empty_jac = sps.csr_matrix((0, n))
188
+ empty_jac = sps.csr_array((0, n))
189
189
  else:
190
190
  empty_jac = np.empty((0, n))
191
191
 
@@ -225,7 +225,7 @@ class CanonicalConstraint:
225
225
  empty_fun = np.empty(0)
226
226
  n = cfun.n
227
227
  if cfun.sparse_jacobian:
228
- empty_jac = sps.csr_matrix((0, n))
228
+ empty_jac = sps.csr_array((0, n))
229
229
  else:
230
230
  empty_jac = np.empty((0, n))
231
231
 
@@ -379,7 +379,7 @@ def initial_constraints_as_canonical(n, prepared_constraints, sparse_jacobian):
379
379
 
380
380
  if sparse_jacobian:
381
381
  vstack = sps.vstack
382
- empty = sps.csr_matrix((0, n))
382
+ empty = sps.csr_array((0, n))
383
383
  else:
384
384
  vstack = np.vstack
385
385
  empty = np.empty((0, n))
@@ -1,6 +1,6 @@
1
1
  """Byrd-Omojokun Trust-Region SQP method."""
2
2
 
3
- from scipy.sparse import eye as speye
3
+ from scipy.sparse import eye_array as speye
4
4
  from .projections import projections
5
5
  from .qp_subproblem import modified_dogleg, projected_cg, box_intersections
6
6
  import numpy as np