nvmath-python 0.9.0__cp314-cp314-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 (309) 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 +383 -0
  7. nvmath/_utils.py +150 -0
  8. nvmath/bindings/__init__.py +51 -0
  9. nvmath/bindings/_internal/__init__.pxd +0 -0
  10. nvmath/bindings/_internal/__init__.py +0 -0
  11. nvmath/bindings/_internal/cublas.cp314-win_amd64.pyd +0 -0
  12. nvmath/bindings/_internal/cublas.pxd +530 -0
  13. nvmath/bindings/_internal/cublasLt.cp314-win_amd64.pyd +0 -0
  14. nvmath/bindings/_internal/cublasLt.pxd +59 -0
  15. nvmath/bindings/_internal/cublasMp.pxd +52 -0
  16. nvmath/bindings/_internal/cudss.cp314-win_amd64.pyd +0 -0
  17. nvmath/bindings/_internal/cudss.pxd +47 -0
  18. nvmath/bindings/_internal/cufft.cp314-win_amd64.pyd +0 -0
  19. nvmath/bindings/_internal/cufft.pxd +70 -0
  20. nvmath/bindings/_internal/cufftMp.pxd +77 -0
  21. nvmath/bindings/_internal/curand.cp314-win_amd64.pyd +0 -0
  22. nvmath/bindings/_internal/curand.pxd +42 -0
  23. nvmath/bindings/_internal/cusolver.cp314-win_amd64.pyd +0 -0
  24. nvmath/bindings/_internal/cusolver.pxd +15 -0
  25. nvmath/bindings/_internal/cusolverDn.cp314-win_amd64.pyd +0 -0
  26. nvmath/bindings/_internal/cusolverDn.pxd +406 -0
  27. nvmath/bindings/_internal/cusparse.cp314-win_amd64.pyd +0 -0
  28. nvmath/bindings/_internal/cusparse.pxd +277 -0
  29. nvmath/bindings/_internal/cusparseLt.cp314-win_amd64.pyd +0 -0
  30. nvmath/bindings/_internal/cusparseLt.pxd +48 -0
  31. nvmath/bindings/_internal/cutensor.cp314-win_amd64.pyd +0 -0
  32. nvmath/bindings/_internal/cutensor.pxd +58 -0
  33. nvmath/bindings/_internal/mathdx.cp314-win_amd64.pyd +0 -0
  34. nvmath/bindings/_internal/mathdx.pxd +116 -0
  35. nvmath/bindings/_internal/nvshmem.pxd +29 -0
  36. nvmath/bindings/_internal/utils.cp314-win_amd64.pyd +0 -0
  37. nvmath/bindings/_internal/utils.pxd +179 -0
  38. nvmath/bindings/_internal/utils.pyi +10 -0
  39. nvmath/bindings/cublas.cp314-win_amd64.pyd +0 -0
  40. nvmath/bindings/cublas.pxd +558 -0
  41. nvmath/bindings/cublas.pyi +746 -0
  42. nvmath/bindings/cublasLt.cp314-win_amd64.pyd +0 -0
  43. nvmath/bindings/cublasLt.pxd +109 -0
  44. nvmath/bindings/cublasLt.pyi +1337 -0
  45. nvmath/bindings/cublasMp.pxd +85 -0
  46. nvmath/bindings/cublasMp.pyi +219 -0
  47. nvmath/bindings/cudss.cp314-win_amd64.pyd +0 -0
  48. nvmath/bindings/cudss.pxd +86 -0
  49. nvmath/bindings/cudss.pyi +282 -0
  50. nvmath/bindings/cufft.cp314-win_amd64.pyd +0 -0
  51. nvmath/bindings/cufft.pxd +118 -0
  52. nvmath/bindings/cufft.pyi +241 -0
  53. nvmath/bindings/cufftMp.pxd +124 -0
  54. nvmath/bindings/cufftMp.pyi +260 -0
  55. nvmath/bindings/curand.cp314-win_amd64.pyd +0 -0
  56. nvmath/bindings/curand.pxd +71 -0
  57. nvmath/bindings/curand.pyi +159 -0
  58. nvmath/bindings/cusolver.cp314-win_amd64.pyd +0 -0
  59. nvmath/bindings/cusolver.pxd +62 -0
  60. nvmath/bindings/cusolver.pyi +242 -0
  61. nvmath/bindings/cusolverDn.cp314-win_amd64.pyd +0 -0
  62. nvmath/bindings/cusolverDn.pxd +430 -0
  63. nvmath/bindings/cusolverDn.pyi +416 -0
  64. nvmath/bindings/cusparse.cp314-win_amd64.pyd +0 -0
  65. nvmath/bindings/cusparse.pxd +338 -0
  66. nvmath/bindings/cusparse.pyi +659 -0
  67. nvmath/bindings/cusparseLt.cp314-win_amd64.pyd +0 -0
  68. nvmath/bindings/cusparseLt.pxd +99 -0
  69. nvmath/bindings/cusparseLt.pyi +198 -0
  70. nvmath/bindings/cutensor.cp314-win_amd64.pyd +0 -0
  71. nvmath/bindings/cutensor.pxd +98 -0
  72. nvmath/bindings/cutensor.pyi +294 -0
  73. nvmath/bindings/cycublas.cp314-win_amd64.pyd +0 -0
  74. nvmath/bindings/cycublas.pxd +684 -0
  75. nvmath/bindings/cycublasLt.cp314-win_amd64.pyd +0 -0
  76. nvmath/bindings/cycublasLt.pxd +1055 -0
  77. nvmath/bindings/cycublasMp.pxd +183 -0
  78. nvmath/bindings/cycudss.cp314-win_amd64.pyd +0 -0
  79. nvmath/bindings/cycudss.pxd +224 -0
  80. nvmath/bindings/cycufft.cp314-win_amd64.pyd +0 -0
  81. nvmath/bindings/cycufft.pxd +326 -0
  82. nvmath/bindings/cycufftMp.pxd +334 -0
  83. nvmath/bindings/cycurand.cp314-win_amd64.pyd +0 -0
  84. nvmath/bindings/cycurand.pxd +146 -0
  85. nvmath/bindings/cycusolver.cp314-win_amd64.pyd +0 -0
  86. nvmath/bindings/cycusolver.pxd +154 -0
  87. nvmath/bindings/cycusolverDn.cp314-win_amd64.pyd +0 -0
  88. nvmath/bindings/cycusolverDn.pxd +446 -0
  89. nvmath/bindings/cycusparse.cp314-win_amd64.pyd +0 -0
  90. nvmath/bindings/cycusparse.pxd +470 -0
  91. nvmath/bindings/cycusparseLt.cp314-win_amd64.pyd +0 -0
  92. nvmath/bindings/cycusparseLt.pxd +150 -0
  93. nvmath/bindings/cycutensor.cp314-win_amd64.pyd +0 -0
  94. nvmath/bindings/cycutensor.pxd +192 -0
  95. nvmath/bindings/cymathdx.cp314-win_amd64.pyd +0 -0
  96. nvmath/bindings/cymathdx.pxd +552 -0
  97. nvmath/bindings/cynvshmem.pxd +126 -0
  98. nvmath/bindings/mathdx.cp314-win_amd64.pyd +0 -0
  99. nvmath/bindings/mathdx.pxd +182 -0
  100. nvmath/bindings/mathdx.pyi +1244 -0
  101. nvmath/bindings/nvpl/__init__.pxd +0 -0
  102. nvmath/bindings/nvpl/__init__.py +13 -0
  103. nvmath/bindings/nvpl/_internal/__init__.pxd +0 -0
  104. nvmath/bindings/nvpl/_internal/__init__.py +0 -0
  105. nvmath/bindings/nvpl/_internal/blas.cp314-win_amd64.pyd +0 -0
  106. nvmath/bindings/nvpl/_internal/blas.pxd +125 -0
  107. nvmath/bindings/nvpl/_internal/fft.cp314-win_amd64.pyd +0 -0
  108. nvmath/bindings/nvpl/_internal/fft.pxd +36 -0
  109. nvmath/bindings/nvpl/blas.cp314-win_amd64.pyd +0 -0
  110. nvmath/bindings/nvpl/blas.pxd +85 -0
  111. nvmath/bindings/nvpl/blas.pyi +122 -0
  112. nvmath/bindings/nvpl/cyblas.cp314-win_amd64.pyd +0 -0
  113. nvmath/bindings/nvpl/cyblas.pxd +166 -0
  114. nvmath/bindings/nvpl/cyfft.cp314-win_amd64.pyd +0 -0
  115. nvmath/bindings/nvpl/cyfft.pxd +92 -0
  116. nvmath/bindings/nvpl/fft.cp314-win_amd64.pyd +0 -0
  117. nvmath/bindings/nvpl/fft.pxd +100 -0
  118. nvmath/bindings/nvpl/fft.pyi +100 -0
  119. nvmath/bindings/nvshmem.pxd +54 -0
  120. nvmath/bindings/nvshmem.pyi +179 -0
  121. nvmath/device/__init__.py +21 -0
  122. nvmath/device/_deprecated.py +33 -0
  123. nvmath/device/common.py +313 -0
  124. nvmath/device/common_backend.py +131 -0
  125. nvmath/device/common_cuda.py +201 -0
  126. nvmath/device/common_numba.py +310 -0
  127. nvmath/device/common_opaque_tensor.py +201 -0
  128. nvmath/device/cublasdx.py +1805 -0
  129. nvmath/device/cublasdx_backend.py +807 -0
  130. nvmath/device/cublasdx_numba.py +1612 -0
  131. nvmath/device/cufftdx.py +510 -0
  132. nvmath/device/cufftdx_backend.py +196 -0
  133. nvmath/device/cufftdx_numba.py +196 -0
  134. nvmath/device/curand_kernel.py +9147 -0
  135. nvmath/device/cusolverdx.py +2690 -0
  136. nvmath/device/cusolverdx_backend.py +440 -0
  137. nvmath/device/cusolverdx_numba.py +1624 -0
  138. nvmath/device/llvm_array.py +29 -0
  139. nvmath/device/random.py +445 -0
  140. nvmath/device/random_helpers.py +23 -0
  141. nvmath/device/random_states.py +187 -0
  142. nvmath/device/types.py +147 -0
  143. nvmath/device/vector_types_numba.py +203 -0
  144. nvmath/distributed/__init__.py +205 -0
  145. nvmath/distributed/_internal/__init__.py +0 -0
  146. nvmath/distributed/_internal/nvshmem.py +302 -0
  147. nvmath/distributed/_internal/tensor_ifc.py +67 -0
  148. nvmath/distributed/_internal/tensor_ifc_cupy.py +62 -0
  149. nvmath/distributed/_internal/tensor_ifc_host_device.py +165 -0
  150. nvmath/distributed/_internal/tensor_ifc_numpy.py +41 -0
  151. nvmath/distributed/_internal/tensor_ifc_torch.py +141 -0
  152. nvmath/distributed/_internal/tensor_wrapper.py +78 -0
  153. nvmath/distributed/_utils.py +167 -0
  154. nvmath/distributed/distribution.py +770 -0
  155. nvmath/distributed/fft/__init__.py +7 -0
  156. nvmath/distributed/fft/_configuration.py +79 -0
  157. nvmath/distributed/fft/fft.py +2801 -0
  158. nvmath/distributed/linalg/__init__.py +12 -0
  159. nvmath/distributed/linalg/_internal/__init__.py +3 -0
  160. nvmath/distributed/linalg/_internal/epilog_protocol.py +496 -0
  161. nvmath/distributed/linalg/_internal/matmul_desc_ifc.py +28 -0
  162. nvmath/distributed/linalg/advanced/__init__.py +8 -0
  163. nvmath/distributed/linalg/advanced/_configuration.py +166 -0
  164. nvmath/distributed/linalg/advanced/matmulmod.py +2908 -0
  165. nvmath/distributed/process_group.py +408 -0
  166. nvmath/distributed/reshape/__init__.py +6 -0
  167. nvmath/distributed/reshape/_configuration.py +39 -0
  168. nvmath/distributed/reshape/reshape.py +1256 -0
  169. nvmath/fft/__init__.py +7 -0
  170. nvmath/fft/_configuration.py +208 -0
  171. nvmath/fft/_exec_utils.py +109 -0
  172. nvmath/fft/_helpers.py +237 -0
  173. nvmath/fft/fft.py +2903 -0
  174. nvmath/internal/__init__.pxd +3 -0
  175. nvmath/internal/__init__.py +10 -0
  176. nvmath/internal/_bindings.cp314-win_amd64.pyd +0 -0
  177. nvmath/internal/_bindings.pxd +12 -0
  178. nvmath/internal/_device_utils.py +54 -0
  179. nvmath/internal/enum_utils.py +142 -0
  180. nvmath/internal/formatters.py +87 -0
  181. nvmath/internal/mem_limit.py +51 -0
  182. nvmath/internal/memory.cp314-win_amd64.pyd +0 -0
  183. nvmath/internal/memory.pxd +10 -0
  184. nvmath/internal/memory.pyi +46 -0
  185. nvmath/internal/ndbuffer/__init__.pxd +3 -0
  186. nvmath/internal/ndbuffer/__init__.py +7 -0
  187. nvmath/internal/ndbuffer/copy_kernel/args.h +34 -0
  188. nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/array_view.h +52 -0
  189. nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/elementwise.h +68 -0
  190. nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/grid_indexer.h +69 -0
  191. nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/transposed.h +240 -0
  192. nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/type_utils.h +39 -0
  193. nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/utils.h +132 -0
  194. nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/vec.h +159 -0
  195. nvmath/internal/ndbuffer/copy_kernel/elementwise.h +53 -0
  196. nvmath/internal/ndbuffer/copy_kernel/transposed.h +58 -0
  197. nvmath/internal/ndbuffer/copy_kernel.cp314-win_amd64.pyd +0 -0
  198. nvmath/internal/ndbuffer/copy_kernel.pxd +9 -0
  199. nvmath/internal/ndbuffer/copy_kernel.pyi +9 -0
  200. nvmath/internal/ndbuffer/data_layout.cp314-win_amd64.pyd +0 -0
  201. nvmath/internal/ndbuffer/data_layout.pxd +72 -0
  202. nvmath/internal/ndbuffer/data_layout.pyi +23 -0
  203. nvmath/internal/ndbuffer/jit.cp314-win_amd64.pyd +0 -0
  204. nvmath/internal/ndbuffer/jit.pxd +7 -0
  205. nvmath/internal/ndbuffer/jit.pyi +6 -0
  206. nvmath/internal/ndbuffer/ndbuffer.cp314-win_amd64.pyd +0 -0
  207. nvmath/internal/ndbuffer/ndbuffer.pxd +36 -0
  208. nvmath/internal/ndbuffer/ndbuffer.pyi +41 -0
  209. nvmath/internal/ndbuffer/package_utils.cp314-win_amd64.pyd +0 -0
  210. nvmath/internal/ndbuffer/package_utils.pxd +11 -0
  211. nvmath/internal/ndbuffer/package_utils.pyi +12 -0
  212. nvmath/internal/package_ifc.py +147 -0
  213. nvmath/internal/package_ifc_cuda.py +49 -0
  214. nvmath/internal/package_ifc_cupy.py +49 -0
  215. nvmath/internal/package_ifc_torch.py +31 -0
  216. nvmath/internal/package_wrapper.py +14 -0
  217. nvmath/internal/tensor_ifc.py +194 -0
  218. nvmath/internal/tensor_ifc_cupy.py +241 -0
  219. nvmath/internal/tensor_ifc_ndbuffer.py +153 -0
  220. nvmath/internal/tensor_ifc_numpy.py +183 -0
  221. nvmath/internal/tensor_ifc_torch.py +176 -0
  222. nvmath/internal/tensor_wrapper.py +157 -0
  223. nvmath/internal/typemaps.py +162 -0
  224. nvmath/internal/utils.py +771 -0
  225. nvmath/linalg/__init__.py +46 -0
  226. nvmath/linalg/_internal/__init__.py +3 -0
  227. nvmath/linalg/_internal/algo_cap_ifc.py +82 -0
  228. nvmath/linalg/_internal/algo_config_ifc.py +43 -0
  229. nvmath/linalg/_internal/batch.py +217 -0
  230. nvmath/linalg/_internal/enum_to_tuples.py +64 -0
  231. nvmath/linalg/_internal/epilog_protocol.py +766 -0
  232. nvmath/linalg/_internal/layout.py +624 -0
  233. nvmath/linalg/_internal/matmul_desc_ifc.py +28 -0
  234. nvmath/linalg/_internal/matmul_pref_ifc.py +27 -0
  235. nvmath/linalg/_internal/matrix_layout_ifc.py +26 -0
  236. nvmath/linalg/_internal/typemaps.py +144 -0
  237. nvmath/linalg/_internal/utils.py +134 -0
  238. nvmath/linalg/advanced/__init__.py +8 -0
  239. nvmath/linalg/advanced/_algorithmmod.py +149 -0
  240. nvmath/linalg/advanced/_configuration.py +349 -0
  241. nvmath/linalg/advanced/helpers/__init__.py +5 -0
  242. nvmath/linalg/advanced/helpers/matmul.py +1348 -0
  243. nvmath/linalg/advanced/matmulmod.py +3937 -0
  244. nvmath/linalg/generic/__init__.py +43 -0
  245. nvmath/linalg/generic/_configuration/__init__.py +37 -0
  246. nvmath/linalg/generic/_configuration/layout.py +263 -0
  247. nvmath/linalg/generic/_configuration/match.py +609 -0
  248. nvmath/linalg/generic/_configuration/qualifiers.py +494 -0
  249. nvmath/linalg/generic/_configuration/wrap.py +217 -0
  250. nvmath/linalg/generic/_dtype.py +15 -0
  251. nvmath/linalg/generic/matmulmod.py +1060 -0
  252. nvmath/memory.py +282 -0
  253. nvmath/sparse/__init__.py +38 -0
  254. nvmath/sparse/_internal/__init__.py +21 -0
  255. nvmath/sparse/_internal/common_utils.py +144 -0
  256. nvmath/sparse/_internal/cudss_config_ifc.py +741 -0
  257. nvmath/sparse/_internal/cudss_data_ifc.py +399 -0
  258. nvmath/sparse/_internal/cudss_utils.py +445 -0
  259. nvmath/sparse/_internal/cusparse_utils.py +382 -0
  260. nvmath/sparse/_internal/sparse_bsc_ifc.py +300 -0
  261. nvmath/sparse/_internal/sparse_bsr_ifc.py +303 -0
  262. nvmath/sparse/_internal/sparse_coo_ifc.py +254 -0
  263. nvmath/sparse/_internal/sparse_csc_ifc.py +266 -0
  264. nvmath/sparse/_internal/sparse_csr_ifc.py +266 -0
  265. nvmath/sparse/_internal/sparse_dia_ifc.py +239 -0
  266. nvmath/sparse/_internal/sparse_format_helpers.py +601 -0
  267. nvmath/sparse/_internal/sparse_tensor_ifc.py +121 -0
  268. nvmath/sparse/_internal/sparse_ust_ifc.py +146 -0
  269. nvmath/sparse/_internal/utils.py +56 -0
  270. nvmath/sparse/advanced/__init__.py +7 -0
  271. nvmath/sparse/advanced/_configuration.py +230 -0
  272. nvmath/sparse/advanced/direct_solver.py +1884 -0
  273. nvmath/sparse/generic/__init__.py +7 -0
  274. nvmath/sparse/generic/_configuration.py +129 -0
  275. nvmath/sparse/generic/_helpers.py +137 -0
  276. nvmath/sparse/generic/_thunks.py +21 -0
  277. nvmath/sparse/generic/matmulmod.py +2426 -0
  278. nvmath/sparse/ust/__init__.py +7 -0
  279. nvmath/sparse/ust/_converters.py +378 -0
  280. nvmath/sparse/ust/_drawer.py +552 -0
  281. nvmath/sparse/ust/_emitter.py +553 -0
  282. nvmath/sparse/ust/_jit.py +212 -0
  283. nvmath/sparse/ust/_kernel.py +346 -0
  284. nvmath/sparse/ust/_semiring.py +71 -0
  285. nvmath/sparse/ust/_utils.py +102 -0
  286. nvmath/sparse/ust/interfaces/__init__.py +0 -0
  287. nvmath/sparse/ust/interfaces/torch_interface.py +476 -0
  288. nvmath/sparse/ust/semiring_ops.py +71 -0
  289. nvmath/sparse/ust/tensor.py +1027 -0
  290. nvmath/sparse/ust/tensor_drawer.py +552 -0
  291. nvmath/sparse/ust/tensor_emitter.py +558 -0
  292. nvmath/sparse/ust/tensor_format.py +935 -0
  293. nvmath/sparse/ust/tensor_jit.py +212 -0
  294. nvmath/sparse/ust/tensor_kernel.py +348 -0
  295. nvmath/sparse/ust/tensor_utils.py +380 -0
  296. nvmath/tensor/__init__.py +6 -0
  297. nvmath/tensor/_configuration.py +95 -0
  298. nvmath/tensor/_internal/__init__.py +3 -0
  299. nvmath/tensor/_internal/cutensor_config_ifc.py +247 -0
  300. nvmath/tensor/_internal/cutensor_utils.py +162 -0
  301. nvmath/tensor/_internal/data.py +43 -0
  302. nvmath/tensor/_internal/einsum_parser.py +444 -0
  303. nvmath/tensor/_internal/typemaps.py +96 -0
  304. nvmath/tensor/contract.py +1861 -0
  305. nvmath_python-0.9.0.dist-info/METADATA +127 -0
  306. nvmath_python-0.9.0.dist-info/RECORD +309 -0
  307. nvmath_python-0.9.0.dist-info/WHEEL +5 -0
  308. nvmath_python-0.9.0.dist-info/licenses/LICENSE +177 -0
  309. nvmath_python-0.9.0.dist-info/top_level.txt +2 -0
