Studio sul motore · Prestazioni del bot

Open Sage alla prova contro eXtreme Gammon

Un confronto quantitativo tra il motore di valutazione Open Sage — il motore di Backgammon Sage Pro — e il motore del bot di eXtreme Gammon (XG).

Sintesi

Confrontiamo il motore Open Sage con eXtreme Gammon (XG) a livelli di valutazione equivalenti — valutazione diretta della rete neurale, ricerca multi-ply e rollout troncati. Poiché XG non espone alcuna interfaccia programmatica, lo valutiamo tramite la sua funzione Batch Analysis. Usiamo tre metodi complementari. Il primo costruisce un insieme stratificato di valutazioni di riferimento — fidandosi delle valutazioni rapide dove la scelta è chiara e portando i casi incerti a rollout completi — e assegna a ciascun motore un Performance Rating (PR) rispetto a quel riferimento, su 500 partite illimitate (17.535 decisioni) e 130 match da cinque punti (18.292 decisioni). Per le partite illimitate ricostruiamo poi l’intero confronto usando come riferimento l’analisi stratificata di XG stesso — lo specchio esatto. Il secondo isola le posizioni illimitate su cui Sage 3T e XG Roller++ sono realmente in disaccordo e giudica ciascuna rispetto ai rollout completi di entrambi i motori. Lo stesso metodo di riferimento e punteggio è applicato a tredici benchmark di backgame, partite di contenimento e snake — le posizioni che i motori hanno storicamente giocato peggio. Negli studi di forza i due motori sono vicini: con il riferimento di Sage, Sage è in vantaggio ai livelli di rollout troncato su cui fa affidamento la maggior parte degli utenti; con quello di XG, XG è in vantaggio o alla pari. Il terzo metodo ribalta la domanda: su 290 match reali di torneo già analizzati in XG, rianalizziamo ciascuno in Sage e confrontiamo il Performance Rating che i due motori assegnano a ogni giocatore. I due rating vanno di pari passo: su 580 rating di giocatori hanno una correlazione del 98%, e la differenza media tra loro è di +0.002 PR — statisticamente indistinguibile da zero.

01
Introduzione

Perché misurarsi con XG?

eXtreme Gammon (XG) è un riferimento standard per l’analisi computerizzata del backgammon, e il suo motore di valutazione è generalmente considerato uno dei più forti disponibili. Qualsiasi nuovo motore che voglia essere preso sul serio deve rispondere a una domanda semplice: come si colloca rispetto a XG? Questo studio si propone di rispondere in modo quantitativo per Open Sage, il motore a rete neurale dietro Backgammon Sage Pro.

Il nostro obiettivo era confrontare le valutazioni di Open Sage con quelle di XG a livelli di sforzo comparabili. L’esperimento naturale — far giocare i motori l’uno contro l’altro per molti milioni di partite e contare il risultato — non è praticabile: l’app desktop di XG non espone alcuna interfaccia programmatica, quindi passare posizioni e mosse da un motore all’altro è un processo manuale, a colpi di clic. Raggiungere un campione abbastanza grande da risolvere le piccole differenze tra due motori forti richiederebbe troppo tempo.

Usiamo invece la funzione Batch Analysis di XG, che può valutare centinaia di partite trascritte in un’unica passata non presidiata. Open Sage gioca entrambi i lati di molte partite; ogni partita viene esportata in un formato di testo standard che XG può importare; XG analizza il tutto; e noi ne estraiamo i verdetti. Su questa base comune applichiamo due metodi distinti, descritti nella Sezione 3 e nella Sezione 4.

Un terzo studio (Sezione 5) mette del tutto da parte le simulazioni e lavora su match di torneo reali analizzati in XG. Il suo scopo è diverso: invece di chiedersi quale motore sia più forte, verifica se un giocatore che analizza un match in Sage ottiene lo stesso Performance Rating che gli darebbe XG — così che anni di intuizione su cosa significhi un PR in XG si trasferiscano direttamente a Sage.

02
Contesto

Livelli di valutazione

Entrambi i motori possono valutare una posizione a diverse profondità, scambiando precisione con velocità. Capire questi livelli è essenziale per leggere i risultati, perché il confronto è sempre tra livelli equivalenti dei due motori.

Valutazione diretta (1-ply). L’output grezzo della rete neurale per una posizione, senza ricerca in avanti. È l’impostazione più veloce e la base su cui è costruito ogni livello più profondo. (Seguiamo la convenzione di XG, in cui 1-ply indica la valutazione grezza della rete.)

Ricerca multi-ply (2, 3, 4-ply). Il motore guarda diversi turni avanti, considerando le risposte dell’avversario e facendo la media sui possibili tiri di dadi a ogni passo, con una valutazione grezza della rete alla fine di ogni variante. Ogni ply in più è più preciso e sensibilmente più costoso.

Rollout troncati (1T, 2T, 3T). Invece di cercare fino a una profondità fissa, il motore gioca molte brevi partite simulate, le tronca dopo pochi turni e valuta la posizione risultante con una ricerca multi-ply. La riduzione della varianza elimina gran parte della fortuna nei dadi campionati. Sono le impostazioni “Roller” di XG: sono più forti della ricerca a profondità fissa e restano molto più economiche di un rollout completo.

