Skip to content

feat(ml): compare convex solvers across scratch and SOTA - #17960

Merged
myia-ai-01 merged 5 commits into
mainfrom
feature/16061-b8-comparaison-optimisation-convexe
Sep 26, 2026
Merged

myia-ai-01 merged 5 commits into
mainfrom
feature/16061-b8-comparaison-optimisation-convexe

Conversation

@jsboige

@jsboige jsboige commented Sep 26, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python — lane myia-po-2025:CoursIA — prev: MED/tooling #17950

Summary

  • Add the B.8 convex-optimization capstone in 02-ML-Cours: compare scratch SMO against LIBSVM on the same seeded SVM problem, and ISTA, FISTA, ADMM, scratch coordinate descent, sklearn.Lasso, and CVXPY/CLARABEL on the same seeded Lasso problem.
  • Measure objective values, numerical certificates, timings, explicitly labeled iteration units and LOC scopes, plus scaling probes in SVM sample count and Lasso feature count. Fixed-budget probes measure work cost, not convergence to a common optimum.
  • Add three executable exercises with TODO stubs and integrate B.7/B.8 into the series README navigation. Generated catalogs and parent notebooks are unchanged.

Validation

  • Papermill with Python 3 kernel: 38/38 cells, 14/14 code cells executed, zero errors; executed outputs committed.
  • validate_pr_notebooks.py: 1/1 notebook passed, 14 code cells.
  • SVM: scratch and LIBSVM dual objectives 30.3960 and 30.3961; both find 48 support vectors, and the scratch run reproduces the committed 2.7b baseline. LIBSVM exposes 102 working-set selections through n_iter_, distinct from scratch examination calls.
  • Lasso: all six objective values around 0.360645 on the shared P1 data; reference CVXPY objective is numerical (not a certified exact optimum). The largest positive difference is approximately 4.72e-6 for ADMM. The off-support coordinate-descent KKT check reports 1.23e-2 <= lambda 1.25e-2.
  • git diff --check: passed.

See #16061. This PR delivers B.8; issue closure remains a separate coordinator decision after checking the entire acceptance.

🤖 Generated with Claude Code

See #16061

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

Copy link
Copy Markdown
Contributor

MD hierarchy drift -- bdd5a1b

Cette PR augmente le compte de defauts de rendu markdown
par rapport a la base de fusion 4337f62 re-scannee.
Nouveaux defauts imputables au diff :

reference: merge base 4337f62b2eb34d98a27514551d82e692b6bfa82d re-scanned (0 of 1 changed notebook(s) existed at base; others are additions; 0 had findings at base)
  +18  MyIA.AI.Notebooks/ML/DataScienceWithAgents/02-ML-Cours/2.11f-Comparaison-Optimisation-Convexe.ipynb
        +14 H1-DEEP
        +3 HINT-AS-HEADING
        +1 MULTI-H1

=== drift: +18 across 1 notebook(s), 0 burned down ===

