numba-cuda 0.21.1__cp313-cp313-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (488) hide show
  1. _numba_cuda_redirector.pth +4 -0
  2. _numba_cuda_redirector.py +89 -0
  3. numba_cuda/VERSION +1 -0
  4. numba_cuda/__init__.py +6 -0
  5. numba_cuda/_version.py +11 -0
  6. numba_cuda/numba/cuda/__init__.py +70 -0
  7. numba_cuda/numba/cuda/_internal/cuda_bf16.py +16394 -0
  8. numba_cuda/numba/cuda/_internal/cuda_fp16.py +8112 -0
  9. numba_cuda/numba/cuda/api.py +577 -0
  10. numba_cuda/numba/cuda/api_util.py +76 -0
  11. numba_cuda/numba/cuda/args.py +72 -0
  12. numba_cuda/numba/cuda/bf16.py +397 -0
  13. numba_cuda/numba/cuda/cache_hints.py +287 -0
  14. numba_cuda/numba/cuda/cext/__init__.py +2 -0
  15. numba_cuda/numba/cuda/cext/_devicearray.cp313-win_amd64.pyd +0 -0
  16. numba_cuda/numba/cuda/cext/_devicearray.cpp +159 -0
  17. numba_cuda/numba/cuda/cext/_devicearray.h +29 -0
  18. numba_cuda/numba/cuda/cext/_dispatcher.cp313-win_amd64.pyd +0 -0
  19. numba_cuda/numba/cuda/cext/_dispatcher.cpp +1098 -0
  20. numba_cuda/numba/cuda/cext/_hashtable.cpp +532 -0
  21. numba_cuda/numba/cuda/cext/_hashtable.h +135 -0
  22. numba_cuda/numba/cuda/cext/_helperlib.c +71 -0
  23. numba_cuda/numba/cuda/cext/_helperlib.cp313-win_amd64.pyd +0 -0
  24. numba_cuda/numba/cuda/cext/_helpermod.c +82 -0
  25. numba_cuda/numba/cuda/cext/_pymodule.h +38 -0
  26. numba_cuda/numba/cuda/cext/_typeconv.cp313-win_amd64.pyd +0 -0
  27. numba_cuda/numba/cuda/cext/_typeconv.cpp +206 -0
  28. numba_cuda/numba/cuda/cext/_typeof.cpp +1159 -0
  29. numba_cuda/numba/cuda/cext/_typeof.h +19 -0
  30. numba_cuda/numba/cuda/cext/capsulethunk.h +111 -0
  31. numba_cuda/numba/cuda/cext/mviewbuf.c +385 -0
  32. numba_cuda/numba/cuda/cext/mviewbuf.cp313-win_amd64.pyd +0 -0
  33. numba_cuda/numba/cuda/cext/typeconv.cpp +212 -0
  34. numba_cuda/numba/cuda/cext/typeconv.hpp +101 -0
  35. numba_cuda/numba/cuda/cg.py +67 -0
  36. numba_cuda/numba/cuda/cgutils.py +1294 -0
  37. numba_cuda/numba/cuda/cloudpickle/__init__.py +21 -0
  38. numba_cuda/numba/cuda/cloudpickle/cloudpickle.py +1598 -0
  39. numba_cuda/numba/cuda/cloudpickle/cloudpickle_fast.py +17 -0
  40. numba_cuda/numba/cuda/codegen.py +541 -0
  41. numba_cuda/numba/cuda/compiler.py +1396 -0
  42. numba_cuda/numba/cuda/core/analysis.py +758 -0
  43. numba_cuda/numba/cuda/core/annotations/__init__.py +0 -0
  44. numba_cuda/numba/cuda/core/annotations/pretty_annotate.py +288 -0
  45. numba_cuda/numba/cuda/core/annotations/type_annotations.py +305 -0
  46. numba_cuda/numba/cuda/core/base.py +1332 -0
  47. numba_cuda/numba/cuda/core/boxing.py +1411 -0
  48. numba_cuda/numba/cuda/core/bytecode.py +728 -0
  49. numba_cuda/numba/cuda/core/byteflow.py +2346 -0
  50. numba_cuda/numba/cuda/core/caching.py +744 -0
  51. numba_cuda/numba/cuda/core/callconv.py +392 -0
  52. numba_cuda/numba/cuda/core/codegen.py +171 -0
  53. numba_cuda/numba/cuda/core/compiler.py +199 -0
  54. numba_cuda/numba/cuda/core/compiler_lock.py +85 -0
  55. numba_cuda/numba/cuda/core/compiler_machinery.py +497 -0
  56. numba_cuda/numba/cuda/core/config.py +650 -0
  57. numba_cuda/numba/cuda/core/consts.py +124 -0
  58. numba_cuda/numba/cuda/core/controlflow.py +989 -0
  59. numba_cuda/numba/cuda/core/entrypoints.py +57 -0
  60. numba_cuda/numba/cuda/core/environment.py +66 -0
  61. numba_cuda/numba/cuda/core/errors.py +917 -0
  62. numba_cuda/numba/cuda/core/event.py +511 -0
  63. numba_cuda/numba/cuda/core/funcdesc.py +330 -0
  64. numba_cuda/numba/cuda/core/generators.py +387 -0
  65. numba_cuda/numba/cuda/core/imputils.py +509 -0
  66. numba_cuda/numba/cuda/core/inline_closurecall.py +1787 -0
  67. numba_cuda/numba/cuda/core/interpreter.py +3617 -0
  68. numba_cuda/numba/cuda/core/ir.py +1812 -0
  69. numba_cuda/numba/cuda/core/ir_utils.py +2638 -0
  70. numba_cuda/numba/cuda/core/optional.py +129 -0
  71. numba_cuda/numba/cuda/core/options.py +262 -0
  72. numba_cuda/numba/cuda/core/postproc.py +249 -0
  73. numba_cuda/numba/cuda/core/pythonapi.py +1859 -0
  74. numba_cuda/numba/cuda/core/registry.py +46 -0
  75. numba_cuda/numba/cuda/core/removerefctpass.py +123 -0
  76. numba_cuda/numba/cuda/core/rewrites/__init__.py +26 -0
  77. numba_cuda/numba/cuda/core/rewrites/ir_print.py +91 -0
  78. numba_cuda/numba/cuda/core/rewrites/registry.py +104 -0
  79. numba_cuda/numba/cuda/core/rewrites/static_binop.py +41 -0
  80. numba_cuda/numba/cuda/core/rewrites/static_getitem.py +189 -0
  81. numba_cuda/numba/cuda/core/rewrites/static_raise.py +100 -0
  82. numba_cuda/numba/cuda/core/sigutils.py +68 -0
  83. numba_cuda/numba/cuda/core/ssa.py +498 -0
  84. numba_cuda/numba/cuda/core/targetconfig.py +330 -0
  85. numba_cuda/numba/cuda/core/tracing.py +231 -0
  86. numba_cuda/numba/cuda/core/transforms.py +956 -0
  87. numba_cuda/numba/cuda/core/typed_passes.py +867 -0
  88. numba_cuda/numba/cuda/core/typeinfer.py +1950 -0
  89. numba_cuda/numba/cuda/core/unsafe/__init__.py +0 -0
  90. numba_cuda/numba/cuda/core/unsafe/bytes.py +67 -0
  91. numba_cuda/numba/cuda/core/unsafe/eh.py +67 -0
  92. numba_cuda/numba/cuda/core/unsafe/refcount.py +98 -0
  93. numba_cuda/numba/cuda/core/untyped_passes.py +1979 -0
  94. numba_cuda/numba/cuda/cpython/builtins.py +1153 -0
  95. numba_cuda/numba/cuda/cpython/charseq.py +1218 -0
  96. numba_cuda/numba/cuda/cpython/cmathimpl.py +560 -0
  97. numba_cuda/numba/cuda/cpython/enumimpl.py +103 -0
  98. numba_cuda/numba/cuda/cpython/iterators.py +167 -0
  99. numba_cuda/numba/cuda/cpython/listobj.py +1326 -0
  100. numba_cuda/numba/cuda/cpython/mathimpl.py +499 -0
  101. numba_cuda/numba/cuda/cpython/numbers.py +1475 -0
  102. numba_cuda/numba/cuda/cpython/rangeobj.py +289 -0
  103. numba_cuda/numba/cuda/cpython/slicing.py +322 -0
  104. numba_cuda/numba/cuda/cpython/tupleobj.py +456 -0
  105. numba_cuda/numba/cuda/cpython/unicode.py +2865 -0
  106. numba_cuda/numba/cuda/cpython/unicode_support.py +1597 -0
  107. numba_cuda/numba/cuda/cpython/unsafe/__init__.py +0 -0
  108. numba_cuda/numba/cuda/cpython/unsafe/numbers.py +64 -0
  109. numba_cuda/numba/cuda/cpython/unsafe/tuple.py +92 -0
  110. numba_cuda/numba/cuda/cuda_paths.py +691 -0
  111. numba_cuda/numba/cuda/cudadecl.py +556 -0
  112. numba_cuda/numba/cuda/cudadrv/__init__.py +14 -0
  113. numba_cuda/numba/cuda/cudadrv/devicearray.py +951 -0
  114. numba_cuda/numba/cuda/cudadrv/devices.py +249 -0
  115. numba_cuda/numba/cuda/cudadrv/driver.py +3222 -0
  116. numba_cuda/numba/cuda/cudadrv/drvapi.py +435 -0
  117. numba_cuda/numba/cuda/cudadrv/dummyarray.py +558 -0
  118. numba_cuda/numba/cuda/cudadrv/enums.py +613 -0
  119. numba_cuda/numba/cuda/cudadrv/error.py +48 -0
  120. numba_cuda/numba/cuda/cudadrv/libs.py +220 -0
  121. numba_cuda/numba/cuda/cudadrv/linkable_code.py +184 -0
  122. numba_cuda/numba/cuda/cudadrv/mappings.py +14 -0
  123. numba_cuda/numba/cuda/cudadrv/ndarray.py +26 -0
  124. numba_cuda/numba/cuda/cudadrv/nvrtc.py +193 -0
  125. numba_cuda/numba/cuda/cudadrv/nvvm.py +756 -0
  126. numba_cuda/numba/cuda/cudadrv/rtapi.py +13 -0
  127. numba_cuda/numba/cuda/cudadrv/runtime.py +34 -0
  128. numba_cuda/numba/cuda/cudaimpl.py +995 -0
  129. numba_cuda/numba/cuda/cudamath.py +149 -0
  130. numba_cuda/numba/cuda/datamodel/__init__.py +7 -0
  131. numba_cuda/numba/cuda/datamodel/cuda_manager.py +66 -0
  132. numba_cuda/numba/cuda/datamodel/cuda_models.py +1446 -0
  133. numba_cuda/numba/cuda/datamodel/cuda_packer.py +224 -0
  134. numba_cuda/numba/cuda/datamodel/cuda_registry.py +22 -0
  135. numba_cuda/numba/cuda/datamodel/cuda_testing.py +153 -0
  136. numba_cuda/numba/cuda/datamodel/manager.py +11 -0
  137. numba_cuda/numba/cuda/datamodel/models.py +9 -0
  138. numba_cuda/numba/cuda/datamodel/packer.py +9 -0
  139. numba_cuda/numba/cuda/datamodel/registry.py +11 -0
  140. numba_cuda/numba/cuda/datamodel/testing.py +11 -0
  141. numba_cuda/numba/cuda/debuginfo.py +903 -0
  142. numba_cuda/numba/cuda/decorators.py +294 -0
  143. numba_cuda/numba/cuda/descriptor.py +35 -0
  144. numba_cuda/numba/cuda/device_init.py +158 -0
  145. numba_cuda/numba/cuda/deviceufunc.py +1021 -0
  146. numba_cuda/numba/cuda/dispatcher.py +2463 -0
  147. numba_cuda/numba/cuda/errors.py +72 -0
  148. numba_cuda/numba/cuda/extending.py +697 -0
  149. numba_cuda/numba/cuda/flags.py +178 -0
  150. numba_cuda/numba/cuda/fp16.py +357 -0
  151. numba_cuda/numba/cuda/include/12/cuda_bf16.h +5118 -0
  152. numba_cuda/numba/cuda/include/12/cuda_bf16.hpp +3865 -0
  153. numba_cuda/numba/cuda/include/12/cuda_fp16.h +5363 -0
  154. numba_cuda/numba/cuda/include/12/cuda_fp16.hpp +3483 -0
  155. numba_cuda/numba/cuda/include/13/cuda_bf16.h +5118 -0
  156. numba_cuda/numba/cuda/include/13/cuda_bf16.hpp +3865 -0
  157. numba_cuda/numba/cuda/include/13/cuda_fp16.h +5363 -0
  158. numba_cuda/numba/cuda/include/13/cuda_fp16.hpp +3483 -0
  159. numba_cuda/numba/cuda/initialize.py +24 -0
  160. numba_cuda/numba/cuda/intrinsic_wrapper.py +41 -0
  161. numba_cuda/numba/cuda/intrinsics.py +382 -0
  162. numba_cuda/numba/cuda/itanium_mangler.py +214 -0
  163. numba_cuda/numba/cuda/kernels/__init__.py +2 -0
  164. numba_cuda/numba/cuda/kernels/reduction.py +265 -0
  165. numba_cuda/numba/cuda/kernels/transpose.py +65 -0
  166. numba_cuda/numba/cuda/libdevice.py +3386 -0
  167. numba_cuda/numba/cuda/libdevicedecl.py +20 -0
  168. numba_cuda/numba/cuda/libdevicefuncs.py +1060 -0
  169. numba_cuda/numba/cuda/libdeviceimpl.py +88 -0
  170. numba_cuda/numba/cuda/locks.py +19 -0
  171. numba_cuda/numba/cuda/lowering.py +1951 -0
  172. numba_cuda/numba/cuda/mathimpl.py +374 -0
  173. numba_cuda/numba/cuda/memory_management/__init__.py +4 -0
  174. numba_cuda/numba/cuda/memory_management/memsys.cu +99 -0
  175. numba_cuda/numba/cuda/memory_management/memsys.cuh +22 -0
  176. numba_cuda/numba/cuda/memory_management/nrt.cu +212 -0
  177. numba_cuda/numba/cuda/memory_management/nrt.cuh +48 -0
  178. numba_cuda/numba/cuda/memory_management/nrt.py +390 -0
  179. numba_cuda/numba/cuda/memory_management/nrt_context.py +438 -0
  180. numba_cuda/numba/cuda/misc/appdirs.py +594 -0
  181. numba_cuda/numba/cuda/misc/cffiimpl.py +24 -0
  182. numba_cuda/numba/cuda/misc/coverage_support.py +43 -0
  183. numba_cuda/numba/cuda/misc/dump_style.py +41 -0
  184. numba_cuda/numba/cuda/misc/findlib.py +75 -0
  185. numba_cuda/numba/cuda/misc/firstlinefinder.py +96 -0
  186. numba_cuda/numba/cuda/misc/gdb_hook.py +240 -0
  187. numba_cuda/numba/cuda/misc/literal.py +28 -0
  188. numba_cuda/numba/cuda/misc/llvm_pass_timings.py +412 -0
  189. numba_cuda/numba/cuda/misc/special.py +94 -0
  190. numba_cuda/numba/cuda/models.py +56 -0
  191. numba_cuda/numba/cuda/np/arraymath.py +5130 -0
  192. numba_cuda/numba/cuda/np/arrayobj.py +7635 -0
  193. numba_cuda/numba/cuda/np/extensions.py +11 -0
  194. numba_cuda/numba/cuda/np/linalg.py +3087 -0
  195. numba_cuda/numba/cuda/np/math/__init__.py +0 -0
  196. numba_cuda/numba/cuda/np/math/cmathimpl.py +558 -0
  197. numba_cuda/numba/cuda/np/math/mathimpl.py +487 -0
  198. numba_cuda/numba/cuda/np/math/numbers.py +1461 -0
  199. numba_cuda/numba/cuda/np/npdatetime.py +969 -0
  200. numba_cuda/numba/cuda/np/npdatetime_helpers.py +217 -0
  201. numba_cuda/numba/cuda/np/npyfuncs.py +1808 -0
  202. numba_cuda/numba/cuda/np/npyimpl.py +1027 -0
  203. numba_cuda/numba/cuda/np/numpy_support.py +798 -0
  204. numba_cuda/numba/cuda/np/polynomial/__init__.py +4 -0
  205. numba_cuda/numba/cuda/np/polynomial/polynomial_core.py +242 -0
  206. numba_cuda/numba/cuda/np/polynomial/polynomial_functions.py +380 -0
  207. numba_cuda/numba/cuda/np/ufunc/__init__.py +4 -0
  208. numba_cuda/numba/cuda/np/ufunc/decorators.py +203 -0
  209. numba_cuda/numba/cuda/np/ufunc/sigparse.py +68 -0
  210. numba_cuda/numba/cuda/np/ufunc/ufuncbuilder.py +65 -0
  211. numba_cuda/numba/cuda/np/ufunc_db.py +1282 -0
  212. numba_cuda/numba/cuda/np/unsafe/__init__.py +0 -0
  213. numba_cuda/numba/cuda/np/unsafe/ndarray.py +84 -0
  214. numba_cuda/numba/cuda/nvvmutils.py +254 -0
  215. numba_cuda/numba/cuda/printimpl.py +126 -0
  216. numba_cuda/numba/cuda/random.py +308 -0
  217. numba_cuda/numba/cuda/reshape_funcs.cu +156 -0
  218. numba_cuda/numba/cuda/serialize.py +267 -0
  219. numba_cuda/numba/cuda/simulator/__init__.py +63 -0
  220. numba_cuda/numba/cuda/simulator/_internal/__init__.py +4 -0
  221. numba_cuda/numba/cuda/simulator/_internal/cuda_bf16.py +2 -0
  222. numba_cuda/numba/cuda/simulator/api.py +179 -0
  223. numba_cuda/numba/cuda/simulator/bf16.py +4 -0
  224. numba_cuda/numba/cuda/simulator/compiler.py +38 -0
  225. numba_cuda/numba/cuda/simulator/cudadrv/__init__.py +11 -0
  226. numba_cuda/numba/cuda/simulator/cudadrv/devicearray.py +462 -0
  227. numba_cuda/numba/cuda/simulator/cudadrv/devices.py +122 -0
  228. numba_cuda/numba/cuda/simulator/cudadrv/driver.py +66 -0
  229. numba_cuda/numba/cuda/simulator/cudadrv/drvapi.py +7 -0
  230. numba_cuda/numba/cuda/simulator/cudadrv/dummyarray.py +7 -0
  231. numba_cuda/numba/cuda/simulator/cudadrv/error.py +10 -0
  232. numba_cuda/numba/cuda/simulator/cudadrv/libs.py +10 -0
  233. numba_cuda/numba/cuda/simulator/cudadrv/linkable_code.py +61 -0
  234. numba_cuda/numba/cuda/simulator/cudadrv/nvrtc.py +11 -0
  235. numba_cuda/numba/cuda/simulator/cudadrv/nvvm.py +32 -0
  236. numba_cuda/numba/cuda/simulator/cudadrv/runtime.py +22 -0
  237. numba_cuda/numba/cuda/simulator/dispatcher.py +11 -0
  238. numba_cuda/numba/cuda/simulator/kernel.py +320 -0
  239. numba_cuda/numba/cuda/simulator/kernelapi.py +509 -0
  240. numba_cuda/numba/cuda/simulator/memory_management/__init__.py +4 -0
  241. numba_cuda/numba/cuda/simulator/memory_management/nrt.py +21 -0
  242. numba_cuda/numba/cuda/simulator/reduction.py +19 -0
  243. numba_cuda/numba/cuda/simulator/tests/support.py +4 -0
  244. numba_cuda/numba/cuda/simulator/vector_types.py +65 -0
  245. numba_cuda/numba/cuda/simulator_init.py +18 -0
  246. numba_cuda/numba/cuda/stubs.py +635 -0
  247. numba_cuda/numba/cuda/target.py +505 -0
  248. numba_cuda/numba/cuda/testing.py +347 -0
  249. numba_cuda/numba/cuda/tests/__init__.py +62 -0
  250. numba_cuda/numba/cuda/tests/benchmarks/__init__.py +0 -0
  251. numba_cuda/numba/cuda/tests/benchmarks/test_kernel_launch.py +119 -0
  252. numba_cuda/numba/cuda/tests/cloudpickle_main_class.py +9 -0
  253. numba_cuda/numba/cuda/tests/core/serialize_usecases.py +113 -0
  254. numba_cuda/numba/cuda/tests/core/test_itanium_mangler.py +83 -0
  255. numba_cuda/numba/cuda/tests/core/test_serialize.py +371 -0
  256. numba_cuda/numba/cuda/tests/cudadrv/__init__.py +9 -0
  257. numba_cuda/numba/cuda/tests/cudadrv/test_array_attr.py +147 -0
  258. numba_cuda/numba/cuda/tests/cudadrv/test_context_stack.py +161 -0
  259. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_array_slicing.py +397 -0
  260. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_auto_context.py +24 -0
  261. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_devicerecord.py +180 -0
  262. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_driver.py +313 -0
  263. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_memory.py +187 -0
  264. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_ndarray.py +621 -0
  265. numba_cuda/numba/cuda/tests/cudadrv/test_deallocations.py +247 -0
  266. numba_cuda/numba/cuda/tests/cudadrv/test_detect.py +100 -0
  267. numba_cuda/numba/cuda/tests/cudadrv/test_emm_plugins.py +198 -0
  268. numba_cuda/numba/cuda/tests/cudadrv/test_events.py +53 -0
  269. numba_cuda/numba/cuda/tests/cudadrv/test_host_alloc.py +72 -0
  270. numba_cuda/numba/cuda/tests/cudadrv/test_init.py +138 -0
  271. numba_cuda/numba/cuda/tests/cudadrv/test_inline_ptx.py +43 -0
  272. numba_cuda/numba/cuda/tests/cudadrv/test_is_fp16.py +15 -0
  273. numba_cuda/numba/cuda/tests/cudadrv/test_linkable_code.py +58 -0
  274. numba_cuda/numba/cuda/tests/cudadrv/test_linker.py +348 -0
  275. numba_cuda/numba/cuda/tests/cudadrv/test_managed_alloc.py +128 -0
  276. numba_cuda/numba/cuda/tests/cudadrv/test_module_callbacks.py +301 -0
  277. numba_cuda/numba/cuda/tests/cudadrv/test_nvjitlink.py +174 -0
  278. numba_cuda/numba/cuda/tests/cudadrv/test_nvrtc.py +28 -0
  279. numba_cuda/numba/cuda/tests/cudadrv/test_nvvm_driver.py +185 -0
  280. numba_cuda/numba/cuda/tests/cudadrv/test_pinned.py +39 -0
  281. numba_cuda/numba/cuda/tests/cudadrv/test_profiler.py +23 -0
  282. numba_cuda/numba/cuda/tests/cudadrv/test_reset_device.py +38 -0
  283. numba_cuda/numba/cuda/tests/cudadrv/test_runtime.py +48 -0
  284. numba_cuda/numba/cuda/tests/cudadrv/test_select_device.py +44 -0
  285. numba_cuda/numba/cuda/tests/cudadrv/test_streams.py +127 -0
  286. numba_cuda/numba/cuda/tests/cudapy/__init__.py +9 -0
  287. numba_cuda/numba/cuda/tests/cudapy/cache_usecases.py +231 -0
  288. numba_cuda/numba/cuda/tests/cudapy/cache_with_cpu_usecases.py +50 -0
  289. numba_cuda/numba/cuda/tests/cudapy/cg_cache_usecases.py +36 -0
  290. numba_cuda/numba/cuda/tests/cudapy/complex_usecases.py +116 -0
  291. numba_cuda/numba/cuda/tests/cudapy/enum_usecases.py +59 -0
  292. numba_cuda/numba/cuda/tests/cudapy/extensions_usecases.py +62 -0
  293. numba_cuda/numba/cuda/tests/cudapy/jitlink.ptx +28 -0
  294. numba_cuda/numba/cuda/tests/cudapy/overload_usecases.py +33 -0
  295. numba_cuda/numba/cuda/tests/cudapy/recursion_usecases.py +104 -0
  296. numba_cuda/numba/cuda/tests/cudapy/test_alignment.py +47 -0
  297. numba_cuda/numba/cuda/tests/cudapy/test_analysis.py +1122 -0
  298. numba_cuda/numba/cuda/tests/cudapy/test_array.py +344 -0
  299. numba_cuda/numba/cuda/tests/cudapy/test_array_alignment.py +268 -0
  300. numba_cuda/numba/cuda/tests/cudapy/test_array_args.py +203 -0
  301. numba_cuda/numba/cuda/tests/cudapy/test_array_methods.py +63 -0
  302. numba_cuda/numba/cuda/tests/cudapy/test_array_reductions.py +360 -0
  303. numba_cuda/numba/cuda/tests/cudapy/test_atomics.py +1815 -0
  304. numba_cuda/numba/cuda/tests/cudapy/test_bfloat16.py +599 -0
  305. numba_cuda/numba/cuda/tests/cudapy/test_bfloat16_bindings.py +377 -0
  306. numba_cuda/numba/cuda/tests/cudapy/test_blackscholes.py +160 -0
  307. numba_cuda/numba/cuda/tests/cudapy/test_boolean.py +27 -0
  308. numba_cuda/numba/cuda/tests/cudapy/test_byteflow.py +98 -0
  309. numba_cuda/numba/cuda/tests/cudapy/test_cache_hints.py +210 -0
  310. numba_cuda/numba/cuda/tests/cudapy/test_caching.py +683 -0
  311. numba_cuda/numba/cuda/tests/cudapy/test_casting.py +265 -0
  312. numba_cuda/numba/cuda/tests/cudapy/test_cffi.py +42 -0
  313. numba_cuda/numba/cuda/tests/cudapy/test_compiler.py +718 -0
  314. numba_cuda/numba/cuda/tests/cudapy/test_complex.py +370 -0
  315. numba_cuda/numba/cuda/tests/cudapy/test_complex_kernel.py +23 -0
  316. numba_cuda/numba/cuda/tests/cudapy/test_const_string.py +142 -0
  317. numba_cuda/numba/cuda/tests/cudapy/test_constmem.py +178 -0
  318. numba_cuda/numba/cuda/tests/cudapy/test_cooperative_groups.py +193 -0
  319. numba_cuda/numba/cuda/tests/cudapy/test_copy_propagate.py +131 -0
  320. numba_cuda/numba/cuda/tests/cudapy/test_cuda_array_interface.py +438 -0
  321. numba_cuda/numba/cuda/tests/cudapy/test_cuda_jit_no_types.py +94 -0
  322. numba_cuda/numba/cuda/tests/cudapy/test_datetime.py +101 -0
  323. numba_cuda/numba/cuda/tests/cudapy/test_debug.py +105 -0
  324. numba_cuda/numba/cuda/tests/cudapy/test_debuginfo.py +889 -0
  325. numba_cuda/numba/cuda/tests/cudapy/test_debuginfo_types.py +476 -0
  326. numba_cuda/numba/cuda/tests/cudapy/test_device_func.py +500 -0
  327. numba_cuda/numba/cuda/tests/cudapy/test_dispatcher.py +820 -0
  328. numba_cuda/numba/cuda/tests/cudapy/test_enums.py +152 -0
  329. numba_cuda/numba/cuda/tests/cudapy/test_errors.py +111 -0
  330. numba_cuda/numba/cuda/tests/cudapy/test_exception.py +170 -0
  331. numba_cuda/numba/cuda/tests/cudapy/test_extending.py +1088 -0
  332. numba_cuda/numba/cuda/tests/cudapy/test_extending_types.py +71 -0
  333. numba_cuda/numba/cuda/tests/cudapy/test_fastmath.py +265 -0
  334. numba_cuda/numba/cuda/tests/cudapy/test_flow_control.py +1433 -0
  335. numba_cuda/numba/cuda/tests/cudapy/test_forall.py +57 -0
  336. numba_cuda/numba/cuda/tests/cudapy/test_freevar.py +34 -0
  337. numba_cuda/numba/cuda/tests/cudapy/test_frexp_ldexp.py +69 -0
  338. numba_cuda/numba/cuda/tests/cudapy/test_globals.py +62 -0
  339. numba_cuda/numba/cuda/tests/cudapy/test_gufunc.py +474 -0
  340. numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scalar.py +167 -0
  341. numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scheduling.py +92 -0
  342. numba_cuda/numba/cuda/tests/cudapy/test_idiv.py +39 -0
  343. numba_cuda/numba/cuda/tests/cudapy/test_inline.py +170 -0
  344. numba_cuda/numba/cuda/tests/cudapy/test_inspect.py +255 -0
  345. numba_cuda/numba/cuda/tests/cudapy/test_intrinsics.py +1219 -0
  346. numba_cuda/numba/cuda/tests/cudapy/test_ipc.py +263 -0
  347. numba_cuda/numba/cuda/tests/cudapy/test_ir.py +598 -0
  348. numba_cuda/numba/cuda/tests/cudapy/test_ir_utils.py +276 -0
  349. numba_cuda/numba/cuda/tests/cudapy/test_iterators.py +101 -0
  350. numba_cuda/numba/cuda/tests/cudapy/test_lang.py +68 -0
  351. numba_cuda/numba/cuda/tests/cudapy/test_laplace.py +123 -0
  352. numba_cuda/numba/cuda/tests/cudapy/test_libdevice.py +194 -0
  353. numba_cuda/numba/cuda/tests/cudapy/test_lineinfo.py +220 -0
  354. numba_cuda/numba/cuda/tests/cudapy/test_localmem.py +173 -0
  355. numba_cuda/numba/cuda/tests/cudapy/test_make_function_to_jit_function.py +364 -0
  356. numba_cuda/numba/cuda/tests/cudapy/test_mandel.py +47 -0
  357. numba_cuda/numba/cuda/tests/cudapy/test_math.py +842 -0
  358. numba_cuda/numba/cuda/tests/cudapy/test_matmul.py +76 -0
  359. numba_cuda/numba/cuda/tests/cudapy/test_minmax.py +78 -0
  360. numba_cuda/numba/cuda/tests/cudapy/test_montecarlo.py +25 -0
  361. numba_cuda/numba/cuda/tests/cudapy/test_multigpu.py +145 -0
  362. numba_cuda/numba/cuda/tests/cudapy/test_multiprocessing.py +39 -0
  363. numba_cuda/numba/cuda/tests/cudapy/test_multithreads.py +82 -0
  364. numba_cuda/numba/cuda/tests/cudapy/test_nondet.py +53 -0
  365. numba_cuda/numba/cuda/tests/cudapy/test_operator.py +504 -0
  366. numba_cuda/numba/cuda/tests/cudapy/test_optimization.py +93 -0
  367. numba_cuda/numba/cuda/tests/cudapy/test_overload.py +402 -0
  368. numba_cuda/numba/cuda/tests/cudapy/test_powi.py +128 -0
  369. numba_cuda/numba/cuda/tests/cudapy/test_print.py +193 -0
  370. numba_cuda/numba/cuda/tests/cudapy/test_py2_div_issue.py +37 -0
  371. numba_cuda/numba/cuda/tests/cudapy/test_random.py +117 -0
  372. numba_cuda/numba/cuda/tests/cudapy/test_record_dtype.py +614 -0
  373. numba_cuda/numba/cuda/tests/cudapy/test_recursion.py +130 -0
  374. numba_cuda/numba/cuda/tests/cudapy/test_reduction.py +94 -0
  375. numba_cuda/numba/cuda/tests/cudapy/test_retrieve_autoconverted_arrays.py +83 -0
  376. numba_cuda/numba/cuda/tests/cudapy/test_serialize.py +86 -0
  377. numba_cuda/numba/cuda/tests/cudapy/test_slicing.py +40 -0
  378. numba_cuda/numba/cuda/tests/cudapy/test_sm.py +457 -0
  379. numba_cuda/numba/cuda/tests/cudapy/test_sm_creation.py +233 -0
  380. numba_cuda/numba/cuda/tests/cudapy/test_ssa.py +454 -0
  381. numba_cuda/numba/cuda/tests/cudapy/test_stream_api.py +56 -0
  382. numba_cuda/numba/cuda/tests/cudapy/test_sync.py +277 -0
  383. numba_cuda/numba/cuda/tests/cudapy/test_tracing.py +200 -0
  384. numba_cuda/numba/cuda/tests/cudapy/test_transpose.py +90 -0
  385. numba_cuda/numba/cuda/tests/cudapy/test_typeconv.py +333 -0
  386. numba_cuda/numba/cuda/tests/cudapy/test_typeinfer.py +538 -0
  387. numba_cuda/numba/cuda/tests/cudapy/test_ufuncs.py +585 -0
  388. numba_cuda/numba/cuda/tests/cudapy/test_userexc.py +42 -0
  389. numba_cuda/numba/cuda/tests/cudapy/test_vector_type.py +485 -0
  390. numba_cuda/numba/cuda/tests/cudapy/test_vectorize.py +312 -0
  391. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_complex.py +23 -0
  392. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_decor.py +183 -0
  393. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_device.py +40 -0
  394. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_scalar_arg.py +40 -0
  395. numba_cuda/numba/cuda/tests/cudapy/test_warning.py +206 -0
  396. numba_cuda/numba/cuda/tests/cudapy/test_warp_ops.py +331 -0
  397. numba_cuda/numba/cuda/tests/cudasim/__init__.py +9 -0
  398. numba_cuda/numba/cuda/tests/cudasim/support.py +9 -0
  399. numba_cuda/numba/cuda/tests/cudasim/test_cudasim_issues.py +111 -0
  400. numba_cuda/numba/cuda/tests/data/__init__.py +2 -0
  401. numba_cuda/numba/cuda/tests/data/cta_barrier.cu +28 -0
  402. numba_cuda/numba/cuda/tests/data/cuda_include.cu +10 -0
  403. numba_cuda/numba/cuda/tests/data/error.cu +12 -0
  404. numba_cuda/numba/cuda/tests/data/include/add.cuh +8 -0
  405. numba_cuda/numba/cuda/tests/data/jitlink.cu +28 -0
  406. numba_cuda/numba/cuda/tests/data/jitlink.ptx +49 -0
  407. numba_cuda/numba/cuda/tests/data/warn.cu +12 -0
  408. numba_cuda/numba/cuda/tests/doc_examples/__init__.py +9 -0
  409. numba_cuda/numba/cuda/tests/doc_examples/ffi/__init__.py +2 -0
  410. numba_cuda/numba/cuda/tests/doc_examples/ffi/functions.cu +54 -0
  411. numba_cuda/numba/cuda/tests/doc_examples/ffi/include/mul.cuh +8 -0
  412. numba_cuda/numba/cuda/tests/doc_examples/ffi/saxpy.cu +14 -0
  413. numba_cuda/numba/cuda/tests/doc_examples/test_cg.py +86 -0
  414. numba_cuda/numba/cuda/tests/doc_examples/test_cpointer.py +68 -0
  415. numba_cuda/numba/cuda/tests/doc_examples/test_cpu_gpu_compat.py +81 -0
  416. numba_cuda/numba/cuda/tests/doc_examples/test_ffi.py +141 -0
  417. numba_cuda/numba/cuda/tests/doc_examples/test_laplace.py +160 -0
  418. numba_cuda/numba/cuda/tests/doc_examples/test_matmul.py +180 -0
  419. numba_cuda/numba/cuda/tests/doc_examples/test_montecarlo.py +119 -0
  420. numba_cuda/numba/cuda/tests/doc_examples/test_random.py +66 -0
  421. numba_cuda/numba/cuda/tests/doc_examples/test_reduction.py +80 -0
  422. numba_cuda/numba/cuda/tests/doc_examples/test_sessionize.py +206 -0
  423. numba_cuda/numba/cuda/tests/doc_examples/test_ufunc.py +53 -0
  424. numba_cuda/numba/cuda/tests/doc_examples/test_vecadd.py +76 -0
  425. numba_cuda/numba/cuda/tests/nocuda/__init__.py +9 -0
  426. numba_cuda/numba/cuda/tests/nocuda/test_dummyarray.py +391 -0
  427. numba_cuda/numba/cuda/tests/nocuda/test_function_resolution.py +48 -0
  428. numba_cuda/numba/cuda/tests/nocuda/test_import.py +63 -0
  429. numba_cuda/numba/cuda/tests/nocuda/test_library_lookup.py +252 -0
  430. numba_cuda/numba/cuda/tests/nocuda/test_nvvm.py +59 -0
  431. numba_cuda/numba/cuda/tests/nrt/__init__.py +9 -0
  432. numba_cuda/numba/cuda/tests/nrt/test_nrt.py +387 -0
  433. numba_cuda/numba/cuda/tests/nrt/test_nrt_refct.py +124 -0
  434. numba_cuda/numba/cuda/tests/support.py +900 -0
  435. numba_cuda/numba/cuda/typeconv/__init__.py +4 -0
  436. numba_cuda/numba/cuda/typeconv/castgraph.py +137 -0
  437. numba_cuda/numba/cuda/typeconv/rules.py +63 -0
  438. numba_cuda/numba/cuda/typeconv/typeconv.py +121 -0
  439. numba_cuda/numba/cuda/types/__init__.py +233 -0
  440. numba_cuda/numba/cuda/types/__init__.pyi +167 -0
  441. numba_cuda/numba/cuda/types/abstract.py +9 -0
  442. numba_cuda/numba/cuda/types/common.py +9 -0
  443. numba_cuda/numba/cuda/types/containers.py +9 -0
  444. numba_cuda/numba/cuda/types/cuda_abstract.py +533 -0
  445. numba_cuda/numba/cuda/types/cuda_common.py +110 -0
  446. numba_cuda/numba/cuda/types/cuda_containers.py +971 -0
  447. numba_cuda/numba/cuda/types/cuda_function_type.py +230 -0
  448. numba_cuda/numba/cuda/types/cuda_functions.py +798 -0
  449. numba_cuda/numba/cuda/types/cuda_iterators.py +120 -0
  450. numba_cuda/numba/cuda/types/cuda_misc.py +569 -0
  451. numba_cuda/numba/cuda/types/cuda_npytypes.py +690 -0
  452. numba_cuda/numba/cuda/types/cuda_scalars.py +280 -0
  453. numba_cuda/numba/cuda/types/ext_types.py +101 -0
  454. numba_cuda/numba/cuda/types/function_type.py +11 -0
  455. numba_cuda/numba/cuda/types/functions.py +9 -0
  456. numba_cuda/numba/cuda/types/iterators.py +9 -0
  457. numba_cuda/numba/cuda/types/misc.py +9 -0
  458. numba_cuda/numba/cuda/types/npytypes.py +9 -0
  459. numba_cuda/numba/cuda/types/scalars.py +9 -0
  460. numba_cuda/numba/cuda/typing/__init__.py +19 -0
  461. numba_cuda/numba/cuda/typing/arraydecl.py +939 -0
  462. numba_cuda/numba/cuda/typing/asnumbatype.py +130 -0
  463. numba_cuda/numba/cuda/typing/bufproto.py +70 -0
  464. numba_cuda/numba/cuda/typing/builtins.py +1209 -0
  465. numba_cuda/numba/cuda/typing/cffi_utils.py +219 -0
  466. numba_cuda/numba/cuda/typing/cmathdecl.py +47 -0
  467. numba_cuda/numba/cuda/typing/collections.py +138 -0
  468. numba_cuda/numba/cuda/typing/context.py +782 -0
  469. numba_cuda/numba/cuda/typing/ctypes_utils.py +125 -0
  470. numba_cuda/numba/cuda/typing/dictdecl.py +63 -0
  471. numba_cuda/numba/cuda/typing/enumdecl.py +74 -0
  472. numba_cuda/numba/cuda/typing/listdecl.py +147 -0
  473. numba_cuda/numba/cuda/typing/mathdecl.py +158 -0
  474. numba_cuda/numba/cuda/typing/npdatetime.py +322 -0
  475. numba_cuda/numba/cuda/typing/npydecl.py +749 -0
  476. numba_cuda/numba/cuda/typing/setdecl.py +115 -0
  477. numba_cuda/numba/cuda/typing/templates.py +1446 -0
  478. numba_cuda/numba/cuda/typing/typeof.py +301 -0
  479. numba_cuda/numba/cuda/ufuncs.py +746 -0
  480. numba_cuda/numba/cuda/utils.py +724 -0
  481. numba_cuda/numba/cuda/vector_types.py +214 -0
  482. numba_cuda/numba/cuda/vectorizers.py +260 -0
  483. numba_cuda-0.21.1.dist-info/METADATA +109 -0
  484. numba_cuda-0.21.1.dist-info/RECORD +488 -0
  485. numba_cuda-0.21.1.dist-info/WHEEL +5 -0
  486. numba_cuda-0.21.1.dist-info/licenses/LICENSE +26 -0
  487. numba_cuda-0.21.1.dist-info/licenses/LICENSE.numba +24 -0
  488. numba_cuda-0.21.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1282 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: BSD-2-Clause
