Source code for tiled.structures.sparse
import enum
from collections.abc import Mapping
from dataclasses import dataclass, field
from typing import Any, Optional, Tuple, Union
from tiled.structures.root import Structure
from ..type_aliases import Chunks
from .array import BuiltinDtype, Endianness, Kind, StructDtype
class SparseLayout(str, enum.Enum):
# Only COO is currently supported, but this lays a path
# for adding other layouts like CSC, CSR, etc. in the future.
COO = "COO"
[docs]
@dataclass
class COOStructure(Structure):
chunks: Chunks # tuple-of-tuples-of-ints like ((3,), (3,))
shape: Tuple[int, ...] # tuple of ints like (3, 3)
data_type: Optional[Union[BuiltinDtype, StructDtype]] = None
coord_data_type: Optional[BuiltinDtype] = field(
default_factory=lambda: BuiltinDtype(
Endianness("little"), Kind("u"), 8
) # numpy 'uint' dtype
)
dims: Optional[Tuple[str, ...]] = None # None or tuple of names like ("x", "y")
resizable: Union[bool, Tuple[bool, ...]] = False
layout: SparseLayout = SparseLayout.COO
# TODO Include fill_value?
@classmethod
def from_json(cls, structure: Mapping[str, Any]) -> "COOStructure":
data_type = structure.get("data_type", None)
if data_type is not None and "fields" in data_type:
data_type = StructDtype.from_json(data_type)
else:
data_type = BuiltinDtype.from_json(data_type)
coord_data_type = structure.get(
"coord_data_type", {"endianness": "little", "kind": "u", "itemsize": 8}
)
return cls(
data_type=data_type,
coord_data_type=BuiltinDtype.from_json(coord_data_type),
chunks=tuple(map(tuple, structure["chunks"])),
shape=tuple(structure["shape"]),
dims=structure["dims"],
resizable=structure.get("resizable", False),
)
# This may be extended to a Union of structures if more are added.
SparseStructure = COOStructure