numpy 2.4.0__cp314-cp314-macosx_14_0_x86_64.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 (910) 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-314-darwin.so +0 -0
  30. numpy/_core/_multiarray_umath.cpython-314-darwin.so +0 -0
  31. numpy/_core/_operand_flag_tests.cpython-314-darwin.so +0 -0
  32. numpy/_core/_rational_tests.cpython-314-darwin.so +0 -0
  33. numpy/_core/_simd.cpython-314-darwin.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-314-darwin.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-314-darwin.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-314-darwin.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-314-darwin.so +0 -0
  571. numpy/linalg/_umath_linalg.pyi +60 -0
  572. numpy/linalg/lapack_lite.cpython-314-darwin.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-314-darwin.so +0 -0
  650. numpy/random/_bounded_integers.pxd +29 -0
  651. numpy/random/_bounded_integers.pyi +1 -0
  652. numpy/random/_common.cpython-314-darwin.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-314-darwin.so +0 -0
  663. numpy/random/_generator.pyi +862 -0
  664. numpy/random/_mt19937.cpython-314-darwin.so +0 -0
  665. numpy/random/_mt19937.pyi +27 -0
  666. numpy/random/_pcg64.cpython-314-darwin.so +0 -0
  667. numpy/random/_pcg64.pyi +41 -0
  668. numpy/random/_philox.cpython-314-darwin.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-314-darwin.so +0 -0
  673. numpy/random/_sfc64.pyi +25 -0
  674. numpy/random/bit_generator.cpython-314-darwin.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-314-darwin.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 +910 -0
  892. numpy-2.4.0.dist-info/WHEEL +6 -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
@@ -0,0 +1,1351 @@
1
+ import itertools
2
+ import warnings
3
+
4
+ import pytest
5
+
6
+ import numpy as np
7
+ from numpy.testing import (
8
+ assert_,
9
+ assert_allclose,
10
+ assert_almost_equal,
11
+ assert_array_equal,
12
+ assert_equal,
13
+ assert_raises,
14
+ assert_raises_regex,
15
+ )
16
+
17
+ # Setup for optimize einsum
18
+ chars = 'abcdefghij'
19
+ sizes = np.array([2, 3, 4, 5, 4, 3, 2, 6, 5, 4, 3])
20
+ global_size_dict = dict(zip(chars, sizes))
21
+
22
+
23
+ class TestEinsum:
24
+ @pytest.mark.parametrize("do_opt", [True, False])
25
+ @pytest.mark.parametrize("einsum_fn", [np.einsum, np.einsum_path])
26
+ def test_einsum_errors(self, do_opt, einsum_fn):
27
+ # Need enough arguments
28
+ assert_raises(ValueError, einsum_fn, optimize=do_opt)
29
+ assert_raises(ValueError, einsum_fn, "", optimize=do_opt)
30
+
31
+ # subscripts must be a string
32
+ assert_raises(TypeError, einsum_fn, 0, 0, optimize=do_opt)
33
+
34
+ # issue 4528 revealed a segfault with this call
35
+ assert_raises(TypeError, einsum_fn, *(None,) * 63, optimize=do_opt)
36
+
37
+ # number of operands must match count in subscripts string
38
+ assert_raises(ValueError, einsum_fn, "", 0, 0, optimize=do_opt)
39
+ assert_raises(ValueError, einsum_fn, ",", 0, [0], [0],
40
+ optimize=do_opt)
41
+ assert_raises(ValueError, einsum_fn, ",", [0], optimize=do_opt)
42
+
43
+ # can't have more subscripts than dimensions in the operand
44
+ assert_raises(ValueError, einsum_fn, "i", 0, optimize=do_opt)
45
+ assert_raises(ValueError, einsum_fn, "ij", [0, 0], optimize=do_opt)
46
+ assert_raises(ValueError, einsum_fn, "...i", 0, optimize=do_opt)
47
+ assert_raises(ValueError, einsum_fn, "i...j", [0, 0], optimize=do_opt)
48
+ assert_raises(ValueError, einsum_fn, "i...", 0, optimize=do_opt)
49
+ assert_raises(ValueError, einsum_fn, "ij...", [0, 0], optimize=do_opt)
50
+
51
+ # invalid ellipsis
52
+ assert_raises(ValueError, einsum_fn, "i..", [0, 0], optimize=do_opt)
53
+ assert_raises(ValueError, einsum_fn, ".i...", [0, 0], optimize=do_opt)
54
+ assert_raises(ValueError, einsum_fn, "j->..j", [0, 0], optimize=do_opt)
55
+ assert_raises(ValueError, einsum_fn, "j->.j...", [0, 0],
56
+ optimize=do_opt)
57
+
58
+ # invalid subscript character
59
+ assert_raises(ValueError, einsum_fn, "i%...", [0, 0], optimize=do_opt)
60
+ assert_raises(ValueError, einsum_fn, "...j$", [0, 0], optimize=do_opt)
61
+ assert_raises(ValueError, einsum_fn, "i->&", [0, 0], optimize=do_opt)
62
+
63
+ # output subscripts must appear in input
64
+ assert_raises(ValueError, einsum_fn, "i->ij", [0, 0], optimize=do_opt)
65
+
66
+ # output subscripts may only be specified once
67
+ assert_raises(ValueError, einsum_fn, "ij->jij", [[0, 0], [0, 0]],
68
+ optimize=do_opt)
69
+
70
+ # dimensions must match when being collapsed
71
+ assert_raises(ValueError, einsum_fn, "ii",
72
+ np.arange(6).reshape(2, 3), optimize=do_opt)
73
+ assert_raises(ValueError, einsum_fn, "ii->i",
74
+ np.arange(6).reshape(2, 3), optimize=do_opt)
75
+
76
+ with assert_raises_regex(ValueError, "'b'"):
77
+ # gh-11221 - 'c' erroneously appeared in the error message
78
+ a = np.ones((3, 3, 4, 5, 6))
79
+ b = np.ones((3, 4, 5))
80
+ einsum_fn('aabcb,abc', a, b)
81
+
82
+ with pytest.raises(ValueError):
83
+ a = np.arange(3)
84
+ # einsum_path does not yet accept kwarg 'casting'
85
+ np.einsum('ij->j', [a, a], casting='same_value')
86
+
87
+ def test_einsum_sorting_behavior(self):
88
+ # Case 1: 26 dimensions (all lowercase indices)
89
+ n1 = 26
90
+ x1 = np.random.random((1,) * n1)
91
+ path1 = np.einsum_path(x1, range(n1))[1] # Get einsum path details
92
+ output_indices1 = path1.split("->")[-1].strip() # Extract output indices
93
+ # Assert indices are only uppercase letters and sorted correctly
94
+ assert all(c.isupper() for c in output_indices1), (
95
+ "Output indices for n=26 should use uppercase letters only: "
96
+ f"{output_indices1}"
97
+ )
98
+ assert_equal(
99
+ output_indices1,
100
+ ''.join(sorted(output_indices1)),
101
+ err_msg=(
102
+ "Output indices for n=26 are not lexicographically sorted: "
103
+ f"{output_indices1}"
104
+ )
105
+ )
106
+
107
+ # Case 2: 27 dimensions (includes uppercase indices)
108
+ n2 = 27
109
+ x2 = np.random.random((1,) * n2)
110
+ path2 = np.einsum_path(x2, range(n2))[1]
111
+ output_indices2 = path2.split("->")[-1].strip()
112
+ # Assert indices include both uppercase and lowercase letters
113
+ assert any(c.islower() for c in output_indices2), (
114
+ "Output indices for n=27 should include uppercase letters: "
115
+ f"{output_indices2}"
116
+ )
117
+ # Assert output indices are sorted uppercase before lowercase
118
+ assert_equal(
119
+ output_indices2,
120
+ ''.join(sorted(output_indices2)),
121
+ err_msg=(
122
+ "Output indices for n=27 are not lexicographically sorted: "
123
+ f"{output_indices2}"
124
+ )
125
+ )
126
+
127
+ # Additional Check: Ensure dimensions correspond correctly to indices
128
+ # Generate expected mapping of dimensions to indices
129
+ expected_indices = [
130
+ chr(i + ord('A')) if i < 26 else chr(i - 26 + ord('a'))
131
+ for i in range(n2)
132
+ ]
133
+ assert_equal(
134
+ output_indices2,
135
+ ''.join(expected_indices),
136
+ err_msg=(
137
+ "Output indices do not map to the correct dimensions. Expected: "
138
+ f"{''.join(expected_indices)}, Got: {output_indices2}"
139
+ )
140
+ )
141
+
142
+ @pytest.mark.parametrize("do_opt", [True, False])
143
+ def test_einsum_specific_errors(self, do_opt):
144
+ # out parameter must be an array
145
+ assert_raises(TypeError, np.einsum, "", 0, out='test',
146
+ optimize=do_opt)
147
+
148
+ # order parameter must be a valid order
149
+ assert_raises(ValueError, np.einsum, "", 0, order='W',
150
+ optimize=do_opt)
151
+
152
+ # casting parameter must be a valid casting
153
+ assert_raises(ValueError, np.einsum, "", 0, casting='blah',
154
+ optimize=do_opt)
155
+
156
+ # dtype parameter must be a valid dtype
157
+ assert_raises(TypeError, np.einsum, "", 0, dtype='bad_data_type',
158
+ optimize=do_opt)
159
+
160
+ # other keyword arguments are rejected
161
+ assert_raises(TypeError, np.einsum, "", 0, bad_arg=0, optimize=do_opt)
162
+
163
+ # broadcasting to new dimensions must be enabled explicitly
164
+ assert_raises(ValueError, np.einsum, "i", np.arange(6).reshape(2, 3),
165
+ optimize=do_opt)
166
+ assert_raises(ValueError, np.einsum, "i->i", [[0, 1], [0, 1]],
167
+ out=np.arange(4).reshape(2, 2), optimize=do_opt)
168
+
169
+ # Check order kwarg, asanyarray allows 1d to pass through
170
+ assert_raises(ValueError, np.einsum, "i->i",
171
+ np.arange(6).reshape(-1, 1), optimize=do_opt, order='d')
172
+
173
+ def test_einsum_object_errors(self):
174
+ # Exceptions created by object arithmetic should
175
+ # successfully propagate
176
+
177
+ class CustomException(Exception):
178
+ pass
179
+
180
+ class DestructoBox:
181
+
182
+ def __init__(self, value, destruct):
183
+ self._val = value
184
+ self._destruct = destruct
185
+
186
+ def __add__(self, other):
187
+ tmp = self._val + other._val
188
+ if tmp >= self._destruct:
189
+ raise CustomException
190
+ else:
191
+ self._val = tmp
192
+ return self
193
+
194
+ def __radd__(self, other):
195
+ if other == 0:
196
+ return self
197
+ else:
198
+ return self.__add__(other)
199
+
200
+ def __mul__(self, other):
201
+ tmp = self._val * other._val
202
+ if tmp >= self._destruct:
203
+ raise CustomException
204
+ else:
205
+ self._val = tmp
206
+ return self
207
+
208
+ def __rmul__(self, other):
209
+ if other == 0:
210
+ return self
211
+ else:
212
+ return self.__mul__(other)
213
+
214
+ a = np.array([DestructoBox(i, 5) for i in range(1, 10)],
215
+ dtype='object').reshape(3, 3)
216
+
217
+ # raised from unbuffered_loop_nop1_ndim2
218
+ assert_raises(CustomException, np.einsum, "ij->i", a)
219
+
220
+ # raised from unbuffered_loop_nop1_ndim3
221
+ b = np.array([DestructoBox(i, 100) for i in range(27)],
222
+ dtype='object').reshape(3, 3, 3)
223
+ assert_raises(CustomException, np.einsum, "i...k->...", b)
224
+
225
+ # raised from unbuffered_loop_nop2_ndim2
226
+ b = np.array([DestructoBox(i, 55) for i in range(1, 4)],
227
+ dtype='object')
228
+ assert_raises(CustomException, np.einsum, "ij, j", a, b)
229
+
230
+ # raised from unbuffered_loop_nop2_ndim3
231
+ assert_raises(CustomException, np.einsum, "ij, jh", a, a)
232
+
233
+ # raised from PyArray_EinsteinSum
234
+ assert_raises(CustomException, np.einsum, "ij->", a)
235
+
236
+ def test_einsum_views(self):
237
+ # pass-through
238
+ for do_opt in [True, False]:
239
+ a = np.arange(6).reshape((2, 3))
240
+
241
+ b = np.einsum("...", a, optimize=do_opt)
242
+ assert_(b.base is a.base)
243
+
244
+ b = np.einsum(a, [Ellipsis], optimize=do_opt)
245
+ assert_(b.base is a.base)
246
+
247
+ b = np.einsum("ij", a, optimize=do_opt)
248
+ assert_(b.base is a.base)
249
+ assert_equal(b, a)
250
+
251
+ b = np.einsum(a, [0, 1], optimize=do_opt)
252
+ assert_(b.base is a.base)
253
+ assert_equal(b, a)
254
+
255
+ # output is writeable whenever input is writeable
256
+ b = np.einsum("...", a, optimize=do_opt)
257
+ assert_(b.flags['WRITEABLE'])
258
+ a.flags['WRITEABLE'] = False
259
+ b = np.einsum("...", a, optimize=do_opt)
260
+ assert_(not b.flags['WRITEABLE'])
261
+
262
+ # transpose
263
+ a = np.arange(6).reshape((2, 3))
264
+
265
+ b = np.einsum("ji", a, optimize=do_opt)
266
+ assert_(b.base is a.base)
267
+ assert_equal(b, a.T)
268
+
269
+ b = np.einsum(a, [1, 0], optimize=do_opt)
270
+ assert_(b.base is a.base)
271
+ assert_equal(b, a.T)
272
+
273
+ # diagonal
274
+ a = np.arange(9).reshape((3, 3))
275
+
276
+ b = np.einsum("ii->i", a, optimize=do_opt)
277
+ assert_(b.base is a.base)
278
+ assert_equal(b, [a[i, i] for i in range(3)])
279
+
280
+ b = np.einsum(a, [0, 0], [0], optimize=do_opt)
281
+ assert_(b.base is a.base)
282
+ assert_equal(b, [a[i, i] for i in range(3)])
283
+
284
+ # diagonal with various ways of broadcasting an additional dimension
285
+ a = np.arange(27).reshape((3, 3, 3))
286
+
287
+ b = np.einsum("...ii->...i", a, optimize=do_opt)
288
+ assert_(b.base is a.base)
289
+ assert_equal(b, [[x[i, i] for i in range(3)] for x in a])
290
+
291
+ b = np.einsum(a, [Ellipsis, 0, 0], [Ellipsis, 0], optimize=do_opt)
292
+ assert_(b.base is a.base)
293
+ assert_equal(b, [[x[i, i] for i in range(3)] for x in a])
294
+
295
+ b = np.einsum("ii...->...i", a, optimize=do_opt)
296
+ assert_(b.base is a.base)
297
+ assert_equal(b, [[x[i, i] for i in range(3)]
298
+ for x in a.transpose(2, 0, 1)])
299
+
300
+ b = np.einsum(a, [0, 0, Ellipsis], [Ellipsis, 0], optimize=do_opt)
301
+ assert_(b.base is a.base)
302
+ assert_equal(b, [[x[i, i] for i in range(3)]
303
+ for x in a.transpose(2, 0, 1)])
304
+
305
+ b = np.einsum("...ii->i...", a, optimize=do_opt)
306
+ assert_(b.base is a.base)
307
+ assert_equal(b, [a[:, i, i] for i in range(3)])
308
+
309
+ b = np.einsum(a, [Ellipsis, 0, 0], [0, Ellipsis], optimize=do_opt)
310
+ assert_(b.base is a.base)
311
+ assert_equal(b, [a[:, i, i] for i in range(3)])
312
+
313
+ b = np.einsum("jii->ij", a, optimize=do_opt)
314
+ assert_(b.base is a.base)
315
+ assert_equal(b, [a[:, i, i] for i in range(3)])
316
+
317
+ b = np.einsum(a, [1, 0, 0], [0, 1], optimize=do_opt)
318
+ assert_(b.base is a.base)
319
+ assert_equal(b, [a[:, i, i] for i in range(3)])
320
+
321
+ b = np.einsum("ii...->i...", a, optimize=do_opt)
322
+ assert_(b.base is a.base)
323
+ assert_equal(b, [a.transpose(2, 0, 1)[:, i, i] for i in range(3)])
324
+
325
+ b = np.einsum(a, [0, 0, Ellipsis], [0, Ellipsis], optimize=do_opt)
326
+ assert_(b.base is a.base)
327
+ assert_equal(b, [a.transpose(2, 0, 1)[:, i, i] for i in range(3)])
328
+
329
+ b = np.einsum("i...i->i...", a, optimize=do_opt)
330
+ assert_(b.base is a.base)
331
+ assert_equal(b, [a.transpose(1, 0, 2)[:, i, i] for i in range(3)])
332
+
333
+ b = np.einsum(a, [0, Ellipsis, 0], [0, Ellipsis], optimize=do_opt)
334
+ assert_(b.base is a.base)
335
+ assert_equal(b, [a.transpose(1, 0, 2)[:, i, i] for i in range(3)])
336
+
337
+ b = np.einsum("i...i->...i", a, optimize=do_opt)
338
+ assert_(b.base is a.base)
339
+ assert_equal(b, [[x[i, i] for i in range(3)]
340
+ for x in a.transpose(1, 0, 2)])
341
+
342
+ b = np.einsum(a, [0, Ellipsis, 0], [Ellipsis, 0], optimize=do_opt)
343
+ assert_(b.base is a.base)
344
+ assert_equal(b, [[x[i, i] for i in range(3)]
345
+ for x in a.transpose(1, 0, 2)])
346
+
347
+ # triple diagonal
348
+ a = np.arange(27).reshape((3, 3, 3))
349
+
350
+ b = np.einsum("iii->i", a, optimize=do_opt)
351
+ assert_(b.base is a.base)
352
+ assert_equal(b, [a[i, i, i] for i in range(3)])
353
+
354
+ b = np.einsum(a, [0, 0, 0], [0], optimize=do_opt)
355
+ assert_(b.base is a.base)
356
+ assert_equal(b, [a[i, i, i] for i in range(3)])
357
+
358
+ # swap axes
359
+ a = np.arange(24).reshape((2, 3, 4))
360
+
361
+ b = np.einsum("ijk->jik", a, optimize=do_opt)
362
+ assert_(b.base is a.base)
363
+ assert_equal(b, a.swapaxes(0, 1))
364
+
365
+ b = np.einsum(a, [0, 1, 2], [1, 0, 2], optimize=do_opt)
366
+ assert_(b.base is a.base)
367
+ assert_equal(b, a.swapaxes(0, 1))
368
+
369
+ def check_einsum_sums(self, dtype, do_opt=False):
370
+ dtype = np.dtype(dtype)
371
+ # Check various sums. Does many sizes to exercise unrolled loops.
372
+
373
+ # sum(a, axis=-1)
374
+ for n in range(1, 17):
375
+ a = np.arange(n, dtype=dtype)
376
+ b = np.sum(a, axis=-1)
377
+ if hasattr(b, 'astype'):
378
+ b = b.astype(dtype)
379
+ assert_equal(np.einsum("i->", a, optimize=do_opt), b)
380
+ assert_equal(np.einsum(a, [0], [], optimize=do_opt), b)
381
+
382
+ for n in range(1, 17):
383
+ a = np.arange(2 * 3 * n, dtype=dtype).reshape(2, 3, n)
384
+ b = np.sum(a, axis=-1)
385
+ if hasattr(b, 'astype'):
386
+ b = b.astype(dtype)
387
+ assert_equal(np.einsum("...i->...", a, optimize=do_opt), b)
388
+ assert_equal(np.einsum(a, [Ellipsis, 0], [Ellipsis], optimize=do_opt), b)
389
+
390
+ # sum(a, axis=0)
391
+ for n in range(1, 17):
392
+ a = np.arange(2 * n, dtype=dtype).reshape(2, n)
393
+ b = np.sum(a, axis=0)
394
+ if hasattr(b, 'astype'):
395
+ b = b.astype(dtype)
396
+ assert_equal(np.einsum("i...->...", a, optimize=do_opt), b)
397
+ assert_equal(np.einsum(a, [0, Ellipsis], [Ellipsis], optimize=do_opt), b)
398
+
399
+ for n in range(1, 17):
400
+ a = np.arange(2 * 3 * n, dtype=dtype).reshape(2, 3, n)
401
+ b = np.sum(a, axis=0)
402
+ if hasattr(b, 'astype'):
403
+ b = b.astype(dtype)
404
+ assert_equal(np.einsum("i...->...", a, optimize=do_opt), b)
405
+ assert_equal(np.einsum(a, [0, Ellipsis], [Ellipsis], optimize=do_opt), b)
406
+
407
+ # trace(a)
408
+ for n in range(1, 17):
409
+ a = np.arange(n * n, dtype=dtype).reshape(n, n)
410
+ b = np.trace(a)
411
+ if hasattr(b, 'astype'):
412
+ b = b.astype(dtype)
413
+ assert_equal(np.einsum("ii", a, optimize=do_opt), b)
414
+ assert_equal(np.einsum(a, [0, 0], optimize=do_opt), b)
415
+
416
+ # gh-15961: should accept numpy int64 type in subscript list
417
+ np_array = np.asarray([0, 0])
418
+ assert_equal(np.einsum(a, np_array, optimize=do_opt), b)
419
+ assert_equal(np.einsum(a, list(np_array), optimize=do_opt), b)
420
+
421
+ # multiply(a, b)
422
+ assert_equal(np.einsum("..., ...", 3, 4), 12) # scalar case
423
+ for n in range(1, 17):
424
+ a = np.arange(3 * n, dtype=dtype).reshape(3, n)
425
+ b = np.arange(2 * 3 * n, dtype=dtype).reshape(2, 3, n)
426
+ assert_equal(np.einsum("..., ...", a, b, optimize=do_opt),
427
+ np.multiply(a, b))
428
+ assert_equal(np.einsum(a, [Ellipsis], b, [Ellipsis], optimize=do_opt),
429
+ np.multiply(a, b))
430
+
431
+ # inner(a,b)
432
+ for n in range(1, 17):
433
+ a = np.arange(2 * 3 * n, dtype=dtype).reshape(2, 3, n)
434
+ b = np.arange(n, dtype=dtype)
435
+ assert_equal(np.einsum("...i, ...i", a, b, optimize=do_opt), np.inner(a, b))
436
+ assert_equal(np.einsum(a, [Ellipsis, 0], b, [Ellipsis, 0], optimize=do_opt),
437
+ np.inner(a, b))
438
+
439
+ for n in range(1, 11):
440
+ a = np.arange(n * 3 * 2, dtype=dtype).reshape(n, 3, 2)
441
+ b = np.arange(n, dtype=dtype)
442
+ assert_equal(np.einsum("i..., i...", a, b, optimize=do_opt),
443
+ np.inner(a.T, b.T).T)
444
+ assert_equal(np.einsum(a, [0, Ellipsis], b, [0, Ellipsis], optimize=do_opt),
445
+ np.inner(a.T, b.T).T)
446
+
447
+ # outer(a,b)
448
+ for n in range(1, 17):
449
+ a = np.arange(3, dtype=dtype) + 1
450
+ b = np.arange(n, dtype=dtype) + 1
451
+ assert_equal(np.einsum("i,j", a, b, optimize=do_opt),
452
+ np.outer(a, b))
453
+ assert_equal(np.einsum(a, [0], b, [1], optimize=do_opt),
454
+ np.outer(a, b))
455
+
456
+ # Suppress the complex warnings for the 'as f8' tests
457
+ with warnings.catch_warnings():
458
+ warnings.simplefilter('ignore', np.exceptions.ComplexWarning)
459
+
460
+ # matvec(a,b) / a.dot(b) where a is matrix, b is vector
461
+ for n in range(1, 17):
462
+ a = np.arange(4 * n, dtype=dtype).reshape(4, n)
463
+ b = np.arange(n, dtype=dtype)
464
+ assert_equal(np.einsum("ij, j", a, b, optimize=do_opt),
465
+ np.dot(a, b))
466
+ assert_equal(np.einsum(a, [0, 1], b, [1], optimize=do_opt),
467
+ np.dot(a, b))
468
+
469
+ c = np.arange(4, dtype=dtype)
470
+ np.einsum("ij,j", a, b, out=c,
471
+ dtype='f8', casting='unsafe', optimize=do_opt)
472
+ assert_equal(c,
473
+ np.dot(a.astype('f8'),
474
+ b.astype('f8')).astype(dtype))
475
+ c[...] = 0
476
+ np.einsum(a, [0, 1], b, [1], out=c,
477
+ dtype='f8', casting='unsafe', optimize=do_opt)
478
+ assert_equal(c,
479
+ np.dot(a.astype('f8'),
480
+ b.astype('f8')).astype(dtype))
481
+
482
+ for n in range(1, 17):
483
+ a = np.arange(4 * n, dtype=dtype).reshape(4, n)
484
+ b = np.arange(n, dtype=dtype)
485
+ assert_equal(np.einsum("ji,j", a.T, b.T, optimize=do_opt),
486
+ np.dot(b.T, a.T))
487
+ assert_equal(np.einsum(a.T, [1, 0], b.T, [1], optimize=do_opt),
488
+ np.dot(b.T, a.T))
489
+
490
+ c = np.arange(4, dtype=dtype)
491
+ np.einsum("ji,j", a.T, b.T, out=c,
492
+ dtype='f8', casting='unsafe', optimize=do_opt)
493
+ assert_equal(c,
494
+ np.dot(b.T.astype('f8'),
495
+ a.T.astype('f8')).astype(dtype))
496
+ c[...] = 0
497
+ np.einsum(a.T, [1, 0], b.T, [1], out=c,
498
+ dtype='f8', casting='unsafe', optimize=do_opt)
499
+ assert_equal(c,
500
+ np.dot(b.T.astype('f8'),
501
+ a.T.astype('f8')).astype(dtype))
502
+
503
+ # matmat(a,b) / a.dot(b) where a is matrix, b is matrix
504
+ for n in range(1, 17):
505
+ if n < 8 or dtype != 'f2':
506
+ a = np.arange(4 * n, dtype=dtype).reshape(4, n)
507
+ b = np.arange(n * 6, dtype=dtype).reshape(n, 6)
508
+ assert_equal(np.einsum("ij,jk", a, b, optimize=do_opt),
509
+ np.dot(a, b))
510
+ assert_equal(np.einsum(a, [0, 1], b, [1, 2], optimize=do_opt),
511
+ np.dot(a, b))
512
+
513
+ for n in range(1, 17):
514
+ a = np.arange(4 * n, dtype=dtype).reshape(4, n)
515
+ b = np.arange(n * 6, dtype=dtype).reshape(n, 6)
516
+ c = np.arange(24, dtype=dtype).reshape(4, 6)
517
+ np.einsum("ij,jk", a, b, out=c, dtype='f8', casting='unsafe',
518
+ optimize=do_opt)
519
+ assert_equal(c,
520
+ np.dot(a.astype('f8'),
521
+ b.astype('f8')).astype(dtype))
522
+ c[...] = 0
523
+ np.einsum(a, [0, 1], b, [1, 2], out=c,
524
+ dtype='f8', casting='unsafe', optimize=do_opt)
525
+ assert_equal(c,
526
+ np.dot(a.astype('f8'),
527
+ b.astype('f8')).astype(dtype))
528
+
529
+ # matrix triple product (note this is not currently an efficient
530
+ # way to multiply 3 matrices)
531
+ a = np.arange(12, dtype=dtype).reshape(3, 4)
532
+ b = np.arange(20, dtype=dtype).reshape(4, 5)
533
+ c = np.arange(30, dtype=dtype).reshape(5, 6)
534
+ if dtype != 'f2':
535
+ assert_equal(np.einsum("ij,jk,kl", a, b, c, optimize=do_opt),
536
+ a.dot(b).dot(c))
537
+ assert_equal(np.einsum(a, [0, 1], b, [1, 2], c, [2, 3],
538
+ optimize=do_opt), a.dot(b).dot(c))
539
+
540
+ d = np.arange(18, dtype=dtype).reshape(3, 6)
541
+ np.einsum("ij,jk,kl", a, b, c, out=d,
542
+ dtype='f8', casting='unsafe', optimize=do_opt)
543
+ tgt = a.astype('f8').dot(b.astype('f8'))
544
+ tgt = tgt.dot(c.astype('f8')).astype(dtype)
545
+ assert_equal(d, tgt)
546
+
547
+ d[...] = 0
548
+ np.einsum(a, [0, 1], b, [1, 2], c, [2, 3], out=d,
549
+ dtype='f8', casting='unsafe', optimize=do_opt)
550
+ tgt = a.astype('f8').dot(b.astype('f8'))
551
+ tgt = tgt.dot(c.astype('f8')).astype(dtype)
552
+ assert_equal(d, tgt)
553
+
554
+ # tensordot(a, b)
555
+ if np.dtype(dtype) != np.dtype('f2'):
556
+ a = np.arange(60, dtype=dtype).reshape(3, 4, 5)
557
+ b = np.arange(24, dtype=dtype).reshape(4, 3, 2)
558
+ assert_equal(np.einsum("ijk, jil -> kl", a, b),
559
+ np.tensordot(a, b, axes=([1, 0], [0, 1])))
560
+ assert_equal(np.einsum(a, [0, 1, 2], b, [1, 0, 3], [2, 3]),
561
+ np.tensordot(a, b, axes=([1, 0], [0, 1])))
562
+
563
+ c = np.arange(10, dtype=dtype).reshape(5, 2)
564
+ np.einsum("ijk,jil->kl", a, b, out=c,
565
+ dtype='f8', casting='unsafe', optimize=do_opt)
566
+ assert_equal(c, np.tensordot(a.astype('f8'), b.astype('f8'),
567
+ axes=([1, 0], [0, 1])).astype(dtype))
568
+ c[...] = 0
569
+ np.einsum(a, [0, 1, 2], b, [1, 0, 3], [2, 3], out=c,
570
+ dtype='f8', casting='unsafe', optimize=do_opt)
571
+ assert_equal(c, np.tensordot(a.astype('f8'), b.astype('f8'),
572
+ axes=([1, 0], [0, 1])).astype(dtype))
573
+
574
+ # logical_and(logical_and(a!=0, b!=0), c!=0)
575
+ neg_val = -2 if dtype.kind != "u" else np.iinfo(dtype).max - 1
576
+ a = np.array([1, 3, neg_val, 0, 12, 13, 0, 1], dtype=dtype)
577
+ b = np.array([0, 3.5, 0., neg_val, 0, 1, 3, 12], dtype=dtype)
578
+ c = np.array([True, True, False, True, True, False, True, True])
579
+
580
+ assert_equal(np.einsum("i,i,i->i", a, b, c,
581
+ dtype='?', casting='unsafe', optimize=do_opt),
582
+ np.logical_and(np.logical_and(a != 0, b != 0), c != 0))
583
+ assert_equal(np.einsum(a, [0], b, [0], c, [0], [0],
584
+ dtype='?', casting='unsafe'),
585
+ np.logical_and(np.logical_and(a != 0, b != 0), c != 0))
586
+
587
+ a = np.arange(9, dtype=dtype)
588
+ assert_equal(np.einsum(",i->", 3, a), 3 * np.sum(a))
589
+ assert_equal(np.einsum(3, [], a, [0], []), 3 * np.sum(a))
590
+ assert_equal(np.einsum("i,->", a, 3), 3 * np.sum(a))
591
+ assert_equal(np.einsum(a, [0], 3, [], []), 3 * np.sum(a))
592
+
593
+ # Various stride0, contiguous, and SSE aligned variants
594
+ for n in range(1, 25):
595
+ a = np.arange(n, dtype=dtype)
596
+ if np.dtype(dtype).itemsize > 1:
597
+ assert_equal(np.einsum("...,...", a, a, optimize=do_opt),
598
+ np.multiply(a, a))
599
+ assert_equal(np.einsum("i,i", a, a, optimize=do_opt), np.dot(a, a))
600
+ assert_equal(np.einsum("i,->i", a, 2, optimize=do_opt), 2 * a)
601
+ assert_equal(np.einsum(",i->i", 2, a, optimize=do_opt), 2 * a)
602
+ assert_equal(np.einsum("i,->", a, 2, optimize=do_opt), 2 * np.sum(a))
603
+ assert_equal(np.einsum(",i->", 2, a, optimize=do_opt), 2 * np.sum(a))
604
+
605
+ assert_equal(np.einsum("...,...", a[1:], a[:-1], optimize=do_opt),
606
+ np.multiply(a[1:], a[:-1]))
607
+ assert_equal(np.einsum("i,i", a[1:], a[:-1], optimize=do_opt),
608
+ np.dot(a[1:], a[:-1]))
609
+ assert_equal(np.einsum("i,->i", a[1:], 2, optimize=do_opt), 2 * a[1:])
610
+ assert_equal(np.einsum(",i->i", 2, a[1:], optimize=do_opt), 2 * a[1:])
611
+ assert_equal(np.einsum("i,->", a[1:], 2, optimize=do_opt),
612
+ 2 * np.sum(a[1:]))
613
+ assert_equal(np.einsum(",i->", 2, a[1:], optimize=do_opt),
614
+ 2 * np.sum(a[1:]))
615
+
616
+ # An object array, summed as the data type
617
+ a = np.arange(9, dtype=object)
618
+
619
+ b = np.einsum("i->", a, dtype=dtype, casting='unsafe')
620
+ assert_equal(b, np.sum(a))
621
+ if hasattr(b, "dtype"):
622
+ # Can be a python object when dtype is object
623
+ assert_equal(b.dtype, np.dtype(dtype))
624
+
625
+ b = np.einsum(a, [0], [], dtype=dtype, casting='unsafe')
626
+ assert_equal(b, np.sum(a))
627
+ if hasattr(b, "dtype"):
628
+ # Can be a python object when dtype is object
629
+ assert_equal(b.dtype, np.dtype(dtype))
630
+
631
+ # A case which was failing (ticket #1885)
632
+ p = np.arange(2) + 1
633
+ q = np.arange(4).reshape(2, 2) + 3
634
+ r = np.arange(4).reshape(2, 2) + 7
635
+ assert_equal(np.einsum('z,mz,zm->', p, q, r), 253)
636
+
637
+ # singleton dimensions broadcast (gh-10343)
638
+ p = np.ones((10, 2))
639
+ q = np.ones((1, 2))
640
+ assert_array_equal(np.einsum('ij,ij->j', p, q, optimize=True),
641
+ np.einsum('ij,ij->j', p, q, optimize=False))
642
+ assert_array_equal(np.einsum('ij,ij->j', p, q, optimize=True),
643
+ [10.] * 2)
644
+
645
+ # a blas-compatible contraction broadcasting case which was failing
646
+ # for optimize=True (ticket #10930)
647
+ x = np.array([2., 3.])
648
+ y = np.array([4.])
649
+ assert_array_equal(np.einsum("i, i", x, y, optimize=False), 20.)
650
+ assert_array_equal(np.einsum("i, i", x, y, optimize=True), 20.)
651
+
652
+ # all-ones array was bypassing bug (ticket #10930)
653
+ p = np.ones((1, 5)) / 2
654
+ q = np.ones((5, 5)) / 2
655
+ for optimize in (True, False):
656
+ assert_array_equal(np.einsum("...ij,...jk->...ik", p, p,
657
+ optimize=optimize),
658
+ np.einsum("...ij,...jk->...ik", p, q,
659
+ optimize=optimize))
660
+ assert_array_equal(np.einsum("...ij,...jk->...ik", p, q,
661
+ optimize=optimize),
662
+ np.full((1, 5), 1.25))
663
+
664
+ # Cases which were failing (gh-10899)
665
+ x = np.eye(2, dtype=dtype)
666
+ y = np.ones(2, dtype=dtype)
667
+ assert_array_equal(np.einsum("ji,i->", x, y, optimize=optimize),
668
+ [2.]) # contig_contig_outstride0_two
669
+ assert_array_equal(np.einsum("i,ij->", y, x, optimize=optimize),
670
+ [2.]) # stride0_contig_outstride0_two
671
+ assert_array_equal(np.einsum("ij,i->", x, y, optimize=optimize),
672
+ [2.]) # contig_stride0_outstride0_two
673
+
674
+ def test_einsum_sums_int8(self):
675
+ self.check_einsum_sums('i1')
676
+
677
+ def test_einsum_sums_uint8(self):
678
+ self.check_einsum_sums('u1')
679
+
680
+ def test_einsum_sums_int16(self):
681
+ self.check_einsum_sums('i2')
682
+
683
+ def test_einsum_sums_uint16(self):
684
+ self.check_einsum_sums('u2')
685
+
686
+ def test_einsum_sums_int32(self):
687
+ self.check_einsum_sums('i4')
688
+ self.check_einsum_sums('i4', True)
689
+
690
+ def test_einsum_sums_uint32(self):
691
+ self.check_einsum_sums('u4')
692
+ self.check_einsum_sums('u4', True)
693
+
694
+ def test_einsum_sums_int64(self):
695
+ self.check_einsum_sums('i8')
696
+
697
+ def test_einsum_sums_uint64(self):
698
+ self.check_einsum_sums('u8')
699
+
700
+ def test_einsum_sums_float16(self):
701
+ self.check_einsum_sums('f2')
702
+
703
+ def test_einsum_sums_float32(self):
704
+ self.check_einsum_sums('f4')
705
+
706
+ def test_einsum_sums_float64(self):
707
+ self.check_einsum_sums('f8')
708
+ self.check_einsum_sums('f8', True)
709
+
710
+ def test_einsum_sums_longdouble(self):
711
+ self.check_einsum_sums(np.longdouble)
712
+
713
+ def test_einsum_sums_cfloat64(self):
714
+ self.check_einsum_sums('c8')
715
+ self.check_einsum_sums('c8', True)
716
+
717
+ def test_einsum_sums_cfloat128(self):
718
+ self.check_einsum_sums('c16')
719
+
720
+ def test_einsum_sums_clongdouble(self):
721
+ self.check_einsum_sums(np.clongdouble)
722
+
723
+ def test_einsum_sums_object(self):
724
+ self.check_einsum_sums('object')
725
+ self.check_einsum_sums('object', True)
726
+
727
+ def test_einsum_misc(self):
728
+ # This call used to crash because of a bug in
729
+ # PyArray_AssignZero
730
+ a = np.ones((1, 2))
731
+ b = np.ones((2, 2, 1))
732
+ assert_equal(np.einsum('ij...,j...->i...', a, b), [[[2], [2]]])
733
+ assert_equal(np.einsum('ij...,j...->i...', a, b, optimize=True), [[[2], [2]]])
734
+
735
+ # Regression test for issue #10369 (test unicode inputs with Python 2)
736
+ assert_equal(np.einsum('ij...,j...->i...', a, b), [[[2], [2]]])
737
+ assert_equal(np.einsum('...i,...i', [1, 2, 3], [2, 3, 4]), 20)
738
+ assert_equal(np.einsum('...i,...i', [1, 2, 3], [2, 3, 4],
739
+ optimize='greedy'), 20)
740
+
741
+ # The iterator had an issue with buffering this reduction
742
+ a = np.ones((5, 12, 4, 2, 3), np.int64)
743
+ b = np.ones((5, 12, 11), np.int64)
744
+ assert_equal(np.einsum('ijklm,ijn,ijn->', a, b, b),
745
+ np.einsum('ijklm,ijn->', a, b))
746
+ assert_equal(np.einsum('ijklm,ijn,ijn->', a, b, b, optimize=True),
747
+ np.einsum('ijklm,ijn->', a, b, optimize=True))
748
+
749
+ # Issue #2027, was a problem in the contiguous 3-argument
750
+ # inner loop implementation
751
+ a = np.arange(1, 3)
752
+ b = np.arange(1, 5).reshape(2, 2)
753
+ c = np.arange(1, 9).reshape(4, 2)
754
+ assert_equal(np.einsum('x,yx,zx->xzy', a, b, c),
755
+ [[[1, 3], [3, 9], [5, 15], [7, 21]],
756
+ [[8, 16], [16, 32], [24, 48], [32, 64]]])
757
+ assert_equal(np.einsum('x,yx,zx->xzy', a, b, c, optimize=True),
758
+ [[[1, 3], [3, 9], [5, 15], [7, 21]],
759
+ [[8, 16], [16, 32], [24, 48], [32, 64]]])
760
+
761
+ # Ensure explicitly setting out=None does not cause an error
762
+ # see issue gh-15776 and issue gh-15256
763
+ assert_equal(np.einsum('i,j', [1], [2], out=None), [[2]])
764
+
765
+ def test_object_loop(self):
766
+
767
+ class Mult:
768
+ def __mul__(self, other):
769
+ return 42
770
+
771
+ objMult = np.array([Mult()])
772
+ objNULL = np.ndarray(buffer=b'\0' * np.intp(0).itemsize, shape=1, dtype=object)
773
+
774
+ with pytest.raises(TypeError):
775
+ np.einsum("i,j", [1], objNULL)
776
+ with pytest.raises(TypeError):
777
+ np.einsum("i,j", objNULL, [1])
778
+ assert np.einsum("i,j", objMult, objMult) == 42
779
+
780
+ def test_subscript_range(self):
781
+ # Issue #7741, make sure that all letters of Latin alphabet (both uppercase & lowercase) can be used
782
+ # when creating a subscript from arrays
783
+ a = np.ones((2, 3))
784
+ b = np.ones((3, 4))
785
+ np.einsum(a, [0, 20], b, [20, 2], [0, 2], optimize=False)
786
+ np.einsum(a, [0, 27], b, [27, 2], [0, 2], optimize=False)
787
+ np.einsum(a, [0, 51], b, [51, 2], [0, 2], optimize=False)
788
+ assert_raises(ValueError, lambda: np.einsum(a, [0, 52], b, [52, 2], [0, 2], optimize=False))
789
+ assert_raises(ValueError, lambda: np.einsum(a, [-1, 5], b, [5, 2], [-1, 2], optimize=False))
790
+
791
+ def test_einsum_broadcast(self):
792
+ # Issue #2455 change in handling ellipsis
793
+ # remove the 'middle broadcast' error
794
+ # only use the 'RIGHT' iteration in prepare_op_axes
795
+ # adds auto broadcast on left where it belongs
796
+ # broadcast on right has to be explicit
797
+ # We need to test the optimized parsing as well
798
+
799
+ A = np.arange(2 * 3 * 4).reshape(2, 3, 4)
800
+ B = np.arange(3)
801
+ ref = np.einsum('ijk,j->ijk', A, B, optimize=False)
802
+ for opt in [True, False]:
803
+ assert_equal(np.einsum('ij...,j...->ij...', A, B, optimize=opt), ref)
804
+ assert_equal(np.einsum('ij...,...j->ij...', A, B, optimize=opt), ref)
805
+ assert_equal(np.einsum('ij...,j->ij...', A, B, optimize=opt), ref) # used to raise error
806
+
807
+ A = np.arange(12).reshape((4, 3))
808
+ B = np.arange(6).reshape((3, 2))
809
+ ref = np.einsum('ik,kj->ij', A, B, optimize=False)
810
+ for opt in [True, False]:
811
+ assert_equal(np.einsum('ik...,k...->i...', A, B, optimize=opt), ref)
812
+ assert_equal(np.einsum('ik...,...kj->i...j', A, B, optimize=opt), ref)
813
+ assert_equal(np.einsum('...k,kj', A, B, optimize=opt), ref) # used to raise error
814
+ assert_equal(np.einsum('ik,k...->i...', A, B, optimize=opt), ref) # used to raise error
815
+
816
+ dims = [2, 3, 4, 5]
817
+ a = np.arange(np.prod(dims)).reshape(dims)
818
+ v = np.arange(dims[2])
819
+ ref = np.einsum('ijkl,k->ijl', a, v, optimize=False)
820
+ for opt in [True, False]:
821
+ assert_equal(np.einsum('ijkl,k', a, v, optimize=opt), ref)
822
+ assert_equal(np.einsum('...kl,k', a, v, optimize=opt), ref) # used to raise error
823
+ assert_equal(np.einsum('...kl,k...', a, v, optimize=opt), ref)
824
+
825
+ J, K, M = 160, 160, 120
826
+ A = np.arange(J * K * M).reshape(1, 1, 1, J, K, M)
827
+ B = np.arange(J * K * M * 3).reshape(J, K, M, 3)
828
+ ref = np.einsum('...lmn,...lmno->...o', A, B, optimize=False)
829
+ for opt in [True, False]:
830
+ assert_equal(np.einsum('...lmn,lmno->...o', A, B,
831
+ optimize=opt), ref) # used to raise error
832
+
833
+ def test_einsum_fixedstridebug(self):
834
+ # Issue #4485 obscure einsum bug
835
+ # This case revealed a bug in nditer where it reported a stride
836
+ # as 'fixed' (0) when it was in fact not fixed during processing
837
+ # (0 or 4). The reason for the bug was that the check for a fixed
838
+ # stride was using the information from the 2D inner loop reuse
839
+ # to restrict the iteration dimensions it had to validate to be
840
+ # the same, but that 2D inner loop reuse logic is only triggered
841
+ # during the buffer copying step, and hence it was invalid to
842
+ # rely on those values. The fix is to check all the dimensions
843
+ # of the stride in question, which in the test case reveals that
844
+ # the stride is not fixed.
845
+ #
846
+ # NOTE: This test is triggered by the fact that the default buffersize,
847
+ # used by einsum, is 8192, and 3*2731 = 8193, is larger than that
848
+ # and results in a mismatch between the buffering and the
849
+ # striding for operand A.
850
+ A = np.arange(2 * 3).reshape(2, 3).astype(np.float32)
851
+ B = np.arange(2 * 3 * 2731).reshape(2, 3, 2731).astype(np.int16)
852
+ es = np.einsum('cl, cpx->lpx', A, B)
853
+ tp = np.tensordot(A, B, axes=(0, 0))
854
+ assert_equal(es, tp)
855
+ # The following is the original test case from the bug report,
856
+ # made repeatable by changing random arrays to aranges.
857
+ A = np.arange(3 * 3).reshape(3, 3).astype(np.float64)
858
+ B = np.arange(3 * 3 * 64 * 64).reshape(3, 3, 64, 64).astype(np.float32)
859
+ es = np.einsum('cl, cpxy->lpxy', A, B)
860
+ tp = np.tensordot(A, B, axes=(0, 0))
861
+ assert_equal(es, tp)
862
+
863
+ def test_einsum_fixed_collapsingbug(self):
864
+ # Issue #5147.
865
+ # The bug only occurred when output argument of einssum was used.
866
+ x = np.random.normal(0, 1, (5, 5, 5, 5))
867
+ y1 = np.zeros((5, 5))
868
+ np.einsum('aabb->ab', x, out=y1)
869
+ idx = np.arange(5)
870
+ y2 = x[idx[:, None], idx[:, None], idx, idx]
871
+ assert_equal(y1, y2)
872
+
873
+ def test_einsum_failed_on_p9_and_s390x(self):
874
+ # Issues gh-14692 and gh-12689
875
+ # Bug with signed vs unsigned char errored on power9 and s390x Linux
876
+ tensor = np.random.random_sample((10, 10, 10, 10))
877
+ x = np.einsum('ijij->', tensor)
878
+ y = tensor.trace(axis1=0, axis2=2).trace()
879
+ assert_allclose(x, y)
880
+
881
+ def test_einsum_all_contig_non_contig_output(self):
882
+ # Issue gh-5907, tests that the all contiguous special case
883
+ # actually checks the contiguity of the output
884
+ x = np.ones((5, 5))
885
+ out = np.ones(10)[::2]
886
+ correct_base = np.ones(10)
887
+ correct_base[::2] = 5
888
+ # Always worked (inner iteration is done with 0-stride):
889
+ np.einsum('mi,mi,mi->m', x, x, x, out=out)
890
+ assert_array_equal(out.base, correct_base)
891
+ # Example 1:
892
+ out = np.ones(10)[::2]
893
+ np.einsum('im,im,im->m', x, x, x, out=out)
894
+ assert_array_equal(out.base, correct_base)
895
+ # Example 2, buffering causes x to be contiguous but
896
+ # special cases do not catch the operation before:
897
+ out = np.ones((2, 2, 2))[..., 0]
898
+ correct_base = np.ones((2, 2, 2))
899
+ correct_base[..., 0] = 2
900
+ x = np.ones((2, 2), np.float32)
901
+ np.einsum('ij,jk->ik', x, x, out=out)
902
+ assert_array_equal(out.base, correct_base)
903
+
904
+ @pytest.mark.parametrize("dtype",
905
+ np.typecodes["AllFloat"] + np.typecodes["AllInteger"])
906
+ def test_different_paths(self, dtype):
907
+ # Test originally added to cover broken float16 path: gh-20305
908
+ # Likely most are covered elsewhere, at least partially.
909
+ dtype = np.dtype(dtype)
910
+ # Simple test, designed to exercise most specialized code paths,
911
+ # note the +0.5 for floats. This makes sure we use a float value
912
+ # where the results must be exact.
913
+ arr = (np.arange(7) + 0.5).astype(dtype)
914
+ scalar = np.array(2, dtype=dtype)
915
+
916
+ # contig -> scalar:
917
+ res = np.einsum('i->', arr)
918
+ assert res == arr.sum()
919
+ # contig, contig -> contig:
920
+ res = np.einsum('i,i->i', arr, arr)
921
+ assert_array_equal(res, arr * arr)
922
+ # noncontig, noncontig -> contig:
923
+ res = np.einsum('i,i->i', arr.repeat(2)[::2], arr.repeat(2)[::2])
924
+ assert_array_equal(res, arr * arr)
925
+ # contig + contig -> scalar
926
+ assert np.einsum('i,i->', arr, arr) == (arr * arr).sum()
927
+ # contig + scalar -> contig (with out)
928
+ out = np.ones(7, dtype=dtype)
929
+ res = np.einsum('i,->i', arr, dtype.type(2), out=out)
930
+ assert_array_equal(res, arr * dtype.type(2))
931
+ # scalar + contig -> contig (with out)
932
+ res = np.einsum(',i->i', scalar, arr)
933
+ assert_array_equal(res, arr * dtype.type(2))
934
+ # scalar + contig -> scalar
935
+ res = np.einsum(',i->', scalar, arr)
936
+ # Use einsum to compare to not have difference due to sum round-offs:
937
+ assert res == np.einsum('i->', scalar * arr)
938
+ # contig + scalar -> scalar
939
+ res = np.einsum('i,->', arr, scalar)
940
+ # Use einsum to compare to not have difference due to sum round-offs:
941
+ assert res == np.einsum('i->', scalar * arr)
942
+ # contig + contig + contig -> scalar
943
+ arr = np.array([0.5, 0.5, 0.25, 4.5, 3.], dtype=dtype)
944
+ res = np.einsum('i,i,i->', arr, arr, arr)
945
+ assert_array_equal(res, (arr * arr * arr).sum())
946
+ # four arrays:
947
+ res = np.einsum('i,i,i,i->', arr, arr, arr, arr)
948
+ assert_array_equal(res, (arr * arr * arr * arr).sum())
949
+
950
+ def test_small_boolean_arrays(self):
951
+ # See gh-5946.
952
+ # Use array of True embedded in False.
953
+ a = np.zeros((16, 1, 1), dtype=np.bool)[:2]
954
+ a[...] = True
955
+ out = np.zeros((16, 1, 1), dtype=np.bool)[:2]
956
+ tgt = np.ones((2, 1, 1), dtype=np.bool)
957
+ res = np.einsum('...ij,...jk->...ik', a, a, out=out)
958
+ assert_equal(res, tgt)
959
+
960
+ def test_out_is_res(self):
961
+ a = np.arange(9).reshape(3, 3)
962
+ res = np.einsum('...ij,...jk->...ik', a, a, out=a)
963
+ assert res is a
964
+
965
+ def optimize_compare(self, subscripts, operands=None):
966
+ # Tests all paths of the optimization function against
967
+ # conventional einsum
968
+ if operands is None:
969
+ args = [subscripts]
970
+ terms = subscripts.split('->')[0].split(',')
971
+ for term in terms:
972
+ dims = [global_size_dict[x] for x in term]
973
+ args.append(np.random.rand(*dims))
974
+ else:
975
+ args = [subscripts] + operands
976
+
977
+ noopt = np.einsum(*args, optimize=False)
978
+ opt = np.einsum(*args, optimize='greedy')
979
+ assert_almost_equal(opt, noopt)
980
+ opt = np.einsum(*args, optimize='optimal')
981
+ assert_almost_equal(opt, noopt)
982
+
983
+ def test_hadamard_like_products(self):
984
+ # Hadamard outer products
985
+ self.optimize_compare('a,ab,abc->abc')
986
+ self.optimize_compare('a,b,ab->ab')
987
+
988
+ def test_index_transformations(self):
989
+ # Simple index transformation cases
990
+ self.optimize_compare('ea,fb,gc,hd,abcd->efgh')
991
+ self.optimize_compare('ea,fb,abcd,gc,hd->efgh')
992
+ self.optimize_compare('abcd,ea,fb,gc,hd->efgh')
993
+
994
+ def test_complex(self):
995
+ # Long test cases
996
+ self.optimize_compare('acdf,jbje,gihb,hfac,gfac,gifabc,hfac')
997
+ self.optimize_compare('acdf,jbje,gihb,hfac,gfac,gifabc,hfac')
998
+ self.optimize_compare('cd,bdhe,aidb,hgca,gc,hgibcd,hgac')
999
+ self.optimize_compare('abhe,hidj,jgba,hiab,gab')
1000
+ self.optimize_compare('bde,cdh,agdb,hica,ibd,hgicd,hiac')
1001
+ self.optimize_compare('chd,bde,agbc,hiad,hgc,hgi,hiad')
1002
+ self.optimize_compare('chd,bde,agbc,hiad,bdi,cgh,agdb')
1003
+ self.optimize_compare('bdhe,acad,hiab,agac,hibd')
1004
+
1005
+ def test_collapse(self):
1006
+ # Inner products
1007
+ self.optimize_compare('ab,ab,c->')
1008
+ self.optimize_compare('ab,ab,c->c')
1009
+ self.optimize_compare('ab,ab,cd,cd->')
1010
+ self.optimize_compare('ab,ab,cd,cd->ac')
1011
+ self.optimize_compare('ab,ab,cd,cd->cd')
1012
+ self.optimize_compare('ab,ab,cd,cd,ef,ef->')
1013
+
1014
+ def test_expand(self):
1015
+ # Outer products
1016
+ self.optimize_compare('ab,cd,ef->abcdef')
1017
+ self.optimize_compare('ab,cd,ef->acdf')
1018
+ self.optimize_compare('ab,cd,de->abcde')
1019
+ self.optimize_compare('ab,cd,de->be')
1020
+ self.optimize_compare('ab,bcd,cd->abcd')
1021
+ self.optimize_compare('ab,bcd,cd->abd')
1022
+
1023
+ def test_edge_cases(self):
1024
+ # Difficult edge cases for optimization
1025
+ self.optimize_compare('eb,cb,fb->cef')
1026
+ self.optimize_compare('dd,fb,be,cdb->cef')
1027
+ self.optimize_compare('bca,cdb,dbf,afc->')
1028
+ self.optimize_compare('dcc,fce,ea,dbf->ab')
1029
+ self.optimize_compare('fdf,cdd,ccd,afe->ae')
1030
+ self.optimize_compare('abcd,ad')
1031
+ self.optimize_compare('ed,fcd,ff,bcf->be')
1032
+ self.optimize_compare('baa,dcf,af,cde->be')
1033
+ self.optimize_compare('bd,db,eac->ace')
1034
+ self.optimize_compare('fff,fae,bef,def->abd')
1035
+ self.optimize_compare('efc,dbc,acf,fd->abe')
1036
+ self.optimize_compare('ba,ac,da->bcd')
1037
+
1038
+ def test_inner_product(self):
1039
+ # Inner products
1040
+ self.optimize_compare('ab,ab')
1041
+ self.optimize_compare('ab,ba')
1042
+ self.optimize_compare('abc,abc')
1043
+ self.optimize_compare('abc,bac')
1044
+ self.optimize_compare('abc,cba')
1045
+
1046
+ def test_random_cases(self):
1047
+ # Randomly built test cases
1048
+ self.optimize_compare('aab,fa,df,ecc->bde')
1049
+ self.optimize_compare('ecb,fef,bad,ed->ac')
1050
+ self.optimize_compare('bcf,bbb,fbf,fc->')
1051
+ self.optimize_compare('bb,ff,be->e')
1052
+ self.optimize_compare('bcb,bb,fc,fff->')
1053
+ self.optimize_compare('fbb,dfd,fc,fc->')
1054
+ self.optimize_compare('afd,ba,cc,dc->bf')
1055
+ self.optimize_compare('adb,bc,fa,cfc->d')
1056
+ self.optimize_compare('bbd,bda,fc,db->acf')
1057
+ self.optimize_compare('dba,ead,cad->bce')
1058
+ self.optimize_compare('aef,fbc,dca->bde')
1059
+
1060
+ def test_combined_views_mapping(self):
1061
+ # gh-10792
1062
+ a = np.arange(9).reshape(1, 1, 3, 1, 3)
1063
+ b = np.einsum('bbcdc->d', a)
1064
+ assert_equal(b, [12])
1065
+
1066
+ def test_broadcasting_dot_cases(self):
1067
+ # Ensures broadcasting cases are not mistaken for GEMM
1068
+
1069
+ a = np.random.rand(1, 5, 4)
1070
+ b = np.random.rand(4, 6)
1071
+ c = np.random.rand(5, 6)
1072
+ d = np.random.rand(10)
1073
+
1074
+ self.optimize_compare('ijk,kl,jl', operands=[a, b, c])
1075
+ self.optimize_compare('ijk,kl,jl,i->i', operands=[a, b, c, d])
1076
+
1077
+ e = np.random.rand(1, 1, 5, 4)
1078
+ f = np.random.rand(7, 7)
1079
+ self.optimize_compare('abjk,kl,jl', operands=[e, b, c])
1080
+ self.optimize_compare('abjk,kl,jl,ab->ab', operands=[e, b, c, f])
1081
+
1082
+ # Edge case found in gh-11308
1083
+ g = np.arange(64).reshape(2, 4, 8)
1084
+ self.optimize_compare('obk,ijk->ioj', operands=[g, g])
1085
+
1086
+ def test_output_order(self):
1087
+ # Ensure output order is respected for optimize cases, the below
1088
+ # contraction should yield a reshaped tensor view
1089
+ # gh-16415
1090
+
1091
+ a = np.ones((2, 3, 5), order='F')
1092
+ b = np.ones((4, 3), order='F')
1093
+
1094
+ for opt in [True, False]:
1095
+ tmp = np.einsum('...ft,mf->...mt', a, b, order='a', optimize=opt)
1096
+ assert_(tmp.flags.f_contiguous)
1097
+
1098
+ tmp = np.einsum('...ft,mf->...mt', a, b, order='f', optimize=opt)
1099
+ assert_(tmp.flags.f_contiguous)
1100
+
1101
+ tmp = np.einsum('...ft,mf->...mt', a, b, order='c', optimize=opt)
1102
+ assert_(tmp.flags.c_contiguous)
1103
+
1104
+ tmp = np.einsum('...ft,mf->...mt', a, b, order='k', optimize=opt)
1105
+ assert_(tmp.flags.c_contiguous is False)
1106
+ assert_(tmp.flags.f_contiguous is False)
1107
+
1108
+ tmp = np.einsum('...ft,mf->...mt', a, b, optimize=opt)
1109
+ assert_(tmp.flags.c_contiguous is False)
1110
+ assert_(tmp.flags.f_contiguous is False)
1111
+
1112
+ c = np.ones((4, 3), order='C')
1113
+ for opt in [True, False]:
1114
+ tmp = np.einsum('...ft,mf->...mt', a, c, order='a', optimize=opt)
1115
+ assert_(tmp.flags.c_contiguous)
1116
+
1117
+ d = np.ones((2, 3, 5), order='C')
1118
+ for opt in [True, False]:
1119
+ tmp = np.einsum('...ft,mf->...mt', d, c, order='a', optimize=opt)
1120
+ assert_(tmp.flags.c_contiguous)
1121
+
1122
+ def test_singleton_broadcasting(self):
1123
+ eq = "ijp,ipq,ikq->ijk"
1124
+ shapes = ((3, 1, 1), (3, 1, 3), (1, 3, 3))
1125
+ arrays = [np.random.rand(*shape) for shape in shapes]
1126
+ self.optimize_compare(eq, operands=arrays)
1127
+
1128
+ eq = "jhcabhijaci,dfijejgh->fgje"
1129
+ shapes = (
1130
+ (1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1),
1131
+ (3, 1, 3, 1, 1, 1, 1, 2),
1132
+ )
1133
+ arrays = [np.random.rand(*shape) for shape in shapes]
1134
+ self.optimize_compare(eq, operands=arrays)
1135
+
1136
+ eq = "baegffahgc,hdggeff->dhg"
1137
+ shapes = ((2, 1, 4, 1, 1, 1, 1, 2, 1, 1), (1, 1, 1, 1, 4, 1, 1))
1138
+ arrays = [np.random.rand(*shape) for shape in shapes]
1139
+ self.optimize_compare(eq, operands=arrays)
1140
+
1141
+ eq = "cehgbaifff,fhhdegih->cdghbi"
1142
+ shapes = ((1, 1, 1, 1, 1, 1, 1, 1, 1, 1), (2, 1, 1, 2, 4, 1, 1, 1))
1143
+ arrays = [np.random.rand(*shape) for shape in shapes]
1144
+ self.optimize_compare(eq, operands=arrays)
1145
+
1146
+ eq = "gah,cdbcghefg->ef"
1147
+ shapes = ((2, 3, 1), (1, 3, 1, 1, 1, 2, 1, 4, 1))
1148
+ arrays = [np.random.rand(*shape) for shape in shapes]
1149
+ self.optimize_compare(eq, operands=arrays)
1150
+
1151
+ eq = "cacc,bcb->"
1152
+ shapes = ((1, 1, 1, 1), (1, 4, 1))
1153
+ arrays = [np.random.rand(*shape) for shape in shapes]
1154
+ self.optimize_compare(eq, operands=arrays)
1155
+
1156
+
1157
+ class TestEinsumPath:
1158
+ def build_operands(self, string, size_dict=global_size_dict):
1159
+
1160
+ # Builds views based off initial operands
1161
+ operands = [string]
1162
+ terms = string.split('->')[0].split(',')
1163
+ for term in terms:
1164
+ dims = [size_dict[x] for x in term]
1165
+ operands.append(np.random.rand(*dims))
1166
+
1167
+ return operands
1168
+
1169
+ def assert_path_equal(self, comp, benchmark):
1170
+ # Checks if list of tuples are equivalent
1171
+ ret = (len(comp) == len(benchmark))
1172
+ assert_(ret)
1173
+ for pos in range(len(comp) - 1):
1174
+ ret &= isinstance(comp[pos + 1], tuple)
1175
+ ret &= (comp[pos + 1] == benchmark[pos + 1])
1176
+ assert_(ret)
1177
+
1178
+ def test_memory_contraints(self):
1179
+ # Ensure memory constraints are satisfied
1180
+
1181
+ outer_test = self.build_operands('a,b,c->abc')
1182
+
1183
+ path, path_str = np.einsum_path(*outer_test, optimize=('greedy', 0))
1184
+ self.assert_path_equal(path, ['einsum_path', (0, 1, 2)])
1185
+
1186
+ path, path_str = np.einsum_path(*outer_test, optimize=('optimal', 0))
1187
+ self.assert_path_equal(path, ['einsum_path', (0, 1, 2)])
1188
+
1189
+ long_test = self.build_operands('acdf,jbje,gihb,hfac')
1190
+ path, path_str = np.einsum_path(*long_test, optimize=('greedy', 0))
1191
+ self.assert_path_equal(path, ['einsum_path', (0, 1, 2, 3)])
1192
+
1193
+ path, path_str = np.einsum_path(*long_test, optimize=('optimal', 0))
1194
+ self.assert_path_equal(path, ['einsum_path', (0, 1, 2, 3)])
1195
+
1196
+ def test_long_paths(self):
1197
+ # Long complex cases
1198
+
1199
+ # Long test 1
1200
+ long_test1 = self.build_operands('acdf,jbje,gihb,hfac,gfac,gifabc,hfac')
1201
+ path, path_str = np.einsum_path(*long_test1, optimize='greedy')
1202
+ self.assert_path_equal(path, ['einsum_path',
1203
+ (3, 6), (3, 4), (2, 4), (2, 3), (0, 2), (0, 1)])
1204
+
1205
+ path, path_str = np.einsum_path(*long_test1, optimize='optimal')
1206
+ self.assert_path_equal(path, ['einsum_path',
1207
+ (3, 6), (3, 4), (2, 4), (2, 3), (0, 2), (0, 1)])
1208
+
1209
+ # Long test 2
1210
+ long_test2 = self.build_operands('chd,bde,agbc,hiad,bdi,cgh,agdb')
1211
+ path, path_str = np.einsum_path(*long_test2, optimize='greedy')
1212
+ self.assert_path_equal(path, ['einsum_path',
1213
+ (3, 4), (0, 3), (3, 4), (1, 3), (1, 2), (0, 1)])
1214
+
1215
+ path, path_str = np.einsum_path(*long_test2, optimize='optimal')
1216
+ self.assert_path_equal(path, ['einsum_path',
1217
+ (0, 5), (1, 4), (3, 4), (1, 3), (1, 2), (0, 1)])
1218
+
1219
+ def test_edge_paths(self):
1220
+ # Difficult edge cases
1221
+
1222
+ # Edge test1
1223
+ edge_test1 = self.build_operands('eb,cb,fb->cef')
1224
+ path, path_str = np.einsum_path(*edge_test1, optimize='greedy')
1225
+ self.assert_path_equal(path, ['einsum_path', (0, 2), (0, 1)])
1226
+
1227
+ path, path_str = np.einsum_path(*edge_test1, optimize='optimal')
1228
+ self.assert_path_equal(path, ['einsum_path', (0, 2), (0, 1)])
1229
+
1230
+ # Edge test2
1231
+ edge_test2 = self.build_operands('dd,fb,be,cdb->cef')
1232
+ path, path_str = np.einsum_path(*edge_test2, optimize='greedy')
1233
+ self.assert_path_equal(path, ['einsum_path', (0, 3), (0, 1), (0, 1)])
1234
+
1235
+ path, path_str = np.einsum_path(*edge_test2, optimize='optimal')
1236
+ self.assert_path_equal(path, ['einsum_path', (0, 3), (0, 1), (0, 1)])
1237
+
1238
+ # Edge test3
1239
+ edge_test3 = self.build_operands('bca,cdb,dbf,afc->')
1240
+ path, path_str = np.einsum_path(*edge_test3, optimize='greedy')
1241
+ self.assert_path_equal(path, ['einsum_path', (1, 2), (0, 2), (0, 1)])
1242
+
1243
+ path, path_str = np.einsum_path(*edge_test3, optimize='optimal')
1244
+ self.assert_path_equal(path, ['einsum_path', (1, 2), (0, 2), (0, 1)])
1245
+
1246
+ # Edge test4
1247
+ edge_test4 = self.build_operands('dcc,fce,ea,dbf->ab')
1248
+ path, path_str = np.einsum_path(*edge_test4, optimize='greedy')
1249
+ self.assert_path_equal(path, ['einsum_path', (1, 2), (0, 1), (0, 1)])
1250
+
1251
+ path, path_str = np.einsum_path(*edge_test4, optimize='optimal')
1252
+ self.assert_path_equal(path, ['einsum_path', (1, 2), (0, 2), (0, 1)])
1253
+
1254
+ # Edge test5
1255
+ edge_test4 = self.build_operands('a,ac,ab,ad,cd,bd,bc->',
1256
+ size_dict={"a": 20, "b": 20, "c": 20, "d": 20})
1257
+ path, path_str = np.einsum_path(*edge_test4, optimize='greedy')
1258
+ self.assert_path_equal(path, ['einsum_path', (0, 1), (0, 1, 2, 3, 4, 5)])
1259
+
1260
+ path, path_str = np.einsum_path(*edge_test4, optimize='optimal')
1261
+ self.assert_path_equal(path, ['einsum_path', (0, 1), (0, 1, 2, 3, 4, 5)])
1262
+
1263
+ def test_path_type_input(self):
1264
+ # Test explicit path handling
1265
+ path_test = self.build_operands('dcc,fce,ea,dbf->ab')
1266
+
1267
+ path, path_str = np.einsum_path(*path_test, optimize=False)
1268
+ self.assert_path_equal(path, ['einsum_path', (0, 1, 2, 3)])
1269
+
1270
+ path, path_str = np.einsum_path(*path_test, optimize=True)
1271
+ self.assert_path_equal(path, ['einsum_path', (1, 2), (0, 1), (0, 1)])
1272
+
1273
+ exp_path = ['einsum_path', (0, 2), (0, 2), (0, 1)]
1274
+ path, path_str = np.einsum_path(*path_test, optimize=exp_path)
1275
+ self.assert_path_equal(path, exp_path)
1276
+
1277
+ # Double check einsum works on the input path
1278
+ noopt = np.einsum(*path_test, optimize=False)
1279
+ opt = np.einsum(*path_test, optimize=exp_path)
1280
+ assert_almost_equal(noopt, opt)
1281
+
1282
+ def test_path_type_input_internal_trace(self):
1283
+ # gh-20962
1284
+ path_test = self.build_operands('cab,cdd->ab')
1285
+ exp_path = ['einsum_path', (1,), (0, 1)]
1286
+
1287
+ path, path_str = np.einsum_path(*path_test, optimize=exp_path)
1288
+ self.assert_path_equal(path, exp_path)
1289
+
1290
+ # Double check einsum works on the input path
1291
+ noopt = np.einsum(*path_test, optimize=False)
1292
+ opt = np.einsum(*path_test, optimize=exp_path)
1293
+ assert_almost_equal(noopt, opt)
1294
+
1295
+ def test_path_type_input_invalid(self):
1296
+ path_test = self.build_operands('ab,bc,cd,de->ae')
1297
+ exp_path = ['einsum_path', (2, 3), (0, 1)]
1298
+ assert_raises(RuntimeError, np.einsum, *path_test, optimize=exp_path)
1299
+ assert_raises(
1300
+ RuntimeError, np.einsum_path, *path_test, optimize=exp_path)
1301
+
1302
+ path_test = self.build_operands('a,a,a->a')
1303
+ exp_path = ['einsum_path', (1,), (0, 1)]
1304
+ assert_raises(RuntimeError, np.einsum, *path_test, optimize=exp_path)
1305
+ assert_raises(
1306
+ RuntimeError, np.einsum_path, *path_test, optimize=exp_path)
1307
+
1308
+ def test_spaces(self):
1309
+ # gh-10794
1310
+ arr = np.array([[1]])
1311
+ for sp in itertools.product(['', ' '], repeat=4):
1312
+ # no error for any spacing
1313
+ np.einsum('{}...a{}->{}...a{}'.format(*sp), arr)
1314
+
1315
+ def test_overlap():
1316
+ a = np.arange(9, dtype=int).reshape(3, 3)
1317
+ b = np.arange(9, dtype=int).reshape(3, 3)
1318
+ d = np.dot(a, b)
1319
+ # sanity check
1320
+ c = np.einsum('ij,jk->ik', a, b)
1321
+ assert_equal(c, d)
1322
+ # gh-10080, out overlaps one of the operands
1323
+ c = np.einsum('ij,jk->ik', a, b, out=b)
1324
+ assert_equal(c, d)
1325
+
1326
+ def test_einsum_chunking_precision():
1327
+ """Most einsum operations are reductions and until NumPy 2.3 reductions
1328
+ never (or almost never?) used the `GROWINNER` mechanism to increase the
1329
+ inner loop size when no buffers are needed.
1330
+ Because einsum reductions work roughly:
1331
+
1332
+ def inner(*inputs, out):
1333
+ accumulate = 0
1334
+ for vals in zip(*inputs):
1335
+ accumulate += prod(vals)
1336
+ out[0] += accumulate
1337
+
1338
+ Calling the inner-loop more often actually improves accuracy slightly
1339
+ (same effect as pairwise summation but much less).
1340
+ Without adding pairwise summation to the inner-loop it seems best to just
1341
+ not use GROWINNER, a quick tests suggest that is maybe 1% slowdown for
1342
+ the simplest `einsum("i,i->i", x, x)` case.
1343
+
1344
+ (It is not clear that we should guarantee precision to this extend.)
1345
+ """
1346
+ num = 1_000_000
1347
+ value = 1. + np.finfo(np.float64).eps * 8196
1348
+ res = np.einsum("i->", np.broadcast_to(np.array(value), num)) / num
1349
+
1350
+ # At with GROWINNER 11 decimals succeed (larger will be less)
1351
+ assert_almost_equal(res, value, decimal=15)