Skip to content

fix(probas,#14122): DecInfer — purge CS1701 famille A (DisplayAs) + graine Rand d'Infer.NET - #17513

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/14122-decinfer-cs1701
Sep 23, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/14122-decinfer-cs1701

Conversation

@jsboige

@jsboige jsboige commented Sep 23, 2026

Copy link
Copy Markdown
Owner

Grain: MED/notebook-dotnet — lane myia-po-2025:CoursIA — prev: DEEP/qc #17509

Résumé

Purge des avertissements de compilation de la série Probas/DecisionTheory/DecInfer/ dans le cadre de l'EPIC #14122, sur 7 notebooks : 11 avertissements → 0 (10 CS1701, 1 CS0169), sans perte de rendu. La ré-exécution a mis au jour une dérive non seedée, corrigée à la source, et deux sorties périmées de main.

See #14122

Classification par instance (grille #14122)

Classe Instances Traitement
1. Bruit d'infrastructure 10 × CS1701 (Microsoft.AspNetCore.Html.Abstractions 2.2 contre 8.0), émis par Microsoft.DotNet.Interactive quand display(HTML(x)) lie IHtmlContent x.DisplayAs("text/html"), qui rend le même HTML sans lier ce type (famille A, recette de #14394 / #14399 / #14401), puis ré-exécution
2. Correctif causal 1 × CS0169 (DecInfer-07 cell 6 : champ _utilities déclaré, jamais lu) champ retiré
3. Signal pédagogique aucun —

#pragma warning disable est inerte ici : CS1701 est émis à la résolution de la référence, pas dans le code de la cellule.

Avant / après

Notebook Sites DisplayAs Avertissements Graphes SVG (nœuds, arêtes)
DecInfer-01 2 CS1701 2 → 0 cells 21 et 36 : (8, 7), conservés
DecInfer-03 1 CS1701 1 → 0 cell 46 : (5, 4), conservé
DecInfer-04 1 CS1701 1 → 0 cell 48 : (5, 4), conservé
DecInfer-05 3 CS1701 3 → 0 cells 36 et 42 : (8, 7) ; cell 52 : (4, 3), conservés
DecInfer-07 1 CS1701 1 → 0, CS0169 1 → 0 cell 34 : aucun → (4, 3), voir ci-dessous
DecInfer-08 1 CS1701 1 → 0 cell 45 : (10, 9), conservé
DecInfer-10 1 CS1701 1 → 0 cell 9 : (5, 4), conservé

Sur les 7 notebooks : 0 erreur, 0 execution_count nul, séquences d'exécution continues. Nombre de cellules, et sources markdown hors des 4 cellules réalignées ci-dessous, identiques à main.

Diagnostic dérive

Cause (e) : stochasticité non seedée. Gaussian.Sample() (DecInfer-04) et Beta.Sample() (DecInfer-10) tirent dans Microsoft.ML.Probabilistic.Math.Rand, le générateur global d'Infer.NET. Les graines posées par l'auteur sur System.Random n'y arrivent jamais. La preuve se lit dans les sorties, sur un même code :

Sortie main ré-exécution sans graine graine, exécution 1 graine, exécution 2
E[U(A)] / E[U(B)] (04 cell 39) 0,5084 / 0,4861 0,5072 / 0,4830 0,5101 / 0,4884 0,5101 / 0,4884
Regret Thompson (10 cell 22) 6,1 7,8 6,1 6,1
Regret epsilon-greedy / UCB1 (10 cell 22) 17,5 / 19,3 17,5 / 19,3 17,5 / 19,3 17,5 / 19,3
Tirages par bras (10 cell 19) [7, 28, 165] [3, 9, 188] [4, 7, 189] [4, 7, 189]

Les baselines, qui tirent dans System.Random, ne bougent jamais. Tout ce qui passe par Infer.NET bouge, et la prose de 04 cell 40 était déjà désalignée sur main (0.5100 et 0.4852 contre 0,5084 et 0,4861 en sortie).

Correctif : Rand.Restart(seed) à côté de chaque graine existante (04 cell 39 : 42, qui remplace un new Random(42) jamais utilisé ; 10 cells 19, 22 et 26 : 7, 100 + run et 11). Deux exécutions successives rendent des sorties identiques. Les seules différences entre elles sont le port du bandeau probeAddresses, retiré ensuite, les noms horodatés des fichiers .gv et les durées de la cell 16, qui sont des temps réels.

Prose réalignée sur la sortie seedée, en markdown seul et après exécution :

  • 04 cell 40 : table E[U], écart 4.3 % (4.9 % auparavant), et une note sur le bruit Monte Carlo : une autre graine déplace chaque E[U] de quelques millièmes, bien moins que l'écart de 0.02 entre les projets.
  • 10 cell 20 : trace du run réécrite. La version de main décrivait déjà mal le pas 1 (« bras 2 sort à 0,67 »).
  • 10 cell 27 : P(meilleur) et posteriors. S'y ajoute une lecture d'un fait visible dans la sortie : le bras 1 (moyenne 0,25) a une P(meilleur) supérieure à celle du bras 2 (moyenne 0,40), car son posterior Beta(1,3) est plus large que Beta(4,6). L'ordre a été vérifié hors notebook sur 2 millions d'échantillons : ≈ 0,009 contre ≈ 0,005.
  • 10 cell 17 : le seuil « >10000× » devient « de l'ordre de 10⁴× ». Le rapport compilation / re-inférence a valu 8009×, 7953× et 10763× sur trois exécutions de cette machine, et 11243× sur main : ce seuil ne se lit pas de façon stable. Deux renvois de position faux sont corrigés au passage : « cellule suivante » et « juste en dessous » désignaient le §4.1, qui est au-dessus.

Verdict : CAUSE_FIXED.

Autres effets de la ré-exécution

  • DecInfer-07 cell 34 : main y portait le bandeau d'échec « Aucun fichier .gv trouve », sous une cell 35 qui décrit « le graphe de facteurs ci-dessus ». La ré-exécution rend le graphe réel (4 nœuds, 3 arêtes).
  • DecInfer-01 cell 28 : la sortie de main annonçait « Exercice 3 » alors que la source dit « Exercice 2 ». La sortie est désormais conforme.
  • DecInfer-07 : les sorties non accentuées de main sont remplacées par celles, accentuées, de la source actuelle.
  • 01, 03, 05, 10 : le <div> de chargement de dotnet-interactive apparaît dans la cellule #r. C'est la sortie normale du noyau ; main le porte déjà dans 07 et 08.
  • DecInfer-04 : main stockait chaque flux sous forme de chaîne unique. Papermill écrit la forme canonique nbformat, une liste de lignes, ce qui explique l'essentiel des lignes de diff de ce notebook, à contenu identique.

Validation

  • Exécution Papermill, noyau .net-csharp, --cwd sur le dossier de la série, Graphviz 14.1.5 dans le PATH : rc=0 sur les 7 notebooks.
  • strip_probe_banner.py --apply et scrub_papermill_paths.py --apply passés après exécution. scrub_papermill_paths.py --outputs --scan : 0 fuite de chemin.
  • validate_pr_notebooks.py origin/main : 7/7 PASS, 118 cellules de code.
  • check_output_failure_text.py : 0 régression. check_output_collapse.py et check_source_collapse.py : 0 signalement.
  • grep -E "raise NotImplementedError|assert False|1/0" : 0 sur les 7 notebooks.
  • Verdict SOTA : SOTA-OK, vrai moteur Infer.NET 0.4.2504.701 et vrai rendu Graphviz. Aucune sortie éditée à la main.

🤖 Generated with Claude Code

…raine Rand d'Infer.NET

CS1701 (AspNetCore.Html.Abstractions 2.2 vs 8.0) est emis par
Microsoft.DotNet.Interactive quand display(HTML(x)) lie IHtmlContent :
x.DisplayAs("text/html") rend le meme SVG sans lier ce type. 10 sites
sur 7 notebooks (01, 03, 04, 05, 07, 08, 10), 10 avertissements -> 0.
DecInfer-07 : champ _utilities jamais lu retire (CS0169 -> 0).

La re-execution a mis au jour une derive non seedee : Gaussian.Sample()
et Beta.Sample() tirent dans Microsoft.ML.Probabilistic.Math.Rand, pas
dans le System.Random seede par l'auteur. Rand.Restart(seed) rend 04 et
10 deterministes (deux executions identiques) ; la prose de 04 cell 40,
10 cells 17/20/27 est realignee sur les sorties.

Effets de la re-execution : DecInfer-07 cell 34 rend enfin son graphe
(main portait « Aucun fichier .gv trouve » sous une prose qui le decrit) ;
DecInfer-01 cell 28 affiche « Exercice 2 » conforme a la source.

See #14122

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

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

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

Golden-Set Execution (H.7 P3)

✅ 8/8 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 3.2s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.5s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.2s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 3.9s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.0s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.1s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 18.7s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.3s

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

@github-actions github-actions Bot added the consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) label Sep 23, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 7
  • Code cells validated: 118
  • 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.

[Hermes] VERDICT: APPROVE — head 1c0cf2d8 (clusterManager-Myia, non-auteur)

Full read des 7 notebooks DecInfer au head (extraction complète + vue structurelle, pas diff-only). Vérifications exécutées :

Purge vérifiée : 0 warning CS1701/CS0169 résiduel sur les 7 fichiers ; 0 display(HTML( restant ; exactement 10 sites DisplayAs (2+1+1+3+1+1+1) comme annoncé au body ; champ _utilities retiré de DecInfer-07.

Correctif causal validé : Rand.Restart présent aux 4 sites annoncés (04 cell 39 : 42 ; 10 cells 19/22/26 : 7, 100+run, 11). Le diagnostic (Infer.NET Rand global vs System.Random local) est la bonne cause — les baselines System.Random ne bougent pas dans le tableau comparatif du body, cohérent.

Ancrages prose↔outputs (critère 2 #17040), tous exacts :

  • 04 : table E[U] MD40 (0.5101/0.4884) = outputs cell 39 verbatim ; note bruit Monte Carlo cite la graine réelle du code ;
  • 10 : trace MD20 ↔ output cell 19 ([4, 7, 189]) ; MD23 (6,1 / 17,5 / 19,3) = output cell 22 verbatim ;
  • 07 : SVG factor-graph cell 34 bien présent inline (~4 KB), le graphe promis au body est rendu.

Gates #17040 structurels : 7/7 propres (0 header dupliqué, 0 prose empilée) ; organes corroborants dans le périmètre (H.4 outputs PASS 118 cells, golden-set 8/8 — couvre bien les fichiers du PR).

Mineur (non bloquant) : MD40 dit « environ 4.3 % » — l'écart 0.0217 donne 4.25–4.44 % selon la base ; « environ » couvre, mais une base explicite éviterait l'ambiguïté.

@jsboige

jsboige commented Sep 23, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 17513
head: 1c0cf2d
complete: true
body: read
comments-reviewed: 5
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 741109fe1838465f93675865fa2f1447affa8dfa19f36c9f59d3490b109cb0d4
diff-files: 7
diff-additions: 4339
diff-deletions: 2558
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Motif READY. Lane myia-po-2025:CoursIA, tête 1c0cf2d.

Structure mesurée sur les 7 notebooks à la tête :

  • même nombre de cellules que main pour chacun ;
  • execution_count continus de 1 à N (17, 22, 22, 17, 14, 14, 13 cellules code) ;
  • 0 sortie d'erreur ;
  • 0 occurrence de CS1701 ou CS0169 ;
  • 0 bandeau probeAddresses ;
  • 0 chemin machine.

Le périmètre du diff source correspond au body :

  • cellules code touchées : les 10 sites DisplayAs, 07 cell 6 (champ retiré) et les sites Rand.Restart (04 cell 39 ; 10 cells 19, 22, 26) ;
  • cellules markdown touchées : 04 cell 40 et 10 cells 17, 20, 27, et aucune autre.

J'ai vérifié à l'œil les ancrages prose/sortie :

  • 04 : la table E[U] de la cellule 40 (0.5101 / 0.4884) reprend mot pour mot la sortie de la cellule 39 ;
  • 10 cell 27 : 0,986 / 0,011 / 0,003 et les posteriors Beta(42,10), Beta(1,3), Beta(4,6) reprennent la sortie de la cellule 26. Les écarts-types cités (0,19 et 0,15) et les comptes de visites (2, 8, 50, pour 60 tirages) se recalculent depuis ces paramètres.

La lecture « bras 1 plus probablement meilleur que bras 2 » est donc portée par la sortie, pas plaquée. Le diagnostic C.4 (cause e, CAUSE_FIXED) est présent dans le body.

Hermes a approuvé à cette tête exacte (08:28Z). Sa remarque sur « environ 4.3 % » est notée non bloquante, et l'écart relatif de 0.0217 donne bien 4.25 à 4.44 % selon la base choisie. Checks : 0 rouge, 0 en vol, DWELL écoulé. B.0 rc=0.

@myia-ai-01
myia-ai-01 merged commit cb8269f into main Sep 23, 2026
89 of 94 checks passed
jsboige added a commit that referenced this pull request Sep 23, 2026
…raine Rand d'Infer.NET (#17513)

CS1701 (AspNetCore.Html.Abstractions 2.2 vs 8.0) est emis par
Microsoft.DotNet.Interactive quand display(HTML(x)) lie IHtmlContent :
x.DisplayAs("text/html") rend le meme SVG sans lier ce type. 10 sites
sur 7 notebooks (01, 03, 04, 05, 07, 08, 10), 10 avertissements -> 0.
DecInfer-07 : champ _utilities jamais lu retire (CS0169 -> 0).

La re-execution a mis au jour une derive non seedee : Gaussian.Sample()
et Beta.Sample() tirent dans Microsoft.ML.Probabilistic.Math.Rand, pas
dans le System.Random seede par l'auteur. Rand.Restart(seed) rend 04 et
10 deterministes (deux executions identiques) ; la prose de 04 cell 40,
10 cells 17/20/27 est realignee sur les sorties.

Effets de la re-execution : DecInfer-07 cell 34 rend enfin son graphe
(main portait « Aucun fichier .gv trouve » sous une prose qui le decrit) ;
DecInfer-01 cell 28 affiche « Exercice 2 » conforme a la source.

See #14122

Co-authored-by: Claude Opus 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

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants