Moteur : classement exact de hint et commande engine-cli reference

- 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>
This commit is contained in:
Pierre MARTIN
2026-11-02 14:18:10 +01:00
co-authored by Claude Opus 5.5
parent 856e4d64bd
commit be6a4b4446
4 changed files with 141 additions and 32 deletions
+6 -6
View File
@@ -2,8 +2,8 @@
# Tests du moteur embarqué, via build/engine-cli (étape 0a.3) :
# meilleurs coups d'ouverture connus, nombre de coups légaux, bornes et
# symétrie des probabilités, décision de videau évidente, identifiants
# invalides. La comparaison systématique au gnubg de bureau viendra ensuite
# (tests/reference/, étape 0a.4).
# invalides. La comparaison systématique au gnubg de bureau est faite par
# tests/test_engine_reference.sh.
#
# Lance `make engine` (sans effet si tout est à jour).
@@ -34,7 +34,7 @@ echouer() {
# Valeur d'une clé JSON numérique ou textuelle (première occurrence).
valeur() {
grep -oE "\"$1\": (\"[^\"]*\"|[-0-9.]+)" <<<"$2" | head -n1 | sed -E 's/^"[^"]*": "?//; s/"$//'
grep -oE "\"$1\": (\"[^\"]*\"|[-0-9.eE+]+)" <<<"$2" | head -n1 | sed -E 's/^"[^"]*": "?//; s/"$//'
}
# Évalue une condition numérique avec awk ; ex. : vrai "0 <= 0.5 && 0.5 <= 1"
@@ -104,19 +104,19 @@ verifier_probabilites "coup 64 à 2 plis" "$($cli --ply 2 bestmove "$depart" "$l
for match_id in "$libre_j0" "$crawford"; do
decision="$(valeur decision "$($cli cube "$depart" "$match_id")")"
case "$decision" in
no_double* | no_redouble* | not_available) ;;
NODOUBLE_* | NO_REDOUBLE_* | NOT_AVAILABLE) ;;
*) echouer "videau au départ ($match_id) : « $decision » au lieu de pas de double" ;;
esac
done
# Partie Crawford : le videau n'est pas disponible.
decision="$(valeur decision "$($cli cube "$depart" "$crawford")")"
[ "$decision" = "no_double_dead_cube" ] || [ "$decision" = "not_available" ] \
[ "$decision" = "NODOUBLE_DEADCUBE" ] || [ "$decision" = "NOT_AVAILABLE" ] \
|| echouer "videau en partie Crawford : « $decision »"
# À l'inverse, la course gagnée d'avance est un double/passe (règle Jacoby :
# jouer pour le gammon ne rapporte rien, videau au centre).
decision="$(valeur decision "$($cli cube "$course" "$libre_j0")")"
[ "$decision" = "double_pass" ] || echouer "videau en course gagnée : « $decision »"
[ "$decision" = "DOUBLE_PASS" ] || echouer "videau en course gagnée : « $decision »"
# 5. Erreurs : JSON, code d'erreur précis et code de sortie non nul.
attendre_erreur() {