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,494 @@
1
+ # Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ """
6
+ Matrix qualifier dataclasses for describing structured matrix types and their properties in
7
+ linear algebra operations. Provides qualifiers for general, symmetric, hermitian,
8
+ triangular, and diagonal matrices with associated metadata like fill modes, conjugate flags,
9
+ and BLAS function abbreviations.
10
+ """
11
+
12
+ import abc
13
+ import dataclasses
14
+ import typing
15
+
16
+ import numpy as np
17
+ import numpy.typing as npt
18
+
19
+ import nvmath.bindings.cublas as cublas
20
+ from nvmath._internal.templates import StatefulAPIOptions
21
+ from nvmath.internal import utils
22
+
23
+ FillMode: typing.TypeAlias = cublas.FillMode
24
+ DiagType: typing.TypeAlias = cublas.DiagType
25
+
26
+
27
+ @dataclasses.dataclass(frozen=True, slots=True, kw_only=True)
28
+ class MatmulOptions(StatefulAPIOptions):
29
+ """A dataclass for providing options to a :class:`Matmul` object.
30
+
31
+ Attributes:
32
+ allocator: An object that supports the :class:`BaseCUDAMemoryManager` protocol, used
33
+ to draw device memory. If an allocator is not provided, a memory allocator from
34
+ the library package will be used (:func:`torch.cuda.caching_allocator_alloc` for
35
+ PyTorch operands, :func:`cupy.cuda.alloc` otherwise).
36
+
37
+ blocking: A flag specifying the behavior of the stream-ordered functions and
38
+ methods. When ``blocking`` is `True`, the stream-ordered methods do not return
39
+ until the operation is complete. When ``blocking`` is ``"auto"``, the methods
40
+ return immediately when the inputs are on the GPU. The stream-ordered methods
41
+ always block when the operands are on the CPU to ensure that the user doesn't
42
+ inadvertently use the result before it becomes available. The default is
43
+ ``"auto"``.
44
+
45
+ inplace: Whether the matrix multiplication is performed in-place (operand C is
46
+ overwritten).
47
+
48
+ logger: Python Logger object. The root logger will be used if a
49
+ logger object is not provided.
50
+
51
+ .. seealso::
52
+ :class:`StatefulAPI`
53
+ """
54
+
55
+ inplace: bool = False
56
+
57
+
58
+ MM_QUALIFIERS_DOCUMENTATION = {
59
+ #
60
+ "abbreviation": """\
61
+ The two character abbreviation of the matrix qualifier.""".replace("\n", " "),
62
+ #
63
+ "conjugate": """\
64
+ Whether the matrix is conjugate.""".replace("\n", " "),
65
+ #
66
+ "uplo": """\
67
+ The :py:class:`~nvmath.bindings.cublas.FillMode` of the matrix. e.g. upper, lower...""".replace("\n", " "),
68
+ #
69
+ "diag": """\
70
+ The :py:class:`~nvmath.bindings.cublas.DiagType` of the matrix. e.g. unit, non-unit...""".replace("\n", " "),
71
+ #
72
+ "incx": """\
73
+ The direction to read the diagonal. +1 for forward; -1 for reverse.""".replace("\n", " "),
74
+ #
75
+ }
76
+
77
+
78
+ # We name this variable as foo_bar_dtype, so that the docstrings format correctly
79
+ # Docstrings for custom dtypes are defined in docs/sphinx/conf.py
80
+ matrix_qualifiers_dtype = np.dtype(
81
+ [
82
+ ("abbreviation", "U2"),
83
+ ("conjugate", np.bool_),
84
+ ("uplo", np.int_),
85
+ ("diag", np.int_),
86
+ ("incx", np.int_),
87
+ ]
88
+ )
89
+
90
+ """A NumPy array of type :class:`matrix_qualifiers_dtype`.
91
+
92
+ .. seealso::
93
+ :class:`GeneralMatrixQualifier`, :class:`HermitianMatrixQualifier`,
94
+ :class:`SymmetricMatrixQualifier`, :class:`TriangularMatrixQualifier`
95
+ :class:`DiagonalMatrixQualifier`, :class:`matrix_qualifiers_dtype`
96
+ """
97
+ MatrixQualifier: typing.TypeAlias = npt.NDArray
98
+
99
+
100
+ class MatrixQualifierConstructor(abc.ABC):
101
+ abbreviation: typing.ClassVar[str]
102
+
103
+ def __init__(self):
104
+ msg = f"The {self.__class__.__name__} constructor should not be called. Use {self.__class__.__name__}.create() instead."
105
+ raise RuntimeError(msg)
106
+
107
+ @classmethod
108
+ def create(
109
+ cls,
110
+ conjugate: bool = False,
111
+ uplo: FillMode = FillMode.FULL,
112
+ diag: DiagType = DiagType.NON_UNIT,
113
+ incx: typing.Literal[-1, 1, 0] = 0,
114
+ ):
115
+ return np.array((cls.abbreviation, conjugate, uplo, diag, incx), dtype=matrix_qualifiers_dtype)
116
+
117
+ @classmethod
118
+ def is_valid(cls, other: MatrixQualifier) -> np.bool_:
119
+ """Return ``True`` if all elements of `other` are valid examples of the
120
+ :class:`matrix_qualifiers_dtype` constructed by this class."""
121
+ return np.all(other["abbreviation"] == cls.abbreviation) and np.bool_(
122
+ all(
123
+ n in other.dtype.names # type: ignore[operator]
124
+ for n in ("conjugate",)
125
+ )
126
+ )
127
+
128
+ @classmethod
129
+ def to_string(cls, other: MatrixQualifier) -> str:
130
+ """Return a pretty string representation of `other`."""
131
+ return (
132
+ f"({other['abbreviation']}, conjugate={other['conjugate']}, "
133
+ f"uplo={FillMode(other['uplo']).name}, "
134
+ f"diag={DiagType(other['diag']).name}, incx={other['incx']})"
135
+ )
136
+
137
+
138
+ @utils.docstring_decorator(MM_QUALIFIERS_DOCUMENTATION, skip_missing=False)
139
+ class GeneralMatrixQualifier(MatrixQualifierConstructor):
140
+ """A class which constructs and validates :class:`matrix_qualifiers_dtype` for a general
141
+ rectangular matrix.
142
+
143
+ Examples:
144
+
145
+ >>> import numpy as np
146
+ >>> from nvmath.linalg import GeneralMatrixQualifier, matrix_qualifiers_dtype
147
+
148
+ Create a general matrix qualifier:
149
+
150
+ >>> GeneralMatrixQualifier.create() # doctest: +ELLIPSIS
151
+ array(('ge', False, 2, 0, 0),
152
+ dtype=[('abbreviation', '<U2'), ('conjugate', '?'), ...
153
+
154
+ Create a conjugate general matrix qualifier:
155
+
156
+ >>> GeneralMatrixQualifier.create(conjugate=True) # doctest: +ELLIPSIS
157
+ array(('ge', True, 2, 0, 0),
158
+ dtype=[('abbreviation', '<U2'), ('conjugate', '?'), ...
159
+
160
+ Create an array of general matrix qualifiers:
161
+
162
+ >>> np.full(
163
+ ... 2, GeneralMatrixQualifier.create(), dtype=matrix_qualifiers_dtype
164
+ ... ) # doctest: +ELLIPSIS
165
+ array([('ge', False, 2, 0, 0), ('ge', False, 2, 0, 0)],
166
+ dtype=[('abbreviation', '<U2'), ('conjugate', '?'), ...
167
+
168
+ .. seealso::
169
+ :class:`GeneralMatrixQualifier`, :class:`HermitianMatrixQualifier`,
170
+ :class:`SymmetricMatrixQualifier`, :class:`TriangularMatrixQualifier`
171
+ :class:`DiagonalMatrixQualifier`, :class:`matrix_qualifiers_dtype`
172
+ """
173
+
174
+ abbreviation: typing.ClassVar[str] = "ge"
175
+
176
+ @classmethod
177
+ def create( # type: ignore[override]
178
+ cls,
179
+ conjugate: bool = False,
180
+ ):
181
+ """Return a :class:`np.ndarray` of type :class:`matrix_qualifiers_dtype` whose
182
+ element describes a general matrix.
183
+
184
+ Args:
185
+ conjugate: {conjugate}
186
+
187
+ """
188
+ return super().create(conjugate=conjugate)
189
+
190
+
191
+ @utils.docstring_decorator(MM_QUALIFIERS_DOCUMENTATION, skip_missing=False)
192
+ class DiagonalMatrixQualifier(MatrixQualifierConstructor):
193
+ """A class which constructs and validates :class:`matrix_qualifiers_dtype` for a
194
+ diagonal matrix.
195
+
196
+ Examples:
197
+
198
+ >>> import numpy as np
199
+ >>> from nvmath.linalg import (
200
+ ... DiagonalMatrixQualifier,
201
+ ... GeneralMatrixQualifier,
202
+ ... matrix_qualifiers_dtype,
203
+ ... )
204
+
205
+ Create a diagonal matrix qualifier:
206
+
207
+ >>> DiagonalMatrixQualifier.create() # doctest: +ELLIPSIS
208
+ array(('dg', False, 2, 0, 1),
209
+ dtype=[('abbreviation', '<U2'), ('conjugate', '?'), ...
210
+
211
+ Create a conjugate diagonal matrix qualifier:
212
+
213
+ >>> DiagonalMatrixQualifier.create(conjugate=True) # doctest: +ELLIPSIS
214
+ array(('dg', True, 2, 0, 1),
215
+ dtype=[('abbreviation', '<U2'), ('conjugate', '?'), ...
216
+
217
+ Create an array of matrix qualifiers with one general and one diagonal matrix:
218
+
219
+ >>> qualifiers = np.full(
220
+ ... 2,
221
+ ... GeneralMatrixQualifier.create(),
222
+ ... dtype=matrix_qualifiers_dtype,
223
+ ... )
224
+ >>> qualifiers[1] = DiagonalMatrixQualifier.create()
225
+ >>> qualifiers # doctest: +ELLIPSIS
226
+ array([('ge', False, 2, 0, 0), ('dg', False, 2, 0, 1)],
227
+ dtype=[('abbreviation', '<U2'), ('conjugate', '?'), ...
228
+
229
+ .. seealso::
230
+ :class:`GeneralMatrixQualifier`, :class:`HermitianMatrixQualifier`,
231
+ :class:`SymmetricMatrixQualifier`, :class:`TriangularMatrixQualifier`
232
+ :class:`DiagonalMatrixQualifier`, :class:`matrix_qualifiers_dtype`
233
+ """
234
+
235
+ abbreviation: typing.ClassVar[str] = "dg"
236
+
237
+ @classmethod
238
+ def create( # type: ignore[override]
239
+ cls,
240
+ conjugate: bool = False,
241
+ incx: typing.Literal[-1, 1] = 1,
242
+ ):
243
+ """Return a :class:`np.ndarray` of type :class:`matrix_qualifiers_dtype` whose
244
+ element describes a diagonal matrix.
245
+
246
+ Args:
247
+ conjugate: {conjugate}
248
+
249
+ incx: {incx}
250
+ """
251
+ if incx not in (-1, 1):
252
+ raise ValueError(f"The 'incx' parameter must be '-1' or '1' not {incx}")
253
+ return super().create(conjugate, incx=incx)
254
+
255
+ @classmethod
256
+ def is_valid(cls, other):
257
+ return super().is_valid(other) and np.all(np.logical_or(other["incx"] == -1, other["incx"] == 1))
258
+
259
+
260
+ @utils.docstring_decorator(MM_QUALIFIERS_DOCUMENTATION, skip_missing=False)
261
+ class SquareMatrixQualifier(MatrixQualifierConstructor, abc.ABC):
262
+ @classmethod
263
+ def create( # type: ignore[override]
264
+ cls,
265
+ conjugate: bool = False,
266
+ uplo: FillMode = FillMode.LOWER,
267
+ **kwargs,
268
+ ):
269
+ if uplo not in (FillMode.UPPER, FillMode.LOWER):
270
+ raise ValueError(f"The 'uplo' parameter must be 'UPPER' or 'LOWER', not {uplo}.")
271
+ return super().create(conjugate, uplo=uplo, **kwargs)
272
+
273
+ @classmethod
274
+ def is_valid(cls, other):
275
+ return super().is_valid(other) and np.all(
276
+ np.logical_or(other["uplo"] == FillMode.UPPER, other["uplo"] == FillMode.LOWER)
277
+ )
278
+
279
+
280
+ @utils.docstring_decorator(MM_QUALIFIERS_DOCUMENTATION, skip_missing=False)
281
+ class HermitianMatrixQualifier(SquareMatrixQualifier):
282
+ """A class which constructs and validates :class:`matrix_qualifiers_dtype` for a
283
+ hermitian matrix.
284
+
285
+ Examples:
286
+
287
+ >>> import numpy as np
288
+ >>> from nvmath.linalg import (
289
+ ... HermitianMatrixQualifier,
290
+ ... GeneralMatrixQualifier,
291
+ ... matrix_qualifiers_dtype,
292
+ ... )
293
+
294
+ Create a hermitian matrix qualifier:
295
+
296
+ >>> HermitianMatrixQualifier.create() # doctest: +ELLIPSIS
297
+ array(('he', False, 0, 0, 0),
298
+ dtype=[('abbreviation', '<U2'), ('conjugate', '?'), ...
299
+
300
+ Create a conjugate hermitian matrix qualifier:
301
+
302
+ >>> HermitianMatrixQualifier.create(conjugate=True) # doctest: +ELLIPSIS
303
+ array(('he', True, 0, 0, 0),
304
+ dtype=[('abbreviation', '<U2'), ('conjugate', '?'), ...
305
+
306
+ Create an array of matrix qualifiers with one general and one hermitian matrix:
307
+
308
+ >>> qualifiers = np.full(
309
+ ... 2,
310
+ ... GeneralMatrixQualifier.create(),
311
+ ... dtype=matrix_qualifiers_dtype,
312
+ ... )
313
+ >>> qualifiers[1] = HermitianMatrixQualifier.create()
314
+ >>> qualifiers # doctest: +ELLIPSIS
315
+ array([('ge', False, 2, 0, 0), ('he', False, 0, 0, 0)],
316
+ dtype=[('abbreviation', '<U2'), ('conjugate', '?'), ...
317
+
318
+ .. seealso::
319
+ :class:`GeneralMatrixQualifier`, :class:`HermitianMatrixQualifier`,
320
+ :class:`SymmetricMatrixQualifier`, :class:`TriangularMatrixQualifier`
321
+ :class:`DiagonalMatrixQualifier`, :class:`matrix_qualifiers_dtype`
322
+ """
323
+
324
+ abbreviation: typing.ClassVar[str] = "he"
325
+
326
+ @classmethod
327
+ def create( # type: ignore[override]
328
+ cls,
329
+ conjugate: bool = False,
330
+ uplo: FillMode = FillMode.LOWER,
331
+ ):
332
+ """Return a :class:`np.ndarray` of type :class:`matrix_qualifiers_dtype` whose
333
+ element describes a hermitian matrix.
334
+
335
+ Args:
336
+ conjugate: {conjugate}
337
+
338
+ uplo: {uplo}
339
+ """
340
+ return super().create(conjugate, uplo)
341
+
342
+
343
+ @utils.docstring_decorator(MM_QUALIFIERS_DOCUMENTATION, skip_missing=False)
344
+ class SymmetricMatrixQualifier(SquareMatrixQualifier):
345
+ """A class which constructs and validates :class:`matrix_qualifiers_dtype` for a
346
+ symmetric matrix.
347
+
348
+ Examples:
349
+
350
+ >>> import numpy as np
351
+ >>> from nvmath.linalg import (
352
+ ... SymmetricMatrixQualifier,
353
+ ... GeneralMatrixQualifier,
354
+ ... matrix_qualifiers_dtype,
355
+ ... )
356
+
357
+ Create a symmetric matrix qualifier:
358
+
359
+ >>> SymmetricMatrixQualifier.create() # doctest: +ELLIPSIS
360
+ array(('sy', False, 0, 0, 0),
361
+ dtype=[('abbreviation', '<U2'), ('conjugate', '?'), ...
362
+
363
+ Create a conjugate symmetric matrix qualifier:
364
+
365
+ >>> SymmetricMatrixQualifier.create(conjugate=True) # doctest: +ELLIPSIS
366
+ array(('sy', True, 0, 0, 0),
367
+ dtype=[('abbreviation', '<U2'), ('conjugate', '?'), ...
368
+
369
+ Create an array of matrix qualifiers with one general and one symmetric matrix:
370
+
371
+ >>> qualifiers = np.full(
372
+ ... 2,
373
+ ... GeneralMatrixQualifier.create(),
374
+ ... dtype=matrix_qualifiers_dtype,
375
+ ... )
376
+ >>> qualifiers[1] = SymmetricMatrixQualifier.create()
377
+ >>> qualifiers # doctest: +ELLIPSIS
378
+ array([('ge', False, 2, 0, 0), ('sy', False, 0, 0, 0)],
379
+ dtype=[('abbreviation', '<U2'), ('conjugate', '?'), ...
380
+
381
+ .. seealso::
382
+ :class:`GeneralMatrixQualifier`, :class:`HermitianMatrixQualifier`,
383
+ :class:`SymmetricMatrixQualifier`, :class:`TriangularMatrixQualifier`
384
+ :class:`DiagonalMatrixQualifier`, :class:`matrix_qualifiers_dtype`
385
+ """
386
+
387
+ abbreviation: typing.ClassVar[str] = "sy"
388
+
389
+ @classmethod
390
+ def create( # type: ignore[override]
391
+ cls,
392
+ conjugate: bool = False,
393
+ uplo: FillMode = FillMode.LOWER,
394
+ ):
395
+ """Return a :class:`np.ndarray` of type :class:`matrix_qualifiers_dtype` whose
396
+ element describes a symmetric matrix.
397
+
398
+ Args:
399
+ conjugate: {conjugate}
400
+
401
+ uplo: {uplo}
402
+ """
403
+ return super().create(conjugate, uplo)
404
+
405
+
406
+ @utils.docstring_decorator(MM_QUALIFIERS_DOCUMENTATION, skip_missing=False)
407
+ class TriangularMatrixQualifier(SquareMatrixQualifier):
408
+ """A class which constructs and validates :class:`matrix_qualifiers_dtype` for a
409
+ triangular matrix.
410
+
411
+ Examples:
412
+
413
+ >>> import numpy as np
414
+ >>> from nvmath.linalg import (
415
+ ... TriangularMatrixQualifier,
416
+ ... GeneralMatrixQualifier,
417
+ ... matrix_qualifiers_dtype,
418
+ ... )
419
+
420
+ Create a triangular matrix qualifier:
421
+
422
+ >>> TriangularMatrixQualifier.create() # doctest: +ELLIPSIS
423
+ array(('tr', False, 0, 0, 0),
424
+ dtype=[('abbreviation', '<U2'), ('conjugate', '?'), ...
425
+
426
+ Create a conjugate triangular matrix qualifier:
427
+
428
+ >>> TriangularMatrixQualifier.create(conjugate=True) # doctest: +ELLIPSIS
429
+ array(('tr', True, 0, 0, 0),
430
+ dtype=[('abbreviation', '<U2'), ('conjugate', '?'), ...
431
+
432
+ Create an array of matrix qualifiers with one general and one triangular matrix:
433
+
434
+ >>> qualifiers = np.full(
435
+ ... 2,
436
+ ... GeneralMatrixQualifier.create(),
437
+ ... dtype=matrix_qualifiers_dtype,
438
+ ... )
439
+ >>> qualifiers[1] = TriangularMatrixQualifier.create()
440
+ >>> qualifiers # doctest: +ELLIPSIS
441
+ array([('ge', False, 2, 0, 0), ('tr', False, 0, 0, 0)],
442
+ dtype=[('abbreviation', '<U2'), ('conjugate', '?'), ...
443
+
444
+ .. seealso::
445
+ :class:`GeneralMatrixQualifier`, :class:`HermitianMatrixQualifier`,
446
+ :class:`SymmetricMatrixQualifier`, :class:`TriangularMatrixQualifier`
447
+ :class:`DiagonalMatrixQualifier`, :class:`matrix_qualifiers_dtype`
448
+ """
449
+
450
+ abbreviation: typing.ClassVar[str] = "tr"
451
+
452
+ @classmethod
453
+ def create( # type: ignore[override]
454
+ cls,
455
+ conjugate: bool = False,
456
+ uplo: FillMode = FillMode.LOWER,
457
+ diag: DiagType = DiagType.NON_UNIT,
458
+ ):
459
+ """Return a :class:`np.ndarray` of type :class:`matrix_qualifiers_dtype` whose
460
+ element describes a triangular matrix.
461
+
462
+ Args:
463
+ conjugate: {conjugate}
464
+
465
+ uplo: {uplo}
466
+
467
+ diag: {diag}
468
+ """
469
+ if diag not in (DiagType.UNIT, DiagType.NON_UNIT):
470
+ raise ValueError(f"The 'diag' parameter must be 'UNIT' or 'NON_UNIT', not {diag}.")
471
+ return super().create(conjugate, diag=diag, uplo=uplo)
472
+
473
+ @classmethod
474
+ def is_valid(cls, other):
475
+ return super().is_valid(other) and np.all(
476
+ np.logical_or(other["diag"] == DiagType.UNIT, other["diag"] == DiagType.NON_UNIT)
477
+ )
478
+
479
+
480
+ def vector_to_square(
481
+ shape: typing.Sequence[int], strides: typing.Sequence[int], qualifier: MatrixQualifier
482
+ ) -> tuple[typing.Sequence[int], typing.Sequence[int]]:
483
+ """If `qualifier` is a DiagonalMatrixQualifier, convert `shape` and `stride` from a
484
+ vector to the equivalent square matrix."""
485
+ if DiagonalMatrixQualifier.is_valid(qualifier):
486
+ if len(shape) != 1:
487
+ msg = f"The shape of a diagonal matrix must be 1D; not {shape}."
488
+ raise ValueError(msg)
489
+ shape = tuple(shape) * 2
490
+ if len(strides) != 1:
491
+ msg = f"The strides of a diagonal matrix must be 1D; not {strides}."
492
+ raise ValueError(msg)
493
+ strides = (0, *strides)
494
+ return shape, strides