diff --git a/MyIA.AI.Notebooks/Sudoku/Sudoku-07-Norvig-Python.ipynb b/MyIA.AI.Notebooks/Sudoku/Sudoku-07-Norvig-Python.ipynb index ba48ff50c8..1667fed862 100644 --- a/MyIA.AI.Notebooks/Sudoku/Sudoku-07-Norvig-Python.ipynb +++ b/MyIA.AI.Notebooks/Sudoku/Sudoku-07-Norvig-Python.ipynb @@ -715,12 +715,18 @@ "## Exercice : Analyser l'impact de la propagation des contraintes\n", "\n", "**Objectif**\n", - "Desactivez la propagation (eliminate) dans le solveur de Norvig et comparez\n", - "le nombre d'appels recursifs et le temps de resolution.\n", + "Implementez le solveur Norvig **sans propagation** : la fonction separee\n", + "`solve_without_propagation` du squelette ci-dessous doit resoudre une grille\n", + "avec `assign` + backtracking MRV uniquement, **sans jamais appeler\n", + "`eliminate`**. Comparez le nombre d'appels recursifs et le temps de\n", + "resolution avec le solveur complet `solve` sur les memes grilles.\n", "\n", "**Indice**\n", - "Modifiez la fonction `solve` pour court-circuiter `eliminate` et mesurer\n", - "la différence de performance sur les puzzles difficiles.\n" + "Travaillez uniquement dans la fonction du squelette — ne modifiez pas `solve`\n", + "lui-meme : le benchmark juste apres cet exercice l'appelle tel quel. Pour\n", + "compter les appels, un simple compteur global incremente dans la boucle de\n", + "backtracking suffit ; testez d'abord sur les grilles difficiles\n", + "(`Sudoku_hardest.txt`), la ou la propagation fait la plus grosse difference.\n" ] }, { @@ -881,19 +887,30 @@ "source": [ "### Interpretation : Benchmark du solveur Norvig\n", "\n", - "Les résultats du benchmark montrent l'efficacite de l'approche de Norvig.\n", - "\n", - "| Type de puzzle | Temps moyen | Taux de succes | Analyse |\n", - "|----------------|-------------|----------------|---------|\n", - "| **Faciles** | (ms live -- regle #9434) | 100% (20/20) | Resolution quasi-instantanee |\n", - "| **Difficiles** | (ms live -- regle #9434) | 100% (11/11) | Peu de différence faciles/difficiles |\n", + "La Lecture ci-dessus a lu le facteur facile/difficile ; ce qu'il faut aussi\n", + "retenir, c'est l'echelle absolue : **le corpus entier — 31 grilles — se\n", + "resout en moins de 120 ms cumules** (66,05 ms pour les 20 faciles, 48,91 ms\n", + "pour les 11 difficiles). A cette echelle, la question n'est plus « le solveur\n", + "est-il assez rapide » mais « que peut-on se permettre de plus » : rejouer\n", + "des centaines de grilles pour etalonner un parametre, par exemple, reste\n", + "quasi instantane.\n", "\n", "**Points cles** :\n", - "1. **Performance constante** : La difficulte du puzzle n'impacte que marginalement le temps\n", - "2. **Propagation efficace** : L'elimination des candidats reduit massivement l'espace de recherche\n", - "3. **Code compact** : Environ 80 lignes de Python pour un solveur complet\n", "\n", - "> **Note technique** : La cle de la performance est la combinaison de la propagation (assign/eliminate) avec le backtracking intelligent (MRV). La propagation resout souvent la majeure partie du puzzle avant que le backtracking ne soit necessaire.\n" + "1. **Echelle absolue** : 31 grilles en ~115 ms cumules — le solveur exact\n", + " n'est jamais le goulot d'etranglement d'une chaine de traitement.\n", + "2. **Ou se joue la performance** : dans `assign`/`eliminate` — la propagation\n", + " vide les domaines avant que le backtracking ne soit sollicite, si bien que\n", + " la recherche ne voit presque jamais un embranchement profond.\n", + "3. **Economie de moyens** : environ 80 lignes de Python pour ce resultat —\n", + " a comparer aux solveurs specialises des notebooks 02 (DLX) et 10\n", + " (OR-Tools), plus rapides sur les cas extremes mais au prix d'une\n", + " machinerie nettement plus lourde.\n", + "\n", + "> **Note technique** : la cle est la combinaison propagation + MRV. La\n", + "> propagation resout la majeure partie de la grille des l'assignation des\n", + "> 45 indices ; le MRV fait le reste en choisissant toujours la case la plus\n", + "> contrainte, ce qui maintient l'arbre de recherche proche d'un chemin.\n" ] }, { @@ -1312,8 +1329,8 @@ "\n", "| Type | Temps moyen | Taux de succès |\n", "|------|-------------|----------------|\n", - "| Faciles (20 puzzles) | ~2.1 ms | 100% (20/20) |\n", - "| Difficiles (11 puzzles) | ~2.8 ms | 100% (11/11) |\n", + "| Faciles (20 puzzles) | 3,30 ms | 100% (20/20) |\n", + "| Difficiles (11 puzzles) | 4,45 ms | 100% (11/11) |\n", "\n", "### Références\n", "\n", diff --git a/scripts/notebook_tools/twin_pairs.d/sudoku-07-norvig.yaml b/scripts/notebook_tools/twin_pairs.d/sudoku-07-norvig.yaml index 6764dc669a..fc771454b1 100644 --- a/scripts/notebook_tools/twin_pairs.d/sudoku-07-norvig.yaml +++ b/scripts/notebook_tools/twin_pairs.d/sudoku-07-norvig.yaml @@ -6,6 +6,7 @@ bridge_verdict: SOTA-OK bridge_verdict_reason: "Bucket 3 de l'EPIC #10382 (from-scratch = la contrepartie, a ecrire comme telle). Verifie firsthand : Python = stdlib pur (pathlib/time/typing, 0 lib tierce, 0 numpy) ; C# = pur System.* (0 NuGet, 0 Assembly ref, BCL pure). Les DEUX cotes portent le MEME algorithme Norvig from-scratch (assign + eliminate + search backtracking avec propagation de contraintes, port direct de https://norvig.com/sudoku.html). Il n'existe PAS de lib SOTA-tier pour le solveur Norvig : la reference EST le code Norvig 2006 lui-meme (les forks PyPI comme sudoku-solver ne sont pas maintained et n'apportent rien de plus que le from-scratch ; aucun package .NET n'implemente Norvig specifiquement). La parite cross-twin est dans l'ALGO specifie par Norvig (les deux jumeaux codent assign/eliminate/search manuellement), pas dans une lib externe -- c'est exactement le cas bucket 3 : pas d'equivalent .NET (ni Python), le from-scratch EST la contrepartie. L'ancien verdict RECOVERABLE-LOCAL contredisait sa propre raison (qui disait deja 'lib SOTA non requise pour cet algo specifie') -- RECOVERABLE-LOCAL signifie 'installable, pas installe', mais il n'y a rien a installer. Flip RECOVERABLE-LOCAL -> SOTA-OK (from-scratch from-scratch assume, bucket 3, parite semantique dans l'algo Norvig)." known_differences: + - "2026-09-23 (myia-po-2026:CoursIA) #17342 : REBASELINE cote Python apres reparation audit Hermes #17239 (3 findings : enonce vs stub solve_without_propagation, paraphrase-stack Interpretation, resume perime ancre sur les sorties commises) -- markdown-only (cellules 22/26/35), cellules code byte-identiques, outputs et execution_count preserves (exception C.2). csharp_sha inchange : le jumeau C# n'est pas touche." - "2026-09-02 (PR #14266, myia-po-2027:CoursIA) : normalisation nbformat du champ source string->liste (tranche Sudoku de #14209) -- forme seule, jumeau C# seul (Python non touche). Contenu rejoint byte-identique (digest sha1 par cellule, 0 divergence), outputs/execution_count/nb de cellules inchanges, pas de re-exec (C.3). Les blob SHAs et content SHAs deplaces dans l audit ci-dessus sont des artefacts de forme (le content_sha hashe la structure JSON des cellules, forme du champ source incluse), pas une divergence pedagogique." - "Rebaseline 2026-08-14 : cote C# deplace par drain wallclock #9434 / PR #10874 (remplacement des timings machine-dependants en ms par des ordres de grandeur dans le markdown). Parite semantique inchangee (cellules code byte-identiques, aucune sortie, aucun exec_count touche) ; cote Python non modifie. Attestation = nouveau blob SHA du cote C#." - "Socle pedagogique commun : solveur de Sudoku de Peter Norvig (combinaison de constraint propagation + search) -- fonctions assign (assigner une valeur en eliminant des candidats) et eliminate (propager les contraintes via les unites/peers), backtracking search quand la propagation seule ne suffit pas. Meme algorithme (Norvig's solver), meme cas canonique (Sudoku). Les deux couvrent backtracking, Norvig, eliminate, assign." diff --git a/scripts/notebook_tools/twin_pairs.d/sudoku-07-norvig/0010-2026-09-23-myia-po-2026-CoursIA.yaml b/scripts/notebook_tools/twin_pairs.d/sudoku-07-norvig/0010-2026-09-23-myia-po-2026-CoursIA.yaml new file mode 100644 index 0000000000..53fc78e373 --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/sudoku-07-norvig/0010-2026-09-23-myia-po-2026-CoursIA.yaml @@ -0,0 +1,6 @@ +date: '2026-09-23' +by: myia-po-2026:CoursIA +python_sha: 1667fed862f77f5143dfdfe0b1046494349dbe1e +csharp_sha: 8c69f3276542fcb67bd67eee6cccdc95f2fb5e93 +content_python_sha: 9b1aa9fd36ea1fe181af4d73bd8d3c618fa66d0182adcaad09fb3d580b076703 +content_csharp_sha: 736f18d007c825f9c29c1ae8a113f3708f9d67e8abb1b0e33155617d73d5614f