diff --git a/MyIA.AI.Notebooks/Search/Applications/CSP/App-15b-SportsScheduling-CSharp.ipynb b/MyIA.AI.Notebooks/Search/Applications/CSP/App-15b-SportsScheduling-CSharp.ipynb index 97d0469904..ae8f80d872 100644 --- a/MyIA.AI.Notebooks/Search/Applications/CSP/App-15b-SportsScheduling-CSharp.ipynb +++ b/MyIA.AI.Notebooks/Search/Applications/CSP/App-15b-SportsScheduling-CSharp.ipynb @@ -10,7 +10,7 @@ "> **Twin C#** de [`App-15-SportsScheduling`](App-15-SportsScheduling.ipynb) (Python + OR-Tools CP-SAT + numpy + matplotlib).\n", "> Marathon **.NET / Python** (#4956), volet **Search / Applications / CSP**.\n", "\n", - "**Navigation** : [<< App-15 Python](App-15-SportsScheduling.ipynb) | [Index](../../README.md) | [App-16 Crossword >>](App-16-Crossword-CSP-Csharp.ipynb)\n", + "**Navigation** : [<< App-15 Python](App-15-SportsScheduling.ipynb) | [Index](../../README.md) | [App-16 Crossword >>](App-16-Crossword-CSP-CSharp.ipynb)\n", "\n", "## Objectifs d'apprentissage\n", "\n", diff --git a/MyIA.AI.Notebooks/Search/Applications/CSP/App-16-Crossword-CSP-Csharp.ipynb b/MyIA.AI.Notebooks/Search/Applications/CSP/App-16-Crossword-CSP-CSharp.ipynb similarity index 100% rename from MyIA.AI.Notebooks/Search/Applications/CSP/App-16-Crossword-CSP-Csharp.ipynb rename to MyIA.AI.Notebooks/Search/Applications/CSP/App-16-Crossword-CSP-CSharp.ipynb diff --git a/MyIA.AI.Notebooks/Search/Applications/CSP/App-19-ProceduralGeneration-WFC-Csharp.ipynb b/MyIA.AI.Notebooks/Search/Applications/CSP/App-19-ProceduralGeneration-WFC-CSharp.ipynb similarity index 100% rename from MyIA.AI.Notebooks/Search/Applications/CSP/App-19-ProceduralGeneration-WFC-Csharp.ipynb rename to MyIA.AI.Notebooks/Search/Applications/CSP/App-19-ProceduralGeneration-WFC-CSharp.ipynb diff --git a/MyIA.AI.Notebooks/Search/Applications/CSP/App-6-Minesweeper-Csharp.ipynb b/MyIA.AI.Notebooks/Search/Applications/CSP/App-6-Minesweeper-CSharp.ipynb similarity index 100% rename from MyIA.AI.Notebooks/Search/Applications/CSP/App-6-Minesweeper-Csharp.ipynb rename to MyIA.AI.Notebooks/Search/Applications/CSP/App-6-Minesweeper-CSharp.ipynb diff --git a/MyIA.AI.Notebooks/Search/Applications/CSP/App-8-MiniZinc-Csharp.ipynb b/MyIA.AI.Notebooks/Search/Applications/CSP/App-8-MiniZinc-CSharp.ipynb similarity index 100% rename from MyIA.AI.Notebooks/Search/Applications/CSP/App-8-MiniZinc-Csharp.ipynb rename to MyIA.AI.Notebooks/Search/Applications/CSP/App-8-MiniZinc-CSharp.ipynb diff --git a/MyIA.AI.Notebooks/Search/Applications/Hybrid/App-18b-HyperparameterTuning-CSharp.ipynb b/MyIA.AI.Notebooks/Search/Applications/Hybrid/App-18b-HyperparameterTuning-CSharp.ipynb index 288c163ef8..d1a40d93d1 100644 --- a/MyIA.AI.Notebooks/Search/Applications/Hybrid/App-18b-HyperparameterTuning-CSharp.ipynb +++ b/MyIA.AI.Notebooks/Search/Applications/Hybrid/App-18b-HyperparameterTuning-CSharp.ipynb @@ -7,7 +7,7 @@ "source": [ "# App-18b : Optimisation d'Hyperparametres - Jumeau C#\n", "\n", - "> **Twin C#** de [`App-18-HyperparameterTuning`](App-18-HyperparameterTuning.ipynb) (Python / scikit-learn + Optuna). Navigation : [<< App-17b VRP](App-17b-VRP-Logistics-Csharp.ipynb) | [Index](../../README.md) | [App-19 WFC >>](../CSP/App-19-ProceduralGeneration-WFC-Csharp.ipynb)\n", + "> **Twin C#** de [`App-18-HyperparameterTuning`](App-18-HyperparameterTuning.ipynb) (Python / scikit-learn + Optuna). Navigation : [<< App-17b VRP](App-17b-VRP-Logistics-Csharp.ipynb) | [Index](../../README.md) | [App-19 WFC >>](../CSP/App-19-ProceduralGeneration-WFC-CSharp.ipynb)\n", "\n", "## Objectif pedagogique\n", "\n", diff --git a/MyIA.AI.Notebooks/SymbolicAI/Planners/02-Classical/Planners-4-Fast-Downward-Csharp.ipynb b/MyIA.AI.Notebooks/SymbolicAI/Planners/02-Classical/Planners-4-Fast-Downward-Csharp.ipynb index 7f6f725e5e..fd5bf5bc76 100644 --- a/MyIA.AI.Notebooks/SymbolicAI/Planners/02-Classical/Planners-4-Fast-Downward-Csharp.ipynb +++ b/MyIA.AI.Notebooks/SymbolicAI/Planners/02-Classical/Planners-4-Fast-Downward-Csharp.ipynb @@ -32,7 +32,7 @@ "\n", "### Duree estimee : 45 minutes\n", "\n", - "> **Verdict SOTA (#3801 Prong A).** Ce twin C# est un **planificateur SAS+ pedagogique from-scratch** (SOTA-OK pour le concept du moteur). Le notebook Python [Planners-4-Fast-Downward](Planners-4-Fast-Downward.ipynb) invoque le **vrai Fast Downward** (IPC winner, Helmert 2006) via Docker + `unified-planning` = **RECOVERABLE-MACHINE** (le solveur reel n'est pas lie a .NET pedagogique). Le twin from-scratch rend visibles les internes (representation SAS+, opérateurs prevail/pre/eff, RPG, EHC) que Fast Downward cache dans son binaire C++ — compagnon pedagogique intentionnel, même pattern que le twin [App-19 WFC C#](../../../Search/Applications/CSP/App-19-ProceduralGeneration-WFC-Csharp.ipynb). Implementation en BCL .NET 9 **pure, 0 NuGet**." + "> **Verdict SOTA (#3801 Prong A).** Ce twin C# est un **planificateur SAS+ pedagogique from-scratch** (SOTA-OK pour le concept du moteur). Le notebook Python [Planners-4-Fast-Downward](Planners-4-Fast-Downward.ipynb) invoque le **vrai Fast Downward** (IPC winner, Helmert 2006) via Docker + `unified-planning` = **RECOVERABLE-MACHINE** (le solveur reel n'est pas lie a .NET pedagogique). Le twin from-scratch rend visibles les internes (representation SAS+, opérateurs prevail/pre/eff, RPG, EHC) que Fast Downward cache dans son binaire C++ — compagnon pedagogique intentionnel, même pattern que le twin [App-19 WFC C#](../../../Search/Applications/CSP/App-19-ProceduralGeneration-WFC-CSharp.ipynb). Implementation en BCL .NET 9 **pure, 0 NuGet**." ] }, { diff --git a/scripts/notebook_tools/pedagogy_density_baseline.json b/scripts/notebook_tools/pedagogy_density_baseline.json index 364658f4a3..38f570badf 100644 --- a/scripts/notebook_tools/pedagogy_density_baseline.json +++ b/scripts/notebook_tools/pedagogy_density_baseline.json @@ -448,9 +448,9 @@ "MyIA.AI.Notebooks/Search/Applications/CSP/App-11b-Picross-CSharp.ipynb": 849.417, "MyIA.AI.Notebooks/Search/Applications/CSP/App-15-SportsScheduling.ipynb": 1181.588, "MyIA.AI.Notebooks/Search/Applications/CSP/App-15b-SportsScheduling-CSharp.ipynb": 1475.733, - "MyIA.AI.Notebooks/Search/Applications/CSP/App-16-Crossword-CSP-Csharp.ipynb": 787.75, + "MyIA.AI.Notebooks/Search/Applications/CSP/App-16-Crossword-CSP-CSharp.ipynb": 787.75, "MyIA.AI.Notebooks/Search/Applications/CSP/App-16-Crossword-CSP.ipynb": 660.25, - "MyIA.AI.Notebooks/Search/Applications/CSP/App-19-ProceduralGeneration-WFC-Csharp.ipynb": 646.2, + "MyIA.AI.Notebooks/Search/Applications/CSP/App-19-ProceduralGeneration-WFC-CSharp.ipynb": 646.2, "MyIA.AI.Notebooks/Search/Applications/CSP/App-19-ProceduralGeneration-WFC.ipynb": 705.062, "MyIA.AI.Notebooks/Search/Applications/CSP/App-1b-NQueens-CSharp.ipynb": 870.071, "MyIA.AI.Notebooks/Search/Applications/CSP/App-2-GraphColoring-Statistical-Validity-Python.ipynb": 1031.273, @@ -464,11 +464,11 @@ "MyIA.AI.Notebooks/Search/Applications/CSP/App-4b-JobShopScheduling-CSharp.ipynb": 1189.7, "MyIA.AI.Notebooks/Search/Applications/CSP/App-5-Timetabling-CSharp.ipynb": 1304.6, "MyIA.AI.Notebooks/Search/Applications/CSP/App-5-Timetabling.ipynb": 887.35, - "MyIA.AI.Notebooks/Search/Applications/CSP/App-6-Minesweeper-Csharp.ipynb": 1083.273, + "MyIA.AI.Notebooks/Search/Applications/CSP/App-6-Minesweeper-CSharp.ipynb": 1083.273, "MyIA.AI.Notebooks/Search/Applications/CSP/App-6-Minesweeper.ipynb": 964.652, "MyIA.AI.Notebooks/Search/Applications/CSP/App-7-Wordle.ipynb": 1009.333, "MyIA.AI.Notebooks/Search/Applications/CSP/App-7b-Wordle-CSharp.ipynb": 698.0, - "MyIA.AI.Notebooks/Search/Applications/CSP/App-8-MiniZinc-Csharp.ipynb": 1214.857, + "MyIA.AI.Notebooks/Search/Applications/CSP/App-8-MiniZinc-CSharp.ipynb": 1214.857, "MyIA.AI.Notebooks/Search/Applications/CSP/App-8-MiniZinc.ipynb": 1171.474, "MyIA.AI.Notebooks/Search/Applications/Hybrid/App-10-Portfolio.ipynb": 1120.158, "MyIA.AI.Notebooks/Search/Applications/Hybrid/App-10b-Portfolio-CSharp.ipynb": 1966.273, diff --git a/scripts/notebook_tools/twin_pairs.d/app-15-sportsscheduling/0009-2026-09-13-lane-myia-po-2023-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/app-15-sportsscheduling/0009-2026-09-13-lane-myia-po-2023-CoursIA-2.yaml new file mode 100644 index 0000000000..3c6c58659c --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/app-15-sportsscheduling/0009-2026-09-13-lane-myia-po-2023-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-09-13' +by: lane myia-po-2023:CoursIA-2 +python_sha: 25bd1e99bac08467847225c6c1bef27284108879 +csharp_sha: ae8f80d872996154014b6fd4bc746e5f7b820240 +content_python_sha: 6bc97a786ead73280efd5ab9062fd87f8625ba308268932374d4234885dbbb46 +content_csharp_sha: d7499933e03ca2e5c2d5f88b78b8f6183492c880a2b94cc1f1fe07700f45fff3 diff --git a/scripts/notebook_tools/twin_pairs.d/app-16-crossword-csp.yaml b/scripts/notebook_tools/twin_pairs.d/app-16-crossword-csp.yaml index 8fef6fc57b..fe92a1d7b0 100644 --- a/scripts/notebook_tools/twin_pairs.d/app-16-crossword-csp.yaml +++ b/scripts/notebook_tools/twin_pairs.d/app-16-crossword-csp.yaml @@ -1,7 +1,7 @@ - name: App-16 Crossword CSP family: Search/Applications python: MyIA.AI.Notebooks/Search/Applications/CSP/App-16-Crossword-CSP.ipynb - csharp: MyIA.AI.Notebooks/Search/Applications/CSP/App-16-Crossword-CSP-Csharp.ipynb + csharp: MyIA.AI.Notebooks/Search/Applications/CSP/App-16-Crossword-CSP-CSharp.ipynb parity_level: native-both bridge_verdict: SOTA-OK bridge_verdict_reason: "Python = OR-Tools CP-SAT (cp_model + AddElement/inter constraints, dataclass) + numpy + matplotlib (11 cellules code). C# = Google.OrTools.Sat (NuGet, C# binding du MEME engine OR-Tools CP-SAT 9.11) + Tranche 1 from-scratch BCL pure (System.Linq/Text, 0 NuGet) PRESERVEE (12 cellules code). Verdict SOTA-OK (lib-vs-lib native-both) : les deux cotes invoquent le MEME moteur CP-SAT 9.11 (ortools.sat.python.cp_model <-> Google.OrTools.Sat.CpModel). Prong-B (#3801) : hierarchie sur grids 15x15 -- exact SOLUTION_OPTIMAL, backtracking from-scratch timeout sur les grands grilles -- discrimination mesuree. Tranche 1 from-scratch preservee intacte (byte-identique a main). Python met l'accent sur SOTA + viz matplotlib + experimentation comparative ; C# demontre from-scratch + binding NuGet. parity_level: native-both preserve." diff --git a/scripts/notebook_tools/twin_pairs.d/app-18-hyperparametertuning/0006-2026-09-13-lane-myia-po-2023-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/app-18-hyperparametertuning/0006-2026-09-13-lane-myia-po-2023-CoursIA-2.yaml new file mode 100644 index 0000000000..924588e6af --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/app-18-hyperparametertuning/0006-2026-09-13-lane-myia-po-2023-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-09-13' +by: lane myia-po-2023:CoursIA-2 +python_sha: 17ba5d66c7ff9ea1eae59c503364c77210b9c50a +csharp_sha: d1a40d93d1e1e33d98d3ea587e08700047bfcadb +content_python_sha: 73920f7e8592771a8d78b6b7e285242e81f2e5c883da5d5ba5097102d78ce505 +content_csharp_sha: 61f67ec6bb0f8f7dc3d71215c168723efe443be68a543bc71bb069b011e336ea diff --git a/scripts/notebook_tools/twin_pairs.d/app-19-proceduralgeneration-wfc.yaml b/scripts/notebook_tools/twin_pairs.d/app-19-proceduralgeneration-wfc.yaml index d1fc7ebf3a..a7014a688a 100644 --- a/scripts/notebook_tools/twin_pairs.d/app-19-proceduralgeneration-wfc.yaml +++ b/scripts/notebook_tools/twin_pairs.d/app-19-proceduralgeneration-wfc.yaml @@ -1,7 +1,7 @@ - name: App-19 ProceduralGeneration WFC family: Search/Applications python: MyIA.AI.Notebooks/Search/Applications/CSP/App-19-ProceduralGeneration-WFC.ipynb - csharp: MyIA.AI.Notebooks/Search/Applications/CSP/App-19-ProceduralGeneration-WFC-Csharp.ipynb + csharp: MyIA.AI.Notebooks/Search/Applications/CSP/App-19-ProceduralGeneration-WFC-CSharp.ipynb parity_level: native-both bridge_verdict: SOTA-OK bridge_verdict_reason: "Python = `wfc_cpsat` (module local qui wrappe `ortools` CP-SAT, moteur de production) + ipywidgets + matplotlib viz. C# = WFC from-scratch BCL pure (sections 1-8) + Tranche 2 : binding officiel **Google.OrTools CP-SAT** (NuGet 9.11.4210) portant le meme modele que le jumeau — adjacence par disjonction AddBoolOr, ratio sol 30-60 %, densite ennemis 5-20 %, comptes cles/coffres exacts, relaxation flow connectivite (source (0,0) forcee sol + arcs entrants), objectif variete via AddElement. Mesure 12x12 seed 42, instance identique au jumeau (cell 10) : 43 cases sol (30 %), 3 ennemis (7,0 % du sol), 1 cle, 1 coffre, connectivite BFS 7 % des cases sol (relaxation flow — meme ordre de grandeur que le ~7 % observe du jumeau), OPTIMAL ~1,5 s. Prong B : les contraintes globales (ratio, densite, comptes, connectivite) sont hors de portee du WFC pur (contraintes locales + backtracking) — le passage au solveur industriel fait valoir le moteur. parity_level: native-both : les deux cotes atteignent un moteur de production (OR-Tools CP-SAT)." diff --git a/scripts/notebook_tools/twin_pairs.d/app-6-minesweeper.yaml b/scripts/notebook_tools/twin_pairs.d/app-6-minesweeper.yaml index 99f5fa8547..a006686cac 100644 --- a/scripts/notebook_tools/twin_pairs.d/app-6-minesweeper.yaml +++ b/scripts/notebook_tools/twin_pairs.d/app-6-minesweeper.yaml @@ -1,7 +1,7 @@ - name: App-6 Minesweeper family: Search/Applications python: MyIA.AI.Notebooks/Search/Applications/CSP/App-6-Minesweeper.ipynb - csharp: MyIA.AI.Notebooks/Search/Applications/CSP/App-6-Minesweeper-Csharp.ipynb + csharp: MyIA.AI.Notebooks/Search/Applications/CSP/App-6-Minesweeper-CSharp.ipynb parity_level: native-both bridge_verdict: SOTA-OK bridge_verdict_reason: "Resolved 2026-08-12 (myia-po-2023:CoursIA, tranche 2). Le C# desormais branche Google.OR-Tools CP-SAT (#r nuget:Google.OrTools), le meme solveur de production que le twin Python. Le verdict RECOVERABLE-LOCAL pose par #10588 (ecart = NuGet first-class manquant) est clot : le port est livre. Le solveur from-scratch (section 4) reste pour enseigner la mecanique ; la tranche 2 (section 4bis) demontre la deduction par propagation UNSAT + la contrainte globale total-mines (Exercice 1), deux capacites que le backtracking manuel n'a pas. parity_level passe semantic -> native-both : les deux twins invoquent maintenant le solveur natif de leur ecosysteme (OR-Tools)." diff --git a/scripts/notebook_tools/twin_pairs.d/app-8-minizinc.yaml b/scripts/notebook_tools/twin_pairs.d/app-8-minizinc.yaml index 341fcab59d..c4bf0d5f18 100644 --- a/scripts/notebook_tools/twin_pairs.d/app-8-minizinc.yaml +++ b/scripts/notebook_tools/twin_pairs.d/app-8-minizinc.yaml @@ -1,12 +1,12 @@ - name: App-8 MiniZinc family: Search/Applications python: MyIA.AI.Notebooks/Search/Applications/CSP/App-8-MiniZinc.ipynb - csharp: MyIA.AI.Notebooks/Search/Applications/CSP/App-8-MiniZinc-Csharp.ipynb + csharp: MyIA.AI.Notebooks/Search/Applications/CSP/App-8-MiniZinc-CSharp.ipynb parity_level: native-both bridge_verdict: SOTA-OK bridge_verdict_reason: "Python = minizinc (binding Python pour MiniZinc modeling language, MIT, https://github.com/MiniZinc/libminizinc, dekker 2024) + OR-Tools CP-SAT (driver pour cross-solve depuis MiniZinc) + numpy + matplotlib (19 cellules code). C# = Google.OrTools.Sat (NuGet, C# binding OR-Tools CP-SAT 9.11) + System.* BCL, 14 cellules code. Verdict SOTA-OK (lib-vs-lib) : Python invoque minizinc (modeling language) + OR-Tools CP-SAT (solver backend) ; C# invoque Google.OrTools.Sat (C# binding du MEME engine OR-Tools CP-SAT 9.11). MiniZinc utilise OR-Tools comme solver backend par defaut, donc les deux cotes aboutissent au MEME moteur CP-SAT reel. L'asymetrie est mineure : Python passe par la couche modeling language MiniZinc (plus declarative, plus haut niveau d'abstraction), C# utilise directement le binding CP-SAT (plus proche du moteur). parity_level: semantic preserve (post-#10382 les deux cotes utilisent le MEME solver)." known_differences: - - '2026-08-31 : ATTESTATION UNILATERALE (PR #13659, lane myia-ai-01:CoursIA) -- reparation d''echappements JSON manges dans le markdown du cote Python. CAUSE : dans le .ipynb, la sequence dollar-\bot-dollar ecrite avec UN SEUL antislash est lue par le parseur JSON comme l''echappement \b (backspace, U+0008) ; la source chargee porte un caractere de controle et le notebook rend un dollar-ot-dollar prive de sa commande LaTeX. FIX : doubler l''antislash (\\bot). Le DRIFT est UNILATERAL parce que le DEFAUT l''est : la contrepartie App-8-MiniZinc-Csharp.ipynb (C#), 19 cellules markdown, a ete scannee sous controle positif (le litteral defectueux passe a json.loads doit rendre U+0008 -- assertion verifiee avant le scan) et ne porte AUCUN caractere de controle U+0008/U+000B/U+000C. Il n''y a donc rien a reparer de ce cote : l''attestation ne consacre aucune asymetrie de contenu. PORTEE DU DIFF cote repare (comparaison des JSON parses origin/main -> HEAD) : markdown uniquement, 0 cellule code touchee, 0 sortie modifiee, 0 execution_count deplace, 0 cellule ajoutee ou retiree.' + - '2026-08-31 : ATTESTATION UNILATERALE (PR #13659, lane myia-ai-01:CoursIA) -- reparation d''echappements JSON manges dans le markdown du cote Python. CAUSE : dans le .ipynb, la sequence dollar-\bot-dollar ecrite avec UN SEUL antislash est lue par le parseur JSON comme l''echappement \b (backspace, U+0008) ; la source chargee porte un caractere de controle et le notebook rend un dollar-ot-dollar prive de sa commande LaTeX. FIX : doubler l''antislash (\\bot). Le DRIFT est UNILATERAL parce que le DEFAUT l''est : la contrepartie App-8-MiniZinc-CSharp.ipynb (C#), 19 cellules markdown, a ete scannee sous controle positif (le litteral defectueux passe a json.loads doit rendre U+0008 -- assertion verifiee avant le scan) et ne porte AUCUN caractere de controle U+0008/U+000B/U+000C. Il n''y a donc rien a reparer de ce cote : l''attestation ne consacre aucune asymetrie de contenu. PORTEE DU DIFF cote repare (comparaison des JSON parses origin/main -> HEAD) : markdown uniquement, 0 cellule code touchee, 0 sortie modifiee, 0 execution_count deplace, 0 cellule ajoutee ou retiree.' - "Socle pedagogique commun : MiniZinc (modeling language CSP, OR-Tools CP-SAT cross-solve) comme application canonique. Les deux twins couvrent le meme socle theorique (formulation variables/domaines/contraintes, resolution, experimentation) avec parite semantique sur les concepts cibles." - "Idiomes framework : Python = minizinc + OR-Tools CP-SAT ; C# = Google.OrTools.Sat NuGet (C# binding du meme solver OR-Tools)." - "Asymetrie pedagogique : Python met l'accent sur le solveur SOTA (OR-Tools CP-SAT / library specialisee) + visualisation matplotlib + experimentation comparative ; le C# demontre l'implementation from-scratch en BCL pure (ou binding NuGet du meme solver pour App-8/10/15), presentation compacte. Meme socle theorique, leviers de demonstration differents." diff --git a/scripts/notebook_tools/twin_pairs.d/planners-4-fast-downward/0008-2026-09-13-lane-myia-po-2023-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/planners-4-fast-downward/0008-2026-09-13-lane-myia-po-2023-CoursIA-2.yaml new file mode 100644 index 0000000000..b52c23f968 --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/planners-4-fast-downward/0008-2026-09-13-lane-myia-po-2023-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-09-13' +by: lane myia-po-2023:CoursIA-2 +python_sha: 90853b19dc0d5375a47c21372a4664aa4bff5786 +csharp_sha: fd5bf5bc76ac9c24d2c9268fe15e4ccaaeb16bf5 +content_python_sha: e2274aa89c2aca8823dd3cc1b2f8a5e3f61158a6fd9f3847251e11ddaa97d551 +content_csharp_sha: d9b439a500f192e57eb0f9126a4e36d0e7dddc9f8b56ad21112f67478f8070e6