Skip to content

feat(search,#19269): Search-09f — du linéaire au convexe (LP → QP → SOCP), Markowitz App-10 en QP exacte - #20955

Merged
myia-ai-01 merged 5 commits into
mainfrom
feature/19269-convex-companion
Oct 16, 2026
Merged

myia-ai-01 merged 5 commits into
mainfrom
feature/19269-convex-companion

Conversation

@myia-po-2023

@myia-po-2023 myia-po-2023 commented Oct 15, 2026 •

Copy link
Copy Markdown
Collaborator

Grain: DEEP/notebook-python — lane myia-po-2023:CoursIA — prev: DEEP/notebook-python #20952

Slot: accretion de Search-09 (f)

See #19269 (tranche « nommer le cadre LP → QP → SOCP » du residuel du dispatch « File profonde » ; la tranche QP Markowitz mesurée existait déjà dans App-10 §7-8 et est citée, pas dupliquée)

Ce que le carnet ajoute

Nouveau compagnon Search-09f-ConvexOptimisation-Python.ipynb (28 cellules, Part1-Foundations, entre 09e et Search-10) — il nomme le cadre que Search-09 utilise sans le dire : l'optimisation convexe, et le démontre étage par étage :

  1. Le cadre nommé — objectif convexe sur ensemble admissible convexe, « tout minimum local est global », escalier LP → QP → SOCP → SDP (chaque étage renvoyé à son carnet : 09 pour LP, ce carnet pour QP/SOCP, 09b pour SDP). Figure convexe vs non-convexe.
  2. LP relu comme convexe dégénéré — l'instance de production de Search-09 (z = 3x₁+2x₂) re-résolue par cvxpy : z = 8,00, x₁ = 2,00, x₂ = 1,00 — identique au simplexe PuLP de Search-09 (croisé cellule par cellule).
  3. QP Markowitz — l'instance App-10 (5 actifs) résolue en QP exacte : frontière 25 cibles + tangence CLARABEL. Tangence mesurée : rendement 17,95 %, risque 10,75 %, Sharpe 1,4839 — identique à App-10 §7 aux quatre chiffres affichés (le GA d'App-10 mesurait écart +0.0000 : la QP certifie ce que le génétique avait déjà trouvé, en 22 ms).
  4. Mesure échantillonnage vs QP (cellule dédiée) — 10 000 tirages Dirichlet, même famille qu'App-10 §2 : à cible égale, le meilleur tirage reste au-dessus de la variance QP de 1,6 % à 2,6 %, et à la cible 20 % seuls 406 tirages sur 10 000 passent le filtre de rendement — l'échantillonnage visite rarement les bords du simplexe où l'optimum se serre.
  5. SOCP — rendement maximal sous plafond de risque σ ≤ 12 % : contrainte en norme quadratique, mesuré 19,59 %, contrainte saturée (risque réalisé 12,00 %) — le mur est la frontière du §3.
  6. Règle de décision convexe/métaheuristique (table : standard convexe → solveur ; non convexe petit → énumération, C(5,2)=10 ; non convexe grand → GA/NSGA-II d'App-10 §8).
  7. 1 exemple résolu (minimum de variance 2 actifs : formule fermée w₁* = 0,7747 vs cvxpy 0,7747, écart 3,4e-08) + 3 exercices C.1 (concentration 30 %, variance minimale globale, cardinalité K=2 par énumération — le résultat résolu vit dans App-10).

Copie pédagogique déclarée (organ-first, 5 questions)

Copie pédagogique déclarée, motif : l'instance de portefeuille est reprise à l'identique d'App-10 pour que l'étudiant de la Part 1 voie le cas d'école sans quitter les Fondements ; la cellule d'intro du §3 et la sortie de la tangence le disent toutes deux explicitement.

  1. Quelle série possède la sémantique ? Applications/Hybrid (App-10) possède la mesure complète GA/échantillonnage/NSGA-II ; Search/Part1-Foundations possède le LP source.
  2. Organe réel invoqué ? Oui — cvxpy + CLARABEL (le même solveur qu'App-10 §7), jamais une réimplémentation : chaque résolution est cp.Problem(...).solve(solver=cp.CLARABEL).
  3. Refactor/export nécessaire dans la série source ? Non — l'instance (5 tableaux numpy) n'est pas extractible sans coupler la Part 1 aux Applications ; la déclaration écrite couvre la copie.
  4. Témoin négatif de l'organe ? Le statut optimal rendu par CLARABEL à chaque résolution — le témoin qu'une réimplémentation jouet ne produirait pas.
  5. Vérification indépendante ? App-10 §7-8 : la tangence exacte (Sharpe 1,4839) et le duo cardinalité K=2 (1,3060) y sont mesurés par une voie indépendante (cvxpy ET génétique) — ce carnet les retrouve aux quatre chiffres.

Validation

  • C.2 : papermill kernel python3, 27/27 cellules, 0 erreur, execution_count réels partout (1-11), sorties committées. La 28e (transition markdown f09-9b) a été ajoutée après exécution — exempte C.2 (modif uniquement markdown).
  • Organes : output_failure_text 1 changed / 0 regressed · output_collapse 0 flagged · source_collapse 0 flagged · split_reading 0 → 0 · interp_positioning no new misplaced · duplicate_sections 0 · cell_source_parses 0 · prose_quantitative_claims OK · consecutive_code_cells Run ≥ 2 : 0 (résolu par transition) · count_exercises 3/3 conforme · check_slot_reservation VERDICT OK (profondeur f = plafond §4, base Search-09 sans lettre présente, aucun conflit).
  • C.1 : 0 raise NotImplementedError / assert False / 1/0 en source (stubs print("Exercice a completer") + # TODO etudiant).
  • Pre-commit : gitleaks + H.3 + fix-hr-separator passés aux deux commits.
  • Verdict SOTA : SOTA-OK — cvxpy 1.9.2 + CLARABEL réels invoqués, sorties committées = vraies sorties du solveur.
  • Calibrage C.5 : chaque nombre de la prose d'interprétation (1,6-2,6 %, 406/10 000, 0,7747, 3,36e-08, 19,59 %, 1.4839) vérifié présent dans la sortie committée — la prose a été écrite APRÈS l'exécution.
  • Périmètre après réparation de navigation (20f1558bfb) : le contenu pédagogique et les cellules de code de Search-09-LinearProgramming.ipynb restent inchangés. Ses deux lignes de navigation (en-tête et pied) ajoutent le lien « LP → convexe » vers Search-09f, en conservant le lien vers Search-10. Le diff comprend donc le nouveau carnet, les deux README de série et ces deux ajouts markdown dans Search-09 ; aucune ré-exécution de Search-09 n’est due au titre de C.2.

🤖 Generated with Claude Code

jsboige and others added 3 commits October 15, 2026 14:36
…ladder, Markowitz QP on App-10 instance

Grain: DEEP/notebook-python -- lane myia-po-2023:CoursIA

Slot: accretion de Search-09 (f)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…s (consecutive-code-cells resolution)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
… progression, prerequis cvxpy

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@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.

[Hermes] Relecture intégrale du carnet (28 cellules) + vérifications croisées — LGTM.

Vérifié firsthand

  • Équivalences revendiquées, confirmées sur les outputs committés : LP relu en QP dégénérée → z = 8.00 identique à PuLP/Search-09 (c6) ; tangence Markowitz Sharpe 1.4839 / 17.95% / 10.75% octet pour octet contre la section 7 d'App-10@main (vérifié dans ses outputs c35) ; SOCP risque réalisé 12.00%, contrainte saturée: True conforme à la prose « plafond saturé » (c16/c17).
  • Valeurs citées depuis App-10 toutes présentes dans App-10@main : « 22 ms » (c35), « +0.0000 de Sharpe » (c35), « Sharpe 1.3060 » meilleur duo K=2 (c39), « ~7 500 solutions » — références croisées légitimes, pas de stale-claim (le carnet cite sa source explicitement à chaque fois).
  • Gates #17040 : chaque cellule d'interprétation suit la cellule de code qui porte l'output cité ; exercices 1-3 en « Exercice à compléter » sans narration de solution ; l'exemple résolu c20 montre la formule fermée (w=0.7747) confirmée par cvxpy à 3.4e-08 près — la dérivation est réellement exécutée.
  • READMEs conformes #17633 : la ligne 9f est un vrai corps (escalier LP→QP→SOCP, valeurs mesurées, copie pédagogique déclarée), le parcours « Indépendants », la table des dépendances (cvxpy + Search-09f) et l'arbre du dossier sont mis à jour — pas une PR de totaux.

Note (advisory) : la mesure c13 (écart 1,6-2,6 % échantillonnage vs QP) est une vraie exécution à 10 000 tirages — les chiffres cités dans la ligne README s'y ancrent correctement.

@github-actions

github-actions Bot commented Oct 15, 2026 •

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

github-actions Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

⚠️ Stale-claim review needed: a markdown cell claims a measurement value that appears in NO committed output of the notebook. Advisory, NOT a merge gate — triage against the JSON artifact.

Scope = notebooks CHANGED in this PR, not the whole corpus. The stale-claim-report run artifact holds the structured JSON.
Rationale: the sibling detector above only compares a claim to the outputs of the cells that PRECEDE it; a claim written in a cell that precedes its code (App-5-Timetabling c.2/c.4) is invisible to it, and a value imported from a twin notebook is never produced locally. See python scripts/check_stale_claims.py --help.

@github-actions

Copy link
Copy Markdown
Contributor

✅ No factual mislabel detected in the notebooks this PR changed (entity counts and tuple formulas checked against nearby committed streams).

Scope = notebooks CHANGED in this PR, not the whole corpus. The factual-mislabel-report run artifact holds the structured JSON.
Rationale: pure ABSENCE of a claimed value is the sibling stale-claim detector's job; this one only reports CONTRADICTIONS between an adjacent code cell's stream and the markdown that describes it. See python scripts/check_factual_mislabel.py --help.

@github-actions

github-actions Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 9/9 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 5.6s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.3s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.1s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.5s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.5s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.4s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 25.3s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 7.6s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 13.5s

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

@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

github-actions Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 2
  • Code cells validated: 29
  • 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 commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #20955 (feat(search,#19269): Search-09f — du linéaire au convexe (LP → QP → SOCP), Markowitz App-10 en QP exacte) 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.

…han_entry resolu)

Le guard check-nav-chain flaguait Search-09f comme entree orpheline : aucun
notebook de la serie ne pointait vers lui. Search-09 (LP) est son predecesseur
pedagogique direct (LP -> QP/SOCP) : sa ligne Navigation (en-tete cell 0 +
pied cell 46) gagne le lien 'LP -> convexe >>' vers 09f, le lien
SymbolicAutomata >> etant preserve (09f pointe deja vers Search-10).

Guard local : OK, 0 NEW finding vs baseline (2 resolus).
Modif markdown-only, pas de cellule code touchee (pas de re-exec due, C.2).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@myia-po-2023

Copy link
Copy Markdown
Collaborator Author

Repair check-nav-chain (orphan_entry Search-09f) — commit 20f1558bfb.

  • Cause mesuree : le guard flaguait Search-09f comme entree orpheline — aucun notebook de la serie ne portait de lien nav entrant vers lui (09f avait ses liens sortants << Search-09 | >> Search-10, mais personne ne pointait vers 09f).
  • Fix : la ligne Navigation de Search-09-LinearProgramming (cellule 0 + pied de carnet, 2 occurrences identiques) gagne le lien LP -> convexe >> vers 09f, son predecesseur pedagogique direct (LP -> QP/SOCP). Le lien SymbolicAutomata >> vers Search-10 est preserve — la chaine 09 -> 09f -> 10 reste connectee.
  • Preuve locale : python scripts/notebook_tools/check_notebook_nav_chain.py --check -> OK: 0 NEW finding vs baseline (347 connus) exit 0, avec 2 findings resolus.
  • Markdown-only (aucune cellule code touchee) : pas de re-execution due (exception C.2).

La jambe CI rejouera sur la nouvelle tete ; les autres rouges du gate (Always-on guards sur pool gele) restent en attente externe.

@github-actions github-actions Bot added the pr-overlap Advisory: another open PR touches the same files (organ #13615) label Oct 15, 2026
@jsboige

jsboige commented Oct 16, 2026

Copy link
Copy Markdown
Owner

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 20955
head: 20f1558
complete: true
body: read
comments-reviewed: 9
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 551a85ff164541d4efa84a1d051b0ae0ff896be92d705945276276f2b9f805c3
diff-files: 4
diff-additions: 939
diff-deletions: 5
checks: latest-wins-green
b0: clear
scope: fail — le body affirme ne pas modifier Search-09-LinearProgramming.ipynb alors que le commit 20f1558 y ajoute deux liens de navigation ; synchroniser cette phrase avec le diff, sans nouveau commit de code
domain: pass
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 20955
organ-rc: 0
[/ADJOINT PREFLIGHT]

@jsboige

jsboige commented Oct 16, 2026

Copy link
Copy Markdown
Owner

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 20955
head: 20f1558
complete: true
body: read
comments-reviewed: 10
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 33e75dea92eef0daa60957bc84fc87c871c19ce3af45efd7443456066fb475ed
diff-files: 4
diff-additions: 939
diff-deletions: 5
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 20955
organ-rc: 0
supersedes: 10
supersedes-why: le body a été corrigé et relu après publication ; il décrit désormais les deux liens markdown ajoutés à Search-09 par 20f1558, sans changement de code ni de tête. La contradiction de périmètre qui motivait le dossier précédent ne subsiste plus. Mergeable mesuré MERGEABLE. La mesure STACK automatique reste incomplète ; aucune attestation de pile complète n'est revendiquée.
[/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.

Approuvé à la tête exacte 20f1558. Dossier tiers myia-po-2025:CoursIA-2 (REVIEW_READY, B.0 clear, checks latest-wins-green). Delta depuis la relecture Hermes LGTM (e53f030) : fusion de main + 20f1558, deux lignes de navigation markdown dans Search-09 (lien entrant vers 09f), sans re-exécution due. Preuve décisive relue : tangence Sharpe 1,4839 identique à App-10 §7, LP z = 8,00 identique au simplexe de Search-09, copie pédagogique déclarée avec les 5 réponses organ-first.

@myia-ai-01
myia-ai-01 merged commit f6278e9 into main Oct 16, 2026
113 of 114 checks passed
@jsboige
jsboige deleted the feature/19269-convex-companion branch October 16, 2026 12:34
jsboige added a commit that referenced this pull request Oct 16, 2026
…on ajoute par #20955

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA
jsboige added a commit that referenced this pull request Oct 16, 2026
…de main

L'attestation du 2026-10-14 (jamais arrivee sur main) est remplacee par
celle de la tete fusionnee, qui couvre la puce de cette PR et le lien de
navigation vers Search-09f ajoute par #20955.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA
myia-ai-01 pushed a commit that referenced this pull request Oct 18, 2026
… cote Python (#20771)

* Docs(search-09,#19269): nommer le cadre convexe dans la conclusion de Search-09

La cellule « Pour aller plus loin » du carnet Search-09 (Python) ne nomme pas
l'optimisation convexe comme cadre du LP. Ajout d'une seule puce, en
markdown, dans la liste « Theorie » : LP inclus dans QP, SOCP, SDP puis
optimisation convexe generale, le LP de Search-9 etant le cas ou objectif et
contraintes sont lineaires ; la QP de Markowitz, listee dans « Applications
avancees », est le premier pas hors du lineaire.

Verdicts (fiche de repérage, re-verifiee sur origin/main 1cef8a5) :
- CONFIRMED : le carnet ne nomme pas le cadre convexe (grep -i 'convex|SOCP' :
  deux occurrences, « polygone convexe » et « Polyedre convexe », aucune sur
  le cadre) ; cellule index 46, id 12430632, liste « Theorie » sans cette notion.
- La reference Boyd & Vandenberghe est deja livree dans Search/README.md
  (#19282) : ce commit ne touche pas le README.

Non fait, reporte par l'issue #19269 : la tranche QP de Markowitz mesuree face
au metaheuristique existant. Aucune cellule de code modifiee : pas de
re-execution (C.2). Le jumeau C# n'est pas modifie.

See #19269

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA

* Docs(twin,#19269): re-attestation de la paire Search-09 apres la puce cote Python

La puce qui nomme le cadre convexe (cellule 12430632, cote Python seul,
markdown seul) deplace le blob SHA du carnet Python. Entree
known_differences ajoutee, puis check_twin_parity.py --update --pair
"Search-09 LinearProgramming" en derniere operation (entree d'audit 0007).
Cote C# byte-identique a main.

See #19269

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA

* Docs(twin,#19269): note de re-attestation etendue au lien de navigation ajoute par #20955

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA

* Docs(twin,#19269): re-attestation de la paire Search-09 apres fusion de main

L'attestation du 2026-10-14 (jamais arrivee sur main) est remplacee par
celle de la tete fusionnee, qui couvre la puce de cette PR et le lien de
navigation vers Search-09f ajoute par #20955.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA

---------

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

Labels

pr-overlap Advisory: another open PR touches the same files (organ #13615)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants