Estudio del motor · Rendimiento del bot

Comparativa de Open Sage frente a eXtreme Gammon

Una comparación cuantitativa del motor de evaluación Open Sage — el que impulsa Backgammon Sage Pro — frente al motor de eXtreme Gammon (XG).

Resumen

Comparamos el motor Open Sage con eXtreme Gammon (XG) en niveles de evaluación equivalentes: evaluación directa de la red neuronal, búsqueda multi-ply y rollouts truncados. Como XG no expone ninguna interfaz programática, lo puntuamos mediante su función Batch Analysis. Usamos tres métodos complementarios. El primero construye un conjunto por capas de evaluaciones de referencia — confiando en las evaluaciones rápidas cuando la elección es clara y escalando los casos ajustados a rollouts completos — y puntúa cada motor con un Performance Rating (PR) frente a esa referencia, en 500 partidas ilimitadas (17.535 decisiones) y 130 partidos a cinco puntos (18.292 decisiones). Para las partidas ilimitadas reconstruimos después toda la comparación tomando como referencia el propio análisis escalonado de XG — el espejo exacto. El segundo aísla las posiciones ilimitadas en las que Sage 3T y XG Roller++ discrepan realmente y juzga cada una frente a los rollouts completos de ambos motores. El mismo método de referencia y puntuación se aplica a trece benchmarks de backgames, partidas de contención y snake: las posiciones que los motores han jugado peor históricamente. En los estudios de fuerza los dos motores están próximos: con la referencia de Sage, Sage va por delante en los niveles de rollout truncado en los que se apoya la mayoría de los usuarios; con la de XG, XG va por delante o empata. El tercer método invierte la pregunta: en 290 partidos reales de torneo ya analizados en XG, reanalizamos cada uno en Sage y comparamos el Performance Rating que los dos motores asignan a cada jugador. Los dos índices van de la mano: en 580 índices de jugadores tienen una correlación del 98 %, y la diferencia media entre ellos es de +0,002 PR — estadísticamente indistinguible de cero.

01
Introducción

¿Por qué medirse con XG?

eXtreme Gammon (XG) es la referencia habitual del análisis computacional del backgammon, y su motor de evaluación se considera ampliamente uno de los más fuertes que existen. Cualquier motor nuevo que aspire a tomarse en serio tiene que responder a una pregunta sencilla: ¿cómo se compara con XG? Este estudio se propone responderla cuantitativamente para Open Sage, el motor de redes neuronales que hay detrás de Backgammon Sage Pro.

Nuestro objetivo era comparar las evaluaciones de Open Sage con las de XG a niveles de esfuerzo comparables. El experimento natural — hacer que los motores jueguen muchos millones de partidas entre sí y contar el resultado — no es práctico: la aplicación de escritorio de XG no expone ninguna interfaz programática, así que pasar posiciones y jugadas de un motor al otro es un proceso manual, a golpe de clic. Alcanzar una muestra lo bastante grande para resolver las pequeñas diferencias entre dos motores fuertes llevaría demasiado tiempo.

En su lugar usamos la función Batch Analysis (análisis por lotes) de XG, capaz de puntuar cientos de partidas transcritas en una sola pasada desatendida. Open Sage juega ambos lados de muchas partidas; cada partida se exporta en un formato de texto estándar que XG puede importar; XG analiza el conjunto; y nosotros extraemos sus veredictos. Sobre esa base común aplicamos dos métodos distintos, descritos en la sección 3 y la sección 4.

Un tercer estudio (sección 5) deja de lado las simulaciones por completo y parte de matches reales de torneo analizados en XG. Su propósito es distinto: en lugar de preguntar qué motor es más fuerte, pregunta si un jugador que analiza un match en Sage obtiene el mismo Performance Rating que le daría XG, de modo que años de intuición sobre lo que significa un PR en XG se trasladen directamente a Sage.

02
Contexto

Niveles de evaluación

Ambos motores pueden evaluar una posición a distintas profundidades, cambiando precisión por velocidad. Entender estos niveles es esencial para leer los resultados, porque la comparación se hace siempre entre niveles equiparados de los dos motores.

Evaluación directa (1-ply). La salida en bruto de la red neuronal para una posición, sin búsqueda hacia delante. Es el ajuste más rápido y la base sobre la que se construye cada nivel más profundo. (Seguimos la convención de XG, en la que 1-ply designa la evaluación en bruto de la red.)

Búsqueda multi-ply (2-, 3-, 4-ply). El motor mira varios turnos hacia delante, considerando las respuestas del oponente y promediando sobre las posibles tiradas en cada paso, con una evaluación en bruto de la red al final de cada línea. Cada ply adicional es más preciso y bastante más costoso.

Rollouts truncados (1T, 2T, 3T). En lugar de buscar hasta una profundidad fija, el motor juega muchas partidas simuladas cortas, las trunca tras unos pocos turnos y evalúa la posición resultante con búsqueda multi-ply. La reducción de varianza cancela buena parte de la suerte de los dados muestreados. Son los ajustes “Roller” de XG, y son más fuertes que la búsqueda a profundidad fija sin dejar de ser mucho más baratos que un rollout completo.

Rollout completo. Muchas partidas simuladas jugadas hasta el final. Ejecutado con suficiente volumen y reducción de varianza, un rollout completo es lo más parecido a la verdad que un motor de backgammon puede producir, y lo usamos como estándar de referencia a lo largo de todo este estudio.

Niveles equiparados: Sage y XG

Familia Sage Equivalente en XG Qué hace
Directa 1-ply 1-ply (evaluación en bruto) Una única evaluación de la posición con la red neuronal, sin búsqueda hacia delante.
Multi-ply 2P · 3P · 4P 2-ply · 3-ply · 4-ply Explora las respuestas del oponente varios turnos en profundidad, promediando sobre los dados.
Rollout truncado 1T · 2T · 3T Roller · Roller+ · Roller++ Muchas partidas simuladas cortas, truncadas tras 5–7 turnos y evaluadas con multi-ply, con reducción de varianza. 3T/Roller++ usan decisiones a 3-ply; 2T/Roller+ a 2-ply; 1T/Roller a 1-ply.
Rollout completo Rollout Rollout Partidas simuladas jugadas hasta el final: la “verdad” de referencia en este estudio.
Performance Rating (PR). En todo el estudio, la precisión de un motor se resume como PR (índice de rendimiento): el error medio de equidad por decisión, multiplicado por 500, medido frente a la referencia obtenida por rollout. Un PR de 0 significa acuerdo perfecto con la verdad; cuanto más bajo, mejor.
03
Método uno

PR de rollout

El primer método puntúa cada motor frente a un conjunto fijo de decisiones cuya “verdadera” mejor jugada hemos establecido con la mayor precisión posible. Sigue el mismo enfoque del conocido estudio de XG de 2012 que comparó XG con varios otros bots.

Empezamos simulando 500 partidas ilimitadas de Sage 3P jugando contra sí mismo. Un nivel moderadamente fuerte como 3P produce una distribución realista de posiciones en todos los planes de juego — carrera, ataque, bloqueo, anclaje — que es exactamente la variedad contra la que queremos probar. Después repetimos el estudio completo con 130 matches a cinco puntos, donde el marcador cambia el valor de cada decisión; los resultados de ambos aparecen más abajo.

Construir la verdad de referencia

Establecer la verdadera mejor jugada de cada decisión mediante rollout completo sería enormemente costoso — e innecesario, porque la mayoría de las decisiones no son ajustadas. Por eso construimos la referencia en tres pasadas escalonadas, gastando esfuerzo de rollout solo donde la elección está realmente en duda. La misma receta se aplica a los dos conjuntos de datos; cada pasada resuelve las decisiones que puede zanjar con confianza y pasa el resto a la siguiente:

Pasada 1 · Sage 3P

Confiar en 3-ply cuando la elección es clara

Cada decisión se evalúa a 3-ply. Cuando la mejor jugada supera a la siguiente por más de 0,05 de equidad, el veredicto de 3P se acepta como verdad y la decisión queda resuelta.

0.05
margen de equidad para resolver
Las decisiones más ajustadas (dentro de 0,05) pasan a la pasada 2
Pasada 2 · Sage 3T

Revisar las decisiones ajustadas con un rollout truncado

Las decisiones restantes se reevalúan a 3T. Cuando el margen supera ahora 0,02 de equidad, el veredicto de 3T se acepta como verdad.

0.02
margen de equidad para resolver
Todo lo que siga dentro de 0,02 pasa a la pasada 3
Pasada 3 · Rollout completo

Hacer rollout de las decisiones más difíciles

Todo lo que sigue dentro de 0,02 se resuelve con un rollout completo de Sage: decisiones a 3P tanto para el juego de fichas como para las acciones del cubo, ejecutado en lotes de 1296 caminos hasta que la banda de confianza del 95 % sobre la equidad baja de 0,005 — o se alcanza un tope de 20 736 caminos (16 × 1296). Las posiciones de backgame más lentas tardaron bastante más de una hora cada una.

0.005
banda del 95 % objetivo

El resultado es una referencia escalonada en la que cada decisión se resuelve exactamente a la profundidad que su dificultad exige. Aplicamos esta misma receta de tres pasadas a los dos conjuntos de datos — las 500 partidas ilimitadas y los 130 matches a cinco puntos — y la composición de niveles resultante se muestra junto a los resultados de cada conjunto más abajo.

Puntuar un motor

Con un conjunto escalonado de evaluaciones fiables en la mano, puntuar cualquier motor es sencillo: le presentamos cada decisión del benchmark, registramos el error de equidad de la jugada o acción del cubo que elige respecto a la verdad, e informamos el error medio × 500 como PR. El mismo total se desglosa en PR de fichas y PR de cubo, y además por plan de juego.

Puntuar a XG exigió el paso adicional descrito en la introducción. Como XG no tiene API, ejecutamos su Batch Analysis sobre las transcripciones de las 500 partidas ilimitadas y los 130 matches con un nivel personalizado — decisiones a 3-ply, subiendo al nivel bajo prueba allí donde discrepaba — y extrajimos la decisión preferida de XG para cada posición de los archivos .xg que produce, puntuándolas frente a las mismas equidades de referencia.

Partidas ilimitadas — composición de la referencia

En las 500 partidas ilimitadas, las tres pasadas resolvieron 16 889 posiciones (17 535 decisiones) así:

Resueltas a 3P  7652 Resueltas a 3T  3260 Con rollout  5977 Partidas ilimitadas  16 889 posiciones · 17 535 decisiones

Partidas ilimitadas — cara a cara

Los cinco niveles equiparados, puntuados sobre esas 17 535 decisiones. Cuanto más bajo el PR, mejor; en cada pareja se resalta el motor más fuerte.

Sage 3T
Rollout truncado · decisiones a 3-ply · truncado a 7 turnos
0.23
vs
0.34
XG Roller++
Rollout truncado · decisiones a 3-ply · truncado a 7 turnos
Sage 3T aventaja por 0,11 PR
Sage 2T
Rollout truncado · decisiones a 2-ply
0.27
vs
0.41
XG Roller+
Rollout truncado · decisiones a 2-ply
Sage 2T aventaja por 0,14 PR
Sage 1T
Rollout truncado · decisiones a 1-ply · truncado a 5 turnos · 72 caminos
0.49
vs
0.53
XG Roller
Rollout truncado · decisiones a 1-ply · truncado a 5 turnos · 42 caminos
Sage 1T aventaja por 0,04 PR
Sage 4P
Búsqueda a 4-ply
0.43
vs
0.47
XG 4-ply
Búsqueda a 4-ply
Sage 4P aventaja por 0,04 PR
Sage 3P
Búsqueda a 3-ply
0.60
vs
0.57
XG 3-ply
Búsqueda a 3-ply
Prácticamente empate — XG 3-ply por delante por 0,03 PR

