scipy 1.16.2__cp313-cp313t-win_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 (1530) hide show
  1. scipy/__config__.py +161 -0
  2. scipy/__init__.py +150 -0
  3. scipy/_cyutility.cp313t-win_arm64.lib +0 -0
  4. scipy/_cyutility.cp313t-win_arm64.pyd +0 -0
  5. scipy/_distributor_init.py +18 -0
  6. scipy/_lib/__init__.py +14 -0
  7. scipy/_lib/_array_api.py +931 -0
  8. scipy/_lib/_array_api_compat_vendor.py +9 -0
  9. scipy/_lib/_array_api_no_0d.py +103 -0
  10. scipy/_lib/_bunch.py +229 -0
  11. scipy/_lib/_ccallback.py +251 -0
  12. scipy/_lib/_ccallback_c.cp313t-win_arm64.lib +0 -0
  13. scipy/_lib/_ccallback_c.cp313t-win_arm64.pyd +0 -0
  14. scipy/_lib/_disjoint_set.py +254 -0
  15. scipy/_lib/_docscrape.py +761 -0
  16. scipy/_lib/_elementwise_iterative_method.py +346 -0
  17. scipy/_lib/_fpumode.cp313t-win_arm64.lib +0 -0
  18. scipy/_lib/_fpumode.cp313t-win_arm64.pyd +0 -0
  19. scipy/_lib/_gcutils.py +105 -0
  20. scipy/_lib/_pep440.py +487 -0
  21. scipy/_lib/_sparse.py +41 -0
  22. scipy/_lib/_test_ccallback.cp313t-win_arm64.lib +0 -0
  23. scipy/_lib/_test_ccallback.cp313t-win_arm64.pyd +0 -0
  24. scipy/_lib/_test_deprecation_call.cp313t-win_arm64.lib +0 -0
  25. scipy/_lib/_test_deprecation_call.cp313t-win_arm64.pyd +0 -0
  26. scipy/_lib/_test_deprecation_def.cp313t-win_arm64.lib +0 -0
  27. scipy/_lib/_test_deprecation_def.cp313t-win_arm64.pyd +0 -0
  28. scipy/_lib/_testutils.py +373 -0
  29. scipy/_lib/_threadsafety.py +58 -0
  30. scipy/_lib/_tmpdirs.py +86 -0
  31. scipy/_lib/_uarray/LICENSE +29 -0
  32. scipy/_lib/_uarray/__init__.py +116 -0
  33. scipy/_lib/_uarray/_backend.py +707 -0
  34. scipy/_lib/_uarray/_uarray.cp313t-win_arm64.lib +0 -0
  35. scipy/_lib/_uarray/_uarray.cp313t-win_arm64.pyd +0 -0
  36. scipy/_lib/_util.py +1283 -0
  37. scipy/_lib/array_api_compat/__init__.py +22 -0
  38. scipy/_lib/array_api_compat/_internal.py +59 -0
  39. scipy/_lib/array_api_compat/common/__init__.py +1 -0
  40. scipy/_lib/array_api_compat/common/_aliases.py +727 -0
  41. scipy/_lib/array_api_compat/common/_fft.py +213 -0
  42. scipy/_lib/array_api_compat/common/_helpers.py +1058 -0
  43. scipy/_lib/array_api_compat/common/_linalg.py +232 -0
  44. scipy/_lib/array_api_compat/common/_typing.py +192 -0
  45. scipy/_lib/array_api_compat/cupy/__init__.py +13 -0
  46. scipy/_lib/array_api_compat/cupy/_aliases.py +156 -0
  47. scipy/_lib/array_api_compat/cupy/_info.py +336 -0
  48. scipy/_lib/array_api_compat/cupy/_typing.py +31 -0
  49. scipy/_lib/array_api_compat/cupy/fft.py +36 -0
  50. scipy/_lib/array_api_compat/cupy/linalg.py +49 -0
  51. scipy/_lib/array_api_compat/dask/__init__.py +0 -0
  52. scipy/_lib/array_api_compat/dask/array/__init__.py +12 -0
  53. scipy/_lib/array_api_compat/dask/array/_aliases.py +376 -0
  54. scipy/_lib/array_api_compat/dask/array/_info.py +416 -0
  55. scipy/_lib/array_api_compat/dask/array/fft.py +21 -0
  56. scipy/_lib/array_api_compat/dask/array/linalg.py +72 -0
  57. scipy/_lib/array_api_compat/numpy/__init__.py +28 -0
  58. scipy/_lib/array_api_compat/numpy/_aliases.py +190 -0
  59. scipy/_lib/array_api_compat/numpy/_info.py +366 -0
  60. scipy/_lib/array_api_compat/numpy/_typing.py +30 -0
  61. scipy/_lib/array_api_compat/numpy/fft.py +35 -0
  62. scipy/_lib/array_api_compat/numpy/linalg.py +143 -0
  63. scipy/_lib/array_api_compat/torch/__init__.py +22 -0
  64. scipy/_lib/array_api_compat/torch/_aliases.py +855 -0
  65. scipy/_lib/array_api_compat/torch/_info.py +369 -0
  66. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  67. scipy/_lib/array_api_compat/torch/fft.py +85 -0
  68. scipy/_lib/array_api_compat/torch/linalg.py +121 -0
  69. scipy/_lib/array_api_extra/__init__.py +38 -0
  70. scipy/_lib/array_api_extra/_delegation.py +171 -0
  71. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  72. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  73. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  74. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  75. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  76. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  77. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  78. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  79. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  80. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  81. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  82. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  83. scipy/_lib/array_api_extra/testing.py +359 -0
  84. scipy/_lib/cobyqa/__init__.py +20 -0
  85. scipy/_lib/cobyqa/framework.py +1240 -0
  86. scipy/_lib/cobyqa/main.py +1506 -0
  87. scipy/_lib/cobyqa/models.py +1529 -0
  88. scipy/_lib/cobyqa/problem.py +1296 -0
  89. scipy/_lib/cobyqa/settings.py +132 -0
  90. scipy/_lib/cobyqa/subsolvers/__init__.py +14 -0
  91. scipy/_lib/cobyqa/subsolvers/geometry.py +387 -0
  92. scipy/_lib/cobyqa/subsolvers/optim.py +1203 -0
  93. scipy/_lib/cobyqa/utils/__init__.py +18 -0
  94. scipy/_lib/cobyqa/utils/exceptions.py +22 -0
  95. scipy/_lib/cobyqa/utils/math.py +77 -0
  96. scipy/_lib/cobyqa/utils/versions.py +67 -0
  97. scipy/_lib/decorator.py +399 -0
  98. scipy/_lib/deprecation.py +274 -0
  99. scipy/_lib/doccer.py +366 -0
  100. scipy/_lib/messagestream.cp313t-win_arm64.lib +0 -0
  101. scipy/_lib/messagestream.cp313t-win_arm64.pyd +0 -0
  102. scipy/_lib/pyprima/__init__.py +212 -0
  103. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  104. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  105. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  106. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  107. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  108. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  109. scipy/_lib/pyprima/cobyla/update.py +289 -0
  110. scipy/_lib/pyprima/common/__init__.py +0 -0
  111. scipy/_lib/pyprima/common/_bounds.py +34 -0
  112. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  113. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  114. scipy/_lib/pyprima/common/_project.py +173 -0
  115. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  116. scipy/_lib/pyprima/common/consts.py +47 -0
  117. scipy/_lib/pyprima/common/evaluate.py +99 -0
  118. scipy/_lib/pyprima/common/history.py +38 -0
  119. scipy/_lib/pyprima/common/infos.py +30 -0
  120. scipy/_lib/pyprima/common/linalg.py +435 -0
  121. scipy/_lib/pyprima/common/message.py +290 -0
  122. scipy/_lib/pyprima/common/powalg.py +131 -0
  123. scipy/_lib/pyprima/common/preproc.py +277 -0
  124. scipy/_lib/pyprima/common/present.py +5 -0
  125. scipy/_lib/pyprima/common/ratio.py +54 -0
  126. scipy/_lib/pyprima/common/redrho.py +47 -0
  127. scipy/_lib/pyprima/common/selectx.py +296 -0
  128. scipy/_lib/tests/__init__.py +0 -0
  129. scipy/_lib/tests/test__gcutils.py +110 -0
  130. scipy/_lib/tests/test__pep440.py +67 -0
  131. scipy/_lib/tests/test__testutils.py +32 -0
  132. scipy/_lib/tests/test__threadsafety.py +51 -0
  133. scipy/_lib/tests/test__util.py +641 -0
  134. scipy/_lib/tests/test_array_api.py +322 -0
  135. scipy/_lib/tests/test_bunch.py +169 -0
  136. scipy/_lib/tests/test_ccallback.py +196 -0
  137. scipy/_lib/tests/test_config.py +45 -0
  138. scipy/_lib/tests/test_deprecation.py +10 -0
  139. scipy/_lib/tests/test_doccer.py +143 -0
  140. scipy/_lib/tests/test_import_cycles.py +18 -0
  141. scipy/_lib/tests/test_public_api.py +482 -0
  142. scipy/_lib/tests/test_scipy_version.py +28 -0
  143. scipy/_lib/tests/test_tmpdirs.py +48 -0
  144. scipy/_lib/tests/test_warnings.py +137 -0
  145. scipy/_lib/uarray.py +31 -0
  146. scipy/cluster/__init__.py +31 -0
  147. scipy/cluster/_hierarchy.cp313t-win_arm64.lib +0 -0
  148. scipy/cluster/_hierarchy.cp313t-win_arm64.pyd +0 -0
  149. scipy/cluster/_optimal_leaf_ordering.cp313t-win_arm64.lib +0 -0
  150. scipy/cluster/_optimal_leaf_ordering.cp313t-win_arm64.pyd +0 -0
  151. scipy/cluster/_vq.cp313t-win_arm64.lib +0 -0
  152. scipy/cluster/_vq.cp313t-win_arm64.pyd +0 -0
  153. scipy/cluster/hierarchy.py +4348 -0
  154. scipy/cluster/tests/__init__.py +0 -0
  155. scipy/cluster/tests/hierarchy_test_data.py +145 -0
  156. scipy/cluster/tests/test_disjoint_set.py +202 -0
  157. scipy/cluster/tests/test_hierarchy.py +1238 -0
  158. scipy/cluster/tests/test_vq.py +434 -0
  159. scipy/cluster/vq.py +832 -0
  160. scipy/conftest.py +683 -0
  161. scipy/constants/__init__.py +358 -0
  162. scipy/constants/_codata.py +2266 -0
  163. scipy/constants/_constants.py +369 -0
  164. scipy/constants/codata.py +21 -0
  165. scipy/constants/constants.py +53 -0
  166. scipy/constants/tests/__init__.py +0 -0
  167. scipy/constants/tests/test_codata.py +78 -0
  168. scipy/constants/tests/test_constants.py +83 -0
  169. scipy/datasets/__init__.py +90 -0
  170. scipy/datasets/_download_all.py +71 -0
  171. scipy/datasets/_fetchers.py +225 -0
  172. scipy/datasets/_registry.py +26 -0
  173. scipy/datasets/_utils.py +81 -0
  174. scipy/datasets/tests/__init__.py +0 -0
  175. scipy/datasets/tests/test_data.py +128 -0
  176. scipy/differentiate/__init__.py +27 -0
  177. scipy/differentiate/_differentiate.py +1129 -0
  178. scipy/differentiate/tests/__init__.py +0 -0
  179. scipy/differentiate/tests/test_differentiate.py +694 -0
  180. scipy/fft/__init__.py +114 -0
  181. scipy/fft/_backend.py +196 -0
  182. scipy/fft/_basic.py +1650 -0
  183. scipy/fft/_basic_backend.py +197 -0
  184. scipy/fft/_debug_backends.py +22 -0
  185. scipy/fft/_fftlog.py +223 -0
  186. scipy/fft/_fftlog_backend.py +200 -0
  187. scipy/fft/_helper.py +348 -0
  188. scipy/fft/_pocketfft/LICENSE.md +25 -0
  189. scipy/fft/_pocketfft/__init__.py +9 -0
  190. scipy/fft/_pocketfft/basic.py +251 -0
  191. scipy/fft/_pocketfft/helper.py +249 -0
  192. scipy/fft/_pocketfft/pypocketfft.cp313t-win_arm64.lib +0 -0
  193. scipy/fft/_pocketfft/pypocketfft.cp313t-win_arm64.pyd +0 -0
  194. scipy/fft/_pocketfft/realtransforms.py +109 -0
  195. scipy/fft/_pocketfft/tests/__init__.py +0 -0
  196. scipy/fft/_pocketfft/tests/test_basic.py +1011 -0
  197. scipy/fft/_pocketfft/tests/test_real_transforms.py +505 -0
  198. scipy/fft/_realtransforms.py +706 -0
  199. scipy/fft/_realtransforms_backend.py +63 -0
  200. scipy/fft/tests/__init__.py +0 -0
  201. scipy/fft/tests/mock_backend.py +96 -0
  202. scipy/fft/tests/test_backend.py +98 -0
  203. scipy/fft/tests/test_basic.py +504 -0
  204. scipy/fft/tests/test_fftlog.py +215 -0
  205. scipy/fft/tests/test_helper.py +558 -0
  206. scipy/fft/tests/test_multithreading.py +84 -0
  207. scipy/fft/tests/test_real_transforms.py +247 -0
  208. scipy/fftpack/__init__.py +103 -0
  209. scipy/fftpack/_basic.py +428 -0
  210. scipy/fftpack/_helper.py +115 -0
  211. scipy/fftpack/_pseudo_diffs.py +554 -0
  212. scipy/fftpack/_realtransforms.py +598 -0
  213. scipy/fftpack/basic.py +20 -0
  214. scipy/fftpack/convolve.cp313t-win_arm64.lib +0 -0
  215. scipy/fftpack/convolve.cp313t-win_arm64.pyd +0 -0
  216. scipy/fftpack/helper.py +19 -0
  217. scipy/fftpack/pseudo_diffs.py +22 -0
  218. scipy/fftpack/realtransforms.py +19 -0
  219. scipy/fftpack/tests/__init__.py +0 -0
  220. scipy/fftpack/tests/fftw_double_ref.npz +0 -0
  221. scipy/fftpack/tests/fftw_longdouble_ref.npz +0 -0
  222. scipy/fftpack/tests/fftw_single_ref.npz +0 -0
  223. scipy/fftpack/tests/test.npz +0 -0
  224. scipy/fftpack/tests/test_basic.py +877 -0
  225. scipy/fftpack/tests/test_helper.py +54 -0
  226. scipy/fftpack/tests/test_import.py +33 -0
  227. scipy/fftpack/tests/test_pseudo_diffs.py +388 -0
  228. scipy/fftpack/tests/test_real_transforms.py +836 -0
  229. scipy/integrate/__init__.py +122 -0
  230. scipy/integrate/_bvp.py +1160 -0
  231. scipy/integrate/_cubature.py +729 -0
  232. scipy/integrate/_dop.cp313t-win_arm64.lib +0 -0
  233. scipy/integrate/_dop.cp313t-win_arm64.pyd +0 -0
  234. scipy/integrate/_ivp/__init__.py +8 -0
  235. scipy/integrate/_ivp/base.py +290 -0
  236. scipy/integrate/_ivp/bdf.py +478 -0
  237. scipy/integrate/_ivp/common.py +451 -0
  238. scipy/integrate/_ivp/dop853_coefficients.py +193 -0
  239. scipy/integrate/_ivp/ivp.py +755 -0
  240. scipy/integrate/_ivp/lsoda.py +224 -0
  241. scipy/integrate/_ivp/radau.py +572 -0
  242. scipy/integrate/_ivp/rk.py +601 -0
  243. scipy/integrate/_ivp/tests/__init__.py +0 -0
  244. scipy/integrate/_ivp/tests/test_ivp.py +1287 -0
  245. scipy/integrate/_ivp/tests/test_rk.py +37 -0
  246. scipy/integrate/_lebedev.py +5450 -0
  247. scipy/integrate/_lsoda.cp313t-win_arm64.lib +0 -0
  248. scipy/integrate/_lsoda.cp313t-win_arm64.pyd +0 -0
  249. scipy/integrate/_ode.py +1395 -0
  250. scipy/integrate/_odepack.cp313t-win_arm64.lib +0 -0
  251. scipy/integrate/_odepack.cp313t-win_arm64.pyd +0 -0
  252. scipy/integrate/_odepack_py.py +273 -0
  253. scipy/integrate/_quad_vec.py +674 -0
  254. scipy/integrate/_quadpack.cp313t-win_arm64.lib +0 -0
  255. scipy/integrate/_quadpack.cp313t-win_arm64.pyd +0 -0
  256. scipy/integrate/_quadpack_py.py +1283 -0
  257. scipy/integrate/_quadrature.py +1336 -0
  258. scipy/integrate/_rules/__init__.py +12 -0
  259. scipy/integrate/_rules/_base.py +518 -0
  260. scipy/integrate/_rules/_gauss_kronrod.py +202 -0
  261. scipy/integrate/_rules/_gauss_legendre.py +62 -0
  262. scipy/integrate/_rules/_genz_malik.py +210 -0
  263. scipy/integrate/_tanhsinh.py +1385 -0
  264. scipy/integrate/_test_multivariate.cp313t-win_arm64.lib +0 -0
  265. scipy/integrate/_test_multivariate.cp313t-win_arm64.pyd +0 -0
  266. scipy/integrate/_test_odeint_banded.cp313t-win_arm64.lib +0 -0
  267. scipy/integrate/_test_odeint_banded.cp313t-win_arm64.pyd +0 -0
  268. scipy/integrate/_vode.cp313t-win_arm64.lib +0 -0
  269. scipy/integrate/_vode.cp313t-win_arm64.pyd +0 -0
  270. scipy/integrate/dop.py +15 -0
  271. scipy/integrate/lsoda.py +15 -0
  272. scipy/integrate/odepack.py +17 -0
  273. scipy/integrate/quadpack.py +23 -0
  274. scipy/integrate/tests/__init__.py +0 -0
  275. scipy/integrate/tests/test__quad_vec.py +211 -0
  276. scipy/integrate/tests/test_banded_ode_solvers.py +305 -0
  277. scipy/integrate/tests/test_bvp.py +714 -0
  278. scipy/integrate/tests/test_cubature.py +1375 -0
  279. scipy/integrate/tests/test_integrate.py +840 -0
  280. scipy/integrate/tests/test_odeint_jac.py +74 -0
  281. scipy/integrate/tests/test_quadpack.py +680 -0
  282. scipy/integrate/tests/test_quadrature.py +730 -0
  283. scipy/integrate/tests/test_tanhsinh.py +1171 -0
  284. scipy/integrate/vode.py +15 -0
  285. scipy/interpolate/__init__.py +228 -0
  286. scipy/interpolate/_bary_rational.py +715 -0
  287. scipy/interpolate/_bsplines.py +2469 -0
  288. scipy/interpolate/_cubic.py +973 -0
  289. scipy/interpolate/_dfitpack.cp313t-win_arm64.lib +0 -0
  290. scipy/interpolate/_dfitpack.cp313t-win_arm64.pyd +0 -0
  291. scipy/interpolate/_dierckx.cp313t-win_arm64.lib +0 -0
  292. scipy/interpolate/_dierckx.cp313t-win_arm64.pyd +0 -0
  293. scipy/interpolate/_fitpack.cp313t-win_arm64.lib +0 -0
  294. scipy/interpolate/_fitpack.cp313t-win_arm64.pyd +0 -0
  295. scipy/interpolate/_fitpack2.py +2397 -0
  296. scipy/interpolate/_fitpack_impl.py +811 -0
  297. scipy/interpolate/_fitpack_py.py +898 -0
  298. scipy/interpolate/_fitpack_repro.py +996 -0
  299. scipy/interpolate/_interpnd.cp313t-win_arm64.lib +0 -0
  300. scipy/interpolate/_interpnd.cp313t-win_arm64.pyd +0 -0
  301. scipy/interpolate/_interpolate.py +2266 -0
  302. scipy/interpolate/_ndbspline.py +415 -0
  303. scipy/interpolate/_ndgriddata.py +329 -0
  304. scipy/interpolate/_pade.py +67 -0
  305. scipy/interpolate/_polyint.py +1025 -0
  306. scipy/interpolate/_ppoly.cp313t-win_arm64.lib +0 -0
  307. scipy/interpolate/_ppoly.cp313t-win_arm64.pyd +0 -0
  308. scipy/interpolate/_rbf.py +290 -0
  309. scipy/interpolate/_rbfinterp.py +550 -0
  310. scipy/interpolate/_rbfinterp_pythran.cp313t-win_arm64.lib +0 -0
  311. scipy/interpolate/_rbfinterp_pythran.cp313t-win_arm64.pyd +0 -0
  312. scipy/interpolate/_rgi.py +764 -0
  313. scipy/interpolate/_rgi_cython.cp313t-win_arm64.lib +0 -0
  314. scipy/interpolate/_rgi_cython.cp313t-win_arm64.pyd +0 -0
  315. scipy/interpolate/dfitpack.py +24 -0
  316. scipy/interpolate/fitpack.py +31 -0
  317. scipy/interpolate/fitpack2.py +29 -0
  318. scipy/interpolate/interpnd.py +24 -0
  319. scipy/interpolate/interpolate.py +30 -0
  320. scipy/interpolate/ndgriddata.py +23 -0
  321. scipy/interpolate/polyint.py +24 -0
  322. scipy/interpolate/rbf.py +18 -0
  323. scipy/interpolate/tests/__init__.py +0 -0
  324. scipy/interpolate/tests/data/bug-1310.npz +0 -0
  325. scipy/interpolate/tests/data/estimate_gradients_hang.npy +0 -0
  326. scipy/interpolate/tests/data/gcvspl.npz +0 -0
  327. scipy/interpolate/tests/test_bary_rational.py +368 -0
  328. scipy/interpolate/tests/test_bsplines.py +3754 -0
  329. scipy/interpolate/tests/test_fitpack.py +519 -0
  330. scipy/interpolate/tests/test_fitpack2.py +1431 -0
  331. scipy/interpolate/tests/test_gil.py +64 -0
  332. scipy/interpolate/tests/test_interpnd.py +452 -0
  333. scipy/interpolate/tests/test_interpolate.py +2630 -0
  334. scipy/interpolate/tests/test_ndgriddata.py +308 -0
  335. scipy/interpolate/tests/test_pade.py +107 -0
  336. scipy/interpolate/tests/test_polyint.py +972 -0
  337. scipy/interpolate/tests/test_rbf.py +246 -0
  338. scipy/interpolate/tests/test_rbfinterp.py +534 -0
  339. scipy/interpolate/tests/test_rgi.py +1151 -0
  340. scipy/io/__init__.py +116 -0
  341. scipy/io/_fast_matrix_market/__init__.py +600 -0
  342. scipy/io/_fast_matrix_market/_fmm_core.cp313t-win_arm64.lib +0 -0
  343. scipy/io/_fast_matrix_market/_fmm_core.cp313t-win_arm64.pyd +0 -0
  344. scipy/io/_fortran.py +354 -0
  345. scipy/io/_harwell_boeing/__init__.py +7 -0
  346. scipy/io/_harwell_boeing/_fortran_format_parser.py +316 -0
  347. scipy/io/_harwell_boeing/hb.py +571 -0
  348. scipy/io/_harwell_boeing/tests/__init__.py +0 -0
  349. scipy/io/_harwell_boeing/tests/test_fortran_format.py +74 -0
  350. scipy/io/_harwell_boeing/tests/test_hb.py +70 -0
  351. scipy/io/_idl.py +917 -0
  352. scipy/io/_mmio.py +968 -0
  353. scipy/io/_netcdf.py +1104 -0
  354. scipy/io/_test_fortran.cp313t-win_arm64.lib +0 -0
  355. scipy/io/_test_fortran.cp313t-win_arm64.pyd +0 -0
  356. scipy/io/arff/__init__.py +28 -0
  357. scipy/io/arff/_arffread.py +873 -0
  358. scipy/io/arff/arffread.py +19 -0
  359. scipy/io/arff/tests/__init__.py +0 -0
  360. scipy/io/arff/tests/data/iris.arff +225 -0
  361. scipy/io/arff/tests/data/missing.arff +8 -0
  362. scipy/io/arff/tests/data/nodata.arff +11 -0
  363. scipy/io/arff/tests/data/quoted_nominal.arff +13 -0
  364. scipy/io/arff/tests/data/quoted_nominal_spaces.arff +13 -0
  365. scipy/io/arff/tests/data/test1.arff +10 -0
  366. scipy/io/arff/tests/data/test10.arff +8 -0
  367. scipy/io/arff/tests/data/test11.arff +11 -0
  368. scipy/io/arff/tests/data/test2.arff +15 -0
  369. scipy/io/arff/tests/data/test3.arff +6 -0
  370. scipy/io/arff/tests/data/test4.arff +11 -0
  371. scipy/io/arff/tests/data/test5.arff +26 -0
  372. scipy/io/arff/tests/data/test6.arff +12 -0
  373. scipy/io/arff/tests/data/test7.arff +15 -0
  374. scipy/io/arff/tests/data/test8.arff +12 -0
  375. scipy/io/arff/tests/data/test9.arff +14 -0
  376. scipy/io/arff/tests/test_arffread.py +421 -0
  377. scipy/io/harwell_boeing.py +17 -0
  378. scipy/io/idl.py +17 -0
  379. scipy/io/matlab/__init__.py +66 -0
  380. scipy/io/matlab/_byteordercodes.py +75 -0
  381. scipy/io/matlab/_mio.py +375 -0
  382. scipy/io/matlab/_mio4.py +632 -0
  383. scipy/io/matlab/_mio5.py +901 -0
  384. scipy/io/matlab/_mio5_params.py +281 -0
  385. scipy/io/matlab/_mio5_utils.cp313t-win_arm64.lib +0 -0
  386. scipy/io/matlab/_mio5_utils.cp313t-win_arm64.pyd +0 -0
  387. scipy/io/matlab/_mio_utils.cp313t-win_arm64.lib +0 -0
  388. scipy/io/matlab/_mio_utils.cp313t-win_arm64.pyd +0 -0
  389. scipy/io/matlab/_miobase.py +435 -0
  390. scipy/io/matlab/_streams.cp313t-win_arm64.lib +0 -0
  391. scipy/io/matlab/_streams.cp313t-win_arm64.pyd +0 -0
  392. scipy/io/matlab/byteordercodes.py +17 -0
  393. scipy/io/matlab/mio.py +16 -0
  394. scipy/io/matlab/mio4.py +17 -0
  395. scipy/io/matlab/mio5.py +19 -0
  396. scipy/io/matlab/mio5_params.py +18 -0
  397. scipy/io/matlab/mio5_utils.py +17 -0
  398. scipy/io/matlab/mio_utils.py +17 -0
  399. scipy/io/matlab/miobase.py +16 -0
  400. scipy/io/matlab/streams.py +16 -0
  401. scipy/io/matlab/tests/__init__.py +0 -0
  402. scipy/io/matlab/tests/data/bad_miuint32.mat +0 -0
  403. scipy/io/matlab/tests/data/bad_miutf8_array_name.mat +0 -0
  404. scipy/io/matlab/tests/data/big_endian.mat +0 -0
  405. scipy/io/matlab/tests/data/broken_utf8.mat +0 -0
  406. scipy/io/matlab/tests/data/corrupted_zlib_checksum.mat +0 -0
  407. scipy/io/matlab/tests/data/corrupted_zlib_data.mat +0 -0
  408. scipy/io/matlab/tests/data/debigged_m4.mat +0 -0
  409. scipy/io/matlab/tests/data/japanese_utf8.txt +5 -0
  410. scipy/io/matlab/tests/data/little_endian.mat +0 -0
  411. scipy/io/matlab/tests/data/logical_sparse.mat +0 -0
  412. scipy/io/matlab/tests/data/malformed1.mat +0 -0
  413. scipy/io/matlab/tests/data/miuint32_for_miint32.mat +0 -0
  414. scipy/io/matlab/tests/data/miutf8_array_name.mat +0 -0
  415. scipy/io/matlab/tests/data/nasty_duplicate_fieldnames.mat +0 -0
  416. scipy/io/matlab/tests/data/one_by_zero_char.mat +0 -0
  417. scipy/io/matlab/tests/data/parabola.mat +0 -0
  418. scipy/io/matlab/tests/data/single_empty_string.mat +0 -0
  419. scipy/io/matlab/tests/data/some_functions.mat +0 -0
  420. scipy/io/matlab/tests/data/sqr.mat +0 -0
  421. scipy/io/matlab/tests/data/test3dmatrix_6.1_SOL2.mat +0 -0
  422. scipy/io/matlab/tests/data/test3dmatrix_6.5.1_GLNX86.mat +0 -0
  423. scipy/io/matlab/tests/data/test3dmatrix_7.1_GLNX86.mat +0 -0
  424. scipy/io/matlab/tests/data/test3dmatrix_7.4_GLNX86.mat +0 -0
  425. scipy/io/matlab/tests/data/test_empty_struct.mat +0 -0
  426. scipy/io/matlab/tests/data/test_mat4_le_floats.mat +0 -0
  427. scipy/io/matlab/tests/data/test_skip_variable.mat +0 -0
  428. scipy/io/matlab/tests/data/testbool_8_WIN64.mat +0 -0
  429. scipy/io/matlab/tests/data/testcell_6.1_SOL2.mat +0 -0
  430. scipy/io/matlab/tests/data/testcell_6.5.1_GLNX86.mat +0 -0
  431. scipy/io/matlab/tests/data/testcell_7.1_GLNX86.mat +0 -0
  432. scipy/io/matlab/tests/data/testcell_7.4_GLNX86.mat +0 -0
  433. scipy/io/matlab/tests/data/testcellnest_6.1_SOL2.mat +0 -0
  434. scipy/io/matlab/tests/data/testcellnest_6.5.1_GLNX86.mat +0 -0
  435. scipy/io/matlab/tests/data/testcellnest_7.1_GLNX86.mat +0 -0
  436. scipy/io/matlab/tests/data/testcellnest_7.4_GLNX86.mat +0 -0
  437. scipy/io/matlab/tests/data/testcomplex_4.2c_SOL2.mat +0 -0
  438. scipy/io/matlab/tests/data/testcomplex_6.1_SOL2.mat +0 -0
  439. scipy/io/matlab/tests/data/testcomplex_6.5.1_GLNX86.mat +0 -0
  440. scipy/io/matlab/tests/data/testcomplex_7.1_GLNX86.mat +0 -0
  441. scipy/io/matlab/tests/data/testcomplex_7.4_GLNX86.mat +0 -0
  442. scipy/io/matlab/tests/data/testdouble_4.2c_SOL2.mat +0 -0
  443. scipy/io/matlab/tests/data/testdouble_6.1_SOL2.mat +0 -0
  444. scipy/io/matlab/tests/data/testdouble_6.5.1_GLNX86.mat +0 -0
  445. scipy/io/matlab/tests/data/testdouble_7.1_GLNX86.mat +0 -0
  446. scipy/io/matlab/tests/data/testdouble_7.4_GLNX86.mat +0 -0
  447. scipy/io/matlab/tests/data/testemptycell_5.3_SOL2.mat +0 -0
  448. scipy/io/matlab/tests/data/testemptycell_6.5.1_GLNX86.mat +0 -0
  449. scipy/io/matlab/tests/data/testemptycell_7.1_GLNX86.mat +0 -0
  450. scipy/io/matlab/tests/data/testemptycell_7.4_GLNX86.mat +0 -0
  451. scipy/io/matlab/tests/data/testfunc_7.4_GLNX86.mat +0 -0
  452. scipy/io/matlab/tests/data/testhdf5_7.4_GLNX86.mat +0 -0
  453. scipy/io/matlab/tests/data/testmatrix_4.2c_SOL2.mat +0 -0
  454. scipy/io/matlab/tests/data/testmatrix_6.1_SOL2.mat +0 -0
  455. scipy/io/matlab/tests/data/testmatrix_6.5.1_GLNX86.mat +0 -0
  456. scipy/io/matlab/tests/data/testmatrix_7.1_GLNX86.mat +0 -0
  457. scipy/io/matlab/tests/data/testmatrix_7.4_GLNX86.mat +0 -0
  458. scipy/io/matlab/tests/data/testminus_4.2c_SOL2.mat +0 -0
  459. scipy/io/matlab/tests/data/testminus_6.1_SOL2.mat +0 -0
  460. scipy/io/matlab/tests/data/testminus_6.5.1_GLNX86.mat +0 -0
  461. scipy/io/matlab/tests/data/testminus_7.1_GLNX86.mat +0 -0
  462. scipy/io/matlab/tests/data/testminus_7.4_GLNX86.mat +0 -0
  463. scipy/io/matlab/tests/data/testmulti_4.2c_SOL2.mat +0 -0
  464. scipy/io/matlab/tests/data/testmulti_7.1_GLNX86.mat +0 -0
  465. scipy/io/matlab/tests/data/testmulti_7.4_GLNX86.mat +0 -0
  466. scipy/io/matlab/tests/data/testobject_6.1_SOL2.mat +0 -0
  467. scipy/io/matlab/tests/data/testobject_6.5.1_GLNX86.mat +0 -0
  468. scipy/io/matlab/tests/data/testobject_7.1_GLNX86.mat +0 -0
  469. scipy/io/matlab/tests/data/testobject_7.4_GLNX86.mat +0 -0
  470. scipy/io/matlab/tests/data/testonechar_4.2c_SOL2.mat +0 -0
  471. scipy/io/matlab/tests/data/testonechar_6.1_SOL2.mat +0 -0
  472. scipy/io/matlab/tests/data/testonechar_6.5.1_GLNX86.mat +0 -0
  473. scipy/io/matlab/tests/data/testonechar_7.1_GLNX86.mat +0 -0
  474. scipy/io/matlab/tests/data/testonechar_7.4_GLNX86.mat +0 -0
  475. scipy/io/matlab/tests/data/testscalarcell_7.4_GLNX86.mat +0 -0
  476. scipy/io/matlab/tests/data/testsimplecell.mat +0 -0
  477. scipy/io/matlab/tests/data/testsparse_4.2c_SOL2.mat +0 -0
  478. scipy/io/matlab/tests/data/testsparse_6.1_SOL2.mat +0 -0
  479. scipy/io/matlab/tests/data/testsparse_6.5.1_GLNX86.mat +0 -0
  480. scipy/io/matlab/tests/data/testsparse_7.1_GLNX86.mat +0 -0
  481. scipy/io/matlab/tests/data/testsparse_7.4_GLNX86.mat +0 -0
  482. scipy/io/matlab/tests/data/testsparsecomplex_4.2c_SOL2.mat +0 -0
  483. scipy/io/matlab/tests/data/testsparsecomplex_6.1_SOL2.mat +0 -0
  484. scipy/io/matlab/tests/data/testsparsecomplex_6.5.1_GLNX86.mat +0 -0
  485. scipy/io/matlab/tests/data/testsparsecomplex_7.1_GLNX86.mat +0 -0
  486. scipy/io/matlab/tests/data/testsparsecomplex_7.4_GLNX86.mat +0 -0
  487. scipy/io/matlab/tests/data/testsparsefloat_7.4_GLNX86.mat +0 -0
  488. scipy/io/matlab/tests/data/teststring_4.2c_SOL2.mat +0 -0
  489. scipy/io/matlab/tests/data/teststring_6.1_SOL2.mat +0 -0
  490. scipy/io/matlab/tests/data/teststring_6.5.1_GLNX86.mat +0 -0
  491. scipy/io/matlab/tests/data/teststring_7.1_GLNX86.mat +0 -0
  492. scipy/io/matlab/tests/data/teststring_7.4_GLNX86.mat +0 -0
  493. scipy/io/matlab/tests/data/teststringarray_4.2c_SOL2.mat +0 -0
  494. scipy/io/matlab/tests/data/teststringarray_6.1_SOL2.mat +0 -0
  495. scipy/io/matlab/tests/data/teststringarray_6.5.1_GLNX86.mat +0 -0
  496. scipy/io/matlab/tests/data/teststringarray_7.1_GLNX86.mat +0 -0
  497. scipy/io/matlab/tests/data/teststringarray_7.4_GLNX86.mat +0 -0
  498. scipy/io/matlab/tests/data/teststruct_6.1_SOL2.mat +0 -0
  499. scipy/io/matlab/tests/data/teststruct_6.5.1_GLNX86.mat +0 -0
  500. scipy/io/matlab/tests/data/teststruct_7.1_GLNX86.mat +0 -0
  501. scipy/io/matlab/tests/data/teststruct_7.4_GLNX86.mat +0 -0
  502. scipy/io/matlab/tests/data/teststructarr_6.1_SOL2.mat +0 -0
  503. scipy/io/matlab/tests/data/teststructarr_6.5.1_GLNX86.mat +0 -0
  504. scipy/io/matlab/tests/data/teststructarr_7.1_GLNX86.mat +0 -0
  505. scipy/io/matlab/tests/data/teststructarr_7.4_GLNX86.mat +0 -0
  506. scipy/io/matlab/tests/data/teststructnest_6.1_SOL2.mat +0 -0
  507. scipy/io/matlab/tests/data/teststructnest_6.5.1_GLNX86.mat +0 -0
  508. scipy/io/matlab/tests/data/teststructnest_7.1_GLNX86.mat +0 -0
  509. scipy/io/matlab/tests/data/teststructnest_7.4_GLNX86.mat +0 -0
  510. scipy/io/matlab/tests/data/testunicode_7.1_GLNX86.mat +0 -0
  511. scipy/io/matlab/tests/data/testunicode_7.4_GLNX86.mat +0 -0
  512. scipy/io/matlab/tests/data/testvec_4_GLNX86.mat +0 -0
  513. scipy/io/matlab/tests/test_byteordercodes.py +29 -0
  514. scipy/io/matlab/tests/test_mio.py +1399 -0
  515. scipy/io/matlab/tests/test_mio5_utils.py +179 -0
  516. scipy/io/matlab/tests/test_mio_funcs.py +51 -0
  517. scipy/io/matlab/tests/test_mio_utils.py +45 -0
  518. scipy/io/matlab/tests/test_miobase.py +32 -0
  519. scipy/io/matlab/tests/test_pathological.py +33 -0
  520. scipy/io/matlab/tests/test_streams.py +241 -0
  521. scipy/io/mmio.py +17 -0
  522. scipy/io/netcdf.py +17 -0
  523. scipy/io/tests/__init__.py +0 -0
  524. scipy/io/tests/data/Transparent Busy.ani +0 -0
  525. scipy/io/tests/data/array_float32_1d.sav +0 -0
  526. scipy/io/tests/data/array_float32_2d.sav +0 -0
  527. scipy/io/tests/data/array_float32_3d.sav +0 -0
  528. scipy/io/tests/data/array_float32_4d.sav +0 -0
  529. scipy/io/tests/data/array_float32_5d.sav +0 -0
  530. scipy/io/tests/data/array_float32_6d.sav +0 -0
  531. scipy/io/tests/data/array_float32_7d.sav +0 -0
  532. scipy/io/tests/data/array_float32_8d.sav +0 -0
  533. scipy/io/tests/data/array_float32_pointer_1d.sav +0 -0
  534. scipy/io/tests/data/array_float32_pointer_2d.sav +0 -0
  535. scipy/io/tests/data/array_float32_pointer_3d.sav +0 -0
  536. scipy/io/tests/data/array_float32_pointer_4d.sav +0 -0
  537. scipy/io/tests/data/array_float32_pointer_5d.sav +0 -0
  538. scipy/io/tests/data/array_float32_pointer_6d.sav +0 -0
  539. scipy/io/tests/data/array_float32_pointer_7d.sav +0 -0
  540. scipy/io/tests/data/array_float32_pointer_8d.sav +0 -0
  541. scipy/io/tests/data/example_1.nc +0 -0
  542. scipy/io/tests/data/example_2.nc +0 -0
  543. scipy/io/tests/data/example_3_maskedvals.nc +0 -0
  544. scipy/io/tests/data/fortran-3x3d-2i.dat +0 -0
  545. scipy/io/tests/data/fortran-mixed.dat +0 -0
  546. scipy/io/tests/data/fortran-sf8-11x1x10.dat +0 -0
  547. scipy/io/tests/data/fortran-sf8-15x10x22.dat +0 -0
  548. scipy/io/tests/data/fortran-sf8-1x1x1.dat +0 -0
  549. scipy/io/tests/data/fortran-sf8-1x1x5.dat +0 -0
  550. scipy/io/tests/data/fortran-sf8-1x1x7.dat +0 -0
  551. scipy/io/tests/data/fortran-sf8-1x3x5.dat +0 -0
  552. scipy/io/tests/data/fortran-si4-11x1x10.dat +0 -0
  553. scipy/io/tests/data/fortran-si4-15x10x22.dat +0 -0
  554. scipy/io/tests/data/fortran-si4-1x1x1.dat +0 -0
  555. scipy/io/tests/data/fortran-si4-1x1x5.dat +0 -0
  556. scipy/io/tests/data/fortran-si4-1x1x7.dat +0 -0
  557. scipy/io/tests/data/fortran-si4-1x3x5.dat +0 -0
  558. scipy/io/tests/data/invalid_pointer.sav +0 -0
  559. scipy/io/tests/data/null_pointer.sav +0 -0
  560. scipy/io/tests/data/scalar_byte.sav +0 -0
  561. scipy/io/tests/data/scalar_byte_descr.sav +0 -0
  562. scipy/io/tests/data/scalar_complex32.sav +0 -0
  563. scipy/io/tests/data/scalar_complex64.sav +0 -0
  564. scipy/io/tests/data/scalar_float32.sav +0 -0
  565. scipy/io/tests/data/scalar_float64.sav +0 -0
  566. scipy/io/tests/data/scalar_heap_pointer.sav +0 -0
  567. scipy/io/tests/data/scalar_int16.sav +0 -0
  568. scipy/io/tests/data/scalar_int32.sav +0 -0
  569. scipy/io/tests/data/scalar_int64.sav +0 -0
  570. scipy/io/tests/data/scalar_string.sav +0 -0
  571. scipy/io/tests/data/scalar_uint16.sav +0 -0
  572. scipy/io/tests/data/scalar_uint32.sav +0 -0
  573. scipy/io/tests/data/scalar_uint64.sav +0 -0
  574. scipy/io/tests/data/struct_arrays.sav +0 -0
  575. scipy/io/tests/data/struct_arrays_byte_idl80.sav +0 -0
  576. scipy/io/tests/data/struct_arrays_replicated.sav +0 -0
  577. scipy/io/tests/data/struct_arrays_replicated_3d.sav +0 -0
  578. scipy/io/tests/data/struct_inherit.sav +0 -0
  579. scipy/io/tests/data/struct_pointer_arrays.sav +0 -0
  580. scipy/io/tests/data/struct_pointer_arrays_replicated.sav +0 -0
  581. scipy/io/tests/data/struct_pointer_arrays_replicated_3d.sav +0 -0
  582. scipy/io/tests/data/struct_pointers.sav +0 -0
  583. scipy/io/tests/data/struct_pointers_replicated.sav +0 -0
  584. scipy/io/tests/data/struct_pointers_replicated_3d.sav +0 -0
  585. scipy/io/tests/data/struct_scalars.sav +0 -0
  586. scipy/io/tests/data/struct_scalars_replicated.sav +0 -0
  587. scipy/io/tests/data/struct_scalars_replicated_3d.sav +0 -0
  588. scipy/io/tests/data/test-1234Hz-le-1ch-10S-20bit-extra.wav +0 -0
  589. scipy/io/tests/data/test-44100Hz-2ch-32bit-float-be.wav +0 -0
  590. scipy/io/tests/data/test-44100Hz-2ch-32bit-float-le.wav +0 -0
  591. scipy/io/tests/data/test-44100Hz-be-1ch-4bytes.wav +0 -0
  592. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-early-eof-no-data.wav +0 -0
  593. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-early-eof.wav +0 -0
  594. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-incomplete-chunk.wav +0 -0
  595. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-rf64.wav +0 -0
  596. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes.wav +0 -0
  597. scipy/io/tests/data/test-48000Hz-2ch-64bit-float-le-wavex.wav +0 -0
  598. scipy/io/tests/data/test-8000Hz-be-3ch-5S-24bit.wav +0 -0
  599. scipy/io/tests/data/test-8000Hz-le-1ch-1byte-ulaw.wav +0 -0
  600. scipy/io/tests/data/test-8000Hz-le-2ch-1byteu.wav +0 -0
  601. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit-inconsistent.wav +0 -0
  602. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit-rf64.wav +0 -0
  603. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit.wav +0 -0
  604. scipy/io/tests/data/test-8000Hz-le-3ch-5S-36bit.wav +0 -0
  605. scipy/io/tests/data/test-8000Hz-le-3ch-5S-45bit.wav +0 -0
  606. scipy/io/tests/data/test-8000Hz-le-3ch-5S-53bit.wav +0 -0
  607. scipy/io/tests/data/test-8000Hz-le-3ch-5S-64bit.wav +0 -0
  608. scipy/io/tests/data/test-8000Hz-le-4ch-9S-12bit.wav +0 -0
  609. scipy/io/tests/data/test-8000Hz-le-5ch-9S-5bit.wav +0 -0
  610. scipy/io/tests/data/various_compressed.sav +0 -0
  611. scipy/io/tests/test_fortran.py +264 -0
  612. scipy/io/tests/test_idl.py +483 -0
  613. scipy/io/tests/test_mmio.py +831 -0
  614. scipy/io/tests/test_netcdf.py +550 -0
  615. scipy/io/tests/test_paths.py +93 -0
  616. scipy/io/tests/test_wavfile.py +501 -0
  617. scipy/io/wavfile.py +938 -0
  618. scipy/linalg/__init__.pxd +1 -0
  619. scipy/linalg/__init__.py +236 -0
  620. scipy/linalg/_basic.py +2146 -0
  621. scipy/linalg/_blas_subroutines.h +164 -0
  622. scipy/linalg/_cythonized_array_utils.cp313t-win_arm64.lib +0 -0
  623. scipy/linalg/_cythonized_array_utils.cp313t-win_arm64.pyd +0 -0
  624. scipy/linalg/_cythonized_array_utils.pxd +40 -0
  625. scipy/linalg/_cythonized_array_utils.pyi +16 -0
  626. scipy/linalg/_decomp.py +1645 -0
  627. scipy/linalg/_decomp_cholesky.py +413 -0
  628. scipy/linalg/_decomp_cossin.py +236 -0
  629. scipy/linalg/_decomp_interpolative.cp313t-win_arm64.lib +0 -0
  630. scipy/linalg/_decomp_interpolative.cp313t-win_arm64.pyd +0 -0
  631. scipy/linalg/_decomp_ldl.py +356 -0
  632. scipy/linalg/_decomp_lu.py +401 -0
  633. scipy/linalg/_decomp_lu_cython.cp313t-win_arm64.lib +0 -0
  634. scipy/linalg/_decomp_lu_cython.cp313t-win_arm64.pyd +0 -0
  635. scipy/linalg/_decomp_lu_cython.pyi +6 -0
  636. scipy/linalg/_decomp_polar.py +113 -0
  637. scipy/linalg/_decomp_qr.py +494 -0
  638. scipy/linalg/_decomp_qz.py +452 -0
  639. scipy/linalg/_decomp_schur.py +336 -0
  640. scipy/linalg/_decomp_svd.py +545 -0
  641. scipy/linalg/_decomp_update.cp313t-win_arm64.lib +0 -0
  642. scipy/linalg/_decomp_update.cp313t-win_arm64.pyd +0 -0
  643. scipy/linalg/_expm_frechet.py +417 -0
  644. scipy/linalg/_fblas.cp313t-win_arm64.lib +0 -0
  645. scipy/linalg/_fblas.cp313t-win_arm64.pyd +0 -0
  646. scipy/linalg/_flapack.cp313t-win_arm64.lib +0 -0
  647. scipy/linalg/_flapack.cp313t-win_arm64.pyd +0 -0
  648. scipy/linalg/_lapack_subroutines.h +1521 -0
  649. scipy/linalg/_linalg_pythran.cp313t-win_arm64.lib +0 -0
  650. scipy/linalg/_linalg_pythran.cp313t-win_arm64.pyd +0 -0
  651. scipy/linalg/_matfuncs.py +1050 -0
  652. scipy/linalg/_matfuncs_expm.cp313t-win_arm64.lib +0 -0
  653. scipy/linalg/_matfuncs_expm.cp313t-win_arm64.pyd +0 -0
  654. scipy/linalg/_matfuncs_expm.pyi +6 -0
  655. scipy/linalg/_matfuncs_inv_ssq.py +886 -0
  656. scipy/linalg/_matfuncs_schur_sqrtm.cp313t-win_arm64.lib +0 -0
  657. scipy/linalg/_matfuncs_schur_sqrtm.cp313t-win_arm64.pyd +0 -0
  658. scipy/linalg/_matfuncs_sqrtm.py +107 -0
  659. scipy/linalg/_matfuncs_sqrtm_triu.cp313t-win_arm64.lib +0 -0
  660. scipy/linalg/_matfuncs_sqrtm_triu.cp313t-win_arm64.pyd +0 -0
  661. scipy/linalg/_misc.py +191 -0
  662. scipy/linalg/_procrustes.py +113 -0
  663. scipy/linalg/_sketches.py +189 -0
  664. scipy/linalg/_solve_toeplitz.cp313t-win_arm64.lib +0 -0
  665. scipy/linalg/_solve_toeplitz.cp313t-win_arm64.pyd +0 -0
  666. scipy/linalg/_solvers.py +862 -0
  667. scipy/linalg/_special_matrices.py +1322 -0
  668. scipy/linalg/_testutils.py +65 -0
  669. scipy/linalg/basic.py +23 -0
  670. scipy/linalg/blas.py +495 -0
  671. scipy/linalg/cython_blas.cp313t-win_arm64.lib +0 -0
  672. scipy/linalg/cython_blas.cp313t-win_arm64.pyd +0 -0
  673. scipy/linalg/cython_blas.pxd +169 -0
  674. scipy/linalg/cython_blas.pyx +1432 -0
  675. scipy/linalg/cython_lapack.cp313t-win_arm64.lib +0 -0
  676. scipy/linalg/cython_lapack.cp313t-win_arm64.pyd +0 -0
  677. scipy/linalg/cython_lapack.pxd +1528 -0
  678. scipy/linalg/cython_lapack.pyx +12045 -0
  679. scipy/linalg/decomp.py +23 -0
  680. scipy/linalg/decomp_cholesky.py +21 -0
  681. scipy/linalg/decomp_lu.py +21 -0
  682. scipy/linalg/decomp_qr.py +20 -0
  683. scipy/linalg/decomp_schur.py +21 -0
  684. scipy/linalg/decomp_svd.py +21 -0
  685. scipy/linalg/interpolative.py +989 -0
  686. scipy/linalg/lapack.py +1081 -0
  687. scipy/linalg/matfuncs.py +23 -0
  688. scipy/linalg/misc.py +21 -0
  689. scipy/linalg/special_matrices.py +22 -0
  690. scipy/linalg/tests/__init__.py +0 -0
  691. scipy/linalg/tests/_cython_examples/extending.pyx +23 -0
  692. scipy/linalg/tests/_cython_examples/meson.build +34 -0
  693. scipy/linalg/tests/data/carex_15_data.npz +0 -0
  694. scipy/linalg/tests/data/carex_18_data.npz +0 -0
  695. scipy/linalg/tests/data/carex_19_data.npz +0 -0
  696. scipy/linalg/tests/data/carex_20_data.npz +0 -0
  697. scipy/linalg/tests/data/carex_6_data.npz +0 -0
  698. scipy/linalg/tests/data/gendare_20170120_data.npz +0 -0
  699. scipy/linalg/tests/test_basic.py +2074 -0
  700. scipy/linalg/tests/test_batch.py +588 -0
  701. scipy/linalg/tests/test_blas.py +1127 -0
  702. scipy/linalg/tests/test_cython_blas.py +118 -0
  703. scipy/linalg/tests/test_cython_lapack.py +22 -0
  704. scipy/linalg/tests/test_cythonized_array_utils.py +130 -0
  705. scipy/linalg/tests/test_decomp.py +3189 -0
  706. scipy/linalg/tests/test_decomp_cholesky.py +268 -0
  707. scipy/linalg/tests/test_decomp_cossin.py +314 -0
  708. scipy/linalg/tests/test_decomp_ldl.py +137 -0
  709. scipy/linalg/tests/test_decomp_lu.py +308 -0
  710. scipy/linalg/tests/test_decomp_polar.py +110 -0
  711. scipy/linalg/tests/test_decomp_update.py +1701 -0
  712. scipy/linalg/tests/test_extending.py +46 -0
  713. scipy/linalg/tests/test_fblas.py +607 -0
  714. scipy/linalg/tests/test_interpolative.py +232 -0
  715. scipy/linalg/tests/test_lapack.py +3620 -0
  716. scipy/linalg/tests/test_matfuncs.py +1125 -0
  717. scipy/linalg/tests/test_matmul_toeplitz.py +136 -0
  718. scipy/linalg/tests/test_procrustes.py +214 -0
  719. scipy/linalg/tests/test_sketches.py +118 -0
  720. scipy/linalg/tests/test_solve_toeplitz.py +150 -0
  721. scipy/linalg/tests/test_solvers.py +844 -0
  722. scipy/linalg/tests/test_special_matrices.py +636 -0
  723. scipy/misc/__init__.py +6 -0
  724. scipy/misc/common.py +6 -0
  725. scipy/misc/doccer.py +6 -0
  726. scipy/ndimage/__init__.py +174 -0
  727. scipy/ndimage/_ctest.cp313t-win_arm64.lib +0 -0
  728. scipy/ndimage/_ctest.cp313t-win_arm64.pyd +0 -0
  729. scipy/ndimage/_cytest.cp313t-win_arm64.lib +0 -0
  730. scipy/ndimage/_cytest.cp313t-win_arm64.pyd +0 -0
  731. scipy/ndimage/_delegators.py +303 -0
  732. scipy/ndimage/_filters.py +2422 -0
  733. scipy/ndimage/_fourier.py +306 -0
  734. scipy/ndimage/_interpolation.py +1033 -0
  735. scipy/ndimage/_measurements.py +1689 -0
  736. scipy/ndimage/_morphology.py +2634 -0
  737. scipy/ndimage/_nd_image.cp313t-win_arm64.lib +0 -0
  738. scipy/ndimage/_nd_image.cp313t-win_arm64.pyd +0 -0
  739. scipy/ndimage/_ndimage_api.py +16 -0
  740. scipy/ndimage/_ni_docstrings.py +214 -0
  741. scipy/ndimage/_ni_label.cp313t-win_arm64.lib +0 -0
  742. scipy/ndimage/_ni_label.cp313t-win_arm64.pyd +0 -0
  743. scipy/ndimage/_ni_support.py +139 -0
  744. scipy/ndimage/_rank_filter_1d.cp313t-win_arm64.lib +0 -0
  745. scipy/ndimage/_rank_filter_1d.cp313t-win_arm64.pyd +0 -0
  746. scipy/ndimage/_support_alternative_backends.py +84 -0
  747. scipy/ndimage/filters.py +27 -0
  748. scipy/ndimage/fourier.py +21 -0
  749. scipy/ndimage/interpolation.py +22 -0
  750. scipy/ndimage/measurements.py +24 -0
  751. scipy/ndimage/morphology.py +27 -0
  752. scipy/ndimage/tests/__init__.py +12 -0
  753. scipy/ndimage/tests/data/label_inputs.txt +21 -0
  754. scipy/ndimage/tests/data/label_results.txt +294 -0
  755. scipy/ndimage/tests/data/label_strels.txt +42 -0
  756. scipy/ndimage/tests/dots.png +0 -0
  757. scipy/ndimage/tests/test_c_api.py +102 -0
  758. scipy/ndimage/tests/test_datatypes.py +67 -0
  759. scipy/ndimage/tests/test_filters.py +3083 -0
  760. scipy/ndimage/tests/test_fourier.py +187 -0
  761. scipy/ndimage/tests/test_interpolation.py +1491 -0
  762. scipy/ndimage/tests/test_measurements.py +1592 -0
  763. scipy/ndimage/tests/test_morphology.py +2950 -0
  764. scipy/ndimage/tests/test_ni_support.py +78 -0
  765. scipy/ndimage/tests/test_splines.py +70 -0
  766. scipy/odr/__init__.py +131 -0
  767. scipy/odr/__odrpack.cp313t-win_arm64.lib +0 -0
  768. scipy/odr/__odrpack.cp313t-win_arm64.pyd +0 -0
  769. scipy/odr/_add_newdocs.py +34 -0
  770. scipy/odr/_models.py +315 -0
  771. scipy/odr/_odrpack.py +1154 -0
  772. scipy/odr/models.py +20 -0
  773. scipy/odr/odrpack.py +21 -0
  774. scipy/odr/tests/__init__.py +0 -0
  775. scipy/odr/tests/test_odr.py +607 -0
  776. scipy/optimize/__init__.pxd +1 -0
  777. scipy/optimize/__init__.py +460 -0
  778. scipy/optimize/_basinhopping.py +741 -0
  779. scipy/optimize/_bglu_dense.cp313t-win_arm64.lib +0 -0
  780. scipy/optimize/_bglu_dense.cp313t-win_arm64.pyd +0 -0
  781. scipy/optimize/_bracket.py +706 -0
  782. scipy/optimize/_chandrupatla.py +551 -0
  783. scipy/optimize/_cobyla_py.py +297 -0
  784. scipy/optimize/_cobyqa_py.py +72 -0
  785. scipy/optimize/_constraints.py +598 -0
  786. scipy/optimize/_dcsrch.py +728 -0
  787. scipy/optimize/_differentiable_functions.py +835 -0
  788. scipy/optimize/_differentialevolution.py +1970 -0
  789. scipy/optimize/_direct.cp313t-win_arm64.lib +0 -0
  790. scipy/optimize/_direct.cp313t-win_arm64.pyd +0 -0
  791. scipy/optimize/_direct_py.py +280 -0
  792. scipy/optimize/_dual_annealing.py +732 -0
  793. scipy/optimize/_elementwise.py +798 -0
  794. scipy/optimize/_group_columns.cp313t-win_arm64.lib +0 -0
  795. scipy/optimize/_group_columns.cp313t-win_arm64.pyd +0 -0
  796. scipy/optimize/_hessian_update_strategy.py +479 -0
  797. scipy/optimize/_highspy/__init__.py +0 -0
  798. scipy/optimize/_highspy/_core.cp313t-win_arm64.lib +0 -0
  799. scipy/optimize/_highspy/_core.cp313t-win_arm64.pyd +0 -0
  800. scipy/optimize/_highspy/_highs_options.cp313t-win_arm64.lib +0 -0
  801. scipy/optimize/_highspy/_highs_options.cp313t-win_arm64.pyd +0 -0
  802. scipy/optimize/_highspy/_highs_wrapper.py +338 -0
  803. scipy/optimize/_isotonic.py +157 -0
  804. scipy/optimize/_lbfgsb.cp313t-win_arm64.lib +0 -0
  805. scipy/optimize/_lbfgsb.cp313t-win_arm64.pyd +0 -0
  806. scipy/optimize/_lbfgsb_py.py +634 -0
  807. scipy/optimize/_linesearch.py +896 -0
  808. scipy/optimize/_linprog.py +733 -0
  809. scipy/optimize/_linprog_doc.py +1434 -0
  810. scipy/optimize/_linprog_highs.py +422 -0
  811. scipy/optimize/_linprog_ip.py +1141 -0
  812. scipy/optimize/_linprog_rs.py +572 -0
  813. scipy/optimize/_linprog_simplex.py +663 -0
  814. scipy/optimize/_linprog_util.py +1521 -0
  815. scipy/optimize/_lsap.cp313t-win_arm64.lib +0 -0
  816. scipy/optimize/_lsap.cp313t-win_arm64.pyd +0 -0
  817. scipy/optimize/_lsq/__init__.py +5 -0
  818. scipy/optimize/_lsq/bvls.py +183 -0
  819. scipy/optimize/_lsq/common.py +731 -0
  820. scipy/optimize/_lsq/dogbox.py +345 -0
  821. scipy/optimize/_lsq/givens_elimination.cp313t-win_arm64.lib +0 -0
  822. scipy/optimize/_lsq/givens_elimination.cp313t-win_arm64.pyd +0 -0
  823. scipy/optimize/_lsq/least_squares.py +1044 -0
  824. scipy/optimize/_lsq/lsq_linear.py +361 -0
  825. scipy/optimize/_lsq/trf.py +587 -0
  826. scipy/optimize/_lsq/trf_linear.py +249 -0
  827. scipy/optimize/_milp.py +394 -0
  828. scipy/optimize/_minimize.py +1199 -0
  829. scipy/optimize/_minpack.cp313t-win_arm64.lib +0 -0
  830. scipy/optimize/_minpack.cp313t-win_arm64.pyd +0 -0
  831. scipy/optimize/_minpack_py.py +1178 -0
  832. scipy/optimize/_moduleTNC.cp313t-win_arm64.lib +0 -0
  833. scipy/optimize/_moduleTNC.cp313t-win_arm64.pyd +0 -0
  834. scipy/optimize/_nnls.py +96 -0
  835. scipy/optimize/_nonlin.py +1634 -0
  836. scipy/optimize/_numdiff.py +963 -0
  837. scipy/optimize/_optimize.py +4169 -0
  838. scipy/optimize/_pava_pybind.cp313t-win_arm64.lib +0 -0
  839. scipy/optimize/_pava_pybind.cp313t-win_arm64.pyd +0 -0
  840. scipy/optimize/_qap.py +760 -0
  841. scipy/optimize/_remove_redundancy.py +522 -0
  842. scipy/optimize/_root.py +732 -0
  843. scipy/optimize/_root_scalar.py +538 -0
  844. scipy/optimize/_shgo.py +1606 -0
  845. scipy/optimize/_shgo_lib/__init__.py +0 -0
  846. scipy/optimize/_shgo_lib/_complex.py +1225 -0
  847. scipy/optimize/_shgo_lib/_vertex.py +460 -0
  848. scipy/optimize/_slsqp_py.py +603 -0
  849. scipy/optimize/_slsqplib.cp313t-win_arm64.lib +0 -0
  850. scipy/optimize/_slsqplib.cp313t-win_arm64.pyd +0 -0
  851. scipy/optimize/_spectral.py +260 -0
  852. scipy/optimize/_tnc.py +438 -0
  853. scipy/optimize/_trlib/__init__.py +12 -0
  854. scipy/optimize/_trlib/_trlib.cp313t-win_arm64.lib +0 -0
  855. scipy/optimize/_trlib/_trlib.cp313t-win_arm64.pyd +0 -0
  856. scipy/optimize/_trustregion.py +318 -0
  857. scipy/optimize/_trustregion_constr/__init__.py +6 -0
  858. scipy/optimize/_trustregion_constr/canonical_constraint.py +390 -0
  859. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +231 -0
  860. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +584 -0
  861. scipy/optimize/_trustregion_constr/projections.py +411 -0
  862. scipy/optimize/_trustregion_constr/qp_subproblem.py +637 -0
  863. scipy/optimize/_trustregion_constr/report.py +49 -0
  864. scipy/optimize/_trustregion_constr/tests/__init__.py +0 -0
  865. scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py +296 -0
  866. scipy/optimize/_trustregion_constr/tests/test_nested_minimize.py +39 -0
  867. scipy/optimize/_trustregion_constr/tests/test_projections.py +214 -0
  868. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +645 -0
  869. scipy/optimize/_trustregion_constr/tests/test_report.py +34 -0
  870. scipy/optimize/_trustregion_constr/tr_interior_point.py +361 -0
  871. scipy/optimize/_trustregion_dogleg.py +122 -0
  872. scipy/optimize/_trustregion_exact.py +437 -0
  873. scipy/optimize/_trustregion_krylov.py +65 -0
  874. scipy/optimize/_trustregion_ncg.py +126 -0
  875. scipy/optimize/_tstutils.py +972 -0
  876. scipy/optimize/_zeros.cp313t-win_arm64.lib +0 -0
  877. scipy/optimize/_zeros.cp313t-win_arm64.pyd +0 -0
  878. scipy/optimize/_zeros_py.py +1475 -0
  879. scipy/optimize/cobyla.py +19 -0
  880. scipy/optimize/cython_optimize/__init__.py +133 -0
  881. scipy/optimize/cython_optimize/_zeros.cp313t-win_arm64.lib +0 -0
  882. scipy/optimize/cython_optimize/_zeros.cp313t-win_arm64.pyd +0 -0
  883. scipy/optimize/cython_optimize/_zeros.pxd +33 -0
  884. scipy/optimize/cython_optimize/c_zeros.pxd +26 -0
  885. scipy/optimize/cython_optimize.pxd +11 -0
  886. scipy/optimize/elementwise.py +38 -0
  887. scipy/optimize/lbfgsb.py +23 -0
  888. scipy/optimize/linesearch.py +18 -0
  889. scipy/optimize/minpack.py +27 -0
  890. scipy/optimize/minpack2.py +17 -0
  891. scipy/optimize/moduleTNC.py +19 -0
  892. scipy/optimize/nonlin.py +29 -0
  893. scipy/optimize/optimize.py +40 -0
  894. scipy/optimize/slsqp.py +22 -0
  895. scipy/optimize/tests/__init__.py +0 -0
  896. scipy/optimize/tests/_cython_examples/extending.pyx +43 -0
  897. scipy/optimize/tests/_cython_examples/meson.build +32 -0
  898. scipy/optimize/tests/test__basinhopping.py +535 -0
  899. scipy/optimize/tests/test__differential_evolution.py +1703 -0
  900. scipy/optimize/tests/test__dual_annealing.py +416 -0
  901. scipy/optimize/tests/test__linprog_clean_inputs.py +312 -0
  902. scipy/optimize/tests/test__numdiff.py +885 -0
  903. scipy/optimize/tests/test__remove_redundancy.py +228 -0
  904. scipy/optimize/tests/test__root.py +124 -0
  905. scipy/optimize/tests/test__shgo.py +1164 -0
  906. scipy/optimize/tests/test__spectral.py +226 -0
  907. scipy/optimize/tests/test_bracket.py +896 -0
  908. scipy/optimize/tests/test_chandrupatla.py +982 -0
  909. scipy/optimize/tests/test_cobyla.py +195 -0
  910. scipy/optimize/tests/test_cobyqa.py +252 -0
  911. scipy/optimize/tests/test_constraint_conversion.py +286 -0
  912. scipy/optimize/tests/test_constraints.py +255 -0
  913. scipy/optimize/tests/test_cython_optimize.py +92 -0
  914. scipy/optimize/tests/test_differentiable_functions.py +1025 -0
  915. scipy/optimize/tests/test_direct.py +321 -0
  916. scipy/optimize/tests/test_extending.py +28 -0
  917. scipy/optimize/tests/test_hessian_update_strategy.py +300 -0
  918. scipy/optimize/tests/test_isotonic_regression.py +167 -0
  919. scipy/optimize/tests/test_lbfgsb_hessinv.py +65 -0
  920. scipy/optimize/tests/test_lbfgsb_setulb.py +122 -0
  921. scipy/optimize/tests/test_least_squares.py +986 -0
  922. scipy/optimize/tests/test_linear_assignment.py +116 -0
  923. scipy/optimize/tests/test_linesearch.py +328 -0
  924. scipy/optimize/tests/test_linprog.py +2577 -0
  925. scipy/optimize/tests/test_lsq_common.py +297 -0
  926. scipy/optimize/tests/test_lsq_linear.py +287 -0
  927. scipy/optimize/tests/test_milp.py +459 -0
  928. scipy/optimize/tests/test_minimize_constrained.py +845 -0
  929. scipy/optimize/tests/test_minpack.py +1194 -0
  930. scipy/optimize/tests/test_nnls.py +469 -0
  931. scipy/optimize/tests/test_nonlin.py +572 -0
  932. scipy/optimize/tests/test_optimize.py +3344 -0
  933. scipy/optimize/tests/test_quadratic_assignment.py +455 -0
  934. scipy/optimize/tests/test_regression.py +40 -0
  935. scipy/optimize/tests/test_slsqp.py +645 -0
  936. scipy/optimize/tests/test_tnc.py +345 -0
  937. scipy/optimize/tests/test_trustregion.py +110 -0
  938. scipy/optimize/tests/test_trustregion_exact.py +351 -0
  939. scipy/optimize/tests/test_trustregion_krylov.py +170 -0
  940. scipy/optimize/tests/test_zeros.py +998 -0
  941. scipy/optimize/tnc.py +22 -0
  942. scipy/optimize/zeros.py +26 -0
  943. scipy/signal/__init__.py +316 -0
  944. scipy/signal/_arraytools.py +264 -0
  945. scipy/signal/_czt.py +575 -0
  946. scipy/signal/_delegators.py +568 -0
  947. scipy/signal/_filter_design.py +5893 -0
  948. scipy/signal/_fir_filter_design.py +1458 -0
  949. scipy/signal/_lti_conversion.py +534 -0
  950. scipy/signal/_ltisys.py +3546 -0
  951. scipy/signal/_max_len_seq.py +139 -0
  952. scipy/signal/_max_len_seq_inner.cp313t-win_arm64.lib +0 -0
  953. scipy/signal/_max_len_seq_inner.cp313t-win_arm64.pyd +0 -0
  954. scipy/signal/_peak_finding.py +1310 -0
  955. scipy/signal/_peak_finding_utils.cp313t-win_arm64.lib +0 -0
  956. scipy/signal/_peak_finding_utils.cp313t-win_arm64.pyd +0 -0
  957. scipy/signal/_polyutils.py +172 -0
  958. scipy/signal/_savitzky_golay.py +357 -0
  959. scipy/signal/_short_time_fft.py +2228 -0
  960. scipy/signal/_signal_api.py +30 -0
  961. scipy/signal/_signaltools.py +5309 -0
  962. scipy/signal/_sigtools.cp313t-win_arm64.lib +0 -0
  963. scipy/signal/_sigtools.cp313t-win_arm64.pyd +0 -0
  964. scipy/signal/_sosfilt.cp313t-win_arm64.lib +0 -0
  965. scipy/signal/_sosfilt.cp313t-win_arm64.pyd +0 -0
  966. scipy/signal/_spectral_py.py +2471 -0
  967. scipy/signal/_spline.cp313t-win_arm64.lib +0 -0
  968. scipy/signal/_spline.cp313t-win_arm64.pyd +0 -0
  969. scipy/signal/_spline.pyi +34 -0
  970. scipy/signal/_spline_filters.py +848 -0
  971. scipy/signal/_support_alternative_backends.py +73 -0
  972. scipy/signal/_upfirdn.py +219 -0
  973. scipy/signal/_upfirdn_apply.cp313t-win_arm64.lib +0 -0
  974. scipy/signal/_upfirdn_apply.cp313t-win_arm64.pyd +0 -0
  975. scipy/signal/_waveforms.py +687 -0
  976. scipy/signal/_wavelets.py +29 -0
  977. scipy/signal/bsplines.py +21 -0
  978. scipy/signal/filter_design.py +28 -0
  979. scipy/signal/fir_filter_design.py +21 -0
  980. scipy/signal/lti_conversion.py +20 -0
  981. scipy/signal/ltisys.py +25 -0
  982. scipy/signal/signaltools.py +27 -0
  983. scipy/signal/spectral.py +21 -0
  984. scipy/signal/spline.py +18 -0
  985. scipy/signal/tests/__init__.py +0 -0
  986. scipy/signal/tests/_scipy_spectral_test_shim.py +311 -0
  987. scipy/signal/tests/mpsig.py +122 -0
  988. scipy/signal/tests/test_array_tools.py +111 -0
  989. scipy/signal/tests/test_bsplines.py +365 -0
  990. scipy/signal/tests/test_cont2discrete.py +424 -0
  991. scipy/signal/tests/test_czt.py +221 -0
  992. scipy/signal/tests/test_dltisys.py +599 -0
  993. scipy/signal/tests/test_filter_design.py +4744 -0
  994. scipy/signal/tests/test_fir_filter_design.py +851 -0
  995. scipy/signal/tests/test_ltisys.py +1225 -0
  996. scipy/signal/tests/test_max_len_seq.py +71 -0
  997. scipy/signal/tests/test_peak_finding.py +915 -0
  998. scipy/signal/tests/test_result_type.py +51 -0
  999. scipy/signal/tests/test_savitzky_golay.py +363 -0
  1000. scipy/signal/tests/test_short_time_fft.py +1107 -0
  1001. scipy/signal/tests/test_signaltools.py +4735 -0
  1002. scipy/signal/tests/test_spectral.py +2141 -0
  1003. scipy/signal/tests/test_splines.py +427 -0
  1004. scipy/signal/tests/test_upfirdn.py +322 -0
  1005. scipy/signal/tests/test_waveforms.py +400 -0
  1006. scipy/signal/tests/test_wavelets.py +59 -0
  1007. scipy/signal/tests/test_windows.py +987 -0
  1008. scipy/signal/waveforms.py +20 -0
  1009. scipy/signal/wavelets.py +17 -0
  1010. scipy/signal/windows/__init__.py +52 -0
  1011. scipy/signal/windows/_windows.py +2513 -0
  1012. scipy/signal/windows/windows.py +23 -0
  1013. scipy/sparse/__init__.py +350 -0
  1014. scipy/sparse/_base.py +1613 -0
  1015. scipy/sparse/_bsr.py +880 -0
  1016. scipy/sparse/_compressed.py +1328 -0
  1017. scipy/sparse/_construct.py +1454 -0
  1018. scipy/sparse/_coo.py +1581 -0
  1019. scipy/sparse/_csc.py +367 -0
  1020. scipy/sparse/_csparsetools.cp313t-win_arm64.lib +0 -0
  1021. scipy/sparse/_csparsetools.cp313t-win_arm64.pyd +0 -0
  1022. scipy/sparse/_csr.py +558 -0
  1023. scipy/sparse/_data.py +569 -0
  1024. scipy/sparse/_dia.py +677 -0
  1025. scipy/sparse/_dok.py +669 -0
  1026. scipy/sparse/_extract.py +178 -0
  1027. scipy/sparse/_index.py +444 -0
  1028. scipy/sparse/_lil.py +632 -0
  1029. scipy/sparse/_matrix.py +169 -0
  1030. scipy/sparse/_matrix_io.py +167 -0
  1031. scipy/sparse/_sparsetools.cp313t-win_arm64.lib +0 -0
  1032. scipy/sparse/_sparsetools.cp313t-win_arm64.pyd +0 -0
  1033. scipy/sparse/_spfuncs.py +76 -0
  1034. scipy/sparse/_sputils.py +632 -0
  1035. scipy/sparse/base.py +24 -0
  1036. scipy/sparse/bsr.py +22 -0
  1037. scipy/sparse/compressed.py +20 -0
  1038. scipy/sparse/construct.py +38 -0
  1039. scipy/sparse/coo.py +23 -0
  1040. scipy/sparse/csc.py +22 -0
  1041. scipy/sparse/csgraph/__init__.py +210 -0
  1042. scipy/sparse/csgraph/_flow.cp313t-win_arm64.lib +0 -0
  1043. scipy/sparse/csgraph/_flow.cp313t-win_arm64.pyd +0 -0
  1044. scipy/sparse/csgraph/_laplacian.py +563 -0
  1045. scipy/sparse/csgraph/_matching.cp313t-win_arm64.lib +0 -0
  1046. scipy/sparse/csgraph/_matching.cp313t-win_arm64.pyd +0 -0
  1047. scipy/sparse/csgraph/_min_spanning_tree.cp313t-win_arm64.lib +0 -0
  1048. scipy/sparse/csgraph/_min_spanning_tree.cp313t-win_arm64.pyd +0 -0
  1049. scipy/sparse/csgraph/_reordering.cp313t-win_arm64.lib +0 -0
  1050. scipy/sparse/csgraph/_reordering.cp313t-win_arm64.pyd +0 -0
  1051. scipy/sparse/csgraph/_shortest_path.cp313t-win_arm64.lib +0 -0
  1052. scipy/sparse/csgraph/_shortest_path.cp313t-win_arm64.pyd +0 -0
  1053. scipy/sparse/csgraph/_tools.cp313t-win_arm64.lib +0 -0
  1054. scipy/sparse/csgraph/_tools.cp313t-win_arm64.pyd +0 -0
  1055. scipy/sparse/csgraph/_traversal.cp313t-win_arm64.lib +0 -0
  1056. scipy/sparse/csgraph/_traversal.cp313t-win_arm64.pyd +0 -0
  1057. scipy/sparse/csgraph/_validation.py +66 -0
  1058. scipy/sparse/csgraph/tests/__init__.py +0 -0
  1059. scipy/sparse/csgraph/tests/test_connected_components.py +119 -0
  1060. scipy/sparse/csgraph/tests/test_conversions.py +61 -0
  1061. scipy/sparse/csgraph/tests/test_flow.py +209 -0
  1062. scipy/sparse/csgraph/tests/test_graph_laplacian.py +368 -0
  1063. scipy/sparse/csgraph/tests/test_matching.py +307 -0
  1064. scipy/sparse/csgraph/tests/test_pydata_sparse.py +197 -0
  1065. scipy/sparse/csgraph/tests/test_reordering.py +70 -0
  1066. scipy/sparse/csgraph/tests/test_shortest_path.py +540 -0
  1067. scipy/sparse/csgraph/tests/test_spanning_tree.py +66 -0
  1068. scipy/sparse/csgraph/tests/test_traversal.py +148 -0
  1069. scipy/sparse/csr.py +22 -0
  1070. scipy/sparse/data.py +18 -0
  1071. scipy/sparse/dia.py +22 -0
  1072. scipy/sparse/dok.py +22 -0
  1073. scipy/sparse/extract.py +23 -0
  1074. scipy/sparse/lil.py +22 -0
  1075. scipy/sparse/linalg/__init__.py +148 -0
  1076. scipy/sparse/linalg/_dsolve/__init__.py +71 -0
  1077. scipy/sparse/linalg/_dsolve/_add_newdocs.py +147 -0
  1078. scipy/sparse/linalg/_dsolve/_superlu.cp313t-win_arm64.lib +0 -0
  1079. scipy/sparse/linalg/_dsolve/_superlu.cp313t-win_arm64.pyd +0 -0
  1080. scipy/sparse/linalg/_dsolve/linsolve.py +882 -0
  1081. scipy/sparse/linalg/_dsolve/tests/__init__.py +0 -0
  1082. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +928 -0
  1083. scipy/sparse/linalg/_eigen/__init__.py +22 -0
  1084. scipy/sparse/linalg/_eigen/_svds.py +540 -0
  1085. scipy/sparse/linalg/_eigen/_svds_doc.py +382 -0
  1086. scipy/sparse/linalg/_eigen/arpack/COPYING +45 -0
  1087. scipy/sparse/linalg/_eigen/arpack/__init__.py +20 -0
  1088. scipy/sparse/linalg/_eigen/arpack/_arpack.cp313t-win_arm64.lib +0 -0
  1089. scipy/sparse/linalg/_eigen/arpack/_arpack.cp313t-win_arm64.pyd +0 -0
  1090. scipy/sparse/linalg/_eigen/arpack/arpack.py +1706 -0
  1091. scipy/sparse/linalg/_eigen/arpack/tests/__init__.py +0 -0
  1092. scipy/sparse/linalg/_eigen/arpack/tests/test_arpack.py +717 -0
  1093. scipy/sparse/linalg/_eigen/lobpcg/__init__.py +16 -0
  1094. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +1110 -0
  1095. scipy/sparse/linalg/_eigen/lobpcg/tests/__init__.py +0 -0
  1096. scipy/sparse/linalg/_eigen/lobpcg/tests/test_lobpcg.py +725 -0
  1097. scipy/sparse/linalg/_eigen/tests/__init__.py +0 -0
  1098. scipy/sparse/linalg/_eigen/tests/test_svds.py +886 -0
  1099. scipy/sparse/linalg/_expm_multiply.py +816 -0
  1100. scipy/sparse/linalg/_interface.py +920 -0
  1101. scipy/sparse/linalg/_isolve/__init__.py +20 -0
  1102. scipy/sparse/linalg/_isolve/_gcrotmk.py +503 -0
  1103. scipy/sparse/linalg/_isolve/iterative.py +1051 -0
  1104. scipy/sparse/linalg/_isolve/lgmres.py +230 -0
  1105. scipy/sparse/linalg/_isolve/lsmr.py +486 -0
  1106. scipy/sparse/linalg/_isolve/lsqr.py +589 -0
  1107. scipy/sparse/linalg/_isolve/minres.py +372 -0
  1108. scipy/sparse/linalg/_isolve/tests/__init__.py +0 -0
  1109. scipy/sparse/linalg/_isolve/tests/test_gcrotmk.py +183 -0
  1110. scipy/sparse/linalg/_isolve/tests/test_iterative.py +809 -0
  1111. scipy/sparse/linalg/_isolve/tests/test_lgmres.py +225 -0
  1112. scipy/sparse/linalg/_isolve/tests/test_lsmr.py +185 -0
  1113. scipy/sparse/linalg/_isolve/tests/test_lsqr.py +120 -0
  1114. scipy/sparse/linalg/_isolve/tests/test_minres.py +97 -0
  1115. scipy/sparse/linalg/_isolve/tests/test_utils.py +9 -0
  1116. scipy/sparse/linalg/_isolve/tfqmr.py +179 -0
  1117. scipy/sparse/linalg/_isolve/utils.py +121 -0
  1118. scipy/sparse/linalg/_matfuncs.py +940 -0
  1119. scipy/sparse/linalg/_norm.py +195 -0
  1120. scipy/sparse/linalg/_onenormest.py +467 -0
  1121. scipy/sparse/linalg/_propack/_cpropack.cp313t-win_arm64.lib +0 -0
  1122. scipy/sparse/linalg/_propack/_cpropack.cp313t-win_arm64.pyd +0 -0
  1123. scipy/sparse/linalg/_propack/_dpropack.cp313t-win_arm64.lib +0 -0
  1124. scipy/sparse/linalg/_propack/_dpropack.cp313t-win_arm64.pyd +0 -0
  1125. scipy/sparse/linalg/_propack/_spropack.cp313t-win_arm64.lib +0 -0
  1126. scipy/sparse/linalg/_propack/_spropack.cp313t-win_arm64.pyd +0 -0
  1127. scipy/sparse/linalg/_propack/_zpropack.cp313t-win_arm64.lib +0 -0
  1128. scipy/sparse/linalg/_propack/_zpropack.cp313t-win_arm64.pyd +0 -0
  1129. scipy/sparse/linalg/_special_sparse_arrays.py +949 -0
  1130. scipy/sparse/linalg/_svdp.py +309 -0
  1131. scipy/sparse/linalg/dsolve.py +22 -0
  1132. scipy/sparse/linalg/eigen.py +21 -0
  1133. scipy/sparse/linalg/interface.py +20 -0
  1134. scipy/sparse/linalg/isolve.py +22 -0
  1135. scipy/sparse/linalg/matfuncs.py +18 -0
  1136. scipy/sparse/linalg/tests/__init__.py +0 -0
  1137. scipy/sparse/linalg/tests/propack_test_data.npz +0 -0
  1138. scipy/sparse/linalg/tests/test_expm_multiply.py +367 -0
  1139. scipy/sparse/linalg/tests/test_interface.py +561 -0
  1140. scipy/sparse/linalg/tests/test_matfuncs.py +592 -0
  1141. scipy/sparse/linalg/tests/test_norm.py +154 -0
  1142. scipy/sparse/linalg/tests/test_onenormest.py +252 -0
  1143. scipy/sparse/linalg/tests/test_propack.py +165 -0
  1144. scipy/sparse/linalg/tests/test_pydata_sparse.py +272 -0
  1145. scipy/sparse/linalg/tests/test_special_sparse_arrays.py +337 -0
  1146. scipy/sparse/sparsetools.py +17 -0
  1147. scipy/sparse/spfuncs.py +17 -0
  1148. scipy/sparse/sputils.py +17 -0
  1149. scipy/sparse/tests/__init__.py +0 -0
  1150. scipy/sparse/tests/data/csc_py2.npz +0 -0
  1151. scipy/sparse/tests/data/csc_py3.npz +0 -0
  1152. scipy/sparse/tests/test_arithmetic1d.py +341 -0
  1153. scipy/sparse/tests/test_array_api.py +561 -0
  1154. scipy/sparse/tests/test_base.py +5870 -0
  1155. scipy/sparse/tests/test_common1d.py +447 -0
  1156. scipy/sparse/tests/test_construct.py +872 -0
  1157. scipy/sparse/tests/test_coo.py +1119 -0
  1158. scipy/sparse/tests/test_csc.py +98 -0
  1159. scipy/sparse/tests/test_csr.py +214 -0
  1160. scipy/sparse/tests/test_dok.py +209 -0
  1161. scipy/sparse/tests/test_extract.py +51 -0
  1162. scipy/sparse/tests/test_indexing1d.py +603 -0
  1163. scipy/sparse/tests/test_matrix_io.py +109 -0
  1164. scipy/sparse/tests/test_minmax1d.py +128 -0
  1165. scipy/sparse/tests/test_sparsetools.py +344 -0
  1166. scipy/sparse/tests/test_spfuncs.py +97 -0
  1167. scipy/sparse/tests/test_sputils.py +424 -0
  1168. scipy/spatial/__init__.py +129 -0
  1169. scipy/spatial/_ckdtree.cp313t-win_arm64.lib +0 -0
  1170. scipy/spatial/_ckdtree.cp313t-win_arm64.pyd +0 -0
  1171. scipy/spatial/_distance_pybind.cp313t-win_arm64.lib +0 -0
  1172. scipy/spatial/_distance_pybind.cp313t-win_arm64.pyd +0 -0
  1173. scipy/spatial/_distance_wrap.cp313t-win_arm64.lib +0 -0
  1174. scipy/spatial/_distance_wrap.cp313t-win_arm64.pyd +0 -0
  1175. scipy/spatial/_geometric_slerp.py +238 -0
  1176. scipy/spatial/_hausdorff.cp313t-win_arm64.lib +0 -0
  1177. scipy/spatial/_hausdorff.cp313t-win_arm64.pyd +0 -0
  1178. scipy/spatial/_kdtree.py +920 -0
  1179. scipy/spatial/_plotutils.py +274 -0
  1180. scipy/spatial/_procrustes.py +132 -0
  1181. scipy/spatial/_qhull.cp313t-win_arm64.lib +0 -0
  1182. scipy/spatial/_qhull.cp313t-win_arm64.pyd +0 -0
  1183. scipy/spatial/_qhull.pyi +213 -0
  1184. scipy/spatial/_spherical_voronoi.py +341 -0
  1185. scipy/spatial/_voronoi.cp313t-win_arm64.lib +0 -0
  1186. scipy/spatial/_voronoi.cp313t-win_arm64.pyd +0 -0
  1187. scipy/spatial/_voronoi.pyi +4 -0
  1188. scipy/spatial/ckdtree.py +18 -0
  1189. scipy/spatial/distance.py +3147 -0
  1190. scipy/spatial/distance.pyi +210 -0
  1191. scipy/spatial/kdtree.py +25 -0
  1192. scipy/spatial/qhull.py +25 -0
  1193. scipy/spatial/qhull_src/COPYING_QHULL.txt +39 -0
  1194. scipy/spatial/tests/__init__.py +0 -0
  1195. scipy/spatial/tests/data/cdist-X1.txt +10 -0
  1196. scipy/spatial/tests/data/cdist-X2.txt +20 -0
  1197. scipy/spatial/tests/data/degenerate_pointset.npz +0 -0
  1198. scipy/spatial/tests/data/iris.txt +150 -0
  1199. scipy/spatial/tests/data/pdist-boolean-inp.txt +20 -0
  1200. scipy/spatial/tests/data/pdist-chebyshev-ml-iris.txt +1 -0
  1201. scipy/spatial/tests/data/pdist-chebyshev-ml.txt +1 -0
  1202. scipy/spatial/tests/data/pdist-cityblock-ml-iris.txt +1 -0
  1203. scipy/spatial/tests/data/pdist-cityblock-ml.txt +1 -0
  1204. scipy/spatial/tests/data/pdist-correlation-ml-iris.txt +1 -0
  1205. scipy/spatial/tests/data/pdist-correlation-ml.txt +1 -0
  1206. scipy/spatial/tests/data/pdist-cosine-ml-iris.txt +1 -0
  1207. scipy/spatial/tests/data/pdist-cosine-ml.txt +1 -0
  1208. scipy/spatial/tests/data/pdist-double-inp.txt +20 -0
  1209. scipy/spatial/tests/data/pdist-euclidean-ml-iris.txt +1 -0
  1210. scipy/spatial/tests/data/pdist-euclidean-ml.txt +1 -0
  1211. scipy/spatial/tests/data/pdist-hamming-ml.txt +1 -0
  1212. scipy/spatial/tests/data/pdist-jaccard-ml.txt +1 -0
  1213. scipy/spatial/tests/data/pdist-jensenshannon-ml-iris.txt +1 -0
  1214. scipy/spatial/tests/data/pdist-jensenshannon-ml.txt +1 -0
  1215. scipy/spatial/tests/data/pdist-minkowski-3.2-ml-iris.txt +1 -0
  1216. scipy/spatial/tests/data/pdist-minkowski-3.2-ml.txt +1 -0
  1217. scipy/spatial/tests/data/pdist-minkowski-5.8-ml-iris.txt +1 -0
  1218. scipy/spatial/tests/data/pdist-seuclidean-ml-iris.txt +1 -0
  1219. scipy/spatial/tests/data/pdist-seuclidean-ml.txt +1 -0
  1220. scipy/spatial/tests/data/pdist-spearman-ml.txt +1 -0
  1221. scipy/spatial/tests/data/random-bool-data.txt +100 -0
  1222. scipy/spatial/tests/data/random-double-data.txt +100 -0
  1223. scipy/spatial/tests/data/random-int-data.txt +100 -0
  1224. scipy/spatial/tests/data/random-uint-data.txt +100 -0
  1225. scipy/spatial/tests/data/selfdual-4d-polytope.txt +27 -0
  1226. scipy/spatial/tests/test__plotutils.py +91 -0
  1227. scipy/spatial/tests/test__procrustes.py +116 -0
  1228. scipy/spatial/tests/test_distance.py +2389 -0
  1229. scipy/spatial/tests/test_hausdorff.py +199 -0
  1230. scipy/spatial/tests/test_kdtree.py +1536 -0
  1231. scipy/spatial/tests/test_qhull.py +1313 -0
  1232. scipy/spatial/tests/test_slerp.py +417 -0
  1233. scipy/spatial/tests/test_spherical_voronoi.py +358 -0
  1234. scipy/spatial/transform/__init__.py +31 -0
  1235. scipy/spatial/transform/_rigid_transform.cp313t-win_arm64.lib +0 -0
  1236. scipy/spatial/transform/_rigid_transform.cp313t-win_arm64.pyd +0 -0
  1237. scipy/spatial/transform/_rotation.cp313t-win_arm64.lib +0 -0
  1238. scipy/spatial/transform/_rotation.cp313t-win_arm64.pyd +0 -0
  1239. scipy/spatial/transform/_rotation_groups.py +140 -0
  1240. scipy/spatial/transform/_rotation_spline.py +460 -0
  1241. scipy/spatial/transform/rotation.py +21 -0
  1242. scipy/spatial/transform/tests/__init__.py +0 -0
  1243. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  1244. scipy/spatial/transform/tests/test_rotation.py +2569 -0
  1245. scipy/spatial/transform/tests/test_rotation_groups.py +169 -0
  1246. scipy/spatial/transform/tests/test_rotation_spline.py +183 -0
  1247. scipy/special/__init__.pxd +1 -0
  1248. scipy/special/__init__.py +841 -0
  1249. scipy/special/_add_newdocs.py +9961 -0
  1250. scipy/special/_basic.py +3576 -0
  1251. scipy/special/_comb.cp313t-win_arm64.lib +0 -0
  1252. scipy/special/_comb.cp313t-win_arm64.pyd +0 -0
  1253. scipy/special/_ellip_harm.py +214 -0
  1254. scipy/special/_ellip_harm_2.cp313t-win_arm64.lib +0 -0
  1255. scipy/special/_ellip_harm_2.cp313t-win_arm64.pyd +0 -0
  1256. scipy/special/_gufuncs.cp313t-win_arm64.lib +0 -0
  1257. scipy/special/_gufuncs.cp313t-win_arm64.pyd +0 -0
  1258. scipy/special/_input_validation.py +17 -0
  1259. scipy/special/_lambertw.py +149 -0
  1260. scipy/special/_logsumexp.py +426 -0
  1261. scipy/special/_mptestutils.py +453 -0
  1262. scipy/special/_multiufuncs.py +610 -0
  1263. scipy/special/_orthogonal.py +2592 -0
  1264. scipy/special/_orthogonal.pyi +330 -0
  1265. scipy/special/_precompute/__init__.py +0 -0
  1266. scipy/special/_precompute/cosine_cdf.py +17 -0
  1267. scipy/special/_precompute/expn_asy.py +54 -0
  1268. scipy/special/_precompute/gammainc_asy.py +116 -0
  1269. scipy/special/_precompute/gammainc_data.py +124 -0
  1270. scipy/special/_precompute/hyp2f1_data.py +484 -0
  1271. scipy/special/_precompute/lambertw.py +68 -0
  1272. scipy/special/_precompute/loggamma.py +43 -0
  1273. scipy/special/_precompute/struve_convergence.py +131 -0
  1274. scipy/special/_precompute/utils.py +38 -0
  1275. scipy/special/_precompute/wright_bessel.py +342 -0
  1276. scipy/special/_precompute/wright_bessel_data.py +152 -0
  1277. scipy/special/_precompute/wrightomega.py +41 -0
  1278. scipy/special/_precompute/zetac.py +27 -0
  1279. scipy/special/_sf_error.py +15 -0
  1280. scipy/special/_specfun.cp313t-win_arm64.lib +0 -0
  1281. scipy/special/_specfun.cp313t-win_arm64.pyd +0 -0
  1282. scipy/special/_special_ufuncs.cp313t-win_arm64.lib +0 -0
  1283. scipy/special/_special_ufuncs.cp313t-win_arm64.pyd +0 -0
  1284. scipy/special/_spfun_stats.py +106 -0
  1285. scipy/special/_spherical_bessel.py +397 -0
  1286. scipy/special/_support_alternative_backends.py +295 -0
  1287. scipy/special/_test_internal.cp313t-win_arm64.lib +0 -0
  1288. scipy/special/_test_internal.cp313t-win_arm64.pyd +0 -0
  1289. scipy/special/_test_internal.pyi +9 -0
  1290. scipy/special/_testutils.py +321 -0
  1291. scipy/special/_ufuncs.cp313t-win_arm64.lib +0 -0
  1292. scipy/special/_ufuncs.cp313t-win_arm64.pyd +0 -0
  1293. scipy/special/_ufuncs.pyi +522 -0
  1294. scipy/special/_ufuncs.pyx +13173 -0
  1295. scipy/special/_ufuncs_cxx.cp313t-win_arm64.lib +0 -0
  1296. scipy/special/_ufuncs_cxx.cp313t-win_arm64.pyd +0 -0
  1297. scipy/special/_ufuncs_cxx.pxd +142 -0
  1298. scipy/special/_ufuncs_cxx.pyx +427 -0
  1299. scipy/special/_ufuncs_cxx_defs.h +147 -0
  1300. scipy/special/_ufuncs_defs.h +57 -0
  1301. scipy/special/add_newdocs.py +15 -0
  1302. scipy/special/basic.py +87 -0
  1303. scipy/special/cython_special.cp313t-win_arm64.lib +0 -0
  1304. scipy/special/cython_special.cp313t-win_arm64.pyd +0 -0
  1305. scipy/special/cython_special.pxd +259 -0
  1306. scipy/special/cython_special.pyi +3 -0
  1307. scipy/special/orthogonal.py +45 -0
  1308. scipy/special/sf_error.py +20 -0
  1309. scipy/special/specfun.py +24 -0
  1310. scipy/special/spfun_stats.py +17 -0
  1311. scipy/special/tests/__init__.py +0 -0
  1312. scipy/special/tests/_cython_examples/extending.pyx +12 -0
  1313. scipy/special/tests/_cython_examples/meson.build +34 -0
  1314. scipy/special/tests/data/__init__.py +0 -0
  1315. scipy/special/tests/data/boost.npz +0 -0
  1316. scipy/special/tests/data/gsl.npz +0 -0
  1317. scipy/special/tests/data/local.npz +0 -0
  1318. scipy/special/tests/test_basic.py +4815 -0
  1319. scipy/special/tests/test_bdtr.py +112 -0
  1320. scipy/special/tests/test_boost_ufuncs.py +64 -0
  1321. scipy/special/tests/test_boxcox.py +125 -0
  1322. scipy/special/tests/test_cdflib.py +712 -0
  1323. scipy/special/tests/test_cdft_asymptotic.py +49 -0
  1324. scipy/special/tests/test_cephes_intp_cast.py +29 -0
  1325. scipy/special/tests/test_cosine_distr.py +83 -0
  1326. scipy/special/tests/test_cython_special.py +363 -0
  1327. scipy/special/tests/test_data.py +719 -0
  1328. scipy/special/tests/test_dd.py +42 -0
  1329. scipy/special/tests/test_digamma.py +45 -0
  1330. scipy/special/tests/test_ellip_harm.py +278 -0
  1331. scipy/special/tests/test_erfinv.py +89 -0
  1332. scipy/special/tests/test_exponential_integrals.py +118 -0
  1333. scipy/special/tests/test_extending.py +28 -0
  1334. scipy/special/tests/test_faddeeva.py +85 -0
  1335. scipy/special/tests/test_gamma.py +12 -0
  1336. scipy/special/tests/test_gammainc.py +152 -0
  1337. scipy/special/tests/test_hyp2f1.py +2566 -0
  1338. scipy/special/tests/test_hypergeometric.py +234 -0
  1339. scipy/special/tests/test_iv_ratio.py +249 -0
  1340. scipy/special/tests/test_kolmogorov.py +491 -0
  1341. scipy/special/tests/test_lambertw.py +109 -0
  1342. scipy/special/tests/test_legendre.py +1518 -0
  1343. scipy/special/tests/test_log1mexp.py +85 -0
  1344. scipy/special/tests/test_loggamma.py +70 -0
  1345. scipy/special/tests/test_logit.py +162 -0
  1346. scipy/special/tests/test_logsumexp.py +469 -0
  1347. scipy/special/tests/test_mpmath.py +2293 -0
  1348. scipy/special/tests/test_nan_inputs.py +65 -0
  1349. scipy/special/tests/test_ndtr.py +77 -0
  1350. scipy/special/tests/test_ndtri_exp.py +94 -0
  1351. scipy/special/tests/test_orthogonal.py +821 -0
  1352. scipy/special/tests/test_orthogonal_eval.py +275 -0
  1353. scipy/special/tests/test_owens_t.py +53 -0
  1354. scipy/special/tests/test_pcf.py +24 -0
  1355. scipy/special/tests/test_pdtr.py +48 -0
  1356. scipy/special/tests/test_powm1.py +65 -0
  1357. scipy/special/tests/test_precompute_expn_asy.py +24 -0
  1358. scipy/special/tests/test_precompute_gammainc.py +108 -0
  1359. scipy/special/tests/test_precompute_utils.py +36 -0
  1360. scipy/special/tests/test_round.py +18 -0
  1361. scipy/special/tests/test_sf_error.py +146 -0
  1362. scipy/special/tests/test_sici.py +36 -0
  1363. scipy/special/tests/test_specfun.py +48 -0
  1364. scipy/special/tests/test_spence.py +32 -0
  1365. scipy/special/tests/test_spfun_stats.py +61 -0
  1366. scipy/special/tests/test_sph_harm.py +85 -0
  1367. scipy/special/tests/test_spherical_bessel.py +400 -0
  1368. scipy/special/tests/test_support_alternative_backends.py +248 -0
  1369. scipy/special/tests/test_trig.py +72 -0
  1370. scipy/special/tests/test_ufunc_signatures.py +46 -0
  1371. scipy/special/tests/test_wright_bessel.py +205 -0
  1372. scipy/special/tests/test_wrightomega.py +117 -0
  1373. scipy/special/tests/test_zeta.py +301 -0
  1374. scipy/stats/__init__.py +670 -0
  1375. scipy/stats/_ansari_swilk_statistics.cp313t-win_arm64.lib +0 -0
  1376. scipy/stats/_ansari_swilk_statistics.cp313t-win_arm64.pyd +0 -0
  1377. scipy/stats/_axis_nan_policy.py +692 -0
  1378. scipy/stats/_biasedurn.cp313t-win_arm64.lib +0 -0
  1379. scipy/stats/_biasedurn.cp313t-win_arm64.pyd +0 -0
  1380. scipy/stats/_biasedurn.pxd +27 -0
  1381. scipy/stats/_binned_statistic.py +795 -0
  1382. scipy/stats/_binomtest.py +375 -0
  1383. scipy/stats/_bws_test.py +177 -0
  1384. scipy/stats/_censored_data.py +459 -0
  1385. scipy/stats/_common.py +5 -0
  1386. scipy/stats/_constants.py +42 -0
  1387. scipy/stats/_continued_fraction.py +387 -0
  1388. scipy/stats/_continuous_distns.py +12486 -0
  1389. scipy/stats/_correlation.py +210 -0
  1390. scipy/stats/_covariance.py +636 -0
  1391. scipy/stats/_crosstab.py +204 -0
  1392. scipy/stats/_discrete_distns.py +2098 -0
  1393. scipy/stats/_distn_infrastructure.py +4201 -0
  1394. scipy/stats/_distr_params.py +299 -0
  1395. scipy/stats/_distribution_infrastructure.py +5750 -0
  1396. scipy/stats/_entropy.py +428 -0
  1397. scipy/stats/_finite_differences.py +145 -0
  1398. scipy/stats/_fit.py +1351 -0
  1399. scipy/stats/_hypotests.py +2060 -0
  1400. scipy/stats/_kde.py +732 -0
  1401. scipy/stats/_ksstats.py +600 -0
  1402. scipy/stats/_levy_stable/__init__.py +1231 -0
  1403. scipy/stats/_levy_stable/levyst.cp313t-win_arm64.lib +0 -0
  1404. scipy/stats/_levy_stable/levyst.cp313t-win_arm64.pyd +0 -0
  1405. scipy/stats/_mannwhitneyu.py +492 -0
  1406. scipy/stats/_mgc.py +550 -0
  1407. scipy/stats/_morestats.py +4626 -0
  1408. scipy/stats/_mstats_basic.py +3658 -0
  1409. scipy/stats/_mstats_extras.py +521 -0
  1410. scipy/stats/_multicomp.py +449 -0
  1411. scipy/stats/_multivariate.py +7281 -0
  1412. scipy/stats/_new_distributions.py +452 -0
  1413. scipy/stats/_odds_ratio.py +466 -0
  1414. scipy/stats/_page_trend_test.py +486 -0
  1415. scipy/stats/_probability_distribution.py +1964 -0
  1416. scipy/stats/_qmc.py +2956 -0
  1417. scipy/stats/_qmc_cy.cp313t-win_arm64.lib +0 -0
  1418. scipy/stats/_qmc_cy.cp313t-win_arm64.pyd +0 -0
  1419. scipy/stats/_qmc_cy.pyi +54 -0
  1420. scipy/stats/_qmvnt.py +454 -0
  1421. scipy/stats/_qmvnt_cy.cp313t-win_arm64.lib +0 -0
  1422. scipy/stats/_qmvnt_cy.cp313t-win_arm64.pyd +0 -0
  1423. scipy/stats/_quantile.py +335 -0
  1424. scipy/stats/_rcont/__init__.py +4 -0
  1425. scipy/stats/_rcont/rcont.cp313t-win_arm64.lib +0 -0
  1426. scipy/stats/_rcont/rcont.cp313t-win_arm64.pyd +0 -0
  1427. scipy/stats/_relative_risk.py +263 -0
  1428. scipy/stats/_resampling.py +2352 -0
  1429. scipy/stats/_result_classes.py +40 -0
  1430. scipy/stats/_sampling.py +1314 -0
  1431. scipy/stats/_sensitivity_analysis.py +713 -0
  1432. scipy/stats/_sobol.cp313t-win_arm64.lib +0 -0
  1433. scipy/stats/_sobol.cp313t-win_arm64.pyd +0 -0
  1434. scipy/stats/_sobol.pyi +54 -0
  1435. scipy/stats/_sobol_direction_numbers.npz +0 -0
  1436. scipy/stats/_stats.cp313t-win_arm64.lib +0 -0
  1437. scipy/stats/_stats.cp313t-win_arm64.pyd +0 -0
  1438. scipy/stats/_stats.pxd +10 -0
  1439. scipy/stats/_stats_mstats_common.py +322 -0
  1440. scipy/stats/_stats_py.py +11089 -0
  1441. scipy/stats/_stats_pythran.cp313t-win_arm64.lib +0 -0
  1442. scipy/stats/_stats_pythran.cp313t-win_arm64.pyd +0 -0
  1443. scipy/stats/_survival.py +683 -0
  1444. scipy/stats/_tukeylambda_stats.py +199 -0
  1445. scipy/stats/_unuran/__init__.py +0 -0
  1446. scipy/stats/_unuran/unuran_wrapper.cp313t-win_arm64.lib +0 -0
  1447. scipy/stats/_unuran/unuran_wrapper.cp313t-win_arm64.pyd +0 -0
  1448. scipy/stats/_unuran/unuran_wrapper.pyi +179 -0
  1449. scipy/stats/_variation.py +126 -0
  1450. scipy/stats/_warnings_errors.py +38 -0
  1451. scipy/stats/_wilcoxon.py +265 -0
  1452. scipy/stats/biasedurn.py +16 -0
  1453. scipy/stats/contingency.py +521 -0
  1454. scipy/stats/distributions.py +24 -0
  1455. scipy/stats/kde.py +18 -0
  1456. scipy/stats/morestats.py +27 -0
  1457. scipy/stats/mstats.py +140 -0
  1458. scipy/stats/mstats_basic.py +42 -0
  1459. scipy/stats/mstats_extras.py +25 -0
  1460. scipy/stats/mvn.py +17 -0
  1461. scipy/stats/qmc.py +236 -0
  1462. scipy/stats/sampling.py +73 -0
  1463. scipy/stats/stats.py +41 -0
  1464. scipy/stats/tests/__init__.py +0 -0
  1465. scipy/stats/tests/common_tests.py +356 -0
  1466. scipy/stats/tests/data/_mvt.py +171 -0
  1467. scipy/stats/tests/data/fisher_exact_results_from_r.py +607 -0
  1468. scipy/stats/tests/data/jf_skew_t_gamlss_pdf_data.npy +0 -0
  1469. scipy/stats/tests/data/levy_stable/stable-Z1-cdf-sample-data.npy +0 -0
  1470. scipy/stats/tests/data/levy_stable/stable-Z1-pdf-sample-data.npy +0 -0
  1471. scipy/stats/tests/data/levy_stable/stable-loc-scale-sample-data.npy +0 -0
  1472. scipy/stats/tests/data/nist_anova/AtmWtAg.dat +108 -0
  1473. scipy/stats/tests/data/nist_anova/SiRstv.dat +85 -0
  1474. scipy/stats/tests/data/nist_anova/SmLs01.dat +249 -0
  1475. scipy/stats/tests/data/nist_anova/SmLs02.dat +1869 -0
  1476. scipy/stats/tests/data/nist_anova/SmLs03.dat +18069 -0
  1477. scipy/stats/tests/data/nist_anova/SmLs04.dat +249 -0
  1478. scipy/stats/tests/data/nist_anova/SmLs05.dat +1869 -0
  1479. scipy/stats/tests/data/nist_anova/SmLs06.dat +18069 -0
  1480. scipy/stats/tests/data/nist_anova/SmLs07.dat +249 -0
  1481. scipy/stats/tests/data/nist_anova/SmLs08.dat +1869 -0
  1482. scipy/stats/tests/data/nist_anova/SmLs09.dat +18069 -0
  1483. scipy/stats/tests/data/nist_linregress/Norris.dat +97 -0
  1484. scipy/stats/tests/data/rel_breitwigner_pdf_sample_data_ROOT.npy +0 -0
  1485. scipy/stats/tests/data/studentized_range_mpmath_ref.json +1499 -0
  1486. scipy/stats/tests/test_axis_nan_policy.py +1388 -0
  1487. scipy/stats/tests/test_binned_statistic.py +568 -0
  1488. scipy/stats/tests/test_censored_data.py +152 -0
  1489. scipy/stats/tests/test_contingency.py +294 -0
  1490. scipy/stats/tests/test_continued_fraction.py +173 -0
  1491. scipy/stats/tests/test_continuous.py +2198 -0
  1492. scipy/stats/tests/test_continuous_basic.py +1053 -0
  1493. scipy/stats/tests/test_continuous_fit_censored.py +683 -0
  1494. scipy/stats/tests/test_correlation.py +80 -0
  1495. scipy/stats/tests/test_crosstab.py +115 -0
  1496. scipy/stats/tests/test_discrete_basic.py +580 -0
  1497. scipy/stats/tests/test_discrete_distns.py +700 -0
  1498. scipy/stats/tests/test_distributions.py +10413 -0
  1499. scipy/stats/tests/test_entropy.py +322 -0
  1500. scipy/stats/tests/test_fast_gen_inversion.py +435 -0
  1501. scipy/stats/tests/test_fit.py +1090 -0
  1502. scipy/stats/tests/test_hypotests.py +1991 -0
  1503. scipy/stats/tests/test_kdeoth.py +676 -0
  1504. scipy/stats/tests/test_marray.py +289 -0
  1505. scipy/stats/tests/test_mgc.py +217 -0
  1506. scipy/stats/tests/test_morestats.py +3259 -0
  1507. scipy/stats/tests/test_mstats_basic.py +2071 -0
  1508. scipy/stats/tests/test_mstats_extras.py +172 -0
  1509. scipy/stats/tests/test_multicomp.py +405 -0
  1510. scipy/stats/tests/test_multivariate.py +4381 -0
  1511. scipy/stats/tests/test_odds_ratio.py +148 -0
  1512. scipy/stats/tests/test_qmc.py +1492 -0
  1513. scipy/stats/tests/test_quantile.py +199 -0
  1514. scipy/stats/tests/test_rank.py +345 -0
  1515. scipy/stats/tests/test_relative_risk.py +95 -0
  1516. scipy/stats/tests/test_resampling.py +2000 -0
  1517. scipy/stats/tests/test_sampling.py +1450 -0
  1518. scipy/stats/tests/test_sensitivity_analysis.py +310 -0
  1519. scipy/stats/tests/test_stats.py +9707 -0
  1520. scipy/stats/tests/test_survival.py +466 -0
  1521. scipy/stats/tests/test_tukeylambda_stats.py +85 -0
  1522. scipy/stats/tests/test_variation.py +216 -0
  1523. scipy/version.py +12 -0
  1524. scipy-1.16.2.dist-info/DELVEWHEEL +2 -0
  1525. scipy-1.16.2.dist-info/LICENSE.txt +912 -0
  1526. scipy-1.16.2.dist-info/METADATA +1061 -0
  1527. scipy-1.16.2.dist-info/RECORD +1530 -0
  1528. scipy-1.16.2.dist-info/WHEEL +4 -0
  1529. scipy.libs/msvcp140-5f1c5dd31916990d94181e07bc3afb32.dll +0 -0
  1530. scipy.libs/scipy_openblas-f3ac85b1f412f7e86514c923dc4058d1.dll +0 -0
