scipy 1.16.2__cp312-cp312-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.cp312-win_arm64.lib +0 -0
  4. scipy/_cyutility.cp312-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.cp312-win_arm64.lib +0 -0
  13. scipy/_lib/_ccallback_c.cp312-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.cp312-win_arm64.lib +0 -0
  18. scipy/_lib/_fpumode.cp312-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.cp312-win_arm64.lib +0 -0
  23. scipy/_lib/_test_ccallback.cp312-win_arm64.pyd +0 -0
  24. scipy/_lib/_test_deprecation_call.cp312-win_arm64.lib +0 -0
  25. scipy/_lib/_test_deprecation_call.cp312-win_arm64.pyd +0 -0
  26. scipy/_lib/_test_deprecation_def.cp312-win_arm64.lib +0 -0
  27. scipy/_lib/_test_deprecation_def.cp312-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.cp312-win_arm64.lib +0 -0
  35. scipy/_lib/_uarray/_uarray.cp312-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.cp312-win_arm64.lib +0 -0
  101. scipy/_lib/messagestream.cp312-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.cp312-win_arm64.lib +0 -0
  148. scipy/cluster/_hierarchy.cp312-win_arm64.pyd +0 -0
  149. scipy/cluster/_optimal_leaf_ordering.cp312-win_arm64.lib +0 -0
  150. scipy/cluster/_optimal_leaf_ordering.cp312-win_arm64.pyd +0 -0
  151. scipy/cluster/_vq.cp312-win_arm64.lib +0 -0
  152. scipy/cluster/_vq.cp312-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.cp312-win_arm64.lib +0 -0
  193. scipy/fft/_pocketfft/pypocketfft.cp312-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.cp312-win_arm64.lib +0 -0
  215. scipy/fftpack/convolve.cp312-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.cp312-win_arm64.lib +0 -0
  233. scipy/integrate/_dop.cp312-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.cp312-win_arm64.lib +0 -0
  248. scipy/integrate/_lsoda.cp312-win_arm64.pyd +0 -0
  249. scipy/integrate/_ode.py +1395 -0
  250. scipy/integrate/_odepack.cp312-win_arm64.lib +0 -0
  251. scipy/integrate/_odepack.cp312-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.cp312-win_arm64.lib +0 -0
  255. scipy/integrate/_quadpack.cp312-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.cp312-win_arm64.lib +0 -0
  265. scipy/integrate/_test_multivariate.cp312-win_arm64.pyd +0 -0
  266. scipy/integrate/_test_odeint_banded.cp312-win_arm64.lib +0 -0
  267. scipy/integrate/_test_odeint_banded.cp312-win_arm64.pyd +0 -0
  268. scipy/integrate/_vode.cp312-win_arm64.lib +0 -0
  269. scipy/integrate/_vode.cp312-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.cp312-win_arm64.lib +0 -0
  290. scipy/interpolate/_dfitpack.cp312-win_arm64.pyd +0 -0
  291. scipy/interpolate/_dierckx.cp312-win_arm64.lib +0 -0
  292. scipy/interpolate/_dierckx.cp312-win_arm64.pyd +0 -0
  293. scipy/interpolate/_fitpack.cp312-win_arm64.lib +0 -0
  294. scipy/interpolate/_fitpack.cp312-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.cp312-win_arm64.lib +0 -0
  300. scipy/interpolate/_interpnd.cp312-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.cp312-win_arm64.lib +0 -0
  307. scipy/interpolate/_ppoly.cp312-win_arm64.pyd +0 -0
  308. scipy/interpolate/_rbf.py +290 -0
  309. scipy/interpolate/_rbfinterp.py +550 -0
  310. scipy/interpolate/_rbfinterp_pythran.cp312-win_arm64.lib +0 -0
  311. scipy/interpolate/_rbfinterp_pythran.cp312-win_arm64.pyd +0 -0
  312. scipy/interpolate/_rgi.py +764 -0
  313. scipy/interpolate/_rgi_cython.cp312-win_arm64.lib +0 -0
  314. scipy/interpolate/_rgi_cython.cp312-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.cp312-win_arm64.lib +0 -0
  343. scipy/io/_fast_matrix_market/_fmm_core.cp312-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.cp312-win_arm64.lib +0 -0
  355. scipy/io/_test_fortran.cp312-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.cp312-win_arm64.lib +0 -0
  386. scipy/io/matlab/_mio5_utils.cp312-win_arm64.pyd +0 -0
  387. scipy/io/matlab/_mio_utils.cp312-win_arm64.lib +0 -0
  388. scipy/io/matlab/_mio_utils.cp312-win_arm64.pyd +0 -0
  389. scipy/io/matlab/_miobase.py +435 -0
  390. scipy/io/matlab/_streams.cp312-win_arm64.lib +0 -0
  391. scipy/io/matlab/_streams.cp312-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.cp312-win_arm64.lib +0 -0
  623. scipy/linalg/_cythonized_array_utils.cp312-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.cp312-win_arm64.lib +0 -0
  630. scipy/linalg/_decomp_interpolative.cp312-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.cp312-win_arm64.lib +0 -0
  634. scipy/linalg/_decomp_lu_cython.cp312-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.cp312-win_arm64.lib +0 -0
  642. scipy/linalg/_decomp_update.cp312-win_arm64.pyd +0 -0
  643. scipy/linalg/_expm_frechet.py +417 -0
  644. scipy/linalg/_fblas.cp312-win_arm64.lib +0 -0
  645. scipy/linalg/_fblas.cp312-win_arm64.pyd +0 -0
  646. scipy/linalg/_flapack.cp312-win_arm64.lib +0 -0
  647. scipy/linalg/_flapack.cp312-win_arm64.pyd +0 -0
  648. scipy/linalg/_lapack_subroutines.h +1521 -0
  649. scipy/linalg/_linalg_pythran.cp312-win_arm64.lib +0 -0
  650. scipy/linalg/_linalg_pythran.cp312-win_arm64.pyd +0 -0
  651. scipy/linalg/_matfuncs.py +1050 -0
  652. scipy/linalg/_matfuncs_expm.cp312-win_arm64.lib +0 -0
  653. scipy/linalg/_matfuncs_expm.cp312-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.cp312-win_arm64.lib +0 -0
  657. scipy/linalg/_matfuncs_schur_sqrtm.cp312-win_arm64.pyd +0 -0
  658. scipy/linalg/_matfuncs_sqrtm.py +107 -0
  659. scipy/linalg/_matfuncs_sqrtm_triu.cp312-win_arm64.lib +0 -0
  660. scipy/linalg/_matfuncs_sqrtm_triu.cp312-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.cp312-win_arm64.lib +0 -0
  665. scipy/linalg/_solve_toeplitz.cp312-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.cp312-win_arm64.lib +0 -0
  672. scipy/linalg/cython_blas.cp312-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.cp312-win_arm64.lib +0 -0
  676. scipy/linalg/cython_lapack.cp312-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.cp312-win_arm64.lib +0 -0
  728. scipy/ndimage/_ctest.cp312-win_arm64.pyd +0 -0
  729. scipy/ndimage/_cytest.cp312-win_arm64.lib +0 -0
  730. scipy/ndimage/_cytest.cp312-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.cp312-win_arm64.lib +0 -0
  738. scipy/ndimage/_nd_image.cp312-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.cp312-win_arm64.lib +0 -0
  742. scipy/ndimage/_ni_label.cp312-win_arm64.pyd +0 -0
  743. scipy/ndimage/_ni_support.py +139 -0
  744. scipy/ndimage/_rank_filter_1d.cp312-win_arm64.lib +0 -0
  745. scipy/ndimage/_rank_filter_1d.cp312-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.cp312-win_arm64.lib +0 -0
  768. scipy/odr/__odrpack.cp312-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.cp312-win_arm64.lib +0 -0
  780. scipy/optimize/_bglu_dense.cp312-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.cp312-win_arm64.lib +0 -0
  790. scipy/optimize/_direct.cp312-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.cp312-win_arm64.lib +0 -0
  795. scipy/optimize/_group_columns.cp312-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.cp312-win_arm64.lib +0 -0
  799. scipy/optimize/_highspy/_core.cp312-win_arm64.pyd +0 -0
  800. scipy/optimize/_highspy/_highs_options.cp312-win_arm64.lib +0 -0
  801. scipy/optimize/_highspy/_highs_options.cp312-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.cp312-win_arm64.lib +0 -0
  805. scipy/optimize/_lbfgsb.cp312-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.cp312-win_arm64.lib +0 -0
  816. scipy/optimize/_lsap.cp312-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.cp312-win_arm64.lib +0 -0
  822. scipy/optimize/_lsq/givens_elimination.cp312-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.cp312-win_arm64.lib +0 -0
  830. scipy/optimize/_minpack.cp312-win_arm64.pyd +0 -0
  831. scipy/optimize/_minpack_py.py +1178 -0
  832. scipy/optimize/_moduleTNC.cp312-win_arm64.lib +0 -0
  833. scipy/optimize/_moduleTNC.cp312-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.cp312-win_arm64.lib +0 -0
  839. scipy/optimize/_pava_pybind.cp312-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.cp312-win_arm64.lib +0 -0
  850. scipy/optimize/_slsqplib.cp312-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.cp312-win_arm64.lib +0 -0
  855. scipy/optimize/_trlib/_trlib.cp312-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.cp312-win_arm64.lib +0 -0
  877. scipy/optimize/_zeros.cp312-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.cp312-win_arm64.lib +0 -0
  882. scipy/optimize/cython_optimize/_zeros.cp312-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.cp312-win_arm64.lib +0 -0
  953. scipy/signal/_max_len_seq_inner.cp312-win_arm64.pyd +0 -0
  954. scipy/signal/_peak_finding.py +1310 -0
  955. scipy/signal/_peak_finding_utils.cp312-win_arm64.lib +0 -0
  956. scipy/signal/_peak_finding_utils.cp312-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.cp312-win_arm64.lib +0 -0
  963. scipy/signal/_sigtools.cp312-win_arm64.pyd +0 -0
  964. scipy/signal/_sosfilt.cp312-win_arm64.lib +0 -0
  965. scipy/signal/_sosfilt.cp312-win_arm64.pyd +0 -0
  966. scipy/signal/_spectral_py.py +2471 -0
  967. scipy/signal/_spline.cp312-win_arm64.lib +0 -0
  968. scipy/signal/_spline.cp312-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.cp312-win_arm64.lib +0 -0
  974. scipy/signal/_upfirdn_apply.cp312-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.cp312-win_arm64.lib +0 -0
  1021. scipy/sparse/_csparsetools.cp312-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.cp312-win_arm64.lib +0 -0
  1032. scipy/sparse/_sparsetools.cp312-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.cp312-win_arm64.lib +0 -0
  1043. scipy/sparse/csgraph/_flow.cp312-win_arm64.pyd +0 -0
  1044. scipy/sparse/csgraph/_laplacian.py +563 -0
  1045. scipy/sparse/csgraph/_matching.cp312-win_arm64.lib +0 -0
  1046. scipy/sparse/csgraph/_matching.cp312-win_arm64.pyd +0 -0
  1047. scipy/sparse/csgraph/_min_spanning_tree.cp312-win_arm64.lib +0 -0
  1048. scipy/sparse/csgraph/_min_spanning_tree.cp312-win_arm64.pyd +0 -0
  1049. scipy/sparse/csgraph/_reordering.cp312-win_arm64.lib +0 -0
  1050. scipy/sparse/csgraph/_reordering.cp312-win_arm64.pyd +0 -0
  1051. scipy/sparse/csgraph/_shortest_path.cp312-win_arm64.lib +0 -0
  1052. scipy/sparse/csgraph/_shortest_path.cp312-win_arm64.pyd +0 -0
  1053. scipy/sparse/csgraph/_tools.cp312-win_arm64.lib +0 -0
  1054. scipy/sparse/csgraph/_tools.cp312-win_arm64.pyd +0 -0
  1055. scipy/sparse/csgraph/_traversal.cp312-win_arm64.lib +0 -0
  1056. scipy/sparse/csgraph/_traversal.cp312-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.cp312-win_arm64.lib +0 -0
  1079. scipy/sparse/linalg/_dsolve/_superlu.cp312-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.cp312-win_arm64.lib +0 -0
  1089. scipy/sparse/linalg/_eigen/arpack/_arpack.cp312-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.cp312-win_arm64.lib +0 -0
  1122. scipy/sparse/linalg/_propack/_cpropack.cp312-win_arm64.pyd +0 -0
  1123. scipy/sparse/linalg/_propack/_dpropack.cp312-win_arm64.lib +0 -0
  1124. scipy/sparse/linalg/_propack/_dpropack.cp312-win_arm64.pyd +0 -0
  1125. scipy/sparse/linalg/_propack/_spropack.cp312-win_arm64.lib +0 -0
  1126. scipy/sparse/linalg/_propack/_spropack.cp312-win_arm64.pyd +0 -0
  1127. scipy/sparse/linalg/_propack/_zpropack.cp312-win_arm64.lib +0 -0
  1128. scipy/sparse/linalg/_propack/_zpropack.cp312-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.cp312-win_arm64.lib +0 -0
  1170. scipy/spatial/_ckdtree.cp312-win_arm64.pyd +0 -0
  1171. scipy/spatial/_distance_pybind.cp312-win_arm64.lib +0 -0
  1172. scipy/spatial/_distance_pybind.cp312-win_arm64.pyd +0 -0
  1173. scipy/spatial/_distance_wrap.cp312-win_arm64.lib +0 -0
  1174. scipy/spatial/_distance_wrap.cp312-win_arm64.pyd +0 -0
  1175. scipy/spatial/_geometric_slerp.py +238 -0
  1176. scipy/spatial/_hausdorff.cp312-win_arm64.lib +0 -0
  1177. scipy/spatial/_hausdorff.cp312-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.cp312-win_arm64.lib +0 -0
  1182. scipy/spatial/_qhull.cp312-win_arm64.pyd +0 -0
  1183. scipy/spatial/_qhull.pyi +213 -0
  1184. scipy/spatial/_spherical_voronoi.py +341 -0
  1185. scipy/spatial/_voronoi.cp312-win_arm64.lib +0 -0
  1186. scipy/spatial/_voronoi.cp312-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.cp312-win_arm64.lib +0 -0
  1236. scipy/spatial/transform/_rigid_transform.cp312-win_arm64.pyd +0 -0
  1237. scipy/spatial/transform/_rotation.cp312-win_arm64.lib +0 -0
  1238. scipy/spatial/transform/_rotation.cp312-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.cp312-win_arm64.lib +0 -0
  1252. scipy/special/_comb.cp312-win_arm64.pyd +0 -0
  1253. scipy/special/_ellip_harm.py +214 -0
  1254. scipy/special/_ellip_harm_2.cp312-win_arm64.lib +0 -0
  1255. scipy/special/_ellip_harm_2.cp312-win_arm64.pyd +0 -0
  1256. scipy/special/_gufuncs.cp312-win_arm64.lib +0 -0
  1257. scipy/special/_gufuncs.cp312-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.cp312-win_arm64.lib +0 -0
  1281. scipy/special/_specfun.cp312-win_arm64.pyd +0 -0
  1282. scipy/special/_special_ufuncs.cp312-win_arm64.lib +0 -0
  1283. scipy/special/_special_ufuncs.cp312-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.cp312-win_arm64.lib +0 -0
  1288. scipy/special/_test_internal.cp312-win_arm64.pyd +0 -0
  1289. scipy/special/_test_internal.pyi +9 -0
  1290. scipy/special/_testutils.py +321 -0
  1291. scipy/special/_ufuncs.cp312-win_arm64.lib +0 -0
  1292. scipy/special/_ufuncs.cp312-win_arm64.pyd +0 -0
  1293. scipy/special/_ufuncs.pyi +522 -0
  1294. scipy/special/_ufuncs.pyx +13173 -0
  1295. scipy/special/_ufuncs_cxx.cp312-win_arm64.lib +0 -0
  1296. scipy/special/_ufuncs_cxx.cp312-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.cp312-win_arm64.lib +0 -0
  1304. scipy/special/cython_special.cp312-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.cp312-win_arm64.lib +0 -0
  1376. scipy/stats/_ansari_swilk_statistics.cp312-win_arm64.pyd +0 -0
  1377. scipy/stats/_axis_nan_policy.py +692 -0
  1378. scipy/stats/_biasedurn.cp312-win_arm64.lib +0 -0
  1379. scipy/stats/_biasedurn.cp312-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.cp312-win_arm64.lib +0 -0
  1404. scipy/stats/_levy_stable/levyst.cp312-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.cp312-win_arm64.lib +0 -0
  1418. scipy/stats/_qmc_cy.cp312-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.cp312-win_arm64.lib +0 -0
  1422. scipy/stats/_qmvnt_cy.cp312-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.cp312-win_arm64.lib +0 -0
  1426. scipy/stats/_rcont/rcont.cp312-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.cp312-win_arm64.lib +0 -0
  1433. scipy/stats/_sobol.cp312-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.cp312-win_arm64.lib +0 -0
  1437. scipy/stats/_stats.cp312-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.cp312-win_arm64.lib +0 -0
  1442. scipy/stats/_stats_pythran.cp312-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.cp312-win_arm64.lib +0 -0
  1447. scipy/stats/_unuran/unuran_wrapper.cp312-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,1970 @@
1
+ """
2
+ differential_evolution: The differential evolution global optimization algorithm
3
+ Added by Andrew Nelson 2014
4
+ """
5
+ import warnings
6
+
7
+ import numpy as np
8
+
9
+ from scipy.optimize import OptimizeResult, minimize
10
+ from scipy.optimize._constraints import (Bounds, new_bounds_to_old,
11
+ NonlinearConstraint, LinearConstraint)
12
+ from scipy.optimize._optimize import _status_message, _wrap_callback
13
+ from scipy._lib._util import (check_random_state, MapWrapper, _FunctionWrapper,
14
+ rng_integers, _transition_to_rng)
15
+ from scipy._lib._sparse import issparse
16
+
17
+
18
+ __all__ = ['differential_evolution']
19
+
20
+
21
+ _MACHEPS = np.finfo(np.float64).eps
22
+
23
+
24
+ @_transition_to_rng("seed", position_num=9)
25
+ def differential_evolution(func, bounds, args=(), strategy='best1bin',
26
+ maxiter=1000, popsize=15, tol=0.01,
27
+ mutation=(0.5, 1), recombination=0.7, rng=None,
28
+ callback=None, disp=False, polish=True,
29
+ init='latinhypercube', atol=0, updating='immediate',
30
+ workers=1, constraints=(), x0=None, *,
31
+ integrality=None, vectorized=False):
32
+ r"""Finds the global minimum of a multivariate function.
33
+
34
+ The differential evolution method [1]_ is stochastic in nature. It does
35
+ not use gradient methods to find the minimum, and can search large areas
36
+ of candidate space, but often requires larger numbers of function
37
+ evaluations than conventional gradient-based techniques.
38
+
39
+ The algorithm is due to Storn and Price [2]_.
40
+
41
+ Parameters
42
+ ----------
43
+ func : callable
44
+ The objective function to be minimized. Must be in the form
45
+ ``f(x, *args)``, where ``x`` is the argument in the form of a 1-D array
46
+ and ``args`` is a tuple of any additional fixed parameters needed to
47
+ completely specify the function. The number of parameters, N, is equal
48
+ to ``len(x)``.
49
+ bounds : sequence or `Bounds`
50
+ Bounds for variables. There are two ways to specify the bounds:
51
+
52
+ 1. Instance of `Bounds` class.
53
+ 2. ``(min, max)`` pairs for each element in ``x``, defining the
54
+ finite lower and upper bounds for the optimizing argument of
55
+ `func`.
56
+
57
+ The total number of bounds is used to determine the number of
58
+ parameters, N. If there are parameters whose bounds are equal the total
59
+ number of free parameters is ``N - N_equal``.
60
+
61
+ args : tuple, optional
62
+ Any additional fixed parameters needed to
63
+ completely specify the objective function.
64
+ strategy : {str, callable}, optional
65
+ The differential evolution strategy to use. Should be one of:
66
+
67
+ - 'best1bin'
68
+ - 'best1exp'
69
+ - 'rand1bin'
70
+ - 'rand1exp'
71
+ - 'rand2bin'
72
+ - 'rand2exp'
73
+ - 'randtobest1bin'
74
+ - 'randtobest1exp'
75
+ - 'currenttobest1bin'
76
+ - 'currenttobest1exp'
77
+ - 'best2exp'
78
+ - 'best2bin'
79
+
80
+ The default is 'best1bin'. Strategies that may be implemented are
81
+ outlined in 'Notes'.
82
+ Alternatively the differential evolution strategy can be customized by
83
+ providing a callable that constructs a trial vector. The callable must
84
+ have the form ``strategy(candidate: int, population: np.ndarray, rng=None)``,
85
+ where ``candidate`` is an integer specifying which entry of the
86
+ population is being evolved, ``population`` is an array of shape
87
+ ``(S, N)`` containing all the population members (where S is the
88
+ total population size), and ``rng`` is the random number generator
89
+ being used within the solver.
90
+ ``candidate`` will be in the range ``[0, S)``.
91
+ ``strategy`` must return a trial vector with shape ``(N,)``. The
92
+ fitness of this trial vector is compared against the fitness of
93
+ ``population[candidate]``.
94
+
95
+ .. versionchanged:: 1.12.0
96
+ Customization of evolution strategy via a callable.
97
+
98
+ maxiter : int, optional
99
+ The maximum number of generations over which the entire population is
100
+ evolved. The maximum number of function evaluations (with no polishing)
101
+ is: ``(maxiter + 1) * popsize * (N - N_equal)``
102
+ popsize : int, optional
103
+ A multiplier for setting the total population size. The population has
104
+ ``popsize * (N - N_equal)`` individuals. This keyword is overridden if
105
+ an initial population is supplied via the `init` keyword. When using
106
+ ``init='sobol'`` the population size is calculated as the next power
107
+ of 2 after ``popsize * (N - N_equal)``.
108
+ tol : float, optional
109
+ Relative tolerance for convergence, the solving stops when
110
+ ``np.std(population_energies) <= atol + tol * np.abs(np.mean(population_energies))``,
111
+ where and `atol` and `tol` are the absolute and relative tolerance
112
+ respectively.
113
+ mutation : float or tuple(float, float), optional
114
+ The mutation constant. In the literature this is also known as
115
+ differential weight, being denoted by :math:`F`.
116
+ If specified as a float it should be in the range [0, 2).
117
+ If specified as a tuple ``(min, max)`` dithering is employed. Dithering
118
+ randomly changes the mutation constant on a generation by generation
119
+ basis. The mutation constant for that generation is taken from
120
+ ``U[min, max)``. Dithering can help speed convergence significantly.
121
+ Increasing the mutation constant increases the search radius, but will
122
+ slow down convergence.
123
+ recombination : float, optional
124
+ The recombination constant, should be in the range [0, 1]. In the
125
+ literature this is also known as the crossover probability, being
126
+ denoted by CR. Increasing this value allows a larger number of mutants
127
+ to progress into the next generation, but at the risk of population
128
+ stability.
129
+ rng : `numpy.random.Generator`, optional
130
+ Pseudorandom number generator state. When `rng` is None, a new
131
+ `numpy.random.Generator` is created using entropy from the
132
+ operating system. Types other than `numpy.random.Generator` are
133
+ passed to `numpy.random.default_rng` to instantiate a ``Generator``.
134
+ disp : bool, optional
135
+ Prints the evaluated `func` at every iteration.
136
+ callback : callable, optional
137
+ A callable called after each iteration. Has the signature::
138
+
139
+ callback(intermediate_result: OptimizeResult)
140
+
141
+ where ``intermediate_result`` is a keyword parameter containing an
142
+ `OptimizeResult` with attributes ``x`` and ``fun``, the best solution
143
+ found so far and the objective function. Note that the name
144
+ of the parameter must be ``intermediate_result`` for the callback
145
+ to be passed an `OptimizeResult`.
146
+
147
+ The callback also supports a signature like::
148
+
149
+ callback(x, convergence: float=val)
150
+
151
+ ``val`` represents the fractional value of the population convergence.
152
+ When ``val`` is greater than ``1.0``, the function halts.
153
+
154
+ Introspection is used to determine which of the signatures is invoked.
155
+
156
+ Global minimization will halt if the callback raises ``StopIteration``
157
+ or returns ``True``; any polishing is still carried out.
158
+
159
+ .. versionchanged:: 1.12.0
160
+ callback accepts the ``intermediate_result`` keyword.
161
+
162
+ polish : bool, optional
163
+ If True (default), then `scipy.optimize.minimize` with the `L-BFGS-B`
164
+ method is used to polish the best population member at the end, which
165
+ can improve the minimization slightly. If a constrained problem is
166
+ being studied then the `trust-constr` method is used instead. For large
167
+ problems with many constraints, polishing can take a long time due to
168
+ the Jacobian computations.
169
+
170
+ .. versionchanged:: 1.15.0
171
+ If `workers` is specified then the map-like callable that wraps
172
+ `func` is supplied to `minimize` instead of it using `func`
173
+ directly. This allows the caller to control how and where the
174
+ invocations actually run.
175
+
176
+ init : str or array-like, optional
177
+ Specify which type of population initialization is performed. Should be
178
+ one of:
179
+
180
+ - 'latinhypercube'
181
+ - 'sobol'
182
+ - 'halton'
183
+ - 'random'
184
+ - array specifying the initial population. The array should have
185
+ shape ``(S, N)``, where S is the total population size and N is
186
+ the number of parameters.
187
+
188
+ `init` is clipped to `bounds` before use.
189
+
190
+ The default is 'latinhypercube'. Latin Hypercube sampling tries to
191
+ maximize coverage of the available parameter space.
192
+
193
+ 'sobol' and 'halton' are superior alternatives and maximize even more
194
+ the parameter space. 'sobol' will enforce an initial population
195
+ size which is calculated as the next power of 2 after
196
+ ``popsize * (N - N_equal)``. 'halton' has no requirements but is a bit
197
+ less efficient. See `scipy.stats.qmc` for more details.
198
+
199
+ 'random' initializes the population randomly - this has the drawback
200
+ that clustering can occur, preventing the whole of parameter space
201
+ being covered. Use of an array to specify a population could be used,
202
+ for example, to create a tight bunch of initial guesses in an location
203
+ where the solution is known to exist, thereby reducing time for
204
+ convergence.
205
+ atol : float, optional
206
+ Absolute tolerance for convergence, the solving stops when
207
+ ``np.std(pop) <= atol + tol * np.abs(np.mean(population_energies))``,
208
+ where and `atol` and `tol` are the absolute and relative tolerance
209
+ respectively.
210
+ updating : {'immediate', 'deferred'}, optional
211
+ If ``'immediate'``, the best solution vector is continuously updated
212
+ within a single generation [4]_. This can lead to faster convergence as
213
+ trial vectors can take advantage of continuous improvements in the best
214
+ solution.
215
+ With ``'deferred'``, the best solution vector is updated once per
216
+ generation. Only ``'deferred'`` is compatible with parallelization or
217
+ vectorization, and the `workers` and `vectorized` keywords can
218
+ over-ride this option.
219
+
220
+ .. versionadded:: 1.2.0
221
+
222
+ workers : int or map-like callable, optional
223
+ If `workers` is an int the population is subdivided into `workers`
224
+ sections and evaluated in parallel
225
+ (uses `multiprocessing.Pool <multiprocessing>`).
226
+ Supply -1 to use all available CPU cores.
227
+ Alternatively supply a map-like callable, such as
228
+ `multiprocessing.Pool.map` for evaluating the population in parallel.
229
+ This evaluation is carried out as ``workers(func, iterable)``.
230
+ This option will override the `updating` keyword to
231
+ ``updating='deferred'`` if ``workers != 1``.
232
+ This option overrides the `vectorized` keyword if ``workers != 1``.
233
+ Requires that `func` be pickleable.
234
+
235
+ .. versionadded:: 1.2.0
236
+
237
+ constraints : {NonLinearConstraint, LinearConstraint, Bounds}
238
+ Constraints on the solver, over and above those applied by the `bounds`
239
+ kwd. Uses the approach by Lampinen [5]_.
240
+
241
+ .. versionadded:: 1.4.0
242
+
243
+ x0 : None or array-like, optional
244
+ Provides an initial guess to the minimization. Once the population has
245
+ been initialized this vector replaces the first (best) member. This
246
+ replacement is done even if `init` is given an initial population.
247
+ ``x0.shape == (N,)``.
248
+
249
+ .. versionadded:: 1.7.0
250
+
251
+ integrality : 1-D array, optional
252
+ For each decision variable, a boolean value indicating whether the
253
+ decision variable is constrained to integer values. The array is
254
+ broadcast to ``(N,)``.
255
+ If any decision variables are constrained to be integral, they will not
256
+ be changed during polishing.
257
+ Only integer values lying between the lower and upper bounds are used.
258
+ If there are no integer values lying between the bounds then a
259
+ `ValueError` is raised.
260
+
261
+ .. versionadded:: 1.9.0
262
+
263
+ vectorized : bool, optional
264
+ If ``vectorized is True``, `func` is sent an `x` array with
265
+ ``x.shape == (N, S)``, and is expected to return an array of shape
266
+ ``(S,)``, where `S` is the number of solution vectors to be calculated.
267
+ If constraints are applied, each of the functions used to construct
268
+ a `Constraint` object should accept an `x` array with
269
+ ``x.shape == (N, S)``, and return an array of shape ``(M, S)``, where
270
+ `M` is the number of constraint components.
271
+ This option is an alternative to the parallelization offered by
272
+ `workers`, and may help in optimization speed by reducing interpreter
273
+ overhead from multiple function calls. This keyword is ignored if
274
+ ``workers != 1``.
275
+ This option will override the `updating` keyword to
276
+ ``updating='deferred'``.
277
+ See the notes section for further discussion on when to use
278
+ ``'vectorized'``, and when to use ``'workers'``.
279
+
280
+ .. versionadded:: 1.9.0
281
+
282
+ Returns
283
+ -------
284
+ res : OptimizeResult
285
+ The optimization result represented as a `OptimizeResult` object.
286
+ Important attributes are: ``x`` the solution array, ``success`` a
287
+ Boolean flag indicating if the optimizer exited successfully,
288
+ ``message`` which describes the cause of the termination,
289
+ ``population`` the solution vectors present in the population, and
290
+ ``population_energies`` the value of the objective function for each
291
+ entry in ``population``.
292
+ See `OptimizeResult` for a description of other attributes. If `polish`
293
+ was employed, and a lower minimum was obtained by the polishing, then
294
+ OptimizeResult also contains the ``jac`` attribute.
295
+ If the eventual solution does not satisfy the applied constraints
296
+ ``success`` will be `False`.
297
+
298
+ Notes
299
+ -----
300
+ Differential evolution is a stochastic population based method that is
301
+ useful for global optimization problems. At each pass through the
302
+ population the algorithm mutates each candidate solution by mixing with
303
+ other candidate solutions to create a trial candidate. There are several
304
+ strategies [3]_ for creating trial candidates, which suit some problems
305
+ more than others. The 'best1bin' strategy is a good starting point for
306
+ many systems. In this strategy two members of the population are randomly
307
+ chosen. Their difference is used to mutate the best member (the 'best' in
308
+ 'best1bin'), :math:`x_0`, so far:
309
+
310
+ .. math::
311
+
312
+ b' = x_0 + F \cdot (x_{r_0} - x_{r_1})
313
+
314
+ where :math:`F` is the `mutation` parameter.
315
+ A trial vector is then constructed. Starting with a randomly chosen ith
316
+ parameter the trial is sequentially filled (in modulo) with parameters
317
+ from ``b'`` or the original candidate. The choice of whether to use ``b'``
318
+ or the original candidate is made with a binomial distribution (the 'bin'
319
+ in 'best1bin') - a random number in [0, 1) is generated. If this number is
320
+ less than the `recombination` constant then the parameter is loaded from
321
+ ``b'``, otherwise it is loaded from the original candidate. The final
322
+ parameter is always loaded from ``b'``. Once the trial candidate is built
323
+ its fitness is assessed. If the trial is better than the original candidate
324
+ then it takes its place. If it is also better than the best overall
325
+ candidate it also replaces that.
326
+
327
+ The other strategies available are outlined in Qiang and
328
+ Mitchell (2014) [3]_.
329
+
330
+
331
+ - ``rand1`` : :math:`b' = x_{r_0} + F \cdot (x_{r_1} - x_{r_2})`
332
+ - ``rand2`` : :math:`b' = x_{r_0} + F \cdot (x_{r_1} + x_{r_2} - x_{r_3} - x_{r_4})`
333
+ - ``best1`` : :math:`b' = x_0 + F \cdot (x_{r_0} - x_{r_1})`
334
+ - ``best2`` : :math:`b' = x_0 + F \cdot (x_{r_0} + x_{r_1} - x_{r_2} - x_{r_3})`
335
+ - ``currenttobest1`` : :math:`b' = x_i + F \cdot (x_0 - x_i + x_{r_0} - x_{r_1})`
336
+ - ``randtobest1`` : :math:`b' = x_{r_0} + F \cdot (x_0 - x_{r_0} + x_{r_1} - x_{r_2})`
337
+
338
+ where the integers :math:`r_0, r_1, r_2, r_3, r_4` are chosen randomly
339
+ from the interval [0, NP) with `NP` being the total population size and
340
+ the original candidate having index `i`. The user can fully customize the
341
+ generation of the trial candidates by supplying a callable to ``strategy``.
342
+
343
+ To improve your chances of finding a global minimum use higher `popsize`
344
+ values, with higher `mutation` and (dithering), but lower `recombination`
345
+ values. This has the effect of widening the search radius, but slowing
346
+ convergence.
347
+
348
+ By default the best solution vector is updated continuously within a single
349
+ iteration (``updating='immediate'``). This is a modification [4]_ of the
350
+ original differential evolution algorithm which can lead to faster
351
+ convergence as trial vectors can immediately benefit from improved
352
+ solutions. To use the original Storn and Price behaviour, updating the best
353
+ solution once per iteration, set ``updating='deferred'``.
354
+ The ``'deferred'`` approach is compatible with both parallelization and
355
+ vectorization (``'workers'`` and ``'vectorized'`` keywords). These may
356
+ improve minimization speed by using computer resources more efficiently.
357
+ The ``'workers'`` distribute calculations over multiple processors. By
358
+ default the Python `multiprocessing` module is used, but other approaches
359
+ are also possible, such as the Message Passing Interface (MPI) used on
360
+ clusters [6]_ [7]_. The overhead from these approaches (creating new
361
+ Processes, etc) may be significant, meaning that computational speed
362
+ doesn't necessarily scale with the number of processors used.
363
+ Parallelization is best suited to computationally expensive objective
364
+ functions. If the objective function is less expensive, then
365
+ ``'vectorized'`` may aid by only calling the objective function once per
366
+ iteration, rather than multiple times for all the population members; the
367
+ interpreter overhead is reduced.
368
+
369
+ .. versionadded:: 0.15.0
370
+
371
+ References
372
+ ----------
373
+ .. [1] Differential evolution, Wikipedia,
374
+ http://en.wikipedia.org/wiki/Differential_evolution
375
+ .. [2] Storn, R and Price, K, Differential Evolution - a Simple and
376
+ Efficient Heuristic for Global Optimization over Continuous Spaces,
377
+ Journal of Global Optimization, 1997, 11, 341 - 359.
378
+ .. [3] Qiang, J., Mitchell, C., A Unified Differential Evolution Algorithm
379
+ for Global Optimization, 2014, https://www.osti.gov/servlets/purl/1163659
380
+ .. [4] Wormington, M., Panaccione, C., Matney, K. M., Bowen, D. K., -
381
+ Characterization of structures from X-ray scattering data using
382
+ genetic algorithms, Phil. Trans. R. Soc. Lond. A, 1999, 357,
383
+ 2827-2848
384
+ .. [5] Lampinen, J., A constraint handling approach for the differential
385
+ evolution algorithm. Proceedings of the 2002 Congress on
386
+ Evolutionary Computation. CEC'02 (Cat. No. 02TH8600). Vol. 2. IEEE,
387
+ 2002.
388
+ .. [6] https://mpi4py.readthedocs.io/en/stable/
389
+ .. [7] https://schwimmbad.readthedocs.io/en/latest/
390
+
391
+
392
+ Examples
393
+ --------
394
+ Let us consider the problem of minimizing the Rosenbrock function. This
395
+ function is implemented in `rosen` in `scipy.optimize`.
396
+
397
+ >>> import numpy as np
398
+ >>> from scipy.optimize import rosen, differential_evolution
399
+ >>> bounds = [(0,2), (0, 2), (0, 2), (0, 2), (0, 2)]
400
+ >>> result = differential_evolution(rosen, bounds)
401
+ >>> result.x, result.fun
402
+ (array([1., 1., 1., 1., 1.]), 1.9216496320061384e-19)
403
+
404
+ Now repeat, but with parallelization.
405
+
406
+ >>> result = differential_evolution(rosen, bounds, updating='deferred',
407
+ ... workers=2)
408
+ >>> result.x, result.fun
409
+ (array([1., 1., 1., 1., 1.]), 1.9216496320061384e-19)
410
+
411
+ Let's do a constrained minimization.
412
+
413
+ >>> from scipy.optimize import LinearConstraint, Bounds
414
+
415
+ We add the constraint that the sum of ``x[0]`` and ``x[1]`` must be less
416
+ than or equal to 1.9. This is a linear constraint, which may be written
417
+ ``A @ x <= 1.9``, where ``A = array([[1, 1]])``. This can be encoded as
418
+ a `LinearConstraint` instance:
419
+
420
+ >>> lc = LinearConstraint([[1, 1]], -np.inf, 1.9)
421
+
422
+ Specify limits using a `Bounds` object.
423
+
424
+ >>> bounds = Bounds([0., 0.], [2., 2.])
425
+ >>> result = differential_evolution(rosen, bounds, constraints=lc,
426
+ ... rng=1)
427
+ >>> result.x, result.fun
428
+ (array([0.96632622, 0.93367155]), 0.0011352416852625719)
429
+
430
+ Next find the minimum of the Ackley function
431
+ (https://en.wikipedia.org/wiki/Test_functions_for_optimization).
432
+
433
+ >>> def ackley(x):
434
+ ... arg1 = -0.2 * np.sqrt(0.5 * (x[0] ** 2 + x[1] ** 2))
435
+ ... arg2 = 0.5 * (np.cos(2. * np.pi * x[0]) + np.cos(2. * np.pi * x[1]))
436
+ ... return -20. * np.exp(arg1) - np.exp(arg2) + 20. + np.e
437
+ >>> bounds = [(-5, 5), (-5, 5)]
438
+ >>> result = differential_evolution(ackley, bounds, rng=1)
439
+ >>> result.x, result.fun
440
+ (array([0., 0.]), 4.440892098500626e-16)
441
+
442
+ The Ackley function is written in a vectorized manner, so the
443
+ ``'vectorized'`` keyword can be employed. Note the reduced number of
444
+ function evaluations.
445
+
446
+ >>> result = differential_evolution(
447
+ ... ackley, bounds, vectorized=True, updating='deferred', rng=1
448
+ ... )
449
+ >>> result.x, result.fun
450
+ (array([0., 0.]), 4.440892098500626e-16)
451
+
452
+ The following custom strategy function mimics 'best1bin':
453
+
454
+ >>> def custom_strategy_fn(candidate, population, rng=None):
455
+ ... parameter_count = population.shape(-1)
456
+ ... mutation, recombination = 0.7, 0.9
457
+ ... trial = np.copy(population[candidate])
458
+ ... fill_point = rng.choice(parameter_count)
459
+ ...
460
+ ... pool = np.arange(len(population))
461
+ ... rng.shuffle(pool)
462
+ ...
463
+ ... # two unique random numbers that aren't the same, and
464
+ ... # aren't equal to candidate.
465
+ ... idxs = []
466
+ ... while len(idxs) < 2 and len(pool) > 0:
467
+ ... idx = pool[0]
468
+ ... pool = pool[1:]
469
+ ... if idx != candidate:
470
+ ... idxs.append(idx)
471
+ ...
472
+ ... r0, r1 = idxs[:2]
473
+ ...
474
+ ... bprime = (population[0] + mutation *
475
+ ... (population[r0] - population[r1]))
476
+ ...
477
+ ... crossovers = rng.uniform(size=parameter_count)
478
+ ... crossovers = crossovers < recombination
479
+ ... crossovers[fill_point] = True
480
+ ... trial = np.where(crossovers, bprime, trial)
481
+ ... return trial
482
+
483
+ """# noqa: E501
484
+
485
+ # using a context manager means that any created Pool objects are
486
+ # cleared up.
487
+ with DifferentialEvolutionSolver(func, bounds, args=args,
488
+ strategy=strategy,
489
+ maxiter=maxiter,
490
+ popsize=popsize, tol=tol,
491
+ mutation=mutation,
492
+ recombination=recombination,
493
+ rng=rng, polish=polish,
494
+ callback=callback,
495
+ disp=disp, init=init, atol=atol,
496
+ updating=updating,
497
+ workers=workers,
498
+ constraints=constraints,
499
+ x0=x0,
500
+ integrality=integrality,
501
+ vectorized=vectorized) as solver:
502
+ ret = solver.solve()
503
+
504
+ return ret
505
+
506
+
507
+ class DifferentialEvolutionSolver:
508
+
509
+ """This class implements the differential evolution solver
510
+
511
+ Parameters
512
+ ----------
513
+ func : callable
514
+ The objective function to be minimized. Must be in the form
515
+ ``f(x, *args)``, where ``x`` is the argument in the form of a 1-D array
516
+ and ``args`` is a tuple of any additional fixed parameters needed to
517
+ completely specify the function. The number of parameters, N, is equal
518
+ to ``len(x)``.
519
+ bounds : sequence or `Bounds`
520
+ Bounds for variables. There are two ways to specify the bounds:
521
+
522
+ 1. Instance of `Bounds` class.
523
+ 2. ``(min, max)`` pairs for each element in ``x``, defining the
524
+ finite lower and upper bounds for the optimizing argument of
525
+ `func`.
526
+
527
+ The total number of bounds is used to determine the number of
528
+ parameters, N. If there are parameters whose bounds are equal the total
529
+ number of free parameters is ``N - N_equal``.
530
+ args : tuple, optional
531
+ Any additional fixed parameters needed to
532
+ completely specify the objective function.
533
+ strategy : {str, callable}, optional
534
+ The differential evolution strategy to use. Should be one of:
535
+
536
+ - 'best1bin'
537
+ - 'best1exp'
538
+ - 'rand1bin'
539
+ - 'rand1exp'
540
+ - 'rand2bin'
541
+ - 'rand2exp'
542
+ - 'randtobest1bin'
543
+ - 'randtobest1exp'
544
+ - 'currenttobest1bin'
545
+ - 'currenttobest1exp'
546
+ - 'best2exp'
547
+ - 'best2bin'
548
+
549
+ The default is 'best1bin'. Strategies that may be
550
+ implemented are outlined in 'Notes'.
551
+
552
+ Alternatively the differential evolution strategy can be customized
553
+ by providing a callable that constructs a trial vector. The callable
554
+ must have the form
555
+ ``strategy(candidate: int, population: np.ndarray, rng=None)``,
556
+ where ``candidate`` is an integer specifying which entry of the
557
+ population is being evolved, ``population`` is an array of shape
558
+ ``(S, N)`` containing all the population members (where S is the
559
+ total population size), and ``rng`` is the random number generator
560
+ being used within the solver.
561
+ ``candidate`` will be in the range ``[0, S)``.
562
+ ``strategy`` must return a trial vector with shape ``(N,)``. The
563
+ fitness of this trial vector is compared against the fitness of
564
+ ``population[candidate]``.
565
+ maxiter : int, optional
566
+ The maximum number of generations over which the entire population is
567
+ evolved. The maximum number of function evaluations (with no polishing)
568
+ is: ``(maxiter + 1) * popsize * (N - N_equal)``
569
+ popsize : int, optional
570
+ A multiplier for setting the total population size. The population has
571
+ ``popsize * (N - N_equal)`` individuals. This keyword is overridden if
572
+ an initial population is supplied via the `init` keyword. When using
573
+ ``init='sobol'`` the population size is calculated as the next power
574
+ of 2 after ``popsize * (N - N_equal)``.
575
+ tol : float, optional
576
+ Relative tolerance for convergence, the solving stops when
577
+ ``np.std(population_energies) <= atol + tol * np.abs(np.mean(population_energies))``,
578
+ where and `atol` and `tol` are the absolute and relative tolerance
579
+ respectively.
580
+ mutation : float or tuple(float, float), optional
581
+ The mutation constant. In the literature this is also known as
582
+ differential weight, being denoted by F.
583
+ If specified as a float it should be in the range [0, 2].
584
+ If specified as a tuple ``(min, max)`` dithering is employed. Dithering
585
+ randomly changes the mutation constant on a generation by generation
586
+ basis. The mutation constant for that generation is taken from
587
+ U[min, max). Dithering can help speed convergence significantly.
588
+ Increasing the mutation constant increases the search radius, but will
589
+ slow down convergence.
590
+ recombination : float, optional
591
+ The recombination constant, should be in the range [0, 1]. In the
592
+ literature this is also known as the crossover probability, being
593
+ denoted by CR. Increasing this value allows a larger number of mutants
594
+ to progress into the next generation, but at the risk of population
595
+ stability.
596
+
597
+ rng : {None, int, `numpy.random.Generator`}, optional
598
+
599
+ ..versionchanged:: 1.15.0
600
+ As part of the `SPEC-007 <https://scientific-python.org/specs/spec-0007/>`_
601
+ transition from use of `numpy.random.RandomState` to
602
+ `numpy.random.Generator` this keyword was changed from `seed` to `rng`.
603
+ For an interim period both keywords will continue to work (only specify
604
+ one of them). After the interim period using the `seed` keyword will emit
605
+ warnings. The behavior of the `seed` and `rng` keywords is outlined below.
606
+
607
+ If `rng` is passed by keyword, types other than `numpy.random.Generator` are
608
+ passed to `numpy.random.default_rng` to instantiate a `Generator`.
609
+ If `rng` is already a `Generator` instance, then the provided instance is
610
+ used.
611
+
612
+ If this argument is passed by position or `seed` is passed by keyword, the
613
+ behavior is:
614
+
615
+ - If `seed` is None (or `np.random`), the `numpy.random.RandomState`
616
+ singleton is used.
617
+ - If `seed` is an int, a new `RandomState` instance is used,
618
+ seeded with `seed`.
619
+ - If `seed` is already a `Generator` or `RandomState` instance then
620
+ that instance is used.
621
+
622
+ Specify `seed`/`rng` for repeatable minimizations.
623
+ disp : bool, optional
624
+ Prints the evaluated `func` at every iteration.
625
+ callback : callable, optional
626
+ A callable called after each iteration. Has the signature:
627
+
628
+ ``callback(intermediate_result: OptimizeResult)``
629
+
630
+ where ``intermediate_result`` is a keyword parameter containing an
631
+ `OptimizeResult` with attributes ``x`` and ``fun``, the best solution
632
+ found so far and the objective function. Note that the name
633
+ of the parameter must be ``intermediate_result`` for the callback
634
+ to be passed an `OptimizeResult`.
635
+
636
+ The callback also supports a signature like:
637
+
638
+ ``callback(x, convergence: float=val)``
639
+
640
+ ``val`` represents the fractional value of the population convergence.
641
+ When ``val`` is greater than ``1.0``, the function halts.
642
+
643
+ Introspection is used to determine which of the signatures is invoked.
644
+
645
+ Global minimization will halt if the callback raises ``StopIteration``
646
+ or returns ``True``; any polishing is still carried out.
647
+
648
+ .. versionchanged:: 1.12.0
649
+ callback accepts the ``intermediate_result`` keyword.
650
+
651
+ polish : bool, optional
652
+ If True (default), then `scipy.optimize.minimize` with the `L-BFGS-B`
653
+ method is used to polish the best population member at the end, which
654
+ can improve the minimization slightly. If a constrained problem is
655
+ being studied then the `trust-constr` method is used instead. For large
656
+ problems with many constraints, polishing can take a long time due to
657
+ the Jacobian computations.
658
+ maxfun : int, optional
659
+ Set the maximum number of function evaluations. However, it probably
660
+ makes more sense to set `maxiter` instead.
661
+ init : str or array-like, optional
662
+ Specify which type of population initialization is performed. Should be
663
+ one of:
664
+
665
+ - 'latinhypercube'
666
+ - 'sobol'
667
+ - 'halton'
668
+ - 'random'
669
+ - array specifying the initial population. The array should have
670
+ shape ``(S, N)``, where S is the total population size and
671
+ N is the number of parameters.
672
+ `init` is clipped to `bounds` before use.
673
+
674
+ The default is 'latinhypercube'. Latin Hypercube sampling tries to
675
+ maximize coverage of the available parameter space.
676
+
677
+ 'sobol' and 'halton' are superior alternatives and maximize even more
678
+ the parameter space. 'sobol' will enforce an initial population
679
+ size which is calculated as the next power of 2 after
680
+ ``popsize * (N - N_equal)``. 'halton' has no requirements but is a bit
681
+ less efficient. See `scipy.stats.qmc` for more details.
682
+
683
+ 'random' initializes the population randomly - this has the drawback
684
+ that clustering can occur, preventing the whole of parameter space
685
+ being covered. Use of an array to specify a population could be used,
686
+ for example, to create a tight bunch of initial guesses in an location
687
+ where the solution is known to exist, thereby reducing time for
688
+ convergence.
689
+ atol : float, optional
690
+ Absolute tolerance for convergence, the solving stops when
691
+ ``np.std(pop) <= atol + tol * np.abs(np.mean(population_energies))``,
692
+ where and `atol` and `tol` are the absolute and relative tolerance
693
+ respectively.
694
+ updating : {'immediate', 'deferred'}, optional
695
+ If ``'immediate'``, the best solution vector is continuously updated
696
+ within a single generation [4]_. This can lead to faster convergence as
697
+ trial vectors can take advantage of continuous improvements in the best
698
+ solution.
699
+ With ``'deferred'``, the best solution vector is updated once per
700
+ generation. Only ``'deferred'`` is compatible with parallelization or
701
+ vectorization, and the `workers` and `vectorized` keywords can
702
+ over-ride this option.
703
+ workers : int or map-like callable, optional
704
+ If `workers` is an int the population is subdivided into `workers`
705
+ sections and evaluated in parallel
706
+ (uses `multiprocessing.Pool <multiprocessing>`).
707
+ Supply `-1` to use all cores available to the Process.
708
+ Alternatively supply a map-like callable, such as
709
+ `multiprocessing.Pool.map` for evaluating the population in parallel.
710
+ This evaluation is carried out as ``workers(func, iterable)``.
711
+ This option will override the `updating` keyword to
712
+ `updating='deferred'` if `workers != 1`.
713
+ Requires that `func` be pickleable.
714
+ constraints : {NonLinearConstraint, LinearConstraint, Bounds}
715
+ Constraints on the solver, over and above those applied by the `bounds`
716
+ kwd. Uses the approach by Lampinen.
717
+ x0 : None or array-like, optional
718
+ Provides an initial guess to the minimization. Once the population has
719
+ been initialized this vector replaces the first (best) member. This
720
+ replacement is done even if `init` is given an initial population.
721
+ ``x0.shape == (N,)``.
722
+ integrality : 1-D array, optional
723
+ For each decision variable, a boolean value indicating whether the
724
+ decision variable is constrained to integer values. The array is
725
+ broadcast to ``(N,)``.
726
+ If any decision variables are constrained to be integral, they will not
727
+ be changed during polishing.
728
+ Only integer values lying between the lower and upper bounds are used.
729
+ If there are no integer values lying between the bounds then a
730
+ `ValueError` is raised.
731
+ vectorized : bool, optional
732
+ If ``vectorized is True``, `func` is sent an `x` array with
733
+ ``x.shape == (N, S)``, and is expected to return an array of shape
734
+ ``(S,)``, where `S` is the number of solution vectors to be calculated.
735
+ If constraints are applied, each of the functions used to construct
736
+ a `Constraint` object should accept an `x` array with
737
+ ``x.shape == (N, S)``, and return an array of shape ``(M, S)``, where
738
+ `M` is the number of constraint components.
739
+ This option is an alternative to the parallelization offered by
740
+ `workers`, and may help in optimization speed. This keyword is
741
+ ignored if ``workers != 1``.
742
+ This option will override the `updating` keyword to
743
+ ``updating='deferred'``.
744
+ """ # noqa: E501
745
+
746
+ # Dispatch of mutation strategy method (binomial or exponential).
747
+ _binomial = {'best1bin': '_best1',
748
+ 'randtobest1bin': '_randtobest1',
749
+ 'currenttobest1bin': '_currenttobest1',
750
+ 'best2bin': '_best2',
751
+ 'rand2bin': '_rand2',
752
+ 'rand1bin': '_rand1'}
753
+ _exponential = {'best1exp': '_best1',
754
+ 'rand1exp': '_rand1',
755
+ 'randtobest1exp': '_randtobest1',
756
+ 'currenttobest1exp': '_currenttobest1',
757
+ 'best2exp': '_best2',
758
+ 'rand2exp': '_rand2'}
759
+
760
+ __init_error_msg = ("The population initialization method must be one of "
761
+ "'latinhypercube' or 'random', or an array of shape "
762
+ "(S, N) where N is the number of parameters and S>5")
763
+
764
+ def __init__(self, func, bounds, args=(),
765
+ strategy='best1bin', maxiter=1000, popsize=15,
766
+ tol=0.01, mutation=(0.5, 1), recombination=0.7, rng=None,
767
+ maxfun=np.inf, callback=None, disp=False, polish=True,
768
+ init='latinhypercube', atol=0, updating='immediate',
769
+ workers=1, constraints=(), x0=None, *, integrality=None,
770
+ vectorized=False):
771
+
772
+ if callable(strategy):
773
+ # a callable strategy is going to be stored in self.strategy anyway
774
+ pass
775
+ elif strategy in self._binomial:
776
+ self.mutation_func = getattr(self, self._binomial[strategy])
777
+ elif strategy in self._exponential:
778
+ self.mutation_func = getattr(self, self._exponential[strategy])
779
+ else:
780
+ raise ValueError("Please select a valid mutation strategy")
781
+ self.strategy = strategy
782
+
783
+ self.callback = _wrap_callback(callback, "differential_evolution")
784
+ self.polish = polish
785
+
786
+ # set the updating / parallelisation options
787
+ if updating in ['immediate', 'deferred']:
788
+ self._updating = updating
789
+
790
+ self.vectorized = vectorized
791
+
792
+ # want to use parallelisation, but updating is immediate
793
+ if workers != 1 and updating == 'immediate':
794
+ warnings.warn("differential_evolution: the 'workers' keyword has"
795
+ " overridden updating='immediate' to"
796
+ " updating='deferred'", UserWarning, stacklevel=2)
797
+ self._updating = 'deferred'
798
+
799
+ if vectorized and workers != 1:
800
+ warnings.warn("differential_evolution: the 'workers' keyword"
801
+ " overrides the 'vectorized' keyword", stacklevel=2)
802
+ self.vectorized = vectorized = False
803
+
804
+ if vectorized and updating == 'immediate':
805
+ warnings.warn("differential_evolution: the 'vectorized' keyword"
806
+ " has overridden updating='immediate' to updating"
807
+ "='deferred'", UserWarning, stacklevel=2)
808
+ self._updating = 'deferred'
809
+
810
+ # an object with a map method.
811
+ if vectorized:
812
+ def maplike_for_vectorized_func(func, x):
813
+ # send an array (N, S) to the user func,
814
+ # expect to receive (S,). Transposition is required because
815
+ # internally the population is held as (S, N)
816
+ return np.atleast_1d(func(x.T))
817
+ workers = maplike_for_vectorized_func
818
+
819
+ self._mapwrapper = MapWrapper(workers)
820
+
821
+ # relative and absolute tolerances for convergence
822
+ self.tol, self.atol = tol, atol
823
+
824
+ # Mutation constant should be in [0, 2). If specified as a sequence
825
+ # then dithering is performed.
826
+ self.scale = mutation
827
+ if (not np.all(np.isfinite(mutation)) or
828
+ np.any(np.array(mutation) >= 2) or
829
+ np.any(np.array(mutation) < 0)):
830
+ raise ValueError('The mutation constant must be a float in '
831
+ 'U[0, 2), or specified as a tuple(min, max)'
832
+ ' where min < max and min, max are in U[0, 2).')
833
+
834
+ self.dither = None
835
+ if hasattr(mutation, '__iter__') and len(mutation) > 1:
836
+ self.dither = [mutation[0], mutation[1]]
837
+ self.dither.sort()
838
+
839
+ self.cross_over_probability = recombination
840
+
841
+ # we create a wrapped function to allow the use of map (and Pool.map
842
+ # in the future)
843
+ self.func = _FunctionWrapper(func, args)
844
+ self.args = args
845
+
846
+ # convert tuple of lower and upper bounds to limits
847
+ # [(low_0, high_0), ..., (low_n, high_n]
848
+ # -> [[low_0, ..., low_n], [high_0, ..., high_n]]
849
+ if isinstance(bounds, Bounds):
850
+ self.limits = np.array(new_bounds_to_old(bounds.lb,
851
+ bounds.ub,
852
+ len(bounds.lb)),
853
+ dtype=float).T
854
+ else:
855
+ self.limits = np.array(bounds, dtype='float').T
856
+
857
+ if (np.size(self.limits, 0) != 2 or not
858
+ np.all(np.isfinite(self.limits))):
859
+ raise ValueError('bounds should be a sequence containing finite '
860
+ 'real valued (min, max) pairs for each value'
861
+ ' in x')
862
+
863
+ if maxiter is None: # the default used to be None
864
+ maxiter = 1000
865
+ self.maxiter = maxiter
866
+ if maxfun is None: # the default used to be None
867
+ maxfun = np.inf
868
+ self.maxfun = maxfun
869
+
870
+ # population is scaled to between [0, 1].
871
+ # We have to scale between parameter <-> population
872
+ # save these arguments for _scale_parameter and
873
+ # _unscale_parameter. This is an optimization
874
+ self.__scale_arg1 = 0.5 * (self.limits[0] + self.limits[1])
875
+ self.__scale_arg2 = np.fabs(self.limits[0] - self.limits[1])
876
+ with np.errstate(divide='ignore'):
877
+ # if lb == ub then the following line will be 1/0, which is why
878
+ # we ignore the divide by zero warning. The result from 1/0 is
879
+ # inf, so replace those values by 0.
880
+ self.__recip_scale_arg2 = 1 / self.__scale_arg2
881
+ self.__recip_scale_arg2[~np.isfinite(self.__recip_scale_arg2)] = 0
882
+
883
+ self.parameter_count = np.size(self.limits, 1)
884
+
885
+ self.random_number_generator = check_random_state(rng)
886
+
887
+ # Which parameters are going to be integers?
888
+ if np.any(integrality):
889
+ # # user has provided a truth value for integer constraints
890
+ integrality = np.broadcast_to(
891
+ integrality,
892
+ self.parameter_count
893
+ )
894
+ integrality = np.asarray(integrality, bool)
895
+ # For integrality parameters change the limits to only allow
896
+ # integer values lying between the limits.
897
+ lb, ub = np.copy(self.limits)
898
+
899
+ lb = np.ceil(lb)
900
+ ub = np.floor(ub)
901
+ if not (lb[integrality] <= ub[integrality]).all():
902
+ # there's a parameter that doesn't have an integer value
903
+ # lying between the limits
904
+ raise ValueError("One of the integrality constraints does not"
905
+ " have any possible integer values between"
906
+ " the lower/upper bounds.")
907
+ nlb = np.nextafter(lb[integrality] - 0.5, np.inf)
908
+ nub = np.nextafter(ub[integrality] + 0.5, -np.inf)
909
+
910
+ self.integrality = integrality
911
+ self.limits[0, self.integrality] = nlb
912
+ self.limits[1, self.integrality] = nub
913
+ else:
914
+ self.integrality = False
915
+
916
+ # check for equal bounds
917
+ eb = self.limits[0] == self.limits[1]
918
+ eb_count = np.count_nonzero(eb)
919
+
920
+ # default population initialization is a latin hypercube design, but
921
+ # there are other population initializations possible.
922
+ # the minimum is 5 because 'best2bin' requires a population that's at
923
+ # least 5 long
924
+ # 202301 - reduced population size to account for parameters with
925
+ # equal bounds. If there are no varying parameters set N to at least 1
926
+ self.num_population_members = max(
927
+ 5,
928
+ popsize * max(1, self.parameter_count - eb_count)
929
+ )
930
+ self.population_shape = (self.num_population_members,
931
+ self.parameter_count)
932
+
933
+ self._nfev = 0
934
+ # check first str otherwise will fail to compare str with array
935
+ if isinstance(init, str):
936
+ if init == 'latinhypercube':
937
+ self.init_population_lhs()
938
+ elif init == 'sobol':
939
+ # must be Ns = 2**m for Sobol'
940
+ n_s = int(2 ** np.ceil(np.log2(self.num_population_members)))
941
+ self.num_population_members = n_s
942
+ self.population_shape = (self.num_population_members,
943
+ self.parameter_count)
944
+ self.init_population_qmc(qmc_engine='sobol')
945
+ elif init == 'halton':
946
+ self.init_population_qmc(qmc_engine='halton')
947
+ elif init == 'random':
948
+ self.init_population_random()
949
+ else:
950
+ raise ValueError(self.__init_error_msg)
951
+ else:
952
+ self.init_population_array(init)
953
+
954
+ if x0 is not None:
955
+ # scale to within unit interval and
956
+ # ensure parameters are within bounds.
957
+ x0_scaled = self._unscale_parameters(np.asarray(x0))
958
+ if ((x0_scaled > 1.0) | (x0_scaled < 0.0)).any():
959
+ raise ValueError(
960
+ "Some entries in x0 lay outside the specified bounds"
961
+ )
962
+ self.population[0] = x0_scaled
963
+
964
+ # infrastructure for constraints
965
+ self.constraints = constraints
966
+ self._wrapped_constraints = []
967
+
968
+ if hasattr(constraints, '__len__'):
969
+ # sequence of constraints, this will also deal with default
970
+ # keyword parameter
971
+ for c in constraints:
972
+ self._wrapped_constraints.append(
973
+ _ConstraintWrapper(c, self.x)
974
+ )
975
+ else:
976
+ self._wrapped_constraints = [
977
+ _ConstraintWrapper(constraints, self.x)
978
+ ]
979
+ self.total_constraints = np.sum(
980
+ [c.num_constr for c in self._wrapped_constraints]
981
+ )
982
+ self.constraint_violation = np.zeros((self.num_population_members, 1))
983
+ self.feasible = np.ones(self.num_population_members, bool)
984
+
985
+ # an array to shuffle when selecting candidates. Create it here
986
+ # rather than repeatedly creating it in _select_samples.
987
+ self._random_population_index = np.arange(self.num_population_members)
988
+ self.disp = disp
989
+
990
+ def init_population_lhs(self):
991
+ """
992
+ Initializes the population with Latin Hypercube Sampling.
993
+ Latin Hypercube Sampling ensures that each parameter is uniformly
994
+ sampled over its range.
995
+ """
996
+ rng = self.random_number_generator
997
+
998
+ # Each parameter range needs to be sampled uniformly. The scaled
999
+ # parameter range ([0, 1)) needs to be split into
1000
+ # `self.num_population_members` segments, each of which has the following
1001
+ # size:
1002
+ segsize = 1.0 / self.num_population_members
1003
+
1004
+ # Within each segment we sample from a uniform random distribution.
1005
+ # We need to do this sampling for each parameter.
1006
+ samples = (segsize * rng.uniform(size=self.population_shape)
1007
+
1008
+ # Offset each segment to cover the entire parameter range [0, 1)
1009
+ + np.linspace(0., 1., self.num_population_members,
1010
+ endpoint=False)[:, np.newaxis])
1011
+
1012
+ # Create an array for population of candidate solutions.
1013
+ self.population = np.zeros_like(samples)
1014
+
1015
+ # Initialize population of candidate solutions by permutation of the
1016
+ # random samples.
1017
+ for j in range(self.parameter_count):
1018
+ order = rng.permutation(range(self.num_population_members))
1019
+ self.population[:, j] = samples[order, j]
1020
+
1021
+ # reset population energies
1022
+ self.population_energies = np.full(self.num_population_members,
1023
+ np.inf)
1024
+
1025
+ # reset number of function evaluations counter
1026
+ self._nfev = 0
1027
+
1028
+ def init_population_qmc(self, qmc_engine):
1029
+ """Initializes the population with a QMC method.
1030
+
1031
+ QMC methods ensures that each parameter is uniformly
1032
+ sampled over its range.
1033
+
1034
+ Parameters
1035
+ ----------
1036
+ qmc_engine : str
1037
+ The QMC method to use for initialization. Can be one of
1038
+ ``latinhypercube``, ``sobol`` or ``halton``.
1039
+
1040
+ """
1041
+ from scipy.stats import qmc
1042
+
1043
+ rng = self.random_number_generator
1044
+
1045
+ # Create an array for population of candidate solutions.
1046
+ if qmc_engine == 'latinhypercube':
1047
+ sampler = qmc.LatinHypercube(d=self.parameter_count, seed=rng)
1048
+ elif qmc_engine == 'sobol':
1049
+ sampler = qmc.Sobol(d=self.parameter_count, seed=rng)
1050
+ elif qmc_engine == 'halton':
1051
+ sampler = qmc.Halton(d=self.parameter_count, seed=rng)
1052
+ else:
1053
+ raise ValueError(self.__init_error_msg)
1054
+
1055
+ self.population = sampler.random(n=self.num_population_members)
1056
+
1057
+ # reset population energies
1058
+ self.population_energies = np.full(self.num_population_members,
1059
+ np.inf)
1060
+
1061
+ # reset number of function evaluations counter
1062
+ self._nfev = 0
1063
+
1064
+ def init_population_random(self):
1065
+ """
1066
+ Initializes the population at random. This type of initialization
1067
+ can possess clustering, Latin Hypercube sampling is generally better.
1068
+ """
1069
+ rng = self.random_number_generator
1070
+ self.population = rng.uniform(size=self.population_shape)
1071
+
1072
+ # reset population energies
1073
+ self.population_energies = np.full(self.num_population_members,
1074
+ np.inf)
1075
+
1076
+ # reset number of function evaluations counter
1077
+ self._nfev = 0
1078
+
1079
+ def init_population_array(self, init):
1080
+ """
1081
+ Initializes the population with a user specified population.
1082
+
1083
+ Parameters
1084
+ ----------
1085
+ init : np.ndarray
1086
+ Array specifying subset of the initial population. The array should
1087
+ have shape (S, N), where N is the number of parameters.
1088
+ The population is clipped to the lower and upper bounds.
1089
+ """
1090
+ # make sure you're using a float array
1091
+ popn = np.asarray(init, dtype=np.float64)
1092
+
1093
+ if (np.size(popn, 0) < 5 or
1094
+ popn.shape[1] != self.parameter_count or
1095
+ len(popn.shape) != 2):
1096
+ raise ValueError("The population supplied needs to have shape"
1097
+ " (S, len(x)), where S > 4.")
1098
+
1099
+ # scale values and clip to bounds, assigning to population
1100
+ self.population = np.clip(self._unscale_parameters(popn), 0, 1)
1101
+
1102
+ self.num_population_members = np.size(self.population, 0)
1103
+
1104
+ self.population_shape = (self.num_population_members,
1105
+ self.parameter_count)
1106
+
1107
+ # reset population energies
1108
+ self.population_energies = np.full(self.num_population_members,
1109
+ np.inf)
1110
+
1111
+ # reset number of function evaluations counter
1112
+ self._nfev = 0
1113
+
1114
+ @property
1115
+ def x(self):
1116
+ """
1117
+ The best solution from the solver
1118
+ """
1119
+ return self._scale_parameters(self.population[0])
1120
+
1121
+ @property
1122
+ def convergence(self):
1123
+ """
1124
+ The standard deviation of the population energies divided by their
1125
+ mean.
1126
+ """
1127
+ if np.any(np.isinf(self.population_energies)):
1128
+ return np.inf
1129
+ return (np.std(self.population_energies) /
1130
+ (np.abs(np.mean(self.population_energies)) + _MACHEPS))
1131
+
1132
+ def converged(self):
1133
+ """
1134
+ Return True if the solver has converged.
1135
+ """
1136
+ if np.any(np.isinf(self.population_energies)):
1137
+ return False
1138
+
1139
+ return (np.std(self.population_energies) <=
1140
+ self.atol +
1141
+ self.tol * np.abs(np.mean(self.population_energies)))
1142
+
1143
+ def solve(self):
1144
+ """
1145
+ Runs the DifferentialEvolutionSolver.
1146
+
1147
+ Returns
1148
+ -------
1149
+ res : OptimizeResult
1150
+ The optimization result represented as a `OptimizeResult` object.
1151
+ Important attributes are: ``x`` the solution array, ``success`` a
1152
+ Boolean flag indicating if the optimizer exited successfully,
1153
+ ``message`` which describes the cause of the termination,
1154
+ ``population`` the solution vectors present in the population, and
1155
+ ``population_energies`` the value of the objective function for
1156
+ each entry in ``population``.
1157
+ See `OptimizeResult` for a description of other attributes. If
1158
+ `polish` was employed, and a lower minimum was obtained by the
1159
+ polishing, then OptimizeResult also contains the ``jac`` attribute.
1160
+ If the eventual solution does not satisfy the applied constraints
1161
+ ``success`` will be `False`.
1162
+ """
1163
+ nit, warning_flag = 0, False
1164
+ status_message = _status_message['success']
1165
+
1166
+ # The population may have just been initialized (all entries are
1167
+ # np.inf). If it has you have to calculate the initial energies.
1168
+ # Although this is also done in the evolve generator it's possible
1169
+ # that someone can set maxiter=0, at which point we still want the
1170
+ # initial energies to be calculated (the following loop isn't run).
1171
+ if np.all(np.isinf(self.population_energies)):
1172
+ self.feasible, self.constraint_violation = (
1173
+ self._calculate_population_feasibilities(self.population))
1174
+
1175
+ # only work out population energies for feasible solutions
1176
+ self.population_energies[self.feasible] = (
1177
+ self._calculate_population_energies(
1178
+ self.population[self.feasible]))
1179
+
1180
+ self._promote_lowest_energy()
1181
+
1182
+ # do the optimization.
1183
+ for nit in range(1, self.maxiter + 1):
1184
+ # evolve the population by a generation
1185
+ try:
1186
+ next(self)
1187
+ except StopIteration:
1188
+ warning_flag = True
1189
+ if self._nfev > self.maxfun:
1190
+ status_message = _status_message['maxfev']
1191
+ elif self._nfev == self.maxfun:
1192
+ status_message = ('Maximum number of function evaluations'
1193
+ ' has been reached.')
1194
+ break
1195
+
1196
+ if self.disp:
1197
+ print(f"differential_evolution step {nit}: f(x)="
1198
+ f" {self.population_energies[0]}"
1199
+ )
1200
+
1201
+ if self.callback:
1202
+ c = self.tol / (self.convergence + _MACHEPS)
1203
+ res = self._result(nit=nit, message="in progress")
1204
+ res.convergence = c
1205
+ try:
1206
+ warning_flag = bool(self.callback(res))
1207
+ except StopIteration:
1208
+ warning_flag = True
1209
+
1210
+ if warning_flag:
1211
+ status_message = 'callback function requested stop early'
1212
+
1213
+ # should the solver terminate?
1214
+ if warning_flag or self.converged():
1215
+ break
1216
+
1217
+ else:
1218
+ status_message = _status_message['maxiter']
1219
+ warning_flag = True
1220
+
1221
+ DE_result = self._result(
1222
+ nit=nit, message=status_message, warning_flag=warning_flag
1223
+ )
1224
+
1225
+ if self.polish and not np.all(self.integrality):
1226
+ # can't polish if all the parameters are integers
1227
+ if np.any(self.integrality):
1228
+ # set the lower/upper bounds equal so that any integrality
1229
+ # constraints work.
1230
+ limits, integrality = self.limits, self.integrality
1231
+ limits[0, integrality] = DE_result.x[integrality]
1232
+ limits[1, integrality] = DE_result.x[integrality]
1233
+
1234
+ polish_method = 'L-BFGS-B'
1235
+
1236
+ if self._wrapped_constraints:
1237
+ polish_method = 'trust-constr'
1238
+
1239
+ constr_violation = self._constraint_violation_fn(DE_result.x)
1240
+ if np.any(constr_violation > 0.):
1241
+ warnings.warn("differential evolution didn't find a "
1242
+ "solution satisfying the constraints, "
1243
+ "attempting to polish from the least "
1244
+ "infeasible solution",
1245
+ UserWarning, stacklevel=2)
1246
+ if self.disp:
1247
+ print(f"Polishing solution with '{polish_method}'")
1248
+ result = minimize(lambda x:
1249
+ list(self._mapwrapper(self.func, np.atleast_2d(x)))[0],
1250
+ np.copy(DE_result.x),
1251
+ method=polish_method,
1252
+ bounds=self.limits.T,
1253
+ constraints=self.constraints)
1254
+
1255
+ self._nfev += result.nfev
1256
+ DE_result.nfev = self._nfev
1257
+
1258
+ # Polishing solution is only accepted if there is an improvement in
1259
+ # cost function, the polishing was successful and the solution lies
1260
+ # within the bounds.
1261
+ if (result.fun < DE_result.fun and
1262
+ result.success and
1263
+ np.all(result.x <= self.limits[1]) and
1264
+ np.all(self.limits[0] <= result.x)):
1265
+ DE_result.fun = result.fun
1266
+ DE_result.x = result.x
1267
+ DE_result.jac = result.jac
1268
+ # to keep internal state consistent
1269
+ self.population_energies[0] = result.fun
1270
+ self.population[0] = self._unscale_parameters(result.x)
1271
+
1272
+ if self._wrapped_constraints:
1273
+ DE_result.constr = [c.violation(DE_result.x) for
1274
+ c in self._wrapped_constraints]
1275
+ DE_result.constr_violation = np.max(
1276
+ np.concatenate(DE_result.constr))
1277
+ DE_result.maxcv = DE_result.constr_violation
1278
+ if DE_result.maxcv > 0:
1279
+ # if the result is infeasible then success must be False
1280
+ DE_result.success = False
1281
+ DE_result.message = ("The solution does not satisfy the "
1282
+ f"constraints, MAXCV = {DE_result.maxcv}")
1283
+
1284
+ return DE_result
1285
+
1286
+ def _result(self, **kwds):
1287
+ # form an intermediate OptimizeResult
1288
+ nit = kwds.get('nit', None)
1289
+ message = kwds.get('message', None)
1290
+ warning_flag = kwds.get('warning_flag', False)
1291
+ result = OptimizeResult(
1292
+ x=self.x,
1293
+ fun=self.population_energies[0],
1294
+ nfev=self._nfev,
1295
+ nit=nit,
1296
+ message=message,
1297
+ success=(warning_flag is not True),
1298
+ population=self._scale_parameters(self.population),
1299
+ population_energies=self.population_energies
1300
+ )
1301
+ if self._wrapped_constraints:
1302
+ result.constr = [c.violation(result.x)
1303
+ for c in self._wrapped_constraints]
1304
+ result.constr_violation = np.max(np.concatenate(result.constr))
1305
+ result.maxcv = result.constr_violation
1306
+ if result.maxcv > 0:
1307
+ result.success = False
1308
+
1309
+ return result
1310
+
1311
+ def _calculate_population_energies(self, population):
1312
+ """
1313
+ Calculate the energies of a population.
1314
+
1315
+ Parameters
1316
+ ----------
1317
+ population : ndarray
1318
+ An array of parameter vectors normalised to [0, 1] using lower
1319
+ and upper limits. Has shape ``(np.size(population, 0), N)``.
1320
+
1321
+ Returns
1322
+ -------
1323
+ energies : ndarray
1324
+ An array of energies corresponding to each population member. If
1325
+ maxfun will be exceeded during this call, then the number of
1326
+ function evaluations will be reduced and energies will be
1327
+ right-padded with np.inf. Has shape ``(np.size(population, 0),)``
1328
+ """
1329
+ num_members = np.size(population, 0)
1330
+ # S is the number of function evals left to stay under the
1331
+ # maxfun budget
1332
+ S = min(num_members, self.maxfun - self._nfev)
1333
+
1334
+ energies = np.full(num_members, np.inf)
1335
+
1336
+ parameters_pop = self._scale_parameters(population)
1337
+ try:
1338
+ calc_energies = list(
1339
+ self._mapwrapper(self.func, parameters_pop[0:S])
1340
+ )
1341
+ calc_energies = np.squeeze(calc_energies)
1342
+ except (TypeError, ValueError) as e:
1343
+ # wrong number of arguments for _mapwrapper
1344
+ # or wrong length returned from the mapper
1345
+ raise RuntimeError(
1346
+ "The map-like callable must be of the form f(func, iterable), "
1347
+ "returning a sequence of numbers the same length as 'iterable'"
1348
+ ) from e
1349
+
1350
+ if calc_energies.size != S:
1351
+ if self.vectorized:
1352
+ raise RuntimeError("The vectorized function must return an"
1353
+ " array of shape (S,) when given an array"
1354
+ " of shape (len(x), S)")
1355
+ raise RuntimeError("func(x, *args) must return a scalar value")
1356
+
1357
+ energies[0:S] = calc_energies
1358
+
1359
+ if self.vectorized:
1360
+ self._nfev += 1
1361
+ else:
1362
+ self._nfev += S
1363
+
1364
+ return energies
1365
+
1366
+ def _promote_lowest_energy(self):
1367
+ # swaps 'best solution' into first population entry
1368
+
1369
+ idx = np.arange(self.num_population_members)
1370
+ feasible_solutions = idx[self.feasible]
1371
+ if feasible_solutions.size:
1372
+ # find the best feasible solution
1373
+ idx_t = np.argmin(self.population_energies[feasible_solutions])
1374
+ l = feasible_solutions[idx_t]
1375
+ else:
1376
+ # no solution was feasible, use 'best' infeasible solution, which
1377
+ # will violate constraints the least
1378
+ l = np.argmin(np.sum(self.constraint_violation, axis=1))
1379
+
1380
+ self.population_energies[[0, l]] = self.population_energies[[l, 0]]
1381
+ self.population[[0, l], :] = self.population[[l, 0], :]
1382
+ self.feasible[[0, l]] = self.feasible[[l, 0]]
1383
+ self.constraint_violation[[0, l], :] = (
1384
+ self.constraint_violation[[l, 0], :])
1385
+
1386
+ def _constraint_violation_fn(self, x):
1387
+ """
1388
+ Calculates total constraint violation for all the constraints, for a
1389
+ set of solutions.
1390
+
1391
+ Parameters
1392
+ ----------
1393
+ x : ndarray
1394
+ Solution vector(s). Has shape (S, N), or (N,), where S is the
1395
+ number of solutions to investigate and N is the number of
1396
+ parameters.
1397
+
1398
+ Returns
1399
+ -------
1400
+ cv : ndarray
1401
+ Total violation of constraints. Has shape ``(S, M)``, where M is
1402
+ the total number of constraint components (which is not necessarily
1403
+ equal to len(self._wrapped_constraints)).
1404
+ """
1405
+ # how many solution vectors you're calculating constraint violations
1406
+ # for
1407
+ S = np.size(x) // self.parameter_count
1408
+ _out = np.zeros((S, self.total_constraints))
1409
+ offset = 0
1410
+ for con in self._wrapped_constraints:
1411
+ # the input/output of the (vectorized) constraint function is
1412
+ # {(N, S), (N,)} --> (M, S)
1413
+ # The input to _constraint_violation_fn is (S, N) or (N,), so
1414
+ # transpose to pass it to the constraint. The output is transposed
1415
+ # from (M, S) to (S, M) for further use.
1416
+ c = con.violation(x.T).T
1417
+
1418
+ # The shape of c should be (M,), (1, M), or (S, M). Check for
1419
+ # those shapes, as an incorrect shape indicates that the
1420
+ # user constraint function didn't return the right thing, and
1421
+ # the reshape operation will fail. Intercept the wrong shape
1422
+ # to give a reasonable error message. I'm not sure what failure
1423
+ # modes an inventive user will come up with.
1424
+ if c.shape[-1] != con.num_constr or (S > 1 and c.shape[0] != S):
1425
+ raise RuntimeError("An array returned from a Constraint has"
1426
+ " the wrong shape. If `vectorized is False`"
1427
+ " the Constraint should return an array of"
1428
+ " shape (M,). If `vectorized is True` then"
1429
+ " the Constraint must return an array of"
1430
+ " shape (M, S), where S is the number of"
1431
+ " solution vectors and M is the number of"
1432
+ " constraint components in a given"
1433
+ " Constraint object.")
1434
+
1435
+ # the violation function may return a 1D array, but is it a
1436
+ # sequence of constraints for one solution (S=1, M>=1), or the
1437
+ # value of a single constraint for a sequence of solutions
1438
+ # (S>=1, M=1)
1439
+ c = np.reshape(c, (S, con.num_constr))
1440
+ _out[:, offset:offset + con.num_constr] = c
1441
+ offset += con.num_constr
1442
+
1443
+ return _out
1444
+
1445
+ def _calculate_population_feasibilities(self, population):
1446
+ """
1447
+ Calculate the feasibilities of a population.
1448
+
1449
+ Parameters
1450
+ ----------
1451
+ population : ndarray
1452
+ An array of parameter vectors normalised to [0, 1] using lower
1453
+ and upper limits. Has shape ``(np.size(population, 0), N)``.
1454
+
1455
+ Returns
1456
+ -------
1457
+ feasible, constraint_violation : ndarray, ndarray
1458
+ Boolean array of feasibility for each population member, and an
1459
+ array of the constraint violation for each population member.
1460
+ constraint_violation has shape ``(np.size(population, 0), M)``,
1461
+ where M is the number of constraints.
1462
+ """
1463
+ num_members = np.size(population, 0)
1464
+ if not self._wrapped_constraints:
1465
+ # shortcut for no constraints
1466
+ return np.ones(num_members, bool), np.zeros((num_members, 1))
1467
+
1468
+ # (S, N)
1469
+ parameters_pop = self._scale_parameters(population)
1470
+
1471
+ if self.vectorized:
1472
+ # (S, M)
1473
+ constraint_violation = np.array(
1474
+ self._constraint_violation_fn(parameters_pop)
1475
+ )
1476
+ else:
1477
+ # (S, 1, M)
1478
+ constraint_violation = np.array([self._constraint_violation_fn(x)
1479
+ for x in parameters_pop])
1480
+ # if you use the list comprehension in the line above it will
1481
+ # create an array of shape (S, 1, M), because each iteration
1482
+ # generates an array of (1, M). In comparison the vectorized
1483
+ # version returns (S, M). It's therefore necessary to remove axis 1
1484
+ constraint_violation = constraint_violation[:, 0]
1485
+
1486
+ feasible = ~(np.sum(constraint_violation, axis=1) > 0)
1487
+
1488
+ return feasible, constraint_violation
1489
+
1490
+ def __iter__(self):
1491
+ return self
1492
+
1493
+ def __enter__(self):
1494
+ return self
1495
+
1496
+ def __exit__(self, *args):
1497
+ return self._mapwrapper.__exit__(*args)
1498
+
1499
+ def _accept_trial(self, energy_trial, feasible_trial, cv_trial,
1500
+ energy_orig, feasible_orig, cv_orig):
1501
+ """
1502
+ Trial is accepted if:
1503
+ * it satisfies all constraints and provides a lower or equal objective
1504
+ function value, while both the compared solutions are feasible
1505
+ - or -
1506
+ * it is feasible while the original solution is infeasible,
1507
+ - or -
1508
+ * it is infeasible, but provides a lower or equal constraint violation
1509
+ for all constraint functions.
1510
+
1511
+ This test corresponds to section III of Lampinen [1]_.
1512
+
1513
+ Parameters
1514
+ ----------
1515
+ energy_trial : float
1516
+ Energy of the trial solution
1517
+ feasible_trial : float
1518
+ Feasibility of trial solution
1519
+ cv_trial : array-like
1520
+ Excess constraint violation for the trial solution
1521
+ energy_orig : float
1522
+ Energy of the original solution
1523
+ feasible_orig : float
1524
+ Feasibility of original solution
1525
+ cv_orig : array-like
1526
+ Excess constraint violation for the original solution
1527
+
1528
+ Returns
1529
+ -------
1530
+ accepted : bool
1531
+
1532
+ """
1533
+ if feasible_orig and feasible_trial:
1534
+ return energy_trial <= energy_orig
1535
+ elif feasible_trial and not feasible_orig:
1536
+ return True
1537
+ elif not feasible_trial and (cv_trial <= cv_orig).all():
1538
+ # cv_trial < cv_orig would imply that both trial and orig are not
1539
+ # feasible
1540
+ return True
1541
+
1542
+ return False
1543
+
1544
+ def __next__(self):
1545
+ """
1546
+ Evolve the population by a single generation
1547
+
1548
+ Returns
1549
+ -------
1550
+ x : ndarray
1551
+ The best solution from the solver.
1552
+ fun : float
1553
+ Value of objective function obtained from the best solution.
1554
+ """
1555
+ # the population may have just been initialized (all entries are
1556
+ # np.inf). If it has you have to calculate the initial energies
1557
+ if np.all(np.isinf(self.population_energies)):
1558
+ self.feasible, self.constraint_violation = (
1559
+ self._calculate_population_feasibilities(self.population))
1560
+
1561
+ # only need to work out population energies for those that are
1562
+ # feasible
1563
+ self.population_energies[self.feasible] = (
1564
+ self._calculate_population_energies(
1565
+ self.population[self.feasible]))
1566
+
1567
+ self._promote_lowest_energy()
1568
+
1569
+ if self.dither is not None:
1570
+ self.scale = self.random_number_generator.uniform(self.dither[0],
1571
+ self.dither[1])
1572
+
1573
+ if self._updating == 'immediate':
1574
+ # update best solution immediately
1575
+ for candidate in range(self.num_population_members):
1576
+ if self._nfev > self.maxfun:
1577
+ raise StopIteration
1578
+
1579
+ # create a trial solution
1580
+ trial = self._mutate(candidate)
1581
+
1582
+ # ensuring that it's in the range [0, 1)
1583
+ self._ensure_constraint(trial)
1584
+
1585
+ # scale from [0, 1) to the actual parameter value
1586
+ parameters = self._scale_parameters(trial)
1587
+
1588
+ # determine the energy of the objective function
1589
+ if self._wrapped_constraints:
1590
+ cv = self._constraint_violation_fn(parameters)
1591
+ feasible = False
1592
+ energy = np.inf
1593
+ if not np.sum(cv) > 0:
1594
+ # solution is feasible
1595
+ feasible = True
1596
+ energy = self.func(parameters)
1597
+ self._nfev += 1
1598
+ else:
1599
+ feasible = True
1600
+ cv = np.atleast_2d([0.])
1601
+ energy = self.func(parameters)
1602
+ self._nfev += 1
1603
+
1604
+ # compare trial and population member
1605
+ if self._accept_trial(energy, feasible, cv,
1606
+ self.population_energies[candidate],
1607
+ self.feasible[candidate],
1608
+ self.constraint_violation[candidate]):
1609
+ self.population[candidate] = trial
1610
+ self.population_energies[candidate] = np.squeeze(energy)
1611
+ self.feasible[candidate] = feasible
1612
+ self.constraint_violation[candidate] = cv
1613
+
1614
+ # if the trial candidate is also better than the best
1615
+ # solution then promote it.
1616
+ if self._accept_trial(energy, feasible, cv,
1617
+ self.population_energies[0],
1618
+ self.feasible[0],
1619
+ self.constraint_violation[0]):
1620
+ self._promote_lowest_energy()
1621
+
1622
+ elif self._updating == 'deferred':
1623
+ # update best solution once per generation
1624
+ if self._nfev >= self.maxfun:
1625
+ raise StopIteration
1626
+
1627
+ # 'deferred' approach, vectorised form.
1628
+ # create trial solutions
1629
+ trial_pop = self._mutate_many(
1630
+ np.arange(self.num_population_members)
1631
+ )
1632
+
1633
+ # enforce bounds
1634
+ self._ensure_constraint(trial_pop)
1635
+
1636
+ # determine the energies of the objective function, but only for
1637
+ # feasible trials
1638
+ feasible, cv = self._calculate_population_feasibilities(trial_pop)
1639
+ trial_energies = np.full(self.num_population_members, np.inf)
1640
+
1641
+ # only calculate for feasible entries
1642
+ trial_energies[feasible] = self._calculate_population_energies(
1643
+ trial_pop[feasible])
1644
+
1645
+ # which solutions are 'improved'?
1646
+ loc = [self._accept_trial(*val) for val in
1647
+ zip(trial_energies, feasible, cv, self.population_energies,
1648
+ self.feasible, self.constraint_violation)]
1649
+ loc = np.array(loc)
1650
+ self.population = np.where(loc[:, np.newaxis],
1651
+ trial_pop,
1652
+ self.population)
1653
+ self.population_energies = np.where(loc,
1654
+ trial_energies,
1655
+ self.population_energies)
1656
+ self.feasible = np.where(loc,
1657
+ feasible,
1658
+ self.feasible)
1659
+ self.constraint_violation = np.where(loc[:, np.newaxis],
1660
+ cv,
1661
+ self.constraint_violation)
1662
+
1663
+ # make sure the best solution is updated if updating='deferred'.
1664
+ # put the lowest energy into the best solution position.
1665
+ self._promote_lowest_energy()
1666
+
1667
+ return self.x, self.population_energies[0]
1668
+
1669
+ def _scale_parameters(self, trial):
1670
+ """Scale from a number between 0 and 1 to parameters."""
1671
+ # trial either has shape (N, ) or (L, N), where L is the number of
1672
+ # solutions being scaled
1673
+ scaled = self.__scale_arg1 + (trial - 0.5) * self.__scale_arg2
1674
+ if np.count_nonzero(self.integrality):
1675
+ i = np.broadcast_to(self.integrality, scaled.shape)
1676
+ scaled[i] = np.round(scaled[i])
1677
+ return scaled
1678
+
1679
+ def _unscale_parameters(self, parameters):
1680
+ """Scale from parameters to a number between 0 and 1."""
1681
+ return (parameters - self.__scale_arg1) * self.__recip_scale_arg2 + 0.5
1682
+
1683
+ def _ensure_constraint(self, trial):
1684
+ """Make sure the parameters lie between the limits."""
1685
+ mask = np.bitwise_or(trial > 1, trial < 0)
1686
+ if oob := np.count_nonzero(mask):
1687
+ trial[mask] = self.random_number_generator.uniform(size=oob)
1688
+
1689
+ def _mutate_custom(self, candidate):
1690
+ rng = self.random_number_generator
1691
+ msg = (
1692
+ "strategy must have signature"
1693
+ " f(candidate: int, population: np.ndarray, rng=None) returning an"
1694
+ " array of shape (N,)"
1695
+ )
1696
+ _population = self._scale_parameters(self.population)
1697
+ if not len(np.shape(candidate)):
1698
+ # single entry in population
1699
+ trial = self.strategy(candidate, _population, rng=rng)
1700
+ if trial.shape != (self.parameter_count,):
1701
+ raise RuntimeError(msg)
1702
+ else:
1703
+ S = candidate.shape[0]
1704
+ trial = np.array(
1705
+ [self.strategy(c, _population, rng=rng) for c in candidate],
1706
+ dtype=float
1707
+ )
1708
+ if trial.shape != (S, self.parameter_count):
1709
+ raise RuntimeError(msg)
1710
+ return self._unscale_parameters(trial)
1711
+
1712
+ def _mutate_many(self, candidates):
1713
+ """Create trial vectors based on a mutation strategy."""
1714
+ rng = self.random_number_generator
1715
+
1716
+ S = len(candidates)
1717
+ if callable(self.strategy):
1718
+ return self._mutate_custom(candidates)
1719
+
1720
+ trial = np.copy(self.population[candidates])
1721
+ samples = np.array([self._select_samples(c, 5) for c in candidates])
1722
+
1723
+ if self.strategy in ['currenttobest1exp', 'currenttobest1bin']:
1724
+ bprime = self.mutation_func(candidates, samples)
1725
+ else:
1726
+ bprime = self.mutation_func(samples)
1727
+
1728
+ fill_point = rng_integers(rng, self.parameter_count, size=S)
1729
+ crossovers = rng.uniform(size=(S, self.parameter_count))
1730
+ crossovers = crossovers < self.cross_over_probability
1731
+ if self.strategy in self._binomial:
1732
+ # the last one is always from the bprime vector for binomial
1733
+ # If you fill in modulo with a loop you have to set the last one to
1734
+ # true. If you don't use a loop then you can have any random entry
1735
+ # be True.
1736
+ i = np.arange(S)
1737
+ crossovers[i, fill_point[i]] = True
1738
+ trial = np.where(crossovers, bprime, trial)
1739
+ return trial
1740
+
1741
+ elif self.strategy in self._exponential:
1742
+ crossovers[..., 0] = True
1743
+ for j in range(S):
1744
+ i = 0
1745
+ init_fill = fill_point[j]
1746
+ while (i < self.parameter_count and crossovers[j, i]):
1747
+ trial[j, init_fill] = bprime[j, init_fill]
1748
+ init_fill = (init_fill + 1) % self.parameter_count
1749
+ i += 1
1750
+
1751
+ return trial
1752
+
1753
+ def _mutate(self, candidate):
1754
+ """Create a trial vector based on a mutation strategy."""
1755
+ rng = self.random_number_generator
1756
+
1757
+ if callable(self.strategy):
1758
+ return self._mutate_custom(candidate)
1759
+
1760
+ fill_point = rng_integers(rng, self.parameter_count)
1761
+ samples = self._select_samples(candidate, 5)
1762
+
1763
+ trial = np.copy(self.population[candidate])
1764
+
1765
+ if self.strategy in ['currenttobest1exp', 'currenttobest1bin']:
1766
+ bprime = self.mutation_func(candidate, samples)
1767
+ else:
1768
+ bprime = self.mutation_func(samples)
1769
+
1770
+ crossovers = rng.uniform(size=self.parameter_count)
1771
+ crossovers = crossovers < self.cross_over_probability
1772
+ if self.strategy in self._binomial:
1773
+ # the last one is always from the bprime vector for binomial
1774
+ # If you fill in modulo with a loop you have to set the last one to
1775
+ # true. If you don't use a loop then you can have any random entry
1776
+ # be True.
1777
+ crossovers[fill_point] = True
1778
+ trial = np.where(crossovers, bprime, trial)
1779
+ return trial
1780
+
1781
+ elif self.strategy in self._exponential:
1782
+ i = 0
1783
+ crossovers[0] = True
1784
+ while i < self.parameter_count and crossovers[i]:
1785
+ trial[fill_point] = bprime[fill_point]
1786
+ fill_point = (fill_point + 1) % self.parameter_count
1787
+ i += 1
1788
+
1789
+ return trial
1790
+
1791
+ def _best1(self, samples):
1792
+ """best1bin, best1exp"""
1793
+ # samples.shape == (S, 5)
1794
+ # or
1795
+ # samples.shape(5,)
1796
+ r0, r1 = samples[..., :2].T
1797
+ return (self.population[0] + self.scale *
1798
+ (self.population[r0] - self.population[r1]))
1799
+
1800
+ def _rand1(self, samples):
1801
+ """rand1bin, rand1exp"""
1802
+ r0, r1, r2 = samples[..., :3].T
1803
+ return (self.population[r0] + self.scale *
1804
+ (self.population[r1] - self.population[r2]))
1805
+
1806
+ def _randtobest1(self, samples):
1807
+ """randtobest1bin, randtobest1exp"""
1808
+ r0, r1, r2 = samples[..., :3].T
1809
+ bprime = np.copy(self.population[r0])
1810
+ bprime += self.scale * (self.population[0] - bprime)
1811
+ bprime += self.scale * (self.population[r1] -
1812
+ self.population[r2])
1813
+ return bprime
1814
+
1815
+ def _currenttobest1(self, candidate, samples):
1816
+ """currenttobest1bin, currenttobest1exp"""
1817
+ r0, r1 = samples[..., :2].T
1818
+ bprime = (self.population[candidate] + self.scale *
1819
+ (self.population[0] - self.population[candidate] +
1820
+ self.population[r0] - self.population[r1]))
1821
+ return bprime
1822
+
1823
+ def _best2(self, samples):
1824
+ """best2bin, best2exp"""
1825
+ r0, r1, r2, r3 = samples[..., :4].T
1826
+ bprime = (self.population[0] + self.scale *
1827
+ (self.population[r0] + self.population[r1] -
1828
+ self.population[r2] - self.population[r3]))
1829
+
1830
+ return bprime
1831
+
1832
+ def _rand2(self, samples):
1833
+ """rand2bin, rand2exp"""
1834
+ r0, r1, r2, r3, r4 = samples[..., :5].T
1835
+ bprime = (self.population[r0] + self.scale *
1836
+ (self.population[r1] + self.population[r2] -
1837
+ self.population[r3] - self.population[r4]))
1838
+
1839
+ return bprime
1840
+
1841
+ def _select_samples(self, candidate, number_samples):
1842
+ """
1843
+ obtain random integers from range(self.num_population_members),
1844
+ without replacement. You can't have the original candidate either.
1845
+ """
1846
+ self.random_number_generator.shuffle(self._random_population_index)
1847
+ idxs = self._random_population_index[:number_samples + 1]
1848
+ return idxs[idxs != candidate][:number_samples]
1849
+
1850
+
1851
+ class _ConstraintWrapper:
1852
+ """Object to wrap/evaluate user defined constraints.
1853
+
1854
+ Very similar in practice to `PreparedConstraint`, except that no evaluation
1855
+ of jac/hess is performed (explicit or implicit).
1856
+
1857
+ If created successfully, it will contain the attributes listed below.
1858
+
1859
+ Parameters
1860
+ ----------
1861
+ constraint : {`NonlinearConstraint`, `LinearConstraint`, `Bounds`}
1862
+ Constraint to check and prepare.
1863
+ x0 : array_like
1864
+ Initial vector of independent variables, shape (N,)
1865
+
1866
+ Attributes
1867
+ ----------
1868
+ fun : callable
1869
+ Function defining the constraint wrapped by one of the convenience
1870
+ classes.
1871
+ bounds : 2-tuple
1872
+ Contains lower and upper bounds for the constraints --- lb and ub.
1873
+ These are converted to ndarray and have a size equal to the number of
1874
+ the constraints.
1875
+
1876
+ Notes
1877
+ -----
1878
+ _ConstraintWrapper.fun and _ConstraintWrapper.violation can get sent
1879
+ arrays of shape (N, S) or (N,), where S is the number of vectors of shape
1880
+ (N,) to consider constraints for.
1881
+ """
1882
+ def __init__(self, constraint, x0):
1883
+ self.constraint = constraint
1884
+
1885
+ if isinstance(constraint, NonlinearConstraint):
1886
+ def fun(x):
1887
+ x = np.asarray(x)
1888
+ return np.atleast_1d(constraint.fun(x))
1889
+ elif isinstance(constraint, LinearConstraint):
1890
+ def fun(x):
1891
+ if issparse(constraint.A):
1892
+ A = constraint.A
1893
+ else:
1894
+ A = np.atleast_2d(constraint.A)
1895
+
1896
+ res = A.dot(x)
1897
+ # x either has shape (N, S) or (N)
1898
+ # (M, N) x (N, S) --> (M, S)
1899
+ # (M, N) x (N,) --> (M,)
1900
+ # However, if (M, N) is a matrix then:
1901
+ # (M, N) * (N,) --> (M, 1), we need this to be (M,)
1902
+ if x.ndim == 1 and res.ndim == 2:
1903
+ # deal with case that constraint.A is an np.matrix
1904
+ # see gh20041
1905
+ res = np.asarray(res)[:, 0]
1906
+
1907
+ return res
1908
+ elif isinstance(constraint, Bounds):
1909
+ def fun(x):
1910
+ return np.asarray(x)
1911
+ else:
1912
+ raise ValueError("`constraint` of an unknown type is passed.")
1913
+
1914
+ self.fun = fun
1915
+
1916
+ lb = np.asarray(constraint.lb, dtype=float)
1917
+ ub = np.asarray(constraint.ub, dtype=float)
1918
+
1919
+ x0 = np.asarray(x0)
1920
+
1921
+ # find out the number of constraints
1922
+ f0 = fun(x0)
1923
+ self.num_constr = m = f0.size
1924
+ self.parameter_count = x0.size
1925
+
1926
+ if lb.ndim == 0:
1927
+ lb = np.resize(lb, m)
1928
+ if ub.ndim == 0:
1929
+ ub = np.resize(ub, m)
1930
+
1931
+ self.bounds = (lb, ub)
1932
+
1933
+ def __call__(self, x):
1934
+ return np.atleast_1d(self.fun(x))
1935
+
1936
+ def violation(self, x):
1937
+ """How much the constraint is exceeded by.
1938
+
1939
+ Parameters
1940
+ ----------
1941
+ x : array-like
1942
+ Vector of independent variables, (N, S), where N is number of
1943
+ parameters and S is the number of solutions to be investigated.
1944
+
1945
+ Returns
1946
+ -------
1947
+ excess : array-like
1948
+ How much the constraint is exceeded by, for each of the
1949
+ constraints specified by `_ConstraintWrapper.fun`.
1950
+ Has shape (M, S) where M is the number of constraint components.
1951
+ """
1952
+ # expect ev to have shape (num_constr, S) or (num_constr,)
1953
+ ev = self.fun(np.asarray(x))
1954
+
1955
+ try:
1956
+ excess_lb = np.maximum(self.bounds[0] - ev.T, 0)
1957
+ excess_ub = np.maximum(ev.T - self.bounds[1], 0)
1958
+ except ValueError as e:
1959
+ raise RuntimeError("An array returned from a Constraint has"
1960
+ " the wrong shape. If `vectorized is False`"
1961
+ " the Constraint should return an array of"
1962
+ " shape (M,). If `vectorized is True` then"
1963
+ " the Constraint must return an array of"
1964
+ " shape (M, S), where S is the number of"
1965
+ " solution vectors and M is the number of"
1966
+ " constraint components in a given"
1967
+ " Constraint object.") from e
1968
+
1969
+ v = (excess_lb + excess_ub).T
1970
+ return v