Étude moteur · Performance du bot

Open Sage à l’épreuve d’eXtreme Gammon

Une comparaison quantitative du moteur d’évaluation Open Sage — qui propulse Backgammon Sage Pro — avec le moteur du bot d’eXtreme Gammon (XG).

Résumé

Nous comparons le moteur Open Sage à eXtreme Gammon (XG) à des niveaux d'évaluation équivalents — évaluation directe du réseau de neurones, recherche multi-ply et rollouts tronqués. Comme XG n'expose aucune interface programmatique, nous l'évaluons via sa fonction Batch Analysis. Nous utilisons trois méthodes complémentaires. La première construit un ensemble stratifié d'évaluations de référence — en se fiant aux évaluations rapides lorsque le choix est net et en escaladant les cas serrés vers des rollouts complets — et attribue à chaque moteur un Performance Rating (PR) face à cette référence, sur 500 parties illimitées (17 535 décisions) et 130 matchs en cinq points (18 292 décisions). Pour les parties illimitées, nous reconstruisons ensuite toute la comparaison en prenant pour référence l'analyse par paliers de XG lui-même — le miroir exact. La deuxième isole les positions illimitées sur lesquelles Sage 3T et XG Roller++ divergent réellement et arbitre chacune face aux rollouts complets des deux moteurs. La même méthode de référence et de notation est appliquée à treize benchmarks de backgames, de parties de containment et du snake — les positions que les moteurs ont historiquement le moins bien jouées. Dans les études de force, les deux moteurs sont proches : selon la référence de Sage, Sage est devant aux niveaux de rollout tronqué sur lesquels s'appuient la plupart des utilisateurs ; selon celle de XG, XG est devant ou à égalité. La troisième méthode renverse la question : sur 290 matchs de tournoi réels déjà analysés dans XG, nous réanalysons chacun dans Sage et comparons le Performance Rating que les deux moteurs attribuent à chaque joueur. Les deux notes se suivent de très près : sur 580 notes de joueurs, elles présentent une corrélation de 98%, et l'écart moyen entre elles est de +0.002 PR — statistiquement indiscernable de zéro.

01
Introduction

Pourquoi se mesurer à XG ?

eXtreme Gammon (XG) est une référence de l’analyse informatique du backgammon, et son moteur d’évaluation est largement considéré comme l’un des plus forts qui existent. Tout nouveau moteur qui entend être pris au sérieux doit répondre à une question simple : comment se situe-t-il par rapport à XG ? Cette étude entreprend d’y répondre de façon quantitative pour Open Sage, le moteur à réseau de neurones qui anime Backgammon Sage Pro.

Notre objectif était de comparer les évaluations d’Open Sage à celles de XG à effort de calcul comparable. L’expérience naturelle — faire s’affronter les moteurs sur des millions de parties et compter les points — n’est pas praticable : l’application XG n’expose aucune interface programmatique, si bien que transmettre positions et coups d’un moteur à l’autre est un processus manuel, clic après clic. Atteindre un échantillon assez grand pour résoudre les petits écarts entre deux moteurs forts prendrait beaucoup trop de temps.

Nous utilisons plutôt la fonction Batch Analysis de XG, capable de noter des centaines de parties transcrites en une seule passe sans intervention. Open Sage joue les deux camps de nombreuses parties ; chaque partie est exportée dans un format texte standard que XG sait importer ; XG analyse le tout ; et nous relisons ses verdicts. Sur ce socle commun, nous appliquons deux méthodes distinctes, décrites dans la section 3 et la section 4.

Une troisième étude (section 5) laisse entièrement de côté les simulations et part de matchs de tournoi réels analysés dans XG. Son objet est différent : plutôt que de demander quel moteur est le plus fort, elle demande si un joueur qui analyse un match dans Sage obtient le même Performance Rating que celui que XG lui donnerait — afin que des années d’intuition sur ce que signifie un PR dans XG se transposent telles quelles à Sage.

02
Contexte

Les niveaux d’évaluation

Les deux moteurs peuvent évaluer une position à différentes profondeurs, en échangeant de la précision contre de la vitesse. Comprendre ces niveaux est indispensable pour lire les résultats, car la comparaison porte toujours sur des niveaux équivalents des deux moteurs.

Évaluation directe (1-ply). La sortie brute du réseau de neurones pour une position, sans aucune recherche. C’est le réglage le plus rapide et le socle sur lequel tous les niveaux plus profonds sont construits. (Nous suivons la convention de XG, où 1-ply désigne l’évaluation brute du réseau.)

Recherche multi-ply (2-, 3-, 4-ply). Le moteur regarde plusieurs tours en avant, en considérant les réponses de l’adversaire et en moyennant sur les lancers possibles à chaque étape, avec une évaluation brute du réseau au bout de chaque variante. Chaque ply supplémentaire est plus précis et nettement plus coûteux.

