Skip to content

fix(search,#19267): cost-partitioning kernel above PDB additives (Python + C#) - #19285

Closed
jsboige wants to merge 0 commit into
mainfrom
fix/19267-cost-partitioning
Closed

jsboige wants to merge 0 commit into
mainfrom
fix/19267-cost-partitioning

Conversation

@jsboige

@jsboige jsboige commented Oct 5, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python — lane myia-po-2026:CoursIA-2 — prev: LIGHT/docs #19282

Nommage du partage de coûts (cost partitioning) au-dessus de Search-03b

Issue : #19267 — [Distillation] Heuristic Search (Edelkamp & Schroedl 2012) — nommer et généraliser le partage de coûts au-dessus de Search-03b.

Le grain livre deux volets sur les trois que le body décrivait.

Volet contenu (DEEP) — fait

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). Ancré dans Edelkamp & Schrödl 2012, chapitre 8 (Combining Heuristic Functions).

2. Démonstration bornée (code). Implémentation de h_max (Culberson & Schaeffer 1996, baseline pessimale) et h_saturated (Felner, Korf, Hanan & Adelman 2004, partage saturé avec bound=60, per_group=15). Comparaison numérique sur l'instance de démo — résultat mesuré, cellule 18 du carnet Python :

Max par PDB : [21, 17, 19, 16]
Sur INST :  h_max        =  12
Sur INST :  h_additive   =  36
Sur INST :  h_saturated  =  36 (bound=60, per_group=15)
Vérif : h_max <= h_additive (toujours ?) True
Vérif : h_saturated <= h_additive (cap, toujours ?) True

Cellule 20 du carnet C# (miroir) :

Max par PDB : [21, 17, 19, 16]
Sur INST : HMax       =  11
Sur INST : HAdditive  =  28
Sur INST : HSaturated =  28 (per_group=15)
Vérif : HMax <= HAdditive (toujours ?) True
Vérif : HSaturated <= HAdditive (cap) True

3. Ancrage du livre dans la référence. Le PDF archivé à G:\Mon Drive\MyIA\IA\Bibliographie IA\Search\2012 - Heuristic.Search.Theory.and.Applications.pdf n'a pas pu être ouvert sur la machine worker (pypdf 6.16.2, EOF tronqué). L'ancrage chapitre/section est consistant avec la table des matières de l'édition mais l'ancrage page exact est flagé à vérifier quand le PDF sera lisible — c'est honnêtement consigné dans la cellule References, pas masqué.

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=15 du partage saturé, donc h_saturated ≈ h_additive. Le point pédagogique n'est pas le gain numérique (cf Prong B, grain DEEP) — c'est 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 avec maxima plus grands), point noté dans la section 6b comme perspective.

Volet références (LIGHT) — fait

La section Livres de référence du Search/README.md reçoit l'entrée Edelkamp & Schrödl 2012. Pas d'autre modification du README (PR #19282 ajoute Boyd & Vandenberghe 2004, en attente de merge — les deux entrées cohabitent sans conflit après leur merge).

Volet non livré et pourquoi

  • Ancrage par numéro de page dans le PDF : non livré car le PDF est illisible sur cette machine. Issue fille recommandée pour la rendre ouverte / nommée avant merge : À vérifier ancrage page Edelkamp & Schrödl 2012 ch. 8 §8. lorsque le PDF sera lisible (pypdf fix ou autre outil).
  • Gain visible de la saturation vs additive : sur la partition 4-4-4-3 équilibrée, l'écart est nul (la PDB ne sature jamais). Le point pédagogique tenu est la formalisation du kernel, pas le gain mesuré. Tranche optionnelle (LP post-hoc, partition non-disjointe) mentionnée dans le body [Distillation] Heuristic Search (Edelkamp & Schroedl 2012) -- nommer et generaliser le partage de couts au-dessus de Search-03b #19267 — non livrée ici.

Parité Python / C# (#4956)

Les modifications sont portées dans les deux jumeaux Python et C# : trois cellules (markdown + code + lecture) + References mise à jour. Claim paths: posté sur le ticket #19267 : Search/Part1-Foundations/Search-03b-PatternDatabases.ipynb, Search/Part1-Foundations/Search-03b-PatternDatabases-CSharp.ipynb, Search/README.md.

Fichiers modifiés

  • MyIA.AI.Notebooks/Search/Part1-Foundations/Search-03b-PatternDatabases.ipynb : +3 cellules (6b kernel, code h_saturated, lecture), References cellule 51 étendue. Outputs capturés sur cellule 18.
  • MyIA.AI.Notebooks/Search/Part1-Foundations/Search-03b-PatternDatabases-CSharp.ipynb : +3 cellules miroir C#, References cellule 38 étendue. Outputs capturés sur cellule 20 (kernel .net-csharp).
  • MyIA.AI.Notebooks/Search/README.md : +1 ligne Edelkamp & Schrödl 2012 dans la section Livres de référence.

Validation réelle (H.1)

  • Cellule Python 18 : exécutée localement, sortie capturée et persistée (cf outputs[0].text).
  • Cellule C# 20 : exécutée localement via kernel .net-csharp, sortie capturée et persistée (6 stream outputs).
  • Carnet Python entier non ré-exécuté via nbconvert (la cellule d'expérience I3 time-out à 180s sur le 20M limit de Manhattan — indépendant de cette PR).
  • Carnet C# entier non ré-exécuté (même raison : cellule I3 time-out).

Notes pour le reviewer

  • Ancrage page du PDF Edelkamp marqué à vérifier — pas un manque d'effort, c'est le résultat mesuré d'un PDF illisible sur la machine worker. Toute lecture du PDF sur une autre machine (po-2023 par exemple) peut resserrer cet ancrage en un follow-up.
  • L'écart h_saturated ≈ h_additive est attendu sur la partition équilibrée 4-4-4-3 — c'est la limite pédagogique du grain. Le suivi naturel est : implémenter une partition 6-6-3 asymétrique (ou post-hoc LP) qui rendrait le gain visible. Tranche optionnelle mentionnée dans le body [Distillation] Heuristic Search (Edelkamp & Schroedl 2012) -- nommer et generaliser le partage de couts au-dessus de Search-03b #19267 — non livrée ici (périmètre DEEP tenu, mais Prong B « gain visible dans la sortie » pas démontré sur ce carnet — cf limite pédagogique reconnue).
  • La saturation n'est pas un cas particulier — c'est une autre classe de partages de coûts (Korf & Holte 2004). Le gain sur 4-4-4-3 est dominé par additif canonique, ce qui est normal : la SOTA post-additive canonique exige soit LP (post-hoc, Korf & Holte 2004) soit des abstractions non-disjointes (hors build 2L pour ce carnet).

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

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: 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 5, 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 5, 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 5, 2026

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

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

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 2
  • Code cells validated: 37
  • 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 5, 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 4.4s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 5.0s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 5.5s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.9s
Search-01-StateSpace.ipynb ✅ SUCCESS 4.2s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.5s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 19.8s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 3.2s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 12.4s

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

@github-actions github-actions Bot added the large-pr-no-review PR > seuil sans review (ni bot ni humaine) -- retire quand une review arrive (#11232) label Oct 5, 2026
@github-actions

github-actions Bot commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

Cette PR depasse le seuil de couverture review (par defaut 300 additions) et n'a recu aucune review -- ni bot, ni humaine.

Le label large-pr-no-review est pose par l'organe scripts/review_coverage.py porte par l'issue #11232. Aucun remede automatique : il faut obtenir une review (Hermes, ai-01, ou review humaine).

Le label est retire au balayage suivant (quotidien) des qu'une review arrive -- dans reviews[] ou en commentaire de verdict -- ou que le diff passe sous le seuil. Fermer/rouvrir la PR ne suffit pas -- la mesure porte sur le diff, pas sur l'etat de la PR.

Seuil, historique et exceptions : cf. docs/reference/review-coverage-threshold.md.

@github-actions

github-actions Bot commented Oct 5, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #19285 (fix(search,#19267): cost-partitioning kernel above PDB additives (Python + C#)) 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.

@jsboige

jsboige commented Oct 6, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 19285
head: 6a22262
complete: true
body: read
comments-reviewed: 9
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 26bb2ca606f3c45dd4d1282c085fb861bbb1afd28ef3635be81615c2b74f7a75
diff-files: 3
diff-additions: 484
diff-deletions: 64
checks: blocked
b0: clear
scope: pass
domain: pass
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19285
organ-rc: 3
[/ADJOINT PREFLIGHT]

@jsboige jsboige closed this Oct 6, 2026
@jsboige
jsboige force-pushed the fix/19267-cost-partitioning branch from 3ce5c11 to 989dcd4 Compare October 6, 2026 22:47
myia-ai-01 pushed a commit that referenced this pull request Oct 9, 2026
…yclage #19285, ancre PDF mesuree) (#19959)

* fix(search,#19267): cost-partitioning kernel above PDB additives (Python + C#, See #4956)

* fix(search,#19267): reexecute Python (papermill) + drop stale C# block + 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>

* chore(twin-parity,#19959): attestation Search-12 alignee sur les blobs 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>

* fix(notebook,#19959): reserves Hermes -- duree recalibree sur la sortie + 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>

* chore(twin-parity,#19959): re-attestation Search-12 sur la tete finale

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>

---------

Co-authored-by: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

This branch was successfully deployed

1 active deployment
github-pages — 989dcd4a Deployed Oct 6, 2026 by myia-ai-01 via Deploy to GitHub Pages #13548
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

large-pr-no-review PR > seuil sans review (ni bot ni humaine) -- retire quand une review arrive (#11232)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants