| 4 | |
| 5 | |
| 6 | class HyperCube: |
| 7 | def __init__( |
| 8 | self, ndim: int, dimensions: Optional[List[Union[int, IntegerType]]] = None |
| 9 | ) -> None: |
| 10 | """ |
| 11 | dimensions: |
| 12 | each item: if item is IntegerType, it's dynamic, else it's static int value. |
| 13 | """ |
| 14 | self.ndim = ndim |
| 15 | self.dimensions = ( |
| 16 | ([IntegerType(unsigned=False, bits=32)] for _ in range(ndim)) |
| 17 | if dimensions is None |
| 18 | else dimensions |
| 19 | ) |
| 20 | assert isinstance(dimensions, (list, tuple)) |
| 21 | assert len(self.dimensions) == self.ndim |
| 22 | assert all( |
| 23 | [self.dim_is_dynamic(i) or self.dimensions[i] > 0 for i in range(self.ndim)] |
| 24 | ), "Static dim value should be > 0." |
| 25 | |
| 26 | def __getitem__(self, key: int): |
| 27 | assert key >= 0 and key < self.ndim |
| 28 | return self.dimensions[key] |
| 29 | |
| 30 | def __setitem__(self, key: int, value: Union[int, IntegerType]): |
| 31 | assert key >= 0 and key < self.ndim |
| 32 | assert ( |
| 33 | isinstance(value, IntegerType) or value > 0 |
| 34 | ), "Static dim value should be > 0." |
| 35 | self.dimensions[key] = value |
| 36 | |
| 37 | def __len__(self): |
| 38 | return self.ndim |
| 39 | |
| 40 | def append_and_get(self, v: Union[int, IntegerType]): |
| 41 | dimensions = [x for x in self.dimensions] + [v] |
| 42 | ret = HyperCube(self.ndim + 1, dimensions) |
| 43 | return ret |
| 44 | |
| 45 | def dim_is_dynamic(self, key: int): |
| 46 | return isinstance(self[key], IntegerType) |
| 47 | |
| 48 | def dim_is_static(self, key: int): |
| 49 | return not self.dim_is_dynamic(key) |
| 50 | |
| 51 | def has_dynamic(self): |
| 52 | return any([self.dim_is_dynamic(i) for i in range(self.ndim)]) |
| 53 | |
| 54 | def get_static_dims(self): |
| 55 | return [self.dimensions[i] for i in range(self.ndim) if self.dim_is_static(i)] |
| 56 | |
| 57 | def get_static_dims_with_keys(self): |
| 58 | return [ |
| 59 | (i, self.dimensions[i]) for i in range(self.ndim) if self.dim_is_static(i) |
| 60 | ] |
| 61 | |
| 62 | def num_elements(self): |
| 63 | assert ( |
no outgoing calls
no test coverage detected