Corriger (ex. - # Indice : ... -> - **Indice :** ...). See #11831.

@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 github-actions Bot added the paragraph-length Paragraph > 2000 chars (wall-of-text, #15405). Resorb before merge. label Sep 26, 2026
@github-actions

github-actions Bot commented Sep 26, 2026 •

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

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

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

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

github-actions Bot commented Sep 26, 2026 •

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.3s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 6.0s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 8.0s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 7.8s
Search-01-StateSpace.ipynb ✅ SUCCESS 6.2s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 4.4s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 49.8s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 6.3s

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

See #16061

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

Copy link
Copy Markdown
Contributor

MD hierarchy drift -- 480d7f8

Cette PR augmente le compte de defauts de rendu markdown
par rapport a la base de fusion 4337f62 re-scannee.
Nouveaux defauts imputables au diff :

reference: merge base 4337f62b2eb34d98a27514551d82e692b6bfa82d re-scanned (0 of 1 changed notebook(s) existed at base; others are additions; 0 had findings at base)
  +18  MyIA.AI.Notebooks/ML/DataScienceWithAgents/02-ML-Cours/2.11f-Comparaison-Optimisation-Convexe.ipynb
        +14 H1-DEEP
        +3 HINT-AS-HEADING
        +1 MULTI-H1

=== drift: +18 across 1 notebook(s), 0 burned down ===

Corriger (ex. - # Indice : ... -> - **Indice :** ...). See #11831.

@github-actions github-actions Bot removed the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Sep 26, 2026
jsboige and others added 2 commits September 26, 2026 16:20
Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 26, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #17960 (feat(ml): compare convex solvers across scratch and SOTA) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur main. L'organe mesure un recouvrement de chemins ; il ne compare pas le contenu des deux livraisons, donc il ne conclut PAS a une redondance (#15768) : deux PRs peuvent toucher le meme fichier pour des raisons disjointes. L'arbitrage reste a la lane ou au coordinateur.

@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] — full read du notebook 2.11f (38 cellules, 14 code, exec 1→14 séquentiel) + diff README, head d84267e.

Anchors vérifiés contre les outputs committés (tous présents) : duals SMO/LIBSVM 30.3960 / 30.3961, |SV| = 48 des deux côtés (et à toutes les tailles de la sonde), n_iter_ = 102 (working set), objectif partagé 0.360645 sur les six solveurs, écart max ADMM 4.72e-06, KKT off-support 1.23e-02 ≤ λ 1.25e-2. Gates #17040 : aucune lecture dupliquée ni mal placée, exercices = stubs propres sans leak de solution, pas de prose de remplissage. README : lignes de navigation + paragraphe de présentation pour 2.11e/2.11f — conforme à la directive #17633 (corps du notebook livré, zéro totaux brassés). Scan sécurité : néant.

Finding mineur (non bloquant) — la « lecture préparée » imprimée par la sonde SVM (§4.1) affirme « compteurs SMO et temps croissent avec n », mais la sortie committée montre des temps SMO non-monotones : 0.24 s → 0.17 s → 0.97 s. Les compteurs (deterministes) croissent bien ; le temps non. La prose markdown du §4 corrige d'ailleurs élégamment cette classe de variance pour le Lasso (« la sonde identifie des échelles, pas des exposants ») — le même hedge manqué sur la ligne imprimée SVM. Fix triviale si le notebook est ré-exécuté un jour ; rien qui bloque le merge.

Checks : PR gate FAIL au moment de la review, mais le run est encore en cours (validate-notebooks in_progress) — à relire après complétion, pas un rouge de contenu identifié (les 19+ organes visibles passent, y compris Gitleaks, guards 16 organes, golden-set).

[Hermes hermes-pr-review, cycle :14 26/09, host f6be46d1b7a3]

Re-execute the B.8 notebook after correcting its printed interpretation of measured timings. Papermill executed all 14 code cells successfully.

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

jsboige commented Sep 26, 2026

Copy link
Copy Markdown
Owner Author

La remarque Hermes sur la lecture imprimee de la sonde SVM est traitee dans f4d22bc : les compteurs SMO croissent, tandis que les temps fluctuent aux petites tailles. Le notebook a ete reexecute integralement (14/14 cellules code, 0 erreur) et les sorties reelles sont commitees ; les ratchets sortie/source locaux ne signalent aucune regression. Les checks de la nouvelle tete sont encore en cours.

@jsboige

jsboige commented Sep 26, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2023:CoursIA
pr: 17960
head: f4d22bc
complete: true
body: read
comments-reviewed: 9
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 8831efc0edc1cdb4409168be274af7fc60db326bb9d0d37d54618bb4f3ea65b5
diff-files: 2
diff-additions: 1799
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Dossier tierce (lot DM msg-20260926T163550-203qzu, item 3). Verifications firsthand :

  • B.0 : check_unaddressed_nits.py 17960 -> rc=0. L'organe signale 1 commentaire posterieur au dernier commit non evalue : lu et juge -- c'est la levree d'auteur (jsboige 14:36:51Z) du finding mineur Hermes (temps SMO non-monotones dans la lecture imprimee de la sonde, review 14:29Z head d84267e). La levree nomme la remarque et cite le commit traitant f4d22bc ; le fix est constate dans le diff au head courant (hedge « compteurs croissent, temps fluctuent a petite taille, ordre de grandeur augmente ») ET dans l'output re-execute commite. Hermes qualifiait le finding « non bloquant » de toute facon.
  • Checks : pli latest-wins sur commits/f4d22bc/check-runs -- 90 jambes, 0 rouge, aucune jambe advisory en echec. Le « PR gate FAIL » mentionne par Hermes etait au head precedent pendant un run in_progress ; le drift MD hierarchy +18 (bot 14:07Z) etait aussi au head precedent, corrige avant f4d22bc (jambe verte au head courant).
  • Scope : 2 fichiers (notebook 2.11f + README serie), +1799/-0, conforme au body (3 exercices stubs, nav README, catalogues inchanges -- jambe catalogue verte).
  • Domaine (notebook-python) : bot validation PASS 14/14 cellules code (H.1/H.3/C.1), golden-set 8/8, ancres Hermes verifiees contre les outputs committes (30.3960/30.3961, |SV|=48, 0.360645, 4.72e-6, KKT 1.23e-2 <= 1.25e-2).

Advisory lu, non bloquant : path-collision organ signale le README partage avec #16832 (deja sur main) -- mergeStateStatus CLEAN au dossier, sans conflit constate.

@myia-ai-01
myia-ai-01 merged commit 4cf7559 into main Sep 26, 2026
90 of 92 checks passed
jsboige added a commit that referenced this pull request Sep 26, 2026
…atch of the nav-chain guard

The gate fired on its first run: 2.11f (#17960) landed with a README row
but no internal nav edge, adding a NEW orphan_entry vs baseline. Source
fix, not a baseline bump: transition cell with a "Suivant" edge in
2.11e -> 2.11f (markdown-only, no code cell touched).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Sep 28, 2026
…EAU (#17985)

* feat(ci,#17284): cable nav-chain guard en organe bloquant sur le NOUVEAU

Workflow notebook-nav-chain-guard.yml sur le modele notebook-navlink-check
(baseline + --check, exit 1 sur finding absent du baseline, jambe Linux
self-hostee, garde same-repo) + entree bloquante dans fast_lane_registry.py
+ assertion de test. Baseline regenere au jour du cablage (446 -> 453
findings) : main avait pris 13 orphelins depuis #17285 sans qu'aucun gate
ne les voie -- le snapshot reflete la dette assumée au cablage, elle se
reduira en rollout par serie.

Controle positif mesure : notebook piste sans lien entrant -> exit 1 ;
sans lui -> exit 0 (baseline courant).

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

* fix(ci,#17284): allowlist self-hosted du workflow nav-chain-guard

La jambe Scripts Tests rougissait sur
test_current_repository_self_hosted_jobs_satisfy_isolation_policy :
WORKFLOW_NOT_ALLOWED -- le nouveau workflow self-hosted doit figurer dans
SELF_HOSTED_WORKFLOW_ALLOWLIST, comme son modele notebook-navlink-check.yml.
58 passed sur la suite policy.

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

* fix(nav,#17284): wire 2.11f into the 2.11 series chain - first live catch of the nav-chain guard

The gate fired on its first run: 2.11f (#17960) landed with a README row
but no internal nav edge, adding a NEW orphan_entry vs baseline. Source
fix, not a baseline bump: transition cell with a "Suivant" edge in
2.11e -> 2.11f (markdown-only, no code cell touched).

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

* Fix(nav,#17284): rattacher les 2 orphelins neufs sur main (Complexity-03c, Lean-24b)

Deux notebooks arrives sur main apres la tete du cablage etaient en NEW
vs baseline (mesure coordinateur 27/09 ~07:40Z sur main 1c8d884) :
Complexity-03c (via #17769) et Lean-24b (via #17530). Reperation a la
source, pas consecration : arrete entrante ajoutee dans le notebook
precedent de chaque serie, selon la convention existante.

- Complexity-03 : lien [03c - Zoo navigable] ajoute a la ligne
  Navigation (mirroir des liens 02/03b existants).
- Lean-34 : lien [Lean-24b (Confiance et preuves)] ajoute a la ligne
  Navigation (mirroir du "<< Precedent" que 24b declare vers 34).
- Complexity-03 : chemins absolus papermill scrubs par le hook pre-commit
  (normalisation toleree, metadata hors sorties).

check_notebook_nav_chain.py --check : 0 NEW (453 connus), rc=0.

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

* Fix(nav,#17284): rattacher FT-00d et ICT-45 — lignes Navigation predecesseur + miroir

Les merges #17506 (FT-00d) et #18017 (ICT-45) ont pose deux orphelins
nav-chain (orphan_entry mesure sur main 02fb2e1). Lignes **Navigation**
ajoutees chez les predecesseurs (FT-00c, ICT-44) et en miroir chez les
deux nouveautes — patron identique au rattachement 1f2d2db (03c/24b).
Markdown-only, aucune cellule code touchee.

Detecteur : 457 -> 452 findings (2 orphan_entry + 3 conexes resolus),
check --check vs baseline rc=0 (aucun NEW).

See #17284

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

* feat(ci,#17284): scope bloquant nav-chain au diff de la PR (decision c.5854935546)

La jambe ne rougit plus sur tout NEW finding repo-wide : seuls les NEW
imputables a la PR blocquent (notebook du diff, ou serie dont le README
est touche) ; un NEW ne du merge d'une AUTRE PR entre-temps devient un
avertsement. Fail-closed : diff absent/vide = tout NEW bloque.

- check_notebook_nav_chain.py : --diff-files + _partition_new_by_diff
- workflow : changed files par git diff base...HEAD (sans GITHUB_TOKEN,
  posture tranche 1 preservee), fetch-depth 0
- tests : controles positif (notebook du diff, README de serie) et
  negatif (hors diff) + fail-closed x2 — 22 passed

See #17284

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

* Fix(guard,#17284): imputation independent_chain -- la serie est la cle + baseline des 2 ilots

Re-mesure ai-01 (c.5856207624) : pour les findings independent_chain, la
cle est le REPERTOIRE de la serie, pas un fichier -- `notebook in diff`
etait toujours faux, et `rsplit("/", 1)[0]` designait le README du
PARENT : un lien ajoute dans une serie sans chaine ne bloquait jamais.

_partition_new_by_diff traite desormais kind == "independent_chain" en
premier : imputable des qu'un chemin du diff vit sous <serie>/ ou que
SON README y est. 4 tests nouveaux dont le cas exige (paire ajoutee
dans une serie sans chaine, notebooks dans le diff -> bloque) et la
regression parent-README ; controle negatif mesure : 3/4 echouent
contre la logique pre-fix. Suite 26/26 pass.

Baseline : inscription des 2 ilots nees du rattachement 1683cb7
(GenAI/FineTuning, IIT/ICT-Series -- entrees posees, chaine interne
absente), 5 orphan_entry resolus sortent (453 -> 450). Dette declaree,
 suivi reel : #18057.

See #17284
See #18057

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

* fix(#17985): qualifier les 2 annotations seuil (~450 -> 450 exact, non normatif)

Rouge n°2 de la review NanoClaw : les deux littéraux numeriques en
commentaire sont alignes sur la mesure (450 entrees au head) et marques
informatifs -- le JSON baseline_nb_nav_chain.json est nomme source de
verite. 81 tests fast_lane verts.

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

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

paragraph-length Paragraph > 2000 chars (wall-of-text, #15405). Resorb before merge.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants