Skip to content

Calibration de ma liste elo

Étalonner son laboratoire sur l'échelle CCRL — méthode des trois ancres
Méthode · étalonnage du laboratoire

Aligner son labo sur l'échelle CCRL

Comment donner à des moteurs testés sur sa propre machine une cote comparable à celle de CCRL ? La réponse tient en trois moteurs-ancres, un bridage temporel, et une formule. Voici la méthode complète, avec les gauntlets intégraux des trois ancres et leurs écarts mesurés au référentiel CCRL.

Le problème. CCRL note les moteurs sur son matériel et ses conditions de référence. Sur un Ryzen 9 7950X3D, plus rapide par cœur et souvent lancé avec davantage de threads, les mêmes moteurs marquent plus de points — leur cote « maison » est gonflée. Pour publier des valeurs comparables à CCRL, il faut un pont entre l'échelle du laboratoire et l'échelle CCRL.
L'idée. Choisir des moteurs dont la cote CCRL est connue et fiable (les ancres), les faire jouer sur le Ryzen mais bridés en temps pour qu'ils rejouent leur force CCRL. Tout moteur qui les affronte à pleine cadence se positionne alors sur l'échelle CCRL via son score.

Le principe, étape par étape

  1. Choisir trois ancres étagées. Trois moteurs de cote CCRL connue, répartis sur l'échelle — haut, milieu, bas — pour que le pont soit tenu en plusieurs points plutôt qu'en un seul. Ici : 3327, 2911 et 2608, soit ≈ 730 points couverts.
  2. Brider les ancres en temps. Chaque ancre joue à ~½ temps (8 s/coup) là où le moteur testé joue à pleine cadence (15 s/coup). Ce handicap neutralise l'avantage de fréquence par cœur du Ryzen : l'ancre joue « comme si » elle tournait sur un matériel plus lent, et reproduit son niveau CCRL.
  3. Faire jouer chaque ancre contre des sous-ancres CCRL. Un gauntlet de 100 parties (20 par adversaire, couleurs équilibrées) contre 4-5 moteurs de cote CCRL connue, eux aussi bridés. Le score mesure la force de l'ancre sur le Ryzen.
  4. Calculer la performance. Formule maison : moyenne des cotes CCRL des adversaires + conversion logistique du pourcentage. On obtient la cote Ryzen de l'ancre.
  5. Épingler les trois ancres dans Ordo. On fixe les trois à leur valeur CCRL mesurée, et Ordo redérive toute la liste sur le référentiel CCRL à partir de ces points fixes.
perf = moyenne des ancres + 400 · log₁₀( p / (1 − p) )
σ = 400 · √( p(1 − p) / N )  — forme « table », colonne Err ±
Subtilité du bridage. Le handicap temporel est un facteur unique par cœur — il ne se cumule pas avec le nombre de threads. Chaque ancre tourne donc au nombre de threads de sa référence CCRL : la fréquence est neutralisée, mais pas le parallélisme. C'est ce qui explique que le seul gain possible au-dessus de la cote CCRL provienne des threads supplémentaires par rapport à la référence — et de rien d'autre.

Ancre hauteDeep Shredder 13 — 8 threads

Cote CCRL 3327 (4CPU)  ·  movetime 15 / 8  ·  100 parties  ·  couleurs 50/50

Adversaire (sous-ancre)CCRLScore%+ / = / −Perf ind.
Caissa 1.1736013.5 / 2017,50 %0 / 7 / 133332
Stockfish 1035226.5 / 2032,50 %0 / 13 / 73395
Ethereal 12.7534549.5 / 2047,50 %1 / 17 / 23437
Wasp 5.50332514.0 / 2070,00 %9 / 10 / 13472
Gull 3322312.0 / 2060,00 %4 / 16 / 03293
Total · moy. 3425—45.5 / 10045,50 %14 / 63 / 233394
Cote Ryzen 93394± 20 (table) · ± 9 (log)  ·  écart CCRL +67
Cohérence. +67 au-dessus de la cote CCRL 4CPU, attribuable au doublement 4 → 8 threads — la fréquence par cœur étant neutralisée par le bridage. Profil propre : les cinq perfs individuelles s'ordonnent correctement avec la force des sous-ancres (3293 → 3472), sans outlier.

