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,1703 @@
1
+ """
2
+ Unit tests for the differential global minimization algorithm.
3
+ """
4
+ import multiprocessing
5
+ from multiprocessing.dummy import Pool as ThreadPool
6
+ import platform
7
+
8
+ from scipy.optimize._differentialevolution import (DifferentialEvolutionSolver,
9
+ _ConstraintWrapper)
10
+ from scipy.optimize import differential_evolution, OptimizeResult
11
+ from scipy.optimize._constraints import (Bounds, NonlinearConstraint,
12
+ LinearConstraint)
13
+ from scipy.optimize import rosen, minimize
14
+ from scipy.sparse import csr_array
15
+ from scipy import stats
16
+
17
+ import numpy as np
18
+ from numpy.testing import (assert_equal, assert_allclose, assert_almost_equal,
19
+ assert_string_equal, assert_, suppress_warnings)
20
+ from pytest import raises as assert_raises, warns
21
+ import pytest
22
+
23
+
24
+ class TestDifferentialEvolutionSolver:
25
+
26
+ def setup_method(self):
27
+ self.old_seterr = np.seterr(invalid='raise')
28
+ self.limits = np.array([[0., 0.],
29
+ [2., 2.]])
30
+ self.bounds = [(0., 2.), (0., 2.)]
31
+
32
+ self.dummy_solver = DifferentialEvolutionSolver(self.quadratic,
33
+ [(0, 100)])
34
+
35
+ # dummy_solver2 will be used to test mutation strategies
36
+ self.dummy_solver2 = DifferentialEvolutionSolver(self.quadratic,
37
+ [(0, 1)],
38
+ popsize=7,
39
+ mutation=0.5)
40
+ # create a population that's only 7 members long
41
+ # [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7]
42
+ population = np.atleast_2d(np.arange(0.1, 0.8, 0.1)).T
43
+ self.dummy_solver2.population = population
44
+
45
+ def teardown_method(self):
46
+ np.seterr(**self.old_seterr)
47
+
48
+ def quadratic(self, x):
49
+ return x[0]**2
50
+
51
+ def test__strategy_resolves(self):
52
+ # test that the correct mutation function is resolved by
53
+ # different requested strategy arguments
54
+ solver = DifferentialEvolutionSolver(rosen,
55
+ self.bounds,
56
+ strategy='best1exp')
57
+ assert_equal(solver.strategy, 'best1exp')
58
+ assert_equal(solver.mutation_func.__name__, '_best1')
59
+
60
+ solver = DifferentialEvolutionSolver(rosen,
61
+ self.bounds,
62
+ strategy='best1bin')
63
+ assert_equal(solver.strategy, 'best1bin')
64
+ assert_equal(solver.mutation_func.__name__, '_best1')
65
+
66
+ solver = DifferentialEvolutionSolver(rosen,
67
+ self.bounds,
68
+ strategy='rand1bin')
69
+ assert_equal(solver.strategy, 'rand1bin')
70
+ assert_equal(solver.mutation_func.__name__, '_rand1')
71
+
72
+ solver = DifferentialEvolutionSolver(rosen,
73
+ self.bounds,
74
+ strategy='rand1exp')
75
+ assert_equal(solver.strategy, 'rand1exp')
76
+ assert_equal(solver.mutation_func.__name__, '_rand1')
77
+
78
+ solver = DifferentialEvolutionSolver(rosen,
79
+ self.bounds,
80
+ strategy='rand2exp')
81
+ assert_equal(solver.strategy, 'rand2exp')
82
+ assert_equal(solver.mutation_func.__name__, '_rand2')
83
+
84
+ solver = DifferentialEvolutionSolver(rosen,
85
+ self.bounds,
86
+ strategy='best2bin')
87
+ assert_equal(solver.strategy, 'best2bin')
88
+ assert_equal(solver.mutation_func.__name__, '_best2')
89
+
90
+ solver = DifferentialEvolutionSolver(rosen,
91
+ self.bounds,
92
+ strategy='rand2bin')
93
+ assert_equal(solver.strategy, 'rand2bin')
94
+ assert_equal(solver.mutation_func.__name__, '_rand2')
95
+
96
+ solver = DifferentialEvolutionSolver(rosen,
97
+ self.bounds,
98
+ strategy='rand2exp')
99
+ assert_equal(solver.strategy, 'rand2exp')
100
+ assert_equal(solver.mutation_func.__name__, '_rand2')
101
+
102
+ solver = DifferentialEvolutionSolver(rosen,
103
+ self.bounds,
104
+ strategy='randtobest1bin')
105
+ assert_equal(solver.strategy, 'randtobest1bin')
106
+ assert_equal(solver.mutation_func.__name__, '_randtobest1')
107
+
108
+ solver = DifferentialEvolutionSolver(rosen,
109
+ self.bounds,
110
+ strategy='randtobest1exp')
111
+ assert_equal(solver.strategy, 'randtobest1exp')
112
+ assert_equal(solver.mutation_func.__name__, '_randtobest1')
113
+
114
+ solver = DifferentialEvolutionSolver(rosen,
115
+ self.bounds,
116
+ strategy='currenttobest1bin')
117
+ assert_equal(solver.strategy, 'currenttobest1bin')
118
+ assert_equal(solver.mutation_func.__name__, '_currenttobest1')
119
+
120
+ solver = DifferentialEvolutionSolver(rosen,
121
+ self.bounds,
122
+ strategy='currenttobest1exp')
123
+ assert_equal(solver.strategy, 'currenttobest1exp')
124
+ assert_equal(solver.mutation_func.__name__, '_currenttobest1')
125
+
126
+ def test__mutate1(self):
127
+ # strategies */1/*, i.e. rand/1/bin, best/1/exp, etc.
128
+ result = np.array([0.05])
129
+ trial = self.dummy_solver2._best1(np.array([2, 3, 4, 5, 6]))
130
+ assert_allclose(trial, result)
131
+
132
+ result = np.array([0.25])
133
+ trial = self.dummy_solver2._rand1(np.array([2, 3, 4, 5, 6]))
134
+ assert_allclose(trial, result)
135
+
136
+ def test__mutate2(self):
137
+ # strategies */2/*, i.e. rand/2/bin, best/2/exp, etc.
138
+ # [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7]
139
+
140
+ result = np.array([-0.1])
141
+ trial = self.dummy_solver2._best2(np.array([2, 3, 4, 5, 6]))
142
+ assert_allclose(trial, result)
143
+
144
+ result = np.array([0.1])
145
+ trial = self.dummy_solver2._rand2(np.array([2, 3, 4, 5, 6]))
146
+ assert_allclose(trial, result)
147
+
148
+ def test__randtobest1(self):
149
+ # strategies randtobest/1/*
150
+ result = np.array([0.15])
151
+ trial = self.dummy_solver2._randtobest1(np.array([2, 3, 4, 5, 6]))
152
+ assert_allclose(trial, result)
153
+
154
+ def test__currenttobest1(self):
155
+ # strategies currenttobest/1/*
156
+ result = np.array([0.1])
157
+ trial = self.dummy_solver2._currenttobest1(
158
+ 1,
159
+ np.array([2, 3, 4, 5, 6])
160
+ )
161
+ assert_allclose(trial, result)
162
+
163
+ def test_can_init_with_dithering(self):
164
+ mutation = (0.5, 1)
165
+ solver = DifferentialEvolutionSolver(self.quadratic,
166
+ self.bounds,
167
+ mutation=mutation)
168
+
169
+ assert_equal(solver.dither, list(mutation))
170
+
171
+ def test_invalid_mutation_values_arent_accepted(self):
172
+ func = rosen
173
+ mutation = (0.5, 3)
174
+ assert_raises(ValueError,
175
+ DifferentialEvolutionSolver,
176
+ func,
177
+ self.bounds,
178
+ mutation=mutation)
179
+
180
+ mutation = (-1, 1)
181
+ assert_raises(ValueError,
182
+ DifferentialEvolutionSolver,
183
+ func,
184
+ self.bounds,
185
+ mutation=mutation)
186
+
187
+ mutation = (0.1, np.nan)
188
+ assert_raises(ValueError,
189
+ DifferentialEvolutionSolver,
190
+ func,
191
+ self.bounds,
192
+ mutation=mutation)
193
+
194
+ mutation = 0.5
195
+ solver = DifferentialEvolutionSolver(func,
196
+ self.bounds,
197
+ mutation=mutation)
198
+ assert_equal(0.5, solver.scale)
199
+ assert_equal(None, solver.dither)
200
+
201
+ def test_invalid_functional(self):
202
+ def func(x):
203
+ return np.array([np.sum(x ** 2), np.sum(x)])
204
+
205
+ with assert_raises(
206
+ RuntimeError,
207
+ match=r"func\(x, \*args\) must return a scalar value"):
208
+ differential_evolution(func, [(-2, 2), (-2, 2)])
209
+
210
+ def test__scale_parameters(self):
211
+ trial = np.array([0.3])
212
+ assert_equal(30, self.dummy_solver._scale_parameters(trial))
213
+
214
+ # it should also work with the limits reversed
215
+ self.dummy_solver.limits = np.array([[100], [0.]])
216
+ assert_equal(30, self.dummy_solver._scale_parameters(trial))
217
+
218
+ def test__unscale_parameters(self):
219
+ trial = np.array([30])
220
+ assert_equal(0.3, self.dummy_solver._unscale_parameters(trial))
221
+
222
+ # it should also work with the limits reversed
223
+ self.dummy_solver.limits = np.array([[100], [0.]])
224
+ assert_equal(0.3, self.dummy_solver._unscale_parameters(trial))
225
+
226
+ def test_equal_bounds(self):
227
+ with np.errstate(invalid='raise'):
228
+ solver = DifferentialEvolutionSolver(
229
+ self.quadratic,
230
+ bounds=[(2.0, 2.0), (1.0, 3.0)]
231
+ )
232
+ v = solver._unscale_parameters([2.0, 2.0])
233
+ assert_allclose(v, 0.5)
234
+
235
+ res = differential_evolution(self.quadratic, [(2.0, 2.0), (3.0, 3.0)])
236
+ assert_equal(res.x, [2.0, 3.0])
237
+
238
+ def test__ensure_constraint(self):
239
+ trial = np.array([1.1, -100, 0.9, 2., 300., -0.00001])
240
+ self.dummy_solver._ensure_constraint(trial)
241
+
242
+ assert_equal(trial[2], 0.9)
243
+ assert_(np.logical_and(trial >= 0, trial <= 1).all())
244
+
245
+ def test_differential_evolution(self):
246
+ # test that the Jmin of DifferentialEvolutionSolver
247
+ # is the same as the function evaluation
248
+ solver = DifferentialEvolutionSolver(
249
+ self.quadratic, [(-2, 2)], maxiter=1, polish=False
250
+ )
251
+ result = solver.solve()
252
+ assert_equal(result.fun, self.quadratic(result.x))
253
+
254
+ solver = DifferentialEvolutionSolver(
255
+ self.quadratic, [(-2, 2)], maxiter=1, polish=True
256
+ )
257
+ result = solver.solve()
258
+ assert_equal(result.fun, self.quadratic(result.x))
259
+
260
+ def test_best_solution_retrieval(self):
261
+ # test that the getter property method for the best solution works.
262
+ solver = DifferentialEvolutionSolver(self.quadratic, [(-2, 2)])
263
+ result = solver.solve()
264
+ assert_equal(result.x, solver.x)
265
+
266
+ def test_intermediate_result(self):
267
+ # Check that intermediate result object passed into the callback
268
+ # function contains the expected information and that raising
269
+ # `StopIteration` causes the expected behavior.
270
+ maxiter = 10
271
+
272
+ def func(x):
273
+ val = rosen(x)
274
+ if val < func.val:
275
+ func.x = x
276
+ func.val = val
277
+ return val
278
+ func.x = None
279
+ func.val = np.inf
280
+
281
+ def callback(intermediate_result):
282
+ callback.nit += 1
283
+ callback.intermediate_result = intermediate_result
284
+ assert intermediate_result.population.ndim == 2
285
+ assert intermediate_result.population.shape[1] == 2
286
+ assert intermediate_result.nit == callback.nit
287
+
288
+ # Check that `x` and `fun` attributes are the best found so far
289
+ assert_equal(intermediate_result.x, callback.func.x)
290
+ assert_equal(intermediate_result.fun, callback.func.val)
291
+
292
+ # Check for consistency between `fun`, `population_energies`,
293
+ # `x`, and `population`
294
+ assert_equal(intermediate_result.fun, rosen(intermediate_result.x))
295
+ for i in range(len(intermediate_result.population_energies)):
296
+ res = intermediate_result.population_energies[i]
297
+ ref = rosen(intermediate_result.population[i])
298
+ assert_equal(res, ref)
299
+ assert_equal(intermediate_result.x,
300
+ intermediate_result.population[0])
301
+ assert_equal(intermediate_result.fun,
302
+ intermediate_result.population_energies[0])
303
+
304
+ assert intermediate_result.message == 'in progress'
305
+ assert intermediate_result.success is True
306
+ assert isinstance(intermediate_result, OptimizeResult)
307
+ if callback.nit == maxiter:
308
+ raise StopIteration
309
+ callback.nit = 0
310
+ callback.intermediate_result = None
311
+ callback.func = func
312
+
313
+ bounds = [(0, 2), (0, 2)]
314
+ kwargs = dict(func=func, bounds=bounds, rng=838245, polish=False)
315
+ res = differential_evolution(**kwargs, callback=callback)
316
+ ref = differential_evolution(**kwargs, maxiter=maxiter)
317
+
318
+ # Check that final `intermediate_result` is equivalent to returned
319
+ # result object and that terminating with callback `StopIteration`
320
+ # after `maxiter` iterations is equivalent to terminating with
321
+ # `maxiter` parameter.
322
+ assert res.success is ref.success is False
323
+ assert callback.nit == res.nit == maxiter
324
+ assert res.message == 'callback function requested stop early'
325
+ assert ref.message == 'Maximum number of iterations has been exceeded.'
326
+ for field, val in ref.items():
327
+ if field in {'message', 'success'}: # checked separately
328
+ continue
329
+ assert_equal(callback.intermediate_result[field], val)
330
+ assert_equal(res[field], val)
331
+
332
+ # Check that polish occurs after `StopIteration` as advertised
333
+ callback.nit = 0
334
+ func.val = np.inf
335
+ kwargs['polish'] = True
336
+ res = differential_evolution(**kwargs, callback=callback)
337
+ assert res.fun < ref.fun
338
+
339
+ def test_callback_terminates(self):
340
+ # test that if the callback returns true, then the minimization halts
341
+ bounds = [(0, 2), (0, 2)]
342
+ expected_msg = 'callback function requested stop early'
343
+ def callback_python_true(param, convergence=0.):
344
+ return True
345
+
346
+ result = differential_evolution(
347
+ rosen, bounds, callback=callback_python_true
348
+ )
349
+ assert_string_equal(result.message, expected_msg)
350
+
351
+ # if callback raises StopIteration then solve should be interrupted
352
+ def callback_stop(intermediate_result):
353
+ raise StopIteration
354
+
355
+ result = differential_evolution(rosen, bounds, callback=callback_stop)
356
+ assert not result.success
357
+
358
+ def callback_evaluates_true(param, convergence=0.):
359
+ # DE should stop if bool(self.callback) is True
360
+ return [10]
361
+
362
+ result = differential_evolution(rosen, bounds, callback=callback_evaluates_true)
363
+ assert_string_equal(result.message, expected_msg)
364
+ assert not result.success
365
+
366
+ def callback_evaluates_false(param, convergence=0.):
367
+ return []
368
+
369
+ result = differential_evolution(rosen, bounds,
370
+ callback=callback_evaluates_false)
371
+ assert result.success
372
+
373
+ def test_args_tuple_is_passed(self):
374
+ # test that the args tuple is passed to the cost function properly.
375
+ bounds = [(-10, 10)]
376
+ args = (1., 2., 3.)
377
+
378
+ def quadratic(x, *args):
379
+ if not isinstance(args, tuple):
380
+ raise ValueError('args should be a tuple')
381
+ return args[0] + args[1] * x + args[2] * x**2.
382
+
383
+ result = differential_evolution(quadratic,
384
+ bounds,
385
+ args=args,
386
+ polish=True)
387
+ assert_almost_equal(result.fun, 2 / 3.)
388
+
389
+ def test_init_with_invalid_strategy(self):
390
+ # test that passing an invalid strategy raises ValueError
391
+ func = rosen
392
+ bounds = [(-3, 3)]
393
+ assert_raises(ValueError,
394
+ differential_evolution,
395
+ func,
396
+ bounds,
397
+ strategy='abc')
398
+
399
+ def test_bounds_checking(self):
400
+ # test that the bounds checking works
401
+ func = rosen
402
+ bounds = [(-3)]
403
+ assert_raises(ValueError,
404
+ differential_evolution,
405
+ func,
406
+ bounds)
407
+ bounds = [(-3, 3), (3, 4, 5)]
408
+ assert_raises(ValueError,
409
+ differential_evolution,
410
+ func,
411
+ bounds)
412
+
413
+ # test that we can use a new-type Bounds object
414
+ result = differential_evolution(rosen, Bounds([0, 0], [2, 2]))
415
+ assert_almost_equal(result.x, (1., 1.))
416
+
417
+ def test_select_samples(self):
418
+ # select_samples should return 5 separate random numbers.
419
+ limits = np.arange(12., dtype='float64').reshape(2, 6)
420
+ bounds = list(zip(limits[0, :], limits[1, :]))
421
+ solver = DifferentialEvolutionSolver(None, bounds, popsize=1)
422
+ candidate = 0
423
+ r1, r2, r3, r4, r5 = solver._select_samples(candidate, 5)
424
+ assert_equal(
425
+ len(np.unique(np.array([candidate, r1, r2, r3, r4, r5]))), 6)
426
+
427
+ def test_maxiter_stops_solve(self):
428
+ # test that if the maximum number of iterations is exceeded
429
+ # the solver stops.
430
+ solver = DifferentialEvolutionSolver(rosen, self.bounds, maxiter=1)
431
+ result = solver.solve()
432
+ assert_equal(result.success, False)
433
+ assert_equal(result.message,
434
+ 'Maximum number of iterations has been exceeded.')
435
+
436
+ def test_maxfun_stops_solve(self):
437
+ # test that if the maximum number of function evaluations is exceeded
438
+ # during initialisation the solver stops
439
+ solver = DifferentialEvolutionSolver(rosen, self.bounds, maxfun=1,
440
+ polish=False)
441
+ result = solver.solve()
442
+
443
+ assert_equal(result.nfev, 2)
444
+ assert_equal(result.success, False)
445
+ assert_equal(result.message,
446
+ 'Maximum number of function evaluations has '
447
+ 'been exceeded.')
448
+
449
+ # test that if the maximum number of function evaluations is exceeded
450
+ # during the actual minimisation, then the solver stops.
451
+ # Have to turn polishing off, as this will still occur even if maxfun
452
+ # is reached. For popsize=5 and len(bounds)=2, then there are only 10
453
+ # function evaluations during initialisation.
454
+ solver = DifferentialEvolutionSolver(rosen,
455
+ self.bounds,
456
+ popsize=5,
457
+ polish=False,
458
+ maxfun=40)
459
+ result = solver.solve()
460
+
461
+ assert_equal(result.nfev, 41)
462
+ assert_equal(result.success, False)
463
+ assert_equal(result.message,
464
+ 'Maximum number of function evaluations has '
465
+ 'been exceeded.')
466
+
467
+ # now repeat for updating='deferred version
468
+ # 47 function evaluations is not a multiple of the population size,
469
+ # so maxfun is reached partway through a population evaluation.
470
+ solver = DifferentialEvolutionSolver(rosen,
471
+ self.bounds,
472
+ popsize=5,
473
+ polish=False,
474
+ maxfun=47,
475
+ updating='deferred')
476
+ result = solver.solve()
477
+
478
+ assert_equal(result.nfev, 47)
479
+ assert_equal(result.success, False)
480
+ assert_equal(result.message,
481
+ 'Maximum number of function evaluations has '
482
+ 'been reached.')
483
+
484
+ def test_quadratic(self):
485
+ # test the quadratic function from object
486
+ solver = DifferentialEvolutionSolver(self.quadratic,
487
+ [(-100, 100)],
488
+ tol=0.02)
489
+ solver.solve()
490
+ assert_equal(np.argmin(solver.population_energies), 0)
491
+
492
+ def test_quadratic_from_diff_ev(self):
493
+ # test the quadratic function from differential_evolution function
494
+ differential_evolution(self.quadratic,
495
+ [(-100, 100)],
496
+ tol=0.02,
497
+ seed=1)
498
+
499
+ def test_rng_gives_repeatability(self):
500
+ result = differential_evolution(self.quadratic,
501
+ [(-100, 100)],
502
+ polish=False,
503
+ rng=1,
504
+ tol=0.5)
505
+ result2 = differential_evolution(self.quadratic,
506
+ [(-100, 100)],
507
+ polish=False,
508
+ rng=1,
509
+ tol=0.5)
510
+ assert_equal(result.x, result2.x)
511
+ assert_equal(result.nfev, result2.nfev)
512
+
513
+ def test_random_generator(self):
514
+ # check that np.random.Generator can be used (numpy >= 1.17)
515
+ # obtain a np.random.Generator object
516
+ rng = np.random.default_rng()
517
+
518
+ inits = ['random', 'latinhypercube', 'sobol', 'halton']
519
+ for init in inits:
520
+ differential_evolution(self.quadratic,
521
+ [(-100, 100)],
522
+ polish=False,
523
+ rng=rng,
524
+ tol=0.5,
525
+ init=init)
526
+
527
+ def test_exp_runs(self):
528
+ # test whether exponential mutation loop runs
529
+ solver = DifferentialEvolutionSolver(rosen,
530
+ self.bounds,
531
+ strategy='best1exp',
532
+ maxiter=1)
533
+
534
+ solver.solve()
535
+
536
+ def test_gh_4511_regression(self):
537
+ # This modification of the differential evolution docstring example
538
+ # uses a custom popsize that had triggered an off-by-one error.
539
+ # Because we do not care about solving the optimization problem in
540
+ # this test, we use maxiter=1 to reduce the testing time.
541
+ bounds = [(-5, 5), (-5, 5)]
542
+ # result = differential_evolution(rosen, bounds, popsize=1815,
543
+ # maxiter=1)
544
+
545
+ # the original issue arose because of rounding error in arange, with
546
+ # linspace being a much better solution. 1815 is quite a large popsize
547
+ # to use and results in a long test time (~13s). I used the original
548
+ # issue to figure out the lowest number of samples that would cause
549
+ # this rounding error to occur, 49.
550
+ differential_evolution(rosen, bounds, popsize=49, maxiter=1)
551
+
552
+ def test_calculate_population_energies(self):
553
+ # if popsize is 3, then the overall generation has size (6,)
554
+ solver = DifferentialEvolutionSolver(rosen, self.bounds, popsize=3)
555
+ solver._calculate_population_energies(solver.population)
556
+ solver._promote_lowest_energy()
557
+ assert_equal(np.argmin(solver.population_energies), 0)
558
+
559
+ # initial calculation of the energies should require 6 nfev.
560
+ assert_equal(solver._nfev, 6)
561
+
562
+ def test_iteration(self):
563
+ # test that DifferentialEvolutionSolver is iterable
564
+ # if popsize is 3, then the overall generation has size (6,)
565
+ solver = DifferentialEvolutionSolver(rosen, self.bounds, popsize=3,
566
+ maxfun=12)
567
+ x, fun = next(solver)
568
+ assert_equal(np.size(x, 0), 2)
569
+
570
+ # 6 nfev are required for initial calculation of energies, 6 nfev are
571
+ # required for the evolution of the 6 population members.
572
+ assert_equal(solver._nfev, 12)
573
+
574
+ # the next generation should halt because it exceeds maxfun
575
+ assert_raises(StopIteration, next, solver)
576
+
577
+ # check a proper minimisation can be done by an iterable solver
578
+ solver = DifferentialEvolutionSolver(rosen, self.bounds)
579
+ _, fun_prev = next(solver)
580
+ for i, soln in enumerate(solver):
581
+ x_current, fun_current = soln
582
+ assert fun_prev >= fun_current
583
+ _, fun_prev = x_current, fun_current
584
+ # need to have this otherwise the solver would never stop.
585
+ if i == 50:
586
+ break
587
+
588
+ def test_convergence(self):
589
+ solver = DifferentialEvolutionSolver(rosen, self.bounds, tol=0.2,
590
+ polish=False)
591
+ solver.solve()
592
+ assert_(solver.convergence < 0.2)
593
+
594
+ def test_maxiter_none_GH5731(self):
595
+ # Pre 0.17 the previous default for maxiter and maxfun was None.
596
+ # the numerical defaults are now 1000 and np.inf. However, some scripts
597
+ # will still supply None for both of those, this will raise a TypeError
598
+ # in the solve method.
599
+ solver = DifferentialEvolutionSolver(rosen, self.bounds, maxiter=None,
600
+ maxfun=None)
601
+ solver.solve()
602
+
603
+ def test_population_initiation(self):
604
+ # test the different modes of population initiation
605
+
606
+ # init must be either 'latinhypercube' or 'random'
607
+ # raising ValueError is something else is passed in
608
+ assert_raises(ValueError,
609
+ DifferentialEvolutionSolver,
610
+ *(rosen, self.bounds),
611
+ **{'init': 'rubbish'})
612
+
613
+ solver = DifferentialEvolutionSolver(rosen, self.bounds)
614
+
615
+ # check that population initiation:
616
+ # 1) resets _nfev to 0
617
+ # 2) all population energies are np.inf
618
+ solver.init_population_random()
619
+ assert_equal(solver._nfev, 0)
620
+ assert_(np.all(np.isinf(solver.population_energies)))
621
+
622
+ solver.init_population_lhs()
623
+ assert_equal(solver._nfev, 0)
624
+ assert_(np.all(np.isinf(solver.population_energies)))
625
+
626
+ solver.init_population_qmc(qmc_engine='halton')
627
+ assert_equal(solver._nfev, 0)
628
+ assert_(np.all(np.isinf(solver.population_energies)))
629
+
630
+ solver = DifferentialEvolutionSolver(rosen, self.bounds, init='sobol')
631
+ solver.init_population_qmc(qmc_engine='sobol')
632
+ assert_equal(solver._nfev, 0)
633
+ assert_(np.all(np.isinf(solver.population_energies)))
634
+
635
+ # we should be able to initialize with our own array
636
+ population = np.linspace(-1, 3, 10).reshape(5, 2)
637
+ solver = DifferentialEvolutionSolver(rosen, self.bounds,
638
+ init=population,
639
+ strategy='best2bin',
640
+ atol=0.01, rng=1, popsize=5)
641
+
642
+ assert_equal(solver._nfev, 0)
643
+ assert_(np.all(np.isinf(solver.population_energies)))
644
+ assert_(solver.num_population_members == 5)
645
+ assert_(solver.population_shape == (5, 2))
646
+
647
+ # check that the population was initialized correctly
648
+ unscaled_population = np.clip(solver._unscale_parameters(population),
649
+ 0, 1)
650
+ assert_almost_equal(solver.population[:5], unscaled_population)
651
+
652
+ # population values need to be clipped to bounds
653
+ assert_almost_equal(np.min(solver.population[:5]), 0)
654
+ assert_almost_equal(np.max(solver.population[:5]), 1)
655
+
656
+ # shouldn't be able to initialize with an array if it's the wrong shape
657
+ # this would have too many parameters
658
+ population = np.linspace(-1, 3, 15).reshape(5, 3)
659
+ assert_raises(ValueError,
660
+ DifferentialEvolutionSolver,
661
+ *(rosen, self.bounds),
662
+ **{'init': population})
663
+
664
+ # provide an initial solution
665
+ # bounds are [(0, 2), (0, 2)]
666
+ x0 = np.random.uniform(low=0.0, high=2.0, size=2)
667
+ solver = DifferentialEvolutionSolver(
668
+ rosen, self.bounds, x0=x0
669
+ )
670
+ # parameters are scaled to unit interval
671
+ assert_allclose(solver.population[0], x0 / 2.0)
672
+
673
+ def test_x0(self):
674
+ # smoke test that checks that x0 is usable.
675
+ res = differential_evolution(rosen, self.bounds, x0=[0.2, 0.8])
676
+ assert res.success
677
+
678
+ # check what happens if some of the x0 lay outside the bounds
679
+ with assert_raises(ValueError):
680
+ differential_evolution(rosen, self.bounds, x0=[0.2, 2.1])
681
+
682
+ def test_infinite_objective_function(self):
683
+ # Test that there are no problems if the objective function
684
+ # returns inf on some runs
685
+ def sometimes_inf(x):
686
+ if x[0] < .5:
687
+ return np.inf
688
+ return x[1]
689
+ bounds = [(0, 1), (0, 1)]
690
+ differential_evolution(sometimes_inf, bounds=bounds, disp=False)
691
+
692
+ def test_deferred_updating(self):
693
+ # check setting of deferred updating, with default workers
694
+ bounds = [(0., 2.), (0., 2.)]
695
+ solver = DifferentialEvolutionSolver(rosen, bounds, updating='deferred')
696
+ assert_(solver._updating == 'deferred')
697
+ assert_(solver._mapwrapper._mapfunc is map)
698
+ res = solver.solve()
699
+ assert res.success
700
+
701
+ # check that deferred updating works with an exponential crossover
702
+ res = differential_evolution(
703
+ rosen, bounds, updating='deferred', strategy='best1exp'
704
+ )
705
+ assert res.success
706
+
707
+ @pytest.mark.thread_unsafe
708
+ def test_immediate_updating(self):
709
+ # check setting of immediate updating, with default workers
710
+ bounds = [(0., 2.), (0., 2.)]
711
+ solver = DifferentialEvolutionSolver(rosen, bounds)
712
+ assert_(solver._updating == 'immediate')
713
+
714
+ # Safely forking from a multithreaded process is
715
+ # problematic, and deprecated in Python 3.12, so
716
+ # we use a slower but portable alternative
717
+ # see gh-19848
718
+ ctx = multiprocessing.get_context("spawn")
719
+ with ctx.Pool(2) as p:
720
+ # should raise a UserWarning because the updating='immediate'
721
+ # is being overridden by the workers keyword
722
+ with warns(UserWarning):
723
+ with DifferentialEvolutionSolver(rosen, bounds, workers=p.map) as s:
724
+ solver.solve()
725
+ assert s._updating == 'deferred'
726
+
727
+ @pytest.mark.fail_slow(10)
728
+ def test_parallel(self):
729
+ # smoke test for parallelization with deferred updating
730
+ bounds = [(0., 2.), (0., 2.)]
731
+ # use threads instead of Process to speed things up for this simple example
732
+ with ThreadPool(2) as p, DifferentialEvolutionSolver(
733
+ rosen, bounds, updating='deferred', workers=p.map, tol=0.1, popsize=3
734
+ ) as solver:
735
+ assert solver._mapwrapper.pool is not None
736
+ assert solver._updating == 'deferred'
737
+ solver.solve()
738
+
739
+ with DifferentialEvolutionSolver(
740
+ rosen, bounds, updating='deferred', workers=2, popsize=3, tol=0.1
741
+ ) as solver:
742
+ assert solver._mapwrapper.pool is not None
743
+ assert solver._updating == 'deferred'
744
+ solver.solve()
745
+
746
+ def test_converged(self):
747
+ solver = DifferentialEvolutionSolver(rosen, [(0, 2), (0, 2)])
748
+ solver.solve()
749
+ assert_(solver.converged())
750
+
751
+ def test_constraint_violation_fn(self):
752
+ def constr_f(x):
753
+ return [x[0] + x[1]]
754
+
755
+ def constr_f2(x):
756
+ return np.array([x[0]**2 + x[1], x[0] - x[1]])
757
+
758
+ nlc = NonlinearConstraint(constr_f, -np.inf, 1.9)
759
+
760
+ solver = DifferentialEvolutionSolver(rosen, [(0, 2), (0, 2)],
761
+ constraints=(nlc,))
762
+
763
+ cv = solver._constraint_violation_fn(np.array([1.0, 1.0]))
764
+ assert_almost_equal(cv, 0.1)
765
+
766
+ nlc2 = NonlinearConstraint(constr_f2, -np.inf, 1.8)
767
+ solver = DifferentialEvolutionSolver(rosen, [(0, 2), (0, 2)],
768
+ constraints=(nlc, nlc2))
769
+
770
+ # for multiple constraints the constraint violations should
771
+ # be concatenated.
772
+ xs = [(1.2, 1), (2.0, 2.0), (0.5, 0.5)]
773
+ vs = [(0.3, 0.64, 0.0), (2.1, 4.2, 0.0), (0, 0, 0)]
774
+
775
+ for x, v in zip(xs, vs):
776
+ cv = solver._constraint_violation_fn(np.array(x))
777
+ assert_allclose(cv, np.atleast_2d(v))
778
+
779
+ # vectorized calculation of a series of solutions
780
+ assert_allclose(
781
+ solver._constraint_violation_fn(np.array(xs)), np.array(vs)
782
+ )
783
+
784
+ # the following line is used in _calculate_population_feasibilities.
785
+ # _constraint_violation_fn returns an (1, M) array when
786
+ # x.shape == (N,), i.e. a single solution. Therefore this list
787
+ # comprehension should generate (S, 1, M) array.
788
+ constraint_violation = np.array([solver._constraint_violation_fn(x)
789
+ for x in np.array(xs)])
790
+ assert constraint_violation.shape == (3, 1, 3)
791
+
792
+ # we need reasonable error messages if the constraint function doesn't
793
+ # return the right thing
794
+ def constr_f3(x):
795
+ # returns (S, M), rather than (M, S)
796
+ return constr_f2(x).T
797
+
798
+ nlc2 = NonlinearConstraint(constr_f3, -np.inf, 1.8)
799
+ solver = DifferentialEvolutionSolver(rosen, [(0, 2), (0, 2)],
800
+ constraints=(nlc, nlc2),
801
+ vectorized=False)
802
+ solver.vectorized = True
803
+ with pytest.raises(
804
+ RuntimeError, match="An array returned from a Constraint"
805
+ ):
806
+ solver._constraint_violation_fn(np.array(xs))
807
+
808
+ def test_constraint_population_feasibilities(self):
809
+ def constr_f(x):
810
+ return [x[0] + x[1]]
811
+
812
+ def constr_f2(x):
813
+ return [x[0]**2 + x[1], x[0] - x[1]]
814
+
815
+ nlc = NonlinearConstraint(constr_f, -np.inf, 1.9)
816
+
817
+ solver = DifferentialEvolutionSolver(rosen, [(0, 2), (0, 2)],
818
+ constraints=(nlc,))
819
+
820
+ # are population feasibilities correct
821
+ # [0.5, 0.5] corresponds to scaled values of [1., 1.]
822
+ feas, cv = solver._calculate_population_feasibilities(
823
+ np.array([[0.5, 0.5], [1., 1.]]))
824
+ assert_equal(feas, [False, False])
825
+ assert_almost_equal(cv, np.array([[0.1], [2.1]]))
826
+ assert cv.shape == (2, 1)
827
+
828
+ nlc2 = NonlinearConstraint(constr_f2, -np.inf, 1.8)
829
+
830
+ for vectorize in [False, True]:
831
+ solver = DifferentialEvolutionSolver(rosen, [(0, 2), (0, 2)],
832
+ constraints=(nlc, nlc2),
833
+ vectorized=vectorize,
834
+ updating='deferred')
835
+
836
+ feas, cv = solver._calculate_population_feasibilities(
837
+ np.array([[0.5, 0.5], [0.6, 0.5]]))
838
+ assert_equal(feas, [False, False])
839
+ assert_almost_equal(cv, np.array([[0.1, 0.2, 0], [0.3, 0.64, 0]]))
840
+
841
+ feas, cv = solver._calculate_population_feasibilities(
842
+ np.array([[0.5, 0.5], [1., 1.]]))
843
+ assert_equal(feas, [False, False])
844
+ assert_almost_equal(cv, np.array([[0.1, 0.2, 0], [2.1, 4.2, 0]]))
845
+ assert cv.shape == (2, 3)
846
+
847
+ feas, cv = solver._calculate_population_feasibilities(
848
+ np.array([[0.25, 0.25], [1., 1.]]))
849
+ assert_equal(feas, [True, False])
850
+ assert_almost_equal(cv, np.array([[0.0, 0.0, 0.], [2.1, 4.2, 0]]))
851
+ assert cv.shape == (2, 3)
852
+
853
+ @pytest.mark.thread_unsafe
854
+ def test_constraint_solve(self):
855
+ def constr_f(x):
856
+ return np.array([x[0] + x[1]])
857
+
858
+ nlc = NonlinearConstraint(constr_f, -np.inf, 1.9)
859
+
860
+ solver = DifferentialEvolutionSolver(rosen, [(0, 2), (0, 2)],
861
+ constraints=(nlc,))
862
+
863
+ # trust-constr warns if the constraint function is linear
864
+ with warns(UserWarning):
865
+ res = solver.solve()
866
+
867
+ assert constr_f(res.x) <= 1.9
868
+ assert res.success
869
+
870
+ @pytest.mark.fail_slow(10)
871
+ @pytest.mark.thread_unsafe
872
+ def test_impossible_constraint(self):
873
+ def constr_f(x):
874
+ return np.array([x[0] + x[1]])
875
+
876
+ nlc = NonlinearConstraint(constr_f, -np.inf, -1)
877
+
878
+ solver = DifferentialEvolutionSolver(
879
+ rosen, [(0, 2), (0, 2)], constraints=(nlc,), popsize=1, rng=1, maxiter=100
880
+ )
881
+
882
+ # a UserWarning is issued because the 'trust-constr' polishing is
883
+ # attempted on the least infeasible solution found.
884
+ with warns(UserWarning):
885
+ res = solver.solve()
886
+
887
+ assert res.maxcv > 0
888
+ assert not res.success
889
+
890
+ # test _promote_lowest_energy works when none of the population is
891
+ # feasible. In this case, the solution with the lowest constraint
892
+ # violation should be promoted.
893
+ solver = DifferentialEvolutionSolver(
894
+ rosen, [(0, 2), (0, 2)], constraints=(nlc,), polish=False)
895
+ next(solver)
896
+ assert not solver.feasible.all()
897
+ assert not np.isfinite(solver.population_energies).all()
898
+
899
+ # now swap two of the entries in the population
900
+ l = 20
901
+ cv = solver.constraint_violation[0]
902
+
903
+ solver.population_energies[[0, l]] = solver.population_energies[[l, 0]]
904
+ solver.population[[0, l], :] = solver.population[[l, 0], :]
905
+ solver.constraint_violation[[0, l], :] = (
906
+ solver.constraint_violation[[l, 0], :])
907
+
908
+ solver._promote_lowest_energy()
909
+ assert_equal(solver.constraint_violation[0], cv)
910
+
911
+ def test_accept_trial(self):
912
+ # _accept_trial(self, energy_trial, feasible_trial, cv_trial,
913
+ # energy_orig, feasible_orig, cv_orig)
914
+ def constr_f(x):
915
+ return [x[0] + x[1]]
916
+ nlc = NonlinearConstraint(constr_f, -np.inf, 1.9)
917
+ solver = DifferentialEvolutionSolver(rosen, [(0, 2), (0, 2)],
918
+ constraints=(nlc,))
919
+ fn = solver._accept_trial
920
+ # both solutions are feasible, select lower energy
921
+ assert fn(0.1, True, np.array([0.]), 1.0, True, np.array([0.]))
922
+ assert (fn(1.0, True, np.array([0.0]), 0.1, True, np.array([0.0])) is False)
923
+ assert fn(0.1, True, np.array([0.]), 0.1, True, np.array([0.]))
924
+
925
+ # trial is feasible, original is not
926
+ assert fn(9.9, True, np.array([0.]), 1.0, False, np.array([1.]))
927
+
928
+ # trial and original are infeasible
929
+ # cv_trial have to be <= cv_original to be better
930
+ assert (fn(0.1, False, np.array([0.5, 0.5]),
931
+ 1.0, False, np.array([1., 1.0])))
932
+ assert (fn(0.1, False, np.array([0.5, 0.5]),
933
+ 1.0, False, np.array([1., 0.50])))
934
+ assert not (fn(1.0, False, np.array([0.5, 0.5]),
935
+ 1.0, False, np.array([1.0, 0.4])))
936
+
937
+ def test_constraint_wrapper(self):
938
+ lb = np.array([0, 20, 30])
939
+ ub = np.array([0.5, np.inf, 70])
940
+ x0 = np.array([1, 2, 3])
941
+ pc = _ConstraintWrapper(Bounds(lb, ub), x0)
942
+ assert (pc.violation(x0) > 0).any()
943
+ assert (pc.violation([0.25, 21, 31]) == 0).all()
944
+
945
+ # check vectorized Bounds constraint
946
+ xs = np.arange(1, 16).reshape(5, 3)
947
+ violations = []
948
+ for x in xs:
949
+ violations.append(pc.violation(x))
950
+ np.testing.assert_allclose(pc.violation(xs.T), np.array(violations).T)
951
+
952
+ x0 = np.array([1, 2, 3, 4])
953
+ A = np.array([[1, 2, 3, 4], [5, 0, 0, 6], [7, 0, 8, 0]])
954
+ pc = _ConstraintWrapper(LinearConstraint(A, -np.inf, 0), x0)
955
+ assert (pc.violation(x0) > 0).any()
956
+ assert (pc.violation([-10, 2, -10, 4]) == 0).all()
957
+
958
+ # check vectorized LinearConstraint, for 7 lots of parameter vectors
959
+ # with each parameter vector being 4 long, with 3 constraints
960
+ # xs is the same shape as stored in the differential evolution
961
+ # population, but it's sent to the violation function as (len(x), M)
962
+ xs = np.arange(1, 29).reshape(7, 4)
963
+ violations = []
964
+ for x in xs:
965
+ violations.append(pc.violation(x))
966
+ np.testing.assert_allclose(pc.violation(xs.T), np.array(violations).T)
967
+
968
+ pc = _ConstraintWrapper(LinearConstraint(csr_array(A), -np.inf, 0),
969
+ x0)
970
+ assert (pc.violation(x0) > 0).any()
971
+ assert (pc.violation([-10, 2, -10, 4]) == 0).all()
972
+
973
+ def fun(x):
974
+ return A.dot(x)
975
+
976
+ nonlinear = NonlinearConstraint(fun, -np.inf, 0)
977
+ pc = _ConstraintWrapper(nonlinear, [-10, 2, -10, 4])
978
+ assert (pc.violation(x0) > 0).any()
979
+ assert (pc.violation([-10, 2, -10, 4]) == 0).all()
980
+
981
+ def test_constraint_wrapper_violation(self):
982
+ def cons_f(x):
983
+ # written in vectorised form to accept an array of (N, S)
984
+ # returning (M, S)
985
+ # where N is the number of parameters,
986
+ # S is the number of solution vectors to be examined,
987
+ # and M is the number of constraint components
988
+ return np.array([x[0] ** 2 + x[1],
989
+ x[0] ** 2 - x[1]])
990
+
991
+ nlc = NonlinearConstraint(cons_f, [-1, -0.8500], [2, 2])
992
+ pc = _ConstraintWrapper(nlc, [0.5, 1])
993
+ assert np.size(pc.bounds[0]) == 2
994
+
995
+ xs = [(0.5, 1), (0.5, 1.2), (1.2, 1.2), (0.1, -1.2), (0.1, 2.0)]
996
+ vs = [(0, 0), (0, 0.1), (0.64, 0), (0.19, 0), (0.01, 1.14)]
997
+
998
+ for x, v in zip(xs, vs):
999
+ assert_allclose(pc.violation(x), v)
1000
+
1001
+ # now check that we can vectorize the constraint wrapper
1002
+ assert_allclose(pc.violation(np.array(xs).T),
1003
+ np.array(vs).T)
1004
+ assert pc.fun(np.array(xs).T).shape == (2, len(xs))
1005
+ assert pc.violation(np.array(xs).T).shape == (2, len(xs))
1006
+ assert pc.num_constr == 2
1007
+ assert pc.parameter_count == 2
1008
+
1009
+ def test_matrix_linear_constraint(self):
1010
+ # gh20041 supplying an np.matrix to construct a LinearConstraint caused
1011
+ # _ConstraintWrapper to start returning constraint violations of the
1012
+ # wrong shape.
1013
+ with suppress_warnings() as sup:
1014
+ sup.filter(PendingDeprecationWarning)
1015
+ matrix = np.matrix([[1, 1, 1, 1.],
1016
+ [2, 2, 2, 2.]])
1017
+ lc = LinearConstraint(matrix, 0, 1)
1018
+ x0 = np.ones(4)
1019
+ cw = _ConstraintWrapper(lc, x0)
1020
+ # the shape of the constraint violation should be the same as the number
1021
+ # of constraints applied.
1022
+ assert cw.violation(x0).shape == (2,)
1023
+
1024
+ # let's try a vectorised violation call.
1025
+ xtrial = np.arange(4 * 5).reshape(4, 5)
1026
+ assert cw.violation(xtrial).shape == (2, 5)
1027
+
1028
+ @pytest.mark.fail_slow(20)
1029
+ def test_L1(self):
1030
+ # Lampinen ([5]) test problem 1
1031
+
1032
+ def f(x):
1033
+ x = np.hstack(([0], x)) # 1-indexed to match reference
1034
+ fun = np.sum(5*x[1:5]) - 5*x[1:5]@x[1:5] - np.sum(x[5:])
1035
+ return fun
1036
+
1037
+ A = np.zeros((10, 14)) # 1-indexed to match reference
1038
+ A[1, [1, 2, 10, 11]] = 2, 2, 1, 1
1039
+ A[2, [1, 10]] = -8, 1
1040
+ A[3, [4, 5, 10]] = -2, -1, 1
1041
+ A[4, [1, 3, 10, 11]] = 2, 2, 1, 1
1042
+ A[5, [2, 11]] = -8, 1
1043
+ A[6, [6, 7, 11]] = -2, -1, 1
1044
+ A[7, [2, 3, 11, 12]] = 2, 2, 1, 1
1045
+ A[8, [3, 12]] = -8, 1
1046
+ A[9, [8, 9, 12]] = -2, -1, 1
1047
+ A = A[1:, 1:]
1048
+
1049
+ b = np.array([10, 0, 0, 10, 0, 0, 10, 0, 0])
1050
+
1051
+ L = LinearConstraint(A, -np.inf, b)
1052
+
1053
+ bounds = [(0, 1)]*9 + [(0, 100)]*3 + [(0, 1)]
1054
+
1055
+ # using a lower popsize to speed the test up
1056
+ res = differential_evolution(
1057
+ f, bounds, strategy='best1bin', rng=12345, constraints=(L,),
1058
+ popsize=5, tol=0.01
1059
+ )
1060
+
1061
+ x_opt = (1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1)
1062
+ f_opt = -15
1063
+
1064
+ assert_allclose(f(x_opt), f_opt, atol=6e-4)
1065
+ assert res.success
1066
+ assert_allclose(res.x, x_opt, atol=6e-4)
1067
+ assert_allclose(res.fun, f_opt, atol=5e-3)
1068
+ assert_(np.all(A@res.x <= b))
1069
+ assert_(np.all(res.x >= np.array(bounds)[:, 0]))
1070
+ assert_(np.all(res.x <= np.array(bounds)[:, 1]))
1071
+
1072
+ # now repeat the same solve, using the same overall constraints,
1073
+ # but using a sparse array for the LinearConstraint instead of an
1074
+ # array
1075
+
1076
+ L = LinearConstraint(csr_array(A), -np.inf, b)
1077
+
1078
+ # using a lower popsize to speed the test up
1079
+ res = differential_evolution(
1080
+ f, bounds, strategy='best1bin', rng=1211134, constraints=(L,),
1081
+ popsize=2, tol=0.05
1082
+ )
1083
+
1084
+ assert_allclose(f(x_opt), f_opt)
1085
+ assert res.success
1086
+ assert_allclose(res.x, x_opt, atol=5e-4)
1087
+ assert_allclose(res.fun, f_opt, atol=5e-3)
1088
+ assert_(np.all(A@res.x <= b))
1089
+ assert_(np.all(res.x >= np.array(bounds)[:, 0]))
1090
+ assert_(np.all(res.x <= np.array(bounds)[:, 1]))
1091
+
1092
+ # now repeat the same solve, using the same overall constraints,
1093
+ # but specify half the constraints in terms of LinearConstraint,
1094
+ # and the other half by NonlinearConstraint
1095
+ def c1(x):
1096
+ x = np.hstack(([0], x))
1097
+ return [2*x[2] + 2*x[3] + x[11] + x[12],
1098
+ -8*x[3] + x[12]]
1099
+
1100
+ def c2(x):
1101
+ x = np.hstack(([0], x))
1102
+ return -2*x[8] - x[9] + x[12]
1103
+
1104
+ L = LinearConstraint(A[:5, :], -np.inf, b[:5])
1105
+ L2 = LinearConstraint(A[5:6, :], -np.inf, b[5:6])
1106
+ N = NonlinearConstraint(c1, -np.inf, b[6:8])
1107
+ N2 = NonlinearConstraint(c2, -np.inf, b[8:9])
1108
+ constraints = (L, N, L2, N2)
1109
+
1110
+ with suppress_warnings() as sup:
1111
+ sup.filter(UserWarning)
1112
+ res = differential_evolution(
1113
+ f, bounds, strategy='best1bin', rng=1211134,
1114
+ constraints=constraints, popsize=2, tol=0.05
1115
+ )
1116
+
1117
+ assert_allclose(res.x, x_opt, atol=6e-4)
1118
+ assert_allclose(res.fun, f_opt, atol=5e-3)
1119
+ assert_(np.all(A@res.x <= b))
1120
+ assert_(np.all(res.x >= np.array(bounds)[:, 0]))
1121
+ assert_(np.all(res.x <= np.array(bounds)[:, 1]))
1122
+
1123
+ @pytest.mark.fail_slow(10)
1124
+ def test_L2(self):
1125
+ # Lampinen ([5]) test problem 2
1126
+
1127
+ def f(x):
1128
+ x = np.hstack(([0], x)) # 1-indexed to match reference
1129
+ fun = ((x[1]-10)**2 + 5*(x[2]-12)**2 + x[3]**4 + 3*(x[4]-11)**2 +
1130
+ 10*x[5]**6 + 7*x[6]**2 + x[7]**4 - 4*x[6]*x[7] - 10*x[6] -
1131
+ 8*x[7])
1132
+ return fun
1133
+
1134
+ def c1(x):
1135
+ x = np.hstack(([0], x)) # 1-indexed to match reference
1136
+ return [127 - 2*x[1]**2 - 3*x[2]**4 - x[3] - 4*x[4]**2 - 5*x[5],
1137
+ 196 - 23*x[1] - x[2]**2 - 6*x[6]**2 + 8*x[7],
1138
+ 282 - 7*x[1] - 3*x[2] - 10*x[3]**2 - x[4] + x[5],
1139
+ -4*x[1]**2 - x[2]**2 + 3*x[1]*x[2] - 2*x[3]**2 -
1140
+ 5*x[6] + 11*x[7]]
1141
+
1142
+ N = NonlinearConstraint(c1, 0, np.inf)
1143
+ bounds = [(-10, 10)]*7
1144
+ constraints = (N)
1145
+
1146
+ with suppress_warnings() as sup:
1147
+ sup.filter(UserWarning)
1148
+ res = differential_evolution(f, bounds, strategy='best1bin',
1149
+ rng=1234, constraints=constraints)
1150
+
1151
+ f_opt = 680.6300599487869
1152
+ x_opt = (2.330499, 1.951372, -0.4775414, 4.365726,
1153
+ -0.6244870, 1.038131, 1.594227)
1154
+
1155
+ assert_allclose(f(x_opt), f_opt)
1156
+ assert_allclose(res.fun, f_opt)
1157
+ assert_allclose(res.x, x_opt, atol=1e-5)
1158
+ assert res.success
1159
+ assert_(np.all(np.array(c1(res.x)) >= 0))
1160
+ assert_(np.all(res.x >= np.array(bounds)[:, 0]))
1161
+ assert_(np.all(res.x <= np.array(bounds)[:, 1]))
1162
+
1163
+ @pytest.mark.fail_slow(10)
1164
+ def test_L3(self):
1165
+ # Lampinen ([5]) test problem 3
1166
+
1167
+ def f(x):
1168
+ x = np.hstack(([0], x)) # 1-indexed to match reference
1169
+ fun = (x[1]**2 + x[2]**2 + x[1]*x[2] - 14*x[1] - 16*x[2] +
1170
+ (x[3]-10)**2 + 4*(x[4]-5)**2 + (x[5]-3)**2 + 2*(x[6]-1)**2 +
1171
+ 5*x[7]**2 + 7*(x[8]-11)**2 + 2*(x[9]-10)**2 +
1172
+ (x[10] - 7)**2 + 45
1173
+ )
1174
+ return fun # maximize
1175
+
1176
+ A = np.zeros((4, 11))
1177
+ A[1, [1, 2, 7, 8]] = -4, -5, 3, -9
1178
+ A[2, [1, 2, 7, 8]] = -10, 8, 17, -2
1179
+ A[3, [1, 2, 9, 10]] = 8, -2, -5, 2
1180
+ A = A[1:, 1:]
1181
+ b = np.array([-105, 0, -12])
1182
+
1183
+ def c1(x):
1184
+ x = np.hstack(([0], x)) # 1-indexed to match reference
1185
+ return [3*x[1] - 6*x[2] - 12*(x[9]-8)**2 + 7*x[10],
1186
+ -3*(x[1]-2)**2 - 4*(x[2]-3)**2 - 2*x[3]**2 + 7*x[4] + 120,
1187
+ -x[1]**2 - 2*(x[2]-2)**2 + 2*x[1]*x[2] - 14*x[5] + 6*x[6],
1188
+ -5*x[1]**2 - 8*x[2] - (x[3]-6)**2 + 2*x[4] + 40,
1189
+ -0.5*(x[1]-8)**2 - 2*(x[2]-4)**2 - 3*x[5]**2 + x[6] + 30]
1190
+
1191
+ L = LinearConstraint(A, b, np.inf)
1192
+ N = NonlinearConstraint(c1, 0, np.inf)
1193
+ bounds = [(-10, 10)]*10
1194
+ constraints = (L, N)
1195
+
1196
+ with suppress_warnings() as sup:
1197
+ sup.filter(UserWarning)
1198
+ res = differential_evolution(f, bounds, rng=1234,
1199
+ constraints=constraints, popsize=3)
1200
+
1201
+ x_opt = (2.171996, 2.363683, 8.773926, 5.095984, 0.9906548,
1202
+ 1.430574, 1.321644, 9.828726, 8.280092, 8.375927)
1203
+ f_opt = 24.3062091
1204
+
1205
+ assert_allclose(f(x_opt), f_opt, atol=1e-5)
1206
+ assert_allclose(res.x, x_opt, atol=1e-6)
1207
+ assert_allclose(res.fun, f_opt, atol=1e-5)
1208
+ assert res.success
1209
+ assert_(np.all(A @ res.x >= b))
1210
+ assert_(np.all(np.array(c1(res.x)) >= 0))
1211
+ assert_(np.all(res.x >= np.array(bounds)[:, 0]))
1212
+ assert_(np.all(res.x <= np.array(bounds)[:, 1]))
1213
+
1214
+ @pytest.mark.fail_slow(10)
1215
+ def test_L4(self):
1216
+ # Lampinen ([5]) test problem 4
1217
+ def f(x):
1218
+ return np.sum(x[:3])
1219
+
1220
+ A = np.zeros((4, 9))
1221
+ A[1, [4, 6]] = 0.0025, 0.0025
1222
+ A[2, [5, 7, 4]] = 0.0025, 0.0025, -0.0025
1223
+ A[3, [8, 5]] = 0.01, -0.01
1224
+ A = A[1:, 1:]
1225
+ b = np.array([1, 1, 1])
1226
+
1227
+ def c1(x):
1228
+ x = np.hstack(([0], x)) # 1-indexed to match reference
1229
+ return [x[1]*x[6] - 833.33252*x[4] - 100*x[1] + 83333.333,
1230
+ x[2]*x[7] - 1250*x[5] - x[2]*x[4] + 1250*x[4],
1231
+ x[3]*x[8] - 1250000 - x[3]*x[5] + 2500*x[5]]
1232
+
1233
+ L = LinearConstraint(A, -np.inf, 1)
1234
+ N = NonlinearConstraint(c1, 0, np.inf)
1235
+
1236
+ bounds = [(100, 10000)] + [(1000, 10000)]*2 + [(10, 1000)]*5
1237
+ constraints = (L, N)
1238
+
1239
+ with suppress_warnings() as sup:
1240
+ sup.filter(UserWarning)
1241
+ res = differential_evolution(
1242
+ f, bounds, strategy='best1bin', rng=1234,
1243
+ constraints=constraints, popsize=3, tol=0.05
1244
+ )
1245
+
1246
+ f_opt = 7049.248
1247
+
1248
+ x_opt = [579.306692, 1359.97063, 5109.9707, 182.0177, 295.601172,
1249
+ 217.9823, 286.416528, 395.601172]
1250
+
1251
+ assert_allclose(f(x_opt), f_opt, atol=0.001)
1252
+ assert_allclose(res.fun, f_opt, atol=0.001)
1253
+
1254
+ # use higher tol here for 32-bit Windows, see gh-11693
1255
+ if (platform.system() == 'Windows' and np.dtype(np.intp).itemsize < 8):
1256
+ assert_allclose(res.x, x_opt, rtol=2.4e-6, atol=0.0035)
1257
+ else:
1258
+ # tolerance determined from macOS + MKL failure, see gh-12701
1259
+ assert_allclose(res.x, x_opt, rtol=5e-6, atol=0.0024)
1260
+
1261
+ assert res.success
1262
+ assert_(np.all(A @ res.x <= b))
1263
+ assert_(np.all(np.array(c1(res.x)) >= 0))
1264
+ assert_(np.all(res.x >= np.array(bounds)[:, 0]))
1265
+ assert_(np.all(res.x <= np.array(bounds)[:, 1]))
1266
+
1267
+ @pytest.mark.fail_slow(10)
1268
+ def test_L5(self):
1269
+ # Lampinen ([5]) test problem 5
1270
+
1271
+ def f(x):
1272
+ x = np.hstack(([0], x)) # 1-indexed to match reference
1273
+ fun = (np.sin(2*np.pi*x[1])**3*np.sin(2*np.pi*x[2]) /
1274
+ (x[1]**3*(x[1]+x[2])))
1275
+ return -fun # maximize
1276
+
1277
+ def c1(x):
1278
+ x = np.hstack(([0], x)) # 1-indexed to match reference
1279
+ return [x[1]**2 - x[2] + 1,
1280
+ 1 - x[1] + (x[2]-4)**2]
1281
+
1282
+ N = NonlinearConstraint(c1, -np.inf, 0)
1283
+ bounds = [(0, 10)]*2
1284
+ constraints = (N)
1285
+
1286
+ res = differential_evolution(f, bounds, strategy='rand1bin', rng=1234,
1287
+ constraints=constraints)
1288
+
1289
+ x_opt = (1.22797135, 4.24537337)
1290
+ f_opt = -0.095825
1291
+ assert_allclose(f(x_opt), f_opt, atol=2e-5)
1292
+ assert_allclose(res.fun, f_opt, atol=1e-4)
1293
+ assert res.success
1294
+ assert_(np.all(np.array(c1(res.x)) <= 0))
1295
+ assert_(np.all(res.x >= np.array(bounds)[:, 0]))
1296
+ assert_(np.all(res.x <= np.array(bounds)[:, 1]))
1297
+
1298
+ @pytest.mark.fail_slow(10)
1299
+ def test_L6(self):
1300
+ # Lampinen ([5]) test problem 6
1301
+ def f(x):
1302
+ x = np.hstack(([0], x)) # 1-indexed to match reference
1303
+ fun = (x[1]-10)**3 + (x[2] - 20)**3
1304
+ return fun
1305
+
1306
+ def c1(x):
1307
+ x = np.hstack(([0], x)) # 1-indexed to match reference
1308
+ return [(x[1]-5)**2 + (x[2] - 5)**2 - 100,
1309
+ -(x[1]-6)**2 - (x[2] - 5)**2 + 82.81]
1310
+
1311
+ N = NonlinearConstraint(c1, 0, np.inf)
1312
+ bounds = [(13, 100), (0, 100)]
1313
+ constraints = (N)
1314
+ res = differential_evolution(f, bounds, strategy='rand1bin', rng=1234,
1315
+ constraints=constraints, tol=1e-7)
1316
+ x_opt = (14.095, 0.84296)
1317
+ f_opt = -6961.814744
1318
+
1319
+ assert_allclose(f(x_opt), f_opt, atol=1e-6)
1320
+ assert_allclose(res.fun, f_opt, atol=0.001)
1321
+ assert_allclose(res.x, x_opt, atol=1e-4)
1322
+ assert res.success
1323
+ assert_(np.all(np.array(c1(res.x)) >= 0))
1324
+ assert_(np.all(res.x >= np.array(bounds)[:, 0]))
1325
+ assert_(np.all(res.x <= np.array(bounds)[:, 1]))
1326
+
1327
+ def test_L7(self):
1328
+ # Lampinen ([5]) test problem 7
1329
+ def f(x):
1330
+ x = np.hstack(([0], x)) # 1-indexed to match reference
1331
+ fun = (5.3578547*x[3]**2 + 0.8356891*x[1]*x[5] +
1332
+ 37.293239*x[1] - 40792.141)
1333
+ return fun
1334
+
1335
+ def c1(x):
1336
+ x = np.hstack(([0], x)) # 1-indexed to match reference
1337
+ return [
1338
+ 85.334407 + 0.0056858*x[2]*x[5] + 0.0006262*x[1]*x[4] -
1339
+ 0.0022053*x[3]*x[5],
1340
+
1341
+ 80.51249 + 0.0071317*x[2]*x[5] + 0.0029955*x[1]*x[2] +
1342
+ 0.0021813*x[3]**2,
1343
+
1344
+ 9.300961 + 0.0047026*x[3]*x[5] + 0.0012547*x[1]*x[3] +
1345
+ 0.0019085*x[3]*x[4]
1346
+ ]
1347
+
1348
+ N = NonlinearConstraint(c1, [0, 90, 20], [92, 110, 25])
1349
+
1350
+ bounds = [(78, 102), (33, 45)] + [(27, 45)]*3
1351
+ constraints = (N)
1352
+
1353
+ res = differential_evolution(f, bounds, strategy='rand1bin', rng=1234,
1354
+ constraints=constraints)
1355
+
1356
+ # using our best solution, rather than Lampinen/Koziel. Koziel solution
1357
+ # doesn't satisfy constraints, Lampinen f_opt just plain wrong.
1358
+ x_opt = [78.00000686, 33.00000362, 29.99526064, 44.99999971,
1359
+ 36.77579979]
1360
+
1361
+ f_opt = -30665.537578
1362
+
1363
+ assert_allclose(f(x_opt), f_opt)
1364
+ assert_allclose(res.x, x_opt, atol=1e-3)
1365
+ assert_allclose(res.fun, f_opt, atol=1e-3)
1366
+
1367
+ assert res.success
1368
+ assert_(np.all(np.array(c1(res.x)) >= np.array([0, 90, 20])))
1369
+ assert_(np.all(np.array(c1(res.x)) <= np.array([92, 110, 25])))
1370
+ assert_(np.all(res.x >= np.array(bounds)[:, 0]))
1371
+ assert_(np.all(res.x <= np.array(bounds)[:, 1]))
1372
+
1373
+ @pytest.mark.xslow
1374
+ @pytest.mark.xfail(platform.machine() == 'ppc64le',
1375
+ reason="fails on ppc64le")
1376
+ def test_L8(self):
1377
+ def f(x):
1378
+ x = np.hstack(([0], x)) # 1-indexed to match reference
1379
+ fun = 3*x[1] + 0.000001*x[1]**3 + 2*x[2] + 0.000002/3*x[2]**3
1380
+ return fun
1381
+
1382
+ A = np.zeros((3, 5))
1383
+ A[1, [4, 3]] = 1, -1
1384
+ A[2, [3, 4]] = 1, -1
1385
+ A = A[1:, 1:]
1386
+ b = np.array([-.55, -.55])
1387
+
1388
+ def c1(x):
1389
+ x = np.hstack(([0], x)) # 1-indexed to match reference
1390
+ return [
1391
+ 1000*np.sin(-x[3]-0.25) + 1000*np.sin(-x[4]-0.25) +
1392
+ 894.8 - x[1],
1393
+ 1000*np.sin(x[3]-0.25) + 1000*np.sin(x[3]-x[4]-0.25) +
1394
+ 894.8 - x[2],
1395
+ 1000*np.sin(x[4]-0.25) + 1000*np.sin(x[4]-x[3]-0.25) +
1396
+ 1294.8
1397
+ ]
1398
+ L = LinearConstraint(A, b, np.inf)
1399
+ N = NonlinearConstraint(c1, np.full(3, -0.001), np.full(3, 0.001))
1400
+
1401
+ bounds = [(0, 1200)]*2+[(-.55, .55)]*2
1402
+ constraints = (L, N)
1403
+
1404
+ with suppress_warnings() as sup:
1405
+ sup.filter(UserWarning)
1406
+ # original Lampinen test was with rand1bin, but that takes a
1407
+ # huge amount of CPU time. Changing strategy to best1bin speeds
1408
+ # things up a lot
1409
+ res = differential_evolution(f, bounds, strategy='best1bin',
1410
+ rng=1234, constraints=constraints,
1411
+ maxiter=5000)
1412
+
1413
+ x_opt = (679.9453, 1026.067, 0.1188764, -0.3962336)
1414
+ f_opt = 5126.4981
1415
+
1416
+ assert_allclose(f(x_opt), f_opt, atol=1e-3)
1417
+ assert_allclose(res.x[:2], x_opt[:2], atol=2e-3)
1418
+ assert_allclose(res.x[2:], x_opt[2:], atol=2e-3)
1419
+ assert_allclose(res.fun, f_opt, atol=2e-2)
1420
+ assert res.success
1421
+ assert_(np.all(A@res.x >= b))
1422
+ assert_(np.all(np.array(c1(res.x)) >= -0.001))
1423
+ assert_(np.all(np.array(c1(res.x)) <= 0.001))
1424
+ assert_(np.all(res.x >= np.array(bounds)[:, 0]))
1425
+ assert_(np.all(res.x <= np.array(bounds)[:, 1]))
1426
+
1427
+ @pytest.mark.fail_slow(5)
1428
+ def test_L9(self):
1429
+ # Lampinen ([5]) test problem 9
1430
+
1431
+ def f(x):
1432
+ x = np.hstack(([0], x)) # 1-indexed to match reference
1433
+ return x[1]**2 + (x[2]-1)**2
1434
+
1435
+ def c1(x):
1436
+ x = np.hstack(([0], x)) # 1-indexed to match reference
1437
+ return [x[2] - x[1]**2]
1438
+
1439
+ N = NonlinearConstraint(c1, [-.001], [0.001])
1440
+
1441
+ bounds = [(-1, 1)]*2
1442
+ constraints = (N)
1443
+ res = differential_evolution(f, bounds, strategy='rand1bin', rng=1234,
1444
+ constraints=constraints)
1445
+
1446
+ x_opt = [np.sqrt(2)/2, 0.5]
1447
+ f_opt = 0.75
1448
+
1449
+ assert_allclose(f(x_opt), f_opt)
1450
+ assert_allclose(np.abs(res.x), x_opt, atol=1e-3)
1451
+ assert_allclose(res.fun, f_opt, atol=1e-3)
1452
+ assert res.success
1453
+ assert_(np.all(np.array(c1(res.x)) >= -0.001))
1454
+ assert_(np.all(np.array(c1(res.x)) <= 0.001))
1455
+ assert_(np.all(res.x >= np.array(bounds)[:, 0]))
1456
+ assert_(np.all(res.x <= np.array(bounds)[:, 1]))
1457
+
1458
+ @pytest.mark.fail_slow(10)
1459
+ def test_integrality(self):
1460
+ # test fitting discrete distribution to data
1461
+ rng = np.random.default_rng(6519843218105)
1462
+ dist = stats.nbinom
1463
+ shapes = (5, 0.5)
1464
+ x = dist.rvs(*shapes, size=10000, random_state=rng)
1465
+
1466
+ def func(p, *args):
1467
+ dist, x = args
1468
+ # negative log-likelihood function
1469
+ ll = -np.log(dist.pmf(x, *p)).sum(axis=-1)
1470
+ if np.isnan(ll): # occurs when x is outside of support
1471
+ ll = np.inf # we don't want that
1472
+ return ll
1473
+
1474
+ integrality = [True, False]
1475
+ bounds = [(1, 18), (0, 0.95)]
1476
+
1477
+ res = differential_evolution(func, bounds, args=(dist, x),
1478
+ integrality=integrality, polish=False,
1479
+ rng=rng)
1480
+ # tolerance has to be fairly relaxed for the second parameter
1481
+ # because we're fitting a distribution to random variates.
1482
+ assert res.x[0] == 5
1483
+ assert_allclose(res.x, shapes, rtol=0.025)
1484
+
1485
+ # check that we can still use integrality constraints with polishing
1486
+ res2 = differential_evolution(func, bounds, args=(dist, x),
1487
+ integrality=integrality, polish=True,
1488
+ rng=rng)
1489
+
1490
+ def func2(p, *args):
1491
+ n, dist, x = args
1492
+ return func(np.array([n, p[0]]), dist, x)
1493
+
1494
+ # compare the DE derived solution to an LBFGSB solution (that doesn't
1495
+ # have to find the integral values). Note we're setting x0 to be the
1496
+ # output from the first DE result, thereby making the polishing step
1497
+ # and this minimisation pretty much equivalent.
1498
+ LBFGSB = minimize(func2, res2.x[1], args=(5, dist, x),
1499
+ bounds=[(0, 0.95)])
1500
+ assert_allclose(res2.x[1], LBFGSB.x)
1501
+ assert res2.fun <= res.fun
1502
+
1503
+ def test_integrality_limits(self):
1504
+ def f(x):
1505
+ return x
1506
+
1507
+ integrality = [True, False, True]
1508
+ bounds = [(0.2, 1.1), (0.9, 2.2), (3.3, 4.9)]
1509
+
1510
+ # no integrality constraints
1511
+ solver = DifferentialEvolutionSolver(f, bounds=bounds, polish=False,
1512
+ integrality=False)
1513
+ assert_allclose(solver.limits[0], [0.2, 0.9, 3.3])
1514
+ assert_allclose(solver.limits[1], [1.1, 2.2, 4.9])
1515
+
1516
+ # with integrality constraints
1517
+ solver = DifferentialEvolutionSolver(f, bounds=bounds, polish=False,
1518
+ integrality=integrality)
1519
+ assert_allclose(solver.limits[0], [0.5, 0.9, 3.5])
1520
+ assert_allclose(solver.limits[1], [1.5, 2.2, 4.5])
1521
+ assert_equal(solver.integrality, [True, False, True])
1522
+ assert solver.polish is False
1523
+
1524
+ bounds = [(-1.2, -0.9), (0.9, 2.2), (-10.3, 4.1)]
1525
+ solver = DifferentialEvolutionSolver(f, bounds=bounds, polish=False,
1526
+ integrality=integrality)
1527
+ assert_allclose(solver.limits[0], [-1.5, 0.9, -10.5])
1528
+ assert_allclose(solver.limits[1], [-0.5, 2.2, 4.5])
1529
+
1530
+ # A lower bound of -1.2 is converted to
1531
+ # np.nextafter(np.ceil(-1.2) - 0.5, np.inf)
1532
+ # with a similar process to the upper bound. Check that the
1533
+ # conversions work
1534
+ assert_allclose(np.round(solver.limits[0]), [-1.0, 1.0, -10.0])
1535
+ assert_allclose(np.round(solver.limits[1]), [-1.0, 2.0, 4.0])
1536
+
1537
+ bounds = [(-10.2, -8.1), (0.9, 2.2), (-10.9, -9.9999)]
1538
+ solver = DifferentialEvolutionSolver(f, bounds=bounds, polish=False,
1539
+ integrality=integrality)
1540
+ assert_allclose(solver.limits[0], [-10.5, 0.9, -10.5])
1541
+ assert_allclose(solver.limits[1], [-8.5, 2.2, -9.5])
1542
+
1543
+ bounds = [(-10.2, -10.1), (0.9, 2.2), (-10.9, -9.9999)]
1544
+ with pytest.raises(ValueError, match='One of the integrality'):
1545
+ DifferentialEvolutionSolver(f, bounds=bounds, polish=False,
1546
+ integrality=integrality)
1547
+
1548
+ @pytest.mark.thread_unsafe
1549
+ @pytest.mark.fail_slow(10)
1550
+ def test_vectorized(self):
1551
+ def quadratic(x):
1552
+ return np.sum(x**2)
1553
+
1554
+ def quadratic_vec(x):
1555
+ return np.sum(x**2, axis=0)
1556
+
1557
+ # A vectorized function needs to accept (len(x), S) and return (S,)
1558
+ with pytest.raises(RuntimeError, match='The vectorized function'):
1559
+ differential_evolution(quadratic, self.bounds,
1560
+ vectorized=True, updating='deferred')
1561
+
1562
+ # vectorized overrides the updating keyword, check for warning
1563
+ with warns(UserWarning, match="differential_evolution: the 'vector"):
1564
+ differential_evolution(quadratic_vec, self.bounds,
1565
+ vectorized=True)
1566
+
1567
+ # vectorized defers to the workers keyword, check for warning
1568
+ with warns(UserWarning, match="differential_evolution: the 'workers"):
1569
+ differential_evolution(quadratic_vec, self.bounds,
1570
+ vectorized=True, workers=map,
1571
+ updating='deferred')
1572
+
1573
+ ncalls = [0]
1574
+
1575
+ def rosen_vec(x):
1576
+ ncalls[0] += 1
1577
+ return rosen(x)
1578
+
1579
+ bounds = [(0, 10), (0, 10)]
1580
+ res1 = differential_evolution(rosen, bounds, updating='deferred',
1581
+ rng=1)
1582
+ res2 = differential_evolution(rosen_vec, bounds, vectorized=True,
1583
+ updating='deferred', rng=1)
1584
+
1585
+ # the two minimisation runs should be functionally equivalent
1586
+ assert_allclose(res1.x, res2.x)
1587
+ assert ncalls[0] == res2.nfev
1588
+ assert res1.nit == res2.nit
1589
+
1590
+ def test_vectorized_constraints(self):
1591
+ def constr_f(x):
1592
+ return np.array([x[0] + x[1]])
1593
+
1594
+ def constr_f2(x):
1595
+ return np.array([x[0]**2 + x[1], x[0] - x[1]])
1596
+
1597
+ nlc1 = NonlinearConstraint(constr_f, -np.inf, 1.9)
1598
+ nlc2 = NonlinearConstraint(constr_f2, (0.9, 0.5), (2.0, 2.0))
1599
+
1600
+ def rosen_vec(x):
1601
+ # accept an (len(x0), S) array, returning a (S,) array
1602
+ v = 100 * (x[1:] - x[:-1]**2.0)**2.0
1603
+ v += (1 - x[:-1])**2.0
1604
+ return np.squeeze(v)
1605
+
1606
+ bounds = [(0, 10), (0, 10)]
1607
+
1608
+ res1 = differential_evolution(rosen, bounds, updating='deferred',
1609
+ rng=1, constraints=[nlc1, nlc2],
1610
+ polish=False)
1611
+ res2 = differential_evolution(rosen_vec, bounds, vectorized=True,
1612
+ updating='deferred', rng=1,
1613
+ constraints=[nlc1, nlc2],
1614
+ polish=False)
1615
+ # the two minimisation runs should be functionally equivalent
1616
+ assert_allclose(res1.x, res2.x)
1617
+
1618
+ def test_constraint_violation_error_message(self):
1619
+
1620
+ def func(x):
1621
+ return np.cos(x[0]) + np.sin(x[1])
1622
+
1623
+ # Intentionally infeasible constraints.
1624
+ c0 = NonlinearConstraint(lambda x: x[1] - (x[0]-1)**2, 0, np.inf)
1625
+ c1 = NonlinearConstraint(lambda x: x[1] + x[0]**2, -np.inf, 0)
1626
+
1627
+ result = differential_evolution(func,
1628
+ bounds=[(-1, 2), (-1, 1)],
1629
+ constraints=[c0, c1],
1630
+ maxiter=10,
1631
+ polish=False,
1632
+ rng=864197532)
1633
+ assert result.success is False
1634
+ # The numerical value in the error message might be sensitive to
1635
+ # changes in the implementation. It can be updated if the code is
1636
+ # changed. The essential part of the test is that there is a number
1637
+ # after the '=', so if necessary, the text could be reduced to, say,
1638
+ # "MAXCV = 0.".
1639
+ assert "MAXCV = 0." in result.message
1640
+
1641
+ @pytest.mark.fail_slow(20) # fail-slow exception by request - see gh-20806
1642
+ def test_strategy_fn(self):
1643
+ # examines ability to customize strategy by mimicking one of the
1644
+ # in-built strategies
1645
+ parameter_count = 4
1646
+ popsize = 10
1647
+ bounds = [(0, 10.)] * parameter_count
1648
+ total_popsize = parameter_count * popsize
1649
+ mutation = 0.8
1650
+ recombination = 0.7
1651
+
1652
+ calls = [0]
1653
+ def custom_strategy_fn(candidate, population, rng=None):
1654
+ calls[0] += 1
1655
+ trial = np.copy(population[candidate])
1656
+ fill_point = rng.choice(parameter_count)
1657
+
1658
+ pool = np.arange(total_popsize)
1659
+ rng.shuffle(pool)
1660
+ idxs = pool[:2 + 1]
1661
+ idxs = idxs[idxs != candidate][:2]
1662
+
1663
+ r0, r1 = idxs[:2]
1664
+
1665
+ bprime = (population[0] + mutation *
1666
+ (population[r0] - population[r1]))
1667
+
1668
+ crossovers = rng.uniform(size=parameter_count)
1669
+ crossovers = crossovers < recombination
1670
+ crossovers[fill_point] = True
1671
+ trial = np.where(crossovers, bprime, trial)
1672
+ return trial
1673
+
1674
+ solver = DifferentialEvolutionSolver(
1675
+ rosen,
1676
+ bounds,
1677
+ popsize=popsize,
1678
+ recombination=recombination,
1679
+ mutation=mutation,
1680
+ maxiter=2,
1681
+ strategy=custom_strategy_fn,
1682
+ rng=10,
1683
+ polish=False
1684
+ )
1685
+ assert solver.strategy is custom_strategy_fn
1686
+ solver.solve()
1687
+ assert calls[0] > 0
1688
+
1689
+ # check custom strategy works with updating='deferred'
1690
+ res = differential_evolution(
1691
+ rosen, bounds, strategy=custom_strategy_fn, updating='deferred'
1692
+ )
1693
+ assert res.success
1694
+
1695
+ def custom_strategy_fn(candidate, population, rng=None):
1696
+ return np.array([1.0, 2.0])
1697
+
1698
+ with pytest.raises(RuntimeError, match="strategy*"):
1699
+ differential_evolution(
1700
+ rosen,
1701
+ bounds,
1702
+ strategy=custom_strategy_fn
1703
+ )