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.