Rollout completo. Molte partite simulate giocate fino alla fine. Eseguito con un volume sufficiente e con riduzione della varianza, un rollout completo è quanto di più vicino alla verità un motore di backgammon possa produrre, e in tutto questo studio lo usiamo come standard di riferimento.

Livelli equivalenti: Sage e XG

Famiglia Sage Equivalente XG Cosa fa
Diretta 1-ply 1-ply (valutazione grezza) Una singola valutazione della posizione da parte della rete neurale — nessuna ricerca in avanti.
Multi-ply 2P · 3P · 4P 2-ply · 3-ply · 4-ply Esplora le risposte dell’avversario per diversi turni di profondità, facendo la media sui dadi.
Rollout troncato 1T · 2T · 3T Roller · Roller+ · Roller++ Molte brevi partite simulate, troncate dopo 5–7 turni e valutate in multi-ply, con riduzione della varianza. 3T/Roller++ usano decisioni a 3-ply; 2T/Roller+ a 2-ply; 1T/Roller a 1-ply.
Rollout completo Rollout Rollout Partite simulate giocate fino alla fine — la “verità” di riferimento in questo studio.
Performance Rating (PR). In tutto lo studio la precisione di un motore è riassunta come PR — l’errore medio di equity per decisione, moltiplicato per 500, misurato rispetto al riferimento ottenuto tramite rollout. Un PR di 0 significa accordo perfetto con la verità; più basso è meglio.
03
Metodo uno

PR da rollout

Il primo metodo valuta ogni motore su un insieme fisso di decisioni di cui abbiamo stabilito la “vera” giocata migliore nel modo più accurato possibile. Segue lo stesso approccio del noto studio XG del 2012 che confrontava XG con diversi altri bot.

Abbiamo iniziato simulando 500 partite illimitate di Sage 3P contro se stesso. Un livello moderatamente forte come il 3P produce una distribuzione realistica di posizioni in ogni piano di gioco — corsa, attacco, prime, ancoraggio — che è esattamente la varietà su cui vogliamo fare il test. Abbiamo poi ripetuto l’intero studio una seconda volta su 130 match a cinque punti, dove il punteggio cambia il valore di ogni decisione; i risultati di entrambi sono riportati sotto.

Costruire la verità di riferimento

Stabilire la vera giocata migliore per ogni decisione con un rollout completo sarebbe enormemente costoso — e inutile, perché la maggior parte delle decisioni non è serrata. Costruiamo quindi il riferimento in tre passate successive, spendendo lo sforzo del rollout solo dove la scelta è davvero in dubbio. La stessa ricetta si applica a entrambi gli insiemi di dati; ogni passata risolve le decisioni che può decidere con sicurezza e passa le altre a quella successiva:

Passata 1 · Sage 3P

Fidarsi del 3-ply quando la scelta è chiara

Ogni decisione viene valutata a 3-ply. Dove la mossa migliore supera la seconda di più di 0.05 di equity, il verdetto del 3P è accettato come verità e la decisione è risolta.

0.05
scarto di equity per risolvere
Le decisioni più serrate (entro 0.05) passano alla passata 2
Passata 2 · Sage 3T

Ricontrollare le decisioni serrate con un rollout troncato

Le decisioni rimaste vengono rivalutate a 3T. Dove il margine è ora più ampio di 0.02 di equity, il verdetto del 3T è accettato come verità.

0.02
scarto di equity per risolvere
Tutto ciò che resta entro 0.02 passa alla passata 3
Passata 3 · Rollout completo

Rollout delle decisioni più difficili

Tutto ciò che resta entro 0.02 viene risolto con un rollout completo di Sage: decisioni a 3P sia per il gioco delle pedine sia per le azioni del cubo, eseguito in lotti da 1,296 partite simulate finché l’intervallo di confidenza al 95% sull’equity scende sotto 0.005 — o fino a un tetto di 20,736 partite simulate (16 × 1,296). Le posizioni di backgame più lente hanno richiesto ben oltre un’ora ciascuna.

0.005
banda al 95% obiettivo

Il risultato è un riferimento stratificato in cui ogni decisione è risolta esattamente alla profondità che la sua difficoltà richiede. Abbiamo eseguito questa stessa ricetta in tre passate su entrambi gli insiemi di dati — le 500 partite illimitate e i 130 match a cinque punti — e la composizione dei livelli risultante è mostrata accanto ai risultati di ciascun insieme qui sotto.

Valutare un motore

Con in mano un insieme stratificato di valutazioni affidabili, valutare un motore qualsiasi è semplice: gli presentiamo ogni decisione del benchmark, registriamo l’errore di equity della mossa o dell’azione del cubo che sceglie rispetto alla verità, e riportiamo l’errore medio × 500 come PR. Lo stesso totale è suddiviso in PR del gioco delle pedine e PR del cubo, e ulteriormente per piano di gioco.

Valutare XG ha richiesto il passaggio in più descritto nell’introduzione. Poiché XG non ha API, abbiamo eseguito la sua Batch Analysis sulle trascrizioni delle 500 partite illimitate e dei 130 match con un livello personalizzato — decisioni a 3-ply, con passaggio al livello in esame ovunque ci fosse disaccordo — e abbiamo estratto la decisione preferita da XG per ogni posizione dai file .xg che produce, valutandole rispetto alle stesse equity di riferimento.