Rollouts tronqués (1T, 2T, 3T). Plutôt que de chercher à profondeur fixe, le moteur joue un grand nombre de courtes parties simulées, les tronque après quelques tours et évalue la position obtenue par une recherche multi-ply. La réduction de variance annule une bonne part de la chance des dés tirés. Ce sont les réglages « Roller » de XG : plus forts que la recherche à profondeur fixe, tout en restant bien moins coûteux qu’un rollout complet.

Rollout complet. Un grand nombre de parties simulées jouées jusqu’au bout. Mené en volume suffisant avec réduction de variance, un rollout complet est ce qui se rapproche le plus d’une vérité de référence qu’un moteur de backgammon puisse produire, et nous l’utilisons comme étalon tout au long de cette étude.

Niveaux équivalents : Sage et XG

Famille Sage Équivalent XG Principe
Directe 1-ply 1-ply (évaluation brute) Une seule évaluation de la position par le réseau de neurones — sans recherche.
Multi-ply 2P · 3P · 4P 2-ply · 3-ply · 4-ply Explore les réponses de l’adversaire sur plusieurs tours, en moyennant sur les dés.
Rollout tronqué 1T · 2T · 3T Roller · Roller+ · Roller++ De nombreuses courtes parties simulées, tronquées après 5–7 tours et évaluées en multi-ply, avec réduction de variance. 3T/Roller++ décident en 3-ply ; 2T/Roller+ en 2-ply ; 1T/Roller en 1-ply.
Rollout complet Rollout Rollout Parties simulées jouées jusqu’au bout — la « vérité » de référence de cette étude.
Performance Rating (PR). Tout au long de l’étude, la précision d’un moteur est résumée par son PR — l’erreur d’équité moyenne par décision, multipliée par 500, mesurée contre la référence établie par rollout. Un PR de 0 signifie un accord parfait avec la vérité ; plus il est bas, mieux c’est.
03
Méthode 1

PR rollout

La première méthode note chaque moteur contre un ensemble fixe de décisions dont nous avons établi le « vrai » meilleur coup aussi précisément que possible. Elle reprend l’approche de la célèbre étude XG de 2012 qui comparait XG à plusieurs autres bots.

Nous avons commencé par simuler 500 parties illimitées de Sage 3P jouant contre lui-même. Un niveau moyennement fort comme 3P produit une distribution réaliste de positions couvrant tous les plans de jeu — course, attaque, prime, ancrage — exactement la variété que nous voulons tester. Nous avons ensuite refait toute l’étude une seconde fois sur 130 matchs en 5 points, où le score modifie la valeur de chaque décision ; les résultats des deux jeux de données figurent ci-dessous.

Construire la vérité de référence

Établir le vrai meilleur coup de chaque décision par rollout complet serait extrêmement coûteux — et inutile, car la plupart des décisions ne sont pas serrées. Nous construisons donc la référence en trois passes successives, en ne dépensant l’effort de rollout que là où le choix est réellement incertain. La même recette s’applique aux deux jeux de données ; chaque passe tranche les décisions qu’elle peut résoudre avec confiance et transmet le reste à la suivante :

Passe 1 · Sage 3P

Faire confiance au 3-ply quand le choix est net

Chaque décision est évaluée en 3-ply. Lorsque le meilleur coup devance le suivant de plus de 0.05 d’équité, le verdict 3P est accepté comme vérité et la décision est tranchée.

0.05
écart d’équité pour trancher
Les cas plus serrés (moins de 0.05) passent à la passe 2
Passe 2 · Sage 3T

Revérifier les cas serrés par rollout tronqué

Les décisions restantes sont réévaluées en 3T. Lorsque la marge dépasse désormais 0.02 d’équité, le verdict 3T est accepté comme vérité.

0.02
écart d’équité pour trancher
Tout ce qui reste sous 0.02 passe à la passe 3
Passe 3 · Rollout complet

Un rollout pour les décisions les plus difficiles

Tout ce qui reste sous 0.02 est tranché par un rollout complet de Sage : décisions en 3P pour le jeu de pions comme pour les actions de videau, par lots de 1,296 parties simulées jusqu’à ce que l’intervalle de confiance à 95% sur l’équité passe sous 0.005 — ou qu’un plafond de 20,736 parties (16 × 1,296) soit atteint. Les positions de backgame les plus lentes ont demandé bien plus d’une heure chacune.

0.005
intervalle à 95% visé

Le résultat est une référence par paliers où chaque décision est résolue exactement à la profondeur que sa difficulté exige. Nous avons appliqué cette même recette en trois passes aux deux jeux de données — les 500 parties illimitées et les 130 matchs en 5 points — et la composition des paliers obtenue est présentée ci-dessous à côté des résultats de chaque jeu.

Noter un moteur

Une fois ce jeu d’évaluations fiables par paliers en main, noter un moteur est simple : on lui soumet chaque décision du benchmark, on relève l’erreur d’équité du coup ou de l’action de videau qu’il choisit par rapport à la vérité, et on rapporte l’erreur moyenne × 500 sous forme de PR. Ce total est ensuite ventilé en PR de jeu de pions et PR de videau, puis par plan de jeu.

