numpy 2.3.5__cp313-cp313-macosx_14_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of numpy might be problematic. Click here for more details.

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