Partite illimitate — composizione della verità di riferimento

Sulle 500 partite illimitate, le tre passate hanno risolto 16,889 posizioni (17,535 decisioni) come segue:

Risolte a 3P  7,652 Risolte a 3T  3,260 Con rollout  5,977 Partite illimitate  16,889 posizioni · 17,535 decisioni

Partite illimitate — confronto diretto

I cinque livelli equivalenti, valutati su quelle 17,535 decisioni. Un PR più basso è meglio; il motore più forte di ogni coppia è evidenziato.

Sage 3T
Rollout troncato · decisioni a 3-ply · troncamento a 7 turni
0.23
vs
0.34
XG Roller++
Rollout troncato · decisioni a 3-ply · troncamento a 7 turni
Sage 3T avanti di 0.11 PR
Sage 2T
Rollout troncato · decisioni a 2-ply
0.27
vs
0.41
XG Roller+
Rollout troncato · decisioni a 2-ply
Sage 2T avanti di 0.14 PR
Sage 1T
Rollout troncato · decisioni a 1-ply · troncamento a 5 turni · 72 partite simulate
0.49
vs
0.53
XG Roller
Rollout troncato · decisioni a 1-ply · troncamento a 5 turni · 42 partite simulate
Sage 1T avanti di 0.04 PR
Sage 4P
Ricerca a 4-ply
0.43
vs
0.47
XG 4-ply
Ricerca a 4-ply
Sage 4P avanti di 0.04 PR
Sage 3P
Ricerca a 3-ply
0.60
vs
0.57
XG 3-ply
Ricerca a 3-ply
Sostanzialmente pari — XG 3-ply avanti di 0.03 PR

Partite illimitate — dettaglio completo

PR di ogni motore e livello testato, suddiviso per tipo di decisione e piano di gioco. Più basso è meglio.

Motore PR Pedine Cubo Corsa pura Corsa Attacco Prime Ancoraggio
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 e 1P non hanno un equivalente XG in questa prova e sono riportati a titolo di riferimento.
Le valutazioni di Sage sono più forti della valutazione XG equivalente a ogni livello corrispondente tranne il 3-ply, dove XG è avanti di 0.03 PR — una differenza dentro il rumore. I due motori sono vicini, e ai livelli di rollout troncato su cui si affida la maggior parte degli utenti Sage mantiene un vantaggio netto: 0.23 contro lo 0.34 di Roller++, e 0.27 contro lo 0.41 di Roller+.

Partite illimitate — valutate rispetto al riferimento di XG

Tutti i numeri qui sopra valutano i motori rispetto al riferimento stratificato di Sage. L’obiezione ovvia è il vantaggio di giocare in casa — Sage viene misurato contro i propri rollout. Abbiamo quindi costruito lo specchio esatto: le stesse 500 partite e le stesse decisioni, ma con l’analisi di XG stesso come verità a ogni livello. XG 3-ply risolve le decisioni del livello 3P, XG Roller++ quelle del livello 3T e il rollout completo di XG quelle sottoposte a rollout — l’analogo livello per livello, in XG, del riferimento Sage. Ogni motore viene poi rivalutato rispetto a quello.

Motore PR Pedine Cubo Corsa pura Corsa Attacco Prime Ancoraggio
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 Riferimento: XG 3-ply (livello 3P) · XG Roller++ (livello 3T) · rollout completo di XG (livello rollout).
Rispetto al riferimento di XG stesso la classifica si capovolge: XG è avanti a ogni livello corrispondente tranne il 2T, dove Sage 2T e XG Roller+ sono alla pari a 0.30, e XG Roller++ ottiene 0.21 contro lo 0.28 di Sage 3T. Entrambe le tabelle hanno la stessa distorsione strutturale. Quasi due terzi delle decisioni sono risolte dal 3-ply o dal rollout troncato del riferimento stesso, e chi risolve le decisioni di un livello vi ottiene un punteggio quasi nullo — qui XG 3-ply e XG Roller++, nella tabella precedente Sage 3P e Sage 3T. Le decisioni sottoposte a rollout sono il test più equo, perché lì a giudicare è un rollout completo e non uno dei livelli in esame: il rollout di XG mette Roller++ di poco davanti a Sage 3T (0.56 contro 0.60), mentre quello di Sage mette Sage 3T nettamente davanti (0.51 contro 0.76).
Due riferimenti, due verdetti. Con il riferimento di Sage, Sage 3T è davanti a XG Roller++ per 0.23 a 0.34; con quello di XG, Roller++ è davanti per 0.21 a 0.28. Al livello più alto ciascun motore risulta avanti rispetto alla propria analisi — lo stesso schema che lo studio delle posizioni contese (Sezione 4) trova dove i due motori sono apertamente in disaccordo. I due motori sono molto vicini, e quale dei due sia in testa dipende da quale analisi viene presa come verità.

Gioco a match — composizione della verità di riferimento

L’insieme dei match esegue le stesse tre passate, con un’aggiunta: il punteggio away di ciascun giocatore e il flag Crawford vengono propagati in ogni valutazione, così la verità è calcolata nello spazio delle match equity (MWC) rispetto al punteggio corretto. Sui 130 match a cinque punti, le passate hanno risolto 17,892 posizioni (18,292 decisioni) come segue:

