Comprimir jugadas de ajedrez por diversión y beneficio
Enfoque general
- La discusión se centra en hasta qué punto se pueden comprimir partidas de ajedrez más allá de PGN, aprovechando la estructura del juego, las distribuciones no uniformes de jugadas y las predicciones de motores.
- Hay una tensión recurrente entre la “compresión máxima” y la “simplicidad, velocidad y capacidad de consulta”.
Compresión genérica vs específica del dominio
- Varios sugieren probar compresores estándar (gzip, zstd, LZW, diccionarios entrenados) sobre listas de jugadas o listas de partidas ordenadas como referencia.
- Otros argumentan que los compresores generales no pueden aprovechar la estructura específica del ajedrez (jugadas legales, estado del tablero) tan bien como las codificaciones personalizadas.
- Algunos creen que un buen diccionario de zstd o formatos columnares sobre posiciones podría acercarse “gratis”, pero esto sigue sin probarse en el hilo.
Codificaciones a nivel de jugada y de partida
- Muchos proponen codificaciones simples de ancho fijo:
- 12–16 bits: casillas de origen + destino (6+6 bits), con promociones/enroques inferidos o señalados mediante destinos “imposibles” o bits extra.
- Índice de pieza + patrón de movimiento relativo, aprovechando que cada bando tiene como máximo 16 piezas; se discuten esquemas que alcanzan ~6–9 bits/jugada.
- Esquemas más avanzados:
- Indexar la jugada elegida entre todas las jugadas legales en la posición actual; con ~n jugadas legales, se necesitan ~log₂(n) bits; las estimaciones prácticas son ≲6–8 bits/jugada.
- Usar códigos de longitud variable (Huffman, codificación aritmética, ANS/rANS, CABAC) con distribuciones de probabilidad por posición.
- Las probabilidades guiadas por motores (como Stockfish o motores más débiles) podrían, en teoría, llegar a ~3–4 bits/jugada, posiblemente menos, pero con un alto coste de CPU y una fuerte dependencia de versiones concretas del motor.
- Un seguimiento del autor del artículo (enlazado repetidamente) informa de ~3.7 bits/jugada usando codificación aritmética y generación rápida de jugadas.
Posiciones, indexación y búsqueda
- Varios señalan que en las bases de datos reales, el almacenamiento suele estar dominado por los índices de búsqueda, no por los datos brutos de las partidas.
- Ideas para indexar:
- Hashing Zobrist y estructuras al estilo de tablas de transposición.
- Filtros Bloom o filtros Bloom particionados para comprobaciones de existencia frente a tablas hash completas para búsqueda O(1).
- Almacenamiento columnar de estados del tablero (columnas por casilla) con compresión estándar y luego referencia a las posiciones por desplazamiento.
- Técnicas para búsqueda de posiciones “difusa” (por ejemplo, distancia de Hamming en bitboards, ideas tipo MinHash), aunque las soluciones prácticas siguen sin estar claras.
Compromisos y preocupaciones prácticas
- Muchos destacan que una compresión extrema puede perjudicar:
- La velocidad de decodificación (generación completa de jugadas, llamadas al motor).
- El acceso aleatorio y las consultas complejas (por ejemplo, exploradores de aperturas, búsqueda de patrones en finales).
- La mantenibilidad; los esquemas muy densos e ingeniosos pueden ser difíciles de entender para desarrolladores futuros.
- Algunos señalan que PGN es despilfarrador pero legible para humanos; en muchos casos del mundo real, la latencia de E/S y la estrategia de consulta importan más que exprimir hasta el último bit del almacenamiento de jugadas.