numba-cuda 0.22.0__cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (487) hide show
  1. _numba_cuda_redirector.pth +4 -0
  2. _numba_cuda_redirector.py +89 -0
  3. numba_cuda/VERSION +1 -0
  4. numba_cuda/__init__.py +6 -0
  5. numba_cuda/_version.py +11 -0
  6. numba_cuda/numba/cuda/__init__.py +70 -0
  7. numba_cuda/numba/cuda/_internal/cuda_bf16.py +16394 -0
  8. numba_cuda/numba/cuda/_internal/cuda_fp16.py +8112 -0
  9. numba_cuda/numba/cuda/api.py +580 -0
  10. numba_cuda/numba/cuda/api_util.py +76 -0
  11. numba_cuda/numba/cuda/args.py +72 -0
  12. numba_cuda/numba/cuda/bf16.py +397 -0
  13. numba_cuda/numba/cuda/cache_hints.py +287 -0
  14. numba_cuda/numba/cuda/cext/__init__.py +2 -0
  15. numba_cuda/numba/cuda/cext/_devicearray.cpp +159 -0
  16. numba_cuda/numba/cuda/cext/_devicearray.cpython-313-aarch64-linux-gnu.so +0 -0
  17. numba_cuda/numba/cuda/cext/_devicearray.h +29 -0
  18. numba_cuda/numba/cuda/cext/_dispatcher.cpp +1098 -0
  19. numba_cuda/numba/cuda/cext/_dispatcher.cpython-313-aarch64-linux-gnu.so +0 -0
  20. numba_cuda/numba/cuda/cext/_hashtable.cpp +532 -0
  21. numba_cuda/numba/cuda/cext/_hashtable.h +135 -0
  22. numba_cuda/numba/cuda/cext/_helperlib.c +71 -0
  23. numba_cuda/numba/cuda/cext/_helperlib.cpython-313-aarch64-linux-gnu.so +0 -0
  24. numba_cuda/numba/cuda/cext/_helpermod.c +82 -0
  25. numba_cuda/numba/cuda/cext/_pymodule.h +38 -0
  26. numba_cuda/numba/cuda/cext/_typeconv.cpp +206 -0
  27. numba_cuda/numba/cuda/cext/_typeconv.cpython-313-aarch64-linux-gnu.so +0 -0
  28. numba_cuda/numba/cuda/cext/_typeof.cpp +1159 -0
  29. numba_cuda/numba/cuda/cext/_typeof.h +19 -0
  30. numba_cuda/numba/cuda/cext/capsulethunk.h +111 -0
  31. numba_cuda/numba/cuda/cext/mviewbuf.c +385 -0
  32. numba_cuda/numba/cuda/cext/mviewbuf.cpython-313-aarch64-linux-gnu.so +0 -0
  33. numba_cuda/numba/cuda/cext/typeconv.cpp +212 -0
  34. numba_cuda/numba/cuda/cext/typeconv.hpp +101 -0
  35. numba_cuda/numba/cuda/cg.py +67 -0
  36. numba_cuda/numba/cuda/cgutils.py +1294 -0
  37. numba_cuda/numba/cuda/cloudpickle/__init__.py +21 -0
  38. numba_cuda/numba/cuda/cloudpickle/cloudpickle.py +1598 -0
  39. numba_cuda/numba/cuda/cloudpickle/cloudpickle_fast.py +17 -0
  40. numba_cuda/numba/cuda/codegen.py +541 -0
  41. numba_cuda/numba/cuda/compiler.py +1396 -0
  42. numba_cuda/numba/cuda/core/analysis.py +758 -0
  43. numba_cuda/numba/cuda/core/annotations/__init__.py +0 -0
  44. numba_cuda/numba/cuda/core/annotations/pretty_annotate.py +288 -0
  45. numba_cuda/numba/cuda/core/annotations/type_annotations.py +305 -0
  46. numba_cuda/numba/cuda/core/base.py +1332 -0
  47. numba_cuda/numba/cuda/core/boxing.py +1411 -0
  48. numba_cuda/numba/cuda/core/bytecode.py +728 -0
  49. numba_cuda/numba/cuda/core/byteflow.py +2346 -0
  50. numba_cuda/numba/cuda/core/caching.py +744 -0
  51. numba_cuda/numba/cuda/core/callconv.py +392 -0
  52. numba_cuda/numba/cuda/core/codegen.py +171 -0
  53. numba_cuda/numba/cuda/core/compiler.py +199 -0
  54. numba_cuda/numba/cuda/core/compiler_lock.py +85 -0
  55. numba_cuda/numba/cuda/core/compiler_machinery.py +497 -0
  56. numba_cuda/numba/cuda/core/config.py +650 -0
  57. numba_cuda/numba/cuda/core/consts.py +124 -0
  58. numba_cuda/numba/cuda/core/controlflow.py +989 -0
  59. numba_cuda/numba/cuda/core/entrypoints.py +57 -0
  60. numba_cuda/numba/cuda/core/environment.py +66 -0
  61. numba_cuda/numba/cuda/core/errors.py +917 -0
  62. numba_cuda/numba/cuda/core/event.py +511 -0
  63. numba_cuda/numba/cuda/core/funcdesc.py +330 -0
  64. numba_cuda/numba/cuda/core/generators.py +387 -0
  65. numba_cuda/numba/cuda/core/imputils.py +509 -0
  66. numba_cuda/numba/cuda/core/inline_closurecall.py +1787 -0
  67. numba_cuda/numba/cuda/core/interpreter.py +3617 -0
  68. numba_cuda/numba/cuda/core/ir.py +1812 -0
  69. numba_cuda/numba/cuda/core/ir_utils.py +2638 -0
  70. numba_cuda/numba/cuda/core/optional.py +129 -0
  71. numba_cuda/numba/cuda/core/options.py +262 -0
  72. numba_cuda/numba/cuda/core/postproc.py +249 -0
  73. numba_cuda/numba/cuda/core/pythonapi.py +1859 -0
  74. numba_cuda/numba/cuda/core/registry.py +46 -0
  75. numba_cuda/numba/cuda/core/removerefctpass.py +123 -0
  76. numba_cuda/numba/cuda/core/rewrites/__init__.py +26 -0
  77. numba_cuda/numba/cuda/core/rewrites/ir_print.py +91 -0
  78. numba_cuda/numba/cuda/core/rewrites/registry.py +104 -0
  79. numba_cuda/numba/cuda/core/rewrites/static_binop.py +41 -0
  80. numba_cuda/numba/cuda/core/rewrites/static_getitem.py +189 -0
  81. numba_cuda/numba/cuda/core/rewrites/static_raise.py +100 -0
  82. numba_cuda/numba/cuda/core/sigutils.py +68 -0
  83. numba_cuda/numba/cuda/core/ssa.py +498 -0
  84. numba_cuda/numba/cuda/core/targetconfig.py +330 -0
  85. numba_cuda/numba/cuda/core/tracing.py +231 -0
  86. numba_cuda/numba/cuda/core/transforms.py +956 -0
  87. numba_cuda/numba/cuda/core/typed_passes.py +867 -0
  88. numba_cuda/numba/cuda/core/typeinfer.py +1950 -0
  89. numba_cuda/numba/cuda/core/unsafe/__init__.py +0 -0
  90. numba_cuda/numba/cuda/core/unsafe/bytes.py +67 -0
  91. numba_cuda/numba/cuda/core/unsafe/eh.py +67 -0
  92. numba_cuda/numba/cuda/core/unsafe/refcount.py +98 -0
  93. numba_cuda/numba/cuda/core/untyped_passes.py +1979 -0
  94. numba_cuda/numba/cuda/cpython/builtins.py +1153 -0
  95. numba_cuda/numba/cuda/cpython/charseq.py +1218 -0
  96. numba_cuda/numba/cuda/cpython/cmathimpl.py +560 -0
  97. numba_cuda/numba/cuda/cpython/enumimpl.py +103 -0
  98. numba_cuda/numba/cuda/cpython/iterators.py +167 -0
  99. numba_cuda/numba/cuda/cpython/listobj.py +1326 -0
  100. numba_cuda/numba/cuda/cpython/mathimpl.py +499 -0
  101. numba_cuda/numba/cuda/cpython/numbers.py +1475 -0
  102. numba_cuda/numba/cuda/cpython/rangeobj.py +289 -0
  103. numba_cuda/numba/cuda/cpython/slicing.py +322 -0
  104. numba_cuda/numba/cuda/cpython/tupleobj.py +456 -0
  105. numba_cuda/numba/cuda/cpython/unicode.py +2865 -0
  106. numba_cuda/numba/cuda/cpython/unicode_support.py +1597 -0
  107. numba_cuda/numba/cuda/cpython/unsafe/__init__.py +0 -0
  108. numba_cuda/numba/cuda/cpython/unsafe/numbers.py +64 -0
  109. numba_cuda/numba/cuda/cpython/unsafe/tuple.py +92 -0
  110. numba_cuda/numba/cuda/cuda_paths.py +691 -0
  111. numba_cuda/numba/cuda/cudadecl.py +543 -0
  112. numba_cuda/numba/cuda/cudadrv/__init__.py +14 -0
  113. numba_cuda/numba/cuda/cudadrv/devicearray.py +954 -0
  114. numba_cuda/numba/cuda/cudadrv/devices.py +249 -0
  115. numba_cuda/numba/cuda/cudadrv/driver.py +3238 -0
  116. numba_cuda/numba/cuda/cudadrv/drvapi.py +435 -0
  117. numba_cuda/numba/cuda/cudadrv/dummyarray.py +562 -0
  118. numba_cuda/numba/cuda/cudadrv/enums.py +613 -0
  119. numba_cuda/numba/cuda/cudadrv/error.py +48 -0
  120. numba_cuda/numba/cuda/cudadrv/libs.py +220 -0
  121. numba_cuda/numba/cuda/cudadrv/linkable_code.py +184 -0
  122. numba_cuda/numba/cuda/cudadrv/mappings.py +14 -0
  123. numba_cuda/numba/cuda/cudadrv/ndarray.py +26 -0
  124. numba_cuda/numba/cuda/cudadrv/nvrtc.py +193 -0
  125. numba_cuda/numba/cuda/cudadrv/nvvm.py +756 -0
  126. numba_cuda/numba/cuda/cudadrv/rtapi.py +13 -0
  127. numba_cuda/numba/cuda/cudadrv/runtime.py +34 -0
  128. numba_cuda/numba/cuda/cudaimpl.py +983 -0
  129. numba_cuda/numba/cuda/cudamath.py +149 -0
  130. numba_cuda/numba/cuda/datamodel/__init__.py +7 -0
  131. numba_cuda/numba/cuda/datamodel/cuda_manager.py +66 -0
  132. numba_cuda/numba/cuda/datamodel/cuda_models.py +1446 -0
  133. numba_cuda/numba/cuda/datamodel/cuda_packer.py +224 -0
  134. numba_cuda/numba/cuda/datamodel/cuda_registry.py +22 -0
  135. numba_cuda/numba/cuda/datamodel/cuda_testing.py +153 -0
  136. numba_cuda/numba/cuda/datamodel/manager.py +11 -0
  137. numba_cuda/numba/cuda/datamodel/models.py +9 -0
  138. numba_cuda/numba/cuda/datamodel/packer.py +9 -0
  139. numba_cuda/numba/cuda/datamodel/registry.py +11 -0
  140. numba_cuda/numba/cuda/datamodel/testing.py +11 -0
  141. numba_cuda/numba/cuda/debuginfo.py +997 -0
  142. numba_cuda/numba/cuda/decorators.py +294 -0
  143. numba_cuda/numba/cuda/descriptor.py +35 -0
  144. numba_cuda/numba/cuda/device_init.py +155 -0
  145. numba_cuda/numba/cuda/deviceufunc.py +1021 -0
  146. numba_cuda/numba/cuda/dispatcher.py +2463 -0
  147. numba_cuda/numba/cuda/errors.py +72 -0
  148. numba_cuda/numba/cuda/extending.py +697 -0
  149. numba_cuda/numba/cuda/flags.py +178 -0
  150. numba_cuda/numba/cuda/fp16.py +357 -0
  151. numba_cuda/numba/cuda/include/12/cuda_bf16.h +5118 -0
  152. numba_cuda/numba/cuda/include/12/cuda_bf16.hpp +3865 -0
  153. numba_cuda/numba/cuda/include/12/cuda_fp16.h +5363 -0
  154. numba_cuda/numba/cuda/include/12/cuda_fp16.hpp +3483 -0
  155. numba_cuda/numba/cuda/include/13/cuda_bf16.h +5118 -0
  156. numba_cuda/numba/cuda/include/13/cuda_bf16.hpp +3865 -0
  157. numba_cuda/numba/cuda/include/13/cuda_fp16.h +5363 -0
  158. numba_cuda/numba/cuda/include/13/cuda_fp16.hpp +3483 -0
  159. numba_cuda/numba/cuda/initialize.py +24 -0
  160. numba_cuda/numba/cuda/intrinsics.py +531 -0
  161. numba_cuda/numba/cuda/itanium_mangler.py +214 -0
  162. numba_cuda/numba/cuda/kernels/__init__.py +2 -0
  163. numba_cuda/numba/cuda/kernels/reduction.py +265 -0
  164. numba_cuda/numba/cuda/kernels/transpose.py +65 -0
  165. numba_cuda/numba/cuda/libdevice.py +3386 -0
  166. numba_cuda/numba/cuda/libdevicedecl.py +20 -0
  167. numba_cuda/numba/cuda/libdevicefuncs.py +1060 -0
  168. numba_cuda/numba/cuda/libdeviceimpl.py +88 -0
  169. numba_cuda/numba/cuda/locks.py +19 -0
  170. numba_cuda/numba/cuda/lowering.py +1980 -0
  171. numba_cuda/numba/cuda/mathimpl.py +374 -0
  172. numba_cuda/numba/cuda/memory_management/__init__.py +4 -0
  173. numba_cuda/numba/cuda/memory_management/memsys.cu +99 -0
  174. numba_cuda/numba/cuda/memory_management/memsys.cuh +22 -0
  175. numba_cuda/numba/cuda/memory_management/nrt.cu +212 -0
  176. numba_cuda/numba/cuda/memory_management/nrt.cuh +48 -0
  177. numba_cuda/numba/cuda/memory_management/nrt.py +390 -0
  178. numba_cuda/numba/cuda/memory_management/nrt_context.py +438 -0
  179. numba_cuda/numba/cuda/misc/appdirs.py +594 -0
  180. numba_cuda/numba/cuda/misc/cffiimpl.py +24 -0
  181. numba_cuda/numba/cuda/misc/coverage_support.py +43 -0
  182. numba_cuda/numba/cuda/misc/dump_style.py +41 -0
  183. numba_cuda/numba/cuda/misc/findlib.py +75 -0
  184. numba_cuda/numba/cuda/misc/firstlinefinder.py +96 -0
  185. numba_cuda/numba/cuda/misc/gdb_hook.py +240 -0
  186. numba_cuda/numba/cuda/misc/literal.py +28 -0
  187. numba_cuda/numba/cuda/misc/llvm_pass_timings.py +412 -0
  188. numba_cuda/numba/cuda/misc/special.py +94 -0
  189. numba_cuda/numba/cuda/models.py +56 -0
  190. numba_cuda/numba/cuda/np/arraymath.py +5130 -0
  191. numba_cuda/numba/cuda/np/arrayobj.py +7635 -0
  192. numba_cuda/numba/cuda/np/extensions.py +11 -0
  193. numba_cuda/numba/cuda/np/linalg.py +3087 -0
  194. numba_cuda/numba/cuda/np/math/__init__.py +0 -0
  195. numba_cuda/numba/cuda/np/math/cmathimpl.py +558 -0
  196. numba_cuda/numba/cuda/np/math/mathimpl.py +487 -0
  197. numba_cuda/numba/cuda/np/math/numbers.py +1461 -0
  198. numba_cuda/numba/cuda/np/npdatetime.py +969 -0
  199. numba_cuda/numba/cuda/np/npdatetime_helpers.py +217 -0
  200. numba_cuda/numba/cuda/np/npyfuncs.py +1808 -0
  201. numba_cuda/numba/cuda/np/npyimpl.py +1027 -0
  202. numba_cuda/numba/cuda/np/numpy_support.py +798 -0
  203. numba_cuda/numba/cuda/np/polynomial/__init__.py +4 -0
  204. numba_cuda/numba/cuda/np/polynomial/polynomial_core.py +242 -0
  205. numba_cuda/numba/cuda/np/polynomial/polynomial_functions.py +380 -0
  206. numba_cuda/numba/cuda/np/ufunc/__init__.py +4 -0
  207. numba_cuda/numba/cuda/np/ufunc/decorators.py +203 -0
  208. numba_cuda/numba/cuda/np/ufunc/sigparse.py +68 -0
  209. numba_cuda/numba/cuda/np/ufunc/ufuncbuilder.py +65 -0
  210. numba_cuda/numba/cuda/np/ufunc_db.py +1282 -0
  211. numba_cuda/numba/cuda/np/unsafe/__init__.py +0 -0
  212. numba_cuda/numba/cuda/np/unsafe/ndarray.py +84 -0
  213. numba_cuda/numba/cuda/nvvmutils.py +254 -0
  214. numba_cuda/numba/cuda/printimpl.py +126 -0
  215. numba_cuda/numba/cuda/random.py +308 -0
  216. numba_cuda/numba/cuda/reshape_funcs.cu +156 -0
  217. numba_cuda/numba/cuda/serialize.py +267 -0
  218. numba_cuda/numba/cuda/simulator/__init__.py +63 -0
  219. numba_cuda/numba/cuda/simulator/_internal/__init__.py +4 -0
  220. numba_cuda/numba/cuda/simulator/_internal/cuda_bf16.py +2 -0
  221. numba_cuda/numba/cuda/simulator/api.py +179 -0
  222. numba_cuda/numba/cuda/simulator/bf16.py +4 -0
  223. numba_cuda/numba/cuda/simulator/compiler.py +38 -0
  224. numba_cuda/numba/cuda/simulator/cudadrv/__init__.py +11 -0
  225. numba_cuda/numba/cuda/simulator/cudadrv/devicearray.py +462 -0
  226. numba_cuda/numba/cuda/simulator/cudadrv/devices.py +122 -0
  227. numba_cuda/numba/cuda/simulator/cudadrv/driver.py +66 -0
  228. numba_cuda/numba/cuda/simulator/cudadrv/drvapi.py +7 -0
  229. numba_cuda/numba/cuda/simulator/cudadrv/dummyarray.py +7 -0
  230. numba_cuda/numba/cuda/simulator/cudadrv/error.py +10 -0
  231. numba_cuda/numba/cuda/simulator/cudadrv/libs.py +10 -0
  232. numba_cuda/numba/cuda/simulator/cudadrv/linkable_code.py +61 -0
  233. numba_cuda/numba/cuda/simulator/cudadrv/nvrtc.py +11 -0
  234. numba_cuda/numba/cuda/simulator/cudadrv/nvvm.py +32 -0
  235. numba_cuda/numba/cuda/simulator/cudadrv/runtime.py +22 -0
  236. numba_cuda/numba/cuda/simulator/dispatcher.py +11 -0
  237. numba_cuda/numba/cuda/simulator/kernel.py +320 -0
  238. numba_cuda/numba/cuda/simulator/kernelapi.py +509 -0
  239. numba_cuda/numba/cuda/simulator/memory_management/__init__.py +4 -0
  240. numba_cuda/numba/cuda/simulator/memory_management/nrt.py +21 -0
  241. numba_cuda/numba/cuda/simulator/reduction.py +19 -0
  242. numba_cuda/numba/cuda/simulator/tests/support.py +4 -0
  243. numba_cuda/numba/cuda/simulator/vector_types.py +65 -0
  244. numba_cuda/numba/cuda/simulator_init.py +18 -0
  245. numba_cuda/numba/cuda/stubs.py +624 -0
  246. numba_cuda/numba/cuda/target.py +505 -0
  247. numba_cuda/numba/cuda/testing.py +347 -0
  248. numba_cuda/numba/cuda/tests/__init__.py +62 -0
  249. numba_cuda/numba/cuda/tests/benchmarks/__init__.py +0 -0
  250. numba_cuda/numba/cuda/tests/benchmarks/test_kernel_launch.py +119 -0
  251. numba_cuda/numba/cuda/tests/cloudpickle_main_class.py +9 -0
  252. numba_cuda/numba/cuda/tests/core/serialize_usecases.py +113 -0
  253. numba_cuda/numba/cuda/tests/core/test_itanium_mangler.py +83 -0
  254. numba_cuda/numba/cuda/tests/core/test_serialize.py +371 -0
  255. numba_cuda/numba/cuda/tests/cudadrv/__init__.py +9 -0
  256. numba_cuda/numba/cuda/tests/cudadrv/test_array_attr.py +147 -0
  257. numba_cuda/numba/cuda/tests/cudadrv/test_context_stack.py +161 -0
  258. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_array_slicing.py +397 -0
  259. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_auto_context.py +24 -0
  260. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_devicerecord.py +180 -0
  261. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_driver.py +313 -0
  262. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_memory.py +191 -0
  263. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_ndarray.py +621 -0
  264. numba_cuda/numba/cuda/tests/cudadrv/test_deallocations.py +247 -0
  265. numba_cuda/numba/cuda/tests/cudadrv/test_detect.py +100 -0
  266. numba_cuda/numba/cuda/tests/cudadrv/test_emm_plugins.py +200 -0
  267. numba_cuda/numba/cuda/tests/cudadrv/test_events.py +53 -0
  268. numba_cuda/numba/cuda/tests/cudadrv/test_host_alloc.py +72 -0
  269. numba_cuda/numba/cuda/tests/cudadrv/test_init.py +138 -0
  270. numba_cuda/numba/cuda/tests/cudadrv/test_inline_ptx.py +43 -0
  271. numba_cuda/numba/cuda/tests/cudadrv/test_is_fp16.py +15 -0
  272. numba_cuda/numba/cuda/tests/cudadrv/test_linkable_code.py +58 -0
  273. numba_cuda/numba/cuda/tests/cudadrv/test_linker.py +348 -0
  274. numba_cuda/numba/cuda/tests/cudadrv/test_managed_alloc.py +128 -0
  275. numba_cuda/numba/cuda/tests/cudadrv/test_module_callbacks.py +301 -0
  276. numba_cuda/numba/cuda/tests/cudadrv/test_nvjitlink.py +174 -0
  277. numba_cuda/numba/cuda/tests/cudadrv/test_nvrtc.py +28 -0
  278. numba_cuda/numba/cuda/tests/cudadrv/test_nvvm_driver.py +185 -0
  279. numba_cuda/numba/cuda/tests/cudadrv/test_pinned.py +39 -0
  280. numba_cuda/numba/cuda/tests/cudadrv/test_profiler.py +23 -0
  281. numba_cuda/numba/cuda/tests/cudadrv/test_reset_device.py +38 -0
  282. numba_cuda/numba/cuda/tests/cudadrv/test_runtime.py +48 -0
  283. numba_cuda/numba/cuda/tests/cudadrv/test_select_device.py +44 -0
  284. numba_cuda/numba/cuda/tests/cudadrv/test_streams.py +127 -0
  285. numba_cuda/numba/cuda/tests/cudapy/__init__.py +9 -0
  286. numba_cuda/numba/cuda/tests/cudapy/cache_usecases.py +231 -0
  287. numba_cuda/numba/cuda/tests/cudapy/cache_with_cpu_usecases.py +50 -0
  288. numba_cuda/numba/cuda/tests/cudapy/cg_cache_usecases.py +36 -0
  289. numba_cuda/numba/cuda/tests/cudapy/complex_usecases.py +116 -0
  290. numba_cuda/numba/cuda/tests/cudapy/enum_usecases.py +59 -0
  291. numba_cuda/numba/cuda/tests/cudapy/extensions_usecases.py +62 -0
  292. numba_cuda/numba/cuda/tests/cudapy/jitlink.ptx +28 -0
  293. numba_cuda/numba/cuda/tests/cudapy/overload_usecases.py +33 -0
  294. numba_cuda/numba/cuda/tests/cudapy/recursion_usecases.py +104 -0
  295. numba_cuda/numba/cuda/tests/cudapy/test_alignment.py +47 -0
  296. numba_cuda/numba/cuda/tests/cudapy/test_analysis.py +1122 -0
  297. numba_cuda/numba/cuda/tests/cudapy/test_array.py +344 -0
  298. numba_cuda/numba/cuda/tests/cudapy/test_array_alignment.py +268 -0
  299. numba_cuda/numba/cuda/tests/cudapy/test_array_args.py +203 -0
  300. numba_cuda/numba/cuda/tests/cudapy/test_array_methods.py +63 -0
  301. numba_cuda/numba/cuda/tests/cudapy/test_array_reductions.py +360 -0
  302. numba_cuda/numba/cuda/tests/cudapy/test_atomics.py +1815 -0
  303. numba_cuda/numba/cuda/tests/cudapy/test_bfloat16.py +599 -0
  304. numba_cuda/numba/cuda/tests/cudapy/test_bfloat16_bindings.py +377 -0
  305. numba_cuda/numba/cuda/tests/cudapy/test_blackscholes.py +160 -0
  306. numba_cuda/numba/cuda/tests/cudapy/test_boolean.py +27 -0
  307. numba_cuda/numba/cuda/tests/cudapy/test_byteflow.py +98 -0
  308. numba_cuda/numba/cuda/tests/cudapy/test_cache_hints.py +210 -0
  309. numba_cuda/numba/cuda/tests/cudapy/test_caching.py +683 -0
  310. numba_cuda/numba/cuda/tests/cudapy/test_casting.py +265 -0
  311. numba_cuda/numba/cuda/tests/cudapy/test_cffi.py +42 -0
  312. numba_cuda/numba/cuda/tests/cudapy/test_compiler.py +718 -0
  313. numba_cuda/numba/cuda/tests/cudapy/test_complex.py +370 -0
  314. numba_cuda/numba/cuda/tests/cudapy/test_complex_kernel.py +23 -0
  315. numba_cuda/numba/cuda/tests/cudapy/test_const_string.py +142 -0
  316. numba_cuda/numba/cuda/tests/cudapy/test_constmem.py +178 -0
  317. numba_cuda/numba/cuda/tests/cudapy/test_cooperative_groups.py +193 -0
  318. numba_cuda/numba/cuda/tests/cudapy/test_copy_propagate.py +131 -0
  319. numba_cuda/numba/cuda/tests/cudapy/test_cuda_array_interface.py +438 -0
  320. numba_cuda/numba/cuda/tests/cudapy/test_cuda_jit_no_types.py +94 -0
  321. numba_cuda/numba/cuda/tests/cudapy/test_datetime.py +101 -0
  322. numba_cuda/numba/cuda/tests/cudapy/test_debug.py +105 -0
  323. numba_cuda/numba/cuda/tests/cudapy/test_debuginfo.py +978 -0
  324. numba_cuda/numba/cuda/tests/cudapy/test_debuginfo_types.py +476 -0
  325. numba_cuda/numba/cuda/tests/cudapy/test_device_func.py +500 -0
  326. numba_cuda/numba/cuda/tests/cudapy/test_dispatcher.py +820 -0
  327. numba_cuda/numba/cuda/tests/cudapy/test_enums.py +152 -0
  328. numba_cuda/numba/cuda/tests/cudapy/test_errors.py +111 -0
  329. numba_cuda/numba/cuda/tests/cudapy/test_exception.py +170 -0
  330. numba_cuda/numba/cuda/tests/cudapy/test_extending.py +1088 -0
  331. numba_cuda/numba/cuda/tests/cudapy/test_extending_types.py +71 -0
  332. numba_cuda/numba/cuda/tests/cudapy/test_fastmath.py +265 -0
  333. numba_cuda/numba/cuda/tests/cudapy/test_flow_control.py +1433 -0
  334. numba_cuda/numba/cuda/tests/cudapy/test_forall.py +57 -0
  335. numba_cuda/numba/cuda/tests/cudapy/test_freevar.py +34 -0
  336. numba_cuda/numba/cuda/tests/cudapy/test_frexp_ldexp.py +69 -0
  337. numba_cuda/numba/cuda/tests/cudapy/test_globals.py +62 -0
  338. numba_cuda/numba/cuda/tests/cudapy/test_gufunc.py +474 -0
  339. numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scalar.py +167 -0
  340. numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scheduling.py +92 -0
  341. numba_cuda/numba/cuda/tests/cudapy/test_idiv.py +39 -0
  342. numba_cuda/numba/cuda/tests/cudapy/test_inline.py +170 -0
  343. numba_cuda/numba/cuda/tests/cudapy/test_inspect.py +255 -0
  344. numba_cuda/numba/cuda/tests/cudapy/test_intrinsics.py +1219 -0
  345. numba_cuda/numba/cuda/tests/cudapy/test_ipc.py +263 -0
  346. numba_cuda/numba/cuda/tests/cudapy/test_ir.py +598 -0
  347. numba_cuda/numba/cuda/tests/cudapy/test_ir_utils.py +276 -0
  348. numba_cuda/numba/cuda/tests/cudapy/test_iterators.py +101 -0
  349. numba_cuda/numba/cuda/tests/cudapy/test_lang.py +68 -0
  350. numba_cuda/numba/cuda/tests/cudapy/test_laplace.py +123 -0
  351. numba_cuda/numba/cuda/tests/cudapy/test_libdevice.py +194 -0
  352. numba_cuda/numba/cuda/tests/cudapy/test_lineinfo.py +220 -0
  353. numba_cuda/numba/cuda/tests/cudapy/test_localmem.py +173 -0
  354. numba_cuda/numba/cuda/tests/cudapy/test_make_function_to_jit_function.py +364 -0
  355. numba_cuda/numba/cuda/tests/cudapy/test_mandel.py +47 -0
  356. numba_cuda/numba/cuda/tests/cudapy/test_math.py +842 -0
  357. numba_cuda/numba/cuda/tests/cudapy/test_matmul.py +76 -0
  358. numba_cuda/numba/cuda/tests/cudapy/test_minmax.py +78 -0
  359. numba_cuda/numba/cuda/tests/cudapy/test_montecarlo.py +25 -0
  360. numba_cuda/numba/cuda/tests/cudapy/test_multigpu.py +145 -0
  361. numba_cuda/numba/cuda/tests/cudapy/test_multiprocessing.py +39 -0
  362. numba_cuda/numba/cuda/tests/cudapy/test_multithreads.py +82 -0
  363. numba_cuda/numba/cuda/tests/cudapy/test_nondet.py +53 -0
  364. numba_cuda/numba/cuda/tests/cudapy/test_operator.py +504 -0
  365. numba_cuda/numba/cuda/tests/cudapy/test_optimization.py +93 -0
  366. numba_cuda/numba/cuda/tests/cudapy/test_overload.py +402 -0
  367. numba_cuda/numba/cuda/tests/cudapy/test_powi.py +128 -0
  368. numba_cuda/numba/cuda/tests/cudapy/test_print.py +193 -0
  369. numba_cuda/numba/cuda/tests/cudapy/test_py2_div_issue.py +37 -0
  370. numba_cuda/numba/cuda/tests/cudapy/test_random.py +117 -0
  371. numba_cuda/numba/cuda/tests/cudapy/test_record_dtype.py +614 -0
  372. numba_cuda/numba/cuda/tests/cudapy/test_recursion.py +130 -0
  373. numba_cuda/numba/cuda/tests/cudapy/test_reduction.py +94 -0
  374. numba_cuda/numba/cuda/tests/cudapy/test_retrieve_autoconverted_arrays.py +83 -0
  375. numba_cuda/numba/cuda/tests/cudapy/test_serialize.py +86 -0
  376. numba_cuda/numba/cuda/tests/cudapy/test_slicing.py +40 -0
  377. numba_cuda/numba/cuda/tests/cudapy/test_sm.py +457 -0
  378. numba_cuda/numba/cuda/tests/cudapy/test_sm_creation.py +233 -0
  379. numba_cuda/numba/cuda/tests/cudapy/test_ssa.py +454 -0
  380. numba_cuda/numba/cuda/tests/cudapy/test_stream_api.py +56 -0
  381. numba_cuda/numba/cuda/tests/cudapy/test_sync.py +277 -0
  382. numba_cuda/numba/cuda/tests/cudapy/test_tracing.py +200 -0
  383. numba_cuda/numba/cuda/tests/cudapy/test_transpose.py +90 -0
  384. numba_cuda/numba/cuda/tests/cudapy/test_typeconv.py +333 -0
  385. numba_cuda/numba/cuda/tests/cudapy/test_typeinfer.py +538 -0
  386. numba_cuda/numba/cuda/tests/cudapy/test_ufuncs.py +585 -0
  387. numba_cuda/numba/cuda/tests/cudapy/test_userexc.py +42 -0
  388. numba_cuda/numba/cuda/tests/cudapy/test_vector_type.py +485 -0
  389. numba_cuda/numba/cuda/tests/cudapy/test_vectorize.py +312 -0
  390. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_complex.py +23 -0
  391. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_decor.py +183 -0
  392. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_device.py +40 -0
  393. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_scalar_arg.py +40 -0
  394. numba_cuda/numba/cuda/tests/cudapy/test_warning.py +206 -0
  395. numba_cuda/numba/cuda/tests/cudapy/test_warp_ops.py +446 -0
  396. numba_cuda/numba/cuda/tests/cudasim/__init__.py +9 -0
  397. numba_cuda/numba/cuda/tests/cudasim/support.py +9 -0
  398. numba_cuda/numba/cuda/tests/cudasim/test_cudasim_issues.py +111 -0
  399. numba_cuda/numba/cuda/tests/data/__init__.py +2 -0
  400. numba_cuda/numba/cuda/tests/data/cta_barrier.cu +28 -0
  401. numba_cuda/numba/cuda/tests/data/cuda_include.cu +10 -0
  402. numba_cuda/numba/cuda/tests/data/error.cu +12 -0
  403. numba_cuda/numba/cuda/tests/data/include/add.cuh +8 -0
  404. numba_cuda/numba/cuda/tests/data/jitlink.cu +28 -0
  405. numba_cuda/numba/cuda/tests/data/jitlink.ptx +49 -0
  406. numba_cuda/numba/cuda/tests/data/warn.cu +12 -0
  407. numba_cuda/numba/cuda/tests/doc_examples/__init__.py +9 -0
  408. numba_cuda/numba/cuda/tests/doc_examples/ffi/__init__.py +2 -0
  409. numba_cuda/numba/cuda/tests/doc_examples/ffi/functions.cu +54 -0
  410. numba_cuda/numba/cuda/tests/doc_examples/ffi/include/mul.cuh +8 -0
  411. numba_cuda/numba/cuda/tests/doc_examples/ffi/saxpy.cu +14 -0
  412. numba_cuda/numba/cuda/tests/doc_examples/test_cg.py +86 -0
  413. numba_cuda/numba/cuda/tests/doc_examples/test_cpointer.py +68 -0
  414. numba_cuda/numba/cuda/tests/doc_examples/test_cpu_gpu_compat.py +81 -0
  415. numba_cuda/numba/cuda/tests/doc_examples/test_ffi.py +141 -0
  416. numba_cuda/numba/cuda/tests/doc_examples/test_laplace.py +160 -0
  417. numba_cuda/numba/cuda/tests/doc_examples/test_matmul.py +180 -0
  418. numba_cuda/numba/cuda/tests/doc_examples/test_montecarlo.py +119 -0
  419. numba_cuda/numba/cuda/tests/doc_examples/test_random.py +66 -0
  420. numba_cuda/numba/cuda/tests/doc_examples/test_reduction.py +80 -0
  421. numba_cuda/numba/cuda/tests/doc_examples/test_sessionize.py +206 -0
  422. numba_cuda/numba/cuda/tests/doc_examples/test_ufunc.py +53 -0
  423. numba_cuda/numba/cuda/tests/doc_examples/test_vecadd.py +76 -0
  424. numba_cuda/numba/cuda/tests/nocuda/__init__.py +9 -0
  425. numba_cuda/numba/cuda/tests/nocuda/test_dummyarray.py +452 -0
  426. numba_cuda/numba/cuda/tests/nocuda/test_function_resolution.py +48 -0
  427. numba_cuda/numba/cuda/tests/nocuda/test_import.py +63 -0
  428. numba_cuda/numba/cuda/tests/nocuda/test_library_lookup.py +252 -0
  429. numba_cuda/numba/cuda/tests/nocuda/test_nvvm.py +59 -0
  430. numba_cuda/numba/cuda/tests/nrt/__init__.py +9 -0
  431. numba_cuda/numba/cuda/tests/nrt/test_nrt.py +387 -0
  432. numba_cuda/numba/cuda/tests/nrt/test_nrt_refct.py +124 -0
  433. numba_cuda/numba/cuda/tests/support.py +900 -0
  434. numba_cuda/numba/cuda/typeconv/__init__.py +4 -0
  435. numba_cuda/numba/cuda/typeconv/castgraph.py +137 -0
  436. numba_cuda/numba/cuda/typeconv/rules.py +63 -0
  437. numba_cuda/numba/cuda/typeconv/typeconv.py +121 -0
  438. numba_cuda/numba/cuda/types/__init__.py +233 -0
  439. numba_cuda/numba/cuda/types/__init__.pyi +167 -0
  440. numba_cuda/numba/cuda/types/abstract.py +9 -0
  441. numba_cuda/numba/cuda/types/common.py +9 -0
  442. numba_cuda/numba/cuda/types/containers.py +9 -0
  443. numba_cuda/numba/cuda/types/cuda_abstract.py +533 -0
  444. numba_cuda/numba/cuda/types/cuda_common.py +110 -0
  445. numba_cuda/numba/cuda/types/cuda_containers.py +971 -0
  446. numba_cuda/numba/cuda/types/cuda_function_type.py +230 -0
  447. numba_cuda/numba/cuda/types/cuda_functions.py +798 -0
  448. numba_cuda/numba/cuda/types/cuda_iterators.py +120 -0
  449. numba_cuda/numba/cuda/types/cuda_misc.py +569 -0
  450. numba_cuda/numba/cuda/types/cuda_npytypes.py +690 -0
  451. numba_cuda/numba/cuda/types/cuda_scalars.py +280 -0
  452. numba_cuda/numba/cuda/types/ext_types.py +101 -0
  453. numba_cuda/numba/cuda/types/function_type.py +11 -0
  454. numba_cuda/numba/cuda/types/functions.py +9 -0
  455. numba_cuda/numba/cuda/types/iterators.py +9 -0
  456. numba_cuda/numba/cuda/types/misc.py +9 -0
  457. numba_cuda/numba/cuda/types/npytypes.py +9 -0
  458. numba_cuda/numba/cuda/types/scalars.py +9 -0
  459. numba_cuda/numba/cuda/typing/__init__.py +19 -0
  460. numba_cuda/numba/cuda/typing/arraydecl.py +939 -0
  461. numba_cuda/numba/cuda/typing/asnumbatype.py +130 -0
  462. numba_cuda/numba/cuda/typing/bufproto.py +70 -0
  463. numba_cuda/numba/cuda/typing/builtins.py +1209 -0
  464. numba_cuda/numba/cuda/typing/cffi_utils.py +219 -0
  465. numba_cuda/numba/cuda/typing/cmathdecl.py +47 -0
  466. numba_cuda/numba/cuda/typing/collections.py +138 -0
  467. numba_cuda/numba/cuda/typing/context.py +782 -0
  468. numba_cuda/numba/cuda/typing/ctypes_utils.py +125 -0
  469. numba_cuda/numba/cuda/typing/dictdecl.py +63 -0
  470. numba_cuda/numba/cuda/typing/enumdecl.py +74 -0
  471. numba_cuda/numba/cuda/typing/listdecl.py +147 -0
  472. numba_cuda/numba/cuda/typing/mathdecl.py +158 -0
  473. numba_cuda/numba/cuda/typing/npdatetime.py +322 -0
  474. numba_cuda/numba/cuda/typing/npydecl.py +749 -0
  475. numba_cuda/numba/cuda/typing/setdecl.py +115 -0
  476. numba_cuda/numba/cuda/typing/templates.py +1446 -0
  477. numba_cuda/numba/cuda/typing/typeof.py +301 -0
  478. numba_cuda/numba/cuda/ufuncs.py +746 -0
  479. numba_cuda/numba/cuda/utils.py +724 -0
  480. numba_cuda/numba/cuda/vector_types.py +214 -0
  481. numba_cuda/numba/cuda/vectorizers.py +260 -0
  482. numba_cuda-0.22.0.dist-info/METADATA +109 -0
  483. numba_cuda-0.22.0.dist-info/RECORD +487 -0
  484. numba_cuda-0.22.0.dist-info/WHEEL +6 -0
  485. numba_cuda-0.22.0.dist-info/licenses/LICENSE +26 -0
  486. numba_cuda-0.22.0.dist-info/licenses/LICENSE.numba +24 -0
  487. numba_cuda-0.22.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,798 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: BSD-2-Clause
