nvmath-python 1.0.0__cp314-cp314t-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 (332) hide show
  1. nvmath/__init__.pxd +0 -0
  2. nvmath/__init__.py +45 -0
  3. nvmath/_internal/__init__.py +0 -0
  4. nvmath/_internal/attribute_ifc_factory.py +330 -0
  5. nvmath/_internal/layout.py +70 -0
  6. nvmath/_internal/templates.py +130 -0
  7. nvmath/_internal/threadsafe.py +106 -0
  8. nvmath/_internal/utils.py +43 -0
  9. nvmath/_internal/workspace.py +490 -0
  10. nvmath/_utils.py +147 -0
  11. nvmath/bindings/__init__.py +60 -0
  12. nvmath/bindings/_internal/__init__.pxd +0 -0
  13. nvmath/bindings/_internal/__init__.py +0 -0
  14. nvmath/bindings/_internal/common_types.pxd +31 -0
  15. nvmath/bindings/_internal/cublas.cp314t-win_amd64.pyd +0 -0
  16. nvmath/bindings/_internal/cublas.pxd +530 -0
  17. nvmath/bindings/_internal/cublasLt.cp314t-win_amd64.pyd +0 -0
  18. nvmath/bindings/_internal/cublasLt.pxd +59 -0
  19. nvmath/bindings/_internal/cublasMp.pxd +52 -0
  20. nvmath/bindings/_internal/cudss.cp314t-win_amd64.pyd +0 -0
  21. nvmath/bindings/_internal/cudss.pxd +54 -0
  22. nvmath/bindings/_internal/cufft.cp314t-win_amd64.pyd +0 -0
  23. nvmath/bindings/_internal/cufft.pxd +70 -0
  24. nvmath/bindings/_internal/cufftMp.pxd +77 -0
  25. nvmath/bindings/_internal/curand.cp314t-win_amd64.pyd +0 -0
  26. nvmath/bindings/_internal/curand.pxd +42 -0
  27. nvmath/bindings/_internal/cusolver.cp314t-win_amd64.pyd +0 -0
  28. nvmath/bindings/_internal/cusolver.pxd +15 -0
  29. nvmath/bindings/_internal/cusolverDn.cp314t-win_amd64.pyd +0 -0
  30. nvmath/bindings/_internal/cusolverDn.pxd +406 -0
  31. nvmath/bindings/_internal/cusolverMp.pxd +71 -0
  32. nvmath/bindings/_internal/cusolverSp.cp314t-win_amd64.pyd +0 -0
  33. nvmath/bindings/_internal/cusolverSp.pxd +75 -0
  34. nvmath/bindings/_internal/cusparse.cp314t-win_amd64.pyd +0 -0
  35. nvmath/bindings/_internal/cusparse.pxd +471 -0
  36. nvmath/bindings/_internal/cusparseLt.cp314t-win_amd64.pyd +0 -0
  37. nvmath/bindings/_internal/cusparseLt.pxd +48 -0
  38. nvmath/bindings/_internal/cutensor.cp314t-win_amd64.pyd +0 -0
  39. nvmath/bindings/_internal/cutensor.pxd +58 -0
  40. nvmath/bindings/_internal/mathdx.cp314t-win_amd64.pyd +0 -0
  41. nvmath/bindings/_internal/mathdx.pxd +116 -0
  42. nvmath/bindings/_internal/nvshmem.pxd +29 -0
  43. nvmath/bindings/_internal/utils.cp314t-win_amd64.pyd +0 -0
  44. nvmath/bindings/_internal/utils.pxd +174 -0
  45. nvmath/bindings/_internal/utils.pyi +10 -0
  46. nvmath/bindings/cublas.cp314t-win_amd64.pyd +0 -0
  47. nvmath/bindings/cublas.pxd +558 -0
  48. nvmath/bindings/cublas.pyi +812 -0
  49. nvmath/bindings/cublasLt.cp314t-win_amd64.pyd +0 -0
  50. nvmath/bindings/cublasLt.pxd +109 -0
  51. nvmath/bindings/cublasLt.pyi +1461 -0
  52. nvmath/bindings/cublasMp.pxd +85 -0
  53. nvmath/bindings/cublasMp.pyi +267 -0
  54. nvmath/bindings/cudss.cp314t-win_amd64.pyd +0 -0
  55. nvmath/bindings/cudss.pxd +98 -0
  56. nvmath/bindings/cudss.pyi +443 -0
  57. nvmath/bindings/cufft.cp314t-win_amd64.pyd +0 -0
  58. nvmath/bindings/cufft.pxd +118 -0
  59. nvmath/bindings/cufft.pyi +301 -0
  60. nvmath/bindings/cufftMp.pxd +124 -0
  61. nvmath/bindings/cufftMp.pyi +326 -0
  62. nvmath/bindings/curand.cp314t-win_amd64.pyd +0 -0
  63. nvmath/bindings/curand.pxd +71 -0
  64. nvmath/bindings/curand.pyi +189 -0
  65. nvmath/bindings/cusolver.cp314t-win_amd64.pyd +0 -0
  66. nvmath/bindings/cusolver.pxd +62 -0
  67. nvmath/bindings/cusolver.pyi +320 -0
  68. nvmath/bindings/cusolverDn.cp314t-win_amd64.pyd +0 -0
  69. nvmath/bindings/cusolverDn.pxd +430 -0
  70. nvmath/bindings/cusolverDn.pyi +422 -0
  71. nvmath/bindings/cusolverMp.pxd +98 -0
  72. nvmath/bindings/cusolverMp.pyi +114 -0
  73. nvmath/bindings/cusolverSp.cp314t-win_amd64.pyd +0 -0
  74. nvmath/bindings/cusolverSp.pxd +95 -0
  75. nvmath/bindings/cusolverSp.pyi +70 -0
  76. nvmath/bindings/cusparse.cp314t-win_amd64.pyd +0 -0
  77. nvmath/bindings/cusparse.pxd +546 -0
  78. nvmath/bindings/cusparse.pyi +1017 -0
  79. nvmath/bindings/cusparseLt.cp314t-win_amd64.pyd +0 -0
  80. nvmath/bindings/cusparseLt.pxd +99 -0
  81. nvmath/bindings/cusparseLt.pyi +252 -0
  82. nvmath/bindings/cutensor.cp314t-win_amd64.pyd +0 -0
  83. nvmath/bindings/cutensor.pxd +98 -0
  84. nvmath/bindings/cutensor.pyi +324 -0
  85. nvmath/bindings/cycublas.cp314t-win_amd64.pyd +0 -0
  86. nvmath/bindings/cycublas.pxd +664 -0
  87. nvmath/bindings/cycublasLt.cp314t-win_amd64.pyd +0 -0
  88. nvmath/bindings/cycublasLt.pxd +1045 -0
  89. nvmath/bindings/cycublasMp.pxd +171 -0
  90. nvmath/bindings/cycudss.cp314t-win_amd64.pyd +0 -0
  91. nvmath/bindings/cycudss.pxd +277 -0
  92. nvmath/bindings/cycufft.cp314t-win_amd64.pyd +0 -0
  93. nvmath/bindings/cycufft.pxd +333 -0
  94. nvmath/bindings/cycufftMp.pxd +342 -0
  95. nvmath/bindings/cycurand.cp314t-win_amd64.pyd +0 -0
  96. nvmath/bindings/cycurand.pxd +141 -0
  97. nvmath/bindings/cycusolver.cp314t-win_amd64.pyd +0 -0
  98. nvmath/bindings/cycusolver.pxd +137 -0
  99. nvmath/bindings/cycusolverDn.cp314t-win_amd64.pyd +0 -0
  100. nvmath/bindings/cycusolverDn.pxd +443 -0
  101. nvmath/bindings/cycusolverMp.pxd +107 -0
  102. nvmath/bindings/cycusolverSp.cp314t-win_amd64.pyd +0 -0
  103. nvmath/bindings/cycusolverSp.pxd +93 -0
  104. nvmath/bindings/cycusparse.cp314t-win_amd64.pyd +0 -0
  105. nvmath/bindings/cycusparse.pxd +679 -0
  106. nvmath/bindings/cycusparseLt.cp314t-win_amd64.pyd +0 -0
  107. nvmath/bindings/cycusparseLt.pxd +135 -0
  108. nvmath/bindings/cycutensor.cp314t-win_amd64.pyd +0 -0
  109. nvmath/bindings/cycutensor.pxd +189 -0
  110. nvmath/bindings/cymathdx.cp314t-win_amd64.pyd +0 -0
  111. nvmath/bindings/cymathdx.pxd +552 -0
  112. nvmath/bindings/cynvshmem.pxd +118 -0
  113. nvmath/bindings/mathdx.cp314t-win_amd64.pyd +0 -0
  114. nvmath/bindings/mathdx.pxd +182 -0
  115. nvmath/bindings/mathdx.pyi +1562 -0
  116. nvmath/bindings/nvpl/__init__.pxd +0 -0
  117. nvmath/bindings/nvpl/__init__.py +13 -0
  118. nvmath/bindings/nvpl/_internal/__init__.pxd +0 -0
  119. nvmath/bindings/nvpl/_internal/__init__.py +0 -0
  120. nvmath/bindings/nvpl/_internal/blas.cp314t-win_amd64.pyd +0 -0
  121. nvmath/bindings/nvpl/_internal/blas.pxd +237 -0
  122. nvmath/bindings/nvpl/_internal/fft.cp314t-win_amd64.pyd +0 -0
  123. nvmath/bindings/nvpl/_internal/fft.pxd +36 -0
  124. nvmath/bindings/nvpl/blas.cp314t-win_amd64.pyd +0 -0
  125. nvmath/bindings/nvpl/blas.pxd +131 -0
  126. nvmath/bindings/nvpl/blas.pyi +168 -0
  127. nvmath/bindings/nvpl/cyblas.cp314t-win_amd64.pyd +0 -0
  128. nvmath/bindings/nvpl/cyblas.pxd +280 -0
  129. nvmath/bindings/nvpl/cyfft.cp314t-win_amd64.pyd +0 -0
  130. nvmath/bindings/nvpl/cyfft.pxd +93 -0
  131. nvmath/bindings/nvpl/fft.cp314t-win_amd64.pyd +0 -0
  132. nvmath/bindings/nvpl/fft.pxd +100 -0
  133. nvmath/bindings/nvpl/fft.pyi +168 -0
  134. nvmath/bindings/nvshmem.pxd +54 -0
  135. nvmath/bindings/nvshmem.pyi +191 -0
  136. nvmath/device/__init__.py +38 -0
  137. nvmath/device/_deprecated.py +33 -0
  138. nvmath/device/common.py +315 -0
  139. nvmath/device/common_backend.py +131 -0
  140. nvmath/device/common_cuda.py +201 -0
  141. nvmath/device/common_numba.py +300 -0
  142. nvmath/device/common_numba_cuda_mlir.py +202 -0
  143. nvmath/device/common_opaque_tensor.py +201 -0
  144. nvmath/device/cublasdx.py +1606 -0
  145. nvmath/device/cublasdx_backend.py +860 -0
  146. nvmath/device/cublasdx_numba.py +1534 -0
  147. nvmath/device/cublasdx_numba_cuda_mlir.py +208 -0
  148. nvmath/device/cufftdx.py +373 -0
  149. nvmath/device/cufftdx_backend.py +220 -0
  150. nvmath/device/cufftdx_numba.py +140 -0
  151. nvmath/device/cufftdx_numba_cuda_mlir.py +79 -0
  152. nvmath/device/curand_kernel.py +9147 -0
  153. nvmath/device/cusolverdx.py +2708 -0
  154. nvmath/device/cusolverdx_backend.py +440 -0
  155. nvmath/device/cusolverdx_numba.py +567 -0
  156. nvmath/device/cusolverdx_numba_cuda_mlir.py +604 -0
  157. nvmath/device/cusolverdx_overload_backend.py +1029 -0
  158. nvmath/device/llvm_array.py +29 -0
  159. nvmath/device/random.py +441 -0
  160. nvmath/device/random_helpers.py +23 -0
  161. nvmath/device/random_states.py +187 -0
  162. nvmath/device/types.py +138 -0
  163. nvmath/device/vector_types_numba.py +259 -0
  164. nvmath/distributed/__init__.py +200 -0
  165. nvmath/distributed/_internal/__init__.py +0 -0
  166. nvmath/distributed/_internal/nccl.py +86 -0
  167. nvmath/distributed/_internal/nvshmem.py +307 -0
  168. nvmath/distributed/_internal/symmetric_memory.py +35 -0
  169. nvmath/distributed/_internal/tensor_ifc.py +70 -0
  170. nvmath/distributed/_internal/tensor_ifc_cupy.py +68 -0
  171. nvmath/distributed/_internal/tensor_ifc_host_device.py +172 -0
  172. nvmath/distributed/_internal/tensor_ifc_numpy.py +46 -0
  173. nvmath/distributed/_internal/tensor_ifc_torch.py +162 -0
  174. nvmath/distributed/_internal/tensor_wrapper.py +81 -0
  175. nvmath/distributed/_utils.py +167 -0
  176. nvmath/distributed/distribution/__init__.py +30 -0
  177. nvmath/distributed/distribution/_configuration.py +39 -0
  178. nvmath/distributed/distribution/distributions.py +1024 -0
  179. nvmath/distributed/distribution/redistribute.py +1284 -0
  180. nvmath/distributed/fft/__init__.py +7 -0
  181. nvmath/distributed/fft/_configuration.py +82 -0
  182. nvmath/distributed/fft/fft.py +2742 -0
  183. nvmath/distributed/linalg/__init__.py +22 -0
  184. nvmath/distributed/linalg/_internal/__init__.py +3 -0
  185. nvmath/distributed/linalg/_internal/epilog_protocol.py +586 -0
  186. nvmath/distributed/linalg/_internal/matmul_desc_ifc.py +28 -0
  187. nvmath/distributed/linalg/advanced/__init__.py +8 -0
  188. nvmath/distributed/linalg/advanced/_configuration.py +171 -0
  189. nvmath/distributed/linalg/advanced/matmulmod.py +3573 -0
  190. nvmath/distributed/linalg/generic/__init__.py +8 -0
  191. nvmath/distributed/linalg/generic/_caching.py +66 -0
  192. nvmath/distributed/linalg/generic/_configuration.py +61 -0
  193. nvmath/distributed/linalg/generic/_factorization.py +172 -0
  194. nvmath/distributed/linalg/generic/_initialization.py +966 -0
  195. nvmath/distributed/linalg/generic/_problem_spec.py +511 -0
  196. nvmath/distributed/linalg/generic/solvermod.py +1368 -0
  197. nvmath/distributed/process_group.py +408 -0
  198. nvmath/fft/__init__.py +7 -0
  199. nvmath/fft/_configuration.py +189 -0
  200. nvmath/fft/_exec_utils.py +82 -0
  201. nvmath/fft/_helpers.py +237 -0
  202. nvmath/fft/fft.py +3122 -0
  203. nvmath/internal/__init__.pxd +3 -0
  204. nvmath/internal/__init__.py +10 -0
  205. nvmath/internal/_bindings.cp314t-win_amd64.pyd +0 -0
  206. nvmath/internal/_bindings.pxd +18 -0
  207. nvmath/internal/_device_utils.py +45 -0
  208. nvmath/internal/_layout/__init__.pxd +3 -0
  209. nvmath/internal/_layout/__init__.py +7 -0
  210. nvmath/internal/_layout/_layout.cp314t-win_amd64.pyd +0 -0
  211. nvmath/internal/_layout/_layout.pxd +1303 -0
  212. nvmath/internal/_layout/_layout.pyi +1145 -0
  213. nvmath/internal/enum_utils.py +142 -0
  214. nvmath/internal/formatters.py +87 -0
  215. nvmath/internal/mem_limit.py +51 -0
  216. nvmath/internal/memory.cp314t-win_amd64.pyd +0 -0
  217. nvmath/internal/memory.pxd +13 -0
  218. nvmath/internal/memory.pyi +50 -0
  219. nvmath/internal/ndbuffer/__init__.pxd +3 -0
  220. nvmath/internal/ndbuffer/__init__.py +9 -0
  221. nvmath/internal/ndbuffer/_copy_kernel.cp314t-win_amd64.pyd +0 -0
  222. nvmath/internal/ndbuffer/_copy_kernel.pxd +10 -0
  223. nvmath/internal/ndbuffer/_jit.cp314t-win_amd64.pyd +0 -0
  224. nvmath/internal/ndbuffer/_jit.pxd +7 -0
  225. nvmath/internal/ndbuffer/_ndbuffer.cp314t-win_amd64.pyd +0 -0
  226. nvmath/internal/ndbuffer/_ndbuffer.pxd +40 -0
  227. nvmath/internal/ndbuffer/_ndbuffer.pyi +463 -0
  228. nvmath/internal/ndbuffer/copy_kernel/args.h +34 -0
  229. nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/array_view.h +52 -0
  230. nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/elementwise.h +68 -0
  231. nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/grid_indexer.h +69 -0
  232. nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/transposed.h +242 -0
  233. nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/type_utils.h +39 -0
  234. nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/utils.h +132 -0
  235. nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/vec.h +159 -0
  236. nvmath/internal/ndbuffer/copy_kernel/elementwise.h +53 -0
  237. nvmath/internal/ndbuffer/copy_kernel/transposed.h +58 -0
  238. nvmath/internal/package_ifc.py +168 -0
  239. nvmath/internal/package_ifc_cuda.py +57 -0
  240. nvmath/internal/package_ifc_cupy.py +67 -0
  241. nvmath/internal/package_ifc_torch.py +69 -0
  242. nvmath/internal/package_wrapper.py +14 -0
  243. nvmath/internal/tensor_ifc.py +179 -0
  244. nvmath/internal/tensor_ifc_cupy.py +234 -0
  245. nvmath/internal/tensor_ifc_ndbuffer.py +147 -0
  246. nvmath/internal/tensor_ifc_numpy.py +184 -0
  247. nvmath/internal/tensor_ifc_torch.py +178 -0
  248. nvmath/internal/tensor_wrapper.py +160 -0
  249. nvmath/internal/typemaps.py +113 -0
  250. nvmath/internal/utils.py +805 -0
  251. nvmath/linalg/__init__.py +56 -0
  252. nvmath/linalg/_internal/__init__.py +3 -0
  253. nvmath/linalg/_internal/algo_cap_ifc.py +82 -0
  254. nvmath/linalg/_internal/algo_config_ifc.py +43 -0
  255. nvmath/linalg/_internal/batch.py +234 -0
  256. nvmath/linalg/_internal/enum_to_tuples.py +64 -0
  257. nvmath/linalg/_internal/epilog_protocol.py +766 -0
  258. nvmath/linalg/_internal/layout.py +624 -0
  259. nvmath/linalg/_internal/matmul_desc_ifc.py +28 -0
  260. nvmath/linalg/_internal/matmul_pref_ifc.py +27 -0
  261. nvmath/linalg/_internal/matrix_layout_ifc.py +26 -0
  262. nvmath/linalg/_internal/solver_utils.py +432 -0
  263. nvmath/linalg/_internal/typemaps.py +144 -0
  264. nvmath/linalg/_internal/utils.py +157 -0
  265. nvmath/linalg/advanced/__init__.py +8 -0
  266. nvmath/linalg/advanced/_algorithmmod.py +170 -0
  267. nvmath/linalg/advanced/_configuration.py +351 -0
  268. nvmath/linalg/advanced/helpers/__init__.py +5 -0
  269. nvmath/linalg/advanced/helpers/matmul.py +1316 -0
  270. nvmath/linalg/advanced/matmulmod.py +3734 -0
  271. nvmath/linalg/generic/__init__.py +53 -0
  272. nvmath/linalg/generic/_configuration/__init__.py +39 -0
  273. nvmath/linalg/generic/_configuration/layout.py +263 -0
  274. nvmath/linalg/generic/_configuration/match.py +734 -0
  275. nvmath/linalg/generic/_configuration/qualifiers.py +493 -0
  276. nvmath/linalg/generic/_configuration/solver_configuration.py +59 -0
  277. nvmath/linalg/generic/_configuration/wrap.py +217 -0
  278. nvmath/linalg/generic/_dtype.py +15 -0
  279. nvmath/linalg/generic/matmulmod.py +2094 -0
  280. nvmath/linalg/generic/solvermod.py +1301 -0
  281. nvmath/memory.py +279 -0
  282. nvmath/sparse/__init__.py +38 -0
  283. nvmath/sparse/_internal/__init__.py +21 -0
  284. nvmath/sparse/_internal/common_utils.py +147 -0
  285. nvmath/sparse/_internal/cudss_config_ifc.py +702 -0
  286. nvmath/sparse/_internal/cudss_data_ifc.py +399 -0
  287. nvmath/sparse/_internal/cudss_utils.py +506 -0
  288. nvmath/sparse/_internal/cusparse_utils.py +382 -0
  289. nvmath/sparse/_internal/sparse_bsc_ifc.py +303 -0
  290. nvmath/sparse/_internal/sparse_bsr_ifc.py +305 -0
  291. nvmath/sparse/_internal/sparse_coo_ifc.py +256 -0
  292. nvmath/sparse/_internal/sparse_csc_ifc.py +268 -0
  293. nvmath/sparse/_internal/sparse_csr_ifc.py +288 -0
  294. nvmath/sparse/_internal/sparse_dia_ifc.py +242 -0
  295. nvmath/sparse/_internal/sparse_format_helpers.py +601 -0
  296. nvmath/sparse/_internal/sparse_tensor_ifc.py +133 -0
  297. nvmath/sparse/_internal/sparse_ust_ifc.py +141 -0
  298. nvmath/sparse/_internal/utils.py +56 -0
  299. nvmath/sparse/advanced/__init__.py +7 -0
  300. nvmath/sparse/advanced/_configuration.py +227 -0
  301. nvmath/sparse/advanced/direct_solver.py +2069 -0
  302. nvmath/sparse/generic/__init__.py +7 -0
  303. nvmath/sparse/generic/_configuration.py +129 -0
  304. nvmath/sparse/generic/_helpers.py +137 -0
  305. nvmath/sparse/generic/_thunks.py +21 -0
  306. nvmath/sparse/generic/matmulmod.py +2353 -0
  307. nvmath/sparse/ust/__init__.py +7 -0
  308. nvmath/sparse/ust/_converters.py +422 -0
  309. nvmath/sparse/ust/_cpp.py +28 -0
  310. nvmath/sparse/ust/_drawer.py +565 -0
  311. nvmath/sparse/ust/_emitter.py +1033 -0
  312. nvmath/sparse/ust/_jit.py +188 -0
  313. nvmath/sparse/ust/_kernel.py +282 -0
  314. nvmath/sparse/ust/_utils.py +149 -0
  315. nvmath/sparse/ust/interfaces/__init__.py +0 -0
  316. nvmath/sparse/ust/interfaces/torch_interface.py +476 -0
  317. nvmath/sparse/ust/tensor.py +1016 -0
  318. nvmath/sparse/ust/tensor_format.py +957 -0
  319. nvmath/tensor/__init__.py +6 -0
  320. nvmath/tensor/_configuration.py +120 -0
  321. nvmath/tensor/_internal/__init__.py +3 -0
  322. nvmath/tensor/_internal/cutensor_config_ifc.py +279 -0
  323. nvmath/tensor/_internal/cutensor_utils.py +230 -0
  324. nvmath/tensor/_internal/data.py +43 -0
  325. nvmath/tensor/_internal/einsum_parser.py +444 -0
  326. nvmath/tensor/_internal/typemaps.py +96 -0
  327. nvmath/tensor/contract.py +1900 -0
  328. nvmath_python-1.0.0.dist-info/METADATA +134 -0
  329. nvmath_python-1.0.0.dist-info/RECORD +332 -0
  330. nvmath_python-1.0.0.dist-info/WHEEL +5 -0
  331. nvmath_python-1.0.0.dist-info/licenses/LICENSE +177 -0
  332. nvmath_python-1.0.0.dist-info/top_level.txt +2 -0