Noter XG a demandé l’étape supplémentaire décrite dans l’introduction. XG n’ayant pas d’API, nous avons lancé sa Batch Analysis sur les transcriptions des 500 parties illimitées et des 130 matchs avec un niveau personnalisé — décisions en 3-ply, relevées au niveau testé en cas de désaccord — puis extrait la décision préférée de XG pour chaque position des fichiers .xg qu’il produit, pour les noter contre les mêmes équités de référence.

Parties illimitées — composition de la vérité de référence

Sur les 500 parties illimitées, les trois passes ont résolu 16,889 positions (17,535 décisions) comme suit :

Tranchées en 3P  7,652 Tranchées en 3T  3,260 Par rollout  5,977 Parties illimitées  16,889 positions · 17,535 décisions

Parties illimitées — face à face

Les cinq niveaux équivalents, notés sur ces 17,535 décisions. Un PR plus bas est meilleur ; le moteur le plus fort de chaque paire est mis en évidence.

Sage 3T
Rollout tronqué · décisions 3-ply · troncature à 7 tours
0.23
vs
0.34
XG Roller++
Rollout tronqué · décisions 3-ply · troncature à 7 tours
Sage 3T devant de 0.11 PR
Sage 2T
Rollout tronqué · décisions 2-ply
0.27
vs
0.41
XG Roller+
Rollout tronqué · décisions 2-ply
Sage 2T devant de 0.14 PR
Sage 1T
Rollout tronqué · décisions 1-ply · troncature à 5 tours · 72 parties simulées
0.49
vs
0.53
XG Roller
Rollout tronqué · décisions 1-ply · troncature à 5 tours · 42 parties simulées
Sage 1T devant de 0.04 PR
Sage 4P
Recherche 4-ply
0.43
vs
0.47
XG 4-ply
Recherche 4-ply
Sage 4P devant de 0.04 PR
Sage 3P
Recherche 3-ply
0.60
vs
0.57
XG 3-ply
Recherche 3-ply
Quasi-égalité — XG 3-ply devant de 0.03 PR

Parties illimitées — détail complet

PR de chaque moteur et niveau testé, ventilé par type de décision et par plan de jeu. Plus bas est meilleur.

Moteur PR Pions Videau Course pure Course Attaque Prime Ancrage
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 et 1P n’ont pas d’équivalent XG dans cette série et figurent à titre indicatif.
Les évaluations de Sage sont plus fortes que l’évaluation XG équivalente à chaque niveau, sauf en 3-ply, où XG passe devant de 0.03 PR — un écart dans les limites du bruit. Les deux moteurs sont proches, et aux niveaux de rollout tronqué qu’utilisent la plupart des utilisateurs, Sage conserve un avantage net : 0.23 contre 0.34 pour Roller++, et 0.27 contre 0.41 pour Roller+.

Parties illimitées — notées contre la référence de XG lui-même

Tous les chiffres ci-dessus notent les moteurs contre la référence par paliers de Sage. L’objection évidente est celle de l’avantage du terrain — Sage est mesuré contre ses propres rollouts. Nous avons donc construit le miroir exact : les mêmes 500 parties et les mêmes décisions, mais avec l’analyse de XG lui-même comme vérité à chaque palier. XG 3-ply tranche les décisions du palier 3P, XG Roller++ celles du palier 3T, et le rollout complet de XG les décisions passées au rollout — l’analogue palier par palier, côté XG, de la référence Sage. Chaque moteur est ensuite renoté contre elle.

Moteur PR Pions Videau Course pure Course Attaque Prime Ancrage
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 Référence : XG 3-ply (palier 3P) · XG Roller++ (palier 3T) · rollout complet XG (palier rollout).
Face à la référence de XG lui-même, le classement s’inverse : XG est devant à chaque niveau équivalent sauf en 2T, où Sage 2T et XG Roller+ sont à égalité à 0.30, et XG Roller++ obtient 0.21 contre 0.28 pour Sage 3T. Les deux tableaux partagent le même biais structurel. Près des deux tiers des décisions sont tranchés par le 3-ply ou le rollout tronqué de la référence elle-même, et celui qui tranche un palier y obtient un score quasi nul — ici XG 3-ply et XG Roller++, dans le tableau précédent Sage 3P et Sage 3T. Les décisions passées au rollout constituent le test le plus équitable, car c’est un rollout complet, et non l’un des niveaux testés, qui y fait office de juge : le rollout de XG place Roller++ de justesse devant Sage 3T (0.56 contre 0.60), tandis que celui de Sage place Sage 3T nettement devant (0.51 contre 0.76).
Deux références, deux verdicts. Selon la référence de Sage, Sage 3T devance XG Roller++ 0.23 à 0.34 ; selon celle de XG, Roller++ mène 0.21 à 0.28. Au niveau le plus élevé, chaque moteur sort devant face à sa propre analyse — le même schéma que l’étude des positions litigieuses (section 4) observe là où les deux moteurs divergent franchement. Les deux moteurs sont très proches, et celui qui mène dépend de l’analyse que l’on prend pour vérité.

Jeu en match — composition de la vérité de référence

Le jeu de données en match suit les trois mêmes passes, avec un ajout : le score away de chaque joueur et l’indicateur Crawford sont transmis à chaque évaluation, de sorte que la vérité est calculée en espace d’équité de match (MWC) au score exact. Sur les 130 matchs en 5 points, les passes ont résolu 17,892 positions (18,292 décisions) comme suit :

Tranchées en 3P  7,522 Tranchées en 3T  3,460 Par rollout  6,910 Jeu en match  17,892 positions · 18,292 décisions

Jeu en match — face à face

Les cinq niveaux équivalents, notés sur ces 18,292 décisions. Un PR plus bas est meilleur ; le moteur le plus fort de chaque paire est mis en évidence.

Sage 3T
Rollout tronqué · décisions 3-ply · troncature à 7 tours
0.23
vs
0.36
XG Roller++
Rollout tronqué · décisions 3-ply · troncature à 7 tours
Sage 3T devant de 0.13 PR
Sage 2T
Rollout tronqué · décisions 2-ply
0.26
vs
0.44
XG Roller+
Rollout tronqué · décisions 2-ply
Sage 2T devant de 0.18 PR
Sage 1T
Rollout tronqué · décisions 1-ply · troncature à 5 tours · 72 parties simulées
0.47
vs
0.51
XG Roller
Rollout tronqué · décisions 1-ply · troncature à 5 tours · 42 parties simulées
Sage 1T devant de 0.04 PR
Sage 4P
Recherche 4-ply
0.41
vs
0.46
XG 4-ply
Recherche 4-ply
Sage 4P devant de 0.05 PR
Sage 3P
Recherche 3-ply
0.56
vs
0.54
XG 3-ply
Recherche 3-ply
Quasi-égalité — XG 3-ply devant de 0.02 PR

Jeu en match — détail complet

PR de chaque moteur et niveau testé sur le jeu de matchs en 5 points, ventilé par type de décision et par plan de jeu. Plus bas est meilleur.

Moteur PR Pions Videau Course pure Course Attaque Prime Ancrage
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 et 1P n’ont pas d’équivalent XG dans cette série et figurent à titre indicatif.
Les résultats en match font écho à l’étude en partie illimitée : Sage est plus fort que l’évaluation XG équivalente à chaque niveau, sauf en 3-ply, où XG passe devant de 0.02 PR — bien en deçà du bruit. L’avantage le plus net de Sage se situe à nouveau aux niveaux de rollout tronqué (3T et 2T) qu’utilisent la plupart des utilisateurs : 0.23 contre 0.36 pour Roller++ et 0.26 contre 0.44 pour Roller+.

Backgames, jeux de contention et le snake

Les parties ordinaires en auto-jeu produisent rarement un backgame profond, un jeu de contention ou une prime dans la moitié éloignée du tableau retenant un unique retardataire, si bien que les jeux de données en partie illimitée et en match en disent peu sur la façon dont un moteur les joue — et ce sont les positions où les moteurs ont historiquement été les plus faibles. Treize benchmarks par famille de positions les mesurent directement, chacun construit comme le benchmark illimité — des décisions réelles, chacune munie d’une référence de qualité rollout — mais avec des décisions tirées de l’intérieur de la famille :

  • Les dix backgames classiques, nommés d’après les deux points que le joueur de backgame tient dans le jan intérieur adverse — le backgame 2‑1 tient les points 2 et 1 de l’adversaire, le 5‑4 les points 5 et 4, et ainsi de suite. Chacun compte environ 1,000 décisions, enregistrées seulement tant que les deux ancres sont encore tenues et que leur détenteur est en retard dans la course.
  • Les jeux de contention, définis par celui qui s’échappe : un camp a sorti quelques pions et possède un à trois pions qui ont été frappés et doivent parcourir tout le tableau pour rentrer, tandis que l’autre camp, la course perdue, dispose ce qui lui reste pour continuer à les frapper.
  • Les backgames massifs — trois ancres ou plus dans le jan intérieur adverse, ou deux ancres avec sept pions ou plus à l’arrière.
  • Le snake — une suite de quatre points faits consécutifs ou plus dans la moitié adverse du tableau, emprisonnant un unique retardataire pendant que les autres pions adverses sont entassés à la maison. Un jeu de prime plutôt qu’un backgame, et l’une des formes les plus difficiles à jouer au backgammon.

Chaque famille part d’un petit ensemble de positions germes. Sage joue, à partir de ces germes, des parties illimitées contre lui-même en 3-ply ; chaque décision qui survient tant que la position appartient encore à la famille est enregistrée, et chaque décision enregistrée est passée au rollout pour produire sa référence — 5,184 parties simulées jouées jusqu’au bout, avec des décisions de pions et de videau en 3-ply pour les trois premiers demi-coups et en 2-ply ensuite, réduction de variance activée. Des passes de complétion des candidats ont passé au rollout chaque coup effectivement choisi par un moteur testé, si bien que chaque score ci-dessous est calculé contre un candidat de qualité rollout. Une position de videau où l’adversaire possède le videau n’est pas une décision pour le joueur au trait et n’est pas notée.