Ancre médianeGlaurung 2.2 JA — 8 threads

Cote CCRL 2911 (4CPU)  ·  movetime 15 / 8  ·  100 parties

Adversaire (sous-ancre)CCRLScore%+ / = / −Perf ind.
Igel 2.3.130976.0 / 2030,00 %0 / 12 / 82950
Deep Shredder 12304310.5 / 2052,50 %6 / 9 / 53060
Wasp 2.0029469.0 / 2045,00 %5 / 8 / 72911
Stockfish 1.4 JA284515.5 / 2077,50 %12 / 7 / 13060
Lux 5.0281115.0 / 2075,00 %11 / 8 / 13002
Total · moy. 2948—56.0 / 10056,00 %34 / 44 / 222990
Cote Ryzen 92990± 20 (table) · ± 9 (log)  ·  écart CCRL +79
Cohérence. +79 au-dessus de la cote CCRL 4CPU, là encore via le doublement 4 → 8 threads. À 20 parties par sous-ancre le profil est homogène : Igel (2950) et Wasp 2.00 (2911) alignés en bas, DS12 et Stockfish 1.4 en haut (3060) — aucun outlier de style.

Ancre basseList 5.12 — 1 thread

Cote CCRL 2608  ·  movetime 15 / 8  ·  92 parties  ·  pool sans Tao, avec Hermann

Adversaire (sous-ancre)CCRLScore%+ / = / −Perf ind.
Toga II 1.2.1a27668.0 / 2040,00 %5 / 6 / 92696
Spike 1.1269010.0 / 2050,00 %6 / 8 / 62690
Ruffian 1.0.5259910.0 / 2050,00 %6 / 8 / 62599
Hermann 2.8248722.0 / 3268,75 %16 / 12 / 42624
Total · moy. 2635,5—50.0 / 9254,35 %33 / 34 / 252666
Cote Ryzen 92666± 21 (table) · ± 9 (log)  ·  écart CCRL +58
Cas particulier : pas de bonus SMP. List tourne en mono-thread, exactement comme sa référence CCRL — il n'y a donc aucun gain de threads ici. Son +58 ne vient pas du parallélisme mais du pool retenu sans Tao (avec Tao inclus, la perf retombait vers ~2610). List fait par ailleurs 50 % contre Ruffian (2599) et contre Spike (2690), deux sous-ancres distantes de 91 points : une légère non-transitivité qui fixe le plancher de précision à ± 21. Tao 5.6, statistiquement indistinguable de Hermann (z = 0,64), a été écarté du pool.

Le triplet d'ancrage et la leçon des écarts

Trois points fixes pour le réétalonnage global · échelle couverte ≈ 730 points

MoteurTh.CCRLRyzen 9Écart CCRL
Deep Shredder 13 x64833273394 ± 20+67
Glaurung 2.2 JA829112990 ± 20+79
List 5.12126082666 ± 21+58
La leçon centrale. Les trois écarts — +67, +79, +58 — ne suivent aucune règle uniforme. Ils ne sont pas proportionnels au nombre de threads (les deux ancres 8T gagnent des montants différents), ni constants. L'écart au référentiel CCRL est propre à chaque moteur. C'est précisément pourquoi on ne peut pas décaler toute la liste d'une constante : il faut mesurer plusieurs ancres réelles et laisser Ordo interpoler entre elles.

Conclusion opératoire : on épingle ces trois points à leur valeur CCRL connue dans Ordo, et l'on redérive l'ensemble de la liste sur le référentiel CCRL. Les ancres tiennent le pont en trois endroits — haut, milieu, bas — et tout moteur testé contre elles, à pleine cadence, hérite d'une cote directement comparable à CCRL, sans facteur correctif arbitraire. La précision du pont, ≈ ± 20 par ancre, fixe le plancher d'incertitude de tout le réétalonnage.


De la partie au tableau publié

La chaîne complète, du PGN brut au classement et aux débriefs en ligne

