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,133 @@
|
|
|
1
|
+
# Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
"""
|
|
6
|
+
Interface to seamlessly use sparse tensors from different libraries.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations # allows typehint of class methods to return the self class
|
|
10
|
+
|
|
11
|
+
__all__ = ["SparseTensorHolder"]
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
from abc import ABC, abstractmethod
|
|
15
|
+
from typing import Literal
|
|
16
|
+
|
|
17
|
+
from nvmath.internal.package_ifc import StreamHolder
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class SparseTensorHolder(ABC):
|
|
21
|
+
"""
|
|
22
|
+
A simple base type for attributes common to *all* sparse formats.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
@classmethod
|
|
26
|
+
@abstractmethod
|
|
27
|
+
def create_from_tensor(cls, tensor, attr_name_map):
|
|
28
|
+
raise NotImplementedError
|
|
29
|
+
|
|
30
|
+
@property
|
|
31
|
+
@abstractmethod
|
|
32
|
+
def attr_name_map(self):
|
|
33
|
+
raise NotImplementedError
|
|
34
|
+
|
|
35
|
+
@property
|
|
36
|
+
@abstractmethod
|
|
37
|
+
def device(self):
|
|
38
|
+
raise NotImplementedError
|
|
39
|
+
|
|
40
|
+
@property
|
|
41
|
+
@abstractmethod
|
|
42
|
+
def device_id(self):
|
|
43
|
+
raise NotImplementedError
|
|
44
|
+
|
|
45
|
+
@property
|
|
46
|
+
@abstractmethod
|
|
47
|
+
def dtype(self):
|
|
48
|
+
raise NotImplementedError
|
|
49
|
+
|
|
50
|
+
@property
|
|
51
|
+
@abstractmethod
|
|
52
|
+
def index_type(self):
|
|
53
|
+
raise NotImplementedError
|
|
54
|
+
|
|
55
|
+
@property
|
|
56
|
+
@abstractmethod
|
|
57
|
+
def format_name(self) -> str:
|
|
58
|
+
raise NotImplementedError
|
|
59
|
+
|
|
60
|
+
@property
|
|
61
|
+
@abstractmethod
|
|
62
|
+
def num_dimensions(self):
|
|
63
|
+
raise NotImplementedError
|
|
64
|
+
|
|
65
|
+
@property
|
|
66
|
+
@abstractmethod
|
|
67
|
+
def shape(self):
|
|
68
|
+
raise NotImplementedError
|
|
69
|
+
|
|
70
|
+
@property
|
|
71
|
+
@abstractmethod
|
|
72
|
+
def values(self):
|
|
73
|
+
raise NotImplementedError
|
|
74
|
+
|
|
75
|
+
@property
|
|
76
|
+
def dense_tensorholder_type(self):
|
|
77
|
+
"""The tensor holder type for the dense constituent tensors."""
|
|
78
|
+
return self._dense_tensorholder_type
|
|
79
|
+
|
|
80
|
+
@abstractmethod
|
|
81
|
+
def to(self, device_id: int | Literal["cpu"], stream_holder: StreamHolder | None):
|
|
82
|
+
"""Copy the SparseTensor representation to a different device.
|
|
83
|
+
|
|
84
|
+
No copy is performed if the SparseTensor is already on the requested device.
|
|
85
|
+
"""
|
|
86
|
+
# This path is suitable only if `self.tensor` is a ust.Tensor instance.
|
|
87
|
+
# (Note, this can be the case for any known, named format holders, because
|
|
88
|
+
# user can wrap external sparse tensor into ust.Tensor that is then
|
|
89
|
+
# wrapped into SparseTensorHolder).
|
|
90
|
+
# Here, we ensure that the resulting copy also has a proper .tensor : ust.Tensor
|
|
91
|
+
# instance not just dense constituent tensors (extracted via attr_name_map)
|
|
92
|
+
# from the original tensor. Matmulmod impl relies on .tensor to be present
|
|
93
|
+
# for ust operands.
|
|
94
|
+
# If self.tensor may not be a ust.Tensor instance, the subclass is responsible
|
|
95
|
+
# for overriding this method to provide specialized implementation.
|
|
96
|
+
tensor = self.tensor # type: ignore[attr-defined]
|
|
97
|
+
tensor = tensor._to(device_id=device_id, stream_holder=stream_holder)
|
|
98
|
+
return self.create_from_tensor(tensor, attr_name_map=self.attr_name_map)
|
|
99
|
+
|
|
100
|
+
@abstractmethod
|
|
101
|
+
def copy_(self, src: SparseTensorHolder, stream_holder: StreamHolder | None) -> None:
|
|
102
|
+
"""Overwrite the sparse tensor (in-place) with a copy of src."""
|
|
103
|
+
raise NotImplementedError
|
|
104
|
+
|
|
105
|
+
@abstractmethod
|
|
106
|
+
def to_ust(self, *, stream):
|
|
107
|
+
"""Create an UST from the named representation. This is a zero-copy operation."""
|
|
108
|
+
raise NotImplementedError
|
|
109
|
+
|
|
110
|
+
@abstractmethod
|
|
111
|
+
def to_package(self):
|
|
112
|
+
"""
|
|
113
|
+
This will create a sparse tensor for the original package from which this
|
|
114
|
+
interface was created.
|
|
115
|
+
"""
|
|
116
|
+
raise NotImplementedError
|
|
117
|
+
|
|
118
|
+
@abstractmethod
|
|
119
|
+
def release(self):
|
|
120
|
+
"""
|
|
121
|
+
This method will release the wrapped tensor and any format-specific data
|
|
122
|
+
by setting them to None.
|
|
123
|
+
"""
|
|
124
|
+
raise NotImplementedError
|
|
125
|
+
|
|
126
|
+
@abstractmethod
|
|
127
|
+
def reset_unchecked(self, tensor):
|
|
128
|
+
"""
|
|
129
|
+
This method will reset the wrapped tensor to the specified one, and update
|
|
130
|
+
any format-specific data accordingly. It assumes that all attributes
|
|
131
|
+
like the device, shape, etc are consistent between the existing and new tensor.
|
|
132
|
+
"""
|
|
133
|
+
raise NotImplementedError
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
"""
|
|
6
|
+
Interface to wrap an UST that encapsulates an uncommon or novel format.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations # allows typehint of class methods to return the self class
|
|
10
|
+
|
|
11
|
+
__all__ = ["USTensorHolder"]
|
|
12
|
+
|
|
13
|
+
from typing import Literal, TypeVar
|
|
14
|
+
|
|
15
|
+
from nvmath.internal.package_ifc import StreamHolder
|
|
16
|
+
from nvmath.internal.tensor_ifc import TensorHolder
|
|
17
|
+
|
|
18
|
+
from .sparse_tensor_ifc import SparseTensorHolder
|
|
19
|
+
|
|
20
|
+
"""
|
|
21
|
+
A generic wrapper type for a UST.
|
|
22
|
+
"""
|
|
23
|
+
USTensor = TypeVar("USTensor")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class USTensorHolder(SparseTensorHolder):
|
|
27
|
+
"""
|
|
28
|
+
A simple wrapper type for UST objects to enable them to be used in the same way as
|
|
29
|
+
the other abstractions like CSRTensorHolder etc.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
_format_name: str = "UST"
|
|
33
|
+
|
|
34
|
+
def __init__(self, tensor):
|
|
35
|
+
# tensor is the native tensor.
|
|
36
|
+
self.tensor = tensor
|
|
37
|
+
|
|
38
|
+
# The tensor holder type for the dense constituent tensors.
|
|
39
|
+
self._dense_tensorholder_type = tensor._dense_tensorholder_type
|
|
40
|
+
|
|
41
|
+
@classmethod
|
|
42
|
+
def create_from_tensor(cls, tensor, *, attr_name_map=None):
|
|
43
|
+
# TODO: check that tensor is UST.
|
|
44
|
+
return USTensorHolder(tensor=tensor)
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
def attr_name_map(self):
|
|
48
|
+
return {}
|
|
49
|
+
|
|
50
|
+
@property
|
|
51
|
+
def device(self):
|
|
52
|
+
return self.tensor.device
|
|
53
|
+
|
|
54
|
+
@property
|
|
55
|
+
def device_id(self):
|
|
56
|
+
return self.tensor.device_id
|
|
57
|
+
|
|
58
|
+
@property
|
|
59
|
+
def dtype(self):
|
|
60
|
+
return self.tensor.dtype
|
|
61
|
+
|
|
62
|
+
@property
|
|
63
|
+
def index_type(self):
|
|
64
|
+
return self.tensor.index_type
|
|
65
|
+
|
|
66
|
+
@property
|
|
67
|
+
def format_name(self) -> str:
|
|
68
|
+
return USTensorHolder._format_name
|
|
69
|
+
|
|
70
|
+
@property
|
|
71
|
+
def num_dimensions(self):
|
|
72
|
+
return self.tensor.num_dimensions
|
|
73
|
+
|
|
74
|
+
@property
|
|
75
|
+
def shape(self):
|
|
76
|
+
return self.tensor.shape
|
|
77
|
+
|
|
78
|
+
@property
|
|
79
|
+
def pos(self):
|
|
80
|
+
"""The LevelMap object wrapping the pos array."""
|
|
81
|
+
return self.tensor._pos
|
|
82
|
+
|
|
83
|
+
@property
|
|
84
|
+
def crd(self):
|
|
85
|
+
"""The LevelMap object wrapping the crd array."""
|
|
86
|
+
return self.tensor._crd
|
|
87
|
+
|
|
88
|
+
@property
|
|
89
|
+
def val(self) -> TensorHolder:
|
|
90
|
+
"""The TensorHolder object wrapping the val array."""
|
|
91
|
+
return self.tensor._val
|
|
92
|
+
|
|
93
|
+
@property
|
|
94
|
+
def values(self) -> TensorHolder:
|
|
95
|
+
"""The TensorHolder object wrapping the val array. We use the values
|
|
96
|
+
attribute name to get the NNZ etc."""
|
|
97
|
+
return self.tensor._val
|
|
98
|
+
|
|
99
|
+
def to(self, device_id: int | Literal["cpu"], stream_holder: StreamHolder | None):
|
|
100
|
+
"""Copy the UST representation to a different device.
|
|
101
|
+
|
|
102
|
+
No copy is performed if the UST is already on the requested device.
|
|
103
|
+
"""
|
|
104
|
+
|
|
105
|
+
target = self.tensor._to(device_id, stream_holder)
|
|
106
|
+
return USTensorHolder(target)
|
|
107
|
+
|
|
108
|
+
def copy_(self, src, stream_holder: StreamHolder | None) -> None:
|
|
109
|
+
"""Overwrite self.tensor (in-place) with a copy of src (USTensorHolder)."""
|
|
110
|
+
|
|
111
|
+
self.tensor.copy_(src.tensor, stream_holder)
|
|
112
|
+
|
|
113
|
+
def to_ust(self, *, stream):
|
|
114
|
+
return self.tensor
|
|
115
|
+
|
|
116
|
+
def to_package(self):
|
|
117
|
+
"""
|
|
118
|
+
This will create a sparse tensor for the original package from which this
|
|
119
|
+
interface was created.
|
|
120
|
+
"""
|
|
121
|
+
raise NotImplementedError
|
|
122
|
+
|
|
123
|
+
def release(self):
|
|
124
|
+
"""
|
|
125
|
+
This method will release the wrapped tensor and any format-specific data
|
|
126
|
+
by setting them to None.
|
|
127
|
+
"""
|
|
128
|
+
# The tensor reference.
|
|
129
|
+
self.tensor = None
|
|
130
|
+
|
|
131
|
+
def reset_unchecked(self, tensor):
|
|
132
|
+
"""
|
|
133
|
+
This method will reset the wrapped tensor to the specified one, and update
|
|
134
|
+
any format-specific data accordingly. It assumes that all attributes
|
|
135
|
+
like the device, shape, etc are consistent between the existing and new tensor.
|
|
136
|
+
|
|
137
|
+
Args:
|
|
138
|
+
tensor: The native tensor to wrap.
|
|
139
|
+
"""
|
|
140
|
+
# Update the tensor reference.
|
|
141
|
+
self.tensor = tensor
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
import sys
|
|
6
|
+
import typing
|
|
7
|
+
|
|
8
|
+
from nvmath.internal.tensor_wrapper import wrap_operand
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def synchronize_dense_tensor(wrapped_tensor, *, stream_ptr=None):
|
|
12
|
+
"""
|
|
13
|
+
This utility synchronizes the provided wrapped tensor for operations performed
|
|
14
|
+
on it in the stream specified by ``stream_ptr``.
|
|
15
|
+
|
|
16
|
+
The returned object is also a wrapped tensor.
|
|
17
|
+
"""
|
|
18
|
+
if stream_ptr is None or wrapped_tensor.device == "cpu":
|
|
19
|
+
return wrapped_tensor
|
|
20
|
+
|
|
21
|
+
package = sys.modules[wrapped_tensor.name]
|
|
22
|
+
capsule = wrapped_tensor.tensor.__dlpack__(stream=stream_ptr)
|
|
23
|
+
tensor = package.from_dlpack(capsule)
|
|
24
|
+
|
|
25
|
+
wrapped_tensor = wrap_operand(tensor)
|
|
26
|
+
return wrapped_tensor
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def axis_order_in_memory(strides):
|
|
30
|
+
"""
|
|
31
|
+
Compute the order in which the axes appear in memory.
|
|
32
|
+
"""
|
|
33
|
+
if len(strides) == 0:
|
|
34
|
+
return ()
|
|
35
|
+
|
|
36
|
+
_, axis_order = zip(*sorted(zip(strides, range(len(strides)), strict=True)), strict=True)
|
|
37
|
+
|
|
38
|
+
return axis_order
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def calculate_strides(shape: typing.Sequence[int], axis_order: typing.Sequence[int], min_stride: int = 1):
|
|
42
|
+
"""
|
|
43
|
+
Calculate the strides for the provided shape and axis order.
|
|
44
|
+
"""
|
|
45
|
+
assert len(axis_order) == len(shape), f"axis_order length ({len(axis_order)}) must equal shape length ({len(shape)})"
|
|
46
|
+
assert len(set(axis_order)) == len(axis_order), f"axis_order must not contain duplicates: {axis_order}"
|
|
47
|
+
assert set(axis_order) == set(range(len(shape))), f"axis_order must be permutation of range({len(shape)}): {axis_order}"
|
|
48
|
+
|
|
49
|
+
strides: list[None | int] = [None] * len(shape)
|
|
50
|
+
|
|
51
|
+
stride = min_stride
|
|
52
|
+
for axis in axis_order:
|
|
53
|
+
strides[axis] = stride
|
|
54
|
+
stride *= shape[axis]
|
|
55
|
+
|
|
56
|
+
return strides
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
from .._internal.cudss_data_ifc import memory_estimates_dtype # noqa: F401
|
|
6
|
+
from ._configuration import * # noqa: F403
|
|
7
|
+
from .direct_solver import * # noqa: F403
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
# Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
"DirectSolverOptions",
|
|
7
|
+
"DirectSolverMatrixType",
|
|
8
|
+
"DirectSolverMatrixViewType",
|
|
9
|
+
"ExecutionCUDA",
|
|
10
|
+
"ExecutionHybrid",
|
|
11
|
+
"HybridMemoryModeOptions",
|
|
12
|
+
"DirectSolverPlanPreferences",
|
|
13
|
+
"DirectSolverFactorizationPreferences",
|
|
14
|
+
"DirectSolverSolutionPreferences",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
from dataclasses import dataclass, field
|
|
19
|
+
from logging import Logger
|
|
20
|
+
from typing import ClassVar, Literal, TypeAlias
|
|
21
|
+
|
|
22
|
+
from nvmath._internal import templates
|
|
23
|
+
from nvmath.bindings import cudss
|
|
24
|
+
from nvmath.internal import mem_limit
|
|
25
|
+
|
|
26
|
+
DirectSolverMatrixType: TypeAlias = cudss.MatrixType
|
|
27
|
+
DirectSolverMatrixViewType: TypeAlias = cudss.MatrixViewType
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@dataclass
|
|
31
|
+
class HybridMemoryModeOptions:
|
|
32
|
+
"""
|
|
33
|
+
A data class for providing options related to the use of hybrid (CPU-GPU) memory to
|
|
34
|
+
those execution spaces that support it.
|
|
35
|
+
|
|
36
|
+
Attributes:
|
|
37
|
+
hybrid_memory_mode: If set to True, use CPU memory to store factors (default:
|
|
38
|
+
``False``). See :attr:`nvmath.bindings.cudss.ConfigParam.HYBRID_MODE`.
|
|
39
|
+
device_memory_limit: The maximum device memory available for execution. It can
|
|
40
|
+
be specified as a value (with optional suffix like K[iB], M[iB], G[iB]) or as a
|
|
41
|
+
percentage. The default is based on internal heuristics. See
|
|
42
|
+
:attr:`nvmath.bindings.cudss.ConfigParam.HYBRID_DEVICE_MEMORY_LIMIT`.
|
|
43
|
+
register_cuda_memory: Specify whether to register memory using
|
|
44
|
+
``cudaHostRegister()`` if hybrid memory mode is used. The default is
|
|
45
|
+
``True``. See
|
|
46
|
+
:attr:`nvmath.bindings.cudss.ConfigParam.USE_CUDA_REGISTER_MEMORY`.
|
|
47
|
+
|
|
48
|
+
.. seealso::
|
|
49
|
+
:class:`ExecutionHybrid`, :class:`DirectSolver`, :func:`direct_solver`.
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
hybrid_memory_mode: bool = False
|
|
53
|
+
hybrid_device_memory_limit: int | str | None = None # Internal heuristic.
|
|
54
|
+
register_cuda_memory: bool = True
|
|
55
|
+
|
|
56
|
+
def __post_init__(self):
|
|
57
|
+
if self.hybrid_device_memory_limit is not None:
|
|
58
|
+
mem_limit.check_memory_str(self.hybrid_device_memory_limit, "hybrid device memory limit")
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@dataclass(frozen=True, slots=True, kw_only=True)
|
|
62
|
+
class ExecutionCUDA(templates.ExecutionCUDA):
|
|
63
|
+
"""
|
|
64
|
+
A data class for providing GPU execution options to the :class:`DirectSolver`
|
|
65
|
+
object and the wrapper function :func:`direct_solver`.
|
|
66
|
+
|
|
67
|
+
Attributes:
|
|
68
|
+
device_id: CUDA device ordinal (only used if the operand resides on the CPU). The
|
|
69
|
+
default value is 0.
|
|
70
|
+
hybrid_memory_mode_options: Options controlling the use of hybrid (CPU-GPU) memory
|
|
71
|
+
as an object of type :class:`HybridMemoryModeOptions` or a `dict`.
|
|
72
|
+
|
|
73
|
+
.. seealso::
|
|
74
|
+
:class:`ExecutionHybrid`, :class:`HybridMemoryModeOptions`, :class:`DirectSolver`,
|
|
75
|
+
:func:`direct_solver`.
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
hybrid_memory_mode_options: object = field(default_factory=HybridMemoryModeOptions)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
@dataclass
|
|
82
|
+
class ExecutionHybrid:
|
|
83
|
+
"""
|
|
84
|
+
A data class for providing hybrid (CPU-GPU) execution options to the
|
|
85
|
+
:class:`DirectSolver` object and the wrapper function :func:`direct_solver`.
|
|
86
|
+
|
|
87
|
+
Attributes:
|
|
88
|
+
device_id: CUDA device ordinal (only used if the operand resides on the CPU). The
|
|
89
|
+
default value is 0.
|
|
90
|
+
num_threads: The number of CPU threads used to execute the plan.
|
|
91
|
+
If not specified, defaults to the number of CPU cores available to the process.
|
|
92
|
+
|
|
93
|
+
.. seealso::
|
|
94
|
+
:class:`ExecutionCUDA`, :class:`DirectSolver`, :func:`direct_solver`.
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
name: ClassVar[Literal["hybrid"]] = "hybrid"
|
|
98
|
+
device_id: int = 0
|
|
99
|
+
num_threads: int | None = None
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
@dataclass
|
|
103
|
+
class DirectSolverOptions:
|
|
104
|
+
"""
|
|
105
|
+
A data class for providing options to the :class:`DirectSolver` object and the wrapper
|
|
106
|
+
function :func:`direct_solver`.
|
|
107
|
+
|
|
108
|
+
Attributes:
|
|
109
|
+
sparse_system_type (:class:`DirectSolverMatrixType`): The type of the sparse
|
|
110
|
+
system of equations (general, symmetric, symmetric positive definite, etc).
|
|
111
|
+
The default is ``DirectSolverMatrixType.GENERAL``.
|
|
112
|
+
|
|
113
|
+
sparse_system_view (:class:`DirectSolverMatrixViewType`): The desired view of the
|
|
114
|
+
sparse system of equations (full, upper, lower). The default is
|
|
115
|
+
``DirectSolverMatrixViewType.FULL``.
|
|
116
|
+
|
|
117
|
+
multithreading_lib: The location (full path) to the library implementing the
|
|
118
|
+
threading layer interface, which depends on how nvmath-python is
|
|
119
|
+
:ref:`installed <nvmath installation>`. For example, if you install using
|
|
120
|
+
``pip install nvmath-python[cu13]`` on Linux, the multithreading library can
|
|
121
|
+
be found in ``<install_path>/nvidia/cu13/lib/libcudss_mtlayer_gomp.so.0``,
|
|
122
|
+
where ``<install_path>`` is the path shown by ``pip show nvidia-cudss-cu13``.
|
|
123
|
+
|
|
124
|
+
logger (logging.Logger): Python Logger object. The root logger will be used if a
|
|
125
|
+
logger object is not provided.
|
|
126
|
+
|
|
127
|
+
blocking: A flag specifying the behavior of the execution functions and methods,
|
|
128
|
+
such as :func:`direct_solver` and :meth:`DirectSolver.solve`.
|
|
129
|
+
When ``blocking`` is `True`, the execution methods do not return until the
|
|
130
|
+
operation is complete. When
|
|
131
|
+
``blocking`` is ``"auto"``, the methods return immediately when the input tensor
|
|
132
|
+
is on the GPU and ``execution`` is set to 'CUDA'. The execution methods always
|
|
133
|
+
block when the input tensor is on the CPU or ``execution`` is specified to 'CPU'
|
|
134
|
+
to ensure that the user doesn't inadvertently use the result before it becomes
|
|
135
|
+
available. The default is ``"auto"``.
|
|
136
|
+
|
|
137
|
+
handle: cuDSS library handle. A handle will be created if one is not provided.
|
|
138
|
+
|
|
139
|
+
.. seealso::
|
|
140
|
+
:class:`ExecutionCUDA`, :class:`ExecutionHybrid`, :class:`DirectSolver`, and
|
|
141
|
+
:func:`direct_solver`.
|
|
142
|
+
"""
|
|
143
|
+
|
|
144
|
+
sparse_system_type: int = DirectSolverMatrixType.GENERAL
|
|
145
|
+
sparse_system_view: int = DirectSolverMatrixViewType.FULL
|
|
146
|
+
multithreading_lib: str | None = None
|
|
147
|
+
logger: Logger | None = None
|
|
148
|
+
blocking: Literal[True, "auto"] = "auto"
|
|
149
|
+
handle: int | None = None
|
|
150
|
+
|
|
151
|
+
def __post_init__(self):
|
|
152
|
+
if self.blocking not in (True, "auto"):
|
|
153
|
+
raise ValueError("The value specified for 'blocking' must be either True or 'auto'.")
|
|
154
|
+
self.sparse_system_type = DirectSolverMatrixType(self.sparse_system_type)
|
|
155
|
+
self.sparse_system_view = DirectSolverMatrixViewType(self.sparse_system_view)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
@dataclass(slots=True, kw_only=True)
|
|
159
|
+
class DirectSolverPlanPreferences:
|
|
160
|
+
"""
|
|
161
|
+
A data class for providing plan preferences to the :func:`direct_solver` function.
|
|
162
|
+
|
|
163
|
+
Attributes:
|
|
164
|
+
host_nthreads: The number of host threads to use.
|
|
165
|
+
reordering_algorithm: The reordering algorithm to use.
|
|
166
|
+
pivot_type: The pivot type to use.
|
|
167
|
+
pivot_threshold: The pivot threshold to use.
|
|
168
|
+
max_nnz: The maximum number of non-zeros in the LU factorization.
|
|
169
|
+
matching_algorithm: The matching algorithm to use.
|
|
170
|
+
nd_min_levels: The number of levels in the nested dissection.
|
|
171
|
+
use_superpanels: Whether to use superpanels.
|
|
172
|
+
|
|
173
|
+
.. seealso::
|
|
174
|
+
:func:`direct_solver`
|
|
175
|
+
:class:`DirectSolverPlanConfig`
|
|
176
|
+
`cuDSS configuration documentation <https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
177
|
+
"""
|
|
178
|
+
|
|
179
|
+
host_nthreads: int | None = None
|
|
180
|
+
reordering_algorithm: cudss.ReorderingAlg | None = None
|
|
181
|
+
pivot_type: int | None = None
|
|
182
|
+
pivot_threshold: float | None = None
|
|
183
|
+
max_nnz: int | None = None
|
|
184
|
+
matching_algorithm: cudss.MatchingAlg | None = None
|
|
185
|
+
nd_min_levels: int | None = None
|
|
186
|
+
use_superpanels: bool | None = None
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
@dataclass(slots=True, kw_only=True)
|
|
190
|
+
class DirectSolverFactorizationPreferences:
|
|
191
|
+
"""
|
|
192
|
+
A data class for providing factorization preferences to
|
|
193
|
+
the :func:`direct_solver` function.
|
|
194
|
+
|
|
195
|
+
Attributes:
|
|
196
|
+
factorization_algorithm: The factorization algorithm to use.
|
|
197
|
+
pivot_eps_algorithm: The pivot epsilon algorithm to use.
|
|
198
|
+
pivot_eps: The pivot epsilon to use.
|
|
199
|
+
|
|
200
|
+
.. seealso::
|
|
201
|
+
:func:`direct_solver`
|
|
202
|
+
:class:`DirectSolverFactorizationConfig`
|
|
203
|
+
`cuDSS configuration documentation <https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
204
|
+
"""
|
|
205
|
+
|
|
206
|
+
factorization_algorithm: cudss.FactorizationAlg | None = None
|
|
207
|
+
pivot_eps_algorithm: cudss.PivotEpsilonAlg | None = None
|
|
208
|
+
pivot_eps: float | None = None
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
@dataclass(slots=True, kw_only=True)
|
|
212
|
+
class DirectSolverSolutionPreferences:
|
|
213
|
+
"""
|
|
214
|
+
A data class for providing solution preferences to the :func:`direct_solver` function.
|
|
215
|
+
|
|
216
|
+
Attributes:
|
|
217
|
+
solution_algorithm: The solution algorithm to use.
|
|
218
|
+
ir_num_steps: The number of steps to use for iterative refinement.
|
|
219
|
+
|
|
220
|
+
.. seealso::
|
|
221
|
+
:func:`direct_solver`
|
|
222
|
+
:class:`DirectSolverSolutionConfig`
|
|
223
|
+
`cuDSS configuration documentation <https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
224
|
+
"""
|
|
225
|
+
|
|
226
|
+
solution_algorithm: cudss.SolveAlg | None = None
|
|
227
|
+
ir_num_steps: int | None = None
|