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,133 @@
1
+ # Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ """
6
+ Interface to seamlessly use sparse tensors from different libraries.
7
+ """
8
+
9
+ from __future__ import annotations # allows typehint of class methods to return the self class
10
+
11
+ __all__ = ["SparseTensorHolder"]
12
+
13
+
14
+ from abc import ABC, abstractmethod
15
+ from typing import Literal
16
+
17
+ from nvmath.internal.package_ifc import StreamHolder
18
+
19
+
20
+ class SparseTensorHolder(ABC):
21
+ """
22
+ A simple base type for attributes common to *all* sparse formats.
23
+ """
24
+
25
+ @classmethod
26
+ @abstractmethod
27
+ def create_from_tensor(cls, tensor, attr_name_map):
28
+ raise NotImplementedError
29
+
30
+ @property
31
+ @abstractmethod
32
+ def attr_name_map(self):
33
+ raise NotImplementedError
34
+
35
+ @property
36
+ @abstractmethod
37
+ def device(self):
38
+ raise NotImplementedError
39
+
40
+ @property
41
+ @abstractmethod
42
+ def device_id(self):
43
+ raise NotImplementedError
44
+
45
+ @property
46
+ @abstractmethod
47
+ def dtype(self):
48
+ raise NotImplementedError
49
+
50
+ @property
51
+ @abstractmethod
52
+ def index_type(self):
53
+ raise NotImplementedError
54
+
55
+ @property
56
+ @abstractmethod
57
+ def format_name(self) -> str:
58
+ raise NotImplementedError
59
+
60
+ @property
61
+ @abstractmethod
62
+ def num_dimensions(self):
63
+ raise NotImplementedError
64
+
65
+ @property
66
+ @abstractmethod
67
+ def shape(self):
68
+ raise NotImplementedError
69
+
70
+ @property
71
+ @abstractmethod
72
+ def values(self):
73
+ raise NotImplementedError
74
+
75
+ @property
76
+ def dense_tensorholder_type(self):
77
+ """The tensor holder type for the dense constituent tensors."""
78
+ return self._dense_tensorholder_type
79
+
80
+ @abstractmethod
81
+ def to(self, device_id: int | Literal["cpu"], stream_holder: StreamHolder | None):
82
+ """Copy the SparseTensor representation to a different device.
83
+
84
+ No copy is performed if the SparseTensor is already on the requested device.
85
+ """
86
+ # This path is suitable only if `self.tensor` is a ust.Tensor instance.
87
+ # (Note, this can be the case for any known, named format holders, because
88
+ # user can wrap external sparse tensor into ust.Tensor that is then
89
+ # wrapped into SparseTensorHolder).
90
+ # Here, we ensure that the resulting copy also has a proper .tensor : ust.Tensor
91
+ # instance not just dense constituent tensors (extracted via attr_name_map)
92
+ # from the original tensor. Matmulmod impl relies on .tensor to be present
93
+ # for ust operands.
94
+ # If self.tensor may not be a ust.Tensor instance, the subclass is responsible
95
+ # for overriding this method to provide specialized implementation.
96
+ tensor = self.tensor # type: ignore[attr-defined]
97
+ tensor = tensor._to(device_id=device_id, stream_holder=stream_holder)
98
+ return self.create_from_tensor(tensor, attr_name_map=self.attr_name_map)
99
+
100
+ @abstractmethod
101
+ def copy_(self, src: SparseTensorHolder, stream_holder: StreamHolder | None) -> None:
102
+ """Overwrite the sparse tensor (in-place) with a copy of src."""
103
+ raise NotImplementedError
104
+
105
+ @abstractmethod
106
+ def to_ust(self, *, stream):
107
+ """Create an UST from the named representation. This is a zero-copy operation."""
108
+ raise NotImplementedError
109
+
110
+ @abstractmethod
111
+ def to_package(self):
112
+ """
113
+ This will create a sparse tensor for the original package from which this
114
+ interface was created.
115
+ """
116
+ raise NotImplementedError
117
+
118
+ @abstractmethod
119
+ def release(self):
120
+ """
121
+ This method will release the wrapped tensor and any format-specific data
122
+ by setting them to None.
123
+ """
124
+ raise NotImplementedError
125
+
126
+ @abstractmethod
127
+ def reset_unchecked(self, tensor):
128
+ """
129
+ This method will reset the wrapped tensor to the specified one, and update
130
+ any format-specific data accordingly. It assumes that all attributes
131
+ like the device, shape, etc are consistent between the existing and new tensor.
132
+ """
133
+ raise NotImplementedError
@@ -0,0 +1,141 @@
1
+ # Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ """
6
+ Interface to wrap an UST that encapsulates an uncommon or novel format.
7
+ """
8
+
9
+ from __future__ import annotations # allows typehint of class methods to return the self class
10
+
11
+ __all__ = ["USTensorHolder"]
12
+
13
+ from typing import Literal, TypeVar
14
+
15
+ from nvmath.internal.package_ifc import StreamHolder
16
+ from nvmath.internal.tensor_ifc import TensorHolder
17
+
18
+ from .sparse_tensor_ifc import SparseTensorHolder
19
+
20
+ """
21
+ A generic wrapper type for a UST.
22
+ """
23
+ USTensor = TypeVar("USTensor")
24
+
25
+
26
+ class USTensorHolder(SparseTensorHolder):
27
+ """
28
+ A simple wrapper type for UST objects to enable them to be used in the same way as
29
+ the other abstractions like CSRTensorHolder etc.
30
+ """
31
+
32
+ _format_name: str = "UST"
33
+
34
+ def __init__(self, tensor):
35
+ # tensor is the native tensor.
36
+ self.tensor = tensor
37
+
38
+ # The tensor holder type for the dense constituent tensors.
39
+ self._dense_tensorholder_type = tensor._dense_tensorholder_type
40
+
41
+ @classmethod
42
+ def create_from_tensor(cls, tensor, *, attr_name_map=None):
43
+ # TODO: check that tensor is UST.
44
+ return USTensorHolder(tensor=tensor)
45
+
46
+ @property
47
+ def attr_name_map(self):
48
+ return {}
49
+
50
+ @property
51
+ def device(self):
52
+ return self.tensor.device
53
+
54
+ @property
55
+ def device_id(self):
56
+ return self.tensor.device_id
57
+
58
+ @property
59
+ def dtype(self):
60
+ return self.tensor.dtype
61
+
62
+ @property
63
+ def index_type(self):
64
+ return self.tensor.index_type
65
+
66
+ @property
67
+ def format_name(self) -> str:
68
+ return USTensorHolder._format_name
69
+
70
+ @property
71
+ def num_dimensions(self):
72
+ return self.tensor.num_dimensions
73
+
74
+ @property
75
+ def shape(self):
76
+ return self.tensor.shape
77
+
78
+ @property
79
+ def pos(self):
80
+ """The LevelMap object wrapping the pos array."""
81
+ return self.tensor._pos
82
+
83
+ @property
84
+ def crd(self):
85
+ """The LevelMap object wrapping the crd array."""
86
+ return self.tensor._crd
87
+
88
+ @property
89
+ def val(self) -> TensorHolder:
90
+ """The TensorHolder object wrapping the val array."""
91
+ return self.tensor._val
92
+
93
+ @property
94
+ def values(self) -> TensorHolder:
95
+ """The TensorHolder object wrapping the val array. We use the values
96
+ attribute name to get the NNZ etc."""
97
+ return self.tensor._val
98
+
99
+ def to(self, device_id: int | Literal["cpu"], stream_holder: StreamHolder | None):
100
+ """Copy the UST representation to a different device.
101
+
102
+ No copy is performed if the UST is already on the requested device.
103
+ """
104
+
105
+ target = self.tensor._to(device_id, stream_holder)
106
+ return USTensorHolder(target)
107
+
108
+ def copy_(self, src, stream_holder: StreamHolder | None) -> None:
109
+ """Overwrite self.tensor (in-place) with a copy of src (USTensorHolder)."""
110
+
111
+ self.tensor.copy_(src.tensor, stream_holder)
112
+
113
+ def to_ust(self, *, stream):
114
+ return self.tensor
115
+
116
+ def to_package(self):
117
+ """
118
+ This will create a sparse tensor for the original package from which this
119
+ interface was created.
120
+ """
121
+ raise NotImplementedError
122
+
123
+ def release(self):
124
+ """
125
+ This method will release the wrapped tensor and any format-specific data
126
+ by setting them to None.
127
+ """
128
+ # The tensor reference.
129
+ self.tensor = None
130
+
131
+ def reset_unchecked(self, tensor):
132
+ """
133
+ This method will reset the wrapped tensor to the specified one, and update
134
+ any format-specific data accordingly. It assumes that all attributes
135
+ like the device, shape, etc are consistent between the existing and new tensor.
136
+
137
+ Args:
138
+ tensor: The native tensor to wrap.
139
+ """
140
+ # Update the tensor reference.
141
+ self.tensor = tensor
@@ -0,0 +1,56 @@
1
+ # Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ import sys
6
+ import typing
7
+
8
+ from nvmath.internal.tensor_wrapper import wrap_operand
9
+
10
+
11
+ def synchronize_dense_tensor(wrapped_tensor, *, stream_ptr=None):
12
+ """
13
+ This utility synchronizes the provided wrapped tensor for operations performed
14
+ on it in the stream specified by ``stream_ptr``.
15
+
16
+ The returned object is also a wrapped tensor.
17
+ """
18
+ if stream_ptr is None or wrapped_tensor.device == "cpu":
19
+ return wrapped_tensor
20
+
21
+ package = sys.modules[wrapped_tensor.name]
22
+ capsule = wrapped_tensor.tensor.__dlpack__(stream=stream_ptr)
23
+ tensor = package.from_dlpack(capsule)
24
+
25
+ wrapped_tensor = wrap_operand(tensor)
26
+ return wrapped_tensor
27
+
28
+
29
+ def axis_order_in_memory(strides):
30
+ """
31
+ Compute the order in which the axes appear in memory.
32
+ """
33
+ if len(strides) == 0:
34
+ return ()
35
+
36
+ _, axis_order = zip(*sorted(zip(strides, range(len(strides)), strict=True)), strict=True)
37
+
38
+ return axis_order
39
+
40
+
41
+ def calculate_strides(shape: typing.Sequence[int], axis_order: typing.Sequence[int], min_stride: int = 1):
42
+ """
43
+ Calculate the strides for the provided shape and axis order.
44
+ """
45
+ assert len(axis_order) == len(shape), f"axis_order length ({len(axis_order)}) must equal shape length ({len(shape)})"
46
+ assert len(set(axis_order)) == len(axis_order), f"axis_order must not contain duplicates: {axis_order}"
47
+ assert set(axis_order) == set(range(len(shape))), f"axis_order must be permutation of range({len(shape)}): {axis_order}"
48
+
49
+ strides: list[None | int] = [None] * len(shape)
50
+
51
+ stride = min_stride
52
+ for axis in axis_order:
53
+ strides[axis] = stride
54
+ stride *= shape[axis]
55
+
56
+ return strides
@@ -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 .._internal.cudss_data_ifc import memory_estimates_dtype # noqa: F401
6
+ from ._configuration import * # noqa: F403
7
+ from .direct_solver import * # noqa: F403
@@ -0,0 +1,227 @@
1
+ # Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ __all__ = [
6
+ "DirectSolverOptions",
7
+ "DirectSolverMatrixType",
8
+ "DirectSolverMatrixViewType",
9
+ "ExecutionCUDA",
10
+ "ExecutionHybrid",
11
+ "HybridMemoryModeOptions",
12
+ "DirectSolverPlanPreferences",
13
+ "DirectSolverFactorizationPreferences",
14
+ "DirectSolverSolutionPreferences",
15
+ ]
16
+
17
+
18
+ from dataclasses import dataclass, field
19
+ from logging import Logger
20
+ from typing import ClassVar, Literal, TypeAlias
21
+
22
+ from nvmath._internal import templates
23
+ from nvmath.bindings import cudss
24
+ from nvmath.internal import mem_limit
25
+
26
+ DirectSolverMatrixType: TypeAlias = cudss.MatrixType
27
+ DirectSolverMatrixViewType: TypeAlias = cudss.MatrixViewType
28
+
29
+
30
+ @dataclass
31
+ class HybridMemoryModeOptions:
32
+ """
33
+ A data class for providing options related to the use of hybrid (CPU-GPU) memory to
34
+ those execution spaces that support it.
35
+
36
+ Attributes:
37
+ hybrid_memory_mode: If set to True, use CPU memory to store factors (default:
38
+ ``False``). See :attr:`nvmath.bindings.cudss.ConfigParam.HYBRID_MODE`.
39
+ device_memory_limit: The maximum device memory available for execution. It can
40
+ be specified as a value (with optional suffix like K[iB], M[iB], G[iB]) or as a
41
+ percentage. The default is based on internal heuristics. See
42
+ :attr:`nvmath.bindings.cudss.ConfigParam.HYBRID_DEVICE_MEMORY_LIMIT`.
43
+ register_cuda_memory: Specify whether to register memory using
44
+ ``cudaHostRegister()`` if hybrid memory mode is used. The default is
45
+ ``True``. See
46
+ :attr:`nvmath.bindings.cudss.ConfigParam.USE_CUDA_REGISTER_MEMORY`.
47
+
48
+ .. seealso::
49
+ :class:`ExecutionHybrid`, :class:`DirectSolver`, :func:`direct_solver`.
50
+ """
51
+
52
+ hybrid_memory_mode: bool = False
53
+ hybrid_device_memory_limit: int | str | None = None # Internal heuristic.
54
+ register_cuda_memory: bool = True
55
+
56
+ def __post_init__(self):
57
+ if self.hybrid_device_memory_limit is not None:
58
+ mem_limit.check_memory_str(self.hybrid_device_memory_limit, "hybrid device memory limit")
59
+
60
+
61
+ @dataclass(frozen=True, slots=True, kw_only=True)
62
+ class ExecutionCUDA(templates.ExecutionCUDA):
63
+ """
64
+ A data class for providing GPU execution options to the :class:`DirectSolver`
65
+ object and the wrapper function :func:`direct_solver`.
66
+
67
+ Attributes:
68
+ device_id: CUDA device ordinal (only used if the operand resides on the CPU). The
69
+ default value is 0.
70
+ hybrid_memory_mode_options: Options controlling the use of hybrid (CPU-GPU) memory
71
+ as an object of type :class:`HybridMemoryModeOptions` or a `dict`.
72
+
73
+ .. seealso::
74
+ :class:`ExecutionHybrid`, :class:`HybridMemoryModeOptions`, :class:`DirectSolver`,
75
+ :func:`direct_solver`.
76
+ """
77
+
78
+ hybrid_memory_mode_options: object = field(default_factory=HybridMemoryModeOptions)
79
+
80
+
81
+ @dataclass
82
+ class ExecutionHybrid:
83
+ """
84
+ A data class for providing hybrid (CPU-GPU) execution options to the
85
+ :class:`DirectSolver` object and the wrapper function :func:`direct_solver`.
86
+
87
+ Attributes:
88
+ device_id: CUDA device ordinal (only used if the operand resides on the CPU). The
89
+ default value is 0.
90
+ num_threads: The number of CPU threads used to execute the plan.
91
+ If not specified, defaults to the number of CPU cores available to the process.
92
+
93
+ .. seealso::
94
+ :class:`ExecutionCUDA`, :class:`DirectSolver`, :func:`direct_solver`.
95
+ """
96
+
97
+ name: ClassVar[Literal["hybrid"]] = "hybrid"
98
+ device_id: int = 0
99
+ num_threads: int | None = None
100
+
101
+
102
+ @dataclass
103
+ class DirectSolverOptions:
104
+ """
105
+ A data class for providing options to the :class:`DirectSolver` object and the wrapper
106
+ function :func:`direct_solver`.
107
+
108
+ Attributes:
109
+ sparse_system_type (:class:`DirectSolverMatrixType`): The type of the sparse
110
+ system of equations (general, symmetric, symmetric positive definite, etc).
111
+ The default is ``DirectSolverMatrixType.GENERAL``.
112
+
113
+ sparse_system_view (:class:`DirectSolverMatrixViewType`): The desired view of the
114
+ sparse system of equations (full, upper, lower). The default is
115
+ ``DirectSolverMatrixViewType.FULL``.
116
+
117
+ multithreading_lib: The location (full path) to the library implementing the
118
+ threading layer interface, which depends on how nvmath-python is
119
+ :ref:`installed <nvmath installation>`. For example, if you install using
120
+ ``pip install nvmath-python[cu13]`` on Linux, the multithreading library can
121
+ be found in ``<install_path>/nvidia/cu13/lib/libcudss_mtlayer_gomp.so.0``,
122
+ where ``<install_path>`` is the path shown by ``pip show nvidia-cudss-cu13``.
123
+
124
+ logger (logging.Logger): Python Logger object. The root logger will be used if a
125
+ logger object is not provided.
126
+
127
+ blocking: A flag specifying the behavior of the execution functions and methods,
128
+ such as :func:`direct_solver` and :meth:`DirectSolver.solve`.
129
+ When ``blocking`` is `True`, the execution methods do not return until the
130
+ operation is complete. When
131
+ ``blocking`` is ``"auto"``, the methods return immediately when the input tensor
132
+ is on the GPU and ``execution`` is set to 'CUDA'. The execution methods always
133
+ block when the input tensor is on the CPU or ``execution`` is specified to 'CPU'
134
+ to ensure that the user doesn't inadvertently use the result before it becomes
135
+ available. The default is ``"auto"``.
136
+
137
+ handle: cuDSS library handle. A handle will be created if one is not provided.
138
+
139
+ .. seealso::
140
+ :class:`ExecutionCUDA`, :class:`ExecutionHybrid`, :class:`DirectSolver`, and
141
+ :func:`direct_solver`.
142
+ """
143
+
144
+ sparse_system_type: int = DirectSolverMatrixType.GENERAL
145
+ sparse_system_view: int = DirectSolverMatrixViewType.FULL
146
+ multithreading_lib: str | None = None
147
+ logger: Logger | None = None
148
+ blocking: Literal[True, "auto"] = "auto"
149
+ handle: int | None = None
150
+
151
+ def __post_init__(self):
152
+ if self.blocking not in (True, "auto"):
153
+ raise ValueError("The value specified for 'blocking' must be either True or 'auto'.")
154
+ self.sparse_system_type = DirectSolverMatrixType(self.sparse_system_type)
155
+ self.sparse_system_view = DirectSolverMatrixViewType(self.sparse_system_view)
156
+
157
+
158
+ @dataclass(slots=True, kw_only=True)
159
+ class DirectSolverPlanPreferences:
160
+ """
161
+ A data class for providing plan preferences to the :func:`direct_solver` function.
162
+
163
+ Attributes:
164
+ host_nthreads: The number of host threads to use.
165
+ reordering_algorithm: The reordering algorithm to use.
166
+ pivot_type: The pivot type to use.
167
+ pivot_threshold: The pivot threshold to use.
168
+ max_nnz: The maximum number of non-zeros in the LU factorization.
169
+ matching_algorithm: The matching algorithm to use.
170
+ nd_min_levels: The number of levels in the nested dissection.
171
+ use_superpanels: Whether to use superpanels.
172
+
173
+ .. seealso::
174
+ :func:`direct_solver`
175
+ :class:`DirectSolverPlanConfig`
176
+ `cuDSS configuration documentation <https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
177
+ """
178
+
179
+ host_nthreads: int | None = None
180
+ reordering_algorithm: cudss.ReorderingAlg | None = None
181
+ pivot_type: int | None = None
182
+ pivot_threshold: float | None = None
183
+ max_nnz: int | None = None
184
+ matching_algorithm: cudss.MatchingAlg | None = None
185
+ nd_min_levels: int | None = None
186
+ use_superpanels: bool | None = None
187
+
188
+
189
+ @dataclass(slots=True, kw_only=True)
190
+ class DirectSolverFactorizationPreferences:
191
+ """
192
+ A data class for providing factorization preferences to
193
+ the :func:`direct_solver` function.
194
+
195
+ Attributes:
196
+ factorization_algorithm: The factorization algorithm to use.
197
+ pivot_eps_algorithm: The pivot epsilon algorithm to use.
198
+ pivot_eps: The pivot epsilon to use.
199
+
200
+ .. seealso::
201
+ :func:`direct_solver`
202
+ :class:`DirectSolverFactorizationConfig`
203
+ `cuDSS configuration documentation <https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
204
+ """
205
+
206
+ factorization_algorithm: cudss.FactorizationAlg | None = None
207
+ pivot_eps_algorithm: cudss.PivotEpsilonAlg | None = None
208
+ pivot_eps: float | None = None
209
+
210
+
211
+ @dataclass(slots=True, kw_only=True)
212
+ class DirectSolverSolutionPreferences:
213
+ """
214
+ A data class for providing solution preferences to the :func:`direct_solver` function.
215
+
216
+ Attributes:
217
+ solution_algorithm: The solution algorithm to use.
218
+ ir_num_steps: The number of steps to use for iterative refinement.
219
+
220
+ .. seealso::
221
+ :func:`direct_solver`
222
+ :class:`DirectSolverSolutionConfig`
223
+ `cuDSS configuration documentation <https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
224
+ """
225
+
226
+ solution_algorithm: cudss.SolveAlg | None = None
227
+ ir_num_steps: int | None = None