Skip to content

Add: lectures md-only GameTheory-06f-Bounded-Agents-Python (densite 652 -> 1402, plancher 1200) #13410 - #16475

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

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

Conversation

@jsboige

@jsboige jsboige commented Sep 16, 2026

Copy link
Copy Markdown
Owner

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

Livrable

Tranche densité #13410 : GameTheory-06f-Bounded-Agents-Python (652 → 1402), plancher 1200. Markdown-only : +88 lignes (11 cellules md — 10 lectures chiffrées + 1 protocole de lecture), chacune avec id nbformat 4.5 (sha1 8 hex, uniques, vérifiés) ; 0 cellule code touchée, 0 output édité, 0 md supprimée. Branche dédiée feature/13410-density-gt06f depuis origin/main (fe8a398), créée avant l'édition.

Les 11 cellules

  1. Famille témoin (§ définitions) — les 3 lignes BoundedAgent(...) lues par leurs budgets : les deux bots à budget=0 (aucune mémoire à payer), MIRROR seul à budget=1 (relire le dernier coup coûte une unité) — et le pont vers l'exercice 1 (miroir b=0 = même code, autre comportement) ;
  2. Issues bornées (§ act) — les lignes outcome_bounded : coopéreur contre miroir = (cooperate, cooperate) (la boucle coop reste fermée), defecteur = paire symétrique de défection ; les bots à budget nul ont des issues indépendantes du budget ;
  3. Matrice 3×3 (§ matrice) — trois lignes trois caractères : COOPERATE C/×3, DEFECT D/×3, MIRROR recopie la colonne adverse (C/C, D/D, C/C) — la matrice de MIRROR se déduit de la première ligne des autres ;
  4. Rangs de paiement (§ PD canonique) — stage_payoff et payoffRank coïncident chiffre à chiffre car les 4 valeurs sont distinctes : le rang = l'ordre T > R > P > S aplati, vocabulaire portable que le certificat final (16 paires) exploitera ;
  5. Protocole de lecture d'un certificat (avant le rejeu) — la grammaire des lignes nom Python=True <- enonce Lean : verdict sur la famille témoin ≠ théorème général, la flèche pointe du calcul vers la cible formelle ;
  6. Certificats 1-2 — les deux égalités bornent la matrice par ses coins diagonaux purs (coopération et défection universelles) avant les cas dépendant de l'autre ;
  7. Certificats 3-5 — mirror_mirror (deux miroirs b=1 coopèrent, le budget suffit à entretenir la boucle), puis les DEUX inexploitabilités quantifiées (UnexploitableInFamily defectBotBounded et unexploitableCheck mirrorBot) — échelles de preuve différentes : une case vs le balayage de la famille ;
  8. Certificats 6-8 + bilan — la ligne la plus riche payoffRank_le_iff (16 paires) : toutes les paires croisées passées en revue, puis 8/8 certificats conformes ;
    9-11. Stubs exercices 1-3 — chacun lu avec son indice comme contrat : le miroir sans budget (déjà posé en mirror_broke), les équilibres de la famille étendue (l'indice oppose P=1 de la déviation au R=3 de la coopération), les paiements du miroir (l'indice le plus dense : inexploitable protège du pire S=0, pas de l'optimum T=5).

Chaque nombre cité lu verbatim dans les sorties committées. Anti-duplication vérifié : md[6] (69 chars) introduit la matrice sans la lire, md[14] couvre la NATURE des certificats (égalités vs quantifiés — ma lecture = les lignes elles-mêmes), md[16] couvre la dualité proposition/organe des certificats 6-7 (ma lecture = les certificats 3-5 et les 16 paires), md[18] couvre le bilan 8/8 (ma lecture = la ligne 16 paires) — non réécrits. Prose sans accents, dominante du fichier mesurée : 0 accents / 7 174 chars md = 0,00 %.

Validation

  • pedagogy_density.py → « All judged notebooks meet the density floor » (1402).
  • detect_markdown_rendering.py --check → OK (rc=0), aucune réparation nécessaire.
  • Vérification structurelle scriptée : 11 cellules code byte-identiques (sources, outputs, execution_count), 0 md supprimée, 37 cellules, ids tous uniques — md-only strict, diff +88/−0.

Preflight

Par nom (Bounded-Agents-Python, scoped au repo) : la seule PR matchée (#16395, OPEN) touche 06g-Bounded-Agents-Lean, 08d-Lean-CGT et 17c-Lean-Lemons — pas ce notebook (jumeau Lean, fichier distinct). Par fichiers : sweep des PRs open titrées #13410 → 0 touche ce notebook. Branche créée avant l'édition.

See #13410

🤖 Generated with Claude Code

…e 652 -> 1402, plancher 1200 #13410)

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

Copy link
Copy Markdown
Contributor

✅ No prose/output mismatch detected in the notebooks this PR changed.

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: 11
  • 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

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

@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 6.8s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 8.3s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 9.7s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 6.3s
Search-01-StateSpace.ipynb ✅ SUCCESS 5.3s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 3.5s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 35.8s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 4.1s

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

@jsboige

jsboige commented Sep 17, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 16475
head: 05aec58
complete: true
body: read
comments-reviewed: 4
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 527e5486fe3c66fdc0e24ef11fd66f1e1f48e55c998074b22ffd397af23ac4e9
diff-files: 1
diff-additions: 88
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

@jsboige jsboige left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

[Hermes] APPROVED

Head verified exactly: 05aec58b456627d11de9a4f86143c09e15483285 (matches the pinned head; not mutated). Full body, 5 comments, 0 reviews, 0 inline threads and the whole diff read.

Gate: md-only strict — PASS (measured, not read)
Re-derived base fe8a39831f ↔ head at parse level: 11/11 code cells byte-identical on (source, outputs, execution_count, id); 15/15 base markdown preserved in order; +11 markdown inserted, 0 removed; 37 cells, 11 code, 26 md; all ids unique, 0 null. Diff +88/-0 on one file.

Gate: density floor — PASS
sum(md chars) / code cells = 15423 / 11 = 1402.1 (floor 1200). Matches the body's 1402.

Gate: anchor — PASS (each cited value re-read in the committed output)
Hand-verified against the cells, not the prose:

  • md[13] ← code[12]: PD canonique : {'T': 5, 'R': 3, 'P': 1, 'S': 0} and the four lines ('cooperate','cooperate') -> stage_payoff=3, payoffRank=3 / 0, 0 / 5, 5 / 1, 1 — verbatim.
  • md[10] ← code[9]: matrix row MIRROR re-read as C/ C, D/ D, C/ C — the claim "recopie la colonne de son adversaire" holds cell by cell.
  • md[19] ← code[18]: cooperate_cooperate ... <- MutualCooperationBounded cooperateBot cooperateBot, defect_defect ... <- outcomeBounded defectBounded = (defect, defect) — verbatim.
  • md[22] ← code[21]: mirror_mirror, defectBotBounded_unexploitable <- UnexploitableInFamily ... (quantifie), mirror_basicFamily_unexploitable <- unexploitableCheck ... — verbatim.
  • md[25] ← code[24]: payoffRank_le_iff (16 paires) ... <- payoffRank_le_iff : rang fini iff ordre des paiements and 8/8 certificats conformes — verbatim.

Gate: interpretation ordering (§cell-interpretation-ordering) — PASS
Each of the 11 inserted cells sits immediately after the code cell whose output carries the values it cites (verified one by one, not by id).

Gate: markdown-claims-output (c.290/C.5 advisory) — CLEAN
python scripts/check_markdown_claims_output.py <head nb> → verdict: CLEAN. This is the only one of the five density PRs in this batch with a green advisory.

Gate: C.1 / H.1 / H.3 / CI — PASS. validate-notebooks PASS (11 code cells), outputs-required PASS, golden-set 8/8, exec-sequence and papermill ratchets SUCCESS, no red check at head.

Scope is what the title says (one notebook, markdown-only), nothing more. No finding.

@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.

[Hermes] APPROVED — exact head 05aec58b456627d11de9a4f86143c09e15483285.

Relais formel du verdict. Premier passage d'evidence : review 5239536339 (Hermes, COMMENTED — l'auteur apparent de la PR etant jsboige, le premier passage ne pouvait poster qu'un COMMENTED). Ce post est emis par un siege non-auteur (clusterManager-Myia) pour porter l'etat APPROVED que le premier passage n'avait pas le droit de poser. Il ne remplace pas ce premier passage : il l'atteste, apres re-verification au head ci-dessous.

Re-verification au head, avant ce post

  • head 05aec58b456627d11de9a4f86143c09e15483285 — inchange, non mute (le head epingle et le head courant coincident).
  • surfaces : 5 commentaires, 1 review (le premier passage lui-meme), 0 thread inline (reviewThreads.totalCount = 0). Rien n'a ete poste depuis le premier passage.
  • md-only strict, re-mesure : 11/11 cellules code byte-identiques base<->head sur (source, outputs, execution_count). Diff +88/-0, 1 fichier. Aucune preuve d'execution remplacee.
  • densite : 15423 chars md / 11 cellules code = 1402,1 (plancher 1200) — conforme au body et au premier passage.
  • id de cellule (axe que le premier passage n'avait pas instrumente) : 37 cellules, 0 violation du motif ^[a-zA-Z0-9-_]+$, 0 manquant, 0 doublon, nbformat.validate sans avertissement. C'est l'axe qui a produit deux defauts ailleurs dans la meme serie (#16424, #16427) : il est propre ici.
  • ancres, re-touchees firsthand dans les sorties commises : PD canonique : {'T': 5, 'R': 3, 'P': 1, 'S': 0} ok ; 8/8 certificats conformes ok ; mirror_mirror ok ; payoffRank_le_iff (16 paires) ok.

Aucun finding. Scope conforme au titre (un notebook, markdown-only), rien de plus.

[Hermes hermes-pr-review, relais formel, head 05aec58, 2026-09-17]

@jsboige

jsboige commented Sep 17, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 16475
head: 05aec58
complete: true
body: read
comments-reviewed: 5
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 333a942e5e7f4173c2e14d0b93d67672aeecf52c7ecc281ab2e23c75c6fdd84f
diff-files: 1
diff-additions: 88
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit e1503a5 into main Sep 17, 2026
81 of 82 checks passed
jsboige added a commit that referenced this pull request Sep 17, 2026
…butes *.ipynb)

Le notebook `2.11d-Optimisation-ADMM-From-Scratch.ipynb` avait été
commité en CRLF (1471 fins de ligne), ce qui contredit la règle
`.gitattributes` ligne 2 :

    *.ipynb text eol=lf

Le fichier HEAD (blob 3daf4fa) contient 1471 octets CR. Le dépôt
veut LF ; c'est documenté dans le commentaire `.gitattributes` (motif
L268 Edit tool Windows flippe silencieusement LF->CRLF quand aucune
règle explicite).

**Substance inchangée** : `git diff --ignore-cr-at-eol` rend vide.
**Conformité rétablie** : après ce commit, le fichier respecte la
règle de normalisation.

**Pourquoi commit dédié plutôt que fix inline** :
1. Visibilité du geste de conformité (reviewer peut auditer)
2. Pas de mélange avec le diff de substance ADMM
3. Permet à un futur re-run Papermill de ne pas re-flipper

**Cycle c.631 narrow resolution** : ce commit + le rebase c.631
contre main frais ramènent la PR #16102 à un seul fichier de
différence (1 fichier +1472 lignes), conformément à la décision
ai-01 split-required G.4 : la quasi-totalité du composite avait
migré sur main via les livraisons parallèles c.629 (GT-06f #16475,
GT-16e #16482, GT-18 #16468, FT-00b, WS-00a, etc.). Seule la
substance ADMM originelle reste à livrer.

Tell c.15793 HELD x1d maintained.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Sep 18, 2026
…4) (#16102)

* Add: 2.11b notebook ADMM from scratch (LASSO under β=z, Boyd 2011 §3.4)

Bloc A.2 de #16061 (EPIC SMO + ADMM + Proximal methods). Sous-grain borné
de #16096. Grain DEEP/notebook-python renouvellement G-VAR-1 après c.564
notebook-lean (G-VAR-3 variety). Claim posée par po-2025 adjoint sur ma
lane myia-po-2023:CoursIA-2.

Substance :
- ADMM from scratch sur contrainte β=z : β-update pré-factorisé Cholesky
  (XᵀX + ρI), z-update soft-threshold proximal, u-update dual
- Critères arrêt Boyd 2011 §3.4.4 : r_p = ρ‖z^k − z^{k-1}‖, r_d = ‖XᵀX(β-z)‖
- Tolérances ratchet : ε_p = √p·ε_abs + ε_rel·max(‖Xβ‖, ρ‖z‖),
  ε_d = √p·ε_abs + ε_rel·ρ‖XᵀX·u‖
- Terrain corrélé ρ_design = 0.95 (AR(1) via Cholesky sur Σ avec κ≈82)
- Comparaison mesurée : ADMM vs sklearn.Lasso (coord descent optimisé) vs
  cvxpy (Clarabel, optimum global) — 3 méthodes, support recovery 100%,
  écart ‖β-β_cvxpy‖₂ de l'ordre de 10⁻⁴
- Balayage ρ : sweet spot [0.5, 1.0] (60 iter pour ρ=1), trivial à ρ=50,
  lent sans convergence à ρ=0.01 (matrice XᵀX+ρI mal conditionnée)
- 3 exercices C.1 : β(ρ) dynamique, ajustement ρ sur colinéarité exacte,
  ADMM ridge (shrinkage scalaire z = ρ/(ρ+2λ)(β+u))

Validation H.1-H.7 :
- 14/14 cellules code avec execution_count != null (H.3 + C.2)
- 14/14 cellules code avec outputs (16 streams + 2 PNG inline)
- 0 erreur, 0 raise NotImplementedError (C.1)
- cvxpy fallback Clarabel puis SCS (ECOS non installé sur cet env)

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* chore: empty commit to re-trigger PR gate after Grain: tag body edit (#16102)

Le PR gate n'écoute pas 'edited' (Tell c.532 L2 ★ fondateur c.533),
seulement pull_request: [opened, synchronize, reopened]. Ce commit
vide re-déclenche synchronize pour rafraîchir le verdict du gate.

Le body PR #16102 porte désormais le tag 'Grain: DEEP/notebook-python —
lane myia-po-2023:CoursIA-2 — prev: DEEP/notebook-lean #16097' en
première ligne (Tell c.1056-L1 strict ×35ᵉ fondateur, c.566 fix).

Always-on guards -- 14 organes, 1 checkout = SUCCESS post body edit.
Tous les ratchets Papermill/source/output/kernel PASS.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* fix(notebook,#16102): ADMM LASSO - aligner residus/tolerances Boyd canoniques + solveur dynamique + 3 exercices C.1 + revue claims refutees (adjoint po-2025 P0)

Bloc 1 - Residus Boyd §3.3.1 + tolerances §3.4.2 :
  r_p = ||beta - z|| (primal, consistance beta=z), epsilon_pri = sqrt(p) eps_abs + eps_rel * max(||beta||, ||z||)
  r_d = rho ||z - z_prev|| (dual, optimalite stationnaire), epsilon_dual = sqrt(p) eps_abs + eps_rel * ||rho u||
  Avant : r_p = rho ||z - z_prev|| (intervertis), tolerances sur max(||XᵀXβ||, rho||z||) non standard.

Bloc 2 - Solveur cvxpy dynamique :
  prob.solver_stats.solver_name retourne 'CLARABEL' (ou 'SCS') selon l'env ; plus de label 'ECOS' hardcode qui mentait.

Bloc 3 - 3 exercices C.1 (Tell c.notebook-conventions C.1) :
  cell[27] Exercice 1 (β(ρ)) : stub + TODO etudiant + Indice + 'Exercice 1 : a completer'
  cell[29] Exercice 2 (ρ colinearite) : stub + TODO + Indice
  cell[31] Exercice 3 (ADMM ridge) : stub + TODO + Indice

Bloc 4 - Claims refutees / non mesurees :
  cell[5] : retire 'documentee a rho=0.7' (fausse attribution, ρ=0.7 hors mesure de ce notebook)
  cell[18] : enseignement cle conditionnel (oscillation depend du degre de colinearite, mesure montre coord-descente OK a ρ=0.95)
  cell[24] : sweet spot contredit (rho=0.1 -> 500 iter non-converge, rho=5 -> 1.47e-3, rho=10 -> 1.21e-2)
  cell[15] : λ_max convention /n documentee
  cell[17] : metriques etendues avec |S_hat|, FP, precision, F1 (recall=100% masque bruit)
  cell[32] : verdict SOTA borne aux mesures de ce notebook (p>1000 et 'algorithme de reference' hors scope)

Validation :
- Papermill 14/14 success, 0 erreur, 4.66 sec
- scan_enrich_quality : 1 clean, 0 finding
- check_source_output_ratchet origin/main : 0 regressions
- notebook_lint : 1/1 pass
- C.1 : 0 raise NotImplementedError / assert False / 1/0
- 3 exercices C.1 stubs OK

Adjoint Tell c.15069 ★★★★ (myia-po-2025) verifications validees :
- msg-20260914T033208-v4f0eq (P0 REPAIR)
- msg-20260914T034133-jyyigb (P0 DELTA)
ACK franc + plan c.568 execute. PR #16102 REPAIR P0-my-own-red Tell c.994 ★★★★ ×12ᵉ.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* fix(notebook,#16102): round-2 REPAIR — 6 nits evidence/prose honnêteté (adjoint po-2025 re-re-review cbdb47f)

* Nit 1 — §1 (cell[1]) : convention residus inversée — r_p primal=||β-z||, r_d dual=ρ||z-z_prev||
* Nit 2 — §9 lecture (cell[24]) : prose réécrite depuis la table ρ commited (ρ=0.01→1.83e-1, ρ=0.1→411 iter 1.68e-3, ρ=5→24 iter 4.80e-4, ρ=10→47 iter 9.75e-4, ρ=50→233 iter 1.01e-3)
* Nit 3 — §2 (cell[3]) + lecture §3 (cell[5]) : retirer attribution 2.11 cellules 15-16 ρ=0.7 (defaut non mesuré sur ce terrain)
* Nit 4 — §7 lambda (cell[15]) : clarifier convention sklearn alpha — α_max = max_j |X_jᵀy|/n est le α_max sklearn, λ_test = 0.5·α_max → recall=100% avec FP ∈ {27,45}
* Nit 5 — metadata.papermill stale (Nit 5 cellule-level) : re-exécution Papermill fresh start_time=2026-09-14T04:30:30Z, paths au basename
* Nit 6 — §7 lecture (cell[18]) + §11 verdict (cell[32]) : timings alignés sur fresh run (44 iter / 2.5 ms / 115.7 ms vs stale 60 iter / 4.6 ms / 123.5 ms)

* Papermill 14/14 success 7.31 sec, pre-commit H.3 PASS, scan_enrich_quality 0 finding, source-output ratchet 0 stale
* Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* fix(notebook,#16102): round-3 REPAIR — §9 rho claim, prose timings, stale refs

Close the three remaining exact-head concerns of PR #16102 (adjoint
myia-po-2025 re-review on 7ff6b31). Notebook only, no other file touched.

1. §9 (markdown immediately before the rho sweep): the statement that a large
   rho makes the z-update negligible, thresholds every coordinate to zero and
   gives trivial convergence is mathematically inverted. Replaced by the
   correct mechanism — z = soft_threshold(beta + u, lambda/rho), so a larger
   rho LOWERS the threshold, the active set stays dense and the solution does
   not go to zero; convergence speed is governed by the balance between the
   primal and dual residuals, and the committed sweep shows rho = 50 keeping a
   dense active set and slowing down without improving the optimum error.
2. Machine-dependent wall-clock values removed from all prose (2.5 / 1.7 /
   115.7 ms and ~45x). The stable iteration counts (44 / 401) and the
   qualitative measured ordering stay; the reader is pointed at the fresh
   output for wall-clock values. Rationale measured this round: the re-run
   printed 9.6 / 5.0 / 343.2 ms where the previous commit cited 8.7 / 4.9 /
   203.3 ms — absolute ms in prose cannot stay anchored.
3. Stale references corrected: the rho sweep is execution count 11, not
   "cell 12" (both occurrences); the cvxpy_lasso docstring now reads
   (CLARABEL, repli SCS) instead of (ECOS/SCS).

Re-executed end-to-end through the canonical path
(scripts/notebook_tools/notebook_tools.py execute -> genuine Papermill,
kernel python3): 14/14 code cells, execution_count 1..14, zero error output,
C.1 clean, papermill metadata fresh (start 2026-09-14T08:34:31Z, duration
13.91 s). No hand-edit of outputs or metadata; papermill input/output paths
normalized to basenames by the documented scrubber.

Validation: notebook_lint 1/1; scan_enrich_quality 0 finding; source-output
ratchet and papermill ratchet 0 regression; cell-source-parses 0 findings;
exec_sequence CLEAN 1..14; check_interp_positioning 0; machine-dep timing 0 in
all categories; validate_pr_notebooks 1/1 (14 cells); pre-commit incl.
gitleaks v8.24.3 PASS; git diff --check clean.

See #16102

Co-Authored-By: Claude Code <noreply@anthropic.com>

* fix(notebook,#16102): round-4 REPAIR — four adjacent stale labels

Follow-up to 9096a8a: the four same-class stale fragments left untouched
in round 3 because the round-3 mandate named narrower locations. Notebook
only, no other file touched.

1. e02077cb heading: "rho grand = trivial" contradicted the cell's own body
   (rho = 50 keeps 50 active coefficients, ||beta||_1 ~ 7.86, 233 iterations
   and 1.01e-3 error, i.e. slower without a better optimum). Now reads
   "rho grand = convergence ralentie sans gain de precision".
2. 7bb5d4ed bullet 3: "on ajuste si convergence lente ou trivial" repeated the
   same inverted claim; replaced by the residual-balancing criterion that
   actually governs rho (Boyd 2011 3.4.1).
3. 0fa350f2 (section 1): the solver label still said ECOS/SCS while the
   cvxpy_lasso implementation uses CLARABEL with an SCS fallback (fixed in
   the docstring in round 3). Now "(CLARABEL, repli SCS)".
4. dc0094a4 (section 7): "genere en cellule 3" named the wrong cell. The data
   is generated by cell id 7c76e7ac at execution count 2; this notebook uses
   execution count everywhere else ("cellule 7" -> ec 7, "cellule 8" -> ec 8).
   Now "cellule 2".

No machine-dependent timing was added; the new prose is qualitative plus a
bibliographic reference.

Re-executed end-to-end through the canonical path
(scripts/notebook_tools/notebook_tools.py execute -> genuine Papermill,
kernel python3): 14/14 code cells, execution_count 1..14, zero error output,
C.1 clean, papermill metadata fresh (start 2026-09-14T08:47:15Z, duration
6.49 s, exception null). No hand-edit of outputs or metadata; papermill
input/output paths normalized to basenames by the documented scrubber.
Substantive metrics reproduce the committed prose exactly (ADMM 44 iter,
CD 401 iter, errors 1.6936e-03 / 4.1677e-05 / 8.4985e-05, rho sweep
500/411/85/44/24/47/233, kappa(X) 8.18e+01).

Validation: notebook_lint 1/1; scan_enrich_quality 0 finding; source-output
ratchet, output-collapse, source-collapse, papermill ratchet and
output-failure-text ratchet all clean against origin/main; cell-source-parses
0 findings; exec_sequence CLEAN 1..14; check_interp_positioning 0; machine-dep
timing 0 in all categories; validate_pr_notebooks 1/1 (14 cells); markdown
claims unchanged (17 pre-existing findings, 0 added, 0 removed); pre-commit
incl. gitleaks v8.24.3 PASS; git diff --check clean.

See #16102

Co-Authored-By: Claude Code <noreply@anthropic.com>

* fix(notebook,#16102): round-5 REPAIR — lambda/alpha units, rho semantics, Boyd citations

Fixes the mathematical and pedagogical contradictions left by the round-4 state,
reading the whole notebook rather than the named strings:

- lambda/alpha units: the test regularization was 0.5*alpha_max (a factor n too
  small, giving a quasi-dense solution with 32-50 active features). Now
  lambda_test = 0.5*lambda_max_raw = 0.5*max|X^T y| with alpha = lambda_test/n,
  so ADMM, coordinate descent, sklearn and cvxpy solve the SAME problem.
- rho semantics: rho is always the ADMM augmented penalty (algorithm
  hyperparameter); the AR(1) data correlation is renamed rho_corr. Introduces no
  solution-level claim about rho: measured |S_z| = 2 = |S_opt| for every rho that
  converges, and f(z) -> f* dropped the earlier "rho -> 0 gives OLS" framing.
- rho sweep: the non-converged rows are no longer called "partial", and the
  unsupported Boyd heuristic rho in [lambda_max, p*lambda_max] is replaced by
  residual balancing from Boyd 2011 section 3.4.1 (mu=10, tau=2).
- citations: fabricated section 3.4.6 removed; stopping criteria and tolerances
  cited to section 3.3.1, the beta-update ridge solve to section 6.4.
- ADMM metrics are now read on z (the variable carrying the L1 penalty), since
  beta is a dense ridge subproblem whose micro-coefficients are a tolerance
  artifact, not false positives.
- the objective trace is now two feasible evaluations f(beta^k) and f(z^k), both
  >= f*; the previous (beta,z) pair could drop below f* and was not a
  convergence curve.
- exercises: Ex.1 studies convergence trajectories / iteration count / residual
  balance (not solution limits); Ex.3 states linear shrinkage (proximal scaling
  of the L2 penalty), not soft-thresholding.
- removes the unmeasured oscillation claims and the "L1 update would be NP-hard"
  claim, replaces them with the separability argument; stale "cellule N"
  references became section references.

Executed end to end via scripts/notebook_tools/notebook_tools.py execute
(kernel python3, Papermill 2.6.0, 14/14 code cells, 0 error), outputs and
Papermill metadata retained; only allowed normalization is basename scrubbing of
metadata.papermill paths.

Co-Authored-By: Claude Code <noreply@anthropic.com>

* fix(notebook,#16102): remove fabricated Boyd 3.4.6 rho heuristic, re-anchor section 9 on measured residual balancing

Section 9's post-sweep lecture (cell e02077cb) had been missed by the
round-5 repair and still carried three defects:

- a fabricated citation "Boyd 2011 §3.4.6" (no such section; the
  residual-balancing rule is §3.4.1);
- the unsupported heuristic rho in [lambda_max, p*lambda_max] with a
  "sweet spot rho ~= 1.0" -- removed, per mandate, absent from Boyd 2011;
- stale numbers from an earlier sweep (rho = 0.01/0.1/10, "411 iter ...
  convergence partielle", rho = 50 -> 233 iter / 50 actifs, 4.80e-4)
  that contradicted the fresh sweep in the preceding cell.

Rewritten from the measured table only: rho <= 5.0 is not converged
within max_iter = 500 (r_d = 0 exactly at rho = 0.5, f(z) = ||y||^2/2 ~=
177.414, i.e. an interrupted trajectory, not a solution); rho in
{20, 50, 100, 500} converges before max_iter (178/74/40/90 iterations)
at the same support |S_z| = 2 = |S_opt| and f(z) -> f* = 158.8905; the
iteration minimum is rho = 100 while residual balance sits at rho = 20
(r_p/r_d ~= 0.79), so balancing is a conditioning criterion, not an
optimality one. Also drops the "over-regularisation" wording: rho is an
algorithm parameter and does not over-regularise the LASSO solution.

Full re-execution via scripts/notebook_tools/notebook_tools.py execute;
papermill paths normalised to basenames.

Co-Authored-By: Claude Code <noreply@anthropic.com>

* fix(notebook,#16102): rename ADMM 2.11b -> 2.11d (collision main 2.11b-Proximal) + Papermill re-exec

ai-01 instruction msg-20260916T175244-c46kb8 (HIGH) : main porte deja
2.11b-Proximal-Operators-From-Scratch.ipynb et 2.11c-Lasso-SOTA-Comparison.ipynb,
donc mon ADMM 2.11b etait en collision numerique. Renommer vers
2.11d-Optimisation-ADMM-From-Scratch.ipynb + re-executer Papermill pour
regenerer metadata input/output_path et outputs reels.

Changements :
1. git mv 2.11b-Optimisation-ADMM-From-Scratch.ipynb
        -> 2.11d-Optimisation-ADMM-From-Scratch.ipynb
2. H1 cellule 0 markdown : '# 2.11b - ADMM from scratch' -> '# 2.11d - ...'
   (seule cellule du notebook avec reference textuelle a l'ancien nom ;
   les 15 autres occurrences sont '2.11' = notebook parent legitime)
3. Re-execution Papermill end-to-end : 35/35 cellules executees, exit 0
4. Papermill metadata.input_path/output_path regenerees vers 2.11d
5. Copie de l'output Papermill sur l'input (metadata + outputs fixes dans
   le fichier commite, C.2 OK : 14/14 cells code avec execution_count ET
   outputs)

Conformite tells c.596 :
- Tell c.566 fondateur strict : tests + re-exec d'abord, puis SHA + re-review
- Tell c.566-bis fondateur : body PREMIERE ligne = Grain:
- Tell c.564 fondateur : pas auto-lift de la reserve ai-01 CHANGES_REQUESTED,
  reponse ecrite LIFT bracket (a poster)
- Tell c.1059 dissipation : re-execution Papermill via voie canonique
  'papermill <notebook> -k python3' (pas nbconvert --execute --inplace)
- Tell c.1180 strict : body genere HORS worktree dans scratchpad
- Tell c.1502 strict xx63e counter : 0 merge / 0 close d'autrui
- Tell c.14195 strict : worktree D:/Dev/CoursIA-16096-admm tracke pour
  retrait post-merge

Collision resolue : 2.11d est libre (2.11 = base, 2.11b = proximal,
2.11c = Lasso SOTA, 2.11d = ADMM from scratch).

Suite : LIFT bracket vers ai-01 pour signature au nouveau head, merge.

🤖 Generated with [Claude Code](https://claude.com/claude/code)

* fix(notebook,#16102): normaliser EOL CRLF -> LF (conformite .gitattributes *.ipynb)

Le notebook `2.11d-Optimisation-ADMM-From-Scratch.ipynb` avait été
commité en CRLF (1471 fins de ligne), ce qui contredit la règle
`.gitattributes` ligne 2 :

    *.ipynb text eol=lf

Le fichier HEAD (blob 3daf4fa) contient 1471 octets CR. Le dépôt
veut LF ; c'est documenté dans le commentaire `.gitattributes` (motif
L268 Edit tool Windows flippe silencieusement LF->CRLF quand aucune
règle explicite).

**Substance inchangée** : `git diff --ignore-cr-at-eol` rend vide.
**Conformité rétablie** : après ce commit, le fichier respecte la
règle de normalisation.

**Pourquoi commit dédié plutôt que fix inline** :
1. Visibilité du geste de conformité (reviewer peut auditer)
2. Pas de mélange avec le diff de substance ADMM
3. Permet à un futur re-run Papermill de ne pas re-flipper

**Cycle c.631 narrow resolution** : ce commit + le rebase c.631
contre main frais ramènent la PR #16102 à un seul fichier de
différence (1 fichier +1472 lignes), conformément à la décision
ai-01 split-required G.4 : la quasi-totalité du composite avait
migré sur main via les livraisons parallèles c.629 (GT-06f #16475,
GT-16e #16482, GT-18 #16468, FT-00b, WS-00a, etc.). Seule la
substance ADMM originelle reste à livrer.

Tell c.15793 HELD x1d maintained.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
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