diff --git a/CREDITS.md b/CREDITS.md index d16a9ee..4665879 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -23,6 +23,16 @@ précisément ici dès que du code en sera repris : - **ShellCheck** (GPLv3), analyse des scripts shell, utilisé via Docker. - **Node.js** (MIT), image `node:22.11.0-alpine3.20`, et **@cucumber/gherkin** (MIT), analyseur Gherkin qui valide les scénarios de `docs/scenarios/`. +- **Debian** (image Docker `debian:trixie`, logiciels libres sous leurs + licences respectives), base de l'image du gnubg de référence. +- **GNU Backgammon** (GPLv3 ou ultérieure), compilé dans Docker au commit + 14b67984737ded0f6de43d63dcb789f729d9b06b depuis + https://git.savannah.gnu.org/git/gnubg.git, sert de référence aux tests + (`docker/gnubg-reference/`, `tests/reference/`). Les résultats de + `tests/reference/results/` et les données `gnubg.wd`, `gnubg_os0.bd`, + `gnubg_ts0.bd` sont produits par ce programme. +- **jq** (licence MIT), lecture des JSON dans `tests/test_reference.sh` ; + utilisé sur le PC, pas dans Docker. ## Remerciements diff --git a/Makefile b/Makefile index 9982adc..a1ad5b6 100644 --- a/Makefile +++ b/Makefile @@ -13,15 +13,17 @@ BUILD_DIR := build SHELLCHECK_IMAGE := koalaman/shellcheck-alpine:v0.10.0 # Image construite ici : changer le numéro à chaque modification de docker/gherkin/. GHERKIN_IMAGE := ustagammon/gherkin:2 +# GNU Backgammon de référence, compilé au commit figé par l'ADR 0005. +REFERENCE_IMAGE := ustagammon/gnubg-reference:14b6798 export SHELLCHECK_IMAGE GHERKIN_IMAGE -.PHONY: help setup build test lint deploy clean +.PHONY: help setup build test lint deploy clean reference-image reference help: ## Liste les commandes disponibles @echo "Ustagammon : commandes disponibles" @grep -E '^[a-zA-Z0-9_-]+:.*## ' $(MAKEFILE_LIST) \ - | awk 'BEGIN { FS = ":.*## " } { printf " make %-12s %s\n", $$1, $$2 }' + | awk 'BEGIN { FS = ":.*## " } { printf " make %-16s %s\n", $$1, $$2 }' setup: ## Installe la chaîne d'outils (images Docker) ; sans effet si déjà fait @command -v docker >/dev/null || { echo "Docker est requis : sudo apt install docker.io"; exit 1; } @@ -29,6 +31,7 @@ setup: ## Installe la chaîne d'outils (images Docker) ; sans effet si déjà fa || docker pull $(SHELLCHECK_IMAGE) @docker image inspect $(GHERKIN_IMAGE) >/dev/null 2>&1 \ || docker build -q -t $(GHERKIN_IMAGE) docker/gherkin + @$(MAKE) reference-image @echo "Chaîne d'outils prête." build: ## Compile le moteur (si nécessaire) puis l'application @@ -46,3 +49,13 @@ deploy: ## Installe l'application sur le téléphone (pas encore disponible) clean: ## Supprime les artefacts de build (garde les images Docker) rm -rf $(BUILD_DIR) + +reference-image: ## Construit l'image Docker du gnubg de référence (cache Docker : rapide si à jour) + docker build -t $(REFERENCE_IMAGE) docker/gnubg-reference + @echo "Image $(REFERENCE_IMAGE) prête." + +reference: reference-image ## Régénère tests/reference/results/ avec le gnubg de référence + rm -rf tests/reference/results + docker run --rm --user "$$(id -u):$$(id -g)" -e HOME=/tmp \ + -v "$(CURDIR)/tests/reference:/reference" $(REFERENCE_IMAGE) \ + gnubg --tty --quiet --no-rc --python=/reference/generate.py diff --git a/docker/gnubg-reference/Dockerfile b/docker/gnubg-reference/Dockerfile new file mode 100644 index 0000000..ef14ed1 --- /dev/null +++ b/docker/gnubg-reference/Dockerfile @@ -0,0 +1,46 @@ +# GNU Backgammon de référence pour les tests d'Ustagammon (ADR 0005). +# +# Compile gnubg en ligne de commande, sans interface graphique, depuis le +# commit figé 14b67984737ded0f6de43d63dcb789f729d9b06b (1.08.003), avec le +# scripting Python intégré. Produit aussi, avec les outils officiels de gnubg, +# les données dont le moteur embarqué devra se servir à l'identique : +# gnubg.wd : poids du réseau, binaires, par `makeweights` ; +# gnubg_os0.bd : base de sortie à un côté, par `makebearoff -o 6 -s 7999999` ; +# gnubg_ts0.bd : base de sortie à deux côtés, par `makebearoff -t 6x6`. +# `make` les produit et `make install` les installe dans /usr/local/share/gnubg/ ; +# leurs sommes SHA-256 sont dans /usr/local/share/gnubg/donnees.sha256. + +FROM debian:trixie + +ARG GNUBG_DEPOT=https://git.savannah.gnu.org/git/gnubg.git +ARG GNUBG_COMMIT=14b67984737ded0f6de43d63dcb789f729d9b06b + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + autoconf automake autopoint bison build-essential ca-certificates \ + flex gettext git libglib2.0-dev libtool pkgconf python3-dev \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /src/gnubg +RUN git init -q . \ + && git remote add origin "$GNUBG_DEPOT" \ + && git fetch -q --depth 1 origin "$GNUBG_COMMIT" \ + && git checkout -q FETCH_HEAD \ + && test "$(git rev-parse HEAD)" = "$GNUBG_COMMIT" + +# Options figées pour un résultat indépendant de la machine hôte : +# - pas d'interface graphique, pas de plateau 3D, pas de SQLite ; +# - SIMD forcé à SSE2 (présent sur tout x86-64) au lieu de la détection +# automatique du processeur de la machine qui construit l'image ; +# - drapeaux de compilation par défaut de gnubg (-O3 -ffast-math). +RUN ./autogen.sh \ + && ./configure --without-gtk --without-board3d --without-sqlite \ + --with-python=python3 --enable-simd=sse2 \ + && make -j2 \ + && make install \ + && cd /usr/local/share/gnubg \ + && sha256sum /src/gnubg/gnubg.weights gnubg.wd gnubg_os0.bd gnubg_ts0.bd met/Kazaross-XG2.xml > donnees.sha256 \ + && printf '%s\n' "$GNUBG_COMMIT" > commit + +ENV LANG=C.UTF-8 +WORKDIR /travail diff --git a/docs/feuille-de-route.md b/docs/feuille-de-route.md index 4b38989..6cc15dd 100644 --- a/docs/feuille-de-route.md +++ b/docs/feuille-de-route.md @@ -14,8 +14,7 @@ Acquis : socle du dépôt, organisation (ADR 0001, 0003, 0006), source du moteur | Sous-étape | Contenu | État | Plan | | --- | --- | --- | --- | -| 0a.2 | Image Docker GNU Backgammon de bureau (compilé depuis le commit 14b6798), 30+ positions de référence dans `tests/reference/` | ⏳ | | -| 0a.3 | Interface C `engine/include/engine.h` et `engine-cli` (JSON) | ⏳ | | +| 0a.3 | Interface C `engine/include/engine.h` et `engine-cli` (JSON) | 🔄 | `plans/2026-11-02-moteur-embarque.md` | | 0a.4 | `make test` compare `engine-cli` aux références | ⏳ | | | 0b | Moteur en WebAssembly, page de test dans un Web Worker, `make deploy-web`, `make bench` | ⏳ | | | Mesures | Pierre relève les mesures sur le Fairphone 4 | ⏳ | | diff --git a/tests/reference/README.md b/tests/reference/README.md new file mode 100644 index 0000000..0593be5 --- /dev/null +++ b/tests/reference/README.md @@ -0,0 +1,229 @@ +# Positions de référence + +Ce dossier contient des positions de backgammon évaluées par le GNU Backgammon +de bureau, compilé dans Docker au commit figé par l'ADR 0005. Le moteur +embarqué d'Ustagammon (et son `engine-cli`) doit retrouver ces résultats, à +une tolérance près. **Ce document est le contrat du format** : `engine-cli` +produit pour une position un objet de même structure que la partie `plies` +d'un fichier de résultat. + +| Fichier | Rôle | +| --- | --- | +| `positions.json` | Positions d'entrée, versionnées, écrites à la main | +| `results/.json` | Résultats de gnubg, un fichier par position, générés | +| `generate.py` | Script exécuté dans gnubg qui produit `results/` | + +Commandes : + +``` +make reference-image # construit l'image Docker du gnubg de référence +make reference # régénère results/ (une vingtaine de secondes) +make test # vérifie la cohérence (tests/test_reference.sh) +``` + +`make reference` est déterministe : deux exécutions donnent des fichiers +identiques (`git diff --exit-code tests/reference`). + +## Référence utilisée + +- **gnubg** : GNU Backgammon 1.08.003, commit + 14b67984737ded0f6de43d63dcb789f729d9b06b, compilé par + `docker/gnubg-reference/Dockerfile` (Debian trixie, sans interface + graphique, SIMD SSE2 forcé, drapeaux par défaut de gnubg `-O3 -ffast-math`). +- **Données** : `gnubg.weights` du dépôt, et `gnubg.wd`, `gnubg_os0.bd`, + `gnubg_ts0.bd` produits dans l'image par les outils officiels (`makeweights`, + `makebearoff -o 6 -s 7999999`, `makebearoff -t 6x6`). Leurs sommes SHA-256 + sont dans l'image, `/usr/local/share/gnubg/donnees.sha256` ; le moteur + embarqué doit utiliser exactement ces fichiers. +- **Table d'équité de match** : Kazaross-XG2 (`met/Kazaross-XG2.xml`), la + table par défaut de gnubg. +- **Autres réglages** : ceux par défaut de gnubg. En particulier les castors + (beavers) sont autorisés en partie libre (ils ne figurent pas dans le Match + ID) et ignorés en match, et le filtre de coups est le filtre « Normal ». + +## Positions d'entrée : `positions.json` + +```json +{ + "positions": [ + { + "id": "opening-31", + "type": "move", + "categories": ["opening"], + "description": "Position de départ, premier coup 3-1, partie libre.", + "position_id": "4HPwATDgc/ABMA", + "match_id": "cIkFAAAAAAAA", + "dice": [3, 1] + } + ] +} +``` + +- `id` : identifiant unique, sert de nom de fichier dans `results/`. +- `type` : `"move"` (dés jetés : quel coup jouer) ou `"cube"` (dés pas encore + jetés : faut-il doubler). +- `categories` : étiquettes de couverture. Valeurs utilisées : `opening`, + `middlegame`, `prime`, `blitz`, `race`, `bearoff`, `edge_case`, + `cube_no_double`, `cube_double_take`, `cube_double_pass`, `cube_redouble`, + `cube_too_good`, `match`, `crawford`, `post_crawford`, `jacoby`. +- `position_id`, `match_id` : la position au format GNU Backgammon. Le Match ID + porte tout le contexte : dés, joueur au trait, videau et propriétaire, + longueur du match, score, Crawford, règle Jacoby. +- `dice` : les dés, redondants avec le Match ID (le générateur vérifie qu'ils + concordent) ; `null` pour une décision de videau. + +Pour ajouter une position : obtenir ses identifiants dans gnubg (ils +s'affichent sous le plateau, ou `show gnubgid`), l'ajouter à +`positions.json`, puis `make reference`. + +## Résultats : `results/.json` + +```json +{ + "id": "opening-31", + "type": "move", + "categories": ["opening"], + "description": "…", + "position_id": "4HPwATDgc/ABMA", + "match_id": "cIkFAAAAAAAA", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": [3, 1], + "match_length": 0, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": true, + "beavers": true, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { "evaluation": { … }, "moves": { … } }, + "2": { "evaluation": { … }, "moves": { … } } + } +} +``` + +`context` est le contexte tel que gnubg l'a relu dans le Match ID : +`match_length` vaut 0 en partie libre ; `score_player` est le score du joueur +au trait ; `cube_owner` vaut `centered`, `player` (le joueur au trait) ou +`opponent` ; `beavers` dit si les castors comptent (partie libre seulement). +Voir `results/opening-31.json` pour un fichier complet. + +### Niveaux : `plies` + +Les clés `"0"` et `"2"` sont des niveaux comptés en **plis à la manière de +gnubg** : 0 pli = évaluation statique du réseau de neurones, 2 plis = deux +demi-coups de recherche. Ce sont les réglages prédéfinis « 0ply » et « 2ply » +de gnubg (`aecSettings` dans `eval.c`), sans bruit : cubeful, déterministe, +élagage (`prune`) désactivé à 0 pli et activé à 2 plis. + +### Conventions communes + +- **Point de vue** : tout est donné du point de vue du **joueur au trait** + (celui qui a les dés ou qui doit décider de doubler). Une équité positive + lui est favorable. +- **Probabilités** (`probabilities`), entre 0 et 1, issues des sorties du + réseau de gnubg : + - `win` : probabilité de gagner la partie ; + - `win_gammon` : de gagner au moins un gammon (backgammons compris) ; + - `win_backgammon` : de gagner un backgammon ; + - `lose_gammon` : de perdre au moins un gammon (backgammons compris) ; + - `lose_backgammon` : de perdre un backgammon. + La probabilité de perdre est `1 - win`. +- **Équités** : en points pour un videau à 1. En match, gnubg convertit sa + probabilité de gagner le match en « équité monétaire normalisée » + (`mwc2eq`) ; c'est cette valeur qui est donnée. +- **Nombres** : gnubg calcule en float32 ; chaque nombre est écrit sous la + forme décimale la plus courte qui redonne exactement ce float32. + +### `evaluation` : la position avant le jet des dés + +```json +"evaluation": { + "probabilities": { "win": 0.52483594, "win_gammon": 0.14950693, + "win_backgammon": 0.006851064, "lose_gammon": 0.124798514, + "lose_backgammon": 0.0052878163 }, + "equity": 0.07594353 +} +``` + +Sortie de `gnubg.evaluate` : les cinq probabilités et l'équité **sans videau** +(cubeless) correspondante, au score du match, pour la position *avant* que le +joueur au trait jette les dés (même pour une position de type `move`). + +### `moves` : classement des coups (type `move`) + +```json +"moves": { + "legal_move_count": 16, + "ranking": [ + { "rank": 1, "move": "8/5 6/5", "ply": 1, "equity": 0.20373425, + "equity_diff": 0.0, "probabilities": { … } }, + … + ] +} +``` + +- `legal_move_count` : nombre de coups légaux au sens de gnubg, c'est-à-dire de + **positions d'arrivée distinctes** (deux suites de déplacements qui mènent à + la même position comptent une fois). 0 si aucun coup n'est possible. +- `ranking` : les 10 meilleurs coups (tous s'il y en a moins), dans l'ordre de + la commande `hint` de gnubg : + - `move` : notation de gnubg (`FormatMove`), points comptés du point de vue + du joueur au trait, `bar` et `off`, `*` pour une frappe, `(2)` pour un + déplacement répété ; + - `ply` : niveau auquel ce coup a réellement été évalué. À 2 plis, gnubg + évalue d'abord tous les coups à 0 pli puis ne garde pour les plis + suivants que les meilleurs (filtre « Normal » : à 0 pli les 12 meilleurs + au plus dans un écart de 0,24 ; à 1 pli les 6 meilleurs au plus dans un + écart de 0,12). Les coups éliminés gardent une évaluation à 0 ou 1 pli. + Si un seul coup survit à un filtre, gnubg s'arrête là : c'est le cas de + l'exemple ci-dessus (3-1 d'ouverture à 2 plis), où `8/5 6/5` reste seul + après le filtre de 1 pli et garde donc `"ply": 1`, comme dans l'affichage + « Cubeful 1-ply » de gnubg. Les coups forcés restent à 0 pli ; + - `equity` : équité **avec videau** (cubeful) après ce coup ; + - `equity_diff` : `equity` moins celle du premier coup (0 ou négatif) ; + - `probabilities` : les cinq probabilités après ce coup, toujours du point de + vue du joueur qui vient de jouer. + +Le classement reproduit exactement `hint` : `FindnSaveBestMoves` avec +`fAnalyse` vrai, puis `RefreshMoveList` qui départage les équités égales. + +### `cube` : décision de videau (type `cube`) + +```json +"cube": { + "no_double": 0.83056116, + "double_take": 0.9218164, + "double_pass": 1.0, + "optimal": 0.9218164, + "decision": "DOUBLE_TAKE", + "decision_text": "Double, take" +} +``` + +Sortie de `gnubg.cfevaluate` (`GeneralCubeDecisionE` puis +`FindCubeDecision`), en équités avec videau ramenées à un videau de valeur 1 +(même quand le videau est déjà à 2, voir `cube-redouble`) ; exemple tiré de `cube-double-take` : + +- `no_double` : si le joueur au trait ne double pas ; +- `double_take` : s'il double et que l'adversaire prend ; +- `double_pass` : s'il double et que l'adversaire passe ; vaut 1 par + construction (en match, la probabilité de gagner le match après le passe, + tirée de la table d'équité, est normalisée à 1 par `mwc2eq`) ; +- `optimal` : l'équité retenue après les meilleures décisions des deux côtés ; +- `decision` : nom de la décision dans l'énumération `cubedecision` de + `eval.h` de gnubg (`NODOUBLE_TAKE`, `DOUBLE_TAKE`, `DOUBLE_PASS`, + `TOOGOOD_PASS`, `REDOUBLE_TAKE`, `NODOUBLE_DEADCUBE`…) ; +- `decision_text` : le libellé anglais correspondant de gnubg. + +## Comparaison avec le moteur embarqué + +Une concordance au bit près n'est pas attendue (ADR 0005) : `-ffast-math` et +le jeu d'instructions (SSE2 ici, NEON sur téléphone, C générique en +WebAssembly) changent les derniers chiffres. Les tests de concordance devront +donc comparer les nombres avec une tolérance, et accepter qu'entre deux coups +d'équités presque égales l'ordre s'inverse. diff --git a/tests/reference/generate.py b/tests/reference/generate.py new file mode 100644 index 0000000..9330197 --- /dev/null +++ b/tests/reference/generate.py @@ -0,0 +1,200 @@ +# Générateur des résultats de référence d'Ustagammon. +# +# Ce script s'exécute DANS gnubg (scripting Python intégré), dans l'image +# Docker ustagammon/gnubg-reference : voir `make reference` et README.md. +# Il lit positions.json et écrit un fichier results/.json par position. +# +# Rien n'est calculé ici : toutes les valeurs viennent de gnubg. Le script ne +# fait que piloter gnubg, vérifier ses réglages et mettre en forme. + +import json +import os +import struct + +import gnubg + +FOLDER = os.environ.get("REFERENCE_DIR", "/reference") +PLIES = (0, 2) # niveaux en plis gnubg : 0 = évaluation statique du réseau +MAX_MOVES = 10 # coups gardés dans le classement (tous s'il y en a moins) +MET = "Kazaross-XG2" # table d'équité de match par défaut de gnubg + +# Noms des décisions de videau : énumération cubedecision de eval.h, dans +# l'ordre (gnubg renvoie l'indice). +CUBE_DECISIONS = [ + "DOUBLE_TAKE", "DOUBLE_PASS", "NODOUBLE_TAKE", "TOOGOOD_TAKE", + "TOOGOOD_PASS", "DOUBLE_BEAVER", "NODOUBLE_BEAVER", "REDOUBLE_TAKE", + "REDOUBLE_PASS", "NO_REDOUBLE_TAKE", "TOOGOODRE_TAKE", "TOOGOODRE_PASS", + "NO_REDOUBLE_BEAVER", "NODOUBLE_DEADCUBE", "NO_REDOUBLE_DEADCUBE", + "NOT_AVAILABLE", "OPTIONAL_DOUBLE_TAKE", "OPTIONAL_REDOUBLE_TAKE", + "OPTIONAL_DOUBLE_BEAVER", "OPTIONAL_DOUBLE_PASS", "OPTIONAL_REDOUBLE_PASS", +] + + +def f32(x): + """Écriture décimale la plus courte qui redonne exactement le float32 + calculé par gnubg (gnubg travaille en simple précision).""" + target = struct.pack(" 0 else 0, "noise": 0.0} + + +def set_chequer_settings(ply): + """Règle l'évaluation utilisée par la commande hint de gnubg.""" + prefix = "set evaluation chequerplay evaluation " + gnubg.command("set evaluation chequerplay type evaluation") + gnubg.command(prefix + "plies %d" % ply) + gnubg.command(prefix + "cubeful on") + gnubg.command(prefix + "prune " + ("on" if ply > 0 else "off")) + gnubg.command(prefix + "deterministic on") + gnubg.command(prefix + "noise 0") + + +def load_position(pos): + """Installe la position et vide le cache d'évaluation : chaque calcul se + fait comme sur un moteur neuf. Vérifie que gnubg relit les mêmes IDs.""" + gnubg.command("clear cache") + gnubg.command("set gnubgid %s:%s" % (pos["position_id"], pos["match_id"])) + read_back = (gnubg.positionid(), gnubg.matchid()) + if read_back != (pos["position_id"], pos["match_id"]): + raise SystemExit("%s : gnubg relit %s" % (pos["id"], read_back)) + + +def cube_info(): + """Contexte du videau de la position courante, tel que gnubg l'utilise + pour ses propres analyses (GetMatchStateCubeInfo). gnubg.cubeinfo() + déduit les castors du nombre de castors déjà joués dans la partie (0) ; + gnubg, lui, les autorise en partie libre (réglage par défaut nBeavers = 3) + et les ignore en match.""" + ci = gnubg.cubeinfo() + ci["beavers"] = 1 if ci["matchto"] == 0 else 0 + return ci + + +def game_context(pos): + ci = cube_info() + dice = gnubg.posinfo()["dice"] + dice = list(dice) if dice[0] else None + if dice != pos["dice"]: + raise SystemExit("%s : dés %s dans le Match ID, %s dans positions.json" + % (pos["id"], dice, pos["dice"])) + me = ci["move"] + owner = ci["cubeowner"] + return { + "dice": dice, + "match_length": ci["matchto"], + "score_player": ci["score"][me], + "score_opponent": ci["score"][1 - me], + "crawford": bool(ci["crawford"]), + "jacoby": bool(ci["jacoby"]), + "beavers": bool(ci["beavers"]), + "cube_value": ci["cube"], + "cube_owner": "centered" if owner < 0 else "player" if owner == me else "opponent", + } + + +def evaluate(ply): + r = gnubg.evaluate(gnubg.board(), cube_info(), eval_context(ply)) + return {"probabilities": probabilities(r[:5]), "equity": f32(r[5])} + + +def rank_moves(pos, ply): + set_chequer_settings(ply) + load_position(pos) # efface aussi l'analyse que gnubg garde en mémoire + hint = gnubg.hint() + moves = hint["hint"] if hint else [] + ranking = [] + for m in moves[:MAX_MOVES]: + ctx = m.get("context", {}) + if m["type"] != "eval" or ctx["noise"] != 0 or not ctx["cubeful"]: + raise SystemExit("%s : coup évalué autrement que prévu : %r" % (pos["id"], m)) + ranking.append({ + "rank": m["movenum"], + "move": m["move"], + "ply": ctx["plies"], + "equity": f32(m["equity"]), + "equity_diff": f32(m["eqdiff"]), + "probabilities": probabilities(m["details"]["probs"]), + }) + return {"legal_move_count": len(moves), "ranking": ranking} + + +def cube_decision(ply): + r = gnubg.cfevaluate(gnubg.board(), cube_info(), eval_context(ply)) + return { + "no_double": f32(r[1]), + "double_take": f32(r[2]), + "double_pass": f32(r[3]), + "optimal": f32(r[0]), + "decision": CUBE_DECISIONS[r[4]], + "decision_text": r[5], + } + + +def check_settings(): + """Vérifie les réglages par défaut dont dépendent les résultats.""" + # Filtre « Normal » pour 2 plis : (niveau, coups acceptés, en plus, écart). + expected = [(0, 0, 12, 0.24), (1, 0, 6, 0.12)] + two_ply = [(f["level"], f["acceptmoves"], f["extramoves"], round(f["threshold"], 6)) + for f in gnubg.getevalhintfilter() if f["ply"] == 2] + if two_ply != expected: + raise SystemExit("filtre de coups inattendu : %r" % (two_ply,)) + if MET not in gnubg.show("matchequitytable"): + raise SystemExit("table d'équité de match inattendue") + + +def main(): + with open(os.path.join(FOLDER, "positions.json"), encoding="utf-8") as f: + positions = json.load(f)["positions"] + with open("/usr/local/share/gnubg/commit") as f: + commit = f.read().strip() + check_settings() + out_dir = os.path.join(FOLDER, "results") + os.makedirs(out_dir, exist_ok=True) + for pos in positions: + load_position(pos) + result = { + "id": pos["id"], + "type": pos["type"], + "categories": pos["categories"], + "description": pos["description"], + "position_id": pos["position_id"], + "match_id": pos["match_id"], + "gnubg_commit": commit, + "met": MET, + "context": game_context(pos), + "plies": {}, + } + for ply in PLIES: + load_position(pos) + level = {"evaluation": evaluate(ply)} + if pos["type"] == "move": + level["moves"] = rank_moves(pos, ply) + else: + level["cube"] = cube_decision(ply) + result["plies"][str(ply)] = level + with open(os.path.join(out_dir, pos["id"] + ".json"), "w", encoding="utf-8") as f: + json.dump(result, f, ensure_ascii=False, indent=2) + f.write("\n") + print("référence écrite :", pos["id"]) + + +main() diff --git a/tests/reference/positions.json b/tests/reference/positions.json new file mode 100644 index 0000000..6b13046 --- /dev/null +++ b/tests/reference/positions.json @@ -0,0 +1,440 @@ +{ + "positions": [ + { + "id": "opening-31", + "type": "move", + "categories": [ + "opening" + ], + "description": "Position de départ, premier coup 3-1, partie libre.", + "position_id": "4HPwATDgc/ABMA", + "match_id": "cIkFAAAAAAAA", + "dice": [ + 3, + 1 + ] + }, + { + "id": "opening-42", + "type": "move", + "categories": [ + "opening" + ], + "description": "Position de départ, premier coup 4-2, partie libre.", + "position_id": "4HPwATDgc/ABMA", + "match_id": "cAkKAAAAAAAA", + "dice": [ + 4, + 2 + ] + }, + { + "id": "opening-65", + "type": "move", + "categories": [ + "opening" + ], + "description": "Position de départ, premier coup 6-5, partie libre.", + "position_id": "4HPwATDgc/ABMA", + "match_id": "cAkXAAAAAAAA", + "dice": [ + 6, + 5 + ] + }, + { + "id": "opening-21", + "type": "move", + "categories": [ + "opening" + ], + "description": "Position de départ, premier coup 2-1, partie libre.", + "position_id": "4HPwATDgc/ABMA", + "match_id": "cAkFAAAAAAAA", + "dice": [ + 2, + 1 + ] + }, + { + "id": "opening-64-match", + "type": "move", + "categories": [ + "opening", + "match" + ], + "description": "Position de départ, premier coup 6-4, match en 5 points à 0-0.", + "position_id": "4HPwATDgc/ABMA", + "match_id": "cAmzAAAAAAAE", + "dice": [ + 6, + 4 + ] + }, + { + "id": "middlegame-1", + "type": "move", + "categories": [ + "middlegame" + ], + "description": "Milieu de partie avec contact, 6-4 à jouer.", + "position_id": "mM/gATCw5+ABMA", + "match_id": "cAkTAAAAAAAA", + "dice": [ + 6, + 4 + ] + }, + { + "id": "middlegame-2", + "type": "move", + "categories": [ + "middlegame" + ], + "description": "Milieu de partie avec contact et dames isolées, 5-3 à jouer.", + "position_id": "xGfhATDQ2+BBIA", + "match_id": "cIkOAAAAAAAA", + "dice": [ + 5, + 3 + ] + }, + { + "id": "middlegame-holding", + "type": "move", + "categories": [ + "middlegame" + ], + "description": "Jeu de tenue (point 20 tenu), 6-2 à jouer.", + "position_id": "mLfBARg4z8EBAw", + "match_id": "cAkLAAAAAAAA", + "dice": [ + 6, + 2 + ] + }, + { + "id": "prime-1", + "type": "move", + "categories": [ + "prime" + ], + "description": "Prime de sept points (4 à 10) contre deux dames bloquées, 6-5 à jouer.", + "position_id": "sOfgASjYbtsAAA", + "match_id": "cAkXAAAAAAAA", + "dice": [ + 6, + 5 + ] + }, + { + "id": "prime-vs-prime", + "type": "move", + "categories": [ + "prime" + ], + "description": "Prime contre prime, 4-2 à jouer.", + "position_id": "4LZtAAbAbZsBAw", + "match_id": "cAkKAAAAAAAA", + "dice": [ + 4, + 2 + ] + }, + { + "id": "blitz-1", + "type": "move", + "categories": [ + "blitz" + ], + "description": "Attaque : deux dames adverses sur la barre, 4-3 à jouer.", + "position_id": "4Dn4AGiynYMHAA", + "match_id": "cAkOAAAAAAAA", + "dice": [ + 4, + 3 + ] + }, + { + "id": "blitz-2", + "type": "move", + "categories": [ + "blitz" + ], + "description": "Attaque : une dame adverse sur la barre, double 3-3 à jouer.", + "position_id": "4HPwAVC0XYMHAA", + "match_id": "cIkNAAAAAAAA", + "dice": [ + 3, + 3 + ] + }, + { + "id": "race-1", + "type": "move", + "categories": [ + "race" + ], + "description": "Course courte sans contact, 6-2 à jouer.", + "position_id": "trsXAADs7mwAAA", + "match_id": "cAkLAAAAAAAA", + "dice": [ + 6, + 2 + ] + }, + { + "id": "race-2", + "type": "move", + "categories": [ + "race" + ], + "description": "Course longue sans contact, 5-4 à jouer.", + "position_id": "cLezAQBwN2cGAA", + "match_id": "cIkSAAAAAAAA", + "dice": [ + 5, + 4 + ] + }, + { + "id": "bearoff-short", + "type": "move", + "categories": [ + "bearoff" + ], + "description": "Sortie à peu de dames (base à deux côtés), 2-1 à jouer.", + "position_id": "TQAAYAsAAAAAAA", + "match_id": "cAkFAAAAAAAA", + "dice": [ + 2, + 1 + ] + }, + { + "id": "bearoff-15-checkers", + "type": "move", + "categories": [ + "bearoff" + ], + "description": "Sortie à 15 dames contre 15 (base à un côté), 6-5 à jouer.", + "position_id": "290NAADb7g4AAA", + "match_id": "cAkXAAAAAAAA", + "dice": [ + 6, + 5 + ] + }, + { + "id": "bearoff-doubles", + "type": "move", + "categories": [ + "bearoff" + ], + "description": "Sortie, double 6-6 à jouer.", + "position_id": "xgAA4MgAAAAAAA", + "match_id": "cAkbAAAAAAAA", + "dice": [ + 6, + 6 + ] + }, + { + "id": "no-legal-move", + "type": "move", + "categories": [ + "edge_case" + ], + "description": "Dame sur la barre face à un jan fermé : aucun coup légal avec 5-5.", + "position_id": "27YBBwAcz8EDQA", + "match_id": "cIkWAAAAAAAA", + "dice": [ + 5, + 5 + ] + }, + { + "id": "forced-move", + "type": "move", + "categories": [ + "edge_case" + ], + "description": "Deux dames sur la barre, un seul point d'entrée : coup forcé avec 3-1.", + "position_id": "tm3ABwBw5+ABYA", + "match_id": "cIkFAAAAAAAA", + "dice": [ + 3, + 1 + ] + }, + { + "id": "cube-no-double", + "type": "cube", + "categories": [ + "cube_no_double" + ], + "description": "Position presque égale, videau centré : pas de double.", + "position_id": "2J0dBgDYnRsGAA", + "match_id": "cAkAAAAAAAAA", + "dice": null + }, + { + "id": "cube-double-take", + "type": "cube", + "categories": [ + "cube_double_take", + "race" + ], + "description": "Course avec avance modérée, videau centré : double, prend.", + "position_id": "6O5uAAC4uzsAAA", + "match_id": "cAkAAAAAAAAA", + "dice": null + }, + { + "id": "cube-double-pass", + "type": "cube", + "categories": [ + "cube_double_pass", + "race" + ], + "description": "Course avec grosse avance, videau centré : double, passe.", + "position_id": "cHd3AADvvQMAAA", + "match_id": "cAkAAAAAAAAA", + "dice": null + }, + { + "id": "cube-redouble", + "type": "cube", + "categories": [ + "cube_redouble", + "race" + ], + "description": "Course avec avance, videau à 2 possédé par le joueur au trait : redouble.", + "position_id": "6O5uAAC4uzsAAA", + "match_id": "UQkAAAAAAAAA", + "dice": null + }, + { + "id": "cube-blitz", + "type": "cube", + "categories": [ + "cube_too_good", + "blitz" + ], + "description": "Attaque forte, videau centré, partie libre sans règle Jacoby.", + "position_id": "4Dn4AGiynYMHAA", + "match_id": "cAkAAAAAAAAE", + "dice": null + }, + { + "id": "jacoby-cube", + "type": "cube", + "categories": [ + "jacoby", + "blitz" + ], + "description": "Même attaque que cube-blitz, avec la règle Jacoby.", + "position_id": "4Dn4AGiynYMHAA", + "match_id": "cAkAAAAAAAAA", + "dice": null + }, + { + "id": "jacoby-move", + "type": "move", + "categories": [ + "jacoby", + "blitz" + ], + "description": "Attaque avec la règle Jacoby, 6-4 à jouer.", + "position_id": "4HPwAVC0XYMHAA", + "match_id": "cAkTAAAAAAAA", + "dice": [ + 6, + 4 + ] + }, + { + "id": "match-3-3-move", + "type": "move", + "categories": [ + "match", + "middlegame" + ], + "description": "Match en 5 points, 2-2 (3-away 3-away), 5-3 à jouer.", + "position_id": "xGfhATDQ2+BBIA", + "match_id": "cImuACAAEAAE", + "dice": [ + 5, + 3 + ] + }, + { + "id": "match-dmp-move", + "type": "move", + "categories": [ + "match", + "middlegame" + ], + "description": "Match en 1 point (double match point), 6-2 à jouer.", + "position_id": "mLfBARg4z8EBAw", + "match_id": "cAkrAAAAAAAE", + "dice": [ + 6, + 2 + ] + }, + { + "id": "match-7-cube", + "type": "cube", + "categories": [ + "match", + "race" + ], + "description": "Match en 7 points, joueur au trait à 3, adversaire à 5 : décision de videau.", + "position_id": "cHd3AAC4uzsAAA", + "match_id": "cAngAFAAGAAE", + "dice": null + }, + { + "id": "match-crawford-move", + "type": "move", + "categories": [ + "match", + "crawford", + "blitz" + ], + "description": "Match en 5 points, partie Crawford, joueur au trait mené 2-4, 4-3 à jouer.", + "position_id": "4Dn4AGiynYMHAA", + "match_id": "8AmuAEAAEAAE", + "dice": [ + 4, + 3 + ] + }, + { + "id": "match-crawford-cube", + "type": "cube", + "categories": [ + "match", + "crawford", + "race" + ], + "description": "Match en 5 points, partie Crawford : videau mort.", + "position_id": "cHd3AAC4uzsAAA", + "match_id": "8AmgAEAAEAAE", + "dice": null + }, + { + "id": "match-post-crawford-cube", + "type": "cube", + "categories": [ + "match", + "post_crawford" + ], + "description": "Match en 5 points, après Crawford, joueur au trait mené 2-4 : videau.", + "position_id": "2J0dBgDYnRsGAA", + "match_id": "cAmgAEAAEAAE", + "dice": null + } + ] +} diff --git a/tests/reference/results/bearoff-15-checkers.json b/tests/reference/results/bearoff-15-checkers.json new file mode 100644 index 0000000..779eeab --- /dev/null +++ b/tests/reference/results/bearoff-15-checkers.json @@ -0,0 +1,118 @@ +{ + "id": "bearoff-15-checkers", + "type": "move", + "categories": [ + "bearoff" + ], + "description": "Sortie à 15 dames contre 15 (base à un côté), 6-5 à jouer.", + "position_id": "290NAADb7g4AAA", + "match_id": "cAkXAAAAAAAA", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": [ + 6, + 5 + ], + "match_length": 0, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": true, + "beavers": true, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.5665677, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 0.0, + "lose_backgammon": 0.0 + }, + "equity": 0.13313544 + }, + "moves": { + "legal_move_count": 2, + "ranking": [ + { + "rank": 1, + "move": "6/off 5/off", + "ply": 0, + "equity": 0.4084316, + "equity_diff": 0.0, + "probabilities": { + "win": 0.6458684, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 0.0, + "lose_backgammon": 0.0 + } + }, + { + "rank": 2, + "move": "6/1 6/off", + "ply": 0, + "equity": 0.20709176, + "equity_diff": -0.20133983, + "probabilities": { + "win": 0.5739614, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 0.0, + "lose_backgammon": 0.0 + } + } + ] + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.5665742, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 0.0, + "lose_backgammon": 0.0 + }, + "equity": 0.13314843 + }, + "moves": { + "legal_move_count": 2, + "ranking": [ + { + "rank": 1, + "move": "6/off 5/off", + "ply": 1, + "equity": 0.4440637, + "equity_diff": 0.0, + "probabilities": { + "win": 0.64587986, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 0.0, + "lose_backgammon": 0.0 + } + }, + { + "rank": 2, + "move": "6/1 6/off", + "ply": 1, + "equity": 0.21062364, + "equity_diff": -0.23344006, + "probabilities": { + "win": 0.5739729, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 0.0, + "lose_backgammon": 0.0 + } + } + ] + } + } + } +} diff --git a/tests/reference/results/bearoff-doubles.json b/tests/reference/results/bearoff-doubles.json new file mode 100644 index 0000000..0bf9149 --- /dev/null +++ b/tests/reference/results/bearoff-doubles.json @@ -0,0 +1,90 @@ +{ + "id": "bearoff-doubles", + "type": "move", + "categories": [ + "bearoff" + ], + "description": "Sortie, double 6-6 à jouer.", + "position_id": "xgAA4MgAAAAAAA", + "match_id": "cAkbAAAAAAAA", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": [ + 6, + 6 + ], + "match_length": 0, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": true, + "beavers": true, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.2702983, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 0.0, + "lose_backgammon": 0.0 + }, + "equity": -0.4594034 + }, + "moves": { + "legal_move_count": 1, + "ranking": [ + { + "rank": 1, + "move": "6/off(2) 4/off 1/off", + "ply": 0, + "equity": 0.8888838, + "equity_diff": 0.0, + "probabilities": { + "win": 0.9444419, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 0.0, + "lose_backgammon": 0.0 + } + } + ] + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.2702983, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 0.0, + "lose_backgammon": 0.0 + }, + "equity": -0.4594034 + }, + "moves": { + "legal_move_count": 1, + "ranking": [ + { + "rank": 1, + "move": "6/off(2) 4/off 1/off", + "ply": 0, + "equity": 0.8888838, + "equity_diff": 0.0, + "probabilities": { + "win": 0.9444419, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 0.0, + "lose_backgammon": 0.0 + } + } + ] + } + } + } +} diff --git a/tests/reference/results/bearoff-short.json b/tests/reference/results/bearoff-short.json new file mode 100644 index 0000000..046f946 --- /dev/null +++ b/tests/reference/results/bearoff-short.json @@ -0,0 +1,174 @@ +{ + "id": "bearoff-short", + "type": "move", + "categories": [ + "bearoff" + ], + "description": "Sortie à peu de dames (base à deux côtés), 2-1 à jouer.", + "position_id": "TQAAYAsAAAAAAA", + "match_id": "cAkFAAAAAAAA", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": [ + 2, + 1 + ], + "match_length": 0, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": true, + "beavers": true, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.38315403, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 0.0, + "lose_backgammon": 0.0 + }, + "equity": -0.23369193 + }, + "moves": { + "legal_move_count": 4, + "ranking": [ + { + "rank": 1, + "move": "2/off 1/off", + "ply": 0, + "equity": -0.8607614, + "equity_diff": 0.0, + "probabilities": { + "win": 0.2701915, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 0.0, + "lose_backgammon": 0.0 + } + }, + { + "rank": 2, + "move": "3/off", + "ply": 0, + "equity": -0.8607614, + "equity_diff": 0.0, + "probabilities": { + "win": 0.2701915, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 0.0, + "lose_backgammon": 0.0 + } + }, + { + "rank": 3, + "move": "2/1 2/off", + "ply": 0, + "equity": -0.95561147, + "equity_diff": -0.09485006, + "probabilities": { + "win": 0.24164188, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 0.0, + "lose_backgammon": 0.0 + } + }, + { + "rank": 4, + "move": "3/1 2/1", + "ply": 0, + "equity": -1.0, + "equity_diff": -0.1392386, + "probabilities": { + "win": 0.05070573, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 0.0, + "lose_backgammon": 0.0 + } + } + ] + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.38315403, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 0.0, + "lose_backgammon": 0.0 + }, + "equity": -0.23369193 + }, + "moves": { + "legal_move_count": 4, + "ranking": [ + { + "rank": 1, + "move": "2/off 1/off", + "ply": 2, + "equity": -0.8607614, + "equity_diff": 0.0, + "probabilities": { + "win": 0.2701915, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 0.0, + "lose_backgammon": 0.0 + } + }, + { + "rank": 2, + "move": "3/off", + "ply": 2, + "equity": -0.8607614, + "equity_diff": 0.0, + "probabilities": { + "win": 0.2701915, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 0.0, + "lose_backgammon": 0.0 + } + }, + { + "rank": 3, + "move": "2/1 2/off", + "ply": 2, + "equity": -0.95561147, + "equity_diff": -0.09485006, + "probabilities": { + "win": 0.24164188, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 0.0, + "lose_backgammon": 0.0 + } + }, + { + "rank": 4, + "move": "3/1 2/1", + "ply": 1, + "equity": -1.0, + "equity_diff": -0.1392386, + "probabilities": { + "win": 0.05070573, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 0.0, + "lose_backgammon": 0.0 + } + } + ] + } + } + } +} diff --git a/tests/reference/results/blitz-1.json b/tests/reference/results/blitz-1.json new file mode 100644 index 0000000..2ca23ec --- /dev/null +++ b/tests/reference/results/blitz-1.json @@ -0,0 +1,342 @@ +{ + "id": "blitz-1", + "type": "move", + "categories": [ + "blitz" + ], + "description": "Attaque : deux dames adverses sur la barre, 4-3 à jouer.", + "position_id": "4Dn4AGiynYMHAA", + "match_id": "cAkOAAAAAAAA", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": [ + 4, + 3 + ], + "match_length": 0, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": true, + "beavers": true, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.8259491, + "win_gammon": 0.63558626, + "win_backgammon": 0.051824015, + "lose_gammon": 0.01410268, + "lose_backgammon": 0.00029838496 + }, + "equity": 1.3249073 + }, + "moves": { + "legal_move_count": 20, + "ranking": [ + { + "rank": 1, + "move": "8/5 6/2", + "ply": 0, + "equity": 0.9093857, + "equity_diff": 0.0, + "probabilities": { + "win": 0.81122017, + "win_gammon": 0.6180843, + "win_backgammon": 0.039920993, + "lose_gammon": 0.016159898, + "lose_backgammon": 0.000108429565 + } + }, + { + "rank": 2, + "move": "5/2 5/1*", + "ply": 0, + "equity": 0.90894336, + "equity_diff": -0.00044232607, + "probabilities": { + "win": 0.8102987, + "win_gammon": 0.6098554, + "win_backgammon": 0.035345834, + "lose_gammon": 0.030515661, + "lose_backgammon": 0.0003538893 + } + }, + { + "rank": 3, + "move": "8/1*", + "ply": 0, + "equity": 0.90392095, + "equity_diff": -0.0054647326, + "probabilities": { + "win": 0.7998353, + "win_gammon": 0.60838807, + "win_backgammon": 0.042721834, + "lose_gammon": 0.031395618, + "lose_backgammon": 0.0006257314 + } + }, + { + "rank": 4, + "move": "13/10 6/2", + "ply": 0, + "equity": 0.90364444, + "equity_diff": -0.0057412386, + "probabilities": { + "win": 0.7992593, + "win_gammon": 0.58293045, + "win_backgammon": 0.042541374, + "lose_gammon": 0.013131926, + "lose_backgammon": 0.0 + } + }, + { + "rank": 5, + "move": "13/9 8/5", + "ply": 0, + "equity": 0.8956786, + "equity_diff": -0.013707101, + "probabilities": { + "win": 0.78266376, + "win_gammon": 0.56832266, + "win_backgammon": 0.050313737, + "lose_gammon": 0.025197603, + "lose_backgammon": 0.00045250903 + } + }, + { + "rank": 6, + "move": "8/5 8/4", + "ply": 0, + "equity": 0.8944891, + "equity_diff": -0.014896572, + "probabilities": { + "win": 0.7801856, + "win_gammon": 0.58423555, + "win_backgammon": 0.04737587, + "lose_gammon": 0.029746175, + "lose_backgammon": 0.0005981548 + } + }, + { + "rank": 7, + "move": "13/10 8/4", + "ply": 0, + "equity": 0.8932646, + "equity_diff": -0.01612109, + "probabilities": { + "win": 0.7776346, + "win_gammon": 0.5655885, + "win_backgammon": 0.05003428, + "lose_gammon": 0.026805501, + "lose_backgammon": 0.0005106817 + } + }, + { + "rank": 8, + "move": "13/10 13/9", + "ply": 0, + "equity": 0.89323187, + "equity_diff": -0.016153812, + "probabilities": { + "win": 0.7775664, + "win_gammon": 0.5375285, + "win_backgammon": 0.04898261, + "lose_gammon": 0.025490344, + "lose_backgammon": 0.00049680925 + } + }, + { + "rank": 9, + "move": "6/2 4/1*", + "ply": 0, + "equity": 0.8909342, + "equity_diff": -0.018451452, + "probabilities": { + "win": 0.7727797, + "win_gammon": 0.5636064, + "win_backgammon": 0.036480173, + "lose_gammon": 0.03844223, + "lose_backgammon": 0.00076097733 + } + }, + { + "rank": 10, + "move": "13/6", + "ply": 0, + "equity": 0.890733, + "equity_diff": -0.018652678, + "probabilities": { + "win": 0.77236044, + "win_gammon": 0.5431621, + "win_backgammon": 0.044880137, + "lose_gammon": 0.02577741, + "lose_backgammon": 0.00032665874 + } + } + ] + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.8177575, + "win_gammon": 0.6248996, + "win_backgammon": 0.04603396, + "lose_gammon": 0.016648903, + "lose_backgammon": 0.0004305263 + }, + "equity": 1.2893691 + }, + "moves": { + "legal_move_count": 20, + "ranking": [ + { + "rank": 1, + "move": "8/5 6/2", + "ply": 2, + "equity": 1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.81665856, + "win_gammon": 0.6159559, + "win_backgammon": 0.050336592, + "lose_gammon": 0.01610412, + "lose_backgammon": 0.000110576926 + } + }, + { + "rank": 2, + "move": "13/10 6/2", + "ply": 2, + "equity": 1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.81210685, + "win_gammon": 0.6009171, + "win_backgammon": 0.051549952, + "lose_gammon": 0.015562758, + "lose_backgammon": 9.578926e-05 + } + }, + { + "rank": 3, + "move": "13/6", + "ply": 2, + "equity": 0.99992114, + "equity_diff": -7.8856945e-05, + "probabilities": { + "win": 0.77379155, + "win_gammon": 0.5123651, + "win_backgammon": 0.043433707, + "lose_gammon": 0.025855184, + "lose_backgammon": 0.00035371762 + } + }, + { + "rank": 4, + "move": "13/10 13/9", + "ply": 2, + "equity": 0.99970096, + "equity_diff": -0.0002990365, + "probabilities": { + "win": 0.7776103, + "win_gammon": 0.51509345, + "win_backgammon": 0.0470933, + "lose_gammon": 0.02603421, + "lose_backgammon": 0.00053207396 + } + }, + { + "rank": 5, + "move": "13/9 8/5", + "ply": 2, + "equity": 0.99941623, + "equity_diff": -0.0005837679, + "probabilities": { + "win": 0.7825747, + "win_gammon": 0.53879386, + "win_backgammon": 0.04923886, + "lose_gammon": 0.025207901, + "lose_backgammon": 0.00046286164 + } + }, + { + "rank": 6, + "move": "13/10 8/4", + "ply": 2, + "equity": 0.99862504, + "equity_diff": -0.00137496, + "probabilities": { + "win": 0.7787585, + "win_gammon": 0.52968854, + "win_backgammon": 0.04714619, + "lose_gammon": 0.025802476, + "lose_backgammon": 0.0004662624 + } + }, + { + "rank": 7, + "move": "8/1*", + "ply": 1, + "equity": 0.99609977, + "equity_diff": -0.00390023, + "probabilities": { + "win": 0.7874034, + "win_gammon": 0.55951935, + "win_backgammon": 0.040331442, + "lose_gammon": 0.02822813, + "lose_backgammon": 0.001064448 + } + }, + { + "rank": 8, + "move": "5/2 5/1*", + "ply": 1, + "equity": 0.9946342, + "equity_diff": -0.005365789, + "probabilities": { + "win": 0.7942897, + "win_gammon": 0.5627169, + "win_backgammon": 0.032200348, + "lose_gammon": 0.025856044, + "lose_backgammon": 0.00085652235 + } + }, + { + "rank": 9, + "move": "8/5 8/4", + "ply": 1, + "equity": 0.99273163, + "equity_diff": -0.007268369, + "probabilities": { + "win": 0.765936, + "win_gammon": 0.53217345, + "win_backgammon": 0.047750887, + "lose_gammon": 0.027644774, + "lose_backgammon": 0.0008184419 + } + }, + { + "rank": 10, + "move": "13/9 5/2", + "ply": 1, + "equity": 0.9829085, + "equity_diff": -0.017091513, + "probabilities": { + "win": 0.76645356, + "win_gammon": 0.50858366, + "win_backgammon": 0.04323478, + "lose_gammon": 0.027814435, + "lose_backgammon": 0.0008966248 + } + } + ] + } + } + } +} diff --git a/tests/reference/results/blitz-2.json b/tests/reference/results/blitz-2.json new file mode 100644 index 0000000..6933ff7 --- /dev/null +++ b/tests/reference/results/blitz-2.json @@ -0,0 +1,342 @@ +{ + "id": "blitz-2", + "type": "move", + "categories": [ + "blitz" + ], + "description": "Attaque : une dame adverse sur la barre, double 3-3 à jouer.", + "position_id": "4HPwAVC0XYMHAA", + "match_id": "cIkNAAAAAAAA", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": [ + 3, + 3 + ], + "match_length": 0, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": true, + "beavers": true, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.8636842, + "win_gammon": 0.57455575, + "win_backgammon": 0.017836282, + "lose_gammon": 0.015630726, + "lose_backgammon": 0.00039723353 + }, + "equity": 1.3037324 + }, + "moves": { + "legal_move_count": 110, + "ranking": [ + { + "rank": 1, + "move": "13/10 6/3 4/1*(2)", + "ply": 0, + "equity": 0.9465638, + "equity_diff": 0.0, + "probabilities": { + "win": 0.8886746, + "win_gammon": 0.72519463, + "win_backgammon": 0.013819454, + "lose_gammon": 0.011886803, + "lose_backgammon": 0.00012537274 + } + }, + { + "rank": 2, + "move": "8/5 6/3 4/1*(2)", + "ply": 0, + "equity": 0.9422797, + "equity_diff": -0.004284084, + "probabilities": { + "win": 0.87974936, + "win_gammon": 0.7156389, + "win_backgammon": 0.009178609, + "lose_gammon": 0.01456464, + "lose_backgammon": 0.00016020882 + } + }, + { + "rank": 3, + "move": "13/7 13/10 6/3", + "ply": 0, + "equity": 0.94128984, + "equity_diff": -0.005273938, + "probabilities": { + "win": 0.8776872, + "win_gammon": 0.5112293, + "win_backgammon": 0.0141497, + "lose_gammon": 0.0074532446, + "lose_backgammon": 0.0 + } + }, + { + "rank": 4, + "move": "13/7 8/5 6/3", + "ply": 0, + "equity": 0.9370698, + "equity_diff": -0.009494007, + "probabilities": { + "win": 0.86889535, + "win_gammon": 0.55097055, + "win_backgammon": 0.01863856, + "lose_gammon": 0.011322638, + "lose_backgammon": 0.0 + } + }, + { + "rank": 5, + "move": "13/10(2) 7/4 6/3", + "ply": 0, + "equity": 0.93615985, + "equity_diff": -0.010403931, + "probabilities": { + "win": 0.86699975, + "win_gammon": 0.5390125, + "win_backgammon": 0.016794147, + "lose_gammon": 0.012118461, + "lose_backgammon": 0.0 + } + }, + { + "rank": 6, + "move": "13/10(2) 8/5 6/3", + "ply": 0, + "equity": 0.9330082, + "equity_diff": -0.013555586, + "probabilities": { + "win": 0.8604338, + "win_gammon": 0.55904984, + "win_backgammon": 0.02250115, + "lose_gammon": 0.015764605, + "lose_backgammon": 0.00017458491 + } + }, + { + "rank": 7, + "move": "13/10 8/5 7/4 6/3", + "ply": 0, + "equity": 0.932737, + "equity_diff": -0.0138267875, + "probabilities": { + "win": 0.85986876, + "win_gammon": 0.5640921, + "win_backgammon": 0.022453232, + "lose_gammon": 0.013957403, + "lose_backgammon": 0.00011591845 + } + }, + { + "rank": 8, + "move": "13/10 7/1* 6/3", + "ply": 0, + "equity": 0.9313148, + "equity_diff": -0.015248954, + "probabilities": { + "win": 0.8569059, + "win_gammon": 0.65772825, + "win_backgammon": 0.018538328, + "lose_gammon": 0.0136713525, + "lose_backgammon": 0.00017456421 + } + }, + { + "rank": 9, + "move": "8/5 7/1* 6/3", + "ply": 0, + "equity": 0.93129885, + "equity_diff": -0.015264928, + "probabilities": { + "win": 0.8568727, + "win_gammon": 0.676396, + "win_backgammon": 0.014874272, + "lose_gammon": 0.016498892, + "lose_backgammon": 0.00021990643 + } + }, + { + "rank": 10, + "move": "13/4 6/3", + "ply": 0, + "equity": 0.92980635, + "equity_diff": -0.016757429, + "probabilities": { + "win": 0.8537633, + "win_gammon": 0.54661536, + "win_backgammon": 0.021078322, + "lose_gammon": 0.015184178, + "lose_backgammon": 0.00014520474 + } + } + ] + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.8528266, + "win_gammon": 0.5386192, + "win_backgammon": 0.014262153, + "lose_gammon": 0.013019987, + "lose_backgammon": 0.00017201946 + }, + "equity": 1.2453425 + }, + "moves": { + "legal_move_count": 110, + "ranking": [ + { + "rank": 1, + "move": "13/10 7/1* 6/3", + "ply": 2, + "equity": 1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.8607166, + "win_gammon": 0.6322813, + "win_backgammon": 0.017087897, + "lose_gammon": 0.015748853, + "lose_backgammon": 0.00025091908 + } + }, + { + "rank": 2, + "move": "13/7 13/10 6/3", + "ply": 2, + "equity": 1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.87094545, + "win_gammon": 0.5271091, + "win_backgammon": 0.015117481, + "lose_gammon": 0.008714644, + "lose_backgammon": 5.2726853e-05 + } + }, + { + "rank": 3, + "move": "13/7 8/5 6/3", + "ply": 2, + "equity": 1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.8602668, + "win_gammon": 0.5367975, + "win_backgammon": 0.018686661, + "lose_gammon": 0.010968306, + "lose_backgammon": 7.4010575e-05 + } + }, + { + "rank": 4, + "move": "13/10(2) 8/5 6/3", + "ply": 2, + "equity": 1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.8586206, + "win_gammon": 0.539141, + "win_backgammon": 0.01848739, + "lose_gammon": 0.013003148, + "lose_backgammon": 0.00014833493 + } + }, + { + "rank": 5, + "move": "13/10(2) 7/4 6/3", + "ply": 2, + "equity": 1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.8608149, + "win_gammon": 0.5221586, + "win_backgammon": 0.017969444, + "lose_gammon": 0.011417871, + "lose_backgammon": 5.6085017e-05 + } + }, + { + "rank": 6, + "move": "13/10 8/5 7/4 6/3", + "ply": 2, + "equity": 1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.85235405, + "win_gammon": 0.5273741, + "win_backgammon": 0.018858938, + "lose_gammon": 0.012846364, + "lose_backgammon": 7.204357e-05 + } + }, + { + "rank": 7, + "move": "13/10 8/5(2) 6/3", + "ply": 2, + "equity": 1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.843128, + "win_gammon": 0.5267622, + "win_backgammon": 0.01963117, + "lose_gammon": 0.013747729, + "lose_backgammon": 0.00013106255 + } + }, + { + "rank": 8, + "move": "13/4 6/3", + "ply": 2, + "equity": 1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.849905, + "win_gammon": 0.51219106, + "win_backgammon": 0.017563311, + "lose_gammon": 0.013114546, + "lose_backgammon": 0.00010297247 + } + }, + { + "rank": 9, + "move": "13/10 6/3 4/1*(2)", + "ply": 2, + "equity": 0.99692726, + "equity_diff": -0.0030727386, + "probabilities": { + "win": 0.88937855, + "win_gammon": 0.728688, + "win_backgammon": 0.013830532, + "lose_gammon": 0.012578556, + "lose_backgammon": 0.00012447288 + } + }, + { + "rank": 10, + "move": "8/5 7/1* 6/3", + "ply": 1, + "equity": 0.9960891, + "equity_diff": -0.003910899, + "probabilities": { + "win": 0.85297924, + "win_gammon": 0.6440174, + "win_backgammon": 0.016305396, + "lose_gammon": 0.016591068, + "lose_backgammon": 0.00031312907 + } + } + ] + } + } + } +} diff --git a/tests/reference/results/cube-blitz.json b/tests/reference/results/cube-blitz.json new file mode 100644 index 0000000..4dc7c6e --- /dev/null +++ b/tests/reference/results/cube-blitz.json @@ -0,0 +1,66 @@ +{ + "id": "cube-blitz", + "type": "cube", + "categories": [ + "cube_too_good", + "blitz" + ], + "description": "Attaque forte, videau centré, partie libre sans règle Jacoby.", + "position_id": "4Dn4AGiynYMHAA", + "match_id": "cAkAAAAAAAAE", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": null, + "match_length": 0, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": false, + "beavers": true, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.8259491, + "win_gammon": 0.63558626, + "win_backgammon": 0.051824015, + "lose_gammon": 0.01410268, + "lose_backgammon": 0.00029838496 + }, + "equity": 1.3249073 + }, + "cube": { + "no_double": 1.4283034, + "double_take": 2.5175364, + "double_pass": 1.0, + "optimal": 1.4283034, + "decision": "TOOGOOD_PASS", + "decision_text": "Too good to double, pass" + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.81745076, + "win_gammon": 0.6255606, + "win_backgammon": 0.04636141, + "lose_gammon": 0.01678618, + "lose_backgammon": 0.0004376368 + }, + "equity": 1.2895997 + }, + "cube": { + "no_double": 1.3982979, + "double_take": 2.4550662, + "double_pass": 1.0, + "optimal": 1.3982979, + "decision": "TOOGOOD_PASS", + "decision_text": "Too good to double, pass" + } + } + } +} diff --git a/tests/reference/results/cube-double-pass.json b/tests/reference/results/cube-double-pass.json new file mode 100644 index 0000000..7b316f5 --- /dev/null +++ b/tests/reference/results/cube-double-pass.json @@ -0,0 +1,66 @@ +{ + "id": "cube-double-pass", + "type": "cube", + "categories": [ + "cube_double_pass", + "race" + ], + "description": "Course avec grosse avance, videau centré : double, passe.", + "position_id": "cHd3AADvvQMAAA", + "match_id": "cAkAAAAAAAAA", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": null, + "match_length": 0, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": true, + "beavers": true, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.9999498, + "win_gammon": 0.028405396, + "win_backgammon": 0.0, + "lose_gammon": 0.0, + "lose_backgammon": 0.0 + }, + "equity": 1.028305 + }, + "cube": { + "no_double": 0.9999689, + "double_take": 2.0565755, + "double_pass": 1.0, + "optimal": 1.0, + "decision": "DOUBLE_PASS", + "decision_text": "Double, pass" + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.99994457, + "win_gammon": 0.03390939, + "win_backgammon": 0.0, + "lose_gammon": 0.0, + "lose_backgammon": 0.0 + }, + "equity": 1.0337985 + }, + "cube": { + "no_double": 1.0, + "double_take": 2.0675642, + "double_pass": 1.0, + "optimal": 1.0, + "decision": "DOUBLE_PASS", + "decision_text": "Double, pass" + } + } + } +} diff --git a/tests/reference/results/cube-double-take.json b/tests/reference/results/cube-double-take.json new file mode 100644 index 0000000..6260751 --- /dev/null +++ b/tests/reference/results/cube-double-take.json @@ -0,0 +1,66 @@ +{ + "id": "cube-double-take", + "type": "cube", + "categories": [ + "cube_double_take", + "race" + ], + "description": "Course avec avance modérée, videau centré : double, prend.", + "position_id": "6O5uAAC4uzsAAA", + "match_id": "cAkAAAAAAAAA", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": null, + "match_length": 0, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": true, + "beavers": true, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.7670521, + "win_gammon": 5.0172162e-05, + "win_backgammon": 0.0, + "lose_gammon": 5.0172162e-05, + "lose_backgammon": 0.0 + }, + "equity": 0.5341042 + }, + "cube": { + "no_double": 0.8189599, + "double_take": 0.88185024, + "double_pass": 1.0, + "optimal": 0.88185024, + "decision": "DOUBLE_TAKE", + "decision_text": "Double, take" + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.7683121, + "win_gammon": 5.017216e-05, + "win_backgammon": 0.0, + "lose_gammon": 4.5526584e-05, + "lose_backgammon": 0.0 + }, + "equity": 0.53662884 + }, + "cube": { + "no_double": 0.83056116, + "double_take": 0.9218164, + "double_pass": 1.0, + "optimal": 0.9218164, + "decision": "DOUBLE_TAKE", + "decision_text": "Double, take" + } + } + } +} diff --git a/tests/reference/results/cube-no-double.json b/tests/reference/results/cube-no-double.json new file mode 100644 index 0000000..7f59384 --- /dev/null +++ b/tests/reference/results/cube-no-double.json @@ -0,0 +1,65 @@ +{ + "id": "cube-no-double", + "type": "cube", + "categories": [ + "cube_no_double" + ], + "description": "Position presque égale, videau centré : pas de double.", + "position_id": "2J0dBgDYnRsGAA", + "match_id": "cAkAAAAAAAAA", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": null, + "match_length": 0, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": true, + "beavers": true, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.6188814, + "win_gammon": 0.0024997902, + "win_backgammon": 0.0, + "lose_gammon": 0.0023386418, + "lose_backgammon": 0.0 + }, + "equity": 0.23792398 + }, + "cube": { + "no_double": 0.35839266, + "double_take": 0.18619786, + "double_pass": 1.0, + "optimal": 0.35839266, + "decision": "NODOUBLE_TAKE", + "decision_text": "No double, take" + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.5963505, + "win_gammon": 0.0010162055, + "win_backgammon": 0.0, + "lose_gammon": 0.000998305, + "lose_backgammon": 0.0 + }, + "equity": 0.19271892 + }, + "cube": { + "no_double": 0.28532878, + "double_take": 0.11171284, + "double_pass": 1.0, + "optimal": 0.28532878, + "decision": "NODOUBLE_TAKE", + "decision_text": "No double, take" + } + } + } +} diff --git a/tests/reference/results/cube-redouble.json b/tests/reference/results/cube-redouble.json new file mode 100644 index 0000000..4a187da --- /dev/null +++ b/tests/reference/results/cube-redouble.json @@ -0,0 +1,66 @@ +{ + "id": "cube-redouble", + "type": "cube", + "categories": [ + "cube_redouble", + "race" + ], + "description": "Course avec avance, videau à 2 possédé par le joueur au trait : redouble.", + "position_id": "6O5uAAC4uzsAAA", + "match_id": "UQkAAAAAAAAA", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": null, + "match_length": 0, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": true, + "beavers": true, + "cube_value": 2, + "cube_owner": "player" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.7670521, + "win_gammon": 5.0172162e-05, + "win_backgammon": 0.0, + "lose_gammon": 5.0172162e-05, + "lose_backgammon": 0.0 + }, + "equity": 0.5341042 + }, + "cube": { + "no_double": 0.840925, + "double_take": 0.88185024, + "double_pass": 1.0, + "optimal": 0.88185024, + "decision": "REDOUBLE_TAKE", + "decision_text": "Redouble, take" + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.7683121, + "win_gammon": 5.017216e-05, + "win_backgammon": 0.0, + "lose_gammon": 4.5526584e-05, + "lose_backgammon": 0.0 + }, + "equity": 0.53662884 + }, + "cube": { + "no_double": 0.84627455, + "double_take": 0.9218164, + "double_pass": 1.0, + "optimal": 0.9218164, + "decision": "REDOUBLE_TAKE", + "decision_text": "Redouble, take" + } + } + } +} diff --git a/tests/reference/results/forced-move.json b/tests/reference/results/forced-move.json new file mode 100644 index 0000000..2d84342 --- /dev/null +++ b/tests/reference/results/forced-move.json @@ -0,0 +1,90 @@ +{ + "id": "forced-move", + "type": "move", + "categories": [ + "edge_case" + ], + "description": "Deux dames sur la barre, un seul point d'entrée : coup forcé avec 3-1.", + "position_id": "tm3ABwBw5+ABYA", + "match_id": "cIkFAAAAAAAA", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": [ + 3, + 1 + ], + "match_length": 0, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": true, + "beavers": true, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.08933239, + "win_gammon": 0.008590468, + "win_backgammon": 0.0, + "lose_gammon": 0.73243725, + "lose_backgammon": 0.007992154 + }, + "equity": -1.5531741 + }, + "moves": { + "legal_move_count": 1, + "ranking": [ + { + "rank": 1, + "move": "bar/24", + "ply": 0, + "equity": -1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.1284166, + "win_gammon": 0.014085609, + "win_backgammon": 0.00014807966, + "lose_gammon": 0.59697056, + "lose_backgammon": 0.015525891 + } + } + ] + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.09428096, + "win_gammon": 0.008408972, + "win_backgammon": 2.419169e-05, + "lose_gammon": 0.7226846, + "lose_backgammon": 0.013129193 + }, + "equity": -1.5388187 + }, + "moves": { + "legal_move_count": 1, + "ranking": [ + { + "rank": 1, + "move": "bar/24", + "ply": 0, + "equity": -1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.1284166, + "win_gammon": 0.014085609, + "win_backgammon": 0.00014807966, + "lose_gammon": 0.59697056, + "lose_backgammon": 0.015525891 + } + } + ] + } + } + } +} diff --git a/tests/reference/results/jacoby-cube.json b/tests/reference/results/jacoby-cube.json new file mode 100644 index 0000000..1af4d5b --- /dev/null +++ b/tests/reference/results/jacoby-cube.json @@ -0,0 +1,66 @@ +{ + "id": "jacoby-cube", + "type": "cube", + "categories": [ + "jacoby", + "blitz" + ], + "description": "Même attaque que cube-blitz, avec la règle Jacoby.", + "position_id": "4Dn4AGiynYMHAA", + "match_id": "cAkAAAAAAAAA", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": null, + "match_length": 0, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": true, + "beavers": true, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.8259491, + "win_gammon": 0.63558626, + "win_backgammon": 0.051824015, + "lose_gammon": 0.01410268, + "lose_backgammon": 0.00029838496 + }, + "equity": 1.3249073 + }, + "cube": { + "no_double": 0.91645557, + "double_take": 2.5175364, + "double_pass": 1.0, + "optimal": 1.0, + "decision": "DOUBLE_PASS", + "decision_text": "Double, pass" + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.8177575, + "win_gammon": 0.6248996, + "win_backgammon": 0.04603396, + "lose_gammon": 0.016648903, + "lose_backgammon": 0.0004305263 + }, + "equity": 1.2893691 + }, + "cube": { + "no_double": 0.99924153, + "double_take": 2.4548137, + "double_pass": 1.0, + "optimal": 1.0, + "decision": "DOUBLE_PASS", + "decision_text": "Double, pass" + } + } + } +} diff --git a/tests/reference/results/jacoby-move.json b/tests/reference/results/jacoby-move.json new file mode 100644 index 0000000..72c00bc --- /dev/null +++ b/tests/reference/results/jacoby-move.json @@ -0,0 +1,343 @@ +{ + "id": "jacoby-move", + "type": "move", + "categories": [ + "jacoby", + "blitz" + ], + "description": "Attaque avec la règle Jacoby, 6-4 à jouer.", + "position_id": "4HPwAVC0XYMHAA", + "match_id": "cAkTAAAAAAAA", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": [ + 6, + 4 + ], + "match_length": 0, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": true, + "beavers": true, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.8636842, + "win_gammon": 0.57455575, + "win_backgammon": 0.017836282, + "lose_gammon": 0.015630726, + "lose_backgammon": 0.00039723353 + }, + "equity": 1.3037324 + }, + "moves": { + "legal_move_count": 14, + "ranking": [ + { + "rank": 1, + "move": "13/3", + "ply": 0, + "equity": 0.9328213, + "equity_diff": 0.0, + "probabilities": { + "win": 0.8600443, + "win_gammon": 0.53404087, + "win_backgammon": 0.019512838, + "lose_gammon": 0.0137145845, + "lose_backgammon": 0.0001231146 + } + }, + { + "rank": 2, + "move": "13/9 13/7", + "ply": 0, + "equity": 0.9175232, + "equity_diff": -0.0152980685, + "probabilities": { + "win": 0.82817334, + "win_gammon": 0.44573566, + "win_backgammon": 0.019687971, + "lose_gammon": 0.022985052, + "lose_backgammon": 0.00049623987 + } + }, + { + "rank": 3, + "move": "8/2 7/3", + "ply": 0, + "equity": 0.91263336, + "equity_diff": -0.020187914, + "probabilities": { + "win": 0.8179862, + "win_gammon": 0.5121088, + "win_backgammon": 0.021086743, + "lose_gammon": 0.02465748, + "lose_backgammon": 0.00034594204 + } + }, + { + "rank": 4, + "move": "13/7 8/4", + "ply": 0, + "equity": 0.90736973, + "equity_diff": -0.025451541, + "probabilities": { + "win": 0.8070203, + "win_gammon": 0.4591856, + "win_backgammon": 0.022148455, + "lose_gammon": 0.029529065, + "lose_backgammon": 0.000659062 + } + }, + { + "rank": 5, + "move": "13/9 7/1*", + "ply": 0, + "equity": 0.9053596, + "equity_diff": -0.027461648, + "probabilities": { + "win": 0.8028326, + "win_gammon": 0.55443704, + "win_backgammon": 0.02020569, + "lose_gammon": 0.030723047, + "lose_backgammon": 0.0007949887 + } + }, + { + "rank": 6, + "move": "8/2 6/2", + "ply": 0, + "equity": 0.9017469, + "equity_diff": -0.031074345, + "probabilities": { + "win": 0.7953061, + "win_gammon": 0.49147764, + "win_backgammon": 0.020525223, + "lose_gammon": 0.033936173, + "lose_backgammon": 0.0006972058 + } + }, + { + "rank": 7, + "move": "8/4 7/1*", + "ply": 0, + "equity": 0.89993495, + "equity_diff": -0.032886326, + "probabilities": { + "win": 0.79153115, + "win_gammon": 0.54988307, + "win_backgammon": 0.01679322, + "lose_gammon": 0.036662817, + "lose_backgammon": 0.0010210252 + } + }, + { + "rank": 8, + "move": "13/7 6/2", + "ply": 0, + "equity": 0.8962312, + "equity_diff": -0.0365901, + "probabilities": { + "win": 0.7838149, + "win_gammon": 0.40296447, + "win_backgammon": 0.018670566, + "lose_gammon": 0.032934573, + "lose_backgammon": 0.00076343544 + } + }, + { + "rank": 9, + "move": "7/1* 5/1", + "ply": 0, + "equity": 0.8907822, + "equity_diff": -0.042039096, + "probabilities": { + "win": 0.77246284, + "win_gammon": 0.51146686, + "win_backgammon": 0.012117631, + "lose_gammon": 0.042058453, + "lose_backgammon": 0.0011496529 + } + }, + { + "rank": 10, + "move": "7/1* 6/2", + "ply": 0, + "equity": 0.87481093, + "equity_diff": -0.05801034, + "probabilities": { + "win": 0.7391895, + "win_gammon": 0.4693772, + "win_backgammon": 0.012886849, + "lose_gammon": 0.049103227, + "lose_backgammon": 0.0012413587 + } + } + ] + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.8528266, + "win_gammon": 0.5386192, + "win_backgammon": 0.014262153, + "lose_gammon": 0.013019987, + "lose_backgammon": 0.00017201946 + }, + "equity": 1.2453425 + }, + "moves": { + "legal_move_count": 14, + "ranking": [ + { + "rank": 1, + "move": "13/3", + "ply": 2, + "equity": 1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.8550246, + "win_gammon": 0.5007356, + "win_backgammon": 0.016448246, + "lose_gammon": 0.012576544, + "lose_backgammon": 0.00010470922 + } + }, + { + "rank": 2, + "move": "13/9 13/7", + "ply": 2, + "equity": 0.99894416, + "equity_diff": -0.0010558367, + "probabilities": { + "win": 0.8247142, + "win_gammon": 0.40604338, + "win_backgammon": 0.013385465, + "lose_gammon": 0.020446587, + "lose_backgammon": 0.00043890413 + } + }, + { + "rank": 3, + "move": "8/2 7/3", + "ply": 2, + "equity": 0.99641544, + "equity_diff": -0.0035845637, + "probabilities": { + "win": 0.8178655, + "win_gammon": 0.47170973, + "win_backgammon": 0.016897058, + "lose_gammon": 0.023946658, + "lose_backgammon": 0.00037891598 + } + }, + { + "rank": 4, + "move": "13/7 8/4", + "ply": 2, + "equity": 0.98718643, + "equity_diff": -0.012813568, + "probabilities": { + "win": 0.80567765, + "win_gammon": 0.40185097, + "win_backgammon": 0.014731062, + "lose_gammon": 0.025103796, + "lose_backgammon": 0.0005290065 + } + }, + { + "rank": 5, + "move": "13/7 6/2", + "ply": 2, + "equity": 0.9808178, + "equity_diff": -0.019182205, + "probabilities": { + "win": 0.7764652, + "win_gammon": 0.3628158, + "win_backgammon": 0.013918926, + "lose_gammon": 0.035407502, + "lose_backgammon": 0.0009081904 + } + }, + { + "rank": 6, + "move": "13/9 7/1*", + "ply": 2, + "equity": 0.9452111, + "equity_diff": -0.054788888, + "probabilities": { + "win": 0.7960049, + "win_gammon": 0.5129587, + "win_backgammon": 0.014989997, + "lose_gammon": 0.031934794, + "lose_backgammon": 0.00082239707 + } + }, + { + "rank": 7, + "move": "8/4 7/1*", + "ply": 1, + "equity": 0.93114305, + "equity_diff": -0.068856955, + "probabilities": { + "win": 0.77886486, + "win_gammon": 0.50991887, + "win_backgammon": 0.014553436, + "lose_gammon": 0.04128269, + "lose_backgammon": 0.0014581447 + } + }, + { + "rank": 8, + "move": "7/1* 5/1", + "ply": 1, + "equity": 0.91711015, + "equity_diff": -0.082889855, + "probabilities": { + "win": 0.76492023, + "win_gammon": 0.48983887, + "win_backgammon": 0.010236203, + "lose_gammon": 0.044365447, + "lose_backgammon": 0.001417413 + } + }, + { + "rank": 9, + "move": "8/2 6/2", + "ply": 1, + "equity": 0.9160911, + "equity_diff": -0.083908916, + "probabilities": { + "win": 0.7832458, + "win_gammon": 0.46207324, + "win_backgammon": 0.01472875, + "lose_gammon": 0.034901537, + "lose_backgammon": 0.0010149138 + } + }, + { + "rank": 10, + "move": "7/1* 6/2", + "ply": 1, + "equity": 0.8391471, + "equity_diff": -0.16085291, + "probabilities": { + "win": 0.7302311, + "win_gammon": 0.43027958, + "win_backgammon": 0.013705867, + "lose_gammon": 0.056136616, + "lose_backgammon": 0.0021741493 + } + } + ] + } + } + } +} diff --git a/tests/reference/results/match-3-3-move.json b/tests/reference/results/match-3-3-move.json new file mode 100644 index 0000000..9f0aff0 --- /dev/null +++ b/tests/reference/results/match-3-3-move.json @@ -0,0 +1,343 @@ +{ + "id": "match-3-3-move", + "type": "move", + "categories": [ + "match", + "middlegame" + ], + "description": "Match en 5 points, 2-2 (3-away 3-away), 5-3 à jouer.", + "position_id": "xGfhATDQ2+BBIA", + "match_id": "cImuACAAEAAE", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": [ + 5, + 3 + ], + "match_length": 5, + "score_player": 2, + "score_opponent": 2, + "crawford": false, + "jacoby": false, + "beavers": false, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.6530462, + "win_gammon": 0.20978287, + "win_backgammon": 0.017546972, + "lose_gammon": 0.087096915, + "lose_backgammon": 0.00383374 + }, + "equity": 0.5270539 + }, + "moves": { + "legal_move_count": 28, + "ranking": [ + { + "rank": 1, + "move": "13/5", + "ply": 0, + "equity": 0.7553502, + "equity_diff": 0.0, + "probabilities": { + "win": 0.66454446, + "win_gammon": 0.21222445, + "win_backgammon": 0.016986715, + "lose_gammon": 0.090078115, + "lose_backgammon": 0.0030091396 + } + }, + { + "rank": 2, + "move": "18/13 8/5", + "ply": 0, + "equity": 0.5814649, + "equity_diff": -0.17388529, + "probabilities": { + "win": 0.62935334, + "win_gammon": 0.1873452, + "win_backgammon": 0.011812735, + "lose_gammon": 0.09861754, + "lose_backgammon": 0.0028636002 + } + }, + { + "rank": 3, + "move": "24/16*", + "ply": 0, + "equity": 0.4581785, + "equity_diff": -0.29717168, + "probabilities": { + "win": 0.60689855, + "win_gammon": 0.16452998, + "win_backgammon": 0.012356104, + "lose_gammon": 0.10971227, + "lose_backgammon": 0.0061068437 + } + }, + { + "rank": 4, + "move": "18/10", + "ply": 0, + "equity": 0.31719947, + "equity_diff": -0.4381507, + "probabilities": { + "win": 0.5757375, + "win_gammon": 0.16255254, + "win_backgammon": 0.010020595, + "lose_gammon": 0.13299894, + "lose_backgammon": 0.0068476396 + } + }, + { + "rank": 5, + "move": "8/5 8/3", + "ply": 0, + "equity": 0.31371918, + "equity_diff": -0.441631, + "probabilities": { + "win": 0.5670167, + "win_gammon": 0.18751182, + "win_backgammon": 0.015656954, + "lose_gammon": 0.13847484, + "lose_backgammon": 0.006125221 + } + }, + { + "rank": 6, + "move": "18/15 13/8", + "ply": 0, + "equity": 0.26037523, + "equity_diff": -0.49497494, + "probabilities": { + "win": 0.56361103, + "win_gammon": 0.16078936, + "win_backgammon": 0.010516407, + "lose_gammon": 0.14256367, + "lose_backgammon": 0.007627656 + } + }, + { + "rank": 7, + "move": "24/21 18/13", + "ply": 0, + "equity": 0.23547156, + "equity_diff": -0.5198786, + "probabilities": { + "win": 0.55978787, + "win_gammon": 0.1405232, + "win_backgammon": 0.0066346275, + "lose_gammon": 0.12748064, + "lose_backgammon": 0.004688547 + } + }, + { + "rank": 8, + "move": "8/3 6/3", + "ply": 0, + "equity": 0.15432969, + "equity_diff": -0.60102046, + "probabilities": { + "win": 0.5375695, + "win_gammon": 0.17747077, + "win_backgammon": 0.015221183, + "lose_gammon": 0.17106332, + "lose_backgammon": 0.010604714 + } + }, + { + "rank": 9, + "move": "13/10 13/8", + "ply": 0, + "equity": 0.13837479, + "equity_diff": -0.61697537, + "probabilities": { + "win": 0.538627, + "win_gammon": 0.16475716, + "win_backgammon": 0.012404756, + "lose_gammon": 0.17291316, + "lose_backgammon": 0.013045842 + } + }, + { + "rank": 10, + "move": "18/13 5/2", + "ply": 0, + "equity": 0.12815686, + "equity_diff": -0.62719333, + "probabilities": { + "win": 0.53481126, + "win_gammon": 0.14154978, + "win_backgammon": 0.0069042817, + "lose_gammon": 0.14363572, + "lose_backgammon": 0.004923693 + } + } + ] + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.65946376, + "win_gammon": 0.20922449, + "win_backgammon": 0.015489625, + "lose_gammon": 0.08499662, + "lose_backgammon": 0.0031080623 + }, + "equity": 0.5388975 + }, + "moves": { + "legal_move_count": 28, + "ranking": [ + { + "rank": 1, + "move": "13/5", + "ply": 1, + "equity": 0.85158825, + "equity_diff": 0.0, + "probabilities": { + "win": 0.669464, + "win_gammon": 0.21261428, + "win_backgammon": 0.014087503, + "lose_gammon": 0.092310324, + "lose_backgammon": 0.0036420587 + } + }, + { + "rank": 2, + "move": "18/13 8/5", + "ply": 1, + "equity": 0.6511238, + "equity_diff": -0.20046443, + "probabilities": { + "win": 0.63700217, + "win_gammon": 0.19559763, + "win_backgammon": 0.010781131, + "lose_gammon": 0.09663812, + "lose_backgammon": 0.0033870263 + } + }, + { + "rank": 3, + "move": "24/16*", + "ply": 0, + "equity": 0.44287914, + "equity_diff": -0.4087091, + "probabilities": { + "win": 0.60689855, + "win_gammon": 0.16452998, + "win_backgammon": 0.012356104, + "lose_gammon": 0.10971227, + "lose_backgammon": 0.0061068437 + } + }, + { + "rank": 4, + "move": "18/10", + "ply": 0, + "equity": 0.3053229, + "equity_diff": -0.54626536, + "probabilities": { + "win": 0.5757375, + "win_gammon": 0.16255254, + "win_backgammon": 0.010020595, + "lose_gammon": 0.13299894, + "lose_backgammon": 0.0068476396 + } + }, + { + "rank": 5, + "move": "8/5 8/3", + "ply": 0, + "equity": 0.3051695, + "equity_diff": -0.5464188, + "probabilities": { + "win": 0.5670167, + "win_gammon": 0.18751182, + "win_backgammon": 0.015656954, + "lose_gammon": 0.13847484, + "lose_backgammon": 0.006125221 + } + }, + { + "rank": 6, + "move": "18/15 13/8", + "ply": 0, + "equity": 0.25003925, + "equity_diff": -0.601549, + "probabilities": { + "win": 0.56361103, + "win_gammon": 0.16078936, + "win_backgammon": 0.010516407, + "lose_gammon": 0.14256367, + "lose_backgammon": 0.007627656 + } + }, + { + "rank": 7, + "move": "24/21 18/13", + "ply": 0, + "equity": 0.22587322, + "equity_diff": -0.625715, + "probabilities": { + "win": 0.55978787, + "win_gammon": 0.1405232, + "win_backgammon": 0.0066346275, + "lose_gammon": 0.12748064, + "lose_backgammon": 0.004688547 + } + }, + { + "rank": 8, + "move": "8/3 6/3", + "ply": 0, + "equity": 0.14823739, + "equity_diff": -0.70335084, + "probabilities": { + "win": 0.5375695, + "win_gammon": 0.17747077, + "win_backgammon": 0.015221183, + "lose_gammon": 0.17106332, + "lose_backgammon": 0.010604714 + } + }, + { + "rank": 9, + "move": "13/10 13/8", + "ply": 0, + "equity": 0.13046566, + "equity_diff": -0.7211226, + "probabilities": { + "win": 0.538627, + "win_gammon": 0.16475716, + "win_backgammon": 0.012404756, + "lose_gammon": 0.17291316, + "lose_backgammon": 0.013045842 + } + }, + { + "rank": 10, + "move": "18/13 5/2", + "ply": 0, + "equity": 0.12218381, + "equity_diff": -0.72940445, + "probabilities": { + "win": 0.53481126, + "win_gammon": 0.14154978, + "win_backgammon": 0.0069042817, + "lose_gammon": 0.14363572, + "lose_backgammon": 0.004923693 + } + } + ] + } + } + } +} diff --git a/tests/reference/results/match-7-cube.json b/tests/reference/results/match-7-cube.json new file mode 100644 index 0000000..41e872b --- /dev/null +++ b/tests/reference/results/match-7-cube.json @@ -0,0 +1,66 @@ +{ + "id": "match-7-cube", + "type": "cube", + "categories": [ + "match", + "race" + ], + "description": "Match en 7 points, joueur au trait à 3, adversaire à 5 : décision de videau.", + "position_id": "cHd3AAC4uzsAAA", + "match_id": "cAngAFAAGAAE", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": null, + "match_length": 7, + "score_player": 3, + "score_opponent": 5, + "crawford": false, + "jacoby": false, + "beavers": false, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.8364941, + "win_gammon": 5.0172162e-05, + "win_backgammon": 0.0, + "lose_gammon": 5.0172162e-05, + "lose_backgammon": 0.0 + }, + "equity": 0.67294794 + }, + "cube": { + "no_double": 0.93459773, + "double_take": 1.1651278, + "double_pass": 1.0, + "optimal": 1.0, + "decision": "DOUBLE_PASS", + "decision_text": "Double, pass" + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.8366328, + "win_gammon": 5.027103e-05, + "win_backgammon": 0.0, + "lose_gammon": 4.657184e-05, + "lose_backgammon": 0.0 + }, + "equity": 0.67323166 + }, + "cube": { + "no_double": 0.9405141, + "double_take": 1.1657741, + "double_pass": 1.0, + "optimal": 1.0, + "decision": "DOUBLE_PASS", + "decision_text": "Double, pass" + } + } + } +} diff --git a/tests/reference/results/match-crawford-cube.json b/tests/reference/results/match-crawford-cube.json new file mode 100644 index 0000000..52844e0 --- /dev/null +++ b/tests/reference/results/match-crawford-cube.json @@ -0,0 +1,67 @@ +{ + "id": "match-crawford-cube", + "type": "cube", + "categories": [ + "match", + "crawford", + "race" + ], + "description": "Match en 5 points, partie Crawford : videau mort.", + "position_id": "cHd3AAC4uzsAAA", + "match_id": "8AmgAEAAEAAE", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": null, + "match_length": 5, + "score_player": 2, + "score_opponent": 4, + "crawford": true, + "jacoby": false, + "beavers": false, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.8364941, + "win_gammon": 5.0172162e-05, + "win_backgammon": 0.0, + "lose_gammon": 5.0172162e-05, + "lose_backgammon": 0.0 + }, + "equity": 0.6729906 + }, + "cube": { + "no_double": 0.67299056, + "double_take": 0.71412474, + "double_pass": 1.0, + "optimal": 0.67299056, + "decision": "NODOUBLE_DEADCUBE", + "decision_text": "Never double, take (dead cube)" + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.8366328, + "win_gammon": 5.027103e-05, + "win_backgammon": 0.0, + "lose_gammon": 4.657184e-05, + "lose_backgammon": 0.0 + }, + "equity": 0.673268 + }, + "cube": { + "no_double": 0.673268, + "double_take": 0.7144093, + "double_pass": 1.0, + "optimal": 0.673268, + "decision": "NODOUBLE_DEADCUBE", + "decision_text": "Never double, take (dead cube)" + } + } + } +} diff --git a/tests/reference/results/match-crawford-move.json b/tests/reference/results/match-crawford-move.json new file mode 100644 index 0000000..b92cc43 --- /dev/null +++ b/tests/reference/results/match-crawford-move.json @@ -0,0 +1,344 @@ +{ + "id": "match-crawford-move", + "type": "move", + "categories": [ + "match", + "crawford", + "blitz" + ], + "description": "Match en 5 points, partie Crawford, joueur au trait mené 2-4, 4-3 à jouer.", + "position_id": "4Dn4AGiynYMHAA", + "match_id": "8AmuAEAAEAAE", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": [ + 4, + 3 + ], + "match_length": 5, + "score_player": 2, + "score_opponent": 4, + "crawford": true, + "jacoby": false, + "beavers": false, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.8259491, + "win_gammon": 0.63558626, + "win_backgammon": 0.051824015, + "lose_gammon": 0.01410268, + "lose_backgammon": 0.00029838496 + }, + "equity": 0.7892668 + }, + "moves": { + "legal_move_count": 20, + "ranking": [ + { + "rank": 1, + "move": "8/5 6/2", + "ply": 0, + "equity": 0.7345603, + "equity_diff": 0.0, + "probabilities": { + "win": 0.81122017, + "win_gammon": 0.6180843, + "win_backgammon": 0.039920993, + "lose_gammon": 0.016159898, + "lose_backgammon": 0.000108429565 + } + }, + { + "rank": 2, + "move": "5/2 5/1*", + "ply": 0, + "equity": 0.7229391, + "equity_diff": -0.011621237, + "probabilities": { + "win": 0.8102987, + "win_gammon": 0.6098554, + "win_backgammon": 0.035345834, + "lose_gammon": 0.030515661, + "lose_backgammon": 0.0003538893 + } + }, + { + "rank": 3, + "move": "8/1*", + "ply": 0, + "equity": 0.71705425, + "equity_diff": -0.017506063, + "probabilities": { + "win": 0.7998353, + "win_gammon": 0.60838807, + "win_backgammon": 0.042721834, + "lose_gammon": 0.031395618, + "lose_backgammon": 0.0006257314 + } + }, + { + "rank": 4, + "move": "13/10 6/2", + "ply": 0, + "equity": 0.7142835, + "equity_diff": -0.020276785, + "probabilities": { + "win": 0.7992593, + "win_gammon": 0.58293045, + "win_backgammon": 0.042541374, + "lose_gammon": 0.013131926, + "lose_backgammon": 0.0 + } + }, + { + "rank": 5, + "move": "13/9 8/5", + "ply": 0, + "equity": 0.6963019, + "equity_diff": -0.038258433, + "probabilities": { + "win": 0.78266376, + "win_gammon": 0.56832266, + "win_backgammon": 0.050313737, + "lose_gammon": 0.025197603, + "lose_backgammon": 0.00045250903 + } + }, + { + "rank": 6, + "move": "8/5 8/4", + "ply": 0, + "equity": 0.68610644, + "equity_diff": -0.048453867, + "probabilities": { + "win": 0.7801856, + "win_gammon": 0.58423555, + "win_backgammon": 0.04737587, + "lose_gammon": 0.029746175, + "lose_backgammon": 0.0005981548 + } + }, + { + "rank": 7, + "move": "13/10 8/4", + "ply": 0, + "equity": 0.6855368, + "equity_diff": -0.04902351, + "probabilities": { + "win": 0.7776346, + "win_gammon": 0.5655885, + "win_backgammon": 0.05003428, + "lose_gammon": 0.026805501, + "lose_backgammon": 0.0005106817 + } + }, + { + "rank": 8, + "move": "13/10 13/9", + "ply": 0, + "equity": 0.6818689, + "equity_diff": -0.0526914, + "probabilities": { + "win": 0.7775664, + "win_gammon": 0.5375285, + "win_backgammon": 0.04898261, + "lose_gammon": 0.025490344, + "lose_backgammon": 0.00049680925 + } + }, + { + "rank": 9, + "move": "13/6", + "ply": 0, + "equity": 0.6633271, + "equity_diff": -0.07123321, + "probabilities": { + "win": 0.77236044, + "win_gammon": 0.5431621, + "win_backgammon": 0.044880137, + "lose_gammon": 0.02577741, + "lose_backgammon": 0.00032665874 + } + }, + { + "rank": 10, + "move": "13/9 5/2", + "ply": 0, + "equity": 0.6538005, + "equity_diff": -0.08075982, + "probabilities": { + "win": 0.76966786, + "win_gammon": 0.51801664, + "win_backgammon": 0.043460887, + "lose_gammon": 0.03147457, + "lose_backgammon": 0.00063006644 + } + } + ] + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.81746006, + "win_gammon": 0.6232498, + "win_backgammon": 0.045707952, + "lose_gammon": 0.016541855, + "lose_backgammon": 0.0004265261 + }, + "equity": 0.7591515 + }, + "moves": { + "legal_move_count": 20, + "ranking": [ + { + "rank": 1, + "move": "8/5 6/2", + "ply": 2, + "equity": 0.7697691, + "equity_diff": 0.0, + "probabilities": { + "win": 0.8151505, + "win_gammon": 0.6159326, + "win_backgammon": 0.05331921, + "lose_gammon": 0.016513932, + "lose_backgammon": 0.00013073174 + } + }, + { + "rank": 2, + "move": "13/10 6/2", + "ply": 2, + "equity": 0.7615671, + "equity_diff": -0.008201957, + "probabilities": { + "win": 0.8104984, + "win_gammon": 0.60370916, + "win_backgammon": 0.05414961, + "lose_gammon": 0.016250646, + "lose_backgammon": 0.00012455582 + } + }, + { + "rank": 3, + "move": "13/9 8/5", + "ply": 2, + "equity": 0.69608325, + "equity_diff": -0.073685825, + "probabilities": { + "win": 0.78182155, + "win_gammon": 0.5415461, + "win_backgammon": 0.05167027, + "lose_gammon": 0.026144765, + "lose_backgammon": 0.00052017724 + } + }, + { + "rank": 4, + "move": "5/2 5/1*", + "ply": 2, + "equity": 0.6911188, + "equity_diff": -0.078650296, + "probabilities": { + "win": 0.79714537, + "win_gammon": 0.57561195, + "win_backgammon": 0.033474863, + "lose_gammon": 0.03052109, + "lose_backgammon": 0.00048315027 + } + }, + { + "rank": 5, + "move": "8/1*", + "ply": 2, + "equity": 0.6836242, + "equity_diff": -0.086144865, + "probabilities": { + "win": 0.78949744, + "win_gammon": 0.56465274, + "win_backgammon": 0.03754451, + "lose_gammon": 0.029520204, + "lose_backgammon": 0.0006143754 + } + }, + { + "rank": 6, + "move": "13/10 13/9", + "ply": 2, + "equity": 0.6807338, + "equity_diff": -0.08903527, + "probabilities": { + "win": 0.7761623, + "win_gammon": 0.52131236, + "win_backgammon": 0.050187413, + "lose_gammon": 0.027210515, + "lose_backgammon": 0.00059423654 + } + }, + { + "rank": 7, + "move": "13/10 8/4", + "ply": 1, + "equity": 0.6733323, + "equity_diff": -0.0964368, + "probabilities": { + "win": 0.77246577, + "win_gammon": 0.5298661, + "win_backgammon": 0.04997825, + "lose_gammon": 0.02483147, + "lose_backgammon": 0.0007027216 + } + }, + { + "rank": 8, + "move": "13/6", + "ply": 1, + "equity": 0.66055346, + "equity_diff": -0.10921562, + "probabilities": { + "win": 0.7712825, + "win_gammon": 0.51356965, + "win_backgammon": 0.045286898, + "lose_gammon": 0.02338571, + "lose_backgammon": 0.0005819568 + } + }, + { + "rank": 9, + "move": "8/5 8/4", + "ply": 1, + "equity": 0.6556259, + "equity_diff": -0.11414319, + "probabilities": { + "win": 0.76584995, + "win_gammon": 0.5323152, + "win_backgammon": 0.047735877, + "lose_gammon": 0.027560795, + "lose_backgammon": 0.00079957 + } + }, + { + "rank": 10, + "move": "13/9 5/2", + "ply": 1, + "equity": 0.645951, + "equity_diff": -0.1238181, + "probabilities": { + "win": 0.7659519, + "win_gammon": 0.5108896, + "win_backgammon": 0.04342779, + "lose_gammon": 0.027958687, + "lose_backgammon": 0.0009177093 + } + } + ] + } + } + } +} diff --git a/tests/reference/results/match-dmp-move.json b/tests/reference/results/match-dmp-move.json new file mode 100644 index 0000000..2d90ac6 --- /dev/null +++ b/tests/reference/results/match-dmp-move.json @@ -0,0 +1,259 @@ +{ + "id": "match-dmp-move", + "type": "move", + "categories": [ + "match", + "middlegame" + ], + "description": "Match en 1 point (double match point), 6-2 à jouer.", + "position_id": "mLfBARg4z8EBAw", + "match_id": "cAkrAAAAAAAE", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": [ + 6, + 2 + ], + "match_length": 1, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": false, + "beavers": false, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.60097563, + "win_gammon": 0.13004506, + "win_backgammon": 0.0035395431, + "lose_gammon": 0.07308542, + "lose_backgammon": 0.0012678864 + }, + "equity": 0.20195127 + }, + "moves": { + "legal_move_count": 7, + "ranking": [ + { + "rank": 1, + "move": "13/5", + "ply": 0, + "equity": 0.1492995, + "equity_diff": 0.0, + "probabilities": { + "win": 0.57464975, + "win_gammon": 0.14591993, + "win_backgammon": 0.0044575627, + "lose_gammon": 0.07497838, + "lose_backgammon": 0.0020658365 + } + }, + { + "rank": 2, + "move": "13/7 8/6", + "ply": 0, + "equity": 0.06906557, + "equity_diff": -0.08023393, + "probabilities": { + "win": 0.5345328, + "win_gammon": 0.12869689, + "win_backgammon": 0.0036363003, + "lose_gammon": 0.07950802, + "lose_backgammon": 0.002174801 + } + }, + { + "rank": 3, + "move": "13/7 6/4", + "ply": 0, + "equity": 0.061560392, + "equity_diff": -0.08773911, + "probabilities": { + "win": 0.5307802, + "win_gammon": 0.12388368, + "win_backgammon": 0.0037799568, + "lose_gammon": 0.08228647, + "lose_backgammon": 0.0023005977 + } + }, + { + "rank": 4, + "move": "13/11 13/7", + "ply": 0, + "equity": -0.028690457, + "equity_diff": -0.17798996, + "probabilities": { + "win": 0.48565477, + "win_gammon": 0.11687806, + "win_backgammon": 0.0038713207, + "lose_gammon": 0.11405854, + "lose_backgammon": 0.0063031144 + } + }, + { + "rank": 5, + "move": "20/14 13/11", + "ply": 0, + "equity": -0.043359756, + "equity_diff": -0.19265926, + "probabilities": { + "win": 0.47832012, + "win_gammon": 0.123516336, + "win_backgammon": 0.0038390688, + "lose_gammon": 0.20525116, + "lose_backgammon": 0.010964307 + } + }, + { + "rank": 6, + "move": "20/14 8/6", + "ply": 0, + "equity": -0.050829172, + "equity_diff": -0.20012867, + "probabilities": { + "win": 0.4745854, + "win_gammon": 0.12134288, + "win_backgammon": 0.0035285952, + "lose_gammon": 0.18661681, + "lose_backgammon": 0.0062879953 + } + }, + { + "rank": 7, + "move": "20/14 6/4", + "ply": 0, + "equity": -0.06328738, + "equity_diff": -0.21258688, + "probabilities": { + "win": 0.4683563, + "win_gammon": 0.114787176, + "win_backgammon": 0.0036217375, + "lose_gammon": 0.18776663, + "lose_backgammon": 0.0066350857 + } + } + ] + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.5962132, + "win_gammon": 0.15751404, + "win_backgammon": 0.004846546, + "lose_gammon": 0.07291914, + "lose_backgammon": 0.0015511343 + }, + "equity": 0.19242644 + }, + "moves": { + "legal_move_count": 7, + "ranking": [ + { + "rank": 1, + "move": "13/5", + "ply": 2, + "equity": 0.115667224, + "equity_diff": 0.0, + "probabilities": { + "win": 0.5578336, + "win_gammon": 0.16533384, + "win_backgammon": 0.0046707084, + "lose_gammon": 0.07887684, + "lose_backgammon": 0.0022734941 + } + }, + { + "rank": 2, + "move": "13/7 8/6", + "ply": 2, + "equity": 0.057462573, + "equity_diff": -0.05820465, + "probabilities": { + "win": 0.5287313, + "win_gammon": 0.13934752, + "win_backgammon": 0.0036847882, + "lose_gammon": 0.07971662, + "lose_backgammon": 0.0021666957 + } + }, + { + "rank": 3, + "move": "13/7 6/4", + "ply": 2, + "equity": 0.055473566, + "equity_diff": -0.060193658, + "probabilities": { + "win": 0.5277368, + "win_gammon": 0.13660698, + "win_backgammon": 0.0037778632, + "lose_gammon": 0.08124607, + "lose_backgammon": 0.0022222484 + } + }, + { + "rank": 4, + "move": "13/11 13/7", + "ply": 1, + "equity": -0.05036807, + "equity_diff": -0.1660353, + "probabilities": { + "win": 0.47481596, + "win_gammon": 0.122993626, + "win_backgammon": 0.004263413, + "lose_gammon": 0.113883115, + "lose_backgammon": 0.0047030724 + } + }, + { + "rank": 5, + "move": "20/14 6/4", + "ply": 1, + "equity": -0.11175752, + "equity_diff": -0.22742474, + "probabilities": { + "win": 0.44412124, + "win_gammon": 0.116199285, + "win_backgammon": 0.0061467383, + "lose_gammon": 0.19888791, + "lose_backgammon": 0.0072854743 + } + }, + { + "rank": 6, + "move": "20/14 13/11", + "ply": 1, + "equity": -0.11196542, + "equity_diff": -0.22763264, + "probabilities": { + "win": 0.4440173, + "win_gammon": 0.12331532, + "win_backgammon": 0.0065208636, + "lose_gammon": 0.20642313, + "lose_backgammon": 0.008324866 + } + }, + { + "rank": 7, + "move": "20/14 8/6", + "ply": 1, + "equity": -0.11355829, + "equity_diff": -0.22922552, + "probabilities": { + "win": 0.44322085, + "win_gammon": 0.120239764, + "win_backgammon": 0.006536752, + "lose_gammon": 0.1980509, + "lose_backgammon": 0.006582335 + } + } + ] + } + } + } +} diff --git a/tests/reference/results/match-post-crawford-cube.json b/tests/reference/results/match-post-crawford-cube.json new file mode 100644 index 0000000..1e6c50c --- /dev/null +++ b/tests/reference/results/match-post-crawford-cube.json @@ -0,0 +1,66 @@ +{ + "id": "match-post-crawford-cube", + "type": "cube", + "categories": [ + "match", + "post_crawford" + ], + "description": "Match en 5 points, après Crawford, joueur au trait mené 2-4 : videau.", + "position_id": "2J0dBgDYnRsGAA", + "match_id": "cAmgAEAAEAAE", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": null, + "match_length": 5, + "score_player": 2, + "score_opponent": 4, + "crawford": false, + "jacoby": false, + "beavers": false, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.6188814, + "win_gammon": 0.0024997902, + "win_backgammon": 0.0, + "lose_gammon": 0.0023386418, + "lose_backgammon": 0.0 + }, + "equity": 0.23788543 + }, + "cube": { + "no_double": 0.26475775, + "double_take": 0.2732438, + "double_pass": 1.0, + "optimal": 0.2732438, + "decision": "DOUBLE_TAKE", + "decision_text": "Double, take" + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.5964545, + "win_gammon": 0.0009377186, + "win_backgammon": 0.0, + "lose_gammon": 0.0009169524, + "lose_backgammon": 0.0 + }, + "equity": 0.192955 + }, + "cube": { + "no_double": 0.22408937, + "double_take": 0.22408937, + "double_pass": 1.0, + "optimal": 0.22408937, + "decision": "OPTIONAL_DOUBLE_TAKE", + "decision_text": "Optional double, take" + } + } + } +} diff --git a/tests/reference/results/middlegame-1.json b/tests/reference/results/middlegame-1.json new file mode 100644 index 0000000..ae8016e --- /dev/null +++ b/tests/reference/results/middlegame-1.json @@ -0,0 +1,342 @@ +{ + "id": "middlegame-1", + "type": "move", + "categories": [ + "middlegame" + ], + "description": "Milieu de partie avec contact, 6-4 à jouer.", + "position_id": "mM/gATCw5+ABMA", + "match_id": "cAkTAAAAAAAA", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": [ + 6, + 4 + ], + "match_length": 0, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": true, + "beavers": true, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.56602323, + "win_gammon": 0.18421549, + "win_backgammon": 0.008628393, + "lose_gammon": 0.13345058, + "lose_backgammon": 0.007666227 + }, + "equity": 0.18377358 + }, + "moves": { + "legal_move_count": 14, + "ranking": [ + { + "rank": 1, + "move": "24/14", + "ply": 0, + "equity": 0.15439394, + "equity_diff": 0.0, + "probabilities": { + "win": 0.54755616, + "win_gammon": 0.1533521, + "win_backgammon": 0.007871699, + "lose_gammon": 0.14585377, + "lose_backgammon": 0.004424421 + } + }, + { + "rank": 2, + "move": "8/2 6/2", + "ply": 0, + "equity": 0.10821653, + "equity_diff": -0.04617741, + "probabilities": { + "win": 0.52528405, + "win_gammon": 0.17734769, + "win_backgammon": 0.009563766, + "lose_gammon": 0.14886741, + "lose_backgammon": 0.0064382814 + } + }, + { + "rank": 3, + "move": "24/18 13/9", + "ply": 0, + "equity": 0.10337136, + "equity_diff": -0.05102258, + "probabilities": { + "win": 0.53498006, + "win_gammon": 0.16566078, + "win_backgammon": 0.010049404, + "lose_gammon": 0.1699274, + "lose_backgammon": 0.0077912575 + } + }, + { + "rank": 4, + "move": "24/20 24/18", + "ply": 0, + "equity": 0.072762795, + "equity_diff": -0.08163115, + "probabilities": { + "win": 0.5277786, + "win_gammon": 0.14495058, + "win_backgammon": 0.0071643195, + "lose_gammon": 0.15828644, + "lose_backgammon": 0.0046279957 + } + }, + { + "rank": 5, + "move": "13/9 13/7", + "ply": 0, + "equity": 0.0029048775, + "equity_diff": -0.15148906, + "probabilities": { + "win": 0.50326496, + "win_gammon": 0.16243759, + "win_backgammon": 0.010578811, + "lose_gammon": 0.1669373, + "lose_backgammon": 0.012921451 + } + }, + { + "rank": 6, + "move": "24/20 13/7", + "ply": 0, + "equity": 9.1438415e-05, + "equity_diff": -0.15430251, + "probabilities": { + "win": 0.50547075, + "win_gammon": 0.15214112, + "win_backgammon": 0.009330205, + "lose_gammon": 0.1700756, + "lose_backgammon": 0.0075738593 + } + }, + { + "rank": 7, + "move": "13/3", + "ply": 0, + "equity": -0.012697897, + "equity_diff": -0.16709183, + "probabilities": { + "win": 0.49582624, + "win_gammon": 0.15884244, + "win_backgammon": 0.0098810615, + "lose_gammon": 0.15901755, + "lose_backgammon": 0.0098253535 + } + }, + { + "rank": 8, + "move": "24/18 6/2", + "ply": 0, + "equity": -0.075399, + "equity_diff": -0.22979294, + "probabilities": { + "win": 0.49141967, + "win_gammon": 0.14353198, + "win_backgammon": 0.0078434, + "lose_gammon": 0.19205664, + "lose_backgammon": 0.008210361 + } + }, + { + "rank": 9, + "move": "24/18 8/4", + "ply": 0, + "equity": -0.088734664, + "equity_diff": -0.2431286, + "probabilities": { + "win": 0.48919898, + "win_gammon": 0.14581823, + "win_backgammon": 0.009370638, + "lose_gammon": 0.20036243, + "lose_backgammon": 0.010274831 + } + }, + { + "rank": 10, + "move": "24/20 8/2", + "ply": 0, + "equity": -0.095189385, + "equity_diff": -0.24958333, + "probabilities": { + "win": 0.4826436, + "win_gammon": 0.14366049, + "win_backgammon": 0.008135085, + "lose_gammon": 0.1858077, + "lose_backgammon": 0.00831227 + } + } + ] + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.5619521, + "win_gammon": 0.17899494, + "win_backgammon": 0.008936954, + "lose_gammon": 0.13425057, + "lose_backgammon": 0.0060421517 + }, + "equity": 0.17154342 + }, + "moves": { + "legal_move_count": 14, + "ranking": [ + { + "rank": 1, + "move": "24/14", + "ply": 2, + "equity": 0.13111727, + "equity_diff": 0.0, + "probabilities": { + "win": 0.5437652, + "win_gammon": 0.15258978, + "win_backgammon": 0.007642845, + "lose_gammon": 0.14640008, + "lose_backgammon": 0.004747282 + } + }, + { + "rank": 2, + "move": "8/2 6/2", + "ply": 2, + "equity": 0.11303549, + "equity_diff": -0.018081777, + "probabilities": { + "win": 0.52879494, + "win_gammon": 0.1809006, + "win_backgammon": 0.009122612, + "lose_gammon": 0.14714952, + "lose_backgammon": 0.0066084466 + } + }, + { + "rank": 3, + "move": "24/18 13/9", + "ply": 2, + "equity": 0.105096616, + "equity_diff": -0.026020654, + "probabilities": { + "win": 0.5372501, + "win_gammon": 0.17117459, + "win_backgammon": 0.011244075, + "lose_gammon": 0.1660563, + "lose_backgammon": 0.008107419 + } + }, + { + "rank": 4, + "move": "24/20 24/18", + "ply": 2, + "equity": 0.049068402, + "equity_diff": -0.08204886, + "probabilities": { + "win": 0.52970135, + "win_gammon": 0.14793633, + "win_backgammon": 0.008251494, + "lose_gammon": 0.16875498, + "lose_backgammon": 0.0051654554 + } + }, + { + "rank": 5, + "move": "13/3", + "ply": 2, + "equity": -0.0040049786, + "equity_diff": -0.13512225, + "probabilities": { + "win": 0.49928004, + "win_gammon": 0.1643482, + "win_backgammon": 0.009496399, + "lose_gammon": 0.16022815, + "lose_backgammon": 0.009522095 + } + }, + { + "rank": 6, + "move": "13/9 13/7", + "ply": 2, + "equity": -0.014309813, + "equity_diff": -0.14542708, + "probabilities": { + "win": 0.5031056, + "win_gammon": 0.16001613, + "win_backgammon": 0.009707982, + "lose_gammon": 0.16754453, + "lose_backgammon": 0.013628378 + } + }, + { + "rank": 7, + "move": "24/20 13/7", + "ply": 1, + "equity": -0.029367238, + "equity_diff": -0.16048451, + "probabilities": { + "win": 0.4961474, + "win_gammon": 0.15676762, + "win_backgammon": 0.0096625015, + "lose_gammon": 0.17702806, + "lose_backgammon": 0.009441402 + } + }, + { + "rank": 8, + "move": "13/9 8/2", + "ply": 1, + "equity": -0.06291597, + "equity_diff": -0.19403324, + "probabilities": { + "win": 0.48532206, + "win_gammon": 0.15872067, + "win_backgammon": 0.0075411294, + "lose_gammon": 0.17572871, + "lose_backgammon": 0.012869996 + } + }, + { + "rank": 9, + "move": "24/20 8/2", + "ply": 1, + "equity": -0.07751653, + "equity_diff": -0.20863381, + "probabilities": { + "win": 0.4820987, + "win_gammon": 0.15008497, + "win_backgammon": 0.0074960566, + "lose_gammon": 0.17866881, + "lose_backgammon": 0.008712372 + } + }, + { + "rank": 10, + "move": "24/18 8/4", + "ply": 1, + "equity": -0.081171095, + "equity_diff": -0.21228836, + "probabilities": { + "win": 0.48974574, + "win_gammon": 0.15036704, + "win_backgammon": 0.0094412565, + "lose_gammon": 0.20545092, + "lose_backgammon": 0.011010153 + } + } + ] + } + } + } +} diff --git a/tests/reference/results/middlegame-2.json b/tests/reference/results/middlegame-2.json new file mode 100644 index 0000000..aab00a6 --- /dev/null +++ b/tests/reference/results/middlegame-2.json @@ -0,0 +1,342 @@ +{ + "id": "middlegame-2", + "type": "move", + "categories": [ + "middlegame" + ], + "description": "Milieu de partie avec contact et dames isolées, 5-3 à jouer.", + "position_id": "xGfhATDQ2+BBIA", + "match_id": "cIkOAAAAAAAA", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": [ + 5, + 3 + ], + "match_length": 0, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": true, + "beavers": true, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.6530462, + "win_gammon": 0.20978287, + "win_backgammon": 0.017546972, + "lose_gammon": 0.087096915, + "lose_backgammon": 0.00383374 + }, + "equity": 0.44249153 + }, + "moves": { + "legal_move_count": 28, + "ranking": [ + { + "rank": 1, + "move": "13/5", + "ply": 0, + "equity": 0.6337661, + "equity_diff": 0.0, + "probabilities": { + "win": 0.66454446, + "win_gammon": 0.21222445, + "win_backgammon": 0.016986715, + "lose_gammon": 0.090078115, + "lose_backgammon": 0.0030091396 + } + }, + { + "rank": 2, + "move": "18/13 8/5", + "ply": 0, + "equity": 0.48876387, + "equity_diff": -0.14500225, + "probabilities": { + "win": 0.62935334, + "win_gammon": 0.1873452, + "win_backgammon": 0.011812735, + "lose_gammon": 0.09861754, + "lose_backgammon": 0.0028636002 + } + }, + { + "rank": 3, + "move": "24/16*", + "ply": 0, + "equity": 0.3840023, + "equity_diff": -0.24976382, + "probabilities": { + "win": 0.60689855, + "win_gammon": 0.16452998, + "win_backgammon": 0.012356104, + "lose_gammon": 0.10971227, + "lose_backgammon": 0.0061068437 + } + }, + { + "rank": 4, + "move": "18/10", + "ply": 0, + "equity": 0.26138526, + "equity_diff": -0.37238085, + "probabilities": { + "win": 0.5757375, + "win_gammon": 0.16255254, + "win_backgammon": 0.010020595, + "lose_gammon": 0.13299894, + "lose_backgammon": 0.0068476396 + } + }, + { + "rank": 5, + "move": "8/5 8/3", + "ply": 0, + "equity": 0.26129338, + "equity_diff": -0.37247273, + "probabilities": { + "win": 0.5670167, + "win_gammon": 0.18751182, + "win_backgammon": 0.015656954, + "lose_gammon": 0.13847484, + "lose_backgammon": 0.006125221 + } + }, + { + "rank": 6, + "move": "18/15 13/8", + "ply": 0, + "equity": 0.21307702, + "equity_diff": -0.4206891, + "probabilities": { + "win": 0.56361103, + "win_gammon": 0.16078936, + "win_backgammon": 0.010516407, + "lose_gammon": 0.14256367, + "lose_backgammon": 0.007627656 + } + }, + { + "rank": 7, + "move": "24/21 18/13", + "ply": 0, + "equity": 0.19534928, + "equity_diff": -0.43841684, + "probabilities": { + "win": 0.55978787, + "win_gammon": 0.1405232, + "win_backgammon": 0.0066346275, + "lose_gammon": 0.12748064, + "lose_backgammon": 0.004688547 + } + }, + { + "rank": 8, + "move": "8/3 6/3", + "ply": 0, + "equity": 0.1243803, + "equity_diff": -0.5093858, + "probabilities": { + "win": 0.5375695, + "win_gammon": 0.17747077, + "win_backgammon": 0.015221183, + "lose_gammon": 0.17106332, + "lose_backgammon": 0.010604714 + } + }, + { + "rank": 9, + "move": "13/10 13/8", + "ply": 0, + "equity": 0.10748164, + "equity_diff": -0.52628446, + "probabilities": { + "win": 0.538627, + "win_gammon": 0.16475716, + "win_backgammon": 0.012404756, + "lose_gammon": 0.17291316, + "lose_backgammon": 0.013045842 + } + }, + { + "rank": 10, + "move": "18/13 5/2", + "ply": 0, + "equity": 0.10479103, + "equity_diff": -0.52897507, + "probabilities": { + "win": 0.53481126, + "win_gammon": 0.14154978, + "win_backgammon": 0.0069042817, + "lose_gammon": 0.14363572, + "lose_backgammon": 0.004923693 + } + } + ] + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.65917933, + "win_gammon": 0.20923032, + "win_backgammon": 0.015394275, + "lose_gammon": 0.08445793, + "lose_backgammon": 0.0030355079 + }, + "equity": 0.4554898 + }, + "moves": { + "legal_move_count": 28, + "ranking": [ + { + "rank": 1, + "move": "13/5", + "ply": 1, + "equity": 0.72228533, + "equity_diff": 0.0, + "probabilities": { + "win": 0.66798764, + "win_gammon": 0.21495411, + "win_backgammon": 0.015286756, + "lose_gammon": 0.0941079, + "lose_backgammon": 0.0037003048 + } + }, + { + "rank": 2, + "move": "18/13 8/5", + "ply": 1, + "equity": 0.5336073, + "equity_diff": -0.18867803, + "probabilities": { + "win": 0.6395944, + "win_gammon": 0.18995553, + "win_backgammon": 0.009876633, + "lose_gammon": 0.09736532, + "lose_backgammon": 0.003345149 + } + }, + { + "rank": 3, + "move": "24/16*", + "ply": 1, + "equity": 0.40578368, + "equity_diff": -0.31650165, + "probabilities": { + "win": 0.59599763, + "win_gammon": 0.19066852, + "win_backgammon": 0.01840505, + "lose_gammon": 0.11299363, + "lose_backgammon": 0.0055603194 + } + }, + { + "rank": 4, + "move": "18/10", + "ply": 0, + "equity": 0.24981576, + "equity_diff": -0.47246957, + "probabilities": { + "win": 0.5757375, + "win_gammon": 0.16255254, + "win_backgammon": 0.010020595, + "lose_gammon": 0.13299894, + "lose_backgammon": 0.0068476396 + } + }, + { + "rank": 5, + "move": "8/5 8/3", + "ply": 0, + "equity": 0.2478976, + "equity_diff": -0.47438774, + "probabilities": { + "win": 0.5670167, + "win_gammon": 0.18751182, + "win_backgammon": 0.015656954, + "lose_gammon": 0.13847484, + "lose_backgammon": 0.006125221 + } + }, + { + "rank": 6, + "move": "18/15 13/8", + "ply": 0, + "equity": 0.20403966, + "equity_diff": -0.5182457, + "probabilities": { + "win": 0.56361103, + "win_gammon": 0.16078936, + "win_backgammon": 0.010516407, + "lose_gammon": 0.14256367, + "lose_backgammon": 0.007627656 + } + }, + { + "rank": 7, + "move": "24/21 18/13", + "ply": 0, + "equity": 0.18737313, + "equity_diff": -0.5349122, + "probabilities": { + "win": 0.55978787, + "win_gammon": 0.1405232, + "win_backgammon": 0.0066346275, + "lose_gammon": 0.12748064, + "lose_backgammon": 0.004688547 + } + }, + { + "rank": 8, + "move": "8/3 6/3", + "ply": 0, + "equity": 0.119197, + "equity_diff": -0.6030883, + "probabilities": { + "win": 0.5375695, + "win_gammon": 0.17747077, + "win_backgammon": 0.015221183, + "lose_gammon": 0.17106332, + "lose_backgammon": 0.010604714 + } + }, + { + "rank": 9, + "move": "13/10 13/8", + "ply": 0, + "equity": 0.10429979, + "equity_diff": -0.61798555, + "probabilities": { + "win": 0.538627, + "win_gammon": 0.16475716, + "win_backgammon": 0.012404756, + "lose_gammon": 0.17291316, + "lose_backgammon": 0.013045842 + } + }, + { + "rank": 10, + "move": "18/13 5/2", + "ply": 0, + "equity": 0.10108908, + "equity_diff": -0.62119627, + "probabilities": { + "win": 0.53481126, + "win_gammon": 0.14154978, + "win_backgammon": 0.0069042817, + "lose_gammon": 0.14363572, + "lose_backgammon": 0.004923693 + } + } + ] + } + } + } +} diff --git a/tests/reference/results/middlegame-holding.json b/tests/reference/results/middlegame-holding.json new file mode 100644 index 0000000..aec5d81 --- /dev/null +++ b/tests/reference/results/middlegame-holding.json @@ -0,0 +1,258 @@ +{ + "id": "middlegame-holding", + "type": "move", + "categories": [ + "middlegame" + ], + "description": "Jeu de tenue (point 20 tenu), 6-2 à jouer.", + "position_id": "mLfBARg4z8EBAw", + "match_id": "cAkLAAAAAAAA", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": [ + 6, + 2 + ], + "match_length": 0, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": true, + "beavers": true, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.60097563, + "win_gammon": 0.13004506, + "win_backgammon": 0.0035395431, + "lose_gammon": 0.07308542, + "lose_backgammon": 0.0012678864 + }, + "equity": 0.26118255 + }, + "moves": { + "legal_move_count": 7, + "ranking": [ + { + "rank": 1, + "move": "13/5", + "ply": 0, + "equity": 0.2992556, + "equity_diff": 0.0, + "probabilities": { + "win": 0.57464975, + "win_gammon": 0.14591993, + "win_backgammon": 0.0044575627, + "lose_gammon": 0.07497838, + "lose_backgammon": 0.0020658365 + } + }, + { + "rank": 2, + "move": "13/7 8/6", + "ply": 0, + "equity": 0.15538445, + "equity_diff": -0.14387116, + "probabilities": { + "win": 0.5345328, + "win_gammon": 0.12869689, + "win_backgammon": 0.0036363003, + "lose_gammon": 0.07950802, + "lose_backgammon": 0.002174801 + } + }, + { + "rank": 3, + "move": "13/7 6/4", + "ply": 0, + "equity": 0.13640194, + "equity_diff": -0.16285367, + "probabilities": { + "win": 0.5307802, + "win_gammon": 0.12388368, + "win_backgammon": 0.0037799568, + "lose_gammon": 0.08228647, + "lose_backgammon": 0.0023005977 + } + }, + { + "rank": 4, + "move": "13/11 13/7", + "ply": 0, + "equity": -0.042834148, + "equity_diff": -0.34208977, + "probabilities": { + "win": 0.48565477, + "win_gammon": 0.11687806, + "win_backgammon": 0.0038713207, + "lose_gammon": 0.11405854, + "lose_backgammon": 0.0063031144 + } + }, + { + "rank": 5, + "move": "20/14 8/6", + "ply": 0, + "equity": -0.14552313, + "equity_diff": -0.44477874, + "probabilities": { + "win": 0.4745854, + "win_gammon": 0.12134288, + "win_backgammon": 0.0035285952, + "lose_gammon": 0.18661681, + "lose_backgammon": 0.0062879953 + } + }, + { + "rank": 6, + "move": "20/14 13/11", + "ply": 0, + "equity": -0.15537354, + "equity_diff": -0.45462915, + "probabilities": { + "win": 0.47832012, + "win_gammon": 0.123516336, + "win_backgammon": 0.0038390688, + "lose_gammon": 0.20525116, + "lose_backgammon": 0.010964307 + } + }, + { + "rank": 7, + "move": "20/14 6/4", + "ply": 0, + "equity": -0.17235905, + "equity_diff": -0.47161466, + "probabilities": { + "win": 0.4683563, + "win_gammon": 0.114787176, + "win_backgammon": 0.0036217375, + "lose_gammon": 0.18776663, + "lose_backgammon": 0.0066350857 + } + } + ] + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.59930587, + "win_gammon": 0.12427109, + "win_backgammon": 0.0039397688, + "lose_gammon": 0.071554266, + "lose_backgammon": 0.0014250871 + }, + "equity": 0.25384325 + }, + "moves": { + "legal_move_count": 7, + "ranking": [ + { + "rank": 1, + "move": "13/5", + "ply": 2, + "equity": 0.22664805, + "equity_diff": 0.0, + "probabilities": { + "win": 0.5612426, + "win_gammon": 0.13116215, + "win_backgammon": 0.0038719273, + "lose_gammon": 0.07936195, + "lose_backgammon": 0.0021631026 + } + }, + { + "rank": 2, + "move": "13/7 6/4", + "ply": 2, + "equity": 0.13002977, + "equity_diff": -0.09661828, + "probabilities": { + "win": 0.53358424, + "win_gammon": 0.11851678, + "win_backgammon": 0.0035490294, + "lose_gammon": 0.08071164, + "lose_backgammon": 0.0021506099 + } + }, + { + "rank": 3, + "move": "13/7 8/6", + "ply": 1, + "equity": 0.07910592, + "equity_diff": -0.14754212, + "probabilities": { + "win": 0.5163796, + "win_gammon": 0.12108203, + "win_backgammon": 0.0042679794, + "lose_gammon": 0.08832949, + "lose_backgammon": 0.00228202 + } + }, + { + "rank": 4, + "move": "13/11 13/7", + "ply": 0, + "equity": -0.041345336, + "equity_diff": -0.2679934, + "probabilities": { + "win": 0.48565477, + "win_gammon": 0.11687806, + "win_backgammon": 0.0038713207, + "lose_gammon": 0.11405854, + "lose_backgammon": 0.0063031144 + } + }, + { + "rank": 5, + "move": "20/14 8/6", + "ply": 0, + "equity": -0.13555534, + "equity_diff": -0.3622034, + "probabilities": { + "win": 0.4745854, + "win_gammon": 0.12134288, + "win_backgammon": 0.0035285952, + "lose_gammon": 0.18661681, + "lose_backgammon": 0.0062879953 + } + }, + { + "rank": 6, + "move": "20/14 13/11", + "ply": 0, + "equity": -0.14358261, + "equity_diff": -0.37023067, + "probabilities": { + "win": 0.47832012, + "win_gammon": 0.123516336, + "win_backgammon": 0.0038390688, + "lose_gammon": 0.20525116, + "lose_backgammon": 0.010964307 + } + }, + { + "rank": 7, + "move": "20/14 6/4", + "ply": 0, + "equity": -0.16087781, + "equity_diff": -0.38752586, + "probabilities": { + "win": 0.4683563, + "win_gammon": 0.114787176, + "win_backgammon": 0.0036217375, + "lose_gammon": 0.18776663, + "lose_backgammon": 0.0066350857 + } + } + ] + } + } + } +} diff --git a/tests/reference/results/no-legal-move.json b/tests/reference/results/no-legal-move.json new file mode 100644 index 0000000..a3cf923 --- /dev/null +++ b/tests/reference/results/no-legal-move.json @@ -0,0 +1,60 @@ +{ + "id": "no-legal-move", + "type": "move", + "categories": [ + "edge_case" + ], + "description": "Dame sur la barre face à un jan fermé : aucun coup légal avec 5-5.", + "position_id": "27YBBwAcz8EDQA", + "match_id": "cIkWAAAAAAAA", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": [ + 5, + 5 + ], + "match_length": 0, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": true, + "beavers": true, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.039134555, + "win_gammon": 0.0023969053, + "win_backgammon": 0.0, + "lose_gammon": 0.8031097, + "lose_backgammon": 0.0024082477 + }, + "equity": -1.724852 + }, + "moves": { + "legal_move_count": 0, + "ranking": [] + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.03421676, + "win_gammon": 0.002297687, + "win_backgammon": 0.0, + "lose_gammon": 0.8233655, + "lose_backgammon": 0.0014723836 + }, + "equity": -1.7541066 + }, + "moves": { + "legal_move_count": 0, + "ranking": [] + } + } + } +} diff --git a/tests/reference/results/opening-21.json b/tests/reference/results/opening-21.json new file mode 100644 index 0000000..5416b38 --- /dev/null +++ b/tests/reference/results/opening-21.json @@ -0,0 +1,342 @@ +{ + "id": "opening-21", + "type": "move", + "categories": [ + "opening" + ], + "description": "Position de départ, premier coup 2-1, partie libre.", + "position_id": "4HPwATDgc/ABMA", + "match_id": "cAkFAAAAAAAA", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": [ + 2, + 1 + ], + "match_length": 0, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": true, + "beavers": true, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.52150303, + "win_gammon": 0.15414569, + "win_backgammon": 0.0075623477, + "lose_gammon": 0.12963872, + "lose_backgammon": 0.007494344 + }, + "equity": 0.06758106 + }, + "moves": { + "legal_move_count": 15, + "ranking": [ + { + "rank": 1, + "move": "24/23 13/11", + "ply": 0, + "equity": -0.006838155, + "equity_diff": 0.0, + "probabilities": { + "win": 0.4989426, + "win_gammon": 0.13681582, + "win_backgammon": 0.0076454515, + "lose_gammon": 0.14145486, + "lose_backgammon": 0.0066102645 + } + }, + { + "rank": 2, + "move": "24/21", + "ply": 0, + "equity": -0.02014258, + "equity_diff": -0.0133044245, + "probabilities": { + "win": 0.49625456, + "win_gammon": 0.12467366, + "win_backgammon": 0.0056412523, + "lose_gammon": 0.13457635, + "lose_backgammon": 0.0044783447 + } + }, + { + "rank": 3, + "move": "24/23 24/22", + "ply": 0, + "equity": -0.033878967, + "equity_diff": -0.027040813, + "probabilities": { + "win": 0.49332476, + "win_gammon": 0.12301593, + "win_backgammon": 0.0056081824, + "lose_gammon": 0.13771829, + "lose_backgammon": 0.00448887 + } + }, + { + "rank": 4, + "move": "13/10", + "ply": 0, + "equity": -0.03497561, + "equity_diff": -0.028137457, + "probabilities": { + "win": 0.4897666, + "win_gammon": 0.13998792, + "win_backgammon": 0.008946963, + "lose_gammon": 0.14475775, + "lose_backgammon": 0.008261607 + } + }, + { + "rank": 5, + "move": "13/11 6/5", + "ply": 0, + "equity": -0.043954756, + "equity_diff": -0.037116602, + "probabilities": { + "win": 0.491395, + "win_gammon": 0.13784271, + "win_backgammon": 0.009567919, + "lose_gammon": 0.15345608, + "lose_backgammon": 0.011742385 + } + }, + { + "rank": 6, + "move": "24/22 6/5", + "ply": 0, + "equity": -0.05947369, + "equity_diff": -0.052635536, + "probabilities": { + "win": 0.48930585, + "win_gammon": 0.123811916, + "win_backgammon": 0.006882638, + "lose_gammon": 0.14951915, + "lose_backgammon": 0.008065589 + } + }, + { + "rank": 7, + "move": "24/23 6/4", + "ply": 0, + "equity": -0.09052487, + "equity_diff": -0.08368671, + "probabilities": { + "win": 0.4809823, + "win_gammon": 0.124716505, + "win_backgammon": 0.00734768, + "lose_gammon": 0.1562378, + "lose_backgammon": 0.008607547 + } + }, + { + "rank": 8, + "move": "13/11 8/7", + "ply": 0, + "equity": -0.10694244, + "equity_diff": -0.10010428, + "probabilities": { + "win": 0.47342628, + "win_gammon": 0.13249873, + "win_backgammon": 0.0086180065, + "lose_gammon": 0.156542, + "lose_backgammon": 0.01108821 + } + }, + { + "rank": 9, + "move": "24/22 8/7", + "ply": 0, + "equity": -0.11493746, + "equity_diff": -0.108099304, + "probabilities": { + "win": 0.4722107, + "win_gammon": 0.11853025, + "win_backgammon": 0.0060900412, + "lose_gammon": 0.14782462, + "lose_backgammon": 0.0075841714 + } + }, + { + "rank": 10, + "move": "24/23 8/6", + "ply": 0, + "equity": -0.11839062, + "equity_diff": -0.11155246, + "probabilities": { + "win": 0.46990633, + "win_gammon": 0.12305006, + "win_backgammon": 0.0061603137, + "lose_gammon": 0.15056747, + "lose_backgammon": 0.00598667 + } + } + ] + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.52483594, + "win_gammon": 0.14950693, + "win_backgammon": 0.006851064, + "lose_gammon": 0.124798514, + "lose_backgammon": 0.0052878163 + }, + "equity": 0.07594353 + }, + "moves": { + "legal_move_count": 15, + "ranking": [ + { + "rank": 1, + "move": "24/23 13/11", + "ply": 2, + "equity": -0.0001872008, + "equity_diff": 0.0, + "probabilities": { + "win": 0.49936152, + "win_gammon": 0.1361573, + "win_backgammon": 0.0059833424, + "lose_gammon": 0.13336915, + "lose_backgammon": 0.0056441245 + } + }, + { + "rank": 2, + "move": "13/11 6/5", + "ply": 2, + "equity": -0.0029364966, + "equity_diff": -0.002749296, + "probabilities": { + "win": 0.5013766, + "win_gammon": 0.14255394, + "win_backgammon": 0.007463439, + "lose_gammon": 0.14444883, + "lose_backgammon": 0.009677111 + } + }, + { + "rank": 3, + "move": "24/21", + "ply": 2, + "equity": -0.023134932, + "equity_diff": -0.02294773, + "probabilities": { + "win": 0.49374348, + "win_gammon": 0.12629053, + "win_backgammon": 0.0050961636, + "lose_gammon": 0.13050313, + "lose_backgammon": 0.0047987103 + } + }, + { + "rank": 4, + "move": "13/10", + "ply": 2, + "equity": -0.036884084, + "equity_diff": -0.036696885, + "probabilities": { + "win": 0.48866796, + "win_gammon": 0.13993986, + "win_backgammon": 0.006761295, + "lose_gammon": 0.14289643, + "lose_backgammon": 0.0072744787 + } + }, + { + "rank": 5, + "move": "24/23 24/22", + "ply": 2, + "equity": -0.053742595, + "equity_diff": -0.053555395, + "probabilities": { + "win": 0.48623395, + "win_gammon": 0.12249764, + "win_backgammon": 0.0046590306, + "lose_gammon": 0.13483764, + "lose_backgammon": 0.004705831 + } + }, + { + "rank": 6, + "move": "24/22 6/5", + "ply": 2, + "equity": -0.06897441, + "equity_diff": -0.06878721, + "probabilities": { + "win": 0.48569775, + "win_gammon": 0.12577973, + "win_backgammon": 0.0056417696, + "lose_gammon": 0.14551832, + "lose_backgammon": 0.007730984 + } + }, + { + "rank": 7, + "move": "24/23 6/4", + "ply": 1, + "equity": -0.08121423, + "equity_diff": -0.08102702, + "probabilities": { + "win": 0.4804591, + "win_gammon": 0.12808256, + "win_backgammon": 0.0052458076, + "lose_gammon": 0.15290663, + "lose_backgammon": 0.0073501337 + } + }, + { + "rank": 8, + "move": "13/11 8/7", + "ply": 1, + "equity": -0.11000299, + "equity_diff": -0.109815784, + "probabilities": { + "win": 0.47246087, + "win_gammon": 0.13270162, + "win_backgammon": 0.0053248443, + "lose_gammon": 0.16010761, + "lose_backgammon": 0.010958535 + } + }, + { + "rank": 9, + "move": "24/23 8/6", + "ply": 1, + "equity": -0.11857612, + "equity_diff": -0.11838891, + "probabilities": { + "win": 0.46775055, + "win_gammon": 0.12591736, + "win_backgammon": 0.005086501, + "lose_gammon": 0.15187313, + "lose_backgammon": 0.006525319 + } + }, + { + "rank": 10, + "move": "8/5", + "ply": 1, + "equity": -0.12109409, + "equity_diff": -0.12090689, + "probabilities": { + "win": 0.46843135, + "win_gammon": 0.12901284, + "win_backgammon": 0.004891587, + "lose_gammon": 0.15662514, + "lose_backgammon": 0.009633442 + } + } + ] + } + } + } +} diff --git a/tests/reference/results/opening-31.json b/tests/reference/results/opening-31.json new file mode 100644 index 0000000..87cb5f7 --- /dev/null +++ b/tests/reference/results/opening-31.json @@ -0,0 +1,342 @@ +{ + "id": "opening-31", + "type": "move", + "categories": [ + "opening" + ], + "description": "Position de départ, premier coup 3-1, partie libre.", + "position_id": "4HPwATDgc/ABMA", + "match_id": "cIkFAAAAAAAA", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": [ + 3, + 1 + ], + "match_length": 0, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": true, + "beavers": true, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.52150303, + "win_gammon": 0.15414569, + "win_backgammon": 0.0075623477, + "lose_gammon": 0.12963872, + "lose_backgammon": 0.007494344 + }, + "equity": 0.06758106 + }, + "moves": { + "legal_move_count": 16, + "ranking": [ + { + "rank": 1, + "move": "8/5 6/5", + "ply": 0, + "equity": 0.21258597, + "equity_diff": 0.0, + "probabilities": { + "win": 0.55146515, + "win_gammon": 0.1735385, + "win_backgammon": 0.012694037, + "lose_gammon": 0.1244457, + "lose_backgammon": 0.0050391546 + } + }, + { + "rank": 2, + "move": "24/23 13/10", + "ply": 0, + "equity": -0.010789523, + "equity_diff": -0.2233755, + "probabilities": { + "win": 0.49735868, + "win_gammon": 0.13661881, + "win_backgammon": 0.007650923, + "lose_gammon": 0.14029105, + "lose_backgammon": 0.006771761 + } + }, + { + "rank": 3, + "move": "24/20", + "ply": 0, + "equity": -0.017392516, + "equity_diff": -0.22997849, + "probabilities": { + "win": 0.4971655, + "win_gammon": 0.12497381, + "win_backgammon": 0.005366897, + "lose_gammon": 0.1347645, + "lose_backgammon": 0.0043109623 + } + }, + { + "rank": 4, + "move": "24/23 24/21", + "ply": 0, + "equity": -0.023609947, + "equity_diff": -0.23619592, + "probabilities": { + "win": 0.49566424, + "win_gammon": 0.12277265, + "win_backgammon": 0.0054368703, + "lose_gammon": 0.13448617, + "lose_backgammon": 0.004129533 + } + }, + { + "rank": 5, + "move": "13/9", + "ply": 0, + "equity": -0.027675275, + "equity_diff": -0.24026124, + "probabilities": { + "win": 0.49105716, + "win_gammon": 0.14171576, + "win_backgammon": 0.009267461, + "lose_gammon": 0.14342503, + "lose_backgammon": 0.008276146 + } + }, + { + "rank": 6, + "move": "24/21 6/5", + "ply": 0, + "equity": -0.04369401, + "equity_diff": -0.25627998, + "probabilities": { + "win": 0.49309355, + "win_gammon": 0.124125384, + "win_backgammon": 0.0066370456, + "lose_gammon": 0.14589135, + "lose_backgammon": 0.0074525396 + } + }, + { + "rank": 7, + "move": "13/10 6/5", + "ply": 0, + "equity": -0.04984435, + "equity_diff": -0.2624303, + "probabilities": { + "win": 0.48952937, + "win_gammon": 0.1378842, + "win_backgammon": 0.009559967, + "lose_gammon": 0.15374462, + "lose_backgammon": 0.011751771 + } + }, + { + "rank": 8, + "move": "24/23 8/5", + "ply": 0, + "equity": -0.104100645, + "equity_diff": -0.31668663, + "probabilities": { + "win": 0.47712362, + "win_gammon": 0.12390441, + "win_backgammon": 0.0072179367, + "lose_gammon": 0.15660737, + "lose_backgammon": 0.009218626 + } + }, + { + "rank": 9, + "move": "24/23 6/3", + "ply": 0, + "equity": -0.10542354, + "equity_diff": -0.3180095, + "probabilities": { + "win": 0.47683942, + "win_gammon": 0.124342315, + "win_backgammon": 0.0069678742, + "lose_gammon": 0.15814619, + "lose_backgammon": 0.008328158 + } + }, + { + "rank": 10, + "move": "24/21 8/7", + "ply": 0, + "equity": -0.107585564, + "equity_diff": -0.32017154, + "probabilities": { + "win": 0.4737125, + "win_gammon": 0.118104, + "win_backgammon": 0.0058776154, + "lose_gammon": 0.14500603, + "lose_backgammon": 0.0069749253 + } + } + ] + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.52483594, + "win_gammon": 0.14950693, + "win_backgammon": 0.006851064, + "lose_gammon": 0.124798514, + "lose_backgammon": 0.0052878163 + }, + "equity": 0.07594353 + }, + "moves": { + "legal_move_count": 16, + "ranking": [ + { + "rank": 1, + "move": "8/5 6/5", + "ply": 1, + "equity": 0.20373425, + "equity_diff": 0.0, + "probabilities": { + "win": 0.5511361, + "win_gammon": 0.17560416, + "win_backgammon": 0.007862332, + "lose_gammon": 0.11694406, + "lose_backgammon": 0.0057517164 + } + }, + { + "rank": 2, + "move": "24/23 13/10", + "ply": 1, + "equity": -0.022293653, + "equity_diff": -0.2260279, + "probabilities": { + "win": 0.49275005, + "win_gammon": 0.13909927, + "win_backgammon": 0.0063022533, + "lose_gammon": 0.14069356, + "lose_backgammon": 0.0060537625 + } + }, + { + "rank": 3, + "move": "24/20", + "ply": 1, + "equity": -0.031027086, + "equity_diff": -0.23476133, + "probabilities": { + "win": 0.49156147, + "win_gammon": 0.12670286, + "win_backgammon": 0.006098907, + "lose_gammon": 0.1342299, + "lose_backgammon": 0.0057401103 + } + }, + { + "rank": 4, + "move": "24/23 24/21", + "ply": 1, + "equity": -0.03213631, + "equity_diff": -0.23587056, + "probabilities": { + "win": 0.49145406, + "win_gammon": 0.12431262, + "win_backgammon": 0.0052749543, + "lose_gammon": 0.13346349, + "lose_backgammon": 0.0041712774 + } + }, + { + "rank": 5, + "move": "13/9", + "ply": 1, + "equity": -0.040205758, + "equity_diff": -0.24394001, + "probabilities": { + "win": 0.48716545, + "win_gammon": 0.14317134, + "win_backgammon": 0.005799624, + "lose_gammon": 0.14353105, + "lose_backgammon": 0.0086386865 + } + }, + { + "rank": 6, + "move": "24/21 6/5", + "ply": 0, + "equity": -0.04054863, + "equity_diff": -0.24428287, + "probabilities": { + "win": 0.49309355, + "win_gammon": 0.124125384, + "win_backgammon": 0.0066370456, + "lose_gammon": 0.14589135, + "lose_backgammon": 0.0074525396 + } + }, + { + "rank": 7, + "move": "13/10 6/5", + "ply": 0, + "equity": -0.04680192, + "equity_diff": -0.25053617, + "probabilities": { + "win": 0.48952937, + "win_gammon": 0.1378842, + "win_backgammon": 0.009559967, + "lose_gammon": 0.15374462, + "lose_backgammon": 0.011751771 + } + }, + { + "rank": 8, + "move": "24/23 8/5", + "ply": 0, + "equity": -0.09795876, + "equity_diff": -0.30169302, + "probabilities": { + "win": 0.47712362, + "win_gammon": 0.12390441, + "win_backgammon": 0.0072179367, + "lose_gammon": 0.15660737, + "lose_backgammon": 0.009218626 + } + }, + { + "rank": 9, + "move": "24/23 6/3", + "ply": 0, + "equity": -0.09920224, + "equity_diff": -0.3029365, + "probabilities": { + "win": 0.47683942, + "win_gammon": 0.124342315, + "win_backgammon": 0.0069678742, + "lose_gammon": 0.15814619, + "lose_backgammon": 0.008328158 + } + }, + { + "rank": 10, + "move": "24/21 8/7", + "ply": 0, + "equity": -0.10179498, + "equity_diff": -0.30552924, + "probabilities": { + "win": 0.4737125, + "win_gammon": 0.118104, + "win_backgammon": 0.0058776154, + "lose_gammon": 0.14500603, + "lose_backgammon": 0.0069749253 + } + } + ] + } + } + } +} diff --git a/tests/reference/results/opening-42.json b/tests/reference/results/opening-42.json new file mode 100644 index 0000000..f563463 --- /dev/null +++ b/tests/reference/results/opening-42.json @@ -0,0 +1,342 @@ +{ + "id": "opening-42", + "type": "move", + "categories": [ + "opening" + ], + "description": "Position de départ, premier coup 4-2, partie libre.", + "position_id": "4HPwATDgc/ABMA", + "match_id": "cAkKAAAAAAAA", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": [ + 4, + 2 + ], + "match_length": 0, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": true, + "beavers": true, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.52150303, + "win_gammon": 0.15414569, + "win_backgammon": 0.0075623477, + "lose_gammon": 0.12963872, + "lose_backgammon": 0.007494344 + }, + "equity": 0.06758106 + }, + "moves": { + "legal_move_count": 18, + "ranking": [ + { + "rank": 1, + "move": "8/4 6/4", + "ply": 0, + "equity": 0.15086421, + "equity_diff": 0.0, + "probabilities": { + "win": 0.5355822, + "win_gammon": 0.16746058, + "win_backgammon": 0.011540573, + "lose_gammon": 0.13069998, + "lose_backgammon": 0.0052321833 + } + }, + { + "rank": 2, + "move": "24/20 13/11", + "ply": 0, + "equity": 0.029853877, + "equity_diff": -0.12101033, + "probabilities": { + "win": 0.50847805, + "win_gammon": 0.13508996, + "win_backgammon": 0.006644521, + "lose_gammon": 0.13210844, + "lose_backgammon": 0.005376153 + } + }, + { + "rank": 3, + "move": "24/22 13/9", + "ply": 0, + "equity": 0.026067838, + "equity_diff": -0.124796376, + "probabilities": { + "win": 0.50648075, + "win_gammon": 0.13809271, + "win_backgammon": 0.007568386, + "lose_gammon": 0.13295177, + "lose_backgammon": 0.0062561864 + } + }, + { + "rank": 4, + "move": "13/11 13/9", + "ply": 0, + "equity": -0.001693182, + "equity_diff": -0.1525574, + "probabilities": { + "win": 0.4968168, + "win_gammon": 0.14983082, + "win_backgammon": 0.01064049, + "lose_gammon": 0.14369524, + "lose_backgammon": 0.008981156 + } + }, + { + "rank": 5, + "move": "24/22 24/20", + "ply": 0, + "equity": -0.018045012, + "equity_diff": -0.16890922, + "probabilities": { + "win": 0.4977442, + "win_gammon": 0.121381424, + "win_backgammon": 0.0052612466, + "lose_gammon": 0.13360934, + "lose_backgammon": 0.0041328096 + } + }, + { + "rank": 6, + "move": "24/18", + "ply": 0, + "equity": -0.032842197, + "equity_diff": -0.1837064, + "probabilities": { + "win": 0.49529934, + "win_gammon": 0.1225132, + "win_backgammon": 0.0051935366, + "lose_gammon": 0.14161953, + "lose_backgammon": 0.0045189797 + } + }, + { + "rank": 7, + "move": "24/20 6/4", + "ply": 0, + "equity": -0.05955926, + "equity_diff": -0.21042347, + "probabilities": { + "win": 0.48832107, + "win_gammon": 0.124719225, + "win_backgammon": 0.006615434, + "lose_gammon": 0.14826414, + "lose_backgammon": 0.0071166214 + } + }, + { + "rank": 8, + "move": "13/9 6/4", + "ply": 0, + "equity": -0.07225056, + "equity_diff": -0.22311477, + "probabilities": { + "win": 0.48268825, + "win_gammon": 0.13875623, + "win_backgammon": 0.01012615, + "lose_gammon": 0.15696336, + "lose_backgammon": 0.011739288 + } + }, + { + "rank": 9, + "move": "24/20 8/6", + "ply": 0, + "equity": -0.07934274, + "equity_diff": -0.23020695, + "probabilities": { + "win": 0.48002523, + "win_gammon": 0.121580966, + "win_backgammon": 0.0053400025, + "lose_gammon": 0.14114954, + "lose_backgammon": 0.004671509 + } + }, + { + "rank": 10, + "move": "13/7", + "ply": 0, + "equity": -0.08251725, + "equity_diff": -0.23338147, + "probabilities": { + "win": 0.47695237, + "win_gammon": 0.13231827, + "win_backgammon": 0.008267342, + "lose_gammon": 0.1449488, + "lose_backgammon": 0.008531911 + } + } + ] + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.52483594, + "win_gammon": 0.14950693, + "win_backgammon": 0.006851064, + "lose_gammon": 0.124798514, + "lose_backgammon": 0.0052878163 + }, + "equity": 0.07594353 + }, + "moves": { + "legal_move_count": 18, + "ranking": [ + { + "rank": 1, + "move": "8/4 6/4", + "ply": 1, + "equity": 0.1499756, + "equity_diff": 0.0, + "probabilities": { + "win": 0.5357578, + "win_gammon": 0.17106593, + "win_backgammon": 0.0073204446, + "lose_gammon": 0.12172842, + "lose_backgammon": 0.0058788783 + } + }, + { + "rank": 2, + "move": "24/22 13/9", + "ply": 1, + "equity": 0.009185654, + "equity_diff": -0.14078994, + "probabilities": { + "win": 0.5005222, + "win_gammon": 0.13987306, + "win_backgammon": 0.0058319937, + "lose_gammon": 0.13195772, + "lose_backgammon": 0.005290314 + } + }, + { + "rank": 3, + "move": "13/11 13/9", + "ply": 1, + "equity": 0.00883085, + "equity_diff": -0.14114475, + "probabilities": { + "win": 0.5003679, + "win_gammon": 0.15323634, + "win_backgammon": 0.006730007, + "lose_gammon": 0.14239869, + "lose_backgammon": 0.00900721 + } + }, + { + "rank": 4, + "move": "24/20 13/11", + "ply": 1, + "equity": 0.003763375, + "equity_diff": -0.14621222, + "probabilities": { + "win": 0.5002758, + "win_gammon": 0.1368717, + "win_backgammon": 0.0070342678, + "lose_gammon": 0.13423003, + "lose_backgammon": 0.0064093405 + } + }, + { + "rank": 5, + "move": "24/22 24/20", + "ply": 1, + "equity": -0.020140165, + "equity_diff": -0.17011577, + "probabilities": { + "win": 0.49609327, + "win_gammon": 0.12574464, + "win_backgammon": 0.0066425386, + "lose_gammon": 0.13750464, + "lose_backgammon": 0.0045712073 + } + }, + { + "rank": 6, + "move": "24/18", + "ply": 1, + "equity": -0.024700182, + "equity_diff": -0.17467578, + "probabilities": { + "win": 0.49641377, + "win_gammon": 0.12199487, + "win_backgammon": 0.005407719, + "lose_gammon": 0.13788731, + "lose_backgammon": 0.005260935 + } + }, + { + "rank": 7, + "move": "24/20 6/4", + "ply": 1, + "equity": -0.050489992, + "equity_diff": -0.20046559, + "probabilities": { + "win": 0.48690128, + "win_gammon": 0.12653384, + "win_backgammon": 0.0056428686, + "lose_gammon": 0.13969593, + "lose_backgammon": 0.006175407 + } + }, + { + "rank": 8, + "move": "13/9 6/4", + "ply": 1, + "equity": -0.054621916, + "equity_diff": -0.20459752, + "probabilities": { + "win": 0.48639107, + "win_gammon": 0.13890329, + "win_backgammon": 0.005892756, + "lose_gammon": 0.15172012, + "lose_backgammon": 0.00969209 + } + }, + { + "rank": 9, + "move": "24/20 8/6", + "ply": 1, + "equity": -0.090564646, + "equity_diff": -0.24054024, + "probabilities": { + "win": 0.47541296, + "win_gammon": 0.124620385, + "win_backgammon": 0.006344036, + "lose_gammon": 0.14542966, + "lose_backgammon": 0.0065992572 + } + }, + { + "rank": 10, + "move": "13/7", + "ply": 1, + "equity": -0.09336931, + "equity_diff": -0.2433449, + "probabilities": { + "win": 0.47393072, + "win_gammon": 0.13328187, + "win_backgammon": 0.00536958, + "lose_gammon": 0.14898883, + "lose_backgammon": 0.009068512 + } + } + ] + } + } + } +} diff --git a/tests/reference/results/opening-64-match.json b/tests/reference/results/opening-64-match.json new file mode 100644 index 0000000..3fa1cb0 --- /dev/null +++ b/tests/reference/results/opening-64-match.json @@ -0,0 +1,343 @@ +{ + "id": "opening-64-match", + "type": "move", + "categories": [ + "opening", + "match" + ], + "description": "Position de départ, premier coup 6-4, match en 5 points à 0-0.", + "position_id": "4HPwATDgc/ABMA", + "match_id": "cAmzAAAAAAAE", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": [ + 6, + 4 + ], + "match_length": 5, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": false, + "beavers": false, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.52150303, + "win_gammon": 0.15414569, + "win_backgammon": 0.0075623477, + "lose_gammon": 0.12963872, + "lose_backgammon": 0.007494344 + }, + "equity": 0.065476716 + }, + "moves": { + "legal_move_count": 14, + "ranking": [ + { + "rank": 1, + "move": "24/14", + "ply": 0, + "equity": 0.032145042, + "equity_diff": 0.0, + "probabilities": { + "win": 0.5132097, + "win_gammon": 0.12580518, + "win_backgammon": 0.005208867, + "lose_gammon": 0.13388495, + "lose_backgammon": 0.004337863 + } + }, + { + "rank": 2, + "move": "24/18 13/9", + "ply": 0, + "equity": 0.012479822, + "equity_diff": -0.019665219, + "probabilities": { + "win": 0.50566316, + "win_gammon": 0.13537583, + "win_backgammon": 0.006847186, + "lose_gammon": 0.14028922, + "lose_backgammon": 0.0061775735 + } + }, + { + "rank": 3, + "move": "8/2 6/2", + "ply": 0, + "equity": -0.01096735, + "equity_diff": -0.04311239, + "probabilities": { + "win": 0.49491215, + "win_gammon": 0.15022527, + "win_backgammon": 0.008625889, + "lose_gammon": 0.14790136, + "lose_backgammon": 0.0062718117 + } + }, + { + "rank": 4, + "move": "24/20 24/18", + "ply": 0, + "equity": -0.033927325, + "equity_diff": -0.06607237, + "probabilities": { + "win": 0.4969083, + "win_gammon": 0.11908011, + "win_backgammon": 0.0046805823, + "lose_gammon": 0.14002788, + "lose_backgammon": 0.004476624 + } + }, + { + "rank": 5, + "move": "24/20 13/7", + "ply": 0, + "equity": -0.04174716, + "equity_diff": -0.073892206, + "probabilities": { + "win": 0.48929858, + "win_gammon": 0.12764157, + "win_backgammon": 0.0065241395, + "lose_gammon": 0.13548943, + "lose_backgammon": 0.0059220004 + } + }, + { + "rank": 6, + "move": "13/9 13/7", + "ply": 0, + "equity": -0.070028536, + "equity_diff": -0.10217358, + "probabilities": { + "win": 0.48026502, + "win_gammon": 0.14082111, + "win_backgammon": 0.009894757, + "lose_gammon": 0.14799584, + "lose_backgammon": 0.009749303 + } + }, + { + "rank": 7, + "move": "13/3", + "ply": 0, + "equity": -0.10725447, + "equity_diff": -0.13939951, + "probabilities": { + "win": 0.47168612, + "win_gammon": 0.1350749, + "win_backgammon": 0.009195123, + "lose_gammon": 0.1510934, + "lose_backgammon": 0.009191495 + } + }, + { + "rank": 8, + "move": "24/18 6/2", + "ply": 0, + "equity": -0.13111638, + "equity_diff": -0.16326141, + "probabilities": { + "win": 0.47397405, + "win_gammon": 0.11882964, + "win_backgammon": 0.005266155, + "lose_gammon": 0.1602438, + "lose_backgammon": 0.007042799 + } + }, + { + "rank": 9, + "move": "24/20 8/2", + "ply": 0, + "equity": -0.14994904, + "equity_diff": -0.18209408, + "probabilities": { + "win": 0.4667582, + "win_gammon": 0.11838941, + "win_backgammon": 0.005480149, + "lose_gammon": 0.15673465, + "lose_backgammon": 0.0073330947 + } + }, + { + "rank": 10, + "move": "24/18 8/4", + "ply": 0, + "equity": -0.15389982, + "equity_diff": -0.18604486, + "probabilities": { + "win": 0.46788013, + "win_gammon": 0.1191007, + "win_backgammon": 0.0062833736, + "lose_gammon": 0.16351272, + "lose_backgammon": 0.008200929 + } + } + ] + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.5249716, + "win_gammon": 0.14948216, + "win_backgammon": 0.0068404144, + "lose_gammon": 0.12513305, + "lose_backgammon": 0.005308273 + }, + "equity": 0.07408072 + }, + "moves": { + "legal_move_count": 14, + "ranking": [ + { + "rank": 1, + "move": "24/18 13/9", + "ply": 2, + "equity": 0.013528223, + "equity_diff": 0.0, + "probabilities": { + "win": 0.50474966, + "win_gammon": 0.13694319, + "win_backgammon": 0.006727477, + "lose_gammon": 0.13640973, + "lose_backgammon": 0.006058103 + } + }, + { + "rank": 2, + "move": "8/2 6/2", + "ply": 2, + "equity": 0.012467488, + "equity_diff": -0.0010607354, + "probabilities": { + "win": 0.5005937, + "win_gammon": 0.15047605, + "win_backgammon": 0.007168365, + "lose_gammon": 0.1418647, + "lose_backgammon": 0.00575178 + } + }, + { + "rank": 3, + "move": "24/14", + "ply": 2, + "equity": 0.004836519, + "equity_diff": -0.008691704, + "probabilities": { + "win": 0.5068997, + "win_gammon": 0.12267823, + "win_backgammon": 0.0045082034, + "lose_gammon": 0.13532133, + "lose_backgammon": 0.004538701 + } + }, + { + "rank": 4, + "move": "24/20 13/7", + "ply": 2, + "equity": -0.052962735, + "equity_diff": -0.066490956, + "probabilities": { + "win": 0.484963, + "win_gammon": 0.13132541, + "win_backgammon": 0.0059679076, + "lose_gammon": 0.13361627, + "lose_backgammon": 0.006393481 + } + }, + { + "rank": 5, + "move": "24/20 24/18", + "ply": 2, + "equity": -0.06900789, + "equity_diff": -0.08253611, + "probabilities": { + "win": 0.49018896, + "win_gammon": 0.116782986, + "win_backgammon": 0.0049995524, + "lose_gammon": 0.14722423, + "lose_backgammon": 0.0048995623 + } + }, + { + "rank": 6, + "move": "13/9 13/7", + "ply": 2, + "equity": -0.08274425, + "equity_diff": -0.09627247, + "probabilities": { + "win": 0.47648233, + "win_gammon": 0.14170869, + "win_backgammon": 0.008512239, + "lose_gammon": 0.14952661, + "lose_backgammon": 0.009999642 + } + }, + { + "rank": 7, + "move": "13/3", + "ply": 1, + "equity": -0.11306847, + "equity_diff": -0.12659669, + "probabilities": { + "win": 0.47033876, + "win_gammon": 0.13593201, + "win_backgammon": 0.0061058127, + "lose_gammon": 0.15410982, + "lose_backgammon": 0.009786302 + } + }, + { + "rank": 8, + "move": "24/18 6/2", + "ply": 1, + "equity": -0.118969575, + "equity_diff": -0.1324978, + "probabilities": { + "win": 0.47705173, + "win_gammon": 0.118122354, + "win_backgammon": 0.0049864654, + "lose_gammon": 0.16003127, + "lose_backgammon": 0.0070257727 + } + }, + { + "rank": 9, + "move": "24/18 8/4", + "ply": 1, + "equity": -0.14764719, + "equity_diff": -0.16117541, + "probabilities": { + "win": 0.46862328, + "win_gammon": 0.11914979, + "win_backgammon": 0.0055211615, + "lose_gammon": 0.16395095, + "lose_backgammon": 0.007844061 + } + }, + { + "rank": 10, + "move": "24/20 8/2", + "ply": 1, + "equity": -0.15855518, + "equity_diff": -0.17208341, + "probabilities": { + "win": 0.4609102, + "win_gammon": 0.12262041, + "win_backgammon": 0.005933554, + "lose_gammon": 0.15720539, + "lose_backgammon": 0.007826611 + } + } + ] + } + } + } +} diff --git a/tests/reference/results/opening-65.json b/tests/reference/results/opening-65.json new file mode 100644 index 0000000..f657e06 --- /dev/null +++ b/tests/reference/results/opening-65.json @@ -0,0 +1,258 @@ +{ + "id": "opening-65", + "type": "move", + "categories": [ + "opening" + ], + "description": "Position de départ, premier coup 6-5, partie libre.", + "position_id": "4HPwATDgc/ABMA", + "match_id": "cAkXAAAAAAAA", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": [ + 6, + 5 + ], + "match_length": 0, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": true, + "beavers": true, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.52150303, + "win_gammon": 0.15414569, + "win_backgammon": 0.0075623477, + "lose_gammon": 0.12963872, + "lose_backgammon": 0.007494344 + }, + "equity": 0.06758106 + }, + "moves": { + "legal_move_count": 7, + "ranking": [ + { + "rank": 1, + "move": "24/13", + "ply": 0, + "equity": 0.082985915, + "equity_diff": 0.0, + "probabilities": { + "win": 0.52771026, + "win_gammon": 0.12740123, + "win_backgammon": 0.0043210285, + "lose_gammon": 0.1293756, + "lose_backgammon": 0.0028542082 + } + }, + { + "rank": 2, + "move": "24/18 13/8", + "ply": 0, + "equity": 0.03631018, + "equity_diff": -0.046675734, + "probabilities": { + "win": 0.5125045, + "win_gammon": 0.13231666, + "win_backgammon": 0.0059944545, + "lose_gammon": 0.1354161, + "lose_backgammon": 0.0042471914 + } + }, + { + "rank": 3, + "move": "13/8 13/7", + "ply": 0, + "equity": -0.05142035, + "equity_diff": -0.13440627, + "probabilities": { + "win": 0.482184, + "win_gammon": 0.1389856, + "win_backgammon": 0.0093267895, + "lose_gammon": 0.13843802, + "lose_backgammon": 0.0076389513 + } + }, + { + "rank": 4, + "move": "13/2", + "ply": 0, + "equity": -0.13522762, + "equity_diff": -0.21821353, + "probabilities": { + "win": 0.46409917, + "win_gammon": 0.13093174, + "win_backgammon": 0.008294045, + "lose_gammon": 0.15645416, + "lose_backgammon": 0.009462133 + } + }, + { + "rank": 5, + "move": "24/18 8/3", + "ply": 0, + "equity": -0.14635906, + "equity_diff": -0.22934496, + "probabilities": { + "win": 0.46688402, + "win_gammon": 0.1202679, + "win_backgammon": 0.0059867823, + "lose_gammon": 0.1645123, + "lose_backgammon": 0.007699021 + } + }, + { + "rank": 6, + "move": "13/7 8/3", + "ply": 0, + "equity": -0.17384717, + "equity_diff": -0.25683308, + "probabilities": { + "win": 0.45640922, + "win_gammon": 0.12771896, + "win_backgammon": 0.008785374, + "lose_gammon": 0.1659471, + "lose_backgammon": 0.012491724 + } + }, + { + "rank": 7, + "move": "8/3 8/2", + "ply": 0, + "equity": -0.37779096, + "equity_diff": -0.46077687, + "probabilities": { + "win": 0.41052693, + "win_gammon": 0.111031, + "win_backgammon": 0.0072218007, + "lose_gammon": 0.20434058, + "lose_backgammon": 0.02066777 + } + } + ] + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.52483594, + "win_gammon": 0.14950693, + "win_backgammon": 0.006851064, + "lose_gammon": 0.124798514, + "lose_backgammon": 0.0052878163 + }, + "equity": 0.07594353 + }, + "moves": { + "legal_move_count": 7, + "ranking": [ + { + "rank": 1, + "move": "24/13", + "ply": 2, + "equity": 0.07996891, + "equity_diff": 0.0, + "probabilities": { + "win": 0.5278382, + "win_gammon": 0.122699715, + "win_backgammon": 0.00370063, + "lose_gammon": 0.123845525, + "lose_backgammon": 0.0030469655 + } + }, + { + "rank": 2, + "move": "24/18 13/8", + "ply": 2, + "equity": 0.03882884, + "equity_diff": -0.04114007, + "probabilities": { + "win": 0.5134117, + "win_gammon": 0.13248979, + "win_backgammon": 0.005861981, + "lose_gammon": 0.13121237, + "lose_backgammon": 0.0042340625 + } + }, + { + "rank": 3, + "move": "13/8 13/7", + "ply": 1, + "equity": -0.06351556, + "equity_diff": -0.14348447, + "probabilities": { + "win": 0.48014188, + "win_gammon": 0.14122242, + "win_backgammon": 0.0071167, + "lose_gammon": 0.14585866, + "lose_backgammon": 0.0088718245 + } + }, + { + "rank": 4, + "move": "13/2", + "ply": 1, + "equity": -0.12083713, + "equity_diff": -0.20080604, + "probabilities": { + "win": 0.46724582, + "win_gammon": 0.1349485, + "win_backgammon": 0.0057712086, + "lose_gammon": 0.1588556, + "lose_backgammon": 0.0101343 + } + }, + { + "rank": 5, + "move": "24/18 8/3", + "ply": 1, + "equity": -0.13999933, + "equity_diff": -0.21996823, + "probabilities": { + "win": 0.46690857, + "win_gammon": 0.11914817, + "win_backgammon": 0.0057104947, + "lose_gammon": 0.16515465, + "lose_backgammon": 0.008027693 + } + }, + { + "rank": 6, + "move": "13/7 8/3", + "ply": 0, + "equity": -0.16472448, + "equity_diff": -0.2446934, + "probabilities": { + "win": 0.45640922, + "win_gammon": 0.12771896, + "win_backgammon": 0.008785374, + "lose_gammon": 0.1659471, + "lose_backgammon": 0.012491724 + } + }, + { + "rank": 7, + "move": "8/3 8/2", + "ply": 0, + "equity": -0.35685992, + "equity_diff": -0.43682882, + "probabilities": { + "win": 0.41052693, + "win_gammon": 0.111031, + "win_backgammon": 0.0072218007, + "lose_gammon": 0.20434058, + "lose_backgammon": 0.02066777 + } + } + ] + } + } + } +} diff --git a/tests/reference/results/prime-1.json b/tests/reference/results/prime-1.json new file mode 100644 index 0000000..8c28506 --- /dev/null +++ b/tests/reference/results/prime-1.json @@ -0,0 +1,342 @@ +{ + "id": "prime-1", + "type": "move", + "categories": [ + "prime" + ], + "description": "Prime de sept points (4 à 10) contre deux dames bloquées, 6-5 à jouer.", + "position_id": "sOfgASjYbtsAAA", + "match_id": "cAkXAAAAAAAA", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": [ + 6, + 5 + ], + "match_length": 0, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": true, + "beavers": true, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.8655992, + "win_gammon": 0.4658586, + "win_backgammon": 0.011909843, + "lose_gammon": 0.011431644, + "lose_backgammon": 0.00021469918 + }, + "equity": 1.1973205 + }, + "moves": { + "legal_move_count": 20, + "ranking": [ + { + "rank": 1, + "move": "10/5 10/4", + "ply": 0, + "equity": 0.9286543, + "equity_diff": 0.0, + "probabilities": { + "win": 0.8513632, + "win_gammon": 0.43550923, + "win_backgammon": 0.005316701, + "lose_gammon": 0.014350709, + "lose_backgammon": 0.0 + } + }, + { + "rank": 2, + "move": "9/3 8/3", + "ply": 0, + "equity": 0.91481084, + "equity_diff": -0.013843477, + "probabilities": { + "win": 0.8225226, + "win_gammon": 0.41249195, + "win_backgammon": 0.011286367, + "lose_gammon": 0.021570234, + "lose_backgammon": 0.00028053587 + } + }, + { + "rank": 3, + "move": "8/2* 7/2", + "ply": 0, + "equity": 0.91188866, + "equity_diff": -0.016765654, + "probabilities": { + "win": 0.81643474, + "win_gammon": 0.505939, + "win_backgammon": 0.019068513, + "lose_gammon": 0.024723591, + "lose_backgammon": 0.00033526268 + } + }, + { + "rank": 4, + "move": "7/1* 6/1", + "ply": 0, + "equity": 0.91151243, + "equity_diff": -0.017141879, + "probabilities": { + "win": 0.8156509, + "win_gammon": 0.5107823, + "win_backgammon": 0.012463278, + "lose_gammon": 0.02574886, + "lose_backgammon": 0.00029595735 + } + }, + { + "rank": 5, + "move": "10/4 9/4", + "ply": 0, + "equity": 0.909599, + "equity_diff": -0.019055307, + "probabilities": { + "win": 0.8116646, + "win_gammon": 0.38501698, + "win_backgammon": 0.009137439, + "lose_gammon": 0.024035273, + "lose_backgammon": 0.00020561785 + } + }, + { + "rank": 6, + "move": "10/4 6/1*", + "ply": 0, + "equity": 0.8990789, + "equity_diff": -0.029575408, + "probabilities": { + "win": 0.7897477, + "win_gammon": 0.43079844, + "win_backgammon": 0.013715115, + "lose_gammon": 0.035248894, + "lose_backgammon": 0.00074340653 + } + }, + { + "rank": 7, + "move": "10/5 8/2*", + "ply": 0, + "equity": 0.88933027, + "equity_diff": -0.039324045, + "probabilities": { + "win": 0.7694381, + "win_gammon": 0.4339997, + "win_backgammon": 0.019571386, + "lose_gammon": 0.045657642, + "lose_backgammon": 0.0015209726 + } + }, + { + "rank": 8, + "move": "9/4 9/3", + "ply": 0, + "equity": 0.88823783, + "equity_diff": -0.04041648, + "probabilities": { + "win": 0.76716214, + "win_gammon": 0.35637382, + "win_backgammon": 0.011056388, + "lose_gammon": 0.036706883, + "lose_backgammon": 0.00064023735 + } + }, + { + "rank": 9, + "move": "7/2* 7/1*", + "ply": 0, + "equity": 0.8866432, + "equity_diff": -0.04201114, + "probabilities": { + "win": 0.76384, + "win_gammon": 0.5207646, + "win_backgammon": 0.016013121, + "lose_gammon": 0.045796365, + "lose_backgammon": 0.0012542859 + } + }, + { + "rank": 10, + "move": "8/2* 6/1*", + "ply": 0, + "equity": 0.8841353, + "equity_diff": -0.044519007, + "probabilities": { + "win": 0.75861526, + "win_gammon": 0.5065599, + "win_backgammon": 0.014366001, + "lose_gammon": 0.051405713, + "lose_backgammon": 0.0017987059 + } + } + ] + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.8567083, + "win_gammon": 0.41042906, + "win_backgammon": 0.010711104, + "lose_gammon": 0.011253362, + "lose_backgammon": 0.0001909562 + }, + "equity": 1.1231124 + }, + "moves": { + "legal_move_count": 20, + "ranking": [ + { + "rank": 1, + "move": "8/2* 7/2", + "ply": 2, + "equity": 1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.81325984, + "win_gammon": 0.47152492, + "win_backgammon": 0.015115261, + "lose_gammon": 0.021139864, + "lose_backgammon": 0.00058008975 + } + }, + { + "rank": 2, + "move": "7/1* 6/1", + "ply": 2, + "equity": 1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.8139828, + "win_gammon": 0.4687021, + "win_backgammon": 0.008918843, + "lose_gammon": 0.022820208, + "lose_backgammon": 0.0004943738 + } + }, + { + "rank": 3, + "move": "10/5 10/4", + "ply": 2, + "equity": 1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.8509312, + "win_gammon": 0.3720924, + "win_backgammon": 0.0070947357, + "lose_gammon": 0.011542028, + "lose_backgammon": 3.5199406e-05 + } + }, + { + "rank": 4, + "move": "10/4 9/4", + "ply": 2, + "equity": 1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.8130758, + "win_gammon": 0.3676943, + "win_backgammon": 0.008449971, + "lose_gammon": 0.020860892, + "lose_backgammon": 0.00039270156 + } + }, + { + "rank": 5, + "move": "10/4 6/1*", + "ply": 2, + "equity": 0.98973477, + "equity_diff": -0.010265231, + "probabilities": { + "win": 0.79894304, + "win_gammon": 0.3953247, + "win_backgammon": 0.00967248, + "lose_gammon": 0.025952648, + "lose_backgammon": 0.00059328304 + } + }, + { + "rank": 6, + "move": "9/3 8/3", + "ply": 2, + "equity": 0.9731504, + "equity_diff": -0.026849627, + "probabilities": { + "win": 0.82461846, + "win_gammon": 0.38691625, + "win_backgammon": 0.0090406, + "lose_gammon": 0.02157075, + "lose_backgammon": 0.0006911739 + } + }, + { + "rank": 7, + "move": "9/4 9/3", + "ply": 1, + "equity": 0.9465788, + "equity_diff": -0.0534212, + "probabilities": { + "win": 0.7728535, + "win_gammon": 0.42011485, + "win_backgammon": 0.01456115, + "lose_gammon": 0.037108038, + "lose_backgammon": 0.0013165966 + } + }, + { + "rank": 8, + "move": "7/2* 7/1*", + "ply": 1, + "equity": 0.897239, + "equity_diff": -0.10276097, + "probabilities": { + "win": 0.7557639, + "win_gammon": 0.50819904, + "win_backgammon": 0.014897239, + "lose_gammon": 0.04800537, + "lose_backgammon": 0.002055657 + } + }, + { + "rank": 9, + "move": "10/5 8/2*", + "ply": 1, + "equity": 0.8937871, + "equity_diff": -0.106212914, + "probabilities": { + "win": 0.7646039, + "win_gammon": 0.44300845, + "win_backgammon": 0.014629123, + "lose_gammon": 0.043236062, + "lose_backgammon": 0.0018545209 + } + }, + { + "rank": 10, + "move": "8/2* 6/1*", + "ply": 1, + "equity": 0.88665456, + "equity_diff": -0.113345444, + "probabilities": { + "win": 0.7548188, + "win_gammon": 0.4978714, + "win_backgammon": 0.0123877935, + "lose_gammon": 0.05122026, + "lose_backgammon": 0.002442581 + } + } + ] + } + } + } +} diff --git a/tests/reference/results/prime-vs-prime.json b/tests/reference/results/prime-vs-prime.json new file mode 100644 index 0000000..87c8c5f --- /dev/null +++ b/tests/reference/results/prime-vs-prime.json @@ -0,0 +1,342 @@ +{ + "id": "prime-vs-prime", + "type": "move", + "categories": [ + "prime" + ], + "description": "Prime contre prime, 4-2 à jouer.", + "position_id": "4LZtAAbAbZsBAw", + "match_id": "cAkKAAAAAAAA", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": [ + 4, + 2 + ], + "match_length": 0, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": true, + "beavers": true, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.5859382, + "win_gammon": 0.104033135, + "win_backgammon": 0.0015103245, + "lose_gammon": 0.08213356, + "lose_backgammon": 0.0018884396 + }, + "equity": 0.19339794 + }, + "moves": { + "legal_move_count": 30, + "ranking": [ + { + "rank": 1, + "move": "13/9 7/5", + "ply": 0, + "equity": 0.25847092, + "equity_diff": 0.0, + "probabilities": { + "win": 0.5787089, + "win_gammon": 0.116331734, + "win_backgammon": 0.001626573, + "lose_gammon": 0.093117766, + "lose_backgammon": 0.003826014 + } + }, + { + "rank": 2, + "move": "13/11 13/9", + "ply": 0, + "equity": 0.221898, + "equity_diff": -0.03657292, + "probabilities": { + "win": 0.5663601, + "win_gammon": 0.10177347, + "win_backgammon": 0.0009054669, + "lose_gammon": 0.07929507, + "lose_backgammon": 0.0017394633 + } + }, + { + "rank": 3, + "move": "13/9 11/9", + "ply": 0, + "equity": 0.19645907, + "equity_diff": -0.062011853, + "probabilities": { + "win": 0.5583523, + "win_gammon": 0.09458251, + "win_backgammon": 0.0006703551, + "lose_gammon": 0.07210356, + "lose_backgammon": 0.002796524 + } + }, + { + "rank": 4, + "move": "13/11 7/3", + "ply": 0, + "equity": 0.19219376, + "equity_diff": -0.06627716, + "probabilities": { + "win": 0.5591088, + "win_gammon": 0.1001975, + "win_backgammon": 0.0012615522, + "lose_gammon": 0.08479082, + "lose_backgammon": 0.0027743012 + } + }, + { + "rank": 5, + "move": "13/7", + "ply": 0, + "equity": 0.18945344, + "equity_diff": -0.069017485, + "probabilities": { + "win": 0.55739087, + "win_gammon": 0.09633856, + "win_backgammon": 0.00093676086, + "lose_gammon": 0.0790465, + "lose_backgammon": 0.0019305774 + } + }, + { + "rank": 6, + "move": "11/9 7/3", + "ply": 0, + "equity": 0.09367702, + "equity_diff": -0.16479391, + "probabilities": { + "win": 0.5286896, + "win_gammon": 0.092135176, + "win_backgammon": 0.0011084256, + "lose_gammon": 0.082942754, + "lose_backgammon": 0.0031702474 + } + }, + { + "rank": 7, + "move": "11/9 11/7", + "ply": 0, + "equity": 0.04228642, + "equity_diff": -0.2161845, + "probabilities": { + "win": 0.5131979, + "win_gammon": 0.0827335, + "win_backgammon": 0.00075263315, + "lose_gammon": 0.0792447, + "lose_backgammon": 0.00175771 + } + }, + { + "rank": 8, + "move": "11/5", + "ply": 0, + "equity": 0.033703107, + "equity_diff": -0.22476782, + "probabilities": { + "win": 0.5145213, + "win_gammon": 0.09494684, + "win_backgammon": 0.0014330989, + "lose_gammon": 0.10159985, + "lose_backgammon": 0.0047021317 + } + }, + { + "rank": 9, + "move": "7/5 7/3", + "ply": 0, + "equity": -0.008577732, + "equity_diff": -0.26704866, + "probabilities": { + "win": 0.5076164, + "win_gammon": 0.10781382, + "win_backgammon": 0.0021902262, + "lose_gammon": 0.13264568, + "lose_backgammon": 0.008471891 + } + }, + { + "rank": 10, + "move": "13/9 8/6", + "ply": 0, + "equity": -0.019187106, + "equity_diff": -0.27765802, + "probabilities": { + "win": 0.50290227, + "win_gammon": 0.10569657, + "win_backgammon": 0.0015536122, + "lose_gammon": 0.12802827, + "lose_backgammon": 0.00678722 + } + } + ] + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.573719, + "win_gammon": 0.10084047, + "win_backgammon": 0.002428729, + "lose_gammon": 0.07975082, + "lose_backgammon": 0.0017157685 + }, + "equity": 0.16924071 + }, + "moves": { + "legal_move_count": 30, + "ranking": [ + { + "rank": 1, + "move": "13/11 13/9", + "ply": 2, + "equity": 0.28092703, + "equity_diff": 0.0, + "probabilities": { + "win": 0.5902071, + "win_gammon": 0.10632644, + "win_backgammon": 0.0016070568, + "lose_gammon": 0.08428587, + "lose_backgammon": 0.0029952566 + } + }, + { + "rank": 2, + "move": "13/9 7/5", + "ply": 2, + "equity": 0.2633432, + "equity_diff": -0.017583847, + "probabilities": { + "win": 0.5850047, + "win_gammon": 0.107560314, + "win_backgammon": 0.0020355762, + "lose_gammon": 0.08815433, + "lose_backgammon": 0.0035044546 + } + }, + { + "rank": 3, + "move": "13/7", + "ply": 2, + "equity": 0.23465449, + "equity_diff": -0.046272546, + "probabilities": { + "win": 0.57621956, + "win_gammon": 0.1040979, + "win_backgammon": 0.0014530121, + "lose_gammon": 0.08800088, + "lose_backgammon": 0.003090742 + } + }, + { + "rank": 4, + "move": "13/11 7/3", + "ply": 1, + "equity": 0.110035, + "equity_diff": -0.17089203, + "probabilities": { + "win": 0.5356576, + "win_gammon": 0.09340437, + "win_backgammon": 0.0022042661, + "lose_gammon": 0.086402275, + "lose_backgammon": 0.0021580954 + } + }, + { + "rank": 5, + "move": "13/9 11/9", + "ply": 1, + "equity": 0.10979114, + "equity_diff": -0.1711359, + "probabilities": { + "win": 0.532701, + "win_gammon": 0.09258151, + "win_backgammon": 0.0021347587, + "lose_gammon": 0.07688659, + "lose_backgammon": 0.001572368 + } + }, + { + "rank": 6, + "move": "11/9 11/7", + "ply": 1, + "equity": 0.08005641, + "equity_diff": -0.20087063, + "probabilities": { + "win": 0.5264142, + "win_gammon": 0.082415216, + "win_backgammon": 0.002125705, + "lose_gammon": 0.07943145, + "lose_backgammon": 0.0014926612 + } + }, + { + "rank": 7, + "move": "11/5", + "ply": 1, + "equity": 0.06761365, + "equity_diff": -0.21331339, + "probabilities": { + "win": 0.527151, + "win_gammon": 0.09548307, + "win_backgammon": 0.0035322409, + "lose_gammon": 0.10803594, + "lose_backgammon": 0.0034483601 + } + }, + { + "rank": 8, + "move": "7/1", + "ply": 1, + "equity": 0.042479984, + "equity_diff": -0.23844704, + "probabilities": { + "win": 0.51697606, + "win_gammon": 0.089571245, + "win_backgammon": 0.0018772773, + "lose_gammon": 0.09657972, + "lose_backgammon": 0.0024391545 + } + }, + { + "rank": 9, + "move": "11/9 7/3", + "ply": 1, + "equity": -0.009245263, + "equity_diff": -0.2901723, + "probabilities": { + "win": 0.4997064, + "win_gammon": 0.08421732, + "win_backgammon": 0.002413399, + "lose_gammon": 0.09338032, + "lose_backgammon": 0.0025060475 + } + }, + { + "rank": 10, + "move": "9/5 7/5", + "ply": 1, + "equity": -0.036094524, + "equity_diff": -0.31702155, + "probabilities": { + "win": 0.49184453, + "win_gammon": 0.08312693, + "win_backgammon": 0.0025748007, + "lose_gammon": 0.09706599, + "lose_backgammon": 0.002300389 + } + } + ] + } + } + } +} diff --git a/tests/reference/results/race-1.json b/tests/reference/results/race-1.json new file mode 100644 index 0000000..b8643d7 --- /dev/null +++ b/tests/reference/results/race-1.json @@ -0,0 +1,342 @@ +{ + "id": "race-1", + "type": "move", + "categories": [ + "race" + ], + "description": "Course courte sans contact, 6-2 à jouer.", + "position_id": "trsXAADs7mwAAA", + "match_id": "cAkLAAAAAAAA", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": [ + 6, + 2 + ], + "match_length": 0, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": true, + "beavers": true, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.22300714, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 5.0172162e-05, + "lose_backgammon": 0.0 + }, + "equity": -0.5540359 + }, + "moves": { + "legal_move_count": 12, + "ranking": [ + { + "rank": 1, + "move": "8/6 8/2", + "ply": 0, + "equity": -0.99325633, + "equity_diff": 0.0, + "probabilities": { + "win": 0.2110784, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 5.0172162e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 2, + "move": "9/3 8/6", + "ply": 0, + "equity": -1.0, + "equity_diff": -0.0067436695, + "probabilities": { + "win": 0.20910054, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 5.0172162e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 3, + "move": "9/7 8/2", + "ply": 0, + "equity": -1.0, + "equity_diff": -0.0067436695, + "probabilities": { + "win": 0.20572007, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 5.0172162e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 4, + "move": "8/2 3/1", + "ply": 0, + "equity": -1.0, + "equity_diff": -0.0067436695, + "probabilities": { + "win": 0.20436102, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 5.0172162e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 5, + "move": "9/1", + "ply": 0, + "equity": -1.0, + "equity_diff": -0.0067436695, + "probabilities": { + "win": 0.20345944, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 5.0172162e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 6, + "move": "9/7 9/3", + "ply": 0, + "equity": -1.0, + "equity_diff": -0.0067436695, + "probabilities": { + "win": 0.20253927, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 5.0172162e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 7, + "move": "8/2 6/4", + "ply": 0, + "equity": -1.0, + "equity_diff": -0.0067436695, + "probabilities": { + "win": 0.19989008, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 5.0172162e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 8, + "move": "8/2 4/2", + "ply": 0, + "equity": -1.0, + "equity_diff": -0.0067436695, + "probabilities": { + "win": 0.19952285, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 5.0172162e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 9, + "move": "9/3 4/2", + "ply": 0, + "equity": -1.0, + "equity_diff": -0.0067436695, + "probabilities": { + "win": 0.19951928, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 5.0172162e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 10, + "move": "9/3 6/4", + "ply": 0, + "equity": -1.0, + "equity_diff": -0.0067436695, + "probabilities": { + "win": 0.19472843, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 5.0172162e-05, + "lose_backgammon": 0.0 + } + } + ] + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.22191674, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 4.3242515e-05, + "lose_backgammon": 0.0 + }, + "equity": -0.5562098 + }, + "moves": { + "legal_move_count": 12, + "ranking": [ + { + "rank": 1, + "move": "8/6 8/2", + "ply": 2, + "equity": -1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.21125406, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 2.647975e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 2, + "move": "9/3 8/6", + "ply": 2, + "equity": -1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.2100758, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 1.8350003e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 3, + "move": "9/7 8/2", + "ply": 2, + "equity": -1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.2079969, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 4.320381e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 4, + "move": "8/2 3/1", + "ply": 2, + "equity": -1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.20499009, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 4.4597477e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 5, + "move": "9/1", + "ply": 2, + "equity": -1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.20378089, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 4.320381e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 6, + "move": "9/7 9/3", + "ply": 2, + "equity": -1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.2022022, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 4.320381e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 7, + "move": "8/2 6/4", + "ply": 1, + "equity": -1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.19859427, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 5.017216e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 8, + "move": "8/2 4/2", + "ply": 1, + "equity": -1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.19832993, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 5.017216e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 9, + "move": "9/3 4/2", + "ply": 1, + "equity": -1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.19807649, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 5.017216e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 10, + "move": "8/2 5/3", + "ply": 1, + "equity": -1.0, + "equity_diff": 0.0, + "probabilities": { + "win": 0.19526589, + "win_gammon": 0.0, + "win_backgammon": 0.0, + "lose_gammon": 5.017216e-05, + "lose_backgammon": 0.0 + } + } + ] + } + } + } +} diff --git a/tests/reference/results/race-2.json b/tests/reference/results/race-2.json new file mode 100644 index 0000000..704dc65 --- /dev/null +++ b/tests/reference/results/race-2.json @@ -0,0 +1,342 @@ +{ + "id": "race-2", + "type": "move", + "categories": [ + "race" + ], + "description": "Course longue sans contact, 5-4 à jouer.", + "position_id": "cLezAQBwN2cGAA", + "match_id": "cIkSAAAAAAAA", + "gnubg_commit": "14b67984737ded0f6de43d63dcb789f729d9b06b", + "met": "Kazaross-XG2", + "context": { + "dice": [ + 5, + 4 + ], + "match_length": 0, + "score_player": 0, + "score_opponent": 0, + "crawford": false, + "jacoby": true, + "beavers": true, + "cube_value": 1, + "cube_owner": "centered" + }, + "plies": { + "0": { + "evaluation": { + "probabilities": { + "win": 0.40590674, + "win_gammon": 5.0172162e-05, + "win_backgammon": 0.0, + "lose_gammon": 0.00011031296, + "lose_backgammon": 0.0 + }, + "equity": -0.18824667 + }, + "moves": { + "legal_move_count": 29, + "ranking": [ + { + "rank": 1, + "move": "13/9 11/6", + "ply": 0, + "equity": -0.22230339, + "equity_diff": 0.0, + "probabilities": { + "win": 0.42750978, + "win_gammon": 5.0172162e-05, + "win_backgammon": 0.0, + "lose_gammon": 5.0172162e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 2, + "move": "11/6 9/5", + "ply": 0, + "equity": -0.22993731, + "equity_diff": -0.0076339245, + "probabilities": { + "win": 0.42501032, + "win_gammon": 7.926868e-05, + "win_backgammon": 0.0, + "lose_gammon": 5.0172162e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 3, + "move": "13/8 9/5", + "ply": 0, + "equity": -0.23005769, + "equity_diff": -0.007754296, + "probabilities": { + "win": 0.42498118, + "win_gammon": 5.0172162e-05, + "win_backgammon": 0.0, + "lose_gammon": 5.0172162e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 4, + "move": "13/9 13/8", + "ply": 0, + "equity": -0.23073325, + "equity_diff": -0.008429855, + "probabilities": { + "win": 0.42476094, + "win_gammon": 5.0172162e-05, + "win_backgammon": 0.0, + "lose_gammon": 5.0172162e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 5, + "move": "13/8 11/7", + "ply": 0, + "equity": -0.23153114, + "equity_diff": -0.009227753, + "probabilities": { + "win": 0.4245007, + "win_gammon": 5.0172162e-05, + "win_backgammon": 0.0, + "lose_gammon": 5.0172162e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 6, + "move": "11/7 11/6", + "ply": 0, + "equity": -0.2335976, + "equity_diff": -0.011294216, + "probabilities": { + "win": 0.4238268, + "win_gammon": 5.0172162e-05, + "win_backgammon": 0.0, + "lose_gammon": 5.0172162e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 7, + "move": "13/8 7/3", + "ply": 0, + "equity": -0.23374501, + "equity_diff": -0.011441618, + "probabilities": { + "win": 0.42377877, + "win_gammon": 5.0172162e-05, + "win_backgammon": 0.0, + "lose_gammon": 5.0172162e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 8, + "move": "11/6 7/3", + "ply": 0, + "equity": -0.23394687, + "equity_diff": -0.011643484, + "probabilities": { + "win": 0.42370635, + "win_gammon": 6.923826e-05, + "win_backgammon": 0.0, + "lose_gammon": 5.0172162e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 9, + "move": "13/4", + "ply": 0, + "equity": -0.23507257, + "equity_diff": -0.012769178, + "probabilities": { + "win": 0.42334592, + "win_gammon": 5.0172162e-05, + "win_backgammon": 0.0, + "lose_gammon": 5.0172162e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 10, + "move": "13/9 7/2", + "ply": 0, + "equity": -0.23529215, + "equity_diff": -0.012988761, + "probabilities": { + "win": 0.4232731, + "win_gammon": 5.365527e-05, + "win_backgammon": 0.0, + "lose_gammon": 5.0172162e-05, + "lose_backgammon": 0.0 + } + } + ] + } + }, + "2": { + "evaluation": { + "probabilities": { + "win": 0.4062826, + "win_gammon": 5.017216e-05, + "win_backgammon": 0.0, + "lose_gammon": 0.00014703373, + "lose_backgammon": 0.0 + }, + "equity": -0.18753165 + }, + "moves": { + "legal_move_count": 29, + "ranking": [ + { + "rank": 1, + "move": "13/9 11/6", + "ply": 2, + "equity": -0.21922025, + "equity_diff": 0.0, + "probabilities": { + "win": 0.42613363, + "win_gammon": 5.020016e-05, + "win_backgammon": 0.0, + "lose_gammon": 5.017216e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 2, + "move": "13/9 13/8", + "ply": 2, + "equity": -0.2202243, + "equity_diff": -0.0010040551, + "probabilities": { + "win": 0.4258194, + "win_gammon": 5.017216e-05, + "win_backgammon": 0.0, + "lose_gammon": 5.017216e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 3, + "move": "11/6 9/5", + "ply": 2, + "equity": -0.22022447, + "equity_diff": -0.001004219, + "probabilities": { + "win": 0.42580163, + "win_gammon": 5.0231392e-05, + "win_backgammon": 0.0, + "lose_gammon": 5.017216e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 4, + "move": "13/8 9/5", + "ply": 2, + "equity": -0.22088149, + "equity_diff": -0.001661241, + "probabilities": { + "win": 0.42555606, + "win_gammon": 5.017216e-05, + "win_backgammon": 0.0, + "lose_gammon": 5.017216e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 5, + "move": "11/7 11/6", + "ply": 2, + "equity": -0.22277355, + "equity_diff": -0.003553301, + "probabilities": { + "win": 0.42487752, + "win_gammon": 5.0212635e-05, + "win_backgammon": 0.0, + "lose_gammon": 5.017216e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 6, + "move": "13/4", + "ply": 2, + "equity": -0.2230124, + "equity_diff": -0.0037921518, + "probabilities": { + "win": 0.42485, + "win_gammon": 5.024074e-05, + "win_backgammon": 0.0, + "lose_gammon": 5.0183233e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 7, + "move": "11/7 9/4", + "ply": 1, + "equity": -0.22985312, + "equity_diff": -0.010632873, + "probabilities": { + "win": 0.4204048, + "win_gammon": 5.017216e-05, + "win_backgammon": 0.0, + "lose_gammon": 6.302685e-05, + "lose_backgammon": 0.0 + } + }, + { + "rank": 8, + "move": "13/8 11/7", + "ply": 1, + "equity": -0.23169218, + "equity_diff": -0.012471929, + "probabilities": { + "win": 0.4197837, + "win_gammon": 5.017216e-05, + "win_backgammon": 0.0, + "lose_gammon": 0.00022215334, + "lose_backgammon": 0.0 + } + }, + { + "rank": 9, + "move": "9/4 7/3", + "ply": 1, + "equity": -0.23420003, + "equity_diff": -0.01497978, + "probabilities": { + "win": 0.4189803, + "win_gammon": 5.017216e-05, + "win_backgammon": 0.0, + "lose_gammon": 0.00013822057, + "lose_backgammon": 0.0 + } + }, + { + "rank": 10, + "move": "13/9 7/2", + "ply": 1, + "equity": -0.23561361, + "equity_diff": -0.016393363, + "probabilities": { + "win": 0.4184612, + "win_gammon": 5.017216e-05, + "win_backgammon": 0.0, + "lose_gammon": 0.00018745882, + "lose_backgammon": 0.0 + } + } + ] + } + } + } +} diff --git a/tests/test_reference.sh b/tests/test_reference.sh new file mode 100644 index 0000000..8e9a58b --- /dev/null +++ b/tests/test_reference.sh @@ -0,0 +1,111 @@ +#!/usr/bin/env bash +# Vérifie la cohérence des positions de référence (tests/reference/) : +# JSON valide, au moins 30 positions, chaque catégorie présente, un résultat +# par position aux niveaux 0 et 2 plis avec tous les champs du format +# (voir tests/reference/README.md). Ne lance pas Docker ni gnubg. + +set -euo pipefail +cd "$(dirname "$0")/reference" + +command -v jq >/dev/null || { echo "jq est requis : sudo apt install jq"; exit 1; } + +erreurs=0 +signaler() { + echo "$1" + erreurs=$((erreurs + 1)) +} + +jq empty positions.json || { echo "positions.json : JSON invalide"; exit 1; } + +nombre="$(jq '.positions | length' positions.json)" +[ "$nombre" -ge 30 ] || signaler "positions.json : $nombre positions, 30 au minimum" + +doublons="$(jq -r '[.positions[].id] | group_by(.) | map(select(length > 1)[0]) | join(" ")' positions.json)" +[ -z "$doublons" ] || signaler "positions.json : identifiants en double : $doublons" + +for categorie in opening middlegame prime blitz race bearoff \ + cube_no_double cube_double_take cube_double_pass match crawford jacoby; do + jq -e --arg c "$categorie" 'any(.positions[]; .categories | index($c))' positions.json >/dev/null \ + || signaler "positions.json : aucune position de catégorie « $categorie »" +done + +# Champs obligatoires de chaque position d'entrée. +invalides="$(jq -r '.positions[] + | select((.id | type) != "string" + or (.type | IN("move", "cube") | not) + or (.position_id | test("^[A-Za-z0-9+/]{14}$") | not) + or (.match_id | test("^[A-Za-z0-9+/]{12}$") | not) + or (.categories | type) != "array" + or (.description | type) != "string" + or (if .type == "move" then (.dice | type) != "array" else .dice != null end)) + | "positions.json : position \(.id) incomplète ou invalide"' positions.json)" +[ -z "$invalides" ] || signaler "$invalides" + +# Filtre jq : liste les défauts d'un fichier de résultat (vide si conforme). +read -r -d '' controle <<'JQ' || true +def nombre: type == "number"; +def probas: (keys == ["lose_backgammon", "lose_gammon", "win", "win_backgammon", "win_gammon"]) + and all(.[]; nombre and . >= 0 and . <= 1); +def defauts($pos): + (if .id != $pos.id or .type != $pos.type or .position_id != $pos.position_id + or .match_id != $pos.match_id or .categories != $pos.categories + then "en-tête différent de positions.json" else empty end), + (if (.gnubg_commit | test("^[0-9a-f]{40}$")) and .met == "Kazaross-XG2" then empty + else "gnubg_commit ou met invalide" end), + (.context | if (.dice == $pos.dice) and (.match_length | nombre) + and (.score_player | nombre) and (.score_opponent | nombre) + and (.cube_value | nombre) and (.cube_owner | IN("centered", "player", "opponent")) + and ([.crawford, .jacoby, .beavers] | all(type == "boolean")) + then empty else "context incomplet" end), + (if (.plies | keys) == ["0", "2"] then empty else "niveaux attendus : 0 et 2" end), + (.plies | to_entries[] | .key as $n | .value | + (if (.evaluation.probabilities | probas) and (.evaluation.equity | nombre) + then empty else "niveau \($n) : evaluation incomplète" end), + (if $pos.type == "move" then + (.moves | if (.legal_move_count | nombre) + and (.ranking | length) == ([.legal_move_count, 10] | min) + and all(.ranking[]; (.rank | nombre) and (.move | type) == "string" + and (.ply | nombre) and (.equity | nombre) and (.equity_diff | nombre) + and (.probabilities | probas)) + then empty else "niveau \($n) : classement des coups incomplet" end) + else + (.cube | if ([.no_double, .double_take, .double_pass, .optimal] | all(nombre)) + and (.decision | type) == "string" and (.decision_text | type) == "string" + then empty else "niveau \($n) : décision de videau incomplète" end) + end)); +defauts($pos) +JQ + +# Décision de videau attendue à 2 plis selon la catégorie. +read -r -d '' decision <<'JQ' || true +.categories as $c | .plies["2"].cube.decision as $d +| if ($c | index("cube_no_double")) and ($d | test("^NO_?(RE)?DOUBLE_") | not) then "pas de double attendu, gnubg dit \($d)" + elif ($c | index("cube_double_take")) and ($d | IN("DOUBLE_TAKE", "REDOUBLE_TAKE") | not) then "double/prend attendu, gnubg dit \($d)" + elif ($c | index("cube_double_pass")) and ($d | IN("DOUBLE_PASS", "REDOUBLE_PASS") | not) then "double/passe attendu, gnubg dit \($d)" + else empty end +JQ + +mapfile -t ids < <(jq -r '.positions[].id' positions.json) +for id in "${ids[@]}"; do + f="results/$id.json" + if [ ! -f "$f" ]; then + signaler "$f absent : lancer make reference" + continue + fi + if ! jq empty "$f" 2>/dev/null; then + signaler "$f : JSON invalide" + continue + fi + pos="$(jq --arg id "$id" '.positions[] | select(.id == $id)' positions.json)" + while read -r defaut; do + [ -n "$defaut" ] && signaler "$f : $defaut" + done < <(jq -r --argjson pos "$pos" "$controle" "$f"; jq -r "$decision" "$f") +done + +for f in results/*.json; do + [ -e "$f" ] || continue + id="$(basename "$f" .json)" + printf '%s\n' "${ids[@]}" | grep -qxF "$id" || signaler "$f : position absente de positions.json" +done + +[ "$erreurs" -eq 0 ]