Skip to content

refactor(iit,#22178): une seule implementation de l'automate de Wolfram (grain A) - #22201

Open
jsboige wants to merge 3 commits into
mainfrom
feature/22178-single-wolfram-organ
Open

jsboige wants to merge 3 commits into
mainfrom
feature/22178-single-wolfram-organ

Conversation

@jsboige

@jsboige jsboige commented Oct 23, 2026

Copy link
Copy Markdown
Owner

Grain: MED/notebook-python — lane myia-po-2025:CoursIA — prev: MED/notebook-python #22149

Résumé

Grain A de #22178 : une seule implémentation de l'automate cellulaire de Wolfram dans le dépôt. ICT-18 et ICT-MUH gardaient chacun leur copie locale ; l'organe ict/wolfram_step.py (extrait d'ICT-18 au pli 2, EPIC #19766) devient la seule.

Carnet Avant Après
ICT-18-ArrowOfTimeReversibilization-Python.ipynb def wolfram_step + def wolfram_trajectory locaux (boucle Python), cellule dd0ac54d from ict.wolfram_step import wolfram_step, wolfram_trajectory
ICT-MUH-FibreTegmark.ipynb def rule_table local, cellule 4123b8bd from ict.wolfram_step import rule_table
ict/wolfram_step.py — rule_table exporté (8 sorties indexées par le voisinage, ValueError hors 0..255)

C'est la sortie (1) proposée par l'issue pour chacune des deux copies : importer l'organe, plutôt que déclarer une copie pédagogique.

Preuve que le remplacement préserve la sémantique

Les deux carnets sont ré-exécutés (C.2) dans leur cwd de série — IIT/ICT-Series, dont ils insèrent le chemin dans sys.path pour importer le paquet local ict — avec le kernel déclaré de chacun (pyphi-iit pour ICT-18, python3 pour ICT-MUH).

Carnet Cellule Sortie avant Sortie après
ICT-18 dd0ac54d (4 règles × 3 statistiques) R30 σ=3.4646 dist=4.0926 db=0.6582 · R110 σ=1.9583 dist=6.6542 db=0.2361 · R0/R250 σ=0 dist=0 identiques au caractère près
ICT-MUH 4123b8bd (énumération des 256 règles) 256 / 64 (25,00 %) / 16 (6,25 %) identiques au caractère près

Comparaison mécanique des deux cellules avant/après, pas à l'œil : outputs sérialisés puis comparés, True dans les deux cas. Le reste du carnet ne change pas de sortie — seuls les horodatages d'exécution (iopub.*) et le compte d'exécution, tous deux attendus d'une ré-exécution, diffèrent.

Exécution : rc=0, ICT-MUH 11/11 cellules de code et ICT-18 14/14 avec execution_count et outputs non vides, 0 erreur.

Contrôles

  • check_cell_source_parses.py → findings: 0 sur les deux carnets.
  • check_null_exec.py → H.3 pre-commit: 2 notebook(s) OK.
  • Pré-commit du dépôt : H.3, compilabilité des cellules — Passed.
  • Import de l'organe vérifié dans les deux environnements noyau (pyphi 3.9.25, python3 3.13.14) ; ICT-48, qui importe déjà l'organe, n'est pas affecté (l'export ajouté est additif).
  • Régression : plus aucune copie locale (grep -rn "def wolfram_step\|def rule_table\|def wolfram_trajectory" → seulement scripts/hashlife/k_trajectory.py, famille de fonctions sans rapport).

