Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 33 additions & 16 deletions MyIA.AI.Notebooks/Sudoku/Sudoku-07-Norvig-Python.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -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"
]
},
{
Expand Down Expand Up @@ -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"
]
},
{
Expand Down Expand Up @@ -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",
Expand Down
1 change: 1 addition & 0 deletions scripts/notebook_tools/twin_pairs.d/sudoku-07-norvig.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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."
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Loading