Benchmark Décisions 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
Contention3,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 massif2,1034.335.762.564.442.173.681.913.141.392.751.092.64
Open Sage eXtreme Gammon PR face à la référence de rollout de chaque famille ; plus bas est meilleur ; le meilleur moteur de chaque paire est mis en évidence.
Cumulés sur les dix backgames classiques (10 021 décisions), le PR de Sage est de 1.93 en 2-ply, 0.82 en 3-ply et 0.26 en 3T, les erreurs graves tombant de 28 à aucune. Les parties de containment et les backgames massifs sont trois à quatre fois plus difficiles à chaque niveau — 1.05 et 1.09 en 3T — et le snake est dans une catégorie à part : 21.00 en 2-ply et encore 5.85 en 3T. C'est aussi la seule famille où ajouter du ply n'aide pas de façon fiable alors que les niveaux de rollout tronqué le font, ce qui est exactement l'allure d'une famille de décisions « tenir ou lâcher » : le choix dépend de la façon dont un long containment se déroule, et seule la simulation y accède. Lisez la ligne du snake comme une mesure de la distance qui sépare cette famille de positions d'une solution, et non comme un classement des niveaux de Sage.
XG sur ces benchmarks. Sage devance sur les treize familles et à tous les niveaux cumulés : sur les dix backgames 1.93 contre 2.16 en 2-ply et 0.26 contre 0.48 en 3T. L'écart se creuse avec la difficulté de la famille — en 3T, containment 1.05 contre 6.16, backgames massifs 1.09 contre 2.64, et le snake 5.85 contre 32.24. Seules quatre des 78 cellules individuelles vont dans l'autre sens, toutes des backgames isolés de 2-ply à 4-ply où les deux moteurs sont déjà sous 1.1. XG n'a pas d'interface programmatique : ses décisions sont donc rejouées via Batch Analyze à partir d'exports natifs .xg exports (voir l'Annexe).
04
Méthode 2

Positions litigieuses

La méthode du PR rollout note les deux moteurs contre une référence commune. Une question plus tranchée et plus directe est celle-ci : en jeu réaliste, où les deux moteurs sont-ils réellement en désaccord sur le meilleur coup — et, quand c’est le cas, lequel a raison ?

Nous y répondons sur les décisions illimitées les plus difficiles de la méthode 1 — les positions passées au rollout, dont chacune porte désormais à la fois un rollout complet de Sage et un rollout complet de XG. Parmi elles, nous relevons chaque décision où Sage 3T et XG Roller++ ont choisi différemment, et regardons quel choix chaque rollout a préféré. Disposer des deux rollouts est tout l’intérêt : chaque désaccord est jugé contre le rollout de Sage et celui de XG, si bien que la réponse ne repose jamais sur la vérité d’un seul moteur.

  • Partir du benchmark illimité passé au rollout — les décisions les plus difficiles, chacune tranchée par un rollout complet de Sage.
  • Faire produire à XG son propre rollout complet des mêmes positions (son Batch Rollout) — une seconde vérité de référence indépendante.
  • Conserver les décisions où Sage 3T et XG Roller++ divergent, et noter le choix de chaque moteur contre le meilleur coup ou la meilleure action de videau de chaque rollout.
  • Rapporter les résultats sur l’ensemble commun — les désaccords où les choix des deux moteurs ont été passés au rollout par les deux rollouts — pour que les deux comparaisons portent sur des positions identiques.

Résultats

Sur les positions illimitées passées au rollout — les décisions les plus difficiles de l’étude — les deux moteurs divergent sur 1,286 coups de pions et 80 décisions de videau. Chaque panneau montre à quelle fréquence chaque moteur a trouvé la meilleure décision du rollout — notée tour à tour contre le rollout de XG lui-même et contre celui de Sage.

Jeu de pions

Là où Sage 3T et XG Roller++ ont choisi des coups différents
5,687
décisions de pions passées au rollout
1,286
désaccords
1,139
notés (ensemble commun)
Meilleur coup trouvé — selon le rollout de XG lui-même
Erreur d’équité moyenne — Sage 3T 0.0030 · XG Roller++ 0.0030  (PR 1.51 vs 1.49)
Meilleur coup trouvé — selon le rollout de Sage
Erreur d’équité moyenne — Sage 3T 0.0023 · XG Roller++ 0.0040  (PR 1.14 vs 1.98)
Sage 3T XG Roller++ Aucun des deux

Décisions de videau

