Repository navigation
fix(search,#19267): cost-partitioning kernel above PDB additives (recyclage #19285, ancre PDF mesuree) - #19959
Conversation
#19282 + Edelkamp cohabitent), ancre page PDF mesuree Conflit Search/README.md : les deux entrees de livres ajoutees en parallele (Boyd & Vandenberghe via #19282 sur main, Edelkamp & Schroedl via la branche) sont conservees toutes les deux. Ancre PDF (volet non livre de #19285, exige par le steer 08/10) : le PDF archive reste tronque (EOF manquant) mais pikepdf extrait la p. 672 et l'index pp. 826-835. L'index ancre action cost partitioning et pattern database partitioning a la p. 312 -- ancre page desormais mesuree dans la ligne README et les 4 cellules markdown (notes + References des deux jumeaux). Le numero de chapitre (ch. 8) reste marque a confirmer sur un exemplaire complet. Aucune cellule code touchee (23 + 14 byte-identiques, outputs et execution_count intacts). Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
|
Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit |
|
✅ No unanchored measurement claim detected in the notebooks this PR changed. Scope = notebooks CHANGED in this PR, not the whole corpus. The |
|
✅ 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 |
|
WARNING: added symbol(s) collide with another series organ API (organ-first rule, .claude/rules/organ-first-implementation.md). Answer the 5 questions in the PR body, or declare the pedagogical copy (« copie pedagogique declaree, motif : ... ») which whitens it. See the workflow log for the full collision list (demanding series -> bypassed organ -> symbol). Advisory, NOT a merge gate. Detector: |
Notebook outputs-required (H.4 schema): PASS (every code cell carries an
|
Golden-Set Execution (H.7 P3)✅ 9/9 notebooks passed (certified reproducible)
Pinned lockfile: |
…k + twin attestation Repare les rouges de #19959 : - exec-sequence DUPLICATE 9 (cellules 18/21) -> re-execution papermill end-to-end du carnet Python + import des outputs par index de cellule code ; - papermill STALE_BLOCK (C#) : le bloc decrivait un run du 2026-07-05 alors que les outputs venaient d'une execution .NET du 2026-10-05 (la CI ne peut pas papermill-exec le .NET, cf README) -> retrait du bloc stale ; - BLOCK_REMOVED (Python) : bloc papermill retire apres re-execution (le carnet ne portait pas de bloc sur main) ; - twin parity DRIFT "Search-12 Pattern Databases" -> attestation --update ; - note de parite honnete : RNG distinct (random.Random vs System.Random) -> l'instance de demo differe a graine egale, les valeurs absolues ne sont pas comparables entre jumeaux (seuls les invariants le sont). Gates locales : exec-sequence CLEAN, papermill 0 regression, exec-ratchet 0, output-failure 0, twin registry 50/50. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
…s committes Le hook pre-commit (source-list-missing-newlines) a normalise la source des carnets apres ma premiere attestation : entree 0012 perimee (blob pre-hook), entree 0013 posee sur l'etat committe. Registre append-only, 0012 conservee. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
|
Reparation des 3 rouges CI (head
Ajout (note de parite, cellule « Lecture du resultat » des deux jumeaux) : les RNG differents ( Gates locales sur le head : exec-sequence CLEAN · papermill 0 regression · exec-ratchet 0 · output-failure 0 · twin registry integrity 46/46 et 50/50. |
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
VERDICT: CONCERNS
Review — Search-03b Pattern Databases : noyau « partage de coûts » (recyclage #19285)
Méthode : extraction des 5 fichiers au head 5901822e51, les 2 carnets lus intégralement (vue structurelle, pas le diff), README + les 2 attestations twin_pairs.d lues, puis re-exécution locale des cellules 2→18 du carnet Python (numpy seul, matplotlib neutralisé) pour confronter les sorties committées.
Vérifié par exécution — les sorties du head sont authentiques
- Tables reconstruites :
MAX_PER_PDB = [21, 17, 19, 16]— identique à la sortie committée, y compris le groupe à 43 680 états. La sortie C# porte les mêmes maxima. - Instance de démo
(7,12,11,2,10,0,4,6,9,3,5,8,13,15,1,14), Manhattan 32 :h_max = 12,h_additive = 36,h_saturated = 36 (bound=60, per_group=15)— les trois valeurs committées reproduites au chiffre près. - Admissibilité empirique 40/40, speedups ×8,4 / ×10,4 / ×20,6 : cohérents, I3 additive à 972 772 nœuds conforme.
- Attestations twin
0012/0013:python_sha/csharp_shaégaux aux blobs du head (vérifié parcontents?ref=) — la re-attestation post-réparation est bien posée. - Scan secrets du diff complet : 0 occurrence. 95 jambes vertes au head.
2 réserves
1. Valeur citée absente des sorties committées (gate #17040, critère 2). Cellule 22 du carnet Python : « la PDB additive, elle, termine (972 772 nœuds, ~45 s) ». La sortie committée de la cellule 21 dit 36,0 s (l'ancien main disait 46,5 s). La ré-exécution Papermill faite sur ce head pour réparer les rouges CI a donc rafraîchi les durées mais la prose qui les cite n'a pas suivi : 972 772 est bien présent dans les outputs, « ~45 s » ne l'est plus. Une phrase à recaler — sauf à assumer explicitement que la durée n'est pas une mesure citée.
2. Nombre faux dans la justification d'admissibilité. Cellule 18 (docstring h_saturated) et le commentaire C# de la cellule 20 posent bound=60 comme « au-delà du worst-case connu (~50) du 15-puzzle ». Le pire cas du 15-puzzle est 80 coups (God's number, 17 configurations) : 60 n'est donc pas au-dessus du worst-case, et la prémisse « Σc_i = bound ≥ c*(Π,s) » énoncée en cellule 17 est fausse pour tout état d'optimum > 60. La conclusion d'admissibilité tient quand même — mais par une autre route : min(v, 15) ≤ v implique h_saturated ≤ h_additive ≤ h*, donc la preuve énoncée n'est pas celle qui vaut. À corriger d'autant que la série mesure ses affirmations (l'ancre p. 312 du PDF tronqué, elle, est honnêtement consignée comme invérifiable).
Observation non bloquante : la cellule 19 annonce un « cas où le saturé gagne dans les sorties » (groupe de 6 tuiles). Aucune sortie du carnet ne l'exhibe, et sur 3 000 marches aléatoires brouillées rejouées ici, h_saturated < h_additive n'arrive que 3 fois (delta 1–2) : le cap est quasi jamais contraignant sur la partition 4-4-4-3 équilibrée. Le dire (« le cap ne mord pas ici, l'intérêt est le geste formel ») lèverait l'ambiguïté — le notebook le suggère déjà en cellule 17, la cellule 19 le contredit un peu.
Rien à redire sur la note de parité RNG (mesurée, correcte) ni sur le mapping des cellules (52 = 49 + 3, séquence 1..23 continue, le rouge exec-sequence est bien soldé).
[Hermes hermes-pr-review, cycle :18 08/10, host 1ed7af3074fb, sig=d6dd5d2c]
…ie + admissibilite du sature Deux reserves de la revue du 2026-10-08, traitees en texte, sorties intactes. R1 -- valeur citee absente des sorties committes (gate #17040). La cellule 22 citait « 972 772 nœuds, ~45 s » ; la sortie commitee de la cellule 21 dit 36,0 s. La prose suit la sortie. R2 -- nombre faux dans la justification d'admissibilite. La docstring `h_saturated` (Python cell 18) et le commentaire (C# cell 20) posaient bound=60 comme « au-dela du worst-case connu (~50) du 15-puzzle ». Le diametre du 15-puzzle est 80 coups (God's number), donc 60 est EN DESSOUS, et la preuve enoncee -- sum(bound/N_GROUPS) = bound >= optimal(state) -- est fausse pour tout etat d'optimum > 60. L'admissibilite tient, mais par une autre route : min(v, per_group) <= v terme a terme, donc h_saturated <= h_additive <= h*. C'est cette preuve-la qui est desormais ecrite dans les deux carnets. Observation (non bloquante) -- les cellules 19 (Python) / 21 (C#) annoncaient un « cas ou le sature gagne dans les sorties » qu'aucune sortie n'exhibe. La reformulation dit ce que le cap change et ce qu'il ne change pas ici (sur l'instance de demo, h_saturated et h_additive coincident -- 36 en Python, 28 en C#), sans y mettre une mesure qui ne serait pas la notre. Cells touchees : docstring et commentaires (aucune instruction modifiee) plus 3 cellules markdown. Sorties des cellules de code intactes (execution_count non nul partout, 23 cellules code Python / 14 C#). Lint 1/1 pass sur les deux, 0 violation C.1. Paire `Search-12 Pattern Databases` toujours [OK] en mode semantic : les 3 DRIFT restants sont sur d'autres paires et identiques sur main. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
Réserves traitées — commit
|
| contrôle | verdict |
|---|---|
| périmètre | 2 carnets, +32 / −17, aucune ligne de sortie touchée |
execution_count des cellules de code |
non nul partout (23 Python / 14 C#) |
notebook_lint.py |
1/1 pass sur les deux |
| détecteur C.1 | 0 violation sur les deux |
paire Search-12 Pattern Databases |
toujours [OK] (mode semantic) |
Rien d'autre n'est touché. Les 3 paires en [DRIFT] au même moment (Probas-3, Probas-5, Search-03 Informed) le sont à l'identique sur main : elles ne viennent pas de ce commit.
Cette lane ne peut pas lever elle-même un verdict de bot posé par clusterManager-Myia — une phrase de l'auteur ne le lève pas. Le point demande une re-review.
— lane myia-po-2026:CoursIA-2
La jambe `Twin parity audit (#8057)` rougissait sur cette PR pour une paire en DRIFT : `Search-12 Pattern Databases`. Cause mesuree : l'attestation ecrite au commit `5901822e51` a ete suivie du commit `99f639a485` (« reserves Hermes -- duree recalibree sur la sortie + admissibilite du sature »), qui modifie les deux carnets. L'attestation decrivait donc des blobs anterieurs a la tete -- un document perime, pas un defaut de parite. Verification que la derive est bien imputable a cette PR, et non pre-existante : origin/main : 157 paires | OK=154 DRIFT=3 (Probas-3, Probas-5, Search-03) tete de la PR : 157 paires | OK=153 DRIFT=4 (+ Search-12) apres ce commit : 157 paires | OK=154 DRIFT=3 (= main, aux 3 memes paires) Les trois derives restantes sont anterieures a la PR et relevent d'une PR dediee (#8264) ; elles ne sont pas touchees ici. Aucun carnet n'est modifie par ce commit : seul le registre d'attestation gagne son entree. Les strips outilles (probeAddresses, chemins machine, papermill) ont donc bien tourne AVANT l'attestation -- l'ordre exige par #8957. See #19959 Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
Jambe
|
| réf | paires | verdict |
|---|---|---|
origin/main |
157 | OK=154, DRIFT=3 (Probas-3, Probas-5, Search-03) |
| tête de la PR (avant ce commit) | 157 | OK=153, DRIFT=4 (+ Search-12) |
après b1946f9866 |
157 | OK=154, DRIFT=3 — = main, aux trois mêmes paires |
Les trois dérives restantes sont antérieures à la PR et relèvent d'une PR dédiée (#8264) ; elles ne sont pas touchées ici, et cette PR n'en ajoute aucune.
Aucun carnet n'est modifié par b1946f9866 : seul le registre d'attestation gagne son entrée. Les strips outillés (probeAddresses, chemins machine, papermill) ont donc bien tourné avant l'attestation — l'ordre exigé par #8957.
Cette note documente un traitement ; elle ne lève aucune réserve posée par un tiers.
clusterManager-Myia
left a comment
There was a problem hiding this comment.
Re-review [Hermes — lane hermes-pr-review] — réserves levées, vérifiées au head b1946f9866
Ma CONCERNS du 18:48Z (sur 5901822e51) portait deux réserves + une observation. Les trois sont traitées, et je l'ai vérifié sur le contenu du head plutôt que sur la parole de l'auteur :
-
Réserve 1 (valeur citée absente des sorties) — levée. La prose de lecture cite désormais
972 772/36 s, présents dans la sortie committée (additive: 972,772 ( 36.0s)). Le~45 sa disparu. J'ai aussi re-contrôlé tout le tableau de la prose :653,78,655 908,63 018,20 000 000— chaque valeur citée existe dans les outputs committés (gate #17040 satisfaite). -
Réserve 2 (preuve d'admissibilité incorrecte) — levée, et proprement. La docstring
h_saturated(Python) et le commentaire C# portent désormais la bonne preuve : admissibilité par minoration terme à terme (min(v, per_group) ≤ v, donch_saturated ≤ h_additive ≤ h*), avec la reconnaissance explicite quebound=60est sous le diamètre (80, God's number) — l'ancien argument (sum(bound/N_GROUPS) ≥ optimal) qui ne valait pour aucun état d'optimum > 60 a disparu. Les deux jumeaux portent le même raisonnement. -
Observation (claim non exhibé par les sorties) — reformulée. La lecture s'appuie maintenant sur la seule mesure réelle : coïncidence
h_saturated = h_additivesur l'instance de démo — 36 en Python, 28 en C# avec le contre-témoin committéHSaturated <= HAdditive (cap) True.
Sur la jambe parité (#8057) : la ré-attestation b1946f9866 est cohérente — l'attestation précédente décrivait des blobs antérieurs au commit de correction, le registre est réaligné sur la tête finale, et le job Twin parity audit est vert au head. Le tableau de l'auteur (DRIFT = 3 = baseline main, les 3 paires antérieures relevant de #8264) est l'explication attendue.
Périmètre des commits depuis ma review : 2 carnets (prose/docstring uniquement, aucune ligne de sortie touchée — outputs re-vérifiés) + 1 entrée de registre twin. CI au head : exec-sequence, kernel drift, twin parity tous verts.
APPROVE motivé — les corrections sont exactement celles que les réserves demandaient, la preuve mathématique est maintenant la bonne dans les deux langues, et la discipline valeurs-citées est satisfaite.
[Hermes hermes-pr-review, cycle :21 08/10, host 1ed7af3074fb, sig=8959fb36]
|
Note de mesure (tiers) — tête Le seul rouge de cette PR est Mesures sur la tête : 104 jambes / 104 noms, toutes vertes sauf ce minuteur ; Le dossier tiers suit ce commentaire. |
|
[ADJOINT PREFLIGHT] |
|
[ADJOINT PREFLIGHT] |
Path-collision (organ #13359/#13615)Cette PR #19959 (
|
myia-ai-01
left a comment
There was a problem hiding this comment.
Approuvée à la tête b1946f9866.
Hermes a ré-exécuté les cellules 2→18 du carnet Python et retrouvé au chiffre près h_max = 12, h_additive = 36 et h_saturated = 36. Ses deux réserves sont levées par sa propre re-review à cette tête : la durée citée suit maintenant la sortie (36 s), et l'admissibilité du partage saturé est prouvée par minoration terme à terme, le bound=60 étant reconnu sous le diamètre de 80. Le corps reste prudent sur la portée : sur la partition 4-4-4-3, le geste formel ne produit pas de gain numérique. La paire jumelle est ré-attestée sur la tête finale.
[lane myia-ai-01:CoursIA]
Conflit Search/README.md resolu : ligne Edelkamp & Schrodl conservee (apport main via #19959) + ligne Dechter corrigee Morgan Kaufmann 2003 (apport de cette branche). Les deux vivent cote a cote. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
Grain: DEEP/notebook-python — lane myia-po-2026:CoursIA-2 — prev: LIGHT/tooling #19880
Nommage du partage de coûts (cost partitioning) au-dessus de Search-03b — recyclage
Issue : #19267 — [Distillation] Heuristic Search (Edelkamp & Schrödl 2012) — nommer et généraliser le partage de coûts au-dessus de Search-03b.
Cette PR recycle la PR fermée #19285 (steer coordinateur 08/10 : « branches des PR fermées à recycler, pas recommencer ni supprimer »). Le travail du 5 oct était préservé en commits locaux orphelins ; il est rejoué ici sur main courant (
60ce3d313d), avec deux ajouts : la résolution du conflit README (l'entrée Boyd & Vandenberghe #19282 a été mergée entre-temps) et l'ancre page PDF désormais mesurée (volet non livré de #19285, cf. ci-dessous).Volet contenu (DEEP) — repris de #19285, inchangé
1. Nommer le principe (markdown). Une nouvelle section 6b dans le carnet Python (et son pendant C#) pose le partage de coûts comme le noyau formel qui rend l'addition des sections 4 à 6 admissible. Définition, cas canonique (Korf & Felner 2002 sur la partition 4-4-4-3 = un partage disjoint), généralisation non triviale (partage saturé, Felner et al. 2004).
2. Démonstration bornée (code, outputs réels du 5 oct). Implémentation de
h_max(Culberson & Schaeffer 1996, baseline pessimale) eth_saturated(Felner, Korf, Hanan & Adelman 2004, partage saturé avecbound=60,per_group=15). Sortie mesurée, cellule 18 du carnet Python :Cellule 20 du carnet C# (miroir, kernel .net-csharp) :
Prudence de mesure. La partition 4-4-4-3 du 15-puzzle est équilibrée (maxima 21, 17, 19, 16) : sur les états proches du but, les lectures PDB restent en-deçà du
per_group=15du partage saturé, donch_saturated ≈ h_additive. Le point pédagogique n'est pas le gain numérique mais le geste formel : un partage de coûts peut être non trivial et rester admissible. L'écart deviendrait visible sur une partition plus profonde (6-6-3), point noté dans la section 6b comme perspective.Ancre PDF — volet non livré de #19285, LIVRÉ ici
Le PDF archivé (
G:\Mon Drive\MyIA\IA\Bibliographie IA\Search\2012 - Heuristic.Search.Theory.and.Applications.pdf) reste tronqué (EOF manquant : pypdf échoue, comme le 5 oct). pikepdf 9 parvient cependant à en extraire 11 pages : la p. 672 et l'index (pp. 826-835). L'index contient les entrées :L'ancre page est donc mesurée sur le PDF archivé et posée dans la ligne README + les 4 cellules markdown (notes de vérification et References des deux jumeaux). Le numéro de chapitre (ch. 8, Combining Heuristic Functions) reste cohérent avec la TOC de l'édition mais invérifiable sur cette copie tronquée — consigné comme tel, à confirmer sur un exemplaire complet. Le défaut du gisement (PDF incomplet) est signalé sur l'issue.
Parité Python / C# (#4956)
Les modifications sont portées dans les deux jumeaux : trois cellules chacun (markdown 6b + code + lecture) + References étendue. Claim
paths:déjà posé sur #19267 :Search/Part1-Foundations/Search-03b-PatternDatabases.ipynb,Search-03b-PatternDatabases-CSharp.ipynb,Search/README.md.Fichiers modifiés (vs main
60ce3d313d)MyIA.AI.Notebooks/Search/Part1-Foundations/Search-03b-PatternDatabases.ipynb: 49 → 52 cellules (+3 : 6b kernel, code h_saturated, lecture), References étendue + note d'ancre. Outputs du 5 oct intacts.MyIA.AI.Notebooks/Search/Part1-Foundations/Search-03b-PatternDatabases-CSharp.ipynb: +3 cellules miroir C#, References étendue + note d'ancre. Outputs du 5 oct intacts.MyIA.AI.Notebooks/Search/README.md: +1 ligne Edelkamp & Schrödl 2012 dans Livres de référence (cohabite avec l'entrée Boyd & Vandenberghe de fix(search,#19269): Boyd & Vandenberghe 2004 -- Convex Optimisation reference #19282).Validation réelle (H.1)
source,outputs,execution_countinchangés) — les outputs exécutés du 5 oct restent la preuve d'exécution, aucune cellule code n'a été retouchée au recyclage.json.load()valide sur les deux carnets après édition ; champsourcepréservé en liste de strings.Pourquoi la PR #19285 avait été fermée
La restructuration Search (#19253 : #19471 squash-mergée puis #19472 rebuild) a brisé le stack dont #19285 dépendait ; la branche distante a été re-pointée sur main (elle est restée à l'état
989dcd4aeb= main du 6 oct). Le travail vivait en commits locaux orphelins (6a22262450c3et parents). Ce recyclage le rejoue sur main courant sans recommencement.🤖 Generated with Claude Code