scipy 1.16.2__cp311-cp311-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.cp311-win_arm64.lib +0 -0
  4. scipy/_cyutility.cp311-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.cp311-win_arm64.lib +0 -0
  13. scipy/_lib/_ccallback_c.cp311-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.cp311-win_arm64.lib +0 -0
  18. scipy/_lib/_fpumode.cp311-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.cp311-win_arm64.lib +0 -0
  23. scipy/_lib/_test_ccallback.cp311-win_arm64.pyd +0 -0
  24. scipy/_lib/_test_deprecation_call.cp311-win_arm64.lib +0 -0
  25. scipy/_lib/_test_deprecation_call.cp311-win_arm64.pyd +0 -0
  26. scipy/_lib/_test_deprecation_def.cp311-win_arm64.lib +0 -0
  27. scipy/_lib/_test_deprecation_def.cp311-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.cp311-win_arm64.lib +0 -0
  35. scipy/_lib/_uarray/_uarray.cp311-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.cp311-win_arm64.lib +0 -0
  101. scipy/_lib/messagestream.cp311-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.cp311-win_arm64.lib +0 -0
  148. scipy/cluster/_hierarchy.cp311-win_arm64.pyd +0 -0
  149. scipy/cluster/_optimal_leaf_ordering.cp311-win_arm64.lib +0 -0
  150. scipy/cluster/_optimal_leaf_ordering.cp311-win_arm64.pyd +0 -0
  151. scipy/cluster/_vq.cp311-win_arm64.lib +0 -0
  152. scipy/cluster/_vq.cp311-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.cp311-win_arm64.lib +0 -0
  193. scipy/fft/_pocketfft/pypocketfft.cp311-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.cp311-win_arm64.lib +0 -0
  215. scipy/fftpack/convolve.cp311-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.cp311-win_arm64.lib +0 -0
  233. scipy/integrate/_dop.cp311-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.cp311-win_arm64.lib +0 -0
  248. scipy/integrate/_lsoda.cp311-win_arm64.pyd +0 -0
  249. scipy/integrate/_ode.py +1395 -0
  250. scipy/integrate/_odepack.cp311-win_arm64.lib +0 -0
  251. scipy/integrate/_odepack.cp311-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.cp311-win_arm64.lib +0 -0
  255. scipy/integrate/_quadpack.cp311-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.cp311-win_arm64.lib +0 -0
  265. scipy/integrate/_test_multivariate.cp311-win_arm64.pyd +0 -0
  266. scipy/integrate/_test_odeint_banded.cp311-win_arm64.lib +0 -0
  267. scipy/integrate/_test_odeint_banded.cp311-win_arm64.pyd +0 -0
  268. scipy/integrate/_vode.cp311-win_arm64.lib +0 -0
  269. scipy/integrate/_vode.cp311-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.cp311-win_arm64.lib +0 -0
  290. scipy/interpolate/_dfitpack.cp311-win_arm64.pyd +0 -0
  291. scipy/interpolate/_dierckx.cp311-win_arm64.lib +0 -0
  292. scipy/interpolate/_dierckx.cp311-win_arm64.pyd +0 -0
  293. scipy/interpolate/_fitpack.cp311-win_arm64.lib +0 -0
  294. scipy/interpolate/_fitpack.cp311-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.cp311-win_arm64.lib +0 -0
  300. scipy/interpolate/_interpnd.cp311-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.cp311-win_arm64.lib +0 -0
  307. scipy/interpolate/_ppoly.cp311-win_arm64.pyd +0 -0
  308. scipy/interpolate/_rbf.py +290 -0
  309. scipy/interpolate/_rbfinterp.py +550 -0
  310. scipy/interpolate/_rbfinterp_pythran.cp311-win_arm64.lib +0 -0
  311. scipy/interpolate/_rbfinterp_pythran.cp311-win_arm64.pyd +0 -0
  312. scipy/interpolate/_rgi.py +764 -0
  313. scipy/interpolate/_rgi_cython.cp311-win_arm64.lib +0 -0
  314. scipy/interpolate/_rgi_cython.cp311-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.cp311-win_arm64.lib +0 -0
  343. scipy/io/_fast_matrix_market/_fmm_core.cp311-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.cp311-win_arm64.lib +0 -0
  355. scipy/io/_test_fortran.cp311-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.cp311-win_arm64.lib +0 -0
  386. scipy/io/matlab/_mio5_utils.cp311-win_arm64.pyd +0 -0
  387. scipy/io/matlab/_mio_utils.cp311-win_arm64.lib +0 -0
  388. scipy/io/matlab/_mio_utils.cp311-win_arm64.pyd +0 -0
  389. scipy/io/matlab/_miobase.py +435 -0
  390. scipy/io/matlab/_streams.cp311-win_arm64.lib +0 -0
  391. scipy/io/matlab/_streams.cp311-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.cp311-win_arm64.lib +0 -0
  623. scipy/linalg/_cythonized_array_utils.cp311-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.cp311-win_arm64.lib +0 -0
  630. scipy/linalg/_decomp_interpolative.cp311-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.cp311-win_arm64.lib +0 -0
  634. scipy/linalg/_decomp_lu_cython.cp311-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.cp311-win_arm64.lib +0 -0
  642. scipy/linalg/_decomp_update.cp311-win_arm64.pyd +0 -0
  643. scipy/linalg/_expm_frechet.py +417 -0
  644. scipy/linalg/_fblas.cp311-win_arm64.lib +0 -0
  645. scipy/linalg/_fblas.cp311-win_arm64.pyd +0 -0
  646. scipy/linalg/_flapack.cp311-win_arm64.lib +0 -0
  647. scipy/linalg/_flapack.cp311-win_arm64.pyd +0 -0
  648. scipy/linalg/_lapack_subroutines.h +1521 -0
  649. scipy/linalg/_linalg_pythran.cp311-win_arm64.lib +0 -0
  650. scipy/linalg/_linalg_pythran.cp311-win_arm64.pyd +0 -0
  651. scipy/linalg/_matfuncs.py +1050 -0
  652. scipy/linalg/_matfuncs_expm.cp311-win_arm64.lib +0 -0
  653. scipy/linalg/_matfuncs_expm.cp311-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.cp311-win_arm64.lib +0 -0
  657. scipy/linalg/_matfuncs_schur_sqrtm.cp311-win_arm64.pyd +0 -0
  658. scipy/linalg/_matfuncs_sqrtm.py +107 -0
  659. scipy/linalg/_matfuncs_sqrtm_triu.cp311-win_arm64.lib +0 -0
  660. scipy/linalg/_matfuncs_sqrtm_triu.cp311-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.cp311-win_arm64.lib +0 -0
  665. scipy/linalg/_solve_toeplitz.cp311-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.cp311-win_arm64.lib +0 -0
  672. scipy/linalg/cython_blas.cp311-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.cp311-win_arm64.lib +0 -0
  676. scipy/linalg/cython_lapack.cp311-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.cp311-win_arm64.lib +0 -0
  728. scipy/ndimage/_ctest.cp311-win_arm64.pyd +0 -0
  729. scipy/ndimage/_cytest.cp311-win_arm64.lib +0 -0
  730. scipy/ndimage/_cytest.cp311-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.cp311-win_arm64.lib +0 -0
  738. scipy/ndimage/_nd_image.cp311-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.cp311-win_arm64.lib +0 -0
  742. scipy/ndimage/_ni_label.cp311-win_arm64.pyd +0 -0
  743. scipy/ndimage/_ni_support.py +139 -0
  744. scipy/ndimage/_rank_filter_1d.cp311-win_arm64.lib +0 -0
  745. scipy/ndimage/_rank_filter_1d.cp311-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.cp311-win_arm64.lib +0 -0
  768. scipy/odr/__odrpack.cp311-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.cp311-win_arm64.lib +0 -0
  780. scipy/optimize/_bglu_dense.cp311-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.cp311-win_arm64.lib +0 -0
  790. scipy/optimize/_direct.cp311-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.cp311-win_arm64.lib +0 -0
  795. scipy/optimize/_group_columns.cp311-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.cp311-win_arm64.lib +0 -0
  799. scipy/optimize/_highspy/_core.cp311-win_arm64.pyd +0 -0
  800. scipy/optimize/_highspy/_highs_options.cp311-win_arm64.lib +0 -0
  801. scipy/optimize/_highspy/_highs_options.cp311-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.cp311-win_arm64.lib +0 -0
  805. scipy/optimize/_lbfgsb.cp311-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.cp311-win_arm64.lib +0 -0
  816. scipy/optimize/_lsap.cp311-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.cp311-win_arm64.lib +0 -0
  822. scipy/optimize/_lsq/givens_elimination.cp311-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.cp311-win_arm64.lib +0 -0
  830. scipy/optimize/_minpack.cp311-win_arm64.pyd +0 -0
  831. scipy/optimize/_minpack_py.py +1178 -0
  832. scipy/optimize/_moduleTNC.cp311-win_arm64.lib +0 -0
  833. scipy/optimize/_moduleTNC.cp311-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.cp311-win_arm64.lib +0 -0
  839. scipy/optimize/_pava_pybind.cp311-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.cp311-win_arm64.lib +0 -0
  850. scipy/optimize/_slsqplib.cp311-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.cp311-win_arm64.lib +0 -0
  855. scipy/optimize/_trlib/_trlib.cp311-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.cp311-win_arm64.lib +0 -0
  877. scipy/optimize/_zeros.cp311-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.cp311-win_arm64.lib +0 -0
  882. scipy/optimize/cython_optimize/_zeros.cp311-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.cp311-win_arm64.lib +0 -0
  953. scipy/signal/_max_len_seq_inner.cp311-win_arm64.pyd +0 -0
  954. scipy/signal/_peak_finding.py +1310 -0
  955. scipy/signal/_peak_finding_utils.cp311-win_arm64.lib +0 -0
  956. scipy/signal/_peak_finding_utils.cp311-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.cp311-win_arm64.lib +0 -0
  963. scipy/signal/_sigtools.cp311-win_arm64.pyd +0 -0
  964. scipy/signal/_sosfilt.cp311-win_arm64.lib +0 -0
  965. scipy/signal/_sosfilt.cp311-win_arm64.pyd +0 -0
  966. scipy/signal/_spectral_py.py +2471 -0
  967. scipy/signal/_spline.cp311-win_arm64.lib +0 -0
  968. scipy/signal/_spline.cp311-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.cp311-win_arm64.lib +0 -0
  974. scipy/signal/_upfirdn_apply.cp311-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.cp311-win_arm64.lib +0 -0
  1021. scipy/sparse/_csparsetools.cp311-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.cp311-win_arm64.lib +0 -0
  1032. scipy/sparse/_sparsetools.cp311-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.cp311-win_arm64.lib +0 -0
  1043. scipy/sparse/csgraph/_flow.cp311-win_arm64.pyd +0 -0
  1044. scipy/sparse/csgraph/_laplacian.py +563 -0
  1045. scipy/sparse/csgraph/_matching.cp311-win_arm64.lib +0 -0
  1046. scipy/sparse/csgraph/_matching.cp311-win_arm64.pyd +0 -0
  1047. scipy/sparse/csgraph/_min_spanning_tree.cp311-win_arm64.lib +0 -0
  1048. scipy/sparse/csgraph/_min_spanning_tree.cp311-win_arm64.pyd +0 -0
  1049. scipy/sparse/csgraph/_reordering.cp311-win_arm64.lib +0 -0
  1050. scipy/sparse/csgraph/_reordering.cp311-win_arm64.pyd +0 -0
  1051. scipy/sparse/csgraph/_shortest_path.cp311-win_arm64.lib +0 -0
  1052. scipy/sparse/csgraph/_shortest_path.cp311-win_arm64.pyd +0 -0
  1053. scipy/sparse/csgraph/_tools.cp311-win_arm64.lib +0 -0
  1054. scipy/sparse/csgraph/_tools.cp311-win_arm64.pyd +0 -0
  1055. scipy/sparse/csgraph/_traversal.cp311-win_arm64.lib +0 -0
  1056. scipy/sparse/csgraph/_traversal.cp311-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.cp311-win_arm64.lib +0 -0
  1079. scipy/sparse/linalg/_dsolve/_superlu.cp311-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.cp311-win_arm64.lib +0 -0
  1089. scipy/sparse/linalg/_eigen/arpack/_arpack.cp311-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.cp311-win_arm64.lib +0 -0
  1122. scipy/sparse/linalg/_propack/_cpropack.cp311-win_arm64.pyd +0 -0
  1123. scipy/sparse/linalg/_propack/_dpropack.cp311-win_arm64.lib +0 -0
  1124. scipy/sparse/linalg/_propack/_dpropack.cp311-win_arm64.pyd +0 -0
  1125. scipy/sparse/linalg/_propack/_spropack.cp311-win_arm64.lib +0 -0
  1126. scipy/sparse/linalg/_propack/_spropack.cp311-win_arm64.pyd +0 -0
  1127. scipy/sparse/linalg/_propack/_zpropack.cp311-win_arm64.lib +0 -0
  1128. scipy/sparse/linalg/_propack/_zpropack.cp311-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.cp311-win_arm64.lib +0 -0
  1170. scipy/spatial/_ckdtree.cp311-win_arm64.pyd +0 -0
  1171. scipy/spatial/_distance_pybind.cp311-win_arm64.lib +0 -0
  1172. scipy/spatial/_distance_pybind.cp311-win_arm64.pyd +0 -0
  1173. scipy/spatial/_distance_wrap.cp311-win_arm64.lib +0 -0
  1174. scipy/spatial/_distance_wrap.cp311-win_arm64.pyd +0 -0
  1175. scipy/spatial/_geometric_slerp.py +238 -0
  1176. scipy/spatial/_hausdorff.cp311-win_arm64.lib +0 -0
  1177. scipy/spatial/_hausdorff.cp311-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.cp311-win_arm64.lib +0 -0
  1182. scipy/spatial/_qhull.cp311-win_arm64.pyd +0 -0
  1183. scipy/spatial/_qhull.pyi +213 -0
  1184. scipy/spatial/_spherical_voronoi.py +341 -0
  1185. scipy/spatial/_voronoi.cp311-win_arm64.lib +0 -0
  1186. scipy/spatial/_voronoi.cp311-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.cp311-win_arm64.lib +0 -0
  1236. scipy/spatial/transform/_rigid_transform.cp311-win_arm64.pyd +0 -0
  1237. scipy/spatial/transform/_rotation.cp311-win_arm64.lib +0 -0
  1238. scipy/spatial/transform/_rotation.cp311-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.cp311-win_arm64.lib +0 -0
  1252. scipy/special/_comb.cp311-win_arm64.pyd +0 -0
  1253. scipy/special/_ellip_harm.py +214 -0
  1254. scipy/special/_ellip_harm_2.cp311-win_arm64.lib +0 -0
  1255. scipy/special/_ellip_harm_2.cp311-win_arm64.pyd +0 -0
  1256. scipy/special/_gufuncs.cp311-win_arm64.lib +0 -0
  1257. scipy/special/_gufuncs.cp311-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.cp311-win_arm64.lib +0 -0
  1281. scipy/special/_specfun.cp311-win_arm64.pyd +0 -0
  1282. scipy/special/_special_ufuncs.cp311-win_arm64.lib +0 -0
  1283. scipy/special/_special_ufuncs.cp311-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.cp311-win_arm64.lib +0 -0
  1288. scipy/special/_test_internal.cp311-win_arm64.pyd +0 -0
  1289. scipy/special/_test_internal.pyi +9 -0
  1290. scipy/special/_testutils.py +321 -0
  1291. scipy/special/_ufuncs.cp311-win_arm64.lib +0 -0
  1292. scipy/special/_ufuncs.cp311-win_arm64.pyd +0 -0
  1293. scipy/special/_ufuncs.pyi +522 -0
  1294. scipy/special/_ufuncs.pyx +13173 -0
  1295. scipy/special/_ufuncs_cxx.cp311-win_arm64.lib +0 -0
  1296. scipy/special/_ufuncs_cxx.cp311-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.cp311-win_arm64.lib +0 -0
  1304. scipy/special/cython_special.cp311-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.cp311-win_arm64.lib +0 -0
  1376. scipy/stats/_ansari_swilk_statistics.cp311-win_arm64.pyd +0 -0
  1377. scipy/stats/_axis_nan_policy.py +692 -0
  1378. scipy/stats/_biasedurn.cp311-win_arm64.lib +0 -0
  1379. scipy/stats/_biasedurn.cp311-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.cp311-win_arm64.lib +0 -0
  1404. scipy/stats/_levy_stable/levyst.cp311-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.cp311-win_arm64.lib +0 -0
  1418. scipy/stats/_qmc_cy.cp311-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.cp311-win_arm64.lib +0 -0
  1422. scipy/stats/_qmvnt_cy.cp311-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.cp311-win_arm64.lib +0 -0
  1426. scipy/stats/_rcont/rcont.cp311-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.cp311-win_arm64.lib +0 -0
  1433. scipy/stats/_sobol.cp311-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.cp311-win_arm64.lib +0 -0
  1437. scipy/stats/_stats.cp311-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.cp311-win_arm64.lib +0 -0
  1442. scipy/stats/_stats_pythran.cp311-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.cp311-win_arm64.lib +0 -0
  1447. scipy/stats/_unuran/unuran_wrapper.cp311-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,2630 @@