Là où Sage 3T et XG Roller++ ont choisi des actions de videau différentes
282
décisions de videau passées au rollout
80
désaccords
Meilleure action trouvée — selon le rollout de XG lui-même
Erreur d’équité moyenne — Sage 3T 0.0110 · XG Roller++ 0.0074  (PR 5.50 vs 3.69)
Meilleure action trouvée — selon le rollout de Sage
Erreur d’équité moyenne — Sage 3T 0.0058 · XG Roller++ 0.0102  (PR 2.88 vs 5.08)
Sage 3T XG Roller++
Seulement 80 désaccords de videau en tout — un petit échantillon : lisez ce panneau comme une indication plutôt qu’une conclusion.
Au jeu de pions — la grande majorité des désaccords — chaque rollout donne raison à son propre moteur sur le meilleur coup : selon le rollout de XG, XG Roller++ trouve plus souvent le meilleur coup (52.2% contre 37.7%) ; selon le rollout de Sage, c’est Sage 3T (50.0% contre 38.1%). Mesurés à l’équité que cède un choix litigieux, les deux sont à égalité selon le rollout de XG (0.0030 chacun) et Sage 3T est plus proche selon celui de Sage (0.0023 contre 0.0040). Les désaccords de videau sont bien plus rares et partagés : Sage 3T trouve plus souvent l’action de videau du rollout sous les deux rollouts, mais, selon le rollout de XG, ses erreurs sont les plus coûteuses.
Pourquoi deux rollouts comptent. Un résultat fondé sur une seule référence appelle toujours la question « la vérité de qui ? ». Ici les deux rollouts proviennent de moteurs indépendants et, sur les positions où deux moteurs forts divergent, ils divergent aussi, chacun penchant vers le moteur qui l'a exécuté. Les positions litigieuses ne séparent pas Sage 3T et XG Roller++.
05
Méthode 3

Concordance sur des matchs réels

Les deux premières méthodes demandent quel moteur est le plus fort. Une troisième question compte tout autant pour quiconque utilise un moteur pour étudier son propre jeu : si vous analysez un match réel dans XG, notez votre Performance Rating, puis analysez exactement le même match dans Sage — à quel point les deux notes sont-elles proches ? Un joueur qui a passé des années à se forger une intuition de ce que signifie tel PR dans XG doit obtenir pour l’essentiel le même chiffre avec Sage.

Pour le tester directement, nous avons pris une grande collection de matchs de tournoi réels déjà analysés dans XG, réanalysé chacun d’eux de zéro dans Sage, et comparé le Performance Rating que chaque moteur attribue à chaque joueur.

Les matchs

Les fichiers de match proviennent de trois tournois de 2026, tous en matchs de 7 points, généreusement fournis par Máté Fehér — déjà analysés dans eXtreme Gammon, exactement comme un joueur de compétition étudierait ses propres parties.

UBC Texas 2026
100
matchs analysés
UBC Istanbul 2026
146
matchs analysés
UBC Japan 2026
44
matchs analysés

290 matchs et 580 notes individuelles de joueurs en tout. Un match supplémentaire a été écarté pour transcription corrompue.

Paramètres d’évaluation équivalents

Chaque match a été réanalysé dans Sage sur une base 3-ply, avec une passe expert 3T — un rollout tronqué de 360 parties simulées — appliquée aux décisions où le coup réellement joué différait du meilleur coup 3-ply. Cela reproduit une analyse XG forte (un ply de base pour les décisions nettes, escaladé en rollout tronqué pour les cas serrés), à force équivalente : Sage 3P ≈ XG 3-ply et Sage 3T ≈ XG Roller++ (voir la section 2). Chaque moteur calcule ensuite un PR par joueur à partir de ses propres évaluations — le chiffre que l’utilisateur voit dans chaque application.

Résultats

En regroupant les 580 notes de joueurs, les deux moteurs s’accordent presque exactement. L’écart moyen est statistiquement indiscernable de zéro, et la dispersion de cet écart est faible au regard de la dispersion du PR lui-même.

+0.002
Écart moyen (PR)
Statistiquement indiscernable de zéro — intervalle de confiance à 95% ±0.03, p = 0.90.
0.37
Écart-type de l’écart
Faible au regard de la dispersion de 2.08 du PR lui-même — le désaccord sur une note donnée est mineur comparé à la variation du PR.
0.98
Corrélation des notes (r)
Sage et XG notent les mêmes joueurs presque à l’identique.
Performance Rating par joueur XG Sage ÉcartSage − XG
Moyenne 4.36 4.36 +0.002
Écart-type 2.08 2.10 0.37
Intervalle à 95% 1.52 – 9.36 1.44 – 9.67 −0.76 – +0.74
Concrètement, un joueur qui analyse un match dans Sage verra — dans la grande majorité des cas — pour l’essentiel le même Performance Rating que XG lui aurait donné. Comme mesure de la qualité de jeu d’un match, les deux moteurs sont interchangeables.
06
Conclusion

Deux moteurs forts, très proches

