Skip to content

fix(probas,#18545): DecPyMC-7 -- la comparaison VI/PI/RTDP mesure ses sweeps au lieu de les coder en dur - #19976

Merged
myia-ai-01 merged 2 commits into
mainfrom
fix/18545-decpymc7-measured-iterations
Oct 9, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
fix/18545-decpymc7-measured-iterations

Conversation

@jsboige

@jsboige jsboige commented Oct 8, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/notebook-python — lane myia-po-2023:CoursIA — prev: MED/refactor #19972

Ce que corrige la PR

Audit de la partition #18545 (tranche 5 — DecPyMC-7-Sequential.ipynb, seul notebook non coché de la checklist). Trois constats, tous vérifiés contre les sorties committées avant le fix :

1. La comparaison VI/PI/RTDP présentait des compteurs codés en dur comme des mesures. Dans measure_performance, les trois compteurs d'itérations étaient des littéraux ('iterations': 14, 3, n_trials) mêlés, dans les mêmes lignes d'affichage, à des valeurs réellement mesurées (temps, erreur) — la forme la plus trompeuse du défaut. Le tableau « Résultats quantitatifs » de la cellule markdown héritait de ces littéraux.

2. Le verdict « PI est le plus efficace … converger exactement » contredit sa propre mesure. La sortie montrait VI 0,52 ms / PI 1,33 ms (PI 2,6× plus lent) et une erreur PI de 4·10⁻⁴ (non nulle). La cause est structurelle : l'évaluation de politique de PI est tronquée à 50 balayages, et chaque sweep PI coûte jusqu'à 50 fois un sweep VI.

3. La synthèse finale reprenait ~14 / ~3 sans qualifier la grille où ils sont observés.

Le correctif

  • value_iteration et policy_iteration retournent désormais (V, policy, n_iterations) — patron déjà en place dans ce même carnet pour value_iteration_shaped (cellule §7, qui expose iters_shaped).
  • RTDP expose trials (et non iterations) ; la ligne du tableau rend « 100 trials ».
  • Les 11 sites d'appel suivent la signature, dont les trois lignes TODO d'exercice (# TODO etudiant : …).
  • La prose de la cellule de synthèse est réécrite : compteur par compteur, ce qui est déterministe (sweeps 14/3, erreur 4·10⁻⁴, couverture 63,6 %) reste cité ; les temps machine-dépendants ne sont pas recopiés dans la prose (ils changent à chaque exécution : 0,52 ms à l'origine, 0,96 puis 0,54 ms selon l'interpréteur — cf. la re-exécution 3.13 ci-dessous), la cellule renvoie à la colonne Temps du tableau mesuré.

Re-exécution sous canon 3.13 (kernel drift, commit c3ae90f14f)

La première re-exécution avait tourné sous l'interpréteur 3.12 par défaut (stamp 3.12.10), déclenchant le Kernel drift guard : le carnet porte 3.13.14 sur main et la série DecPyMC est majoritairement 3.13 (5/8 carnets). Re-exécution in-place sous C:/Python313 (pymc 6.0.1, arviz 1.1.0) : source byte-identique entre les deux exécutions, valeurs déterministes inchangées (sweeps 14/3, erreur 4·10⁻⁴, couverture 63,6 %), seuls outputs + stamp bougent.

Validation

Contrôle Résultat
Papermill re-exécution (kernel python3 = C:/Python313 : pymc 6.0.1, arviz 1.1.0, py 3.13.3) 72/72 cellules, 0 erreur, 0 execution_count nul, 0 sortie vide — durée ~104 s (commit c3ae90f14f)
Valeurs mesurées VI 14 sweeps / erreur 0 / couverture 100 % · PI 3 sweeps / erreur 4·10⁻⁴ · RTDP 100 trials / erreur 0,6342 / couverture 63,6 % — la prose corrigée coïncide
Voie rapide CI locale (fast_lane.py --dry-run) 39 gardes évalués, aucun bloquant en échec (dont H.4 schema, Output-failure/flood/collapse, Source-collapse, interp-positioning, nav-chain, prose-counts, twin-parity)
Pre-commit H.3 Passed
check_markdown_claims_output.py les 5 claim-check du §7 restent SUPPORTED ; unique finding inchangé (valeurs de l'énoncé d'exercice, préexistant)

Les 6 PNG produits par le carnet (vi_convergence_grid, reward_shaping_*, bandit_4strategies, arviz_trace_maintenance, posterior_predictive_maintenance) sont régénérés — ils sont non référencés hors du carnet et sont les sorties de l'exécution ci-dessus.

Résiduel constaté, hors périmètre de cette PR

  • Ordre §8 : la cellule « Interpretation des stratégies de bandits » (4 bras, ε-greedy vs UCB1) est séparée de sa cellule productrice par l'exercice 5 bras inséré entre les deux — un étudiant lit une interprétation d'une expérience qu'il ne voit plus au-dessus. Rapporté sur [Audit #17073] Série DecPyMC — partition Hermes #18545.
  • Organe check_markdown_claims_output.py : 60 findings sur la série DecPyMC, quasi tous faux positifs (énoncés d'exercices, dérivations LaTeX analytiques, constantes de domaine). Rapporté sur [Audit #17073] Série DecPyMC — partition Hermes #18545.

See #18545

🤖 Generated with Claude Code

… sweeps

La cellule `measure_performance` presentait trois compteurs d'iterations
litteraux (14, 3, 100) melanges, dans la meme ligne d'affichage, a des
valeurs reellement mesurees (temps, erreur). Le tableau de synthese
heritait de ces litteraux et les donnait pour des resultats.

`value_iteration` et `policy_iteration` retournent desormais leur nombre
de sweeps (patron deja en place dans `value_iteration_shaped`), RTDP
expose des trials et non des iterations, et les TODO d'exercice suivent
la signature.

La prose de la synthese est corrigee sur deux points que la mesure
contredit : PI n'est pas "le plus efficace" sur cette grille -- il est
plus lent en temps que VI, chaque sweep balayant jusqu'a 50 fois l'espace
d'etats -- et il ne converge pas "exactement" : l'evaluation de
politique tronquee a 50 balayages laisse un ecart residuel de 4e-4.

Re-execution papermill (72/72 cellules, 0 erreur) : 14 sweeps pour VI,
3 pour PI, ecart 4e-4, couverture RTDP 63,6 % -- la mesure confirme la
prose corrigee. Les 6 PNG produits par le carnet sont regeneres.

See #18545

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

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

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

@github-actions

github-actions Bot commented Oct 8, 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 8, 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

github-actions Bot commented Oct 8, 2026

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 8, 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

github-actions Bot commented Oct 8, 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 3.5s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 4.2s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.4s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.5s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.3s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.2s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 15.8s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.7s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 10.3s

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

Kernel drift guard rouge: la premiere re-exec avait stampe 3.12.10
(interpreteur 3.12 par defaut) alors que le carnet porte 3.13.14 sur
main et que la serie DecPyMC est majoritairement 3.13 (5/8). Re-exec
in-place sous C:/Python313 (pymc 6.0.1, arviz 1.1.0): 72/72, 0 erreur,
source byte-identique, valeurs deterministes inchangees (VI 14 sweeps /
PI 3 sweeps erreur 4e-4 / RTDP 100 trials couverture 63.6%).

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

jsboige commented Oct 8, 2026

Copy link
Copy Markdown
Owner Author

Rouge Kernel drift guard réparé — re-exécution sous canon de série 3.13 (c3ae90f14f).

La re-exécution initiale avait tourné sous l'interpréteur 3.12 par défaut (stamp 3.12.10), contre 3.13.14 sur main pour ce carnet et une série DecPyMC majoritairement 3.13 (5/8). Re-exécution in-place sous C:/Python313 (pymc 6.0.1, arviz 1.1.0) : 72/72, 0 erreur, source byte-identique entre les deux exécutions, valeurs déterministes inchangées (sweeps 14/3, erreur PI 4·10⁻⁴, couverture RTDP 63,6 %). Fast-lane locale re-derivée : 39 gardes, aucun bloquant en échec. Body mis à jour (identité d'exécution + note sur les temps machine-dépendants).

L'advisory Consecutive code cells rouge au tour précédent était mort au checkout runner (« remote did not send all necessary objects ») — pas un finding de contenu ; il rejoue sur la nouvelle tête.

@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 25
  • 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 consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) label Oct 8, 2026
@jsboige

jsboige commented Oct 8, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 19976
head: c3ae90f
complete: true
body: read
comments-reviewed: 8
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: a419a5d3244cfd4f16dd72cf08bbc7d708dd80f55e3da71705e35f94a0ab6c51
diff-files: 7
diff-additions: 464
diff-deletions: 437
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 19976
organ-rc: 0
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit 7371f2a into main Oct 9, 2026
96 of 115 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants