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,399 @@
1
+ # Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ """
6
+ Interface classes to encapsulate low-level calls to get or set cuDSS "data" attributes.
7
+ """
8
+
9
+ __all__ = ["FactorizationInfo", "PlanInfo", "memory_estimates_dtype"]
10
+
11
+ import re
12
+ import threading
13
+ from typing import TypeAlias
14
+
15
+ import numpy as np
16
+
17
+ from nvmath.bindings import cudss
18
+ from nvmath.internal import utils
19
+
20
+ DataParamEnum: TypeAlias = cudss.DataParam # type: ignore[name-defined, attr-defined]
21
+
22
+ # Future-proofing - cuDSS is currently not thread-safe.
23
+ # https://docs.nvidia.com/cuda/cudss/general.html#thread-safety
24
+ _tls = threading.local()
25
+ _tls.size_written = np.empty((1,), dtype=np.uint64)
26
+
27
+
28
+ # TODO: factor out common utilities (taken from fft.py).
29
+ def complex_to_real_equivalent(name):
30
+ assert "complex" in name, f"Internal Error ({name=})"
31
+ m = name.split("complex")
32
+ assert len(m) in (1, 2)
33
+ size = int(m[-1]) // 2
34
+ if len(m) == 1:
35
+ return f"float{size}"
36
+ else:
37
+ return f"{m[0]}float{size}"
38
+
39
+
40
+ def _get_attribute(handle, data_ptr, name, attribute, length=1):
41
+ """
42
+ name = cudss enumerator for the attribute.
43
+ attribute = numpy ndarray object into which the value is stored.
44
+ """
45
+ cudss.data_get(
46
+ handle, data_ptr, name, attribute.ctypes.data, length * attribute.dtype.itemsize, _tls.size_written.ctypes.data
47
+ )
48
+ assert _tls.size_written[0] <= length * attribute.dtype.itemsize, "Internal error."
49
+
50
+
51
+ def _check_valid_solver(info):
52
+ """
53
+ Check if the configuration points to a valid DirectSolver object.
54
+ """
55
+ if not info._solver.valid_state:
56
+ m = re.match(r"<nvmath\..*\.(.*Info) object at (.*)>$", str(info))
57
+ assert m is not None, "Internal error."
58
+ name = m.group(1)
59
+ address = m.group(2)
60
+
61
+ raise RuntimeError(f"The {name} object at {address} cannot be used after it's solver object is free'd.")
62
+
63
+
64
+ memory_estimates_dtype = np.dtype(
65
+ [
66
+ ("permanent_device_memory", "<u8"),
67
+ ("peak_device_memory", "<u8"),
68
+ ("permanent_host_memory", "<u8"),
69
+ ("peak_host_memory", "<u8"),
70
+ ("hybrid_min_device_memory", "<u8"),
71
+ ("hybrid_max_device_memory", "<u8"),
72
+ ("reserved", "<u8", (10,)),
73
+ ]
74
+ )
75
+
76
+
77
+ class PlanInfo:
78
+ """
79
+ An interface to query information returned by
80
+ :meth:`nvmath.sparse.advanced.DirectSolver.plan`.
81
+ """
82
+
83
+ def __init__(self, solver):
84
+ """
85
+ ctor for internal use only.
86
+ """
87
+ self._solver = solver
88
+ self._handle = self._solver.handle
89
+ self._data_ptr = self._solver.data_ptr
90
+ assert self._data_ptr is not None, "Internal error."
91
+
92
+ self._N = self._solver._N
93
+ self._batched = self._solver.batched
94
+ self._index_type = self._solver.index_type
95
+ self._value_type = self._solver.value_type
96
+ self._nsuperpanels = np.zeros((1,), dtype=self._index_type)
97
+
98
+ # Allocate permutation arrays lazily, and only if not batched.
99
+ self._perm_reorder_col = None
100
+ self._perm_reorder_row = None
101
+ self._perm_matching = None
102
+
103
+ self._memory_estimates = np.zeros((), dtype=memory_estimates_dtype).view(np.recarray)
104
+
105
+ def _check_valid_solver_wrapper(self, *args, **kwargs):
106
+ _check_valid_solver(self)
107
+
108
+ @property
109
+ @utils.precondition(_check_valid_solver_wrapper)
110
+ def memory_estimates(self):
111
+ """
112
+ Query the memory estimates. See the
113
+ `cuDSS documentation
114
+ <https://docs.nvidia.com/cuda/cudss/types.html#cudssdataparam-t>`_
115
+ for more information.
116
+ """
117
+ _get_attribute(self._handle, self._data_ptr, DataParamEnum.MEMORY_ESTIMATES, self._memory_estimates, length=1)
118
+
119
+ return self._memory_estimates
120
+
121
+ @property
122
+ @utils.precondition(_check_valid_solver_wrapper)
123
+ def col_permutation(self):
124
+ """
125
+ Query the column permutation after planning (reordering). See the
126
+ `cuDSS documentation
127
+ <https://docs.nvidia.com/cuda/cudss/types.html#cudssdataparam-t>`_
128
+ for more information.
129
+ """
130
+ if self._batched:
131
+ raise RuntimeError("Column permutation is not available for batched systems.")
132
+
133
+ if self._perm_reorder_col is None:
134
+ self._perm_reorder_col = np.empty((self._N,), dtype=self._index_type)
135
+
136
+ _get_attribute(self._handle, self._data_ptr, DataParamEnum.PERM_REORDER_COL, self._perm_reorder_col, length=self._N)
137
+
138
+ return self._perm_reorder_col
139
+
140
+ @property
141
+ @utils.precondition(_check_valid_solver_wrapper)
142
+ def row_permutation(self):
143
+ """
144
+ Query the row permutation after planning (reordering). See the
145
+ `cuDSS documentation
146
+ <https://docs.nvidia.com/cuda/cudss/types.html#cudssdataparam-t>`_
147
+ for more information.
148
+ """
149
+ if self._batched:
150
+ raise RuntimeError("Row permutation is not available for batched systems.")
151
+
152
+ if self._perm_reorder_row is None:
153
+ self._perm_reorder_row = np.empty((self._N,), dtype=self._index_type)
154
+
155
+ _get_attribute(self._handle, self._data_ptr, DataParamEnum.PERM_REORDER_ROW, self._perm_reorder_row, length=self._N)
156
+
157
+ return self._perm_reorder_row
158
+
159
+ @property
160
+ @utils.precondition(_check_valid_solver_wrapper)
161
+ def matching_col_permutation(self):
162
+ """
163
+ Query the matching (column) permutation after planning (reordering). See the
164
+ `cuDSS documentation
165
+ <https://docs.nvidia.com/cuda/cudss/types.html#cudssdataparam-t>`_
166
+ for more information.
167
+ """
168
+ if self._batched:
169
+ raise RuntimeError("Matching (column) permutation is not available for batched systems.")
170
+
171
+ if self._solver.plan_config.matching_algorithm == cudss.MatchingAlg.NONE:
172
+ # documented in https://github.com/NVIDIA/CUDALibrarySamples/blob/main/cuDSS/simple_get_set/simple_get_set.cpp#L269-L274 # noqa: E501, W505
173
+ raise RuntimeError("Matching (column) permutation is not available if matching is not enabled.")
174
+
175
+ if self._perm_matching is None:
176
+ self._perm_matching = np.empty((self._N,), dtype=self._index_type)
177
+
178
+ _get_attribute(self._handle, self._data_ptr, DataParamEnum.PERM_MATCHING, self._perm_matching, length=self._N)
179
+
180
+ return self._perm_matching
181
+
182
+ @property
183
+ @utils.precondition(_check_valid_solver_wrapper)
184
+ def num_superpanels(self):
185
+ """
186
+ Query the number of number of superpanels after planning (symbolic factorization).
187
+ See the `cuDSS documentation
188
+ <https://docs.nvidia.com/cuda/cudss/types.html#cudssdataparam-t>`_
189
+ for more information.
190
+ """
191
+ _get_attribute(self._handle, self._data_ptr, DataParamEnum.NSUPERPANELS, self._nsuperpanels)
192
+
193
+ return self._nsuperpanels.item()
194
+
195
+
196
+ class FactorizationInfo:
197
+ """
198
+ An interface to query information returned by
199
+ :meth:`nvmath.sparse.advanced.DirectSolver.factorize`.
200
+ """
201
+
202
+ def __init__(self, solver):
203
+ """
204
+ ctor for internal use only.
205
+ """
206
+ self._solver = solver
207
+ self._handle = self._solver.handle
208
+ self._data_ptr = self._solver.data_ptr
209
+ assert self._data_ptr is not None, "Internal error"
210
+
211
+ self._N = self._solver._N
212
+ self._batched = self._solver.batched
213
+ self._index_type = self._solver.index_type
214
+ self._value_type = self._solver.value_type
215
+
216
+ get_dtype = cudss.get_data_param_dtype
217
+
218
+ self._info = np.zeros((1,), dtype=get_dtype(DataParamEnum.INFO))
219
+ self._lu_nnz = np.zeros((1,), dtype=get_dtype(DataParamEnum.LU_NNZ))
220
+
221
+ # Allocate arrays that depend on the index or value type lazily.
222
+ self._npivots = None
223
+ self._inertia = None
224
+
225
+ # Allocate permutation and diagonal arrays lazily, and only if not batched.
226
+ self._perm_col = None
227
+ self._perm_row = None
228
+ self._diag = None
229
+
230
+ # Allocate matching row and col scale arrays lazily, and only if not batched.
231
+ self._scale_row = None
232
+ self._scale_col = None
233
+
234
+ def _check_valid_solver_wrapper(self, *args, **kwargs):
235
+ _check_valid_solver(self)
236
+
237
+ @property
238
+ @utils.precondition(_check_valid_solver_wrapper)
239
+ def info(self):
240
+ """
241
+ Query the error info after factorization. See the
242
+ `cuDSS documentation
243
+ <https://docs.nvidia.com/cuda/cudss/types.html#cudssdataparam-t>`_
244
+ for more information.
245
+ """
246
+ _get_attribute(self._handle, self._data_ptr, DataParamEnum.INFO, self._info)
247
+
248
+ return self._info.item()
249
+
250
+ @property
251
+ @utils.precondition(_check_valid_solver_wrapper)
252
+ def lu_nnz(self):
253
+ """
254
+ Query the number of non-zeros in the LU factorization. See the
255
+ `cuDSS documentation
256
+ <https://docs.nvidia.com/cuda/cudss/types.html#cudssdataparam-t>`_
257
+ for more information.
258
+ """
259
+ _get_attribute(self._handle, self._data_ptr, DataParamEnum.LU_NNZ, self._lu_nnz)
260
+
261
+ return self._lu_nnz.item()
262
+
263
+ @property
264
+ @utils.precondition(_check_valid_solver_wrapper)
265
+ def npivots(self):
266
+ """
267
+ Query the number of pivots encountered in the LU factorization. See the
268
+ `cuDSS documentation
269
+ <https://docs.nvidia.com/cuda/cudss/types.html#cudssdataparam-t>`_
270
+ for more information.
271
+ """
272
+ if self._npivots is None:
273
+ self._npivots = np.empty((1,), dtype=self._index_type)
274
+
275
+ _get_attribute(self._handle, self._data_ptr, DataParamEnum.NPIVOTS, self._npivots)
276
+
277
+ return self._npivots.item()
278
+
279
+ @property
280
+ @utils.precondition(_check_valid_solver_wrapper)
281
+ def inertia(self):
282
+ """
283
+ Query the inertia (number of positive and negative pivots) encountered in the
284
+ LU factorization. See the
285
+ `cuDSS documentation
286
+ <https://docs.nvidia.com/cuda/cudss/types.html#cudssdataparam-t>`_
287
+ for more information.
288
+ """
289
+ if self._inertia is None:
290
+ self._inertia = np.empty((2,), dtype=self._index_type)
291
+
292
+ _get_attribute(self._handle, self._data_ptr, DataParamEnum.INERTIA, self._inertia, length=2)
293
+
294
+ return self._inertia
295
+
296
+ @property
297
+ @utils.precondition(_check_valid_solver_wrapper)
298
+ def col_permutation(self):
299
+ """
300
+ Query the column permutation after factorization. See the
301
+ `cuDSS documentation
302
+ <https://docs.nvidia.com/cuda/cudss/types.html#cudssdataparam-t>`_
303
+ for more information.
304
+ """
305
+ if self._batched:
306
+ raise RuntimeError("Column permutation is not available for batched systems.")
307
+
308
+ if self._perm_col is None:
309
+ self._perm_col = np.empty((self._N,), dtype=self._index_type)
310
+
311
+ _get_attribute(self._handle, self._data_ptr, DataParamEnum.PERM_COL, self._perm_col, length=self._N)
312
+
313
+ return self._perm_col
314
+
315
+ @property
316
+ @utils.precondition(_check_valid_solver_wrapper)
317
+ def row_permutation(self):
318
+ """
319
+ Query the row permutation after factorization. See the
320
+ `cuDSS documentation
321
+ <https://docs.nvidia.com/cuda/cudss/types.html#cudssdataparam-t>`_
322
+ for more information.
323
+ """
324
+ if self._batched:
325
+ raise RuntimeError("Row permutation is not available for batched systems.")
326
+
327
+ if self._perm_row is None:
328
+ self._perm_row = np.empty((self._N,), dtype=self._index_type)
329
+
330
+ _get_attribute(self._handle, self._data_ptr, DataParamEnum.PERM_ROW, self._perm_row, length=self._N)
331
+
332
+ return self._perm_row
333
+
334
+ @property
335
+ @utils.precondition(_check_valid_solver_wrapper)
336
+ def diag(self):
337
+ """
338
+ Query the diagonal of the factorized system. See the
339
+ `cuDSS documentation
340
+ <https://docs.nvidia.com/cuda/cudss/types.html#cudssdataparam-t>`_
341
+ for more information.
342
+ """
343
+ if self._batched:
344
+ raise RuntimeError("The factorized system's diagonal is not available for batched systems.")
345
+
346
+ if self._diag is None:
347
+ self._diag = np.empty((self._N,), dtype=self._value_type)
348
+
349
+ _get_attribute(self._handle, self._data_ptr, DataParamEnum.DIAG, self._diag, length=self._N)
350
+
351
+ return self._diag
352
+
353
+ @property
354
+ @utils.precondition(_check_valid_solver_wrapper)
355
+ def row_scale_factors(self):
356
+ """
357
+ Query the scale factors for the rows of the factorized system, if matching was
358
+ used. See the `cuDSS documentation
359
+ <https://docs.nvidia.com/cuda/cudss/types.html#cudssdataparam-t>`_
360
+ for more information.
361
+ """
362
+ if self._batched:
363
+ raise RuntimeError("The factorized system's row scale factors is not available for batched systems.")
364
+
365
+ if self._solver.plan_config.matching_algorithm == cudss.MatchingAlg.NONE:
366
+ raise RuntimeError("Row scale factors is only available if matching is enabled.")
367
+
368
+ if self._scale_row is None:
369
+ vtype = self._value_type
370
+ dtype = complex_to_real_equivalent(vtype) if "complex" in vtype else vtype
371
+ self._scale_row = np.empty((self._N,), dtype=dtype)
372
+
373
+ _get_attribute(self._handle, self._data_ptr, DataParamEnum.SCALE_ROW, self._scale_row, length=self._N)
374
+
375
+ return self._scale_row
376
+
377
+ @property
378
+ @utils.precondition(_check_valid_solver_wrapper)
379
+ def col_scale_factors(self):
380
+ """
381
+ Query the scale factors for the columns of the factorized system, if matching was
382
+ used. See the `cuDSS documentation
383
+ <https://docs.nvidia.com/cuda/cudss/types.html#cudssdataparam-t>`_
384
+ for more information.
385
+ """
386
+ if self._batched:
387
+ raise RuntimeError("The factorized system's column scale factors is not available for batched systems.")
388
+
389
+ if self._solver.plan_config.matching_algorithm == cudss.MatchingAlg.NONE:
390
+ raise RuntimeError("Column scale factors is only available if matching is enabled.")
391
+
392
+ if self._scale_col is None:
393
+ vtype = self._value_type
394
+ dtype = complex_to_real_equivalent(vtype) if "complex" in vtype else vtype
395
+ self._scale_col = np.empty((self._N,), dtype=dtype)
396
+
397
+ _get_attribute(self._handle, self._data_ptr, DataParamEnum.SCALE_COL, self._scale_col, length=self._N)
398
+
399
+ return self._scale_col