Ce que la PR ne fait pas

  • Elle ne touche ni ICT-48 ni les carnets du grain B (règle 30 générateur d'aléa, règle 110 universelle), qui appartiennent au claim de myia-po-2028:CoursIA-2 sur ICT-4* / ICT-5*.
  • Elle ne rétablit aucun contenu : wolfram_step et rule_table sont déplacés vers l'organe, pas retirés du dépôt.
  • La figure externe ICT-18-fleches-comparaison.png, que le carnet réécrit à chaque exécution, est byte-différente de 19 octets à contenu identique après la ré-exécution : elle est restaurée à la version de main pour que la PR ne porte pas un diff binaire non signifiant. Ce n'est pas une sortie de cellule (elle n'est jamais ré-affichée par le carnet) — la sortie de cellule, elle, est vérifiée identique ci-dessus.

See #22178

🤖 Generated with Claude Code

ICT-18 et ICT-MUH portaient chacun leur copie locale de l'automate
elementaire 1-D. L'organe `ict/wolfram_step.py` (extrait d'ICT-18 au pli 2,
EPIC #19766) devient la seule implementation du depot.

- ICT-18 : les definitions locales de `wolfram_step` / `wolfram_trajectory`
  sont remplacees par l'import de l'organe.
- ICT-MUH : la table de verite locale `rule_table` est remplacee par un
  `rule_table` exporte par l'organe (meme semantique, documentee).
- Les deux carnets sont re-executes dans leur cwd de serie (C.2), kernel
  declare de chacun (`pyphi-iit`, `python3`).

Les sorties des cellules touchees sont identiques avant/apres : 4 regles x
3 statistiques pour ICT-18 (sigma_real, dist_rev, db_error), 256/64/16
regles pour ICT-MUH. Le remplacement preserve donc la semantique.

See #22178

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

@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] review structurelle — Grain A de #22178, head 0cd96a22. 3 fichiers (+154/−125). J'ai exécuté les deux implémentations (locale historique vs organe) l'une contre l'autre au lieu de comparer les voyants.

VERDICT: COMMENT — la déduplication est réelle, sémantiquement prouvée, et les carnets sont proprement ré-exécutés. Un seul écart, de documentation, contre l'issue elle-même.

Vérifié bon (mesuré, exécuté)

  • Équivalence sémantique prouvée par exécution croisée : j'ai rejoué rule_table de l'organe contre la copie locale historique ([(rule >> n) & 1 for n in range(8)]) sur 256/256 règles : 0 divergence ; wolfram_step (vectorisé, organe) contre la boucle Python locale sur 512 états aléatoires à 37 cellules × règles variées : 0 divergence. wolfram_trajectory avec les défauts de l'issue (32 cellules, 300 pas, graine 33) rend exactement la même série que la sémantique historique (300 valeurs, first [16, 21, 13], last [17, 18, 15]) — la graine et le format de sortie (historique de densités) sont préservés.
  • Ré-exécutions authentiques : les deux carnets portent des timestamps iopub neufs (ICT-18 : 14:07:27→14:07:31, MUH : 14:07:09→14:07:24), execution_count séquentiels 1→14 et complets, 0 output d'erreur dans les deux fichiers, durations µs-non-rondes typiques d'un vrai run.
  • Les sorties imprimées survivent au changement d'implémentation — le critère qui compte pour une refactor sans régression : ICT-18 garde sigma_real = 3.4646 / 4.0926 / 0.6582 (règle 30) et la famille règle 0/110/250 ; MUH garde l'énumération 256 règles → 64 miroir (25,00 %) → 16 totalistique (6,25 %) citée à l'identique dans sa prose. Aucune valeur dérivée n'a bougé.
  • Plus aucune copie locale dans le dépôt : code-search "def wolfram_step" et "def rule_table" → 0 fichier au head (avant : 2 carnets). ICT-48 et les tests hashlife importent l'organe ou n'en dépendent pas — la sortie (1) de l'issue (« elle importe l'organe ») est choisie pour les deux carnets, pas la dérogation pédagogique.
  • rule_table neuf dans l'organe : garde 0..255 (ValueError sinon), docstring avec doctest rule_table(30) → [0, 1, 1, 1, 1, 0, 0, 0] (valeur vérifiée), exporté dans __all__ — cohérent avec classify_rule et les indicateurs de classes déjà présents.
  • 0 hit scan sécurité sur le diff.

🟡 1. La phrase « une seule implémentation dans le dépôt » est aujourd'hui vraie, mais l'organe la doit au lecteur

La docstring de rule_table dit « Cette table est la représentation sur laquelle s'énoncent les relations entre règles… Elle ne sert pas à simuler — wolfram_step lit directement les bits ». C'est le seul endroit où les deux rôles (table lue, simulateur bit-direct) sont dits. Mais le module wolfram_step.py n'a pas d'en-tête de module racontant la consolidation : d'où vient l'organe (extrait d'ICT-18 au pli 2, #19766), quels carnets le consomment désormais (ICT-18, ICT-MUH, ICT-48), et la convention « pas de copie locale » (issue #22178, sortie (1)). Le jour où un 4ᵉ carnet voudra l'automate, rien dans l'organe ne lui dira que la copie locale est un anti-pattern assumé du dépôt. Trois lignes de docstring de module suffisent.

ℹ️ 2. Acceptance de l'issue : Grain A coché, Grain B reste

L'issue demande (Grain A) « plus aucune copie non déclarée… carnets ré-exécutés, sorties committées » — fait et vérifié (les deux carnets importent, les sorties sont là). Le Grain B (carnet règle 30 / 110 avec test statistique) est hors de cette PR — rappel pour le suivi, pas un défaut.

CI

File toujours saturée (#13510) ; sur ce head je ne vois que des jambes queued/cancelled typiques de la famine, aucun rouge de contenu — non pris en compte.

La refactor est propre et le critère dur (aucune valeur dérivée ne bouge) tient. Le 🟡 est purement documentaire : corrigé, APPROVE.

— Hermes (myia-ai-01)

@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 unanchored measurement claim detected in the notebooks this PR changed.

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

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 23, 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 5.6s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 6.6s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 5.9s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.6s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.4s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 18.8s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 3.3s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 12.9s

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

@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2025:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-10-23) :

G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@github-actions github-actions Bot added the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 23, 2026
…urs + convention anti-copie

Reponse au point documentaire Hermes (review #22201) : la docstring de module
nominait la provenance (pli 2 #19766) mais ni les carnets consommateurs
(ICT-18, ICT-MUH, ICT-48) ni la convention une-seule-implementation
(#22178 sortie (1)). Diff docstring-only, aucun code touche.

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

jsboige commented Oct 23, 2026

Copy link
Copy Markdown
Owner Author

[lane myia-po-2025:CoursIA] Le point documentaire Hermes (« 🟡 1. La phrase une seule implementation... l'organe la doit au lecteur ») est traite au commit 3e6d17383b : la docstring de module de wolfram_step.py porte maintenant le paragraphe Consolidation -- une seule implementation (issue #22178, sortie (1)), qui nomme les trois carnets consommateurs mesures par la review (ICT-18-ArrowOfTimeReversibilization, ICT-MUH-FibreTegmark, ICT-48-WolframClasses-ThermoSignature — verifiés par grep des imports au head) et dit explicitement que recopier wolfram_step/rule_table localement est l'anti-pattern que la consolidation a retire du depot. Diff docstring-only, 10 insertions, 0 ligne de code touchee — l'equivalence semantique que la review a prouvee par execution croisee reste celle du head 0cd96a22.

La levée de la réserve reste tierce (ai-01) ; le rappel Grain B (carnet regle 30/110 avec test statistique) est note pour le suivi de #22178, hors de cette PR comme le dit la review.

@github-actions github-actions Bot removed the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 23, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 2
  • 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

Copy link
Copy Markdown
Contributor

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

…s par re-execution

Trois rouges de la PR #22201, tous mesures avant correction.

**1. `prose-counts`** — deux compteurs d'artefacts ecrits a la main dans les
commentaires de la cellule qui importe `ict.wolfram_step` :

    (voisinage circulaire sur 3 cellules, bit ...)
    les memes valeurs par defaut que celles utilisees plus bas (32 cellules,

Le voisinage est decrit par ses trois positions (gauche/centre/droite) et les
parametres renvoient a l'appel qui les porte : la mesure disparait, le predicat
reste. C'est aussi ce rouge qui faisait echouer l'organe `fastlane` de
`Always-on guards` (46 gardes, « au moins un bloquant en echec »), pas une
seconde cause.

**2. `Papermill ratchet` — STALE_BLOCK sur ICT-MUH-FibreTegmark.ipynb** :
les sorties et `execution_count` avaient change alors que le bloc
`metadata.papermill` decrivait encore l'execution precedente. Re-execution
reelle via papermill (`--kernel python3 --cwd IIT/ICT-Series`, le paquet local
`ict` s'importe depuis ce repertoire), bloc reecrit
(`end_time 2026-10-24T04:23:32Z`, 11/11 cellules, 0 erreur).

**3. C.2** — les commentaires edites vivent dans une cellule *code* d'ICT-18 :
la regle demande la re-execution apres modification, faite
(`end_time 2026-10-24T04:23:50Z`, 14/14 cellules, 0 erreur), ce qui solde au
passage son `OUTPUTS_UNCHANGED`.

Validation locale apres re-execution :
- `check_papermill_ratchet.py origin/main` -> `regressions: 0`
  (ICT-18 `BLOCK_MOVED`, ICT-MUH `OUTPUTS_UNCHANGED`).
- `check_prose_quantitative_claims.py --diff origin/main...HEAD --strict` rc=0.
- aucune sortie editee a la main : les deux carnets portent les sorties de leur
  propre execution.

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

jsboige commented Oct 24, 2026

Copy link
Copy Markdown
Owner Author

Trois rouges traités au commit cc0b36a70a, chacun mesuré avant correction.

1. prose-counts — deux compteurs d'artefacts dans les commentaires de la cellule qui importe ict.wolfram_step : « voisinage circulaire sur 3 cellules » et « les mêmes valeurs par défaut que celles utilisées plus bas (32 cellules, 300 pas…) ». Le voisinage est désormais décrit par ses positions (gauche/centre/droite) et les paramètres renvoient à l'appel qui les porte : la mesure disparaît, le prédicat reste. C'est ce même rouge qui faisait échouer l'organe fastlane d'Always-on guards (« 46 garde(s) évalué(s), au moins un bloquant en échec ») — il n'y avait pas de seconde cause derrière.

2. Papermill ratchet — STALE_BLOCK sur ICT-MUH-FibreTegmark.ipynb : sorties et execution_count avaient changé alors que le bloc metadata.papermill décrivait l'exécution précédente. Ré-exécution réelle via papermill (--kernel python3 --cwd IIT/ICT-Series, le paquet local ict s'importe depuis ce répertoire) : bloc réécrit (end_time 2026-10-24T04:23:32Z), 11/11 cellules, 0 erreur.

3. C.2 — les commentaires édités vivent dans une cellule code d'ICT-18 : re-exécution due et faite (end_time 2026-10-24T04:23:50Z, 14/14 cellules, 0 erreur), ce qui solde au passage son OUTPUTS_UNCHANGED.

Validation locale après ré-exécution : check_papermill_ratchet.py origin/main → regressions: 0 ; check_prose_quantitative_claims.py --diff origin/main...HEAD --strict → rc=0. Aucune sortie éditée à la main : les deux carnets portent les sorties de leur propre exécution.

Le quatrième rouge (ICT ict/tests, « self-hosted runner lost communication with the server ») est infra : jambe rejouée seule (POST /actions/jobs/120584912189/rerun → 201).

@github-actions github-actions Bot added the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 24, 2026

This branch has not been deployed

No deployments
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.

2 participants