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,558 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: BSD-2-Clause
3
+
4
+ from collections import namedtuple
5
+ import itertools
6
+ import functools
7
+ import operator
8
+ import numpy as np
9
+
10
+
11
+ Extent = namedtuple("Extent", ["begin", "end"])
12
+
13
+
14
+ def attempt_nocopy_reshape(
15
+ nd, dims, strides, newnd, newdims, newstrides, itemsize, is_f_order
16
+ ):
17
+ """
18
+ Attempt to reshape an array without copying data.
19
+
20
+ This function should correctly handle all reshapes, including
21
+ axes of length 1. Zero strides should work but are untested.
22
+
23
+ If a copy is needed, returns 0
24
+ If no copy is needed, returns 1 and fills `newstrides`
25
+ with appropriate strides
26
+ """
27
+
28
+ olddims = []
29
+ oldstrides = []
30
+ oldnd = 0
31
+
32
+ # Remove axes with dimension 1 from the old array. They have no effect
33
+ # but would need special cases since their strides do not matter.
34
+ for oi in range(nd):
35
+ if dims[oi] != 1:
36
+ olddims.append(dims[oi])
37
+ oldstrides.append(strides[oi])
38
+ oldnd += 1
39
+
40
+ # Calculate total sizes
41
+ np_total = 1
42
+ for ni in range(newnd):
43
+ np_total *= newdims[ni]
44
+
45
+ op_total = 1
46
+ for oi in range(oldnd):
47
+ op_total *= olddims[oi]
48
+
49
+ if np_total != op_total:
50
+ # Different total sizes; no hope
51
+ return 0
52
+
53
+ if np_total == 0:
54
+ # Handle zero-sized arrays
55
+ # Just make the strides vaguely reasonable
56
+ # (they can have any value in theory).
57
+ for i in range(newnd):
58
+ newstrides[i] = itemsize
59
+ return 1
60
+
61
+ # oi to oj and ni to nj give the axis ranges currently worked with
62
+ oi = 0
63
+ oj = 1
64
+ ni = 0
65
+ nj = 1
66
+
67
+ while ni < newnd and oi < oldnd:
68
+ np = newdims[ni]
69
+ op = olddims[oi]
70
+
71
+ while np != op:
72
+ if np < op:
73
+ # Misses trailing 1s, these are handled later
74
+ np *= newdims[nj]
75
+ nj += 1
76
+ else:
77
+ op *= olddims[oj]
78
+ oj += 1
79
+
80
+ # Check whether the original axes can be combined
81
+ for ok in range(oi, oj - 1):
82
+ if is_f_order:
83
+ if oldstrides[ok + 1] != olddims[ok] * oldstrides[ok]:
84
+ # not contiguous enough
85
+ return 0
86
+ else:
87
+ # C order
88
+ if oldstrides[ok] != olddims[ok + 1] * oldstrides[ok + 1]:
89
+ # not contiguous enough
90
+ return 0
91
+
92
+ # Calculate new strides for all axes currently worked with
93
+ if is_f_order:
94
+ newstrides[ni] = oldstrides[oi]
95
+ for nk in range(ni + 1, nj):
96
+ newstrides[nk] = newstrides[nk - 1] * newdims[nk - 1]
97
+ else:
98
+ # C order
99
+ newstrides[nj - 1] = oldstrides[oj - 1]
100
+ for nk in range(nj - 1, ni, -1):
101
+ newstrides[nk - 1] = newstrides[nk] * newdims[nk]
102
+
103
+ ni = nj
104
+ nj += 1
105
+ oi = oj
106
+ oj += 1
107
+
108
+ # Set strides corresponding to trailing 1s of the new shape
109
+ if ni >= 1:
110
+ last_stride = newstrides[ni - 1]
111
+ else:
112
+ last_stride = itemsize
113
+
114
+ if is_f_order:
115
+ last_stride *= newdims[ni - 1]
116
+
117
+ for nk in range(ni, newnd):
118
+ newstrides[nk] = last_stride
119
+
120
+ return 1
121
+
122
+
123
+ class Dim(object):
124
+ """A single dimension of the array
125
+
126
+ Attributes
127
+ ----------
128
+ start:
129
+ start offset
130
+ stop:
131
+ stop offset
132
+ size:
133
+ number of items
134
+ stride:
135
+ item stride
136
+ """
137
+
138
+ __slots__ = "start", "stop", "size", "stride", "single"
139
+
140
+ def __init__(self, start, stop, size, stride, single):
141
+ self.start = start
142
+ self.stop = stop
143
+ self.size = size
144
+ self.stride = stride
145
+ self.single = single
146
+ assert not single or size == 1
147
+
148
+ def __getitem__(self, item):
149
+ if isinstance(item, slice):
150
+ start, stop, step = item.indices(self.size)
151
+ stride = step * self.stride
152
+ start = self.start + start * abs(self.stride)
153
+ stop = self.start + stop * abs(self.stride)
154
+ if stride == 0:
155
+ size = 1
156
+ else:
157
+ size = _compute_size(start, stop, stride)
158
+ ret = Dim(
159
+ start=start, stop=stop, size=size, stride=stride, single=False
160
+ )
161
+ return ret
162
+ else:
163
+ sliced = self[item : item + 1] if item != -1 else self[-1:]
164
+ if sliced.size != 1:
165
+ raise IndexError
166
+ return Dim(
167
+ start=sliced.start,
168
+ stop=sliced.stop,
169
+ size=sliced.size,
170
+ stride=sliced.stride,
171
+ single=True,
172
+ )
173
+
174
+ def get_offset(self, idx):
175
+ return self.start + idx * self.stride
176
+
177
+ def __repr__(self):
178
+ strfmt = "Dim(start=%s, stop=%s, size=%s, stride=%s)"
179
+ return strfmt % (self.start, self.stop, self.size, self.stride)
180
+
181
+ def normalize(self, base):
182
+ return Dim(
183
+ start=self.start - base,
184
+ stop=self.stop - base,
185
+ size=self.size,
186
+ stride=self.stride,
187
+ single=self.single,
188
+ )
189
+
190
+ def copy(self, start=None, stop=None, size=None, stride=None, single=None):
191
+ if start is None:
192
+ start = self.start
193
+ if stop is None:
194
+ stop = self.stop
195
+ if size is None:
196
+ size = self.size
197
+ if stride is None:
198
+ stride = self.stride
199
+ if single is None:
200
+ single = self.single
201
+ return Dim(start, stop, size, stride, single)
202
+
203
+ def is_contiguous(self, itemsize):
204
+ return self.stride == itemsize
205
+
206
+
207
+ def compute_index(indices, dims):
208
+ return sum(d.get_offset(i) for i, d in zip(indices, dims))
209
+
210
+
211
+ class Element(object):
212
+ is_array = False
213
+
214
+ def __init__(self, extent):
215
+ self.extent = extent
216
+
217
+ def iter_contiguous_extent(self):
218
+ yield self.extent
219
+
220
+
221
+ class Array(object):
222
+ """A dummy numpy array-like object. Consider it an array without the
223
+ actual data, but offset from the base data pointer.
224
+
225
+ Attributes
226
+ ----------
227
+ dims: tuple of Dim
228
+ describing each dimension of the array
229
+
230
+ ndim: int
231
+ number of dimension
232
+
233
+ shape: tuple of int
234
+ size of each dimension
235
+
236
+ strides: tuple of int
237
+ stride of each dimension
238
+
239
+ itemsize: int
240
+ itemsize
241
+
242
+ extent: (start, end)
243
+ start and end offset containing the memory region
244
+ """
245
+
246
+ is_array = True
247
+
248
+ @classmethod
249
+ @functools.cache
250
+ def from_desc(cls, offset, shape, strides, itemsize):
251
+ dims = []
252
+ for ashape, astride in zip(shape, strides):
253
+ if not isinstance(ashape, (int, np.integer)):
254
+ raise TypeError("all elements of shape must be ints")
255
+ dim = Dim(
256
+ offset, offset + ashape * astride, ashape, astride, single=False
257
+ )
258
+ dims.append(dim)
259
+ offset = 0 # offset only applies to first dimension
260
+ return cls(dims, itemsize)
261
+
262
+ def __init__(self, dims, itemsize):
263
+ self.dims = tuple(dims)
264
+ self.ndim = len(self.dims)
265
+ self.shape = tuple(dim.size for dim in self.dims)
266
+ self.strides = tuple(dim.stride for dim in self.dims)
267
+ self.itemsize = itemsize
268
+ self.size = functools.reduce(operator.mul, self.shape, 1)
269
+ self.extent = self._compute_extent()
270
+ self.flags = self._compute_layout()
271
+
272
+ def _compute_layout(self):
273
+ # The logic here is based on that in _UpdateContiguousFlags from
274
+ # numpy/core/src/multiarray/flagsobject.c in NumPy v1.19.1 (commit
275
+ # 13661ac70).
276
+ # https://github.com/numpy/numpy/blob/maintenance/1.19.x/numpy/core/src/multiarray/flagsobject.c#L123-L191
277
+
278
+ # Records have no dims, and we can treat them as contiguous
279
+ if not self.dims:
280
+ return {"C_CONTIGUOUS": True, "F_CONTIGUOUS": True}
281
+
282
+ # If this is a broadcast array then it is not contiguous
283
+ if any([dim.stride == 0 for dim in self.dims]):
284
+ return {"C_CONTIGUOUS": False, "F_CONTIGUOUS": False}
285
+
286
+ flags = {"C_CONTIGUOUS": True, "F_CONTIGUOUS": True}
287
+
288
+ # Check C contiguity
289
+ sd = self.itemsize
290
+ for dim in reversed(self.dims):
291
+ if dim.size == 0:
292
+ # Contiguous by definition
293
+ return {"C_CONTIGUOUS": True, "F_CONTIGUOUS": True}
294
+ if dim.size != 1:
295
+ if dim.stride != sd:
296
+ flags["C_CONTIGUOUS"] = False
297
+ sd *= dim.size
298
+
299
+ # Check F contiguity
300
+ sd = self.itemsize
301
+ for dim in self.dims:
302
+ if dim.size != 1:
303
+ if dim.stride != sd:
304
+ flags["F_CONTIGUOUS"] = False
305
+ return flags
306
+ sd *= dim.size
307
+
308
+ return flags
309
+
310
+ def _compute_extent(self):
311
+ firstidx = [0] * self.ndim
312
+ lastidx = [s - 1 for s in self.shape]
313
+ start = compute_index(firstidx, self.dims)
314
+ stop = compute_index(lastidx, self.dims) + self.itemsize
315
+ stop = max(stop, start) # ensure positive extent
316
+ return Extent(start, stop)
317
+
318
+ def __repr__(self):
319
+ return "<Array dims=%s itemsize=%s>" % (self.dims, self.itemsize)
320
+
321
+ def __getitem__(self, item):
322
+ if not isinstance(item, tuple):
323
+ item = [item]
324
+ else:
325
+ item = list(item)
326
+
327
+ nitem = len(item)
328
+ ndim = len(self.dims)
329
+ if nitem > ndim:
330
+ raise IndexError("%d extra indices given" % (nitem - ndim,))
331
+
332
+ # Add empty slices for missing indices
333
+ while len(item) < ndim:
334
+ item.append(slice(None, None))
335
+
336
+ dims = [dim.__getitem__(it) for dim, it in zip(self.dims, item)]
337
+ newshape = [d.size for d in dims if not d.single]
338
+
339
+ arr = Array(dims, self.itemsize)
340
+ if newshape:
341
+ return arr.reshape(*newshape)[0]
342
+ else:
343
+ return Element(arr.extent)
344
+
345
+ @property
346
+ def is_c_contig(self):
347
+ return self.flags["C_CONTIGUOUS"]
348
+
349
+ @property
350
+ def is_f_contig(self):
351
+ return self.flags["F_CONTIGUOUS"]
352
+
353
+ def iter_contiguous_extent(self):
354
+ """Generates extents"""
355
+ if self.is_c_contig or self.is_f_contig:
356
+ yield self.extent
357
+ else:
358
+ if self.dims[0].stride < self.dims[-1].stride:
359
+ innerdim = self.dims[0]
360
+ outerdims = self.dims[1:]
361
+ outershape = self.shape[1:]
362
+ else:
363
+ innerdim = self.dims[-1]
364
+ outerdims = self.dims[:-1]
365
+ outershape = self.shape[:-1]
366
+
367
+ if innerdim.is_contiguous(self.itemsize):
368
+ oslen = [range(s) for s in outershape]
369
+ for indices in itertools.product(*oslen):
370
+ base = compute_index(indices, outerdims)
371
+ yield base + innerdim.start, base + innerdim.stop
372
+ else:
373
+ oslen = [range(s) for s in self.shape]
374
+ for indices in itertools.product(*oslen):
375
+ offset = compute_index(indices, self.dims)
376
+ yield offset, offset + self.itemsize
377
+
378
+ def reshape(self, *newdims, **kws):
379
+ oldnd = self.ndim
380
+ newnd = len(newdims)
381
+
382
+ if newdims == self.shape:
383
+ return self, None
384
+
385
+ order = kws.pop("order", "C")
386
+ if kws:
387
+ raise TypeError("unknown keyword arguments %s" % kws.keys())
388
+ if order not in "CFA":
389
+ raise ValueError("order not C|F|A")
390
+
391
+ # check for exactly one instance of -1 in newdims
392
+ # https://github.com/numpy/numpy/blob/623bc1fae1d47df24e7f1e29321d0c0ba2771ce0/numpy/core/src/multiarray/shape.c#L470-L515 # noqa: E501
393
+ unknownidx = -1
394
+ knownsize = 1
395
+ for i, dim in enumerate(newdims):
396
+ if dim < 0:
397
+ if unknownidx == -1:
398
+ unknownidx = i
399
+ else:
400
+ raise ValueError("can only specify one unknown dimension")
401
+ else:
402
+ knownsize *= dim
403
+
404
+ # compute the missing dimension
405
+ if unknownidx >= 0:
406
+ if knownsize == 0 or self.size % knownsize != 0:
407
+ raise ValueError(
408
+ "cannot infer valid shape for unknown dimension"
409
+ )
410
+ else:
411
+ newdims = (
412
+ newdims[0:unknownidx]
413
+ + (self.size // knownsize,)
414
+ + newdims[unknownidx + 1 :]
415
+ )
416
+
417
+ newsize = functools.reduce(operator.mul, newdims, 1)
418
+
419
+ if order == "A":
420
+ order = "F" if self.is_f_contig else "C"
421
+
422
+ if newsize != self.size:
423
+ raise ValueError("reshape changes the size of the array")
424
+
425
+ if self.is_c_contig or self.is_f_contig:
426
+ if order == "C":
427
+ newstrides = list(iter_strides_c_contig(self, newdims))
428
+ elif order == "F":
429
+ newstrides = list(iter_strides_f_contig(self, newdims))
430
+ else:
431
+ raise AssertionError("unreachable")
432
+ else:
433
+ newstrides = [0] * newnd
434
+
435
+ if not attempt_nocopy_reshape(
436
+ oldnd,
437
+ self.shape,
438
+ self.strides,
439
+ newnd,
440
+ newdims,
441
+ newstrides,
442
+ self.itemsize,
443
+ order == "F",
444
+ ):
445
+ raise NotImplementedError("reshape would require copy")
446
+
447
+ ret = self.from_desc(
448
+ self.extent.begin,
449
+ shape=tuple(newdims),
450
+ strides=tuple(newstrides),
451
+ itemsize=self.itemsize,
452
+ )
453
+
454
+ return ret, list(self.iter_contiguous_extent())
455
+
456
+ def squeeze(self, axis=None):
457
+ newshape, newstrides = [], []
458
+ if axis is None:
459
+ for length, stride in zip(self.shape, self.strides):
460
+ if length != 1:
461
+ newshape.append(length)
462
+ newstrides.append(stride)
463
+ else:
464
+ if not isinstance(axis, tuple):
465
+ axis = (axis,)
466
+ for ax in axis:
467
+ if self.shape[ax] != 1:
468
+ raise ValueError(
469
+ "cannot select an axis to squeeze out which has size "
470
+ "not equal to one"
471
+ )
472
+ for i, (length, stride) in enumerate(zip(self.shape, self.strides)):
473
+ if i not in axis:
474
+ newshape.append(length)
475
+ newstrides.append(stride)
476
+ newarr = self.from_desc(
477
+ self.extent.begin,
478
+ shape=tuple(newshape),
479
+ strides=tuple(newstrides),
480
+ itemsize=self.itemsize,
481
+ )
482
+ return newarr, list(self.iter_contiguous_extent())
483
+
484
+ def ravel(self, order="C"):
485
+ if order not in "CFA":
486
+ raise ValueError("order not C|F|A")
487
+
488
+ if (
489
+ order in "CA"
490
+ and self.is_c_contig
491
+ or order in "FA"
492
+ and self.is_f_contig
493
+ ):
494
+ newshape = (self.size,)
495
+ newstrides = (self.itemsize,)
496
+ arr = self.from_desc(
497
+ self.extent.begin, newshape, newstrides, self.itemsize
498
+ )
499
+ return arr, list(self.iter_contiguous_extent())
500
+
501
+ else:
502
+ raise NotImplementedError("ravel on non-contiguous array")
503
+
504
+
505
+ def iter_strides_f_contig(arr, shape=None):
506
+ """yields the f-contiguous strides"""
507
+ shape = arr.shape if shape is None else shape
508
+ itemsize = arr.itemsize
509
+ yield itemsize
510
+ sum = 1
511
+ for s in shape[:-1]:
512
+ sum *= s
513
+ yield sum * itemsize
514
+
515
+
516
+ def iter_strides_c_contig(arr, shape=None):
517
+ """yields the c-contiguous strides"""
518
+ shape = arr.shape if shape is None else shape
519
+ itemsize = arr.itemsize
520
+
521
+ def gen():
522
+ yield itemsize
523
+ sum = 1
524
+ for s in reversed(shape[1:]):
525
+ sum *= s
526
+ yield sum * itemsize
527
+
528
+ for i in reversed(list(gen())):
529
+ yield i
530
+
531
+
532
+ def is_element_indexing(item, ndim):
533
+ if isinstance(item, slice):
534
+ return False
535
+
536
+ elif isinstance(item, tuple):
537
+ if len(item) == ndim:
538
+ if not any(isinstance(it, slice) for it in item):
539
+ return True
540
+
541
+ else:
542
+ return True
543
+
544
+ return False
545
+
546
+
547
+ def _compute_size(start, stop, step):
548
+ """Algorithm adapted from cpython rangeobject.c"""
549
+ if step > 0:
550
+ lo = start
551
+ hi = stop
552
+ else:
553
+ lo = stop
554
+ hi = start
555
+ step = -step
556
+ if lo >= hi:
557
+ return 0
558
+ return (hi - lo - 1) // step + 1