Une fois les ancres posées et les gauntlets joués, le passage des parties brutes au tableau publié suit une chaîne fixe en quatre temps. Rien n'est saisi à la main : tout est dérivé des PGN.

1 · Assemblage
Tous les PGN en un seul
Chaque gauntlet (un par moteur testé) est concaténé dans un PGN combiné unique — la matière première, l'intégralité des parties du laboratoire.
gauntlets_combined.pgn
▼
2 · OrdoStat
Ajustement global Ordo / BayesElo
Le PGN combiné passe dans OrdoStat. Avec les trois ancres CCRL épinglées à leur valeur (deux ancres minimum pour caler l'échelle), Ordo résout tout le graphe d'un coup et redérive chaque moteur sur le référentiel CCRL — bien mieux qu'une moyenne d'ancres, car il gère la non-transitivité.
▼
3 · Sorties
Fichiers CSV et TXT
OrdoStat produit la liste calée : un CSV structuré (cote, σ, parties, %) et un TXT ordonné (rang, nom, cote, points, parties, %). C'est le classement officiel, à l'état de données.
classement.csvclassement.txt
▼
4 · Générateur HTML
Classement + débriefs en ligne
Le générateur croise le PGN, la sortie Ordo et la liste des moteurs figés, puis produit deux fragments HTML dans le thème crème : le tableau de classement (avec liens internes) et l'ensemble des débriefs de gauntlets (tables d'adversaires par moteur). Collés dans deux widgets HTML Elementor de la page WordPress.
classement.htmldebriefs.html
Pourquoi cette séparation en deux outils. OrdoStat fait la science (l'ajustement statistique sur l'échelle CCRL) ; le générateur fait la mise en forme (le HTML). Les garder distincts permet de rejouer l'un sans l'autre — réétalonner après l'ajout d'un moteur sans retoucher la présentation, ou régénérer le HTML après un changement de style sans relancer Ordo.
Une chaîne reproductible. Du premier coup joué au tableau en ligne, chaque maillon part d'un fichier et en produit un autre. Ajouter un moteur, c'est rejouer son gauntlet, le verser dans le PGN combiné, et relancer la chaîne : Ordo repositionne tout, le générateur réédite le classement et les débriefs. Aucune valeur n'est jamais recopiée à la main — d'où la cohérence d'ensemble de la liste.

Laboratoire · calibration · 24 656 parties

Recaler l’échelle : le mur de Rebel 6

Les cotes des programmes émulés ont bougé d’une cinquantaine de points, et celles des moteurs natifs bien davantage. Ce n’est pas une retouche : c’est la correction d’un défaut d’échelle qui faussait tout le haut du classement. Voici ce qui n’allait pas, et comment c’est réglé.

+139décalage Elo entre l’échelle native et l’échelle émulée, mesuré sur 1 112 parties de passerelle
24 656parties du laboratoire réanalysées pour poser le diagnostic
2 674nouvelle cote de Rebel 6.0, contre 2 535 auparavant
+55environ, gagnés par chaque Chess Genius émulé sur Pentium 90 une fois l’échelle recalée

Le symptôme : un mur infranchissable

Le laboratoire note les vieux programmes tournant sur matériel émulé (486, Pentium 90, 68k) en les faisant jouer contre une échelle de moteurs de référence à cote fixe, le tout ajusté par Ordo. Un détail clochait : à partir de Rebel 6, les machines émulées ne marquaient plus rien du tout — un mur. Or la cote affichée de ces moteurs ne justifiait pas un tel écart.

Le révélateur : deux adversaires à cote quasi identique, mais des résultats sans rapport.

Adversaire des PC émuléscote affichéescore des PC émulés
Stockfish 11 68040 40 MHz2546~31 %
Rebel 6.02535~4 %

Deux moteurs étiquetés au même niveau, et pourtant les mêmes machines marquent huit fois plus contre l’un que contre l’autre. L’une des deux cotes est fausse — et ce n’est pas celle du Stockfish.

Le diagnostic : deux échelles décalées

