From 1ba553e10c25ea7854eb8dd4c67ba609ee43c89e Mon Sep 17 00:00:00 2001 From: jsboige Date: Sat, 10 Oct 2026 14:29:57 +0200 Subject: [PATCH 1/3] Fix(notebooks,#20190): le strip probeAddresses retire l'enveloppe vide, plus seulement le bandeau Le strip laissait derriere lui une entree display_data a text/html vide quand le bandeau occupait tout l'output (forme chaine, et forme liste a un seul element) : il remplacait la valeur par "" au lieu de retirer l'output. Le residu etait permanent par construction -- sans bandeau, count_banner_lines rend 0, la boucle saute le carnet, et l'enveloppe n'est plus jamais revue. - strip_banner_in_place retire l'enveloppe vide qu'elle vient de creer, y compris celles heritees d'une version anterieure de l'outil (correctif auto-reparateur). Retrait textuel, comme le reste de l'organe : aucune re-serialisation JSON, les sorties voisines restent byte-identiques ; le saut de ligne et l'indentation sont consommes avec l'entree, sinon une ligne d'espaces resterait dans le tableau. - --scan-all --check compte desormais le residu (count_empty_envelopes) et echoue dessus : c'est la cecite qui a laisse 53 carnets en place. - Sweep des 53 carnets concernes (0 insertion / 371 suppressions, aucun sous-module). Temoin discriminant : --scan-all --check --exclude-submodules rc=1 avec 53 defauts sur la base, rc=0 apres le sweep. 32 tests de l'organe verts. Closes #20190 Co-Authored-By: Claude Haiku 4.5 (1M context) --- ...eTheory-02c-Travelers-Dilemma-CSharp.ipynb | 7 - .../GameTheory-04c-NashExistence-CSharp.ipynb | 7 - ...heory-10-ForwardInduction-SPE-CSharp.ipynb | 7 - ...eory-13c-Safe-Subgame-Solving-CSharp.ipynb | 7 - ...1-Arrow-Impossibility-Theorem-Csharp.ipynb | 7 - ...-Aspire-SemanticFleet-MultiConnector.ipynb | 7 - .../Semantic-fleet-Radix-PromptMatcher.ipynb | 7 - .../SemanticKernel/fort-boyard-csharp.ipynb | 7 - .../10d_TensorSharp_DotNet_Inference.ipynb | 7 - .../ML/ML.Net/ML-02-Data&Features.ipynb | 7 - .../ML/ML.Net/ML-07-Recommendation.ipynb | 7 - .../DecInfer-05-Decision-Networks.ipynb | 7 - .../DecInfer-06-Value-Information.ipynb | 7 - .../Infer-2b-Debugging-Bonnes-Pratiques.ipynb | 7 - .../Probas/Infer/Infer-3-Factor-Graphs.ipynb | 7 - .../Probas/Infer/Infer-8-TrueSkill.ipynb | 7 - .../Probas/Infer/Infer-9-Classification.ipynb | 7 - .../Search-02-Uninformed-CSharp.ipynb | 7 - .../Search-02b-NetworkX-CSharp.ipynb | 7 - .../Search-02c-QuikGraph.ipynb | 7 - .../Search-07-MCTS-And-Beyond-CSharp.ipynb | 7 - .../Search-11-Metaheuristics-CSharp.ipynb | 7 - .../CSP-6-Hybridization-CSharp.ipynb | 7 - .../MGS-02-Composition.ipynb | 7 - .../Part4-Metaheuristics/MGS-04-Islands.ipynb | 7 - .../MGS-06-Benchmarks.ipynb | 7 - .../Part4-Metaheuristics/MGS-07-TSP.ipynb | 7 - .../MGS-09-EverestRelief.ipynb | 7 - .../MGS-10-CenterBias.ipynb | 7 - .../MGS-19-MetropolisReinsertion.ipynb | 7 - .../MGS-vs-mealpy/MGS-22-MGS-vs-Mealpy.ipynb | 7 - ...S-23-DifferentialEvolution-vs-Mealpy.ipynb | 7 - .../MGS-24-SimulatedAnnealing-vs-Mealpy.ipynb | 7 - .../MGS-30-ScatterSearch-Decomposition.ipynb | 7 - .../Sudoku-01-Backtracking-CSharp.ipynb | 7 - .../Sudoku-02-DancingLinks-CSharp.ipynb | 7 - .../Sudoku/Sudoku-03-Genetic-CSharp.ipynb | 7 - .../Sudoku-04-SimulatedAnnealing-CSharp.ipynb | 7 - .../Sudoku/Sudoku-06-AIMA-CSP-CSharp.ipynb | 7 - .../Sudoku/Sudoku-07-Norvig-CSharp.ipynb | 7 - .../Sudoku-08-HumanStrategies-CSharp.ipynb | 7 - .../Sudoku-09-GraphColoring-CSharp.ipynb | 7 - .../Sudoku/Sudoku-10-ORTools-CSharp.ipynb | 7 - .../Sudoku/Sudoku-11-Choco-CSharp.ipynb | 7 - .../Sudoku-13-SymbolicAutomata-CSharp.ipynb | 7 - .../Sudoku/Sudoku-14-BDD-CSharp.ipynb | 7 - .../Sudoku/Sudoku-15-Infer-CSharp.ipynb | 7 - .../Planners-6-Domains-Csharp.ipynb | 7 - .../Planners-8-Temporal-Csharp.ipynb | 7 - .../06_Meal_Planner_Modelisation.ipynb | 7 - .../SL-2-KnowledgeBasedLearning-Csharp.ipynb | 7 - .../SL-3-RelevanceLearning-Csharp.ipynb | 7 - .../Socle-ExplorerPattern-Csharp.ipynb | 7 - scripts/notebook_tools/strip_probe_banner.py | 249 ++++++++++++++++-- .../tests/test_strip_probe_banner.py | 148 ++++++++++- 55 files changed, 360 insertions(+), 408 deletions(-) diff --git a/MyIA.AI.Notebooks/GameTheory/GameTheory-02c-Travelers-Dilemma-CSharp.ipynb b/MyIA.AI.Notebooks/GameTheory/GameTheory-02c-Travelers-Dilemma-CSharp.ipynb index ef41093329..9135949cd3 100644 --- a/MyIA.AI.Notebooks/GameTheory/GameTheory-02c-Travelers-Dilemma-CSharp.ipynb +++ b/MyIA.AI.Notebooks/GameTheory/GameTheory-02c-Travelers-Dilemma-CSharp.ipynb @@ -68,13 +68,6 @@ "metadata": {}, "execution_count": 1, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "stream", "name": "stdout", diff --git a/MyIA.AI.Notebooks/GameTheory/GameTheory-04c-NashExistence-CSharp.ipynb b/MyIA.AI.Notebooks/GameTheory/GameTheory-04c-NashExistence-CSharp.ipynb index 55c0734036..02b868f071 100644 --- a/MyIA.AI.Notebooks/GameTheory/GameTheory-04c-NashExistence-CSharp.ipynb +++ b/MyIA.AI.Notebooks/GameTheory/GameTheory-04c-NashExistence-CSharp.ipynb @@ -105,13 +105,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "stream", "name": "stdout", diff --git a/MyIA.AI.Notebooks/GameTheory/GameTheory-10-ForwardInduction-SPE-CSharp.ipynb b/MyIA.AI.Notebooks/GameTheory/GameTheory-10-ForwardInduction-SPE-CSharp.ipynb index 00718c7d60..1bacc0038a 100644 --- a/MyIA.AI.Notebooks/GameTheory/GameTheory-10-ForwardInduction-SPE-CSharp.ipynb +++ b/MyIA.AI.Notebooks/GameTheory/GameTheory-10-ForwardInduction-SPE-CSharp.ipynb @@ -74,13 +74,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "display_data", "data": { diff --git a/MyIA.AI.Notebooks/GameTheory/GameTheory-13c-Safe-Subgame-Solving-CSharp.ipynb b/MyIA.AI.Notebooks/GameTheory/GameTheory-13c-Safe-Subgame-Solving-CSharp.ipynb index 4f67b70656..1afcca8501 100644 --- a/MyIA.AI.Notebooks/GameTheory/GameTheory-13c-Safe-Subgame-Solving-CSharp.ipynb +++ b/MyIA.AI.Notebooks/GameTheory/GameTheory-13c-Safe-Subgame-Solving-CSharp.ipynb @@ -63,13 +63,6 @@ "execution_count": 1, "metadata": {}, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "stream", "name": "stdout", diff --git a/MyIA.AI.Notebooks/GameTheory/SocialChoice/01-Arrow-Impossibility-Theorem-Csharp.ipynb b/MyIA.AI.Notebooks/GameTheory/SocialChoice/01-Arrow-Impossibility-Theorem-Csharp.ipynb index 456bb5a52e..5a0ad594f1 100644 --- a/MyIA.AI.Notebooks/GameTheory/SocialChoice/01-Arrow-Impossibility-Theorem-Csharp.ipynb +++ b/MyIA.AI.Notebooks/GameTheory/SocialChoice/01-Arrow-Impossibility-Theorem-Csharp.ipynb @@ -100,13 +100,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "stream", "name": "stdout", diff --git a/MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Aspire/07-Aspire-SemanticFleet-MultiConnector.ipynb b/MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Aspire/07-Aspire-SemanticFleet-MultiConnector.ipynb index fbc3bf2cab..e2036cf99a 100644 --- a/MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Aspire/07-Aspire-SemanticFleet-MultiConnector.ipynb +++ b/MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Aspire/07-Aspire-SemanticFleet-MultiConnector.ipynb @@ -88,13 +88,6 @@ ], "execution_count": 1, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "display_data", "data": { diff --git a/MyIA.AI.Notebooks/GenAI/SemanticKernel/Semantic-fleet-Radix-PromptMatcher.ipynb b/MyIA.AI.Notebooks/GenAI/SemanticKernel/Semantic-fleet-Radix-PromptMatcher.ipynb index 441a17728b..f3ef17b19f 100644 --- a/MyIA.AI.Notebooks/GenAI/SemanticKernel/Semantic-fleet-Radix-PromptMatcher.ipynb +++ b/MyIA.AI.Notebooks/GenAI/SemanticKernel/Semantic-fleet-Radix-PromptMatcher.ipynb @@ -45,13 +45,6 @@ "metadata": {}, "execution_count": 1, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - } ], "source": [ "// L'organe reel : DLL construite depuis le sous-module semantic-fleet (tete 9df3603).\n", diff --git a/MyIA.AI.Notebooks/GenAI/SemanticKernel/fort-boyard-csharp.ipynb b/MyIA.AI.Notebooks/GenAI/SemanticKernel/fort-boyard-csharp.ipynb index ff6f285102..f639b4ffb5 100644 --- a/MyIA.AI.Notebooks/GenAI/SemanticKernel/fort-boyard-csharp.ipynb +++ b/MyIA.AI.Notebooks/GenAI/SemanticKernel/fort-boyard-csharp.ipynb @@ -26,13 +26,6 @@ } }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "display_data", "data": { diff --git a/MyIA.AI.Notebooks/GenAI/Texte/10d_TensorSharp_DotNet_Inference.ipynb b/MyIA.AI.Notebooks/GenAI/Texte/10d_TensorSharp_DotNet_Inference.ipynb index ec12cab336..4defec58a9 100644 --- a/MyIA.AI.Notebooks/GenAI/Texte/10d_TensorSharp_DotNet_Inference.ipynb +++ b/MyIA.AI.Notebooks/GenAI/Texte/10d_TensorSharp_DotNet_Inference.ipynb @@ -31,13 +31,6 @@ "id": "834f17fa", "metadata": {}, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "stream", "name": "stdout", diff --git a/MyIA.AI.Notebooks/ML/ML.Net/ML-02-Data&Features.ipynb b/MyIA.AI.Notebooks/ML/ML.Net/ML-02-Data&Features.ipynb index 1244980981..a3377a1a30 100644 --- a/MyIA.AI.Notebooks/ML/ML.Net/ML-02-Data&Features.ipynb +++ b/MyIA.AI.Notebooks/ML/ML.Net/ML-02-Data&Features.ipynb @@ -86,13 +86,6 @@ } }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "display_data", "data": { diff --git a/MyIA.AI.Notebooks/ML/ML.Net/ML-07-Recommendation.ipynb b/MyIA.AI.Notebooks/ML/ML.Net/ML-07-Recommendation.ipynb index 412db49aa1..27e462dc07 100644 --- a/MyIA.AI.Notebooks/ML/ML.Net/ML-07-Recommendation.ipynb +++ b/MyIA.AI.Notebooks/ML/ML.Net/ML-07-Recommendation.ipynb @@ -90,13 +90,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "display_data", "data": { diff --git a/MyIA.AI.Notebooks/Probas/DecisionTheory/DecInfer/DecInfer-05-Decision-Networks.ipynb b/MyIA.AI.Notebooks/Probas/DecisionTheory/DecInfer/DecInfer-05-Decision-Networks.ipynb index f25f8eea4e..3021e8d30d 100644 --- a/MyIA.AI.Notebooks/Probas/DecisionTheory/DecInfer/DecInfer-05-Decision-Networks.ipynb +++ b/MyIA.AI.Notebooks/Probas/DecisionTheory/DecInfer/DecInfer-05-Decision-Networks.ipynb @@ -89,13 +89,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "display_data", "data": { diff --git a/MyIA.AI.Notebooks/Probas/DecisionTheory/DecInfer/DecInfer-06-Value-Information.ipynb b/MyIA.AI.Notebooks/Probas/DecisionTheory/DecInfer/DecInfer-06-Value-Information.ipynb index d13d457007..dcb8cc6e85 100644 --- a/MyIA.AI.Notebooks/Probas/DecisionTheory/DecInfer/DecInfer-06-Value-Information.ipynb +++ b/MyIA.AI.Notebooks/Probas/DecisionTheory/DecInfer/DecInfer-06-Value-Information.ipynb @@ -72,13 +72,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "display_data", "data": { diff --git a/MyIA.AI.Notebooks/Probas/Infer/Infer-2b-Debugging-Bonnes-Pratiques.ipynb b/MyIA.AI.Notebooks/Probas/Infer/Infer-2b-Debugging-Bonnes-Pratiques.ipynb index f6bb9db7c5..b60b646b38 100644 --- a/MyIA.AI.Notebooks/Probas/Infer/Infer-2b-Debugging-Bonnes-Pratiques.ipynb +++ b/MyIA.AI.Notebooks/Probas/Infer/Infer-2b-Debugging-Bonnes-Pratiques.ipynb @@ -85,13 +85,6 @@ } }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "display_data", "data": { diff --git a/MyIA.AI.Notebooks/Probas/Infer/Infer-3-Factor-Graphs.ipynb b/MyIA.AI.Notebooks/Probas/Infer/Infer-3-Factor-Graphs.ipynb index 0ebcec7c87..6bb68031a4 100644 --- a/MyIA.AI.Notebooks/Probas/Infer/Infer-3-Factor-Graphs.ipynb +++ b/MyIA.AI.Notebooks/Probas/Infer/Infer-3-Factor-Graphs.ipynb @@ -63,13 +63,6 @@ } }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "display_data", "data": { diff --git a/MyIA.AI.Notebooks/Probas/Infer/Infer-8-TrueSkill.ipynb b/MyIA.AI.Notebooks/Probas/Infer/Infer-8-TrueSkill.ipynb index abd711062e..7c4e68d872 100644 --- a/MyIA.AI.Notebooks/Probas/Infer/Infer-8-TrueSkill.ipynb +++ b/MyIA.AI.Notebooks/Probas/Infer/Infer-8-TrueSkill.ipynb @@ -90,13 +90,6 @@ } }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "display_data", "data": { diff --git a/MyIA.AI.Notebooks/Probas/Infer/Infer-9-Classification.ipynb b/MyIA.AI.Notebooks/Probas/Infer/Infer-9-Classification.ipynb index 6c12877388..ecaed45ee3 100644 --- a/MyIA.AI.Notebooks/Probas/Infer/Infer-9-Classification.ipynb +++ b/MyIA.AI.Notebooks/Probas/Infer/Infer-9-Classification.ipynb @@ -67,13 +67,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "display_data", "data": { diff --git a/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-02-Uninformed-CSharp.ipynb b/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-02-Uninformed-CSharp.ipynb index 0c9095154e..2a26935a64 100644 --- a/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-02-Uninformed-CSharp.ipynb +++ b/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-02-Uninformed-CSharp.ipynb @@ -91,13 +91,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "stream", "name": "stdout", diff --git a/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-02b-NetworkX-CSharp.ipynb b/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-02b-NetworkX-CSharp.ipynb index 3a1a2e33d0..c53e1742bf 100644 --- a/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-02b-NetworkX-CSharp.ipynb +++ b/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-02b-NetworkX-CSharp.ipynb @@ -75,13 +75,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "display_data", "data": { diff --git a/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-02c-QuikGraph.ipynb b/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-02c-QuikGraph.ipynb index 17294f3ad1..53e2ecc592 100644 --- a/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-02c-QuikGraph.ipynb +++ b/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-02c-QuikGraph.ipynb @@ -98,13 +98,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "display_data", "data": { diff --git a/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-07-MCTS-And-Beyond-CSharp.ipynb b/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-07-MCTS-And-Beyond-CSharp.ipynb index b2c581077c..cc112cbc25 100644 --- a/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-07-MCTS-And-Beyond-CSharp.ipynb +++ b/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-07-MCTS-And-Beyond-CSharp.ipynb @@ -33,13 +33,6 @@ "metadata": {}, "execution_count": 1, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "stream", "name": "stdout", diff --git a/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-11-Metaheuristics-CSharp.ipynb b/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-11-Metaheuristics-CSharp.ipynb index 79725c16fd..e785d3fa4a 100644 --- a/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-11-Metaheuristics-CSharp.ipynb +++ b/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-11-Metaheuristics-CSharp.ipynb @@ -62,13 +62,6 @@ } }, "outputs": [ - { - "output_type": "display_data", - "metadata": {}, - "data": { - "text/html": "" - } - }, { "output_type": "stream", "name": "stdout", diff --git a/MyIA.AI.Notebooks/Search/Part2-CSP/CSP-6-Hybridization-CSharp.ipynb b/MyIA.AI.Notebooks/Search/Part2-CSP/CSP-6-Hybridization-CSharp.ipynb index 4fe4d96a0c..d732225912 100644 --- a/MyIA.AI.Notebooks/Search/Part2-CSP/CSP-6-Hybridization-CSharp.ipynb +++ b/MyIA.AI.Notebooks/Search/Part2-CSP/CSP-6-Hybridization-CSharp.ipynb @@ -37,13 +37,6 @@ "id": "4c10d946", "metadata": {}, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "stream", "name": "stdout", diff --git a/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-02-Composition.ipynb b/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-02-Composition.ipynb index 0d84e29687..9c6e892a6c 100644 --- a/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-02-Composition.ipynb +++ b/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-02-Composition.ipynb @@ -100,13 +100,6 @@ } }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "stream", "name": "stdout", diff --git a/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-04-Islands.ipynb b/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-04-Islands.ipynb index a43ba56bf2..bd7ddadb67 100644 --- a/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-04-Islands.ipynb +++ b/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-04-Islands.ipynb @@ -100,13 +100,6 @@ } }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "stream", "name": "stdout", diff --git a/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-06-Benchmarks.ipynb b/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-06-Benchmarks.ipynb index 65ddc15b2f..b45050d060 100644 --- a/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-06-Benchmarks.ipynb +++ b/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-06-Benchmarks.ipynb @@ -40,13 +40,6 @@ } }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "stream", "name": "stdout", diff --git a/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-07-TSP.ipynb b/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-07-TSP.ipynb index cd75cfc591..bd137597be 100644 --- a/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-07-TSP.ipynb +++ b/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-07-TSP.ipynb @@ -47,13 +47,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "stream", "name": "stdout", diff --git a/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-09-EverestRelief.ipynb b/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-09-EverestRelief.ipynb index 2689a50e82..5abd9dae1b 100644 --- a/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-09-EverestRelief.ipynb +++ b/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-09-EverestRelief.ipynb @@ -90,13 +90,6 @@ "tags": [] }, "outputs": [ - { - "data": { - "text/html": [] - }, - "metadata": {}, - "output_type": "display_data" - }, { "name": "stdout", "output_type": "stream", diff --git a/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-10-CenterBias.ipynb b/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-10-CenterBias.ipynb index d5138028a0..991539535b 100644 --- a/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-10-CenterBias.ipynb +++ b/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-10-CenterBias.ipynb @@ -52,13 +52,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "stream", "name": "stdout", diff --git a/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-19-MetropolisReinsertion.ipynb b/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-19-MetropolisReinsertion.ipynb index 72bbf0cc08..9a8e0368ce 100644 --- a/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-19-MetropolisReinsertion.ipynb +++ b/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-19-MetropolisReinsertion.ipynb @@ -46,13 +46,6 @@ } }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "name": "stdout", "output_type": "stream", diff --git a/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-vs-mealpy/MGS-22-MGS-vs-Mealpy.ipynb b/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-vs-mealpy/MGS-22-MGS-vs-Mealpy.ipynb index 4e7e0a109e..192e512bb1 100644 --- a/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-vs-mealpy/MGS-22-MGS-vs-Mealpy.ipynb +++ b/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-vs-mealpy/MGS-22-MGS-vs-Mealpy.ipynb @@ -46,13 +46,6 @@ } }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "stream", "name": "stdout", diff --git a/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-vs-mealpy/MGS-23-DifferentialEvolution-vs-Mealpy.ipynb b/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-vs-mealpy/MGS-23-DifferentialEvolution-vs-Mealpy.ipynb index 7652e1f97b..74cfbef41d 100644 --- a/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-vs-mealpy/MGS-23-DifferentialEvolution-vs-Mealpy.ipynb +++ b/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-vs-mealpy/MGS-23-DifferentialEvolution-vs-Mealpy.ipynb @@ -74,13 +74,6 @@ } }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "stream", "name": "stdout", diff --git a/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-vs-mealpy/MGS-24-SimulatedAnnealing-vs-Mealpy.ipynb b/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-vs-mealpy/MGS-24-SimulatedAnnealing-vs-Mealpy.ipynb index 7b8de077a2..ebc11285cd 100644 --- a/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-vs-mealpy/MGS-24-SimulatedAnnealing-vs-Mealpy.ipynb +++ b/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-vs-mealpy/MGS-24-SimulatedAnnealing-vs-Mealpy.ipynb @@ -81,13 +81,6 @@ } }, "outputs": [ - { - "data": { - "text/html": [] - }, - "metadata": {}, - "output_type": "display_data" - }, { "name": "stdout", "output_type": "stream", diff --git a/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-vs-mealpy/MGS-30-ScatterSearch-Decomposition.ipynb b/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-vs-mealpy/MGS-30-ScatterSearch-Decomposition.ipynb index 900e3b6bc1..2531159a41 100644 --- a/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-vs-mealpy/MGS-30-ScatterSearch-Decomposition.ipynb +++ b/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-vs-mealpy/MGS-30-ScatterSearch-Decomposition.ipynb @@ -68,13 +68,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "stream", "name": "stdout", diff --git a/MyIA.AI.Notebooks/Sudoku/Sudoku-01-Backtracking-CSharp.ipynb b/MyIA.AI.Notebooks/Sudoku/Sudoku-01-Backtracking-CSharp.ipynb index 95f2a198c2..d26a59ed3d 100644 --- a/MyIA.AI.Notebooks/Sudoku/Sudoku-01-Backtracking-CSharp.ipynb +++ b/MyIA.AI.Notebooks/Sudoku/Sudoku-01-Backtracking-CSharp.ipynb @@ -56,13 +56,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "display_data", "data": { diff --git a/MyIA.AI.Notebooks/Sudoku/Sudoku-02-DancingLinks-CSharp.ipynb b/MyIA.AI.Notebooks/Sudoku/Sudoku-02-DancingLinks-CSharp.ipynb index 568b1ea9e3..a842deded0 100644 --- a/MyIA.AI.Notebooks/Sudoku/Sudoku-02-DancingLinks-CSharp.ipynb +++ b/MyIA.AI.Notebooks/Sudoku/Sudoku-02-DancingLinks-CSharp.ipynb @@ -72,13 +72,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "display_data", "data": { diff --git a/MyIA.AI.Notebooks/Sudoku/Sudoku-03-Genetic-CSharp.ipynb b/MyIA.AI.Notebooks/Sudoku/Sudoku-03-Genetic-CSharp.ipynb index bdf7dd8880..93b67ea1d0 100644 --- a/MyIA.AI.Notebooks/Sudoku/Sudoku-03-Genetic-CSharp.ipynb +++ b/MyIA.AI.Notebooks/Sudoku/Sudoku-03-Genetic-CSharp.ipynb @@ -59,13 +59,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "display_data", "data": { diff --git a/MyIA.AI.Notebooks/Sudoku/Sudoku-04-SimulatedAnnealing-CSharp.ipynb b/MyIA.AI.Notebooks/Sudoku/Sudoku-04-SimulatedAnnealing-CSharp.ipynb index 44ff2d3e28..f78ed2c9d5 100644 --- a/MyIA.AI.Notebooks/Sudoku/Sudoku-04-SimulatedAnnealing-CSharp.ipynb +++ b/MyIA.AI.Notebooks/Sudoku/Sudoku-04-SimulatedAnnealing-CSharp.ipynb @@ -103,13 +103,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "display_data", "data": { diff --git a/MyIA.AI.Notebooks/Sudoku/Sudoku-06-AIMA-CSP-CSharp.ipynb b/MyIA.AI.Notebooks/Sudoku/Sudoku-06-AIMA-CSP-CSharp.ipynb index 57fe742d7a..c7d4a85587 100644 --- a/MyIA.AI.Notebooks/Sudoku/Sudoku-06-AIMA-CSP-CSharp.ipynb +++ b/MyIA.AI.Notebooks/Sudoku/Sudoku-06-AIMA-CSP-CSharp.ipynb @@ -72,13 +72,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "display_data", "data": { diff --git a/MyIA.AI.Notebooks/Sudoku/Sudoku-07-Norvig-CSharp.ipynb b/MyIA.AI.Notebooks/Sudoku/Sudoku-07-Norvig-CSharp.ipynb index 50f464a2c1..8422f90268 100644 --- a/MyIA.AI.Notebooks/Sudoku/Sudoku-07-Norvig-CSharp.ipynb +++ b/MyIA.AI.Notebooks/Sudoku/Sudoku-07-Norvig-CSharp.ipynb @@ -63,13 +63,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "display_data", "data": { diff --git a/MyIA.AI.Notebooks/Sudoku/Sudoku-08-HumanStrategies-CSharp.ipynb b/MyIA.AI.Notebooks/Sudoku/Sudoku-08-HumanStrategies-CSharp.ipynb index 10b8b9f517..359eef9829 100644 --- a/MyIA.AI.Notebooks/Sudoku/Sudoku-08-HumanStrategies-CSharp.ipynb +++ b/MyIA.AI.Notebooks/Sudoku/Sudoku-08-HumanStrategies-CSharp.ipynb @@ -50,13 +50,6 @@ } }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "display_data", "data": { diff --git a/MyIA.AI.Notebooks/Sudoku/Sudoku-09-GraphColoring-CSharp.ipynb b/MyIA.AI.Notebooks/Sudoku/Sudoku-09-GraphColoring-CSharp.ipynb index b47a8ce454..f467215a9f 100644 --- a/MyIA.AI.Notebooks/Sudoku/Sudoku-09-GraphColoring-CSharp.ipynb +++ b/MyIA.AI.Notebooks/Sudoku/Sudoku-09-GraphColoring-CSharp.ipynb @@ -65,13 +65,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "display_data", "data": { diff --git a/MyIA.AI.Notebooks/Sudoku/Sudoku-10-ORTools-CSharp.ipynb b/MyIA.AI.Notebooks/Sudoku/Sudoku-10-ORTools-CSharp.ipynb index eea8ed76ae..864db8041b 100644 --- a/MyIA.AI.Notebooks/Sudoku/Sudoku-10-ORTools-CSharp.ipynb +++ b/MyIA.AI.Notebooks/Sudoku/Sudoku-10-ORTools-CSharp.ipynb @@ -65,13 +65,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "display_data", "data": { diff --git a/MyIA.AI.Notebooks/Sudoku/Sudoku-11-Choco-CSharp.ipynb b/MyIA.AI.Notebooks/Sudoku/Sudoku-11-Choco-CSharp.ipynb index 1c0205e99d..b98d151054 100644 --- a/MyIA.AI.Notebooks/Sudoku/Sudoku-11-Choco-CSharp.ipynb +++ b/MyIA.AI.Notebooks/Sudoku/Sudoku-11-Choco-CSharp.ipynb @@ -79,13 +79,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "stream", "name": "stdout", diff --git a/MyIA.AI.Notebooks/Sudoku/Sudoku-13-SymbolicAutomata-CSharp.ipynb b/MyIA.AI.Notebooks/Sudoku/Sudoku-13-SymbolicAutomata-CSharp.ipynb index a255b12eaa..f67d397ede 100644 --- a/MyIA.AI.Notebooks/Sudoku/Sudoku-13-SymbolicAutomata-CSharp.ipynb +++ b/MyIA.AI.Notebooks/Sudoku/Sudoku-13-SymbolicAutomata-CSharp.ipynb @@ -144,13 +144,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "stream", "name": "stdout", diff --git a/MyIA.AI.Notebooks/Sudoku/Sudoku-14-BDD-CSharp.ipynb b/MyIA.AI.Notebooks/Sudoku/Sudoku-14-BDD-CSharp.ipynb index d7152c5b77..040bd4ee09 100644 --- a/MyIA.AI.Notebooks/Sudoku/Sudoku-14-BDD-CSharp.ipynb +++ b/MyIA.AI.Notebooks/Sudoku/Sudoku-14-BDD-CSharp.ipynb @@ -165,13 +165,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "stream", "name": "stdout", diff --git a/MyIA.AI.Notebooks/Sudoku/Sudoku-15-Infer-CSharp.ipynb b/MyIA.AI.Notebooks/Sudoku/Sudoku-15-Infer-CSharp.ipynb index 2a824141a7..598cb0ea44 100644 --- a/MyIA.AI.Notebooks/Sudoku/Sudoku-15-Infer-CSharp.ipynb +++ b/MyIA.AI.Notebooks/Sudoku/Sudoku-15-Infer-CSharp.ipynb @@ -61,13 +61,6 @@ } }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "display_data", "data": { diff --git a/MyIA.AI.Notebooks/SymbolicAI/Planners/02-Classical/Planners-6-Domains-Csharp.ipynb b/MyIA.AI.Notebooks/SymbolicAI/Planners/02-Classical/Planners-6-Domains-Csharp.ipynb index 0e47f3af90..f0c38936cf 100644 --- a/MyIA.AI.Notebooks/SymbolicAI/Planners/02-Classical/Planners-6-Domains-Csharp.ipynb +++ b/MyIA.AI.Notebooks/SymbolicAI/Planners/02-Classical/Planners-6-Domains-Csharp.ipynb @@ -65,13 +65,6 @@ } }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "stream", "name": "stdout", diff --git a/MyIA.AI.Notebooks/SymbolicAI/Planners/03-Advanced/Planners-8-Temporal-Csharp.ipynb b/MyIA.AI.Notebooks/SymbolicAI/Planners/03-Advanced/Planners-8-Temporal-Csharp.ipynb index ec67f5f5a2..9657c4e7f0 100644 --- a/MyIA.AI.Notebooks/SymbolicAI/Planners/03-Advanced/Planners-8-Temporal-Csharp.ipynb +++ b/MyIA.AI.Notebooks/SymbolicAI/Planners/03-Advanced/Planners-8-Temporal-Csharp.ipynb @@ -70,13 +70,6 @@ } }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "display_data", "data": { diff --git a/MyIA.AI.Notebooks/SymbolicAI/SMT/Z3-Linq2Z3/06_Meal_Planner_Modelisation.ipynb b/MyIA.AI.Notebooks/SymbolicAI/SMT/Z3-Linq2Z3/06_Meal_Planner_Modelisation.ipynb index 16c4cf9619..ce9b70dc4a 100644 --- a/MyIA.AI.Notebooks/SymbolicAI/SMT/Z3-Linq2Z3/06_Meal_Planner_Modelisation.ipynb +++ b/MyIA.AI.Notebooks/SymbolicAI/SMT/Z3-Linq2Z3/06_Meal_Planner_Modelisation.ipynb @@ -38,13 +38,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "stream", "name": "stdout", diff --git a/MyIA.AI.Notebooks/SymbolicAI/SymbolicLearning/SL-2-KnowledgeBasedLearning-Csharp.ipynb b/MyIA.AI.Notebooks/SymbolicAI/SymbolicLearning/SL-2-KnowledgeBasedLearning-Csharp.ipynb index 90ecbe92d2..e1e535e77d 100644 --- a/MyIA.AI.Notebooks/SymbolicAI/SymbolicLearning/SL-2-KnowledgeBasedLearning-Csharp.ipynb +++ b/MyIA.AI.Notebooks/SymbolicAI/SymbolicLearning/SL-2-KnowledgeBasedLearning-Csharp.ipynb @@ -106,13 +106,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "stream", "name": "stdout", diff --git a/MyIA.AI.Notebooks/SymbolicAI/SymbolicLearning/SL-3-RelevanceLearning-Csharp.ipynb b/MyIA.AI.Notebooks/SymbolicAI/SymbolicLearning/SL-3-RelevanceLearning-Csharp.ipynb index a3d3c6e153..e71a8402ca 100644 --- a/MyIA.AI.Notebooks/SymbolicAI/SymbolicLearning/SL-3-RelevanceLearning-Csharp.ipynb +++ b/MyIA.AI.Notebooks/SymbolicAI/SymbolicLearning/SL-3-RelevanceLearning-Csharp.ipynb @@ -69,13 +69,6 @@ "tags": [] }, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "display_data", "data": { diff --git a/MyIA.AI.Notebooks/cross-series/socle-metadata-driven/Socle-ExplorerPattern-Csharp.ipynb b/MyIA.AI.Notebooks/cross-series/socle-metadata-driven/Socle-ExplorerPattern-Csharp.ipynb index e2777ea5b8..8c7402e91b 100644 --- a/MyIA.AI.Notebooks/cross-series/socle-metadata-driven/Socle-ExplorerPattern-Csharp.ipynb +++ b/MyIA.AI.Notebooks/cross-series/socle-metadata-driven/Socle-ExplorerPattern-Csharp.ipynb @@ -28,13 +28,6 @@ "execution_count": 1, "metadata": {}, "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "" - }, - "metadata": {} - }, { "output_type": "stream", "name": "stdout", diff --git a/scripts/notebook_tools/strip_probe_banner.py b/scripts/notebook_tools/strip_probe_banner.py index 402cd5a0a3..b546d7b296 100644 --- a/scripts/notebook_tools/strip_probe_banner.py +++ b/scripts/notebook_tools/strip_probe_banner.py @@ -112,6 +112,181 @@ def count_banner_lines(nb_path): return n +def is_empty_envelope(obj): + """True for the envelope the banner strip itself leaves behind (#20190). + + Shape produced on disk once the banner is removed:: + + {"output_type": "display_data", "data": {"text/html": ""}, "metadata": {}} + + An empty ``display_data`` renders nothing, so the whole output carries no + information — it is the *wrapper* of a banner that is gone, not a result. + It also survives every later run of this tool: with no banner left, + ``count_banner_lines`` returns 0 and the notebook is skipped, so the + residue is permanent by construction (53 notebooks tracked in #20190). + """ + if not isinstance(obj, dict) or obj.get("output_type") != "display_data": + return False + data = obj.get("data") + if not isinstance(data, dict) or list(data.keys()) != ["text/html"]: + return False + v = data["text/html"] + if isinstance(v, list): + v = "".join(str(part) for part in v) + return isinstance(v, str) and v.strip() == "" + + +def count_empty_envelopes(nb_path): + """Count empty ``display_data`` envelopes across the notebook (see #20190).""" + try: + with open(nb_path, encoding="utf-8") as f: + nb = json.load(f) + except (OSError, json.JSONDecodeError): + return 0 + n = 0 + for cell in nb.get("cells", []): + for out in cell.get("outputs", []) or []: + if is_empty_envelope(out): + n += 1 + return n + + +def _json_array_bodies(text, key): + """``(body_start, body_end)`` of every ``"": [ ... ]`` array body. + + Bracket balancing with JSON-string awareness: brackets inside string + literals (the banner embeds JS array literals) must not move the depth. + """ + out = [] + for m in re.finditer(re.escape(key) + r"\s*:\s*\[", text): + start = m.end() + depth = 1 + in_str = False + esc = False + i = start + while i < len(text): + ch = text[i] + if in_str: + if esc: + esc = False + elif ch == "\\": + esc = True + elif ch == '"': + in_str = False + elif ch == '"': + in_str = True + elif ch == "[": + depth += 1 + elif ch == "]": + depth -= 1 + if depth == 0: + out.append((start, i)) + break + i += 1 + return out + + +def _json_top_level_spans(body): + """``(start, end)`` of each top-level element of a JSON array body.""" + spans = [] + depth = 0 + in_str = False + esc = False + start = None + i = 0 + while i < len(body): + ch = body[i] + if in_str: + if esc: + esc = False + elif ch == "\\": + esc = True + elif ch == '"': + in_str = False + elif ch == '"': + in_str = True + if depth == 0 and start is None: + start = i + elif ch in "[{": + if depth == 0 and start is None: + start = i + depth += 1 + elif ch in "]}": + depth -= 1 + if depth == 0 and start is not None: + spans.append((start, i + 1)) + start = None + elif ch == "," and depth == 0: + if start is not None: + spans.append((start, i)) + start = None + elif depth == 0 and start is None and not ch.isspace(): + start = i + i += 1 + if start is not None and body[start:].strip(): + spans.append((start, len(body))) + return spans + + +def _drop_empty_envelopes(new_text): + """Remove empty ``display_data`` envelopes from every ``outputs`` array. + + Operates on raw notebook text so every other byte is preserved (same + philosophy as the banner passes). Returns ``(new_text, dropped)``. + """ + dropped = 0 + # Reverse file-offset order: each edit shrinks the file, so earlier + # offsets stay valid. + for body_start, body_end in reversed(_json_array_bodies(new_text, '"outputs"')): + body = new_text[body_start:body_end] + spans = _json_top_level_spans(body) + drops = [] + for s, e in spans: + chunk = body[s:e] + try: + obj = json.loads(chunk) + except json.JSONDecodeError: + continue + if not is_empty_envelope(obj): + continue + if re.match(r"\s*,", body[e:]): + tail = re.match(r"\s*,", body[e:]) + after_comma = e + tail.end() + # Also take the line break + indentation that opened the NEXT + # element: the element we keep already has its own preceding + # indentation, so leaving both would strand a whitespace-only + # line in the array (valid JSON, but off the canonical + # one-output-per-line shape). Require a newline in the run so a + # compact single-line array is never mangled. + ws = re.match(r"[ \t]*\n[ \t]*", body[after_comma:]) + drops.append((s, after_comma + (ws.end() if ws else 0))) + else: + pre = re.search(r",\s*$", body[:s]) + if pre: + drops.append((pre.start(), e)) + else: + # Only element: drop it and the line it sat on, so the + # array reads as an empty one rather than one holding a + # blank line. + lead = re.search(r"[ \t]*\n[ \t]*$", body[:s]) + drops.append((lead.start() if lead else s, e)) + if not drops: + continue + parts = [] + prev_end = 0 + for s, e in sorted(drops): + if s < prev_end: # overlap guard (adjacent envelopes) + continue + parts.append(body[prev_end:s]) + prev_end = e + parts.append(body[prev_end:]) + new_body = "".join(parts) + if new_body != body: + new_text = new_text[:body_start] + new_body + new_text[body_end:] + dropped += len(drops) + return new_text, dropped + + def find_banner_outputs(nb_path): """Return list of (cell_index, output_index) for banner outputs. @@ -215,18 +390,24 @@ def strip_banner_in_place(nb_path): is preserved. 2. **str** (one inline HTML string, common when the kernel emits a single - ```` block): the whole banner string is replaced - by ``""`` (empty string) in the on-disk JSON via a targeted text - rewrite. The empty string is still a valid ``text/html`` data value - (no display), and the surrounding ``outputs: [...]`` shape is preserved. + ```` block): the whole ``display_data`` output is + dropped from ``outputs`` via a targeted text rewrite. Blanking the + string instead (the previous behaviour) left an empty envelope behind + — ``{"data": {"text/html": ""}, ...}`` — which no later run could see + again, since with no banner left the tool skips the notebook. That + residue is #20190 (53 notebooks). + + Any empty envelope already on disk (whatever put it there) is removed by + the same call, so the fix is self-healing for notebooks stripped by an + older version. Returns ``(outputs_with_banner, lines_fixed)``. ``lines_fixed`` counts banner-bearing JSON list elements rewritten (case 1) or string - replacements performed (case 2, always 1 per output). + replacements performed (case 2, always 1 per output) — envelope removals + are not counted, so the caller's ``FIXED == pre`` invariant (banner + count) still holds. """ hits = find_banner_outputs(nb_path) - if not hits: - return (0, 0) with open(nb_path, encoding="utf-8") as f: text = f.read() @@ -371,6 +552,12 @@ def strip_banner_in_place(nb_path): new_text = new_text[:body_start] + new_body + new_text[body_end:] fixed += replaced_here + # The banner passes above leave an empty envelope behind whenever the + # banner occupied a whole output (case 2, and the single-element list + # case, both end up with ``"text/html": ""``). Drop those entries — and + # any inherited from a run of an older version of this tool (#20190). + new_text, _dropped = _drop_empty_envelopes(new_text) + if new_text != text: with open(nb_path, "w", encoding="utf-8", newline="") as f: f.write(new_text) @@ -465,41 +652,57 @@ def main(): total_files = 0 total_banners_found = 0 total_banners_fixed = 0 - files_with_banner = 0 + total_envelopes_found = 0 + total_envelopes_left = 0 + files_with_defect = 0 skipped = [] for p in sorted(paths): - # Count FIRST so the apply report shows pre-strip banner count (after - # the strip the count drops to 0; we'd otherwise miss the file in the - # summary). + # Count FIRST so the apply report shows the pre-strip counts (after + # the strip they drop to 0; we'd otherwise miss the file in the + # summary). Two defects are counted: the banner itself, and the empty + # ``display_data`` envelope a previous strip left behind (#20190) — + # the second one carries no banner, so a banner-only count skips the + # notebook and the residue becomes permanent. found = count_banner_lines(p) + envelopes = count_empty_envelopes(p) fixed = 0 - if do_apply and found: + if do_apply and (found or envelopes): fixed = strip_banner_in_place(p)[1] - if not found: + envelopes_left = count_empty_envelopes(p) + else: + envelopes_left = envelopes + if not found and not envelopes: continue total_files += 1 - files_with_banner += 1 + files_with_defect += 1 total_banners_found += found total_banners_fixed += fixed + total_envelopes_found += envelopes + total_envelopes_left += envelopes_left rel = os.path.relpath(p, repo_root) + detail = "%d banner line(s)" % found + if envelopes: + detail += ", %d empty envelope(s)" % envelopes if do_apply: - tag = "FIXED" if fixed == found else ("PARTIAL" if fixed else "SKIP") - print("[%s] %s (%d banner line(s)%s)" % ( - tag, rel, found, ", %d fixed" % fixed)) - if fixed < found: + ok = fixed == found and envelopes_left == 0 + tag = "FIXED" if ok else ("PARTIAL" if (fixed or envelopes_left < envelopes) else "SKIP") + print("[%s] %s (%s%s)" % (tag, rel, detail, ", %d banner fixed" % fixed)) + if not ok: skipped.append(rel) else: - print("[DEFECT] %s (%d banner line(s))" % (rel, found)) + print("[DEFECT] %s (%s)" % (rel, detail)) mode = "apply" if do_apply else "scan" - print("\n%s summary: %d notebook(s) carrying %d probeAddresses banner line(s)" - % (mode, files_with_banner, total_banners_found)) + print("\n%s summary: %d notebook(s) carrying %d probeAddresses banner line(s) " + "and %d empty display_data envelope(s)" + % (mode, files_with_defect, total_banners_found, total_envelopes_found)) if do_apply: - print(" fixed: %d skipped: %d file(s)" % (total_banners_fixed, len(skipped))) + print(" banner lines fixed: %d empty envelopes left: %d skipped: %d file(s)" + % (total_banners_fixed, total_envelopes_left, len(skipped))) for rel in skipped: print(" [unfixed] %s" % rel) - if args.check and total_banners_found > 0: + if args.check and (total_banners_found > 0 or total_envelopes_left > 0): sys.exit(1) diff --git a/scripts/notebook_tools/tests/test_strip_probe_banner.py b/scripts/notebook_tools/tests/test_strip_probe_banner.py index 4d5c226f1a..abf68621a8 100644 --- a/scripts/notebook_tools/tests/test_strip_probe_banner.py +++ b/scripts/notebook_tools/tests/test_strip_probe_banner.py @@ -23,8 +23,10 @@ from strip_probe_banner import ( BANNER_SIGNATURES, count_banner_lines, + count_empty_envelopes, find_banner_outputs, has_banner, + is_empty_envelope, strip_banner_in_place, ) @@ -97,8 +99,8 @@ def _banner_html_string() -> str: Mirrors the newer .NET Interactive kernel format: the whole HTML+JS is a single inline string in ``data["text/html"]`` rather than a list. Anchors on the same signatures (``probeAddresses`` / ``probingAddresses`` / - ``loadDotnetInteractiveApi``) — the strip just replaces the whole string - with ``""``. + ``loadDotnetInteractiveApi``) — the strip drops the whole output, so no + empty ``display_data`` envelope is left behind (#20190). """ return ( "
\r\n" @@ -303,10 +305,11 @@ def test_does_not_touch_other_data_keys(self, tmp_path): def test_strip_string_form_banner(self, tmp_path): # The newer .NET Interactive kernel emits the banner as a single inline - # ``text/html`` STRING (not a list). The strip must handle this case: - # replace the whole string with ``""`` (empty string = no display) - # while preserving the surrounding ``data: {...}`` dict and the - # ``outputs: [...]`` shape. + # ``text/html`` STRING (not a list). The strip must handle this case by + # dropping the banner output entirely. Blanking the string instead (the + # pre-#20190 behaviour) left an empty ``display_data`` envelope that no + # later run could see again — with no banner left, the tool skips the + # notebook, so the residue was permanent. banner = { "output_type": "display_data", "data": {"text/html": _banner_html_string()}, @@ -335,13 +338,11 @@ def test_strip_string_form_banner(self, tmp_path): new_nb = json.load(f) cell = new_nb["cells"][0] assert cell["execution_count"] == 7 - assert len(cell["outputs"]) == 2 - assert cell["outputs"][1] == other_output # byte-identical - sanitized = cell["outputs"][0]["data"]["text/html"] - assert sanitized == "" # banner replaced with empty string - # And the data key is still there (just empty). - assert "text/html" in cell["outputs"][0]["data"] - assert cell["outputs"][0]["output_type"] == "display_data" + # The banner output is gone; the neighbour is byte-identical. + assert len(cell["outputs"]) == 1 + assert cell["outputs"][0] == other_output + # And no empty envelope was left in its place (#20190). + assert count_empty_envelopes(str(nb)) == 0 def test_string_form_idempotent(self, tmp_path): # String-form strip must also be byte-stable on second invocation. @@ -446,4 +447,123 @@ def test_list_banner_with_inner_brackets_in_string(self, tmp_path): assert cell["outputs"][0]["output_type"] == "display_data" # No banner signature may survive. for line in cell["outputs"][0]["data"]["text/html"]: - assert not any(sig in line for sig in BANNER_SIGNATURES) \ No newline at end of file + assert not any(sig in line for sig in BANNER_SIGNATURES) + + +# --------------------------------------------------------------------------- +# Empty display_data envelope (#20190) +# --------------------------------------------------------------------------- + +def _empty_envelope() -> dict: + """The residue an older strip left on disk: banner removed, wrapper kept.""" + return {"output_type": "display_data", "data": {"text/html": ""}, "metadata": {}} + + +def _stream(text: str) -> dict: + return {"output_type": "stream", "name": "stdout", "text": [text]} + + +class TestEmptyEnvelope: + def test_is_empty_envelope_matches_the_strip_residue(self): + assert is_empty_envelope(_empty_envelope()) + + @pytest.mark.parametrize("obj", [ + {"output_type": "display_data", "data": {"text/html": "x"}, "metadata": {}}, + # A second data key means the output carries something else too. + {"output_type": "display_data", + "data": {"text/html": "", "text/plain": "kept"}, "metadata": {}}, + {"output_type": "stream", "name": "stdout", "text": [""]}, + {"output_type": "display_data", "data": {"image/png": ""}, "metadata": {}}, + {"output_type": "display_data", "data": {}, "metadata": {}}, + "not-a-dict", + None, + ]) + def test_is_empty_envelope_rejects_everything_else(self, obj): + assert not is_empty_envelope(obj) + + def test_count_empty_envelopes(self, tmp_path): + cells = [ + _code(["a"], outputs=[_empty_envelope(), _stream("ok")], execution_count=1), + _code(["b"], outputs=[_stream("ok")], execution_count=2), + ] + nb = _write_nb(tmp_path / "x.ipynb", cells) + assert count_empty_envelopes(str(nb)) == 1 + # No banner is involved: the residue is invisible to the banner count, + # which is why it used to survive every later run of the tool. + assert count_banner_lines(str(nb)) == 0 + + def test_removes_inherited_envelope_without_banner(self, tmp_path): + cells = [_code(["a"], outputs=[_empty_envelope(), _stream("ok")], + execution_count=4)] + nb = _write_nb(tmp_path / "x.ipynb", cells) + + outputs_with_banner, fixed = strip_banner_in_place(str(nb)) + assert outputs_with_banner == 0 + assert fixed == 0 # nothing banner-related was rewritten + + with open(nb, encoding="utf-8") as f: + new_nb = json.load(f) + cell = new_nb["cells"][0] + assert cell["execution_count"] == 4 + assert len(cell["outputs"]) == 1 + assert cell["outputs"][0] == _stream("ok") + assert count_empty_envelopes(str(nb)) == 0 + + def test_removes_envelope_between_real_outputs(self, tmp_path): + a, b = _stream("first"), _stream("last") + cells = [_code(["a"], outputs=[a, _empty_envelope(), b], + execution_count=9)] + nb = _write_nb(tmp_path / "x.ipynb", cells) + + strip_banner_in_place(str(nb)) + + with open(nb, encoding="utf-8") as f: + new_nb = json.load(f) + outs = new_nb["cells"][0]["outputs"] + assert len(outs) == 2 + assert outs[0] == a + assert outs[1] == b + assert new_nb["cells"][0]["execution_count"] == 9 + + def test_removes_envelope_after_last_real_output(self, tmp_path): + # Cover the "head comma" branch: the envelope is the LAST element, so + # the comma before it has to go with it. + a = _stream("only") + cells = [_code(["a"], outputs=[a, _empty_envelope()], execution_count=9)] + nb = _write_nb(tmp_path / "x.ipynb", cells) + + strip_banner_in_place(str(nb)) + + with open(nb, encoding="utf-8") as f: + new_nb = json.load(f) + outs = new_nb["cells"][0]["outputs"] + assert outs == [a] + + def test_envelope_removal_idempotent(self, tmp_path): + cells = [_code(["a"], outputs=[_empty_envelope()], execution_count=1)] + nb = _write_nb(tmp_path / "x.ipynb", cells) + + strip_banner_in_place(str(nb)) + first = nb.read_text(encoding="utf-8") + strip_banner_in_place(str(nb)) + assert nb.read_text(encoding="utf-8") == first + with open(nb, encoding="utf-8") as f: + new_nb = json.load(f) + assert new_nb["cells"][0]["outputs"] == [] + + def test_legitimate_outputs_are_untouched(self, tmp_path): + # Guard against over-reach: a notebook with real outputs must come out + # byte-identical (the removal is text-surgical, no re-serialization). + cells = [ + _code(["a"], outputs=[_stream("ok\r\n")], execution_count=3), + _code(["b"], outputs=[{"output_type": "execute_result", + "data": {"text/plain": ["42"]}, + "metadata": {}, "execution_count": 3}], + execution_count=3), + ] + nb = _write_nb(tmp_path / "x.ipynb", cells) + before = nb.read_text(encoding="utf-8") + + strip_banner_in_place(str(nb)) + + assert nb.read_text(encoding="utf-8") == before \ No newline at end of file From c0e80c78d9c843d21ef96f90b180859390d3b476 Mon Sep 17 00:00:00 2001 From: jsboige Date: Sat, 10 Oct 2026 15:30:00 +0200 Subject: [PATCH 2/3] Fix(twins,#20262): rebaseline de 30 paires apres strip probeAddresses Le strip `probeAddresses` de #20262 deplace le blob SHA des notebooks : les 30 paires qu'il touche sont passees DRIFT_INTRODUCED. Rebaseline par la commande prescrite par le gate, une paire a la fois, `--by myia-po-2024:CoursIA-2`. `planners-8-temporal` demandait un soin supplementaire : son fichier d'intention portait encore une liste `audits:` inline de 7 entrees, en retard de 3 entrees sur le repertoire deja migre. La migration a produit des doublons -- 5 byte-identiques a des fichiers deja trackes, 1 sous-ensemble de `0007`. Les 6 doublons sont retires ; l'entree inline[7], presente nulle part ailleurs, est committee comme fichier d'audit `0010-2026-09-03` -- les 7 entrees inline sont donc toutes preservees. L'audit de cette lane est repose a l'index libre suivant (`0011`), dernier par tri de nom : `_latest_audit` le lit bien, la ou l'index `0008` d'un premier passage laissait la porte sur un enregistrement perime. Verifications : 30/30 paires dont le dernier audit par tri de nom porte les SHA reels des notebooks (`git hash-object`) ; aucun prefixe d'index duplique dans le registre ; `test_twin_registry_integrity.py` 46 passed. Co-Authored-By: Claude Haiku 4.5 (1M context) --- ...014-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...019-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...015-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...013-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...010-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...016-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ .../twin_pairs.d/planners-8-temporal.yaml | 43 ------------------- ...010-2026-09-03-myia-po-2026-CoursIA-2.yaml | 6 +++ ...011-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...019-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...016-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...016-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...014-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...012-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...017-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...018-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...010-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...008-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...017-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...014-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...008-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...015-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...021-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...012-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...015-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...011-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...020-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...012-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...013-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...023-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...017-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ ...030-2026-10-10-myia-po-2024-CoursIA-2.yaml | 6 +++ 32 files changed, 186 insertions(+), 43 deletions(-) create mode 100644 scripts/notebook_tools/twin_pairs.d/csp-6-hybridization/0014-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/gametheory-10-forwardinduction-spe/0019-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/gametheory-4c-nashexistence/0015-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/ml-2-data-features/0013-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/ml-7-recommendation/0010-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/planners-6-domains/0016-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/planners-8-temporal/0010-2026-09-03-myia-po-2026-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/planners-8-temporal/0011-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/probas-2b-debugging/0019-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/probas-8-trueskill/0016-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/probas-9-classification/0016-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/search-02-uninformed/0014-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/search-02b-networkx/0012-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/search-07-mcts-and-beyond/0017-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/search-11-metaheuristics/0018-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/sl-2-knowledgebasedlearning/0010-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/sl-3-relevancelearning/0008-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/socialchoice-1-arrow-impossibility/0017-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/sudoku-01-backtracking/0014-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/sudoku-02-dancinglinks/0008-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/sudoku-03-genetic/0015-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/sudoku-04-simulatedannealing/0021-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/sudoku-06-aima-csp/0012-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/sudoku-07-norvig/0015-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/sudoku-08-humanstrategies/0011-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/sudoku-09-graphcoloring/0020-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/sudoku-10-ortools/0012-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/sudoku-11-choco/0013-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/sudoku-13-symbolicautomata/0023-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/sudoku-14-bdd/0017-2026-10-10-myia-po-2024-CoursIA-2.yaml create mode 100644 scripts/notebook_tools/twin_pairs.d/sudoku-15-infer/0030-2026-10-10-myia-po-2024-CoursIA-2.yaml diff --git a/scripts/notebook_tools/twin_pairs.d/csp-6-hybridization/0014-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/csp-6-hybridization/0014-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..412ad31693 --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/csp-6-hybridization/0014-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: 1af252c4b3ae72aac06d8066b0878ae210e8e9b4 +csharp_sha: d7322259122ac53dc93e128871b2aa435721ad6f +content_python_sha: bad5a45c2f96cd017b19e09aeee195d009f06add6fb400c8e7b63a82d18df5da +content_csharp_sha: 699e804802df0b554f6d4eaad6a797b1c53f48e2146cbf89ba05888bf47c7a87 diff --git a/scripts/notebook_tools/twin_pairs.d/gametheory-10-forwardinduction-spe/0019-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/gametheory-10-forwardinduction-spe/0019-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..2f1af1a45b --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/gametheory-10-forwardinduction-spe/0019-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: 68b3df2e137092a0c88d259a042bb6bb4912d2fb +csharp_sha: 1bacc0038a5ed097ce17c42a124f8e4d5c9c9fc5 +content_python_sha: 0200b82e455d3b374b7343b7deee9fd798d2f03c75a39cc6246fa584f1124083 +content_csharp_sha: 223a448b378ee6f2124a7f8fd4943f67247ccbdc4bca06dbe010ab0f70ffdf86 diff --git a/scripts/notebook_tools/twin_pairs.d/gametheory-4c-nashexistence/0015-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/gametheory-4c-nashexistence/0015-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..ac48f33bd4 --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/gametheory-4c-nashexistence/0015-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: e194b9053792e5a7a33f6c767c7738d87fc42f84 +csharp_sha: 02b868f07104cf6357b3867336e08a0fc48b2b96 +content_python_sha: 2997458df2f7cf97f33cd77f8f931d1b9404263991d3eb26f433da7b64b5a42b +content_csharp_sha: 57ba2a75080b4bcb44b78a7aabb7ca6ab36e30dd15f106a34bb9c19c7c3fbd81 diff --git a/scripts/notebook_tools/twin_pairs.d/ml-2-data-features/0013-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/ml-2-data-features/0013-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..b07695655e --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/ml-2-data-features/0013-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: 93d14f90bb238a8d9fee7312e89941f5bb4f5435 +csharp_sha: a3377a1a302563c3527497364407114e8bfade88 +content_python_sha: 1e65fa8bf0dec88d13d44f7b14b6aa1e0a67b4d280fa9288a44c8f6a56e5ea67 +content_csharp_sha: 9abac9ac548cdafa03ba7a1aa42ff4e033a7418a1dd611eb05a34a20a08d7873 diff --git a/scripts/notebook_tools/twin_pairs.d/ml-7-recommendation/0010-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/ml-7-recommendation/0010-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..e124dedf2f --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/ml-7-recommendation/0010-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: 5bcabb0a507f64d1fada07f402fcb9214fb4bb48 +csharp_sha: 27e462dc07670ca6d21fefbc9d83640dbc00cf50 +content_python_sha: 39679beb6eeb3a3e25d29188bb66a3d5c65bd1e9775c5c7df9785fe0400571a6 +content_csharp_sha: 954154a1ee72e4b45c0b5d4496f9923e7cf5b929799c47b97624ac4009c8adfc diff --git a/scripts/notebook_tools/twin_pairs.d/planners-6-domains/0016-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/planners-6-domains/0016-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..0e395bff7c --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/planners-6-domains/0016-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: a7435eaad303ff6c2b3c3604e4064a335114a555 +csharp_sha: f0c38936cff6418fd004356dec5a4b442683d4ed +content_python_sha: bd4137c9796ea47f397fe01f0c511756f6a3cccc2963d7694d7900f1eca68540 +content_csharp_sha: a7310242d3962ab6121ebce9dccf4407a3aa9030aca94a8b5b7e70611596315d diff --git a/scripts/notebook_tools/twin_pairs.d/planners-8-temporal.yaml b/scripts/notebook_tools/twin_pairs.d/planners-8-temporal.yaml index 232373606b..9b80d629d6 100644 --- a/scripts/notebook_tools/twin_pairs.d/planners-8-temporal.yaml +++ b/scripts/notebook_tools/twin_pairs.d/planners-8-temporal.yaml @@ -5,49 +5,6 @@ parity_level: native-both bridge_verdict: SOTA-OK bridge_verdict_reason: "Python = `ortools` (Google, Apache-2.0, CP-SAT SOTA temporal : `CpModel()` + `NewIntervalVar` + `AddCumulative` + `AddNoOverlap2D` + `model.Minimize(makespan)` + `solver.Solve()` pour atelier job-shop RCPSP). C# = Tranche 1 from-scratch BCL .NET (PDDL duratives, Allen algebra 13 relations, STN Floyd-Warshall, RCPSP glouton LPT) + Tranche 2 `Google.OrTools` NuGet (Google, Apache-2.0, MEME solveur CP-SAT : `#r \"nuget: Google.OrTools\"` + `using Google.OrTools.Sat;` + `CpModel()` + `AddBoolVar` + `AddCumulative` + `solver.Solve()`) + `ScottPlot` NuGet 5.0.55 (MIT-license, timeline gantt chart). Verdict SOTA-OK (modele owner c.217 PR #10557 MERGED 2026-08-12 App tranche 4 lib-vs-lib + PR #10389 Planners-8 Tranche 2 MERGED substance Google.OrTools validee firsthand instance d'atelier : makespan optimal = 10 des deux cotes, le glouton LPT etait deja optimal, CP-SAT le PROUVE et explique pourquoi le chemin critique 7 est inaccessible via la contention de ressource) : les DEUX cotes atteignent un moteur CP-SAT de production (Python OR-Tools, C# Google.OrTools), bridge direct sans glue non-SOTA. Le from-scratch C# reste EN PLUS (jamais a la place), critere owner #10382. `parity_level: native-both` preserve : parite engine + from-scratch pedagogique." - audits: - - date: "2026-08-04" - by: myia-po-2023:CoursIA - python_sha: dea984c63c87f8fd18e79a7c3a679f8afeb75605 - csharp_sha: 131d4a0bea72a0ad043ed44798468fd98dd7a2e5 - - date: "2026-08-11" - by: myia-po-2024:CoursIA - python_sha: dea984c63c87f8fd18e79a7c3a679f8afeb75605 - csharp_sha: 2ebcbc046b781ee49449dc216402b603d5e7fb4b - content_python_sha: cc583657ae2a15b36e01b29bcf1f639b6fa93359f42635aaa6554b08d153d175 - content_csharp_sha: 536a248cb5af410b7867159f605d558bedc8eecc39c0827d93480d736b820bb4 - - date: "2026-08-16" - by: myia-po-2023:CoursIA - python_sha: 94d90a0461447759bcbe0029b70b8985527349f1 - csharp_sha: 2ebcbc046b781ee49449dc216402b603d5e7fb4b - content_python_sha: cdd2d4c542af4a175ee483624f05abe745a6a8a0283eb1082b24b7fbc6be2a1f - content_csharp_sha: 536a248cb5af410b7867159f605d558bedc8eecc39c0827d93480d736b820bb4 - reason: "Rebaseline apres fix citation arXiv #11168 (branche fix/11168-arxiv-symbolic, commit a3a0e595a) : le lien 'Temporal Planning Survey' arXiv:2104.08553 etait le mauvais papier, remplace par le fondement canonique Fox & Long PDDL2.1 arXiv:1106.4561 (1 ligne markdown, section References). Python-only, csharp_sha inchangee (identique aux entrees precedentes), markdown-only (C.2 exception), aucun contenu code/output touche. Diff verifie firsthand : 1 ligne remplacee, rien strippe." - - date: "2026-08-16" - by: myia-po-2026:CoursIA-2 - python_sha: 94d90a0461447759bcbe0029b70b8985527349f1 - csharp_sha: a18ba874a5e4c005d2ab34eb7d25f144d95cd75a - reason: "Re-exec seq only (#11112 etage 3): csharp DUPLICATE -> CLEAN 1..10 (dotnet_executor, Google.OrTools), sources byte-identiques, 0 erreur, outputs deterministes (0 derive), probe banner strip L532. Cote python non touche." - content_python_sha: cdd2d4c542af4a175ee483624f05abe745a6a8a0283eb1082b24b7fbc6be2a1f - content_csharp_sha: e632c8b243ed22203671ec0dad4a8bcc54df2ae108f9afefcdfd7574de5f3816 - - date: "2026-08-29" - by: myia-po-2023:CoursIA-2 - python_sha: b08fd59774e2608cb07ee18dc2076a25c4503155 - csharp_sha: 91e719eb433c502dcf1e0b3993ec4d288db4fe98 - content_python_sha: e02f2d24b43877c40cf8f5958aa1dc9cb25d9d3bf5ec2524e45131b8e16ef795 - content_csharp_sha: e917a9bb27b010e0e989a11d7fd04dc676bc0e0b83d334933e08f6daf16770c2 - - date: "2026-09-03" - by: myia-po-2026:CoursIA-2 - python_sha: b08fd59774e2608cb07ee18dc2076a25c4503155 - csharp_sha: 6e26986754d1eb7e3cd11c1429d1185c4f23821b - content_python_sha: e02f2d24b43877c40cf8f5958aa1dc9cb25d9d3bf5ec2524e45131b8e16ef795 - content_csharp_sha: a6d8ea5bcab172a8a22f5db59d3c2690194bb6ff59762ee4626e613e361fdcb0 - - date: "2026-09-03" - by: myia-po-2026:CoursIA-2 - python_sha: b08fd59774e2608cb07ee18dc2076a25c4503155 - csharp_sha: f5d34f021a6c68d51e5a5005d913aac12c26c30e - content_python_sha: e02f2d24b43877c40cf8f5958aa1dc9cb25d9d3bf5ec2524e45131b8e16ef795 - content_csharp_sha: 9c53d285a6d62b39ea4b341034126245c1217674bf9e69d3cbbbe88079d63905 known_differences: - "Concept : planification temporelle (actions duratives, ordonnancement avec parallelisme)." - "Python : unified-planning temporal + CP-SAT + Gantt. C# : deux tranches — Tranche 1 from-scratch BCL .NET (PDDL duratives, Allen, STN Floyd-Warshall, RCPSP glouton LPT) + Tranche 2 Google.OrTools CP-SAT natif .NET (moteur de production, depuis 2026-08-11, contrainte cumulative AddCumulative)." diff --git a/scripts/notebook_tools/twin_pairs.d/planners-8-temporal/0010-2026-09-03-myia-po-2026-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/planners-8-temporal/0010-2026-09-03-myia-po-2026-CoursIA-2.yaml new file mode 100644 index 0000000000..350f488b4e --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/planners-8-temporal/0010-2026-09-03-myia-po-2026-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-09-03' +by: myia-po-2026:CoursIA-2 +python_sha: b08fd59774e2608cb07ee18dc2076a25c4503155 +csharp_sha: f5d34f021a6c68d51e5a5005d913aac12c26c30e +content_python_sha: e02f2d24b43877c40cf8f5958aa1dc9cb25d9d3bf5ec2524e45131b8e16ef795 +content_csharp_sha: 9c53d285a6d62b39ea4b341034126245c1217674bf9e69d3cbbbe88079d63905 diff --git a/scripts/notebook_tools/twin_pairs.d/planners-8-temporal/0011-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/planners-8-temporal/0011-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..96c3ef33b0 --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/planners-8-temporal/0011-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: 8c055d62310f1d303096fbf18bbf54dd1adbedbc +csharp_sha: 9657c4e7f01ac3f98c9615f8aa4ce5cd4fe8e633 +content_python_sha: f63b6e84aed0102eec91e0d3e02ccf70424bb7df8937a4ce59dbf4c56254ac0e +content_csharp_sha: 0de63bfb2e924c661316d30bbb6ba63b3c600e629ce56097cf0a191d95ce4c36 diff --git a/scripts/notebook_tools/twin_pairs.d/probas-2b-debugging/0019-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/probas-2b-debugging/0019-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..8b06a54129 --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/probas-2b-debugging/0019-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: bf93bf3fd1522445e6a1ecce8c5d8e65303aff6e +csharp_sha: b60b646b38747e1232d804ecc49d7aee690bb019 +content_python_sha: 1bbe48aeb3a65546ff1de2d0e001cf286fe1cb0082621919c196495c890704b9 +content_csharp_sha: c34f6b1a63c35ca800c8724614adef842b7bfcbea6fec6f5713bd6fa921322a9 diff --git a/scripts/notebook_tools/twin_pairs.d/probas-8-trueskill/0016-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/probas-8-trueskill/0016-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..27fc0cc93a --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/probas-8-trueskill/0016-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: c1704ee2fd8449f3145aa938e33097ed696d739a +csharp_sha: 7c4e68d87205c59c3502ea95fc0bf8f7e61000c5 +content_python_sha: 17edc7d067d1354519fdb9f9f59c92f42153c6ce315afbe24f7c7532a4876c59 +content_csharp_sha: 598a36b699df0f9ad92504ec80fe388226649acc380eb73b75c4c1ef6faf4a8b diff --git a/scripts/notebook_tools/twin_pairs.d/probas-9-classification/0016-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/probas-9-classification/0016-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..75e1191ed7 --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/probas-9-classification/0016-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: 2d2b4a7a8fc1cc10b4c7ff3bdfba5aef9390b343 +csharp_sha: ecaed45ee3685224a8fbf5f59f457a64754a10e3 +content_python_sha: 1e27d6781cac6aeb2b42155c501ec05e75eb2842898fd3dbb75c3d7c2d320b8b +content_csharp_sha: bf5648247e156cfebb3435ce7b2ed762e6766e6f96d343a68e3dc2c5d1dbcad8 diff --git a/scripts/notebook_tools/twin_pairs.d/search-02-uninformed/0014-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/search-02-uninformed/0014-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..12aca884aa --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/search-02-uninformed/0014-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: 71b8013cd1208a406ed1197145d81a927766ef7c +csharp_sha: 2a26935a64e0e321b88bb4a42f56d47fb2205fb4 +content_python_sha: 44a1215ba4f3a6efec2d6ebc6788bbff2d59ccee15ef0b0f99ea5700b782c3fa +content_csharp_sha: 59d949cf3b1670d8a3db9ec9428585b3d3caacda805b523153d1ab5b5f7cfb48 diff --git a/scripts/notebook_tools/twin_pairs.d/search-02b-networkx/0012-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/search-02b-networkx/0012-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..7459909f0c --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/search-02b-networkx/0012-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: e956c29e7e7d50c2d45a2621face5f6e7891728d +csharp_sha: c53e1742bf9a4ec7b5bdc05c4daa6f45d1094732 +content_python_sha: 45c8ef4ae2a34c8b568e83ece941a5be86aa88fef81bec8403965f1b18489d63 +content_csharp_sha: b81ab701ee664a7b4ae330d128dbdd2ca154ddb56da192c5ded435fc88e7f8f2 diff --git a/scripts/notebook_tools/twin_pairs.d/search-07-mcts-and-beyond/0017-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/search-07-mcts-and-beyond/0017-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..f931ca0ddc --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/search-07-mcts-and-beyond/0017-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: 24905278c5a789bda74b73ef4ec45f4091f7fa3d +csharp_sha: cc112cbc25ab1645da3de7e365488ec651be8c56 +content_python_sha: 03242af762003fb9f877865350737c93e460ef199808fe9253524a44e21c0980 +content_csharp_sha: 4850397bc1ffd4dcffbf0fd6643d620bfc21f9ddff4e24861d440ba3c6e89808 diff --git a/scripts/notebook_tools/twin_pairs.d/search-11-metaheuristics/0018-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/search-11-metaheuristics/0018-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..eeae686f19 --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/search-11-metaheuristics/0018-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: f294284b780a4ec1644cb5073dda022dc5f919b0 +csharp_sha: e785d3fa4a951d31ed1676e08ca3547e3cb429cd +content_python_sha: fea83d253764ec256afb12c559be70b3a78f6e5c76e43384f4eeabf7dc5fa483 +content_csharp_sha: b3c41891468a748c4689a88540460050966d52f7555f8cf40b199706c8a7adeb diff --git a/scripts/notebook_tools/twin_pairs.d/sl-2-knowledgebasedlearning/0010-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/sl-2-knowledgebasedlearning/0010-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..dd2bf97424 --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/sl-2-knowledgebasedlearning/0010-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: d3c9bc06d9d4de0611c986f84bd1bd1197d97700 +csharp_sha: e1e535e77dd9186bde75f4ac79e216d224850e75 +content_python_sha: 40e45c4280c6779340fdfe2dddd9e349ba09c8469189417e3cd7dd1c7922f912 +content_csharp_sha: 93ce5165afa58b2d3b11a06cd18a76a5af03b47b5b4fb00238caff0219e8586c diff --git a/scripts/notebook_tools/twin_pairs.d/sl-3-relevancelearning/0008-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/sl-3-relevancelearning/0008-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..43db096881 --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/sl-3-relevancelearning/0008-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: 7bebaf66d4fd857286b2eadcfa2bf8b29cdfcaf5 +csharp_sha: e71a8402ca15c9320f60707f46ec678a30d3cf7a +content_python_sha: 9530a212e8ddf916f40df18fe5f0df4f6727dc92d44490bcb26a520f92499140 +content_csharp_sha: 7737ad0f8d55766e5e6c85118bf82d9c6c46dcdcc7645b35ac8f313badf78fe9 diff --git a/scripts/notebook_tools/twin_pairs.d/socialchoice-1-arrow-impossibility/0017-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/socialchoice-1-arrow-impossibility/0017-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..7877fb08c8 --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/socialchoice-1-arrow-impossibility/0017-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: f03fdf69cbbc88053315d9d60048b5e10229a15f +csharp_sha: 5a0ad594f1e5014ac07bcdba3e45c2ff38ac2d70 +content_python_sha: 788000b30d4a8cf791befa2a71ebcf92af4366c5b8b374fc4a798456f6ea0f6f +content_csharp_sha: 9d2fd950dae5e8a6036594f357ac71f400fe673ce065cf9c1f6cd341c77005f8 diff --git a/scripts/notebook_tools/twin_pairs.d/sudoku-01-backtracking/0014-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/sudoku-01-backtracking/0014-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..6d6721a0b5 --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/sudoku-01-backtracking/0014-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: f5b1682376d4fb947cf5b67e0a7ee2ffbc420147 +csharp_sha: d26a59ed3d7ed0d4cfe2e01d950e2cf430f4ca32 +content_python_sha: c77faa10d75fab0068a8f3597e392e93c41d0845a163d80db0c55b091d7d4eff +content_csharp_sha: 815fb23711f611f3e56129ad23b11b4a99eb117764a6b86f1533d96173fabd3f diff --git a/scripts/notebook_tools/twin_pairs.d/sudoku-02-dancinglinks/0008-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/sudoku-02-dancinglinks/0008-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..8f89a792f7 --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/sudoku-02-dancinglinks/0008-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: 2fd141a592d588a44bc751d3f0f30d638cce9555 +csharp_sha: a842deded09ec42a26c464db50d37b34cf44c8ca +content_python_sha: 5a26a74d823e7cc7a3c8e30b23311bec9ed31cc26ef836b946c36a6e0fcae581 +content_csharp_sha: 8f36e0628e3b45d6e9b894ab6ade48f48a6df7607288effb1ad3b528579a2cde diff --git a/scripts/notebook_tools/twin_pairs.d/sudoku-03-genetic/0015-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/sudoku-03-genetic/0015-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..ee5b24ec26 --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/sudoku-03-genetic/0015-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: 7f1f78a37c8e39fed41b5f0b51377511978cbf9c +csharp_sha: 93b67ea1d00ee75508256c17c0b1f4bc381c75d2 +content_python_sha: 0e43c8a7a402e784d1965b9d33823c67b1b9d2deb7260f7d4e907b33cc4fcaa5 +content_csharp_sha: a4fcecd308cf1d83dd257db7bf798263d06fd080f0192a94d423a55d63286d86 diff --git a/scripts/notebook_tools/twin_pairs.d/sudoku-04-simulatedannealing/0021-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/sudoku-04-simulatedannealing/0021-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..1fd2b106ec --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/sudoku-04-simulatedannealing/0021-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: 7b0c2845416e25c8293c18b4dfa1af693e838ad9 +csharp_sha: f78ed2c9d5b3db6a8e7ceecd7d0e3c5b2e5eff69 +content_python_sha: cecf27fe2c778b9b91b2315276952c16c478939eda6d29f3fb179655d9e569ca +content_csharp_sha: b68e0c60a3c061c2e90fe08a34ab62de8490a51578ef25b51ca0223dd0bd3dce diff --git a/scripts/notebook_tools/twin_pairs.d/sudoku-06-aima-csp/0012-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/sudoku-06-aima-csp/0012-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..fd36589ea9 --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/sudoku-06-aima-csp/0012-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: 11b69c46c56b449d66a5fb7d218036563b871777 +csharp_sha: c7d4a85587af82dd1fd05f25f1e508e77ffa63a9 +content_python_sha: f9160e8a36881b04cf54fc6107926bf7f5d29a40ff442e53404c1e3feff0f1dc +content_csharp_sha: 831203c3690c99e6116ed3a2ae05323d26c9d0b555abf12a769cf249b0003885 diff --git a/scripts/notebook_tools/twin_pairs.d/sudoku-07-norvig/0015-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/sudoku-07-norvig/0015-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..354bd660c3 --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/sudoku-07-norvig/0015-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: df41ee97be7be25d1c2044d24970c84e0d1e9f7c +csharp_sha: 8422f90268a20d50596c96b5b9f9c73e8b1c2af5 +content_python_sha: ef73bb2eba7928c8b87936ea9d73e35d760573f5f3bc365189e039175bb8198a +content_csharp_sha: 2069212ebd6539bc554c0f3f2dc5aa515af6f2acd9f750fe3bcd72e20359971b diff --git a/scripts/notebook_tools/twin_pairs.d/sudoku-08-humanstrategies/0011-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/sudoku-08-humanstrategies/0011-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..76df8b0a7d --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/sudoku-08-humanstrategies/0011-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: 016e527bea2fd61a30f6567783948e3a7299bd18 +csharp_sha: 359eef982904ff6e8524c06e5c1290678fc388db +content_python_sha: 27a1652d77dc2137236105e11ecfeba05ce30c68c585d0bfb477bb865d3ed717 +content_csharp_sha: 46d014a86429a9393dd06675717d159cef27e659bafb2a6c8658b1013685ae0c diff --git a/scripts/notebook_tools/twin_pairs.d/sudoku-09-graphcoloring/0020-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/sudoku-09-graphcoloring/0020-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..9c6f945a7e --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/sudoku-09-graphcoloring/0020-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: 88c6f5ae56c75b604ebefa0be61d6060f961ecef +csharp_sha: f467215a9f53579f6b58418ace20e41bc70ebcb3 +content_python_sha: 76a7a64fade11ace3b667bf109a939f27aea9b12ad24e4e5f8b3a60418fc2e4b +content_csharp_sha: 4003fd856656d6cadb56e566d8c7abc960638eb6f816109d18688c70cdfb54f3 diff --git a/scripts/notebook_tools/twin_pairs.d/sudoku-10-ortools/0012-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/sudoku-10-ortools/0012-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..24ad80e3bd --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/sudoku-10-ortools/0012-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: fd821c95c51875a23f649a77bb5818fcad50b3dd +csharp_sha: 864db8041b94b5ccc0040a63602c7c3dd6c6c46e +content_python_sha: ef4f4ae8cfdd49a02e1fb3e7ce39f9bef07f13f2ed5166a2b3fefd519363f853 +content_csharp_sha: d13441a16f520e3de79ba6130b21fcb606cd19888cbec513a8f6f01249aa3a40 diff --git a/scripts/notebook_tools/twin_pairs.d/sudoku-11-choco/0013-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/sudoku-11-choco/0013-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..f893ce7103 --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/sudoku-11-choco/0013-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: d44f489c4002d5e53004c50d687ef98d9c6bcbf9 +csharp_sha: b98d151054f505ea777cb8f3cbd1d829e3968c50 +content_python_sha: 3e3fb17be1fa4854c7f82b59b4ca4cf2a8dcbecc36bc5e77a75200d16f8e15db +content_csharp_sha: 2b67dfe9b40725bec857e7d8623bf2a8a4b33d3c4af006fb9b498292fe4feddb diff --git a/scripts/notebook_tools/twin_pairs.d/sudoku-13-symbolicautomata/0023-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/sudoku-13-symbolicautomata/0023-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..afaa41480b --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/sudoku-13-symbolicautomata/0023-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: 2299bfd49efdfdce21b01b45665a014a5d765000 +csharp_sha: f67d397edef84c64d444f8f6c827653b3e88ad3b +content_python_sha: cd40391bb1854430e115369b029db85cf4a11f885d6fc8fea51fd91d15daba67 +content_csharp_sha: 2ef853d605b322d84ecc659ed0bde7b86f9d6cf3d39be473ad6b443d4f8bf916 diff --git a/scripts/notebook_tools/twin_pairs.d/sudoku-14-bdd/0017-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/sudoku-14-bdd/0017-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..4bba4cc2eb --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/sudoku-14-bdd/0017-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: fdcda56edbc4fc6f47b45183e0ba960a55d6dedd +csharp_sha: 040bd4ee090604ff7e6cb38777194a35ecb84878 +content_python_sha: 5fe84cf0bcf151845789ce00bbb9f00b94b2eb77f6ea0ad4f125779460513eee +content_csharp_sha: 2a250606cbeda07246543e387a7030a3cdfb4d7b0f6060911bcdc719a0221146 diff --git a/scripts/notebook_tools/twin_pairs.d/sudoku-15-infer/0030-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/sudoku-15-infer/0030-2026-10-10-myia-po-2024-CoursIA-2.yaml new file mode 100644 index 0000000000..44b856d736 --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/sudoku-15-infer/0030-2026-10-10-myia-po-2024-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-10-10' +by: myia-po-2024:CoursIA-2 +python_sha: 0e4817d94e7feed46ea1afdf0f15685647be3863 +csharp_sha: 598cb0ea449f12bf2fb84016e2527031fd86e748 +content_python_sha: b0652b39a031dd16329a776b7ae5a3017959b1a7fcf6a8073f52b78aea0e0be6 +content_csharp_sha: a27dc276deee44c4ef3218495967b277606b76c33e54d869c41f9780dfa57a20 From 4950332b18fe139a8a0de8280e796f348f2e06ae Mon Sep 17 00:00:00 2001 From: jsboige Date: Sun, 11 Oct 2026 02:29:28 +0200 Subject: [PATCH 3/3] Fix(twins,#20262): renumeroter l'index twin 0017 -> 0019 (collision search-07) Le main a recu 0017 et 0018 sur search-07-mcts-and-beyond via #19676, et l'index 0017 de cette PR entrait en collision au merge. Renumerotation pure vers le premier index libre : aucun contenu touche, l'index vit dans le nom du fichier, la contiguite n'est pas testee. Co-authored-by: Claude Haiku 4.5 (1M context) --- ...CoursIA-2.yaml => 0019-2026-10-10-myia-po-2024-CoursIA-2.yaml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename scripts/notebook_tools/twin_pairs.d/search-07-mcts-and-beyond/{0017-2026-10-10-myia-po-2024-CoursIA-2.yaml => 0019-2026-10-10-myia-po-2024-CoursIA-2.yaml} (100%) diff --git a/scripts/notebook_tools/twin_pairs.d/search-07-mcts-and-beyond/0017-2026-10-10-myia-po-2024-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/search-07-mcts-and-beyond/0019-2026-10-10-myia-po-2024-CoursIA-2.yaml similarity index 100% rename from scripts/notebook_tools/twin_pairs.d/search-07-mcts-and-beyond/0017-2026-10-10-myia-po-2024-CoursIA-2.yaml rename to scripts/notebook_tools/twin_pairs.d/search-07-mcts-and-beyond/0019-2026-10-10-myia-po-2024-CoursIA-2.yaml