3
+
4
+ """This file contains information on how to translate different ufuncs
5
+ into numba. It is a database of different ufuncs and how each of its
6
+ loops maps to a function that implements the inner kernel of that ufunc
7
+ (the inner kernel being the per-element function).
8
+
9
+ Use the function get_ufunc_info to get the information related to the
10
+ ufunc
11
+ """
12
+
13
+ import numpy as np
14
+ import sys
15
+
16
+ # this is lazily initialized to avoid circular imports
17
+ IS_WIN32 = sys.platform.startswith("win32")
18
+ numpy_version = tuple(map(int, np.__version__.split(".")[:2]))
19
+ _ufunc_db = None
20
+
21
+
22
+ def _lazy_init_db():
23
+ global _ufunc_db
24
+
25
+ if _ufunc_db is None:
26
+ _ufunc_db = {}
27
+ _fill_ufunc_db(_ufunc_db)
28
+
29
+
30
+ def get_ufuncs():
31
+ """obtain a list of supported ufuncs in the db"""
32
+ _lazy_init_db()
33
+ return _ufunc_db.keys()
34
+
35
+
36
+ def get_ufunc_info(ufunc_key):
37
+ """get the lowering information for the ufunc with key ufunc_key.
38
+
39
+ The lowering information is a dictionary that maps from a numpy
40
+ loop string (as given by the ufunc types attribute) to a function
41
+ that handles code generation for a scalar version of the ufunc
42
+ (that is, generates the "per element" operation").
43
+
44
+ raises a KeyError if the ufunc is not in the ufunc_db
45
+ """
46
+ _lazy_init_db()
47
+ return _ufunc_db[ufunc_key]
48
+
49
+
50
+ def _fill_ufunc_db(ufunc_db):
51
+ # some of these imports would cause a problem of circular
52
+ # imports if done at global scope when importing the numba
53
+ # module.
54
+ from numba.cuda.np import npyfuncs
55
+ from numba.cuda.np.math import cmathimpl, mathimpl, numbers
56
+ from numba.cuda.np.numpy_support import numpy_version
57
+
58
+ ufunc_db[np.isnat] = {
59
+ # datetime & timedelta
60
+ "M->?": npyfuncs.np_datetime_isnat_impl,
61
+ "m->?": npyfuncs.np_datetime_isnat_impl,
62
+ }
63
+
64
+ ufunc_db[np.negative] = {
65
+ "?->?": numbers.int_invert_impl,
66
+ "b->b": numbers.int_negate_impl,
67
+ "B->B": numbers.int_negate_impl,
68
+ "h->h": numbers.int_negate_impl,
69
+ "H->H": numbers.int_negate_impl,
70
+ "i->i": numbers.int_negate_impl,
71
+ "I->I": numbers.int_negate_impl,
72
+ "l->l": numbers.int_negate_impl,
73
+ "L->L": numbers.int_negate_impl,
74
+ "q->q": numbers.int_negate_impl,
75
+ "Q->Q": numbers.int_negate_impl,
76
+ "f->f": numbers.real_negate_impl,
77
+ "d->d": numbers.real_negate_impl,
78
+ "F->F": numbers.complex_negate_impl,
79
+ "D->D": numbers.complex_negate_impl,
80
+ }
81
+
82
+ ufunc_db[np.positive] = {
83
+ "?->?": numbers.int_positive_impl,
84
+ "b->b": numbers.int_positive_impl,
85
+ "B->B": numbers.int_positive_impl,
86
+ "h->h": numbers.int_positive_impl,
87
+ "H->H": numbers.int_positive_impl,
88
+ "i->i": numbers.int_positive_impl,
89
+ "I->I": numbers.int_positive_impl,
90
+ "l->l": numbers.int_positive_impl,
91
+ "L->L": numbers.int_positive_impl,
92
+ "q->q": numbers.int_positive_impl,
93
+ "Q->Q": numbers.int_positive_impl,
94
+ "f->f": numbers.real_positive_impl,
95
+ "d->d": numbers.real_positive_impl,
96
+ "F->F": numbers.complex_positive_impl,
97
+ "D->D": numbers.complex_positive_impl,
98
+ }
99
+
100
+ ufunc_db[np.absolute] = {
101
+ "?->?": numbers.int_abs_impl,
102
+ "b->b": numbers.int_abs_impl,
103
+ "B->B": numbers.uint_abs_impl,
104
+ "h->h": numbers.int_abs_impl,
105
+ "H->H": numbers.uint_abs_impl,
106
+ "i->i": numbers.int_abs_impl,
107
+ "I->I": numbers.uint_abs_impl,
108
+ "l->l": numbers.int_abs_impl,
109
+ "L->L": numbers.uint_abs_impl,
110
+ "q->q": numbers.int_abs_impl,
111
+ "Q->Q": numbers.uint_abs_impl,
112
+ "f->f": numbers.real_abs_impl,
113
+ "d->d": numbers.real_abs_impl,
114
+ "F->f": numbers.complex_abs_impl,
115
+ "D->d": numbers.complex_abs_impl,
116
+ }
117
+
118
+ ufunc_db[np.sign] = {
119
+ "b->b": numbers.int_sign_impl,
120
+ "B->B": numbers.int_sign_impl,
121
+ "h->h": numbers.int_sign_impl,
122
+ "H->H": numbers.int_sign_impl,
123
+ "i->i": numbers.int_sign_impl,
124
+ "I->I": numbers.int_sign_impl,
125
+ "l->l": numbers.int_sign_impl,
126
+ "L->L": numbers.int_sign_impl,
127
+ "q->q": numbers.int_sign_impl,
128
+ "Q->Q": numbers.int_sign_impl,
129
+ "f->f": numbers.real_sign_impl,
130
+ "d->d": numbers.real_sign_impl,
131
+ "F->F": npyfuncs.np_complex_sign_impl,
132
+ "D->D": npyfuncs.np_complex_sign_impl,
133
+ }
134
+
135
+ ufunc_db[np.add] = {
136
+ "??->?": numbers.int_or_impl,
137
+ "bb->b": numbers.int_add_impl,
138
+ "BB->B": numbers.int_add_impl,
139
+ "hh->h": numbers.int_add_impl,
140
+ "HH->H": numbers.int_add_impl,
141
+ "ii->i": numbers.int_add_impl,
142
+ "II->I": numbers.int_add_impl,
143
+ "ll->l": numbers.int_add_impl,
144
+ "LL->L": numbers.int_add_impl,
145
+ "qq->q": numbers.int_add_impl,
146
+ "QQ->Q": numbers.int_add_impl,
147
+ "ff->f": numbers.real_add_impl,
148
+ "dd->d": numbers.real_add_impl,
149
+ "FF->F": numbers.complex_add_impl,
150
+ "DD->D": numbers.complex_add_impl,
151
+ }
152
+
153
+ ufunc_db[np.subtract] = {
154
+ "??->?": numbers.int_xor_impl,
155
+ "bb->b": numbers.int_sub_impl,
156
+ "BB->B": numbers.int_sub_impl,
157
+ "hh->h": numbers.int_sub_impl,
158
+ "HH->H": numbers.int_sub_impl,
159
+ "ii->i": numbers.int_sub_impl,
160
+ "II->I": numbers.int_sub_impl,
161
+ "ll->l": numbers.int_sub_impl,
162
+ "LL->L": numbers.int_sub_impl,
163
+ "qq->q": numbers.int_sub_impl,
164
+ "QQ->Q": numbers.int_sub_impl,
165
+ "ff->f": numbers.real_sub_impl,
166
+ "dd->d": numbers.real_sub_impl,
167
+ "FF->F": numbers.complex_sub_impl,
168
+ "DD->D": numbers.complex_sub_impl,
169
+ }
170
+
171
+ ufunc_db[np.multiply] = {
172
+ "??->?": numbers.int_and_impl,
173
+ "bb->b": numbers.int_mul_impl,
174
+ "BB->B": numbers.int_mul_impl,
175
+ "hh->h": numbers.int_mul_impl,
176
+ "HH->H": numbers.int_mul_impl,
177
+ "ii->i": numbers.int_mul_impl,
178
+ "II->I": numbers.int_mul_impl,
179
+ "ll->l": numbers.int_mul_impl,
180
+ "LL->L": numbers.int_mul_impl,
181
+ "qq->q": numbers.int_mul_impl,
182
+ "QQ->Q": numbers.int_mul_impl,
183
+ "ff->f": numbers.real_mul_impl,
184
+ "dd->d": numbers.real_mul_impl,
185
+ "FF->F": numbers.complex_mul_impl,
186
+ "DD->D": numbers.complex_mul_impl,
187
+ }
188
+
189
+ if np.divide != np.true_divide:
190
+ ufunc_db[np.divide] = {
191
+ "bb->b": npyfuncs.np_int_sdiv_impl,
192
+ "BB->B": npyfuncs.np_int_udiv_impl,
193
+ "hh->h": npyfuncs.np_int_sdiv_impl,
194
+ "HH->H": npyfuncs.np_int_udiv_impl,
195
+ "ii->i": npyfuncs.np_int_sdiv_impl,
196
+ "II->I": npyfuncs.np_int_udiv_impl,
197
+ "ll->l": npyfuncs.np_int_sdiv_impl,
198
+ "LL->L": npyfuncs.np_int_udiv_impl,
199
+ "qq->q": npyfuncs.np_int_sdiv_impl,
200
+ "QQ->Q": npyfuncs.np_int_udiv_impl,
201
+ "ff->f": npyfuncs.np_real_div_impl,
202
+ "dd->d": npyfuncs.np_real_div_impl,
203
+ "FF->F": npyfuncs.np_complex_div_impl,
204
+ "DD->D": npyfuncs.np_complex_div_impl,
205
+ }
206
+
207
+ ufunc_db[np.true_divide] = {
208
+ "bb->d": npyfuncs.np_int_truediv_impl,
209
+ "BB->d": npyfuncs.np_int_truediv_impl,
210
+ "hh->d": npyfuncs.np_int_truediv_impl,
211
+ "HH->d": npyfuncs.np_int_truediv_impl,
212
+ "ii->d": npyfuncs.np_int_truediv_impl,
213
+ "II->d": npyfuncs.np_int_truediv_impl,
214
+ "ll->d": npyfuncs.np_int_truediv_impl,
215
+ "LL->d": npyfuncs.np_int_truediv_impl,
216
+ "qq->d": npyfuncs.np_int_truediv_impl,
217
+ "QQ->d": npyfuncs.np_int_truediv_impl,
218
+ "ff->f": npyfuncs.np_real_div_impl,
219
+ "dd->d": npyfuncs.np_real_div_impl,
220
+ "FF->F": npyfuncs.np_complex_div_impl,
221
+ "DD->D": npyfuncs.np_complex_div_impl,
222
+ }
223
+
224
+ ufunc_db[np.floor_divide] = {
225
+ "bb->b": npyfuncs.np_int_sdiv_impl,
226
+ "BB->B": npyfuncs.np_int_udiv_impl,
227
+ "hh->h": npyfuncs.np_int_sdiv_impl,
228
+ "HH->H": npyfuncs.np_int_udiv_impl,
229
+ "ii->i": npyfuncs.np_int_sdiv_impl,
230
+ "II->I": npyfuncs.np_int_udiv_impl,
231
+ "ll->l": npyfuncs.np_int_sdiv_impl,
232
+ "LL->L": npyfuncs.np_int_udiv_impl,
233
+ "qq->q": npyfuncs.np_int_sdiv_impl,
234
+ "QQ->Q": npyfuncs.np_int_udiv_impl,
235
+ "ff->f": npyfuncs.np_real_floor_div_impl,
236
+ "dd->d": npyfuncs.np_real_floor_div_impl,
237
+ }
238
+
239
+ ufunc_db[np.remainder] = {
240
+ "bb->b": npyfuncs.np_int_srem_impl,
241
+ "BB->B": npyfuncs.np_int_urem_impl,
242
+ "hh->h": npyfuncs.np_int_srem_impl,
243
+ "HH->H": npyfuncs.np_int_urem_impl,
244
+ "ii->i": npyfuncs.np_int_srem_impl,
245
+ "II->I": npyfuncs.np_int_urem_impl,
246
+ "ll->l": npyfuncs.np_int_srem_impl,
247
+ "LL->L": npyfuncs.np_int_urem_impl,
248
+ "qq->q": npyfuncs.np_int_srem_impl,
249
+ "QQ->Q": npyfuncs.np_int_urem_impl,
250
+ "ff->f": npyfuncs.np_real_mod_impl,
251
+ "dd->d": npyfuncs.np_real_mod_impl,
252
+ }
253
+
254
+ ufunc_db[np.divmod] = {
255
+ "bb->bb": npyfuncs.np_int_sdivrem_impl,
256
+ "BB->BB": npyfuncs.np_int_udivrem_impl,
257
+ "hh->hh": npyfuncs.np_int_sdivrem_impl,
258
+ "HH->HH": npyfuncs.np_int_udivrem_impl,
259
+ "ii->ii": npyfuncs.np_int_sdivrem_impl,
260
+ "II->II": npyfuncs.np_int_udivrem_impl,
261
+ "ll->ll": npyfuncs.np_int_sdivrem_impl,
262
+ "LL->LL": npyfuncs.np_int_udivrem_impl,
263
+ "qq->qq": npyfuncs.np_int_sdivrem_impl,
264
+ "QQ->QQ": npyfuncs.np_int_udivrem_impl,
265
+ "ff->ff": npyfuncs.np_real_divmod_impl,
266
+ "dd->dd": npyfuncs.np_real_divmod_impl,
267
+ }
268
+
269
+ ufunc_db[np.fmod] = {
270
+ "bb->b": npyfuncs.np_int_fmod_impl,
271
+ "BB->B": npyfuncs.np_int_fmod_impl,
272
+ "hh->h": npyfuncs.np_int_fmod_impl,
273
+ "HH->H": npyfuncs.np_int_fmod_impl,
274
+ "ii->i": npyfuncs.np_int_fmod_impl,
275
+ "II->I": npyfuncs.np_int_fmod_impl,
276
+ "ll->l": npyfuncs.np_int_fmod_impl,
277
+ "LL->L": npyfuncs.np_int_fmod_impl,
278
+ "qq->q": npyfuncs.np_int_fmod_impl,
279
+ "QQ->Q": npyfuncs.np_int_fmod_impl,
280
+ "ff->f": npyfuncs.np_real_fmod_impl,
281
+ "dd->d": npyfuncs.np_real_fmod_impl,
282
+ }
283
+
284
+ ufunc_db[np.logaddexp] = {
285
+ "ff->f": npyfuncs.np_real_logaddexp_impl,
286
+ "dd->d": npyfuncs.np_real_logaddexp_impl,
287
+ }
288
+
289
+ ufunc_db[np.logaddexp2] = {
290
+ "ff->f": npyfuncs.np_real_logaddexp2_impl,
291
+ "dd->d": npyfuncs.np_real_logaddexp2_impl,
292
+ }
293
+
294
+ ufunc_db[np.power] = {
295
+ "bb->b": numbers.int_power_impl,
296
+ "BB->B": numbers.int_power_impl,
297
+ "hh->h": numbers.int_power_impl,
298
+ "HH->H": numbers.int_power_impl,
299
+ "ii->i": numbers.int_power_impl,
300
+ "II->I": numbers.int_power_impl,
301
+ "ll->l": numbers.int_power_impl,
302
+ "LL->L": numbers.int_power_impl,
303
+ "qq->q": numbers.int_power_impl,
304
+ "QQ->Q": numbers.int_power_impl,
305
+ # XXX we would like to use `int_power_impl` for real ** integer
306
+ # as well (for better performance), but the current ufunc typing
307
+ # rules forbid that
308
+ "ff->f": numbers.real_power_impl,
309
+ "dd->d": numbers.real_power_impl,
310
+ "FF->F": npyfuncs.np_complex_power_impl,
311
+ "DD->D": npyfuncs.np_complex_power_impl,
312
+ }
313
+
314
+ ufunc_db[np.float_power] = {
315
+ "ff->f": npyfuncs.real_float_power_impl,
316
+ "dd->d": npyfuncs.real_float_power_impl,
317
+ "FF->F": npyfuncs.np_complex_float_power_impl,
318
+ "DD->D": npyfuncs.np_complex_float_power_impl,
319
+ }
320
+
321
+ ufunc_db[np.gcd] = {
322
+ "bb->b": npyfuncs.np_gcd_impl,
323
+ "BB->B": npyfuncs.np_gcd_impl,
324
+ "hh->h": npyfuncs.np_gcd_impl,
325
+ "HH->H": npyfuncs.np_gcd_impl,
326
+ "ii->i": npyfuncs.np_gcd_impl,
327
+ "II->I": npyfuncs.np_gcd_impl,
328
+ "ll->l": npyfuncs.np_gcd_impl,
329
+ "LL->L": npyfuncs.np_gcd_impl,
330
+ "qq->q": npyfuncs.np_gcd_impl,
331
+ "QQ->Q": npyfuncs.np_gcd_impl,
332
+ }
333
+
334
+ ufunc_db[np.lcm] = {
335
+ "bb->b": npyfuncs.np_lcm_impl,
336
+ "BB->B": npyfuncs.np_lcm_impl,
337
+ "hh->h": npyfuncs.np_lcm_impl,
338
+ "HH->H": npyfuncs.np_lcm_impl,
339
+ "ii->i": npyfuncs.np_lcm_impl,
340
+ "II->I": npyfuncs.np_lcm_impl,
341
+ "ll->l": npyfuncs.np_lcm_impl,
342
+ "LL->L": npyfuncs.np_lcm_impl,
343
+ "qq->q": npyfuncs.np_lcm_impl,
344
+ "QQ->Q": npyfuncs.np_lcm_impl,
345
+ }
346
+
347
+ ufunc_db[np.rint] = {
348
+ "f->f": npyfuncs.np_real_rint_impl,
349
+ "d->d": npyfuncs.np_real_rint_impl,
350
+ "F->F": npyfuncs.np_complex_rint_impl,
351
+ "D->D": npyfuncs.np_complex_rint_impl,
352
+ }
353
+
354
+ ufunc_db[np.conjugate] = {
355
+ "b->b": numbers.real_conjugate_impl,
356
+ "B->B": numbers.real_conjugate_impl,
357
+ "h->h": numbers.real_conjugate_impl,
358
+ "H->H": numbers.real_conjugate_impl,
359
+ "i->i": numbers.real_conjugate_impl,
360
+ "I->I": numbers.real_conjugate_impl,
361
+ "l->l": numbers.real_conjugate_impl,
362
+ "L->L": numbers.real_conjugate_impl,
363
+ "q->q": numbers.real_conjugate_impl,
364
+ "Q->Q": numbers.real_conjugate_impl,
365
+ "f->f": numbers.real_conjugate_impl,
366
+ "d->d": numbers.real_conjugate_impl,
367
+ "F->F": numbers.complex_conjugate_impl,
368
+ "D->D": numbers.complex_conjugate_impl,
369
+ }
370
+
371
+ ufunc_db[np.exp] = {
372
+ "f->f": npyfuncs.np_real_exp_impl,
373
+ "d->d": npyfuncs.np_real_exp_impl,
374
+ "F->F": npyfuncs.np_complex_exp_impl,
375
+ "D->D": npyfuncs.np_complex_exp_impl,
376
+ }
377
+
378
+ ufunc_db[np.exp2] = {
379
+ "f->f": npyfuncs.np_real_exp2_impl,
380
+ "d->d": npyfuncs.np_real_exp2_impl,
381
+ "F->F": npyfuncs.np_complex_exp2_impl,
382
+ "D->D": npyfuncs.np_complex_exp2_impl,
383
+ }
384
+
385
+ ufunc_db[np.log] = {
386
+ "f->f": npyfuncs.np_real_log_impl,
387
+ "d->d": npyfuncs.np_real_log_impl,
388
+ "F->F": npyfuncs.np_complex_log_impl,
389
+ "D->D": npyfuncs.np_complex_log_impl,
390
+ }
391
+
392
+ ufunc_db[np.log2] = {
393
+ "f->f": npyfuncs.np_real_log2_impl,
394
+ "d->d": npyfuncs.np_real_log2_impl,
395
+ "F->F": npyfuncs.np_complex_log2_impl,
396
+ "D->D": npyfuncs.np_complex_log2_impl,
397
+ }
398
+
399
+ ufunc_db[np.log10] = {
400
+ "f->f": npyfuncs.np_real_log10_impl,
401
+ "d->d": npyfuncs.np_real_log10_impl,
402
+ "F->F": npyfuncs.np_complex_log10_impl,
403
+ "D->D": npyfuncs.np_complex_log10_impl,
404
+ }
405
+
406
+ ufunc_db[np.expm1] = {
407
+ "f->f": npyfuncs.np_real_expm1_impl,
408
+ "d->d": npyfuncs.np_real_expm1_impl,
409
+ "F->F": npyfuncs.np_complex_expm1_impl,
410
+ "D->D": npyfuncs.np_complex_expm1_impl,
411
+ }
412
+
413
+ ufunc_db[np.log1p] = {
414
+ "f->f": npyfuncs.np_real_log1p_impl,
415
+ "d->d": npyfuncs.np_real_log1p_impl,
416
+ "F->F": npyfuncs.np_complex_log1p_impl,
417
+ "D->D": npyfuncs.np_complex_log1p_impl,
418
+ }
419
+
420
+ ufunc_db[np.sqrt] = {
421
+ "f->f": npyfuncs.np_real_sqrt_impl,
422
+ "d->d": npyfuncs.np_real_sqrt_impl,
423
+ "F->F": npyfuncs.np_complex_sqrt_impl,
424
+ "D->D": npyfuncs.np_complex_sqrt_impl,
425
+ }
426
+
427
+ ufunc_db[np.square] = {
428
+ "b->b": npyfuncs.np_int_square_impl,
429
+ "B->B": npyfuncs.np_int_square_impl,
430
+ "h->h": npyfuncs.np_int_square_impl,
431
+ "H->H": npyfuncs.np_int_square_impl,
432
+ "i->i": npyfuncs.np_int_square_impl,
433
+ "I->I": npyfuncs.np_int_square_impl,
434
+ "l->l": npyfuncs.np_int_square_impl,
435
+ "L->L": npyfuncs.np_int_square_impl,
436
+ "q->q": npyfuncs.np_int_square_impl,
437
+ "Q->Q": npyfuncs.np_int_square_impl,
438
+ "f->f": npyfuncs.np_real_square_impl,
439
+ "d->d": npyfuncs.np_real_square_impl,
440
+ "F->F": npyfuncs.np_complex_square_impl,
441
+ "D->D": npyfuncs.np_complex_square_impl,
442
+ }
443
+
444
+ ufunc_db[np.cbrt] = {
445
+ "f->f": npyfuncs.np_real_cbrt_impl,
446
+ "d->d": npyfuncs.np_real_cbrt_impl,
447
+ }
448
+
449
+ ufunc_db[np.reciprocal] = {
450
+ "b->b": npyfuncs.np_int_reciprocal_impl,
451
+ "B->B": npyfuncs.np_int_reciprocal_impl,
452
+ "h->h": npyfuncs.np_int_reciprocal_impl,
453
+ "H->H": npyfuncs.np_int_reciprocal_impl,
454
+ "i->i": npyfuncs.np_int_reciprocal_impl,
455
+ "I->I": npyfuncs.np_int_reciprocal_impl,
456
+ "l->l": npyfuncs.np_int_reciprocal_impl,
457
+ "L->L": npyfuncs.np_int_reciprocal_impl,
458
+ "q->q": npyfuncs.np_int_reciprocal_impl,
459
+ "Q->Q": npyfuncs.np_int_reciprocal_impl,
460
+ "f->f": npyfuncs.np_real_reciprocal_impl,
461
+ "d->d": npyfuncs.np_real_reciprocal_impl,
462
+ "F->F": npyfuncs.np_complex_reciprocal_impl,
463
+ "D->D": npyfuncs.np_complex_reciprocal_impl,
464
+ }
465
+
466
+ ufunc_db[np.sin] = {
467
+ "f->f": npyfuncs.np_real_sin_impl,
468
+ "d->d": npyfuncs.np_real_sin_impl,
469
+ "F->F": npyfuncs.np_complex_sin_impl,
470
+ "D->D": npyfuncs.np_complex_sin_impl,
471
+ }
472
+
473
+ ufunc_db[np.cos] = {
474
+ "f->f": npyfuncs.np_real_cos_impl,
475
+ "d->d": npyfuncs.np_real_cos_impl,
476
+ "F->F": npyfuncs.np_complex_cos_impl,
477
+ "D->D": npyfuncs.np_complex_cos_impl,
478
+ }
479
+
480
+ tan_impl = cmathimpl.tan_impl
481
+
482
+ ufunc_db[np.tan] = {
483
+ "f->f": npyfuncs.np_real_tan_impl,
484
+ "d->d": npyfuncs.np_real_tan_impl,
485
+ "F->F": tan_impl,
486
+ "D->D": tan_impl,
487
+ }
488
+
489
+ arcsin_impl = cmathimpl.asin_impl
490
+
491
+ ufunc_db[np.arcsin] = {
492
+ "f->f": npyfuncs.np_real_asin_impl,
493
+ "d->d": npyfuncs.np_real_asin_impl,
494
+ "F->F": arcsin_impl,
495
+ "D->D": arcsin_impl,
496
+ }
497
+
498
+ ufunc_db[np.arccos] = {
499
+ "f->f": npyfuncs.np_real_acos_impl,
500
+ "d->d": npyfuncs.np_real_acos_impl,
501
+ "F->F": cmathimpl.acos_impl,
502
+ "D->D": cmathimpl.acos_impl,
503
+ }
504
+
505
+ arctan_impl = cmathimpl.atan_impl
506
+
507
+ ufunc_db[np.arctan] = {
508
+ "f->f": npyfuncs.np_real_atan_impl,
509
+ "d->d": npyfuncs.np_real_atan_impl,
510
+ "F->F": arctan_impl,
511
+ "D->D": arctan_impl,
512
+ }
513
+
514
+ ufunc_db[np.arctan2] = {
515
+ "ff->f": npyfuncs.np_real_atan2_impl,
516
+ "dd->d": npyfuncs.np_real_atan2_impl,
517
+ }
518
+
519
+ ufunc_db[np.hypot] = {
520
+ "ff->f": npyfuncs.np_real_hypot_impl,
521
+ "dd->d": npyfuncs.np_real_hypot_impl,
522
+ }
523
+
524
+ ufunc_db[np.sinh] = {
525
+ "f->f": npyfuncs.np_real_sinh_impl,
526
+ "d->d": npyfuncs.np_real_sinh_impl,
527
+ "F->F": npyfuncs.np_complex_sinh_impl,
528
+ "D->D": npyfuncs.np_complex_sinh_impl,
529
+ }
530
+
531
+ ufunc_db[np.cosh] = {
532
+ "f->f": npyfuncs.np_real_cosh_impl,
533
+ "d->d": npyfuncs.np_real_cosh_impl,
534
+ "F->F": npyfuncs.np_complex_cosh_impl,
535
+ "D->D": npyfuncs.np_complex_cosh_impl,
536
+ }
537
+
538
+ ufunc_db[np.tanh] = {
539
+ "f->f": npyfuncs.np_real_tanh_impl,
540
+ "d->d": npyfuncs.np_real_tanh_impl,
541
+ "F->F": npyfuncs.np_complex_tanh_impl,
542
+ "D->D": npyfuncs.np_complex_tanh_impl,
543
+ }
544
+
545
+ arcsinh_impl = cmathimpl.asinh_impl
546
+
547
+ ufunc_db[np.arcsinh] = {
548
+ "f->f": npyfuncs.np_real_asinh_impl,
549
+ "d->d": npyfuncs.np_real_asinh_impl,
550
+ "F->F": arcsinh_impl,
551
+ "D->D": arcsinh_impl,
552
+ }
553
+
554
+ ufunc_db[np.arccosh] = {
555
+ "f->f": npyfuncs.np_real_acosh_impl,
556
+ "d->d": npyfuncs.np_real_acosh_impl,
557
+ "F->F": npyfuncs.np_complex_acosh_impl,
558
+ "D->D": npyfuncs.np_complex_acosh_impl,
559
+ }
560
+
561
+ arctanh_impl = cmathimpl.atanh_impl
562
+
563
+ ufunc_db[np.arctanh] = {
564
+ "f->f": npyfuncs.np_real_atanh_impl,
565
+ "d->d": npyfuncs.np_real_atanh_impl,
566
+ "F->F": arctanh_impl,
567
+ "D->D": arctanh_impl,
568
+ }
569
+
570
+ ufunc_db[np.deg2rad] = {
571
+ "f->f": mathimpl.radians_float_impl,
572
+ "d->d": mathimpl.radians_float_impl,
573
+ }
574
+
575
+ ufunc_db[np.radians] = ufunc_db[np.deg2rad]
576
+
577
+ ufunc_db[np.rad2deg] = {
578
+ "f->f": mathimpl.degrees_float_impl,
579
+ "d->d": mathimpl.degrees_float_impl,
580
+ }
581
+
582
+ ufunc_db[np.degrees] = ufunc_db[np.rad2deg]
583
+
584
+ ufunc_db[np.floor] = {
585
+ "f->f": npyfuncs.np_real_floor_impl,
586
+ "d->d": npyfuncs.np_real_floor_impl,
587
+ }
588
+ if numpy_version >= (2, 1):
589
+ ufunc_db[np.floor].update(
590
+ {
591
+ "?->?": numbers.identity_impl,
592
+ "b->b": numbers.identity_impl,
593
+ "B->B": numbers.identity_impl,
594
+ "h->h": numbers.identity_impl,
595
+ "H->H": numbers.identity_impl,
596
+ "i->i": numbers.identity_impl,
597
+ "I->I": numbers.identity_impl,
598
+ "l->l": numbers.identity_impl,
599
+ "L->L": numbers.identity_impl,
600
+ "q->q": numbers.identity_impl,
601
+ "Q->Q": numbers.identity_impl,
602
+ }
603
+ )
604
+
605
+ ufunc_db[np.ceil] = {
606
+ "f->f": npyfuncs.np_real_ceil_impl,
607
+ "d->d": npyfuncs.np_real_ceil_impl,
608
+ }
609
+ if numpy_version >= (2, 1):
610
+ ufunc_db[np.ceil].update(
611
+ {
612
+ "?->?": numbers.identity_impl,
613
+ "b->b": numbers.identity_impl,
614
+ "B->B": numbers.identity_impl,
615
+ "h->h": numbers.identity_impl,
616
+ "H->H": numbers.identity_impl,
617
+ "i->i": numbers.identity_impl,
618
+ "I->I": numbers.identity_impl,
619
+ "l->l": numbers.identity_impl,
620
+ "L->L": numbers.identity_impl,
621
+ "q->q": numbers.identity_impl,
622
+ "Q->Q": numbers.identity_impl,
623
+ }
624
+ )
625
+
626
+ ufunc_db[np.trunc] = {
627
+ "f->f": npyfuncs.np_real_trunc_impl,
628
+ "d->d": npyfuncs.np_real_trunc_impl,
629
+ }
630
+ if numpy_version >= (2, 1):
631
+ ufunc_db[np.trunc].update(
632
+ {
633
+ "?->?": numbers.identity_impl,
634
+ "b->b": numbers.identity_impl,
635
+ "B->B": numbers.identity_impl,
636
+ "h->h": numbers.identity_impl,
637
+ "H->H": numbers.identity_impl,
638
+ "i->i": numbers.identity_impl,
639
+ "I->I": numbers.identity_impl,
640
+ "l->l": numbers.identity_impl,
641
+ "L->L": numbers.identity_impl,
642
+ "q->q": numbers.identity_impl,
643
+ "Q->Q": numbers.identity_impl,
644
+ }
645
+ )
646
+
647
+ ufunc_db[np.fabs] = {
648
+ "f->f": npyfuncs.np_real_fabs_impl,
649
+ "d->d": npyfuncs.np_real_fabs_impl,
650
+ }
651
+
652
+ # logical ufuncs
653
+ ufunc_db[np.greater] = {
654
+ "??->?": numbers.int_ugt_impl,
655
+ "bb->?": numbers.int_sgt_impl,
656
+ "BB->?": numbers.int_ugt_impl,
657
+ "hh->?": numbers.int_sgt_impl,
658
+ "HH->?": numbers.int_ugt_impl,
659
+ "ii->?": numbers.int_sgt_impl,
660
+ "II->?": numbers.int_ugt_impl,
661
+ "ll->?": numbers.int_sgt_impl,
662
+ "LL->?": numbers.int_ugt_impl,
663
+ "qq->?": numbers.int_sgt_impl,
664
+ "QQ->?": numbers.int_ugt_impl,
665
+ "ff->?": numbers.real_gt_impl,
666
+ "dd->?": numbers.real_gt_impl,
667
+ "FF->?": npyfuncs.np_complex_gt_impl,
668
+ "DD->?": npyfuncs.np_complex_gt_impl,
669
+ }
670
+ if numpy_version >= (1, 25):
671
+ ufunc_db[np.greater].update(
672
+ {
673
+ "qQ->?": numbers.int_signed_unsigned_cmp(">"),
674
+ "Qq->?": numbers.int_unsigned_signed_cmp(">"),
675
+ }
676
+ )
677
+
678
+ ufunc_db[np.greater_equal] = {
679
+ "??->?": numbers.int_uge_impl,
680
+ "bb->?": numbers.int_sge_impl,
681
+ "BB->?": numbers.int_uge_impl,
682
+ "hh->?": numbers.int_sge_impl,
683
+ "HH->?": numbers.int_uge_impl,
684
+ "ii->?": numbers.int_sge_impl,
685
+ "II->?": numbers.int_uge_impl,
686
+ "ll->?": numbers.int_sge_impl,
687
+ "LL->?": numbers.int_uge_impl,
688
+ "qq->?": numbers.int_sge_impl,
689
+ "QQ->?": numbers.int_uge_impl,
690
+ "ff->?": numbers.real_ge_impl,
691
+ "dd->?": numbers.real_ge_impl,
692
+ "FF->?": npyfuncs.np_complex_ge_impl,
693
+ "DD->?": npyfuncs.np_complex_ge_impl,
694
+ }
695
+ if numpy_version >= (1, 25):
696
+ ufunc_db[np.greater_equal].update(
697
+ {
698
+ "qQ->?": numbers.int_signed_unsigned_cmp(">="),
699
+ "Qq->?": numbers.int_unsigned_signed_cmp(">="),
700
+ }
701
+ )
702
+
703
+ ufunc_db[np.less] = {
704
+ "??->?": numbers.int_ult_impl,
705
+ "bb->?": numbers.int_slt_impl,
706
+ "BB->?": numbers.int_ult_impl,
707
+ "hh->?": numbers.int_slt_impl,
708
+ "HH->?": numbers.int_ult_impl,
709
+ "ii->?": numbers.int_slt_impl,
710
+ "II->?": numbers.int_ult_impl,
711
+ "ll->?": numbers.int_slt_impl,
712
+ "LL->?": numbers.int_ult_impl,
713
+ "qq->?": numbers.int_slt_impl,
714
+ "QQ->?": numbers.int_ult_impl,
715
+ "ff->?": numbers.real_lt_impl,
716
+ "dd->?": numbers.real_lt_impl,
717
+ "FF->?": npyfuncs.np_complex_lt_impl,
718
+ "DD->?": npyfuncs.np_complex_lt_impl,
719
+ }
720
+ if numpy_version >= (1, 25):
721
+ ufunc_db[np.less].update(
722
+ {
723
+ "qQ->?": numbers.int_signed_unsigned_cmp("<"),
724
+ "Qq->?": numbers.int_unsigned_signed_cmp("<"),
725
+ }
726
+ )
727
+
728
+ ufunc_db[np.less_equal] = {
729
+ "??->?": numbers.int_ule_impl,
730
+ "bb->?": numbers.int_sle_impl,
731
+ "BB->?": numbers.int_ule_impl,
732
+ "hh->?": numbers.int_sle_impl,
733
+ "HH->?": numbers.int_ule_impl,
734
+ "ii->?": numbers.int_sle_impl,
735
+ "II->?": numbers.int_ule_impl,
736
+ "ll->?": numbers.int_sle_impl,
737
+ "LL->?": numbers.int_ule_impl,
738
+ "qq->?": numbers.int_sle_impl,
739
+ "QQ->?": numbers.int_ule_impl,
740
+ "ff->?": numbers.real_le_impl,
741
+ "dd->?": numbers.real_le_impl,
742
+ "FF->?": npyfuncs.np_complex_le_impl,
743
+ "DD->?": npyfuncs.np_complex_le_impl,
744
+ }
745
+ if numpy_version >= (1, 25):
746
+ ufunc_db[np.less_equal].update(
747
+ {
748
+ "qQ->?": numbers.int_signed_unsigned_cmp("<="),
749
+ "Qq->?": numbers.int_unsigned_signed_cmp("<="),
750
+ }
751
+ )
752
+
753
+ ufunc_db[np.not_equal] = {
754
+ "??->?": numbers.int_ne_impl,
755
+ "bb->?": numbers.int_ne_impl,
756
+ "BB->?": numbers.int_ne_impl,
757
+ "hh->?": numbers.int_ne_impl,
758
+ "HH->?": numbers.int_ne_impl,
759
+ "ii->?": numbers.int_ne_impl,
760
+ "II->?": numbers.int_ne_impl,
761
+ "ll->?": numbers.int_ne_impl,
762
+ "LL->?": numbers.int_ne_impl,
763
+ "qq->?": numbers.int_ne_impl,
764
+ "QQ->?": numbers.int_ne_impl,
765
+ "ff->?": numbers.real_ne_impl,
766
+ "dd->?": numbers.real_ne_impl,
767
+ "FF->?": npyfuncs.np_complex_ne_impl,
768
+ "DD->?": npyfuncs.np_complex_ne_impl,
769
+ }
770
+ if numpy_version >= (1, 25):
771
+ ufunc_db[np.not_equal].update(
772
+ {
773
+ "qQ->?": numbers.int_signed_unsigned_cmp("!="),
774
+ "Qq->?": numbers.int_unsigned_signed_cmp("!="),
775
+ }
776
+ )
777
+
778
+ ufunc_db[np.equal] = {
779
+ "??->?": numbers.int_eq_impl,
780
+ "bb->?": numbers.int_eq_impl,
781
+ "BB->?": numbers.int_eq_impl,
782
+ "hh->?": numbers.int_eq_impl,
783
+ "HH->?": numbers.int_eq_impl,
784
+ "ii->?": numbers.int_eq_impl,
785
+ "II->?": numbers.int_eq_impl,
786
+ "ll->?": numbers.int_eq_impl,
787
+ "LL->?": numbers.int_eq_impl,
788
+ "qq->?": numbers.int_eq_impl,
789
+ "QQ->?": numbers.int_eq_impl,
790
+ "ff->?": numbers.real_eq_impl,
791
+ "dd->?": numbers.real_eq_impl,
792
+ "FF->?": npyfuncs.np_complex_eq_impl,
793
+ "DD->?": npyfuncs.np_complex_eq_impl,
794
+ }
795
+ if numpy_version >= (1, 25):
796
+ ufunc_db[np.equal].update(
797
+ {
798
+ "qQ->?": numbers.int_signed_unsigned_cmp("=="),
799
+ "Qq->?": numbers.int_unsigned_signed_cmp("=="),
800
+ }
801
+ )
802
+
803
+ ufunc_db[np.logical_and] = {
804
+ "??->?": npyfuncs.np_logical_and_impl,
805
+ "bb->?": npyfuncs.np_logical_and_impl,
806
+ "BB->?": npyfuncs.np_logical_and_impl,
807
+ "hh->?": npyfuncs.np_logical_and_impl,
808
+ "HH->?": npyfuncs.np_logical_and_impl,
809
+ "ii->?": npyfuncs.np_logical_and_impl,
810
+ "II->?": npyfuncs.np_logical_and_impl,
811
+ "ll->?": npyfuncs.np_logical_and_impl,
812
+ "LL->?": npyfuncs.np_logical_and_impl,
813
+ "qq->?": npyfuncs.np_logical_and_impl,
814
+ "QQ->?": npyfuncs.np_logical_and_impl,
815
+ "ff->?": npyfuncs.np_logical_and_impl,
816
+ "dd->?": npyfuncs.np_logical_and_impl,
817
+ "FF->?": npyfuncs.np_complex_logical_and_impl,
818
+ "DD->?": npyfuncs.np_complex_logical_and_impl,
819
+ }
820
+
821
+ ufunc_db[np.logical_or] = {
822
+ "??->?": npyfuncs.np_logical_or_impl,
823
+ "bb->?": npyfuncs.np_logical_or_impl,
824
+ "BB->?": npyfuncs.np_logical_or_impl,
825
+ "hh->?": npyfuncs.np_logical_or_impl,
826
+ "HH->?": npyfuncs.np_logical_or_impl,
827
+ "ii->?": npyfuncs.np_logical_or_impl,
828
+ "II->?": npyfuncs.np_logical_or_impl,
829
+ "ll->?": npyfuncs.np_logical_or_impl,
830
+ "LL->?": npyfuncs.np_logical_or_impl,
831
+ "qq->?": npyfuncs.np_logical_or_impl,
832
+ "QQ->?": npyfuncs.np_logical_or_impl,
833
+ "ff->?": npyfuncs.np_logical_or_impl,
834
+ "dd->?": npyfuncs.np_logical_or_impl,
835
+ "FF->?": npyfuncs.np_complex_logical_or_impl,
836
+ "DD->?": npyfuncs.np_complex_logical_or_impl,
837
+ }
838
+
839
+ ufunc_db[np.logical_xor] = {
840
+ "??->?": npyfuncs.np_logical_xor_impl,
841
+ "bb->?": npyfuncs.np_logical_xor_impl,
842
+ "BB->?": npyfuncs.np_logical_xor_impl,
843
+ "hh->?": npyfuncs.np_logical_xor_impl,
844
+ "HH->?": npyfuncs.np_logical_xor_impl,
845
+ "ii->?": npyfuncs.np_logical_xor_impl,
846
+ "II->?": npyfuncs.np_logical_xor_impl,
847
+ "ll->?": npyfuncs.np_logical_xor_impl,
848
+ "LL->?": npyfuncs.np_logical_xor_impl,
849
+ "qq->?": npyfuncs.np_logical_xor_impl,
850
+ "QQ->?": npyfuncs.np_logical_xor_impl,
851
+ "ff->?": npyfuncs.np_logical_xor_impl,
852
+ "dd->?": npyfuncs.np_logical_xor_impl,
853
+ "FF->?": npyfuncs.np_complex_logical_xor_impl,
854
+ "DD->?": npyfuncs.np_complex_logical_xor_impl,
855
+ }
856
+
857
+ ufunc_db[np.logical_not] = {
858
+ "?->?": npyfuncs.np_logical_not_impl,
859
+ "b->?": npyfuncs.np_logical_not_impl,
860
+ "B->?": npyfuncs.np_logical_not_impl,
861
+ "h->?": npyfuncs.np_logical_not_impl,
862
+ "H->?": npyfuncs.np_logical_not_impl,
863
+ "i->?": npyfuncs.np_logical_not_impl,
864
+ "I->?": npyfuncs.np_logical_not_impl,
865
+ "l->?": npyfuncs.np_logical_not_impl,
866
+ "L->?": npyfuncs.np_logical_not_impl,
867
+ "q->?": npyfuncs.np_logical_not_impl,
868
+ "Q->?": npyfuncs.np_logical_not_impl,
869
+ "f->?": npyfuncs.np_logical_not_impl,
870
+ "d->?": npyfuncs.np_logical_not_impl,
871
+ "F->?": npyfuncs.np_complex_logical_not_impl,
872
+ "D->?": npyfuncs.np_complex_logical_not_impl,
873
+ }
874
+
875
+ ufunc_db[np.maximum] = {
876
+ "??->?": npyfuncs.np_logical_or_impl,
877
+ "bb->b": npyfuncs.np_int_smax_impl,
878
+ "BB->B": npyfuncs.np_int_umax_impl,
879
+ "hh->h": npyfuncs.np_int_smax_impl,
880
+ "HH->H": npyfuncs.np_int_umax_impl,
881
+ "ii->i": npyfuncs.np_int_smax_impl,
882
+ "II->I": npyfuncs.np_int_umax_impl,
883
+ "ll->l": npyfuncs.np_int_smax_impl,
884
+ "LL->L": npyfuncs.np_int_umax_impl,
885
+ "qq->q": npyfuncs.np_int_smax_impl,
886
+ "QQ->Q": npyfuncs.np_int_umax_impl,
887
+ "ff->f": npyfuncs.np_real_maximum_impl,
888
+ "dd->d": npyfuncs.np_real_maximum_impl,
889
+ "FF->F": npyfuncs.np_complex_maximum_impl,
890
+ "DD->D": npyfuncs.np_complex_maximum_impl,
891
+ }
892
+
893
+ ufunc_db[np.minimum] = {
894
+ "??->?": npyfuncs.np_logical_and_impl,
895
+ "bb->b": npyfuncs.np_int_smin_impl,
896
+ "BB->B": npyfuncs.np_int_umin_impl,
897
+ "hh->h": npyfuncs.np_int_smin_impl,
898
+ "HH->H": npyfuncs.np_int_umin_impl,
899
+ "ii->i": npyfuncs.np_int_smin_impl,
900
+ "II->I": npyfuncs.np_int_umin_impl,
901
+ "ll->l": npyfuncs.np_int_smin_impl,
902
+ "LL->L": npyfuncs.np_int_umin_impl,
903
+ "qq->q": npyfuncs.np_int_smin_impl,
904
+ "QQ->Q": npyfuncs.np_int_umin_impl,
905
+ "ff->f": npyfuncs.np_real_minimum_impl,
906
+ "dd->d": npyfuncs.np_real_minimum_impl,
907
+ "FF->F": npyfuncs.np_complex_minimum_impl,
908
+ "DD->D": npyfuncs.np_complex_minimum_impl,
909
+ }
910
+
911
+ ufunc_db[np.fmax] = {
912
+ "??->?": npyfuncs.np_logical_or_impl,
913
+ "bb->b": npyfuncs.np_int_smax_impl,
914
+ "BB->B": npyfuncs.np_int_umax_impl,
915
+ "hh->h": npyfuncs.np_int_smax_impl,
916
+ "HH->H": npyfuncs.np_int_umax_impl,
917
+ "ii->i": npyfuncs.np_int_smax_impl,
918
+ "II->I": npyfuncs.np_int_umax_impl,
919
+ "ll->l": npyfuncs.np_int_smax_impl,
920
+ "LL->L": npyfuncs.np_int_umax_impl,
921
+ "qq->q": npyfuncs.np_int_smax_impl,
922
+ "QQ->Q": npyfuncs.np_int_umax_impl,
923
+ "ff->f": npyfuncs.np_real_fmax_impl,
924
+ "dd->d": npyfuncs.np_real_fmax_impl,
925
+ "FF->F": npyfuncs.np_complex_fmax_impl,
926
+ "DD->D": npyfuncs.np_complex_fmax_impl,
927
+ }
928
+
929
+ ufunc_db[np.fmin] = {
930
+ "??->?": npyfuncs.np_logical_and_impl,
931
+ "bb->b": npyfuncs.np_int_smin_impl,
932
+ "BB->B": npyfuncs.np_int_umin_impl,
933
+ "hh->h": npyfuncs.np_int_smin_impl,
934
+ "HH->H": npyfuncs.np_int_umin_impl,
935
+ "ii->i": npyfuncs.np_int_smin_impl,
936
+ "II->I": npyfuncs.np_int_umin_impl,
937
+ "ll->l": npyfuncs.np_int_smin_impl,
938
+ "LL->L": npyfuncs.np_int_umin_impl,
939
+ "qq->q": npyfuncs.np_int_smin_impl,
940
+ "QQ->Q": npyfuncs.np_int_umin_impl,
941
+ "ff->f": npyfuncs.np_real_fmin_impl,
942
+ "dd->d": npyfuncs.np_real_fmin_impl,
943
+ "FF->F": npyfuncs.np_complex_fmin_impl,
944
+ "DD->D": npyfuncs.np_complex_fmin_impl,
945
+ }
946
+
947
+ # misc floating functions
948
+ ufunc_db[np.isnan] = {
949
+ "f->?": npyfuncs.np_real_isnan_impl,
950
+ "d->?": npyfuncs.np_real_isnan_impl,
951
+ "F->?": npyfuncs.np_complex_isnan_impl,
952
+ "D->?": npyfuncs.np_complex_isnan_impl,
953
+ # int8
954
+ "b->?": npyfuncs.np_int_isnan_impl,
955
+ "B->?": npyfuncs.np_int_isnan_impl,
956
+ # int16
957
+ "h->?": npyfuncs.np_int_isnan_impl,
958
+ "H->?": npyfuncs.np_int_isnan_impl,
959
+ # int32
960
+ "i->?": npyfuncs.np_int_isnan_impl,
961
+ "I->?": npyfuncs.np_int_isnan_impl,
962
+ # int64
963
+ "l->?": npyfuncs.np_int_isnan_impl,
964
+ "L->?": npyfuncs.np_int_isnan_impl,
965
+ # intp
966
+ "q->?": npyfuncs.np_int_isnan_impl,
967
+ "Q->?": npyfuncs.np_int_isnan_impl,
968
+ # boolean
969
+ "?->?": npyfuncs.np_int_isnan_impl,
970
+ # datetime & timedelta
971
+ "m->?": npyfuncs.np_datetime_isnat_impl,
972
+ "M->?": npyfuncs.np_datetime_isnat_impl,
973
+ }
974
+
975
+ ufunc_db[np.isinf] = {
976
+ "f->?": npyfuncs.np_real_isinf_impl,
977
+ "d->?": npyfuncs.np_real_isinf_impl,
978
+ "F->?": npyfuncs.np_complex_isinf_impl,
979
+ "D->?": npyfuncs.np_complex_isinf_impl,
980
+ # int8
981
+ "b->?": npyfuncs.np_int_isinf_impl,
982
+ "B->?": npyfuncs.np_int_isinf_impl,
983
+ # int16
984
+ "h->?": npyfuncs.np_int_isinf_impl,
985
+ "H->?": npyfuncs.np_int_isinf_impl,
986
+ # int32
987
+ "i->?": npyfuncs.np_int_isinf_impl,
988
+ "I->?": npyfuncs.np_int_isinf_impl,
989
+ # int64
990
+ "l->?": npyfuncs.np_int_isinf_impl,
991
+ "L->?": npyfuncs.np_int_isinf_impl,
992
+ # intp
993
+ "q->?": npyfuncs.np_int_isinf_impl,
994
+ "Q->?": npyfuncs.np_int_isinf_impl,
995
+ # boolean
996
+ "?->?": npyfuncs.np_int_isinf_impl,
997
+ # datetime & timedelta
998
+ "m->?": npyfuncs.np_int_isinf_impl,
999
+ "M->?": npyfuncs.np_int_isinf_impl,
1000
+ }
1001
+
1002
+ ufunc_db[np.isfinite] = {
1003
+ "f->?": npyfuncs.np_real_isfinite_impl,
1004
+ "d->?": npyfuncs.np_real_isfinite_impl,
1005
+ "F->?": npyfuncs.np_complex_isfinite_impl,
1006
+ "D->?": npyfuncs.np_complex_isfinite_impl,
1007
+ # int8
1008
+ "b->?": npyfuncs.np_int_isfinite_impl,
1009
+ "B->?": npyfuncs.np_int_isfinite_impl,
1010
+ # int16
1011
+ "h->?": npyfuncs.np_int_isfinite_impl,
1012
+ "H->?": npyfuncs.np_int_isfinite_impl,
1013
+ # int32
1014
+ "i->?": npyfuncs.np_int_isfinite_impl,
1015
+ "I->?": npyfuncs.np_int_isfinite_impl,
1016
+ # int64
1017
+ "l->?": npyfuncs.np_int_isfinite_impl,
1018
+ "L->?": npyfuncs.np_int_isfinite_impl,
1019
+ # intp
1020
+ "q->?": npyfuncs.np_int_isfinite_impl,
1021
+ "Q->?": npyfuncs.np_int_isfinite_impl,
1022
+ # boolean
1023
+ "?->?": npyfuncs.np_int_isfinite_impl,
1024
+ # datetime & timedelta
1025
+ "M->?": npyfuncs.np_datetime_isfinite_impl,
1026
+ "m->?": npyfuncs.np_datetime_isfinite_impl,
1027
+ }
1028
+
1029
+ ufunc_db[np.signbit] = {
1030
+ "f->?": npyfuncs.np_real_signbit_impl,
1031
+ "d->?": npyfuncs.np_real_signbit_impl,
1032
+ }
1033
+
1034
+ ufunc_db[np.copysign] = {
1035
+ "ff->f": npyfuncs.np_real_copysign_impl,
1036
+ "dd->d": npyfuncs.np_real_copysign_impl,
1037
+ }
1038
+
1039
+ ufunc_db[np.nextafter] = {
1040
+ "ff->f": npyfuncs.np_real_nextafter_impl,
1041
+ "dd->d": npyfuncs.np_real_nextafter_impl,
1042
+ }
1043
+
1044
+ ufunc_db[np.spacing] = {
1045
+ "f->f": npyfuncs.np_real_spacing_impl,
1046
+ "d->d": npyfuncs.np_real_spacing_impl,
1047
+ }
1048
+
1049
+ ufunc_db[np.ldexp] = {
1050
+ "fi->f": npyfuncs.np_real_ldexp_impl,
1051
+ "fl->f": npyfuncs.np_real_ldexp_impl,
1052
+ "di->d": npyfuncs.np_real_ldexp_impl,
1053
+ "dl->d": npyfuncs.np_real_ldexp_impl,
1054
+ }
1055
+ if numpy_version >= (2, 0) and IS_WIN32:
1056
+ ufunc_db[np.ldexp]["fq->f"] = ufunc_db[np.ldexp].pop("fl->f")
1057
+ ufunc_db[np.ldexp]["dq->d"] = ufunc_db[np.ldexp].pop("dl->d")
1058
+
1059
+ # bit twiddling functions
1060
+ ufunc_db[np.bitwise_and] = {
1061
+ "??->?": numbers.int_and_impl,
1062
+ "bb->b": numbers.int_and_impl,
1063
+ "BB->B": numbers.int_and_impl,
1064
+ "hh->h": numbers.int_and_impl,
1065
+ "HH->H": numbers.int_and_impl,
1066
+ "ii->i": numbers.int_and_impl,
1067
+ "II->I": numbers.int_and_impl,
1068
+ "ll->l": numbers.int_and_impl,
1069
+ "LL->L": numbers.int_and_impl,
1070
+ "qq->q": numbers.int_and_impl,
1071
+ "QQ->Q": numbers.int_and_impl,
1072
+ }
1073
+
1074
+ ufunc_db[np.bitwise_or] = {
1075
+ "??->?": numbers.int_or_impl,
1076
+ "bb->b": numbers.int_or_impl,
1077
+ "BB->B": numbers.int_or_impl,
1078
+ "hh->h": numbers.int_or_impl,
1079
+ "HH->H": numbers.int_or_impl,
1080
+ "ii->i": numbers.int_or_impl,
1081
+ "II->I": numbers.int_or_impl,
1082
+ "ll->l": numbers.int_or_impl,
1083
+ "LL->L": numbers.int_or_impl,
1084
+ "qq->q": numbers.int_or_impl,
1085
+ "QQ->Q": numbers.int_or_impl,
1086
+ }
1087
+
1088
+ ufunc_db[np.bitwise_xor] = {
1089
+ "??->?": numbers.int_xor_impl,
1090
+ "bb->b": numbers.int_xor_impl,
1091
+ "BB->B": numbers.int_xor_impl,
1092
+ "hh->h": numbers.int_xor_impl,
1093
+ "HH->H": numbers.int_xor_impl,
1094
+ "ii->i": numbers.int_xor_impl,
1095
+ "II->I": numbers.int_xor_impl,
1096
+ "ll->l": numbers.int_xor_impl,
1097
+ "LL->L": numbers.int_xor_impl,
1098
+ "qq->q": numbers.int_xor_impl,
1099
+ "QQ->Q": numbers.int_xor_impl,
1100
+ }
1101
+
1102
+ ufunc_db[np.invert] = { # aka np.bitwise_not
1103
+ "?->?": numbers.int_invert_impl,
1104
+ "b->b": numbers.int_invert_impl,
1105
+ "B->B": numbers.int_invert_impl,
1106
+ "h->h": numbers.int_invert_impl,
1107
+ "H->H": numbers.int_invert_impl,
1108
+ "i->i": numbers.int_invert_impl,
1109
+ "I->I": numbers.int_invert_impl,
1110
+ "l->l": numbers.int_invert_impl,
1111
+ "L->L": numbers.int_invert_impl,
1112
+ "q->q": numbers.int_invert_impl,
1113
+ "Q->Q": numbers.int_invert_impl,
1114
+ }
1115
+
1116
+ ufunc_db[np.left_shift] = {
1117
+ "bb->b": numbers.int_shl_impl,
1118
+ "BB->B": numbers.int_shl_impl,
1119
+ "hh->h": numbers.int_shl_impl,
1120
+ "HH->H": numbers.int_shl_impl,
1121
+ "ii->i": numbers.int_shl_impl,
1122
+ "II->I": numbers.int_shl_impl,
1123
+ "ll->l": numbers.int_shl_impl,
1124
+ "LL->L": numbers.int_shl_impl,
1125
+ "qq->q": numbers.int_shl_impl,
1126
+ "QQ->Q": numbers.int_shl_impl,
1127
+ }
1128
+
1129
+ ufunc_db[np.right_shift] = {
1130
+ "bb->b": numbers.int_shr_impl,
1131
+ "BB->B": numbers.int_shr_impl,
1132
+ "hh->h": numbers.int_shr_impl,
1133
+ "HH->H": numbers.int_shr_impl,
1134
+ "ii->i": numbers.int_shr_impl,
1135
+ "II->I": numbers.int_shr_impl,
1136
+ "ll->l": numbers.int_shr_impl,
1137
+ "LL->L": numbers.int_shr_impl,
1138
+ "qq->q": numbers.int_shr_impl,
1139
+ "QQ->Q": numbers.int_shr_impl,
1140
+ }
1141
+
1142
+ # Inject datetime64 support
1143
+ from numba.cuda.np import npdatetime
1144
+
1145
+ ufunc_db[np.negative].update(
1146
+ {
1147
+ "m->m": npdatetime.timedelta_neg_impl,
1148
+ }
1149
+ )
1150
+ ufunc_db[np.positive].update(
1151
+ {
1152
+ "m->m": npdatetime.timedelta_pos_impl,
1153
+ }
1154
+ )
1155
+ ufunc_db[np.absolute].update(
1156
+ {
1157
+ "m->m": npdatetime.timedelta_abs_impl,
1158
+ }
1159
+ )
1160
+ ufunc_db[np.sign].update(
1161
+ {
1162
+ "m->m": npdatetime.timedelta_sign_impl,
1163
+ }
1164
+ )
1165
+ ufunc_db[np.add].update(
1166
+ {
1167
+ "mm->m": npdatetime.timedelta_add_impl,
1168
+ "Mm->M": npdatetime.datetime_plus_timedelta,
1169
+ "mM->M": npdatetime.timedelta_plus_datetime,
1170
+ }
1171
+ )
1172
+ ufunc_db[np.subtract].update(
1173
+ {
1174
+ "mm->m": npdatetime.timedelta_sub_impl,
1175
+ "Mm->M": npdatetime.datetime_minus_timedelta,
1176
+ "MM->m": npdatetime.datetime_minus_datetime,
1177
+ }
1178
+ )
1179
+ ufunc_db[np.multiply].update(
1180
+ {
1181
+ "mq->m": npdatetime.timedelta_times_number,
1182
+ "md->m": npdatetime.timedelta_times_number,
1183
+ "qm->m": npdatetime.number_times_timedelta,
1184
+ "dm->m": npdatetime.number_times_timedelta,
1185
+ }
1186
+ )
1187
+ if np.divide != np.true_divide:
1188
+ ufunc_db[np.divide].update(
1189
+ {
1190
+ "mq->m": npdatetime.timedelta_over_number,
1191
+ "md->m": npdatetime.timedelta_over_number,
1192
+ "mm->d": npdatetime.timedelta_over_timedelta,
1193
+ }
1194
+ )
1195
+ ufunc_db[np.true_divide].update(
1196
+ {
1197
+ "mq->m": npdatetime.timedelta_over_number,
1198
+ "md->m": npdatetime.timedelta_over_number,
1199
+ "mm->d": npdatetime.timedelta_over_timedelta,
1200
+ }
1201
+ )
1202
+ ufunc_db[np.floor_divide].update(
1203
+ {
1204
+ "mq->m": npdatetime.timedelta_over_number,
1205
+ "md->m": npdatetime.timedelta_over_number,
1206
+ }
1207
+ )
1208
+
1209
+ ufunc_db[np.floor_divide].update(
1210
+ {
1211
+ "mm->q": npdatetime.timedelta_floor_div_timedelta,
1212
+ }
1213
+ )
1214
+
1215
+ ufunc_db[np.equal].update(
1216
+ {
1217
+ "MM->?": npdatetime.datetime_eq_datetime_impl,
1218
+ "mm->?": npdatetime.timedelta_eq_timedelta_impl,
1219
+ }
1220
+ )
1221
+ ufunc_db[np.not_equal].update(
1222
+ {
1223
+ "MM->?": npdatetime.datetime_ne_datetime_impl,
1224
+ "mm->?": npdatetime.timedelta_ne_timedelta_impl,
1225
+ }
1226
+ )
1227
+ ufunc_db[np.less].update(
1228
+ {
1229
+ "MM->?": npdatetime.datetime_lt_datetime_impl,
1230
+ "mm->?": npdatetime.timedelta_lt_timedelta_impl,
1231
+ }
1232
+ )
1233
+ ufunc_db[np.less_equal].update(
1234
+ {
1235
+ "MM->?": npdatetime.datetime_le_datetime_impl,
1236
+ "mm->?": npdatetime.timedelta_le_timedelta_impl,
1237
+ }
1238
+ )
1239
+ ufunc_db[np.greater].update(
1240
+ {
1241
+ "MM->?": npdatetime.datetime_gt_datetime_impl,
1242
+ "mm->?": npdatetime.timedelta_gt_timedelta_impl,
1243
+ }
1244
+ )
1245
+ ufunc_db[np.greater_equal].update(
1246
+ {
1247
+ "MM->?": npdatetime.datetime_ge_datetime_impl,
1248
+ "mm->?": npdatetime.timedelta_ge_timedelta_impl,
1249
+ }
1250
+ )
1251
+ ufunc_db[np.maximum].update(
1252
+ {
1253
+ "MM->M": npdatetime.datetime_maximum_impl,
1254
+ "mm->m": npdatetime.timedelta_maximum_impl,
1255
+ }
1256
+ )
1257
+ ufunc_db[np.minimum].update(
1258
+ {
1259
+ "MM->M": npdatetime.datetime_minimum_impl,
1260
+ "mm->m": npdatetime.timedelta_minimum_impl,
1261
+ }
1262
+ )
1263
+ # there is no difference for datetime/timedelta in maximum/fmax
1264
+ # and minimum/fmin
1265
+ ufunc_db[np.fmax].update(
1266
+ {
1267
+ "MM->M": npdatetime.datetime_fmax_impl,
1268
+ "mm->m": npdatetime.timedelta_fmax_impl,
1269
+ }
1270
+ )
1271
+ ufunc_db[np.fmin].update(
1272
+ {
1273
+ "MM->M": npdatetime.datetime_fmin_impl,
1274
+ "mm->m": npdatetime.timedelta_fmin_impl,
1275
+ }
1276
+ )
1277
+
1278
+ ufunc_db[np.remainder].update(
1279
+ {
1280
+ "mm->m": npdatetime.timedelta_mod_timedelta,
1281
+ }
1282
+ )