En réanalysant les 24 656 parties, le pool se sépare en deux mondes qui ne se recouvrent presque pas. D’un côté l’échelle émulée (machines dédiées, 486, Pentium 90, moteurs portés sur 68k) ; de l’autre l’échelle native (les moteurs UCI tournant à pleine vitesse sur le Ryzen : Rebel 6, Yace, Fritz 5.32, Hiarcs, Shredder… et tout le classement moderne au-dessus). Sur les 1 112 parties qui relient les deux mondes, l’échelle native tout entière se tient 139 points trop bas.

La soudure entre les deux est Stockfish 11 68040 : un moteur moderne, mais brélé par un 68040 émulé à 40 MHz. Il appartient de fait à l’échelle émulée, et ses résultats l’y placent exactement à sa cote (il performe à 2582 contre le seul matériel émulé, pour une cote de 2546 : écart négligeable). C’est le pont fiable entre les deux référentiels.

Quant à Rebel 6, sa cote de 2535 provenait d’une calibration où le moteur était bridé à 1 % de sa puissance. Dans les gauntlets, il jouait à pleine puissance — d’où le mur. Contre le matériel émulé, il tourne en réalité à 93 % sur 295 parties.

La correction

Plutôt que de réestimer chaque moteur un par un, on a corrigé le décalage d’échelle, qui est un seul paramètre. Trois gestes :

  • poser deux ancres fixes fiables qui tiennent l’échelle : Stockfish 11 68040 à 2546 (la soudure) et Saitek RISC 2500 400 MHz à 2440 (calibré contre les machines émulées) ;
  • remonter de +139 toutes les ancres à partir de Rebel 6 (de Rebel 6 jusqu’au sommet moderne), ce qui préserve leur ordre interne ;
  • relancer Ordo sur l’ensemble du PGN avec ce jeu d’ancres.
Pourquoi +139 et pas +320

Pris isolément, Rebel 6 performe à ~2855 contre le matériel émulé — ce qui suggérerait +320. Mais un score de quasi-blanchissage gonfle mécaniquement la performance, et cette valeur placerait Rebel 6 au-dessus de Yace, Fritz 5.32 et Shredder — des moteurs qu’il perd en duel direct dans tous les gauntlets. Un décalage uniforme qui conserve l’ordre et s’appuie sur deux ancres sûres est la correction réaliste ; un recalcul moteur par moteur ne l’est pas.

Le résultat

Les deux mondes se rejoignent, et les cotes se déplacent de façon cohérente. Les ancres du cluster natif montent de 139 ; les prétendants émulés, recalculés, gagnent une cinquantaine de points.

Moteuravantaprèsrôle
Stockfish 11 68040 40 MHz25462546ancre fixe — la soudure
Saitek RISC 2500 400 MHz23472440nouvelle ancre fixe
Rebel 6.025352674ancre, +139
Yace Paderborn25872726ancre, +139
Chess Genius 1 Pentium 9024822533recalculé
Chess Genius 2 Pentium 9024902552recalculé
Chess Genius 3 Pentium 9025192574recalculé
Chess Genius 4 Pentium 9025192575recalculé
Chess Genius 5 Pentium 9024792530recalculé

Tout le classement moderne au-dessus de Rebel 6 remonte aussi de 139 (Fritz 20 passe de 3679 à 3818, Stockfish 18 de 3709 à 3850), et les machines émulées 486 gagnent une trentaine de points. Le mur disparaît : l’écart entre un Pentium 90 émulé et Rebel 6 pleine puissance redevient crédible, de l’ordre de 120 à 150 points.

Ce qui n’a pas changé

C’est une correction d’échelle, pas une rerévaluation individuelle. L’ordre des moteurs natifs entre eux est intact, de même que celui des machines émulées ; seul le niveau absolu du cluster natif a été recalé, désormais tenu par les deux ancres fiables (Stockfish 68040 à 2546, RISC 400 à 2440). Les parties, elles, n’ont pas été rejouées : ce sont les mêmes 24 656.

chess.lumn.eu · laboratoire de calibration · 16 octobre 2026 · 24 656 parties, 32 ancres