numpy 2.4.0__cp313-cp313t-musllinux_1_2_aarch64.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 (915) hide show
  1. numpy/__config__.py +170 -0
  2. numpy/__config__.pyi +108 -0
  3. numpy/__init__.cython-30.pxd +1242 -0
  4. numpy/__init__.pxd +1155 -0
  5. numpy/__init__.py +942 -0
  6. numpy/__init__.pyi +6202 -0
  7. numpy/_array_api_info.py +346 -0
  8. numpy/_array_api_info.pyi +206 -0
  9. numpy/_configtool.py +39 -0
  10. numpy/_configtool.pyi +1 -0
  11. numpy/_core/__init__.py +201 -0
  12. numpy/_core/__init__.pyi +666 -0
  13. numpy/_core/_add_newdocs.py +7151 -0
  14. numpy/_core/_add_newdocs.pyi +2 -0
  15. numpy/_core/_add_newdocs_scalars.py +381 -0
  16. numpy/_core/_add_newdocs_scalars.pyi +16 -0
  17. numpy/_core/_asarray.py +130 -0
  18. numpy/_core/_asarray.pyi +43 -0
  19. numpy/_core/_dtype.py +366 -0
  20. numpy/_core/_dtype.pyi +56 -0
  21. numpy/_core/_dtype_ctypes.py +120 -0
  22. numpy/_core/_dtype_ctypes.pyi +83 -0
  23. numpy/_core/_exceptions.py +162 -0
  24. numpy/_core/_exceptions.pyi +54 -0
  25. numpy/_core/_internal.py +968 -0
  26. numpy/_core/_internal.pyi +61 -0
  27. numpy/_core/_methods.py +252 -0
  28. numpy/_core/_methods.pyi +22 -0
  29. numpy/_core/_multiarray_tests.cpython-313t-aarch64-linux-musl.so +0 -0
  30. numpy/_core/_multiarray_umath.cpython-313t-aarch64-linux-musl.so +0 -0
  31. numpy/_core/_operand_flag_tests.cpython-313t-aarch64-linux-musl.so +0 -0
  32. numpy/_core/_rational_tests.cpython-313t-aarch64-linux-musl.so +0 -0
  33. numpy/_core/_simd.cpython-313t-aarch64-linux-musl.so +0 -0
  34. numpy/_core/_simd.pyi +35 -0
  35. numpy/_core/_string_helpers.py +100 -0
  36. numpy/_core/_string_helpers.pyi +12 -0
  37. numpy/_core/_struct_ufunc_tests.cpython-313t-aarch64-linux-musl.so +0 -0
  38. numpy/_core/_type_aliases.py +131 -0
  39. numpy/_core/_type_aliases.pyi +86 -0
  40. numpy/_core/_ufunc_config.py +515 -0
  41. numpy/_core/_ufunc_config.pyi +69 -0
  42. numpy/_core/_umath_tests.cpython-313t-aarch64-linux-musl.so +0 -0
  43. numpy/_core/_umath_tests.pyi +47 -0
  44. numpy/_core/arrayprint.py +1779 -0
  45. numpy/_core/arrayprint.pyi +158 -0
  46. numpy/_core/cversions.py +13 -0
  47. numpy/_core/defchararray.py +1414 -0
  48. numpy/_core/defchararray.pyi +1150 -0
  49. numpy/_core/einsumfunc.py +1650 -0
  50. numpy/_core/einsumfunc.pyi +184 -0
  51. numpy/_core/fromnumeric.py +4233 -0
  52. numpy/_core/fromnumeric.pyi +1735 -0
  53. numpy/_core/function_base.py +547 -0
  54. numpy/_core/function_base.pyi +276 -0
  55. numpy/_core/getlimits.py +462 -0
  56. numpy/_core/getlimits.pyi +124 -0
  57. numpy/_core/include/numpy/__multiarray_api.c +376 -0
  58. numpy/_core/include/numpy/__multiarray_api.h +1628 -0
  59. numpy/_core/include/numpy/__ufunc_api.c +55 -0
  60. numpy/_core/include/numpy/__ufunc_api.h +349 -0
  61. numpy/_core/include/numpy/_neighborhood_iterator_imp.h +90 -0
  62. numpy/_core/include/numpy/_numpyconfig.h +33 -0
  63. numpy/_core/include/numpy/_public_dtype_api_table.h +86 -0
  64. numpy/_core/include/numpy/arrayobject.h +7 -0
  65. numpy/_core/include/numpy/arrayscalars.h +198 -0
  66. numpy/_core/include/numpy/dtype_api.h +547 -0
  67. numpy/_core/include/numpy/halffloat.h +70 -0
  68. numpy/_core/include/numpy/ndarrayobject.h +304 -0
  69. numpy/_core/include/numpy/ndarraytypes.h +1982 -0
  70. numpy/_core/include/numpy/npy_2_compat.h +249 -0
  71. numpy/_core/include/numpy/npy_2_complexcompat.h +28 -0
  72. numpy/_core/include/numpy/npy_3kcompat.h +374 -0
  73. numpy/_core/include/numpy/npy_common.h +989 -0
  74. numpy/_core/include/numpy/npy_cpu.h +126 -0
  75. numpy/_core/include/numpy/npy_endian.h +79 -0
  76. numpy/_core/include/numpy/npy_math.h +602 -0
  77. numpy/_core/include/numpy/npy_no_deprecated_api.h +20 -0
  78. numpy/_core/include/numpy/npy_os.h +42 -0
  79. numpy/_core/include/numpy/numpyconfig.h +185 -0
  80. numpy/_core/include/numpy/random/LICENSE.txt +21 -0
  81. numpy/_core/include/numpy/random/bitgen.h +20 -0
  82. numpy/_core/include/numpy/random/distributions.h +209 -0
  83. numpy/_core/include/numpy/random/libdivide.h +2079 -0
  84. numpy/_core/include/numpy/ufuncobject.h +343 -0
  85. numpy/_core/include/numpy/utils.h +37 -0
  86. numpy/_core/lib/libnpymath.a +0 -0
  87. numpy/_core/lib/npy-pkg-config/mlib.ini +12 -0
  88. numpy/_core/lib/npy-pkg-config/npymath.ini +20 -0
  89. numpy/_core/lib/pkgconfig/numpy.pc +7 -0
  90. numpy/_core/memmap.py +363 -0
  91. numpy/_core/memmap.pyi +3 -0
  92. numpy/_core/multiarray.py +1740 -0
  93. numpy/_core/multiarray.pyi +1316 -0
  94. numpy/_core/numeric.py +2758 -0
  95. numpy/_core/numeric.pyi +1276 -0
  96. numpy/_core/numerictypes.py +633 -0
  97. numpy/_core/numerictypes.pyi +196 -0
  98. numpy/_core/overrides.py +188 -0
  99. numpy/_core/overrides.pyi +47 -0
  100. numpy/_core/printoptions.py +32 -0
  101. numpy/_core/printoptions.pyi +28 -0
  102. numpy/_core/records.py +1088 -0
  103. numpy/_core/records.pyi +340 -0
  104. numpy/_core/shape_base.py +996 -0
  105. numpy/_core/shape_base.pyi +182 -0
  106. numpy/_core/strings.py +1813 -0
  107. numpy/_core/strings.pyi +536 -0
  108. numpy/_core/tests/_locales.py +72 -0
  109. numpy/_core/tests/_natype.py +144 -0
  110. numpy/_core/tests/data/astype_copy.pkl +0 -0
  111. numpy/_core/tests/data/generate_umath_validation_data.cpp +170 -0
  112. numpy/_core/tests/data/recarray_from_file.fits +0 -0
  113. numpy/_core/tests/data/umath-validation-set-README.txt +15 -0
  114. numpy/_core/tests/data/umath-validation-set-arccos.csv +1429 -0
  115. numpy/_core/tests/data/umath-validation-set-arccosh.csv +1429 -0
  116. numpy/_core/tests/data/umath-validation-set-arcsin.csv +1429 -0
  117. numpy/_core/tests/data/umath-validation-set-arcsinh.csv +1429 -0
  118. numpy/_core/tests/data/umath-validation-set-arctan.csv +1429 -0
  119. numpy/_core/tests/data/umath-validation-set-arctanh.csv +1429 -0
  120. numpy/_core/tests/data/umath-validation-set-cbrt.csv +1429 -0
  121. numpy/_core/tests/data/umath-validation-set-cos.csv +1375 -0
  122. numpy/_core/tests/data/umath-validation-set-cosh.csv +1429 -0
  123. numpy/_core/tests/data/umath-validation-set-exp.csv +412 -0
  124. numpy/_core/tests/data/umath-validation-set-exp2.csv +1429 -0
  125. numpy/_core/tests/data/umath-validation-set-expm1.csv +1429 -0
  126. numpy/_core/tests/data/umath-validation-set-log.csv +271 -0
  127. numpy/_core/tests/data/umath-validation-set-log10.csv +1629 -0
  128. numpy/_core/tests/data/umath-validation-set-log1p.csv +1429 -0
  129. numpy/_core/tests/data/umath-validation-set-log2.csv +1629 -0
  130. numpy/_core/tests/data/umath-validation-set-sin.csv +1370 -0
  131. numpy/_core/tests/data/umath-validation-set-sinh.csv +1429 -0
  132. numpy/_core/tests/data/umath-validation-set-tan.csv +1429 -0
  133. numpy/_core/tests/data/umath-validation-set-tanh.csv +1429 -0
  134. numpy/_core/tests/examples/cython/checks.pyx +373 -0
  135. numpy/_core/tests/examples/cython/meson.build +43 -0
  136. numpy/_core/tests/examples/cython/setup.py +39 -0
  137. numpy/_core/tests/examples/limited_api/limited_api1.c +17 -0
  138. numpy/_core/tests/examples/limited_api/limited_api2.pyx +11 -0
  139. numpy/_core/tests/examples/limited_api/limited_api_latest.c +19 -0
  140. numpy/_core/tests/examples/limited_api/meson.build +59 -0
  141. numpy/_core/tests/examples/limited_api/setup.py +24 -0
  142. numpy/_core/tests/test__exceptions.py +90 -0
  143. numpy/_core/tests/test_abc.py +54 -0
  144. numpy/_core/tests/test_api.py +655 -0
  145. numpy/_core/tests/test_argparse.py +90 -0
  146. numpy/_core/tests/test_array_api_info.py +113 -0
  147. numpy/_core/tests/test_array_coercion.py +928 -0
  148. numpy/_core/tests/test_array_interface.py +222 -0
  149. numpy/_core/tests/test_arraymethod.py +84 -0
  150. numpy/_core/tests/test_arrayobject.py +75 -0
  151. numpy/_core/tests/test_arrayprint.py +1324 -0
  152. numpy/_core/tests/test_casting_floatingpoint_errors.py +154 -0
  153. numpy/_core/tests/test_casting_unittests.py +955 -0
  154. numpy/_core/tests/test_conversion_utils.py +209 -0
  155. numpy/_core/tests/test_cpu_dispatcher.py +48 -0
  156. numpy/_core/tests/test_cpu_features.py +450 -0
  157. numpy/_core/tests/test_custom_dtypes.py +393 -0
  158. numpy/_core/tests/test_cython.py +352 -0
  159. numpy/_core/tests/test_datetime.py +2792 -0
  160. numpy/_core/tests/test_defchararray.py +858 -0
  161. numpy/_core/tests/test_deprecations.py +460 -0
  162. numpy/_core/tests/test_dlpack.py +190 -0
  163. numpy/_core/tests/test_dtype.py +2110 -0
  164. numpy/_core/tests/test_einsum.py +1351 -0
  165. numpy/_core/tests/test_errstate.py +131 -0
  166. numpy/_core/tests/test_extint128.py +217 -0
  167. numpy/_core/tests/test_finfo.py +86 -0
  168. numpy/_core/tests/test_function_base.py +504 -0
  169. numpy/_core/tests/test_getlimits.py +171 -0
  170. numpy/_core/tests/test_half.py +593 -0
  171. numpy/_core/tests/test_hashtable.py +36 -0
  172. numpy/_core/tests/test_indexerrors.py +122 -0
  173. numpy/_core/tests/test_indexing.py +1692 -0
  174. numpy/_core/tests/test_item_selection.py +167 -0
  175. numpy/_core/tests/test_limited_api.py +102 -0
  176. numpy/_core/tests/test_longdouble.py +370 -0
  177. numpy/_core/tests/test_mem_overlap.py +933 -0
  178. numpy/_core/tests/test_mem_policy.py +453 -0
  179. numpy/_core/tests/test_memmap.py +248 -0
  180. numpy/_core/tests/test_multiarray.py +11008 -0
  181. numpy/_core/tests/test_multiprocessing.py +55 -0
  182. numpy/_core/tests/test_multithreading.py +353 -0
  183. numpy/_core/tests/test_nditer.py +3533 -0
  184. numpy/_core/tests/test_nep50_promotions.py +287 -0
  185. numpy/_core/tests/test_numeric.py +4295 -0
  186. numpy/_core/tests/test_numerictypes.py +650 -0
  187. numpy/_core/tests/test_overrides.py +800 -0
  188. numpy/_core/tests/test_print.py +202 -0
  189. numpy/_core/tests/test_protocols.py +46 -0
  190. numpy/_core/tests/test_records.py +544 -0
  191. numpy/_core/tests/test_regression.py +2677 -0
  192. numpy/_core/tests/test_scalar_ctors.py +203 -0
  193. numpy/_core/tests/test_scalar_methods.py +328 -0
  194. numpy/_core/tests/test_scalarbuffer.py +153 -0
  195. numpy/_core/tests/test_scalarinherit.py +105 -0
  196. numpy/_core/tests/test_scalarmath.py +1168 -0
  197. numpy/_core/tests/test_scalarprint.py +403 -0
  198. numpy/_core/tests/test_shape_base.py +904 -0
  199. numpy/_core/tests/test_simd.py +1345 -0
  200. numpy/_core/tests/test_simd_module.py +105 -0
  201. numpy/_core/tests/test_stringdtype.py +1855 -0
  202. numpy/_core/tests/test_strings.py +1515 -0
  203. numpy/_core/tests/test_ufunc.py +3405 -0
  204. numpy/_core/tests/test_umath.py +4962 -0
  205. numpy/_core/tests/test_umath_accuracy.py +132 -0
  206. numpy/_core/tests/test_umath_complex.py +631 -0
  207. numpy/_core/tests/test_unicode.py +369 -0
  208. numpy/_core/umath.py +60 -0
  209. numpy/_core/umath.pyi +232 -0
  210. numpy/_distributor_init.py +15 -0
  211. numpy/_distributor_init.pyi +1 -0
  212. numpy/_expired_attrs_2_0.py +78 -0
  213. numpy/_expired_attrs_2_0.pyi +61 -0
  214. numpy/_globals.py +121 -0
  215. numpy/_globals.pyi +17 -0
  216. numpy/_pyinstaller/__init__.py +0 -0
  217. numpy/_pyinstaller/__init__.pyi +0 -0
  218. numpy/_pyinstaller/hook-numpy.py +36 -0
  219. numpy/_pyinstaller/hook-numpy.pyi +6 -0
  220. numpy/_pyinstaller/tests/__init__.py +16 -0
  221. numpy/_pyinstaller/tests/pyinstaller-smoke.py +32 -0
  222. numpy/_pyinstaller/tests/test_pyinstaller.py +35 -0
  223. numpy/_pytesttester.py +201 -0
  224. numpy/_pytesttester.pyi +18 -0
  225. numpy/_typing/__init__.py +173 -0
  226. numpy/_typing/_add_docstring.py +153 -0
  227. numpy/_typing/_array_like.py +106 -0
  228. numpy/_typing/_char_codes.py +213 -0
  229. numpy/_typing/_dtype_like.py +114 -0
  230. numpy/_typing/_extended_precision.py +15 -0
  231. numpy/_typing/_nbit.py +19 -0
  232. numpy/_typing/_nbit_base.py +94 -0
  233. numpy/_typing/_nbit_base.pyi +39 -0
  234. numpy/_typing/_nested_sequence.py +79 -0
  235. numpy/_typing/_scalars.py +20 -0
  236. numpy/_typing/_shape.py +8 -0
  237. numpy/_typing/_ufunc.py +7 -0
  238. numpy/_typing/_ufunc.pyi +975 -0
  239. numpy/_utils/__init__.py +95 -0
  240. numpy/_utils/__init__.pyi +28 -0
  241. numpy/_utils/_convertions.py +18 -0
  242. numpy/_utils/_convertions.pyi +4 -0
  243. numpy/_utils/_inspect.py +192 -0
  244. numpy/_utils/_inspect.pyi +70 -0
  245. numpy/_utils/_pep440.py +486 -0
  246. numpy/_utils/_pep440.pyi +118 -0
  247. numpy/char/__init__.py +2 -0
  248. numpy/char/__init__.pyi +111 -0
  249. numpy/conftest.py +248 -0
  250. numpy/core/__init__.py +33 -0
  251. numpy/core/__init__.pyi +0 -0
  252. numpy/core/_dtype.py +10 -0
  253. numpy/core/_dtype.pyi +0 -0
  254. numpy/core/_dtype_ctypes.py +10 -0
  255. numpy/core/_dtype_ctypes.pyi +0 -0
  256. numpy/core/_internal.py +27 -0
  257. numpy/core/_multiarray_umath.py +57 -0
  258. numpy/core/_utils.py +21 -0
  259. numpy/core/arrayprint.py +10 -0
  260. numpy/core/defchararray.py +10 -0
  261. numpy/core/einsumfunc.py +10 -0
  262. numpy/core/fromnumeric.py +10 -0
  263. numpy/core/function_base.py +10 -0
  264. numpy/core/getlimits.py +10 -0
  265. numpy/core/multiarray.py +25 -0
  266. numpy/core/numeric.py +12 -0
  267. numpy/core/numerictypes.py +10 -0
  268. numpy/core/overrides.py +10 -0
  269. numpy/core/overrides.pyi +7 -0
  270. numpy/core/records.py +10 -0
  271. numpy/core/shape_base.py +10 -0
  272. numpy/core/umath.py +10 -0
  273. numpy/ctypeslib/__init__.py +13 -0
  274. numpy/ctypeslib/__init__.pyi +15 -0
  275. numpy/ctypeslib/_ctypeslib.py +603 -0
  276. numpy/ctypeslib/_ctypeslib.pyi +236 -0
  277. numpy/doc/ufuncs.py +138 -0
  278. numpy/dtypes.py +41 -0
  279. numpy/dtypes.pyi +630 -0
  280. numpy/exceptions.py +246 -0
  281. numpy/exceptions.pyi +27 -0
  282. numpy/f2py/__init__.py +86 -0
  283. numpy/f2py/__init__.pyi +5 -0
  284. numpy/f2py/__main__.py +5 -0
  285. numpy/f2py/__version__.py +1 -0
  286. numpy/f2py/__version__.pyi +1 -0
  287. numpy/f2py/_backends/__init__.py +9 -0
  288. numpy/f2py/_backends/__init__.pyi +5 -0
  289. numpy/f2py/_backends/_backend.py +44 -0
  290. numpy/f2py/_backends/_backend.pyi +46 -0
  291. numpy/f2py/_backends/_distutils.py +76 -0
  292. numpy/f2py/_backends/_distutils.pyi +13 -0
  293. numpy/f2py/_backends/_meson.py +244 -0
  294. numpy/f2py/_backends/_meson.pyi +62 -0
  295. numpy/f2py/_backends/meson.build.template +58 -0
  296. numpy/f2py/_isocbind.py +62 -0
  297. numpy/f2py/_isocbind.pyi +13 -0
  298. numpy/f2py/_src_pyf.py +247 -0
  299. numpy/f2py/_src_pyf.pyi +28 -0
  300. numpy/f2py/auxfuncs.py +1004 -0
  301. numpy/f2py/auxfuncs.pyi +262 -0
  302. numpy/f2py/capi_maps.py +811 -0
  303. numpy/f2py/capi_maps.pyi +33 -0
  304. numpy/f2py/cb_rules.py +665 -0
  305. numpy/f2py/cb_rules.pyi +17 -0
  306. numpy/f2py/cfuncs.py +1563 -0
  307. numpy/f2py/cfuncs.pyi +31 -0
  308. numpy/f2py/common_rules.py +143 -0
  309. numpy/f2py/common_rules.pyi +9 -0
  310. numpy/f2py/crackfortran.py +3725 -0
  311. numpy/f2py/crackfortran.pyi +266 -0
  312. numpy/f2py/diagnose.py +149 -0
  313. numpy/f2py/diagnose.pyi +1 -0
  314. numpy/f2py/f2py2e.py +788 -0
  315. numpy/f2py/f2py2e.pyi +74 -0
  316. numpy/f2py/f90mod_rules.py +269 -0
  317. numpy/f2py/f90mod_rules.pyi +16 -0
  318. numpy/f2py/func2subr.py +329 -0
  319. numpy/f2py/func2subr.pyi +7 -0
  320. numpy/f2py/rules.py +1629 -0
  321. numpy/f2py/rules.pyi +41 -0
  322. numpy/f2py/setup.cfg +3 -0
  323. numpy/f2py/src/fortranobject.c +1436 -0
  324. numpy/f2py/src/fortranobject.h +173 -0
  325. numpy/f2py/symbolic.py +1518 -0
  326. numpy/f2py/symbolic.pyi +219 -0
  327. numpy/f2py/tests/__init__.py +16 -0
  328. numpy/f2py/tests/src/abstract_interface/foo.f90 +34 -0
  329. numpy/f2py/tests/src/abstract_interface/gh18403_mod.f90 +6 -0
  330. numpy/f2py/tests/src/array_from_pyobj/wrapmodule.c +235 -0
  331. numpy/f2py/tests/src/assumed_shape/.f2py_f2cmap +1 -0
  332. numpy/f2py/tests/src/assumed_shape/foo_free.f90 +34 -0
  333. numpy/f2py/tests/src/assumed_shape/foo_mod.f90 +41 -0
  334. numpy/f2py/tests/src/assumed_shape/foo_use.f90 +19 -0
  335. numpy/f2py/tests/src/assumed_shape/precision.f90 +4 -0
  336. numpy/f2py/tests/src/block_docstring/foo.f +6 -0
  337. numpy/f2py/tests/src/callback/foo.f +62 -0
  338. numpy/f2py/tests/src/callback/gh17797.f90 +7 -0
  339. numpy/f2py/tests/src/callback/gh18335.f90 +17 -0
  340. numpy/f2py/tests/src/callback/gh25211.f +10 -0
  341. numpy/f2py/tests/src/callback/gh25211.pyf +18 -0
  342. numpy/f2py/tests/src/callback/gh26681.f90 +18 -0
  343. numpy/f2py/tests/src/cli/gh_22819.pyf +6 -0
  344. numpy/f2py/tests/src/cli/hi77.f +3 -0
  345. numpy/f2py/tests/src/cli/hiworld.f90 +3 -0
  346. numpy/f2py/tests/src/common/block.f +11 -0
  347. numpy/f2py/tests/src/common/gh19161.f90 +10 -0
  348. numpy/f2py/tests/src/crackfortran/accesstype.f90 +13 -0
  349. numpy/f2py/tests/src/crackfortran/common_with_division.f +17 -0
  350. numpy/f2py/tests/src/crackfortran/data_common.f +8 -0
  351. numpy/f2py/tests/src/crackfortran/data_multiplier.f +5 -0
  352. numpy/f2py/tests/src/crackfortran/data_stmts.f90 +20 -0
  353. numpy/f2py/tests/src/crackfortran/data_with_comments.f +8 -0
  354. numpy/f2py/tests/src/crackfortran/foo_deps.f90 +6 -0
  355. numpy/f2py/tests/src/crackfortran/gh15035.f +16 -0
  356. numpy/f2py/tests/src/crackfortran/gh17859.f +12 -0
  357. numpy/f2py/tests/src/crackfortran/gh22648.pyf +7 -0
  358. numpy/f2py/tests/src/crackfortran/gh23533.f +5 -0
  359. numpy/f2py/tests/src/crackfortran/gh23598.f90 +4 -0
  360. numpy/f2py/tests/src/crackfortran/gh23598Warn.f90 +11 -0
  361. numpy/f2py/tests/src/crackfortran/gh23879.f90 +20 -0
  362. numpy/f2py/tests/src/crackfortran/gh27697.f90 +12 -0
  363. numpy/f2py/tests/src/crackfortran/gh2848.f90 +13 -0
  364. numpy/f2py/tests/src/crackfortran/operators.f90 +49 -0
  365. numpy/f2py/tests/src/crackfortran/privatemod.f90 +11 -0
  366. numpy/f2py/tests/src/crackfortran/publicmod.f90 +10 -0
  367. numpy/f2py/tests/src/crackfortran/pubprivmod.f90 +10 -0
  368. numpy/f2py/tests/src/crackfortran/unicode_comment.f90 +4 -0
  369. numpy/f2py/tests/src/f2cmap/.f2py_f2cmap +1 -0
  370. numpy/f2py/tests/src/f2cmap/isoFortranEnvMap.f90 +9 -0
  371. numpy/f2py/tests/src/isocintrin/isoCtests.f90 +34 -0
  372. numpy/f2py/tests/src/kind/foo.f90 +20 -0
  373. numpy/f2py/tests/src/mixed/foo.f +5 -0
  374. numpy/f2py/tests/src/mixed/foo_fixed.f90 +8 -0
  375. numpy/f2py/tests/src/mixed/foo_free.f90 +8 -0
  376. numpy/f2py/tests/src/modules/gh25337/data.f90 +8 -0
  377. numpy/f2py/tests/src/modules/gh25337/use_data.f90 +6 -0
  378. numpy/f2py/tests/src/modules/gh26920/two_mods_with_no_public_entities.f90 +21 -0
  379. numpy/f2py/tests/src/modules/gh26920/two_mods_with_one_public_routine.f90 +21 -0
  380. numpy/f2py/tests/src/modules/module_data_docstring.f90 +12 -0
  381. numpy/f2py/tests/src/modules/use_modules.f90 +20 -0
  382. numpy/f2py/tests/src/negative_bounds/issue_20853.f90 +7 -0
  383. numpy/f2py/tests/src/parameter/constant_array.f90 +45 -0
  384. numpy/f2py/tests/src/parameter/constant_both.f90 +57 -0
  385. numpy/f2py/tests/src/parameter/constant_compound.f90 +15 -0
  386. numpy/f2py/tests/src/parameter/constant_integer.f90 +22 -0
  387. numpy/f2py/tests/src/parameter/constant_non_compound.f90 +23 -0
  388. numpy/f2py/tests/src/parameter/constant_real.f90 +23 -0
  389. numpy/f2py/tests/src/quoted_character/foo.f +14 -0
  390. numpy/f2py/tests/src/regression/AB.inc +1 -0
  391. numpy/f2py/tests/src/regression/assignOnlyModule.f90 +25 -0
  392. numpy/f2py/tests/src/regression/datonly.f90 +17 -0
  393. numpy/f2py/tests/src/regression/f77comments.f +26 -0
  394. numpy/f2py/tests/src/regression/f77fixedform.f95 +5 -0
  395. numpy/f2py/tests/src/regression/f90continuation.f90 +9 -0
  396. numpy/f2py/tests/src/regression/incfile.f90 +5 -0
  397. numpy/f2py/tests/src/regression/inout.f90 +9 -0
  398. numpy/f2py/tests/src/regression/lower_f2py_fortran.f90 +5 -0
  399. numpy/f2py/tests/src/regression/mod_derived_types.f90 +23 -0
  400. numpy/f2py/tests/src/return_character/foo77.f +45 -0
  401. numpy/f2py/tests/src/return_character/foo90.f90 +48 -0
  402. numpy/f2py/tests/src/return_complex/foo77.f +45 -0
  403. numpy/f2py/tests/src/return_complex/foo90.f90 +48 -0
  404. numpy/f2py/tests/src/return_integer/foo77.f +56 -0
  405. numpy/f2py/tests/src/return_integer/foo90.f90 +59 -0
  406. numpy/f2py/tests/src/return_logical/foo77.f +56 -0
  407. numpy/f2py/tests/src/return_logical/foo90.f90 +59 -0
  408. numpy/f2py/tests/src/return_real/foo77.f +45 -0
  409. numpy/f2py/tests/src/return_real/foo90.f90 +48 -0
  410. numpy/f2py/tests/src/routines/funcfortranname.f +5 -0
  411. numpy/f2py/tests/src/routines/funcfortranname.pyf +11 -0
  412. numpy/f2py/tests/src/routines/subrout.f +4 -0
  413. numpy/f2py/tests/src/routines/subrout.pyf +10 -0
  414. numpy/f2py/tests/src/size/foo.f90 +44 -0
  415. numpy/f2py/tests/src/string/char.f90 +29 -0
  416. numpy/f2py/tests/src/string/fixed_string.f90 +34 -0
  417. numpy/f2py/tests/src/string/gh24008.f +8 -0
  418. numpy/f2py/tests/src/string/gh24662.f90 +7 -0
  419. numpy/f2py/tests/src/string/gh25286.f90 +14 -0
  420. numpy/f2py/tests/src/string/gh25286.pyf +12 -0
  421. numpy/f2py/tests/src/string/gh25286_bc.pyf +12 -0
  422. numpy/f2py/tests/src/string/scalar_string.f90 +9 -0
  423. numpy/f2py/tests/src/string/string.f +12 -0
  424. numpy/f2py/tests/src/value_attrspec/gh21665.f90 +9 -0
  425. numpy/f2py/tests/test_abstract_interface.py +26 -0
  426. numpy/f2py/tests/test_array_from_pyobj.py +678 -0
  427. numpy/f2py/tests/test_assumed_shape.py +50 -0
  428. numpy/f2py/tests/test_block_docstring.py +20 -0
  429. numpy/f2py/tests/test_callback.py +263 -0
  430. numpy/f2py/tests/test_character.py +641 -0
  431. numpy/f2py/tests/test_common.py +23 -0
  432. numpy/f2py/tests/test_crackfortran.py +421 -0
  433. numpy/f2py/tests/test_data.py +71 -0
  434. numpy/f2py/tests/test_docs.py +66 -0
  435. numpy/f2py/tests/test_f2cmap.py +17 -0
  436. numpy/f2py/tests/test_f2py2e.py +983 -0
  437. numpy/f2py/tests/test_isoc.py +56 -0
  438. numpy/f2py/tests/test_kind.py +52 -0
  439. numpy/f2py/tests/test_mixed.py +35 -0
  440. numpy/f2py/tests/test_modules.py +83 -0
  441. numpy/f2py/tests/test_parameter.py +129 -0
  442. numpy/f2py/tests/test_pyf_src.py +43 -0
  443. numpy/f2py/tests/test_quoted_character.py +18 -0
  444. numpy/f2py/tests/test_regression.py +187 -0
  445. numpy/f2py/tests/test_return_character.py +48 -0
  446. numpy/f2py/tests/test_return_complex.py +67 -0
  447. numpy/f2py/tests/test_return_integer.py +55 -0
  448. numpy/f2py/tests/test_return_logical.py +65 -0
  449. numpy/f2py/tests/test_return_real.py +109 -0
  450. numpy/f2py/tests/test_routines.py +29 -0
  451. numpy/f2py/tests/test_semicolon_split.py +75 -0
  452. numpy/f2py/tests/test_size.py +45 -0
  453. numpy/f2py/tests/test_string.py +100 -0
  454. numpy/f2py/tests/test_symbolic.py +500 -0
  455. numpy/f2py/tests/test_value_attrspec.py +15 -0
  456. numpy/f2py/tests/util.py +442 -0
  457. numpy/f2py/use_rules.py +99 -0
  458. numpy/f2py/use_rules.pyi +9 -0
  459. numpy/fft/__init__.py +213 -0
  460. numpy/fft/__init__.pyi +38 -0
  461. numpy/fft/_helper.py +235 -0
  462. numpy/fft/_helper.pyi +44 -0
  463. numpy/fft/_pocketfft.py +1693 -0
  464. numpy/fft/_pocketfft.pyi +137 -0
  465. numpy/fft/_pocketfft_umath.cpython-313t-aarch64-linux-musl.so +0 -0
  466. numpy/fft/tests/__init__.py +0 -0
  467. numpy/fft/tests/test_helper.py +167 -0
  468. numpy/fft/tests/test_pocketfft.py +589 -0
  469. numpy/lib/__init__.py +97 -0
  470. numpy/lib/__init__.pyi +52 -0
  471. numpy/lib/_array_utils_impl.py +62 -0
  472. numpy/lib/_array_utils_impl.pyi +10 -0
  473. numpy/lib/_arraypad_impl.py +926 -0
  474. numpy/lib/_arraypad_impl.pyi +88 -0
  475. numpy/lib/_arraysetops_impl.py +1158 -0
  476. numpy/lib/_arraysetops_impl.pyi +462 -0
  477. numpy/lib/_arrayterator_impl.py +224 -0
  478. numpy/lib/_arrayterator_impl.pyi +45 -0
  479. numpy/lib/_datasource.py +700 -0
  480. numpy/lib/_datasource.pyi +30 -0
  481. numpy/lib/_format_impl.py +1036 -0
  482. numpy/lib/_format_impl.pyi +56 -0
  483. numpy/lib/_function_base_impl.py +5758 -0
  484. numpy/lib/_function_base_impl.pyi +2324 -0
  485. numpy/lib/_histograms_impl.py +1085 -0
  486. numpy/lib/_histograms_impl.pyi +40 -0
  487. numpy/lib/_index_tricks_impl.py +1048 -0
  488. numpy/lib/_index_tricks_impl.pyi +267 -0
  489. numpy/lib/_iotools.py +900 -0
  490. numpy/lib/_iotools.pyi +116 -0
  491. numpy/lib/_nanfunctions_impl.py +2001 -0
  492. numpy/lib/_nanfunctions_impl.pyi +48 -0
  493. numpy/lib/_npyio_impl.py +2583 -0
  494. numpy/lib/_npyio_impl.pyi +299 -0
  495. numpy/lib/_polynomial_impl.py +1465 -0
  496. numpy/lib/_polynomial_impl.pyi +338 -0
  497. numpy/lib/_scimath_impl.py +642 -0
  498. numpy/lib/_scimath_impl.pyi +93 -0
  499. numpy/lib/_shape_base_impl.py +1289 -0
  500. numpy/lib/_shape_base_impl.pyi +236 -0
  501. numpy/lib/_stride_tricks_impl.py +582 -0
  502. numpy/lib/_stride_tricks_impl.pyi +73 -0
  503. numpy/lib/_twodim_base_impl.py +1201 -0
  504. numpy/lib/_twodim_base_impl.pyi +408 -0
  505. numpy/lib/_type_check_impl.py +710 -0
  506. numpy/lib/_type_check_impl.pyi +348 -0
  507. numpy/lib/_ufunclike_impl.py +199 -0
  508. numpy/lib/_ufunclike_impl.pyi +60 -0
  509. numpy/lib/_user_array_impl.py +310 -0
  510. numpy/lib/_user_array_impl.pyi +226 -0
  511. numpy/lib/_utils_impl.py +784 -0
  512. numpy/lib/_utils_impl.pyi +22 -0
  513. numpy/lib/_version.py +153 -0
  514. numpy/lib/_version.pyi +17 -0
  515. numpy/lib/array_utils.py +7 -0
  516. numpy/lib/array_utils.pyi +6 -0
  517. numpy/lib/format.py +24 -0
  518. numpy/lib/format.pyi +24 -0
  519. numpy/lib/introspect.py +94 -0
  520. numpy/lib/introspect.pyi +3 -0
  521. numpy/lib/mixins.py +180 -0
  522. numpy/lib/mixins.pyi +78 -0
  523. numpy/lib/npyio.py +1 -0
  524. numpy/lib/npyio.pyi +5 -0
  525. numpy/lib/recfunctions.py +1681 -0
  526. numpy/lib/recfunctions.pyi +444 -0
  527. numpy/lib/scimath.py +13 -0
  528. numpy/lib/scimath.pyi +12 -0
  529. numpy/lib/stride_tricks.py +1 -0
  530. numpy/lib/stride_tricks.pyi +4 -0
  531. numpy/lib/tests/__init__.py +0 -0
  532. numpy/lib/tests/data/py2-np0-objarr.npy +0 -0
  533. numpy/lib/tests/data/py2-objarr.npy +0 -0
  534. numpy/lib/tests/data/py2-objarr.npz +0 -0
  535. numpy/lib/tests/data/py3-objarr.npy +0 -0
  536. numpy/lib/tests/data/py3-objarr.npz +0 -0
  537. numpy/lib/tests/data/python3.npy +0 -0
  538. numpy/lib/tests/data/win64python2.npy +0 -0
  539. numpy/lib/tests/test__datasource.py +328 -0
  540. numpy/lib/tests/test__iotools.py +358 -0
  541. numpy/lib/tests/test__version.py +64 -0
  542. numpy/lib/tests/test_array_utils.py +32 -0
  543. numpy/lib/tests/test_arraypad.py +1427 -0
  544. numpy/lib/tests/test_arraysetops.py +1302 -0
  545. numpy/lib/tests/test_arrayterator.py +45 -0
  546. numpy/lib/tests/test_format.py +1054 -0
  547. numpy/lib/tests/test_function_base.py +4705 -0
  548. numpy/lib/tests/test_histograms.py +855 -0
  549. numpy/lib/tests/test_index_tricks.py +693 -0
  550. numpy/lib/tests/test_io.py +2857 -0
  551. numpy/lib/tests/test_loadtxt.py +1099 -0
  552. numpy/lib/tests/test_mixins.py +215 -0
  553. numpy/lib/tests/test_nanfunctions.py +1438 -0
  554. numpy/lib/tests/test_packbits.py +376 -0
  555. numpy/lib/tests/test_polynomial.py +325 -0
  556. numpy/lib/tests/test_recfunctions.py +1042 -0
  557. numpy/lib/tests/test_regression.py +231 -0
  558. numpy/lib/tests/test_shape_base.py +813 -0
  559. numpy/lib/tests/test_stride_tricks.py +655 -0
  560. numpy/lib/tests/test_twodim_base.py +559 -0
  561. numpy/lib/tests/test_type_check.py +473 -0
  562. numpy/lib/tests/test_ufunclike.py +97 -0
  563. numpy/lib/tests/test_utils.py +80 -0
  564. numpy/lib/user_array.py +1 -0
  565. numpy/lib/user_array.pyi +1 -0
  566. numpy/linalg/__init__.py +95 -0
  567. numpy/linalg/__init__.pyi +71 -0
  568. numpy/linalg/_linalg.py +3657 -0
  569. numpy/linalg/_linalg.pyi +548 -0
  570. numpy/linalg/_umath_linalg.cpython-313t-aarch64-linux-musl.so +0 -0
  571. numpy/linalg/_umath_linalg.pyi +60 -0
  572. numpy/linalg/lapack_lite.cpython-313t-aarch64-linux-musl.so +0 -0
  573. numpy/linalg/lapack_lite.pyi +143 -0
  574. numpy/linalg/tests/__init__.py +0 -0
  575. numpy/linalg/tests/test_deprecations.py +21 -0
  576. numpy/linalg/tests/test_linalg.py +2442 -0
  577. numpy/linalg/tests/test_regression.py +182 -0
  578. numpy/ma/API_CHANGES.txt +135 -0
  579. numpy/ma/LICENSE +24 -0
  580. numpy/ma/README.rst +236 -0
  581. numpy/ma/__init__.py +53 -0
  582. numpy/ma/__init__.pyi +458 -0
  583. numpy/ma/core.py +8929 -0
  584. numpy/ma/core.pyi +3720 -0
  585. numpy/ma/extras.py +2266 -0
  586. numpy/ma/extras.pyi +297 -0
  587. numpy/ma/mrecords.py +762 -0
  588. numpy/ma/mrecords.pyi +96 -0
  589. numpy/ma/tests/__init__.py +0 -0
  590. numpy/ma/tests/test_arrayobject.py +40 -0
  591. numpy/ma/tests/test_core.py +6008 -0
  592. numpy/ma/tests/test_deprecations.py +65 -0
  593. numpy/ma/tests/test_extras.py +1945 -0
  594. numpy/ma/tests/test_mrecords.py +495 -0
  595. numpy/ma/tests/test_old_ma.py +939 -0
  596. numpy/ma/tests/test_regression.py +83 -0
  597. numpy/ma/tests/test_subclassing.py +469 -0
  598. numpy/ma/testutils.py +294 -0
  599. numpy/ma/testutils.pyi +69 -0
  600. numpy/matlib.py +380 -0
  601. numpy/matlib.pyi +580 -0
  602. numpy/matrixlib/__init__.py +12 -0
  603. numpy/matrixlib/__init__.pyi +3 -0
  604. numpy/matrixlib/defmatrix.py +1119 -0
  605. numpy/matrixlib/defmatrix.pyi +218 -0
  606. numpy/matrixlib/tests/__init__.py +0 -0
  607. numpy/matrixlib/tests/test_defmatrix.py +455 -0
  608. numpy/matrixlib/tests/test_interaction.py +360 -0
  609. numpy/matrixlib/tests/test_masked_matrix.py +240 -0
  610. numpy/matrixlib/tests/test_matrix_linalg.py +110 -0
  611. numpy/matrixlib/tests/test_multiarray.py +17 -0
  612. numpy/matrixlib/tests/test_numeric.py +18 -0
  613. numpy/matrixlib/tests/test_regression.py +31 -0
  614. numpy/polynomial/__init__.py +187 -0
  615. numpy/polynomial/__init__.pyi +31 -0
  616. numpy/polynomial/_polybase.py +1191 -0
  617. numpy/polynomial/_polybase.pyi +262 -0
  618. numpy/polynomial/_polytypes.pyi +501 -0
  619. numpy/polynomial/chebyshev.py +2001 -0
  620. numpy/polynomial/chebyshev.pyi +180 -0
  621. numpy/polynomial/hermite.py +1738 -0
  622. numpy/polynomial/hermite.pyi +106 -0
  623. numpy/polynomial/hermite_e.py +1640 -0
  624. numpy/polynomial/hermite_e.pyi +106 -0
  625. numpy/polynomial/laguerre.py +1673 -0
  626. numpy/polynomial/laguerre.pyi +100 -0
  627. numpy/polynomial/legendre.py +1603 -0
  628. numpy/polynomial/legendre.pyi +100 -0
  629. numpy/polynomial/polynomial.py +1625 -0
  630. numpy/polynomial/polynomial.pyi +109 -0
  631. numpy/polynomial/polyutils.py +759 -0
  632. numpy/polynomial/polyutils.pyi +307 -0
  633. numpy/polynomial/tests/__init__.py +0 -0
  634. numpy/polynomial/tests/test_chebyshev.py +618 -0
  635. numpy/polynomial/tests/test_classes.py +613 -0
  636. numpy/polynomial/tests/test_hermite.py +553 -0
  637. numpy/polynomial/tests/test_hermite_e.py +554 -0
  638. numpy/polynomial/tests/test_laguerre.py +535 -0
  639. numpy/polynomial/tests/test_legendre.py +566 -0
  640. numpy/polynomial/tests/test_polynomial.py +691 -0
  641. numpy/polynomial/tests/test_polyutils.py +123 -0
  642. numpy/polynomial/tests/test_printing.py +557 -0
  643. numpy/polynomial/tests/test_symbol.py +217 -0
  644. numpy/py.typed +0 -0
  645. numpy/random/LICENSE.md +71 -0
  646. numpy/random/__init__.pxd +14 -0
  647. numpy/random/__init__.py +213 -0
  648. numpy/random/__init__.pyi +124 -0
  649. numpy/random/_bounded_integers.cpython-313t-aarch64-linux-musl.so +0 -0
  650. numpy/random/_bounded_integers.pxd +29 -0
  651. numpy/random/_bounded_integers.pyi +1 -0
  652. numpy/random/_common.cpython-313t-aarch64-linux-musl.so +0 -0
  653. numpy/random/_common.pxd +107 -0
  654. numpy/random/_common.pyi +16 -0
  655. numpy/random/_examples/cffi/extending.py +44 -0
  656. numpy/random/_examples/cffi/parse.py +53 -0
  657. numpy/random/_examples/cython/extending.pyx +77 -0
  658. numpy/random/_examples/cython/extending_distributions.pyx +117 -0
  659. numpy/random/_examples/cython/meson.build +53 -0
  660. numpy/random/_examples/numba/extending.py +86 -0
  661. numpy/random/_examples/numba/extending_distributions.py +67 -0
  662. numpy/random/_generator.cpython-313t-aarch64-linux-musl.so +0 -0
  663. numpy/random/_generator.pyi +862 -0
  664. numpy/random/_mt19937.cpython-313t-aarch64-linux-musl.so +0 -0
  665. numpy/random/_mt19937.pyi +27 -0
  666. numpy/random/_pcg64.cpython-313t-aarch64-linux-musl.so +0 -0
  667. numpy/random/_pcg64.pyi +41 -0
  668. numpy/random/_philox.cpython-313t-aarch64-linux-musl.so +0 -0
  669. numpy/random/_philox.pyi +36 -0
  670. numpy/random/_pickle.py +88 -0
  671. numpy/random/_pickle.pyi +43 -0
  672. numpy/random/_sfc64.cpython-313t-aarch64-linux-musl.so +0 -0
  673. numpy/random/_sfc64.pyi +25 -0
  674. numpy/random/bit_generator.cpython-313t-aarch64-linux-musl.so +0 -0
  675. numpy/random/bit_generator.pxd +35 -0
  676. numpy/random/bit_generator.pyi +123 -0
  677. numpy/random/c_distributions.pxd +119 -0
  678. numpy/random/lib/libnpyrandom.a +0 -0
  679. numpy/random/mtrand.cpython-313t-aarch64-linux-musl.so +0 -0
  680. numpy/random/mtrand.pyi +759 -0
  681. numpy/random/tests/__init__.py +0 -0
  682. numpy/random/tests/data/__init__.py +0 -0
  683. numpy/random/tests/data/generator_pcg64_np121.pkl.gz +0 -0
  684. numpy/random/tests/data/generator_pcg64_np126.pkl.gz +0 -0
  685. numpy/random/tests/data/mt19937-testset-1.csv +1001 -0
  686. numpy/random/tests/data/mt19937-testset-2.csv +1001 -0
  687. numpy/random/tests/data/pcg64-testset-1.csv +1001 -0
  688. numpy/random/tests/data/pcg64-testset-2.csv +1001 -0
  689. numpy/random/tests/data/pcg64dxsm-testset-1.csv +1001 -0
  690. numpy/random/tests/data/pcg64dxsm-testset-2.csv +1001 -0
  691. numpy/random/tests/data/philox-testset-1.csv +1001 -0
  692. numpy/random/tests/data/philox-testset-2.csv +1001 -0
  693. numpy/random/tests/data/sfc64-testset-1.csv +1001 -0
  694. numpy/random/tests/data/sfc64-testset-2.csv +1001 -0
  695. numpy/random/tests/data/sfc64_np126.pkl.gz +0 -0
  696. numpy/random/tests/test_direct.py +595 -0
  697. numpy/random/tests/test_extending.py +131 -0
  698. numpy/random/tests/test_generator_mt19937.py +2825 -0
  699. numpy/random/tests/test_generator_mt19937_regressions.py +221 -0
  700. numpy/random/tests/test_random.py +1724 -0
  701. numpy/random/tests/test_randomstate.py +2099 -0
  702. numpy/random/tests/test_randomstate_regression.py +213 -0
  703. numpy/random/tests/test_regression.py +175 -0
  704. numpy/random/tests/test_seed_sequence.py +79 -0
  705. numpy/random/tests/test_smoke.py +882 -0
  706. numpy/rec/__init__.py +2 -0
  707. numpy/rec/__init__.pyi +23 -0
  708. numpy/strings/__init__.py +2 -0
  709. numpy/strings/__init__.pyi +97 -0
  710. numpy/testing/__init__.py +22 -0
  711. numpy/testing/__init__.pyi +107 -0
  712. numpy/testing/_private/__init__.py +0 -0
  713. numpy/testing/_private/__init__.pyi +0 -0
  714. numpy/testing/_private/extbuild.py +250 -0
  715. numpy/testing/_private/extbuild.pyi +25 -0
  716. numpy/testing/_private/utils.py +2830 -0
  717. numpy/testing/_private/utils.pyi +505 -0
  718. numpy/testing/overrides.py +84 -0
  719. numpy/testing/overrides.pyi +10 -0
  720. numpy/testing/print_coercion_tables.py +207 -0
  721. numpy/testing/print_coercion_tables.pyi +26 -0
  722. numpy/testing/tests/__init__.py +0 -0
  723. numpy/testing/tests/test_utils.py +2123 -0
  724. numpy/tests/__init__.py +0 -0
  725. numpy/tests/test__all__.py +10 -0
  726. numpy/tests/test_configtool.py +51 -0
  727. numpy/tests/test_ctypeslib.py +383 -0
  728. numpy/tests/test_lazyloading.py +42 -0
  729. numpy/tests/test_matlib.py +59 -0
  730. numpy/tests/test_numpy_config.py +47 -0
  731. numpy/tests/test_numpy_version.py +54 -0
  732. numpy/tests/test_public_api.py +804 -0
  733. numpy/tests/test_reloading.py +76 -0
  734. numpy/tests/test_scripts.py +48 -0
  735. numpy/tests/test_warnings.py +79 -0
  736. numpy/typing/__init__.py +233 -0
  737. numpy/typing/__init__.pyi +3 -0
  738. numpy/typing/mypy_plugin.py +200 -0
  739. numpy/typing/tests/__init__.py +0 -0
  740. numpy/typing/tests/data/fail/arithmetic.pyi +126 -0
  741. numpy/typing/tests/data/fail/array_constructors.pyi +34 -0
  742. numpy/typing/tests/data/fail/array_like.pyi +15 -0
  743. numpy/typing/tests/data/fail/array_pad.pyi +6 -0
  744. numpy/typing/tests/data/fail/arrayprint.pyi +15 -0
  745. numpy/typing/tests/data/fail/arrayterator.pyi +14 -0
  746. numpy/typing/tests/data/fail/bitwise_ops.pyi +17 -0
  747. numpy/typing/tests/data/fail/char.pyi +63 -0
  748. numpy/typing/tests/data/fail/chararray.pyi +61 -0
  749. numpy/typing/tests/data/fail/comparisons.pyi +27 -0
  750. numpy/typing/tests/data/fail/constants.pyi +3 -0
  751. numpy/typing/tests/data/fail/datasource.pyi +16 -0
  752. numpy/typing/tests/data/fail/dtype.pyi +17 -0
  753. numpy/typing/tests/data/fail/einsumfunc.pyi +12 -0
  754. numpy/typing/tests/data/fail/flatiter.pyi +38 -0
  755. numpy/typing/tests/data/fail/fromnumeric.pyi +148 -0
  756. numpy/typing/tests/data/fail/histograms.pyi +12 -0
  757. numpy/typing/tests/data/fail/index_tricks.pyi +14 -0
  758. numpy/typing/tests/data/fail/lib_function_base.pyi +60 -0
  759. numpy/typing/tests/data/fail/lib_polynomial.pyi +29 -0
  760. numpy/typing/tests/data/fail/lib_utils.pyi +3 -0
  761. numpy/typing/tests/data/fail/lib_version.pyi +6 -0
  762. numpy/typing/tests/data/fail/linalg.pyi +52 -0
  763. numpy/typing/tests/data/fail/ma.pyi +155 -0
  764. numpy/typing/tests/data/fail/memmap.pyi +5 -0
  765. numpy/typing/tests/data/fail/modules.pyi +17 -0
  766. numpy/typing/tests/data/fail/multiarray.pyi +52 -0
  767. numpy/typing/tests/data/fail/ndarray.pyi +11 -0
  768. numpy/typing/tests/data/fail/ndarray_misc.pyi +49 -0
  769. numpy/typing/tests/data/fail/nditer.pyi +8 -0
  770. numpy/typing/tests/data/fail/nested_sequence.pyi +17 -0
  771. numpy/typing/tests/data/fail/npyio.pyi +24 -0
  772. numpy/typing/tests/data/fail/numerictypes.pyi +5 -0
  773. numpy/typing/tests/data/fail/random.pyi +62 -0
  774. numpy/typing/tests/data/fail/rec.pyi +17 -0
  775. numpy/typing/tests/data/fail/scalars.pyi +86 -0
  776. numpy/typing/tests/data/fail/shape.pyi +7 -0
  777. numpy/typing/tests/data/fail/shape_base.pyi +8 -0
  778. numpy/typing/tests/data/fail/stride_tricks.pyi +9 -0
  779. numpy/typing/tests/data/fail/strings.pyi +52 -0
  780. numpy/typing/tests/data/fail/testing.pyi +28 -0
  781. numpy/typing/tests/data/fail/twodim_base.pyi +39 -0
  782. numpy/typing/tests/data/fail/type_check.pyi +12 -0
  783. numpy/typing/tests/data/fail/ufunc_config.pyi +21 -0
  784. numpy/typing/tests/data/fail/ufunclike.pyi +21 -0
  785. numpy/typing/tests/data/fail/ufuncs.pyi +17 -0
  786. numpy/typing/tests/data/fail/warnings_and_errors.pyi +5 -0
  787. numpy/typing/tests/data/misc/extended_precision.pyi +9 -0
  788. numpy/typing/tests/data/mypy.ini +8 -0
  789. numpy/typing/tests/data/pass/arithmetic.py +614 -0
  790. numpy/typing/tests/data/pass/array_constructors.py +138 -0
  791. numpy/typing/tests/data/pass/array_like.py +43 -0
  792. numpy/typing/tests/data/pass/arrayprint.py +37 -0
  793. numpy/typing/tests/data/pass/arrayterator.py +28 -0
  794. numpy/typing/tests/data/pass/bitwise_ops.py +131 -0
  795. numpy/typing/tests/data/pass/comparisons.py +316 -0
  796. numpy/typing/tests/data/pass/dtype.py +57 -0
  797. numpy/typing/tests/data/pass/einsumfunc.py +36 -0
  798. numpy/typing/tests/data/pass/flatiter.py +26 -0
  799. numpy/typing/tests/data/pass/fromnumeric.py +272 -0
  800. numpy/typing/tests/data/pass/index_tricks.py +62 -0
  801. numpy/typing/tests/data/pass/lib_user_array.py +22 -0
  802. numpy/typing/tests/data/pass/lib_utils.py +19 -0
  803. numpy/typing/tests/data/pass/lib_version.py +18 -0
  804. numpy/typing/tests/data/pass/literal.py +52 -0
  805. numpy/typing/tests/data/pass/ma.py +199 -0
  806. numpy/typing/tests/data/pass/mod.py +149 -0
  807. numpy/typing/tests/data/pass/modules.py +45 -0
  808. numpy/typing/tests/data/pass/multiarray.py +77 -0
  809. numpy/typing/tests/data/pass/ndarray_conversion.py +81 -0
  810. numpy/typing/tests/data/pass/ndarray_misc.py +199 -0
  811. numpy/typing/tests/data/pass/ndarray_shape_manipulation.py +47 -0
  812. numpy/typing/tests/data/pass/nditer.py +4 -0
  813. numpy/typing/tests/data/pass/numeric.py +90 -0
  814. numpy/typing/tests/data/pass/numerictypes.py +17 -0
  815. numpy/typing/tests/data/pass/random.py +1498 -0
  816. numpy/typing/tests/data/pass/recfunctions.py +164 -0
  817. numpy/typing/tests/data/pass/scalars.py +249 -0
  818. numpy/typing/tests/data/pass/shape.py +19 -0
  819. numpy/typing/tests/data/pass/simple.py +170 -0
  820. numpy/typing/tests/data/pass/ufunc_config.py +64 -0
  821. numpy/typing/tests/data/pass/ufunclike.py +52 -0
  822. numpy/typing/tests/data/pass/ufuncs.py +16 -0
  823. numpy/typing/tests/data/pass/warnings_and_errors.py +6 -0
  824. numpy/typing/tests/data/reveal/arithmetic.pyi +719 -0
  825. numpy/typing/tests/data/reveal/array_api_info.pyi +70 -0
  826. numpy/typing/tests/data/reveal/array_constructors.pyi +277 -0
  827. numpy/typing/tests/data/reveal/arraypad.pyi +27 -0
  828. numpy/typing/tests/data/reveal/arrayprint.pyi +25 -0
  829. numpy/typing/tests/data/reveal/arraysetops.pyi +74 -0
  830. numpy/typing/tests/data/reveal/arrayterator.pyi +27 -0
  831. numpy/typing/tests/data/reveal/bitwise_ops.pyi +166 -0
  832. numpy/typing/tests/data/reveal/char.pyi +225 -0
  833. numpy/typing/tests/data/reveal/chararray.pyi +138 -0
  834. numpy/typing/tests/data/reveal/comparisons.pyi +264 -0
  835. numpy/typing/tests/data/reveal/constants.pyi +14 -0
  836. numpy/typing/tests/data/reveal/ctypeslib.pyi +81 -0
  837. numpy/typing/tests/data/reveal/datasource.pyi +23 -0
  838. numpy/typing/tests/data/reveal/dtype.pyi +132 -0
  839. numpy/typing/tests/data/reveal/einsumfunc.pyi +39 -0
  840. numpy/typing/tests/data/reveal/emath.pyi +54 -0
  841. numpy/typing/tests/data/reveal/fft.pyi +37 -0
  842. numpy/typing/tests/data/reveal/flatiter.pyi +86 -0
  843. numpy/typing/tests/data/reveal/fromnumeric.pyi +347 -0
  844. numpy/typing/tests/data/reveal/getlimits.pyi +53 -0
  845. numpy/typing/tests/data/reveal/histograms.pyi +25 -0
  846. numpy/typing/tests/data/reveal/index_tricks.pyi +70 -0
  847. numpy/typing/tests/data/reveal/lib_function_base.pyi +409 -0
  848. numpy/typing/tests/data/reveal/lib_polynomial.pyi +147 -0
  849. numpy/typing/tests/data/reveal/lib_utils.pyi +17 -0
  850. numpy/typing/tests/data/reveal/lib_version.pyi +20 -0
  851. numpy/typing/tests/data/reveal/linalg.pyi +154 -0
  852. numpy/typing/tests/data/reveal/ma.pyi +1098 -0
  853. numpy/typing/tests/data/reveal/matrix.pyi +73 -0
  854. numpy/typing/tests/data/reveal/memmap.pyi +19 -0
  855. numpy/typing/tests/data/reveal/mod.pyi +178 -0
  856. numpy/typing/tests/data/reveal/modules.pyi +51 -0
  857. numpy/typing/tests/data/reveal/multiarray.pyi +197 -0
  858. numpy/typing/tests/data/reveal/nbit_base_example.pyi +20 -0
  859. numpy/typing/tests/data/reveal/ndarray_assignability.pyi +82 -0
  860. numpy/typing/tests/data/reveal/ndarray_conversion.pyi +83 -0
  861. numpy/typing/tests/data/reveal/ndarray_misc.pyi +246 -0
  862. numpy/typing/tests/data/reveal/ndarray_shape_manipulation.pyi +47 -0
  863. numpy/typing/tests/data/reveal/nditer.pyi +49 -0
  864. numpy/typing/tests/data/reveal/nested_sequence.pyi +25 -0
  865. numpy/typing/tests/data/reveal/npyio.pyi +83 -0
  866. numpy/typing/tests/data/reveal/numeric.pyi +170 -0
  867. numpy/typing/tests/data/reveal/numerictypes.pyi +16 -0
  868. numpy/typing/tests/data/reveal/polynomial_polybase.pyi +217 -0
  869. numpy/typing/tests/data/reveal/polynomial_polyutils.pyi +218 -0
  870. numpy/typing/tests/data/reveal/polynomial_series.pyi +138 -0
  871. numpy/typing/tests/data/reveal/random.pyi +1546 -0
  872. numpy/typing/tests/data/reveal/rec.pyi +171 -0
  873. numpy/typing/tests/data/reveal/scalars.pyi +191 -0
  874. numpy/typing/tests/data/reveal/shape.pyi +13 -0
  875. numpy/typing/tests/data/reveal/shape_base.pyi +52 -0
  876. numpy/typing/tests/data/reveal/stride_tricks.pyi +27 -0
  877. numpy/typing/tests/data/reveal/strings.pyi +196 -0
  878. numpy/typing/tests/data/reveal/testing.pyi +198 -0
  879. numpy/typing/tests/data/reveal/twodim_base.pyi +225 -0
  880. numpy/typing/tests/data/reveal/type_check.pyi +67 -0
  881. numpy/typing/tests/data/reveal/ufunc_config.pyi +29 -0
  882. numpy/typing/tests/data/reveal/ufunclike.pyi +31 -0
  883. numpy/typing/tests/data/reveal/ufuncs.pyi +142 -0
  884. numpy/typing/tests/data/reveal/warnings_and_errors.pyi +11 -0
  885. numpy/typing/tests/test_isfile.py +38 -0
  886. numpy/typing/tests/test_runtime.py +110 -0
  887. numpy/typing/tests/test_typing.py +205 -0
  888. numpy/version.py +11 -0
  889. numpy/version.pyi +9 -0
  890. numpy-2.4.0.dist-info/METADATA +139 -0
  891. numpy-2.4.0.dist-info/RECORD +915 -0
  892. numpy-2.4.0.dist-info/WHEEL +5 -0
  893. numpy-2.4.0.dist-info/entry_points.txt +13 -0
  894. numpy-2.4.0.dist-info/licenses/LICENSE.txt +935 -0
  895. numpy-2.4.0.dist-info/licenses/numpy/_core/include/numpy/libdivide/LICENSE.txt +21 -0
  896. numpy-2.4.0.dist-info/licenses/numpy/_core/src/common/pythoncapi-compat/COPYING +14 -0
  897. numpy-2.4.0.dist-info/licenses/numpy/_core/src/highway/LICENSE +371 -0
  898. numpy-2.4.0.dist-info/licenses/numpy/_core/src/multiarray/dragon4_LICENSE.txt +27 -0
  899. numpy-2.4.0.dist-info/licenses/numpy/_core/src/npysort/x86-simd-sort/LICENSE.md +28 -0
  900. numpy-2.4.0.dist-info/licenses/numpy/_core/src/umath/svml/LICENSE +30 -0
  901. numpy-2.4.0.dist-info/licenses/numpy/fft/pocketfft/LICENSE.md +25 -0
  902. numpy-2.4.0.dist-info/licenses/numpy/linalg/lapack_lite/LICENSE.txt +48 -0
  903. numpy-2.4.0.dist-info/licenses/numpy/ma/LICENSE +24 -0
  904. numpy-2.4.0.dist-info/licenses/numpy/random/LICENSE.md +71 -0
  905. numpy-2.4.0.dist-info/licenses/numpy/random/src/distributions/LICENSE.md +61 -0
  906. numpy-2.4.0.dist-info/licenses/numpy/random/src/mt19937/LICENSE.md +61 -0
  907. numpy-2.4.0.dist-info/licenses/numpy/random/src/pcg64/LICENSE.md +22 -0
  908. numpy-2.4.0.dist-info/licenses/numpy/random/src/philox/LICENSE.md +31 -0
  909. numpy-2.4.0.dist-info/licenses/numpy/random/src/sfc64/LICENSE.md +27 -0
  910. numpy-2.4.0.dist-info/licenses/numpy/random/src/splitmix64/LICENSE.md +9 -0
  911. numpy.libs/libgcc_s-2d945d6c-767fb991.so.1 +0 -0
  912. numpy.libs/libgcc_s-2d945d6c.so.1 +0 -0
  913. numpy.libs/libgfortran-67378ab2-e7e7cfab.so.5.0.0 +0 -0
  914. numpy.libs/libscipy_openblas64_-1fc386ee.so +0 -0
  915. numpy.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
@@ -0,0 +1,1345 @@
1
+ # NOTE: Please avoid the use of numpy.testing since NPYV intrinsics
2
+ # may be involved in their functionality.
3
+ import itertools
4
+ import math
5
+ import operator
6
+ import re
7
+
8
+ import pytest
9
+
10
+ from numpy._core._multiarray_umath import __cpu_baseline__
11
+ from numpy._core._simd import clear_floatstatus, get_floatstatus, targets
12
+
13
+
14
+ def check_floatstatus(divbyzero=False, overflow=False,
15
+ underflow=False, invalid=False,
16
+ all=False):
17
+ #define NPY_FPE_DIVIDEBYZERO 1
18
+ #define NPY_FPE_OVERFLOW 2
19
+ #define NPY_FPE_UNDERFLOW 4
20
+ #define NPY_FPE_INVALID 8
21
+ err = get_floatstatus()
22
+ ret = (all or divbyzero) and (err & 1) != 0
23
+ ret |= (all or overflow) and (err & 2) != 0
24
+ ret |= (all or underflow) and (err & 4) != 0
25
+ ret |= (all or invalid) and (err & 8) != 0
26
+ return ret
27
+
28
+ class _Test_Utility:
29
+ # submodule of the desired SIMD extension, e.g. targets["AVX512F"]
30
+ npyv = None
31
+ # the current data type suffix e.g. 's8'
32
+ sfx = None
33
+ # target name can be 'baseline' or one or more of CPU features
34
+ target_name = None
35
+
36
+ def __getattr__(self, attr):
37
+ """
38
+ To call NPV intrinsics without the attribute 'npyv' and
39
+ auto suffixing intrinsics according to class attribute 'sfx'
40
+ """
41
+ return getattr(self.npyv, attr + "_" + self.sfx)
42
+
43
+ def _x2(self, intrin_name):
44
+ return getattr(self.npyv, f"{intrin_name}_{self.sfx}x2")
45
+
46
+ def _data(self, start=None, count=None, reverse=False):
47
+ """
48
+ Create list of consecutive numbers according to number of vector's lanes.
49
+ """
50
+ if start is None:
51
+ start = 1
52
+ if count is None:
53
+ count = self.nlanes
54
+ rng = range(start, start + count)
55
+ if reverse:
56
+ rng = reversed(rng)
57
+ if self._is_fp():
58
+ return [x / 1.0 for x in rng]
59
+ return list(rng)
60
+
61
+ def _is_unsigned(self):
62
+ return self.sfx[0] == 'u'
63
+
64
+ def _is_signed(self):
65
+ return self.sfx[0] == 's'
66
+
67
+ def _is_fp(self):
68
+ return self.sfx[0] == 'f'
69
+
70
+ def _scalar_size(self):
71
+ return int(self.sfx[1:])
72
+
73
+ def _int_clip(self, seq):
74
+ if self._is_fp():
75
+ return seq
76
+ max_int = self._int_max()
77
+ min_int = self._int_min()
78
+ return [min(max(v, min_int), max_int) for v in seq]
79
+
80
+ def _int_max(self):
81
+ if self._is_fp():
82
+ return None
83
+ max_u = self._to_unsigned(self.setall(-1))[0]
84
+ if self._is_signed():
85
+ return max_u // 2
86
+ return max_u
87
+
88
+ def _int_min(self):
89
+ if self._is_fp():
90
+ return None
91
+ if self._is_unsigned():
92
+ return 0
93
+ return -(self._int_max() + 1)
94
+
95
+ def _true_mask(self):
96
+ max_unsig = getattr(self.npyv, "setall_u" + self.sfx[1:])(-1)
97
+ return max_unsig[0]
98
+
99
+ def _to_unsigned(self, vector):
100
+ if isinstance(vector, (list, tuple)):
101
+ return getattr(self.npyv, "load_u" + self.sfx[1:])(vector)
102
+ else:
103
+ sfx = vector.__name__.replace("npyv_", "")
104
+ if sfx[0] == "b":
105
+ cvt_intrin = "cvt_u{0}_b{0}"
106
+ else:
107
+ cvt_intrin = "reinterpret_u{0}_{1}"
108
+ return getattr(self.npyv, cvt_intrin.format(sfx[1:], sfx))(vector)
109
+
110
+ def _pinfinity(self):
111
+ return float("inf")
112
+
113
+ def _ninfinity(self):
114
+ return -float("inf")
115
+
116
+ def _nan(self):
117
+ return float("nan")
118
+
119
+ def _cpu_features(self):
120
+ target = self.target_name
121
+ if target == "baseline":
122
+ target = __cpu_baseline__
123
+ else:
124
+ target = target.split('__') # multi-target separator
125
+ return ' '.join(target)
126
+
127
+ class _SIMD_BOOL(_Test_Utility):
128
+ """
129
+ To test all boolean vector types at once
130
+ """
131
+ def _nlanes(self):
132
+ return getattr(self.npyv, "nlanes_u" + self.sfx[1:])
133
+
134
+ def _data(self, start=None, count=None, reverse=False):
135
+ true_mask = self._true_mask()
136
+ rng = range(self._nlanes())
137
+ if reverse:
138
+ rng = reversed(rng)
139
+ return [true_mask if x % 2 else 0 for x in rng]
140
+
141
+ def _load_b(self, data):
142
+ len_str = self.sfx[1:]
143
+ load = getattr(self.npyv, "load_u" + len_str)
144
+ cvt = getattr(self.npyv, f"cvt_b{len_str}_u{len_str}")
145
+ return cvt(load(data))
146
+
147
+ def test_operators_logical(self):
148
+ """
149
+ Logical operations for boolean types.
150
+ Test intrinsics:
151
+ npyv_xor_##SFX, npyv_and_##SFX, npyv_or_##SFX, npyv_not_##SFX,
152
+ npyv_andc_b8, npvy_orc_b8, nvpy_xnor_b8
153
+ """
154
+ data_a = self._data()
155
+ data_b = self._data(reverse=True)
156
+ vdata_a = self._load_b(data_a)
157
+ vdata_b = self._load_b(data_b)
158
+
159
+ data_and = [a & b for a, b in zip(data_a, data_b)]
160
+ vand = getattr(self, "and")(vdata_a, vdata_b)
161
+ assert vand == data_and
162
+
163
+ data_or = [a | b for a, b in zip(data_a, data_b)]
164
+ vor = getattr(self, "or")(vdata_a, vdata_b)
165
+ assert vor == data_or
166
+
167
+ data_xor = [a ^ b for a, b in zip(data_a, data_b)]
168
+ vxor = self.xor(vdata_a, vdata_b)
169
+ assert vxor == data_xor
170
+
171
+ vnot = getattr(self, "not")(vdata_a)
172
+ assert vnot == data_b
173
+
174
+ # among the boolean types, andc, orc and xnor only support b8
175
+ if self.sfx not in ("b8"):
176
+ return
177
+
178
+ data_andc = [(a & ~b) & 0xFF for a, b in zip(data_a, data_b)]
179
+ vandc = self.andc(vdata_a, vdata_b)
180
+ assert data_andc == vandc
181
+
182
+ data_orc = [(a | ~b) & 0xFF for a, b in zip(data_a, data_b)]
183
+ vorc = self.orc(vdata_a, vdata_b)
184
+ assert data_orc == vorc
185
+
186
+ data_xnor = [~(a ^ b) & 0xFF for a, b in zip(data_a, data_b)]
187
+ vxnor = self.xnor(vdata_a, vdata_b)
188
+ assert data_xnor == vxnor
189
+
190
+ def test_tobits(self):
191
+ data2bits = lambda data: sum(int(x != 0) << i for i, x in enumerate(data, 0))
192
+ for data in (self._data(), self._data(reverse=True)):
193
+ vdata = self._load_b(data)
194
+ data_bits = data2bits(data)
195
+ tobits = self.tobits(vdata)
196
+ bin_tobits = bin(tobits)
197
+ assert bin_tobits == bin(data_bits)
198
+
199
+ def test_pack(self):
200
+ """
201
+ Pack multiple vectors into one
202
+ Test intrinsics:
203
+ npyv_pack_b8_b16
204
+ npyv_pack_b8_b32
205
+ npyv_pack_b8_b64
206
+ """
207
+ if self.sfx not in ("b16", "b32", "b64"):
208
+ return
209
+ # create the vectors
210
+ data = self._data()
211
+ rdata = self._data(reverse=True)
212
+ vdata = self._load_b(data)
213
+ vrdata = self._load_b(rdata)
214
+ pack_simd = getattr(self.npyv, f"pack_b8_{self.sfx}")
215
+ # for scalar execution, concatenate the elements of the multiple lists
216
+ # into a single list (spack) and then iterate over the elements of
217
+ # the created list applying a mask to capture the first byte of them.
218
+ if self.sfx == "b16":
219
+ spack = [(i & 0xFF) for i in (list(rdata) + list(data))]
220
+ vpack = pack_simd(vrdata, vdata)
221
+ elif self.sfx == "b32":
222
+ spack = [(i & 0xFF) for i in (2 * list(rdata) + 2 * list(data))]
223
+ vpack = pack_simd(vrdata, vrdata, vdata, vdata)
224
+ elif self.sfx == "b64":
225
+ spack = [(i & 0xFF) for i in (4 * list(rdata) + 4 * list(data))]
226
+ vpack = pack_simd(vrdata, vrdata, vrdata, vrdata,
227
+ vdata, vdata, vdata, vdata)
228
+ assert vpack == spack
229
+
230
+ @pytest.mark.parametrize("intrin", ["any", "all"])
231
+ @pytest.mark.parametrize("data", (
232
+ [-1, 0],
233
+ [0, -1],
234
+ [-1],
235
+ [0]
236
+ ))
237
+ def test_operators_crosstest(self, intrin, data):
238
+ """
239
+ Test intrinsics:
240
+ npyv_any_##SFX
241
+ npyv_all_##SFX
242
+ """
243
+ data_a = self._load_b(data * self._nlanes())
244
+ func = eval(intrin)
245
+ intrin = getattr(self, intrin)
246
+ desired = func(data_a)
247
+ simd = intrin(data_a)
248
+ assert not not simd == desired
249
+
250
+ class _SIMD_INT(_Test_Utility):
251
+ """
252
+ To test all integer vector types at once
253
+ """
254
+ def test_operators_shift(self):
255
+ if self.sfx in ("u8", "s8"):
256
+ return
257
+
258
+ data_a = self._data(self._int_max() - self.nlanes)
259
+ data_b = self._data(self._int_min(), reverse=True)
260
+ vdata_a, vdata_b = self.load(data_a), self.load(data_b)
261
+
262
+ for count in range(self._scalar_size()):
263
+ # load to cast
264
+ data_shl_a = self.load([a << count for a in data_a])
265
+ # left shift
266
+ shl = self.shl(vdata_a, count)
267
+ assert shl == data_shl_a
268
+ # load to cast
269
+ data_shr_a = self.load([a >> count for a in data_a])
270
+ # right shift
271
+ shr = self.shr(vdata_a, count)
272
+ assert shr == data_shr_a
273
+
274
+ # shift by zero or max or out-range immediate constant is not
275
+ # applicable and illogical
276
+ for count in range(1, self._scalar_size()):
277
+ # load to cast
278
+ data_shl_a = self.load([a << count for a in data_a])
279
+ # left shift by an immediate constant
280
+ shli = self.shli(vdata_a, count)
281
+ assert shli == data_shl_a
282
+ # load to cast
283
+ data_shr_a = self.load([a >> count for a in data_a])
284
+ # right shift by an immediate constant
285
+ shri = self.shri(vdata_a, count)
286
+ assert shri == data_shr_a
287
+
288
+ def test_arithmetic_subadd_saturated(self):
289
+ if self.sfx in ("u32", "s32", "u64", "s64"):
290
+ return
291
+
292
+ data_a = self._data(self._int_max() - self.nlanes)
293
+ data_b = self._data(self._int_min(), reverse=True)
294
+ vdata_a, vdata_b = self.load(data_a), self.load(data_b)
295
+
296
+ data_adds = self._int_clip([a + b for a, b in zip(data_a, data_b)])
297
+ adds = self.adds(vdata_a, vdata_b)
298
+ assert adds == data_adds
299
+
300
+ data_subs = self._int_clip([a - b for a, b in zip(data_a, data_b)])
301
+ subs = self.subs(vdata_a, vdata_b)
302
+ assert subs == data_subs
303
+
304
+ def test_math_max_min(self):
305
+ data_a = self._data()
306
+ data_b = self._data(self.nlanes)
307
+ vdata_a, vdata_b = self.load(data_a), self.load(data_b)
308
+
309
+ data_max = [max(a, b) for a, b in zip(data_a, data_b)]
310
+ simd_max = self.max(vdata_a, vdata_b)
311
+ assert simd_max == data_max
312
+
313
+ data_min = [min(a, b) for a, b in zip(data_a, data_b)]
314
+ simd_min = self.min(vdata_a, vdata_b)
315
+ assert simd_min == data_min
316
+
317
+ @pytest.mark.parametrize("start", [-100, -10000, 0, 100, 10000])
318
+ def test_reduce_max_min(self, start):
319
+ """
320
+ Test intrinsics:
321
+ npyv_reduce_max_##sfx
322
+ npyv_reduce_min_##sfx
323
+ """
324
+ vdata_a = self.load(self._data(start))
325
+ assert self.reduce_max(vdata_a) == max(vdata_a)
326
+ assert self.reduce_min(vdata_a) == min(vdata_a)
327
+
328
+
329
+ class _SIMD_FP32(_Test_Utility):
330
+ """
331
+ To only test single precision
332
+ """
333
+ def test_conversions(self):
334
+ """
335
+ Round to nearest even integer, assume CPU control register is set to rounding.
336
+ Test intrinsics:
337
+ npyv_round_s32_##SFX
338
+ """
339
+ features = self._cpu_features()
340
+ if not self.npyv.simd_f64 and re.match(r".*(NEON|ASIMD)", features):
341
+ # very costly to emulate nearest even on Armv7
342
+ # instead we round halves to up. e.g. 0.5 -> 1, -0.5 -> -1
343
+ _round = lambda v: int(v + (0.5 if v >= 0 else -0.5))
344
+ else:
345
+ _round = round
346
+ vdata_a = self.load(self._data())
347
+ vdata_a = self.sub(vdata_a, self.setall(0.5))
348
+ data_round = [_round(x) for x in vdata_a]
349
+ vround = self.round_s32(vdata_a)
350
+ assert vround == data_round
351
+
352
+ class _SIMD_FP64(_Test_Utility):
353
+ """
354
+ To only test double precision
355
+ """
356
+ def test_conversions(self):
357
+ """
358
+ Round to nearest even integer, assume CPU control register is set to rounding.
359
+ Test intrinsics:
360
+ npyv_round_s32_##SFX
361
+ """
362
+ vdata_a = self.load(self._data())
363
+ vdata_a = self.sub(vdata_a, self.setall(0.5))
364
+ vdata_b = self.mul(vdata_a, self.setall(-1.5))
365
+ data_round = [round(x) for x in list(vdata_a) + list(vdata_b)]
366
+ vround = self.round_s32(vdata_a, vdata_b)
367
+ assert vround == data_round
368
+
369
+ class _SIMD_FP(_Test_Utility):
370
+ """
371
+ To test all float vector types at once
372
+ """
373
+ def test_arithmetic_fused(self):
374
+ vdata_a, vdata_b, vdata_c = [self.load(self._data())] * 3
375
+ vdata_cx2 = self.add(vdata_c, vdata_c)
376
+ # multiply and add, a*b + c
377
+ data_fma = self.load([a * b + c for a, b, c in zip(vdata_a, vdata_b, vdata_c)])
378
+ fma = self.muladd(vdata_a, vdata_b, vdata_c)
379
+ assert fma == data_fma
380
+ # multiply and subtract, a*b - c
381
+ fms = self.mulsub(vdata_a, vdata_b, vdata_c)
382
+ data_fms = self.sub(data_fma, vdata_cx2)
383
+ assert fms == data_fms
384
+ # negate multiply and add, -(a*b) + c
385
+ nfma = self.nmuladd(vdata_a, vdata_b, vdata_c)
386
+ data_nfma = self.sub(vdata_cx2, data_fma)
387
+ assert nfma == data_nfma
388
+ # negate multiply and subtract, -(a*b) - c
389
+ nfms = self.nmulsub(vdata_a, vdata_b, vdata_c)
390
+ data_nfms = self.mul(data_fma, self.setall(-1))
391
+ assert nfms == data_nfms
392
+ # multiply, add for odd elements and subtract even elements.
393
+ # (a * b) -+ c
394
+ fmas = list(self.muladdsub(vdata_a, vdata_b, vdata_c))
395
+ assert fmas[0::2] == list(data_fms)[0::2]
396
+ assert fmas[1::2] == list(data_fma)[1::2]
397
+
398
+ def test_abs(self):
399
+ pinf, ninf, nan = self._pinfinity(), self._ninfinity(), self._nan()
400
+ data = self._data()
401
+ vdata = self.load(self._data())
402
+
403
+ abs_cases = ((-0, 0), (ninf, pinf), (pinf, pinf), (nan, nan))
404
+ for case, desired in abs_cases:
405
+ data_abs = [desired] * self.nlanes
406
+ vabs = self.abs(self.setall(case))
407
+ assert vabs == pytest.approx(data_abs, nan_ok=True)
408
+
409
+ vabs = self.abs(self.mul(vdata, self.setall(-1)))
410
+ assert vabs == data
411
+
412
+ def test_sqrt(self):
413
+ pinf, ninf, nan = self._pinfinity(), self._ninfinity(), self._nan()
414
+ data = self._data()
415
+ vdata = self.load(self._data())
416
+
417
+ sqrt_cases = ((-0.0, -0.0), (0.0, 0.0), (-1.0, nan), (ninf, nan), (pinf, pinf))
418
+ for case, desired in sqrt_cases:
419
+ data_sqrt = [desired] * self.nlanes
420
+ sqrt = self.sqrt(self.setall(case))
421
+ assert sqrt == pytest.approx(data_sqrt, nan_ok=True)
422
+
423
+ # load to truncate precision
424
+ data_sqrt = self.load([math.sqrt(x) for x in data])
425
+ sqrt = self.sqrt(vdata)
426
+ assert sqrt == data_sqrt
427
+
428
+ def test_square(self):
429
+ pinf, ninf, nan = self._pinfinity(), self._ninfinity(), self._nan()
430
+ data = self._data()
431
+ vdata = self.load(self._data())
432
+ # square
433
+ square_cases = ((nan, nan), (pinf, pinf), (ninf, pinf))
434
+ for case, desired in square_cases:
435
+ data_square = [desired] * self.nlanes
436
+ square = self.square(self.setall(case))
437
+ assert square == pytest.approx(data_square, nan_ok=True)
438
+
439
+ data_square = [x * x for x in data]
440
+ square = self.square(vdata)
441
+ assert square == data_square
442
+
443
+ @pytest.mark.parametrize("intrin, func", [("ceil", math.ceil),
444
+ ("trunc", math.trunc), ("floor", math.floor), ("rint", round)])
445
+ def test_rounding(self, intrin, func):
446
+ """
447
+ Test intrinsics:
448
+ npyv_rint_##SFX
449
+ npyv_ceil_##SFX
450
+ npyv_trunc_##SFX
451
+ npyv_floor##SFX
452
+ """
453
+ intrin_name = intrin
454
+ intrin = getattr(self, intrin)
455
+ pinf, ninf, nan = self._pinfinity(), self._ninfinity(), self._nan()
456
+ # special cases
457
+ round_cases = ((nan, nan), (pinf, pinf), (ninf, ninf))
458
+ for case, desired in round_cases:
459
+ data_round = [desired] * self.nlanes
460
+ _round = intrin(self.setall(case))
461
+ assert _round == pytest.approx(data_round, nan_ok=True)
462
+
463
+ for x in range(0, 2**20, 256**2):
464
+ for w in (-1.05, -1.10, -1.15, 1.05, 1.10, 1.15):
465
+ data = self.load([(x + a) * w for a in range(self.nlanes)])
466
+ data_round = [func(x) for x in data]
467
+ _round = intrin(data)
468
+ assert _round == data_round
469
+
470
+ # test large numbers
471
+ for i in (
472
+ 1.1529215045988576e+18, 4.6116860183954304e+18,
473
+ 5.902958103546122e+20, 2.3611832414184488e+21
474
+ ):
475
+ x = self.setall(i)
476
+ y = intrin(x)
477
+ data_round = [func(n) for n in x]
478
+ assert y == data_round
479
+
480
+ # signed zero
481
+ if intrin_name == "floor":
482
+ data_szero = (-0.0,)
483
+ else:
484
+ data_szero = (-0.0, -0.25, -0.30, -0.45, -0.5)
485
+
486
+ for w in data_szero:
487
+ _round = self._to_unsigned(intrin(self.setall(w)))
488
+ data_round = self._to_unsigned(self.setall(-0.0))
489
+ assert _round == data_round
490
+
491
+ @pytest.mark.parametrize("intrin", [
492
+ "max", "maxp", "maxn", "min", "minp", "minn"
493
+ ])
494
+ def test_max_min(self, intrin):
495
+ """
496
+ Test intrinsics:
497
+ npyv_max_##sfx
498
+ npyv_maxp_##sfx
499
+ npyv_maxn_##sfx
500
+ npyv_min_##sfx
501
+ npyv_minp_##sfx
502
+ npyv_minn_##sfx
503
+ npyv_reduce_max_##sfx
504
+ npyv_reduce_maxp_##sfx
505
+ npyv_reduce_maxn_##sfx
506
+ npyv_reduce_min_##sfx
507
+ npyv_reduce_minp_##sfx
508
+ npyv_reduce_minn_##sfx
509
+ """
510
+ pinf, ninf, nan = self._pinfinity(), self._ninfinity(), self._nan()
511
+ chk_nan = {"xp": 1, "np": 1, "nn": 2, "xn": 2}.get(intrin[-2:], 0)
512
+ func = eval(intrin[:3])
513
+ reduce_intrin = getattr(self, "reduce_" + intrin)
514
+ intrin = getattr(self, intrin)
515
+ hf_nlanes = self.nlanes // 2
516
+
517
+ cases = (
518
+ ([0.0, -0.0], [-0.0, 0.0]),
519
+ ([10, -10], [10, -10]),
520
+ ([pinf, 10], [10, ninf]),
521
+ ([10, pinf], [ninf, 10]),
522
+ ([10, -10], [10, -10]),
523
+ ([-10, 10], [-10, 10])
524
+ )
525
+ for op1, op2 in cases:
526
+ vdata_a = self.load(op1 * hf_nlanes)
527
+ vdata_b = self.load(op2 * hf_nlanes)
528
+ data = func(vdata_a, vdata_b)
529
+ simd = intrin(vdata_a, vdata_b)
530
+ assert simd == data
531
+ data = func(vdata_a)
532
+ simd = reduce_intrin(vdata_a)
533
+ assert simd == data
534
+
535
+ if not chk_nan:
536
+ return
537
+ if chk_nan == 1:
538
+ test_nan = lambda a, b: (
539
+ b if math.isnan(a) else a if math.isnan(b) else b
540
+ )
541
+ else:
542
+ test_nan = lambda a, b: (
543
+ nan if math.isnan(a) or math.isnan(b) else b
544
+ )
545
+ cases = (
546
+ (nan, 10),
547
+ (10, nan),
548
+ (nan, pinf),
549
+ (pinf, nan),
550
+ (nan, nan)
551
+ )
552
+ for op1, op2 in cases:
553
+ vdata_ab = self.load([op1, op2] * hf_nlanes)
554
+ data = test_nan(op1, op2)
555
+ simd = reduce_intrin(vdata_ab)
556
+ assert simd == pytest.approx(data, nan_ok=True)
557
+ vdata_a = self.setall(op1)
558
+ vdata_b = self.setall(op2)
559
+ data = [data] * self.nlanes
560
+ simd = intrin(vdata_a, vdata_b)
561
+ assert simd == pytest.approx(data, nan_ok=True)
562
+
563
+ def test_reciprocal(self):
564
+ pinf, ninf, nan = self._pinfinity(), self._ninfinity(), self._nan()
565
+ data = self._data()
566
+ vdata = self.load(self._data())
567
+
568
+ recip_cases = ((nan, nan), (pinf, 0.0), (ninf, -0.0), (0.0, pinf), (-0.0, ninf))
569
+ for case, desired in recip_cases:
570
+ data_recip = [desired] * self.nlanes
571
+ recip = self.recip(self.setall(case))
572
+ assert recip == pytest.approx(data_recip, nan_ok=True)
573
+
574
+ data_recip = self.load([1 / x for x in data]) # load to truncate precision
575
+ recip = self.recip(vdata)
576
+ assert recip == data_recip
577
+
578
+ def test_special_cases(self):
579
+ """
580
+ Compare Not NaN. Test intrinsics:
581
+ npyv_notnan_##SFX
582
+ """
583
+ nnan = self.notnan(self.setall(self._nan()))
584
+ assert nnan == [0] * self.nlanes
585
+
586
+ @pytest.mark.parametrize("intrin_name", [
587
+ "rint", "trunc", "ceil", "floor"
588
+ ])
589
+ def test_unary_invalid_fpexception(self, intrin_name):
590
+ intrin = getattr(self, intrin_name)
591
+ for d in [float("nan"), float("inf"), -float("inf")]:
592
+ v = self.setall(d)
593
+ clear_floatstatus()
594
+ intrin(v)
595
+ assert check_floatstatus(invalid=True) is False
596
+
597
+ @pytest.mark.parametrize('py_comp,np_comp', [
598
+ (operator.lt, "cmplt"),
599
+ (operator.le, "cmple"),
600
+ (operator.gt, "cmpgt"),
601
+ (operator.ge, "cmpge"),
602
+ (operator.eq, "cmpeq"),
603
+ (operator.ne, "cmpneq")
604
+ ])
605
+ def test_comparison_with_nan(self, py_comp, np_comp):
606
+ pinf, ninf, nan = self._pinfinity(), self._ninfinity(), self._nan()
607
+ mask_true = self._true_mask()
608
+
609
+ def to_bool(vector):
610
+ return [lane == mask_true for lane in vector]
611
+
612
+ intrin = getattr(self, np_comp)
613
+ cmp_cases = ((0, nan), (nan, 0), (nan, nan), (pinf, nan),
614
+ (ninf, nan), (-0.0, +0.0))
615
+ for case_operand1, case_operand2 in cmp_cases:
616
+ data_a = [case_operand1] * self.nlanes
617
+ data_b = [case_operand2] * self.nlanes
618
+ vdata_a = self.setall(case_operand1)
619
+ vdata_b = self.setall(case_operand2)
620
+ vcmp = to_bool(intrin(vdata_a, vdata_b))
621
+ data_cmp = [py_comp(a, b) for a, b in zip(data_a, data_b)]
622
+ assert vcmp == data_cmp
623
+
624
+ @pytest.mark.parametrize("intrin", ["any", "all"])
625
+ @pytest.mark.parametrize("data", (
626
+ [float("nan"), 0],
627
+ [0, float("nan")],
628
+ [float("nan"), 1],
629
+ [1, float("nan")],
630
+ [float("nan"), float("nan")],
631
+ [0.0, -0.0],
632
+ [-0.0, 0.0],
633
+ [1.0, -0.0]
634
+ ))
635
+ def test_operators_crosstest(self, intrin, data):
636
+ """
637
+ Test intrinsics:
638
+ npyv_any_##SFX
639
+ npyv_all_##SFX
640
+ """
641
+ data_a = self.load(data * self.nlanes)
642
+ func = eval(intrin)
643
+ intrin = getattr(self, intrin)
644
+ desired = func(data_a)
645
+ simd = intrin(data_a)
646
+ assert not not simd == desired
647
+
648
+ class _SIMD_ALL(_Test_Utility):
649
+ """
650
+ To test all vector types at once
651
+ """
652
+ def test_memory_load(self):
653
+ data = self._data()
654
+ # unaligned load
655
+ load_data = self.load(data)
656
+ assert load_data == data
657
+ # aligned load
658
+ loada_data = self.loada(data)
659
+ assert loada_data == data
660
+ # stream load
661
+ loads_data = self.loads(data)
662
+ assert loads_data == data
663
+ # load lower part
664
+ loadl = self.loadl(data)
665
+ loadl_half = list(loadl)[:self.nlanes // 2]
666
+ data_half = data[:self.nlanes // 2]
667
+ assert loadl_half == data_half
668
+ assert loadl != data # detect overflow
669
+
670
+ def test_memory_store(self):
671
+ data = self._data()
672
+ vdata = self.load(data)
673
+ # unaligned store
674
+ store = [0] * self.nlanes
675
+ self.store(store, vdata)
676
+ assert store == data
677
+ # aligned store
678
+ store_a = [0] * self.nlanes
679
+ self.storea(store_a, vdata)
680
+ assert store_a == data
681
+ # stream store
682
+ store_s = [0] * self.nlanes
683
+ self.stores(store_s, vdata)
684
+ assert store_s == data
685
+ # store lower part
686
+ store_l = [0] * self.nlanes
687
+ self.storel(store_l, vdata)
688
+ assert store_l[:self.nlanes // 2] == data[:self.nlanes // 2]
689
+ assert store_l != vdata # detect overflow
690
+ # store higher part
691
+ store_h = [0] * self.nlanes
692
+ self.storeh(store_h, vdata)
693
+ assert store_h[:self.nlanes // 2] == data[self.nlanes // 2:]
694
+ assert store_h != vdata # detect overflow
695
+
696
+ @pytest.mark.parametrize("intrin, elsizes, scale, fill", [
697
+ ("self.load_tillz, self.load_till", (32, 64), 1, [0xffff]),
698
+ ("self.load2_tillz, self.load2_till", (32, 64), 2, [0xffff, 0x7fff]),
699
+ ])
700
+ def test_memory_partial_load(self, intrin, elsizes, scale, fill):
701
+ if self._scalar_size() not in elsizes:
702
+ return
703
+ npyv_load_tillz, npyv_load_till = eval(intrin)
704
+ data = self._data()
705
+ lanes = list(range(1, self.nlanes + 1))
706
+ lanes += [self.nlanes**2, self.nlanes**4] # test out of range
707
+ for n in lanes:
708
+ load_till = npyv_load_till(data, n, *fill)
709
+ load_tillz = npyv_load_tillz(data, n)
710
+ n *= scale
711
+ data_till = data[:n] + fill * ((self.nlanes - n) // scale)
712
+ assert load_till == data_till
713
+ data_tillz = data[:n] + [0] * (self.nlanes - n)
714
+ assert load_tillz == data_tillz
715
+
716
+ @pytest.mark.parametrize("intrin, elsizes, scale", [
717
+ ("self.store_till", (32, 64), 1),
718
+ ("self.store2_till", (32, 64), 2),
719
+ ])
720
+ def test_memory_partial_store(self, intrin, elsizes, scale):
721
+ if self._scalar_size() not in elsizes:
722
+ return
723
+ npyv_store_till = eval(intrin)
724
+ data = self._data()
725
+ data_rev = self._data(reverse=True)
726
+ vdata = self.load(data)
727
+ lanes = list(range(1, self.nlanes + 1))
728
+ lanes += [self.nlanes**2, self.nlanes**4]
729
+ for n in lanes:
730
+ data_till = data_rev.copy()
731
+ data_till[:n * scale] = data[:n * scale]
732
+ store_till = self._data(reverse=True)
733
+ npyv_store_till(store_till, n, vdata)
734
+ assert store_till == data_till
735
+
736
+ @pytest.mark.parametrize("intrin, elsizes, scale", [
737
+ ("self.loadn", (32, 64), 1),
738
+ ("self.loadn2", (32, 64), 2),
739
+ ])
740
+ def test_memory_noncont_load(self, intrin, elsizes, scale):
741
+ if self._scalar_size() not in elsizes:
742
+ return
743
+ npyv_loadn = eval(intrin)
744
+ for stride in range(-64, 64):
745
+ if stride < 0:
746
+ data = self._data(stride, -stride * self.nlanes)
747
+ data_stride = list(itertools.chain(
748
+ *zip(*[data[-i::stride] for i in range(scale, 0, -1)])
749
+ ))
750
+ elif stride == 0:
751
+ data = self._data()
752
+ data_stride = data[0:scale] * (self.nlanes // scale)
753
+ else:
754
+ data = self._data(count=stride * self.nlanes)
755
+ data_stride = list(itertools.chain(
756
+ *zip(*[data[i::stride] for i in range(scale)]))
757
+ )
758
+ data_stride = self.load(data_stride) # cast unsigned
759
+ loadn = npyv_loadn(data, stride)
760
+ assert loadn == data_stride
761
+
762
+ @pytest.mark.parametrize("intrin, elsizes, scale, fill", [
763
+ ("self.loadn_tillz, self.loadn_till", (32, 64), 1, [0xffff]),
764
+ ("self.loadn2_tillz, self.loadn2_till", (32, 64), 2, [0xffff, 0x7fff]),
765
+ ])
766
+ def test_memory_noncont_partial_load(self, intrin, elsizes, scale, fill):
767
+ if self._scalar_size() not in elsizes:
768
+ return
769
+ npyv_loadn_tillz, npyv_loadn_till = eval(intrin)
770
+ lanes = list(range(1, self.nlanes + 1))
771
+ lanes += [self.nlanes**2, self.nlanes**4]
772
+ for stride in range(-64, 64):
773
+ if stride < 0:
774
+ data = self._data(stride, -stride * self.nlanes)
775
+ data_stride = list(itertools.chain(
776
+ *zip(*[data[-i::stride] for i in range(scale, 0, -1)])
777
+ ))
778
+ elif stride == 0:
779
+ data = self._data()
780
+ data_stride = data[0:scale] * (self.nlanes // scale)
781
+ else:
782
+ data = self._data(count=stride * self.nlanes)
783
+ data_stride = list(itertools.chain(
784
+ *zip(*[data[i::stride] for i in range(scale)])
785
+ ))
786
+ data_stride = list(self.load(data_stride)) # cast unsigned
787
+ for n in lanes:
788
+ nscale = n * scale
789
+ llanes = self.nlanes - nscale
790
+ data_stride_till = (
791
+ data_stride[:nscale] + fill * (llanes // scale)
792
+ )
793
+ loadn_till = npyv_loadn_till(data, stride, n, *fill)
794
+ assert loadn_till == data_stride_till
795
+ data_stride_tillz = data_stride[:nscale] + [0] * llanes
796
+ loadn_tillz = npyv_loadn_tillz(data, stride, n)
797
+ assert loadn_tillz == data_stride_tillz
798
+
799
+ @pytest.mark.parametrize("intrin, elsizes, scale", [
800
+ ("self.storen", (32, 64), 1),
801
+ ("self.storen2", (32, 64), 2),
802
+ ])
803
+ def test_memory_noncont_store(self, intrin, elsizes, scale):
804
+ if self._scalar_size() not in elsizes:
805
+ return
806
+ npyv_storen = eval(intrin)
807
+ data = self._data()
808
+ vdata = self.load(data)
809
+ hlanes = self.nlanes // scale
810
+ for stride in range(1, 64):
811
+ data_storen = [0xff] * stride * self.nlanes
812
+ for s in range(0, hlanes * stride, stride):
813
+ i = (s // stride) * scale
814
+ data_storen[s:s + scale] = data[i:i + scale]
815
+ storen = [0xff] * stride * self.nlanes
816
+ storen += [0x7f] * 64
817
+ npyv_storen(storen, stride, vdata)
818
+ assert storen[:-64] == data_storen
819
+ assert storen[-64:] == [0x7f] * 64 # detect overflow
820
+
821
+ for stride in range(-64, 0):
822
+ data_storen = [0xff] * -stride * self.nlanes
823
+ for s in range(0, hlanes * stride, stride):
824
+ i = (s // stride) * scale
825
+ data_storen[s - scale:s or None] = data[i:i + scale]
826
+ storen = [0x7f] * 64
827
+ storen += [0xff] * -stride * self.nlanes
828
+ npyv_storen(storen, stride, vdata)
829
+ assert storen[64:] == data_storen
830
+ assert storen[:64] == [0x7f] * 64 # detect overflow
831
+ # stride 0
832
+ data_storen = [0x7f] * self.nlanes
833
+ storen = data_storen.copy()
834
+ data_storen[0:scale] = data[-scale:]
835
+ npyv_storen(storen, 0, vdata)
836
+ assert storen == data_storen
837
+
838
+ @pytest.mark.parametrize("intrin, elsizes, scale", [
839
+ ("self.storen_till", (32, 64), 1),
840
+ ("self.storen2_till", (32, 64), 2),
841
+ ])
842
+ def test_memory_noncont_partial_store(self, intrin, elsizes, scale):
843
+ if self._scalar_size() not in elsizes:
844
+ return
845
+ npyv_storen_till = eval(intrin)
846
+ data = self._data()
847
+ vdata = self.load(data)
848
+ lanes = list(range(1, self.nlanes + 1))
849
+ lanes += [self.nlanes**2, self.nlanes**4]
850
+ hlanes = self.nlanes // scale
851
+ for stride in range(1, 64):
852
+ for n in lanes:
853
+ data_till = [0xff] * stride * self.nlanes
854
+ tdata = data[:n * scale] + [0xff] * (self.nlanes - n * scale)
855
+ for s in range(0, hlanes * stride, stride)[:n]:
856
+ i = (s // stride) * scale
857
+ data_till[s:s + scale] = tdata[i:i + scale]
858
+ storen_till = [0xff] * stride * self.nlanes
859
+ storen_till += [0x7f] * 64
860
+ npyv_storen_till(storen_till, stride, n, vdata)
861
+ assert storen_till[:-64] == data_till
862
+ assert storen_till[-64:] == [0x7f] * 64 # detect overflow
863
+
864
+ for stride in range(-64, 0):
865
+ for n in lanes:
866
+ data_till = [0xff] * -stride * self.nlanes
867
+ tdata = data[:n * scale] + [0xff] * (self.nlanes - n * scale)
868
+ for s in range(0, hlanes * stride, stride)[:n]:
869
+ i = (s // stride) * scale
870
+ data_till[s - scale:s or None] = tdata[i:i + scale]
871
+ storen_till = [0x7f] * 64
872
+ storen_till += [0xff] * -stride * self.nlanes
873
+ npyv_storen_till(storen_till, stride, n, vdata)
874
+ assert storen_till[64:] == data_till
875
+ assert storen_till[:64] == [0x7f] * 64 # detect overflow
876
+
877
+ # stride 0
878
+ for n in lanes:
879
+ data_till = [0x7f] * self.nlanes
880
+ storen_till = data_till.copy()
881
+ data_till[0:scale] = data[:n * scale][-scale:]
882
+ npyv_storen_till(storen_till, 0, n, vdata)
883
+ assert storen_till == data_till
884
+
885
+ @pytest.mark.parametrize("intrin, table_size, elsize", [
886
+ ("self.lut32", 32, 32),
887
+ ("self.lut16", 16, 64)
888
+ ])
889
+ def test_lut(self, intrin, table_size, elsize):
890
+ """
891
+ Test lookup table intrinsics:
892
+ npyv_lut32_##sfx
893
+ npyv_lut16_##sfx
894
+ """
895
+ if elsize != self._scalar_size():
896
+ return
897
+ intrin = eval(intrin)
898
+ idx_itrin = getattr(self.npyv, f"setall_u{elsize}")
899
+ table = range(table_size)
900
+ for i in table:
901
+ broadi = self.setall(i)
902
+ idx = idx_itrin(i)
903
+ lut = intrin(table, idx)
904
+ assert lut == broadi
905
+
906
+ def test_misc(self):
907
+ broadcast_zero = self.zero()
908
+ assert broadcast_zero == [0] * self.nlanes
909
+ for i in range(1, 10):
910
+ broadcasti = self.setall(i)
911
+ assert broadcasti == [i] * self.nlanes
912
+
913
+ data_a, data_b = self._data(), self._data(reverse=True)
914
+ vdata_a, vdata_b = self.load(data_a), self.load(data_b)
915
+
916
+ # py level of npyv_set_* don't support ignoring the extra specified lanes or
917
+ # fill non-specified lanes with zero.
918
+ vset = self.set(*data_a)
919
+ assert vset == data_a
920
+ # py level of npyv_setf_* don't support ignoring the extra specified lanes or
921
+ # fill non-specified lanes with the specified scalar.
922
+ vsetf = self.setf(10, *data_a)
923
+ assert vsetf == data_a
924
+
925
+ # We're testing the sanity of _simd's type-vector,
926
+ # reinterpret* intrinsics itself are tested via compiler
927
+ # during the build of _simd module
928
+ sfxes = ["u8", "s8", "u16", "s16", "u32", "s32", "u64", "s64"]
929
+ if self.npyv.simd_f64:
930
+ sfxes.append("f64")
931
+ if self.npyv.simd_f32:
932
+ sfxes.append("f32")
933
+ for sfx in sfxes:
934
+ vec_name = getattr(self, "reinterpret_" + sfx)(vdata_a).__name__
935
+ assert vec_name == "npyv_" + sfx
936
+
937
+ # select & mask operations
938
+ select_a = self.select(self.cmpeq(self.zero(), self.zero()), vdata_a, vdata_b)
939
+ assert select_a == data_a
940
+ select_b = self.select(self.cmpneq(self.zero(), self.zero()), vdata_a, vdata_b)
941
+ assert select_b == data_b
942
+
943
+ # test extract elements
944
+ assert self.extract0(vdata_b) == vdata_b[0]
945
+
946
+ # cleanup intrinsic is only used with AVX for
947
+ # zeroing registers to avoid the AVX-SSE transition penalty,
948
+ # so nothing to test here
949
+ self.npyv.cleanup()
950
+
951
+ def test_reorder(self):
952
+ data_a, data_b = self._data(), self._data(reverse=True)
953
+ vdata_a, vdata_b = self.load(data_a), self.load(data_b)
954
+ # lower half part
955
+ data_a_lo = data_a[:self.nlanes // 2]
956
+ data_b_lo = data_b[:self.nlanes // 2]
957
+ # higher half part
958
+ data_a_hi = data_a[self.nlanes // 2:]
959
+ data_b_hi = data_b[self.nlanes // 2:]
960
+ # combine two lower parts
961
+ combinel = self.combinel(vdata_a, vdata_b)
962
+ assert combinel == data_a_lo + data_b_lo
963
+ # combine two higher parts
964
+ combineh = self.combineh(vdata_a, vdata_b)
965
+ assert combineh == data_a_hi + data_b_hi
966
+ # combine x2
967
+ combine = self.combine(vdata_a, vdata_b)
968
+ assert combine == (data_a_lo + data_b_lo, data_a_hi + data_b_hi)
969
+
970
+ # zip(interleave)
971
+ data_zipl = self.load([
972
+ v for p in zip(data_a_lo, data_b_lo) for v in p
973
+ ])
974
+ data_ziph = self.load([
975
+ v for p in zip(data_a_hi, data_b_hi) for v in p
976
+ ])
977
+ vzip = self.zip(vdata_a, vdata_b)
978
+ assert vzip == (data_zipl, data_ziph)
979
+ vzip = [0] * self.nlanes * 2
980
+ self._x2("store")(vzip, (vdata_a, vdata_b))
981
+ assert vzip == list(data_zipl) + list(data_ziph)
982
+
983
+ # unzip(deinterleave)
984
+ unzip = self.unzip(data_zipl, data_ziph)
985
+ assert unzip == (data_a, data_b)
986
+ unzip = self._x2("load")(list(data_zipl) + list(data_ziph))
987
+ assert unzip == (data_a, data_b)
988
+
989
+ def test_reorder_rev64(self):
990
+ # Reverse elements of each 64-bit lane
991
+ ssize = self._scalar_size()
992
+ if ssize == 64:
993
+ return
994
+ data_rev64 = [
995
+ y for x in range(0, self.nlanes, 64 // ssize)
996
+ for y in reversed(range(x, x + 64 // ssize))
997
+ ]
998
+ rev64 = self.rev64(self.load(range(self.nlanes)))
999
+ assert rev64 == data_rev64
1000
+
1001
+ def test_reorder_permi128(self):
1002
+ """
1003
+ Test permuting elements for each 128-bit lane.
1004
+ npyv_permi128_##sfx
1005
+ """
1006
+ ssize = self._scalar_size()
1007
+ if ssize < 32:
1008
+ return
1009
+ data = self.load(self._data())
1010
+ permn = 128 // ssize
1011
+ permd = permn - 1
1012
+ nlane128 = self.nlanes // permn
1013
+ shfl = [0, 1] if ssize == 64 else [0, 2, 4, 6]
1014
+ for i in range(permn):
1015
+ indices = [(i >> shf) & permd for shf in shfl]
1016
+ vperm = self.permi128(data, *indices)
1017
+ data_vperm = [
1018
+ data[j + (e & -permn)]
1019
+ for e, j in enumerate(indices * nlane128)
1020
+ ]
1021
+ assert vperm == data_vperm
1022
+
1023
+ @pytest.mark.parametrize('func, intrin', [
1024
+ (operator.lt, "cmplt"),
1025
+ (operator.le, "cmple"),
1026
+ (operator.gt, "cmpgt"),
1027
+ (operator.ge, "cmpge"),
1028
+ (operator.eq, "cmpeq")
1029
+ ])
1030
+ def test_operators_comparison(self, func, intrin):
1031
+ if self._is_fp():
1032
+ data_a = self._data()
1033
+ else:
1034
+ data_a = self._data(self._int_max() - self.nlanes)
1035
+ data_b = self._data(self._int_min(), reverse=True)
1036
+ vdata_a, vdata_b = self.load(data_a), self.load(data_b)
1037
+ intrin = getattr(self, intrin)
1038
+
1039
+ mask_true = self._true_mask()
1040
+
1041
+ def to_bool(vector):
1042
+ return [lane == mask_true for lane in vector]
1043
+
1044
+ data_cmp = [func(a, b) for a, b in zip(data_a, data_b)]
1045
+ cmp = to_bool(intrin(vdata_a, vdata_b))
1046
+ assert cmp == data_cmp
1047
+
1048
+ def test_operators_logical(self):
1049
+ if self._is_fp():
1050
+ data_a = self._data()
1051
+ else:
1052
+ data_a = self._data(self._int_max() - self.nlanes)
1053
+ data_b = self._data(self._int_min(), reverse=True)
1054
+ vdata_a, vdata_b = self.load(data_a), self.load(data_b)
1055
+
1056
+ if self._is_fp():
1057
+ data_cast_a = self._to_unsigned(vdata_a)
1058
+ data_cast_b = self._to_unsigned(vdata_b)
1059
+ cast, cast_data = self._to_unsigned, self._to_unsigned
1060
+ else:
1061
+ data_cast_a, data_cast_b = data_a, data_b
1062
+ cast, cast_data = lambda a: a, self.load
1063
+
1064
+ data_xor = cast_data([a ^ b for a, b in zip(data_cast_a, data_cast_b)])
1065
+ vxor = cast(self.xor(vdata_a, vdata_b))
1066
+ assert vxor == data_xor
1067
+
1068
+ data_or = cast_data([a | b for a, b in zip(data_cast_a, data_cast_b)])
1069
+ vor = cast(getattr(self, "or")(vdata_a, vdata_b))
1070
+ assert vor == data_or
1071
+
1072
+ data_and = cast_data([a & b for a, b in zip(data_cast_a, data_cast_b)])
1073
+ vand = cast(getattr(self, "and")(vdata_a, vdata_b))
1074
+ assert vand == data_and
1075
+
1076
+ data_not = cast_data([~a for a in data_cast_a])
1077
+ vnot = cast(getattr(self, "not")(vdata_a))
1078
+ assert vnot == data_not
1079
+
1080
+ if self.sfx not in ("u8"):
1081
+ return
1082
+ data_andc = [a & ~b for a, b in zip(data_cast_a, data_cast_b)]
1083
+ vandc = cast(self.andc(vdata_a, vdata_b))
1084
+ assert vandc == data_andc
1085
+
1086
+ @pytest.mark.parametrize("intrin", ["any", "all"])
1087
+ @pytest.mark.parametrize("data", (
1088
+ [1, 2, 3, 4],
1089
+ [-1, -2, -3, -4],
1090
+ [0, 1, 2, 3, 4],
1091
+ [0x7f, 0x7fff, 0x7fffffff, 0x7fffffffffffffff],
1092
+ [0, -1, -2, -3, 4],
1093
+ [0],
1094
+ [1],
1095
+ [-1]
1096
+ ))
1097
+ def test_operators_crosstest(self, intrin, data):
1098
+ """
1099
+ Test intrinsics:
1100
+ npyv_any_##SFX
1101
+ npyv_all_##SFX
1102
+ """
1103
+ data_a = self.load(data * self.nlanes)
1104
+ func = eval(intrin)
1105
+ intrin = getattr(self, intrin)
1106
+ desired = func(data_a)
1107
+ simd = intrin(data_a)
1108
+ assert not not simd == desired
1109
+
1110
+ def test_conversion_boolean(self):
1111
+ bsfx = "b" + self.sfx[1:]
1112
+ to_boolean = getattr(self.npyv, f"cvt_{bsfx}_{self.sfx}")
1113
+ from_boolean = getattr(self.npyv, f"cvt_{self.sfx}_{bsfx}")
1114
+
1115
+ false_vb = to_boolean(self.setall(0))
1116
+ true_vb = self.cmpeq(self.setall(0), self.setall(0))
1117
+ assert false_vb != true_vb
1118
+
1119
+ false_vsfx = from_boolean(false_vb)
1120
+ true_vsfx = from_boolean(true_vb)
1121
+ assert false_vsfx != true_vsfx
1122
+
1123
+ def test_conversion_expand(self):
1124
+ """
1125
+ Test expand intrinsics:
1126
+ npyv_expand_u16_u8
1127
+ npyv_expand_u32_u16
1128
+ """
1129
+ if self.sfx not in ("u8", "u16"):
1130
+ return
1131
+ totype = self.sfx[0] + str(int(self.sfx[1:]) * 2)
1132
+ expand = getattr(self.npyv, f"expand_{totype}_{self.sfx}")
1133
+ # close enough from the edge to detect any deviation
1134
+ data = self._data(self._int_max() - self.nlanes)
1135
+ vdata = self.load(data)
1136
+ edata = expand(vdata)
1137
+ # lower half part
1138
+ data_lo = data[:self.nlanes // 2]
1139
+ # higher half part
1140
+ data_hi = data[self.nlanes // 2:]
1141
+ assert edata == (data_lo, data_hi)
1142
+
1143
+ def test_arithmetic_subadd(self):
1144
+ if self._is_fp():
1145
+ data_a = self._data()
1146
+ else:
1147
+ data_a = self._data(self._int_max() - self.nlanes)
1148
+ data_b = self._data(self._int_min(), reverse=True)
1149
+ vdata_a, vdata_b = self.load(data_a), self.load(data_b)
1150
+
1151
+ # non-saturated
1152
+ data_add = self.load([a + b for a, b in zip(data_a, data_b)]) # load to cast
1153
+ add = self.add(vdata_a, vdata_b)
1154
+ assert add == data_add
1155
+ data_sub = self.load([a - b for a, b in zip(data_a, data_b)])
1156
+ sub = self.sub(vdata_a, vdata_b)
1157
+ assert sub == data_sub
1158
+
1159
+ def test_arithmetic_mul(self):
1160
+ if self.sfx in ("u64", "s64"):
1161
+ return
1162
+
1163
+ if self._is_fp():
1164
+ data_a = self._data()
1165
+ else:
1166
+ data_a = self._data(self._int_max() - self.nlanes)
1167
+ data_b = self._data(self._int_min(), reverse=True)
1168
+ vdata_a, vdata_b = self.load(data_a), self.load(data_b)
1169
+
1170
+ data_mul = self.load([a * b for a, b in zip(data_a, data_b)])
1171
+ mul = self.mul(vdata_a, vdata_b)
1172
+ assert mul == data_mul
1173
+
1174
+ def test_arithmetic_div(self):
1175
+ if not self._is_fp():
1176
+ return
1177
+
1178
+ data_a, data_b = self._data(), self._data(reverse=True)
1179
+ vdata_a, vdata_b = self.load(data_a), self.load(data_b)
1180
+
1181
+ # load to truncate f64 to precision of f32
1182
+ data_div = self.load([a / b for a, b in zip(data_a, data_b)])
1183
+ div = self.div(vdata_a, vdata_b)
1184
+ assert div == data_div
1185
+
1186
+ def test_arithmetic_intdiv(self):
1187
+ """
1188
+ Test integer division intrinsics:
1189
+ npyv_divisor_##sfx
1190
+ npyv_divc_##sfx
1191
+ """
1192
+ if self._is_fp():
1193
+ return
1194
+
1195
+ int_min = self._int_min()
1196
+
1197
+ def trunc_div(a, d):
1198
+ """
1199
+ Divide towards zero works with large integers > 2^53,
1200
+ and wrap around overflow similar to what C does.
1201
+ """
1202
+ if d == -1 and a == int_min:
1203
+ return a
1204
+ sign_a, sign_d = a < 0, d < 0
1205
+ if a == 0 or sign_a == sign_d:
1206
+ return a // d
1207
+ return (a + sign_d - sign_a) // d + 1
1208
+
1209
+ data = [1, -int_min] # to test overflow
1210
+ data += range(0, 2**8, 2**5)
1211
+ data += range(0, 2**8, 2**5 - 1)
1212
+ bsize = self._scalar_size()
1213
+ if bsize > 8:
1214
+ data += range(2**8, 2**16, 2**13)
1215
+ data += range(2**8, 2**16, 2**13 - 1)
1216
+ if bsize > 16:
1217
+ data += range(2**16, 2**32, 2**29)
1218
+ data += range(2**16, 2**32, 2**29 - 1)
1219
+ if bsize > 32:
1220
+ data += range(2**32, 2**64, 2**61)
1221
+ data += range(2**32, 2**64, 2**61 - 1)
1222
+ # negate
1223
+ data += [-x for x in data]
1224
+ for dividend, divisor in itertools.product(data, data):
1225
+ divisor = self.setall(divisor)[0] # cast
1226
+ if divisor == 0:
1227
+ continue
1228
+ dividend = self.load(self._data(dividend))
1229
+ data_divc = [trunc_div(a, divisor) for a in dividend]
1230
+ divisor_parms = self.divisor(divisor)
1231
+ divc = self.divc(dividend, divisor_parms)
1232
+ assert divc == data_divc
1233
+
1234
+ def test_arithmetic_reduce_sum(self):
1235
+ """
1236
+ Test reduce sum intrinsics:
1237
+ npyv_sum_##sfx
1238
+ """
1239
+ if self.sfx not in ("u32", "u64", "f32", "f64"):
1240
+ return
1241
+ # reduce sum
1242
+ data = self._data()
1243
+ vdata = self.load(data)
1244
+
1245
+ data_sum = sum(data)
1246
+ vsum = self.sum(vdata)
1247
+ assert vsum == data_sum
1248
+
1249
+ def test_arithmetic_reduce_sumup(self):
1250
+ """
1251
+ Test extend reduce sum intrinsics:
1252
+ npyv_sumup_##sfx
1253
+ """
1254
+ if self.sfx not in ("u8", "u16"):
1255
+ return
1256
+ rdata = (0, self.nlanes, self._int_min(), self._int_max() - self.nlanes)
1257
+ for r in rdata:
1258
+ data = self._data(r)
1259
+ vdata = self.load(data)
1260
+ data_sum = sum(data)
1261
+ vsum = self.sumup(vdata)
1262
+ assert vsum == data_sum
1263
+
1264
+ def test_mask_conditional(self):
1265
+ """
1266
+ Conditional addition and subtraction for all supported data types.
1267
+ Test intrinsics:
1268
+ npyv_ifadd_##SFX, npyv_ifsub_##SFX
1269
+ """
1270
+ vdata_a = self.load(self._data())
1271
+ vdata_b = self.load(self._data(reverse=True))
1272
+ true_mask = self.cmpeq(self.zero(), self.zero())
1273
+ false_mask = self.cmpneq(self.zero(), self.zero())
1274
+
1275
+ data_sub = self.sub(vdata_b, vdata_a)
1276
+ ifsub = self.ifsub(true_mask, vdata_b, vdata_a, vdata_b)
1277
+ assert ifsub == data_sub
1278
+ ifsub = self.ifsub(false_mask, vdata_a, vdata_b, vdata_b)
1279
+ assert ifsub == vdata_b
1280
+
1281
+ data_add = self.add(vdata_b, vdata_a)
1282
+ ifadd = self.ifadd(true_mask, vdata_b, vdata_a, vdata_b)
1283
+ assert ifadd == data_add
1284
+ ifadd = self.ifadd(false_mask, vdata_a, vdata_b, vdata_b)
1285
+ assert ifadd == vdata_b
1286
+
1287
+ if not self._is_fp():
1288
+ return
1289
+ data_div = self.div(vdata_b, vdata_a)
1290
+ ifdiv = self.ifdiv(true_mask, vdata_b, vdata_a, vdata_b)
1291
+ assert ifdiv == data_div
1292
+ ifdivz = self.ifdivz(true_mask, vdata_b, vdata_a)
1293
+ assert ifdivz == data_div
1294
+ ifdiv = self.ifdiv(false_mask, vdata_a, vdata_b, vdata_b)
1295
+ assert ifdiv == vdata_b
1296
+ ifdivz = self.ifdivz(false_mask, vdata_a, vdata_b)
1297
+ assert ifdivz == self.zero()
1298
+
1299
+
1300
+ bool_sfx = ("b8", "b16", "b32", "b64")
1301
+ int_sfx = ("u8", "s8", "u16", "s16", "u32", "s32", "u64", "s64")
1302
+ fp_sfx = ("f32", "f64")
1303
+ all_sfx = int_sfx + fp_sfx
1304
+ tests_registry = {
1305
+ bool_sfx: _SIMD_BOOL,
1306
+ int_sfx: _SIMD_INT,
1307
+ fp_sfx: _SIMD_FP,
1308
+ ("f32",): _SIMD_FP32,
1309
+ ("f64",): _SIMD_FP64,
1310
+ all_sfx: _SIMD_ALL
1311
+ }
1312
+ for target_name, npyv in targets.items():
1313
+ simd_width = npyv.simd if npyv else ''
1314
+ pretty_name = target_name.split('__') # multi-target separator
1315
+ if len(pretty_name) > 1:
1316
+ # multi-target
1317
+ pretty_name = f"({' '.join(pretty_name)})"
1318
+ else:
1319
+ pretty_name = pretty_name[0]
1320
+
1321
+ skip = ""
1322
+ skip_sfx = {}
1323
+ if not npyv:
1324
+ skip = f"target '{pretty_name}' isn't supported by current machine"
1325
+ elif not npyv.simd:
1326
+ skip = f"target '{pretty_name}' isn't supported by NPYV"
1327
+ else:
1328
+ if not npyv.simd_f32:
1329
+ skip_sfx["f32"] = f"target '{pretty_name}' "\
1330
+ "doesn't support single-precision"
1331
+ if not npyv.simd_f64:
1332
+ skip_sfx["f64"] = f"target '{pretty_name}' doesn't"\
1333
+ "support double-precision"
1334
+
1335
+ for sfxes, cls in tests_registry.items():
1336
+ for sfx in sfxes:
1337
+ skip_m = skip_sfx.get(sfx, skip)
1338
+ inhr = (cls,)
1339
+ attr = {"npyv": targets[target_name], "sfx": sfx,
1340
+ "target_name": target_name}
1341
+ type_name = f"Test{cls.__name__}_{simd_width}_{target_name}_{sfx}"
1342
+ tcls = type(type_name, inhr, attr)
1343
+ if skip_m:
1344
+ pytest.mark.skip(reason=skip_m)(tcls)
1345
+ globals()[tcls.__name__] = tcls