Spaces:
Sleeping
Sleeping
import torch | |
def build_cube_tensor(colors: list[str], size: int) -> torch.Tensor: | |
""" | |
Convert a list of 6 colors and size into a sparse 4D tensor representing a cube. | |
""" | |
assert (num := len(set(colors))) == 6, f"Expected 6 distinct colors, got {num}" | |
assert isinstance(size, int) and size > 1, f"Expected non-zero integrer size, got {size}" | |
# build dense tensor filled with colors | |
n = size - 1 | |
tensor = torch.zeros([6, size, size, size], dtype=torch.int16) | |
tensor[0, :, :, n] = 1 # up | |
tensor[1, 0, :, :] = 2 # left | |
tensor[2, :, n, :] = 3 # front | |
tensor[3, n, :, :] = 4 # right | |
tensor[4, :, 0, :] = 5 # back | |
tensor[5, :, :, 0] = 6 # down | |
return tensor.to_sparse() | |
def build_permutation_matrix(size: int, perm: str) -> torch.Tensor: | |
""" | |
Convert a permutation sting into a sparse 2D matrix. | |
""" | |
perm_list = [int(p) for p in (perm + perm[0])] | |
perm_dict = {perm_list[i]: perm_list[i + 1] for i in range(len(perm))} | |
indices = torch.tensor([list(range(size)), [(perm_dict.get(i, i)) for i in range(size)]], dtype=torch.int16) | |
values = torch.tensor([1] * size, dtype=torch.int16) | |
return torch.sparse_coo_tensor(indices=indices, values=values, size=(size, size), dtype=torch.int16).coalesce() | |