Partidas ilimitadas — desglose completo

PR de cada motor y nivel probado, desglosado por tipo de decisión y plan de juego. Cuanto más bajo, mejor.

Motor PR Fichas Cubo Carrera pura Carrera Ataque Bloqueo Anclaje
Sage 3T 0.230.200.410.020.250.200.320.32
XG Roller++ 0.340.330.380.040.440.250.410.48
Sage 2T 0.270.240.430.020.320.200.400.36
XG Roller+ 0.410.410.390.050.600.310.470.54
Sage 1T 0.490.500.430.040.580.430.620.64
XG Roller 0.530.540.480.050.640.450.710.67
Sage 4P 0.430.420.520.080.540.390.450.60
XG 4-ply 0.470.460.520.060.590.400.570.59
Sage 3P 0.600.600.610.130.780.530.670.75
XG 3-ply 0.570.570.580.050.720.480.730.72
Sage 2P 1.681.442.910.401.841.861.871.77
Sage 1P 2.552.423.240.422.712.793.132.74
Open Sage eXtreme Gammon Sage 2P y 1P no tienen equivalente de XG en esta ejecución y se muestran como referencia.
Las evaluaciones de Sage son más fuertes que la evaluación equivalente de XG en todos los niveles equiparados salvo 3-ply, donde XG se adelanta por 0,03 PR — una diferencia dentro del ruido. Los dos motores están cerca, y en los niveles de rollout truncado que la mayoría de los usuarios utiliza Sage mantiene una ventaja clara: 0,23 frente al 0,34 de Roller++, y 0,27 frente al 0,41 de Roller+.

Partidas ilimitadas — puntuadas frente a la propia referencia de XG

Todos los números anteriores califican a los motores frente a la referencia escalonada de Sage. La objeción obvia es que Sage juega en casa: se le está midiendo contra sus propios rollouts. Así que construimos el espejo exacto: las mismas 500 partidas y las mismas decisiones, pero con el propio análisis de XG como verdad en cada nivel. XG 3-ply resuelve las decisiones del nivel 3P, XG Roller++ las del nivel 3T y el rollout completo del propio XG las decisiones con rollout — el análogo nivel a nivel, en XG, de la referencia de Sage. Después se vuelve a puntuar cada motor frente a ella.

Motor PR Fichas Cubo Carrera pura Carrera Ataque Bloqueo Anclaje
Sage 3T 0.280.260.410.020.400.230.310.37
XG Roller++ 0.210.200.230.010.300.180.220.25
Sage 2T 0.300.290.360.020.390.280.360.38
XG Roller+ 0.300.320.230.010.480.250.260.40
Sage 1T 0.460.470.420.030.610.420.500.57
XG Roller 0.400.410.350.030.530.340.530.45
Sage 4P 0.390.380.430.060.550.360.420.42
XG 4-ply 0.340.330.400.030.460.330.410.36
Sage 3P 0.500.490.560.080.670.470.560.56
XG 3-ply 0.410.410.400.030.540.360.520.46
Sage 2P 1.381.172.440.301.571.501.551.45
Sage 1P 2.192.072.810.362.272.442.712.30
Open Sage eXtreme Gammon Referencia: XG 3-ply (nivel 3P) · XG Roller++ (nivel 3T) · rollout completo de XG (nivel rollout).
Frente a la propia referencia de XG, la clasificación se invierte: XG va por delante en todos los niveles equiparados salvo 2T, donde Sage 2T y XG Roller+ empatan a 0,30, y XG Roller++ obtiene 0,21 frente al 0,28 de Sage 3T. Ambas tablas comparten el mismo sesgo estructural. Casi dos tercios de las decisiones los resuelve el propio 3-ply o el rollout truncado de la referencia, y quien resuelve las decisiones de un nivel puntúa casi cero en ellas: aquí XG 3-ply y XG Roller++, en la tabla anterior Sage 3P y Sage 3T. Las decisiones con rollout son la prueba más justa, porque en ellas juzga un rollout completo y no uno de los niveles evaluados: el rollout de XG pone a Roller++ ligeramente por delante de Sage 3T (0,56 frente a 0,60), mientras que el de Sage pone a Sage 3T claramente por delante (0,51 frente a 0,76).
Dos referencias, dos veredictos. Con la referencia de Sage, Sage 3T supera a XG Roller++ por 0,23 a 0,34; con la de XG, Roller++ gana por 0,21 a 0,28. En el nivel más alto, cada motor sale por delante frente a su propio análisis: el mismo patrón que el estudio de posiciones en disputa (sección 4) encuentra donde los dos motores discrepan abiertamente. Los dos motores están muy cerca, y cuál va por delante depende de qué análisis se tome como verdad.

Modalidad match — composición de la referencia

El conjunto de matches ejecuta las mismas tres pasadas, con un añadido: el marcador away de cada jugador y la marca de Crawford se propagan por todas las evaluaciones, de modo que la verdad se calcula en el espacio de equidad de match (MWC) frente al marcador correcto. En los 130 matches a cinco puntos, las pasadas resolvieron 17 892 posiciones (18 292 decisiones) así:

Resueltas a 3P  7522 Resueltas a 3T  3460 Con rollout  6910 Modalidad match  17 892 posiciones · 18 292 decisiones

Modalidad match — cara a cara

Los cinco niveles equiparados, puntuados sobre esas 18 292 decisiones. Cuanto más bajo el PR, mejor; en cada pareja se resalta el motor más fuerte.

Sage 3T
Rollout truncado · decisiones a 3-ply · truncado a 7 turnos
0.23
vs
0.36
XG Roller++
Rollout truncado · decisiones a 3-ply · truncado a 7 turnos
Sage 3T aventaja por 0,13 PR
Sage 2T
Rollout truncado · decisiones a 2-ply
0.26
vs
0.44
XG Roller+
Rollout truncado · decisiones a 2-ply
Sage 2T aventaja por 0,18 PR
Sage 1T
Rollout truncado · decisiones a 1-ply · truncado a 5 turnos · 72 caminos
0.47
vs
0.51
XG Roller
Rollout truncado · decisiones a 1-ply · truncado a 5 turnos · 42 caminos
Sage 1T aventaja por 0,04 PR
Sage 4P
Búsqueda a 4-ply
0.41
vs
0.46
XG 4-ply
Búsqueda a 4-ply
Sage 4P aventaja por 0,05 PR
Sage 3P
Búsqueda a 3-ply
0.56
vs
0.54
XG 3-ply
Búsqueda a 3-ply
Prácticamente empate — XG 3-ply por delante por 0,02 PR

Modalidad match — desglose completo

PR de cada motor y nivel probado en el conjunto de matches a 5 puntos, desglosado por tipo de decisión y plan de juego. Cuanto más bajo, mejor.

Motor PR Fichas Cubo Carrera pura Carrera Ataque Bloqueo Anclaje
Sage 3T 0.230.200.460.070.220.200.280.31
XG Roller++ 0.360.350.440.080.440.320.330.49
Sage 2T 0.260.240.400.020.350.180.310.35
XG Roller+ 0.440.440.440.090.540.440.390.55
Sage 1T 0.470.470.470.060.550.450.550.56
XG Roller 0.510.510.560.090.630.490.500.65
Sage 4P 0.410.410.470.050.500.370.440.53
XG 4-ply 0.460.450.580.090.590.440.420.60
Sage 3P 0.560.540.710.050.730.550.590.63
XG 3-ply 0.540.530.620.090.680.530.520.68
Sage 2P 1.271.231.580.391.461.241.491.39
Sage 1P 2.222.212.350.382.432.412.442.47
Open Sage eXtreme Gammon Sage 2P y 1P no tienen equivalente de XG en esta ejecución y se muestran como referencia.
Los resultados en matches repiten los del estudio de partidas ilimitadas: Sage es más fuerte que la evaluación equivalente de XG en todos los niveles equiparados salvo 3-ply, donde XG se adelanta por 0,02 PR — muy dentro del ruido. La ventaja más clara de Sage vuelve a estar en los niveles de rollout truncado (3T y 2T) que la mayoría de los usuarios utiliza: 0,23 frente al 0,36 de Roller++ y 0,26 frente al 0,44 de Roller+.

Backgames, juegos de contención y el snake

Las partidas corrientes de juego contra sí mismo rara vez producen un backgame profundo, un juego de contención o un prime en la mitad lejana que retenga una sola ficha rezagada, así que los conjuntos de partidas ilimitadas y de matches dicen poco sobre cómo los juega un motor — y son las posiciones en las que los motores han sido históricamente más débiles. Trece benchmarks de familias de posiciones los miden directamente, cada uno construido como el benchmark de partidas ilimitadas — decisiones reales, cada una con una referencia de calidad rollout — pero con las decisiones extraídas del interior de la familia:

  • Los diez backgames clásicos, nombrados por los dos puntos que el jugador del backgame mantiene en el tablero interior del oponente — el backgame 2‑1 mantiene los puntos 2 y 1 del oponente, el 5‑4 los puntos 5 y 4, y así sucesivamente. Cada uno contiene unas 1000 decisiones, registradas solo mientras las dos anclas siguen en pie y quien las mantiene va por detrás en la carrera.
  • Juegos de contención, definidos por el que escapa: un bando ha sacado algunas fichas y tiene de una a tres fichas que fueron golpeadas y deben recorrer todo el tablero de vuelta a casa, mientras el otro bando, con la carrera perdida, dispone lo que le queda para seguir golpeándolas.
  • Backgames masivos — tres o más anclas en el tablero interior del oponente, o dos anclas con siete o más fichas atrás.
  • El snake — una serie de cuatro o más puntos hechos consecutivos en la mitad del tablero del oponente que atrapa una sola ficha rezagada mientras las demás fichas del oponente están amontonadas en casa. Un juego de bloqueo más que un backgame, y una de las formas más difíciles de jugar del backgammon.

Cada familia parte de un pequeño conjunto de posiciones semilla. Sage juega partidas ilimitadas desde esas semillas contra sí mismo a 3-ply, se registra cada decisión que surge mientras la posición sigue perteneciendo a la familia, y cada decisión registrada se somete a rollout para producir su referencia — 5184 caminos jugados hasta el final, con decisiones de fichas y de cubo a 3-ply en los tres primeros medios movimientos y a 2-ply a partir de ahí, con reducción de varianza activada. Pasadas de completado de candidatas sometieron a rollout cada jugada que un motor bajo prueba eligió efectivamente, de modo que cada puntuación de abajo se calcula frente a una candidata de calidad rollout. Una posición de cubo en la que el oponente posee el cubo no es una decisión para el jugador en turno y no se puntúa.

Benchmark Decisiones 2-ply 3-ply 4-ply 1T / Roller 2T / Roller+ 3T / Roller++
SageXG SageXG SageXG SageXG SageXG SageXG
Backgame 2-11,0002.262.841.011.641.031.220.611.670.410.980.380.93
Backgame 3-11,0012.222.220.880.950.670.720.660.910.340.590.320.48
Backgame 3-21,0082.072.390.911.310.780.990.650.950.440.610.250.51
Backgame 4-11,0011.771.830.780.820.600.530.550.690.240.470.190.45
Backgame 4-21,0002.161.960.731.050.690.550.630.790.360.610.270.43
Backgame 5-11,0031.321.770.660.760.460.640.490.600.260.410.230.32
Backgame 5-21,0021.531.600.490.820.480.630.530.630.330.410.240.30
Backgame 4-31,0021.692.130.740.800.550.580.520.760.240.550.190.44
Backgame 5-31,0031.862.131.020.890.580.630.680.810.350.460.210.44
Backgame 5-41,0012.452.740.931.150.730.780.760.970.470.550.300.49
Contención3,2704.7314.622.5411.252.0510.372.297.761.307.851.056.16
Snake97821.0039.9221.4236.6423.5336.1711.1932.998.4232.385.8532.24
Backgame masivo2,1034.335.762.564.442.173.681.913.141.392.751.092.64
Open Sage eXtreme Gammon PR frente a la referencia de rollout de cada familia; cuanto más bajo, mejor; se resalta el mejor motor de cada par.
Agregando los diez backgames clásicos (10.021 decisiones), el PR de Sage es 1.93 a 2-ply, 0.82 a 3-ply y 0.26 a 3T, con los errores graves cayendo de 28 a ninguno. Las partidas de contención y los backgames masivos son de tres a cuatro veces más difíciles en todos los niveles — 1.05 y 1.09 a 3T — y el snake está en una categoría aparte: 21.00 a 2-ply y todavía 5.85 a 3T. Es además la única familia en la que añadir ply no ayuda de forma fiable mientras que los niveles de rollout truncado sí, que es justo el aspecto de una familia de decisiones de "mantener o soltar": la elección depende de cómo se desarrolla una contención larga, y solo la simulación llega a eso. Lee la fila del snake como una medida de cuán lejos está la familia de posiciones de estar resuelta, no como una clasificación de los niveles de Sage.
XG en estos benchmarks. Sage va por delante en las trece familias y en todos los niveles agregados: en los diez backgames 1.93 frente a 2.16 a 2-ply y 0.26 frente a 0.48 a 3T. El margen se amplía con la dificultad de la familia — a 3T, contención 1.05 frente a 6.16, backgames masivos 1.09 frente a 2.64 y el snake 5.85 frente a 32.24. Solo cuatro de las 78 celdas individuales van en sentido contrario, todas backgames sueltos de 2-ply a 4-ply donde ambos motores ya están por debajo de 1.1. XG no tiene interfaz programática, así que sus decisiones se reproducen mediante Batch Analyze a partir de exportaciones nativas .xg exportaciones (véase el Apéndice).
04
Método dos

Posiciones en disputa

El método del PR de rollout puntúa a ambos motores frente a una referencia compartida. Una pregunta más aguda y directa es esta: en juego realista, ¿dónde discrepan realmente los dos motores sobre la mejor jugada — y, cuando lo hacen, cuál tiene razón?

La respondemos sobre las decisiones más difíciles de partidas ilimitadas del método uno — las posiciones con rollout, cada una de las cuales lleva ahora tanto un rollout completo de Sage como un rollout completo de XG. Entre ellas buscamos cada decisión en la que Sage 3T y XG Roller++ eligieron distinto, y preguntamos qué elección prefirió cada rollout. Tener ambos rollouts es la clave: cada discrepancia se juzga frente al rollout de Sage y al del propio XG, de modo que la respuesta nunca depende de confiar en la verdad de un solo motor.

  • Partir del benchmark de partidas ilimitadas con rollout — las decisiones más difíciles, cada una resuelta con un rollout completo de Sage.
  • Hacer que XG produzca su propio rollout completo de las mismas posiciones (su Batch Rollout): una segunda verdad de referencia independiente.
  • Quedarse con las decisiones en las que Sage 3T y XG Roller++ discrepan, y puntuar la elección de cada motor frente a la mejor jugada o acción del cubo de cada rollout.
  • Informar sobre el conjunto común — discrepancias en las que las elecciones de ambos motores fueron evaluadas por ambos rollouts — para que las dos comparaciones cubran posiciones idénticas.

Resultados

En las posiciones de partidas ilimitadas con rollout — las decisiones más difíciles del estudio — los dos motores discrepan en 1286 jugadas de fichas y 80 decisiones de cubo. Cada panel muestra con qué frecuencia cada motor coincidió con la mejor decisión del rollout — puntuado frente al propio rollout de XG y frente al rollout de Sage, por turno.

Juego de fichas

Donde Sage 3T y XG Roller++ eligieron jugadas distintas
5,687
decisiones de fichas con rollout
1,286
discrepancias
1,139
puntuadas (conjunto común)
Coincidió con la mejor jugada — según el propio rollout de XG
Error medio de equidad — Sage 3T 0,0030 · XG Roller++ 0,0030  (PR 1,51 vs 1,49)
Coincidió con la mejor jugada — según el rollout de Sage
Error medio de equidad — Sage 3T 0,0023 · XG Roller++ 0,0040  (PR 1,14 vs 1,98)
Sage 3T XG Roller++ Ninguno

Decisiones de cubo

Donde Sage 3T y XG Roller++ eligieron acciones del cubo distintas
282
decisiones de cubo con rollout
80
discrepancias
Coincidió con la mejor acción — según el propio rollout de XG
Error medio de equidad — Sage 3T 0,0110 · XG Roller++ 0,0074  (PR 5,50 vs 3,69)
Coincidió con la mejor acción — según el rollout de Sage
Error medio de equidad — Sage 3T 0,0058 · XG Roller++ 0,0102  (PR 2,88 vs 5,08)
Sage 3T XG Roller++
Solo 80 discrepancias de cubo en total — una muestra pequeña, así que lee este panel como indicativo más que como concluyente.
En el juego de fichas — la gran mayoría de las discrepancias — cada rollout se pone del lado de su propio motor sobre cuál es la mejor jugada: según el rollout de XG, XG Roller++ coincide con la mejor jugada más a menudo (52,2 % frente a 37,7 %); según el rollout de Sage, lo hace Sage 3T (50,0 % frente a 38,1 %). Medidos por cuánta equidad regala una elección en disputa, los dos están igualados según el rollout de XG (0,0030 cada uno) y Sage 3T está más cerca según el de Sage (0,0023 frente a 0,0040). Las discrepancias de cubo son mucho más raras y están repartidas: Sage 3T coincide más a menudo con la acción del cubo que da el rollout con ambos rollouts, pero según el rollout de XG sus fallos son los más caros.
Por qué importan dos rollouts. Un resultado con una sola referencia siempre invita a la pregunta "¿la verdad de quién?". Aquí los dos rollouts provienen de motores independientes y, en las posiciones donde dos motores fuertes difieren, también difieren entre sí, cada uno inclinándose hacia el motor que lo ejecutó. Las posiciones en disputa no separan a Sage 3T y XG Roller++.
05
Método tres

Acuerdo en matches reales

Los dos primeros métodos preguntan qué motor es más fuerte. Una tercera pregunta es igual de importante para quien usa un motor para estudiar su propio juego: si analizas un match real en XG, anotas tu Performance Rating y luego analizas exactamente el mismo match en Sage, ¿cuánto se parecen los dos índices? Un jugador que ha pasado años construyendo una intuición de lo que significa un PR dado en XG debería obtener esencialmente el mismo número de Sage.

Para comprobarlo directamente, tomamos una gran colección de matches reales de torneo que ya habían sido analizados en XG, volvimos a analizar cada uno desde cero en Sage y comparamos el Performance Rating que cada motor asignó a cada jugador.

Los matches

Los archivos de los matches proceden de tres torneos de 2026, todos matches a 7 puntos, cedidos generosamente por Máté Fehér — ya analizados en eXtreme Gammon, exactamente como un jugador de competición estudiaría sus propias partidas.

UBC Texas 2026
100
matches analizados
UBC Istanbul 2026
146
matches analizados
UBC Japan 2026
44
matches analizados

290 matches y 580 índices individuales de jugador en total. Un match más se dejó fuera por tratarse de una transcripción corrupta.

Ajustes de evaluación equiparados

Cada match se volvió a analizar en Sage con una base a 3-ply y una pasada experta a 3T — un rollout truncado de 360 caminos — aplicada a las decisiones en las que la jugada real del jugador discrepaba de la mejor a 3-ply. Esto refleja un análisis fuerte de XG (un ply base para las decisiones claras, escalando a un rollout truncado para las ajustadas), a fuerza equiparada: Sage 3P ≈ XG 3-ply y Sage 3T ≈ XG Roller++ (ver la sección 2). Cada motor calcula después un PR por jugador a partir de sus propias evaluaciones — el número que un usuario ve en cada app.

Resultados

Agrupando los 580 índices de jugador, los dos motores coinciden casi exactamente. La diferencia media es estadísticamente indistinguible de cero, y la dispersión de esa diferencia es pequeña frente a la dispersión del propio PR.

+0.002
Diferencia media (PR)
Estadísticamente indistinguible de cero — intervalo de confianza del 95 % ±0,03, p = 0,90.
0.37
Desv. estándar de la diferencia
Pequeña frente a la dispersión de 2,08 del propio PR: la discrepancia en cualquier índice individual es menor en relación con cuánto varía el PR.
0.98
Correlación de los índices (r)
Sage y XG califican a los mismos jugadores casi de forma idéntica.
Performance Rating por jugador XG Sage DiferenciaSage − XG
Media 4.36 4.36 +0.002
Desviación estándar 2.08 2.10 0.37
Rango del 95 % 1.52 – 9.36 1.44 – 9.67 −0.76 – +0.74
En la práctica, un jugador que analice un match en Sage verá — en la gran mayoría de los casos — esencialmente el mismo Performance Rating que le daría XG. Como medida de lo bien que se jugó un match, los dos motores son intercambiables.
06
Conclusión

Dos motores fuertes, muy parejos

En los estudios de fuerza, Open Sage 3T y XG Roller++ son dos de las evaluaciones de backgammon más fuertes disponibles, y están próximas entre sí. El estudio del PR frente a rollouts — realizado tanto para juego ilimitado como para partidos a 5 puntos — encuentra a Sage más fuerte en todos los niveles equivalentes salvo 3-ply, donde los dos motores están dentro del ruido, con la ventaja más clara en los niveles de rollout truncado. Si se reconstruye para las partidas ilimitadas con el propio análisis de XG como referencia, la clasificación se invierte: XG va por delante en todos los niveles equivalentes salvo 2T, donde los dos empatan. El estudio de posiciones en disputa, que toma las posiciones en las que los dos motores discrepan al nivel de evaluación más fuerte y las puntúa frente a los rollouts de ambos, queda igualado en juego de fichas — cada rollout favorece al motor que lo ejecutó — y los desacuerdos de cubo son demasiado escasos y repartidos para decidir.

El resumen honesto, entonces, es que los dos motores juegan a un nivel muy similar y muy alto, y que cada uno puntúa mejor frente a su propio análisis: con la referencia de Sage, sus rollouts truncados aciertan decisiones que los niveles Roller de XG fallan; con la de XG ocurre lo contrario; y en las posiciones donde los dos motores discrepan abiertamente, el rollout de ninguno deja al otro claramente por detrás. Es en los benchmarks de familia — backgames, partidas de contención y el snake — donde los dos motores se separan: medidos con el mismo criterio y en todos los niveles equivalentes, Sage va por delante en las trece, y por un factor de tres o más en las partidas de contención y el snake.

