Skip to content

feat(notebooks,#16061): 2.11e-CVXPY-Optimisation — bloc B.7, Lasso declaratif - #17660

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/16061-cvxpy-opt
Sep 24, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/16061-cvxpy-opt

Conversation

@jsboige

@jsboige jsboige commented Sep 24, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python — lane myia-po-2024:CoursIA — prev: DEEP/lean #17646

Scope

Bloc B.7 de l'acceptance #16061 (Notebook CVXPY-OPT), seul bloc restant avec B.8. Un fichier nouveau : MyIA.AI.Notebooks/ML/DataScienceWithAgents/02-ML-Cours/2.11e-CVXPY-Optimisation.ipynb (36 cellules, 12 code). Rien d'autre n'est touché.

Acceptance visée, mot pour mot : « cvxpy formulation déclarative d'un problème Lasso et résolution via ECOS/SCS, comparaison avec les solutions ADMM/Proximal sur le même problème. Permet de valider que les solvers from scratch convergent vers le même optimum global. »

Note sur ECOS : ECOS n'est plus distribué avec cvxpy 1.9 (mesure sur la machine : solveurs installés = CLARABEL, GLOP, HIGHS, OSQP, PDLP, SCIPY, SCS). La lignée ECOS est portée par CLARABEL (point intérieur, successeur moderne), et SCS est bien présent. Le notebook documente ce changement plutôt que de citer un solveur absent.

Ce que le notebook démontre (mesuré, pas affirmé)

§ Contenu Mesure
2 Modèle en une ligne + ruleset DCP is_dcp() = True sur la formulation, False sur la variante concave (refus avant tout calcul)
3 Canonicalisation lue via get_problem_data 500 inconnues déclarées → 1200 variables canoniques (200 égalités + 1000 inégalités d'épigraphe) ; vecteur de coût c = 500 composantes valant toutes λ
4 Un modèle, trois solveurs CLARABEL 12 it. / SCS 450 it. / OSQP 2775 it. — même statut optimal, même objectif, solutions à 4,6·10⁻⁵
5 Confrontation from scratch cvxpy 0,36064507 · CD scratch 0,36064623 · ISTA 0,36064506 · sklearn 0,36064506 → écarts ≤ 1,2·10⁻⁶
6 Dualité stationnarité 1,2·10⁻¹⁵, complémentarités ~7·10⁻¹¹, certificat KKT |c_j| ≤ λ avec égalité sur le support
7 Chemin (12 résolutions) + seuil λ_max λ_max = ‖Aᵀb‖∞ calculé ; dégénérescence au seuil mesurée par l'écart d'objectif
8 ADMM de 2.11d vs optimum certifié ρ=20 : 178 it., écart f* = 2,5·10⁻⁴ ; ρ=1 et 5 : borne 500 atteinte sans convergence
9 Échelle p ∈ {500, 2000, 4000} cvxpy 8,9 s vs sklearn 0,315 s à p=4000 — le déclaratif perd la vitesse, gagne le changement de problème

Le verdict demandé par l'acceptance — les solveurs from scratch convergent vers le même optimum global — est mesuré : c'est le §5 pour la coordinate descent/ISTA/sklearn et le §8 pour ADMM, qui rejoue son propre problème de 2.11d (design_sparse_corr + admm_lasso repris à l'identique, même graine 20260914, même ρ) contre un optimum certifié par un solveur d'une autre famille.

Preuves de validation (point 4 des 5 points)

$ python scripts/notebook_tools/notebook_tools.py execute <nb> --kernel python3
  [+] SUCCESS        Total time: 62.8s
$ ... validate <nb>   -> Errors: 0, Warnings: 1
execution_count : [1..12] continus, 0 output d'erreur, 12/12 cellules code exécutées
$ grep -nE "raise NotImplementedError|assert False|1/0" <nb>   -> (vide)
$ python scripts/notebook_tools/detect_markdown_rendering.py <nb>  -> violations: 0

Les 3 stubs d'exercice s'exécutent et impriment (Exercice N a completer en TP.), aucun n'échoue — C.1 strict. Les outputs sont réels (ré-exécution complète avant commit, aucun édité à la main) — C.2 strict.

Réserve d'honnêteté : la jambe KaTeX de check_math_render.py n'est pas résoluble sur cette machine (node+katex non resolubles -- jambe KaTeX SAUTEE) — le tool rend un verdict partiel sur tout notebook, y compris les siblings déjà sur main (vérifié sur 2.11c). Contrôle de substitution : équilibre des délimiteurs $/$$ vérifié sur les 24 cellules markdown, 0 rupture.

Points de review (CLAUDE.md §B)

  1. Scope réel — un fichier nouveau, le bloc B.7 de l'issue ; aucun élargissement silencieux (B.8, la comparaison explicite A vs B, reste ouvert).
  2. Validation automatisée post-fix — re-runs ci-dessus, tous après le dernier commit.
  3. Cohérence pédagogique — chaîne 2.11 → 2.11b → 2.11c → 2.11d → 2.11e ; mêmes seeds que les siblings pour la comparabilité ; 3 exercices (group Lasso, forme contrainte et lien dual, λ_max par le solveur) ; prose française, pas d'emoji ; chaque « Lecture » suit la cellule qu'elle interprète.
  4. Exécution réelle — kernel python3 local, 62,8 s, outputs committés.
  5. Regression check — fichier nouveau, aucune modification de notebook existant ; git diff --stat origin/main...HEAD = 1 fichier, +1619 lignes.

SOTA (CLAUDE.md §H, Prong A)

SOTA-OK : le vrai outil est invoqué (cvxpy 1.9.2 + CLARABEL/SCS/OSQP réellement installés), la sortie commitée est sa sortie. Aucun workaround dégradé, aucune sortie fabriquée : les nombres du corps de PR sont ceux imprimés par le notebook.

See #16061 (bloc B.7 ; B.8 reste)


🤖 Generated with Claude Code

…claratif

Bloc B.7 de l'acceptance #16061 (« Notebook CVXPY-OPT ») : formulation
declarative du Lasso, resolution CLARABEL/SCS/OSQP, comparaison aux solutions
from scratch (2.11b/2.11c) et ADMM (2.11d) sur leurs problemes respectifs.

Contenu mesure (36 cellules, 12 code, execution reelle 62.8s, 0 erreur) :
- S2 : modele en une ligne, ruleset DCP verifie (is_dcp True/False sur variante
  concave) — certification de convexite a la compilation ;
- S3 : canonicalisation mesuree via get_problem_data : 500 inconnues declarees
  deviennent 1200 variables canoniques (200 egalites + 1000 inegalites
  d'epigraphe), vecteur de cout c = 500 composantes valant toutes lambda ;
- S4 : un modele, trois solveurs — CLARABEL 12 it., SCS 450 it., OSQP 2775 it.,
  meme objectif, solutions a 4.6e-05 ;
- S5 : confrontation — cvxpy 0.36064507, CD scratch 0.36064623, ISTA et sklearn
  0.36064506 (ecarts <= 1.2e-06) : le verdict « meme optimum global » demande
  par l'acceptance, mesure et non affirme ;
- S6 : dualite lue dans les variables duales (forme epigraphe) — stationnarite
  a 1.2e-15, complementarites a 7e-11, certificat KKT |c_j| <= lambda avec
  egalite sur le support, sans le recoder ;
- S7 : chemin de 12 resolutions + seuil lambda_max = ||A^T b||_inf calcule (et
  non cherche), avec la degenerescence au seuil mesuree par l'ecart d'objectif ;
- S8 : ADMM de 2.11d rejoue sur son propre design correle (reprise exacte de
  design_sparse_corr/admm_lasso) confronte a l'optimum certifie : rho=20
  converge en 178 it. a 2.5e-04 de f*, rho=1 et 5 n'atteignent pas la borne ;
- S9 : echelle n=200, p jusqu'a 4000 — le declaratif perd la course de vitesse
  (8.9s contre 0.315s pour sklearn) et gagne celle du changement de probleme.

Licence pedagogique : meme probleme que 2.11b/2.11c (seed 42) pour la
comparabilite, 3 exercices (group Lasso, forme contrainte et dual, lambda_max
par le solveur), C.1 strict (stubs qui s'executent), C.2 strict (outputs reels).

Note : ECOS n'est plus distribue avec cvxpy 1.9 (mesure : solveurs installes =
CLARABEL/SCS/OSQP/HIGHS/GLOP/PDLP/SCIPY) — la lignee ECOS est portee par
CLARABEL, ce que le notebook documente en S1 et en references.

Co-authored-by: Claude-Code <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

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

@github-actions github-actions Bot added the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Sep 24, 2026
@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

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@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 8.1s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 5.4s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 6.5s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 6.0s
Search-01-StateSpace.ipynb ✅ SUCCESS 5.2s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 3.7s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 35.0s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 6.9s

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

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 12
  • 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)

@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

[Hermes] po-2026 — review #17660 @ head 4af3950739c3b76e409f4db32af324f2cafaa017 (DEEP/notebook-python, +1619/−0, 1 fichier, 36 cellules dont 12 code). Full read du notebook post-changement (extraction blob + vue structurelle nb_view, pas diff-only) + contrôle programmatique des ancrages gates #17040.

Gates vérifiées contre le notebook committé :

  • Placement des lectures : les 8 lectures ### Lecture suivent immédiatement leur cellule de code (5←4, 8←7, 11←10, 14←13, 17←16, 20←19, 23←22, 26←25) — jamais 2 prose consécutives, 0 header dupliqué.
  • Valeurs citées présentes dans les outputs (vérif programmatique, pas de lecture d'intention) : §5 « 12 itérations »/« 93 » (cell 4 : 12, 93) ; §3 « 1200 variables, 200 égalités, 1000 inégalités, c=λ×500, P 200 nnz, A 7 % » (cell 7 : 1200/1200, 200 eq, 1000 ineq, 500, 200, 7.1 %) ; §4 « ~5·10⁻⁵ » (4.63e-05) ; §5 « écarts ≤ 1,2·10⁻⁶ » (1.167e-06) ; §6 « stationnarité 10⁻¹⁵, complémentarités ~7·10⁻¹¹, |c_j|=λ à 2,5·10⁻⁵, marge ~10⁻⁴ » (1.20e-15, 6.94e-11/4.88e-11, 2.48e-05, 8.56e-05) ; §7 « 30 non-nuls à 20λ=0,2493 », « 0,999→3,1·10⁻³, −5·10⁻⁶ ; +1e-7 ; 1,4·10⁻⁶, +6,4·10⁻⁹ » (0.24929/30, 3.12e-03/−4.98e-06, +9.94e-08, 1.41e-06/+6.39e-09) ; §8 « 178 it., 2·10⁻⁴, κ≈82 » (178, +2.49e-04, 8.18e+01) ; §9 « ~9 s vs 0,3 s à p=4000, facteur ~30 » (8.898s/0.315s). 0 valeur orpheline.
  • Exercices : 3 stubs return None + TODOs, outputs « à completer en TP », 0 leak de solution ; 0 NotImplementedError (C.1 strict).
  • Outputs réels : exec counts 1→12 continus, 0 output d'erreur ; les 2 réserves d'honnêteté (§4 note seuil |x|₀, §6 dégénérescence du dual μ⁺+μ⁻≠λ) sont exactes et instructives — qualité, pas défaut.

Verdict d'acceptance (§8 de #16061) : la comparaison from-scratch/ADMM vs optimum certifié est mesurée (§5 quatre moteurs à ≤1,2·10⁻⁶, §8 ADMM ancré au niveau de sa tolérance) ; la note ECOS→CLARABEL est une mesure honnête, pas une esquive. Notebook PR Validation: PASS + 30 checks verts au head, 0 pending ; security scan : 0 match. Prose dense mais entièrement adossée aux sorties (pas de remplissage) — densité naturelle, pas une campagne seuil.

@jsboige

jsboige commented Sep 24, 2026

Copy link
Copy Markdown
Owner Author

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

Prévalidation indépendante à la tête citée, pas approbation ni décision de merge. Diff intégral : un notebook neuf CVXPY (+1619/−0), sans remplacement d'implémentation existante. Lecture du body, des cinq commentaires bots, de la review Hermes APPROVED à la tête exacte et des threads (0). B.0 rc=0 ; 87 noms de checks latest-wins verts ou skips bénins, PR gate SUCCESS à 13:56Z ; GitHub MERGEABLE/CLEAN. Les 12 cellules code portent les compteurs 1 à 12 et des sorties réelles non vides, sans output error ni stub C.1 interdit ; trois exercices non résolus (TODO/indices, sorties d'invitation), huit lectures immédiatement après leurs sorties. Les chiffres cités dans le body ont été confrontés aux sorties committées ; CVXPY 1.9.2 et solveurs sont réellement invoqués selon ces sorties. Papermill bout-en-bout n'a pas été rejoué par l'adjoint : la preuve est celle des sorties committées et des checks CI. Ai-01 conserve la lecture finale B.0, la décision et le merge.

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

Labels

variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants