diff --git a/MyIA.AI.Notebooks/SymbolicAI/Tweety/Tweety-07a-Extended-Frameworks-CSharp.ipynb b/MyIA.AI.Notebooks/SymbolicAI/Tweety/Tweety-07a-Extended-Frameworks-CSharp.ipynb index 12d67a2ab8..d17720cbcf 100644 --- a/MyIA.AI.Notebooks/SymbolicAI/Tweety/Tweety-07a-Extended-Frameworks-CSharp.ipynb +++ b/MyIA.AI.Notebooks/SymbolicAI/Tweety/Tweety-07a-Extended-Frameworks-CSharp.ipynb @@ -2511,27 +2511,6 @@ "Arguments `a` (Economie), `b` (Environnement), `c` (Justice), attaques `a->b`, `b->c`, `c->a` (cycle). Testez les 3 ordres cycliques et identifiez celui qui donne le plus grand grounded.\n" ] }, - { - "cell_type": "markdown", - "id": "1171b43b", - "metadata": { - "tags": [], - "papermill": { - "duration": 0.024846, - "end_time": "2026-09-02T02:09:42.703295+00:00", - "exception": false, - "start_time": "2026-09-02T02:09:42.678449+00:00", - "status": "completed" - } - }, - "source": [ - "### 8.1 Exercice 1 : ADF cyclique\n", - "\n", - "Construire l'ADF a deux arguments `a : not b` et `b : not a` avec la classe `ADF` de la tranche 1, puis calculer le grounded.\n", - "\n", - "Le cycle est symetrique : aucun des deux arguments ne peut etre decide sans supposer l'autre deja decide. Observer ce que le point fixe 3-valued en fait, et comparer avec ce que produirait un cadre de Dung sur deux arguments qui s'attaquent mutuellement." - ] - }, { "cell_type": "code", "execution_count": 15, @@ -2573,27 +2552,6 @@ "Show(\"Exo1\", \"Exercice a completer : ADF cyclique (attendu : extension grounded vide, tous U)\");\n" ] }, - { - "cell_type": "markdown", - "id": "494d68d7", - "metadata": { - "tags": [], - "papermill": { - "duration": 0.019217, - "end_time": "2026-09-02T02:09:42.887796+00:00", - "exception": false, - "start_time": "2026-09-02T02:09:42.868579+00:00", - "status": "completed" - } - }, - "source": [ - "### 8.2 Exercice 2 : SetAF, une attaque qui n'existe qu'a plusieurs\n", - "\n", - "Construire le SetAF sur `{x, y, z}` avec les attaques d'ensembles `{x,y} -> z` puis `{z} -> x`, et calculer le grounded.\n", - "\n", - "Tout l'interet est dans la premiere attaque : elle n'est portee par aucun des deux arguments pris isolement. Determiner lesquels sortent *in*, puis se demander ce que deviendrait le resultat si `{x,y} -> z` etait remplacee par les deux attaques simples `x -> z` et `y -> z`." - ] - }, { "cell_type": "code", "execution_count": 16, @@ -2635,27 +2593,6 @@ "Show(\"Exo2\", \"Exercice a completer : SetAF 3 args (qui est IN ?)\");\n" ] }, - { - "cell_type": "markdown", - "id": "6a2e0a41", - "metadata": { - "tags": [], - "papermill": { - "duration": 0.021203, - "end_time": "2026-09-02T02:09:43.039345+00:00", - "exception": false, - "start_time": "2026-09-02T02:09:43.018142+00:00", - "status": "completed" - } - }, - "source": [ - "### 8.3 Exercice 3 : EAF, casser une reinstallation\n", - "\n", - "Reprendre l'EAF de la section 5 (`a -> b`, plus la meta-attaque de `c` sur l'attaque `a -> b`), ajouter l'argument `d` et l'attaque `d -> c`, puis recalculer le grounded avec `useMeta: true`.\n", - "\n", - "`c` neutralisait l'attaque `a -> b` : tant que `c` tient, `b` survit. En mettant `c` *out*, on rend son effet a `a -> b`. Suivre la chaine et verifier ce que devient `b`." - ] - }, { "cell_type": "code", "execution_count": 17, @@ -2696,27 +2633,6 @@ "Show(\"Exo3\", \"Exercice a completer : EAF avec c OUT -> b OUT (reinstatement perdu)\");\n" ] }, - { - "cell_type": "markdown", - "id": "43c8c22a", - "metadata": { - "tags": [], - "papermill": { - "duration": 0.018281, - "end_time": "2026-09-02T02:09:43.172395+00:00", - "exception": false, - "start_time": "2026-09-02T02:09:43.154114+00:00", - "status": "completed" - } - }, - "source": [ - "### 8.4 Exercice 4 : VAF, l'ordre des valeurs decide du cycle\n", - "\n", - "Construire le VAF cyclique `a -> b -> c -> a` en affectant a chaque argument une valeur distincte (Economie, Environnement, Justice), puis faire varier l'ordre de preference sur les valeurs.\n", - "\n", - "Un cycle impair est le cas ou Dung ne tranche rien. Ici l'ordre des valeurs peut rendre une des trois attaques inoperante et debloquer le cycle : tester plusieurs ordres, identifier ceux qui maximisent l'extension fondee — et voir s'il en existe qui ne debloquent rien du tout." - ] - }, { "cell_type": "code", "execution_count": 18, diff --git a/MyIA.AI.Notebooks/SymbolicAI/Tweety/Tweety-11-Causal-Csharp.ipynb b/MyIA.AI.Notebooks/SymbolicAI/Tweety/Tweety-11-Causal-Csharp.ipynb index 13e4690569..c431cd2f65 100644 --- a/MyIA.AI.Notebooks/SymbolicAI/Tweety/Tweety-11-Causal-Csharp.ipynb +++ b/MyIA.AI.Notebooks/SymbolicAI/Tweety/Tweety-11-Causal-Csharp.ipynb @@ -821,20 +821,6 @@ "Show(\" Le lien storm -> drops est ROMPU : drops ne depend plus de storm.\");\n" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Que lit-on dans la chirurgie ?** En comparant les deux affichages : le SCM original porte trois\n", - "équations (`drops <=> storm`, `rain <=> storm`) ; le SCM après `do(drops=True)` ne porte plus\n", - "l'équation de `drops` — remplacée par une constante. Deux conséquences immédiates :\n", - "\n", - "- l'observation `drops=True` n'informe plus sur `storm` (plus de canal) : `P(rain | do(drops))`\n", - " retombe sur la valeur de base — le baromètre cassé ne fait pas pleuvoir ;\n", - "- la *corrélation* `drops ⇔ rain` de la section 3 a disparu **par construction**, sans toucher aux\n", - " données : c'est une modification du mécanisme générateur, pas un filtrage d'échantillons." - ] - }, { "cell_type": "markdown", "id": "fa30c257", @@ -1409,17 +1395,6 @@ "Show(\" coupe bien le lien cloudy -> sprinkler, exactement comme la chirurgie from-scratch du §3.\");" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Lecture du pont.** Les trois sorties ci-dessus montrent le même réseau, la même intervention et le\n", - "même contrefactuel que les sections 3-5, mais calculés par le moteur **TweetyProject** (Java) exécuté\n", - "dans le processus .NET via IKVM. L'intérêt pédagogique est la **parité** : notre implémentation\n", - "from-scratch des sections 1-2 n'est pas une simplification qualitative, elle reproduit le comportement\n", - "de la référence académique — l'écart éventuel serait un bug de notre moteur, pas une limite de méthode." - ] - }, { "cell_type": "markdown", "id": "7c9dd2d6", @@ -1494,34 +1469,6 @@ "> mais l'intervention `do(education)` coupe ce lien — l'effet direct devrait tomber à False." ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Le protocole des exercices.** Les trois exercices suivants rejouent les gestes des sections 3-5 sur\n", - "des réseaux inédits, chacun ciblant une confusion classique : l'exercice 1 distingue observation et\n", - "intervention sur une chaîne `education → skill → income` ; l'exercice 2 montre qu'un `do` ne remonte\n", - "pas la flèche causale (intervenir sur un effet ne change pas la cause) ; l'exercice 3 demande le\n", - "contrefactuel *sur la cause* cette fois — le miroir de la section 5. Les squelettes sont exécutables\n", - "tels quels (C.1) : chaque cellule affiche ce qu'il faut construire, et les indices suffisent à écrire\n", - "les 3-5 lignes attendues avec l'API des sections 1-2." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Attendu de l'exercice 1, pour auto-vérification.** Si votre implémentation est juste :\n", - "`observe(skill=True)` doit propager vers `income=True` (la corrélation se lit dans les deux sens sur\n", - "la chaîne), tandis que `do(skill=True)` doit laisser `education` à sa valeur de fond — l'intervention\n", - "coupe la flèche entrante, elle ne la remonte pas. Ce couple de verdicts est le même discriminant que\n", - "le réseau Sprinkler de la section 4 : c'est la signature qu'on interroge le mécanisme, pas seulement\n", - "la corrélation.\n", - "\n", - "Un contrôle anti-piège utile : si vos deux verdicts sont identiques, vous avez probablement écrit\n", - "`observe` aux deux endroits — le `do` se reconnaît à ce que SA cible garde sa valeur de fond." - ] - }, { "cell_type": "code", "execution_count": 12, @@ -1713,25 +1660,6 @@ "Show(\" (reflechir : cloudy est la cause de rain ; si cloudy avait ete faux, rain n'aurait pas eu lieu)\");\n" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Synthèse — les trois barreaux de l'échelle causale\n", - "\n", - "Les sections précédentes ont gravi, dans l'ordre, les trois barreaux de l'échelle de la causalité (Pearl) :\n", - "\n", - "| Barreau | Question | Outil du notebook | Exemple mesuré |\n", - "|---|---|---|---|\n", - "| 1. **Associer** | *que voit-on ensemble ?* | `observe` sur le SCM propagé | `observe(drops)` → `rain=True` (corrélation baromètre/pluie) |\n", - "| 2. **Intervenir** | *que se passe-t-il si je force ?* | `do` = chirurgie sur l'équation | `do(rain)` n'active plus `sprinkler` dans le réseau de sec. 4 |\n", - "| 3. **Imaginer** | *qu'aurait-il fallu d'autre ?* | contrefactuel `cf` | herbe mouillée même avec `sprinkler=OFF` car `rain` suffisait |\n", - "\n", - "La coupure entre barreau 1 et barreau 2 est LA leçon du notebook : aucune quantité d'observation, aussi\n", - "grande soit-elle, ne remplace l'intervention — c'est une différence de *nature* (le modèle structural),\n", - "pas de degré (plus de données)." - ] - }, { "cell_type": "markdown", "id": "02c12c96", diff --git a/MyIA.AI.Notebooks/SymbolicAI/Tweety/Tweety-3-Advanced-Logics-Csharp.ipynb b/MyIA.AI.Notebooks/SymbolicAI/Tweety/Tweety-3-Advanced-Logics-Csharp.ipynb index 1b591156a6..f0a74fb660 100644 --- a/MyIA.AI.Notebooks/SymbolicAI/Tweety/Tweety-3-Advanced-Logics-Csharp.ipynb +++ b/MyIA.AI.Notebooks/SymbolicAI/Tweety/Tweety-3-Advanced-Logics-Csharp.ipynb @@ -542,19 +542,6 @@ "\n" ] }, - { - "cell_type": "markdown", - "id": "8a2e56b2", - "metadata": { - "papermill": {}, - "tags": [] - }, - "source": [ - "### Les trois exercices : une échelle sur la même API\n", - "\n", - "Les stubs forment une progression sur la surface vue aux sections 2 et 3. **Exercice 1** — une chaîne de subsomption à trois niveaux (`Salarie`/`Personne`/`Employe`) : le même geste que le test 1 de la section 3, porté à deux arêtes au lieu d'une, avec la question du sens des flèches (`Salarie subsume Personne` vs `Salarie subsume Employe` — les deux lignes du stub les distinguent). **Exercice 2** — un rôle et une **restriction existentielle** : là où la section 2 ne posait que des concepts atomiques et une intersection, il faut ici un rôle binaire (`hasParent`) et l'assertion `alice : exists hasParent . Human` — l'API des rôles vue vide dans la signature de la cellule 8 entre enfin en scène. **Exercice 3** — la cohabitation exemple + exercice dans la même base : la conjonction de deux assertions sur `alice` (Human et Salarie) vérifie que l'étudiant combine les constructions au lieu de les copier. Les sorties `Exercice a completer` sont les diagnostics conventionnels des stubs (règle C.1) : le notebook s'exécute de bout en bout incomplet." - ] - }, { "cell_type": "markdown", "id": "4b71c541e959", diff --git a/MyIA.AI.Notebooks/SymbolicAI/Tweety/Tweety-4-Aspic-Csharp.ipynb b/MyIA.AI.Notebooks/SymbolicAI/Tweety/Tweety-4-Aspic-Csharp.ipynb index c35d219e42..da6e062b03 100644 --- a/MyIA.AI.Notebooks/SymbolicAI/Tweety/Tweety-4-Aspic-Csharp.ipynb +++ b/MyIA.AI.Notebooks/SymbolicAI/Tweety/Tweety-4-Aspic-Csharp.ipynb @@ -888,19 +888,6 @@ "\n" ] }, - { - "cell_type": "markdown", - "id": "100b1042", - "metadata": { - "papermill": {}, - "tags": [] - }, - "source": [ - "### Les trois exercices : retrouver les flèches du pingouin\n", - "\n", - "Les trois stubs ramènent au contraste des sections 2 et 4. **Exercice 1** — lever l'indétermination du vol par une **règle stricte** : l'énoncé reprend l'exemple Tweety et demande la règle qui fait de `!flies` une conséquence certaine (la même idée que `penguin -> bird`) ; la question « `!flies` skeptiquement accepté ? » teste la lecture de la fondée. **Exercice 2** — un **cycle défaisable à trois** (`p => q => r => p`) : l'énigme posée aux préférées ; la sortie attendue énumèrera les extensions, et le contraste avec le cas sans cycle répond tout seul. **Exercice 3** — une mini-théorie libre (juridique ou médical) : combiner un fait, une règle et une contradiction réaliste, et prédire le verdict fondé avant de l'afficher. Les sorties `Exercice a completer` sont les diagnostics C.1 des stubs : le notebook s'exécute incomplet." - ] - }, { "cell_type": "markdown", "id": "m28626", diff --git a/MyIA.AI.Notebooks/SymbolicAI/Tweety/Tweety-5d-Stable-Synthesis-Lean.ipynb b/MyIA.AI.Notebooks/SymbolicAI/Tweety/Tweety-5d-Stable-Synthesis-Lean.ipynb index 1686eda4cf..3d06fb5c0e 100644 --- a/MyIA.AI.Notebooks/SymbolicAI/Tweety/Tweety-5d-Stable-Synthesis-Lean.ipynb +++ b/MyIA.AI.Notebooks/SymbolicAI/Tweety/Tweety-5d-Stable-Synthesis-Lean.ipynb @@ -193,19 +193,6 @@ " print(f\" {a} attaque {b}\")" ] }, - { - "cell_type": "markdown", - "id": "4105e589", - "metadata": { - "papermill": {}, - "tags": [] - }, - "source": [ - "### Lire la spécification : six arguments, huit attaques, deux paires mutuelles\n", - "\n", - "La sortie est la transcription du graphe `AF-A` : un en-tête qui nomme les compteurs (`6 arguments, 8 attaques`) puis huit lignes, une par arête, dans l'ordre où elles ont été déclarées. Deux lectures structurales. **Les paires mutuelles** : `0 attaque 1` et `1 attaque 0`, `4 attaque 5` et `5 attaque 4` — deux conflits bidirectionnels, les seuls qui interdisent frontalement la coexistence de deux arguments dans une extension. **Les attaques unidirectionnelles** : `2 attaque 3`, `1 attaque 3`, `3 attaque 4`, `0 attaque 5` — elles relient les paires entre elles et donnent au graphe sa connectivité. Le dernier point de lecture est l'ordre : les huit lignes s'impriment dans l'ordre source, pas triées — c'est le graphe « brut » que les sections suivantes soumettent tel quel au solveur." - ] - }, { "cell_type": "markdown", "id": "b6f47728", @@ -307,19 +294,6 @@ "print(f\"Témoin S = {{{witness}}}\")" ] }, - { - "cell_type": "markdown", - "id": "bfbe6f90", - "metadata": { - "papermill": {}, - "tags": [] - }, - "source": [ - "### Lire le verdict sat : un témoin de trois arguments\n", - "\n", - "Deux lignes, deux informations. `Z3 : sat` dit que la spécification est satisfiable — il existe au moins un sous-ensemble stable ; le solveur l'affirme par modèle, et la `sanity` de la cellule suivante le relit par les deux prédicats. `Témoin S = {[1, 2, 5]}` imprime ensuite le choix : trois arguments sur six, dans l'ordre croissant 1, 2, 5. Ce que la sortie ne dit pas, et que la lecture doit mesurer, c'est la taille du rôle : parmi les 2⁶ = 64 candidats du sous-ensemble, le solveur en a visité l'espace par contraintes et rend un témoin que la section suivante soumettra à une vérification indépendante — le geste « constructeur » de la Loi II, une valeur à la main, jamais affirmée." - ] - }, { "cell_type": "markdown", "id": "c2f7be1c", @@ -476,19 +450,6 @@ "print(\"Dissociation confirmee a la borne n = 3 : aucune extension stable n'existe.\")" ] }, - { - "cell_type": "markdown", - "id": "efddd20c", - "metadata": { - "papermill": {}, - "tags": [] - }, - "source": [ - "### Lire l'unsat : AUCUN et une borne\n", - "\n", - "La sortie déclare l'absence en trois lignes de plus en plus fortes : `Z3 sur le 3-cycle : unsat` (le solveur ne trouve pas de modèle), `Ensembles sans conflit ET dominants : AUCUN` (la quantification sur les 2³ = 8 sous-ensembles du 3-cycle est exhaustive), `Dissociation confirmee a la borne n = 3 : aucune extension stable n'existe.` (le verdict passe au général). La lecture honnête du triplet : l'UNSAT est une preuve d'absence par contraintes — Z3 ne parcourt pas les candidats, il montre qu'aucun modèle de la spécification n'existe, et son verdict vaut pour ce graphe et cette taille. C'est exactement le contraste que la section creuse : le même outil qui a rendu sat sur AF-A rend unsat ici, et les deux verdicts sont imprimés avec le même statut — le notebook enregistre la dissociation entre substrats comme un résultat." - ] - }, { "cell_type": "markdown", "id": "4edacdd4", @@ -810,19 +771,6 @@ "print(\"Exercice a completer\")" ] }, - { - "cell_type": "markdown", - "id": "bc9a37e8", - "metadata": { - "papermill": {}, - "tags": [] - }, - "source": [ - "### Lire les trois exercices : l'échelle qui vérifie la loi\n", - "\n", - "Les trois cellules d'exercice impriment la même invite (`Exercice a completer`) — le contrat C.1 : le notebook s'exécute d'un bout à l'autre, la vérification est l'étudiant. L'échelle se lit dans les énoncés : **Exercice 1** ajoute un septième argument (arêtes (2, 6) et (6, 5)) et demande si le témoin {1, 2, 5} tient encore — un premier test de robustesse du témoin face à une spécification étendue ; **Exercice 2** passe du 3-cycle au 4-cycle (0 → 1 → 2 → 3 → 0) et questionne les cycles pairs : le 3-cycle n'a pas d'extension stable, le 4-cycle en a-t-il une ? — la parité devient l'hypothèse ; **Exercice 3** généralise par l'expérience (tester les 1-AF et 2-AF exhaustivement) le fait que l'ensemble vide n'est jamais stable dès qu'il y a un argument — la clause de dominance qui l'interdit est à nommer exactement. Trois exercices, trois niveaux : re-mesurer un objet, changer l'hypothèse, exhiber la clause." - ] - }, { "cell_type": "markdown", "id": "1428a951", diff --git a/scripts/notebook_tools/twin_pairs.d/tweety-11-causal.yaml b/scripts/notebook_tools/twin_pairs.d/tweety-11-causal.yaml index f4c00eafa1..44dc72877a 100644 --- a/scripts/notebook_tools/twin_pairs.d/tweety-11-causal.yaml +++ b/scripts/notebook_tools/twin_pairs.d/tweety-11-causal.yaml @@ -7,5 +7,6 @@ bridge_verdict_reason: "Python = JPype vers la vraie lib Java Tweety causal-1.30 (`from org.tweetyproject.causal.reasoner import ArgumentationBasedCausalReasoner`). C# = §§1-5 from-scratch pedagogique (do-calculus reimplemente, titre 'twin C# from-scratch') + §6 (PR #10570) pont IKVM chargeant `org.tweetyproject.tweety-causal.dll` (DLL build #10566, 13/13 classes causales actives, verifie firsthand via Assembly.GetExportedTypes) : `StructuralCausalModel.intervene()` Java reel invoque sous le runtime IKVM 8.15. Verdict SOTA-OK (pas de workaround degrade) : §6 prouve la parite moteur-contre-moteur -- `do(sprinkler=True)` produit `sprinkler <=> +` (surgery Java reel) IDENTIQUE au do-calculus from-scratch §3 `do(drops=True)` -> `drops <=> +`. Les DEUX cotes executent le meme moteur Java Tweety causal (Python via JPype, C# via IKVM). parity_level reste `surface` car le mode pedagogique primaire reste §§1-5 from-scratch ; §6 est le pont de validation qui confirme la conformite du from-scratch au moteur de reference." known_differences: - "2026-09-15 (PR #16319, myia-po-2026:CoursIA) : enrichissement markdown-only cote C# (tranche densite #13410, +9 cellules d'interpretation) ; cellules code et outputs byte-identiques (md5 avant/apres), twin Python intact." + - "2026-09-25 (PR #17058, myia-po-2025:CoursIA-2, redressement densite #17040) : retrait de 5 de ces cellules cote C# (3 doublons de lectures deja presentes, 2 lectures de cellules d'exercice) ; 4 cellules d'interpretation conservees (4, 7, 16, 21) ; cellules code et outputs byte-identiques (14/14 verifiees main vs tete), twin Python intact -- le Python n'a jamais porte ces cellules, la suppression ne fait que reduire l'asymetrie ouverte par #16319." - "Socle commun : inference causale et do-calculus (Pearl) sur modeles causaux structurels." - "Asymetrie de profondeur (surface) : le Python s'appuie sur la vraie bibliotheque Java Tweety `causal-1.30.jar` via JPype (`from org.tweetyproject.causal.reasoner import ArgumentationBasedCausal`). C# §§1-5 = jumeau **from-scratch** pedagogique (titre 'twin C# from-scratch', reimplemente le do-calcul) ; §6 (PR #10570) ajoute un pont IKVM vers la meme DLL Java `tweety-causal.dll` (build #10566) -- §§1-5 from-scratch et pont §6 donnent le meme resultat surgery (`<=> +`), validant la conformite du from-scratch au moteur de reference. Parite `surface` (mode primaire = from-scratch) avec pont de validation SOTA-OK en §6." diff --git a/scripts/notebook_tools/twin_pairs.d/tweety-11-causal/0011-2026-09-25-myia-po-2025-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/tweety-11-causal/0011-2026-09-25-myia-po-2025-CoursIA-2.yaml new file mode 100644 index 0000000000..5e50c51e4f --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/tweety-11-causal/0011-2026-09-25-myia-po-2025-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-09-25' +by: myia-po-2025:CoursIA-2 +python_sha: 31af5d293d415afd765bad5163f120d5afec8ad1 +csharp_sha: c431cd2f654382e09af4675ea8677b41135d586f +content_python_sha: 0aac270d1addf04051129029a59e070afb362893d1d490eb1c6bfbc0dd4d5a87 +content_csharp_sha: 2afffe6eeaffbe21e0e1eed0bd2c999e3728c0095b9c8540bb79bc4e26372740 diff --git a/scripts/notebook_tools/twin_pairs.d/tweety-3-advanced-logics/0007-2026-09-25-myia-po-2025-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/tweety-3-advanced-logics/0007-2026-09-25-myia-po-2025-CoursIA-2.yaml new file mode 100644 index 0000000000..b17c23447a --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/tweety-3-advanced-logics/0007-2026-09-25-myia-po-2025-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-09-25' +by: myia-po-2025:CoursIA-2 +python_sha: aebffde4c2a7da67d2834d8072f2fe6d54287764 +csharp_sha: f0a74fb660f41983664c968a69de45addadf592c +content_python_sha: 9eaf16b3f99c3b984d924fe6d58ff023c43793e57d3ccb6bd1eaf2bc56360a3b +content_csharp_sha: d8147a65db1d386a32007f2706eb4ded5e86f90f58f573f425d34208b28fdcc7 diff --git a/scripts/notebook_tools/twin_pairs.d/tweety-7a-extended-frameworks/0014-2026-09-25-myia-po-2025-CoursIA-2.yaml b/scripts/notebook_tools/twin_pairs.d/tweety-7a-extended-frameworks/0014-2026-09-25-myia-po-2025-CoursIA-2.yaml new file mode 100644 index 0000000000..e78f488b61 --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/tweety-7a-extended-frameworks/0014-2026-09-25-myia-po-2025-CoursIA-2.yaml @@ -0,0 +1,6 @@ +date: '2026-09-25' +by: myia-po-2025:CoursIA-2 +python_sha: dea6b917d24172003a44ae27e5713c31cd9fc193 +csharp_sha: d17720cbcf977664e914e5fd031e8e9d7aa7c62c +content_python_sha: 82435911c2efa65ea80a5f304092417e508f61abb1ff3ae247e1a17f517bb41a +content_csharp_sha: 17b933735f17ea6535c7dc8e7a3a11182908aab1a5aa27445863f084ea837f65