1
+ from scipy._lib._array_api import (
2
+ xp_assert_equal, xp_assert_close, assert_almost_equal, assert_array_almost_equal
3
+ )
4
+ from pytest import raises as assert_raises
5
+ import pytest
6
+
7
+ from numpy import mgrid, pi, sin, poly1d
8
+ import numpy as np
9
+
10
+ from scipy.interpolate import (interp1d, interp2d, lagrange, PPoly, BPoly,
11
+ splrep, splev, splantider, splint, sproot, Akima1DInterpolator,
12
+ NdPPoly, BSpline, PchipInterpolator)
13
+
14
+ from scipy.special import poch, gamma
15
+
16
+ from scipy.interpolate import _ppoly
17
+
18
+ from scipy._lib._gcutils import assert_deallocated, IS_PYPY
19
+ from scipy._lib._testutils import _run_concurrent_barrier
20
+
21
+ from scipy.integrate import nquad
22
+
23
+ from scipy.special import binom
24
+
25
+
26
+ class TestInterp2D:
27
+ def test_interp2d(self):
28
+ y, x = mgrid[0:2:20j, 0:pi:21j]
29
+ z = sin(x+0.5*y)
30
+ with assert_raises(NotImplementedError):
31
+ interp2d(x, y, z)
32
+
33
+
34
+ class TestInterp1D:
35
+
36
+ def setup_method(self):
37
+ self.x5 = np.arange(5.)
38
+ self.x10 = np.arange(10.)
39
+ self.y10 = np.arange(10.)
40
+ self.x25 = self.x10.reshape((2,5))
41
+ self.x2 = np.arange(2.)
42
+ self.y2 = np.arange(2.)
43
+ self.x1 = np.array([0.])
44
+ self.y1 = np.array([0.])
45
+
46
+ self.y210 = np.arange(20.).reshape((2, 10))
47
+ self.y102 = np.arange(20.).reshape((10, 2))
48
+ self.y225 = np.arange(20.).reshape((2, 2, 5))
49
+ self.y25 = np.arange(10.).reshape((2, 5))
50
+ self.y235 = np.arange(30.).reshape((2, 3, 5))
51
+ self.y325 = np.arange(30.).reshape((3, 2, 5))
52
+
53
+ # Edge updated test matrix 1
54
+ # array([[ 30, 1, 2, 3, 4, 5, 6, 7, 8, -30],
55
+ # [ 30, 11, 12, 13, 14, 15, 16, 17, 18, -30]])
56
+ self.y210_edge_updated = np.arange(20.).reshape((2, 10))
57
+ self.y210_edge_updated[:, 0] = 30
58
+ self.y210_edge_updated[:, -1] = -30
59
+
60
+ # Edge updated test matrix 2
61
+ # array([[ 30, 30],
62
+ # [ 2, 3],
63
+ # [ 4, 5],
64
+ # [ 6, 7],
65
+ # [ 8, 9],
66
+ # [ 10, 11],
67
+ # [ 12, 13],
68
+ # [ 14, 15],
69
+ # [ 16, 17],
70
+ # [-30, -30]])
71
+ self.y102_edge_updated = np.arange(20.).reshape((10, 2))
72
+ self.y102_edge_updated[0, :] = 30
73
+ self.y102_edge_updated[-1, :] = -30
74
+
75
+ self.fill_value = -100.0
76
+
77
+ def test_validation(self):
78
+ # Make sure that appropriate exceptions are raised when invalid values
79
+ # are given to the constructor.
80
+
81
+ # These should all work.
82
+ for kind in ('nearest', 'nearest-up', 'zero', 'linear', 'slinear',
83
+ 'quadratic', 'cubic', 'previous', 'next'):
84
+ interp1d(self.x10, self.y10, kind=kind)
85
+ interp1d(self.x10, self.y10, kind=kind, fill_value="extrapolate")
86
+ interp1d(self.x10, self.y10, kind='linear', fill_value=(-1, 1))
87
+ interp1d(self.x10, self.y10, kind='linear',
88
+ fill_value=np.array([-1]))
89
+ interp1d(self.x10, self.y10, kind='linear',
90
+ fill_value=(-1,))
91
+ interp1d(self.x10, self.y10, kind='linear',
92
+ fill_value=-1)
93
+ interp1d(self.x10, self.y10, kind='linear',
94
+ fill_value=(-1, -1))
95
+ interp1d(self.x10, self.y10, kind=0)
96
+ interp1d(self.x10, self.y10, kind=1)
97
+ interp1d(self.x10, self.y10, kind=2)
98
+ interp1d(self.x10, self.y10, kind=3)
99
+ interp1d(self.x10, self.y210, kind='linear', axis=-1,
100
+ fill_value=(-1, -1))
101
+ interp1d(self.x2, self.y210, kind='linear', axis=0,
102
+ fill_value=np.ones(10))
103
+ interp1d(self.x2, self.y210, kind='linear', axis=0,
104
+ fill_value=(np.ones(10), np.ones(10)))
105
+ interp1d(self.x2, self.y210, kind='linear', axis=0,
106
+ fill_value=(np.ones(10), -1))
107
+
108
+ # x array must be 1D.
109
+ assert_raises(ValueError, interp1d, self.x25, self.y10)
110
+
111
+ # y array cannot be a scalar.
112
+ assert_raises(ValueError, interp1d, self.x10, np.array(0))
113
+
114
+ # Check for x and y arrays having the same length.
115
+ assert_raises(ValueError, interp1d, self.x10, self.y2)
116
+ assert_raises(ValueError, interp1d, self.x2, self.y10)
117
+ assert_raises(ValueError, interp1d, self.x10, self.y102)
118
+ interp1d(self.x10, self.y210)
119
+ interp1d(self.x10, self.y102, axis=0)
120
+
121
+ # Check for x and y having at least 1 element.
122
+ assert_raises(ValueError, interp1d, self.x1, self.y10)
123
+ assert_raises(ValueError, interp1d, self.x10, self.y1)
124
+
125
+ # Bad fill values
126
+ assert_raises(ValueError, interp1d, self.x10, self.y10, kind='linear',
127
+ fill_value=(-1, -1, -1)) # doesn't broadcast
128
+ assert_raises(ValueError, interp1d, self.x10, self.y10, kind='linear',
129
+ fill_value=[-1, -1, -1]) # doesn't broadcast
130
+ assert_raises(ValueError, interp1d, self.x10, self.y10, kind='linear',
131
+ fill_value=np.array((-1, -1, -1))) # doesn't broadcast
132
+ assert_raises(ValueError, interp1d, self.x10, self.y10, kind='linear',
133
+ fill_value=[[-1]]) # doesn't broadcast
134
+ assert_raises(ValueError, interp1d, self.x10, self.y10, kind='linear',
135
+ fill_value=[-1, -1]) # doesn't broadcast
136
+ assert_raises(ValueError, interp1d, self.x10, self.y10, kind='linear',
137
+ fill_value=np.array([])) # doesn't broadcast
138
+ assert_raises(ValueError, interp1d, self.x10, self.y10, kind='linear',
139
+ fill_value=()) # doesn't broadcast
140
+ assert_raises(ValueError, interp1d, self.x2, self.y210, kind='linear',
141
+ axis=0, fill_value=[-1, -1]) # doesn't broadcast
142
+ assert_raises(ValueError, interp1d, self.x2, self.y210, kind='linear',
143
+ axis=0, fill_value=(0., [-1, -1])) # above doesn't bc
144
+
145
+ def test_init(self):
146
+ # Check that the attributes are initialized appropriately by the
147
+ # constructor.
148
+ assert interp1d(self.x10, self.y10).copy
149
+ assert not interp1d(self.x10, self.y10, copy=False).copy
150
+ assert interp1d(self.x10, self.y10).bounds_error
151
+ assert not interp1d(self.x10, self.y10, bounds_error=False).bounds_error
152
+ assert np.isnan(interp1d(self.x10, self.y10).fill_value)
153
+ assert interp1d(self.x10, self.y10, fill_value=3.0).fill_value == 3.0
154
+ assert (interp1d(self.x10, self.y10, fill_value=(1.0, 2.0)).fill_value ==
155
+ (1.0, 2.0)
156
+ )
157
+ assert interp1d(self.x10, self.y10).axis == 0
158
+ assert interp1d(self.x10, self.y210).axis == 1
159
+ assert interp1d(self.x10, self.y102, axis=0).axis == 0
160
+ xp_assert_equal(interp1d(self.x10, self.y10).x, self.x10)
161
+ xp_assert_equal(interp1d(self.x10, self.y10).y, self.y10)
162
+ xp_assert_equal(interp1d(self.x10, self.y210).y, self.y210)
163
+
164
+ def test_assume_sorted(self):
165
+ # Check for unsorted arrays
166
+ interp10 = interp1d(self.x10, self.y10)
167
+ interp10_unsorted = interp1d(self.x10[::-1], self.y10[::-1])
168
+
169
+ assert_array_almost_equal(interp10_unsorted(self.x10), self.y10)
170
+ assert_array_almost_equal(interp10_unsorted(1.2), np.array(1.2))
171
+ assert_array_almost_equal(interp10_unsorted([2.4, 5.6, 6.0]),
172
+ interp10([2.4, 5.6, 6.0]))
173
+
174
+ # Check assume_sorted keyword (defaults to False)
175
+ interp10_assume_kw = interp1d(self.x10[::-1], self.y10[::-1],
176
+ assume_sorted=False)
177
+ assert_array_almost_equal(interp10_assume_kw(self.x10), self.y10)
178
+
179
+ interp10_assume_kw2 = interp1d(self.x10[::-1], self.y10[::-1],
180
+ assume_sorted=True)
181
+ # Should raise an error for unsorted input if assume_sorted=True
182
+ assert_raises(ValueError, interp10_assume_kw2, self.x10)
183
+
184
+ # Check that if y is a 2-D array, things are still consistent
185
+ interp10_y_2d = interp1d(self.x10, self.y210)
186
+ interp10_y_2d_unsorted = interp1d(self.x10[::-1], self.y210[:, ::-1])
187
+ assert_array_almost_equal(interp10_y_2d(self.x10),
188
+ interp10_y_2d_unsorted(self.x10))
189
+
190
+ def test_linear(self):
191
+ for kind in ['linear', 'slinear']:
192
+ self._check_linear(kind)
193
+
194
+ def _check_linear(self, kind):
195
+ # Check the actual implementation of linear interpolation.
196
+ interp10 = interp1d(self.x10, self.y10, kind=kind)
197
+ assert_array_almost_equal(interp10(self.x10), self.y10)
198
+ assert_array_almost_equal(interp10(1.2), np.array(1.2))
199
+ assert_array_almost_equal(interp10([2.4, 5.6, 6.0]),
200
+ np.array([2.4, 5.6, 6.0]))
201
+
202
+ # test fill_value="extrapolate"
203
+ extrapolator = interp1d(self.x10, self.y10, kind=kind,
204
+ fill_value='extrapolate')
205
+ xp_assert_close(extrapolator([-1., 0, 9, 11]),
206
+ np.asarray([-1.0, 0, 9, 11]), rtol=1e-14)
207
+
208
+ opts = dict(kind=kind,
209
+ fill_value='extrapolate',
210
+ bounds_error=True)
211
+ assert_raises(ValueError, interp1d, self.x10, self.y10, **opts)
212
+
213
+ def test_linear_dtypes(self):
214
+ # regression test for gh-5898, where 1D linear interpolation has been
215
+ # delegated to numpy.interp for all float dtypes, and the latter was
216
+ # not handling e.g. np.float128.
217
+ for dtyp in [np.float16,
218
+ np.float32,
219
+ np.float64,
220
+ np.longdouble]:
221
+ x = np.arange(8, dtype=dtyp)
222
+ y = x
223
+ yp = interp1d(x, y, kind='linear')(x)
224
+ assert yp.dtype == dtyp
225
+ xp_assert_close(yp, y, atol=1e-15)
226
+
227
+ # regression test for gh-14531, where 1D linear interpolation has been
228
+ # has been extended to delegate to numpy.interp for integer dtypes
229
+ x = [0, 1, 2]
230
+ y = [np.nan, 0, 1]
231
+ yp = interp1d(x, y)(x)
232
+ xp_assert_close(yp, y, atol=1e-15)
233
+
234
+ def test_slinear_dtypes(self):
235
+ # regression test for gh-7273: 1D slinear interpolation fails with
236
+ # float32 inputs
237
+ dt_r = [np.float16, np.float32, np.float64]
238
+ dt_rc = dt_r + [np.complex64, np.complex128]
239
+ spline_kinds = ['slinear', 'zero', 'quadratic', 'cubic']
240
+ for dtx in dt_r:
241
+ x = np.arange(0, 10, dtype=dtx)
242
+ for dty in dt_rc:
243
+ y = np.exp(-x/3.0).astype(dty)
244
+ for dtn in dt_r:
245
+ xnew = x.astype(dtn)
246
+ for kind in spline_kinds:
247
+ f = interp1d(x, y, kind=kind, bounds_error=False)
248
+ xp_assert_close(f(xnew), y, atol=1e-7,
249
+ check_dtype=False,
250
+ err_msg=f"{dtx}, {dty} {dtn}")
251
+
252
+ def test_cubic(self):
253
+ # Check the actual implementation of spline interpolation.
254
+ interp10 = interp1d(self.x10, self.y10, kind='cubic')
255
+ assert_array_almost_equal(interp10(self.x10), self.y10)
256
+ assert_array_almost_equal(interp10(1.2), np.array(1.2))
257
+ assert_array_almost_equal(interp10(1.5), np.array(1.5))
258
+ assert_array_almost_equal(interp10([2.4, 5.6, 6.0]),
259
+ np.array([2.4, 5.6, 6.0]),)
260
+
261
+ def test_nearest(self):
262
+ # Check the actual implementation of nearest-neighbour interpolation.
263
+ # Nearest asserts that half-integer case (1.5) rounds down to 1
264
+ interp10 = interp1d(self.x10, self.y10, kind='nearest')
265
+ assert_array_almost_equal(interp10(self.x10), self.y10)
266
+ assert_array_almost_equal(interp10(1.2), np.array(1.))
267
+ assert_array_almost_equal(interp10(1.5), np.array(1.))
268
+ assert_array_almost_equal(interp10([2.4, 5.6, 6.0]),
269
+ np.array([2., 6., 6.]),)
270
+
271
+ # test fill_value="extrapolate"
272
+ extrapolator = interp1d(self.x10, self.y10, kind='nearest',
273
+ fill_value='extrapolate')
274
+ xp_assert_close(extrapolator([-1., 0, 9, 11]),
275
+ [0.0, 0, 9, 9], rtol=1e-14)
276
+
277
+ opts = dict(kind='nearest',
278
+ fill_value='extrapolate',
279
+ bounds_error=True)
280
+ assert_raises(ValueError, interp1d, self.x10, self.y10, **opts)
281
+
282
+ def test_nearest_up(self):
283
+ # Check the actual implementation of nearest-neighbour interpolation.
284
+ # Nearest-up asserts that half-integer case (1.5) rounds up to 2
285
+ interp10 = interp1d(self.x10, self.y10, kind='nearest-up')
286
+ assert_array_almost_equal(interp10(self.x10), self.y10)
287
+ assert_array_almost_equal(interp10(1.2), np.array(1.))
288
+ assert_array_almost_equal(interp10(1.5), np.array(2.))
289
+ assert_array_almost_equal(interp10([2.4, 5.6, 6.0]),
290
+ np.array([2., 6., 6.]),)
291
+
292
+ # test fill_value="extrapolate"
293
+ extrapolator = interp1d(self.x10, self.y10, kind='nearest-up',
294
+ fill_value='extrapolate')
295
+ xp_assert_close(extrapolator([-1., 0, 9, 11]),
296
+ [0.0, 0, 9, 9], rtol=1e-14)
297
+
298
+ opts = dict(kind='nearest-up',
299
+ fill_value='extrapolate',
300
+ bounds_error=True)
301
+ assert_raises(ValueError, interp1d, self.x10, self.y10, **opts)
302
+
303
+ def test_previous(self):
304
+ # Check the actual implementation of previous interpolation.
305
+ interp10 = interp1d(self.x10, self.y10, kind='previous')
306
+ assert_array_almost_equal(interp10(self.x10), self.y10)
307
+ assert_array_almost_equal(interp10(1.2), np.array(1.))
308
+ assert_array_almost_equal(interp10(1.5), np.array(1.))
309
+ assert_array_almost_equal(interp10([2.4, 5.6, 6.0]),
310
+ np.array([2., 5., 6.]),)
311
+
312
+ # test fill_value="extrapolate"
313
+ extrapolator = interp1d(self.x10, self.y10, kind='previous',
314
+ fill_value='extrapolate')
315
+ xp_assert_close(extrapolator([-1., 0, 9, 11]),
316
+ [np.nan, 0, 9, 9], rtol=1e-14)
317
+
318
+ # Tests for gh-9591
319
+ interpolator1D = interp1d(self.x10, self.y10, kind="previous",
320
+ fill_value='extrapolate')
321
+ xp_assert_close(interpolator1D([-1, -2, 5, 8, 12, 25]),
322
+ [np.nan, np.nan, 5, 8, 9, 9])
323
+
324
+ interpolator2D = interp1d(self.x10, self.y210, kind="previous",
325
+ fill_value='extrapolate')
326
+ xp_assert_close(interpolator2D([-1, -2, 5, 8, 12, 25]),
327
+ [[np.nan, np.nan, 5, 8, 9, 9],
328
+ [np.nan, np.nan, 15, 18, 19, 19]])
329
+
330
+ interpolator2DAxis0 = interp1d(self.x10, self.y102, kind="previous",
331
+ axis=0, fill_value='extrapolate')
332
+ xp_assert_close(interpolator2DAxis0([-2, 5, 12]),
333
+ [[np.nan, np.nan],
334
+ [10, 11],
335
+ [18, 19]])
336
+
337
+ opts = dict(kind='previous',
338
+ fill_value='extrapolate',
339
+ bounds_error=True)
340
+ assert_raises(ValueError, interp1d, self.x10, self.y10, **opts)
341
+
342
+ # Tests for gh-16813
343
+ interpolator1D = interp1d([0, 1, 2],
344
+ [0, 1, -1], kind="previous",
345
+ fill_value='extrapolate',
346
+ assume_sorted=True)
347
+ xp_assert_close(interpolator1D([-2, -1, 0, 1, 2, 3, 5]),
348
+ [np.nan, np.nan, 0, 1, -1, -1, -1])
349
+
350
+ interpolator1D = interp1d([2, 0, 1], # x is not ascending
351
+ [-1, 0, 1], kind="previous",
352
+ fill_value='extrapolate',
353
+ assume_sorted=False)
354
+ xp_assert_close(interpolator1D([-2, -1, 0, 1, 2, 3, 5]),
355
+ [np.nan, np.nan, 0, 1, -1, -1, -1])
356
+
357
+ interpolator2D = interp1d(self.x10, self.y210_edge_updated,
358
+ kind="previous",
359
+ fill_value='extrapolate')
360
+ xp_assert_close(interpolator2D([-1, -2, 5, 8, 12, 25]),
361
+ [[np.nan, np.nan, 5, 8, -30, -30],
362
+ [np.nan, np.nan, 15, 18, -30, -30]])
363
+
364
+ interpolator2DAxis0 = interp1d(self.x10, self.y102_edge_updated,
365
+ kind="previous",
366
+ axis=0, fill_value='extrapolate')
367
+ xp_assert_close(interpolator2DAxis0([-2, 5, 12]),
368
+ [[np.nan, np.nan],
369
+ [10, 11],
370
+ [-30, -30]])
371
+
372
+ def test_next(self):
373
+ # Check the actual implementation of next interpolation.
374
+ interp10 = interp1d(self.x10, self.y10, kind='next')
375
+ assert_array_almost_equal(interp10(self.x10), self.y10)
376
+ assert_array_almost_equal(interp10(1.2), np.array(2.))
377
+ assert_array_almost_equal(interp10(1.5), np.array(2.))
378
+ assert_array_almost_equal(interp10([2.4, 5.6, 6.0]),
379
+ np.array([3., 6., 6.]),)
380
+
381
+ # test fill_value="extrapolate"
382
+ extrapolator = interp1d(self.x10, self.y10, kind='next',
383
+ fill_value='extrapolate')
384
+ xp_assert_close(extrapolator([-1., 0, 9, 11]),
385
+ [0, 0, 9, np.nan], rtol=1e-14)
386
+
387
+ # Tests for gh-9591
388
+ interpolator1D = interp1d(self.x10, self.y10, kind="next",
389
+ fill_value='extrapolate')
390
+ xp_assert_close(interpolator1D([-1, -2, 5, 8, 12, 25]),
391
+ [0, 0, 5, 8, np.nan, np.nan])
392
+
393
+ interpolator2D = interp1d(self.x10, self.y210, kind="next",
394
+ fill_value='extrapolate')
395
+ xp_assert_close(interpolator2D([-1, -2, 5, 8, 12, 25]),
396
+ [[0, 0, 5, 8, np.nan, np.nan],
397
+ [10, 10, 15, 18, np.nan, np.nan]])
398
+
399
+ interpolator2DAxis0 = interp1d(self.x10, self.y102, kind="next",
400
+ axis=0, fill_value='extrapolate')
401
+ xp_assert_close(interpolator2DAxis0([-2, 5, 12]),
402
+ [[0, 1],
403
+ [10, 11],
404
+ [np.nan, np.nan]])
405
+
406
+ opts = dict(kind='next',
407
+ fill_value='extrapolate',
408
+ bounds_error=True)
409
+ assert_raises(ValueError, interp1d, self.x10, self.y10, **opts)
410
+
411
+ # Tests for gh-16813
412
+ interpolator1D = interp1d([0, 1, 2],
413
+ [0, 1, -1], kind="next",
414
+ fill_value='extrapolate',
415
+ assume_sorted=True)
416
+ xp_assert_close(interpolator1D([-2, -1, 0, 1, 2, 3, 5]),
417
+ [0, 0, 0, 1, -1, np.nan, np.nan])
418
+
419
+ interpolator1D = interp1d([2, 0, 1], # x is not ascending
420
+ [-1, 0, 1], kind="next",
421
+ fill_value='extrapolate',
422
+ assume_sorted=False)
423
+ xp_assert_close(interpolator1D([-2, -1, 0, 1, 2, 3, 5]),
424
+ [0, 0, 0, 1, -1, np.nan, np.nan])
425
+
426
+ interpolator2D = interp1d(self.x10, self.y210_edge_updated,
427
+ kind="next",
428
+ fill_value='extrapolate')
429
+ xp_assert_close(interpolator2D([-1, -2, 5, 8, 12, 25]),
430
+ [[30, 30, 5, 8, np.nan, np.nan],
431
+ [30, 30, 15, 18, np.nan, np.nan]])
432
+
433
+ interpolator2DAxis0 = interp1d(self.x10, self.y102_edge_updated,
434
+ kind="next",
435
+ axis=0, fill_value='extrapolate')
436
+ xp_assert_close(interpolator2DAxis0([-2, 5, 12]),
437
+ [[30, 30],
438
+ [10, 11],
439
+ [np.nan, np.nan]])
440
+
441
+ def test_zero(self):
442
+ # Check the actual implementation of zero-order spline interpolation.
443
+ interp10 = interp1d(self.x10, self.y10, kind='zero')
444
+ assert_array_almost_equal(interp10(self.x10), self.y10)
445
+ assert_array_almost_equal(interp10(1.2), np.array(1.))
446
+ assert_array_almost_equal(interp10(1.5), np.array(1.))
447
+ assert_array_almost_equal(interp10([2.4, 5.6, 6.0]),
448
+ np.array([2., 5., 6.]))
449
+
450
+ def bounds_check_helper(self, interpolant, test_array, fail_value):
451
+ # Asserts that a ValueError is raised and that the error message
452
+ # contains the value causing this exception.
453
+ assert_raises(ValueError, interpolant, test_array)
454
+ try:
455
+ interpolant(test_array)
456
+ except ValueError as err:
457
+ assert (f"{fail_value}" in str(err))
458
+
459
+ def _bounds_check(self, kind='linear'):
460
+ # Test that our handling of out-of-bounds input is correct.
461
+ extrap10 = interp1d(self.x10, self.y10, fill_value=self.fill_value,
462
+ bounds_error=False, kind=kind)
463
+
464
+ xp_assert_equal(extrap10(11.2), np.array(self.fill_value))
465
+ xp_assert_equal(extrap10(-3.4), np.array(self.fill_value))
466
+ xp_assert_equal(extrap10([[[11.2], [-3.4], [12.6], [19.3]]]),
467
+ np.array(self.fill_value), check_shape=False)
468
+ xp_assert_equal(extrap10._check_bounds(
469
+ np.array([-1.0, 0.0, 5.0, 9.0, 11.0])),
470
+ np.array([[True, False, False, False, False],
471
+ [False, False, False, False, True]]))
472
+
473
+ raises_bounds_error = interp1d(self.x10, self.y10, bounds_error=True,
474
+ kind=kind)
475
+
476
+ self.bounds_check_helper(raises_bounds_error, -1.0, -1.0)
477
+ self.bounds_check_helper(raises_bounds_error, 11.0, 11.0)
478
+ self.bounds_check_helper(raises_bounds_error, [0.0, -1.0, 0.0], -1.0)
479
+ self.bounds_check_helper(raises_bounds_error, [0.0, 1.0, 21.0], 21.0)
480
+
481
+ raises_bounds_error([0.0, 5.0, 9.0])
482
+
483
+ def _bounds_check_int_nan_fill(self, kind='linear'):
484
+ x = np.arange(10).astype(int)
485
+ y = np.arange(10).astype(int)
486
+ c = interp1d(x, y, kind=kind, fill_value=np.nan, bounds_error=False)
487
+ yi = c(x - 1)
488
+ assert np.isnan(yi[0])
489
+ assert_array_almost_equal(yi, np.r_[np.nan, y[:-1]])
490
+
491
+ def test_bounds(self):
492
+ for kind in ('linear', 'cubic', 'nearest', 'previous', 'next',
493
+ 'slinear', 'zero', 'quadratic'):
494
+ self._bounds_check(kind)
495
+ self._bounds_check_int_nan_fill(kind)
496
+
497
+ def _check_fill_value(self, kind):
498
+ interp = interp1d(self.x10, self.y10, kind=kind,
499
+ fill_value=(-100, 100), bounds_error=False)
500
+ assert_array_almost_equal(interp(10), np.asarray(100.))
501
+ assert_array_almost_equal(interp(-10), np.asarray(-100.))
502
+ assert_array_almost_equal(interp([-10, 10]), [-100, 100])
503
+
504
+ # Proper broadcasting:
505
+ # interp along axis of length 5
506
+ # other dim=(2, 3), (3, 2), (2, 2), or (2,)
507
+
508
+ # one singleton fill_value (works for all)
509
+ for y in (self.y235, self.y325, self.y225, self.y25):
510
+ interp = interp1d(self.x5, y, kind=kind, axis=-1,
511
+ fill_value=100, bounds_error=False)
512
+ assert_array_almost_equal(interp(10), np.asarray(100.))
513
+ assert_array_almost_equal(interp(-10), np.asarray(100.))
514
+ assert_array_almost_equal(interp([-10, 10]), np.asarray(100.))
515
+
516
+ # singleton lower, singleton upper
517
+ interp = interp1d(self.x5, y, kind=kind, axis=-1,
518
+ fill_value=(-100, 100), bounds_error=False)
519
+ assert_array_almost_equal(interp(10), np.asarray(100.))
520
+ assert_array_almost_equal(interp(-10), np.asarray(-100.))
521
+ if y.ndim == 3:
522
+ result = [[[-100, 100]] * y.shape[1]] * y.shape[0]
523
+ else:
524
+ result = [[-100, 100]] * y.shape[0]
525
+ assert_array_almost_equal(interp([-10, 10]), result)
526
+
527
+ # one broadcastable (3,) fill_value
528
+ fill_value = [100, 200, 300]
529
+ for y in (self.y325, self.y225):
530
+ assert_raises(ValueError, interp1d, self.x5, y, kind=kind,
531
+ axis=-1, fill_value=fill_value, bounds_error=False)
532
+ interp = interp1d(self.x5, self.y235, kind=kind, axis=-1,
533
+ fill_value=fill_value, bounds_error=False)
534
+ assert_array_almost_equal(interp(10), [[100, 200, 300]] * 2)
535
+ assert_array_almost_equal(interp(-10), [[100, 200, 300]] * 2)
536
+ assert_array_almost_equal(interp([-10, 10]), [[[100, 100],
537
+ [200, 200],
538
+ [300, 300]]] * 2)
539
+
540
+ # one broadcastable (2,) fill_value
541
+ fill_value = [100, 200]
542
+ assert_raises(ValueError, interp1d, self.x5, self.y235, kind=kind,
543
+ axis=-1, fill_value=fill_value, bounds_error=False)
544
+ for y in (self.y225, self.y325, self.y25):
545
+ interp = interp1d(self.x5, y, kind=kind, axis=-1,
546
+ fill_value=fill_value, bounds_error=False)
547
+ result = [100, 200]
548
+ if y.ndim == 3:
549
+ result = [result] * y.shape[0]
550
+ assert_array_almost_equal(interp(10), result)
551
+ assert_array_almost_equal(interp(-10), result)
552
+ result = [[100, 100], [200, 200]]
553
+ if y.ndim == 3:
554
+ result = [result] * y.shape[0]
555
+ assert_array_almost_equal(interp([-10, 10]), result)
556
+
557
+ # broadcastable (3,) lower, singleton upper
558
+ fill_value = (np.array([-100, -200, -300]), 100)
559
+ for y in (self.y325, self.y225):
560
+ assert_raises(ValueError, interp1d, self.x5, y, kind=kind,
561
+ axis=-1, fill_value=fill_value, bounds_error=False)
562
+ interp = interp1d(self.x5, self.y235, kind=kind, axis=-1,
563
+ fill_value=fill_value, bounds_error=False)
564
+ assert_array_almost_equal(interp(10), np.asarray(100.))
565
+ assert_array_almost_equal(interp(-10), [[-100, -200, -300]] * 2)
566
+ assert_array_almost_equal(interp([-10, 10]), [[[-100, 100],
567
+ [-200, 100],
568
+ [-300, 100]]] * 2)
569
+
570
+ # broadcastable (2,) lower, singleton upper
571
+ fill_value = (np.array([-100, -200]), 100)
572
+ assert_raises(ValueError, interp1d, self.x5, self.y235, kind=kind,
573
+ axis=-1, fill_value=fill_value, bounds_error=False)
574
+ for y in (self.y225, self.y325, self.y25):
575
+ interp = interp1d(self.x5, y, kind=kind, axis=-1,
576
+ fill_value=fill_value, bounds_error=False)
577
+ assert_array_almost_equal(interp(10), np.asarray(100))
578
+ result = [-100, -200]
579
+ if y.ndim == 3:
580
+ result = [result] * y.shape[0]
581
+ assert_array_almost_equal(interp(-10), result)
582
+ result = [[-100, 100], [-200, 100]]
583
+ if y.ndim == 3:
584
+ result = [result] * y.shape[0]
585
+ assert_array_almost_equal(interp([-10, 10]), result)
586
+
587
+ # broadcastable (3,) lower, broadcastable (3,) upper
588
+ fill_value = ([-100, -200, -300], [100, 200, 300])
589
+ for y in (self.y325, self.y225):
590
+ assert_raises(ValueError, interp1d, self.x5, y, kind=kind,
591
+ axis=-1, fill_value=fill_value, bounds_error=False)
592
+ for ii in range(2): # check ndarray as well as list here
593
+ if ii == 1:
594
+ fill_value = tuple(np.array(f) for f in fill_value)
595
+ interp = interp1d(self.x5, self.y235, kind=kind, axis=-1,
596
+ fill_value=fill_value, bounds_error=False)
597
+ assert_array_almost_equal(interp(10), [[100, 200, 300]] * 2)
598
+ assert_array_almost_equal(interp(-10), [[-100, -200, -300]] * 2)
599
+ assert_array_almost_equal(interp([-10, 10]), [[[-100, 100],
600
+ [-200, 200],
601
+ [-300, 300]]] * 2)
602
+ # broadcastable (2,) lower, broadcastable (2,) upper
603
+ fill_value = ([-100, -200], [100, 200])
604
+ assert_raises(ValueError, interp1d, self.x5, self.y235, kind=kind,
605
+ axis=-1, fill_value=fill_value, bounds_error=False)
606
+ for y in (self.y325, self.y225, self.y25):
607
+ interp = interp1d(self.x5, y, kind=kind, axis=-1,
608
+ fill_value=fill_value, bounds_error=False)
609
+ result = [100, 200]
610
+ if y.ndim == 3:
611
+ result = [result] * y.shape[0]
612
+ assert_array_almost_equal(interp(10), result)
613
+ result = [-100, -200]
614
+ if y.ndim == 3:
615
+ result = [result] * y.shape[0]
616
+ assert_array_almost_equal(interp(-10), result)
617
+ result = [[-100, 100], [-200, 200]]
618
+ if y.ndim == 3:
619
+ result = [result] * y.shape[0]
620
+ assert_array_almost_equal(interp([-10, 10]), result)
621
+
622
+ # one broadcastable (2, 2) array-like
623
+ fill_value = [[100, 200], [1000, 2000]]
624
+ for y in (self.y235, self.y325, self.y25):
625
+ assert_raises(ValueError, interp1d, self.x5, y, kind=kind,
626
+ axis=-1, fill_value=fill_value, bounds_error=False)
627
+ for ii in range(2):
628
+ if ii == 1:
629
+ fill_value = np.array(fill_value)
630
+ interp = interp1d(self.x5, self.y225, kind=kind, axis=-1,
631
+ fill_value=fill_value, bounds_error=False)
632
+ assert_array_almost_equal(interp(10), [[100, 200], [1000, 2000]])
633
+ assert_array_almost_equal(interp(-10), [[100, 200], [1000, 2000]])
634
+ assert_array_almost_equal(interp([-10, 10]), [[[100, 100],
635
+ [200, 200]],
636
+ [[1000, 1000],
637
+ [2000, 2000]]])
638
+
639
+ # broadcastable (2, 2) lower, broadcastable (2, 2) upper
640
+ fill_value = ([[-100, -200], [-1000, -2000]],
641
+ [[100, 200], [1000, 2000]])
642
+ for y in (self.y235, self.y325, self.y25):
643
+ assert_raises(ValueError, interp1d, self.x5, y, kind=kind,
644
+ axis=-1, fill_value=fill_value, bounds_error=False)
645
+ for ii in range(2):
646
+ if ii == 1:
647
+ fill_value = (np.array(fill_value[0]), np.array(fill_value[1]))
648
+ interp = interp1d(self.x5, self.y225, kind=kind, axis=-1,
649
+ fill_value=fill_value, bounds_error=False)
650
+ assert_array_almost_equal(interp(10), [[100, 200], [1000, 2000]])
651
+ assert_array_almost_equal(interp(-10), [[-100, -200],
652
+ [-1000, -2000]])
653
+ assert_array_almost_equal(interp([-10, 10]), [[[-100, 100],
654
+ [-200, 200]],
655
+ [[-1000, 1000],
656
+ [-2000, 2000]]])
657
+
658
+ def test_fill_value(self):
659
+ # test that two-element fill value works
660
+ for kind in ('linear', 'nearest', 'cubic', 'slinear', 'quadratic',
661
+ 'zero', 'previous', 'next'):
662
+ self._check_fill_value(kind)
663
+
664
+ def test_fill_value_writeable(self):
665
+ # backwards compat: fill_value is a public writeable attribute
666
+ interp = interp1d(self.x10, self.y10, fill_value=123.0)
667
+ assert interp.fill_value == 123.0
668
+ interp.fill_value = 321.0
669
+ assert interp.fill_value == 321.0
670
+
671
+ def _nd_check_interp(self, kind='linear'):
672
+ # Check the behavior when the inputs and outputs are multidimensional.
673
+
674
+ # Multidimensional input.
675
+ interp10 = interp1d(self.x10, self.y10, kind=kind)
676
+ assert_array_almost_equal(interp10(np.array([[3., 5.], [2., 7.]])),
677
+ np.array([[3., 5.], [2., 7.]]))
678
+
679
+ # Scalar input -> 0-dim scalar array output
680
+ assert isinstance(interp10(1.2), np.ndarray)
681
+ assert interp10(1.2).shape == ()
682
+
683
+ # Multidimensional outputs.
684
+ interp210 = interp1d(self.x10, self.y210, kind=kind)
685
+ assert_array_almost_equal(interp210(1.), np.array([1., 11.]))
686
+ assert_array_almost_equal(interp210(np.array([1., 2.])),
687
+ np.array([[1., 2.], [11., 12.]]))
688
+
689
+ interp102 = interp1d(self.x10, self.y102, axis=0, kind=kind)
690
+ assert_array_almost_equal(interp102(1.), np.array([2.0, 3.0]))
691
+ assert_array_almost_equal(interp102(np.array([1., 3.])),
692
+ np.array([[2., 3.], [6., 7.]]))
693
+
694
+ # Both at the same time!
695
+ x_new = np.array([[3., 5.], [2., 7.]])
696
+ assert_array_almost_equal(interp210(x_new),
697
+ np.array([[[3., 5.], [2., 7.]],
698
+ [[13., 15.], [12., 17.]]]))
699
+ assert_array_almost_equal(interp102(x_new),
700
+ np.array([[[6., 7.], [10., 11.]],
701
+ [[4., 5.], [14., 15.]]]))
702
+
703
+ def _nd_check_shape(self, kind='linear'):
704
+ # Check large N-D output shape
705
+ a = [4, 5, 6, 7]
706
+ y = np.arange(np.prod(a)).reshape(*a)
707
+ for n, s in enumerate(a):
708
+ x = np.arange(s)
709
+ z = interp1d(x, y, axis=n, kind=kind)
710
+ assert_array_almost_equal(z(x), y, err_msg=kind)
711
+
712
+ x2 = np.arange(2*3*1).reshape((2,3,1)) / 12.
713
+ b = list(a)
714
+ b[n:n+1] = [2, 3, 1]
715
+ assert z(x2).shape == tuple(b), kind
716
+
717
+ def test_nd(self):
718
+ for kind in ('linear', 'cubic', 'slinear', 'quadratic', 'nearest',
719
+ 'zero', 'previous', 'next'):
720
+ self._nd_check_interp(kind)
721
+ self._nd_check_shape(kind)
722
+
723
+ def _check_complex(self, dtype=np.complex128, kind='linear'):
724
+ x = np.array([1, 2.5, 3, 3.1, 4, 6.4, 7.9, 8.0, 9.5, 10])
725
+ y = x * x ** (1 + 2j)
726
+ y = y.astype(dtype)
727
+
728
+ # simple test
729
+ c = interp1d(x, y, kind=kind)
730
+ assert_array_almost_equal(y[:-1], c(x)[:-1])
731
+
732
+ # check against interpolating real+imag separately
733
+ xi = np.linspace(1, 10, 31)
734
+ cr = interp1d(x, y.real, kind=kind)
735
+ ci = interp1d(x, y.imag, kind=kind)
736
+ assert_array_almost_equal(c(xi).real, cr(xi))
737
+ assert_array_almost_equal(c(xi).imag, ci(xi))
738
+
739
+ def test_complex(self):
740
+ for kind in ('linear', 'nearest', 'cubic', 'slinear', 'quadratic',
741
+ 'zero', 'previous', 'next'):
742
+ self._check_complex(np.complex64, kind)
743
+ self._check_complex(np.complex128, kind)
744
+
745
+ @pytest.mark.skipif(IS_PYPY, reason="Test not meaningful on PyPy")
746
+ def test_circular_refs(self):
747
+ # Test interp1d can be automatically garbage collected
748
+ x = np.linspace(0, 1)
749
+ y = np.linspace(0, 1)
750
+ # Confirm interp can be released from memory after use
751
+ with assert_deallocated(interp1d, x, y) as interp:
752
+ interp([0.1, 0.2])
753
+ del interp
754
+
755
+ def test_overflow_nearest(self):
756
+ # Test that the x range doesn't overflow when given integers as input
757
+ for kind in ('nearest', 'previous', 'next'):
758
+ x = np.array([0, 50, 127], dtype=np.int8)
759
+ ii = interp1d(x, x, kind=kind)
760
+ assert_array_almost_equal(ii(x), x)
761
+
762
+ def test_local_nans(self):
763
+ # check that for local interpolation kinds (slinear, zero) a single nan
764
+ # only affects its local neighborhood
765
+ x = np.arange(10).astype(float)
766
+ y = x.copy()
767
+ y[6] = np.nan
768
+ for kind in ('zero', 'slinear'):
769
+ ir = interp1d(x, y, kind=kind)
770
+ vals = ir([4.9, 7.0])
771
+ assert np.isfinite(vals).all()
772
+
773
+ def test_spline_nans(self):
774
+ # Backwards compat: a single nan makes the whole spline interpolation
775
+ # return nans in an array of the correct shape. And it doesn't raise,
776
+ # just quiet nans because of backcompat.
777
+ x = np.arange(8).astype(float)
778
+ y = x.copy()
779
+ yn = y.copy()
780
+ yn[3] = np.nan
781
+
782
+ for kind in ['quadratic', 'cubic']:
783
+ ir = interp1d(x, y, kind=kind)
784
+ irn = interp1d(x, yn, kind=kind)
785
+ for xnew in (6, [1, 6], [[1, 6], [3, 5]]):
786
+ xnew = np.asarray(xnew)
787
+ out, outn = ir(x), irn(x)
788
+ assert np.isnan(outn).all()
789
+ assert out.shape == outn.shape
790
+
791
+ def test_all_nans(self):
792
+ # regression test for gh-11637: interp1d core dumps with all-nan `x`
793
+ x = np.ones(10) * np.nan
794
+ y = np.arange(10)
795
+ with assert_raises(ValueError):
796
+ interp1d(x, y, kind='cubic')
797
+
798
+ def test_read_only(self):
799
+ x = np.arange(0, 10)
800
+ y = np.exp(-x / 3.0)
801
+ xnew = np.arange(0, 9, 0.1)
802
+ # Check both read-only and not read-only:
803
+ for xnew_writeable in (True, False):
804
+ xnew.flags.writeable = xnew_writeable
805
+ x.flags.writeable = False
806
+ for kind in ('linear', 'nearest', 'zero', 'slinear', 'quadratic',
807
+ 'cubic'):
808
+ f = interp1d(x, y, kind=kind)
809
+ vals = f(xnew)
810
+ assert np.isfinite(vals).all()
811
+
812
+ @pytest.mark.parametrize(
813
+ "kind", ("linear", "nearest", "nearest-up", "previous", "next")
814
+ )
815
+ def test_single_value(self, kind):
816
+ # https://github.com/scipy/scipy/issues/4043
817
+ f = interp1d([1.5], [6], kind=kind, bounds_error=False,
818
+ fill_value=(2, 10))
819
+ xp_assert_equal(f([1, 1.5, 2]), np.asarray([2.0, 6, 10]))
820
+ # check still error if bounds_error=True
821
+ f = interp1d([1.5], [6], kind=kind, bounds_error=True)
822
+ with assert_raises(ValueError, match="x_new is above"):
823
+ f(2.0)
824
+
825
+
826
+ class TestLagrange:
827
+
828
+ def test_lagrange(self):
829
+ p = poly1d([5,2,1,4,3])
830
+ xs = np.arange(len(p.coeffs))
831
+ ys = p(xs)
832
+ pl = lagrange(xs,ys)
833
+ assert_array_almost_equal(p.coeffs,pl.coeffs)
834
+
835
+
836
+ class TestAkima1DInterpolator:
837
+ def test_eval(self):
838
+ x = np.arange(0., 11.)
839
+ y = np.array([0., 2., 1., 3., 2., 6., 5.5, 5.5, 2.7, 5.1, 3.])
840
+ ak = Akima1DInterpolator(x, y)
841
+ xi = np.array([0., 0.5, 1., 1.5, 2.5, 3.5, 4.5, 5.1, 6.5, 7.2,
842
+ 8.6, 9.9, 10.])
843
+ yi = np.array([0., 1.375, 2., 1.5, 1.953125, 2.484375,
844
+ 4.1363636363636366866103344, 5.9803623910336236590978842,
845
+ 5.5067291516462386624652936, 5.2031367459745245795943447,
846
+ 4.1796554159017080820603951, 3.4110386597938129327189927,
847
+ 3.])
848
+ xp_assert_close(ak(xi), yi)
849
+
850
+ def test_eval_mod(self):
851
+ # Reference values generated with the following MATLAB code:
852
+ # format longG
853
+ # x = 0:10; y = [0. 2. 1. 3. 2. 6. 5.5 5.5 2.7 5.1 3.];
854
+ # xi = [0. 0.5 1. 1.5 2.5 3.5 4.5 5.1 6.5 7.2 8.6 9.9 10.];
855
+ # makima(x, y, xi)
856
+ x = np.arange(0., 11.)
857
+ y = np.array([0., 2., 1., 3., 2., 6., 5.5, 5.5, 2.7, 5.1, 3.])
858
+ ak = Akima1DInterpolator(x, y, method="makima")
859
+ xi = np.array([0., 0.5, 1., 1.5, 2.5, 3.5, 4.5, 5.1, 6.5, 7.2,
860
+ 8.6, 9.9, 10.])
861
+ yi = np.array([
862
+ 0.0, 1.34471153846154, 2.0, 1.44375, 1.94375, 2.51939102564103,
863
+ 4.10366931918656, 5.98501550899192, 5.51756330960439, 5.1757231914014,
864
+ 4.12326636931311, 3.32931513157895, 3.0])
865
+ xp_assert_close(ak(xi), yi)
866
+
867
+ def test_eval_2d(self):
868
+ x = np.arange(0., 11.)
869
+ y = np.array([0., 2., 1., 3., 2., 6., 5.5, 5.5, 2.7, 5.1, 3.])
870
+ y = np.column_stack((y, 2. * y))
871
+ ak = Akima1DInterpolator(x, y)
872
+ xi = np.array([0., 0.5, 1., 1.5, 2.5, 3.5, 4.5, 5.1, 6.5, 7.2,
873
+ 8.6, 9.9, 10.])
874
+ yi = np.array([0., 1.375, 2., 1.5, 1.953125, 2.484375,
875
+ 4.1363636363636366866103344,
876
+ 5.9803623910336236590978842,
877
+ 5.5067291516462386624652936,
878
+ 5.2031367459745245795943447,
879
+ 4.1796554159017080820603951,
880
+ 3.4110386597938129327189927, 3.])
881
+ yi = np.column_stack((yi, 2. * yi))
882
+ xp_assert_close(ak(xi), yi)
883
+
884
+ def test_eval_3d(self):
885
+ x = np.arange(0., 11.)
886
+ y_ = np.array([0., 2., 1., 3., 2., 6., 5.5, 5.5, 2.7, 5.1, 3.])
887
+ y = np.empty((11, 2, 2))
888
+ y[:, 0, 0] = y_
889
+ y[:, 1, 0] = 2. * y_
890
+ y[:, 0, 1] = 3. * y_
891
+ y[:, 1, 1] = 4. * y_
892
+ ak = Akima1DInterpolator(x, y)
893
+ xi = np.array([0., 0.5, 1., 1.5, 2.5, 3.5, 4.5, 5.1, 6.5, 7.2,
894
+ 8.6, 9.9, 10.])
895
+ yi = np.empty((13, 2, 2))
896
+ yi_ = np.array([0., 1.375, 2., 1.5, 1.953125, 2.484375,
897
+ 4.1363636363636366866103344,
898
+ 5.9803623910336236590978842,
899
+ 5.5067291516462386624652936,
900
+ 5.2031367459745245795943447,
901
+ 4.1796554159017080820603951,
902
+ 3.4110386597938129327189927, 3.])
903
+ yi[:, 0, 0] = yi_
904
+ yi[:, 1, 0] = 2. * yi_
905
+ yi[:, 0, 1] = 3. * yi_
906
+ yi[:, 1, 1] = 4. * yi_
907
+ xp_assert_close(ak(xi), yi)
908
+
909
+ def test_linear_interpolant_edge_case_1d(self):
910
+ x = np.array([0.0, 1.0], dtype=float)
911
+ y = np.array([0.5, 1.0])
912
+ akima = Akima1DInterpolator(x, y, axis=0, extrapolate=None)
913
+ xp_assert_close(akima(0.45), np.array(0.725))
914
+
915
+ def test_linear_interpolant_edge_case_2d(self):
916
+ x = np.array([0., 1.])
917
+ y = np.column_stack((x, 2. * x, 3. * x, 4. * x))
918
+
919
+ ak = Akima1DInterpolator(x, y)
920
+ xi = np.array([0.5, 1.])
921
+ yi = np.array([[0.5, 1., 1.5, 2. ],
922
+ [1., 2., 3., 4.]])
923
+ xp_assert_close(ak(xi), yi)
924
+
925
+ ak = Akima1DInterpolator(x, y.T, axis=1)
926
+ xp_assert_close(ak(xi), yi.T)
927
+
928
+ def test_linear_interpolant_edge_case_3d(self):
929
+ x = np.arange(0., 2.)
930
+ y_ = np.array([0., 1.])
931
+ y = np.empty((2, 2, 2))
932
+ y[:, 0, 0] = y_
933
+ y[:, 1, 0] = 2. * y_
934
+ y[:, 0, 1] = 3. * y_
935
+ y[:, 1, 1] = 4. * y_
936
+ ak = Akima1DInterpolator(x, y)
937
+ yi_ = np.array([0.5, 1.])
938
+ yi = np.empty((2, 2, 2))
939
+ yi[:, 0, 0] = yi_
940
+ yi[:, 1, 0] = 2. * yi_
941
+ yi[:, 0, 1] = 3. * yi_
942
+ yi[:, 1, 1] = 4. * yi_
943
+ xi = yi_
944
+ xp_assert_close(ak(xi), yi)
945
+
946
+ ak = Akima1DInterpolator(x, y.transpose(1, 0, 2), axis=1)
947
+ xp_assert_close(ak(xi), yi.transpose(1, 0, 2))
948
+
949
+ ak = Akima1DInterpolator(x, y.transpose(2, 1, 0), axis=2)
950
+ xp_assert_close(ak(xi), yi.transpose(2, 1, 0))
951
+
952
+
953
+ def test_degenerate_case_multidimensional(self):
954
+ # This test is for issue #5683.
955
+ x = np.array([0, 1, 2])
956
+ y = np.vstack((x, x**2)).T
957
+ ak = Akima1DInterpolator(x, y)
958
+ x_eval = np.array([0.5, 1.5])
959
+ y_eval = ak(x_eval)
960
+ xp_assert_close(y_eval, np.vstack((x_eval, x_eval**2)).T)
961
+
962
+ def test_extend(self):
963
+ x = np.arange(0., 11.)
964
+ y = np.array([0., 2., 1., 3., 2., 6., 5.5, 5.5, 2.7, 5.1, 3.])
965
+ ak = Akima1DInterpolator(x, y)
966
+ match = "Extending a 1-D Akima interpolator is not yet implemented"
967
+ with pytest.raises(NotImplementedError, match=match):
968
+ ak.extend(None, None)
969
+
970
+ def test_mod_invalid_method(self):
971
+ x = np.arange(0., 11.)
972
+ y = np.array([0., 2., 1., 3., 2., 6., 5.5, 5.5, 2.7, 5.1, 3.])
973
+ match = "`method`=invalid is unsupported."
974
+ with pytest.raises(NotImplementedError, match=match):
975
+ Akima1DInterpolator(x, y, method="invalid") # type: ignore
976
+
977
+ def test_extrapolate_attr(self):
978
+ #
979
+ x = np.linspace(-5, 5, 11)
980
+ y = x**2
981
+ x_ext = np.linspace(-10, 10, 17)
982
+ y_ext = x_ext**2
983
+ # Testing all extrapolate cases.
984
+ ak_true = Akima1DInterpolator(x, y, extrapolate=True)
985
+ ak_false = Akima1DInterpolator(x, y, extrapolate=False)
986
+ ak_none = Akima1DInterpolator(x, y, extrapolate=None)
987
+ # None should default to False; extrapolated points are NaN.
988
+ xp_assert_close(ak_false(x_ext), ak_none(x_ext), atol=1e-15)
989
+ xp_assert_equal(ak_false(x_ext)[0:4], np.full(4, np.nan))
990
+ xp_assert_equal(ak_false(x_ext)[-4:-1], np.full(3, np.nan))
991
+ # Extrapolation on call and attribute should be equal.
992
+ xp_assert_close(ak_false(x_ext, extrapolate=True), ak_true(x_ext), atol=1e-15)
993
+ # Testing extrapoation to actual function.
994
+ xp_assert_close(y_ext, ak_true(x_ext), atol=1e-15)
995
+
996
+
997
+ @pytest.mark.parametrize("method", [Akima1DInterpolator, PchipInterpolator])
998
+ def test_complex(method):
999
+ # Complex-valued data deprecated
1000
+ x = np.arange(0., 11.)
1001
+ y = np.array([0., 2., 1., 3., 2., 6., 5.5, 5.5, 2.7, 5.1, 3.])
1002
+ y = y - 2j*y
1003
+ msg = "real values"
1004
+ with pytest.raises(ValueError, match=msg):
1005
+ method(x, y)
1006
+
1007
+ def test_concurrency(self):
1008
+ # Check that no segfaults appear with concurrent access to Akima1D
1009
+ x = np.linspace(-5, 5, 11)
1010
+ y = x**2
1011
+ x_ext = np.linspace(-10, 10, 17)
1012
+ ak = Akima1DInterpolator(x, y, extrapolate=True)
1013
+
1014
+ def worker_fn(_, ak, x_ext):
1015
+ ak(x_ext)
1016
+
1017
+ _run_concurrent_barrier(10, worker_fn, ak, x_ext)
1018
+
1019
+
1020
+ class TestPPolyCommon:
1021
+ # test basic functionality for PPoly and BPoly
1022
+ def test_sort_check(self):
1023
+ c = np.array([[1, 4], [2, 5], [3, 6]])
1024
+ x = np.array([0, 1, 0.5])
1025
+ assert_raises(ValueError, PPoly, c, x)
1026
+ assert_raises(ValueError, BPoly, c, x)
1027
+
1028
+ def test_ctor_c(self):
1029
+ # wrong shape: `c` must be at least 2D
1030
+ with assert_raises(ValueError):
1031
+ PPoly([1, 2], [0, 1])
1032
+
1033
+ def test_extend(self):
1034
+ # Test adding new points to the piecewise polynomial
1035
+ np.random.seed(1234)
1036
+
1037
+ order = 3
1038
+ x = np.unique(np.r_[0, 10 * np.random.rand(30), 10])
1039
+ c = 2*np.random.rand(order+1, len(x)-1, 2, 3) - 1
1040
+
1041
+ for cls in (PPoly, BPoly):
1042
+ pp = cls(c[:,:9], x[:10])
1043
+ pp.extend(c[:,9:], x[10:])
1044
+
1045
+ pp2 = cls(c[:, 10:], x[10:])
1046
+ pp2.extend(c[:, :10], x[:10])
1047
+
1048
+ pp3 = cls(c, x)
1049
+
1050
+ xp_assert_equal(pp.c, pp3.c)
1051
+ xp_assert_equal(pp.x, pp3.x)
1052
+ xp_assert_equal(pp2.c, pp3.c)
1053
+ xp_assert_equal(pp2.x, pp3.x)
1054
+
1055
+ def test_extend_diff_orders(self):
1056
+ # Test extending polynomial with different order one
1057
+ np.random.seed(1234)
1058
+
1059
+ x = np.linspace(0, 1, 6)
1060
+ c = np.random.rand(2, 5)
1061
+
1062
+ x2 = np.linspace(1, 2, 6)
1063
+ c2 = np.random.rand(4, 5)
1064
+
1065
+ for cls in (PPoly, BPoly):
1066
+ pp1 = cls(c, x)
1067
+ pp2 = cls(c2, x2)
1068
+
1069
+ pp_comb = cls(c, x)
1070
+ pp_comb.extend(c2, x2[1:])
1071
+
1072
+ # NB. doesn't match to pp1 at the endpoint, because pp1 is not
1073
+ # continuous with pp2 as we took random coefs.
1074
+ xi1 = np.linspace(0, 1, 300, endpoint=False)
1075
+ xi2 = np.linspace(1, 2, 300)
1076
+
1077
+ xp_assert_close(pp1(xi1), pp_comb(xi1))
1078
+ xp_assert_close(pp2(xi2), pp_comb(xi2))
1079
+
1080
+ def test_extend_descending(self):
1081
+ np.random.seed(0)
1082
+
1083
+ order = 3
1084
+ x = np.sort(np.random.uniform(0, 10, 20))
1085
+ c = np.random.rand(order + 1, x.shape[0] - 1, 2, 3)
1086
+
1087
+ for cls in (PPoly, BPoly):
1088
+ p = cls(c, x)
1089
+
1090
+ p1 = cls(c[:, :9], x[:10])
1091
+ p1.extend(c[:, 9:], x[10:])
1092
+
1093
+ p2 = cls(c[:, 10:], x[10:])
1094
+ p2.extend(c[:, :10], x[:10])
1095
+
1096
+ xp_assert_equal(p1.c, p.c)
1097
+ xp_assert_equal(p1.x, p.x)
1098
+ xp_assert_equal(p2.c, p.c)
1099
+ xp_assert_equal(p2.x, p.x)
1100
+
1101
+ def test_shape(self):
1102
+ np.random.seed(1234)
1103
+ c = np.random.rand(8, 12, 5, 6, 7)
1104
+ x = np.sort(np.random.rand(13))
1105
+ xp = np.random.rand(3, 4)
1106
+ for cls in (PPoly, BPoly):
1107
+ p = cls(c, x)
1108
+ assert p(xp).shape == (3, 4, 5, 6, 7)
1109
+
1110
+ # 'scalars'
1111
+ for cls in (PPoly, BPoly):
1112
+ p = cls(c[..., 0, 0, 0], x)
1113
+
1114
+ assert np.shape(p(0.5)) == ()
1115
+ assert np.shape(p(np.array(0.5))) == ()
1116
+
1117
+ assert_raises(ValueError, p, np.array([[0.1, 0.2], [0.4]], dtype=object))
1118
+
1119
+ def test_concurrency(self):
1120
+ # Check that no segfaults appear with concurrent access to BPoly, PPoly
1121
+ c = np.random.rand(8, 12, 5, 6, 7)
1122
+ x = np.sort(np.random.rand(13))
1123
+ xp = np.random.rand(3, 4)
1124
+
1125
+ for cls in (PPoly, BPoly):
1126
+ interp = cls(c, x)
1127
+
1128
+ def worker_fn(_, interp, xp):
1129
+ interp(xp)
1130
+
1131
+ _run_concurrent_barrier(10, worker_fn, interp, xp)
1132
+
1133
+
1134
+ def test_complex_coef(self):
1135
+ np.random.seed(12345)
1136
+ x = np.sort(np.random.random(13))
1137
+ c = np.random.random((8, 12)) * (1. + 0.3j)
1138
+ c_re, c_im = c.real, c.imag
1139
+ xp = np.random.random(5)
1140
+ for cls in (PPoly, BPoly):
1141
+ p, p_re, p_im = cls(c, x), cls(c_re, x), cls(c_im, x)
1142
+ for nu in [0, 1, 2]:
1143
+ xp_assert_close(p(xp, nu).real, p_re(xp, nu))
1144
+ xp_assert_close(p(xp, nu).imag, p_im(xp, nu))
1145
+
1146
+ def test_axis(self):
1147
+ np.random.seed(12345)
1148
+ c = np.random.rand(3, 4, 5, 6, 7, 8)
1149
+ c_s = c.shape
1150
+ xp = np.random.random((1, 2))
1151
+ for axis in (0, 1, 2, 3):
1152
+ m = c.shape[axis+1]
1153
+ x = np.sort(np.random.rand(m+1))
1154
+ for cls in (PPoly, BPoly):
1155
+ p = cls(c, x, axis=axis)
1156
+ assert p.c.shape == c_s[axis:axis+2] + c_s[:axis] + c_s[axis+2:]
1157
+ res = p(xp)
1158
+ targ_shape = c_s[:axis] + xp.shape + c_s[2+axis:]
1159
+ assert res.shape == targ_shape
1160
+
1161
+ # deriv/antideriv does not drop the axis
1162
+ for p1 in [cls(c, x, axis=axis).derivative(),
1163
+ cls(c, x, axis=axis).derivative(2),
1164
+ cls(c, x, axis=axis).antiderivative(),
1165
+ cls(c, x, axis=axis).antiderivative(2)]:
1166
+ assert p1.axis == p.axis
1167
+
1168
+ # c array needs two axes for the coefficients and intervals, so
1169
+ # 0 <= axis < c.ndim-1; raise otherwise
1170
+ for axis in (-1, 4, 5, 6):
1171
+ for cls in (BPoly, PPoly):
1172
+ assert_raises(ValueError, cls, **dict(c=c, x=x, axis=axis))
1173
+
1174
+
1175
+ class TestPolySubclassing:
1176
+ class P(PPoly):
1177
+ pass
1178
+
1179
+ class B(BPoly):
1180
+ pass
1181
+
1182
+ def _make_polynomials(self):
1183
+ np.random.seed(1234)
1184
+ x = np.sort(np.random.random(3))
1185
+ c = np.random.random((4, 2))
1186
+ return self.P(c, x), self.B(c, x)
1187
+
1188
+ def test_derivative(self):
1189
+ pp, bp = self._make_polynomials()
1190
+ for p in (pp, bp):
1191
+ pd = p.derivative()
1192
+ assert p.__class__ == pd.__class__
1193
+
1194
+ ppa = pp.antiderivative()
1195
+ assert pp.__class__ == ppa.__class__
1196
+
1197
+ def test_from_spline(self):
1198
+ np.random.seed(1234)
1199
+ x = np.sort(np.r_[0, np.random.rand(11), 1])
1200
+ y = np.random.rand(len(x))
1201
+
1202
+ spl = splrep(x, y, s=0)
1203
+ pp = self.P.from_spline(spl)
1204
+ assert pp.__class__ == self.P
1205
+
1206
+ def test_conversions(self):
1207
+ pp, bp = self._make_polynomials()
1208
+
1209
+ pp1 = self.P.from_bernstein_basis(bp)
1210
+ assert pp1.__class__ == self.P
1211
+
1212
+ bp1 = self.B.from_power_basis(pp)
1213
+ assert bp1.__class__ == self.B
1214
+
1215
+ def test_from_derivatives(self):
1216
+ x = [0, 1, 2]
1217
+ y = [[1], [2], [3]]
1218
+ bp = self.B.from_derivatives(x, y)
1219
+ assert bp.__class__ == self.B
1220
+
1221
+
1222
+ class TestPPoly:
1223
+ def test_simple(self):
1224
+ c = np.array([[1, 4], [2, 5], [3, 6]])
1225
+ x = np.array([0, 0.5, 1])
1226
+ p = PPoly(c, x)
1227
+ xp_assert_close(p(0.3), np.asarray(1*0.3**2 + 2*0.3 + 3))
1228
+ xp_assert_close(p(0.7), np.asarray(4*(0.7-0.5)**2 + 5*(0.7-0.5) + 6))
1229
+
1230
+ def test_periodic(self):
1231
+ c = np.array([[1, 4], [2, 5], [3, 6]])
1232
+ x = np.array([0, 0.5, 1])
1233
+ p = PPoly(c, x, extrapolate='periodic')
1234
+
1235
+ xp_assert_close(p(1.3),
1236
+ np.asarray(1 * 0.3 ** 2 + 2 * 0.3 + 3))
1237
+ xp_assert_close(p(-0.3),
1238
+ np.asarray(4 * (0.7 - 0.5) ** 2 + 5 * (0.7 - 0.5) + 6))
1239
+
1240
+ xp_assert_close(p(1.3, 1), np.asarray(2 * 0.3 + 2))
1241
+ xp_assert_close(p(-0.3, 1), np.asarray(8 * (0.7 - 0.5) + 5))
1242
+
1243
+ def test_read_only(self):
1244
+ c = np.array([[1, 4], [2, 5], [3, 6]])
1245
+ x = np.array([0, 0.5, 1])
1246
+ xnew = np.array([0, 0.1, 0.2])
1247
+ PPoly(c, x, extrapolate='periodic')
1248
+
1249
+ for writeable in (True, False):
1250
+ x.flags.writeable = writeable
1251
+ c.flags.writeable = writeable
1252
+ f = PPoly(c, x)
1253
+ vals = f(xnew)
1254
+ assert np.isfinite(vals).all()
1255
+
1256
+ def test_descending(self):
1257
+ def binom_matrix(power):
1258
+ n = np.arange(power + 1).reshape(-1, 1)
1259
+ k = np.arange(power + 1)
1260
+ B = binom(n, k)
1261
+ return B[::-1, ::-1]
1262
+
1263
+ rng = np.random.RandomState(0)
1264
+
1265
+ power = 3
1266
+ for m in [10, 20, 30]:
1267
+ x = np.sort(rng.uniform(0, 10, m + 1))
1268
+ ca = rng.uniform(-2, 2, size=(power + 1, m))
1269
+
1270
+ h = np.diff(x)
1271
+ h_powers = h[None, :] ** np.arange(power + 1)[::-1, None]
1272
+ B = binom_matrix(power)
1273
+ cap = ca * h_powers
1274
+ cdp = np.dot(B.T, cap)
1275
+ cd = cdp / h_powers
1276
+
1277
+ pa = PPoly(ca, x, extrapolate=True)
1278
+ pd = PPoly(cd[:, ::-1], x[::-1], extrapolate=True)
1279
+
1280
+ x_test = rng.uniform(-10, 20, 100)
1281
+ xp_assert_close(pa(x_test), pd(x_test), rtol=1e-13)
1282
+ xp_assert_close(pa(x_test, 1), pd(x_test, 1), rtol=1e-13)
1283
+
1284
+ pa_d = pa.derivative()
1285
+ pd_d = pd.derivative()
1286
+
1287
+ xp_assert_close(pa_d(x_test), pd_d(x_test), rtol=1e-13)
1288
+
1289
+ # Antiderivatives won't be equal because fixing continuity is
1290
+ # done in the reverse order, but surely the differences should be
1291
+ # equal.
1292
+ pa_i = pa.antiderivative()
1293
+ pd_i = pd.antiderivative()
1294
+ for a, b in rng.uniform(-10, 20, (5, 2)):
1295
+ int_a = pa.integrate(a, b)
1296
+ int_d = pd.integrate(a, b)
1297
+ xp_assert_close(int_a, int_d, rtol=1e-13)
1298
+ xp_assert_close(pa_i(b) - pa_i(a), pd_i(b) - pd_i(a),
1299
+ rtol=1e-13)
1300
+
1301
+ roots_d = pd.roots()
1302
+ roots_a = pa.roots()
1303
+ xp_assert_close(roots_a, np.sort(roots_d), rtol=1e-12)
1304
+
1305
+ def test_multi_shape(self):
1306
+ c = np.random.rand(6, 2, 1, 2, 3)
1307
+ x = np.array([0, 0.5, 1])
1308
+ p = PPoly(c, x)
1309
+ assert p.x.shape == x.shape
1310
+ assert p.c.shape == c.shape
1311
+ assert p(0.3).shape == c.shape[2:]
1312
+
1313
+ assert p(np.random.rand(5, 6)).shape == (5, 6) + c.shape[2:]
1314
+
1315
+ dp = p.derivative()
1316
+ assert dp.c.shape == (5, 2, 1, 2, 3)
1317
+ ip = p.antiderivative()
1318
+ assert ip.c.shape == (7, 2, 1, 2, 3)
1319
+
1320
+ def test_construct_fast(self):
1321
+ np.random.seed(1234)
1322
+ c = np.array([[1, 4], [2, 5], [3, 6]], dtype=float)
1323
+ x = np.array([0, 0.5, 1])
1324
+ p = PPoly.construct_fast(c, x)
1325
+ xp_assert_close(p(0.3), np.asarray(1*0.3**2 + 2*0.3 + 3))
1326
+ xp_assert_close(p(0.7), np.asarray(4*(0.7-0.5)**2 + 5*(0.7-0.5) + 6))
1327
+
1328
+ def test_vs_alternative_implementations(self):
1329
+ rng = np.random.RandomState(1234)
1330
+ c = rng.rand(3, 12, 22)
1331
+ x = np.sort(np.r_[0, rng.rand(11), 1])
1332
+
1333
+ p = PPoly(c, x)
1334
+
1335
+ xp = np.r_[0.3, 0.5, 0.33, 0.6]
1336
+ expected = _ppoly_eval_1(c, x, xp)
1337
+ xp_assert_close(p(xp), expected)
1338
+
1339
+ expected = _ppoly_eval_2(c[:,:,0], x, xp)
1340
+ xp_assert_close(p(xp)[:, 0], expected)
1341
+
1342
+ def test_from_spline(self):
1343
+ rng = np.random.RandomState(1234)
1344
+ x = np.sort(np.r_[0, rng.rand(11), 1])
1345
+ y = rng.rand(len(x))
1346
+
1347
+ spl = splrep(x, y, s=0)
1348
+ pp = PPoly.from_spline(spl)
1349
+
1350
+ xi = np.linspace(0, 1, 200)
1351
+ xp_assert_close(pp(xi), splev(xi, spl))
1352
+
1353
+ # make sure .from_spline accepts BSpline objects
1354
+ b = BSpline(*spl)
1355
+ ppp = PPoly.from_spline(b)
1356
+ xp_assert_close(ppp(xi), b(xi))
1357
+
1358
+ # BSpline's extrapolate attribute propagates unless overridden
1359
+ t, c, k = spl
1360
+ for extrap in (None, True, False):
1361
+ b = BSpline(t, c, k, extrapolate=extrap)
1362
+ p = PPoly.from_spline(b)
1363
+ assert p.extrapolate == b.extrapolate
1364
+
1365
+ def test_derivative_simple(self):
1366
+ np.random.seed(1234)
1367
+ c = np.array([[4, 3, 2, 1]]).T
1368
+ dc = np.array([[3*4, 2*3, 2]]).T
1369
+ ddc = np.array([[2*3*4, 1*2*3]]).T
1370
+ x = np.array([0, 1])
1371
+
1372
+ pp = PPoly(c, x)
1373
+ dpp = PPoly(dc, x)
1374
+ ddpp = PPoly(ddc, x)
1375
+
1376
+ xp_assert_close(pp.derivative().c, dpp.c)
1377
+ xp_assert_close(pp.derivative(2).c, ddpp.c)
1378
+
1379
+ def test_derivative_eval(self):
1380
+ rng = np.random.RandomState(1234)
1381
+ x = np.sort(np.r_[0, rng.rand(11), 1])
1382
+ y = rng.rand(len(x))
1383
+
1384
+ spl = splrep(x, y, s=0)
1385
+ pp = PPoly.from_spline(spl)
1386
+
1387
+ xi = np.linspace(0, 1, 200)
1388
+ for dx in range(0, 3):
1389
+ xp_assert_close(pp(xi, dx), splev(xi, spl, dx))
1390
+
1391
+ def test_derivative(self):
1392
+ rng = np.random.RandomState(1234)
1393
+ x = np.sort(np.r_[0, rng.rand(11), 1])
1394
+ y = rng.rand(len(x))
1395
+
1396
+ spl = splrep(x, y, s=0, k=5)
1397
+ pp = PPoly.from_spline(spl)
1398
+
1399
+ xi = np.linspace(0, 1, 200)
1400
+ for dx in range(0, 10):
1401
+ xp_assert_close(pp(xi, dx), pp.derivative(dx)(xi), err_msg=f"dx={dx}")
1402
+
1403
+ def test_antiderivative_of_constant(self):
1404
+ # https://github.com/scipy/scipy/issues/4216
1405
+ p = PPoly([[1.]], [0, 1])
1406
+ xp_assert_equal(p.antiderivative().c, PPoly([[1], [0]], [0, 1]).c)
1407
+ xp_assert_equal(p.antiderivative().x, PPoly([[1], [0]], [0, 1]).x)
1408
+
1409
+ def test_antiderivative_regression_4355(self):
1410
+ # https://github.com/scipy/scipy/issues/4355
1411
+ p = PPoly([[1., 0.5]], [0, 1, 2])
1412
+ q = p.antiderivative()
1413
+ xp_assert_equal(q.c, [[1, 0.5], [0, 1]])
1414
+ xp_assert_equal(q.x, [0.0, 1, 2])
1415
+ xp_assert_close(p.integrate(0, 2), np.asarray(1.5))
1416
+ xp_assert_close(np.asarray(q(2) - q(0)),
1417
+ np.asarray(1.5))
1418
+
1419
+ def test_antiderivative_simple(self):
1420
+ np.random.seed(1234)
1421
+ # [ p1(x) = 3*x**2 + 2*x + 1,
1422
+ # p2(x) = 1.6875]
1423
+ c = np.array([[3, 2, 1], [0, 0, 1.6875]]).T
1424
+ # [ pp1(x) = x**3 + x**2 + x,
1425
+ # pp2(x) = 1.6875*(x - 0.25) + pp1(0.25)]
1426
+ ic = np.array([[1, 1, 1, 0], [0, 0, 1.6875, 0.328125]]).T
1427
+ # [ ppp1(x) = (1/4)*x**4 + (1/3)*x**3 + (1/2)*x**2,
1428
+ # ppp2(x) = (1.6875/2)*(x - 0.25)**2 + pp1(0.25)*x + ppp1(0.25)]
1429
+ iic = np.array([[1/4, 1/3, 1/2, 0, 0],
1430
+ [0, 0, 1.6875/2, 0.328125, 0.037434895833333336]]).T
1431
+ x = np.array([0, 0.25, 1])
1432
+
1433
+ pp = PPoly(c, x)
1434
+ ipp = pp.antiderivative()
1435
+ iipp = pp.antiderivative(2)
1436
+ iipp2 = ipp.antiderivative()
1437
+
1438
+ xp_assert_close(ipp.x, x)
1439
+ xp_assert_close(ipp.c.T, ic.T)
1440
+ xp_assert_close(iipp.c.T, iic.T)
1441
+ xp_assert_close(iipp2.c.T, iic.T)
1442
+
1443
+ def test_antiderivative_vs_derivative(self):
1444
+ rng = np.random.RandomState(1234)
1445
+ x = np.linspace(0, 1, 30)**2
1446
+ y = rng.rand(len(x))
1447
+ spl = splrep(x, y, s=0, k=5)
1448
+ pp = PPoly.from_spline(spl)
1449
+
1450
+ for dx in range(0, 10):
1451
+ ipp = pp.antiderivative(dx)
1452
+
1453
+ # check that derivative is inverse op
1454
+ pp2 = ipp.derivative(dx)
1455
+ xp_assert_close(pp.c, pp2.c)
1456
+
1457
+ # check continuity
1458
+ for k in range(dx):
1459
+ pp2 = ipp.derivative(k)
1460
+
1461
+ r = 1e-13
1462
+ endpoint = r*pp2.x[:-1] + (1 - r)*pp2.x[1:]
1463
+
1464
+ xp_assert_close(
1465
+ pp2(pp2.x[1:]), pp2(endpoint), rtol=1e-7, err_msg=f"dx={dx} k={k}"
1466
+ )
1467
+
1468
+ def test_antiderivative_vs_spline(self):
1469
+ rng = np.random.RandomState(1234)
1470
+ x = np.sort(np.r_[0, rng.rand(11), 1])
1471
+ y = rng.rand(len(x))
1472
+
1473
+ spl = splrep(x, y, s=0, k=5)
1474
+ pp = PPoly.from_spline(spl)
1475
+
1476
+ for dx in range(0, 10):
1477
+ pp2 = pp.antiderivative(dx)
1478
+ spl2 = splantider(spl, dx)
1479
+
1480
+ xi = np.linspace(0, 1, 200)
1481
+ xp_assert_close(pp2(xi), splev(xi, spl2),
1482
+ rtol=1e-7)
1483
+
1484
+ def test_antiderivative_continuity(self):
1485
+ c = np.array([[2, 1, 2, 2], [2, 1, 3, 3]]).T
1486
+ x = np.array([0, 0.5, 1])
1487
+
1488
+ p = PPoly(c, x)
1489
+ ip = p.antiderivative()
1490
+
1491
+ # check continuity
1492
+ xp_assert_close(ip(0.5 - 1e-9), ip(0.5 + 1e-9), rtol=1e-8)
1493
+
1494
+ # check that only lowest order coefficients were changed
1495
+ p2 = ip.derivative()
1496
+ xp_assert_close(p2.c, p.c)
1497
+
1498
+ def test_integrate(self):
1499
+ rng = np.random.RandomState(1234)
1500
+ x = np.sort(np.r_[0, rng.rand(11), 1])
1501
+ y = rng.rand(len(x))
1502
+
1503
+ spl = splrep(x, y, s=0, k=5)
1504
+ pp = PPoly.from_spline(spl)
1505
+
1506
+ a, b = 0.3, 0.9
1507
+ ig = pp.integrate(a, b)
1508
+
1509
+ ipp = pp.antiderivative()
1510
+ xp_assert_close(ig, ipp(b) - ipp(a), check_0d=False)
1511
+ xp_assert_close(ig, splint(a, b, spl), check_0d=False)
1512
+
1513
+ a, b = -0.3, 0.9
1514
+ ig = pp.integrate(a, b, extrapolate=True)
1515
+ xp_assert_close(ig, ipp(b) - ipp(a), check_0d=False)
1516
+
1517
+ assert np.isnan(pp.integrate(a, b, extrapolate=False)).all()
1518
+
1519
+ def test_integrate_readonly(self):
1520
+ x = np.array([1, 2, 4])
1521
+ c = np.array([[0., 0.], [-1., -1.], [2., -0.], [1., 2.]])
1522
+
1523
+ for writeable in (True, False):
1524
+ x.flags.writeable = writeable
1525
+
1526
+ P = PPoly(c, x)
1527
+ vals = P.integrate(1, 4)
1528
+
1529
+ assert np.isfinite(vals).all()
1530
+
1531
+ def test_integrate_periodic(self):
1532
+ x = np.array([1, 2, 4])
1533
+ c = np.array([[0., 0.], [-1., -1.], [2., -0.], [1., 2.]])
1534
+
1535
+ P = PPoly(c, x, extrapolate='periodic')
1536
+ I = P.antiderivative()
1537
+
1538
+ period_int = np.asarray(I(4) - I(1))
1539
+
1540
+ xp_assert_close(P.integrate(1, 4), period_int)
1541
+ xp_assert_close(P.integrate(-10, -7), period_int)
1542
+ xp_assert_close(P.integrate(-10, -4), np.asarray(2 * period_int))
1543
+
1544
+ xp_assert_close(P.integrate(1.5, 2.5),
1545
+ np.asarray(I(2.5) - I(1.5)))
1546
+ xp_assert_close(P.integrate(3.5, 5),
1547
+ np.asarray(I(2) - I(1) + I(4) - I(3.5)))
1548
+ xp_assert_close(P.integrate(3.5 + 12, 5 + 12),
1549
+ np.asarray(I(2) - I(1) + I(4) - I(3.5)))
1550
+ xp_assert_close(P.integrate(3.5, 5 + 12),
1551
+ np.asarray(I(2) - I(1) + I(4) - I(3.5) + 4 * period_int))
1552
+ xp_assert_close(P.integrate(0, -1),
1553
+ np.asarray(I(2) - I(3)))
1554
+ xp_assert_close(P.integrate(-9, -10),
1555
+ np.asarray(I(2) - I(3)))
1556
+ xp_assert_close(P.integrate(0, -10),
1557
+ np.asarray(I(2) - I(3) - 3 * period_int))
1558
+
1559
+ def test_roots(self):
1560
+ x = np.linspace(0, 1, 31)**2
1561
+ y = np.sin(30*x)
1562
+
1563
+ spl = splrep(x, y, s=0, k=3)
1564
+ pp = PPoly.from_spline(spl)
1565
+
1566
+ r = pp.roots()
1567
+ r = r[(r >= 0 - 1e-15) & (r <= 1 + 1e-15)]
1568
+ xp_assert_close(r, sproot(spl), atol=1e-15)
1569
+
1570
+ def test_roots_idzero(self):
1571
+ # Roots for piecewise polynomials with identically zero
1572
+ # sections.
1573
+ c = np.array([[-1, 0.25], [0, 0], [-1, 0.25]]).T
1574
+ x = np.array([0, 0.4, 0.6, 1.0])
1575
+
1576
+ pp = PPoly(c, x)
1577
+ xp_assert_equal(pp.roots(),
1578
+ [0.25, 0.4, np.nan, 0.6 + 0.25])
1579
+
1580
+ # ditto for p.solve(const) with sections identically equal const
1581
+ const = 2.
1582
+ c1 = c.copy()
1583
+ c1[1, :] += const
1584
+ pp1 = PPoly(c1, x)
1585
+
1586
+ xp_assert_equal(pp1.solve(const),
1587
+ [0.25, 0.4, np.nan, 0.6 + 0.25])
1588
+
1589
+ def test_roots_all_zero(self):
1590
+ # test the code path for the polynomial being identically zero everywhere
1591
+ c = [[0], [0]]
1592
+ x = [0, 1]
1593
+ p = PPoly(c, x)
1594
+ xp_assert_equal(p.roots(), [0, np.nan])
1595
+ xp_assert_equal(p.solve(0), [0, np.nan])
1596
+ xp_assert_equal(p.solve(1), [])
1597
+
1598
+ c = [[0, 0], [0, 0]]
1599
+ x = [0, 1, 2]
1600
+ p = PPoly(c, x)
1601
+ xp_assert_equal(p.roots(), [0, np.nan, 1, np.nan])
1602
+ xp_assert_equal(p.solve(0), [0, np.nan, 1, np.nan])
1603
+ xp_assert_equal(p.solve(1), [])
1604
+
1605
+ def test_roots_repeated(self):
1606
+ # Check roots repeated in multiple sections are reported only
1607
+ # once.
1608
+
1609
+ # [(x + 1)**2 - 1, -x**2] ; x == 0 is a repeated root
1610
+ c = np.array([[1, 0, -1], [-1, 0, 0]]).T
1611
+ x = np.array([-1, 0, 1])
1612
+
1613
+ pp = PPoly(c, x)
1614
+ xp_assert_equal(pp.roots(), np.asarray([-2.0, 0.0]))
1615
+ xp_assert_equal(pp.roots(extrapolate=False), np.asarray([0.0]))
1616
+
1617
+ def test_roots_discont(self):
1618
+ # Check that a discontinuity across zero is reported as root
1619
+ c = np.array([[1], [-1]]).T
1620
+ x = np.array([0, 0.5, 1])
1621
+ pp = PPoly(c, x)
1622
+ xp_assert_equal(pp.roots(), np.asarray([0.5]))
1623
+ xp_assert_equal(pp.roots(discontinuity=False), np.asarray([]))
1624
+
1625
+ # ditto for a discontinuity across y:
1626
+ xp_assert_equal(pp.solve(0.5), np.asarray([0.5]))
1627
+ xp_assert_equal(pp.solve(0.5, discontinuity=False), np.asarray([]))
1628
+
1629
+ xp_assert_equal(pp.solve(1.5), np.asarray([]))
1630
+ xp_assert_equal(pp.solve(1.5, discontinuity=False), np.asarray([]))
1631
+
1632
+ def test_roots_random(self):
1633
+ # Check high-order polynomials with random coefficients
1634
+ rng = np.random.RandomState(1234)
1635
+
1636
+ num = 0
1637
+
1638
+ for extrapolate in (True, False):
1639
+ for order in range(0, 20):
1640
+ x = np.unique(np.r_[0, 10 * rng.rand(30), 10])
1641
+ c = 2*rng.rand(order+1, len(x)-1, 2, 3) - 1
1642
+
1643
+ pp = PPoly(c, x)
1644
+ for y in [0, rng.random()]:
1645
+ r = pp.solve(y, discontinuity=False, extrapolate=extrapolate)
1646
+
1647
+ for i in range(2):
1648
+ for j in range(3):
1649
+ rr = r[i,j]
1650
+ if rr.size > 0:
1651
+ # Check that the reported roots indeed are roots
1652
+ num += rr.size
1653
+ val = pp(rr, extrapolate=extrapolate)[:,i,j]
1654
+ cmpval = pp(rr, nu=1,
1655
+ extrapolate=extrapolate)[:,i,j]
1656
+ msg = f"({extrapolate!r}) r = {repr(rr)}"
1657
+ xp_assert_close((val-y) / cmpval, np.asarray(0.0),
1658
+ atol=1e-7,
1659
+ err_msg=msg, check_shape=False)
1660
+
1661
+ # Check that we checked a number of roots
1662
+ assert num > 100, repr(num)
1663
+
1664
+ def test_roots_croots(self):
1665
+ # Test the complex root finding algorithm
1666
+ rng = np.random.RandomState(1234)
1667
+
1668
+ for k in range(1, 15):
1669
+ c = rng.rand(k, 1, 130)
1670
+
1671
+ if k == 3:
1672
+ # add a case with zero discriminant
1673
+ c[:,0,0] = 1, 2, 1
1674
+
1675
+ for y in [0, rng.random()]:
1676
+ w = np.empty(c.shape, dtype=complex)
1677
+ _ppoly._croots_poly1(c, w, y)
1678
+
1679
+ if k == 1:
1680
+ assert np.isnan(w).all()
1681
+ continue
1682
+
1683
+ res = -y
1684
+ cres = 0
1685
+ for i in range(k):
1686
+ res += c[i,None] * w**(k-1-i)
1687
+ cres += abs(c[i,None] * w**(k-1-i))
1688
+ with np.errstate(invalid='ignore'):
1689
+ res /= cres
1690
+ res = res.ravel()
1691
+ res = res[~np.isnan(res)]
1692
+ xp_assert_close(res, np.zeros_like(res), atol=1e-10)
1693
+
1694
+ def test_extrapolate_attr(self):
1695
+ # [ 1 - x**2 ]
1696
+ c = np.array([[-1, 0, 1]]).T
1697
+ x = np.array([0, 1])
1698
+
1699
+ for extrapolate in [True, False, None]:
1700
+ pp = PPoly(c, x, extrapolate=extrapolate)
1701
+ pp_d = pp.derivative()
1702
+ pp_i = pp.antiderivative()
1703
+
1704
+ if extrapolate is False:
1705
+ assert np.isnan(pp([-0.1, 1.1])).all()
1706
+ assert np.isnan(pp_i([-0.1, 1.1])).all()
1707
+ assert np.isnan(pp_d([-0.1, 1.1])).all()
1708
+ assert pp.roots() == [1]
1709
+ else:
1710
+ xp_assert_close(pp([-0.1, 1.1]), [1-0.1**2, 1-1.1**2])
1711
+ assert not np.isnan(pp_i([-0.1, 1.1])).any()
1712
+ assert not np.isnan(pp_d([-0.1, 1.1])).any()
1713
+ xp_assert_close(pp.roots(), np.asarray([1.0, -1.0]))
1714
+
1715
+
1716
+ class TestBPoly:
1717
+ def test_simple(self):
1718
+ x = [0, 1]
1719
+ c = [[3]]
1720
+ bp = BPoly(c, x)
1721
+ xp_assert_close(bp(0.1), np.asarray(3.))
1722
+
1723
+ def test_simple2(self):
1724
+ x = [0, 1]
1725
+ c = [[3], [1]]
1726
+ bp = BPoly(c, x) # 3*(1-x) + 1*x
1727
+ xp_assert_close(bp(0.1), np.asarray(3*0.9 + 1.*0.1))
1728
+
1729
+ def test_simple3(self):
1730
+ x = [0, 1]
1731
+ c = [[3], [1], [4]]
1732
+ bp = BPoly(c, x) # 3 * (1-x)**2 + 2 * x (1-x) + 4 * x**2
1733
+ xp_assert_close(bp(0.2),
1734
+ np.asarray(3 * 0.8*0.8 + 1 * 2*0.2*0.8 + 4 * 0.2*0.2))
1735
+
1736
+ def test_simple4(self):
1737
+ x = [0, 1]
1738
+ c = [[1], [1], [1], [2]]
1739
+ bp = BPoly(c, x)
1740
+ xp_assert_close(bp(0.3),
1741
+ np.asarray( 0.7**3 +
1742
+ 3 * 0.7**2 * 0.3 +
1743
+ 3 * 0.7 * 0.3**2 +
1744
+ 2 * 0.3**3)
1745
+ )
1746
+
1747
+ def test_simple5(self):
1748
+ x = [0, 1]
1749
+ c = [[1], [1], [8], [2], [1]]
1750
+ bp = BPoly(c, x)
1751
+ xp_assert_close(bp(0.3),
1752
+ np.asarray( 0.7**4 +
1753
+ 4 * 0.7**3 * 0.3 +
1754
+ 8 * 6 * 0.7**2 * 0.3**2 +
1755
+ 2 * 4 * 0.7 * 0.3**3 +
1756
+ 0.3**4)
1757
+ )
1758
+
1759
+ def test_periodic(self):
1760
+ x = [0, 1, 3]
1761
+ c = [[3, 0], [0, 0], [0, 2]]
1762
+ # [3*(1-x)**2, 2*((x-1)/2)**2]
1763
+ bp = BPoly(c, x, extrapolate='periodic')
1764
+
1765
+ xp_assert_close(bp(3.4), np.asarray(3 * 0.6**2))
1766
+ xp_assert_close(bp(-1.3), np.asarray(2 * (0.7/2)**2))
1767
+
1768
+ xp_assert_close(bp(3.4, 1), np.asarray(-6 * 0.6))
1769
+ xp_assert_close(bp(-1.3, 1), np.asarray(2 * (0.7/2)))
1770
+
1771
+ def test_descending(self):
1772
+ rng = np.random.RandomState(0)
1773
+
1774
+ power = 3
1775
+ for m in [10, 20, 30]:
1776
+ x = np.sort(rng.uniform(0, 10, m + 1))
1777
+ ca = rng.uniform(-0.1, 0.1, size=(power + 1, m))
1778
+ # We need only to flip coefficients to get it right!
1779
+ cd = ca[::-1].copy()
1780
+
1781
+ pa = BPoly(ca, x, extrapolate=True)
1782
+ pd = BPoly(cd[:, ::-1], x[::-1], extrapolate=True)
1783
+
1784
+ x_test = rng.uniform(-10, 20, 100)
1785
+ xp_assert_close(pa(x_test), pd(x_test), rtol=1e-13)
1786
+ xp_assert_close(pa(x_test, 1), pd(x_test, 1), rtol=1e-13)
1787
+
1788
+ pa_d = pa.derivative()
1789
+ pd_d = pd.derivative()
1790
+
1791
+ xp_assert_close(pa_d(x_test), pd_d(x_test), rtol=1e-13)
1792
+
1793
+ # Antiderivatives won't be equal because fixing continuity is
1794
+ # done in the reverse order, but surely the differences should be
1795
+ # equal.
1796
+ pa_i = pa.antiderivative()
1797
+ pd_i = pd.antiderivative()
1798
+ for a, b in rng.uniform(-10, 20, (5, 2)):
1799
+ int_a = pa.integrate(a, b)
1800
+ int_d = pd.integrate(a, b)
1801
+ xp_assert_close(int_a, int_d, rtol=1e-12)
1802
+ xp_assert_close(pa_i(b) - pa_i(a), pd_i(b) - pd_i(a),
1803
+ rtol=1e-12)
1804
+
1805
+ def test_multi_shape(self):
1806
+ rng = np.random.RandomState(1234)
1807
+ c = rng.rand(6, 2, 1, 2, 3)
1808
+ x = np.array([0, 0.5, 1])
1809
+ p = BPoly(c, x)
1810
+ assert p.x.shape == x.shape
1811
+ assert p.c.shape == c.shape
1812
+ assert p(0.3).shape == c.shape[2:]
1813
+ assert p(rng.rand(5, 6)).shape == (5, 6) + c.shape[2:]
1814
+
1815
+ dp = p.derivative()
1816
+ assert dp.c.shape == (5, 2, 1, 2, 3)
1817
+
1818
+ def test_interval_length(self):
1819
+ x = [0, 2]
1820
+ c = [[3], [1], [4]]
1821
+ bp = BPoly(c, x)
1822
+ xval = 0.1
1823
+ s = xval / 2 # s = (x - xa) / (xb - xa)
1824
+ xp_assert_close(bp(xval),
1825
+ np.asarray(3 * (1-s)*(1-s) + 1 * 2*s*(1-s) + 4 * s*s)
1826
+ )
1827
+
1828
+ def test_two_intervals(self):
1829
+ x = [0, 1, 3]
1830
+ c = [[3, 0], [0, 0], [0, 2]]
1831
+ bp = BPoly(c, x) # [3*(1-x)**2, 2*((x-1)/2)**2]
1832
+
1833
+ xp_assert_close(bp(0.4), np.asarray(3 * 0.6*0.6))
1834
+ xp_assert_close(bp(1.7), np.asarray(2 * (0.7/2)**2))
1835
+
1836
+ def test_extrapolate_attr(self):
1837
+ x = [0, 2]
1838
+ c = [[3], [1], [4]]
1839
+ bp = BPoly(c, x)
1840
+
1841
+ for extrapolate in (True, False, None):
1842
+ bp = BPoly(c, x, extrapolate=extrapolate)
1843
+ bp_d = bp.derivative()
1844
+ if extrapolate is False:
1845
+ assert np.isnan(bp([-0.1, 2.1])).all()
1846
+ assert np.isnan(bp_d([-0.1, 2.1])).all()
1847
+ else:
1848
+ assert not np.isnan(bp([-0.1, 2.1])).any()
1849
+ assert not np.isnan(bp_d([-0.1, 2.1])).any()
1850
+
1851
+
1852
+ class TestBPolyCalculus:
1853
+ def test_derivative(self):
1854
+ x = [0, 1, 3]
1855
+ c = [[3, 0], [0, 0], [0, 2]]
1856
+ bp = BPoly(c, x) # [3*(1-x)**2, 2*((x-1)/2)**2]
1857
+ bp_der = bp.derivative()
1858
+ xp_assert_close(bp_der(0.4), np.asarray(-6*(0.6)))
1859
+ xp_assert_close(bp_der(1.7), np.asarray(0.7))
1860
+
1861
+ # derivatives in-place
1862
+ xp_assert_close(np.asarray([bp(0.4, nu) for nu in [1, 2, 3]]),
1863
+ np.asarray([-6*(1-0.4), 6., 0.])
1864
+ )
1865
+ xp_assert_close(np.asarray([bp(1.7, nu) for nu in [1, 2, 3]]),
1866
+ np.asarray([0.7, 1., 0])
1867
+ )
1868
+
1869
+ def test_derivative_ppoly(self):
1870
+ # make sure it's consistent w/ power basis
1871
+ rng = np.random.RandomState(1234)
1872
+ m, k = 5, 8 # number of intervals, order
1873
+ x = np.sort(rng.random(m))
1874
+ c = rng.random((k, m-1))
1875
+ bp = BPoly(c, x)
1876
+ pp = PPoly.from_bernstein_basis(bp)
1877
+
1878
+ for d in range(k):
1879
+ bp = bp.derivative()
1880
+ pp = pp.derivative()
1881
+ xp = np.linspace(x[0], x[-1], 21)
1882
+ xp_assert_close(bp(xp), pp(xp))
1883
+
1884
+ def test_deriv_inplace(self):
1885
+ rng = np.random.RandomState(1234)
1886
+ m, k = 5, 8 # number of intervals, order
1887
+ x = np.sort(rng.random(m))
1888
+ c = rng.random((k, m-1))
1889
+
1890
+ # test both real and complex coefficients
1891
+ for cc in [c.copy(), c*(1. + 2.j)]:
1892
+ bp = BPoly(cc, x)
1893
+ xp = np.linspace(x[0], x[-1], 21)
1894
+ for i in range(k):
1895
+ xp_assert_close(bp(xp, i), bp.derivative(i)(xp))
1896
+
1897
+ def test_antiderivative_simple(self):
1898
+ # f(x) = x for x \in [0, 1),
1899
+ # (x-1)/2 for x \in [1, 3]
1900
+ #
1901
+ # antiderivative is then
1902
+ # F(x) = x**2 / 2 for x \in [0, 1),
1903
+ # 0.5*x*(x/2 - 1) + A for x \in [1, 3]
1904
+ # where A = 3/4 for continuity at x = 1.
1905
+ x = [0, 1, 3]
1906
+ c = [[0, 0], [1, 1]]
1907
+
1908
+ bp = BPoly(c, x)
1909
+ bi = bp.antiderivative()
1910
+
1911
+ xx = np.linspace(0, 3, 11)
1912
+ xp_assert_close(bi(xx),
1913
+ np.where(xx < 1, xx**2 / 2.,
1914
+ 0.5 * xx * (xx/2. - 1) + 3./4),
1915
+ atol=1e-12, rtol=1e-12)
1916
+
1917
+ def test_der_antider(self):
1918
+ rng = np.random.RandomState(1234)
1919
+ x = np.sort(rng.random(11))
1920
+ c = rng.random((4, 10, 2, 3))
1921
+ bp = BPoly(c, x)
1922
+
1923
+ xx = np.linspace(x[0], x[-1], 100)
1924
+ xp_assert_close(bp.antiderivative().derivative()(xx),
1925
+ bp(xx), atol=1e-12, rtol=1e-12)
1926
+
1927
+ def test_antider_ppoly(self):
1928
+ rng = np.random.RandomState(1234)
1929
+ x = np.sort(rng.random(11))
1930
+ c = rng.random((4, 10, 2, 3))
1931
+ bp = BPoly(c, x)
1932
+ pp = PPoly.from_bernstein_basis(bp)
1933
+
1934
+ xx = np.linspace(x[0], x[-1], 10)
1935
+
1936
+ xp_assert_close(bp.antiderivative(2)(xx),
1937
+ pp.antiderivative(2)(xx), atol=1e-12, rtol=1e-12)
1938
+
1939
+ def test_antider_continuous(self):
1940
+ rng = np.random.RandomState(1234)
1941
+ x = np.sort(rng.random(11))
1942
+ c = rng.random((4, 10))
1943
+ bp = BPoly(c, x).antiderivative()
1944
+
1945
+ xx = bp.x[1:-1]
1946
+ xp_assert_close(bp(xx - 1e-14),
1947
+ bp(xx + 1e-14), atol=1e-12, rtol=1e-12)
1948
+
1949
+ def test_integrate(self):
1950
+ rng = np.random.RandomState(1234)
1951
+ x = np.sort(rng.random(11))
1952
+ c = rng.random((4, 10))
1953
+ bp = BPoly(c, x)
1954
+ pp = PPoly.from_bernstein_basis(bp)
1955
+ xp_assert_close(bp.integrate(0, 1),
1956
+ pp.integrate(0, 1), atol=1e-12, rtol=1e-12, check_0d=False)
1957
+
1958
+ def test_integrate_extrap(self):
1959
+ c = [[1]]
1960
+ x = [0, 1]
1961
+ b = BPoly(c, x)
1962
+
1963
+ # default is extrapolate=True
1964
+ xp_assert_close(b.integrate(0, 2), np.asarray(2.),
1965
+ atol=1e-14, check_0d=False)
1966
+
1967
+ # .integrate argument overrides self.extrapolate
1968
+ b1 = BPoly(c, x, extrapolate=False)
1969
+ assert np.isnan(b1.integrate(0, 2))
1970
+ xp_assert_close(b1.integrate(0, 2, extrapolate=True),
1971
+ np.asarray(2.), atol=1e-14, check_0d=False)
1972
+
1973
+ def test_integrate_periodic(self):
1974
+ x = np.array([1, 2, 4])
1975
+ c = np.array([[0., 0.], [-1., -1.], [2., -0.], [1., 2.]])
1976
+
1977
+ P = BPoly.from_power_basis(PPoly(c, x), extrapolate='periodic')
1978
+ I = P.antiderivative()
1979
+
1980
+ period_int = I(4) - I(1)
1981
+
1982
+ xp_assert_close(P.integrate(1, 4), period_int) #, check_0d=False)
1983
+ xp_assert_close(P.integrate(-10, -7), period_int)
1984
+ xp_assert_close(P.integrate(-10, -4), 2 * period_int)
1985
+
1986
+ xp_assert_close(P.integrate(1.5, 2.5), I(2.5) - I(1.5))
1987
+ xp_assert_close(P.integrate(3.5, 5), I(2) - I(1) + I(4) - I(3.5))
1988
+ xp_assert_close(P.integrate(3.5 + 12, 5 + 12),
1989
+ I(2) - I(1) + I(4) - I(3.5))
1990
+ xp_assert_close(P.integrate(3.5, 5 + 12),
1991
+ I(2) - I(1) + I(4) - I(3.5) + 4 * period_int)
1992
+
1993
+ xp_assert_close(P.integrate(0, -1), I(2) - I(3))
1994
+ xp_assert_close(P.integrate(-9, -10), I(2) - I(3))
1995
+ xp_assert_close(P.integrate(0, -10), I(2) - I(3) - 3 * period_int)
1996
+
1997
+ def test_antider_neg(self):
1998
+ # .derivative(-nu) ==> .andiderivative(nu) and vice versa
1999
+ c = [[1]]
2000
+ x = [0, 1]
2001
+ b = BPoly(c, x)
2002
+
2003
+ xx = np.linspace(0, 1, 21)
2004
+
2005
+ xp_assert_close(b.derivative(-1)(xx), b.antiderivative()(xx),
2006
+ atol=1e-12, rtol=1e-12)
2007
+ xp_assert_close(b.derivative(1)(xx), b.antiderivative(-1)(xx),
2008
+ atol=1e-12, rtol=1e-12)
2009
+
2010
+
2011
+ class TestPolyConversions:
2012
+ def test_bp_from_pp(self):
2013
+ x = [0, 1, 3]
2014
+ c = [[3, 2], [1, 8], [4, 3]]
2015
+ pp = PPoly(c, x)
2016
+ bp = BPoly.from_power_basis(pp)
2017
+ pp1 = PPoly.from_bernstein_basis(bp)
2018
+
2019
+ xp = [0.1, 1.4]
2020
+ xp_assert_close(pp(xp), bp(xp))
2021
+ xp_assert_close(pp(xp), pp1(xp))
2022
+
2023
+ def test_bp_from_pp_random(self):
2024
+ rng = np.random.RandomState(1234)
2025
+ m, k = 5, 8 # number of intervals, order
2026
+ x = np.sort(rng.random(m))
2027
+ c = rng.random((k, m-1))
2028
+ pp = PPoly(c, x)
2029
+ bp = BPoly.from_power_basis(pp)
2030
+ pp1 = PPoly.from_bernstein_basis(bp)
2031
+
2032
+ xp = np.linspace(x[0], x[-1], 21)
2033
+ xp_assert_close(pp(xp), bp(xp))
2034
+ xp_assert_close(pp(xp), pp1(xp))
2035
+
2036
+ def test_pp_from_bp(self):
2037
+ x = [0, 1, 3]
2038
+ c = [[3, 3], [1, 1], [4, 2]]
2039
+ bp = BPoly(c, x)
2040
+ pp = PPoly.from_bernstein_basis(bp)
2041
+ bp1 = BPoly.from_power_basis(pp)
2042
+
2043
+ xp = [0.1, 1.4]
2044
+ xp_assert_close(bp(xp), pp(xp))
2045
+ xp_assert_close(bp(xp), bp1(xp))
2046
+
2047
+ def test_broken_conversions(self):
2048
+ # regression test for gh-10597: from_power_basis only accepts PPoly etc.
2049
+ x = [0, 1, 3]
2050
+ c = [[3, 3], [1, 1], [4, 2]]
2051
+ pp = PPoly(c, x)
2052
+ with assert_raises(TypeError):
2053
+ PPoly.from_bernstein_basis(pp)
2054
+
2055
+ bp = BPoly(c, x)
2056
+ with assert_raises(TypeError):
2057
+ BPoly.from_power_basis(bp)
2058
+
2059
+
2060
+ class TestBPolyFromDerivatives:
2061
+ def test_make_poly_1(self):
2062
+ c1 = BPoly._construct_from_derivatives(0, 1, [2], [3])
2063
+ xp_assert_close(c1, [2., 3.])
2064
+
2065
+ def test_make_poly_2(self):
2066
+ c1 = BPoly._construct_from_derivatives(0, 1, [1, 0], [1])
2067
+ xp_assert_close(c1, [1., 1., 1.])
2068
+
2069
+ # f'(0) = 3
2070
+ c2 = BPoly._construct_from_derivatives(0, 1, [2, 3], [1])
2071
+ xp_assert_close(c2, [2., 7./2, 1.])
2072
+
2073
+ # f'(1) = 3
2074
+ c3 = BPoly._construct_from_derivatives(0, 1, [2], [1, 3])
2075
+ xp_assert_close(c3, [2., -0.5, 1.])
2076
+
2077
+ def test_make_poly_3(self):
2078
+ # f'(0)=2, f''(0)=3
2079
+ c1 = BPoly._construct_from_derivatives(0, 1, [1, 2, 3], [4])
2080
+ xp_assert_close(c1, [1., 5./3, 17./6, 4.])
2081
+
2082
+ # f'(1)=2, f''(1)=3
2083
+ c2 = BPoly._construct_from_derivatives(0, 1, [1], [4, 2, 3])
2084
+ xp_assert_close(c2, [1., 19./6, 10./3, 4.])
2085
+
2086
+ # f'(0)=2, f'(1)=3
2087
+ c3 = BPoly._construct_from_derivatives(0, 1, [1, 2], [4, 3])
2088
+ xp_assert_close(c3, [1., 5./3, 3., 4.])
2089
+
2090
+ def test_make_poly_12(self):
2091
+ rng = np.random.RandomState(12345)
2092
+ ya = np.r_[0, rng.random(5)]
2093
+ yb = np.r_[0, rng.random(5)]
2094
+
2095
+ c = BPoly._construct_from_derivatives(0, 1, ya, yb)
2096
+ pp = BPoly(c[:, None], [0, 1])
2097
+ for j in range(6):
2098
+ xp_assert_close(pp(0.), ya[j], check_0d=False)
2099
+ xp_assert_close(pp(1.), yb[j], check_0d=False)
2100
+ pp = pp.derivative()
2101
+
2102
+ def test_raise_degree(self):
2103
+ rng = np.random.RandomState(12345)
2104
+ x = [0, 1]
2105
+ k, d = 8, 5
2106
+ c = rng.random((k, 1, 2, 3, 4))
2107
+ bp = BPoly(c, x)
2108
+
2109
+ c1 = BPoly._raise_degree(c, d)
2110
+ bp1 = BPoly(c1, x)
2111
+
2112
+ xp = np.linspace(0, 1, 11)
2113
+ xp_assert_close(bp(xp), bp1(xp))
2114
+
2115
+ def test_xi_yi(self):
2116
+ assert_raises(ValueError, BPoly.from_derivatives, [0, 1], [0])
2117
+
2118
+ def test_coords_order(self):
2119
+ xi = [0, 0, 1]
2120
+ yi = [[0], [0], [0]]
2121
+ assert_raises(ValueError, BPoly.from_derivatives, xi, yi)
2122
+
2123
+ def test_zeros(self):
2124
+ xi = [0, 1, 2, 3]
2125
+ yi = [[0, 0], [0], [0, 0], [0, 0]] # NB: will have to raise the degree
2126
+ pp = BPoly.from_derivatives(xi, yi)
2127
+ assert pp.c.shape == (4, 3)
2128
+
2129
+ ppd = pp.derivative()
2130
+ for xp in [0., 0.1, 1., 1.1, 1.9, 2., 2.5]:
2131
+ xp_assert_close(pp(xp), np.asarray(0.0))
2132
+ xp_assert_close(ppd(xp), np.asarray(0.0))
2133
+
2134
+
2135
+ def _make_random_mk(self, m, k):
2136
+ # k derivatives at each breakpoint
2137
+ rng = np.random.RandomState(1234)
2138
+ xi = np.asarray([1. * j**2 for j in range(m+1)])
2139
+ yi = [rng.random(k) for j in range(m+1)]
2140
+ return xi, yi
2141
+
2142
+ def test_random_12(self):
2143
+ m, k = 5, 12
2144
+ xi, yi = self._make_random_mk(m, k)
2145
+ pp = BPoly.from_derivatives(xi, yi)
2146
+
2147
+ for order in range(k//2):
2148
+ xp_assert_close(pp(xi), [yy[order] for yy in yi])
2149
+ pp = pp.derivative()
2150
+
2151
+ def test_order_zero(self):
2152
+ m, k = 5, 12
2153
+ xi, yi = self._make_random_mk(m, k)
2154
+ assert_raises(ValueError, BPoly.from_derivatives,
2155
+ **dict(xi=xi, yi=yi, orders=0))
2156
+
2157
+ def test_orders_too_high(self):
2158
+ m, k = 5, 12
2159
+ xi, yi = self._make_random_mk(m, k)
2160
+
2161
+ BPoly.from_derivatives(xi, yi, orders=2*k-1) # this is still ok
2162
+ assert_raises(ValueError, BPoly.from_derivatives, # but this is not
2163
+ **dict(xi=xi, yi=yi, orders=2*k))
2164
+
2165
+ def test_orders_global(self):
2166
+ m, k = 5, 12
2167
+ xi, yi = self._make_random_mk(m, k)
2168
+
2169
+ # ok, this is confusing. Local polynomials will be of the order 5
2170
+ # which means that up to the 2nd derivatives will be used at each point
2171
+ order = 5
2172
+ pp = BPoly.from_derivatives(xi, yi, orders=order)
2173
+
2174
+ for j in range(order//2+1):
2175
+ xp_assert_close(pp(xi[1:-1] - 1e-12), pp(xi[1:-1] + 1e-12))
2176
+ pp = pp.derivative()
2177
+ assert not np.allclose(pp(xi[1:-1] - 1e-12), pp(xi[1:-1] + 1e-12))
2178
+
2179
+ # now repeat with `order` being even: on each interval, it uses
2180
+ # order//2 'derivatives' @ the right-hand endpoint and
2181
+ # order//2+1 @ 'derivatives' the left-hand endpoint
2182
+ order = 6
2183
+ pp = BPoly.from_derivatives(xi, yi, orders=order)
2184
+ for j in range(order//2):
2185
+ xp_assert_close(pp(xi[1:-1] - 1e-12), pp(xi[1:-1] + 1e-12))
2186
+ pp = pp.derivative()
2187
+ assert not np.allclose(pp(xi[1:-1] - 1e-12), pp(xi[1:-1] + 1e-12))
2188
+
2189
+ def test_orders_local(self):
2190
+ m, k = 7, 12
2191
+ xi, yi = self._make_random_mk(m, k)
2192
+
2193
+ orders = [o + 1 for o in range(m)]
2194
+ for i, x in enumerate(xi[1:-1]):
2195
+ pp = BPoly.from_derivatives(xi, yi, orders=orders)
2196
+ for j in range(orders[i] // 2 + 1):
2197
+ xp_assert_close(pp(x - 1e-12), pp(x + 1e-12))
2198
+ pp = pp.derivative()
2199
+ assert not np.allclose(pp(x - 1e-12), pp(x + 1e-12))
2200
+
2201
+ def test_yi_trailing_dims(self):
2202
+ rng = np.random.RandomState(1234)
2203
+ m, k = 7, 5
2204
+ xi = np.sort(rng.random(m+1))
2205
+ yi = rng.random((m+1, k, 6, 7, 8))
2206
+ pp = BPoly.from_derivatives(xi, yi)
2207
+ assert pp.c.shape == (2*k, m, 6, 7, 8)
2208
+
2209
+ def test_gh_5430(self):
2210
+ # At least one of these raises an error unless gh-5430 is
2211
+ # fixed. In py2k an int is implemented using a C long, so
2212
+ # which one fails depends on your system. In py3k there is only
2213
+ # one arbitrary precision integer type, so both should fail.
2214
+ orders = np.int32(1)
2215
+ p = BPoly.from_derivatives([0, 1], [[0], [0]], orders=orders)
2216
+ assert_almost_equal(p(0), np.asarray(0))
2217
+ orders = np.int64(1)
2218
+ p = BPoly.from_derivatives([0, 1], [[0], [0]], orders=orders)
2219
+ assert_almost_equal(p(0), np.asarray(0))
2220
+ orders = 1
2221
+ # This worked before; make sure it still works
2222
+ p = BPoly.from_derivatives([0, 1], [[0], [0]], orders=orders)
2223
+ assert_almost_equal(p(0), np.asarray(0))
2224
+ orders = 1
2225
+
2226
+
2227
+ class TestNdPPoly:
2228
+ def test_simple_1d(self):
2229
+ rng = np.random.RandomState(1234)
2230
+
2231
+ c = rng.rand(4, 5)
2232
+ x = np.linspace(0, 1, 5+1)
2233
+
2234
+ xi = rng.rand(200)
2235
+
2236
+ p = NdPPoly(c, (x,))
2237
+ v1 = p((xi,))
2238
+
2239
+ v2 = _ppoly_eval_1(c[:,:,None], x, xi).ravel()
2240
+ xp_assert_close(v1, v2)
2241
+
2242
+ def test_simple_2d(self):
2243
+ rng = np.random.RandomState(1234)
2244
+
2245
+ c = rng.rand(4, 5, 6, 7)
2246
+ x = np.linspace(0, 1, 6+1)
2247
+ y = np.linspace(0, 1, 7+1)**2
2248
+
2249
+ xi = rng.rand(200)
2250
+ yi = rng.rand(200)
2251
+
2252
+ v1 = np.empty([len(xi), 1], dtype=c.dtype)
2253
+ v1.fill(np.nan)
2254
+ _ppoly.evaluate_nd(c.reshape(4*5, 6*7, 1),
2255
+ (x, y),
2256
+ np.array([4, 5], dtype=np.intc),
2257
+ np.c_[xi, yi],
2258
+ np.array([0, 0], dtype=np.intc),
2259
+ 1,
2260
+ v1)
2261
+ v1 = v1.ravel()
2262
+ v2 = _ppoly2d_eval(c, (x, y), xi, yi)
2263
+ xp_assert_close(v1, v2)
2264
+
2265
+ p = NdPPoly(c, (x, y))
2266
+ for nu in (None, (0, 0), (0, 1), (1, 0), (2, 3), (9, 2)):
2267
+ v1 = p(np.c_[xi, yi], nu=nu)
2268
+ v2 = _ppoly2d_eval(c, (x, y), xi, yi, nu=nu)
2269
+ xp_assert_close(v1, v2, err_msg=repr(nu))
2270
+
2271
+ def test_simple_3d(self):
2272
+ rng = np.random.RandomState(1234)
2273
+
2274
+ c = rng.rand(4, 5, 6, 7, 8, 9)
2275
+ x = np.linspace(0, 1, 7+1)
2276
+ y = np.linspace(0, 1, 8+1)**2
2277
+ z = np.linspace(0, 1, 9+1)**3
2278
+
2279
+ xi = rng.rand(40)
2280
+ yi = rng.rand(40)
2281
+ zi = rng.rand(40)
2282
+
2283
+ p = NdPPoly(c, (x, y, z))
2284
+
2285
+ for nu in (None, (0, 0, 0), (0, 1, 0), (1, 0, 0), (2, 3, 0),
2286
+ (6, 0, 2)):
2287
+ v1 = p((xi, yi, zi), nu=nu)
2288
+ v2 = _ppoly3d_eval(c, (x, y, z), xi, yi, zi, nu=nu)
2289
+ xp_assert_close(v1, v2, err_msg=repr(nu))
2290
+
2291
+ def test_simple_4d(self):
2292
+ rng = np.random.RandomState(1234)
2293
+
2294
+ c = rng.rand(4, 5, 6, 7, 8, 9, 10, 11)
2295
+ x = np.linspace(0, 1, 8+1)
2296
+ y = np.linspace(0, 1, 9+1)**2
2297
+ z = np.linspace(0, 1, 10+1)**3
2298
+ u = np.linspace(0, 1, 11+1)**4
2299
+
2300
+ xi = rng.rand(20)
2301
+ yi = rng.rand(20)
2302
+ zi = rng.rand(20)
2303
+ ui = rng.rand(20)
2304
+
2305
+ p = NdPPoly(c, (x, y, z, u))
2306
+ v1 = p((xi, yi, zi, ui))
2307
+
2308
+ v2 = _ppoly4d_eval(c, (x, y, z, u), xi, yi, zi, ui)
2309
+ xp_assert_close(v1, v2)
2310
+
2311
+ def test_deriv_1d(self):
2312
+ rng = np.random.RandomState(1234)
2313
+
2314
+ c = rng.rand(4, 5)
2315
+ x = np.linspace(0, 1, 5+1)
2316
+
2317
+ p = NdPPoly(c, (x,))
2318
+
2319
+ # derivative
2320
+ dp = p.derivative(nu=[1])
2321
+ p1 = PPoly(c, x)
2322
+ dp1 = p1.derivative()
2323
+ xp_assert_close(dp.c, dp1.c)
2324
+
2325
+ # antiderivative
2326
+ dp = p.antiderivative(nu=[2])
2327
+ p1 = PPoly(c, x)
2328
+ dp1 = p1.antiderivative(2)
2329
+ xp_assert_close(dp.c, dp1.c)
2330
+
2331
+ def test_deriv_3d(self):
2332
+ rng = np.random.RandomState(1234)
2333
+
2334
+ c = rng.rand(4, 5, 6, 7, 8, 9)
2335
+ x = np.linspace(0, 1, 7+1)
2336
+ y = np.linspace(0, 1, 8+1)**2
2337
+ z = np.linspace(0, 1, 9+1)**3
2338
+
2339
+ p = NdPPoly(c, (x, y, z))
2340
+
2341
+ # differentiate vs x
2342
+ p1 = PPoly(c.transpose(0, 3, 1, 2, 4, 5), x)
2343
+ dp = p.derivative(nu=[2])
2344
+ dp1 = p1.derivative(2)
2345
+ xp_assert_close(dp.c,
2346
+ dp1.c.transpose(0, 2, 3, 1, 4, 5))
2347
+
2348
+ # antidifferentiate vs y
2349
+ p1 = PPoly(c.transpose(1, 4, 0, 2, 3, 5), y)
2350
+ dp = p.antiderivative(nu=[0, 1, 0])
2351
+ dp1 = p1.antiderivative(1)
2352
+ xp_assert_close(dp.c,
2353
+ dp1.c.transpose(2, 0, 3, 4, 1, 5))
2354
+
2355
+ # differentiate vs z
2356
+ p1 = PPoly(c.transpose(2, 5, 0, 1, 3, 4), z)
2357
+ dp = p.derivative(nu=[0, 0, 3])
2358
+ dp1 = p1.derivative(3)
2359
+ xp_assert_close(dp.c,
2360
+ dp1.c.transpose(2, 3, 0, 4, 5, 1))
2361
+
2362
+ def test_deriv_3d_simple(self):
2363
+ # Integrate to obtain function x y**2 z**4 / (2! 4!)
2364
+ rng = np.random.RandomState(1234)
2365
+
2366
+ c = np.ones((1, 1, 1, 3, 4, 5))
2367
+ x = np.linspace(0, 1, 3+1)**1
2368
+ y = np.linspace(0, 1, 4+1)**2
2369
+ z = np.linspace(0, 1, 5+1)**3
2370
+
2371
+ p = NdPPoly(c, (x, y, z))
2372
+ ip = p.antiderivative((1, 0, 4))
2373
+ ip = ip.antiderivative((0, 2, 0))
2374
+
2375
+ xi = rng.rand(20)
2376
+ yi = rng.rand(20)
2377
+ zi = rng.rand(20)
2378
+
2379
+ xp_assert_close(ip((xi, yi, zi)),
2380
+ xi * yi**2 * zi**4 / (gamma(3)*gamma(5)))
2381
+
2382
+ def test_integrate_2d(self):
2383
+ rng = np.random.RandomState(1234)
2384
+ c = rng.rand(4, 5, 16, 17)
2385
+ x = np.linspace(0, 1, 16+1)**1
2386
+ y = np.linspace(0, 1, 17+1)**2
2387
+
2388
+ # make continuously differentiable so that nquad() has an
2389
+ # easier time
2390
+ c = c.transpose(0, 2, 1, 3)
2391
+ cx = c.reshape(c.shape[0], c.shape[1], -1).copy()
2392
+ _ppoly.fix_continuity(cx, x, 2)
2393
+ c = cx.reshape(c.shape)
2394
+ c = c.transpose(0, 2, 1, 3)
2395
+ c = c.transpose(1, 3, 0, 2)
2396
+ cx = c.reshape(c.shape[0], c.shape[1], -1).copy()
2397
+ _ppoly.fix_continuity(cx, y, 2)
2398
+ c = cx.reshape(c.shape)
2399
+ c = c.transpose(2, 0, 3, 1).copy()
2400
+
2401
+ # Check integration
2402
+ p = NdPPoly(c, (x, y))
2403
+
2404
+ for ranges in [[(0, 1), (0, 1)],
2405
+ [(0, 0.5), (0, 1)],
2406
+ [(0, 1), (0, 0.5)],
2407
+ [(0.3, 0.7), (0.6, 0.2)]]:
2408
+
2409
+ ig = p.integrate(ranges)
2410
+ ig2, err2 = nquad(lambda x, y: p((x, y)), ranges,
2411
+ opts=[dict(epsrel=1e-5, epsabs=1e-5)]*2)
2412
+ xp_assert_close(ig, ig2, rtol=1e-5, atol=1e-5, check_0d=False,
2413
+ err_msg=repr(ranges))
2414
+
2415
+ def test_integrate_1d(self):
2416
+ rng = np.random.RandomState(1234)
2417
+ c = rng.rand(4, 5, 6, 16, 17, 18)
2418
+ x = np.linspace(0, 1, 16+1)**1
2419
+ y = np.linspace(0, 1, 17+1)**2
2420
+ z = np.linspace(0, 1, 18+1)**3
2421
+
2422
+ # Check 1-D integration
2423
+ p = NdPPoly(c, (x, y, z))
2424
+
2425
+ u = rng.rand(200)
2426
+ v = rng.rand(200)
2427
+ a, b = 0.2, 0.7
2428
+
2429
+ px = p.integrate_1d(a, b, axis=0)
2430
+ pax = p.antiderivative((1, 0, 0))
2431
+ xp_assert_close(px((u, v)), pax((b, u, v)) - pax((a, u, v)))
2432
+
2433
+ py = p.integrate_1d(a, b, axis=1)
2434
+ pay = p.antiderivative((0, 1, 0))
2435
+ xp_assert_close(py((u, v)), pay((u, b, v)) - pay((u, a, v)))
2436
+
2437
+ pz = p.integrate_1d(a, b, axis=2)
2438
+ paz = p.antiderivative((0, 0, 1))
2439
+ xp_assert_close(pz((u, v)), paz((u, v, b)) - paz((u, v, a)))
2440
+
2441
+ @pytest.mark.thread_unsafe
2442
+ def test_concurrency(self):
2443
+ rng = np.random.default_rng(12345)
2444
+
2445
+ c = rng.uniform(size=(4, 5, 6, 7, 8, 9))
2446
+ x = np.linspace(0, 1, 7+1)
2447
+ y = np.linspace(0, 1, 8+1)**2
2448
+ z = np.linspace(0, 1, 9+1)**3
2449
+
2450
+ p = NdPPoly(c, (x, y, z))
2451
+
2452
+ def worker_fn(_, spl):
2453
+ xi = rng.uniform(size=40)
2454
+ yi = rng.uniform(size=40)
2455
+ zi = rng.uniform(size=40)
2456
+ spl((xi, yi, zi))
2457
+
2458
+ _run_concurrent_barrier(10, worker_fn, p)
2459
+
2460
+
2461
+ def _ppoly_eval_1(c, x, xps):
2462
+ """Evaluate piecewise polynomial manually"""
2463
+ out = np.zeros((len(xps), c.shape[2]))
2464
+ for i, xp in enumerate(xps):
2465
+ if xp < 0 or xp > 1:
2466
+ out[i,:] = np.nan
2467
+ continue
2468
+ j = np.searchsorted(x, xp) - 1
2469
+ d = xp - x[j]
2470
+ assert x[j] <= xp < x[j+1]
2471
+ r = sum(c[k,j] * d**(c.shape[0]-k-1)
2472
+ for k in range(c.shape[0]))
2473
+ out[i,:] = r
2474
+ return out
2475
+
2476
+
2477
+ def _ppoly_eval_2(coeffs, breaks, xnew, fill=np.nan):
2478
+ """Evaluate piecewise polynomial manually (another way)"""
2479
+ a = breaks[0]
2480
+ b = breaks[-1]
2481
+ K = coeffs.shape[0]
2482
+
2483
+ saveshape = np.shape(xnew)
2484
+ xnew = np.ravel(xnew)
2485
+ res = np.empty_like(xnew)
2486
+ mask = (xnew >= a) & (xnew <= b)
2487
+ res[~mask] = fill
2488
+ xx = xnew.compress(mask)
2489
+ indxs = np.searchsorted(breaks, xx)-1
2490
+ indxs = indxs.clip(0, len(breaks))
2491
+ pp = coeffs
2492
+ diff = xx - breaks.take(indxs)
2493
+ V = np.vander(diff, N=K)
2494
+ values = np.array([np.dot(V[k, :], pp[:, indxs[k]]) for k in range(len(xx))])
2495
+ res[mask] = values
2496
+ res.shape = saveshape
2497
+ return res
2498
+
2499
+
2500
+ def _dpow(x, y, n):
2501
+ """
2502
+ d^n (x**y) / dx^n
2503
+ """
2504
+ if n < 0:
2505
+ raise ValueError("invalid derivative order")
2506
+ elif n > y:
2507
+ return 0
2508
+ else:
2509
+ return poch(y - n + 1, n) * x**(y - n)
2510
+
2511
+
2512
+ def _ppoly2d_eval(c, xs, xnew, ynew, nu=None):
2513
+ """
2514
+ Straightforward evaluation of 2-D piecewise polynomial
2515
+ """
2516
+ if nu is None:
2517
+ nu = (0, 0)
2518
+
2519
+ out = np.empty((len(xnew),), dtype=c.dtype)
2520
+
2521
+ nx, ny = c.shape[:2]
2522
+
2523
+ for jout, (x, y) in enumerate(zip(xnew, ynew)):
2524
+ if not ((xs[0][0] <= x <= xs[0][-1]) and
2525
+ (xs[1][0] <= y <= xs[1][-1])):
2526
+ out[jout] = np.nan
2527
+ continue
2528
+
2529
+ j1 = np.searchsorted(xs[0], x) - 1
2530
+ j2 = np.searchsorted(xs[1], y) - 1
2531
+
2532
+ s1 = x - xs[0][j1]
2533
+ s2 = y - xs[1][j2]
2534
+
2535
+ val = 0
2536
+
2537
+ for k1 in range(c.shape[0]):
2538
+ for k2 in range(c.shape[1]):
2539
+ val += (c[nx-k1-1,ny-k2-1,j1,j2]
2540
+ * _dpow(s1, k1, nu[0])
2541
+ * _dpow(s2, k2, nu[1]))
2542
+
2543
+ out[jout] = val
2544
+
2545
+ return out
2546
+
2547
+
2548
+ def _ppoly3d_eval(c, xs, xnew, ynew, znew, nu=None):
2549
+ """
2550
+ Straightforward evaluation of 3-D piecewise polynomial
2551
+ """
2552
+ if nu is None:
2553
+ nu = (0, 0, 0)
2554
+
2555
+ out = np.empty((len(xnew),), dtype=c.dtype)
2556
+
2557
+ nx, ny, nz = c.shape[:3]
2558
+
2559
+ for jout, (x, y, z) in enumerate(zip(xnew, ynew, znew)):
2560
+ if not ((xs[0][0] <= x <= xs[0][-1]) and
2561
+ (xs[1][0] <= y <= xs[1][-1]) and
2562
+ (xs[2][0] <= z <= xs[2][-1])):
2563
+ out[jout] = np.nan
2564
+ continue
2565
+
2566
+ j1 = np.searchsorted(xs[0], x) - 1
2567
+ j2 = np.searchsorted(xs[1], y) - 1
2568
+ j3 = np.searchsorted(xs[2], z) - 1
2569
+
2570
+ s1 = x - xs[0][j1]
2571
+ s2 = y - xs[1][j2]
2572
+ s3 = z - xs[2][j3]
2573
+
2574
+ val = 0
2575
+ for k1 in range(c.shape[0]):
2576
+ for k2 in range(c.shape[1]):
2577
+ for k3 in range(c.shape[2]):
2578
+ val += (c[nx-k1-1,ny-k2-1,nz-k3-1,j1,j2,j3]
2579
+ * _dpow(s1, k1, nu[0])
2580
+ * _dpow(s2, k2, nu[1])
2581
+ * _dpow(s3, k3, nu[2]))
2582
+
2583
+ out[jout] = val
2584
+
2585
+ return out
2586
+
2587
+
2588
+ def _ppoly4d_eval(c, xs, xnew, ynew, znew, unew, nu=None):
2589
+ """
2590
+ Straightforward evaluation of 4-D piecewise polynomial
2591
+ """
2592
+ if nu is None:
2593
+ nu = (0, 0, 0, 0)
2594
+
2595
+ out = np.empty((len(xnew),), dtype=c.dtype)
2596
+
2597
+ mx, my, mz, mu = c.shape[:4]
2598
+
2599
+ for jout, (x, y, z, u) in enumerate(zip(xnew, ynew, znew, unew)):
2600
+ if not ((xs[0][0] <= x <= xs[0][-1]) and
2601
+ (xs[1][0] <= y <= xs[1][-1]) and
2602
+ (xs[2][0] <= z <= xs[2][-1]) and
2603
+ (xs[3][0] <= u <= xs[3][-1])):
2604
+ out[jout] = np.nan
2605
+ continue
2606
+
2607
+ j1 = np.searchsorted(xs[0], x) - 1
2608
+ j2 = np.searchsorted(xs[1], y) - 1
2609
+ j3 = np.searchsorted(xs[2], z) - 1
2610
+ j4 = np.searchsorted(xs[3], u) - 1
2611
+
2612
+ s1 = x - xs[0][j1]
2613
+ s2 = y - xs[1][j2]
2614
+ s3 = z - xs[2][j3]
2615
+ s4 = u - xs[3][j4]
2616
+
2617
+ val = 0
2618
+ for k1 in range(c.shape[0]):
2619
+ for k2 in range(c.shape[1]):
2620
+ for k3 in range(c.shape[2]):
2621
+ for k4 in range(c.shape[3]):
2622
+ val += (c[mx-k1-1,my-k2-1,mz-k3-1,mu-k4-1,j1,j2,j3,j4]
2623
+ * _dpow(s1, k1, nu[0])
2624
+ * _dpow(s2, k2, nu[1])
2625
+ * _dpow(s3, k3, nu[2])
2626
+ * _dpow(s4, k4, nu[3]))
2627
+
2628
+ out[jout] = val
2629
+
2630
+ return out