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,601 @@
1
+ # Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ """
6
+ Package-agnostic interface for key sparse tensor attributes.
7
+ """
8
+
9
+ __all__ = ["PACKAGE_HELPER_MAP", "CupySparseFormatHelper", "ScipySparseFormatHelper", "TorchSparseFormatHelper"]
10
+
11
+ import re
12
+ from abc import ABC, abstractmethod
13
+
14
+
15
+ class SparseFormatHelper(ABC):
16
+ @staticmethod
17
+ @abstractmethod
18
+ def sparse_format_name(tensor):
19
+ raise NotImplementedError
20
+
21
+ # Attribute name map: canonical name <> package name.
22
+ # One for each named sparse format type.
23
+ @staticmethod
24
+ @abstractmethod
25
+ def csr_attribute_names():
26
+ raise NotImplementedError
27
+
28
+ @staticmethod
29
+ @abstractmethod
30
+ def bsr_attribute_names():
31
+ raise NotImplementedError
32
+
33
+ @staticmethod
34
+ @abstractmethod
35
+ def csc_attribute_names():
36
+ raise NotImplementedError
37
+
38
+ @staticmethod
39
+ @abstractmethod
40
+ def coo_attribute_names():
41
+ raise NotImplementedError
42
+
43
+ @staticmethod
44
+ @abstractmethod
45
+ def dia_attribute_names():
46
+ raise NotImplementedError
47
+
48
+ # A ctor for each named sparse format type.
49
+ @staticmethod
50
+ @abstractmethod
51
+ def create_bsr(shape, block_size, crow_indices, col_indices, values):
52
+ raise NotImplementedError
53
+
54
+ @staticmethod
55
+ @abstractmethod
56
+ def create_bsc(shape, block_size, ccol_indices, row_indices, values):
57
+ raise NotImplementedError
58
+
59
+ @staticmethod
60
+ @abstractmethod
61
+ def create_csr(shape, crow_indices, col_indices, values):
62
+ raise NotImplementedError
63
+
64
+ @staticmethod
65
+ @abstractmethod
66
+ def create_csc(shape, ccol_indices, row_indices, values):
67
+ raise NotImplementedError
68
+
69
+ @staticmethod
70
+ @abstractmethod
71
+ def create_coo(shape, indices, values):
72
+ raise NotImplementedError
73
+
74
+ @staticmethod
75
+ @abstractmethod
76
+ def create_dia(shape, offsets, values):
77
+ raise NotImplementedError
78
+
79
+
80
+ class TorchSparseFormatHelper(SparseFormatHelper):
81
+ @staticmethod
82
+ def sparse_format_name(tensor):
83
+ name = re.sub(r"^torch\.sparse_", "", str(tensor.layout)).upper()
84
+ return name
85
+
86
+ @staticmethod
87
+ def csr_attribute_names():
88
+ return {
89
+ # General sparse attributes.
90
+ "sparse_format_helper": TorchSparseFormatHelper,
91
+ "num_sparse_dim": lambda a: a.sparse_dim(),
92
+ "num_dense_dim": lambda a: a.dense_dim(),
93
+ # Format-specific attributes.
94
+ "crow_indices": lambda a: a.crow_indices(),
95
+ "col_indices": lambda a: a.col_indices(),
96
+ "values": lambda a: a.values(),
97
+ # Checker attributes.
98
+ "has_sorted_indices": lambda a: True,
99
+ "is_coalesced": lambda a: True,
100
+ }
101
+
102
+ @staticmethod
103
+ def bsr_attribute_names():
104
+ # TODO: improve the logic for block order/layout. Can the smallest block stride
105
+ # be greater than 1?
106
+ return {
107
+ # General sparse attributes.
108
+ "sparse_format_helper": TorchSparseFormatHelper,
109
+ "num_sparse_dim": lambda a: a.sparse_dim(),
110
+ "num_dense_dim": lambda a: a.dense_dim(),
111
+ # Format-specific attributes.
112
+ "block_size": lambda a: a.values().shape[-2:],
113
+ "block_order": lambda a: "right" if a.values().stride()[-1] == 1 else "left",
114
+ "crow_indices": lambda a: a.crow_indices(),
115
+ "col_indices": lambda a: a.col_indices(),
116
+ "values": lambda a: a.values(),
117
+ # Checker attributes.
118
+ "has_sorted_indices": lambda a: True,
119
+ "is_coalesced": lambda a: True,
120
+ }
121
+
122
+ @staticmethod
123
+ def bsc_attribute_names():
124
+ # TODO: improve the logic for block order/layout. Can the smallest block stride
125
+ # be greater than 1?
126
+ return {
127
+ # General sparse attributes.
128
+ "sparse_format_helper": TorchSparseFormatHelper,
129
+ "num_sparse_dim": lambda a: a.sparse_dim(),
130
+ "num_dense_dim": lambda a: a.dense_dim(),
131
+ # Format-specific attributes.
132
+ "block_size": lambda a: a.values().shape[-2:],
133
+ "block_order": lambda a: "right" if a.values().stride()[-1] == 1 else "left",
134
+ "ccol_indices": lambda a: a.ccol_indices(),
135
+ "row_indices": lambda a: a.row_indices(),
136
+ "values": lambda a: a.values(),
137
+ # Checker attributes.
138
+ "has_sorted_indices": lambda a: True,
139
+ "is_coalesced": lambda a: True,
140
+ }
141
+
142
+ @staticmethod
143
+ def csc_attribute_names():
144
+ return {
145
+ # General sparse attributes.
146
+ "sparse_format_helper": TorchSparseFormatHelper,
147
+ "num_sparse_dim": lambda a: a.sparse_dim(),
148
+ "num_dense_dim": lambda a: a.dense_dim(),
149
+ # Format-specific attributes.
150
+ "ccol_indices": lambda a: a.ccol_indices(),
151
+ "row_indices": lambda a: a.row_indices(),
152
+ "values": lambda a: a.values(),
153
+ # Checker attributes.
154
+ "has_sorted_indices": lambda a: True,
155
+ "is_coalesced": lambda a: True,
156
+ }
157
+
158
+ @staticmethod
159
+ def coo_attribute_names():
160
+ return {
161
+ # General sparse attributes.
162
+ "sparse_format_helper": TorchSparseFormatHelper,
163
+ "num_sparse_dim": lambda a: a.sparse_dim(),
164
+ "num_dense_dim": lambda a: a.dense_dim(),
165
+ # Format-specific attributes.
166
+ "indices": lambda a: [a.indices()[i] for i in range(len(a.shape) - a.dense_dim())],
167
+ "values": lambda a: a.values(),
168
+ # Checker attributes.
169
+ "is_coalesced": lambda a: a.is_coalesced(),
170
+ }
171
+
172
+ @staticmethod
173
+ def create_csr(shape, crow_indices, col_indices, values):
174
+ import torch
175
+
176
+ csr = torch.sparse_csr_tensor(crow_indices.tensor, col_indices.tensor, values.tensor, shape, device=values.device_id)
177
+
178
+ return csr
179
+
180
+ @staticmethod
181
+ def create_bsr(shape, block_size, crow_indices, col_indices, values):
182
+ import torch
183
+
184
+ bsr = torch.sparse_bsr_tensor(crow_indices.tensor, col_indices.tensor, values.tensor, shape)
185
+
186
+ return bsr
187
+
188
+ @staticmethod
189
+ def create_bsc(shape, block_size, ccol_indices, row_indices, values):
190
+ import torch
191
+
192
+ bsr = torch.sparse_bsc_tensor(ccol_indices.tensor, row_indices.tensor, values.tensor, shape)
193
+
194
+ return bsr
195
+
196
+ @staticmethod
197
+ def create_csc(shape, ccol_indices, row_indices, values):
198
+ import torch
199
+
200
+ csc = torch.sparse_csc_tensor(ccol_indices.tensor, row_indices.tensor, values.tensor, shape, device=values.device_id)
201
+
202
+ return csc
203
+
204
+ @staticmethod
205
+ def create_coo(shape, indices, values):
206
+ import torch
207
+
208
+ base = indices[0].tensor._base
209
+ # TODO: we should assert base exists and raise an error instead of stacking?
210
+ # if base is None:
211
+ # num_dimensions = len(shape)
212
+ # base = torch.stack([indices[d].tensor for d in range(num_dimensions))], axis=0)
213
+
214
+ coo = torch.sparse_coo_tensor(torch.as_tensor(base), torch.as_tensor(values.tensor), shape, is_coalesced=True)
215
+
216
+ return coo
217
+
218
+ @staticmethod
219
+ def create_dia(shape, offsets, values):
220
+ raise NotImplementedError
221
+
222
+
223
+ class CupySparseFormatHelper(SparseFormatHelper):
224
+ @staticmethod
225
+ def sparse_format_name(tensor):
226
+ name = re.sub(r"_(array|matrix)$", "", type(tensor).__name__).upper()
227
+ return name
228
+
229
+ @staticmethod
230
+ def csr_attribute_names():
231
+ return {
232
+ # General sparse attributes.
233
+ "sparse_format_helper": CupySparseFormatHelper,
234
+ "num_sparse_dim": lambda a: len(a.shape),
235
+ "num_dense_dim": lambda a: 0,
236
+ # Format-specific attributes.
237
+ "crow_indices": lambda a: a.indptr,
238
+ "col_indices": lambda a: a.indices,
239
+ "values": lambda a: a.data,
240
+ # Checker attributes.
241
+ "has_sorted_indices": lambda a: a.has_sorted_indices,
242
+ "is_coalesced": lambda a: a.has_canonical_format,
243
+ }
244
+
245
+ @staticmethod
246
+ def csc_attribute_names():
247
+ return {
248
+ # General sparse attributes.
249
+ "sparse_format_helper": CupySparseFormatHelper,
250
+ "num_sparse_dim": lambda a: len(a.shape),
251
+ "num_dense_dim": lambda a: 0,
252
+ # Format-specific attributes.
253
+ "ccol_indices": lambda a: a.indptr,
254
+ "row_indices": lambda a: a.indices,
255
+ "values": lambda a: a.data,
256
+ # Checker attributes.
257
+ "has_sorted_indices": lambda a: a.has_sorted_indices,
258
+ "is_coalesced": lambda a: a.has_canonical_format,
259
+ }
260
+
261
+ @staticmethod
262
+ def coo_attribute_names():
263
+ return {
264
+ # General sparse attributes.
265
+ "sparse_format_helper": CupySparseFormatHelper,
266
+ "num_sparse_dim": lambda a: len(a.shape),
267
+ "num_dense_dim": lambda a: 0,
268
+ # Format-specific attributes.
269
+ "indices": lambda a: [a.row, a.col],
270
+ "values": lambda a: a.data,
271
+ # Checker attributes.
272
+ "is_coalesced": lambda a: a.has_canonical_format,
273
+ }
274
+
275
+ @staticmethod
276
+ def dia_attribute_names():
277
+ return {
278
+ # General sparse attributes.
279
+ "sparse_format_helper": CupySparseFormatHelper,
280
+ "num_sparse_dim": lambda a: len(a.shape),
281
+ "num_dense_dim": lambda a: 0,
282
+ # Format-specific attributes.
283
+ "offsets": lambda a: a.offsets,
284
+ "values": lambda a: a.data,
285
+ }
286
+
287
+ @staticmethod
288
+ def create_csr(shape, crow_indices, col_indices, values):
289
+ assert len(shape) == 2, "Internal error."
290
+
291
+ import cupyx.scipy.sparse as sp
292
+
293
+ csr = sp.csr_matrix((values.tensor, col_indices.tensor, crow_indices.tensor), shape=shape, copy=False)
294
+
295
+ return csr
296
+
297
+ @staticmethod
298
+ def create_csc(shape, ccol_indices, row_indices, values):
299
+ assert len(shape) == 2, "Internal error."
300
+
301
+ import cupyx.scipy.sparse as sp
302
+
303
+ csc = sp.csc_matrix((values.tensor, row_indices.tensor, ccol_indices.tensor), shape=shape, copy=False)
304
+
305
+ return csc
306
+
307
+ @staticmethod
308
+ def create_coo(shape, indices, values):
309
+ assert len(shape) == 2, "Internal error."
310
+
311
+ import cupyx.scipy.sparse as sp
312
+
313
+ coo = sp.coo_matrix((values.tensor, (indices[0].tensor, indices[1].tensor)), shape=shape, copy=False)
314
+
315
+ return coo
316
+
317
+ @staticmethod
318
+ def create_dia(shape, offsets, values):
319
+ assert len(shape) == 2, "Internal error."
320
+
321
+ import cupyx.scipy.sparse as sp
322
+
323
+ dia = sp.dia_matrix((values.tensor, offsets.tensor), shape=shape, copy=False)
324
+
325
+ return dia
326
+
327
+
328
+ class ScipySparseFormatHelper(SparseFormatHelper):
329
+ @staticmethod
330
+ def sparse_format_name(tensor):
331
+ name = re.sub(r"_(array|matrix)$", "", type(tensor).__name__).upper()
332
+ return name
333
+
334
+ @staticmethod
335
+ def bsr_attribute_names():
336
+ # TODO: improve the logic for block order/layout. Can the smallest block stride
337
+ # be greater than 1?
338
+ return {
339
+ # General sparse attributes.
340
+ "sparse_format_helper": ScipySparseFormatHelper,
341
+ "num_sparse_dim": lambda a: len(a.shape),
342
+ "num_dense_dim": lambda a: 0,
343
+ # Format-specific attributes.
344
+ "block_size": lambda a: a.blocksize,
345
+ "block_order": lambda a: "right" if a.data.strides[-1] == a.data.itemsize else "left",
346
+ "crow_indices": lambda a: a.indptr,
347
+ "col_indices": lambda a: a.indices,
348
+ "values": lambda a: a.data,
349
+ # Checker attributes.
350
+ "has_sorted_indices": lambda a: a.has_sorted_indices,
351
+ "is_coalesced": lambda a: a.has_canonical_format,
352
+ }
353
+
354
+ @staticmethod
355
+ def csr_attribute_names():
356
+ return {
357
+ # General sparse attributes.
358
+ "sparse_format_helper": ScipySparseFormatHelper,
359
+ "num_sparse_dim": lambda a: len(a.shape),
360
+ "num_dense_dim": lambda a: 0,
361
+ # Format-specific attributes.
362
+ "crow_indices": lambda a: a.indptr,
363
+ "col_indices": lambda a: a.indices,
364
+ "values": lambda a: a.data,
365
+ # Checker attributes.
366
+ "has_sorted_indices": lambda a: a.has_sorted_indices,
367
+ "is_coalesced": lambda a: a.has_canonical_format,
368
+ }
369
+
370
+ @staticmethod
371
+ def csc_attribute_names():
372
+ return {
373
+ # General sparse attributes.
374
+ "sparse_format_helper": ScipySparseFormatHelper,
375
+ "num_sparse_dim": lambda a: len(a.shape),
376
+ "num_dense_dim": lambda a: 0,
377
+ # Format-specific attributes.
378
+ "ccol_indices": lambda a: a.indptr,
379
+ "row_indices": lambda a: a.indices,
380
+ "values": lambda a: a.data,
381
+ # Checker attributes.
382
+ "has_sorted_indices": lambda a: a.has_sorted_indices,
383
+ "is_coalesced": lambda a: a.has_canonical_format,
384
+ }
385
+
386
+ @staticmethod
387
+ def coo_attribute_names():
388
+ return {
389
+ # General sparse attributes.
390
+ "sparse_format_helper": ScipySparseFormatHelper,
391
+ "num_sparse_dim": lambda a: len(a.shape),
392
+ "num_dense_dim": lambda a: 0,
393
+ # Format-specific attributes.
394
+ "indices": lambda a: [a.row, a.col],
395
+ "values": lambda a: a.data,
396
+ # Checker attributes.
397
+ "is_coalesced": lambda a: a.has_canonical_format,
398
+ }
399
+
400
+ @staticmethod
401
+ def dia_attribute_names():
402
+ return {
403
+ # General sparse attributes.
404
+ "sparse_format_helper": ScipySparseFormatHelper,
405
+ "num_sparse_dim": lambda a: len(a.shape),
406
+ "num_dense_dim": lambda a: 0,
407
+ # Format-specific attributes.
408
+ "offsets": lambda a: a.offsets,
409
+ "values": lambda a: a.data,
410
+ }
411
+
412
+ @staticmethod
413
+ def create_csr(shape, crow_indices, col_indices, values):
414
+ assert len(shape) == 2, "Internal error."
415
+
416
+ import scipy.sparse as sp
417
+
418
+ csr = sp.csr_array((values.tensor, col_indices.tensor, crow_indices.tensor), shape=shape, copy=False)
419
+
420
+ return csr
421
+
422
+ @staticmethod
423
+ def create_bsr(shape, block_size, crow_indices, col_indices, values):
424
+ assert len(shape) == 2, "Internal error."
425
+
426
+ import scipy.sparse as sp
427
+
428
+ bsr = sp.bsr_array((values.tensor, col_indices.tensor, crow_indices.tensor), shape=shape, copy=False)
429
+
430
+ return bsr
431
+
432
+ @staticmethod
433
+ def create_csc(shape, ccol_indices, row_indices, values):
434
+ assert len(shape) == 2, "Internal error."
435
+
436
+ import scipy.sparse as sp
437
+
438
+ csc = sp.csc_array((values.tensor, row_indices.tensor, ccol_indices.tensor), shape=shape, copy=False)
439
+
440
+ return csc
441
+
442
+ @staticmethod
443
+ def create_coo(shape, indices, values):
444
+ assert len(shape) == 2, "Internal error."
445
+
446
+ import scipy.sparse as sp
447
+
448
+ coo = sp.coo_matrix((values.tensor, (indices[0].tensor, indices[1].tensor)), shape=shape, copy=False)
449
+
450
+ return coo
451
+
452
+ @staticmethod
453
+ def create_dia(shape, offsets, values):
454
+ assert len(shape) == 2, "Internal error."
455
+
456
+ import scipy.sparse as sp
457
+
458
+ dia = sp.dia_array((values.tensor, offsets.tensor), shape=shape, copy=False)
459
+
460
+ return dia
461
+
462
+
463
+ class USTFormatHelper(SparseFormatHelper):
464
+ """
465
+ CSR is really UST 3D BatchedCSR.
466
+ """
467
+
468
+ # TODO: add more formats for canonical names.
469
+ NAME_EXPRESSIONS = {
470
+ r"BSR(Left|Right)(d)?\d+x\d+": "BSR",
471
+ r"BSC(Left|Right)(d)?\d+x\d+": "BSC",
472
+ r"COO(\d+)?": "COO",
473
+ r"(Batched)?CSR(\d+)?": "CSR",
474
+ r"CSC(\d+)?": "CSC",
475
+ }
476
+
477
+ @staticmethod
478
+ def sparse_format_name(tensor):
479
+ name = tensor.tensor_format.name
480
+ # We need to get the canonical name for certain formats.
481
+ # TODO: Can we handle this in TensorFormat, or is there a better/more robust way?
482
+ for expr in USTFormatHelper.NAME_EXPRESSIONS:
483
+ if re.match(expr, name):
484
+ name = USTFormatHelper.NAME_EXPRESSIONS[expr]
485
+ return name
486
+
487
+ # TODO: check generalization for batched tensors.
488
+ @staticmethod
489
+ def csr_attribute_names():
490
+ return {
491
+ # General sparse attributes.
492
+ "sparse_format_helper": USTFormatHelper,
493
+ "num_sparse_dim": lambda a: 2,
494
+ "num_dense_dim": lambda a: 0,
495
+ # Format-specific attributes.
496
+ "crow_indices": lambda a: a._pos.get(a.tensor_format.num_dimensions - 1),
497
+ "col_indices": lambda a: a._crd.get(a.tensor_format.num_dimensions - 1),
498
+ "values": lambda a: a._val,
499
+ # Checker attributes.
500
+ "has_sorted_indices": lambda a: a.tensor_format.is_ordered,
501
+ "is_coalesced": lambda a: a.tensor_format.is_ordered and a.tensor_format.is_unique,
502
+ }
503
+
504
+ @staticmethod
505
+ def bsr_attribute_names():
506
+ return {
507
+ # General sparse attributes.
508
+ "sparse_format_helper": USTFormatHelper,
509
+ "num_sparse_dim": lambda a: 2,
510
+ "num_dense_dim": lambda a: 0,
511
+ # Format-specific attributes.
512
+ "block_size": lambda a: a.levels[-2:],
513
+ "block_order": lambda a: "right" if "Right" in a.tensor_format.name else "left",
514
+ "crow_indices": lambda a: a._pos.get(a.tensor_format.num_dimensions - 1),
515
+ "col_indices": lambda a: a._crd.get(a.tensor_format.num_dimensions - 1),
516
+ "values": lambda a: a._val,
517
+ # Checker attributes.
518
+ "has_sorted_indices": lambda a: a.tensor_format.is_ordered,
519
+ "is_coalesced": lambda a: a.tensor_format.is_ordered and a.tensor_format.is_unique,
520
+ }
521
+
522
+ @staticmethod
523
+ def csc_attribute_names():
524
+ return {
525
+ # General sparse attributes.
526
+ "sparse_format_helper": USTFormatHelper,
527
+ "num_sparse_dim": lambda a: 2,
528
+ "num_dense_dim": lambda a: 0,
529
+ # Format-specific attributes.
530
+ "ccol_indices": lambda a: a._pos.get(a.tensor_format.num_dimensions - 1),
531
+ "row_indices": lambda a: a._crd.get(a.tensor_format.num_dimensions - 1),
532
+ "values": lambda a: a._val,
533
+ # Checker attributes.
534
+ "has_sorted_indices": lambda a: a.tensor_format.is_ordered,
535
+ "is_coalesced": lambda a: a.tensor_format.is_ordered and a.tensor_format.is_unique,
536
+ }
537
+
538
+ @staticmethod
539
+ def bsc_attribute_names():
540
+ return {
541
+ # General sparse attributes.
542
+ "sparse_format_helper": USTFormatHelper,
543
+ "num_sparse_dim": lambda a: 2,
544
+ "num_dense_dim": lambda a: 0,
545
+ # Format-specific attributes.
546
+ "block_size": lambda a: a.levels[-2:],
547
+ "block_order": lambda a: "right" if "Right" in a.tensor_format.name else "left",
548
+ "ccol_indices": lambda a: a._pos.get(a.tensor_format.num_dimensions - 1),
549
+ "row_indices": lambda a: a._crd.get(a.tensor_format.num_dimensions - 1),
550
+ "values": lambda a: a._val,
551
+ # Checker attributes.
552
+ "has_sorted_indices": lambda a: a.tensor_format.is_ordered,
553
+ "is_coalesced": lambda a: a.tensor_format.is_ordered and a.tensor_format.is_unique,
554
+ }
555
+
556
+ @staticmethod
557
+ def coo_attribute_names():
558
+ return {
559
+ # General sparse attributes.
560
+ "sparse_format_helper": USTFormatHelper,
561
+ "num_sparse_dim": lambda a: 2,
562
+ "num_dense_dim": lambda a: 0,
563
+ # Format-specific attributes.
564
+ "indices": lambda a: [a._crd.get(i) for i in range(a.tensor_format.num_dimensions)],
565
+ "values": lambda a: a._val,
566
+ # Checker attributes.
567
+ "has_sorted_indices": lambda a: a.tensor_format.is_ordered,
568
+ "is_coalesced": lambda a: a.tensor_format.is_ordered and a.tensor_format.is_unique,
569
+ }
570
+
571
+ @staticmethod
572
+ def create_csr(shape, crow_indices, col_indices, values):
573
+ raise NotImplementedError
574
+
575
+ @staticmethod
576
+ def create_csc(shape, ccol_indices, row_indices, values):
577
+ raise NotImplementedError
578
+
579
+ @staticmethod
580
+ def create_bsr(shape, block_size, crow_indices, col_indices, values):
581
+ raise NotImplementedError
582
+
583
+ @staticmethod
584
+ def create_bsc(shape, block_size, ccol_indices, row_indices, values):
585
+ raise NotImplementedError
586
+
587
+ @staticmethod
588
+ def create_coo(shape, indices, values):
589
+ raise NotImplementedError
590
+
591
+ @staticmethod
592
+ def create_dia(shape, offsets, values):
593
+ raise NotImplementedError
594
+
595
+
596
+ PACKAGE_HELPER_MAP = {
597
+ "cupyx": CupySparseFormatHelper,
598
+ "scipy": ScipySparseFormatHelper,
599
+ "torch": TorchSparseFormatHelper,
600
+ "nvmath": USTFormatHelper,
601
+ }