Dans les études de force, Open Sage 3T et XG Roller++ comptent parmi les évaluations de backgammon les plus fortes disponibles, et sont proches l'une de l'autre. L'étude du PR face aux rollouts — menée pour le jeu illimité comme pour les matchs en 5 points — trouve Sage plus fort à chaque niveau équivalent sauf en 3-ply, où les deux moteurs sont dans le bruit, l'avantage le plus net étant aux niveaux de rollout tronqué. Si on la reconstruit pour les parties illimitées avec l'analyse de XG lui-même comme référence, le classement s'inverse : XG est devant à chaque niveau équivalent sauf en 2T, où les deux sont à égalité. L'étude des positions litigieuses, qui retient les positions où les deux moteurs divergent au niveau d'évaluation le plus fort et les note face aux rollouts des deux, est à égalité sur le jeu de pions — chaque rollout favorisant le moteur qui l'a produit — les désaccords de videau étant trop rares et trop partagés pour trancher.

Le résumé honnête est donc que les deux moteurs jouent à un niveau très semblable et très élevé, et que chacun obtient son meilleur score face à sa propre analyse : selon la référence de Sage, ses rollouts tronqués réussissent des décisions que les niveaux Roller de XG manquent ; selon celle de XG, c'est l'inverse ; et sur les positions où les deux moteurs divergent franchement, le rollout d'aucun des deux ne place l'autre nettement derrière. C'est sur les benchmarks de familles — backgames, parties de containment et snake — que les deux moteurs se séparent : mesuré à la même aune et à chaque niveau équivalent, Sage devance sur les treize, et d'un facteur trois ou plus sur les parties de containment et le snake.

Et la troisième étude répond à la question que se pose réellement un utilisateur de Sage : sur 290 matchs de tournoi réels déjà notés par XG, Sage produit pour l’essentiel le même Performance Rating — l’écart moyen entre la note Sage et la note XG d’un joueur est statistiquement indiscernable de zéro, et la dispersion de cet écart est faible au regard de la dispersion du PR lui-même. Que le test porte sur la force face à une vérité établie par rollout ou sur la simple concordance quant à la qualité de jeu d’une partie réelle, Open Sage et XG arrivent au même endroit.

Essayer Backgammon Sage Pro Retour à l’accueil
A
Annexe

Reproduire ces résultats

Open Sage est publié en open source, et la chaîne de traitement complète derrière les deux méthodes est livrée dans le dépôt du moteur. Tout ce qui suit s’exécute avec le seul paquet bgsage et une compilation locale de son moteur — aucun service externe, jeu de données ou infrastructure n’est requis. La seule dépendance manuelle est eXtreme Gammon lui-même, utilisé pour régénérer les colonnes XG, puisque XG n’a pas d’interface programmatique.

github.com/markbgsage/bgsage Moteur Open Sage · MPL-2.0 · lancez tous les scripts depuis la racine du dépôt
Prérequis. Compilez le moteur bgsage (l’extension bgbot_cpp ) en suivant les instructions du dépôt pour votre plateforme. Reproduire une colonne XG exige en plus eXtreme Gammon (Windows) pour son étape de Batch Analysis. Chaque script résout ses chemins à l’intérieur du dépôt ; lancez-les donc depuis la racine bgsage/ .

Reproduire l’étude avec Claude Code

Vous n’avez pas à piloter la chaîne à la main. Claude Code — l’outil de programmation agentique en ligne de commande d’Anthropic — peut compiler le moteur et lancer les benchmarks pour vous. Pointez-le vers une copie du dépôt et décrivez ce que vous voulez ; il déroule les mêmes étapes que celles détaillées ci-dessous :

›« Compile ce moteur, puis note Sage 3T et Sage 3P contre le benchmark livré et montre-moi le PR, le PR de pions et le PR de videau de chacun. »
›« Reproduis le tableau PR rollout : note chaque niveau Sage — de 1-ply à 4-ply, plus 1T, 2T et 3T — contre data/money_benchmark/benchmark.json.gz et affiche-le sous forme de tableau que je puisse comparer à l’étude. »
›« Reconstruis le benchmark de référence de zéro avec les trois passes de construction, puis note Sage 3T contre lui. »
›« J’ai mon propre bot dans ./mybot — pour chaque décision du benchmark livré, évalue-la avec mon bot et calcule son PR contre les équités de référence. »

Méthode 1 — PR rollout

Le benchmark — le jeu d’évaluations fiables par paliers — est construit et noté par un seul script, scripts/benchmark_money.py. Il y a deux façons d’y entrer.

A

Noter contre le jeu de données livré

Sans reconstruction · valider le tableau ou noter un nouveau moteur

Le dépôt livre le benchmark assemblé sous data/money_benchmark/benchmark.json.gz (le JSON non compressé dépasse la limite de taille de fichier de GitHub ; les scripts lisent le gzip de façon transparente). Noter n’importe quel niveau Sage reproduit sa ligne du tableau de la section 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

Pour noter un tout autre moteur, appliquez la règle que le script utilise en interne : pour chaque décision du jeu de données, prenez le choix de votre moteur et comparez son équité à l’équité de référence (« rollout ») stockée — l’erreur moyenne × 500 est son PR.

B

Reconstruire la vérité de référence de zéro

Recalculer chaque décision · graine fixe, donc reproductible

Trois passes adaptatives recréent le jeu de données. Les parties sont générées avec une graine fixe (500 parties à partir de la graine 1), de sorte que les décisions et les équités de référence ressortent identiques :

