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.
- nvmath/__init__.pxd +0 -0
- nvmath/__init__.py +45 -0
- nvmath/_internal/__init__.py +0 -0
- nvmath/_internal/attribute_ifc_factory.py +330 -0
- nvmath/_internal/layout.py +70 -0
- nvmath/_internal/templates.py +130 -0
- nvmath/_internal/threadsafe.py +106 -0
- nvmath/_internal/utils.py +43 -0
- nvmath/_internal/workspace.py +490 -0
- nvmath/_utils.py +147 -0
- nvmath/bindings/__init__.py +60 -0
- nvmath/bindings/_internal/__init__.pxd +0 -0
- nvmath/bindings/_internal/__init__.py +0 -0
- nvmath/bindings/_internal/common_types.pxd +31 -0
- nvmath/bindings/_internal/cublas.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/_internal/cublas.pxd +530 -0
- nvmath/bindings/_internal/cublasLt.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/_internal/cublasLt.pxd +59 -0
- nvmath/bindings/_internal/cublasMp.pxd +52 -0
- nvmath/bindings/_internal/cudss.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/_internal/cudss.pxd +54 -0
- nvmath/bindings/_internal/cufft.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/_internal/cufft.pxd +70 -0
- nvmath/bindings/_internal/cufftMp.pxd +77 -0
- nvmath/bindings/_internal/curand.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/_internal/curand.pxd +42 -0
- nvmath/bindings/_internal/cusolver.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/_internal/cusolver.pxd +15 -0
- nvmath/bindings/_internal/cusolverDn.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/_internal/cusolverDn.pxd +406 -0
- nvmath/bindings/_internal/cusolverMp.pxd +71 -0
- nvmath/bindings/_internal/cusolverSp.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/_internal/cusolverSp.pxd +75 -0
- nvmath/bindings/_internal/cusparse.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/_internal/cusparse.pxd +471 -0
- nvmath/bindings/_internal/cusparseLt.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/_internal/cusparseLt.pxd +48 -0
- nvmath/bindings/_internal/cutensor.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/_internal/cutensor.pxd +58 -0
- nvmath/bindings/_internal/mathdx.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/_internal/mathdx.pxd +116 -0
- nvmath/bindings/_internal/nvshmem.pxd +29 -0
- nvmath/bindings/_internal/utils.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/_internal/utils.pxd +174 -0
- nvmath/bindings/_internal/utils.pyi +10 -0
- nvmath/bindings/cublas.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cublas.pxd +558 -0
- nvmath/bindings/cublas.pyi +812 -0
- nvmath/bindings/cublasLt.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cublasLt.pxd +109 -0
- nvmath/bindings/cublasLt.pyi +1461 -0
- nvmath/bindings/cublasMp.pxd +85 -0
- nvmath/bindings/cublasMp.pyi +267 -0
- nvmath/bindings/cudss.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cudss.pxd +98 -0
- nvmath/bindings/cudss.pyi +443 -0
- nvmath/bindings/cufft.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cufft.pxd +118 -0
- nvmath/bindings/cufft.pyi +301 -0
- nvmath/bindings/cufftMp.pxd +124 -0
- nvmath/bindings/cufftMp.pyi +326 -0
- nvmath/bindings/curand.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/curand.pxd +71 -0
- nvmath/bindings/curand.pyi +189 -0
- nvmath/bindings/cusolver.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cusolver.pxd +62 -0
- nvmath/bindings/cusolver.pyi +320 -0
- nvmath/bindings/cusolverDn.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cusolverDn.pxd +430 -0
- nvmath/bindings/cusolverDn.pyi +422 -0
- nvmath/bindings/cusolverMp.pxd +98 -0
- nvmath/bindings/cusolverMp.pyi +114 -0
- nvmath/bindings/cusolverSp.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cusolverSp.pxd +95 -0
- nvmath/bindings/cusolverSp.pyi +70 -0
- nvmath/bindings/cusparse.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cusparse.pxd +546 -0
- nvmath/bindings/cusparse.pyi +1017 -0
- nvmath/bindings/cusparseLt.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cusparseLt.pxd +99 -0
- nvmath/bindings/cusparseLt.pyi +252 -0
- nvmath/bindings/cutensor.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cutensor.pxd +98 -0
- nvmath/bindings/cutensor.pyi +324 -0
- nvmath/bindings/cycublas.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cycublas.pxd +664 -0
- nvmath/bindings/cycublasLt.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cycublasLt.pxd +1045 -0
- nvmath/bindings/cycublasMp.pxd +171 -0
- nvmath/bindings/cycudss.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cycudss.pxd +277 -0
- nvmath/bindings/cycufft.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cycufft.pxd +333 -0
- nvmath/bindings/cycufftMp.pxd +342 -0
- nvmath/bindings/cycurand.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cycurand.pxd +141 -0
- nvmath/bindings/cycusolver.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cycusolver.pxd +137 -0
- nvmath/bindings/cycusolverDn.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cycusolverDn.pxd +443 -0
- nvmath/bindings/cycusolverMp.pxd +107 -0
- nvmath/bindings/cycusolverSp.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cycusolverSp.pxd +93 -0
- nvmath/bindings/cycusparse.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cycusparse.pxd +679 -0
- nvmath/bindings/cycusparseLt.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cycusparseLt.pxd +135 -0
- nvmath/bindings/cycutensor.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cycutensor.pxd +189 -0
- nvmath/bindings/cymathdx.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cymathdx.pxd +552 -0
- nvmath/bindings/cynvshmem.pxd +118 -0
- nvmath/bindings/mathdx.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/mathdx.pxd +182 -0
- nvmath/bindings/mathdx.pyi +1562 -0
- nvmath/bindings/nvpl/__init__.pxd +0 -0
- nvmath/bindings/nvpl/__init__.py +13 -0
- nvmath/bindings/nvpl/_internal/__init__.pxd +0 -0
- nvmath/bindings/nvpl/_internal/__init__.py +0 -0
- nvmath/bindings/nvpl/_internal/blas.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/nvpl/_internal/blas.pxd +237 -0
- nvmath/bindings/nvpl/_internal/fft.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/nvpl/_internal/fft.pxd +36 -0
- nvmath/bindings/nvpl/blas.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/nvpl/blas.pxd +131 -0
- nvmath/bindings/nvpl/blas.pyi +168 -0
- nvmath/bindings/nvpl/cyblas.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/nvpl/cyblas.pxd +280 -0
- nvmath/bindings/nvpl/cyfft.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/nvpl/cyfft.pxd +93 -0
- nvmath/bindings/nvpl/fft.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/nvpl/fft.pxd +100 -0
- nvmath/bindings/nvpl/fft.pyi +168 -0
- nvmath/bindings/nvshmem.pxd +54 -0
- nvmath/bindings/nvshmem.pyi +191 -0
- nvmath/device/__init__.py +38 -0
- nvmath/device/_deprecated.py +33 -0
- nvmath/device/common.py +315 -0
- nvmath/device/common_backend.py +131 -0
- nvmath/device/common_cuda.py +201 -0
- nvmath/device/common_numba.py +300 -0
- nvmath/device/common_numba_cuda_mlir.py +202 -0
- nvmath/device/common_opaque_tensor.py +201 -0
- nvmath/device/cublasdx.py +1606 -0
- nvmath/device/cublasdx_backend.py +860 -0
- nvmath/device/cublasdx_numba.py +1534 -0
- nvmath/device/cublasdx_numba_cuda_mlir.py +208 -0
- nvmath/device/cufftdx.py +373 -0
- nvmath/device/cufftdx_backend.py +220 -0
- nvmath/device/cufftdx_numba.py +140 -0
- nvmath/device/cufftdx_numba_cuda_mlir.py +79 -0
- nvmath/device/curand_kernel.py +9147 -0
- nvmath/device/cusolverdx.py +2708 -0
- nvmath/device/cusolverdx_backend.py +440 -0
- nvmath/device/cusolverdx_numba.py +567 -0
- nvmath/device/cusolverdx_numba_cuda_mlir.py +604 -0
- nvmath/device/cusolverdx_overload_backend.py +1029 -0
- nvmath/device/llvm_array.py +29 -0
- nvmath/device/random.py +441 -0
- nvmath/device/random_helpers.py +23 -0
- nvmath/device/random_states.py +187 -0
- nvmath/device/types.py +138 -0
- nvmath/device/vector_types_numba.py +259 -0
- nvmath/distributed/__init__.py +200 -0
- nvmath/distributed/_internal/__init__.py +0 -0
- nvmath/distributed/_internal/nccl.py +86 -0
- nvmath/distributed/_internal/nvshmem.py +307 -0
- nvmath/distributed/_internal/symmetric_memory.py +35 -0
- nvmath/distributed/_internal/tensor_ifc.py +70 -0
- nvmath/distributed/_internal/tensor_ifc_cupy.py +68 -0
- nvmath/distributed/_internal/tensor_ifc_host_device.py +172 -0
- nvmath/distributed/_internal/tensor_ifc_numpy.py +46 -0
- nvmath/distributed/_internal/tensor_ifc_torch.py +162 -0
- nvmath/distributed/_internal/tensor_wrapper.py +81 -0
- nvmath/distributed/_utils.py +167 -0
- nvmath/distributed/distribution/__init__.py +30 -0
- nvmath/distributed/distribution/_configuration.py +39 -0
- nvmath/distributed/distribution/distributions.py +1024 -0
- nvmath/distributed/distribution/redistribute.py +1284 -0
- nvmath/distributed/fft/__init__.py +7 -0
- nvmath/distributed/fft/_configuration.py +82 -0
- nvmath/distributed/fft/fft.py +2742 -0
- nvmath/distributed/linalg/__init__.py +22 -0
- nvmath/distributed/linalg/_internal/__init__.py +3 -0
- nvmath/distributed/linalg/_internal/epilog_protocol.py +586 -0
- nvmath/distributed/linalg/_internal/matmul_desc_ifc.py +28 -0
- nvmath/distributed/linalg/advanced/__init__.py +8 -0
- nvmath/distributed/linalg/advanced/_configuration.py +171 -0
- nvmath/distributed/linalg/advanced/matmulmod.py +3573 -0
- nvmath/distributed/linalg/generic/__init__.py +8 -0
- nvmath/distributed/linalg/generic/_caching.py +66 -0
- nvmath/distributed/linalg/generic/_configuration.py +61 -0
- nvmath/distributed/linalg/generic/_factorization.py +172 -0
- nvmath/distributed/linalg/generic/_initialization.py +966 -0
- nvmath/distributed/linalg/generic/_problem_spec.py +511 -0
- nvmath/distributed/linalg/generic/solvermod.py +1368 -0
- nvmath/distributed/process_group.py +408 -0
- nvmath/fft/__init__.py +7 -0
- nvmath/fft/_configuration.py +189 -0
- nvmath/fft/_exec_utils.py +82 -0
- nvmath/fft/_helpers.py +237 -0
- nvmath/fft/fft.py +3122 -0
- nvmath/internal/__init__.pxd +3 -0
- nvmath/internal/__init__.py +10 -0
- nvmath/internal/_bindings.cp314t-win_amd64.pyd +0 -0
- nvmath/internal/_bindings.pxd +18 -0
- nvmath/internal/_device_utils.py +45 -0
- nvmath/internal/_layout/__init__.pxd +3 -0
- nvmath/internal/_layout/__init__.py +7 -0
- nvmath/internal/_layout/_layout.cp314t-win_amd64.pyd +0 -0
- nvmath/internal/_layout/_layout.pxd +1303 -0
- nvmath/internal/_layout/_layout.pyi +1145 -0
- nvmath/internal/enum_utils.py +142 -0
- nvmath/internal/formatters.py +87 -0
- nvmath/internal/mem_limit.py +51 -0
- nvmath/internal/memory.cp314t-win_amd64.pyd +0 -0
- nvmath/internal/memory.pxd +13 -0
- nvmath/internal/memory.pyi +50 -0
- nvmath/internal/ndbuffer/__init__.pxd +3 -0
- nvmath/internal/ndbuffer/__init__.py +9 -0
- nvmath/internal/ndbuffer/_copy_kernel.cp314t-win_amd64.pyd +0 -0
- nvmath/internal/ndbuffer/_copy_kernel.pxd +10 -0
- nvmath/internal/ndbuffer/_jit.cp314t-win_amd64.pyd +0 -0
- nvmath/internal/ndbuffer/_jit.pxd +7 -0
- nvmath/internal/ndbuffer/_ndbuffer.cp314t-win_amd64.pyd +0 -0
- nvmath/internal/ndbuffer/_ndbuffer.pxd +40 -0
- nvmath/internal/ndbuffer/_ndbuffer.pyi +463 -0
- nvmath/internal/ndbuffer/copy_kernel/args.h +34 -0
- nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/array_view.h +52 -0
- nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/elementwise.h +68 -0
- nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/grid_indexer.h +69 -0
- nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/transposed.h +242 -0
- nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/type_utils.h +39 -0
- nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/utils.h +132 -0
- nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/vec.h +159 -0
- nvmath/internal/ndbuffer/copy_kernel/elementwise.h +53 -0
- nvmath/internal/ndbuffer/copy_kernel/transposed.h +58 -0
- nvmath/internal/package_ifc.py +168 -0
- nvmath/internal/package_ifc_cuda.py +57 -0
- nvmath/internal/package_ifc_cupy.py +67 -0
- nvmath/internal/package_ifc_torch.py +69 -0
- nvmath/internal/package_wrapper.py +14 -0
- nvmath/internal/tensor_ifc.py +179 -0
- nvmath/internal/tensor_ifc_cupy.py +234 -0
- nvmath/internal/tensor_ifc_ndbuffer.py +147 -0
- nvmath/internal/tensor_ifc_numpy.py +184 -0
- nvmath/internal/tensor_ifc_torch.py +178 -0
- nvmath/internal/tensor_wrapper.py +160 -0
- nvmath/internal/typemaps.py +113 -0
- nvmath/internal/utils.py +805 -0
- nvmath/linalg/__init__.py +56 -0
- nvmath/linalg/_internal/__init__.py +3 -0
- nvmath/linalg/_internal/algo_cap_ifc.py +82 -0
- nvmath/linalg/_internal/algo_config_ifc.py +43 -0
- nvmath/linalg/_internal/batch.py +234 -0
- nvmath/linalg/_internal/enum_to_tuples.py +64 -0
- nvmath/linalg/_internal/epilog_protocol.py +766 -0
- nvmath/linalg/_internal/layout.py +624 -0
- nvmath/linalg/_internal/matmul_desc_ifc.py +28 -0
- nvmath/linalg/_internal/matmul_pref_ifc.py +27 -0
- nvmath/linalg/_internal/matrix_layout_ifc.py +26 -0
- nvmath/linalg/_internal/solver_utils.py +432 -0
- nvmath/linalg/_internal/typemaps.py +144 -0
- nvmath/linalg/_internal/utils.py +157 -0
- nvmath/linalg/advanced/__init__.py +8 -0
- nvmath/linalg/advanced/_algorithmmod.py +170 -0
- nvmath/linalg/advanced/_configuration.py +351 -0
- nvmath/linalg/advanced/helpers/__init__.py +5 -0
- nvmath/linalg/advanced/helpers/matmul.py +1316 -0
- nvmath/linalg/advanced/matmulmod.py +3734 -0
- nvmath/linalg/generic/__init__.py +53 -0
- nvmath/linalg/generic/_configuration/__init__.py +39 -0
- nvmath/linalg/generic/_configuration/layout.py +263 -0
- nvmath/linalg/generic/_configuration/match.py +734 -0
- nvmath/linalg/generic/_configuration/qualifiers.py +493 -0
- nvmath/linalg/generic/_configuration/solver_configuration.py +59 -0
- nvmath/linalg/generic/_configuration/wrap.py +217 -0
- nvmath/linalg/generic/_dtype.py +15 -0
- nvmath/linalg/generic/matmulmod.py +2094 -0
- nvmath/linalg/generic/solvermod.py +1301 -0
- nvmath/memory.py +279 -0
- nvmath/sparse/__init__.py +38 -0
- nvmath/sparse/_internal/__init__.py +21 -0
- nvmath/sparse/_internal/common_utils.py +147 -0
- nvmath/sparse/_internal/cudss_config_ifc.py +702 -0
- nvmath/sparse/_internal/cudss_data_ifc.py +399 -0
- nvmath/sparse/_internal/cudss_utils.py +506 -0
- nvmath/sparse/_internal/cusparse_utils.py +382 -0
- nvmath/sparse/_internal/sparse_bsc_ifc.py +303 -0
- nvmath/sparse/_internal/sparse_bsr_ifc.py +305 -0
- nvmath/sparse/_internal/sparse_coo_ifc.py +256 -0
- nvmath/sparse/_internal/sparse_csc_ifc.py +268 -0
- nvmath/sparse/_internal/sparse_csr_ifc.py +288 -0
- nvmath/sparse/_internal/sparse_dia_ifc.py +242 -0
- nvmath/sparse/_internal/sparse_format_helpers.py +601 -0
- nvmath/sparse/_internal/sparse_tensor_ifc.py +133 -0
- nvmath/sparse/_internal/sparse_ust_ifc.py +141 -0
- nvmath/sparse/_internal/utils.py +56 -0
- nvmath/sparse/advanced/__init__.py +7 -0
- nvmath/sparse/advanced/_configuration.py +227 -0
- nvmath/sparse/advanced/direct_solver.py +2069 -0
- nvmath/sparse/generic/__init__.py +7 -0
- nvmath/sparse/generic/_configuration.py +129 -0
- nvmath/sparse/generic/_helpers.py +137 -0
- nvmath/sparse/generic/_thunks.py +21 -0
- nvmath/sparse/generic/matmulmod.py +2353 -0
- nvmath/sparse/ust/__init__.py +7 -0
- nvmath/sparse/ust/_converters.py +422 -0
- nvmath/sparse/ust/_cpp.py +28 -0
- nvmath/sparse/ust/_drawer.py +565 -0
- nvmath/sparse/ust/_emitter.py +1033 -0
- nvmath/sparse/ust/_jit.py +188 -0
- nvmath/sparse/ust/_kernel.py +282 -0
- nvmath/sparse/ust/_utils.py +149 -0
- nvmath/sparse/ust/interfaces/__init__.py +0 -0
- nvmath/sparse/ust/interfaces/torch_interface.py +476 -0
- nvmath/sparse/ust/tensor.py +1016 -0
- nvmath/sparse/ust/tensor_format.py +957 -0
- nvmath/tensor/__init__.py +6 -0
- nvmath/tensor/_configuration.py +120 -0
- nvmath/tensor/_internal/__init__.py +3 -0
- nvmath/tensor/_internal/cutensor_config_ifc.py +279 -0
- nvmath/tensor/_internal/cutensor_utils.py +230 -0
- nvmath/tensor/_internal/data.py +43 -0
- nvmath/tensor/_internal/einsum_parser.py +444 -0
- nvmath/tensor/_internal/typemaps.py +96 -0
- nvmath/tensor/contract.py +1900 -0
- nvmath_python-1.0.0.dist-info/METADATA +134 -0
- nvmath_python-1.0.0.dist-info/RECORD +332 -0
- nvmath_python-1.0.0.dist-info/WHEEL +5 -0
- nvmath_python-1.0.0.dist-info/licenses/LICENSE +177 -0
- 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
|