Saltar al contenido principal

Entorno del Cubo de Rubik

Este módulo define la clase Cube3 que representa un Cubo de Rubik de 3x3x3 en la Métrica de Medio Giro (Half-Turn Metric).

Clase: Cube3: Una clase para el Cubo de Rubik de 3x3x3 en la Métrica de Medio Giro.

Cube3

class Cube3()

Una clase para el Cubo de Rubik de 3x3x3 en la Métrica de Medio Giro (HTM).

Esta clase proporciona métodos para manipular y resolver un Cubo de Rubik de 3x3x3 utilizando la métrica de medio giro. Define los estados inicial y objetivo del cubo, los movimientos disponibles y los métodos para la manipulación del cubo.

Representación:

Orden de las caras:

   0
2 5 3 4
1

Orden de las pegatinas en cada cara:

  2   5   8
1 4 7
[0] 3 6

Índices del estado (cada uno comenzando con 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

Colores (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

Atributos:

  • state ndarray - Estado actual del cubo representado como un array de colores de las pegatinas.
  • GOAL ndarray - Estado objetivo fijo representado como un array de colores de las pegatinas.
  • moves list - Lista de posibles movimientos del cubo (cara y dirección).
  • allow_wide bool - Bandera que indica si se permiten movimientos anchos (wide moves).
  • max_depth int - La profundidad máxima de la mezcla para el generador de datos.
  • sticker_target dict - Un diccionario que mapea cadenas de movimiento a listas de índices de pegatinas de destino.
  • sticker_source dict - Un diccionario que mapea cadenas de movimiento a listas de índices de pegatinas de origen.
  • sticker_target_ix ndarray - Un array de numpy 2D que mapea índices de movimiento a índices de pegatinas de destino para movimientos normales.
  • sticker_source_ix ndarray - Un array de numpy 2D que mapea índices de movimiento a índices de pegatinas de origen para movimientos normales.
  • sticker_target_ix_wide ndarray - Un array de numpy 2D que mapea índices de movimiento a índices de pegatinas de destino para movimientos anchos.
  • sticker_source_ix_wide ndarray - Un array de numpy 2D que mapea índices de movimiento a índices de pegatinas de origen para movimientos anchos.

show

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

Muestra el estado actual del cubo.

Argumentos:

  • flat bool - Si se debe mostrar el estado en forma plana.
  • palette list - Lista de colores para representar las pegatinas.

validate

def validate(
state=None,
centered=True
)

Valida el estado y la disposición del cubo.

Argumentos:

  • centered bool - Si los centros deben estar centrados o no.

Lanza:

  • ValueError - Si el estado o la disposición del cubo no son válidos.

reset

def reset()

Restablece el estado del cubo al estado resuelto.

reset_axes

def reset_axes()

Restablece los índices de color según los colores de los centros dados. Útil cuando se aplican movimientos anchos (fat moves) o cuando se especifica una perspectiva inesperada.

is_solved

def is_solved()

Comprueba si el cubo está en el estado resuelto.

finger

def finger(move)

Aplica un único movimiento al estado del cubo usando una cadena de movimiento.

Argumentos:

  • move str - Cadena de movimiento en notación HTM.

finger_ix

def finger_ix(ix)

Aplica un único movimiento usando su índice para una ejecución más rápida que .finger. Comprueba si el índice del movimiento corresponde a un movimiento normal (ix < 18) o a un movimiento ancho y aplica el cambio de estado utilizando arrays de índices precalculados.

Argumentos:

  • ix int - Índice del movimiento a aplicar.

apply_scramble

def apply_scramble(scramble)

Aplica una secuencia de movimientos (mezcla) al estado del cubo.

Argumentos:

  • scramble str or list - Secuencia de movimientos en notación HTM o como lista.

__iter__

def __iter__()

Crea un generador infinito de estados mezclados y secuencias de solución.

Este método está destinado al entrenamiento del modelo. En cada iteración, genera una nueva mezcla aleatoria de max_depth movimientos, evitando secuencias de movimientos triviales. Produce el historial de estados y el movimiento correspondiente que llevó a cada estado.

Produce:

tuple[np.ndarray, np.ndarray]: Una tupla que contiene:

  • X (np.ndarray): Un array de (max_depth, 54) con los estados del cubo.
  • y (np.ndarray): Un array de (max_depth,) con los índices de los movimientos que generaron los estados.

__vectorize_moves

def __vectorize_moves()

Vectoriza las operaciones de reemplazo de grupos de pegatinas para un cálculo más rápido. Este método define self.sticker_target y self.sticker_source para gestionar los colores de las pegatinas (el destino es reemplazado por el origen). Definen los índices de las pegatinas de destino y origen para que los movimientos puedan ser vectorizados.

Dataset

class Dataset(torch.utils.data.Dataset)

Clase de pseudo-dataset para generar infinitamente mezclas aleatorias.

Ejemplo
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
)

Crea una instancia de DataLoader para generar mezclas aleatorias del Cubo de Rubik.

Argumentos:

  • batch_size int - El número de muestras por lote.
  • num_workers int, optional - El número de procesos de trabajo a utilizar para la carga de datos. Por defecto, es el número de núcleos de CPU o 32 (más allá del cual el rendimiento disminuye), el que sea menor.
  • max_depth int, optional - La profundidad máxima de las mezclas. Por defecto es 20.
  • **dl_kwargs - Argumentos de palabra clave adicionales para pasar al constructor de DataLoader.

Devuelve:

  • torch.utils.data.DataLoader - Una instancia de DataLoader que produce lotes de mezclas aleatorias.