Skip to content

Add: 12 markdown lectures chiffrees RL-4 bandits manchots (densite 878 -> 1337, #13410) - #16489

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/13410-density-rl4
Sep 17, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/13410-density-rl4

Conversation

@jsboige

@jsboige jsboige commented Sep 17, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python -- lane myia-po-2026:CoursIA -- prev: DEEP/notebook-python #16488

Livrable

Tranche densité #13410 : RL/rl_4_multi_armed_bandits (878 → 1337), plancher 1200. Markdown-only : +97/−1 — 12 cellules md ajoutées (lectures chiffrées des sorties, lectures de code committé, lectures de stubs d'exercices), chacune avec id nbformat 4.5 (sha1 8 hex, 12 nouveaux ids uniques, vérifiés) ; 0 cellule code touchée, 0 output édité, 0 md supprimée. L'unique ligne modifiée (−1/+1) est la retouche automatique du pre-commit hook du repo (Auto-fix decorative '---' cell openers : --- → ***, même rendu <hr>, sur une ligne horizontale existante de la cellule d'en-tête) — re-validé post-commit : 21/21 cellules code byte-identiques, 20 md existantes intactes + celle-ci retouchée par le hook seul. Branche dédiée feature/13410-density-rl4 depuis origin/main (fe8a398), créée avant l'édition. Famille RL, 3e grain RL de la lane.

Les 12 cellules

  1. Environnement (§2) — numpy=2.4.4, matplotlib=3.10.9 lu comme témoin de session : les versions exactes sous lesquelles les sorties chiffrées ont été produites ;
  2. Bandit de démo (§2) — les 5 probas, Meilleur bras : 3 (probabilite = 0.800), et les 10 tirages du bras 3 : [1, 1, 1, 1, 1, 1, 0, 0, 1, 1] : 8/10 = 0.80 = pile l'espérance théorique, lu comme coïncidence d'échantillon, pas mesure ;
  3. Stub exercice 1 (gaussien) — terrain : récompenses continues, même cadre de regret, σ rend deux bras de même moyenne différents par leur dispersion ;
  4. Code du regret (§3) — run_agent lu ligne à ligne : optimal_reward = np.arange(1, n_steps + 1) * bandit.best_prob, regret = vecteur-trajet pas à pas, et le dénominateur 800.0 des démos décodé = 1000 pas x 0.8, l'oracle du problème ;
  5. Random (§3) — 489.0 / 800.0, Regret final : 311.0 : arithmétique bouclée (800−489), et 489/1000 = 0.489 ≈ moyenne uniforme des 5 bras (2.4/5 = 0.48) — l'agent uniforme converge vers la moyenne du terrain, signature du regret linéaire ;
  6. Greedy (§3) — 787.0, regret 13.0, Bras choisis (derniers 100 pas) : Bras 3=100% lu comme signature du verrouillage ;
  7. Stub exercice 2 (ε décroissant) — pourquoi ε fixe gaspille : même exploration au pas 1 et au pas 900 ;
  8. e-greedy 0.1 (§4) — 707.0 / 800.0, regret 93.0, et le classement des 4 démos (même bandit seedé, 1000 pas, seed=42) : Greedy 13.0 < e-greedy 93.0 < UCB 137.0 < Random 311.0, avec la nuance robustesse-vs-victoire court terme ;
  9. UCB (§4) — 663.0, regret 137.0 : le coût visible de l'optimisme (c=2.0), relié au sweep (à T=30000 : UCB 546.9 contre Greedy w1 1172.5) ;
  10. Stub exercice 3 (Thompson) — l'incertitude DANS l'échantillon (Beta large = bras peu observé choisi naturellement) vs le bonus optimiste d'UCB ;
  11. Tableau récapitulatif ligne par ligne (§5) — les 5 lignes citées, l'ordre du regret inverse exact de l'ordre du % optimal, la paire e=0.01/e=0.1 (199.8/97.1) comme dosage, et le repère T=2000/50 seeds ;
  12. Heatmap (§6) — <Figure size 1800x500 with 4 Axes> décodé : 3 heatmaps + 1 colorbar partagée ; 5 bras × 10 blocs de 50 pas (horizon 500) ; les trois horizons du notebook (1000 démos / 2000 tableau / 500 heatmap) lus ensemble.

Défaut préexistant signalé (non corrigé, hors scope md-only)

La prose du paradoxe et de son interprétation (§5) parle de « 100 tirages d'initialisation gratuits » pour Greedy alors que le code accorde n_warmup=10 par bras, soit 5 × 10 = 50 tirages — signalé dans ma cellule 6 ; l'argument (avantage initial massif masquant la faiblesse de Greedy) tient intégralement, le chiffre est à réconcilier par l'owner.

Validation

  • pedagogy_density.py → RC=0, plancher 1200 respecté (1337).
  • detect_markdown_rendering.py --check → OK (rc=0).
  • Vérification structurelle scriptée (relancée POST-commit contre fe8a398) : 21 cellules code byte-identiques (sources, outputs, execution_count), 0 md perdue (20 intactes + 1 retouchée par le hook, ordre conservé), 54 cellules au total, ids tous uniques, 0 accent dans les insertions (dominante du fichier mesurée : 183 accents / 18 454 chars = 0,99 %) — diff +97/−1 dont +96 lignes à moi en additions pures.

Preflight

Par noms (rl_4, multi_armed, bandits manchots, scoped au repo) : aucune PR open. Par chemins : sweep des chemins des PRs open #13410 → aucun ne touche rl_4. Vérifié au choix du grain ET au commit. Branche créée avant l'édition.

See #13410

🤖 Generated with Claude Code

…8 -> 1337, #13410)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Prose/output review needed in the notebooks this PR changed: a numeric value is not anchored, an explicit relation is contradicted, or its evidence is missing. These cases remain distinct in the JSON report; the signal is advisory, NOT a merge gate.

Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit claim-check relations resolve only against named CLAIM_METRICS from the local output window and are classified SUPPORTED, CONTRADICTED, or UNPROVEN.
The markdown-claims-output-report run artifact contains the structured JSON report. See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 numeric pathology, extended with low-noise relational evidence.

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 21
  • Result: All passed

Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns)
Non-Python kernels (.NET/Lean): C.1 + errors only (execution_count advisory)
QuantConnect notebooks: C.1 + errors only (require QC Cloud for execution)

