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,56 @@
1
+ # Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from nvmath.bindings.cublas import ComputeType # type: ignore
6
+
7
+ from . import advanced
8
+ from .generic import (
9
+ DiagonalMatrixQualifier,
10
+ DiagType,
11
+ ExecutionCPU,
12
+ ExecutionCUDA,
13
+ FillMode,
14
+ GeneralMatrixQualifier,
15
+ HermitianMatrixQualifier,
16
+ InvalidMatmulState,
17
+ Matmul,
18
+ MatmulOptions,
19
+ MatrixQualifier,
20
+ SideMode,
21
+ SymmetricMatrixQualifier,
22
+ TriangularMatrixQualifier,
23
+ matmul,
24
+ matrix_qualifiers_dtype,
25
+ )
26
+ from .generic.solvermod import (
27
+ DirectSolver,
28
+ DirectSolverOptions,
29
+ InvalidDirectSolverState,
30
+ direct_solver,
31
+ )
32
+
33
+ __all__ = [
34
+ "advanced",
35
+ "ComputeType",
36
+ "DiagonalMatrixQualifier",
37
+ "ExecutionCPU",
38
+ "ExecutionCUDA",
39
+ "GeneralMatrixQualifier",
40
+ "HermitianMatrixQualifier",
41
+ "InvalidMatmulState",
42
+ "InvalidDirectSolverState",
43
+ "DirectSolver",
44
+ "DirectSolverOptions",
45
+ "matmul",
46
+ "Matmul",
47
+ "MatmulOptions",
48
+ "MatrixQualifier",
49
+ "matrix_qualifiers_dtype",
50
+ "direct_solver",
51
+ "SymmetricMatrixQualifier",
52
+ "TriangularMatrixQualifier",
53
+ "SideMode",
54
+ "FillMode",
55
+ "DiagType",
56
+ ]
@@ -0,0 +1,3 @@
1
+ # Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
@@ -0,0 +1,82 @@
1
+ # Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ """
6
+ Interface class to encapsulate low-level calls to get algorithm capabilities information.
7
+ """
8
+
9
+ __all__ = ["AlgoCapInterface"]
10
+
11
+ import numpy as np
12
+
13
+ from nvmath._internal.attribute_ifc_factory import make_cublas_attribute_interface
14
+ from nvmath.bindings import cublasLt as cublaslt
15
+
16
+ from .enum_to_tuples import ENUM_TO_MATMUL_STAGE, ENUM_TO_MATMUL_TILE
17
+
18
+ CapEnum = cublaslt.MatmulAlgoCapAttribute
19
+
20
+ # Create a base class, _AlgoCapBase, such that each enum member in
21
+ # MatmulAlgoCapAttribute (except TILE_IDS and STAGES_IDS) is exposed
22
+ # as a read-only lowercase property. For example, if the class instance
23
+ # is stored as ``cap_ifc``, then the enum member ``ATOMIC_SYNC``
24
+ # becomes the property ``cap_ifc.atomic_sync``.
25
+ #
26
+ # The C binding expects a raw pointer to the algo sub-buffer, not the
27
+ # handle dict. _get_attribute bridges that gap by extracting
28
+ # `handle["algo"].ctypes.data` before forwarding the call.
29
+ _raw_get = cublaslt.matmul_algo_cap_get_attribute
30
+
31
+
32
+ def _get_attribute(handle, enum_value, buf_addr, buf_size, size_written_addr):
33
+ _raw_get(handle["algo"].ctypes.data, enum_value, buf_addr, buf_size, size_written_addr)
34
+
35
+
36
+ # TILE_IDS and STAGES_IDS are excluded because they are variable-length
37
+ # arrays that require a two-phase size-then-read query. They are implemented
38
+ # as extra properties on the AlgoCapInterface subclass below.
39
+ _AlgoCapBase = make_cublas_attribute_interface(
40
+ class_module=__name__,
41
+ class_name="_AlgoCapBase",
42
+ attribute_enum=CapEnum,
43
+ get_attribute_dtype_fn=cublaslt.get_matmul_algo_cap_attribute_dtype,
44
+ get_attribute_fn=_get_attribute,
45
+ exclude={"TILE_IDS", "STAGES_IDS"},
46
+ )
47
+
48
+
49
+ class AlgoCapInterface(_AlgoCapBase): # type: ignore[valid-type, misc]
50
+ """The factory base class is extended with two extra properties:
51
+ ``tile_ids`` and ``stages_ids`` are added here because they return
52
+ variable-length arrays via a two-phase size-then-read query."""
53
+
54
+ def _get_array_attribute(self, name, enum_to_value_map):
55
+ dtype = cublaslt.get_matmul_algo_cap_attribute_dtype(CapEnum[name])
56
+ size_written = np.zeros((1,), dtype=np.uint64)
57
+
58
+ _raw_get(self._handle["algo"].ctypes.data, CapEnum[name].value, 0, 0, size_written.ctypes.data)
59
+
60
+ size = size_written[0]
61
+ if size == 0:
62
+ return ()
63
+
64
+ num = int(size // dtype().itemsize)
65
+ attribute_buffer = np.zeros((num,), dtype=dtype)
66
+ _raw_get(
67
+ self._handle["algo"].ctypes.data,
68
+ CapEnum[name].value,
69
+ attribute_buffer.ctypes.data,
70
+ size,
71
+ size_written.ctypes.data,
72
+ )
73
+
74
+ return tuple(enum_to_value_map[e] for e in attribute_buffer)
75
+
76
+ @property
77
+ def tile_ids(self):
78
+ return self._get_array_attribute("TILE_IDS", ENUM_TO_MATMUL_TILE)
79
+
80
+ @property
81
+ def stages_ids(self):
82
+ return self._get_array_attribute("STAGES_IDS", ENUM_TO_MATMUL_STAGE)
@@ -0,0 +1,43 @@
1
+ # Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ """
6
+ Interface class to encapsulate low-level calls to get and set algorithm configuration
7
+ attributes.
8
+ """
9
+
10
+ __all__ = ["AlgoConfigInterface"]
11
+
12
+ from nvmath._internal.attribute_ifc_factory import make_cublas_attribute_interface
13
+ from nvmath.bindings import cublasLt as cublaslt
14
+
15
+ # Create a class, AlgoConfigInterface, such that each enum member in
16
+ # MatmulAlgoConfigAttribute is exposed as a lowercase property (getter + setter).
17
+ # For example, if the class instance is stored as ``config_ifc``,
18
+ # then the enum member ``CLUSTER_SHAPE_ID`` becomes the property
19
+ # ``config_ifc.cluster_shape_id``.
20
+ #
21
+ # The C bindings expect a raw pointer to the algo sub-buffer, not the
22
+ # handle dict. _get_attribute and _set_attribute bridge that gap by
23
+ # extracting `handle["algo"].ctypes.data` before forwarding the call.
24
+ _raw_get = cublaslt.matmul_algo_config_get_attribute
25
+ _raw_set = cublaslt.matmul_algo_config_set_attribute
26
+
27
+
28
+ def _get_attribute(handle, enum_value, buf_addr, buf_size, size_written_addr):
29
+ _raw_get(handle["algo"].ctypes.data, enum_value, buf_addr, buf_size, size_written_addr)
30
+
31
+
32
+ def _set_attribute(handle, enum_value, buf_addr, buf_size):
33
+ _raw_set(handle["algo"].ctypes.data, enum_value, buf_addr, buf_size)
34
+
35
+
36
+ AlgoConfigInterface = make_cublas_attribute_interface(
37
+ class_module=__name__,
38
+ class_name="AlgoConfigInterface",
39
+ attribute_enum=cublaslt.MatmulAlgoConfigAttribute,
40
+ get_attribute_dtype_fn=cublaslt.get_matmul_algo_config_attribute_dtype,
41
+ get_attribute_fn=_get_attribute,
42
+ set_attribute_fn=_set_attribute,
43
+ )
@@ -0,0 +1,234 @@
1
+ # Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from __future__ import annotations # allows typehint of class methods to return the self class
6
+
7
+ import math
8
+ from collections.abc import Sequence
9
+ from dataclasses import dataclass
10
+
11
+ from nvmath._internal.layout import is_overlapping_layout
12
+ from nvmath.linalg._internal.utils import axis_order_in_memory, calculate_strides, check_batch_tileable
13
+
14
+
15
+ @dataclass(slots=True, frozen=True)
16
+ class BatchTraits:
17
+ """Represents the traits of a batched data.
18
+
19
+ A BatchTraits is valid if the non-batch dimensions are contiguous and dense (the data
20
+ span the entire extent of the tensor and there are no gaps between adjacent elements).
21
+ The batch dimensions may be optionally overlapping.
22
+
23
+ Attributes:
24
+ shape: The dimensions of the batch. An empty tuple `()` indicates no batching.
25
+ strides: The memory strides for each dimension of the batch.
26
+ overlap_allowed: Whether the batch dimensions are allowed to overlap in memory.
27
+
28
+ """
29
+
30
+ shape: Sequence[int]
31
+ strides: Sequence[int]
32
+ overlap_allowed: bool = False
33
+
34
+ @classmethod
35
+ def from_full_shape_and_strides(
36
+ cls,
37
+ shape: Sequence[int],
38
+ strides: Sequence[int],
39
+ num_trailing_dims: int,
40
+ overlap_allowed: bool = False,
41
+ ) -> BatchTraits:
42
+ """Create BatchTraits from the shape and strides of a tensor.
43
+
44
+ Args:
45
+ shape: The full shape of the tensor including both batch and non-batch
46
+ dimensions.
47
+ strides: The memory strides for each dimension of the full tensor.
48
+ num_trailing_dims: The number of trailing (non-batch) dimensions to exclude from
49
+ the batch. For example, for a batched matrix with shape (B1, B2, M, N),
50
+ num_trailing_dims=2 would extract (B1, B2) as batch dimensions.
51
+ overlap_allowed: Whether the batch dimensions are allowed to overlap in memory.
52
+ If False, raises ValueError if overlapping layout is detected. Defaults to
53
+ False.
54
+
55
+ Returns:
56
+ BatchTraits with the extracted batch shape and strides.
57
+
58
+ Raises:
59
+ ValueError: If the batch layout is not tileable (cannot be efficiently
60
+ processed).
61
+ ValueError: If overlap_allowed is False and the batch layout has overlapping
62
+ memory.
63
+
64
+ Example:
65
+ >>> # Extract batch info from a tensor of shape (3, 4, 5, 6)
66
+ >>> # treating last 2 dimensions as non-batch
67
+ >>> batch = BatchTraits.from_full_shape_and_strides(
68
+ ... shape=(3, 4, 5, 6),
69
+ ... strides=(120, 30, 6, 1), # Row-major strides
70
+ ... num_trailing_dims=2, # Last 2 dims are non-batch
71
+ ... )
72
+ >>> batch.shape
73
+ (3, 4)
74
+ >>> batch.strides
75
+ (120, 30)
76
+ """
77
+ assert len(shape) == len(strides), (shape, strides)
78
+ num_dims = len(shape)
79
+ leading_shape = shape[: num_dims - num_trailing_dims]
80
+ leading_strides = strides[: num_dims - num_trailing_dims]
81
+ # Check for valid batching
82
+ # The samples in the batch must be tileable.
83
+ if leading_shape and not check_batch_tileable(leading_shape, leading_strides):
84
+ message = (
85
+ f"The batch layout for shape = {leading_shape} and strides = "
86
+ f"{leading_strides} is currently not supported because it is not tileable."
87
+ )
88
+ raise ValueError(message)
89
+
90
+ if not overlap_allowed and is_overlapping_layout(leading_shape, leading_strides):
91
+ raise ValueError(
92
+ "Only non-overlapping tensors are valid for batching. "
93
+ f"Shape {leading_shape} with strides {leading_strides} is not valid for batching."
94
+ )
95
+ # It's OK if we prune off the information about the trailing dimensions because the
96
+ # strides should already contain information about them.
97
+ return BatchTraits(
98
+ shape=leading_shape,
99
+ strides=leading_strides,
100
+ overlap_allowed=overlap_allowed,
101
+ )
102
+
103
+ @classmethod
104
+ def from_batch_shape_and_size(
105
+ cls,
106
+ shape: Sequence[int],
107
+ axis_order: Sequence[int],
108
+ batch_stride: int,
109
+ ) -> BatchTraits:
110
+ """Create BatchTraits from a batch shape and the size of one batch sample.
111
+
112
+ This method constructs BatchTraits by calculating the appropriate strides for a new
113
+ tensor with the given batch `shape`. The strides are computed based on the number of
114
+ elements of one batch sample and the desired layout order specified via
115
+ `axis_order`.
116
+
117
+ Args:
118
+ shape: The shape of the batch dimensions
119
+ axis_order: The order of batch axes in memory
120
+ batch_stride: Number of elements of one batch sample (e.g., M*N
121
+ for an MxN matrix)
122
+
123
+ Returns:
124
+ BatchTraits with the specified batch shape and computed strides.
125
+
126
+ Example:
127
+ >>> # Creating batch info for tensor of shape (3, 4, 5, 5)
128
+ >>> batch = BatchTraits.from_batch_shape_and_size(
129
+ ... shape=(3, 4), # 2D batch
130
+ ... axis_order=(1, 0), # ROW order,inner dimension (axis 1) comes first
131
+ ... batch_stride=25, # Each 5x5 matrix = 25 elements
132
+ ... )
133
+ >>> batch.shape
134
+ (3, 4)
135
+ >>> batch.strides
136
+ (100, 25) # Jump 100 for outer dim, 25 for inner dim
137
+ """
138
+ strides = calculate_strides(
139
+ shape,
140
+ axis_order,
141
+ batch_stride,
142
+ )
143
+ return BatchTraits.from_full_shape_and_strides(
144
+ shape=shape,
145
+ strides=strides,
146
+ num_trailing_dims=0,
147
+ overlap_allowed=False,
148
+ )
149
+
150
+ @property
151
+ def count(self) -> int:
152
+ """The total number of elements in the batch. Returns 0 if non-batched."""
153
+ return 0 if not self.shape else math.prod(self.shape)
154
+
155
+ @property
156
+ def stride(self) -> int:
157
+ """The stride between elements the batch. Returns 0 if non-batched."""
158
+ return 0 if not self.shape else min(self.strides)
159
+
160
+ @property
161
+ def axis_order(self) -> tuple[int, ...]:
162
+ """The axis order of the batch. Returns an empty tuple if non-batched."""
163
+ return axis_order_in_memory(self.strides)
164
+
165
+ def __eq__(self, other) -> bool:
166
+ """Return whether two BatchTraits are equal.
167
+
168
+ Two BatchTraits are equal only if both the shape and strides of the batches are
169
+ equal.
170
+ """
171
+ if not isinstance(other, BatchTraits):
172
+ raise TypeError("Unsupported operand type(s) for ==.")
173
+ return self.shape == other.shape and self.strides == other.strides
174
+
175
+ def combine(
176
+ self,
177
+ other: BatchTraits | tuple[Sequence[int], Sequence[int]],
178
+ *,
179
+ allow_mixed_axis_order: bool = False,
180
+ ) -> tuple[Sequence[int], Sequence[int]]:
181
+ """Return the combined shape of two BatchTraits.
182
+
183
+ Currently two BatchTraits are only combinable if they have the same shape and axis
184
+ order or if one is an empty batch.
185
+
186
+ Parameters
187
+ ----------
188
+ other: The other BatchTraits or (shape, axis_order) tuple to combine with.
189
+ allow_mixed_axis_order: If True, skip the axis_order compatibility check and pick
190
+ the first non-empty axis_order. Useful for explicit batching where each
191
+ operand's pointer array is computed independently.
192
+
193
+ Returns
194
+ -------
195
+ shape: The combined shape of the two BatchTraits.
196
+ axis_order: The combined axis order of the two BatchTraits.
197
+
198
+ Raises
199
+ ------
200
+ ValueError: if the dimensions and strides are incompatible.
201
+ """
202
+ if isinstance(other, BatchTraits):
203
+ shape, axis_order = other.shape, other.axis_order
204
+ else:
205
+ shape, axis_order = other # type: ignore[assignment]
206
+ if not self.shape or self.shape == shape:
207
+ new_shape = shape
208
+ elif not shape:
209
+ new_shape = self.shape
210
+ else:
211
+ msg = (
212
+ f"Batch dimensions {self.shape} and {shape} are not compatible. "
213
+ "Dimensions must be the same OR one input must be non-batched."
214
+ )
215
+ raise ValueError(msg)
216
+ if not self.axis_order or self.axis_order == axis_order:
217
+ new_axis_order = axis_order
218
+ elif not axis_order:
219
+ new_axis_order = self.axis_order
220
+ elif allow_mixed_axis_order:
221
+ new_axis_order = self.axis_order # pick self's order; D will be allocated fresh anyway
222
+ else:
223
+ msg = (
224
+ f"Batch order {self.axis_order} and {axis_order} are not compatible. "
225
+ "Batch orders must be the same OR one input must be non-batched."
226
+ )
227
+ raise ValueError(msg)
228
+ return new_shape, new_axis_order
229
+
230
+ def __mul__(self, other: BatchTraits | tuple[Sequence[int], Sequence[int]]) -> tuple[Sequence[int], Sequence[int]]:
231
+ return self.combine(other)
232
+
233
+ def __str__(self) -> str:
234
+ return f"shape {self.shape} and strides {self.strides}"
@@ -0,0 +1,64 @@
1
+ # Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ """
6
+ Utilities to convert tuple like enumerators to tuples, along with forward and inverse maps.
7
+ """
8
+
9
+ __all__ = [
10
+ "CLUSTER_SHAPES",
11
+ "CLUSTER_SHAPE_TO_ENUM",
12
+ "ENUM_TO_CLUSTER_SHAPE",
13
+ "MATMUL_STAGES",
14
+ "MATMUL_STAGE_TO_ENUM",
15
+ "ENUM_TO_MATMUL_STAGE",
16
+ "MATMUL_TILES",
17
+ "MATMUL_TILE_TO_ENUM",
18
+ "ENUM_TO_MATMUL_TILE",
19
+ ]
20
+
21
+ import re
22
+
23
+ from nvmath.bindings import cublasLt as cublaslt
24
+
25
+
26
+ def integer_or_string(value):
27
+ try:
28
+ value = int(value)
29
+ except ValueError:
30
+ ...
31
+ return value
32
+
33
+
34
+ def create_valid_tuples_from_enum(enum, prefix, *, expr=r"(?:(\d+)x(\d+|\w+)(?:x(\d+))?|(AUTO|UNDEFINED))"):
35
+ """
36
+ Create a sequence of tuples representing the allowed combinations for the given
37
+ enumeration.
38
+ """
39
+
40
+ combinations = []
41
+ enumerator_to_value = {}
42
+ value_to_enumerator = {}
43
+ expr = prefix + expr
44
+ for e in enum:
45
+ m = re.match(expr, e.name)
46
+ if m:
47
+ # print(m.groups())
48
+ if m.group(4):
49
+ v = m.group(4)
50
+ else:
51
+ groups = m.groups()[: m.groups().index(None)]
52
+ v = tuple(map(integer_or_string, (g for g in groups)))
53
+ combinations.append(v)
54
+ value_to_enumerator[v] = e
55
+ enumerator_to_value[e] = v
56
+
57
+ return tuple(combinations), value_to_enumerator, enumerator_to_value
58
+
59
+
60
+ CLUSTER_SHAPES, CLUSTER_SHAPE_TO_ENUM, ENUM_TO_CLUSTER_SHAPE = create_valid_tuples_from_enum(cublaslt.ClusterShape, "SHAPE_")
61
+
62
+ MATMUL_STAGES, MATMUL_STAGE_TO_ENUM, ENUM_TO_MATMUL_STAGE = create_valid_tuples_from_enum(cublaslt.MatmulStages, "STAGES_")
63
+
64
+ MATMUL_TILES, MATMUL_TILE_TO_ENUM, ENUM_TO_MATMUL_TILE = create_valid_tuples_from_enum(cublaslt.MatmulTile, "TILE_")