Y el tercer estudio responde a la pregunta que un usuario de Sage se plantea de verdad: en 290 matches reales de torneo ya calificados por XG, Sage produce esencialmente el mismo Performance Rating — la diferencia media entre el índice de Sage y el de XG para un jugador es estadísticamente indistinguible de cero, y la dispersión de esa diferencia es pequeña frente a la dispersión del propio PR. Ya sea la prueba la fuerza frente a una verdad obtenida por rollout o el simple acuerdo sobre cómo se jugó una partida real, Open Sage y XG llegan al mismo sitio.

Probar Backgammon Sage Pro Volver al inicio
A
Apéndice

Reproducir estos resultados

Open Sage se publica como código abierto, y el pipeline completo detrás de ambos métodos se incluye en el repositorio del motor. Todo lo que sigue se ejecuta únicamente con el paquete bgsage y una compilación local de su motor — no se requieren servicios externos, conjuntos de datos ni infraestructura. La única dependencia manual es el propio eXtreme Gammon, usado para regenerar las columnas de XG, ya que XG no tiene interfaz programática.

github.com/markbgsage/bgsage Motor Open Sage · MPL-2.0 · ejecuta todos los scripts desde la raíz del repositorio
Requisitos previos. Compila el motor bgsage (la extensión bgbot_cpp ) siguiendo las instrucciones del repositorio para tu plataforma. Reproducir cualquier columna de XG requiere además eXtreme Gammon (Windows) para su paso de Batch Analysis. Cada script resuelve sus rutas dentro del repositorio, así que ejecútalos desde la raíz de bgsage/ .

Reproducirlo con Claude Code

No hace falta que manejes el pipeline a mano. Claude Code — la herramienta agéntica de programación en línea de comandos de Anthropic — puede compilar el motor y ejecutar los benchmarks por ti. Apúntala a una copia del repositorio y describe lo que quieres; recorre los mismos pasos que se detallan a continuación:

›“Compila este motor y luego puntúa Sage 3T y Sage 3P frente al benchmark incluido y muéstrame el PR, el PR de fichas y el PR de cubo de cada uno.”
›“Reproduce la tabla de PR de rollout: puntúa cada nivel de Sage — de 1-ply a 4-ply, más 1T, 2T y 3T — frente a data/money_benchmark/benchmark.json.gz e imprímela como una tabla que pueda comparar con el estudio.”
›“Reconstruye desde cero el benchmark de referencia con las tres pasadas de construcción y luego puntúa Sage 3T frente a él.”
›“Tengo mi propio bot en ./mybot — para cada decisión del benchmark incluido, evalúala con mi bot y calcula su PR frente a las equidades de referencia.”

Método uno — PR de rollout

El benchmark — el conjunto escalonado de evaluaciones fiables — se construye y se puntúa con un único script, scripts/benchmark_money.py. Hay dos formas de entrar.

A

Puntuar frente al conjunto de datos incluido

Sin reconstrucción · validar la tabla o puntuar un motor nuevo

El repositorio incluye el benchmark ensamblado como data/money_benchmark/benchmark.json.gz (el JSON sin comprimir supera el límite de tamaño de archivo de GitHub; los scripts leen el gzip de forma transparente). Puntuar cualquier nivel de Sage reproduce su fila de la tabla de la sección 3:

# lower PR is better
python scripts/benchmark_money.py score --level 3ply        # Sage 3P
python scripts/benchmark_money.py score --level truncated3  # Sage 3T
# --level: 1ply 2ply 3ply 4ply | truncated1/2/3 | rollout

Para puntuar un motor completamente distinto, aplica la misma regla que el script usa internamente: para cada decisión del conjunto de datos, toma la elección de tu motor y compara su equidad con la equidad de referencia (“rollout”) almacenada — el error medio × 500 es su PR.

B

Reconstruir la verdad de referencia desde cero

Volver a derivar cada decisión · con semilla, así que se reproduce

Tres pasadas adaptativas recrean el conjunto de datos. Las partidas llevan semilla (500 partidas desde la semilla 1), así que las decisiones y las equidades de referencia salen iguales:

# 1. simulate 500 Sage-3P self-play games (+ XG transcripts)
python scripts/benchmark_money.py build --stages pass1 --n-games 500 --workers 6
# 2. re-evaluate every decision within 0.05 at 3T
python scripts/benchmark_money.py build --stages pass2 --n-threads 16
# 3. roll out every decision still within 0.02
python scripts/benchmark_money.py build --stages pass3 --n-threads 16

La pasada 3 escribe data/money_benchmark/benchmark.json (y su .gz); puntúalo exactamente como en la opción A. Omitir --stages ejecuta las tres pasadas en orden.

Reproducir las columnas de XG

XG no tiene API, así que sus resultados salen del Batch Analysis de XG. La pasada 1 escribe transcripciones importables en XG en data/money_benchmark/xg/ — no se incluyen, así que regenéralas con la pasada 1 si partiste solo del conjunto de datos.

  1. En XG, analiza por lotes (Batch Analyze) la carpeta xg/ con un nivel personalizado — decisiones a 3-ply, subiendo al nivel bajo prueba en las discrepancias — con Save Games after analyze marcado. XG escribe un .xg por partida.
  2. Ejecuta python scripts/benchmark_pr_xg_levels_all.py --benchmark money, que lee la decisión principal de XG por posición a cada nivel analizado de los archivos .xg y la puntúa frente a las mismas equidades de referencia, imprimiendo el mismo desglose de PR y registrando junto a él las elecciones de XG.

