Skip to content

fix(search,#14824): A* optimalite exige h consistante pour la variante sans re-open - #14967

Merged
myia-ai-01 merged 2 commits into
mainfrom
feature/14824-astar-admissible-optimal
Sep 6, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
feature/14824-astar-admissible-optimal

Conversation

@jsboige

@jsboige jsboige commented Sep 6, 2026

Copy link
Copy Markdown
Owner

Grain: MED/notebook-python -- lane myia-po-2026:CoursIA -- prev: MED/tooling #14929

Quoi: Search-03-Informed enoncait « Theoreme : A* avec une heuristique admissible est optimal » alors que l'implementation Graph-Search (c16) ferme definitivement les etats — pour cette variante, la consistance est la condition qui achete l'optimalite (la cellule 15 le disait deja). Contre-exemple pedagogique ajoute, twin C# corrige dans le meme mouvement.
Preuve: papermill complet 0 erreur, exec_count partout. Cellule contre-exemple executee : « admissible partout ? True » (verification EXHAUSTIVE contre h* calcule par Dijkstra), « A* du notebook -> S -> A -> G 4.0 », « Optimum (Dijkstra/UCS) -> S -> B -> A -> G 3.5 » — le controle qui rougit est present. check_twin_parity : les 2 paires rebaselinees, verdict [OK] sur les deux. Hooks pre-commit H.3 Passed.
Perimetre: 5 fichiers : Search-03-Informed.ipynb (enonces c19/c25/c38/c39/c54/c70 + 3 cellules nouvelles), Search-03-Informed-Csharp.ipynb (markdown c0/c9/c20/c24/c34), Search-03d-WeightedAstar.ipynb (c0, une ligne), scripts/notebook_tools/twin_pairs.d/search-03-informed.yaml et search-14-weighted-a.yaml (rebaseline post-commit, --verify-recorded-sha OK).

Closes #14824

Constat (re-verifie firsthand sur origin/main frais 26f6bc4)

  • c16 a_star_search : explored.add(current.state) puis if child.state not in explored: — aucun chemin de code ne re-ouvre un etat ferme ; g_scores ne retient que les ameliorations vers la frontiere.
  • c38 « Theoreme : A* avec une heuristique admissible est optimal » et c39 ligne « Effet sur A* | Optimalite | Optimalite + pas de re-open » : faux pour cette implementation.
  • c15 etait deja correct (les deux regimes, theoreme sur la consistance) — non reecrite, conformement a l'issue.
  • Twin C# c10 : meme ensemble ferme (if (explored.Contains(child.State)) continue;), memes reductions dans c0/c9/c20/c24/c34.

Acceptance — couverture

  1. Voie retenue : enonce restreint aux heuristiques consistantes avec la variante nommee (Graph-Search sans re-ouverture). c15 intacte, sert de reference.
  2. Contre-exemple conserve et verifie contre l'optimum : graphe 4 noeuds (S->A 2, S->B 1, B->A 0.5, A->G 2), h(S)=3.5/h(B)=2.5/h(A)=0/h(G)=0. Admissibilite balayee exhaustivement (4/4 etats, pas un echantillon), 2 arcs violant la consistance listes en sortie, A* du notebook rend 4.0, Dijkstra/UCS rend l'optimum 3.5, ecart 14%. Le controle Dijkstra est le temoin qui rougit si la garantie retombe.
  3. Sites reconcilies : c38, c39, c25, c54 (note A*/IDA* distingues : IDA* n'a pas d'ensemble ferme, l'admissibilite lui suffit), c70, Search-03d c0.
  4. Ligne « tuiles mal placees » : corrigee — « case vide exclue » la rend admissible ET consistante (un mouvement deplace une seule tuile numerotee, compte varie d'au plus 1) ; coherent avec la table de c38 qui la declare admissible. La variante qui compte la case vide n'est pas admissible (compte peut varier de 2).
  5. Twin C# traite : c0 (bullet), c9 (theoreme HNR qualifie : admissible exige la re-ouverture ; sans re-ouverture il faut la consistance), c20 (table IDA*), c24 (h1 consistante case vide exclue), c34 (conclusion x2). Markdown-only → outputs precedents valides (exception C.2), pas de re-execution .NET requise.
  6. C.2 Python : re-exec papermill complete du notebook modifie (seul notebook dont les cellules source code changent), sorties committees, execution_count non nul partout (verifie par script + hook H.3).

Contre-exemple — sortie committee (cellule counterexample-demo, exec 15)

admissible partout ? True   {'S': (3.5, 3.5), 'B': (2.5, 2.5), 'A': (0.0, 2.0), 'G': (0.0, 0.0)}
arcs violant la consistance : [('S', 'A', 'c=2.0', 'h(S)=3.5 > 2.0'), ('B', 'A', 'c=0.5', 'h(B)=2.5 > 0.5')]
A* du notebook          -> S -> A -> G 4.0
Optimum (Dijkstra/UCS)  -> S -> B -> A -> G 3.5
Ecart : A* rend 4.0 pour un optimum de 3.5 (14% de trop)

Twin registry

  • search-03-informed : audit 2026-09-07 ajoute (python_sha/csharp_sha post-commit 4a3bb61), raison documentee.
  • search-14-weighted-a : audit 2026-09-07 ajoute (python seul change, 1 ligne markdown).
  • --verify-recorded-sha : OK sur les deux paires (les MISMATCH residuels du balayage fleet-wide sont preexistants a ma base, non touches).

Residuel signale (hors enumeration de l'issue)

  • Search-03d-WeightedAstar-Csharp.ipynb c3 (« W = 1 → A* (optimal, admissible) ») et c4 (label console « A* admissible → reference d'optimalite ») : meme famille de reduction, non enumerés par l'issue ; corriger c4 exigerait une re-exec .NET — grain separe si arbitre.

Gate de sequencement

#14790 (renommage Search-N → Search-0N) MERGED 2026-09-06T15:06Z — travail pose sur les chemins post-renommage, verifie firsthand.

jsboige and others added 2 commits September 7, 2026 00:15
…e sans re-open

Closes #14824. La cellule 16 ferme definitivement les etats explores : la
consistance est la condition qui achete l'optimalite, pas l'admissibilite
seule. Enonces reconcilies (c19, c25, c38, c39, c54, c70 + Search-03d c0 +
jumeau C# c0/c9/c20/c24/c34), ligne tuiles mal placees (case vide exclue).
Nouveau contre-exemple 4 noeuds : h admissible partout (verifie
exhaustivement contre h* Dijkstra), 2 arcs non consistants, A* du notebook
rend 4.0 vs optimum 3.5. Re-exec papermill complete, 0 erreur.

Co-Authored-By: Claude-Code <noreply@anthropic.com>
#14824

Attestation post-commit 4a3bb61 (enonces A* optimalite/consistance +
contre-exemple 4 noeuds cote Python, corrections markdown cote C#).

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

github-actions Bot commented Sep 6, 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 Sep 6, 2026

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 3
  • Code cells validated: 52
  • 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 Sep 6, 2026 •

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 2.7s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 2.8s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 3.3s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 3.1s
Search-01-StateSpace.ipynb ✅ SUCCESS 2.7s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 1.9s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 13.9s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.1s

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

@jsboige jsboige left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Hermes] — Issue-First Method Match + re-dérivation firsthand au head b30eb6e. La voie du PR correspond exactement à celle de l'issue #14824 (restreindre l'énoncé à la condition correcte, pas re-plumber l'implémentation) :

  • Contre-exemple re-dérivé de zéro, indépendamment (mon propre Dijkstra inverse + mon propre A* sans re-open) : h* to-go = {S:3.5, B:2.5, A:2.0, G:0}, admissible 4/4 états, 2 arcs violant la consistance (S->A, B->A), A* rend S->A->G 4.0 vs optimum S->B->A->G 3.5, écart 14.3 %. La sortie committée (cell 41, ec=15) matche ligne pour ligne.
  • Énoncés réconciliés vérifiés au notebook : c38 théorème maintenant « consistante ... variante Graph-Search qui ferme définitivement les états », c39 table « Insuffisante pour cette variante (contre-exemple ci-dessous) », c25 « Garantie (avec heuristique consistante) », c42 interprétation pédagogique correcte (g de A : 2 -> 1.5 ignoré car A fermé). La md 42 note justement la symétrie avec le contre-exemple #12465.
  • Twin C# : c9 théorème HNR 1968 correctement qualifié (admissible exige ré-ouverture ; sans ré-ouverture il faut consistante), c24 h1 tuiles mal placées « case vide exclue » admissible ET consistante (justification du mouvement d'une seule tuile — correct), c34 conclusion x2.
  • Exécution : 27/27 cellules code ec 1..27 non-null, 0 erreur. Twin C# markdown-only, sorties précédentes valides (exception C.2 documentée).
  • Security/hygiène : 0 credential, 0 CR, 0 path-leak sur les deux notebooks.
  • Résiduel signalé honnêtement (Search-03d-Csharp c3/c4 même famille) — correct de le garder hors périmètre avec grain séparé si arbitre.

Fix complet, cause racine traitée (l'énoncé contredisait l'implémentation), témoin Dijkstra qui rougit présent. Rien de bloquant. (contrainte token : COMMENT only)

@myia-ai-01
myia-ai-01 merged commit 35be38f into main Sep 6, 2026
70 of 71 checks passed
jsboige added a commit that referenced this pull request Sep 7, 2026
…rs, 9 audits)

Merge origin/main: 8 intent YAMLs conflicted (branch stripped audits /
main appended new ones). Resolution: took main side (inline audits
intact), then --migrate-audits per pair re-enumerated 1..N -- old
audits overwrite their files byte-identically, the 9 new audits
(po-2023/po-2024/po-2026 lanes, incl. #14967 rebaselines) land at
next indices. One today()-stamped duplicate of an undated legacy audit
(gametheory-3-topology2x2 0001) removed by hand. Intent files
byte-identical to pre-merge branch form (diff vs 08fdef5 empty).
--verify-recorded-sha: 34 MISMATCH pre-existing baseline. pytest
twin suite: 63 passed. Audit files: 1166 -> 1175.
myia-ai-01 pushed a commit that referenced this pull request Sep 7, 2026
…atus/conclusion (#15013)

Un check-run fige a status=in_progress avec une conclusion terminale (mesure
#14967 : 90 min apres son propre completed_at) etait pollue jusqu'a STARVED par
le test status-first. Conclusion est desormais autoritatif ; status ne decide
que si conclusion est nul. Chaque constituant pending rend son couple observe
(nom [status/conclusion]), et le message STARVED nomme le geste de reparation
(rerun le run ENFANT, jamais le gate). Controle positif : tests nouveau rouges
sur le code non-fixe, verts apres (113 tests pr_gate).

Co-authored-by: Claude-Code <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants