numba-cuda 0.19.0__py3-none-any.whl → 0.20.0__py3-none-any.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 numba-cuda might be problematic. Click here for more details.

Files changed (353) hide show
  1. _numba_cuda_redirector.pth +3 -0
  2. _numba_cuda_redirector.py +3 -0
  3. numba_cuda/VERSION +1 -1
  4. numba_cuda/__init__.py +2 -1
  5. numba_cuda/_version.py +2 -13
  6. numba_cuda/numba/cuda/__init__.py +4 -1
  7. numba_cuda/numba/cuda/_internal/cuda_bf16.py +12708 -1469
  8. numba_cuda/numba/cuda/_internal/cuda_fp16.py +2656 -8769
  9. numba_cuda/numba/cuda/api.py +9 -1
  10. numba_cuda/numba/cuda/api_util.py +3 -0
  11. numba_cuda/numba/cuda/args.py +3 -0
  12. numba_cuda/numba/cuda/bf16.py +288 -2
  13. numba_cuda/numba/cuda/cg.py +3 -0
  14. numba_cuda/numba/cuda/cgutils.py +5 -2
  15. numba_cuda/numba/cuda/cloudpickle/__init__.py +21 -0
  16. numba_cuda/numba/cuda/cloudpickle/cloudpickle.py +1598 -0
  17. numba_cuda/numba/cuda/cloudpickle/cloudpickle_fast.py +17 -0
  18. numba_cuda/numba/cuda/codegen.py +4 -1
  19. numba_cuda/numba/cuda/compiler.py +376 -30
  20. numba_cuda/numba/cuda/core/analysis.py +319 -0
  21. numba_cuda/numba/cuda/core/annotations/__init__.py +0 -0
  22. numba_cuda/numba/cuda/core/annotations/type_annotations.py +304 -0
  23. numba_cuda/numba/cuda/core/base.py +1289 -0
  24. numba_cuda/numba/cuda/core/bytecode.py +727 -0
  25. numba_cuda/numba/cuda/core/caching.py +5 -2
  26. numba_cuda/numba/cuda/core/callconv.py +3 -0
  27. numba_cuda/numba/cuda/core/codegen.py +3 -0
  28. numba_cuda/numba/cuda/core/compiler.py +9 -14
  29. numba_cuda/numba/cuda/core/compiler_machinery.py +497 -0
  30. numba_cuda/numba/cuda/core/config.py +747 -0
  31. numba_cuda/numba/cuda/core/consts.py +124 -0
  32. numba_cuda/numba/cuda/core/cpu.py +370 -0
  33. numba_cuda/numba/cuda/core/environment.py +68 -0
  34. numba_cuda/numba/cuda/core/event.py +511 -0
  35. numba_cuda/numba/cuda/core/funcdesc.py +330 -0
  36. numba_cuda/numba/cuda/core/inline_closurecall.py +1889 -0
  37. numba_cuda/numba/cuda/core/interpreter.py +52 -27
  38. numba_cuda/numba/cuda/core/ir_utils.py +17 -29
  39. numba_cuda/numba/cuda/core/options.py +262 -0
  40. numba_cuda/numba/cuda/core/postproc.py +249 -0
  41. numba_cuda/numba/cuda/core/pythonapi.py +1868 -0
  42. numba_cuda/numba/cuda/core/rewrites/__init__.py +26 -0
  43. numba_cuda/numba/cuda/core/rewrites/ir_print.py +90 -0
  44. numba_cuda/numba/cuda/core/rewrites/registry.py +104 -0
  45. numba_cuda/numba/cuda/core/rewrites/static_binop.py +40 -0
  46. numba_cuda/numba/cuda/core/rewrites/static_getitem.py +187 -0
  47. numba_cuda/numba/cuda/core/rewrites/static_raise.py +98 -0
  48. numba_cuda/numba/cuda/core/sigutils.py +3 -0
  49. numba_cuda/numba/cuda/core/ssa.py +496 -0
  50. numba_cuda/numba/cuda/core/targetconfig.py +329 -0
  51. numba_cuda/numba/cuda/core/tracing.py +231 -0
  52. numba_cuda/numba/cuda/core/transforms.py +952 -0
  53. numba_cuda/numba/cuda/core/typed_passes.py +741 -7
  54. numba_cuda/numba/cuda/core/typeinfer.py +1948 -0
  55. numba_cuda/numba/cuda/core/unsafe/__init__.py +0 -0
  56. numba_cuda/numba/cuda/core/unsafe/bytes.py +67 -0
  57. numba_cuda/numba/cuda/core/unsafe/eh.py +66 -0
  58. numba_cuda/numba/cuda/core/unsafe/refcount.py +98 -0
  59. numba_cuda/numba/cuda/core/untyped_passes.py +1983 -0
  60. numba_cuda/numba/cuda/cpython/cmathimpl.py +560 -0
  61. numba_cuda/numba/cuda/cpython/mathimpl.py +499 -0
  62. numba_cuda/numba/cuda/cpython/numbers.py +1474 -0
  63. numba_cuda/numba/cuda/cuda_paths.py +425 -246
  64. numba_cuda/numba/cuda/cudadecl.py +4 -1
  65. numba_cuda/numba/cuda/cudadrv/__init__.py +4 -1
  66. numba_cuda/numba/cuda/cudadrv/devicearray.py +5 -1
  67. numba_cuda/numba/cuda/cudadrv/devices.py +3 -0
  68. numba_cuda/numba/cuda/cudadrv/driver.py +14 -140
  69. numba_cuda/numba/cuda/cudadrv/drvapi.py +3 -0
  70. numba_cuda/numba/cuda/cudadrv/dummyarray.py +114 -24
  71. numba_cuda/numba/cuda/cudadrv/enums.py +3 -0
  72. numba_cuda/numba/cuda/cudadrv/error.py +4 -0
  73. numba_cuda/numba/cuda/cudadrv/libs.py +8 -5
  74. numba_cuda/numba/cuda/cudadrv/linkable_code.py +3 -0
  75. numba_cuda/numba/cuda/cudadrv/mappings.py +4 -1
  76. numba_cuda/numba/cuda/cudadrv/ndarray.py +3 -0
  77. numba_cuda/numba/cuda/cudadrv/nvrtc.py +22 -8
  78. numba_cuda/numba/cuda/cudadrv/nvvm.py +4 -4
  79. numba_cuda/numba/cuda/cudadrv/rtapi.py +3 -0
  80. numba_cuda/numba/cuda/cudadrv/runtime.py +4 -1
  81. numba_cuda/numba/cuda/cudaimpl.py +8 -1
  82. numba_cuda/numba/cuda/cudamath.py +3 -0
  83. numba_cuda/numba/cuda/debuginfo.py +88 -2
  84. numba_cuda/numba/cuda/decorators.py +6 -3
  85. numba_cuda/numba/cuda/descriptor.py +6 -4
  86. numba_cuda/numba/cuda/device_init.py +3 -0
  87. numba_cuda/numba/cuda/deviceufunc.py +69 -2
  88. numba_cuda/numba/cuda/dispatcher.py +21 -39
  89. numba_cuda/numba/cuda/errors.py +10 -0
  90. numba_cuda/numba/cuda/extending.py +3 -0
  91. numba_cuda/numba/cuda/flags.py +143 -1
  92. numba_cuda/numba/cuda/fp16.py +3 -2
  93. numba_cuda/numba/cuda/include/13/cuda_bf16.h +5118 -0
  94. numba_cuda/numba/cuda/include/13/cuda_bf16.hpp +3865 -0
  95. numba_cuda/numba/cuda/include/13/cuda_fp16.h +5363 -0
  96. numba_cuda/numba/cuda/include/13/cuda_fp16.hpp +3483 -0
  97. numba_cuda/numba/cuda/initialize.py +4 -0
  98. numba_cuda/numba/cuda/intrinsic_wrapper.py +3 -0
  99. numba_cuda/numba/cuda/intrinsics.py +3 -0
  100. numba_cuda/numba/cuda/itanium_mangler.py +3 -0
  101. numba_cuda/numba/cuda/kernels/__init__.py +2 -0
  102. numba_cuda/numba/cuda/kernels/reduction.py +3 -0
  103. numba_cuda/numba/cuda/kernels/transpose.py +3 -0
  104. numba_cuda/numba/cuda/libdevice.py +4 -0
  105. numba_cuda/numba/cuda/libdevicedecl.py +3 -0
  106. numba_cuda/numba/cuda/libdevicefuncs.py +3 -0
  107. numba_cuda/numba/cuda/libdeviceimpl.py +3 -0
  108. numba_cuda/numba/cuda/locks.py +3 -0
  109. numba_cuda/numba/cuda/lowering.py +59 -159
  110. numba_cuda/numba/cuda/mathimpl.py +5 -1
  111. numba_cuda/numba/cuda/memory_management/__init__.py +3 -0
  112. numba_cuda/numba/cuda/memory_management/memsys.cu +5 -0
  113. numba_cuda/numba/cuda/memory_management/memsys.cuh +5 -0
  114. numba_cuda/numba/cuda/memory_management/nrt.cu +5 -0
  115. numba_cuda/numba/cuda/memory_management/nrt.cuh +5 -0
  116. numba_cuda/numba/cuda/memory_management/nrt.py +48 -18
  117. numba_cuda/numba/cuda/misc/findlib.py +75 -0
  118. numba_cuda/numba/cuda/models.py +12 -1
  119. numba_cuda/numba/cuda/np/npdatetime_helpers.py +217 -0
  120. numba_cuda/numba/cuda/np/npyfuncs.py +1807 -0
  121. numba_cuda/numba/cuda/np/numpy_support.py +553 -0
  122. numba_cuda/numba/cuda/np/ufunc/ufuncbuilder.py +59 -0
  123. numba_cuda/numba/cuda/nvvmutils.py +4 -1
  124. numba_cuda/numba/cuda/printimpl.py +15 -1
  125. numba_cuda/numba/cuda/random.py +4 -1
  126. numba_cuda/numba/cuda/reshape_funcs.cu +5 -0
  127. numba_cuda/numba/cuda/serialize.py +4 -1
  128. numba_cuda/numba/cuda/simulator/__init__.py +4 -1
  129. numba_cuda/numba/cuda/simulator/_internal/__init__.py +3 -0
  130. numba_cuda/numba/cuda/simulator/_internal/cuda_bf16.py +2 -0
  131. numba_cuda/numba/cuda/simulator/api.py +4 -1
  132. numba_cuda/numba/cuda/simulator/bf16.py +3 -0
  133. numba_cuda/numba/cuda/simulator/compiler.py +7 -0
  134. numba_cuda/numba/cuda/simulator/cudadrv/__init__.py +3 -0
  135. numba_cuda/numba/cuda/simulator/cudadrv/devicearray.py +4 -1
  136. numba_cuda/numba/cuda/simulator/cudadrv/devices.py +3 -0
  137. numba_cuda/numba/cuda/simulator/cudadrv/driver.py +3 -0
  138. numba_cuda/numba/cuda/simulator/cudadrv/drvapi.py +3 -0
  139. numba_cuda/numba/cuda/simulator/cudadrv/dummyarray.py +3 -0
  140. numba_cuda/numba/cuda/simulator/cudadrv/error.py +4 -0
  141. numba_cuda/numba/cuda/simulator/cudadrv/libs.py +4 -0
  142. numba_cuda/numba/cuda/simulator/cudadrv/linkable_code.py +4 -0
  143. numba_cuda/numba/cuda/simulator/cudadrv/nvrtc.py +3 -0
  144. numba_cuda/numba/cuda/simulator/cudadrv/nvvm.py +3 -0
  145. numba_cuda/numba/cuda/simulator/cudadrv/runtime.py +3 -0
  146. numba_cuda/numba/cuda/simulator/dispatcher.py +4 -0
  147. numba_cuda/numba/cuda/simulator/kernel.py +3 -0
  148. numba_cuda/numba/cuda/simulator/kernelapi.py +4 -1
  149. numba_cuda/numba/cuda/simulator/memory_management/__init__.py +3 -0
  150. numba_cuda/numba/cuda/simulator/memory_management/nrt.py +17 -2
  151. numba_cuda/numba/cuda/simulator/reduction.py +3 -0
  152. numba_cuda/numba/cuda/simulator/vector_types.py +3 -0
  153. numba_cuda/numba/cuda/simulator_init.py +3 -0
  154. numba_cuda/numba/cuda/stubs.py +3 -0
  155. numba_cuda/numba/cuda/target.py +38 -17
  156. numba_cuda/numba/cuda/testing.py +7 -19
  157. numba_cuda/numba/cuda/tests/__init__.py +4 -1
  158. numba_cuda/numba/cuda/tests/cloudpickle_main_class.py +9 -0
  159. numba_cuda/numba/cuda/tests/complex_usecases.py +3 -0
  160. numba_cuda/numba/cuda/tests/core/serialize_usecases.py +3 -0
  161. numba_cuda/numba/cuda/tests/core/test_itanium_mangler.py +3 -0
  162. numba_cuda/numba/cuda/tests/core/test_serialize.py +7 -4
  163. numba_cuda/numba/cuda/tests/cudadrv/__init__.py +3 -0
  164. numba_cuda/numba/cuda/tests/cudadrv/test_array_attr.py +3 -0
  165. numba_cuda/numba/cuda/tests/cudadrv/test_context_stack.py +3 -0
  166. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_array_slicing.py +3 -0
  167. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_auto_context.py +3 -0
  168. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_devicerecord.py +4 -1
  169. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_driver.py +3 -0
  170. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_libraries.py +4 -1
  171. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_memory.py +3 -0
  172. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_ndarray.py +3 -0
  173. numba_cuda/numba/cuda/tests/cudadrv/test_deallocations.py +4 -1
  174. numba_cuda/numba/cuda/tests/cudadrv/test_detect.py +9 -3
  175. numba_cuda/numba/cuda/tests/cudadrv/test_emm_plugins.py +4 -1
  176. numba_cuda/numba/cuda/tests/cudadrv/test_events.py +3 -0
  177. numba_cuda/numba/cuda/tests/cudadrv/test_host_alloc.py +3 -0
  178. numba_cuda/numba/cuda/tests/cudadrv/test_init.py +3 -0
  179. numba_cuda/numba/cuda/tests/cudadrv/test_inline_ptx.py +3 -0
  180. numba_cuda/numba/cuda/tests/cudadrv/test_is_fp16.py +3 -0
  181. numba_cuda/numba/cuda/tests/cudadrv/test_linker.py +21 -2
  182. numba_cuda/numba/cuda/tests/cudadrv/test_managed_alloc.py +3 -0
  183. numba_cuda/numba/cuda/tests/cudadrv/test_module_callbacks.py +5 -1
  184. numba_cuda/numba/cuda/tests/cudadrv/test_nvjitlink.py +4 -1
  185. numba_cuda/numba/cuda/tests/cudadrv/test_nvrtc.py +3 -0
  186. numba_cuda/numba/cuda/tests/cudadrv/test_nvvm_driver.py +3 -0
  187. numba_cuda/numba/cuda/tests/cudadrv/test_pinned.py +3 -0
  188. numba_cuda/numba/cuda/tests/cudadrv/test_profiler.py +3 -0
  189. numba_cuda/numba/cuda/tests/cudadrv/test_ptds.py +4 -1
  190. numba_cuda/numba/cuda/tests/cudadrv/test_reset_device.py +3 -0
  191. numba_cuda/numba/cuda/tests/cudadrv/test_runtime.py +3 -0
  192. numba_cuda/numba/cuda/tests/cudadrv/test_select_device.py +3 -0
  193. numba_cuda/numba/cuda/tests/cudadrv/test_streams.py +3 -0
  194. numba_cuda/numba/cuda/tests/cudapy/__init__.py +3 -0
  195. numba_cuda/numba/cuda/tests/cudapy/cache_usecases.py +3 -0
  196. numba_cuda/numba/cuda/tests/cudapy/cache_with_cpu_usecases.py +3 -0
  197. numba_cuda/numba/cuda/tests/cudapy/cg_cache_usecases.py +3 -0
  198. numba_cuda/numba/cuda/tests/cudapy/extensions_usecases.py +4 -1
  199. numba_cuda/numba/cuda/tests/cudapy/recursion_usecases.py +3 -0
  200. numba_cuda/numba/cuda/tests/cudapy/test_alignment.py +3 -0
  201. numba_cuda/numba/cuda/tests/cudapy/test_array.py +5 -1
  202. numba_cuda/numba/cuda/tests/cudapy/test_array_alignment.py +3 -0
  203. numba_cuda/numba/cuda/tests/cudapy/test_array_args.py +3 -0
  204. numba_cuda/numba/cuda/tests/cudapy/test_array_methods.py +3 -0
  205. numba_cuda/numba/cuda/tests/cudapy/test_atomics.py +4 -1
  206. numba_cuda/numba/cuda/tests/cudapy/test_bfloat16.py +542 -2
  207. numba_cuda/numba/cuda/tests/cudapy/test_bfloat16_bindings.py +84 -1
  208. numba_cuda/numba/cuda/tests/cudapy/test_blackscholes.py +3 -0
  209. numba_cuda/numba/cuda/tests/cudapy/test_boolean.py +3 -0
  210. numba_cuda/numba/cuda/tests/cudapy/test_caching.py +4 -3
  211. numba_cuda/numba/cuda/tests/cudapy/test_casting.py +3 -0
  212. numba_cuda/numba/cuda/tests/cudapy/test_cffi.py +3 -0
  213. numba_cuda/numba/cuda/tests/cudapy/test_compiler.py +3 -0
  214. numba_cuda/numba/cuda/tests/cudapy/test_complex.py +4 -1
  215. numba_cuda/numba/cuda/tests/cudapy/test_complex_kernel.py +3 -0
  216. numba_cuda/numba/cuda/tests/cudapy/test_const_string.py +3 -0
  217. numba_cuda/numba/cuda/tests/cudapy/test_constmem.py +4 -1
  218. numba_cuda/numba/cuda/tests/cudapy/test_cooperative_groups.py +5 -3
  219. numba_cuda/numba/cuda/tests/cudapy/test_copy_propagate.py +130 -0
  220. numba_cuda/numba/cuda/tests/cudapy/test_cuda_array_interface.py +3 -0
  221. numba_cuda/numba/cuda/tests/cudapy/test_cuda_jit_no_types.py +3 -0
  222. numba_cuda/numba/cuda/tests/cudapy/test_datetime.py +4 -1
  223. numba_cuda/numba/cuda/tests/cudapy/test_debug.py +4 -1
  224. numba_cuda/numba/cuda/tests/cudapy/test_debuginfo.py +314 -3
  225. numba_cuda/numba/cuda/tests/cudapy/test_debuginfo_types.py +4 -1
  226. numba_cuda/numba/cuda/tests/cudapy/test_device_func.py +3 -0
  227. numba_cuda/numba/cuda/tests/cudapy/test_dispatcher.py +4 -1
  228. numba_cuda/numba/cuda/tests/cudapy/test_enums.py +3 -0
  229. numba_cuda/numba/cuda/tests/cudapy/test_errors.py +4 -1
  230. numba_cuda/numba/cuda/tests/cudapy/test_exception.py +4 -1
  231. numba_cuda/numba/cuda/tests/cudapy/test_extending.py +5 -1
  232. numba_cuda/numba/cuda/tests/cudapy/test_fastmath.py +3 -0
  233. numba_cuda/numba/cuda/tests/cudapy/test_forall.py +3 -0
  234. numba_cuda/numba/cuda/tests/cudapy/test_freevar.py +3 -0
  235. numba_cuda/numba/cuda/tests/cudapy/test_frexp_ldexp.py +3 -0
  236. numba_cuda/numba/cuda/tests/cudapy/test_globals.py +3 -0
  237. numba_cuda/numba/cuda/tests/cudapy/test_gufunc.py +3 -0
  238. numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scalar.py +3 -0
  239. numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scheduling.py +3 -0
  240. numba_cuda/numba/cuda/tests/cudapy/test_idiv.py +3 -0
  241. numba_cuda/numba/cuda/tests/cudapy/test_inline.py +21 -8
  242. numba_cuda/numba/cuda/tests/cudapy/test_inspect.py +3 -0
  243. numba_cuda/numba/cuda/tests/cudapy/test_intrinsics.py +3 -0
  244. numba_cuda/numba/cuda/tests/cudapy/test_ipc.py +3 -0
  245. numba_cuda/numba/cuda/tests/cudapy/test_ir_utils.py +13 -37
  246. numba_cuda/numba/cuda/tests/cudapy/test_iterators.py +3 -0
  247. numba_cuda/numba/cuda/tests/cudapy/test_lang.py +3 -0
  248. numba_cuda/numba/cuda/tests/cudapy/test_laplace.py +4 -1
  249. numba_cuda/numba/cuda/tests/cudapy/test_libdevice.py +3 -0
  250. numba_cuda/numba/cuda/tests/cudapy/test_lineinfo.py +3 -0
  251. numba_cuda/numba/cuda/tests/cudapy/test_localmem.py +3 -0
  252. numba_cuda/numba/cuda/tests/cudapy/test_mandel.py +3 -0
  253. numba_cuda/numba/cuda/tests/cudapy/test_math.py +4 -1
  254. numba_cuda/numba/cuda/tests/cudapy/test_matmul.py +4 -1
  255. numba_cuda/numba/cuda/tests/cudapy/test_minmax.py +3 -0
  256. numba_cuda/numba/cuda/tests/cudapy/test_montecarlo.py +3 -0
  257. numba_cuda/numba/cuda/tests/cudapy/test_multigpu.py +3 -0
  258. numba_cuda/numba/cuda/tests/cudapy/test_multiprocessing.py +3 -0
  259. numba_cuda/numba/cuda/tests/cudapy/test_multithreads.py +3 -0
  260. numba_cuda/numba/cuda/tests/cudapy/test_nondet.py +3 -0
  261. numba_cuda/numba/cuda/tests/cudapy/test_operator.py +4 -1
  262. numba_cuda/numba/cuda/tests/cudapy/test_optimization.py +3 -0
  263. numba_cuda/numba/cuda/tests/cudapy/test_overload.py +3 -0
  264. numba_cuda/numba/cuda/tests/cudapy/test_powi.py +3 -0
  265. numba_cuda/numba/cuda/tests/cudapy/test_print.py +23 -0
  266. numba_cuda/numba/cuda/tests/cudapy/test_py2_div_issue.py +3 -0
  267. numba_cuda/numba/cuda/tests/cudapy/test_random.py +3 -0
  268. numba_cuda/numba/cuda/tests/cudapy/test_record_dtype.py +4 -1
  269. numba_cuda/numba/cuda/tests/cudapy/test_recursion.py +3 -0
  270. numba_cuda/numba/cuda/tests/cudapy/test_reduction.py +4 -1
  271. numba_cuda/numba/cuda/tests/cudapy/test_retrieve_autoconverted_arrays.py +3 -0
  272. numba_cuda/numba/cuda/tests/cudapy/test_serialize.py +4 -1
  273. numba_cuda/numba/cuda/tests/cudapy/test_slicing.py +3 -0
  274. numba_cuda/numba/cuda/tests/cudapy/test_sm.py +4 -1
  275. numba_cuda/numba/cuda/tests/cudapy/test_sm_creation.py +3 -0
  276. numba_cuda/numba/cuda/tests/cudapy/test_ssa.py +453 -0
  277. numba_cuda/numba/cuda/tests/cudapy/test_stream_api.py +3 -0
  278. numba_cuda/numba/cuda/tests/cudapy/test_sync.py +4 -1
  279. numba_cuda/numba/cuda/tests/cudapy/test_transpose.py +3 -0
  280. numba_cuda/numba/cuda/tests/cudapy/test_typeinfer.py +538 -0
  281. numba_cuda/numba/cuda/tests/cudapy/test_ufuncs.py +266 -2
  282. numba_cuda/numba/cuda/tests/cudapy/test_userexc.py +4 -1
  283. numba_cuda/numba/cuda/tests/cudapy/test_vector_type.py +4 -1
  284. numba_cuda/numba/cuda/tests/cudapy/test_vectorize.py +3 -0
  285. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_complex.py +3 -0
  286. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_decor.py +115 -6
  287. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_device.py +3 -0
  288. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_scalar_arg.py +3 -0
  289. numba_cuda/numba/cuda/tests/cudapy/test_warning.py +4 -1
  290. numba_cuda/numba/cuda/tests/cudapy/test_warp_ops.py +4 -1
  291. numba_cuda/numba/cuda/tests/cudasim/__init__.py +3 -0
  292. numba_cuda/numba/cuda/tests/cudasim/support.py +3 -0
  293. numba_cuda/numba/cuda/tests/cudasim/test_cudasim_issues.py +3 -0
  294. numba_cuda/numba/cuda/tests/data/__init__.py +2 -0
  295. numba_cuda/numba/cuda/tests/data/cta_barrier.cu +5 -0
  296. numba_cuda/numba/cuda/tests/data/cuda_include.cu +5 -0
  297. numba_cuda/numba/cuda/tests/data/error.cu +5 -0
  298. numba_cuda/numba/cuda/tests/data/include/add.cuh +5 -0
  299. numba_cuda/numba/cuda/tests/data/jitlink.cu +5 -0
  300. numba_cuda/numba/cuda/tests/data/warn.cu +5 -0
  301. numba_cuda/numba/cuda/tests/doc_examples/__init__.py +3 -0
  302. numba_cuda/numba/cuda/tests/doc_examples/ffi/__init__.py +2 -0
  303. numba_cuda/numba/cuda/tests/doc_examples/ffi/functions.cu +5 -0
  304. numba_cuda/numba/cuda/tests/doc_examples/ffi/include/mul.cuh +5 -0
  305. numba_cuda/numba/cuda/tests/doc_examples/ffi/saxpy.cu +5 -0
  306. numba_cuda/numba/cuda/tests/doc_examples/test_cg.py +3 -2
  307. numba_cuda/numba/cuda/tests/doc_examples/test_cpointer.py +3 -0
  308. numba_cuda/numba/cuda/tests/doc_examples/test_cpu_gpu_compat.py +3 -0
  309. numba_cuda/numba/cuda/tests/doc_examples/test_ffi.py +6 -2
  310. numba_cuda/numba/cuda/tests/doc_examples/test_laplace.py +3 -2
  311. numba_cuda/numba/cuda/tests/doc_examples/test_matmul.py +3 -0
  312. numba_cuda/numba/cuda/tests/doc_examples/test_montecarlo.py +3 -0
  313. numba_cuda/numba/cuda/tests/doc_examples/test_random.py +3 -0
  314. numba_cuda/numba/cuda/tests/doc_examples/test_reduction.py +3 -0
  315. numba_cuda/numba/cuda/tests/doc_examples/test_sessionize.py +3 -2
  316. numba_cuda/numba/cuda/tests/doc_examples/test_ufunc.py +3 -0
  317. numba_cuda/numba/cuda/tests/doc_examples/test_vecadd.py +3 -0
  318. numba_cuda/numba/cuda/tests/enum_usecases.py +3 -0
  319. numba_cuda/numba/cuda/tests/nocuda/__init__.py +3 -0
  320. numba_cuda/numba/cuda/tests/nocuda/test_dummyarray.py +3 -0
  321. numba_cuda/numba/cuda/tests/nocuda/test_function_resolution.py +3 -0
  322. numba_cuda/numba/cuda/tests/nocuda/test_import.py +6 -1
  323. numba_cuda/numba/cuda/tests/nocuda/test_library_lookup.py +27 -12
  324. numba_cuda/numba/cuda/tests/nocuda/test_nvvm.py +3 -0
  325. numba_cuda/numba/cuda/tests/nrt/__init__.py +3 -0
  326. numba_cuda/numba/cuda/tests/nrt/test_nrt.py +5 -1
  327. numba_cuda/numba/cuda/tests/nrt/test_nrt_refct.py +3 -0
  328. numba_cuda/numba/cuda/tests/support.py +58 -15
  329. numba_cuda/numba/cuda/tests/test_binary_generation/Makefile +3 -0
  330. numba_cuda/numba/cuda/tests/test_binary_generation/generate_raw_ltoir.py +2 -1
  331. numba_cuda/numba/cuda/tests/test_binary_generation/nrt_extern.cu +5 -0
  332. numba_cuda/numba/cuda/tests/test_binary_generation/test_device_functions.cu +5 -0
  333. numba_cuda/numba/cuda/tests/test_binary_generation/undefined_extern.cu +5 -0
  334. numba_cuda/numba/cuda/tests/test_tracing.py +200 -0
  335. numba_cuda/numba/cuda/types.py +59 -0
  336. numba_cuda/numba/cuda/typing/__init__.py +12 -1
  337. numba_cuda/numba/cuda/typing/cffi_utils.py +55 -0
  338. numba_cuda/numba/cuda/typing/context.py +751 -0
  339. numba_cuda/numba/cuda/typing/enumdecl.py +74 -0
  340. numba_cuda/numba/cuda/typing/npydecl.py +658 -0
  341. numba_cuda/numba/cuda/typing/templates.py +10 -14
  342. numba_cuda/numba/cuda/ufuncs.py +6 -3
  343. numba_cuda/numba/cuda/utils.py +9 -112
  344. numba_cuda/numba/cuda/vector_types.py +3 -0
  345. numba_cuda/numba/cuda/vectorizers.py +3 -0
  346. {numba_cuda-0.19.0.dist-info → numba_cuda-0.20.0.dist-info}/METADATA +6 -2
  347. numba_cuda-0.20.0.dist-info/RECORD +357 -0
  348. {numba_cuda-0.19.0.dist-info → numba_cuda-0.20.0.dist-info}/licenses/LICENSE +1 -0
  349. numba_cuda-0.20.0.dist-info/licenses/LICENSE.numba +24 -0
  350. numba_cuda/numba/cuda/tests/cudadrv/test_mvc.py +0 -57
  351. numba_cuda-0.19.0.dist-info/RECORD +0 -301
  352. {numba_cuda-0.19.0.dist-info → numba_cuda-0.20.0.dist-info}/WHEEL +0 -0
  353. {numba_cuda-0.19.0.dist-info → numba_cuda-0.20.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,751 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: BSD-2-Clause
3
+
4
+ from collections import defaultdict
5
+ from collections.abc import Sequence
6
+ import types as pytypes
7
+ import weakref
8
+ import threading
9
+ import contextlib
10
+ import operator
11
+
12
+ from numba.core import types, errors
13
+ from numba.core.typeconv import Conversion, rules
14
+ from numba.core.typing.typeof import typeof, Purpose
15
+ from numba.core.typing import templates
16
+ from numba.cuda import utils
17
+ from numba.cuda.utils import order_by_target_specificity
18
+
19
+
20
+ class Rating(object):
21
+ __slots__ = "promote", "safe_convert", "unsafe_convert"
22
+
23
+ def __init__(self):
24
+ self.promote = 0
25
+ self.safe_convert = 0
26
+ self.unsafe_convert = 0
27
+
28
+ def astuple(self):
29
+ """Returns a tuple suitable for comparing with the worse situation
30
+ start first.
31
+ """
32
+ return (self.unsafe_convert, self.safe_convert, self.promote)
33
+
34
+ def __add__(self, other):
35
+ if type(self) is not type(other):
36
+ return NotImplemented
37
+ rsum = Rating()
38
+ rsum.promote = self.promote + other.promote
39
+ rsum.safe_convert = self.safe_convert + other.safe_convert
40
+ rsum.unsafe_convert = self.unsafe_convert + other.unsafe_convert
41
+ return rsum
42
+
43
+
44
+ class CallStack(Sequence):
45
+ """
46
+ A compile-time call stack
47
+ """
48
+
49
+ def __init__(self):
50
+ self._stack = []
51
+ self._lock = threading.RLock()
52
+
53
+ def __getitem__(self, index):
54
+ """
55
+ Returns item in the stack where index=0 is the top and index=1 is
56
+ the second item from the top.
57
+ """
58
+ return self._stack[len(self) - index - 1]
59
+
60
+ def __len__(self):
61
+ return len(self._stack)
62
+
63
+ @contextlib.contextmanager
64
+ def register(self, target, typeinfer, func_id, args):
65
+ # guard compiling the same function with the same signature
66
+ if self.match(func_id.func, args):
67
+ msg = "compiler re-entrant to the same function signature"
68
+ raise errors.NumbaRuntimeError(msg)
69
+ self._lock.acquire()
70
+ self._stack.append(CallFrame(target, typeinfer, func_id, args))
71
+ try:
72
+ yield
73
+ finally:
74
+ self._stack.pop()
75
+ self._lock.release()
76
+
77
+ def finditer(self, py_func):
78
+ """
79
+ Yields frame that matches the function object starting from the top
80
+ of stack.
81
+ """
82
+ for frame in self:
83
+ if frame.func_id.func is py_func:
84
+ yield frame
85
+
86
+ def findfirst(self, py_func):
87
+ """
88
+ Returns the first result from `.finditer(py_func)`; or None if no match.
89
+ """
90
+ try:
91
+ return next(self.finditer(py_func))
92
+ except StopIteration:
93
+ return
94
+
95
+ def match(self, py_func, args):
96
+ """
97
+ Returns first function that matches *py_func* and the arguments types in
98
+ *args*; or, None if no match.
99
+ """
100
+ for frame in self.finditer(py_func):
101
+ if frame.args == args:
102
+ return frame
103
+
104
+
105
+ class CallFrame(object):
106
+ """
107
+ A compile-time call frame
108
+ """
109
+
110
+ def __init__(self, target, typeinfer, func_id, args):
111
+ self.typeinfer = typeinfer
112
+ self.func_id = func_id
113
+ self.args = args
114
+ self.target = target
115
+ self._inferred_retty = set()
116
+
117
+ def __repr__(self):
118
+ return "CallFrame({}, {})".format(self.func_id, self.args)
119
+
120
+ def add_return_type(self, return_type):
121
+ """Add *return_type* to the list of inferred return-types.
122
+ If there are too many, raise `TypingError`.
123
+ """
124
+ # The maximum limit is picked arbitrarily.
125
+ # Don't think that this needs to be user configurable.
126
+ RETTY_LIMIT = 16
127
+ self._inferred_retty.add(return_type)
128
+ if len(self._inferred_retty) >= RETTY_LIMIT:
129
+ m = "Return type of recursive function does not converge"
130
+ raise errors.TypingError(m)
131
+
132
+
133
+ class BaseContext(object):
134
+ """A typing context for storing function typing constrain template."""
135
+
136
+ def __init__(self):
137
+ # A list of installed registries
138
+ self._registries = {}
139
+ # Typing declarations extracted from the registries or other sources
140
+ self._functions = defaultdict(list)
141
+ self._attributes = defaultdict(list)
142
+ self._globals = utils.UniqueDict()
143
+ self.tm = rules.default_type_manager
144
+ self.callstack = CallStack()
145
+
146
+ # Initialize
147
+ self.init()
148
+
149
+ def init(self):
150
+ """
151
+ Initialize the typing context. Can be overridden by subclasses.
152
+ """
153
+
154
+ def refresh(self):
155
+ """
156
+ Refresh context with new declarations from known registries.
157
+ Useful for third-party extensions.
158
+ """
159
+ self.load_additional_registries()
160
+ # Some extensions may have augmented the builtin registry
161
+ self._load_builtins()
162
+
163
+ def explain_function_type(self, func):
164
+ """
165
+ Returns a string description of the type of a function
166
+ """
167
+ desc = []
168
+ defns = []
169
+ param = False
170
+ if isinstance(func, types.Callable):
171
+ sigs, param = func.get_call_signatures()
172
+ defns.extend(sigs)
173
+
174
+ elif func in self._functions:
175
+ for tpl in self._functions[func]:
176
+ param = param or hasattr(tpl, "generic")
177
+ defns.extend(getattr(tpl, "cases", []))
178
+
179
+ else:
180
+ msg = "No type info available for {func!r} as a callable."
181
+ desc.append(msg.format(func=func))
182
+
183
+ if defns:
184
+ desc = ["Known signatures:"]
185
+ for sig in defns:
186
+ desc.append(" * {0}".format(sig))
187
+
188
+ return "\n".join(desc)
189
+
190
+ def resolve_function_type(self, func, args, kws):
191
+ """
192
+ Resolve function type *func* for argument types *args* and *kws*.
193
+ A signature is returned.
194
+ """
195
+ # Prefer user definition first
196
+ try:
197
+ res = self._resolve_user_function_type(func, args, kws)
198
+ except errors.TypingError as e:
199
+ # Capture any typing error
200
+ last_exception = e
201
+ res = None
202
+ else:
203
+ last_exception = None
204
+
205
+ # Return early we know there's a working user function
206
+ if res is not None:
207
+ return res
208
+
209
+ # Check builtin functions
210
+ res = self._resolve_builtin_function_type(func, args, kws)
211
+
212
+ # Re-raise last_exception if no function type has been found
213
+ if res is None and last_exception is not None:
214
+ raise last_exception
215
+
216
+ return res
217
+
218
+ def _resolve_builtin_function_type(self, func, args, kws):
219
+ # NOTE: we should reduce usage of this
220
+ if func in self._functions:
221
+ # Note: Duplicating code with types.Function.get_call_type().
222
+ # *defns* are CallTemplates.
223
+ defns = self._functions[func]
224
+ for defn in defns:
225
+ for support_literals in [True, False]:
226
+ if support_literals:
227
+ res = defn.apply(args, kws)
228
+ else:
229
+ fixedargs = [types.unliteral(a) for a in args]
230
+ res = defn.apply(fixedargs, kws)
231
+ if res is not None:
232
+ return res
233
+
234
+ def _resolve_user_function_type(self, func, args, kws, literals=None):
235
+ # It's not a known function type, perhaps it's a global?
236
+ functy = self._lookup_global(func)
237
+ if functy is not None:
238
+ func = functy
239
+
240
+ if isinstance(func, types.Type):
241
+ # If it's a type, it may support a __call__ method
242
+ func_type = self.resolve_getattr(func, "__call__")
243
+ if func_type is not None:
244
+ # The function has a __call__ method, type its call.
245
+ return self.resolve_function_type(func_type, args, kws)
246
+
247
+ if isinstance(func, types.Callable):
248
+ # XXX fold this into the __call__ attribute logic?
249
+ return func.get_call_type(self, args, kws)
250
+
251
+ def _get_attribute_templates(self, typ):
252
+ """
253
+ Get matching AttributeTemplates for the Numba type.
254
+ """
255
+ if typ in self._attributes:
256
+ for attrinfo in self._attributes[typ]:
257
+ yield attrinfo
258
+ else:
259
+ for cls in type(typ).__mro__:
260
+ if cls in self._attributes:
261
+ for attrinfo in self._attributes[cls]:
262
+ yield attrinfo
263
+
264
+ def resolve_getattr(self, typ, attr):
265
+ """
266
+ Resolve getting the attribute *attr* (a string) on the Numba type.
267
+ The attribute's type is returned, or None if resolution failed.
268
+ """
269
+
270
+ def core(typ):
271
+ out = self.find_matching_getattr_template(typ, attr)
272
+ if out:
273
+ return out["return_type"]
274
+
275
+ out = core(typ)
276
+ if out is not None:
277
+ return out
278
+
279
+ # Try again without literals
280
+ out = core(types.unliteral(typ))
281
+ if out is not None:
282
+ return out
283
+
284
+ if isinstance(typ, types.Module):
285
+ attrty = self.resolve_module_constants(typ, attr)
286
+ if attrty is not None:
287
+ return attrty
288
+
289
+ def find_matching_getattr_template(self, typ, attr):
290
+ templates = list(self._get_attribute_templates(typ))
291
+
292
+ # get the order in which to try templates
293
+ from numba.core.target_extension import get_local_target # circular
294
+
295
+ target_hw = get_local_target(self)
296
+ order = order_by_target_specificity(target_hw, templates, fnkey=attr)
297
+
298
+ for template in order:
299
+ return_type = template.resolve(typ, attr)
300
+ if return_type is not None:
301
+ return {
302
+ "template": template,
303
+ "return_type": return_type,
304
+ }
305
+
306
+ def resolve_setattr(self, target, attr, value):
307
+ """
308
+ Resolve setting the attribute *attr* (a string) on the *target* type
309
+ to the given *value* type.
310
+ A function signature is returned, or None if resolution failed.
311
+ """
312
+ for attrinfo in self._get_attribute_templates(target):
313
+ expectedty = attrinfo.resolve(target, attr)
314
+ # NOTE: convertibility from *value* to *expectedty* is left to
315
+ # the caller.
316
+ if expectedty is not None:
317
+ return templates.signature(types.void, target, expectedty)
318
+
319
+ def resolve_static_getitem(self, value, index):
320
+ assert not isinstance(index, types.Type), index
321
+ args = value, index
322
+ kws = ()
323
+ return self.resolve_function_type("static_getitem", args, kws)
324
+
325
+ def resolve_static_setitem(self, target, index, value):
326
+ assert not isinstance(index, types.Type), index
327
+ args = target, index, value
328
+ kws = {}
329
+ return self.resolve_function_type("static_setitem", args, kws)
330
+
331
+ def resolve_setitem(self, target, index, value):
332
+ assert isinstance(index, types.Type), index
333
+ fnty = self.resolve_value_type(operator.setitem)
334
+ sig = fnty.get_call_type(self, (target, index, value), {})
335
+ return sig
336
+
337
+ def resolve_delitem(self, target, index):
338
+ args = target, index
339
+ kws = {}
340
+ fnty = self.resolve_value_type(operator.delitem)
341
+ sig = fnty.get_call_type(self, args, kws)
342
+ return sig
343
+
344
+ def resolve_module_constants(self, typ, attr):
345
+ """
346
+ Resolve module-level global constants.
347
+ Return None or the attribute type
348
+ """
349
+ assert isinstance(typ, types.Module)
350
+ attrval = getattr(typ.pymod, attr)
351
+ try:
352
+ return self.resolve_value_type(attrval)
353
+ except ValueError:
354
+ pass
355
+
356
+ def resolve_value_type(self, val):
357
+ """
358
+ Return the numba type of a Python value that is being used
359
+ as a runtime constant.
360
+ ValueError is raised for unsupported types.
361
+ """
362
+ try:
363
+ ty = typeof(val, Purpose.constant)
364
+ except ValueError as e:
365
+ # Make sure the exception doesn't hold a reference to the user
366
+ # value.
367
+ typeof_exc = utils.erase_traceback(e)
368
+ else:
369
+ return ty
370
+
371
+ if isinstance(val, types.ExternalFunction):
372
+ return val
373
+
374
+ # Try to look up target specific typing information
375
+ ty = self._get_global_type(val)
376
+ if ty is not None:
377
+ return ty
378
+
379
+ raise typeof_exc
380
+
381
+ def resolve_value_type_prefer_literal(self, value):
382
+ """Resolve value type and prefer Literal types whenever possible."""
383
+ lit = types.maybe_literal(value)
384
+ if lit is None:
385
+ return self.resolve_value_type(value)
386
+ else:
387
+ return lit
388
+
389
+ def _get_global_type(self, gv):
390
+ ty = self._lookup_global(gv)
391
+ if ty is not None:
392
+ return ty
393
+ if isinstance(gv, pytypes.ModuleType):
394
+ return types.Module(gv)
395
+
396
+ def _load_builtins(self):
397
+ # Initialize declarations
398
+ from numba.core.typing import builtins, arraydecl, npdatetime # noqa: F401, E501
399
+ from numba.core.typing import ctypes_utils, bufproto # noqa: F401, E501
400
+ from numba.core.unsafe import eh # noqa: F401
401
+
402
+ self.install_registry(templates.builtin_registry)
403
+
404
+ def load_additional_registries(self):
405
+ """
406
+ Load target-specific registries. Can be overridden by subclasses.
407
+ """
408
+
409
+ def install_registry(self, registry):
410
+ """
411
+ Install a *registry* (a templates.Registry instance) of function,
412
+ attribute and global declarations.
413
+ """
414
+ try:
415
+ loader = self._registries[registry]
416
+ except KeyError:
417
+ loader = templates.RegistryLoader(registry)
418
+ self._registries[registry] = loader
419
+
420
+ from numba.core.target_extension import (
421
+ get_local_target,
422
+ resolve_target_str,
423
+ )
424
+
425
+ current_target = get_local_target(self)
426
+
427
+ def is_for_this_target(ftcls):
428
+ metadata = getattr(ftcls, "metadata", None)
429
+ if metadata is None:
430
+ return True
431
+
432
+ target_str = metadata.get("target")
433
+ if target_str is None:
434
+ return True
435
+
436
+ # There may be pending registrations for nonexistent targets.
437
+ # Ideally it would be impossible to leave a registration pending
438
+ # for an invalid target, but in practice this is exceedingly
439
+ # difficult to guard against - many things are registered at import
440
+ # time, and eagerly reporting an error when registering for invalid
441
+ # targets would require that all target registration code is
442
+ # executed prior to all typing registrations during the import
443
+ # process; attempting to enforce this would impose constraints on
444
+ # execution order during import that would be very difficult to
445
+ # resolve and maintain in the presence of typical code maintenance.
446
+ # Furthermore, these constraints would be imposed not only on
447
+ # Numba internals, but also on its dependents.
448
+ #
449
+ # Instead of that enforcement, we simply catch any occurrences of
450
+ # registrations for targets that don't exist, and report that
451
+ # they're not for this target. They will then not be encountered
452
+ # again during future typing context refreshes (because the
453
+ # loader's new registrations are a stream_list that doesn't yield
454
+ # previously-yielded items).
455
+ try:
456
+ ft_target = resolve_target_str(target_str)
457
+ except errors.NonexistentTargetError:
458
+ return False
459
+
460
+ return current_target.inherits_from(ft_target)
461
+
462
+ for ftcls in loader.new_registrations("functions"):
463
+ if not is_for_this_target(ftcls):
464
+ continue
465
+ self.insert_function(ftcls(self))
466
+ for ftcls in loader.new_registrations("attributes"):
467
+ if not is_for_this_target(ftcls):
468
+ continue
469
+ self.insert_attributes(ftcls(self))
470
+ for gv, gty in loader.new_registrations("globals"):
471
+ existing = self._lookup_global(gv)
472
+ if existing is None:
473
+ self.insert_global(gv, gty)
474
+ else:
475
+ # A type was already inserted, see if we can add to it
476
+ newty = existing.augment(gty)
477
+ if newty is None:
478
+ raise TypeError(
479
+ "cannot augment %s with %s" % (existing, gty)
480
+ )
481
+ self._remove_global(gv)
482
+ self._insert_global(gv, newty)
483
+
484
+ def _lookup_global(self, gv):
485
+ """
486
+ Look up the registered type for global value *gv*.
487
+ """
488
+ try:
489
+ gv = weakref.ref(gv)
490
+ except TypeError:
491
+ pass
492
+ try:
493
+ return self._globals.get(gv, None)
494
+ except TypeError:
495
+ # Unhashable type
496
+ return None
497
+
498
+ def _insert_global(self, gv, gty):
499
+ """
500
+ Register type *gty* for value *gv*. Only a weak reference
501
+ to *gv* is kept, if possible.
502
+ """
503
+
504
+ def on_disposal(wr, pop=self._globals.pop):
505
+ # pop() is pre-looked up to avoid a crash late at shutdown on 3.5
506
+ # (https://bugs.python.org/issue25217)
507
+ pop(wr)
508
+
509
+ try:
510
+ gv = weakref.ref(gv, on_disposal)
511
+ except TypeError:
512
+ pass
513
+ self._globals[gv] = gty
514
+
515
+ def _remove_global(self, gv):
516
+ """
517
+ Remove the registered type for global value *gv*.
518
+ """
519
+ try:
520
+ gv = weakref.ref(gv)
521
+ except TypeError:
522
+ pass
523
+ del self._globals[gv]
524
+
525
+ def insert_global(self, gv, gty):
526
+ self._insert_global(gv, gty)
527
+
528
+ def insert_attributes(self, at):
529
+ key = at.key
530
+ self._attributes[key].append(at)
531
+
532
+ def insert_function(self, ft):
533
+ key = ft.key
534
+ self._functions[key].append(ft)
535
+
536
+ def insert_user_function(self, fn, ft):
537
+ """Insert a user function.
538
+
539
+ Args
540
+ ----
541
+ - fn:
542
+ object used as callee
543
+ - ft:
544
+ function template
545
+ """
546
+ self._insert_global(fn, types.Function(ft))
547
+
548
+ def can_convert(self, fromty, toty):
549
+ """
550
+ Check whether conversion is possible from *fromty* to *toty*.
551
+ If successful, return a numba.typeconv.Conversion instance;
552
+ otherwise None is returned.
553
+ """
554
+ if fromty == toty:
555
+ return Conversion.exact
556
+ else:
557
+ # First check with the type manager (some rules are registered
558
+ # at startup there, see numba.typeconv.rules)
559
+ conv = self.tm.check_compatible(fromty, toty)
560
+ if conv is not None:
561
+ return conv
562
+
563
+ # Fall back on type-specific rules
564
+ forward = fromty.can_convert_to(self, toty)
565
+ backward = toty.can_convert_from(self, fromty)
566
+ if backward is None:
567
+ return forward
568
+ elif forward is None:
569
+ return backward
570
+ else:
571
+ return min(forward, backward)
572
+
573
+ def _rate_arguments(
574
+ self,
575
+ actualargs,
576
+ formalargs,
577
+ unsafe_casting=True,
578
+ exact_match_required=False,
579
+ ):
580
+ """
581
+ Rate the actual arguments for compatibility against the formal
582
+ arguments. A Rating instance is returned, or None if incompatible.
583
+ """
584
+ if len(actualargs) != len(formalargs):
585
+ return None
586
+ rate = Rating()
587
+ for actual, formal in zip(actualargs, formalargs):
588
+ conv = self.can_convert(actual, formal)
589
+ if conv is None:
590
+ return None
591
+ elif not unsafe_casting and conv >= Conversion.unsafe:
592
+ return None
593
+ elif exact_match_required and conv != Conversion.exact:
594
+ return None
595
+
596
+ if conv == Conversion.promote:
597
+ rate.promote += 1
598
+ elif conv == Conversion.safe:
599
+ rate.safe_convert += 1
600
+ elif conv == Conversion.unsafe:
601
+ rate.unsafe_convert += 1
602
+ elif conv == Conversion.exact:
603
+ pass
604
+ else:
605
+ raise AssertionError("unreachable", conv)
606
+
607
+ return rate
608
+
609
+ def install_possible_conversions(self, actualargs, formalargs):
610
+ """
611
+ Install possible conversions from the actual argument types to
612
+ the formal argument types in the C++ type manager.
613
+ Return True if all arguments can be converted.
614
+ """
615
+ if len(actualargs) != len(formalargs):
616
+ return False
617
+ for actual, formal in zip(actualargs, formalargs):
618
+ if self.tm.check_compatible(actual, formal) is not None:
619
+ # This conversion is already known
620
+ continue
621
+ conv = self.can_convert(actual, formal)
622
+ if conv is None:
623
+ return False
624
+ assert conv is not Conversion.exact
625
+ self.tm.set_compatible(actual, formal, conv)
626
+ return True
627
+
628
+ def resolve_overload(
629
+ self,
630
+ key,
631
+ cases,
632
+ args,
633
+ kws,
634
+ allow_ambiguous=True,
635
+ unsafe_casting=True,
636
+ exact_match_required=False,
637
+ ):
638
+ """
639
+ Given actual *args* and *kws*, find the best matching
640
+ signature in *cases*, or None if none matches.
641
+ *key* is used for error reporting purposes.
642
+ If *allow_ambiguous* is False, a tie in the best matches
643
+ will raise an error.
644
+ If *unsafe_casting* is False, unsafe casting is forbidden.
645
+ """
646
+ assert not kws, "Keyword arguments are not supported, yet"
647
+ options = {
648
+ "unsafe_casting": unsafe_casting,
649
+ "exact_match_required": exact_match_required,
650
+ }
651
+ # Rate each case
652
+ candidates = []
653
+ for case in cases:
654
+ if len(args) == len(case.args):
655
+ rating = self._rate_arguments(args, case.args, **options)
656
+ if rating is not None:
657
+ candidates.append((rating.astuple(), case))
658
+
659
+ # Find the best case
660
+ candidates.sort(key=lambda i: i[0])
661
+ if candidates:
662
+ best_rate, best = candidates[0]
663
+ if not allow_ambiguous:
664
+ # Find whether there is a tie and if so, raise an error
665
+ tied = []
666
+ for rate, case in candidates:
667
+ if rate != best_rate:
668
+ break
669
+ tied.append(case)
670
+ if len(tied) > 1:
671
+ args = (key, args, "\n".join(map(str, tied)))
672
+ msg = "Ambiguous overloading for %s %s:\n%s" % args
673
+ raise TypeError(msg)
674
+ # Simply return the best matching candidate in order.
675
+ # If there is a tie, since list.sort() is stable, the first case
676
+ # in the original order is returned.
677
+ # (this can happen if e.g. a function template exposes
678
+ # (int32, int32) -> int32 and (int64, int64) -> int64,
679
+ # and you call it with (int16, int16) arguments)
680
+ return best
681
+
682
+ def unify_types(self, *typelist):
683
+ # Sort the type list according to bit width before doing
684
+ # pairwise unification (with thanks to aterrel).
685
+ def keyfunc(obj):
686
+ """Uses bitwidth to order numeric-types.
687
+ Fallback to stable, deterministic sort.
688
+ """
689
+ return getattr(obj, "bitwidth", 0)
690
+
691
+ typelist = sorted(typelist, key=keyfunc)
692
+ unified = typelist[0]
693
+ for tp in typelist[1:]:
694
+ unified = self.unify_pairs(unified, tp)
695
+ if unified is None:
696
+ break
697
+ return unified
698
+
699
+ def unify_pairs(self, first, second):
700
+ """
701
+ Try to unify the two given types. A third type is returned,
702
+ or None in case of failure.
703
+ """
704
+ if first == second:
705
+ return first
706
+
707
+ if first is types.undefined:
708
+ return second
709
+ elif second is types.undefined:
710
+ return first
711
+
712
+ # Types with special unification rules
713
+ unified = first.unify(self, second)
714
+ if unified is not None:
715
+ return unified
716
+
717
+ unified = second.unify(self, first)
718
+ if unified is not None:
719
+ return unified
720
+
721
+ # Other types with simple conversion rules
722
+ conv = self.can_convert(fromty=first, toty=second)
723
+ if conv is not None and conv <= Conversion.safe:
724
+ # Can convert from first to second
725
+ return second
726
+
727
+ conv = self.can_convert(fromty=second, toty=first)
728
+ if conv is not None and conv <= Conversion.safe:
729
+ # Can convert from second to first
730
+ return first
731
+
732
+ if isinstance(first, types.Literal) or isinstance(
733
+ second, types.Literal
734
+ ):
735
+ first = types.unliteral(first)
736
+ second = types.unliteral(second)
737
+ return self.unify_pairs(first, second)
738
+
739
+ # Cannot unify
740
+ return None
741
+
742
+
743
+ class Context(BaseContext):
744
+ # This list will be extended to include all the registries
745
+ # that are needed for CUDA
746
+ def load_additional_registries(self):
747
+ from . import (
748
+ npydecl,
749
+ )
750
+
751
+ self.install_registry(npydecl.registry)