3
+
4
+ import traceback
5
+ from collections import namedtuple, defaultdict
6
+ import itertools
7
+ import logging
8
+ import textwrap
9
+ from shutil import get_terminal_size
10
+
11
+ from .abstract import Callable, DTypeSpec, Dummy, Literal, Type, weakref
12
+ from .common import Opaque
13
+ from .misc import unliteral
14
+ from numba.cuda.core import errors
15
+ from numba.cuda import utils, types, config
16
+ from numba.cuda.typeconv import Conversion
17
+
18
+ _logger = logging.getLogger(__name__)
19
+
20
+
21
+ # terminal color markup
22
+ _termcolor = errors.termcolor()
23
+
24
+ _FAILURE = namedtuple("_FAILURE", "template matched error literal")
25
+
26
+ _termwidth = get_terminal_size().columns
27
+
28
+
29
+ # pull out the lead line as unit tests often use this
30
+ _header_lead = "No implementation of function"
31
+ _header_template = (
32
+ _header_lead + " {the_function} found for signature:\n \n "
33
+ ">>> {fname}({signature})\n \nThere are {ncandidates} "
34
+ "candidate implementations:"
35
+ )
36
+
37
+ _reason_template = """
38
+ " - Of which {nmatches} did not match due to:\n
39
+ """
40
+
41
+
42
+ def _wrapper(tmp, indent=0):
43
+ return textwrap.indent(tmp, " " * indent, lambda line: True)
44
+
45
+
46
+ _overload_template = (
47
+ "- Of which {nduplicates} did not match due to:\n"
48
+ "{kind} {inof} function '{function}': File: {file}: "
49
+ "Line {line}.\n With argument(s): '({args})':"
50
+ )
51
+
52
+
53
+ _err_reasons = {
54
+ "specific_error": "Rejected as the implementation raised a "
55
+ "specific error:\n{}"
56
+ }
57
+
58
+
59
+ def _bt_as_lines(bt):
60
+ """
61
+ Converts a backtrace into a list of lines, squashes it a bit on the way.
62
+ """
63
+ return [y for y in itertools.chain(*[x.split("\n") for x in bt]) if y]
64
+
65
+
66
+ def argsnkwargs_to_str(args, kwargs):
67
+ buf = [str(a) for a in tuple(args)]
68
+ buf.extend(["{}={}".format(k, v) for k, v in kwargs.items()])
69
+ return ", ".join(buf)
70
+
71
+
72
+ class _ResolutionFailures(object):
73
+ """Collect and format function resolution failures."""
74
+
75
+ def __init__(self, context, function_type, args, kwargs, depth=0):
76
+ self._context = context
77
+ self._function_type = function_type
78
+ self._args = args
79
+ self._kwargs = kwargs
80
+ self._failures = defaultdict(list)
81
+ self._depth = depth
82
+ self._max_depth = 5
83
+ self._scale = 2
84
+
85
+ def __len__(self):
86
+ return len(self._failures)
87
+
88
+ def add_error(self, calltemplate, matched, error, literal):
89
+ """
90
+ Args
91
+ ----
92
+ calltemplate : CallTemplate
93
+ error : Exception or str
94
+ Error message
95
+ """
96
+ isexc = isinstance(error, Exception)
97
+ errclazz = "%s: " % type(error).__name__ if isexc else ""
98
+
99
+ key = "{}{}".format(errclazz, str(error))
100
+ self._failures[key].append(
101
+ _FAILURE(calltemplate, matched, error, literal)
102
+ )
103
+
104
+ def format(self):
105
+ """Return a formatted error message from all the gathered errors."""
106
+ indent = " " * self._scale
107
+ argstr = argsnkwargs_to_str(self._args, self._kwargs)
108
+ ncandidates = sum([len(x) for x in self._failures.values()])
109
+
110
+ # sort out a display name for the function
111
+ tykey = self._function_type.typing_key
112
+ # most things have __name__
113
+ fname = getattr(tykey, "__name__", None)
114
+ is_external_fn_ptr = isinstance(
115
+ self._function_type, ExternalFunctionPointer
116
+ )
117
+
118
+ if fname is None:
119
+ if is_external_fn_ptr:
120
+ fname = "ExternalFunctionPointer"
121
+ else:
122
+ fname = "<unknown function>"
123
+
124
+ msgbuf = [
125
+ _header_template.format(
126
+ the_function=self._function_type,
127
+ fname=fname,
128
+ signature=argstr,
129
+ ncandidates=ncandidates,
130
+ )
131
+ ]
132
+ nolitargs = tuple([unliteral(a) for a in self._args])
133
+ nolitkwargs = {k: unliteral(v) for k, v in self._kwargs.items()}
134
+ nolitargstr = argsnkwargs_to_str(nolitargs, nolitkwargs)
135
+
136
+ # depth could potentially get massive, so limit it.
137
+ ldepth = min(max(self._depth, 0), self._max_depth)
138
+
139
+ def template_info(tp):
140
+ src_info = tp.get_template_info()
141
+ unknown = "unknown"
142
+ source_name = src_info.get("name", unknown)
143
+ source_file = src_info.get("filename", unknown)
144
+ source_lines = src_info.get("lines", unknown)
145
+ source_kind = src_info.get("kind", "Unknown template")
146
+ return source_name, source_file, source_lines, source_kind
147
+
148
+ for i, (k, err_list) in enumerate(self._failures.items()):
149
+ err = err_list[0]
150
+ nduplicates = len(err_list)
151
+ template, error = err.template, err.error
152
+ ifo = template_info(template)
153
+ source_name, source_file, source_lines, source_kind = ifo
154
+ largstr = argstr if err.literal else nolitargstr
155
+
156
+ if err.error == "No match.":
157
+ err_dict = defaultdict(set)
158
+ for errs in err_list:
159
+ err_dict[errs.template].add(errs.literal)
160
+ # if there's just one template, and it's erroring on
161
+ # literal/nonliteral be specific
162
+ if len(err_dict) == 1:
163
+ template = [_ for _ in err_dict.keys()][0]
164
+ source_name, source_file, source_lines, source_kind = (
165
+ template_info(template)
166
+ )
167
+ source_lines = source_lines[0]
168
+ else:
169
+ source_file = "<numerous>"
170
+ source_lines = "N/A"
171
+
172
+ msgbuf.append(
173
+ _termcolor.errmsg(
174
+ _wrapper(
175
+ _overload_template.format(
176
+ nduplicates=nduplicates,
177
+ kind=source_kind.title(),
178
+ function=fname,
179
+ inof="of",
180
+ file=source_file,
181
+ line=source_lines,
182
+ args=largstr,
183
+ ),
184
+ ldepth + 1,
185
+ )
186
+ )
187
+ )
188
+ msgbuf.append(
189
+ _termcolor.highlight(_wrapper(err.error, ldepth + 2))
190
+ )
191
+ else:
192
+ # There was at least one match in this failure class, but it
193
+ # failed for a specific reason try and report this.
194
+ msgbuf.append(
195
+ _termcolor.errmsg(
196
+ _wrapper(
197
+ _overload_template.format(
198
+ nduplicates=nduplicates,
199
+ kind=source_kind.title(),
200
+ function=source_name,
201
+ inof="in",
202
+ file=source_file,
203
+ line=source_lines[0],
204
+ args=largstr,
205
+ ),
206
+ ldepth + 1,
207
+ )
208
+ )
209
+ )
210
+
211
+ if isinstance(error, BaseException):
212
+ reason = indent + self.format_error(error)
213
+ errstr = _err_reasons["specific_error"].format(reason)
214
+ else:
215
+ errstr = error
216
+ # if you are a developer, show the back traces
217
+ if config.DEVELOPER_MODE:
218
+ if isinstance(error, BaseException):
219
+ # if the error is an actual exception instance, trace it
220
+ bt = traceback.format_exception(
221
+ type(error), error, error.__traceback__
222
+ )
223
+ else:
224
+ bt = [""]
225
+ bt_as_lines = _bt_as_lines(bt)
226
+ nd2indent = "\n{}".format(2 * indent)
227
+ errstr += _termcolor.reset(
228
+ nd2indent + nd2indent.join(bt_as_lines)
229
+ )
230
+ msgbuf.append(
231
+ _termcolor.highlight(_wrapper(errstr, ldepth + 2))
232
+ )
233
+ loc = self.get_loc(template, error)
234
+ if loc:
235
+ msgbuf.append("{}raised from {}".format(indent, loc))
236
+
237
+ # the commented bit rewraps each block, may not be helpful?!
238
+ return _wrapper("\n".join(msgbuf) + "\n") # , self._scale * ldepth)
239
+
240
+ def format_error(self, error):
241
+ """Format error message or exception"""
242
+ if isinstance(error, Exception):
243
+ return "{}: {}".format(type(error).__name__, error)
244
+ else:
245
+ return "{}".format(error)
246
+
247
+ def get_loc(self, classtemplate, error):
248
+ """Get source location information from the error message."""
249
+ if isinstance(error, Exception) and hasattr(error, "__traceback__"):
250
+ # traceback is unavailable in py2
251
+ frame = traceback.extract_tb(error.__traceback__)[-1]
252
+ return "{}:{}".format(frame[0], frame[1])
253
+
254
+ def raise_error(self):
255
+ for faillist in self._failures.values():
256
+ for fail in faillist:
257
+ if isinstance(fail.error, errors.ForceLiteralArg):
258
+ raise fail.error
259
+ raise errors.TypingError(self.format())
260
+
261
+
262
+ def _unlit_non_poison(ty):
263
+ """Apply unliteral(ty) and raise a TypingError if type is Poison."""
264
+ out = unliteral(ty)
265
+ if isinstance(out, types.Poison):
266
+ m = f"Poison type used in arguments; got {out}"
267
+ raise errors.TypingError(m)
268
+ return out
269
+
270
+
271
+ class BaseFunction(Callable):
272
+ """
273
+ Base type class for some function types.
274
+ """
275
+
276
+ def __init__(self, template):
277
+ if isinstance(template, (list, tuple)):
278
+ self.templates = tuple(template)
279
+ keys = set(temp.key for temp in self.templates)
280
+ if len(keys) != 1:
281
+ raise ValueError("incompatible templates: keys = %s" % (keys,))
282
+ (self.typing_key,) = keys
283
+ else:
284
+ self.templates = (template,)
285
+ self.typing_key = template.key
286
+ self._impl_keys = {}
287
+ name = "%s(%s)" % (self.__class__.__name__, self.typing_key)
288
+ self._depth = 0
289
+ super(BaseFunction, self).__init__(name)
290
+
291
+ @property
292
+ def key(self):
293
+ return self.typing_key, self.templates
294
+
295
+ def augment(self, other):
296
+ """
297
+ Augment this function type with the other function types' templates,
298
+ so as to support more input types.
299
+ """
300
+ if type(other) is type(self) and other.typing_key == self.typing_key:
301
+ return type(self)(self.templates + other.templates)
302
+
303
+ def get_impl_key(self, sig):
304
+ """
305
+ Get the implementation key (used by the target context) for the
306
+ given signature.
307
+ """
308
+ return self._impl_keys[sig.args]
309
+
310
+ def get_call_type(self, context, args, kws):
311
+ prefer_lit = [True, False] # old behavior preferring literal
312
+ prefer_not = [False, True] # new behavior preferring non-literal
313
+ failures = _ResolutionFailures(
314
+ context, self, args, kws, depth=self._depth
315
+ )
316
+
317
+ order = utils.order_by_target_specificity(
318
+ self.templates, fnkey=self.key[0]
319
+ )
320
+
321
+ self._depth += 1
322
+
323
+ for temp_cls in order:
324
+ temp = temp_cls(context)
325
+ # The template can override the default and prefer literal args
326
+ choice = prefer_lit if temp.prefer_literal else prefer_not
327
+ for uselit in choice:
328
+ try:
329
+ if uselit:
330
+ sig = temp.apply(args, kws)
331
+ else:
332
+ nolitargs = tuple([_unlit_non_poison(a) for a in args])
333
+ nolitkws = {
334
+ k: _unlit_non_poison(v) for k, v in kws.items()
335
+ }
336
+ sig = temp.apply(nolitargs, nolitkws)
337
+ except Exception as e:
338
+ if not isinstance(e, errors.NumbaError):
339
+ raise e
340
+ sig = None
341
+ failures.add_error(temp, False, e, uselit)
342
+ else:
343
+ if sig is not None:
344
+ self._impl_keys[sig.args] = temp.get_impl_key(sig)
345
+ self._depth -= 1
346
+ return sig
347
+ else:
348
+ registered_sigs = getattr(temp, "cases", None)
349
+ if registered_sigs is not None:
350
+ msg = "No match for registered cases:\n%s"
351
+ msg = msg % "\n".join(
352
+ " * {}".format(x) for x in registered_sigs
353
+ )
354
+ else:
355
+ msg = "No match."
356
+ failures.add_error(temp, True, msg, uselit)
357
+
358
+ failures.raise_error()
359
+
360
+ def get_call_signatures(self):
361
+ sigs = []
362
+ is_param = False
363
+ for temp in self.templates:
364
+ sigs += getattr(temp, "cases", [])
365
+ is_param = is_param or hasattr(temp, "generic")
366
+ return sigs, is_param
367
+
368
+
369
+ class Function(BaseFunction, Opaque):
370
+ """
371
+ Type class for builtin functions implemented by Numba.
372
+ """
373
+
374
+
375
+ class BoundFunction(Callable, Opaque):
376
+ """
377
+ A function with an implicit first argument (denoted as *this* below).
378
+ """
379
+
380
+ def __init__(self, template, this):
381
+ # Create a derived template with an attribute *this*
382
+ newcls = type(
383
+ template.__name__ + "." + str(this), (template,), dict(this=this)
384
+ )
385
+ self.template = newcls
386
+ self.typing_key = self.template.key
387
+ self.this = this
388
+ name = "%s(%s for %s)" % (
389
+ self.__class__.__name__,
390
+ self.typing_key,
391
+ self.this,
392
+ )
393
+ super(BoundFunction, self).__init__(name)
394
+
395
+ def unify(self, typingctx, other):
396
+ if (
397
+ isinstance(other, BoundFunction)
398
+ and self.typing_key == other.typing_key
399
+ ):
400
+ this = typingctx.unify_pairs(self.this, other.this)
401
+ if this is not None:
402
+ # XXX is it right that both template instances are distinct?
403
+ return self.copy(this=this)
404
+
405
+ def copy(self, this):
406
+ return type(self)(self.template, this)
407
+
408
+ @property
409
+ def key(self):
410
+ # FIXME: With target-overload, the MethodTemplate can change depending
411
+ # on the target.
412
+ unique_impl = getattr(self.template, "_overload_func", None)
413
+ return self.typing_key, self.this, unique_impl
414
+
415
+ def get_impl_key(self, sig):
416
+ """
417
+ Get the implementation key (used by the target context) for the
418
+ given signature.
419
+ """
420
+ return self.typing_key
421
+
422
+ def get_call_type(self, context, args, kws):
423
+ template = self.template(context)
424
+ literal_e = None
425
+ nonliteral_e = None
426
+ out = None
427
+
428
+ choice = [True, False] if template.prefer_literal else [False, True]
429
+ for uselit in choice:
430
+ if uselit:
431
+ # Try with Literal
432
+ try:
433
+ out = template.apply(args, kws)
434
+ except Exception as exc:
435
+ if not isinstance(exc, errors.NumbaError):
436
+ raise exc
437
+ if isinstance(exc, errors.ForceLiteralArg):
438
+ raise exc
439
+ literal_e = exc
440
+ out = None
441
+ else:
442
+ break
443
+ else:
444
+ # if the unliteral_args and unliteral_kws are the same as the
445
+ # literal ones, set up to not bother retrying
446
+ unliteral_args = tuple([_unlit_non_poison(a) for a in args])
447
+ unliteral_kws = {
448
+ k: _unlit_non_poison(v) for k, v in kws.items()
449
+ }
450
+ skip = unliteral_args == args and kws == unliteral_kws
451
+
452
+ # If the above template application failed and the non-literal
453
+ # args are different to the literal ones, try again with
454
+ # literals rewritten as non-literals
455
+ if not skip and out is None:
456
+ try:
457
+ out = template.apply(unliteral_args, unliteral_kws)
458
+ except Exception as exc:
459
+ if isinstance(exc, errors.ForceLiteralArg):
460
+ if template.prefer_literal:
461
+ # For template that prefers literal types,
462
+ # reaching here means that the literal types
463
+ # have failed typing as well.
464
+ raise exc
465
+ nonliteral_e = exc
466
+ else:
467
+ break
468
+
469
+ if out is None and (nonliteral_e is not None or literal_e is not None):
470
+ header = "- Resolution failure for {} arguments:\n{}\n"
471
+ tmplt = _termcolor.highlight(header)
472
+ if config.DEVELOPER_MODE:
473
+ indent = " " * 4
474
+
475
+ def add_bt(error):
476
+ if isinstance(error, BaseException):
477
+ # if the error is an actual exception instance, trace it
478
+ bt = traceback.format_exception(
479
+ type(error), error, error.__traceback__
480
+ )
481
+ else:
482
+ bt = [""]
483
+ nd2indent = "\n{}".format(2 * indent)
484
+ errstr = _termcolor.reset(
485
+ nd2indent + nd2indent.join(_bt_as_lines(bt))
486
+ )
487
+ return _termcolor.reset(errstr)
488
+ else:
489
+ add_bt = lambda X: ""
490
+
491
+ def nested_msg(literalness, e):
492
+ estr = str(e)
493
+ estr = estr if estr else (str(repr(e)) + add_bt(e))
494
+ new_e = errors.TypingError(textwrap.dedent(estr))
495
+ return tmplt.format(literalness, str(new_e))
496
+
497
+ raise errors.TypingError(
498
+ nested_msg("literal", literal_e)
499
+ + nested_msg("non-literal", nonliteral_e)
500
+ )
501
+ return out
502
+
503
+ def get_call_signatures(self):
504
+ sigs = getattr(self.template, "cases", [])
505
+ is_param = hasattr(self.template, "generic")
506
+ return sigs, is_param
507
+
508
+
509
+ class MakeFunctionLiteral(Literal, Opaque):
510
+ pass
511
+
512
+
513
+ class _PickleableWeakRef(weakref.ref):
514
+ """
515
+ Allow a weakref to be pickled.
516
+
517
+ Note that if the object referred to is not kept alive elsewhere in the
518
+ pickle, the weakref will immediately expire after being constructed.
519
+ """
520
+
521
+ def __getnewargs__(self):
522
+ obj = self()
523
+ if obj is None:
524
+ raise ReferenceError("underlying object has vanished")
525
+ return (obj,)
526
+
527
+
528
+ class WeakType(Type):
529
+ """
530
+ Base class for types parametered by a mortal object, to which only
531
+ a weak reference is kept.
532
+ """
533
+
534
+ def _store_object(self, obj):
535
+ self._wr = _PickleableWeakRef(obj)
536
+
537
+ def _get_object(self):
538
+ obj = self._wr()
539
+ if obj is None:
540
+ raise ReferenceError("underlying object has vanished")
541
+ return obj
542
+
543
+ @property
544
+ def key(self):
545
+ return self._wr
546
+
547
+ def __eq__(self, other):
548
+ if type(self) is type(other):
549
+ obj = self._wr()
550
+ return obj is not None and obj is other._wr()
551
+ return NotImplemented
552
+
553
+ def __hash__(self):
554
+ return Type.__hash__(self)
555
+
556
+
557
+ class Dispatcher(WeakType, Callable, Dummy):
558
+ """
559
+ Type class for @jit-compiled functions.
560
+ """
561
+
562
+ def __init__(self, dispatcher):
563
+ self._store_object(dispatcher)
564
+ super(Dispatcher, self).__init__("type(%s)" % dispatcher)
565
+
566
+ def dump(self, tab=""):
567
+ print(
568
+ (
569
+ f"{tab}DUMP {type(self).__name__}[code={self._code}, "
570
+ f"name={self.name}]"
571
+ )
572
+ )
573
+ self.dispatcher.dump(tab=tab + " ")
574
+ print(f"{tab}END DUMP")
575
+
576
+ def get_call_type(self, context, args, kws):
577
+ """
578
+ Resolve a call to this dispatcher using the given argument types.
579
+ A signature returned and it is ensured that a compiled specialization
580
+ is available for it.
581
+ """
582
+ template, pysig, args, kws = self.dispatcher.get_call_template(
583
+ args, kws
584
+ )
585
+ sig = template(context).apply(args, kws)
586
+ if sig:
587
+ sig = sig.replace(pysig=pysig)
588
+ return sig
589
+
590
+ def get_call_signatures(self):
591
+ sigs = self.dispatcher.nopython_signatures
592
+ return sigs, True
593
+
594
+ @property
595
+ def dispatcher(self):
596
+ """
597
+ A strong reference to the underlying numba.dispatcher.Dispatcher
598
+ instance.
599
+ """
600
+ return self._get_object()
601
+
602
+ def get_overload(self, sig):
603
+ """
604
+ Get the compiled overload for the given signature.
605
+ """
606
+ return self.dispatcher.get_overload(sig.args)
607
+
608
+ def get_impl_key(self, sig):
609
+ """
610
+ Get the implementation key for the given signature.
611
+ """
612
+ return self.get_overload(sig)
613
+
614
+ def unify(self, context, other):
615
+ return utils.unified_function_type((self, other), require_precise=False)
616
+
617
+ def can_convert_to(self, typingctx, other):
618
+ if isinstance(other, types.FunctionType):
619
+ try:
620
+ self.dispatcher.get_compile_result(other.signature)
621
+ except errors.NumbaError:
622
+ return None
623
+ else:
624
+ return Conversion.safe
625
+
626
+
627
+ class ObjModeDispatcher(Dispatcher):
628
+ """Dispatcher subclass that enters objectmode function."""
629
+
630
+ pass
631
+
632
+
633
+ class ExternalFunctionPointer(BaseFunction):
634
+ """
635
+ A pointer to a native function (e.g. exported via ctypes or cffi).
636
+ *get_pointer* is a Python function taking an object
637
+ and returning the raw pointer value as an int.
638
+ """
639
+
640
+ def __init__(self, sig, get_pointer, cconv=None):
641
+ from numba.cuda.typing.templates import (
642
+ AbstractTemplate,
643
+ make_concrete_template,
644
+ signature,
645
+ )
646
+ from numba.cuda.types import ffi_forced_object
647
+
648
+ if sig.return_type == ffi_forced_object:
649
+ msg = "Cannot return a pyobject from an external function"
650
+ raise errors.TypingError(msg)
651
+ self.sig = sig
652
+ self.requires_gil = any(a == ffi_forced_object for a in self.sig.args)
653
+ self.get_pointer = get_pointer
654
+ self.cconv = cconv
655
+ if self.requires_gil:
656
+
657
+ class GilRequiringDefn(AbstractTemplate):
658
+ key = self.sig
659
+
660
+ def generic(self, args, kws):
661
+ if kws:
662
+ msg = "does not support keyword arguments"
663
+ raise errors.TypingError(msg)
664
+ # Make ffi_forced_object a bottom type to allow any type to
665
+ # be casted to it. This is the only place that support
666
+ # ffi_forced_object.
667
+ coerced = [
668
+ actual if formal == ffi_forced_object else formal
669
+ for actual, formal in zip(args, self.key.args)
670
+ ]
671
+ return signature(self.key.return_type, *coerced)
672
+
673
+ template = GilRequiringDefn
674
+ else:
675
+ template = make_concrete_template("CFuncPtr", sig, [sig])
676
+ super(ExternalFunctionPointer, self).__init__(template)
677
+
678
+ @property
679
+ def key(self):
680
+ return self.sig, self.cconv, self.get_pointer
681
+
682
+
683
+ class ExternalFunction(Function):
684
+ """
685
+ A named native function (resolvable by LLVM) accepting an explicit
686
+ signature. For internal use only.
687
+ """
688
+
689
+ def __init__(self, symbol, sig):
690
+ from numba.cuda import typing
691
+
692
+ self.symbol = symbol
693
+ self.sig = sig
694
+ template = typing.make_concrete_template(symbol, symbol, [sig])
695
+ super(ExternalFunction, self).__init__(template)
696
+
697
+ @property
698
+ def key(self):
699
+ return self.symbol, self.sig
700
+
701
+
702
+ class NamedTupleClass(Callable, Opaque):
703
+ """
704
+ Type class for namedtuple classes.
705
+ """
706
+
707
+ def __init__(self, instance_class):
708
+ self.instance_class = instance_class
709
+ name = "class(%s)" % (instance_class)
710
+ super(NamedTupleClass, self).__init__(name)
711
+
712
+ def get_call_type(self, context, args, kws):
713
+ # Overridden by the __call__ constructor resolution in
714
+ # typing.collections
715
+ return None
716
+
717
+ def get_call_signatures(self):
718
+ return (), True
719
+
720
+ def get_impl_key(self, sig):
721
+ return type(self)
722
+
723
+ @property
724
+ def key(self):
725
+ return self.instance_class
726
+
727
+
728
+ class NumberClass(Callable, DTypeSpec, Opaque):
729
+ """
730
+ Type class for number classes (e.g. "np.float64").
731
+ """
732
+
733
+ def __init__(self, instance_type):
734
+ self.instance_type = instance_type
735
+ name = "class(%s)" % (instance_type,)
736
+ super(NumberClass, self).__init__(name)
737
+
738
+ def get_call_type(self, context, args, kws):
739
+ # Overridden by the __call__ constructor resolution in typing.builtins
740
+ return None
741
+
742
+ def get_call_signatures(self):
743
+ return (), True
744
+
745
+ def get_impl_key(self, sig):
746
+ return type(self)
747
+
748
+ @property
749
+ def key(self):
750
+ return self.instance_type
751
+
752
+ @property
753
+ def dtype(self):
754
+ return self.instance_type
755
+
756
+
757
+ _RecursiveCallOverloads = namedtuple("_RecursiveCallOverloads", "qualname,uid")
758
+
759
+
760
+ class RecursiveCall(Opaque):
761
+ """
762
+ Recursive call to a Dispatcher.
763
+ """
764
+
765
+ _overloads = None
766
+
767
+ def __init__(self, dispatcher_type):
768
+ assert isinstance(dispatcher_type, Dispatcher)
769
+ self.dispatcher_type = dispatcher_type
770
+ name = "recursive(%s)" % (dispatcher_type,)
771
+ super(RecursiveCall, self).__init__(name)
772
+ # Initializing for the first time
773
+ if self._overloads is None:
774
+ self._overloads = {}
775
+
776
+ def add_overloads(self, args, qualname, uid):
777
+ """Add an overload of the function.
778
+
779
+ Parameters
780
+ ----------
781
+ args :
782
+ argument types
783
+ qualname :
784
+ function qualifying name
785
+ uid :
786
+ unique id
787
+ """
788
+ self._overloads[args] = _RecursiveCallOverloads(qualname, uid)
789
+
790
+ def get_overloads(self, args):
791
+ """Get the qualifying name and unique id for the overload given the
792
+ argument types.
793
+ """
794
+ return self._overloads[args]
795
+
796
+ @property
797
+ def key(self):
798
+ return self.dispatcher_type