@@ -0,0 +1,142 @@
1
+ # Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ """
6
+ Factories for create options dataclasses, as well as utilities to add docstring to enum
7
+ classes.
8
+ """
9
+
10
+ import dataclasses
11
+ import re
12
+ from collections.abc import Callable
13
+ from enum import IntEnum
14
+ from typing import Any, ClassVar
15
+
16
+ import numpy
17
+
18
+
19
+ def create_options_class_from_enum(
20
+ options_class_name: str,
21
+ enum_class: IntEnum,
22
+ get_attr_dtype: Callable,
23
+ description: str,
24
+ filter_re: str = r"(?P<option_name>.*)",
25
+ ):
26
+ """
27
+ Create an options dataclass from a Python enum class. Names can be filtered if desired.
28
+
29
+ Args:
30
+ options_class_name: Name of the dataclass that will be created.
31
+
32
+ enum_class: The IntEnum class that contains the options for the dataclass.
33
+
34
+ get_attr_dtype: A callable that takes in an enum value as the argument and returns
35
+ the size in bytes of the cuTensorNet.
36
+
37
+ filter_re: A re definition that defines the match named 'option_name'.
38
+ """
39
+ if r"(?P<option_name>" not in filter_re:
40
+ message = """Incorrect re.
41
+ The re for the filter must contain the named group 'option_name'."""
42
+ raise ValueError(message)
43
+
44
+ # Helper vars for creating attribute docstring.
45
+ doc = f"""A data class for capturing the {description} options.
46
+
47
+ Attributes:
48
+ """
49
+ indent = " " * 8
50
+ prefix = determine_enum_prefix(enum_class, "_ATTRIBUTE")
51
+
52
+ filter_pattern = re.compile(filter_re)
53
+ option_to_enum: dict[str, IntEnum] = {}
54
+ option_to_dtype: dict[str, Any] = {}
55
+ # mypy claims that IntEnum is not iterable
56
+ for e in enum_class: # type: ignore
57
+ m = filter_pattern.match(e.name)
58
+ if not m:
59
+ continue
60
+ option_name = m.group("option_name").lower()
61
+ option_to_enum[option_name] = e
62
+ option_to_dtype[option_name] = get_attr_dtype(e)
63
+
64
+ # Add docstring for this attribute.
65
+ doc += indent + option_name + ":" + f" See `{prefix + '_' + m.group(0)}`.\n"
66
+
67
+ field: tuple[str, Any, None | dict]
68
+ fields: list[tuple[str, Any, None | dict]] = []
69
+ for option_name, dtype in option_to_dtype.items():
70
+ if numpy.issubdtype(dtype, numpy.integer):
71
+ field = option_name, int | None, dataclasses.field(default=None)
72
+ else:
73
+ field = option_name, Any | None, dataclasses.field(default=None)
74
+ fields.append(field)
75
+
76
+ # Add class attributes.
77
+
78
+ field = "option_to_enum", ClassVar[dict], dataclasses.field(default=option_to_enum)
79
+ fields.append(field)
80
+
81
+ field = "option_to_dtype", ClassVar[dict], dataclasses.field(default=option_to_dtype)
82
+ fields.append(field)
83
+
84
+ # Create the options class.
85
+ options_class = dataclasses.make_dataclass(options_class_name, fields, slots=True)
86
+ options_class.__doc__ = doc
87
+
88
+ return options_class
89
+
90
+
91
+ def snake_to_camel(names):
92
+ name = ""
93
+ for i, sub_name in enumerate(names):
94
+ if i == 0:
95
+ name += sub_name.lower()
96
+ else:
97
+ name += sub_name[0].upper() + sub_name[1:]
98
+ name += "_t"
99
+ return name
100
+
101
+
102
+ def camel_to_snake(name, upper=True):
103
+ """
104
+ Convert string from camel case to snake style.
105
+ """
106
+
107
+ def transformer(m):
108
+ prefix = iter(("", "_", ""))
109
+ for i in 1, 3, 5:
110
+ first, second = i, i + 1
111
+ s = next(prefix)
112
+ if m.group(second):
113
+ if m.group(first): # If the second group doesn't exist, the first won't either by the design of the RE.
114
+ s += m.group(first).lower() + "_"
115
+ s += m.group(second).lower()
116
+ break
117
+ return s
118
+
119
+ name = re.sub(r"^([A-Z]*)([A-Z])|(?<!_)([A-Z]*)([A-Z])|([A-Z]*)([A-Z])", transformer, name)
120
+ if upper:
121
+ name = name.upper()
122
+ return name
123
+
124
+
125
+ def determine_enum_prefix(enum_class, chomp):
126
+ """
127
+ This function assumes that the convention used to translate C enumerators to Python enum
128
+ names holds.
129
+ """
130
+
131
+ prefix = enum_class.__module__.split(".")[-1].upper()
132
+ prefix += "_" + camel_to_snake(enum_class.__name__)
133
+ prefix = re.sub(chomp, "", prefix)
134
+ return prefix
135
+
136
+
137
+ def add_enum_class_doc(enum_class, chomp):
138
+ """
139
+ Add docstring to enum classes.
140
+ """
141
+ for e in enum_class:
142
+ e.__doc__ = f"See `{determine_enum_prefix(enum_class, chomp) + '_' + e.name.upper()}`."
@@ -0,0 +1,87 @@
1
+ # Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ """
6
+ Formatters for printing data.
7
+ """
8
+
9
+ import numpy as np
10
+
11
+
12
+ class MemoryStr:
13
+ """
14
+ A simple type to pretty-print memory-like values.
15
+ """
16
+
17
+ def __init__(self, memory, base_unit="B"):
18
+ self.memory = memory
19
+ self.base_unit = base_unit
20
+ self.base = 1024
21
+
22
+ def __str__(self):
23
+ """
24
+ Convert large values to powers of 1024 for readability.
25
+ """
26
+
27
+ base, base_unit, memory = self.base, self.base_unit, self.memory
28
+
29
+ if memory < base:
30
+ value, unit = memory, base_unit
31
+ elif memory < base**2:
32
+ value, unit = memory / base, f"Ki{base_unit}"
33
+ elif memory < base**3:
34
+ value, unit = memory / base**2, f"Mi{base_unit}"
35
+ else:
36
+ value, unit = memory / base**3, f"Gi{base_unit}"
37
+
38
+ return f"{value:0.2f} {unit}"
39
+
40
+
41
+ class FLOPSStr:
42
+ """
43
+ A simple type to pretty-print FLOP count and FLOP/s-like values.
44
+ """
45
+
46
+ def __init__(self, flops, base_unit):
47
+ self.flops = flops
48
+ self.base_unit = base_unit
49
+ self.base = 1000
50
+
51
+ def __str__(self):
52
+ """
53
+ Convert large values to powers of 1000 for readability.
54
+ """
55
+
56
+ base, base_unit, flops = self.base, self.base_unit, self.flops
57
+
58
+ if flops < base:
59
+ value, unit = flops, base_unit
60
+ elif flops < base**2:
61
+ value, unit = flops / base, f"K{base_unit}"
62
+ elif flops < base**3:
63
+ value, unit = flops / base**2, f"M{base_unit}"
64
+ elif flops < base**4:
65
+ value, unit = flops / base**3, f"G{base_unit}"
66
+ elif flops < base**5:
67
+ value, unit = flops / base**4, f"T{base_unit}"
68
+ else:
69
+ value, unit = flops / base**5, f"P{base_unit}"
70
+
71
+ return f"{value:0.3f} {unit}"
72
+
73
+
74
+ def array2string(array_like):
75
+ """
76
+ String representation of an array-like object with possible truncation of "interior"
77
+ values to limit string size.
78
+
79
+ The NumPy function "set_printoptions" can be used to control the display of the array.
80
+ """
81
+
82
+ return np.array2string(
83
+ np.asanyarray(array_like, dtype=object),
84
+ separator=", ",
85
+ # NumPy hates empty strings so we print 'None' instead.
86
+ formatter={"object": lambda s: s if s != "" else "None"},
87
+ )
@@ -0,0 +1,51 @@
1
+ # Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ """
6
+ Memory specification regular expression.
7
+ """
8
+
9
+ __all__ = ["MEM_LIMIT_RE_PCT", "MEM_LIMIT_RE_VAL", "MEM_LIMIT_DOC", "check_memory_str"]
10
+
11
+ import re
12
+
13
+ MEM_LIMIT_RE_PCT = re.compile(r"(?P<value>[+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?)\s*%\s*$")
14
+ MEM_LIMIT_RE_VAL = re.compile(
15
+ r"(?P<value>[+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?)\s*(?P<units>[kmg])?(?P<binary>(?<=[kmg])i)?b\s*$",
16
+ re.IGNORECASE,
17
+ )
18
+ MEM_LIMIT_DOC = """The {kind} must be specified in one of the following forms:
19
+ (1) A number (int or float). If the number is a float between 0 and 1 inclusive, the
20
+ {kind} is interpreted as a fraction of the total device memory; otherwise it is
21
+ interpreted as the number of bytes of memory, with float value being cast to int.
22
+ Examples: 0.75, 50E6, 50000000, ...
23
+ (2) A string containing a positive value followed by B, kB, MB, or GB for powers of 1000.
24
+ Examples: "0.05 GB", "50 MB", "50000000 B" ...
25
+ (3) A string containing a positive value followed by kiB, MiB, or GiB for powers of 1024.
26
+ Examples: "0.05 GiB", "51.2 MiB", "53687091 B" ...
27
+ (4) A string with value in the range [0, 100] followed by a % symbol.
28
+ Examples: "26%","82%", ...
29
+
30
+ Whitespace between values and units is optional.
31
+
32
+ The provided {kind} is "{value}".
33
+ """
34
+
35
+
36
+ def check_memory_str(value, kind):
37
+ """
38
+ Check if the memory specification string is valid.
39
+
40
+ value = the memory specification string.
41
+ kind = a string denoting the type of memory being checked, used in error messages.
42
+ """
43
+ if not isinstance(value, int | float):
44
+ m1 = MEM_LIMIT_RE_PCT.match(value)
45
+ if m1:
46
+ factor = float(m1.group("value"))
47
+ if factor < 0 or factor > 100:
48
+ raise ValueError(f"The {kind} percentage must be in the range [0, 100].")
49
+ m2 = MEM_LIMIT_RE_VAL.match(value)
50
+ if not (m1 or m2):
51
+ raise ValueError(MEM_LIMIT_DOC.format(kind=kind, value=value))
@@ -0,0 +1,13 @@
1
+ # Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ cimport cython
6
+ from libc.stdint cimport int64_t, intptr_t, uint64_t
7
+
8
+ cpdef get_device_memory_resource(int device_id)
9
+ cpdef get_pinned_async_memory_resource(int device_id)
10
+ cpdef get_legacy_pinned_memory_resource(int device_id)
11
+ cpdef allocate_from_mr(mr, int64_t size, stream, int device_id, logger=*)
12
+ cpdef free_reserved_memory(bint sync=*)
13
+ cdef get_default_stream(int device_id)
@@ -0,0 +1,50 @@
1
+ # Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ import _cython_3_2_5
6
+ from typing import Any, ClassVar
7
+
8
+ __pyx_capi__: dict
9
+ __test__: dict
10
+ allocate_from_mr: _cython_3_2_5.cython_function_or_method
11
+ free_reserved_memory: _cython_3_2_5.cython_function_or_method
12
+ get_device_memory_resource: _cython_3_2_5.cython_function_or_method
13
+ get_legacy_pinned_memory_resource: _cython_3_2_5.cython_function_or_method
14
+ get_pinned_async_memory_resource: _cython_3_2_5.cython_function_or_method
15
+
16
+ class _MemoryPointer:
17
+ """
18
+ Temporary internal NDBuffer allocation adapter class. NDBuffer expects
19
+ custom allocator to return a cuda.core.Buffer instance. Until all supported
20
+ cuda.core versions have unified support for wrapping external allocations
21
+ with Buffer.from_handle, this class servers as an adapter/workaround.
22
+
23
+ WARNING: This is internal tool subject to change/removal without notice.
24
+
25
+ Internally, it is used conditionally if any of the following is needed:
26
+ * wrap external allocations that don't come as cuda.core.Buffer (e.g. from cupy).
27
+ This is needed because prior to cuda.core 0.5.0, it's not possible to
28
+ pass reference to externall RAII object as ``owner`` parameter to Buffer.from_handle.
29
+ * provide debug logging on deallocation. In the future, we can use
30
+ Buffer.from_handle(owner=...) to inject deallocation callback (cuda.core >= 0.5.0)
31
+ or weakref.finalize for Buffer (cuda.core >= 0.6.0).
32
+
33
+ The only publicly exposed field is the handle - a base pointer to the allocated memory.
34
+ """
35
+ from_handle: ClassVar[method] = ...
36
+ __pyx_vtable__: ClassVar[PyCapsule] = ...
37
+ handle: handle
38
+ owner: owner
39
+ @classmethod
40
+ def __init__(cls, *args, **kwargs) -> None:
41
+ """Create and return a new object. See help(type) for accurate signature."""
42
+ def close(self, stream) -> Any:
43
+ """_MemoryPointer.close(self, stream)"""
44
+ def __del__(self, *args, **kwargs) -> None: ...
45
+ def __reduce__(self):
46
+ """_MemoryPointer.__reduce_cython__(self)"""
47
+ def __reduce_cython__(self) -> Any:
48
+ """_MemoryPointer.__reduce_cython__(self)"""
49
+ def __setstate_cython__(self, __pyx_state) -> Any:
50
+ """_MemoryPointer.__setstate_cython__(self, __pyx_state)"""
@@ -0,0 +1,3 @@
1
+ # Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
@@ -0,0 +1,9 @@
1
+ # Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from nvmath.internal._layout import StridedLayout
6
+
7
+ from ._ndbuffer import NDBuffer
8
+
9
+ __all__ = ["NDBuffer", "StridedLayout"]
@@ -0,0 +1,10 @@
1
+ # Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ cimport cython
6
+ from libc.stdint cimport intptr_t
7
+ from .._layout._layout cimport StridedLayout
8
+
9
+
10
+ cdef int launch_copy_kernel(StridedLayout dst, StridedLayout src, intptr_t dst_ptr, intptr_t src_ptr, int device_id, intptr_t stream_ptr, object logger) except -1
@@ -0,0 +1,7 @@
1
+ # Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from libc.stdint cimport intptr_t
6
+
7
+ cdef intptr_t get_kernel(str kernel_code, str kernel_name, int device_id, include_path, object logger=*) except? 0
@@ -0,0 +1,40 @@
1
+ # Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ cimport cython
6
+ from libc.stdint cimport intptr_t
7
+ from .._layout._layout cimport StridedLayout
8
+
9
+ # cdef class Exporting
10
+
11
+ @cython.final
12
+ cdef class NDBuffer:
13
+ cdef readonly StridedLayout layout
14
+ cdef readonly object data
15
+ cdef int data_device_id
16
+ cdef readonly intptr_t data_ptr
17
+ cdef readonly str dtype_name
18
+
19
+ cdef readonly NDBuffer base
20
+
21
+ # We use numpy_view internally to dispatch host memory
22
+ # operations to numpy (e.g. h2h copy).
23
+ # If the dtype_name is not supported by numpy, we still
24
+ # create a numpy view for internal use with any dtype
25
+ # of the corresponding itemsize, but such a view
26
+ # should not be returned to the user
27
+ cdef object numpy_view
28
+ cdef bint has_supported_dtype
29
+
30
+ # lazy evaluated properties
31
+ cdef str prop_device # "cpu" or "cuda"
32
+ cdef object prop_device_id # "cpu" or int
33
+
34
+ cdef inline int init_from_data(NDBuffer self, StridedLayout layout, object data, intptr_t data_ptr, str dtype_name, int data_device_id) except -1:
35
+ self.layout = layout
36
+ self.data = data
37
+ self.data_ptr = data_ptr
38
+ self.data_device_id = data_device_id
39
+ self.dtype_name = dtype_name
40
+ return 0