|
1 |
| -import numpy as np |
| 1 | +import abc |
| 2 | + |
2 | 3 |
|
3 | 4 | from .julia import jl
|
4 |
| -from .typing import OrderType |
| 5 | +from . import dtypes |
| 6 | +from dataclasses import dataclass |
5 | 7 |
|
6 | 8 |
|
7 |
| -class _Display: |
| 9 | +class _Display(abc.ABC): |
8 | 10 | def __repr__(self):
|
9 | 11 | return jl.sprint(jl.show, self._obj)
|
10 | 12 |
|
11 | 13 | def __str__(self):
|
12 | 14 | return jl.sprint(jl.show, jl.MIME("text/plain"), self._obj)
|
13 | 15 |
|
14 | 16 |
|
15 |
| -# LEVEL |
| 17 | +class AbstractLeafLevel(abc.ABC): |
| 18 | + @abc.abstractmethod |
| 19 | + def _construct(self, *, dtype, fill_value): |
| 20 | + ... |
| 21 | + |
16 | 22 |
|
17 |
| -class AbstractLevel(_Display): |
18 |
| - pass |
| 23 | +# LEVEL |
| 24 | +class AbstractLevel(abc.ABC): |
| 25 | + @abc.abstractmethod |
| 26 | + def _construct(self, *, inner_level): |
| 27 | + ... |
19 | 28 |
|
20 | 29 |
|
21 | 30 | # core levels
|
22 |
| - |
| 31 | +@dataclass |
23 | 32 | class Dense(AbstractLevel):
|
24 |
| - def __init__(self, lvl, shape=None): |
25 |
| - args = [lvl._obj] |
26 |
| - if shape is not None: |
27 |
| - args.append(shape) |
28 |
| - self._obj = jl.Dense(*args) |
29 |
| - |
30 |
| - |
31 |
| -class Element(AbstractLevel): |
32 |
| - def __init__(self, fill_value, data=None): |
33 |
| - args = [fill_value] |
34 |
| - if data is not None: |
35 |
| - args.append(data) |
36 |
| - self._obj = jl.Element(*args) |
37 |
| - |
38 |
| - |
39 |
| -class Pattern(AbstractLevel): |
40 |
| - def __init__(self): |
41 |
| - self._obj = jl.Pattern() |
42 |
| - |
43 |
| - |
44 |
| -# advanced levels |
45 |
| - |
46 |
| -class SparseList(AbstractLevel): |
47 |
| - def __init__(self, lvl): |
48 |
| - self._obj = jl.SparseList(lvl._obj) |
49 |
| - |
50 |
| - |
51 |
| -class SparseByteMap(AbstractLevel): |
52 |
| - def __init__(self, lvl): |
53 |
| - self._obj = jl.SparseByteMap(lvl._obj) |
54 |
| - |
| 33 | + dim: int | None = None |
| 34 | + index_type: jl.DataType = dtypes.int64 |
55 | 35 |
|
56 |
| -class RepeatRLE(AbstractLevel): |
57 |
| - def __init__(self, lvl): |
58 |
| - self._obj = jl.RepeatRLE(lvl._obj) |
| 36 | + def _construct(self, *, inner_level) -> jl.Dense: |
| 37 | + if self.dim is None: |
| 38 | + return jl.Dense[self.index_type](inner_level) |
59 | 39 |
|
| 40 | + return jl.Dense[self.index_type](inner_level, self.dim) |
60 | 41 |
|
61 |
| -class SparseVBL(AbstractLevel): |
62 |
| - def __init__(self, lvl): |
63 |
| - self._obj = jl.SparseVBL(lvl._obj) |
64 | 42 |
|
| 43 | +@dataclass |
| 44 | +class Element(AbstractLeafLevel): |
| 45 | + def _construct(self, *, dtype: jl.DataType, fill_value) -> jl.Element: |
| 46 | + return jl.Element[fill_value, dtype]() |
65 | 47 |
|
66 |
| -class SparseCOO(AbstractLevel): |
67 |
| - def __init__(self, ndim, lvl): |
68 |
| - self._obj = jl.SparseCOO[ndim](lvl._obj) |
69 | 48 |
|
| 49 | +@dataclass |
| 50 | +class Pattern(AbstractLeafLevel): |
| 51 | + def _construct(self, *, dtype, fill_value) -> jl.Pattern: |
| 52 | + from .dtypes import bool |
70 | 53 |
|
71 |
| -class SparseHash(AbstractLevel): |
72 |
| - def __init__(self, ndim, lvl): |
73 |
| - self._obj = jl.SparseHash[ndim](lvl._obj) |
| 54 | + if dtype != bool: |
| 55 | + raise TypeError("`Pattern` can only have `dtype=bool`.") |
| 56 | + if dtype(fill_value) != dtype(False): |
| 57 | + raise TypeError("`Pattern` can only have `fill_value=False`.") |
74 | 58 |
|
| 59 | + return jl.Pattern() |
75 | 60 |
|
76 |
| -# STORAGE |
77 | 61 |
|
78 |
| -class Storage: |
79 |
| - def __init__(self, levels_descr: AbstractLevel, order: OrderType = None): |
80 |
| - self.levels_descr = levels_descr |
81 |
| - self.order = order if order is not None else "C" |
82 |
| - |
83 |
| - def __str__(self) -> str: |
84 |
| - return f"Storage(lvl={str(self.levels_descr)}, order={self.order})" |
85 |
| - |
86 |
| - |
87 |
| -class DenseStorage(Storage): |
88 |
| - def __init__(self, ndim: int, dtype: np.dtype, order: OrderType = None): |
89 |
| - lvl = Element(np.int_(0).astype(dtype)) |
90 |
| - for _ in range(ndim): |
91 |
| - lvl = Dense(lvl) |
| 62 | +# advanced levels |
| 63 | +@dataclass |
| 64 | +class SparseList(AbstractLevel): |
| 65 | + index_type: jl.DataType = dtypes.int64 |
| 66 | + pos_type: jl.DataType = dtypes.uint64 |
| 67 | + crd_type: jl.DataType = dtypes.uint64 |
92 | 68 |
|
93 |
| - super().__init__(levels_descr=lvl, order=order) |
| 69 | + def _construct(self, *, inner_level) -> jl.SparseList: |
| 70 | + return jl.SparseList[self.index_type, self.pos_type, self.crd_type](inner_level) |
0 commit comments