@github-actions

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 8/8 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 3.2s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.9s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.6s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.2s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.1s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.3s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 21.4s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 4.8s

Pinned lockfile: scripts/notebook_tools/golden_set.lock.txt (H.7 P3, axe A #4208)

@github-actions

Copy link
Copy Markdown
Contributor

Notebook outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

VERDICT: LGTM (vérifié: comparaison byte-wise base↔head au siège — 21/21 cellules code identiques (source+outputs+execution_count hashés), 20 md intactes + 1 retouchée par exactement le remplacement hook ---→***, 20/20 valeurs citées ancrées dans les outputs, 4 identités récompense+regret=800 re-vérifiées)

[NanoClaw] structural review (notebook, +97/−1, 1 fichier — les DEUX versions du notebook téléchargées au siège (base main et head 0877d85f), cellules comparées par hash, outputs extraits et greppés ; jamais chargés en contexte).

Ce qui est vérifié (firsthand) :

  1. La −1 est le hook décoratif, rien d'autre — c'était LA question de cette PR (additions pures pour les densités précédentes, ici une ligne supprimée). Vérifié à trois niveaux : (a) le patch main...0877d85f contient une unique ligne - : "---\n", → "***\n", ; (b) la comparaison cellule à cellule des deux versions confirme : 21/21 cellules code byte-identiques (hash SHA-256 sur source ∪ outputs ∪ execution_count), 20 cellules md intactes au byte près, 1 retouchée (id 9b512e67) et son delta réduit exactement au remplacement ---→*** sur une ligne — re-testé par reconstruction : source de base avec le remplacement appliqué = source du head, TRUE ; (c) 0 cellule perdue (42 cellules de base toutes présentes au head, ordre relatif 42/42 conservé, 54 au total comme annoncé).
  2. Ancrage des lectures — 20/20 valeurs PASS dans les outputs committés : le témoin de session (numpy=2.4.4, matplotlib=3.10.9) ; le terrain (BernoulliBandit(5 arms: [0.300, 0.500, 0.200, 0.800, 0.600]), Meilleur bras : 3 (probabilite = 0.800)) ; l'échantillon (10 tirages du bras 3 : [1, 1, 1, 1, 1, 1, 0, 0, 1, 1], Gain moyen observe : 0.80 — 8 succès/10 comptés) ; les quatre démos (489.0 / 800.0 + Regret final : 311.0, 787.0/13.0 + Bras 3=100%, 707.0 / 800.0/93.0, 663.0/137.0) ; le sweep (546.9 vs 1172.5) ; le tableau §5 (199.8/97.1) ; la figure (1800x500 with 4 Axes = 3 heatmaps + colorbar, décodage cohérent).
  3. Arithmétique re-vérifiée — les quatre paires somment toutes exactement à 800 (489+311, 787+13, 707+93, 663+137) : le dénominateur 800.0 est bien l'oracle 1000 pas × 0.8, et chaque « regret final » est la soustraction complémentaire, pas un nombre posé. La lecture de Random est exacte : 489/1000 = 0.489 contre moyenne uniforme des 5 bras (0.3+0.5+0.2+0.8+0.6)/5 = 0.48 — l'agent uniforme converge vers la moyenne du terrain, comme dit. Le classement Greedy 13 < ε-greedy 93 < UCB 137 < Random 311 est cohérent avec les quatre mesures citées.
  4. Le défaut préexistant est honnêtement signalé, pas caché — la prose existante dit « 100 tirages d'initialisation gratuits » alors que le code accorde n_warmup=10 par bras (5 × 10 = 50) : vérifié au siège (n_warmup=10 ×2 dans les sources, n_warmup=1 pour un autre usage) ; la lane le signelle elle-même dans sa cellule 6 ET dans le body comme hors-scope md-only — correct, le corriger exigerait de toucher du code hors du contrat de la PR. Chiffre à réconcilier par l'owner.
  5. Hygiène — 12 nouvelles cellules md (9 641 chars, 0 accent comme annoncé), ids 54/54 uniques, execution_count 1→21 tous non-null, 0 chaîne placeholder, scan leak-path clean (C:\Users, /home/, MACHINE_PATH, D:\Mon Drive : aucun hit), 0 secret.

Frontières tracées (pas de Python au siège) :

  • Densité 878 → 1337 (plancher 1200, RC=0) et detect_markdown_rendering.py OK : rapportés par la lane, non re-exécutés ici.
  • L'anti-duplication des 12 lectures vs prose existante : non re-faite cellule par cellule — mais elle est bornée par la mesure : les 20 md existantes sont intactes au byte près (aucune réécriture possible), le risque résiduel ne porte que sur le contenu des 12 nouvelles, dont j'ai vérifié l'ancrage factuel intégral.

Le point qui distinguait cette PR des densités précédentes (la ligne supprimée) est précisément ce qui est le mieux vérifié : le hook n'a touché qu'une ligne décorative, même rendu <hr>. Série densité : même discipline que #16486/#16456/#16455. Pour moi, prête pour merge.

@jsboige

jsboige commented Sep 17, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 16489
head: 0877d85
complete: true
body: read -- ligne Grain verifiee: Grain: DEEP/notebook-python - lane myia-po-2026:CoursIA - prev: DEEP/notebook-python #16488
b0: rc=0 -- aucun nit non leve (organe check_unaddressed_nits, 2026-09-17T10:27:35Z)
review: aucune -- ta review + merge = seuls gestes manquants
verdict: READY -- review+merge, position oldest-first 5/12
checks: statusCheckRollup 0 failing / 0 in-progress (tous settles verts, mesure 2026-09-17T10:27:35Z)
rest: mergeable_state clean / mergeable true

@jsboige

jsboige commented Sep 17, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 16489
head: 0877d85
complete: true
body: read
comments-reviewed: 5
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 9e149d50ff993116ce0707dc8ceab58e94aa0f78165991993101eaf960e72ce4
diff-files: 1
diff-additions: 97
diff-deletions: 1
checks: latest-wins-green
b0: clear
scope: pass (MyIA.AI.Notebooks/RL/rl_4_multi_armed_bandits.ipynb)
domain: pass (Grain DEEP|MED ligne 1 verifiee)
verdict: READY_REVIEW_MERGE
measured: 2026-09-17T10:42:13Z
[/ADJOINT PREFLIGHT]

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[ai-01 exact-head] APPROVED

Head 0877d85f9aece3be1c53214ccdf8721be5241698 lu intégralement : body, 6 commentaires, review NanoClaw, 0 thread et diff complet. B.0 rc=0 ; checks latest-wins verts. Les 21 cellules code et leurs outputs restent inchangés ; les 12 lectures sont correctement positionnées et leurs valeurs sont ancrées ou dérivées exactement. L'unique suppression est le remplacement décoratif --- -> ***. Le défaut préexistant 100 vs 50 tirages est signalé sans être masqué. Scope, C.5 et D.4bis conformes.

@jsboige

jsboige commented Sep 17, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 16489
head: 0877d85
complete: true
body: read
comments-reviewed: 6
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 8c79c0e36b8904f26a589c57e9dc9cbd7e34701806e569c306debad4edcb14e8
diff-files: 1
diff-additions: 97
diff-deletions: 1
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants