Ce dont le domaine d'une partie a besoin, sans réimplémenter de règle :
décodage d'un Position ID en plateau et position vue de l'adversaire,
résultat d'une partie finie (gammon, règle Jacoby), codage d'un Match ID,
vérification de demi-coups saisis un par un (la légalité vient de
GenerateMoves de gnubg), demi-coups de chaque coup légal, droit de doubler
et recommandations de double et de prise. Nouvelles commandes d'engine-cli
position, halfmoves et matchid, avec leurs tests natifs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Le moteur et engine-cli sont compilés avec Emscripten (image figée
emscripten/emsdk:3.1.64), en C générique, sans threads ; les données
de build/data/ sont incluses dans engine.data. Le JavaScript appelle
engine_init une fois puis main pour chaque commande : la sortie est le
JSON d'engine-cli, sans code de mise en forme dupliqué.
tests/test_wasm_reference.sh rejoue les 32 positions de référence sous
Node avec le même comparateur (option --cli) et la même tolérance.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
tests/test_engine_reference.sh lance tests/reference/compare.py sur les
32 positions aux niveaux 0 et 2 plis. Tolérance de 0,002 mesurée et
justifiée dans tests/reference/README.md : écart maximal de 9,5e-4, avec
ou sans -ffast-math ; la cause est la sigmoïde approchée (_mm_rcp_ps) de
gnubg de bureau en SSE2, qu'un build SSE2 du moteur reproduit au bit près.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
jq n'est plus utilisé sur le PC (ADR 0004) : tests/test_reference.sh se
relance dans l'image ustagammon/build-c:2, qui contient aussi Python 3
pour le comparateur du moteur.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- engine_best_moves suit hint_move de gnubg : fAnalyse vrai, seuil
« douteux », puis RefreshMoveList (classement par niveau d'évaluation
et départage des égalités).
- Correction : en match, l'équité des coups était convertie deux fois par
mwc2eq (ScoreMove la convertit déjà).
- engine_cube : ajout de optimal et decision_text ; decision prend le nom
de l'énumération cubedecision de gnubg, comme les références.
- engine-cli : commande reference (un niveau au format de
tests/reference/) et nombres écrits avec 9 chiffres significatifs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Fusion du travail du sous-agent (branche moteur-embarque-travail) ; plan
supprimé à la clôture, son résultat est repris dans la merge request.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Fusion du travail du sous-agent (branche moteur-reference-travail) ; plan
supprimé à la clôture, son résultat est repris dans la merge request.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
tests/test_engine.sh : coups d'ouverture connus à 0 et 2 plis, nombre de
coups légaux, bornes et symétrie des probabilités, décisions de videau
évidentes, erreurs. test_makefile.sh essaie make clean sur un dossier
jetable, pour ne plus forcer la recompilation du moteur à chaque test.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
32 positions (ouvertures, milieu, prime, blitz, course, sortie, videau,
match, Crawford, Jacoby), générées par make reference ; format documenté
dans tests/reference/README.md, vérifié par tests/test_reference.sh.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Fichiers repris sans modification dans engine/gnubg/, poids et table
d'équité Kazaross-XG2 dans engine/data/, provenance détaillée dans
engine/gnubg/PROVENANCE.md. Le lint ne vérifie plus les espaces de ces
copies, pour qu'elles restent identiques à l'original.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>