La tabla de partidas ilimitadas con la referencia de XG de la Sección 3 — y el estudio de posiciones en disputa — necesitan en cambio los rollouts de XG de las posiciones más difíciles. Ejecuta el Batch Rollout de XG sobre esas posiciones (con Save Games marcado); python scripts/xg_benchmark_report.py los analiza. La tabla con la referencia de XG vuelve a puntuar después cada nivel a partir de las elecciones que registró cada script de puntuación. Véase el Método Dos más abajo.

# XG-reference table: harvest XG Roller++ (the 3T tier), then re-score every level;
# Sage's picks come from benchmark_money.py score --level <level> --model stage11
python scripts/xg_harvest_results.py --benchmark money --set rollerpp
python scripts/benchmark_pr_xg_reference_all.py --sage-suffix stage11

Modalidad match

El estudio de matches a 5 puntos se reproduce del mismo modo con scripts/benchmark_match.py, el gemelo para matches de benchmark_money.py — la longitud del match y el número de matches son argumentos, y el marcador del match se propaga por todas las evaluaciones. Su verdad de referencia se incluye como data/match_benchmark/5pt/benchmark.json.gz.

# score against the shipped match dataset (no rebuild)
python scripts/benchmark_match.py score --match-length 5 --level truncated3
# or rebuild: 130 seeded 5-pt matches, three adaptive passes
python scripts/benchmark_match.py build --match-length 5 --n-matches 130 --stages pass1 --workers 6
python scripts/benchmark_match.py build --match-length 5 --n-matches 130 --stages pass2 --n-threads 16
python scripts/benchmark_match.py build --match-length 5 --n-matches 130 --stages pass3 --n-threads 16
# XG columns: batch-analyze data/match_benchmark/5pt/xg/ per level, then
python scripts/benchmark_pr_xg_levels_all.py --benchmark match --match-length 5

Método dos — Posiciones en disputa

El estudio de discrepancias parte del mismo benchmark de partidas ilimitadas construido para el método uno, cruzado con el rollout completo del propio XG de las posiciones más difíciles. La única dependencia manual es el Batch Rollout de XG; un único script hace el resto.

Partidas ilimitadas

  1. Construye el benchmark de partidas ilimitadas (método uno, opción B). La pasada 1 también escribe las transcripciones importables en XG en data/money_benchmark/xg/.
  2. En XG, ejecuta el Batch Rollout de esas posiciones con Save Games after analyze marcado, para que cada decisión con rollout lleve las equidades del propio rollout de XG en los archivos .xg correspondientes.
  3. Recolecta e informa:
python scripts/xg_benchmark_report.py
python scripts/xg_dispute_analysis.py --sage-picks data/money_benchmark/scores/sage_truncated3.picks.jsonl

El primero convierte los rollouts de XG en data/money_benchmark/xg_results/rollout.jsonl; el segundo imprime el informe de posiciones en disputa — cada discrepancia puntuada frente a los rollouts de Sage y XG por turno — a partir de las elecciones registradas de Sage 3T.

La modalidad match aún no está cubierta por este método: requiere un rollout completo de XG de las posiciones de los matches, que no hemos ejecutado. La fuerza en matches queda cubierta, en cambio, por el estudio de PR de rollout (sección 3) y el estudio de acuerdo en matches reales (sección 5).

Partidas directas

Sage y XG también pueden jugar directamente entre sí, tomando las jugadas de XG de su propio análisis. Sage juega ambos lados de una partida ilimitada; la transcripción se analiza por lotes en XG; la primera decisión del oponente que difiere de la mejor opción de XG se sustituye por la jugada de XG y la partida se repite desde ahí con dados nuevos, hasta que cada jugada del oponente es la que XG habría hecho. El ejecutor juega una serie de esas partidas (las semillas continúan desde logs/sage_vs_xg.txt) e imprime los puntos medios por partida con su error estándar:

python scripts/run_sage_vs_xg_games.py 100 --level 3P   # Sage 3P vs XG; levels 1P-4P, 1T-3T
python scripts/play_sage_vs_xg.py 3P --seed 7             # one game, iterations under logs/play_sage_vs_xg/

XG debe estar en ejecución en el escritorio de Windows: cada iteración controla su cuadro de diálogo Batch Analyze mediante scripts/xg_batch_analyze.py, un agente Anthropic Computer Use (define ANTHROPIC_API_KEY), que toma el control del ratón y el teclado durante aproximadamente un minuto por iteración. Una partida converge en unas pocas iteraciones; el veredicto "too good to double" de XG cuenta como no doblar.

Backgames, juegos de contención y el snake

Los trece benchmarks de familias viven bajo backgame_ref_positions/benchmark/ — un archivo <family> starting.txt de posiciones semilla y un <family> rollout.jsonl de referencia cada uno — y los puntúa scripts/score_backgame_pr.py, que informa del PR junto con la proporción de elecciones de calidad rollout.

python scripts/score_backgame_pr.py --category "21 backgame" --level truncated3
python scripts/score_backgame_pr.py --category containment --level 3ply
# XG: export every decision as a one-decision native .xg game, then per level (XG running): analyse, wait, score
python scripts/export_folder_benchmark_xg.py generate
python scripts/xg_folder_batch.py stamp
python scripts/xg_folder_batch.py analyze --level xg3ply   # drives XG's Batch Analyze dialog (pywinauto)
python scripts/xg_folder_batch.py wait --level xg3ply
python scripts/xg_folder_batch.py score --level xg3ply
Open Sage se distribuye bajo licencia MPL-2.0. Los benchmarks incluidos son exactamente las referencias que hay detrás de las tablas de la Sección 3; tanto la comparación con la referencia de XG como los resultados de posiciones en disputa se regeneran a partir de ellos una vez que el Batch Rollout de XG ha producido los archivos .xg correspondientes.