From 8d32a2c68b608ca2d0952d5b45bfad55f90a345f Mon Sep 17 00:00:00 2001 From: jsboige Date: Sat, 19 Sep 2026 03:22:55 +0200 Subject: [PATCH 1/2] Merge split AC-3 lecture cells in App-16-Crossword-CSP Fuse the overlapping 'Lecture de la table AC-3' + 'Lecture du resultat' pair into one anchored reading; fix stale '23 slots sur 24' claim (committed output: 24/24, 16 at 1 + 8 at 2 = 2^8 = 256). See #16762 Co-Authored-By: Claude Sonnet 5 --- .../CSP/App-16-Crossword-CSP.ipynb | 91 +++---------------- 1 file changed, 11 insertions(+), 80 deletions(-) diff --git a/MyIA.AI.Notebooks/Search/Applications/CSP/App-16-Crossword-CSP.ipynb b/MyIA.AI.Notebooks/Search/Applications/CSP/App-16-Crossword-CSP.ipynb index 31610a1a8c..dd78b5a741 100644 --- a/MyIA.AI.Notebooks/Search/Applications/CSP/App-16-Crossword-CSP.ipynb +++ b/MyIA.AI.Notebooks/Search/Applications/CSP/App-16-Crossword-CSP.ipynb @@ -1559,93 +1559,24 @@ "tags": [] }, "source": [ - "### Lecture de la table AC-3\n", + "### Lecture du résultat — la cohérence d'arc fait s'effondrer l'espace avant toute recherche\n", "\n", - "La cellule AC-3 affiche un tableau tres instructif sur les 24 slots. Voici comment le lire :\n", + "La cellule AC-3 affiche, pour les 24 slots (36 intersections, toutes de longueur 3 — le dictionnaire français simplifié de cette expérience n'a que des mots de 3 lettres), un tableau à lire ainsi :\n", "\n", "| Colonne | Signification |\n", "|---------|---------------|\n", - "| `slot` | Identifiant du slot (0 a 23) |\n", + "| `slot` | Identifiant du slot (0 à 23) |\n", "| `longueur` | Nombre de lettres du slot |\n", - "| `avant` | Taille du domaine avant AC-3 (presque toujours 20) |\n", - "| `apres` | Taille du domaine apres AC-3 (1 ou 2 dans la majorite des cas) |\n", - "| `coupe` | Nombre de mots elimines (`avant - apres`) |\n", + "| `avant` | Taille du domaine avant AC-3 (20 pour chacun des 24 slots) |\n", + "| `après` | Taille du domaine après AC-3 (1 ou 2) |\n", + "| `coupé` | Nombre de mots éliminés (`avant - après`) |\n", "\n", - "### Observations\n", + "**L'effondrement mesuré.** Les 24 domaines passent de 20 mots à 1 ou 2 candidats — 16 slots à 1 seul, 8 slots à 2 — et l'espace combinatoire s'écroule de 1.68×10³¹ à 2.56×10² combinaisons (soit exactement 2⁸ × 1¹⁶ = 256), un facteur de réduction de 6.55×10²⁸ (~10²⁹), **avant** d'avoir posé la moindre assignation. C'est précisément la marge que le backtracking pur (section 4) ne pouvait pas exploiter et qui le faisait s'essouffler : lui abordait chaque slot avec 20 candidats, quand AC-3 n'en laisse qu'un ou deux. Pour donner un ordre de grandeur : réduire l'espace de recherche de 10²⁹, c'est passer d'une recherche dans tout l'univers observable (10⁸⁰ atomes) à une recherche dans une salle de classe (10³ atomes) — et AC-3 fait cela **gratuitement**, avant même que la recherche commence.\n", "\n", - "- **Tous les slots de longueur 3** : le dictionnaire francais simplifie n'a que des mots de 3 lettres dans cette experience\n", - "- **Domaines tres reduits** : 23 slots sur 24 passent de 20 a 1 ou 2 mots\n", - "- **AC-3 quasi-parfait** : sur cette grille bien concue, AC-3 laisse tres peu d'ambiguite\n", + "**Pourquoi un rendement si élevé ici.** Les contraintes d'intersection sont extrêmement discriminantes : un mot de 3 lettres posé dans un slot élimine presque tous les mots des slots qui le croisent sans partager ses lettres aux positions d'intersection. C'est le signe d'un réseau bien connecté, avec un dictionnaire adapté à la taille des slots. La réciproque est instructive : si la grille était mal conçue (slots isolés, peu d'intersections), AC-3 éliminerait beaucoup moins de mots et la recherche qui suivrait serait plus difficile. Les grilles de mots croisés classiques ont une **symétrie de rotation 180°** qui garantit un équilibre entre mots longs et courts ; notre grille générée aléatoirement n'a pas cette symétrie, ce qui peut produire des zones sur-contraintes et des zones sous-contraintes — elle s'en tire bien ici, mais c'est une chance de la géométrie, pas une garantie.\n", "\n", - "### Resume statistique\n", - "\n", - "- **Espace combinatoire avant AC-3** : 1.68×10³¹ combinaisons\n", - "- **Espace combinatoire apres AC-3** : 2.56×10² combinaisons\n", - "- **Facteur de reduction** : 6.55×10²⁸ (soit ~10²⁹)\n", - "\n", - "### Pourquoi AC-3 est si efficace ici\n", - "\n", - "Les contraintes d'intersection sont **extremement discriminantes** : un mot de 3 lettres dans un slot elimine presque tous les autres mots qui pourraient se croiser. C'est le signe d'un reseau bien connecte avec un dictionnaire adapte a la taille des slots.\n", - "\n", - "### Le role de la symetrie\n", - "\n", - "Les grilles de mots croises classiques ont une **symetrie de rotation 180°** qui garantit un equilibre entre mots longs et courts. Notre grille generee aleatoirement n'a pas cette symetrie, ce qui peut produire des zones sur-contraintes et des zones sous-contraintes.\n" - ] - }, - { - "cell_type": "markdown", - "id": "0cc3a8d4", - "metadata": { - "papermill": { - "duration": 0.00417, - "end_time": "2026-09-06T02:58:34.474260+00:00", - "exception": false, - "start_time": "2026-09-06T02:58:34.470090+00:00", - "status": "completed" - }, - "tags": [] - }, - "source": [ - "**Lecture du résultat.** AC-3 réduit chaque domaine de 20 mots à 1 ou 2\n", - "candidats : la cohérence d'arc **à elle seule** fait s'effondrer l'espace des\n", - "combinaisons de ~1,7×10³¹ à 256 — une réduction d'un facteur ~10²⁹, **avant**\n", - "d'avoir posé la moindre assignation. C'est précisément la marge que le\n", - "backtracking pur (section 4) ne pouvait pas exploiter et qui le faisait\n", - "s'essouffler : lui abordait chaque slot avec 20 candidats, quand AC-3 n'en\n", - "laisse qu'un ou deux.\n", - "\n", - "**Le pont avec le forward checking.** FC est une propagation *locale et\n", - "paresseuse* : elle ne touche qu'au voisinage d'une assignation, au moment où\n", - "l'on assigne. AC-3 est une propagation *globale et préventive* : il établit\n", - "d'emblée la cohérence de tout le réseau. Un solveur qui combine les deux —\n", - "AC-3 en prétraitement, puis FC pendant la recherche — cumule les deux\n", - "régimes : un espace de départ déjà épuré, et une coupe locale à chaque nœud.\n", - "C'est d'ailleurs ce que fait OR-Tools en interne (section 3) : le solveur\n", - "CP-SAT applique ses propres techniques de propagation bien plus puissantes\n", - "qu'AC-3, ce qui explique qu'il résolve le problème quasi instantanément là où\n", - "notre backtracking pur peinait.\n", - "\n", - "**Observation pedagogique du tableau.** Pour la majorite des slots, AC-3 elimine **19 mots sur 20** (passe de 20 a 1). C'est le signe d'un reseau bien connecte : les contraintes d'intersection sont suffisamment discriminantes pour laisser peu d'ambiguite. Si la grille etait mal concue (slots isoles, peu d'intersections), AC-3 eliminerait beaucoup moins de mots et la recherche qui suivrait serait plus difficile.\n", - "\n", - "**Limite honnête.** AC-3 ne réduit les domaines que sur les contraintes\n", - "*binaires* (deux slots qui se croisent). Il ne détecte pas les contraintes\n", - "implicites plus subtiles (par exemple, trois slots forcés à des mots\n", - "distincts) : c'est le rôle des propagateurs de plus haut niveau (consistance\n", - "de bornes, de chemin…) qu'utilisent les solveurs industriels.\n", - "\n", - "### Le facteur 10²⁹ en contexte\n", - "\n", - "Une reduction de l'espace de recherche de 10²⁹ est l'equivalent de passer d'une recherche dans tout l'univers observable (10⁸⁰ atomes) a une recherche dans une salle de classe (10³ atomes). AC-3 fait cela **gratuitement**, avant meme que la recherche commence.\n", - "\n", - "### Vers k-consistance\n", - "\n", - "Pour aller plus loin, les solveurs industriels utilisent des consistances plus fortes :\n", - "- **Arc-consistance (AC-3)** : binaire, O(E × d³)\n", - "- **Path-consistance (PC-2)** : ternaire, plus puissant mais O(d⁵)\n", - "- **Bound-consistency** : sur les domaines numeriques continus\n", - "- **Generalized Arc Consistency (GAC)** : pour les contraintes n-aires\n", - "\n", - "CP-SAT combine ces techniques avec des techniques SAT (CDCL, no-good learning) pour former un solveur hybride extremement performant.\n" + "**Le pont avec le forward checking.** FC est une propagation *locale et paresseuse* : elle ne touche qu'au voisinage d'une assignation, au moment où l'on assigne. AC-3 est une propagation *globale et préventive* : il établit d'emblée la cohérence de tout le réseau. Un solveur qui combine les deux — AC-3 en prétraitement, puis FC pendant la recherche — cumule les deux régimes : un espace de départ déjà épuré, et une coupe locale à chaque nœud. C'est d'ailleurs ce que fait OR-Tools en interne (section 3) : le solveur CP-SAT applique ses propres techniques de propagation bien plus puissantes qu'AC-3, ce qui explique qu'il résolve le problème quasi instantanément là où notre backtracking pur peinait.\n", + "\n" ] }, { @@ -2352,4 +2283,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +} From 642ca702c0201bc0361fdf9f07bfafd2e98e8d58 Mon Sep 17 00:00:00 2001 From: jsboige Date: Sun, 20 Sep 2026 01:15:29 +0200 Subject: [PATCH 2/2] chore(csp,#16796): twin parity attestation 0010 for App-16 post-fusion head Rebaseline du registre App-16 Crossword CSP par la lane porteuse (myia-po-2023:CoursIA) sur le blob du head dd78b5a741 apres la fusion des lectures AC-3 (tranche 6/6 #16762). Co-Authored-By: Claude Sonnet 5 --- .../0010-2026-09-20-myia-po-2023-CoursIA.yaml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 scripts/notebook_tools/twin_pairs.d/app-16-crossword-csp/0010-2026-09-20-myia-po-2023-CoursIA.yaml diff --git a/scripts/notebook_tools/twin_pairs.d/app-16-crossword-csp/0010-2026-09-20-myia-po-2023-CoursIA.yaml b/scripts/notebook_tools/twin_pairs.d/app-16-crossword-csp/0010-2026-09-20-myia-po-2023-CoursIA.yaml new file mode 100644 index 0000000000..079630e9c4 --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/app-16-crossword-csp/0010-2026-09-20-myia-po-2023-CoursIA.yaml @@ -0,0 +1,6 @@ +date: '2026-09-20' +by: myia-po-2023:CoursIA +python_sha: dd78b5a7411aaf9cbd67793058cb8bcb5d9ead1b +csharp_sha: 90779e7a0699d30f7107364803d2a7bd2dc96327 +content_python_sha: 973bb4fb7cfc28ca13625fc561d49484883a945c7ffe8fa8289c715557485f2c +content_csharp_sha: b23c83c5af98d568cfaf4290f8c2ed439454a6ca4bcb1b92398593284c96ce89