Перейти к основному содержимому

Среда кубика Рубика

Этот модуль определяет класс Cube3, представляющий кубик Рубика 3x3x3 в метрике полуоборотов (Half-Turn Metric).

Класс: Cube3: Класс для кубика Рубика 3x3x3 в метрике полуоборотов.

Cube3

class Cube3()

Класс для кубика Рубика 3x3x3 в метрике полуоборотов (HTM).

Этот класс предоставляет методы для манипулирования и сборки кубика Рубика 3x3x3 с использованием метрики полуоборотов. Он определяет начальное и целевое состояния кубика, доступные ходы и методы для манипулирования кубиком.

Представление:

Порядок граней:

   0
2 5 3 4
1

Порядок наклеек на каждой грани:

  2   5   8
1 4 7
[0] 3 6

Индексы состояния (каждый начинается с 9 * (n-1)):

                2   5   8
1 4 7
[0] 3 6
20 23 26 47 50 53 29 32 35 38 41 44
19 22 25 46 49 52 28 31 34 37 40 43
[18] 21 24 [45] 48 51 [27] 30 33 [36] 39 42
11 14 17
10 13 16
[9] 12 15

Цвета (indices // 9):

                0   0   0
0 0 0
0 0 0
2 2 2 5 5 5 3 3 3 4 4 4
2 2 2 5 5 5 3 3 3 4 4 4
2 2 2 5 5 5 3 3 3 4 4 4
1 1 1
1 1 1
1 1 1

Атрибуты:

  • state ndarray - Текущее состояние кубика, представленное в виде массива цветов наклеек.
  • GOAL ndarray - Фиксированное целевое состояние, представленное в виде массива цветов наклеек.
  • moves list - Список возможных ходов кубика (грань и направление).
  • allow_wide bool - Флаг, указывающий, разрешены ли широкие ходы.
  • max_depth int - Максимальная глубина скрамбла для генератора данных.
  • sticker_target dict - Словарь, сопоставляющий строки ходов со списками индексов целевых наклеек.
  • sticker_source dict - Словарь, сопоставляющий строки ходов со списками индексов исходных наклеек.
  • sticker_target_ix ndarray - Двумерный массив numpy, сопоставляющий индексы ходов с индексами целевых наклеек для обычных ходов.
  • sticker_source_ix ndarray - Двумерный массив numpy, сопоставляющий индексы ходов с индексами исходных наклеек для обычных ходов.
  • sticker_target_ix_wide ndarray - Двумерный массив numpy, сопоставляющий индексы ходов с индексами целевых наклеек для широких ходов.
  • sticker_source_ix_wide ndarray - Двумерный массив numpy, сопоставляющий индексы ходов с индексами исходных наклеек для широких ходов.

show

def show(
flat=False,
palette=["white", "yellow", "orange1", "red", "blue", "green"]
)

Отображает текущее состояние кубика.

Аргументы:

  • flat bool - Отображать ли состояние в развернутом виде.
  • palette list - Список цветов для представления наклеек.

validate

def validate(
state=None,
centered=True
)

Проверяет состояние и расположение кубика.

Аргументы:

  • centered bool - Должны ли центры быть центрированы.

Вызывает:

  • ValueError - Если состояние или расположение кубика неверно.

reset

def reset()

Сбрасывает состояние кубика до собранного.

reset_axes

def reset_axes()

Сбрасывает индексы цветов в соответствии с заданными цветами центров. Полезно при применении широких ходов или при указании неожиданной перспективы.

is_solved

def is_solved()

Проверяет, находится ли кубик в собранном состоянии.

finger

def finger(move)

Применяет один ход к состоянию кубика, используя строку хода.

Аргументы:

  • move str - Строка хода в нотации HTM.

finger_ix

def finger_ix(ix)

Применяет один ход, используя его индекс, для более быстрого выполнения, чем .finger. Проверяет, соответствует ли индекс хода обычному ходу (ix < 18) или широкому ходу, и применяет изменение состояния, используя предварительно вычисленные массивы индексов.

Аргументы:

  • ix int - Индекс применяемого хода.

apply_scramble

def apply_scramble(scramble)

Применяет последовательность ходов (скрамбл) к состоянию кубика.

Аргументы:

  • scramble str или list - Последовательность ходов в нотации HTM в виде строки или списка.

__iter__

def __iter__()

Создает бесконечный генератор разобранных состояний и последовательностей решений.

Этот метод предназначен для обучения модели. На каждой итерации он генерирует новый случайный скрамбл длиной max_depth ходов, избегая тривиальных последовательностей. Он возвращает историю состояний и соответствующий ход, который привел к каждому состоянию.

Возвращает (yields):

tuple[np.ndarray, np.ndarray]: Кортеж, содержащий:

  • X (np.ndarray): Массив состояний кубика размером (max_depth, 54).
  • y (np.ndarray): Массив индексов ходов размером (max_depth,), которые сгенерировали состояния.

__vectorize_moves

def __vectorize_moves()

Векторизует операции замены групп наклеек для ускорения вычислений. Этот метод определяет self.sticker_target и self.sticker_source для управления цветами наклеек (целевые заменяются исходными). Они определяют индексы целевых и исходных наклеек, чтобы ходы можно было векторизовать.

Dataset

class Dataset(torch.utils.data.Dataset)

Псевдо-класс набора данных для бесконечной генерации случайных скрамблов.

Пример
batch_size = 1024
dl = get_dataloader(batch_size)
for i, (batch_x, batch_y) in zip(range(1000), dl):
batch_x, batch_y = batch_x.to(device), batch_y.device().reshape(-1)

get_dataloader

def get_dataloader(
batch_size,
num_workers=min(os.cpu_count(), 32), max_depth=20,
**dl_kwargs
)

Создает экземпляр DataLoader для генерации случайных скрамблов кубика Рубика.

Аргументы:

  • batch_size int - Количество образцов в батче.
  • num_workers int, optional - Количество рабочих процессов для загрузки данных. По умолчанию равно количеству ядер ЦП или 32 (дальнейшее увеличение не дает прироста производительности), в зависимости от того, что меньше.
  • max_depth int, optional - Максимальная глубина скрамблов. По умолчанию 20.
  • **dl_kwargs - Дополнительные именованные аргументы для передачи в конструктор DataLoader.

Возвращает:

  • torch.utils.data.DataLoader - Экземпляр DataLoader, который возвращает батчи случайных скрамблов.