@@ -0,0 +1,121 @@
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, attr_name_map, tensor):
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
+ raise NotImplementedError
87
+
88
+ @abstractmethod
89
+ def copy_(self, src: SparseTensorHolder, stream_holder: StreamHolder | None) -> None:
90
+ """Overwrite the sparse tensor (in-place) with a copy of src."""
91
+ raise NotImplementedError
92
+
93
+ @abstractmethod
94
+ def to_ust(self, *, stream):
95
+ """Create an UST from the named representation. This is a zero-copy operation."""
96
+ raise NotImplementedError
97
+
98
+ @abstractmethod
99
+ def to_package(self):
100
+ """
101
+ This will create a sparse tensor for the original package from which this
102
+ interface was created.
103
+ """
104
+ raise NotImplementedError
105
+
106
+ @abstractmethod
107
+ def release(self):
108
+ """
109
+ This method will release the wrapped tensor and any format-specific data
110
+ by setting them to None.
111
+ """
112
+ raise NotImplementedError
113
+
114
+ @abstractmethod
115
+ def reset_unchecked(self, tensor):
116
+ """
117
+ This method will reset the wrapped tensor to the specified one, and update
118
+ any format-specific data accordingly. It assumes that all attributes
119
+ like the device, shape, etc are consistent between the existing and new tensor.
120
+ """
121
+ raise NotImplementedError
@@ -0,0 +1,146 @@
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
+ # TODO: create an internal function that directly uses the stream holder.
106
+ stream = stream_holder.ptr if stream_holder is not None else None
107
+ target = self.tensor.to(device_id, stream)
108
+
109
+ return USTensorHolder(target)
110
+
111
+ def copy_(self, src, stream_holder: StreamHolder | None) -> None:
112
+ """Overwrite self.tensor (in-place) with a copy of src (USTensorHolder)."""
113
+
114
+ # TODO: create an internal function that directly uses the stream holder.
115
+ stream = stream_holder.ptr if stream_holder is not None else None
116
+ self.tensor.copy_(src.tensor, stream)
117
+
118
+ def to_ust(self, *, stream):
119
+ return self.tensor
120
+
121
+ def to_package(self):
122
+ """
123
+ This will create a sparse tensor for the original package from which this
124
+ interface was created.
125
+ """
126
+ raise NotImplementedError
127
+
128
+ def release(self):
129
+ """
130
+ This method will release the wrapped tensor and any format-specific data
131
+ by setting them to None.
132
+ """
133
+ # The tensor reference.
134
+ self.tensor = None
135
+
136
+ def reset_unchecked(self, tensor):
137
+ """
138
+ This method will reset the wrapped tensor to the specified one, and update
139
+ any format-specific data accordingly. It assumes that all attributes
140
+ like the device, shape, etc are consistent between the existing and new tensor.
141
+
142
+ Args:
143
+ tensor: The native tensor to wrap.
144
+ """
145
+ # Update the tensor reference.
146
+ 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,230 @@
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.bindings import cudss
23
+ from nvmath.internal import mem_limit
24
+
25
+ DirectSolverMatrixType: TypeAlias = cudss.MatrixType
26
+ DirectSolverMatrixViewType: TypeAlias = cudss.MatrixViewType
27
+
28
+
29
+ @dataclass
30
+ class HybridMemoryModeOptions:
31
+ """
32
+ A data class for providing options related to the use of hybrid (CPU-GPU) memory to
33
+ those execution spaces that support it.
34
+
35
+ Attributes:
36
+ hybrid_memory_mode: If set to True, use CPU memory to store factors (default:
37
+ ``False``). See :attr:`nvmath.bindings.cudss.ConfigParam.HYBRID_MODE`.
38
+ device_memory_limit: The maximum device memory available for execution. It can
39
+ be specified as a value (with optional suffix like K[iB], M[iB], G[iB]) or as a
40
+ percentage. The default is based on internal heuristics. See
41
+ :attr:`nvmath.bindings.cudss.ConfigParam.HYBRID_DEVICE_MEMORY_LIMIT`.
42
+ register_cuda_memory: Specify whether to register memory using
43
+ ``cudaHostRegister()`` if hybrid memory mode is used. The default is
44
+ ``True``. See
45
+ :attr:`nvmath.bindings.cudss.ConfigParam.USE_CUDA_REGISTER_MEMORY`.
46
+
47
+ .. seealso::
48
+ :class:`ExecutionHybrid`, :class:`DirectSolver`, :func:`direct_solver`.
49
+ """
50
+
51
+ hybrid_memory_mode: bool = False
52
+ hybrid_device_memory_limit: int | str | None = None # Internal heuristic.
53
+ register_cuda_memory: bool = True
54
+
55
+ def __post_init__(self):
56
+ if self.hybrid_device_memory_limit is not None:
57
+ mem_limit.check_memory_str(self.hybrid_device_memory_limit, "hybrid device memory limit")
58
+
59
+
60
+ @dataclass
61
+ class ExecutionCUDA:
62
+ """
63
+ A data class for providing GPU execution options to the :class:`DirectSolver`
64
+ object and the wrapper function :func:`direct_solver`.
65
+
66
+ Attributes:
67
+ device_id: CUDA device ordinal (only used if the operand resides on the CPU). The
68
+ default value is 0.
69
+ hybrid_memory_mode_options: Options controlling the use of hybrid (CPU-GPU) memory
70
+ as an object of type :class:`HybridMemoryModeOptions` or a `dict`.
71
+
72
+ .. seealso::
73
+ :class:`ExecutionHybrid`, :class:`HybridMemoryModeOptions`, :class:`DirectSolver`,
74
+ :func:`direct_solver`.
75
+ """
76
+
77
+ name: ClassVar[Literal["cuda"]] = "cuda"
78
+ device_id: int = 0
79
+ hybrid_memory_mode_options: object = field(default_factory=HybridMemoryModeOptions)
80
+
81
+
82
+ @dataclass
83
+ class ExecutionHybrid:
84
+ """
85
+ A data class for providing hybrid (CPU-GPU) execution options to the
86
+ :class:`DirectSolver` object and the wrapper function :func:`direct_solver`.
87
+
88
+ Attributes:
89
+ device_id: CUDA device ordinal (only used if the operand resides on the CPU). The
90
+ default value is 0.
91
+ num_threads: The number of CPU threads used to execute the plan.
92
+ If not specified, defaults to the number of CPU cores available to the process.
93
+
94
+ .. seealso::
95
+ :class:`ExecutionCUDA`, :class:`DirectSolver`, :func:`direct_solver`.
96
+ """
97
+
98
+ name: ClassVar[Literal["hybrid"]] = "hybrid"
99
+ device_id: int = 0
100
+ num_threads: int | None = None
101
+
102
+
103
+ @dataclass
104
+ class DirectSolverOptions:
105
+ """
106
+ A data class for providing options to the :class:`DirectSolver` object and the wrapper
107
+ function :func:`direct_solver`.
108
+
109
+ Attributes:
110
+ sparse_system_type (:class:`DirectSolverMatrixType`): The type of the sparse
111
+ system of equations (general, symmetric, symmetric positive definite, etc).
112
+ The default is ``DirectSolverMatrixType.GENERAL``.
113
+
114
+ sparse_system_view (:class:`DirectSolverMatrixViewType`): The desired view of the
115
+ sparse system of equations (full, upper, lower). The default is
116
+ ``DirectSolverMatrixViewType.FULL``.
117
+
118
+ multithreading_lib: The location (full path) to the library implementing the
119
+ threading layer interface, which depends on how nvmath-python is
120
+ :ref:`installed <nvmath installation>`. For example, if you install using
121
+ ``pip install nvmath-python[cu13]`` on Linux, the multithreading library can
122
+ be found in ``<install_path>/nvidia/cu13/lib/libcudss_mtlayer_gomp.so.0``,
123
+ where ``<install_path>`` is the path shown by ``pip show nvidia-cudss-cu13``.
124
+
125
+ logger (logging.Logger): Python Logger object. The root logger will be used if a
126
+ logger object is not provided.
127
+
128
+ blocking: A flag specifying the behavior of the execution functions and methods,
129
+ such as :func:`direct_solver` and :meth:`DirectSolver.solve`.
130
+ When ``blocking`` is `True`, the execution methods do not return until the
131
+ operation is complete. When
132
+ ``blocking`` is ``"auto"``, the methods return immediately when the input tensor
133
+ is on the GPU and ``execution`` is set to 'CUDA'. The execution methods always
134
+ block when the input tensor is on the CPU or ``execution`` is specified to 'CPU'
135
+ to ensure that the user doesn't inadvertently use the result before it becomes
136
+ available. The default is ``"auto"``.
137
+
138
+ handle: cuDSS library handle. A handle will be created if one is not provided.
139
+
140
+ .. seealso::
141
+ :class:`ExecutionCUDA`, :class:`ExecutionHybrid`, :class:`DirectSolver`, and
142
+ :func:`direct_solver`.
143
+ """
144
+
145
+ sparse_system_type: int = DirectSolverMatrixType.GENERAL
146
+ sparse_system_view: int = DirectSolverMatrixViewType.FULL
147
+ multithreading_lib: str | None = None
148
+ logger: Logger | None = None
149
+ blocking: Literal[True, "auto"] = "auto"
150
+ handle: int | None = None
151
+
152
+ def __post_init__(self):
153
+ if self.blocking not in (True, "auto"):
154
+ raise ValueError("The value specified for 'blocking' must be either True or 'auto'.")
155
+ self.sparse_system_type = DirectSolverMatrixType(self.sparse_system_type)
156
+ self.sparse_system_view = DirectSolverMatrixViewType(self.sparse_system_view)
157
+
158
+
159
+ @dataclass(slots=True, kw_only=True)
160
+ class DirectSolverPlanPreferences:
161
+ """
162
+ A data class for providing plan preferences to the :func:`direct_solver` function.
163
+
164
+ Attributes:
165
+ host_nthreads: The number of host threads to use.
166
+ reordering_algorithm: The reordering algorithm to use.
167
+ pivot_type: The pivot type to use.
168
+ pivot_threshold: The pivot threshold to use.
169
+ max_nnz: The maximum number of non-zeros in the LU factorization.
170
+ use_matching: Whether to use matching.
171
+ matching_algorithm: The matching algorithm to use.
172
+ nd_min_levels: The number of levels in the nested dissection.
173
+ use_superpanels: Whether to use superpanels.
174
+
175
+ .. seealso::
176
+ :func:`direct_solver`
177
+ :class:`DirectSolverPlanConfig`
178
+ `cuDSS configuration documentation <https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
179
+ """
180
+
181
+ host_nthreads: int | None = None
182
+ reordering_algorithm: cudss.AlgType | None = None
183
+ pivot_type: int | None = None
184
+ pivot_threshold: float | None = None
185
+ max_nnz: int | None = None
186
+ use_matching: bool | None = None
187
+ matching_algorithm: cudss.AlgType | None = None
188
+ nd_min_levels: int | None = None
189
+ use_superpanels: bool | None = None
190
+
191
+
192
+ @dataclass(slots=True, kw_only=True)
193
+ class DirectSolverFactorizationPreferences:
194
+ """
195
+ A data class for providing factorization preferences to
196
+ the :func:`direct_solver` function.
197
+
198
+ Attributes:
199
+ factorization_algorithm: The factorization algorithm to use.
200
+ pivot_eps_algorithm: The pivot epsilon algorithm to use.
201
+ pivot_eps: The pivot epsilon to use.
202
+
203
+ .. seealso::
204
+ :func:`direct_solver`
205
+ :class:`DirectSolverFactorizationConfig`
206
+ `cuDSS configuration documentation <https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
207
+ """
208
+
209
+ factorization_algorithm: cudss.AlgType | None = None
210
+ pivot_eps_algorithm: cudss.AlgType | None = None
211
+ pivot_eps: float | None = None
212
+
213
+
214
+ @dataclass(slots=True, kw_only=True)
215
+ class DirectSolverSolutionPreferences:
216
+ """
217
+ A data class for providing solution preferences to the :func:`direct_solver` function.
218
+
219
+ Attributes:
220
+ solution_algorithm: The solution algorithm to use.
221
+ ir_num_steps: The number of steps to use for iterative refinement.
222
+
223
+ .. seealso::
224
+ :func:`direct_solver`
225
+ :class:`DirectSolverSolutionConfig`
226
+ `cuDSS configuration documentation <https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
227
+ """
228
+
229
+ solution_algorithm: cudss.AlgType | None = None
230
+ ir_num_steps: int | None = None