Risolte a 3P  7,522 Risolte a 3T  3,460 Con rollout  6,910 Gioco a match  17,892 posizioni · 18,292 decisioni

Gioco a match — confronto diretto

I cinque livelli equivalenti, valutati su quelle 18,292 decisioni. Un PR più basso è meglio; il motore più forte di ogni coppia è evidenziato.

Sage 3T
Rollout troncato · decisioni a 3-ply · troncamento a 7 turni
0.23
vs
0.36
XG Roller++
Rollout troncato · decisioni a 3-ply · troncamento a 7 turni
Sage 3T avanti di 0.13 PR
Sage 2T
Rollout troncato · decisioni a 2-ply
0.26
vs
0.44
XG Roller+
Rollout troncato · decisioni a 2-ply
Sage 2T avanti di 0.18 PR
Sage 1T
Rollout troncato · decisioni a 1-ply · troncamento a 5 turni · 72 partite simulate
0.47
vs
0.51
XG Roller
Rollout troncato · decisioni a 1-ply · troncamento a 5 turni · 42 partite simulate
Sage 1T avanti di 0.04 PR
Sage 4P
Ricerca a 4-ply
0.41
vs
0.46
XG 4-ply
Ricerca a 4-ply
Sage 4P avanti di 0.05 PR
Sage 3P
Ricerca a 3-ply
0.56
vs
0.54
XG 3-ply
Ricerca a 3-ply
Sostanzialmente pari — XG 3-ply avanti di 0.02 PR

Gioco a match — dettaglio completo

PR di ogni motore e livello testato sull’insieme dei match a 5 punti, suddiviso per tipo di decisione e piano di gioco. Più basso è meglio.

Motore PR Pedine Cubo Corsa pura Corsa Attacco Prime Ancoraggio
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 e 1P non hanno un equivalente XG in questa prova e sono riportati a titolo di riferimento.
I risultati sui match rispecchiano lo studio sulle partite illimitate: Sage è più forte della valutazione XG equivalente a ogni livello corrispondente tranne il 3-ply, dove XG è avanti di 0.02 PR — ben dentro il rumore. Il vantaggio più netto di Sage è di nuovo ai livelli di rollout troncato (3T e 2T) su cui si affida la maggior parte degli utenti: 0.23 contro lo 0.36 di Roller++ e 0.26 contro lo 0.44 di Roller+.

Backgame, giochi di contenimento e lo snake

Le partite ordinarie giocate dal motore contro se stesso producono raramente un backgame profondo, un gioco di contenimento o un prime nella metà lontana che trattiene una sola pedina attardata, quindi gli insiemi delle partite illimitate e dei match dicono poco su come un motore li gioca — e sono le posizioni in cui i motori sono stati storicamente più deboli. Tredici benchmark di famiglie di posizioni li misurano direttamente, ciascuno costruito come il benchmark illimitato — decisioni reali, ognuna con un riferimento di qualità rollout — ma con le decisioni tratte dall’interno della famiglia:

  • I dieci backgame classici, che prendono il nome dai due punti che il giocatore di backgame tiene nella tavola interna avversaria — il backgame 2‑1 tiene i punti 2 e 1 dell’avversario, il 5‑4 i punti 5 e 4, e così via. Ciascuno contiene circa 1,000 decisioni, registrate solo finché entrambe le ancore sono ancora tenute e chi le tiene è indietro nella corsa.
  • Giochi di contenimento, definiti da chi fugge: una parte ha portato fuori alcune pedine e ha da una a tre pedine che sono state colpite e devono percorrere tutta la tavola per tornare a casa, mentre l’altra parte, con la corsa persa, dispone ciò che le resta per continuare a colpirle.
  • Backgame massicci — tre o più ancore nella tavola interna avversaria, oppure due ancore con sette o più pedine indietro.
  • Lo snake — una sequenza di quattro o più punti fatti consecutivi nella metà avversaria della tavola che intrappola una sola pedina attardata mentre le altre pedine avversarie sono ammassate a casa. Un gioco di prime più che un backgame, e una delle forme più difficili da giocare nel backgammon.

Ogni famiglia parte da un piccolo insieme di posizioni seme. Sage gioca da quei semi partite illimitate contro se stesso a 3-ply, ogni decisione che si presenta mentre la posizione appartiene ancora alla famiglia viene registrata, e ogni decisione registrata viene sottoposta a rollout per produrre il suo riferimento — 5,184 partite simulate giocate fino alla fine, con decisioni di pedine e di cubo a 3-ply per le prime tre semimosse e a 2-ply da lì in avanti, riduzione della varianza attiva. Passaggi di completamento delle candidate hanno sottoposto a rollout ogni mossa effettivamente scelta da un motore in esame, così che ogni punteggio qui sotto sia calcolato rispetto a una candidata di qualità rollout. Una posizione di cubo in cui l’avversario possiede il cubo non è una decisione per il giocatore al tiro e non viene valutata.

Benchmark Decisioni 2-ply 3-ply 4-ply 1T / Roller 2T / Roller+ 3T / Roller++
SageXG SageXG SageXG SageXG SageXG SageXG
2-1 backgame1,0002.262.841.011.641.031.220.611.670.410.980.380.93
3-1 backgame1,0012.222.220.880.950.670.720.660.910.340.590.320.48
3-2 backgame1,0082.072.390.911.310.780.990.650.950.440.610.250.51
4-1 backgame1,0011.771.830.780.820.600.530.550.690.240.470.190.45
4-2 backgame1,0002.161.960.731.050.690.550.630.790.360.610.270.43
5-1 backgame1,0031.321.770.660.760.460.640.490.600.260.410.230.32
5-2 backgame1,0021.531.600.490.820.480.630.530.630.330.410.240.30
4-3 backgame1,0021.692.130.740.800.550.580.520.760.240.550.190.44
5-3 backgame1,0031.862.131.020.890.580.630.680.810.350.460.210.44
5-4 backgame1,0012.452.740.931.150.730.780.760.970.470.550.300.49
Contenimento3,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 massiccio2,1034.335.762.564.442.173.681.913.141.392.751.092.64
Open Sage eXtreme Gammon PR rispetto al riferimento di rollout di ciascuna famiglia; più basso è meglio; il migliore dei due motori di ogni coppia è evidenziato.
Aggregando i dieci backgame classici (10.021 decisioni), il PR di Sage è 1.93 a 2-ply, 0.82 a 3-ply e 0.26 a 3T, con gli errori gravi che scendono da 28 a nessuno. Le partite di contenimento e i backgame massicci sono da tre a quattro volte più difficili a ogni livello — 1.05 e 1.09 a 3T — e lo snake è in una categoria a sé: 21.00 a 2-ply e ancora 5.85 a 3T. È anche l'unica famiglia in cui aggiungere ply non aiuta in modo affidabile mentre i livelli di rollout troncato sì, ed è esattamente l'aspetto di una famiglia di decisioni "tenere o rilasciare": la scelta dipende da come si sviluppa un lungo contenimento, e solo la simulazione ci arriva. Leggi la riga dello snake come una misura di quanto la famiglia di posizioni sia lontana dall'essere risolta, non come una classifica dei livelli di Sage.
XG su questi benchmark. Sage è in testa in tutte e tredici le famiglie e a ogni livello aggregato: sui dieci backgame 1.93 contro 2.16 a 2-ply e 0.26 contro 0.48 a 3T. Il margine si allarga con la difficoltà della famiglia — a 3T, contenimento 1.05 contro 6.16, backgame massicci 1.09 contro 2.64 e lo snake 5.85 contro 32.24. Solo quattro delle 78 celle individuali vanno nell'altra direzione, tutte singoli backgame da 2-ply a 4-ply dove entrambi i motori sono già sotto 1.1. XG non ha un'interfaccia programmatica, quindi le sue decisioni vengono ripercorse tramite Batch Analyze a partire da esportazioni native .xg esportazioni (vedi l'Appendice).
04
Metodo due

Posizioni contese

Il metodo del PR da rollout valuta entrambi i motori rispetto a un riferimento comune. Una domanda più netta e più diretta è questa: nel gioco reale, dove i due motori sono davvero in disaccordo sulla mossa migliore — e quando lo sono, chi ha ragione?

Rispondiamo sulle decisioni illimitate più difficili del Metodo uno — le posizioni sottoposte a rollout, ognuna delle quali ora porta con sé entrambi i rollout completi, quello di Sage e quello di XG. Tra queste individuiamo ogni decisione in cui Sage 3T e XG Roller++ hanno scelto diversamente, e chiediamo quale scelta preferisse ciascun rollout. Avere entrambi i rollout è il punto essenziale: ogni disaccordo è giudicato con il rollout di Sage e con quello di XG, così la risposta non dipende mai dal fidarsi della verità di un solo motore.

  • Partire dal benchmark illimitato sottoposto a rollout — le decisioni più difficili, ognuna risolta con un rollout completo di Sage.
  • Far produrre a XG il proprio rollout completo delle stesse posizioni (il suo Batch Rollout) — una seconda verità di riferimento indipendente.
  • Tenere le decisioni in cui Sage 3T e XG Roller++ sono in disaccordo, e valutare la scelta di ciascun motore rispetto alla mossa o all’azione del cubo migliore secondo ciascun rollout.
  • Riportare i risultati sull’insieme comune — i disaccordi in cui le scelte di entrambi i motori sono state sottoposte a entrambi i rollout — così che i due confronti coprano esattamente le stesse posizioni.

Risultati

Sulle posizioni illimitate sottoposte a rollout — le decisioni più difficili dello studio — i due motori sono in disaccordo su 1,286 mosse e 80 decisioni sul cubo. Ogni pannello mostra quanto spesso ciascun motore ha indovinato la decisione migliore secondo il rollout — valutata rispetto al rollout di XG e a quello di Sage, a turno.

Gioco delle pedine

Dove Sage 3T e XG Roller++ hanno scelto mosse diverse
5,687
decisioni di pedine con rollout
1,286
disaccordi
1,139
valutati (insieme comune)
Mossa migliore indovinata — secondo il rollout di XG
Errore medio di equity — Sage 3T 0.0030 · XG Roller++ 0.0030  (PR 1.51 vs 1.49)
Mossa migliore indovinata — secondo il rollout di Sage
Errore medio di equity — Sage 3T 0.0023 · XG Roller++ 0.0040  (PR 1.14 vs 1.98)
Sage 3T XG Roller++ Nessuno dei due

Decisioni sul cubo

Dove Sage 3T e XG Roller++ hanno scelto azioni del cubo diverse
282
decisioni sul cubo con rollout
80
disaccordi
Azione migliore indovinata — secondo il rollout di XG
Errore medio di equity — Sage 3T 0.0110 · XG Roller++ 0.0074  (PR 5.50 vs 3.69)
Azione migliore indovinata — secondo il rollout di Sage
Errore medio di equity — Sage 3T 0.0058 · XG Roller++ 0.0102  (PR 2.88 vs 5.08)
Sage 3T XG Roller++
Solo 80 disaccordi sul cubo in tutto — un campione piccolo, quindi questo pannello va letto come indicativo più che come decisivo.
Sul gioco delle pedine — la grande maggioranza dei disaccordi — ciascun rollout dà ragione al proprio motore su quale sia la mossa migliore: secondo il rollout di XG è XG Roller++ a indovinare più spesso la mossa migliore (52.2% contro 37.7%), secondo il rollout di Sage è Sage 3T (50.0% contro 38.1%). Misurati da quanta equity cede una scelta contesa, i due sono alla pari secondo il rollout di XG (0.0030 ciascuno) e Sage 3T è più vicino secondo quello di Sage (0.0023 contro 0.0040). I disaccordi sul cubo sono molto più rari e di segno misto: Sage 3T indovina più spesso l’azione del cubo indicata dal rollout con entrambi i rollout, ma secondo il rollout di XG i suoi errori sono quelli più costosi.
Perché due rollout contano. Un risultato basato su un solo riferimento invita sempre la domanda "verità di chi?". Qui i due rollout provengono da motori indipendenti e, sulle posizioni in cui due motori forti divergono, divergono anche loro, ciascuno inclinando verso il motore che lo ha eseguito. Le posizioni contese non separano Sage 3T e XG Roller++.
05
Metodo tre

Accordo sui match reali

I primi due metodi chiedono quale motore sia più forte. Una terza domanda è altrettanto importante per chiunque usi un motore per studiare il proprio gioco: se analizzi un match reale in XG, annoti il tuo Performance Rating, e poi analizzi lo stesso identico match in Sage — quanto sono vicini i due rating? Un giocatore che ha passato anni a costruirsi un’intuizione di cosa significhi un certo PR in XG dovrebbe ottenere sostanzialmente lo stesso numero da Sage.

Per verificarlo direttamente, abbiamo preso un’ampia raccolta di match di torneo reali già analizzati in XG, li abbiamo rianalizzati tutti da zero in Sage e abbiamo confrontato il Performance Rating che ciascun motore ha assegnato a ciascun giocatore.

I match

I file dei match provengono da tre tornei del 2026, tutti match a 7 punti, gentilmente forniti da Máté Fehér — già analizzati in eXtreme Gammon, esattamente come un giocatore agonista studierebbe le proprie partite.

UBC Texas 2026
100
match analizzati
UBC Istanbul 2026
146
match analizzati
UBC Japan 2026
44
match analizzati

290 match e 580 rating individuali in tutto. Un ulteriore match è stato scartato perché la trascrizione era corrotta.

Impostazioni di valutazione equivalenti

Ogni match è stato rianalizzato in Sage con una base a 3-ply e una passata esperta a 3T — un rollout troncato da 360 partite simulate — applicata alle decisioni in cui la mossa effettiva del giocatore differiva dalla migliore a 3-ply. Questo rispecchia un’analisi XG forte (un ply di base per le decisioni chiare, con passaggio a un rollout troncato per quelle serrate), a forza equivalente: Sage 3P ≈ XG 3-ply e Sage 3T ≈ XG Roller++ (vedi Sezione 2). Ciascun motore calcola poi un PR per giocatore dalle proprie valutazioni — il numero che un utente vede in ciascuna app.

Risultati

Mettendo insieme tutti i 580 rating, i due motori concordano quasi esattamente. La differenza media è statisticamente indistinguibile da zero, e la dispersione di quella differenza è piccola rispetto alla dispersione del PR stesso.

+0.002
Differenza media (PR)
Statisticamente indistinguibile da zero — intervallo di confidenza al 95% ±0.03, p = 0.90.
0.37
Dev. std. della differenza
Piccola rispetto alla dispersione di 2.08 del PR stesso — il disaccordo su un singolo rating è minimo in confronto a quanto varia il PR.
0.98
Correlazione tra i rating (r)
Sage e XG valutano gli stessi giocatori in modo quasi identico.
Performance Rating per giocatore XG Sage DifferenzaSage − XG
Media 4.36 4.36 +0.002
Deviazione standard 2.08 2.10 0.37
Intervallo al 95% 1.52 – 9.36 1.44 – 9.67 −0.76 – +0.74
In termini pratici, un giocatore che analizza un match in Sage vedrà — nella grande maggioranza dei casi — sostanzialmente lo stesso Performance Rating che gli darebbe XG. Come misura di quanto bene è stato giocato un match, i due motori sono intercambiabili.
06
Conclusione

Due motori forti, molto vicini

Negli studi di forza, Open Sage 3T e XG Roller++ sono due delle valutazioni di backgammon più forti disponibili, e vicine tra loro. Lo studio del PR su rollout — condotto sia per il gioco illimitato sia per match da 5 punti — trova Sage più forte a ogni livello equivalente tranne 3-ply, dove i due motori sono entro il rumore statistico, con il vantaggio più netto ai livelli di rollout troncato. Se lo si ricostruisce per le partite illimitate con l'analisi di XG stesso come riferimento, la classifica si capovolge: XG è avanti a ogni livello equivalente tranne il 2T, dove i due sono alla pari. Lo studio delle posizioni contese, che considera le posizioni su cui i due motori sono in disaccordo al livello di valutazione più forte e le valuta rispetto ai rollout di entrambi, è in parità sul gioco di pedine — ciascun rollout favorisce il motore che lo ha eseguito — mentre i disaccordi sul cubo sono troppo rari e troppo divisi per pronunciarsi.

Il riassunto onesto, quindi, è che i due motori giocano a un livello molto simile e molto alto, e che ciascuno ottiene il punteggio migliore rispetto alla propria analisi: con il riferimento di Sage i suoi rollout troncati azzeccano decisioni che i livelli Roller di XG sbagliano, con quello di XG vale il contrario, e sulle posizioni in cui i due motori sono apertamente in disaccordo il rollout di nessuno dei due mette l'altro chiaramente indietro. È sui benchmark di famiglia — backgame, partite di contenimento e snake — che i due motori si separano: misurati con lo stesso metro e a ogni livello equivalente, Sage è in testa in tutte e tredici, e di un fattore tre o più sulle partite di contenimento e sullo snake.

E il terzo studio risponde alla domanda che un utente di Sage si pone davvero: su 290 match di torneo reali già valutati da XG, Sage produce sostanzialmente lo stesso Performance Rating — la differenza media tra il rating Sage e il rating XG di un giocatore è statisticamente indistinguibile da zero, e la dispersione di quella differenza è piccola rispetto alla dispersione del PR stesso. Che il test sia la forza rispetto a una verità ottenuta tramite rollout o il semplice accordo su come è stata giocata una partita reale, Open Sage e XG arrivano allo stesso punto.

Prova Backgammon Sage Pro Torna alla home
A
Appendice

Riprodurre questi risultati

Open Sage è rilasciato come open source, e l’intera pipeline dietro entrambi i metodi è inclusa nel repository del motore. Tutto ciò che segue gira con il solo pacchetto bgsage e una build locale del suo motore — non servono servizi esterni, dataset o infrastruttura. L’unica dipendenza manuale è eXtreme Gammon stesso, usato per rigenerare le colonne XG, dato che XG non ha un’interfaccia programmatica.

github.com/markbgsage/bgsage Motore Open Sage · MPL-2.0 · esegui tutti gli script dalla radice del repository
Prerequisiti. Compila il motore bgsage (l’estensione bgbot_cpp ) seguendo le istruzioni del repository per la tua piattaforma. Per riprodurre una qualsiasi colonna XG serve inoltre eXtreme Gammon (Windows) per il passaggio di Batch Analysis. Ogni script risolve i propri percorsi all’interno del repository, quindi eseguili dalla cartella bgsage/ , la radice del repository.

Riprodurlo con Claude Code

Non sei obbligato a guidare la pipeline a mano. Claude Code — lo strumento agentico di programmazione da riga di comando di Anthropic — può compilare il motore ed eseguire i benchmark per te. Puntalo su un checkout del repository e descrivi cosa vuoi; esegue gli stessi passaggi descritti qui sotto:

›“Compila questo motore, poi valuta Sage 3T e Sage 3P rispetto al benchmark incluso e mostrami PR, PR delle pedine e PR del cubo di ciascuno.”
›“Riproduci la tabella del PR da rollout: valuta ogni livello Sage — da 1-ply a 4-ply, più 1T, 2T e 3T — rispetto a data/money_benchmark/benchmark.json.gz e stampala come una tabella che io possa confrontare con lo studio.”
›“Ricostruisci da zero il benchmark di riferimento con le tre passate di build, poi valuta Sage 3T rispetto a quello.”
›“Ho un mio bot in ./mybot — per ogni decisione del benchmark incluso, valutala con il mio bot e calcola il suo PR rispetto alle equity di riferimento.”

Metodo uno — PR da rollout

Il benchmark — l’insieme stratificato di valutazioni affidabili — viene costruito e valutato da un unico script, scripts/benchmark_money.py. Ci sono due modi per iniziare.

A

Valutare rispetto al dataset incluso

Nessuna ricostruzione · verifica la tabella o valuta un nuovo motore

Il repository include il benchmark assemblato come data/money_benchmark/benchmark.json.gz (il JSON non compresso supera il limite di dimensione dei file di GitHub; gli script leggono il gzip in modo trasparente). Valutare un qualsiasi livello Sage riproduce la sua riga nella tabella della Sezione 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

Per valutare un motore completamente diverso, applica la stessa regola che lo script usa internamente: per ogni decisione del dataset, prendi la scelta del tuo motore e confronta la sua equity con l’equity di riferimento (“rollout”) memorizzata — l’errore medio × 500 è il suo PR.

B

Ricostruire da zero la verità di riferimento

Rideriva ogni decisione · con seme fisso, quindi riproducibile

Tre passate adattive ricreano il dataset. Le partite hanno un seme fisso (500 partite dal seme 1), quindi le decisioni e le equity di riferimento risultano identiche:

# 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 passata 3 scrive data/money_benchmark/benchmark.json (e il relativo .gz); valutalo esattamente come nell’opzione A. Omettendo --stages vengono eseguite tutte e tre le passate in ordine.

Riprodurre le colonne XG

XG non ha API, quindi i suoi risultati provengono dalla Batch Analysis di XG. La passata 1 scrive le trascrizioni importabili in XG in data/money_benchmark/xg/ — non sono incluse nel repository, quindi rigenerale con la passata 1 se sei partito dal solo dataset.

  1. In XG, esegui la Batch Analysis sulla cartella xg/ con un livello personalizzato — decisioni a 3-ply, con passaggio al livello in esame in caso di disaccordo — e con Save Games after analyze attivato. XG scrive un file .xg per partita.
  2. Esegui python scripts/benchmark_pr_xg_levels_all.py --benchmark money, che legge la decisione preferita da XG per ogni posizione a ogni livello analizzato dai file .xg e la valuta rispetto alle stesse equity di riferimento, stampando la stessa suddivisione del PR e registrando accanto le scelte di XG.

La tabella delle partite illimitate con il riferimento di XG nella Sezione 3 — e lo studio delle posizioni contese — richiedono invece i rollout di XG delle posizioni più difficili. Esegui il Batch Rollout di XG su quelle posizioni (con Save Games selezionato); python scripts/xg_benchmark_report.py le analizza. La tabella con il riferimento di XG rivaluta poi ogni livello a partire dalle scelte registrate da ciascuno script di punteggio. Vedi il Metodo Due qui sotto.

# 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

Gioco a match

Lo studio sui match a 5 punti si riproduce allo stesso modo con scripts/benchmark_match.py, il gemello per il gioco a match di benchmark_money.py — la lunghezza del match e il numero di match sono argomenti, e il punteggio del match viene propagato in ogni valutazione. La sua verità di riferimento è inclusa come 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

Metodo due — Posizioni contese

Lo studio sui disaccordi attinge allo stesso benchmark illimitato costruito per il Metodo uno, incrociato con il rollout completo di XG delle posizioni più difficili. L’unica dipendenza manuale è il Batch Rollout di XG; un singolo script fa il resto.

Partite illimitate

  1. Costruisci il benchmark illimitato (Metodo uno, opzione B). La passata 1 scrive anche le trascrizioni importabili in XG in data/money_benchmark/xg/.
  2. In XG, esegui il Batch Rollout su quelle posizioni con Save Games after analyze attivato, così ogni decisione sottoposta a rollout porta con sé le equity del rollout di XG nei file .xg corrispondenti.
  3. Raccogli e genera il report:
python scripts/xg_benchmark_report.py
python scripts/xg_dispute_analysis.py --sage-picks data/money_benchmark/scores/sage_truncated3.picks.jsonl

Il primo converte i rollout di XG in data/money_benchmark/xg_results/rollout.jsonl; il secondo stampa il report sulle posizioni contese — ogni disaccordo valutato rispetto al rollout di Sage e a quello di XG, a turno — dalle scelte registrate di Sage 3T.

Il gioco a match non è ancora coperto da questo metodo: richiede un rollout completo di XG delle posizioni dei match, che non abbiamo eseguito. La forza nel gioco a match è coperta invece dallo studio del PR da rollout (Sezione 3) e dallo studio sull’accordo nei match reali (Sezione 5).

Partite dirette

Sage e XG possono anche giocare direttamente l'uno contro l'altro, con le mosse di XG prese dalla sua stessa analisi. Sage gioca entrambi i lati di una partita illimitata; la trascrizione viene analizzata in batch in XG; la prima decisione dell'avversario che differisce dalla scelta migliore di XG viene sostituita con la mossa di XG e la partita viene rigiocata da lì con nuovi dadi, finché ogni mossa dell'avversario è quella che XG avrebbe fatto. Il runner gioca una serie di tali partite (i seed continuano da logs/sage_vs_xg.txt) e stampa i punti medi per partita con il relativo errore standard:

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 deve essere in esecuzione sul desktop Windows: ogni iterazione pilota la sua finestra Batch Analyze tramite scripts/xg_batch_analyze.py, un agente Anthropic Computer Use (imposta ANTHROPIC_API_KEY), che prende il controllo di mouse e tastiera per circa un minuto per iterazione. Una partita converge in poche iterazioni; il verdetto "too good to double" di XG conta come nessun raddoppio.

Backgame, giochi di contenimento e lo snake

I tredici benchmark di famiglia si trovano sotto backgame_ref_positions/benchmark/ — un file <family> starting.txt di posizioni seme e un file <family> rollout.jsonl di riferimento ciascuno — e sono valutati da scripts/score_backgame_pr.py, che riporta il PR insieme alla quota di scelte di qualità 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 è distribuito con licenza MPL-2.0. I benchmark inclusi sono esattamente i riferimenti dietro le tabelle della Sezione 3; sia il confronto con il riferimento di XG sia i risultati sulle posizioni contese si rigenerano da essi una volta che il Batch Rollout di XG ha prodotto i file .xg corrispondenti.