diff --git a/docs/feuille-de-route.md b/docs/feuille-de-route.md index dec2e5b..3c9354f 100644 --- a/docs/feuille-de-route.md +++ b/docs/feuille-de-route.md @@ -10,7 +10,7 @@ Légende : ✅ terminé · 🔄 en cours · ⏳ à venir · ⏸ conditionnel | Sous-étape | Contenu | État | Plans | | --- | --- | --- | --- | | Socle | Dépôt, Makefile, lint, tests, organisation | ✅ | — | -| 0a.1 | Choisir la source du moteur (gnubg, gnubg-nn, CBG) — validation de Pierre | 🔄 | `plans/2026-11-02-choix-source-moteur.md` | +| 0a.1 | Choisir la source du moteur (gnubg, gnubg-nn, CBG) — étude faite, recommandation : gnubg officiel ; en attente de validation de Pierre | 🔄 | `plans/2026-11-02-choix-source-moteur.md` | | 0a.2 | Image Docker GNU Backgammon de bureau, 30+ positions de référence dans `tests/reference/` | ⏳ | | | 0a.3 | Interface C `engine/include/moteur.h` et `engine-cli` (JSON) | ⏳ | | | 0a.4 | `make test` compare `engine-cli` aux références | ⏳ | | diff --git a/docs/journal.md b/docs/journal.md index 84c0436..e1e7a96 100644 --- a/docs/journal.md +++ b/docs/journal.md @@ -29,6 +29,7 @@ Une entrée datée par session : ce qui a été fait, décidé, et la suite. - Claude Code pilote le projet par sous-agents ; tout le suivi est dans `docs/`. **Reste à faire** -- Clôturer l'étude du moteur et soumettre la recommandation à Pierre. +- Étude du moteur clôturée : recommandation gnubg officiel (commit `14b6798`), + soumise à Pierre. - `adb` n'est pas installé sur le PC : `sudo apt install adb` avant les tests sur le téléphone. diff --git a/docs/plans/2026-11-02-choix-source-moteur.md b/docs/plans/2026-11-02-choix-source-moteur.md index c6cb27b..6339614 100644 --- a/docs/plans/2026-11-02-choix-source-moteur.md +++ b/docs/plans/2026-11-02-choix-source-moteur.md @@ -2,7 +2,7 @@ - **Date** : 2026-11-02 - **Étape** : 0a.1 -- **Statut** : en cours +- **Statut** : terminé — recommandation en attente de validation par Pierre - **Exécutant** : sous-agent general-purpose (étude, sans modification du dépôt) ## Objectif @@ -55,4 +55,85 @@ recommandée. ## Résultat -À remplir à la clôture. +**Recommandation** : partir de **gnubg officiel**, figé à un commit, et n'en +extraire que le cœur. CBG sert de référence à lire, pas de code à reprendre. +gnubg-nn est écarté. + +### Versions étudiées + +| Source | Commit | Date | +| --- | --- | --- | +| gnubg | `14b67984737ded0f6de43d63dcb789f729d9b06b` (1.08.003) | 2026-10-23 | +| gnubg-nn | `595a9e8f1fe094ee22db5a736bc05027643756df` | 2025-09-07 | +| CBG (`clavierhaus/gnubg-android`) | `62028573d7564275a7c9363f0ef5d4b63d8d0f26` (moteur gnubg `b1b2772c`) | 2026-10-26 | + +### Synthèse comparative + +| Point | gnubg | gnubg-nn | CBG | +| --- | --- | --- | --- | +| Activité | Active (corrections régulières) | Quasi arrêtée (outil d'entraînement des réseaux) | Très active ; un mainteneur, code très majoritairement écrit par IA | +| Licence | GPLv3 ou ultérieure | **48 fichiers en GPLv2 seule** : incompatible | GPLv3 ou ultérieure ; noms « CBG »/« Clavierhaus » revendiqués comme marques | +| Fonctions | Les cinq, avec videau, tables d'équité, Crawford, Jacoby, Position ID et Match ID | Partiel : pas de Match ID, videau réimplémenté en C++ (ne concordera pas) | Les cinq, mais interface pensée pour une partie en cours, pas pour une position isolée | +| Dépendances | GLib dans tout le cœur, remplaçable par un petit shim (~30 fonctions), sauf GMarkup (tables d'équité) et `g_mapped_file` ; SSE/AVX/**NEON** et repli C générique ; threads désactivables | C++14, Python 2, SSE seul | Compile GLib, GObject et libintl en entier pour Android | +| Isolement | Faisable : ~24 400 lignes ; état global partout (une instance, appels sérialisés) ; `backgammon.h` à réduire | Évaluation isolée, le reste à réécrire | 41 fichiers + 681 lignes de bouchons : pas une bibliothèque minimale | +| Données | `gnubg.weights` (1 097 796 octets) ; `gnubg.wd`, `gnubg_os0.bd`, `gnubg_ts0.bd` **générés au build** ; tables d'équité XML (`Kazaross-XG2.xml` par défaut) | Pas de poids fournis | Mêmes poids (identiques octet pour octet) ; **aucun `.bd` fourni** | +| Portabilité | NEON déjà présent ; pas de SIMD WebAssembly (C générique) ; un portage Emscripten tiers existe (`hwatheod/gnubg-web`, 2019, non lu) | Mauvais point de départ | Build CMake/NDK fonctionnel, sans WebAssembly | +| Concordance | Mêmes sources et poids que le bureau ; écart flottant inévitable car `configure.ac` force `-ffast-math` (approximation de la sigmoïde) | Non, pour le videau | Écarts ~1e-4 (réseau) à ~3e-3 (équité 2-ply) selon leur documentation, non vérifié | + +### Vérifié par la session principale + +Recoupé directement dans les clones : 48 fichiers de gnubg-nn sous GPLv2 sans +« or later » ; licence GPLv3+ de `gnubg/eval.c` ; `-ffast-math` ajouté par +`configure.ac:595` ; code NEON dans `lib/simd.h` et `lib/neuralnetsse.c` ; +`gnubg.weights` de 1 097 796 octets identique dans gnubg et CBG ; trois usages +de `g_markup` dans `matchequity.c` ; `makebearoff` produit au build ; commits et +dates ci-dessus. Les autres affirmations viennent du rapport de l'agent (lecture +du code, sans compilation ni édition des liens). + +### Fichiers à reprendre (gnubg `14b6798`) + +- Évaluation : `eval.c/h`, `movefilters.inc`, `lib/neuralnet.c/h`, + `lib/neuralnetsse.c`, `lib/inputs.c`, `lib/simd.h`, `lib/sigmoid.h`, + `lib/cache.c/h`, `lib/gnubg-types.h`, `lib/isaac.c/h`, `lib/isaacs.h`, + `lib/md5.c/h`. +- Fin de partie : `bearoff.c/h`, `bearoffgammon.c/h`. +- Identifiants : `positionid.c/h`, `matchid.c/h`. +- Équité de match : `matchequity.c/h`, `mec.c/h`, `lib/list.c/h`. +- En-têtes à réduire : `backgammon.h`, `common.h`, `multithread.h`, `util.h`. +- Données : `gnubg.weights`, `met/*.xml` ; outils hôte `makeweights.c`, + `makebearoff.c`. + +Liste issue des `#include` et d'un grep des symboles : elle sera confirmée à la +première édition des liens. + +### Plan d'isolement esquissé + +1. Copie figée du commit dans `engine/`, `config.h` écrit à la main (sans + threads ; NEON sur arm64 ; rien en WebAssembly). +2. Shim `glib.h` minimal ; `mmap`/`fread` à la place de `g_mapped_file`. +3. Tables d'équité converties en tableaux C au build (ou table Zadeh intégrée + pour commencer). +4. En-tête réduit à la place de `backgammon.h`, variables globales aux valeurs + par défaut de `gnubg.c` ; s'inspirer de `cbg/jni-bridge/src/stubs.c`. +5. Façade `moteur.h` sur `GenerateMoves`, `FindnSaveBestMoves`, + `GeneralCubeDecisionE`/`FindCubeDecision`, `PositionFromID`, `MatchFromID`. +6. `gnubg.wd` et bases `.bd` générées sur l'hôte avec les outils officiels. +7. Tests de concordance avec tolérance ; mesurer l'écart avec et sans + `-ffast-math`. + +### Risques + +1. Concordance au bit près impossible entre x86 avec `-ffast-math` et ARM ou + WebAssembly : les tests devront fixer une tolérance, et prévoir le cas où le + meilleur coup change entre deux coups presque équivalents. +2. Tables d'équité dépendantes de GMarkup. +3. État global : une seule instance du moteur. +4. Mises à jour de gnubg à reporter à la main sur la copie figée. +5. Tailles des `.bd` non mesurées (générées au build). + +### Suites à donner + +- Validation du choix par Pierre, puis entrée dans `docs/decisions.md`. +- Conséquence pour 0a.2 : le gnubg de bureau de référence doit être **compilé + dans Docker depuis le même commit** (et non pris dans un paquet Debian d'une + autre version), pour que les références soient comparables.