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.
- _numba_cuda_redirector.pth +4 -0
- _numba_cuda_redirector.py +89 -0
- numba_cuda/VERSION +1 -0
- numba_cuda/__init__.py +6 -0
- numba_cuda/_version.py +11 -0
- numba_cuda/numba/cuda/__init__.py +70 -0
- numba_cuda/numba/cuda/_internal/cuda_bf16.py +16394 -0
- numba_cuda/numba/cuda/_internal/cuda_fp16.py +8112 -0
- numba_cuda/numba/cuda/api.py +580 -0
- numba_cuda/numba/cuda/api_util.py +76 -0
- numba_cuda/numba/cuda/args.py +72 -0
- numba_cuda/numba/cuda/bf16.py +397 -0
- numba_cuda/numba/cuda/cache_hints.py +287 -0
- numba_cuda/numba/cuda/cext/__init__.py +2 -0
- numba_cuda/numba/cuda/cext/_devicearray.cpp +159 -0
- numba_cuda/numba/cuda/cext/_devicearray.cpython-313-aarch64-linux-gnu.so +0 -0
- numba_cuda/numba/cuda/cext/_devicearray.h +29 -0
- numba_cuda/numba/cuda/cext/_dispatcher.cpp +1098 -0
- numba_cuda/numba/cuda/cext/_dispatcher.cpython-313-aarch64-linux-gnu.so +0 -0
- numba_cuda/numba/cuda/cext/_hashtable.cpp +532 -0
- numba_cuda/numba/cuda/cext/_hashtable.h +135 -0
- numba_cuda/numba/cuda/cext/_helperlib.c +71 -0
- numba_cuda/numba/cuda/cext/_helperlib.cpython-313-aarch64-linux-gnu.so +0 -0
- numba_cuda/numba/cuda/cext/_helpermod.c +82 -0
- numba_cuda/numba/cuda/cext/_pymodule.h +38 -0
- numba_cuda/numba/cuda/cext/_typeconv.cpp +206 -0
- numba_cuda/numba/cuda/cext/_typeconv.cpython-313-aarch64-linux-gnu.so +0 -0
- numba_cuda/numba/cuda/cext/_typeof.cpp +1159 -0
- numba_cuda/numba/cuda/cext/_typeof.h +19 -0
- numba_cuda/numba/cuda/cext/capsulethunk.h +111 -0
- numba_cuda/numba/cuda/cext/mviewbuf.c +385 -0
- numba_cuda/numba/cuda/cext/mviewbuf.cpython-313-aarch64-linux-gnu.so +0 -0
- numba_cuda/numba/cuda/cext/typeconv.cpp +212 -0
- numba_cuda/numba/cuda/cext/typeconv.hpp +101 -0
- numba_cuda/numba/cuda/cg.py +67 -0
- numba_cuda/numba/cuda/cgutils.py +1294 -0
- numba_cuda/numba/cuda/cloudpickle/__init__.py +21 -0
- numba_cuda/numba/cuda/cloudpickle/cloudpickle.py +1598 -0
- numba_cuda/numba/cuda/cloudpickle/cloudpickle_fast.py +17 -0
- numba_cuda/numba/cuda/codegen.py +541 -0
- numba_cuda/numba/cuda/compiler.py +1396 -0
- numba_cuda/numba/cuda/core/analysis.py +758 -0
- numba_cuda/numba/cuda/core/annotations/__init__.py +0 -0
- numba_cuda/numba/cuda/core/annotations/pretty_annotate.py +288 -0
- numba_cuda/numba/cuda/core/annotations/type_annotations.py +305 -0
- numba_cuda/numba/cuda/core/base.py +1332 -0
- numba_cuda/numba/cuda/core/boxing.py +1411 -0
- numba_cuda/numba/cuda/core/bytecode.py +728 -0
- numba_cuda/numba/cuda/core/byteflow.py +2346 -0
- numba_cuda/numba/cuda/core/caching.py +744 -0
- numba_cuda/numba/cuda/core/callconv.py +392 -0
- numba_cuda/numba/cuda/core/codegen.py +171 -0
- numba_cuda/numba/cuda/core/compiler.py +199 -0
- numba_cuda/numba/cuda/core/compiler_lock.py +85 -0
- numba_cuda/numba/cuda/core/compiler_machinery.py +497 -0
- numba_cuda/numba/cuda/core/config.py +650 -0
- numba_cuda/numba/cuda/core/consts.py +124 -0
- numba_cuda/numba/cuda/core/controlflow.py +989 -0
- numba_cuda/numba/cuda/core/entrypoints.py +57 -0
- numba_cuda/numba/cuda/core/environment.py +66 -0
- numba_cuda/numba/cuda/core/errors.py +917 -0
- numba_cuda/numba/cuda/core/event.py +511 -0
- numba_cuda/numba/cuda/core/funcdesc.py +330 -0
- numba_cuda/numba/cuda/core/generators.py +387 -0
- numba_cuda/numba/cuda/core/imputils.py +509 -0
- numba_cuda/numba/cuda/core/inline_closurecall.py +1787 -0
- numba_cuda/numba/cuda/core/interpreter.py +3617 -0
- numba_cuda/numba/cuda/core/ir.py +1812 -0
- numba_cuda/numba/cuda/core/ir_utils.py +2638 -0
- numba_cuda/numba/cuda/core/optional.py +129 -0
- numba_cuda/numba/cuda/core/options.py +262 -0
- numba_cuda/numba/cuda/core/postproc.py +249 -0
- numba_cuda/numba/cuda/core/pythonapi.py +1859 -0
- numba_cuda/numba/cuda/core/registry.py +46 -0
- numba_cuda/numba/cuda/core/removerefctpass.py +123 -0
- numba_cuda/numba/cuda/core/rewrites/__init__.py +26 -0
- numba_cuda/numba/cuda/core/rewrites/ir_print.py +91 -0
- numba_cuda/numba/cuda/core/rewrites/registry.py +104 -0
- numba_cuda/numba/cuda/core/rewrites/static_binop.py +41 -0
- numba_cuda/numba/cuda/core/rewrites/static_getitem.py +189 -0
- numba_cuda/numba/cuda/core/rewrites/static_raise.py +100 -0
- numba_cuda/numba/cuda/core/sigutils.py +68 -0
- numba_cuda/numba/cuda/core/ssa.py +498 -0
- numba_cuda/numba/cuda/core/targetconfig.py +330 -0
- numba_cuda/numba/cuda/core/tracing.py +231 -0
- numba_cuda/numba/cuda/core/transforms.py +956 -0
- numba_cuda/numba/cuda/core/typed_passes.py +867 -0
- numba_cuda/numba/cuda/core/typeinfer.py +1950 -0
- numba_cuda/numba/cuda/core/unsafe/__init__.py +0 -0
- numba_cuda/numba/cuda/core/unsafe/bytes.py +67 -0
- numba_cuda/numba/cuda/core/unsafe/eh.py +67 -0
- numba_cuda/numba/cuda/core/unsafe/refcount.py +98 -0
- numba_cuda/numba/cuda/core/untyped_passes.py +1979 -0
- numba_cuda/numba/cuda/cpython/builtins.py +1153 -0
- numba_cuda/numba/cuda/cpython/charseq.py +1218 -0
- numba_cuda/numba/cuda/cpython/cmathimpl.py +560 -0
- numba_cuda/numba/cuda/cpython/enumimpl.py +103 -0
- numba_cuda/numba/cuda/cpython/iterators.py +167 -0
- numba_cuda/numba/cuda/cpython/listobj.py +1326 -0
- numba_cuda/numba/cuda/cpython/mathimpl.py +499 -0
- numba_cuda/numba/cuda/cpython/numbers.py +1475 -0
- numba_cuda/numba/cuda/cpython/rangeobj.py +289 -0
- numba_cuda/numba/cuda/cpython/slicing.py +322 -0
- numba_cuda/numba/cuda/cpython/tupleobj.py +456 -0
- numba_cuda/numba/cuda/cpython/unicode.py +2865 -0
- numba_cuda/numba/cuda/cpython/unicode_support.py +1597 -0
- numba_cuda/numba/cuda/cpython/unsafe/__init__.py +0 -0
- numba_cuda/numba/cuda/cpython/unsafe/numbers.py +64 -0
- numba_cuda/numba/cuda/cpython/unsafe/tuple.py +92 -0
- numba_cuda/numba/cuda/cuda_paths.py +691 -0
- numba_cuda/numba/cuda/cudadecl.py +543 -0
- numba_cuda/numba/cuda/cudadrv/__init__.py +14 -0
- numba_cuda/numba/cuda/cudadrv/devicearray.py +954 -0
- numba_cuda/numba/cuda/cudadrv/devices.py +249 -0
- numba_cuda/numba/cuda/cudadrv/driver.py +3238 -0
- numba_cuda/numba/cuda/cudadrv/drvapi.py +435 -0
- numba_cuda/numba/cuda/cudadrv/dummyarray.py +562 -0
- numba_cuda/numba/cuda/cudadrv/enums.py +613 -0
- numba_cuda/numba/cuda/cudadrv/error.py +48 -0
- numba_cuda/numba/cuda/cudadrv/libs.py +220 -0
- numba_cuda/numba/cuda/cudadrv/linkable_code.py +184 -0
- numba_cuda/numba/cuda/cudadrv/mappings.py +14 -0
- numba_cuda/numba/cuda/cudadrv/ndarray.py +26 -0
- numba_cuda/numba/cuda/cudadrv/nvrtc.py +193 -0
- numba_cuda/numba/cuda/cudadrv/nvvm.py +756 -0
- numba_cuda/numba/cuda/cudadrv/rtapi.py +13 -0
- numba_cuda/numba/cuda/cudadrv/runtime.py +34 -0
- numba_cuda/numba/cuda/cudaimpl.py +983 -0
- numba_cuda/numba/cuda/cudamath.py +149 -0
- numba_cuda/numba/cuda/datamodel/__init__.py +7 -0
- numba_cuda/numba/cuda/datamodel/cuda_manager.py +66 -0
- numba_cuda/numba/cuda/datamodel/cuda_models.py +1446 -0
- numba_cuda/numba/cuda/datamodel/cuda_packer.py +224 -0
- numba_cuda/numba/cuda/datamodel/cuda_registry.py +22 -0
- numba_cuda/numba/cuda/datamodel/cuda_testing.py +153 -0
- numba_cuda/numba/cuda/datamodel/manager.py +11 -0
- numba_cuda/numba/cuda/datamodel/models.py +9 -0
- numba_cuda/numba/cuda/datamodel/packer.py +9 -0
- numba_cuda/numba/cuda/datamodel/registry.py +11 -0
- numba_cuda/numba/cuda/datamodel/testing.py +11 -0
- numba_cuda/numba/cuda/debuginfo.py +997 -0
- numba_cuda/numba/cuda/decorators.py +294 -0
- numba_cuda/numba/cuda/descriptor.py +35 -0
- numba_cuda/numba/cuda/device_init.py +155 -0
- numba_cuda/numba/cuda/deviceufunc.py +1021 -0
- numba_cuda/numba/cuda/dispatcher.py +2463 -0
- numba_cuda/numba/cuda/errors.py +72 -0
- numba_cuda/numba/cuda/extending.py +697 -0
- numba_cuda/numba/cuda/flags.py +178 -0
- numba_cuda/numba/cuda/fp16.py +357 -0
- numba_cuda/numba/cuda/include/12/cuda_bf16.h +5118 -0
- numba_cuda/numba/cuda/include/12/cuda_bf16.hpp +3865 -0
- numba_cuda/numba/cuda/include/12/cuda_fp16.h +5363 -0
- numba_cuda/numba/cuda/include/12/cuda_fp16.hpp +3483 -0
- numba_cuda/numba/cuda/include/13/cuda_bf16.h +5118 -0
- numba_cuda/numba/cuda/include/13/cuda_bf16.hpp +3865 -0
- numba_cuda/numba/cuda/include/13/cuda_fp16.h +5363 -0
- numba_cuda/numba/cuda/include/13/cuda_fp16.hpp +3483 -0
- numba_cuda/numba/cuda/initialize.py +24 -0
- numba_cuda/numba/cuda/intrinsics.py +531 -0
- numba_cuda/numba/cuda/itanium_mangler.py +214 -0
- numba_cuda/numba/cuda/kernels/__init__.py +2 -0
- numba_cuda/numba/cuda/kernels/reduction.py +265 -0
- numba_cuda/numba/cuda/kernels/transpose.py +65 -0
- numba_cuda/numba/cuda/libdevice.py +3386 -0
- numba_cuda/numba/cuda/libdevicedecl.py +20 -0
- numba_cuda/numba/cuda/libdevicefuncs.py +1060 -0
- numba_cuda/numba/cuda/libdeviceimpl.py +88 -0
- numba_cuda/numba/cuda/locks.py +19 -0
- numba_cuda/numba/cuda/lowering.py +1980 -0
- numba_cuda/numba/cuda/mathimpl.py +374 -0
- numba_cuda/numba/cuda/memory_management/__init__.py +4 -0
- numba_cuda/numba/cuda/memory_management/memsys.cu +99 -0
- numba_cuda/numba/cuda/memory_management/memsys.cuh +22 -0
- numba_cuda/numba/cuda/memory_management/nrt.cu +212 -0
- numba_cuda/numba/cuda/memory_management/nrt.cuh +48 -0
- numba_cuda/numba/cuda/memory_management/nrt.py +390 -0
- numba_cuda/numba/cuda/memory_management/nrt_context.py +438 -0
- numba_cuda/numba/cuda/misc/appdirs.py +594 -0
- numba_cuda/numba/cuda/misc/cffiimpl.py +24 -0
- numba_cuda/numba/cuda/misc/coverage_support.py +43 -0
- numba_cuda/numba/cuda/misc/dump_style.py +41 -0
- numba_cuda/numba/cuda/misc/findlib.py +75 -0
- numba_cuda/numba/cuda/misc/firstlinefinder.py +96 -0
- numba_cuda/numba/cuda/misc/gdb_hook.py +240 -0
- numba_cuda/numba/cuda/misc/literal.py +28 -0
- numba_cuda/numba/cuda/misc/llvm_pass_timings.py +412 -0
- numba_cuda/numba/cuda/misc/special.py +94 -0
- numba_cuda/numba/cuda/models.py +56 -0
- numba_cuda/numba/cuda/np/arraymath.py +5130 -0
- numba_cuda/numba/cuda/np/arrayobj.py +7635 -0
- numba_cuda/numba/cuda/np/extensions.py +11 -0
- numba_cuda/numba/cuda/np/linalg.py +3087 -0
- numba_cuda/numba/cuda/np/math/__init__.py +0 -0
- numba_cuda/numba/cuda/np/math/cmathimpl.py +558 -0
- numba_cuda/numba/cuda/np/math/mathimpl.py +487 -0
- numba_cuda/numba/cuda/np/math/numbers.py +1461 -0
- numba_cuda/numba/cuda/np/npdatetime.py +969 -0
- numba_cuda/numba/cuda/np/npdatetime_helpers.py +217 -0
- numba_cuda/numba/cuda/np/npyfuncs.py +1808 -0
- numba_cuda/numba/cuda/np/npyimpl.py +1027 -0
- numba_cuda/numba/cuda/np/numpy_support.py +798 -0
- numba_cuda/numba/cuda/np/polynomial/__init__.py +4 -0
- numba_cuda/numba/cuda/np/polynomial/polynomial_core.py +242 -0
- numba_cuda/numba/cuda/np/polynomial/polynomial_functions.py +380 -0
- numba_cuda/numba/cuda/np/ufunc/__init__.py +4 -0
- numba_cuda/numba/cuda/np/ufunc/decorators.py +203 -0
- numba_cuda/numba/cuda/np/ufunc/sigparse.py +68 -0
- numba_cuda/numba/cuda/np/ufunc/ufuncbuilder.py +65 -0
- numba_cuda/numba/cuda/np/ufunc_db.py +1282 -0
- numba_cuda/numba/cuda/np/unsafe/__init__.py +0 -0
- numba_cuda/numba/cuda/np/unsafe/ndarray.py +84 -0
- numba_cuda/numba/cuda/nvvmutils.py +254 -0
- numba_cuda/numba/cuda/printimpl.py +126 -0
- numba_cuda/numba/cuda/random.py +308 -0
- numba_cuda/numba/cuda/reshape_funcs.cu +156 -0
- numba_cuda/numba/cuda/serialize.py +267 -0
- numba_cuda/numba/cuda/simulator/__init__.py +63 -0
- numba_cuda/numba/cuda/simulator/_internal/__init__.py +4 -0
- numba_cuda/numba/cuda/simulator/_internal/cuda_bf16.py +2 -0
- numba_cuda/numba/cuda/simulator/api.py +179 -0
- numba_cuda/numba/cuda/simulator/bf16.py +4 -0
- numba_cuda/numba/cuda/simulator/compiler.py +38 -0
- numba_cuda/numba/cuda/simulator/cudadrv/__init__.py +11 -0
- numba_cuda/numba/cuda/simulator/cudadrv/devicearray.py +462 -0
- numba_cuda/numba/cuda/simulator/cudadrv/devices.py +122 -0
- numba_cuda/numba/cuda/simulator/cudadrv/driver.py +66 -0
- numba_cuda/numba/cuda/simulator/cudadrv/drvapi.py +7 -0
- numba_cuda/numba/cuda/simulator/cudadrv/dummyarray.py +7 -0
- numba_cuda/numba/cuda/simulator/cudadrv/error.py +10 -0
- numba_cuda/numba/cuda/simulator/cudadrv/libs.py +10 -0
- numba_cuda/numba/cuda/simulator/cudadrv/linkable_code.py +61 -0
- numba_cuda/numba/cuda/simulator/cudadrv/nvrtc.py +11 -0
- numba_cuda/numba/cuda/simulator/cudadrv/nvvm.py +32 -0
- numba_cuda/numba/cuda/simulator/cudadrv/runtime.py +22 -0
- numba_cuda/numba/cuda/simulator/dispatcher.py +11 -0
- numba_cuda/numba/cuda/simulator/kernel.py +320 -0
- numba_cuda/numba/cuda/simulator/kernelapi.py +509 -0
- numba_cuda/numba/cuda/simulator/memory_management/__init__.py +4 -0
- numba_cuda/numba/cuda/simulator/memory_management/nrt.py +21 -0
- numba_cuda/numba/cuda/simulator/reduction.py +19 -0
- numba_cuda/numba/cuda/simulator/tests/support.py +4 -0
- numba_cuda/numba/cuda/simulator/vector_types.py +65 -0
- numba_cuda/numba/cuda/simulator_init.py +18 -0
- numba_cuda/numba/cuda/stubs.py +624 -0
- numba_cuda/numba/cuda/target.py +505 -0
- numba_cuda/numba/cuda/testing.py +347 -0
- numba_cuda/numba/cuda/tests/__init__.py +62 -0
- numba_cuda/numba/cuda/tests/benchmarks/__init__.py +0 -0
- numba_cuda/numba/cuda/tests/benchmarks/test_kernel_launch.py +119 -0
- numba_cuda/numba/cuda/tests/cloudpickle_main_class.py +9 -0
- numba_cuda/numba/cuda/tests/core/serialize_usecases.py +113 -0
- numba_cuda/numba/cuda/tests/core/test_itanium_mangler.py +83 -0
- numba_cuda/numba/cuda/tests/core/test_serialize.py +371 -0
- numba_cuda/numba/cuda/tests/cudadrv/__init__.py +9 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_array_attr.py +147 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_context_stack.py +161 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_array_slicing.py +397 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_auto_context.py +24 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_devicerecord.py +180 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_driver.py +313 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_memory.py +191 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_ndarray.py +621 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_deallocations.py +247 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_detect.py +100 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_emm_plugins.py +200 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_events.py +53 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_host_alloc.py +72 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_init.py +138 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_inline_ptx.py +43 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_is_fp16.py +15 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_linkable_code.py +58 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_linker.py +348 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_managed_alloc.py +128 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_module_callbacks.py +301 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_nvjitlink.py +174 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_nvrtc.py +28 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_nvvm_driver.py +185 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_pinned.py +39 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_profiler.py +23 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_reset_device.py +38 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_runtime.py +48 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_select_device.py +44 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_streams.py +127 -0
- numba_cuda/numba/cuda/tests/cudapy/__init__.py +9 -0
- numba_cuda/numba/cuda/tests/cudapy/cache_usecases.py +231 -0
- numba_cuda/numba/cuda/tests/cudapy/cache_with_cpu_usecases.py +50 -0
- numba_cuda/numba/cuda/tests/cudapy/cg_cache_usecases.py +36 -0
- numba_cuda/numba/cuda/tests/cudapy/complex_usecases.py +116 -0
- numba_cuda/numba/cuda/tests/cudapy/enum_usecases.py +59 -0
- numba_cuda/numba/cuda/tests/cudapy/extensions_usecases.py +62 -0
- numba_cuda/numba/cuda/tests/cudapy/jitlink.ptx +28 -0
- numba_cuda/numba/cuda/tests/cudapy/overload_usecases.py +33 -0
- numba_cuda/numba/cuda/tests/cudapy/recursion_usecases.py +104 -0
- numba_cuda/numba/cuda/tests/cudapy/test_alignment.py +47 -0
- numba_cuda/numba/cuda/tests/cudapy/test_analysis.py +1122 -0
- numba_cuda/numba/cuda/tests/cudapy/test_array.py +344 -0
- numba_cuda/numba/cuda/tests/cudapy/test_array_alignment.py +268 -0
- numba_cuda/numba/cuda/tests/cudapy/test_array_args.py +203 -0
- numba_cuda/numba/cuda/tests/cudapy/test_array_methods.py +63 -0
- numba_cuda/numba/cuda/tests/cudapy/test_array_reductions.py +360 -0
- numba_cuda/numba/cuda/tests/cudapy/test_atomics.py +1815 -0
- numba_cuda/numba/cuda/tests/cudapy/test_bfloat16.py +599 -0
- numba_cuda/numba/cuda/tests/cudapy/test_bfloat16_bindings.py +377 -0
- numba_cuda/numba/cuda/tests/cudapy/test_blackscholes.py +160 -0
- numba_cuda/numba/cuda/tests/cudapy/test_boolean.py +27 -0
- numba_cuda/numba/cuda/tests/cudapy/test_byteflow.py +98 -0
- numba_cuda/numba/cuda/tests/cudapy/test_cache_hints.py +210 -0
- numba_cuda/numba/cuda/tests/cudapy/test_caching.py +683 -0
- numba_cuda/numba/cuda/tests/cudapy/test_casting.py +265 -0
- numba_cuda/numba/cuda/tests/cudapy/test_cffi.py +42 -0
- numba_cuda/numba/cuda/tests/cudapy/test_compiler.py +718 -0
- numba_cuda/numba/cuda/tests/cudapy/test_complex.py +370 -0
- numba_cuda/numba/cuda/tests/cudapy/test_complex_kernel.py +23 -0
- numba_cuda/numba/cuda/tests/cudapy/test_const_string.py +142 -0
- numba_cuda/numba/cuda/tests/cudapy/test_constmem.py +178 -0
- numba_cuda/numba/cuda/tests/cudapy/test_cooperative_groups.py +193 -0
- numba_cuda/numba/cuda/tests/cudapy/test_copy_propagate.py +131 -0
- numba_cuda/numba/cuda/tests/cudapy/test_cuda_array_interface.py +438 -0
- numba_cuda/numba/cuda/tests/cudapy/test_cuda_jit_no_types.py +94 -0
- numba_cuda/numba/cuda/tests/cudapy/test_datetime.py +101 -0
- numba_cuda/numba/cuda/tests/cudapy/test_debug.py +105 -0
- numba_cuda/numba/cuda/tests/cudapy/test_debuginfo.py +978 -0
- numba_cuda/numba/cuda/tests/cudapy/test_debuginfo_types.py +476 -0
- numba_cuda/numba/cuda/tests/cudapy/test_device_func.py +500 -0
- numba_cuda/numba/cuda/tests/cudapy/test_dispatcher.py +820 -0
- numba_cuda/numba/cuda/tests/cudapy/test_enums.py +152 -0
- numba_cuda/numba/cuda/tests/cudapy/test_errors.py +111 -0
- numba_cuda/numba/cuda/tests/cudapy/test_exception.py +170 -0
- numba_cuda/numba/cuda/tests/cudapy/test_extending.py +1088 -0
- numba_cuda/numba/cuda/tests/cudapy/test_extending_types.py +71 -0
- numba_cuda/numba/cuda/tests/cudapy/test_fastmath.py +265 -0
- numba_cuda/numba/cuda/tests/cudapy/test_flow_control.py +1433 -0
- numba_cuda/numba/cuda/tests/cudapy/test_forall.py +57 -0
- numba_cuda/numba/cuda/tests/cudapy/test_freevar.py +34 -0
- numba_cuda/numba/cuda/tests/cudapy/test_frexp_ldexp.py +69 -0
- numba_cuda/numba/cuda/tests/cudapy/test_globals.py +62 -0
- numba_cuda/numba/cuda/tests/cudapy/test_gufunc.py +474 -0
- numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scalar.py +167 -0
- numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scheduling.py +92 -0
- numba_cuda/numba/cuda/tests/cudapy/test_idiv.py +39 -0
- numba_cuda/numba/cuda/tests/cudapy/test_inline.py +170 -0
- numba_cuda/numba/cuda/tests/cudapy/test_inspect.py +255 -0
- numba_cuda/numba/cuda/tests/cudapy/test_intrinsics.py +1219 -0
- numba_cuda/numba/cuda/tests/cudapy/test_ipc.py +263 -0
- numba_cuda/numba/cuda/tests/cudapy/test_ir.py +598 -0
- numba_cuda/numba/cuda/tests/cudapy/test_ir_utils.py +276 -0
- numba_cuda/numba/cuda/tests/cudapy/test_iterators.py +101 -0
- numba_cuda/numba/cuda/tests/cudapy/test_lang.py +68 -0
- numba_cuda/numba/cuda/tests/cudapy/test_laplace.py +123 -0
- numba_cuda/numba/cuda/tests/cudapy/test_libdevice.py +194 -0
- numba_cuda/numba/cuda/tests/cudapy/test_lineinfo.py +220 -0
- numba_cuda/numba/cuda/tests/cudapy/test_localmem.py +173 -0
- numba_cuda/numba/cuda/tests/cudapy/test_make_function_to_jit_function.py +364 -0
- numba_cuda/numba/cuda/tests/cudapy/test_mandel.py +47 -0
- numba_cuda/numba/cuda/tests/cudapy/test_math.py +842 -0
- numba_cuda/numba/cuda/tests/cudapy/test_matmul.py +76 -0
- numba_cuda/numba/cuda/tests/cudapy/test_minmax.py +78 -0
- numba_cuda/numba/cuda/tests/cudapy/test_montecarlo.py +25 -0
- numba_cuda/numba/cuda/tests/cudapy/test_multigpu.py +145 -0
- numba_cuda/numba/cuda/tests/cudapy/test_multiprocessing.py +39 -0
- numba_cuda/numba/cuda/tests/cudapy/test_multithreads.py +82 -0
- numba_cuda/numba/cuda/tests/cudapy/test_nondet.py +53 -0
- numba_cuda/numba/cuda/tests/cudapy/test_operator.py +504 -0
- numba_cuda/numba/cuda/tests/cudapy/test_optimization.py +93 -0
- numba_cuda/numba/cuda/tests/cudapy/test_overload.py +402 -0
- numba_cuda/numba/cuda/tests/cudapy/test_powi.py +128 -0
- numba_cuda/numba/cuda/tests/cudapy/test_print.py +193 -0
- numba_cuda/numba/cuda/tests/cudapy/test_py2_div_issue.py +37 -0
- numba_cuda/numba/cuda/tests/cudapy/test_random.py +117 -0
- numba_cuda/numba/cuda/tests/cudapy/test_record_dtype.py +614 -0
- numba_cuda/numba/cuda/tests/cudapy/test_recursion.py +130 -0
- numba_cuda/numba/cuda/tests/cudapy/test_reduction.py +94 -0
- numba_cuda/numba/cuda/tests/cudapy/test_retrieve_autoconverted_arrays.py +83 -0
- numba_cuda/numba/cuda/tests/cudapy/test_serialize.py +86 -0
- numba_cuda/numba/cuda/tests/cudapy/test_slicing.py +40 -0
- numba_cuda/numba/cuda/tests/cudapy/test_sm.py +457 -0
- numba_cuda/numba/cuda/tests/cudapy/test_sm_creation.py +233 -0
- numba_cuda/numba/cuda/tests/cudapy/test_ssa.py +454 -0
- numba_cuda/numba/cuda/tests/cudapy/test_stream_api.py +56 -0
- numba_cuda/numba/cuda/tests/cudapy/test_sync.py +277 -0
- numba_cuda/numba/cuda/tests/cudapy/test_tracing.py +200 -0
- numba_cuda/numba/cuda/tests/cudapy/test_transpose.py +90 -0
- numba_cuda/numba/cuda/tests/cudapy/test_typeconv.py +333 -0
- numba_cuda/numba/cuda/tests/cudapy/test_typeinfer.py +538 -0
- numba_cuda/numba/cuda/tests/cudapy/test_ufuncs.py +585 -0
- numba_cuda/numba/cuda/tests/cudapy/test_userexc.py +42 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vector_type.py +485 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vectorize.py +312 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vectorize_complex.py +23 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vectorize_decor.py +183 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vectorize_device.py +40 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vectorize_scalar_arg.py +40 -0
- numba_cuda/numba/cuda/tests/cudapy/test_warning.py +206 -0
- numba_cuda/numba/cuda/tests/cudapy/test_warp_ops.py +446 -0
- numba_cuda/numba/cuda/tests/cudasim/__init__.py +9 -0
- numba_cuda/numba/cuda/tests/cudasim/support.py +9 -0
- numba_cuda/numba/cuda/tests/cudasim/test_cudasim_issues.py +111 -0
- numba_cuda/numba/cuda/tests/data/__init__.py +2 -0
- numba_cuda/numba/cuda/tests/data/cta_barrier.cu +28 -0
- numba_cuda/numba/cuda/tests/data/cuda_include.cu +10 -0
- numba_cuda/numba/cuda/tests/data/error.cu +12 -0
- numba_cuda/numba/cuda/tests/data/include/add.cuh +8 -0
- numba_cuda/numba/cuda/tests/data/jitlink.cu +28 -0
- numba_cuda/numba/cuda/tests/data/jitlink.ptx +49 -0
- numba_cuda/numba/cuda/tests/data/warn.cu +12 -0
- numba_cuda/numba/cuda/tests/doc_examples/__init__.py +9 -0
- numba_cuda/numba/cuda/tests/doc_examples/ffi/__init__.py +2 -0
- numba_cuda/numba/cuda/tests/doc_examples/ffi/functions.cu +54 -0
- numba_cuda/numba/cuda/tests/doc_examples/ffi/include/mul.cuh +8 -0
- numba_cuda/numba/cuda/tests/doc_examples/ffi/saxpy.cu +14 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_cg.py +86 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_cpointer.py +68 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_cpu_gpu_compat.py +81 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_ffi.py +141 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_laplace.py +160 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_matmul.py +180 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_montecarlo.py +119 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_random.py +66 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_reduction.py +80 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_sessionize.py +206 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_ufunc.py +53 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_vecadd.py +76 -0
- numba_cuda/numba/cuda/tests/nocuda/__init__.py +9 -0
- numba_cuda/numba/cuda/tests/nocuda/test_dummyarray.py +452 -0
- numba_cuda/numba/cuda/tests/nocuda/test_function_resolution.py +48 -0
- numba_cuda/numba/cuda/tests/nocuda/test_import.py +63 -0
- numba_cuda/numba/cuda/tests/nocuda/test_library_lookup.py +252 -0
- numba_cuda/numba/cuda/tests/nocuda/test_nvvm.py +59 -0
- numba_cuda/numba/cuda/tests/nrt/__init__.py +9 -0
- numba_cuda/numba/cuda/tests/nrt/test_nrt.py +387 -0
- numba_cuda/numba/cuda/tests/nrt/test_nrt_refct.py +124 -0
- numba_cuda/numba/cuda/tests/support.py +900 -0
- numba_cuda/numba/cuda/typeconv/__init__.py +4 -0
- numba_cuda/numba/cuda/typeconv/castgraph.py +137 -0
- numba_cuda/numba/cuda/typeconv/rules.py +63 -0
- numba_cuda/numba/cuda/typeconv/typeconv.py +121 -0
- numba_cuda/numba/cuda/types/__init__.py +233 -0
- numba_cuda/numba/cuda/types/__init__.pyi +167 -0
- numba_cuda/numba/cuda/types/abstract.py +9 -0
- numba_cuda/numba/cuda/types/common.py +9 -0
- numba_cuda/numba/cuda/types/containers.py +9 -0
- numba_cuda/numba/cuda/types/cuda_abstract.py +533 -0
- numba_cuda/numba/cuda/types/cuda_common.py +110 -0
- numba_cuda/numba/cuda/types/cuda_containers.py +971 -0
- numba_cuda/numba/cuda/types/cuda_function_type.py +230 -0
- numba_cuda/numba/cuda/types/cuda_functions.py +798 -0
- numba_cuda/numba/cuda/types/cuda_iterators.py +120 -0
- numba_cuda/numba/cuda/types/cuda_misc.py +569 -0
- numba_cuda/numba/cuda/types/cuda_npytypes.py +690 -0
- numba_cuda/numba/cuda/types/cuda_scalars.py +280 -0
- numba_cuda/numba/cuda/types/ext_types.py +101 -0
- numba_cuda/numba/cuda/types/function_type.py +11 -0
- numba_cuda/numba/cuda/types/functions.py +9 -0
- numba_cuda/numba/cuda/types/iterators.py +9 -0
- numba_cuda/numba/cuda/types/misc.py +9 -0
- numba_cuda/numba/cuda/types/npytypes.py +9 -0
- numba_cuda/numba/cuda/types/scalars.py +9 -0
- numba_cuda/numba/cuda/typing/__init__.py +19 -0
- numba_cuda/numba/cuda/typing/arraydecl.py +939 -0
- numba_cuda/numba/cuda/typing/asnumbatype.py +130 -0
- numba_cuda/numba/cuda/typing/bufproto.py +70 -0
- numba_cuda/numba/cuda/typing/builtins.py +1209 -0
- numba_cuda/numba/cuda/typing/cffi_utils.py +219 -0
- numba_cuda/numba/cuda/typing/cmathdecl.py +47 -0
- numba_cuda/numba/cuda/typing/collections.py +138 -0
- numba_cuda/numba/cuda/typing/context.py +782 -0
- numba_cuda/numba/cuda/typing/ctypes_utils.py +125 -0
- numba_cuda/numba/cuda/typing/dictdecl.py +63 -0
- numba_cuda/numba/cuda/typing/enumdecl.py +74 -0
- numba_cuda/numba/cuda/typing/listdecl.py +147 -0
- numba_cuda/numba/cuda/typing/mathdecl.py +158 -0
- numba_cuda/numba/cuda/typing/npdatetime.py +322 -0
- numba_cuda/numba/cuda/typing/npydecl.py +749 -0
- numba_cuda/numba/cuda/typing/setdecl.py +115 -0
- numba_cuda/numba/cuda/typing/templates.py +1446 -0
- numba_cuda/numba/cuda/typing/typeof.py +301 -0
- numba_cuda/numba/cuda/ufuncs.py +746 -0
- numba_cuda/numba/cuda/utils.py +724 -0
- numba_cuda/numba/cuda/vector_types.py +214 -0
- numba_cuda/numba/cuda/vectorizers.py +260 -0
- numba_cuda-0.22.0.dist-info/METADATA +109 -0
- numba_cuda-0.22.0.dist-info/RECORD +487 -0
- numba_cuda-0.22.0.dist-info/WHEEL +6 -0
- numba_cuda-0.22.0.dist-info/licenses/LICENSE +26 -0
- numba_cuda-0.22.0.dist-info/licenses/LICENSE.numba +24 -0
- 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
|