@@ -0,0 +1,1203 @@
1
+ import inspect
2
+
3
+ import numpy as np
4
+ from scipy.linalg import qr
5
+
6
+ from ..utils import get_arrays_tol
7
+
8
+
9
+ TINY = np.finfo(float).tiny
10
+ EPS = np.finfo(float).eps
11
+
12
+
13
+ def tangential_byrd_omojokun(grad, hess_prod, xl, xu, delta, debug, **kwargs):
14
+ r"""
15
+ Minimize approximately a quadratic function subject to bound constraints in
16
+ a trust region.
17
+
18
+ This function solves approximately
19
+
20
+ .. math::
21
+
22
+ \min_{s \in \mathbb{R}^n} \quad g^{\mathsf{T}} s + \frac{1}{2}
23
+ s^{\mathsf{T}} H s \quad \text{s.t.} \quad
24
+ \left\{ \begin{array}{l}
25
+ l \le s \le u\\
26
+ \lVert s \rVert \le \Delta,
27
+ \end{array} \right.
28
+
29
+ using an active-set variation of the truncated conjugate gradient method.
30
+
31
+ Parameters
32
+ ----------
33
+ grad : `numpy.ndarray`, shape (n,)
34
+ Gradient :math:`g` as shown above.
35
+ hess_prod : callable
36
+ Product of the Hessian matrix :math:`H` with any vector.
37
+
38
+ ``hess_prod(s) -> `numpy.ndarray`, shape (n,)``
39
+
40
+ returns the product :math:`H s`.
41
+ xl : `numpy.ndarray`, shape (n,)
42
+ Lower bounds :math:`l` as shown above.
43
+ xu : `numpy.ndarray`, shape (n,)
44
+ Upper bounds :math:`u` as shown above.
45
+ delta : float
46
+ Trust-region radius :math:`\Delta` as shown above.
47
+ debug : bool
48
+ Whether to make debugging tests during the execution.
49
+
50
+ Returns
51
+ -------
52
+ `numpy.ndarray`, shape (n,)
53
+ Approximate solution :math:`s`.
54
+
55
+ Other Parameters
56
+ ----------------
57
+ improve_tcg : bool, optional
58
+ If True, a solution generated by the truncated conjugate gradient
59
+ method that is on the boundary of the trust region is improved by
60
+ moving around the trust-region boundary on the two-dimensional space
61
+ spanned by the solution and the gradient of the quadratic function at
62
+ the solution (default is True).
63
+
64
+ Notes
65
+ -----
66
+ This function implements Algorithm 6.2 of [1]_. It is assumed that the
67
+ origin is feasible with respect to the bound constraints and that `delta`
68
+ is finite and positive.
69
+
70
+ References
71
+ ----------
72
+ .. [1] T. M. Ragonneau. *Model-Based Derivative-Free Optimization Methods
73
+ and Software*. PhD thesis, Department of Applied Mathematics, The Hong
74
+ Kong Polytechnic University, Hong Kong, China, 2022. URL:
75
+ https://theses.lib.polyu.edu.hk/handle/200/12294.
76
+ """
77
+ if debug:
78
+ assert isinstance(grad, np.ndarray) and grad.ndim == 1
79
+ assert inspect.signature(hess_prod).bind(grad)
80
+ assert isinstance(xl, np.ndarray) and xl.shape == grad.shape
81
+ assert isinstance(xu, np.ndarray) and xu.shape == grad.shape
82
+ assert isinstance(delta, float)
83
+ assert isinstance(debug, bool)
84
+ tol = get_arrays_tol(xl, xu)
85
+ assert np.all(xl <= tol)
86
+ assert np.all(xu >= -tol)
87
+ assert np.isfinite(delta) and delta > 0.0
88
+ xl = np.minimum(xl, 0.0)
89
+ xu = np.maximum(xu, 0.0)
90
+
91
+ # Copy the arrays that may be modified by the code below.
92
+ n = grad.size
93
+ grad = np.copy(grad)
94
+ grad_orig = np.copy(grad)
95
+
96
+ # Calculate the initial active set.
97
+ free_bd = ((xl < 0.0) | (grad < 0.0)) & ((xu > 0.0) | (grad > 0.0))
98
+
99
+ # Set the initial iterate and the initial search direction.
100
+ step = np.zeros_like(grad)
101
+ sd = np.zeros_like(step)
102
+ sd[free_bd] = -grad[free_bd]
103
+
104
+ k = 0
105
+ reduct = 0.0
106
+ boundary_reached = False
107
+ while k < np.count_nonzero(free_bd):
108
+ # Stop the computations if sd is not a descent direction.
109
+ grad_sd = grad @ sd
110
+ if grad_sd >= -10.0 * EPS * n * max(1.0, np.linalg.norm(grad)):
111
+ break
112
+
113
+ # Set alpha_tr to the step size for the trust-region constraint.
114
+ try:
115
+ alpha_tr = _alpha_tr(step, sd, delta)
116
+ except ZeroDivisionError:
117
+ break
118
+
119
+ # Stop the computations if a step along sd is expected to give a
120
+ # relatively small reduction in the objective function.
121
+ if -alpha_tr * grad_sd <= 1e-8 * reduct:
122
+ break
123
+
124
+ # Set alpha_quad to the step size for the minimization problem.
125
+ hess_sd = hess_prod(sd)
126
+ curv_sd = sd @ hess_sd
127
+ if curv_sd > TINY * abs(grad_sd):
128
+ alpha_quad = max(-grad_sd / curv_sd, 0.0)
129
+ else:
130
+ alpha_quad = np.inf
131
+
132
+ # Stop the computations if the reduction in the objective function
133
+ # provided by an unconstrained step is small.
134
+ alpha = min(alpha_tr, alpha_quad)
135
+ if -alpha * (grad_sd + 0.5 * alpha * curv_sd) <= 1e-8 * reduct:
136
+ break
137
+
138
+ # Set alpha_bd to the step size for the bound constraints.
139
+ i_xl = (xl > -np.inf) & (sd < -TINY * np.abs(xl - step))
140
+ i_xu = (xu < np.inf) & (sd > TINY * np.abs(xu - step))
141
+ all_alpha_xl = np.full_like(step, np.inf)
142
+ all_alpha_xu = np.full_like(step, np.inf)
143
+ all_alpha_xl[i_xl] = np.maximum(
144
+ (xl[i_xl] - step[i_xl]) / sd[i_xl],
145
+ 0.0,
146
+ )
147
+ all_alpha_xu[i_xu] = np.maximum(
148
+ (xu[i_xu] - step[i_xu]) / sd[i_xu],
149
+ 0.0,
150
+ )
151
+ alpha_xl = np.min(all_alpha_xl)
152
+ alpha_xu = np.min(all_alpha_xu)
153
+ alpha_bd = min(alpha_xl, alpha_xu)
154
+
155
+ # Update the iterate.
156
+ alpha = min(alpha, alpha_bd)
157
+ if alpha > 0.0:
158
+ step[free_bd] = np.clip(
159
+ step[free_bd] + alpha * sd[free_bd],
160
+ xl[free_bd],
161
+ xu[free_bd],
162
+ )
163
+ grad += alpha * hess_sd
164
+ reduct -= alpha * (grad_sd + 0.5 * alpha * curv_sd)
165
+
166
+ if alpha < min(alpha_tr, alpha_bd):
167
+ # The current iteration is a conjugate gradient iteration. Update
168
+ # the search direction so that it is conjugate (with respect to H)
169
+ # to all the previous search directions.
170
+ beta = (grad[free_bd] @ hess_sd[free_bd]) / curv_sd
171
+ sd[free_bd] = beta * sd[free_bd] - grad[free_bd]
172
+ sd[~free_bd] = 0.0
173
+ k += 1
174
+ elif alpha < alpha_tr:
175
+ # The iterate is restricted by a bound constraint. Add this bound
176
+ # constraint to the active set, and restart the calculations.
177
+ if alpha_xl <= alpha:
178
+ i_new = np.argmin(all_alpha_xl)
179
+ step[i_new] = xl[i_new]
180
+ else:
181
+ i_new = np.argmin(all_alpha_xu)
182
+ step[i_new] = xu[i_new]
183
+ free_bd[i_new] = False
184
+ sd[free_bd] = -grad[free_bd]
185
+ sd[~free_bd] = 0.0
186
+ k = 0
187
+ else:
188
+ # The current iterate is on the trust-region boundary. Add all the
189
+ # active bounds to the working set to prepare for the improvement
190
+ # of the solution, and stop the iterations.
191
+ if alpha_xl <= alpha:
192
+ i_new = _argmin(all_alpha_xl)
193
+ step[i_new] = xl[i_new]
194
+ free_bd[i_new] = False
195
+ if alpha_xu <= alpha:
196
+ i_new = _argmin(all_alpha_xu)
197
+ step[i_new] = xu[i_new]
198
+ free_bd[i_new] = False
199
+ boundary_reached = True
200
+ break
201
+
202
+ # Attempt to improve the solution on the trust-region boundary.
203
+ if kwargs.get("improve_tcg", True) and boundary_reached:
204
+ step_base = np.copy(step)
205
+ step_comparator = grad_orig @ step_base + 0.5 * step_base @ hess_prod(
206
+ step_base
207
+ )
208
+
209
+ while np.count_nonzero(free_bd) > 0:
210
+ # Check whether a substantial reduction in the objective function
211
+ # is possible, and set the search direction.
212
+ step_sq = step[free_bd] @ step[free_bd]
213
+ grad_sq = grad[free_bd] @ grad[free_bd]
214
+ grad_step = grad[free_bd] @ step[free_bd]
215
+ grad_sd = -np.sqrt(max(step_sq * grad_sq - grad_step**2.0, 0.0))
216
+ sd[free_bd] = grad_step * step[free_bd] - step_sq * grad[free_bd]
217
+ sd[~free_bd] = 0.0
218
+ if grad_sd >= -1e-8 * reduct or np.any(
219
+ grad_sd >= -TINY * np.abs(sd[free_bd])
220
+ ):
221
+ break
222
+ sd[free_bd] /= -grad_sd
223
+
224
+ # Calculate an upper bound for the tangent of half the angle theta
225
+ # of this alternative iteration. The step will be updated as:
226
+ # step = cos(theta) * step + sin(theta) * sd.
227
+ temp_xl = np.zeros(n)
228
+ temp_xu = np.zeros(n)
229
+ temp_xl[free_bd] = (
230
+ step[free_bd] ** 2.0 + sd[free_bd] ** 2.0 - xl[free_bd] ** 2.0
231
+ )
232
+ temp_xu[free_bd] = (
233
+ step[free_bd] ** 2.0 + sd[free_bd] ** 2.0 - xu[free_bd] ** 2.0
234
+ )
235
+ temp_xl[temp_xl > 0.0] = (
236
+ np.sqrt(temp_xl[temp_xl > 0.0]) - sd[temp_xl > 0.0]
237
+ )
238
+ temp_xu[temp_xu > 0.0] = (
239
+ np.sqrt(temp_xu[temp_xu > 0.0]) + sd[temp_xu > 0.0]
240
+ )
241
+ dist_xl = np.maximum(step - xl, 0.0)
242
+ dist_xu = np.maximum(xu - step, 0.0)
243
+ i_xl = temp_xl > TINY * dist_xl
244
+ i_xu = temp_xu > TINY * dist_xu
245
+ all_t_xl = np.ones(n)
246
+ all_t_xu = np.ones(n)
247
+ all_t_xl[i_xl] = np.minimum(
248
+ all_t_xl[i_xl],
249
+ dist_xl[i_xl] / temp_xl[i_xl],
250
+ )
251
+ all_t_xu[i_xu] = np.minimum(
252
+ all_t_xu[i_xu],
253
+ dist_xu[i_xu] / temp_xu[i_xu],
254
+ )
255
+ t_xl = np.min(all_t_xl)
256
+ t_xu = np.min(all_t_xu)
257
+ t_bd = min(t_xl, t_xu)
258
+
259
+ # Calculate some curvature information.
260
+ hess_step = hess_prod(step)
261
+ hess_sd = hess_prod(sd)
262
+ curv_step = step @ hess_step
263
+ curv_sd = sd @ hess_sd
264
+ curv_step_sd = step @ hess_sd
265
+
266
+ # For a range of equally spaced values of tan(0.5 * theta),
267
+ # calculate the reduction in the objective function that would be
268
+ # obtained by accepting the corresponding angle.
269
+ n_samples = 20
270
+ n_samples = int((n_samples - 3) * t_bd + 3)
271
+ t_samples = np.linspace(t_bd / n_samples, t_bd, n_samples)
272
+ sin_values = 2.0 * t_samples / (1.0 + t_samples**2.0)
273
+ all_reduct = sin_values * (
274
+ grad_step * t_samples
275
+ - grad_sd
276
+ - t_samples * curv_step
277
+ + sin_values
278
+ * (t_samples * curv_step_sd - 0.5 * (curv_sd - curv_step))
279
+ )
280
+ if np.all(all_reduct <= 0.0):
281
+ # No reduction in the objective function is obtained.
282
+ break
283
+
284
+ # Accept the angle that provides the largest reduction in the
285
+ # objective function, and update the iterate.
286
+ i_max = np.argmax(all_reduct)
287
+ cos_value = (1.0 - t_samples[i_max] ** 2.0) / (
288
+ 1.0 + t_samples[i_max] ** 2.0
289
+ )
290
+ step[free_bd] = (
291
+ cos_value * step[free_bd] + sin_values[i_max] * sd[free_bd]
292
+ )
293
+ grad += (cos_value - 1.0) * hess_step + sin_values[i_max] * hess_sd
294
+ reduct += all_reduct[i_max]
295
+
296
+ # If the above angle is restricted by bound constraints, add them
297
+ # to the working set, and restart the alternative iteration.
298
+ # Otherwise, the calculations are terminated.
299
+ if t_bd < 1.0 and i_max == n_samples - 1:
300
+ if t_xl <= t_bd:
301
+ i_new = _argmin(all_t_xl)
302
+ step[i_new] = xl[i_new]
303
+ free_bd[i_new] = False
304
+ if t_xu <= t_bd:
305
+ i_new = _argmin(all_t_xu)
306
+ step[i_new] = xu[i_new]
307
+ free_bd[i_new] = False
308
+ else:
309
+ break
310
+
311
+ # Ensure that the alternative iteration improves the objective
312
+ # function.
313
+ if grad_orig @ step + 0.5 * step @ hess_prod(step) > step_comparator:
314
+ step = step_base
315
+
316
+ if debug:
317
+ assert np.all(xl <= step)
318
+ assert np.all(step <= xu)
319
+ assert np.linalg.norm(step) < 1.1 * delta
320
+ return step
321
+
322
+
323
+ def constrained_tangential_byrd_omojokun(
324
+ grad,
325
+ hess_prod,
326
+ xl,
327
+ xu,
328
+ aub,
329
+ bub,
330
+ aeq,
331
+ delta,
332
+ debug,
333
+ **kwargs,
334
+ ):
335
+ r"""
336
+ Minimize approximately a quadratic function subject to bound and linear
337
+ constraints in a trust region.
338
+
339
+ This function solves approximately
340
+
341
+ .. math::
342
+
343
+ \min_{s \in \mathbb{R}^n} \quad g^{\mathsf{T}} s + \frac{1}{2}
344
+ s^{\mathsf{T}} H s \quad \text{s.t.} \quad
345
+ \left\{ \begin{array}{l}
346
+ l \le s \le u,\\
347
+ A_{\scriptscriptstyle I} s \le b_{\scriptscriptstyle I},\\
348
+ A_{\scriptscriptstyle E} s = 0,\\
349
+ \lVert s \rVert \le \Delta,
350
+ \end{array} \right.
351
+
352
+ using an active-set variation of the truncated conjugate gradient method.
353
+
354
+ Parameters
355
+ ----------
356
+ grad : `numpy.ndarray`, shape (n,)
357
+ Gradient :math:`g` as shown above.
358
+ hess_prod : callable
359
+ Product of the Hessian matrix :math:`H` with any vector.
360
+
361
+ ``hess_prod(s) -> `numpy.ndarray`, shape (n,)``
362
+
363
+ returns the product :math:`H s`.
364
+ xl : `numpy.ndarray`, shape (n,)
365
+ Lower bounds :math:`l` as shown above.
366
+ xu : `numpy.ndarray`, shape (n,)
367
+ Upper bounds :math:`u` as shown above.
368
+ aub : `numpy.ndarray`, shape (m_linear_ub, n)
369
+ Coefficient matrix :math:`A_{\scriptscriptstyle I}` as shown above.
370
+ bub : `numpy.ndarray`, shape (m_linear_ub,)
371
+ Right-hand side :math:`b_{\scriptscriptstyle I}` as shown above.
372
+ aeq : `numpy.ndarray`, shape (m_linear_eq, n)
373
+ Coefficient matrix :math:`A_{\scriptscriptstyle E}` as shown above.
374
+ delta : float
375
+ Trust-region radius :math:`\Delta` as shown above.
376
+ debug : bool
377
+ Whether to make debugging tests during the execution.
378
+
379
+ Returns
380
+ -------
381
+ `numpy.ndarray`, shape (n,)
382
+ Approximate solution :math:`s`.
383
+
384
+ Other Parameters
385
+ ----------------
386
+ improve_tcg : bool, optional
387
+ If True, a solution generated by the truncated conjugate gradient
388
+ method that is on the boundary of the trust region is improved by
389
+ moving around the trust-region boundary on the two-dimensional space
390
+ spanned by the solution and the gradient of the quadratic function at
391
+ the solution (default is True).
392
+
393
+ Notes
394
+ -----
395
+ This function implements Algorithm 6.3 of [1]_. It is assumed that the
396
+ origin is feasible with respect to the bound and linear constraints, and
397
+ that `delta` is finite and positive.
398
+
399
+ References
400
+ ----------
401
+ .. [1] T. M. Ragonneau. *Model-Based Derivative-Free Optimization Methods
402
+ and Software*. PhD thesis, Department of Applied Mathematics, The Hong
403
+ Kong Polytechnic University, Hong Kong, China, 2022. URL:
404
+ https://theses.lib.polyu.edu.hk/handle/200/12294.
405
+ """
406
+ if debug:
407
+ assert isinstance(grad, np.ndarray) and grad.ndim == 1
408
+ assert inspect.signature(hess_prod).bind(grad)
409
+ assert isinstance(xl, np.ndarray) and xl.shape == grad.shape
410
+ assert isinstance(xu, np.ndarray) and xu.shape == grad.shape
411
+ assert (
412
+ isinstance(aub, np.ndarray)
413
+ and aub.ndim == 2
414
+ and aub.shape[1] == grad.size
415
+ )
416
+ assert (
417
+ isinstance(bub, np.ndarray)
418
+ and bub.ndim == 1
419
+ and bub.size == aub.shape[0]
420
+ )
421
+ assert (
422
+ isinstance(aeq, np.ndarray)
423
+ and aeq.ndim == 2
424
+ and aeq.shape[1] == grad.size
425
+ )
426
+ assert isinstance(delta, float)
427
+ assert isinstance(debug, bool)
428
+ tol = get_arrays_tol(xl, xu)
429
+ assert np.all(xl <= tol)
430
+ assert np.all(xu >= -tol)
431
+ assert np.all(bub >= -tol)
432
+ assert np.isfinite(delta) and delta > 0.0
433
+ xl = np.minimum(xl, 0.0)
434
+ xu = np.maximum(xu, 0.0)
435
+ bub = np.maximum(bub, 0.0)
436
+
437
+ # Copy the arrays that may be modified by the code below.
438
+ n = grad.size
439
+ grad = np.copy(grad)
440
+ grad_orig = np.copy(grad)
441
+
442
+ # Calculate the initial active set.
443
+ free_xl = (xl < 0.0) | (grad < 0.0)
444
+ free_xu = (xu > 0.0) | (grad > 0.0)
445
+ free_ub = (bub > 0.0) | (aub @ grad > 0.0)
446
+ n_act, q = qr_tangential_byrd_omojokun(aub, aeq, free_xl, free_xu, free_ub)
447
+
448
+ # Set the initial iterate and the initial search direction.
449
+ step = np.zeros_like(grad)
450
+ sd = -q[:, n_act:] @ (q[:, n_act:].T @ grad)
451
+ resid = np.copy(bub)
452
+
453
+ k = 0
454
+ reduct = 0.0
455
+ boundary_reached = False
456
+ while k < n - n_act:
457
+ # Stop the computations if sd is not a descent direction.
458
+ grad_sd = grad @ sd
459
+ if grad_sd >= -10.0 * EPS * n * max(1.0, np.linalg.norm(grad)):
460
+ break
461
+
462
+ # Set alpha_tr to the step size for the trust-region constraint.
463
+ try:
464
+ alpha_tr = _alpha_tr(step, sd, delta)
465
+ except ZeroDivisionError:
466
+ break
467
+
468
+ # Stop the computations if a step along sd is expected to give a
469
+ # relatively small reduction in the objective function.
470
+ if -alpha_tr * grad_sd <= 1e-8 * reduct:
471
+ break
472
+
473
+ # Set alpha_quad to the step size for the minimization problem.
474
+ hess_sd = hess_prod(sd)
475
+ curv_sd = sd @ hess_sd
476
+ if curv_sd > TINY * abs(grad_sd):
477
+ alpha_quad = max(-grad_sd / curv_sd, 0.0)
478
+ else:
479
+ alpha_quad = np.inf
480
+
481
+ # Stop the computations if the reduction in the objective function
482
+ # provided by an unconstrained step is small.
483
+ alpha = min(alpha_tr, alpha_quad)
484
+ if -alpha * (grad_sd + 0.5 * alpha * curv_sd) <= 1e-8 * reduct:
485
+ break
486
+
487
+ # Set alpha_bd to the step size for the bound constraints.
488
+ i_xl = free_xl & (xl > -np.inf) & (sd < -TINY * np.abs(xl - step))
489
+ i_xu = free_xu & (xu < np.inf) & (sd > TINY * np.abs(xu - step))
490
+ all_alpha_xl = np.full_like(step, np.inf)
491
+ all_alpha_xu = np.full_like(step, np.inf)
492
+ all_alpha_xl[i_xl] = np.maximum(
493
+ (xl[i_xl] - step[i_xl]) / sd[i_xl],
494
+ 0.0,
495
+ )
496
+ all_alpha_xu[i_xu] = np.maximum(
497
+ (xu[i_xu] - step[i_xu]) / sd[i_xu],
498
+ 0.0,
499
+ )
500
+ alpha_xl = np.min(all_alpha_xl)
501
+ alpha_xu = np.min(all_alpha_xu)
502
+ alpha_bd = min(alpha_xl, alpha_xu)
503
+
504
+ # Set alpha_ub to the step size for the linear constraints.
505
+ aub_sd = aub @ sd
506
+ i_ub = free_ub & (aub_sd > TINY * np.abs(resid))
507
+ all_alpha_ub = np.full_like(bub, np.inf)
508
+ all_alpha_ub[i_ub] = resid[i_ub] / aub_sd[i_ub]
509
+ alpha_ub = np.min(all_alpha_ub, initial=np.inf)
510
+
511
+ # Update the iterate.
512
+ alpha = min(alpha, alpha_bd, alpha_ub)
513
+ if alpha > 0.0:
514
+ step = np.clip(step + alpha * sd, xl, xu)
515
+ grad += alpha * hess_sd
516
+ resid = np.maximum(0.0, resid - alpha * aub_sd)
517
+ reduct -= alpha * (grad_sd + 0.5 * alpha * curv_sd)
518
+
519
+ if alpha < min(alpha_tr, alpha_bd, alpha_ub):
520
+ # The current iteration is a conjugate gradient iteration. Update
521
+ # the search direction so that it is conjugate (with respect to H)
522
+ # to all the previous search directions.
523
+ grad_proj = q[:, n_act:] @ (q[:, n_act:].T @ grad)
524
+ beta = (grad_proj @ hess_sd) / curv_sd
525
+ sd = beta * sd - grad_proj
526
+ k += 1
527
+ elif alpha < alpha_tr:
528
+ # The iterate is restricted by a bound/linear constraint. Add this
529
+ # constraint to the active set, and restart the calculations.
530
+ if alpha_xl <= alpha:
531
+ i_new = np.argmin(all_alpha_xl)
532
+ step[i_new] = xl[i_new]
533
+ free_xl[i_new] = False
534
+ elif alpha_xu <= alpha:
535
+ i_new = np.argmin(all_alpha_xu)
536
+ step[i_new] = xu[i_new]
537
+ free_xu[i_new] = False
538
+ else:
539
+ i_new = np.argmin(all_alpha_ub)
540
+ free_ub[i_new] = False
541
+ n_act, q = qr_tangential_byrd_omojokun(
542
+ aub,
543
+ aeq,
544
+ free_xl,
545
+ free_xu,
546
+ free_ub,
547
+ )
548
+ sd = -q[:, n_act:] @ (q[:, n_act:].T @ grad)
549
+ k = 0
550
+ else:
551
+ # The current iterate is on the trust-region boundary. Add all the
552
+ # active bound/linear constraints to the working set to prepare for
553
+ # the improvement of the solution, and stop the iterations.
554
+ if alpha_xl <= alpha:
555
+ i_new = _argmin(all_alpha_xl)
556
+ step[i_new] = xl[i_new]
557
+ free_xl[i_new] = False
558
+ if alpha_xu <= alpha:
559
+ i_new = _argmin(all_alpha_xu)
560
+ step[i_new] = xu[i_new]
561
+ free_xu[i_new] = False
562
+ if alpha_ub <= alpha:
563
+ i_new = _argmin(all_alpha_ub)
564
+ free_ub[i_new] = False
565
+ n_act, q = qr_tangential_byrd_omojokun(
566
+ aub,
567
+ aeq,
568
+ free_xl,
569
+ free_xu,
570
+ free_ub,
571
+ )
572
+ boundary_reached = True
573
+ break
574
+
575
+ # Attempt to improve the solution on the trust-region boundary.
576
+ if kwargs.get("improve_tcg", True) and boundary_reached and n_act < n:
577
+ step_base = np.copy(step)
578
+ while n_act < n:
579
+ # Check whether a substantial reduction in the objective function
580
+ # is possible, and set the search direction.
581
+ step_proj = q[:, n_act:] @ (q[:, n_act:].T @ step)
582
+ grad_proj = q[:, n_act:] @ (q[:, n_act:].T @ grad)
583
+ step_sq = step_proj @ step_proj
584
+ grad_sq = grad_proj @ grad_proj
585
+ grad_step = grad_proj @ step_proj
586
+ grad_sd = -np.sqrt(max(step_sq * grad_sq - grad_step**2.0, 0.0))
587
+ sd = q[:, n_act:] @ (
588
+ q[:, n_act:].T @ (grad_step * step - step_sq * grad)
589
+ )
590
+ if grad_sd >= -1e-8 * reduct or np.any(
591
+ grad_sd >= -TINY * np.abs(sd)
592
+ ):
593
+ break
594
+ sd /= -grad_sd
595
+
596
+ # Calculate an upper bound for the tangent of half the angle theta
597
+ # of this alternative iteration for the bound constraints. The step
598
+ # will be updated as:
599
+ # step += (cos(theta) - 1) * step_proj + sin(theta) * sd.
600
+ temp_xl = np.zeros(n)
601
+ temp_xu = np.zeros(n)
602
+ dist_xl = np.maximum(step - xl, 0.0)
603
+ dist_xu = np.maximum(xu - step, 0.0)
604
+ temp_xl[free_xl] = sd[free_xl] ** 2.0 - dist_xl[free_xl] * (
605
+ dist_xl[free_xl] - 2.0 * step_proj[free_xl]
606
+ )
607
+ temp_xu[free_xu] = sd[free_xu] ** 2.0 - dist_xu[free_xu] * (
608
+ dist_xu[free_xu] + 2.0 * step_proj[free_xu]
609
+ )
610
+ temp_xl[temp_xl > 0.0] = (
611
+ np.sqrt(temp_xl[temp_xl > 0.0]) - sd[temp_xl > 0.0]
612
+ )
613
+ temp_xu[temp_xu > 0.0] = (
614
+ np.sqrt(temp_xu[temp_xu > 0.0]) + sd[temp_xu > 0.0]
615
+ )
616
+ i_xl = temp_xl > TINY * dist_xl
617
+ i_xu = temp_xu > TINY * dist_xu
618
+ all_t_xl = np.ones(n)
619
+ all_t_xu = np.ones(n)
620
+ all_t_xl[i_xl] = np.minimum(
621
+ all_t_xl[i_xl],
622
+ dist_xl[i_xl] / temp_xl[i_xl],
623
+ )
624
+ all_t_xu[i_xu] = np.minimum(
625
+ all_t_xu[i_xu],
626
+ dist_xu[i_xu] / temp_xu[i_xu],
627
+ )
628
+ t_xl = np.min(all_t_xl)
629
+ t_xu = np.min(all_t_xu)
630
+ t_bd = min(t_xl, t_xu)
631
+
632
+ # Calculate an upper bound for the tangent of half the angle theta
633
+ # of this alternative iteration for the linear constraints.
634
+ temp_ub = np.zeros_like(resid)
635
+ aub_step = aub @ step_proj
636
+ aub_sd = aub @ sd
637
+ temp_ub[free_ub] = aub_sd[free_ub] ** 2.0 - resid[free_ub] * (
638
+ resid[free_ub] + 2.0 * aub_step[free_ub]
639
+ )
640
+ temp_ub[temp_ub > 0.0] = (
641
+ np.sqrt(temp_ub[temp_ub > 0.0]) + aub_sd[temp_ub > 0.0]
642
+ )
643
+ i_ub = temp_ub > TINY * resid
644
+ all_t_ub = np.ones_like(resid)
645
+ all_t_ub[i_ub] = np.minimum(
646
+ all_t_ub[i_ub],
647
+ resid[i_ub] / temp_ub[i_ub],
648
+ )
649
+ t_ub = np.min(all_t_ub, initial=1.0)
650
+ t_min = min(t_bd, t_ub)
651
+
652
+ # Calculate some curvature information.
653
+ hess_step = hess_prod(step_proj)
654
+ hess_sd = hess_prod(sd)
655
+ curv_step = step_proj @ hess_step
656
+ curv_sd = sd @ hess_sd
657
+ curv_step_sd = step_proj @ hess_sd
658
+
659
+ # For a range of equally spaced values of tan(0.5 * theta),
660
+ # calculate the reduction in the objective function that would be
661
+ # obtained by accepting the corresponding angle.
662
+ n_samples = 20
663
+ n_samples = int((n_samples - 3) * t_min + 3)
664
+ t_samples = np.linspace(t_min / n_samples, t_min, n_samples)
665
+ sin_values = 2.0 * t_samples / (1.0 + t_samples**2.0)
666
+ all_reduct = sin_values * (
667
+ grad_step * t_samples
668
+ - grad_sd
669
+ - sin_values
670
+ * (
671
+ 0.5 * t_samples**2.0 * curv_step
672
+ - 2.0 * t_samples * curv_step_sd
673
+ + 0.5 * curv_sd
674
+ )
675
+ )
676
+ if np.all(all_reduct <= 0.0):
677
+ # No reduction in the objective function is obtained.
678
+ break
679
+
680
+ # Accept the angle that provides the largest reduction in the
681
+ # objective function, and update the iterate.
682
+ i_max = np.argmax(all_reduct)
683
+ cos_value = (1.0 - t_samples[i_max] ** 2.0) / (
684
+ 1.0 + t_samples[i_max] ** 2.0
685
+ )
686
+ step = np.clip(
687
+ step + (cos_value - 1.0) * step_proj + sin_values[i_max] * sd,
688
+ xl,
689
+ xu,
690
+ )
691
+ grad += (cos_value - 1.0) * hess_step + sin_values[i_max] * hess_sd
692
+ resid = np.maximum(
693
+ 0.0,
694
+ resid
695
+ - (cos_value - 1.0) * aub_step
696
+ - sin_values[i_max] * aub_sd,
697
+ )
698
+ reduct += all_reduct[i_max]
699
+
700
+ # If the above angle is restricted by bound constraints, add them
701
+ # to the working set, and restart the alternative iteration.
702
+ # Otherwise, the calculations are terminated.
703
+ if t_min < 1.0 and i_max == n_samples - 1:
704
+ if t_xl <= t_min:
705
+ i_new = _argmin(all_t_xl)
706
+ step[i_new] = xl[i_new]
707
+ free_xl[i_new] = False
708
+ if t_xu <= t_min:
709
+ i_new = _argmin(all_t_xu)
710
+ step[i_new] = xu[i_new]
711
+ free_xl[i_new] = False
712
+ if t_ub <= t_min:
713
+ i_new = _argmin(all_t_ub)
714
+ free_ub[i_new] = False
715
+ n_act, q = qr_tangential_byrd_omojokun(
716
+ aub,
717
+ aeq,
718
+ free_xl,
719
+ free_xu,
720
+ free_ub,
721
+ )
722
+ else:
723
+ break
724
+
725
+ # Ensure that the alternative iteration improves the objective
726
+ # function.
727
+ if grad_orig @ step + 0.5 * step @ hess_prod(
728
+ step
729
+ ) > grad_orig @ step_base + 0.5 * step_base @ hess_prod(step_base):
730
+ step = step_base
731
+
732
+ if debug:
733
+ tol = get_arrays_tol(xl, xu)
734
+ assert np.all(xl <= step)
735
+ assert np.all(step <= xu)
736
+ assert np.all(aub @ step <= bub + tol)
737
+ assert np.all(np.abs(aeq @ step) <= tol)
738
+ assert np.linalg.norm(step) < 1.1 * delta
739
+ return step
740
+
741
+
742
+ def normal_byrd_omojokun(aub, bub, aeq, beq, xl, xu, delta, debug, **kwargs):
743
+ r"""
744
+ Minimize approximately a linear constraint violation subject to bound
745
+ constraints in a trust region.
746
+
747
+ This function solves approximately
748
+
749
+ .. math::
750
+
751
+ \min_{s \in \mathbb{R}^n} \quad \frac{1}{2} \big( \lVert \max \{
752
+ A_{\scriptscriptstyle I} s - b_{\scriptscriptstyle I}, 0 \} \rVert^2 +
753
+ \lVert A_{\scriptscriptstyle E} s - b_{\scriptscriptstyle E} \rVert^2
754
+ \big) \quad \text{s.t.}
755
+ \quad
756
+ \left\{ \begin{array}{l}
757
+ l \le s \le u,\\
758
+ \lVert s \rVert \le \Delta,
759
+ \end{array} \right.
760
+
761
+ using a variation of the truncated conjugate gradient method.
762
+
763
+ Parameters
764
+ ----------
765
+ aub : `numpy.ndarray`, shape (m_linear_ub, n)
766
+ Matrix :math:`A_{\scriptscriptstyle I}` as shown above.
767
+ bub : `numpy.ndarray`, shape (m_linear_ub,)
768
+ Vector :math:`b_{\scriptscriptstyle I}` as shown above.
769
+ aeq : `numpy.ndarray`, shape (m_linear_eq, n)
770
+ Matrix :math:`A_{\scriptscriptstyle E}` as shown above.
771
+ beq : `numpy.ndarray`, shape (m_linear_eq,)
772
+ Vector :math:`b_{\scriptscriptstyle E}` as shown above.
773
+ xl : `numpy.ndarray`, shape (n,)
774
+ Lower bounds :math:`l` as shown above.
775
+ xu : `numpy.ndarray`, shape (n,)
776
+ Upper bounds :math:`u` as shown above.
777
+ delta : float
778
+ Trust-region radius :math:`\Delta` as shown above.
779
+ debug : bool
780
+ Whether to make debugging tests during the execution.
781
+
782
+ Returns
783
+ -------
784
+ `numpy.ndarray`, shape (n,)
785
+ Approximate solution :math:`s`.
786
+
787
+ Other Parameters
788
+ ----------------
789
+ improve_tcg : bool, optional
790
+ If True, a solution generated by the truncated conjugate gradient
791
+ method that is on the boundary of the trust region is improved by
792
+ moving around the trust-region boundary on the two-dimensional space
793
+ spanned by the solution and the gradient of the quadratic function at
794
+ the solution (default is True).
795
+
796
+ Notes
797
+ -----
798
+ This function implements Algorithm 6.4 of [1]_. It is assumed that the
799
+ origin is feasible with respect to the bound constraints and that `delta`
800
+ is finite and positive.
801
+
802
+ References
803
+ ----------
804
+ .. [1] T. M. Ragonneau. *Model-Based Derivative-Free Optimization Methods
805
+ and Software*. PhD thesis, Department of Applied Mathematics, The Hong
806
+ Kong Polytechnic University, Hong Kong, China, 2022. URL:
807
+ https://theses.lib.polyu.edu.hk/handle/200/12294.
808
+ """
809
+ if debug:
810
+ assert isinstance(aub, np.ndarray) and aub.ndim == 2
811
+ assert (
812
+ isinstance(bub, np.ndarray)
813
+ and bub.ndim == 1
814
+ and bub.size == aub.shape[0]
815
+ )
816
+ assert (
817
+ isinstance(aeq, np.ndarray)
818
+ and aeq.ndim == 2
819
+ and aeq.shape[1] == aub.shape[1]
820
+ )
821
+ assert (
822
+ isinstance(beq, np.ndarray)
823
+ and beq.ndim == 1
824
+ and beq.size == aeq.shape[0]
825
+ )
826
+ assert isinstance(xl, np.ndarray) and xl.shape == (aub.shape[1],)
827
+ assert isinstance(xu, np.ndarray) and xu.shape == (aub.shape[1],)
828
+ assert isinstance(delta, float)
829
+ assert isinstance(debug, bool)
830
+ tol = get_arrays_tol(xl, xu)
831
+ assert np.all(xl <= tol)
832
+ assert np.all(xu >= -tol)
833
+ assert np.isfinite(delta) and delta > 0.0
834
+ xl = np.minimum(xl, 0.0)
835
+ xu = np.maximum(xu, 0.0)
836
+
837
+ # Calculate the initial active set.
838
+ m_linear_ub, n = aub.shape
839
+ grad = np.r_[aeq.T @ -beq, np.maximum(0.0, -bub)]
840
+ free_xl = (xl < 0.0) | (grad[:n] < 0.0)
841
+ free_xu = (xu > 0.0) | (grad[:n] > 0.0)
842
+ free_slack = bub < 0.0
843
+ free_ub = (bub > 0.0) | (aub @ grad[:n] - grad[n:] > 0.0)
844
+ n_act, q = qr_normal_byrd_omojokun(
845
+ aub,
846
+ free_xl,
847
+ free_xu,
848
+ free_slack,
849
+ free_ub,
850
+ )
851
+
852
+ # Calculate an upper bound on the norm of the slack variables. It is not
853
+ # used in the original algorithm, but it may prevent undesired behaviors
854
+ # engendered by computer rounding errors.
855
+ delta_slack = np.sqrt(beq @ beq + grad[n:] @ grad[n:])
856
+
857
+ # Set the initial iterate and the initial search direction.
858
+ step = np.zeros(n)
859
+ sd = -q[:, n_act:] @ (q[:, n_act:].T @ grad)
860
+ resid = bub + grad[n:]
861
+
862
+ k = 0
863
+ reduct = 0.0
864
+ boundary_reached = False
865
+ while k < n + m_linear_ub - n_act:
866
+ # Stop the computations if sd is not a descent direction.
867
+ grad_sd = grad @ sd
868
+ if grad_sd >= -10.0 * EPS * n * max(1.0, np.linalg.norm(grad)):
869
+ break
870
+
871
+ # Set alpha_tr to the step size for the trust-region constraint.
872
+ try:
873
+ alpha_tr = _alpha_tr(step, sd[:n], delta)
874
+ except ZeroDivisionError:
875
+ alpha_tr = np.inf
876
+
877
+ # Prevent undesired behaviors engendered by computer rounding errors by
878
+ # considering the trust-region constraint on the slack variables.
879
+ try:
880
+ alpha_tr = min(alpha_tr, _alpha_tr(grad[n:], sd[n:], delta_slack))
881
+ except ZeroDivisionError:
882
+ pass
883
+
884
+ # Stop the computations if a step along sd is expected to give a
885
+ # relatively small reduction in the objective function.
886
+ if -alpha_tr * grad_sd <= 1e-8 * reduct:
887
+ break
888
+
889
+ # Set alpha_quad to the step size for the minimization problem.
890
+ hess_sd = np.r_[aeq.T @ (aeq @ sd[:n]), sd[n:]]
891
+ curv_sd = sd @ hess_sd
892
+ if curv_sd > TINY * abs(grad_sd):
893
+ alpha_quad = max(-grad_sd / curv_sd, 0.0)
894
+ else:
895
+ alpha_quad = np.inf
896
+
897
+ # Stop the computations if the reduction in the objective function
898
+ # provided by an unconstrained step is small.
899
+ alpha = min(alpha_tr, alpha_quad)
900
+ if -alpha * (grad_sd + 0.5 * alpha * curv_sd) <= 1e-8 * reduct:
901
+ break
902
+
903
+ # Set alpha_bd to the step size for the bound constraints.
904
+ i_xl = free_xl & (xl > -np.inf) & (sd[:n] < -TINY * np.abs(xl - step))
905
+ i_xu = free_xu & (xu < np.inf) & (sd[:n] > TINY * np.abs(xu - step))
906
+ i_slack = free_slack & (sd[n:] < -TINY * np.abs(grad[n:]))
907
+ all_alpha_xl = np.full_like(step, np.inf)
908
+ all_alpha_xu = np.full_like(step, np.inf)
909
+ all_alpha_slack = np.full_like(bub, np.inf)
910
+ all_alpha_xl[i_xl] = np.maximum(
911
+ (xl[i_xl] - step[i_xl]) / sd[:n][i_xl],
912
+ 0.0,
913
+ )
914
+ all_alpha_xu[i_xu] = np.maximum(
915
+ (xu[i_xu] - step[i_xu]) / sd[:n][i_xu],
916
+ 0.0,
917
+ )
918
+ all_alpha_slack[i_slack] = np.maximum(
919
+ -grad[n:][i_slack] / sd[n:][i_slack],
920
+ 0.0,
921
+ )
922
+ alpha_xl = np.min(all_alpha_xl)
923
+ alpha_xu = np.min(all_alpha_xu)
924
+ alpha_slack = np.min(all_alpha_slack, initial=np.inf)
925
+ alpha_bd = min(alpha_xl, alpha_xu, alpha_slack)
926
+
927
+ # Set alpha_ub to the step size for the linear constraints.
928
+ aub_sd = aub @ sd[:n] - sd[n:]
929
+ i_ub = free_ub & (aub_sd > TINY * np.abs(resid))
930
+ all_alpha_ub = np.full_like(bub, np.inf)
931
+ all_alpha_ub[i_ub] = resid[i_ub] / aub_sd[i_ub]
932
+ alpha_ub = np.min(all_alpha_ub, initial=np.inf)
933
+
934
+ # Update the iterate.
935
+ alpha = min(alpha, alpha_bd, alpha_ub)
936
+ if alpha > 0.0:
937
+ step = np.clip(step + alpha * sd[:n], xl, xu)
938
+ grad += alpha * hess_sd
939
+ resid = np.maximum(0.0, resid - alpha * aub_sd)
940
+ reduct -= alpha * (grad_sd + 0.5 * alpha * curv_sd)
941
+
942
+ if alpha < min(alpha_tr, alpha_bd, alpha_ub):
943
+ # The current iteration is a conjugate gradient iteration. Update
944
+ # the search direction so that it is conjugate (with respect to H)
945
+ # to all the previous search directions.
946
+ grad_proj = q[:, n_act:] @ (q[:, n_act:].T @ grad)
947
+ beta = (grad_proj @ hess_sd) / curv_sd
948
+ sd = beta * sd - grad_proj
949
+ k += 1
950
+ elif alpha < alpha_tr:
951
+ # The iterate is restricted by a bound/linear constraint. Add this
952
+ # constraint to the active set, and restart the calculations.
953
+ if alpha_xl <= alpha:
954
+ i_new = np.argmin(all_alpha_xl)
955
+ step[i_new] = xl[i_new]
956
+ free_xl[i_new] = False
957
+ elif alpha_xu <= alpha:
958
+ i_new = np.argmin(all_alpha_xu)
959
+ step[i_new] = xu[i_new]
960
+ free_xu[i_new] = False
961
+ elif alpha_slack <= alpha:
962
+ i_new = np.argmin(all_alpha_slack)
963
+ free_slack[i_new] = False
964
+ else:
965
+ i_new = np.argmin(all_alpha_ub)
966
+ free_ub[i_new] = False
967
+ n_act, q = qr_normal_byrd_omojokun(
968
+ aub, free_xl, free_xu, free_slack, free_ub
969
+ )
970
+ sd = -q[:, n_act:] @ (q[:, n_act:].T @ grad)
971
+ k = 0
972
+ else:
973
+ # The current iterate is on the trust-region boundary. Add all the
974
+ # active bound constraints to the working set to prepare for the
975
+ # improvement of the solution, and stop the iterations.
976
+ if alpha_xl <= alpha:
977
+ i_new = _argmin(all_alpha_xl)
978
+ step[i_new] = xl[i_new]
979
+ free_xl[i_new] = False
980
+ if alpha_xu <= alpha:
981
+ i_new = _argmin(all_alpha_xu)
982
+ step[i_new] = xu[i_new]
983
+ free_xu[i_new] = False
984
+ boundary_reached = True
985
+ break
986
+
987
+ # Attempt to improve the solution on the trust-region boundary.
988
+ if kwargs.get("improve_tcg", True) and boundary_reached:
989
+ step_base = np.copy(step)
990
+ free_bd = free_xl & free_xu
991
+ grad = aub.T @ np.maximum(aub @ step - bub, 0.0) + aeq.T @ (
992
+ aeq @ step - beq
993
+ )
994
+ sd = np.zeros(n)
995
+ while np.count_nonzero(free_bd) > 0:
996
+ # Check whether a substantial reduction in the objective function
997
+ # is possible, and set the search direction.
998
+ step_sq = step[free_bd] @ step[free_bd]
999
+ grad_sq = grad[free_bd] @ grad[free_bd]
1000
+ grad_step = grad[free_bd] @ step[free_bd]
1001
+ grad_sd = -np.sqrt(max(step_sq * grad_sq - grad_step**2.0, 0.0))
1002
+ sd[free_bd] = grad_step * step[free_bd] - step_sq * grad[free_bd]
1003
+ sd[~free_bd] = 0.0
1004
+ if grad_sd >= -1e-8 * reduct or np.any(
1005
+ grad_sd >= -TINY * np.abs(sd[free_bd])
1006
+ ):
1007
+ break
1008
+ sd[free_bd] /= -grad_sd
1009
+
1010
+ # Calculate an upper bound for the tangent of half the angle theta
1011
+ # of this alternative iteration. The step will be updated as:
1012
+ # step = cos(theta) * step + sin(theta) * sd.
1013
+ temp_xl = np.zeros(n)
1014
+ temp_xu = np.zeros(n)
1015
+ temp_xl[free_bd] = (
1016
+ step[free_bd] ** 2.0 + sd[free_bd] ** 2.0 - xl[free_bd] ** 2.0
1017
+ )
1018
+ temp_xu[free_bd] = (
1019
+ step[free_bd] ** 2.0 + sd[free_bd] ** 2.0 - xu[free_bd] ** 2.0
1020
+ )
1021
+ temp_xl[temp_xl > 0.0] = (
1022
+ np.sqrt(temp_xl[temp_xl > 0.0]) - sd[temp_xl > 0.0]
1023
+ )
1024
+ temp_xu[temp_xu > 0.0] = (
1025
+ np.sqrt(temp_xu[temp_xu > 0.0]) + sd[temp_xu > 0.0]
1026
+ )
1027
+ dist_xl = np.maximum(step - xl, 0.0)
1028
+ dist_xu = np.maximum(xu - step, 0.0)
1029
+ i_xl = temp_xl > TINY * dist_xl
1030
+ i_xu = temp_xu > TINY * dist_xu
1031
+ all_t_xl = np.ones(n)
1032
+ all_t_xu = np.ones(n)
1033
+ all_t_xl[i_xl] = np.minimum(
1034
+ all_t_xl[i_xl],
1035
+ dist_xl[i_xl] / temp_xl[i_xl],
1036
+ )
1037
+ all_t_xu[i_xu] = np.minimum(
1038
+ all_t_xu[i_xu],
1039
+ dist_xu[i_xu] / temp_xu[i_xu],
1040
+ )
1041
+ t_xl = np.min(all_t_xl)
1042
+ t_xu = np.min(all_t_xu)
1043
+ t_bd = min(t_xl, t_xu)
1044
+
1045
+ # For a range of equally spaced values of tan(0.5 * theta),
1046
+ # calculate the reduction in the objective function that would be
1047
+ # obtained by accepting the corresponding angle.
1048
+ n_samples = 20
1049
+ n_samples = int((n_samples - 3) * t_bd + 3)
1050
+ t_samples = np.linspace(t_bd / n_samples, t_bd, n_samples)
1051
+ resid_ub = np.maximum(aub @ step - bub, 0.0)
1052
+ resid_eq = aeq @ step - beq
1053
+ step_proj = np.copy(step)
1054
+ step_proj[~free_bd] = 0.0
1055
+ all_reduct = np.empty(n_samples)
1056
+ for i in range(n_samples):
1057
+ sin_value = 2.0 * t_samples[i] / (1.0 + t_samples[i] ** 2.0)
1058
+ step_alt = np.clip(
1059
+ step + sin_value * (sd - t_samples[i] * step_proj),
1060
+ xl,
1061
+ xu,
1062
+ )
1063
+ resid_ub_alt = np.maximum(aub @ step_alt - bub, 0.0)
1064
+ resid_eq_alt = aeq @ step_alt - beq
1065
+ all_reduct[i] = 0.5 * (
1066
+ resid_ub @ resid_ub
1067
+ + resid_eq @ resid_eq
1068
+ - resid_ub_alt @ resid_ub_alt
1069
+ - resid_eq_alt @ resid_eq_alt
1070
+ )
1071
+ if np.all(all_reduct <= 0.0):
1072
+ # No reduction in the objective function is obtained.
1073
+ break
1074
+
1075
+ # Accept the angle that provides the largest reduction in the
1076
+ # objective function, and update the iterate.
1077
+ i_max = np.argmax(all_reduct)
1078
+ cos_value = (1.0 - t_samples[i_max] ** 2.0) / (
1079
+ 1.0 + t_samples[i_max] ** 2.0
1080
+ )
1081
+ sin_value = (2.0 * t_samples[i_max]
1082
+ / (1.0 + t_samples[i_max] ** 2.0))
1083
+ step[free_bd] = cos_value * step[free_bd] + sin_value * sd[free_bd]
1084
+ grad = aub.T @ np.maximum(aub @ step - bub, 0.0) + aeq.T @ (
1085
+ aeq @ step - beq
1086
+ )
1087
+ reduct += all_reduct[i_max]
1088
+
1089
+ # If the above angle is restricted by bound constraints, add them
1090
+ # to the working set, and restart the alternative iteration.
1091
+ # Otherwise, the calculations are terminated.
1092
+ if t_bd < 1.0 and i_max == n_samples - 1:
1093
+ if t_xl <= t_bd:
1094
+ i_new = _argmin(all_t_xl)
1095
+ step[i_new] = xl[i_new]
1096
+ free_bd[i_new] = False
1097
+ if t_xu <= t_bd:
1098
+ i_new = _argmin(all_t_xu)
1099
+ step[i_new] = xu[i_new]
1100
+ free_bd[i_new] = False
1101
+ else:
1102
+ break
1103
+
1104
+ # Ensure that the alternative iteration improves the objective
1105
+ # function.
1106
+ resid_ub = np.maximum(aub @ step - bub, 0.0)
1107
+ resid_ub_base = np.maximum(aub @ step_base - bub, 0.0)
1108
+ resid_eq = aeq @ step - beq
1109
+ resid_eq_base = aeq @ step_base - beq
1110
+ if (
1111
+ resid_ub @ resid_ub + resid_eq @ resid_eq
1112
+ > resid_ub_base @ resid_ub_base + resid_eq_base @ resid_eq_base
1113
+ ):
1114
+ step = step_base
1115
+
1116
+ if debug:
1117
+ assert np.all(xl <= step)
1118
+ assert np.all(step <= xu)
1119
+ assert np.linalg.norm(step) < 1.1 * delta
1120
+ return step
1121
+
1122
+
1123
+ def qr_tangential_byrd_omojokun(aub, aeq, free_xl, free_xu, free_ub):
1124
+ n = free_xl.size
1125
+ identity = np.eye(n)
1126
+ q, r, _ = qr(
1127
+ np.block(
1128
+ [
1129
+ [aeq],
1130
+ [aub[~free_ub, :]],
1131
+ [-identity[~free_xl, :]],
1132
+ [identity[~free_xu, :]],
1133
+ ]
1134
+ ).T,
1135
+ pivoting=True,
1136
+ )
1137
+ n_act = np.count_nonzero(
1138
+ np.abs(np.diag(r))
1139
+ >= 10.0
1140
+ * EPS
1141
+ * n
1142
+ * np.linalg.norm(r[: np.min(r.shape), : np.min(r.shape)], axis=0)
1143
+ )
1144
+ return n_act, q
1145
+
1146
+
1147
+ def qr_normal_byrd_omojokun(aub, free_xl, free_xu, free_slack, free_ub):
1148
+ m_linear_ub, n = aub.shape
1149
+ identity_n = np.eye(n)
1150
+ identity_m = np.eye(m_linear_ub)
1151
+ q, r, _ = qr(
1152
+ np.block(
1153
+ [
1154
+ [
1155
+ aub[~free_ub, :],
1156
+ -identity_m[~free_ub, :],
1157
+ ],
1158
+ [
1159
+ np.zeros((m_linear_ub - np.count_nonzero(free_slack), n)),
1160
+ -identity_m[~free_slack, :],
1161
+ ],
1162
+ [
1163
+ -identity_n[~free_xl, :],
1164
+ np.zeros((n - np.count_nonzero(free_xl), m_linear_ub)),
1165
+ ],
1166
+ [
1167
+ identity_n[~free_xu, :],
1168
+ np.zeros((n - np.count_nonzero(free_xu), m_linear_ub)),
1169
+ ],
1170
+ ]
1171
+ ).T,
1172
+ pivoting=True,
1173
+ )
1174
+ n_act = np.count_nonzero(
1175
+ np.abs(np.diag(r))
1176
+ >= 10.0
1177
+ * EPS
1178
+ * (n + m_linear_ub)
1179
+ * np.linalg.norm(r[: np.min(r.shape), : np.min(r.shape)], axis=0)
1180
+ )
1181
+ return n_act, q
1182
+
1183
+
1184
+ def _alpha_tr(step, sd, delta):
1185
+ step_sd = step @ sd
1186
+ sd_sq = sd @ sd
1187
+ dist_tr_sq = delta**2.0 - step @ step
1188
+ temp = np.sqrt(max(step_sd**2.0 + sd_sq * dist_tr_sq, 0.0))
1189
+ if step_sd <= 0.0 and sd_sq > TINY * abs(temp - step_sd):
1190
+ alpha_tr = max((temp - step_sd) / sd_sq, 0.0)
1191
+ elif abs(temp + step_sd) > TINY * dist_tr_sq:
1192
+ alpha_tr = max(dist_tr_sq / (temp + step_sd), 0.0)
1193
+ else:
1194
+ raise ZeroDivisionError
1195
+ return alpha_tr
1196
+
1197
+
1198
+ def _argmax(x):
1199
+ return np.flatnonzero(x >= np.max(x))
1200
+
1201
+
1202
+ def _argmin(x):
1203
+ return np.flatnonzero(x <= np.min(x))