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