# 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 passe 3 écrit data/money_benchmark/benchmark.json (et son .gz) ; notez-le exactement comme dans l’option A. Omettre --stages lance les trois passes dans l’ordre.

Reproduire les colonnes XG

XG n’a pas d’API : ses résultats viennent de sa Batch Analysis. La passe 1 écrit des transcriptions importables dans XG dans data/money_benchmark/xg/ — elles ne sont pas livrées, régénérez-les donc avec la passe 1 si vous êtes parti du seul jeu de données.

  1. Dans XG, lancez une Batch Analysis du dossier xg/ avec un niveau personnalisé — décisions en 3-ply, relevées au niveau testé en cas de désaccord — en cochant Save Games after analyze. XG écrit un fichier .xg par partie.
  2. Lancez python scripts/benchmark_pr_xg_levels_all.py --benchmark money, qui lit la décision préférée de XG pour chaque position, à chaque niveau analysé, dans les fichiers .xg et la note contre les mêmes équités de référence, en imprimant la même ventilation du PR et en enregistrant à côté les choix de XG.

Le tableau des parties illimitées notées contre la référence de XG (Section 3) — tout comme l'étude des positions litigieuses — requiert en revanche les rollouts de XG sur les positions les plus difficiles. Lancez le Batch Rollout de XG sur ces positions (Save Games coché) ; python scripts/xg_benchmark_report.py les analyse. Le tableau avec la référence de XG renote ensuite chaque niveau à partir des choix enregistrés par chaque script de notation. Voir la Méthode Deux ci-dessous.

# 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

Jeu en match

L’étude des matchs en 5 points se reproduit de la même façon avec scripts/benchmark_match.py, le jumeau en match de benchmark_money.py — la longueur et le nombre de matchs sont des arguments, et le score du match est transmis à chaque évaluation. Sa vérité de référence est livrée sous 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éthode 2 — Positions litigieuses

L’étude des désaccords puise dans le même benchmark illimité construit pour la méthode 1, croisé avec le rollout complet de XG lui-même sur les positions les plus difficiles. La seule dépendance manuelle est le Batch Rollout de XG ; un seul script fait le reste.

Parties illimitées

  1. Construisez le benchmark illimité (méthode 1, option B). La passe 1 écrit aussi les transcriptions importables dans XG dans data/money_benchmark/xg/.
  2. Dans XG, lancez un Batch Rollout de ces positions en cochant Save Games after analyze, pour que chaque décision passée au rollout porte les équités de rollout de XG lui-même dans les fichiers .xg correspondants.
  3. Récolter et rapporter :
python scripts/xg_benchmark_report.py
python scripts/xg_dispute_analysis.py --sage-picks data/money_benchmark/scores/sage_truncated3.picks.jsonl

Le premier analyse les rollouts de XG vers data/money_benchmark/xg_results/rollout.jsonl ; le second imprime le rapport des positions litigieuses — chaque désaccord noté tour à tour contre les rollouts de Sage et de XG — à partir des choix enregistrés de Sage 3T.

Le jeu en match n’est pas encore couvert par cette méthode : il faudrait un rollout complet XG des positions de match, que nous n’avons pas lancé. La force en match est couverte par l’étude du PR rollout (section 3) et par l’étude de concordance sur matchs réels (section 5).

Parties en face-à-face

Sage et XG peuvent aussi s'affronter directement, les coups de XG étant tirés de sa propre analyse. Sage joue les deux camps d'une partie illimitée ; la transcription est analysée en lot dans XG ; la première décision de l'adversaire qui diffère du meilleur choix de XG est remplacée par le coup de XG et la partie est rejouée à partir de là avec de nouveaux dés, jusqu'à ce que chaque coup de l'adversaire soit celui qu'aurait joué XG. Le programme joue une série de telles parties (les graines continuent depuis logs/sage_vs_xg.txt) et affiche les points moyens par partie avec son erreur type :

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 doit être lancé sur le bureau Windows : chaque itération pilote sa boîte de dialogue Batch Analyze via scripts/xg_batch_analyze.py, un agent Anthropic Computer Use (définissez ANTHROPIC_API_KEY), qui prend le contrôle de la souris et du clavier pendant environ une minute par itération. Une partie converge en quelques itérations ; le verdict « too good to double » de XG compte comme un non-doublement.

Backgames, jeux de contention et le snake

Les treize benchmarks par famille vivent sous backgame_ref_positions/benchmark/ — un fichier <family> starting.txt de positions germes et une référence <family> rollout.jsonl chacun — et sont notés par scripts/score_backgame_pr.py, qui rapporte le PR à côté de la part des choix de 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 est distribué sous licence MPL-2.0. Les benchmarks fournis sont exactement les références derrière les tableaux de la Section 3 ; la comparaison avec la référence de XG comme les résultats sur les positions litigieuses se régénèrent à partir d'eux une fois que le Batch Rollout de XG a produit les fichiers .xg correspondants.