From 35c0c7bd3e91890a693ffe9336c4fe2c4fe529a4 Mon Sep 17 00:00:00 2001 From: jsboige Date: Sun, 20 Sep 2026 22:32:14 +0200 Subject: [PATCH 01/10] fix(density,#17040): Diagnostic-Medical solution - 12 lectures campagne supprimees Co-Authored-By: Claude Haiku 4.5 (1M context) --- .../solution/Diagnostic-Medical.ipynb | 122 +----------------- 1 file changed, 1 insertion(+), 121 deletions(-) diff --git a/MyIA.AI.Notebooks/CaseStudies/Diagnostic-Medical/solution/Diagnostic-Medical.ipynb b/MyIA.AI.Notebooks/CaseStudies/Diagnostic-Medical/solution/Diagnostic-Medical.ipynb index b01100daf9..61e28f4372 100644 --- a/MyIA.AI.Notebooks/CaseStudies/Diagnostic-Medical/solution/Diagnostic-Medical.ipynb +++ b/MyIA.AI.Notebooks/CaseStudies/Diagnostic-Medical/solution/Diagnostic-Medical.ipynb @@ -149,16 +149,6 @@ "print(\" Objectif : Implémenter un système de diagnostic médical multi-approches\")" ] }, - { - "cell_type": "markdown", - "id": "lecture-configuration", - "metadata": { - "tags": [] - }, - "source": [ - "**Lecture ancrée** : La configuration du notebook indique une version 2.0.0 avec une durée estimée de 3 heures et un total de 20 points, structurant cette séance pratique en une évaluation complète des compétences en IA médicale. Le module Z3 a été importé avec succès, confirmant que toutes les dépendances nécessaires pour les solveurs de contraintes sont disponibles et opérationnelles dans cet environnement. De plus, les objectifs pédagogiques visent à faire implémenter un système de diagnostic médical intelligent combinant plusieurs approches algorithmiques complémentaires." - ] - }, { "cell_type": "markdown", "id": "2f529696", @@ -271,16 +261,6 @@ "print(f\" Protocoles chargés : {len(protocoles_diabete_type2)} sections\")" ] }, - { - "cell_type": "markdown", - "id": "lecture-patient-class", - "metadata": { - "tags": [] - }, - "source": [ - "**Lecture ancrée** : La classe Patient a été définie avec succès comme une dataclass, structurant les données médicales essentielles : âge, glycémie, HbA1c, symptômes et antécédents. Cette structure permet une manipulation facile des profils patients tout au long du processus de diagnostic automatisé." - ] - }, { "cell_type": "markdown", "id": "18e78368", @@ -484,16 +464,6 @@ "print(f\" Règles chargées : {len(agent.regles_diagnostiques)} catégories\")" ] }, - { - "cell_type": "markdown", - "id": "lecture-diagnostic-agent", - "metadata": { - "tags": [] - }, - "source": [ - "**Lecture ancrée** : L'agent de diagnostic a été initialisé avec 3 catégories de règles cliniques chargées à partir des protocoles médicaux standard. Ces règles, basées sur les recommandations de l'OMS et de l'ADA pour le diabète de type 2, forment la base du raisonnement clinique automatisé qui sera utilisé pour classer les patients selon leur niveau de risque et orienter les décisions thérapeutiques de manière personnalisée et très précise." - ] - }, { "cell_type": "markdown", "id": "488c666b", @@ -657,16 +627,6 @@ "print(\"\\n Tests de l'agent de diagnostic terminés\")" ] }, - { - "cell_type": "markdown", - "id": "lecture-agent-diagnostic", - "metadata": { - "tags": [] - }, - "source": [ - "**Lecture ancrée** : L'agent de diagnostic a correctement classé Alice comme ayant un risque normal (glycémie à jeun 85 mg/dL, HbA1c 5.2%) et n'a détecté aucun symptôme. Cette classification correspond aux seuils cliniques standards où une HbA1c < 5.7% indique une glycémie normale." - ] - }, { "cell_type": "markdown", "id": "19479276", @@ -1005,16 +965,6 @@ "print(f\" Hypothèses possibles : {len(astar.hypotheses_possibles)}\")" ] }, - { - "cell_type": "markdown", - "id": "lecture-astar-class", - "metadata": { - "tags": [] - }, - "source": [ - "**Lecture ancrée** : La classe EtatDiagnostic pour A* a été initialisée avec 7 hypothèses possibles, couvrant l'espace des diagnostics différentiels pour le diabète de type 2. Cette représentation permet à l'algorithme de naviguer efficacement dans l'espace des états cliniques possibles." - ] - }, { "cell_type": "markdown", "id": "5e336442", @@ -1141,16 +1091,6 @@ "print(\"\\n Tests de performance A* terminés\")" ] }, - { - "cell_type": "markdown", - "id": "lecture-astar-performance", - "metadata": { - "tags": [] - }, - "source": [ - "**Lecture ancrée** : L'algorithme A* a convergé en 308 itérations avec un temps d'exécution de 25,50 ms pour le patient simple, produisant l'hypothèse `intolerance_glucose` avec un niveau de confiance de 0,8. Ce résultat démontre l'efficacité de la recherche informée dans l'espace des états diagnostiques." - ] - }, { "cell_type": "markdown", "id": "a595e9f8", @@ -1504,16 +1444,6 @@ "print(f\" Patients de référence : {len(genetique.patients_reference)}\")" ] }, - { - "cell_type": "markdown", - "id": "lecture-genetic-class", - "metadata": { - "tags": [] - }, - "source": [ - "**Lecture ancrée** : L'algorithme génétique a été initialisé avec 5 patients de référence qui serviront de base pour l'optimisation des paramètres diagnostiques. Ces patients de référence permettent d'évaluer la fitness des solutions proposées par l'algorithme évolutionnaire." - ] - }, { "cell_type": "markdown", "id": "1c4e5fb5", @@ -1626,16 +1556,6 @@ "print(\"\\n Tests de convergence génétique terminés\")" ] }, - { - "cell_type": "markdown", - "id": "lecture-genetique-convergence", - "metadata": { - "tags": [] - }, - "source": [ - "**Lecture ancrée** : L'algorithme génétique a fait évoluer le fitness de 16,731 à 17,957 entre les générations 0 et 20, montrant une convergence rapide vers une solution optimale. Cette amélioration progressive reflète l'exploration efficace de l'espace des paramètres diagnostiques." - ] - }, { "cell_type": "markdown", "id": "f499ea4e", @@ -1921,16 +1841,6 @@ "print(f\" Protocoles chargés : {len(solveur.protocoles)} sections\")" ] }, - { - "cell_type": "markdown", - "id": "lecture-z3-class", - "metadata": { - "tags": [] - }, - "source": [ - "**Lecture ancrée** : Le solveur Z3 a été configuré avec succès pour la validation des protocoles thérapeutiques. Le module z3 a été importé correctement, permettant l'utilisation des contraintes logiques pour valider les traitements proposés contre les contre-indications médicales et les interactions médicamenteuses." - ] - }, { "cell_type": "markdown", "id": "9861dd7d", @@ -2102,16 +2012,6 @@ "print(\"\\n Tests de validation Z3 terminés\")" ] }, - { - "cell_type": "markdown", - "id": "lecture-z3-validation", - "metadata": { - "tags": [] - }, - "source": [ - "**Lecture ancrée** : Le solveur Z3 a validé avec succès les protocoles thérapeutiques pour les cas complexes, confirmant par exemple que pour un patient de 72 ans avec cardiopathie, la prescription de statines est appropriée (Metformine: False, Insuline: False, Statines: True) avec un objectif HbA1c de 6,0%, seule contrainte satisfaite du protocole — un objectif glycémique jugé réaliste par le solveur. Cette validation par contraintes garantit que les traitements respectent les contre-indications médicales et les interactions possibles." - ] - }, { "cell_type": "markdown", "id": "ac893b9b", @@ -2360,16 +2260,6 @@ "print(\"\\n Pour exécuter le pipeline complet, appelez: main()\")" ] }, - { - "cell_type": "markdown", - "id": "lecture-data-loading", - "metadata": { - "tags": [] - }, - "source": [ - "**Lecture ancrée** : La fonction de chargement des données CSV a été définie pour permettre l'import de profils patients depuis des fichiers externes. Cette capacité est essentielle pour tester le système sur de grands jeux de données cliniques réelles et valider sa robustesse dans des scénarios variés de diagnostic du diabète de type 2." - ] - }, { "cell_type": "markdown", "id": "1d26cfcb", @@ -2543,16 +2433,6 @@ "print(\"\\n Pour exécuter la suite de tests, appelez: tests_automatises()\")" ] }, - { - "cell_type": "markdown", - "id": "lecture-tests-automatises", - "metadata": { - "tags": [] - }, - "source": [ - "**Lecture ancrée** : La suite de tests automatisés offre une validation complète du système en vérifiant l'intégration des quatre approches (agent rationnel, A*, génétique, Z3). Chaque test valide une composante spécifique du diagnostic, assurant ainsi la cohérence et la robustesse du système de diagnostic médical multi-contraintes." - ] - }, { "cell_type": "markdown", "id": "0b753e08", @@ -2596,7 +2476,7 @@ "\n", "Les compétences développées sont directement transférables à d'autres domaines nécessitant des systèmes de décision intelligents.\n", "\n", - "---\n", + "***\n", "**Retour au sommaire** : [Index CaseStudies](../../README.md)\n" ] } From 887795a53e7101dc5ecafe995ee91f1e72a32d44 Mon Sep 17 00:00:00 2001 From: jsboige Date: Sun, 20 Sep 2026 22:42:31 +0200 Subject: [PATCH 02/10] fix(density,#17040): SmartGrid-Energy student - 4 lectures campagne supprimees --- .../student/SmartGrid-Energy.ipynb | 79 ------------------- 1 file changed, 79 deletions(-) diff --git a/MyIA.AI.Notebooks/CaseStudies/SmartGrid-Energy/student/SmartGrid-Energy.ipynb b/MyIA.AI.Notebooks/CaseStudies/SmartGrid-Energy/student/SmartGrid-Energy.ipynb index 0dcd50dbd4..282a52014b 100644 --- a/MyIA.AI.Notebooks/CaseStudies/SmartGrid-Energy/student/SmartGrid-Energy.ipynb +++ b/MyIA.AI.Notebooks/CaseStudies/SmartGrid-Energy/student/SmartGrid-Energy.ipynb @@ -150,25 +150,6 @@ " f'+/- {net.renewable_forecast_std[h]}, demande nette {net.net_demand(h):.1f} MW')\n" ] }, - { - "cell_type": "markdown", - "id": "lecture-demo-network-001", - "metadata": {}, - "source": [ - "**Lecture ancrée — Jumeau numérique du réseau (4)**\n", - "\n", - "La sortie de cette cellule de démonstration présente la configuration complète du réseau électrique \n", - "numérique utilisé comme cas d'étude. Le message \"Reseau : 3 centrales, capacite totale 800 MW\" indique \n", - "que le jumeau numérique comprend trois centrales de production : Charbon (400 MW, coût 30 EUR/MWh, \n", - "900 kg CO2/MWh), Gaz (250 MW, coût 60 EUR/MWh, 400 kg CO2/MWh) et Hydro (150 MW, coût 10 EUR/MWh, \n", - "0 kg CO2/MWh). La capacité totale de 800 MW représente la puissance maximale disponible pour répondre \n", - "à la demande horaire. Les lignes suivantes détaillent, pour chacune des 6 heures de la période d'étude, \n", - "la demande brute en mégawatts, la production renouvelable prévue avec son incertitude (moyenne et écart-type), \n", - "et la demande nette à couvrir par les centrales pilotables. Par exemple, à l'heure 0, une demande de 500 MW \n", - "est partiellement couverte par 80 MW de production renouvelable (avec une incertitude de ±15 MW), \n", - "laissant une demande nette de 420 MW à satisfaire par les centrales thermiques et hydrauliques." - ] - }, { "cell_type": "markdown", "id": "c5", @@ -224,26 +205,6 @@ "print('Dispatch CP-SAT :', dispatch)\n" ] }, - { - "cell_type": "markdown", - "id": "lecture-multi-objectif-002", - "metadata": {}, - "source": [ - "**Lecture ancrée — Optimisation multi-objectif**\n", - "\n", - "Le problème de dispatch électrique abordé dans ce notebook se caractérise par sa nature multi-objectif, \n", - "où plusieurs critères doivent être optimisés simultanément. Le premier critère, économique, vise à \n", - "minimiser le coût total de production en privilégiant les centrales les moins chères (Hydro à 10 EUR/MWh, \n", - "Charbon à 30 EUR/MWh, Gaz à 60 EUR/MWh). Le deuxième critère, environnemental, cherche à réduire \n", - "l'empreinte carbone en limitant l'utilisation des centrales les plus polluantes (Charbon à 900 kg CO2/MWh, \n", - "Gaz à 400 kg CO2/MWh). Le troisième critère, la gestion du risque, prend en compte l'incertitude \n", - "associée à la production renouvelable, modélisée par des distributions de probabilité avec écart-type. \n", - "Le réseau de démonstration illustré précédemment montre comment ces différents objectifs peuvent entrer \n", - "en conflit : la centrale à charbon, bien que la moins chère, est également la plus polluante, tandis que \n", - "l'hydroélectricité, propre et bon marché, a une capacité limitée. La solution optimale doit donc trouver \n", - "un compromis entre ces différentes dimensions." - ] - }, { "cell_type": "markdown", "id": "c7", @@ -371,26 +332,6 @@ " return result\n" ] }, - { - "cell_type": "markdown", - "id": "lecture-architecture-003", - "metadata": {}, - "source": [ - "**Lecture ancrée — Architecture en quatre couches**\n", - "\n", - "L'architecture logicielle proposée pour résoudre le problème de SmartGrid repose sur une décomposition \n", - "en quatre couches fonctionnelles distinctes. La couche 1, dédiée au dispatch sous contraintes, utilise \n", - "l'outil OR-Tools CP-SAT pour effectuer un unit commitment optimal en tenant compte des contraintes \n", - "physiques et techniques du réseau. La couche 2, le prévisionniste probabiliste, implémente un modèle \n", - "bayésien pour estimer l'incertitude associée à la production renouvelable, permettant ainsi une prise de \n", - "décision éclairée face à la variabilité des énergies vertes. La couche 3, l'optimiseur multi-objectif, \n", - "aggrège les différents critères (coût, CO2, risque) en un score unique permettant de comparer les \n", - "stratégies de dispatch entre elles. Enfin, la couche 4, l'analyse comparative, évalue les différentes \n", - "stratégies en fonction de leur performance sur l'ensemble des critères, fournissant ainsi une base \n", - "objective pour la prise de décision finale. Cette séparation des préoccupations permet une modularité \n", - "accrue et facilite la maintenance et l'évolution du système." - ] - }, { "cell_type": "markdown", "id": "c13", @@ -457,26 +398,6 @@ "`region`. Mesurez la concentration regionale de la pollution et ajoutez-la au score.\n" ] }, - { - "cell_type": "markdown", - "id": "lecture-conclusion-004", - "metadata": {}, - "source": [ - "**Lecture ancrée — Analyse comparative et prise de décision**\n", - "\n", - "La dernière partie du notebook effectue une analyse comparative des différentes stratégies de dispatch \n", - "en évaluant leur performance selon les trois critères principaux : coût économique, émission de CO2, et \n", - "niveau de risque lié à l'incertitude renouvelable. Cette évaluation multi-critères permet de mettre en \n", - "évidence les compromis inhérents à chaque approche : une stratégie minimisant le coût peut engendrer \n", - "des émissions de CO2 élevées, tandis qu'une stratégie environnementalement optimale peut être plus \n", - "coûteuse ou plus risquée. L'analyse comparative fournit aux décideurs une vision globale des \n", - "conséquences de chaque choix, leur permettant de sélectionner la stratégie la plus adaptée aux priorités \n", - "du moment (par exemple, minimiser les coûts en période de faible demande, ou réduire l'empreinte carbone \n", - "lorsque les ressources renouvelables sont abondantes). Cette approche systémique illustre comment \n", - "l'intelligence artificielle et les méthodes d'optimisation peuvent supporter des décisions complexes \n", - "dans le domaine de la gestion des réseaux électriques." - ] - }, { "cell_type": "code", "execution_count": 7, From 4374b9007cdbf8a6f74075ab7a0f82bcff57d6a3 Mon Sep 17 00:00:00 2001 From: jsboige Date: Sun, 20 Sep 2026 22:44:25 +0200 Subject: [PATCH 03/10] fix(density,#17040): Diagnostic-Medical student - 6 lectures campagne supprimees --- .../student/Diagnostic-Medical.ipynb | 107 ------------------ 1 file changed, 107 deletions(-) diff --git a/MyIA.AI.Notebooks/CaseStudies/Diagnostic-Medical/student/Diagnostic-Medical.ipynb b/MyIA.AI.Notebooks/CaseStudies/Diagnostic-Medical/student/Diagnostic-Medical.ipynb index f923c56a1a..c279b117d9 100644 --- a/MyIA.AI.Notebooks/CaseStudies/Diagnostic-Medical/student/Diagnostic-Medical.ipynb +++ b/MyIA.AI.Notebooks/CaseStudies/Diagnostic-Medical/student/Diagnostic-Medical.ipynb @@ -149,23 +149,6 @@ "print(\" Objectif : Implémenter un système de diagnostic médical multi-approches\")" ] }, - { - "cell_type": "markdown", - "id": "lecture-config-001", - "metadata": {}, - "source": [ - "**Lecture ancrée — Cellule de configuration (3)**\n", - "\n", - "Le message de sortie confirme que le solveur Z3, essentiel pour la validation par contraintes des protocoles thérapeutiques, \n", - "est correctement importé et opérationnel dans l'environnement. La configuration affichée révèle que ce notebook, \n", - "développé par EPF IA Biomédicale, est à sa version 2.0.0 datée du 4 novembre 2025, avec une durée estimée de 3 heures \n", - "pour un total de 20 points. Ces métadonnées précisent le cadre pédagogique et l'objectif : \n", - "implémenter un système de diagnostic médical combinant quatre approches algorithmiques complémentaires. \n", - "L'Import réussi de Z3 valide la disponibilité des outils de programmation par contraintes nécessaires \n", - "pour la quatrième partie du cas pratique, tandis que la configuration standardisée assure la reproductibilité \n", - "des résultats entre différents environnements d'exécution." - ] - }, { "cell_type": "markdown", "id": "2f529696", @@ -278,24 +261,6 @@ "print(f\" Protocoles chargés : {len(protocoles_diabete_type2)} sections\")" ] }, - { - "cell_type": "markdown", - "id": "lecture-patient-002", - "metadata": {}, - "source": [ - "**Lecture ancrée — Classe Patient (5)**\n", - "\n", - "L'exécution de cette cellule affiche deux messages clés : \"Structure de données définie\" et \"Protocoles chargés : 4 sections\". \n", - "Ces outputs indiquent que la classe `Patient`, cœur du système de diagnostic, a été correctement définie \n", - "avec tous ses attributs médicaux essentiels (identifiant, nom, âge, glycémies à jeun et postprandiale, HbA1c, \n", - "symptômes, antécédents, date de consultation, pression artérielle et IMC). Les quatre sections de protocoles \n", - "chargées correspondent aux différentes approches à implémenter : l'agent de diagnostic basé sur des règles \n", - "cliniques, la recherche informée par A* dans l'espace des états diagnostiques, l'optimisation évolutionnaire \n", - "par algorithmes génétiques, et la validation formelle par contraintes Z3. Cette structure de données centralisée \n", - "permet de gérer de manière cohérente les informations médicales de chaque patient tout au long \n", - "du processus de diagnostic multi-contraintes." - ] - }, { "cell_type": "markdown", "id": "18e78368", @@ -808,25 +773,6 @@ "print(\"Exercice a completer : heuristique alternative A*\")" ] }, - { - "cell_type": "markdown", - "id": "lecture-genetique-005", - "metadata": {}, - "source": [ - "**Lecture ancrée — Algorithmes Génétiques dans le Diagnostic Médical**\n", - "\n", - "L'approche par algorithmes génétiques représente une méthode d'optimisation inspirée de la sélection naturelle, \n", - "particulièrement adaptée aux problèmes complexes où les solutions optimales ne peuvent pas être \n", - "trouvées par des méthodes analytiques classiques. Dans le contexte du diagnostic médical, cette approche \n", - "permet d'explorer l'espace des paramètres de diagnostic (seuils glycémiques, pondérations des symptômes, \n", - "priorités thérapeutiques) pour identifier les combinaisons optimales qui maximisent la précision du \n", - "diagnostic tout en minimisant les faux positifs et faux négatifs. Chaque chromosome dans la population \n", - "représente une configuration potentielle du système de diagnostic, et la fonction de fitness évalue \n", - "l'adéquation de cette configuration par rapport aux critères médicaux établis. L'évolution de la population \n", - "au fil des générations permet de converger vers des solutions de plus en plus performantes, offrant ainsi \n", - "une approche flexible et adaptative pour personnaliser le diagnostic selon le profil spécifique de chaque patient." - ] - }, { "cell_type": "markdown", "id": "b8ffd9c1", @@ -1284,43 +1230,6 @@ "- **Robustesse** : Gestion des erreurs et cas limites" ] }, - { - "cell_type": "markdown", - "id": "lecture-validation-004", - "metadata": {}, - "source": [ - "**Lecture ancrée — Validation et tests**\n", - "\n", - "Chaque partie du système de diagnostic est accompagnée de fonctions de test dédiées, permettant de valider \n", - "le bon fonctionnement des implémentations. Les cellules de test à compléter (telles que \n", - "`tester_agent_diagnostic`, `tester_performance_astar`, `tester_convergence_genetique` et \n", - "`tester_validation_z3`) fournissent un cadre pour évaluer la correction des solutions étudiantes. \n", - "Ces tests vérifient non seulement la fonctionnalité de base, mais également la robustesse des \n", - "algorithmes face à des cas limites et des scénarios médicaux complexes. La validation par Z3, \n", - "en particulier, permet de garantir que les protocoles thérapeutiques respectent toutes les contraintes \n", - "cliniques et techniques, offrant ainsi une assurance formelle de leur validité avant toute application pratique." - ] - }, - { - "cell_type": "markdown", - "id": "lecture-architecture-003", - "metadata": {}, - "source": [ - "**Lecture ancrée — Architecture du système**\n", - "\n", - "Le système de diagnostic médical implémenté dans ce notebook repose sur une architecture modulaire \n", - "composée de quatre piliers algorithmiques distincts mais interconnectés. Le premier pilier, l'agent de \n", - "diagnostic rationnel basé sur des règles cliniques, utilise les données structurées de la classe Patient \n", - "pour effectuer une première évaluation rapide. Le deuxième pilier, l'algorithme A*, permet une recherche \n", - "informée dans l'espace des états diagnostiques possibles, optimisant ainsi le chemin vers un diagnostic précis. \n", - "Le troisième pilier, les algorithmes génétiques, introduit une approche évolutionnaire pour optimiser les \n", - "paramètres du diagnostic selon des critères multiples. Enfin, le quatrième pilier, le solveur Z3, \n", - "garantit la validation formelle des protocoles thérapeutiques en vérifiant le respect des contraintes \n", - "médicales, des interactions médicamenteuses et des standards cliniques. Chaque approche apporte une \n", - "dimension complémentaire au processus de diagnostic, permettant une évaluation personnalisée et \n", - "multi-dimensionnelle du diabète de type 2." - ] - }, { "cell_type": "code", "execution_count": 15, @@ -1378,22 +1287,6 @@ "print(\" Pipeline d'intégration à compléter\")" ] }, - { - "cell_type": "markdown", - "id": "lecture-perspectives-006", - "metadata": {}, - "source": [ - "**Lecture ancrée — Perspectives d'Application Clinique**\n", - "\n", - "Ce système de diagnostic médical multi-contraintes illustre comment les techniques d'intelligence artificielle \n", - "symbolique peuvent être appliquées à des problèmes concrets dans le domaine de la santé. L'intégration de \n", - "l'agent de diagnostic basé sur des règles, de l'algorithme A*, des algorithmes génétiques et du solveur Z3 \n", - "offre une approche holistique pour le diagnostic du diabète de type 2, prenant en compte à la fois les \n", - "données quantitatives (glycémie, HbA1c) et les facteurs qualitatifs (symptômes, antécédents). Cette étude de cas \n", - "montre l'importance de combiner différentes approches algorithmiques pour traiter des problèmes complexes \n", - "où aucune méthode unique ne peut fournir une solution optimale complète." - ] - }, { "cell_type": "markdown", "id": "0b753e08", From 9e7389af3d98e6fb8d9a8e40725e1c6f1de5ee82 Mon Sep 17 00:00:00 2001 From: jsboige Date: Sun, 20 Sep 2026 22:46:32 +0200 Subject: [PATCH 04/10] fix(density,#17040): Oncology-Planning solution - 4 lectures campagne supprimees --- .../solution/Oncology-Planning.ipynb | 38 +++---------------- 1 file changed, 5 insertions(+), 33 deletions(-) diff --git a/MyIA.AI.Notebooks/CaseStudies/Oncology-Planning/solution/Oncology-Planning.ipynb b/MyIA.AI.Notebooks/CaseStudies/Oncology-Planning/solution/Oncology-Planning.ipynb index bb69ea1aaa..12f2902a03 100644 --- a/MyIA.AI.Notebooks/CaseStudies/Oncology-Planning/solution/Oncology-Planning.ipynb +++ b/MyIA.AI.Notebooks/CaseStudies/Oncology-Planning/solution/Oncology-Planning.ipynb @@ -144,7 +144,7 @@ "tags": [] }, "source": [ - "---" + "***" ] }, { @@ -245,13 +245,6 @@ "print(f\"Ontologie chargée avec {len(g)} triplets.\")" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "L'ontologie ONCO a été chargée avec succès. Les 14 triplets définissent les médicaments d'oncologie, leurs propriétés de toxicité rénale et leurs incompatibilités médicamenteuses, formant la base de connaissances pour les vérifications de prescription.\n" - ] - }, { "cell_type": "markdown", "id": "3c78ffc1", @@ -567,13 +560,6 @@ " \"décalés pour ne pas saturer les lits (un for-loop trivial violerait la capacité).\")" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Le solveur a trouvé une solution optimale pour la planification de multiples protocoles de chimiothérapie. Avec un makespan de 107 jours, le planning respecte la capacité maximale de 3 lits par jour tout en optimisant les dates de début de chaque protocole (AC et FOLFOX).\n" - ] - }, { "cell_type": "markdown", "id": "ef761f0b", @@ -588,7 +574,7 @@ "tags": [] }, "source": [ - "---" + "***" ] }, { @@ -842,13 +828,6 @@ " print(\"=> DIAGNOSTIC : Patient hypersensible. Réduction de dose impérative.\")" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "L'inférence bayésienne a convergé après 800 itérations. Les probabilités a posteriori indiquent que le patient a un profil Résistant à 92%, Normal à 4% et Sensible à 4%, reflétant l'adaptation du modèle aux doses administrées et aux observations cliniques.\n" - ] - }, { "cell_type": "markdown", "id": "ed9440e8", @@ -1007,7 +986,7 @@ "tags": [] }, "source": [ - "---" + "***" ] }, { @@ -1103,13 +1082,6 @@ "print(contract.verifier_execution({\"J1\": \"Cisplatine 100mg\"})) # Tentative de fraude" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Le contrat intelligent permet d'enregistrer un plan de traitement avec un hash SHA-256 unique. Les signatures du médecin et du patient sont requises pour autoriser l'administration, et toute modification du plan invalide automatiquement les signatures existantes.\n" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -1163,7 +1135,7 @@ "déployés en milieu médical — et plus largement dans tout domaine où l'erreur\n", "a un coût humain.\n", "\n", - "---\n", + "***\n", "\n", "**Retour au sommaire** : [Index CaseStudies](../../README.md)\n", "" @@ -1221,4 +1193,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file From 9820d800b93f830b80d2a8305ebbd1fcfe3a9c64 Mon Sep 17 00:00:00 2001 From: jsboige Date: Sun, 20 Sep 2026 22:46:46 +0200 Subject: [PATCH 05/10] fix(density,#17040): SmartGrid-Energy solution - 2 lectures campagne supprimees --- .../solution/SmartGrid-Energy.ipynb | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/MyIA.AI.Notebooks/CaseStudies/SmartGrid-Energy/solution/SmartGrid-Energy.ipynb b/MyIA.AI.Notebooks/CaseStudies/SmartGrid-Energy/solution/SmartGrid-Energy.ipynb index 9b71191d42..1c879922ee 100644 --- a/MyIA.AI.Notebooks/CaseStudies/SmartGrid-Energy/solution/SmartGrid-Energy.ipynb +++ b/MyIA.AI.Notebooks/CaseStudies/SmartGrid-Energy/solution/SmartGrid-Energy.ipynb @@ -390,13 +390,6 @@ " f'incertitude +/-{net.renewable_forecast_std[h]} MW -> risque {r:.2e}')\n" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Lecture ancrée** : Les risques de défaillance calculés sont extrêmement faibles (entre 10⁻³⁸ et 10⁻²⁸⁴), ce qui indique que la capacité pilotable de 800 MW couvre largement la demande nette même avec les incertitudes de production renouvelable pour toutes les heures de la journée." - ] - }, { "cell_type": "markdown", "id": "smartgrid-interp-risk-c835", @@ -639,13 +632,6 @@ "print(f'Strategie optimale (score multi-objectif minimal) : {best[0]}')\n" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Lecture ancrée** : L'analyse montre que la stratégie 'Ecologique (min CO2)' obtient le score multi-objectif le plus bas (1.560) malgré un coût plus élevé (106 800 EUR vs 63 600 EUR). La stratégie économique émet 1 638 000 kg de CO2, soit 78% de plus que l'option écologique." - ] - }, { "cell_type": "markdown", "id": "smartgrid-interp-comparative-c835", From c54d864e0480c447eec29a69bb63813bd3fb3736 Mon Sep 17 00:00:00 2001 From: jsboige Date: Sun, 20 Sep 2026 22:47:31 +0200 Subject: [PATCH 06/10] fix(density,#17040): GameTheory-02-NormalForm-Csharp-Part2 - 3 lectures chiffrees supprimees --- ...ameTheory-02-NormalForm-Csharp-Part2.ipynb | 23 +------------------ 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/MyIA.AI.Notebooks/GameTheory/GameTheory-02-NormalForm-Csharp-Part2.ipynb b/MyIA.AI.Notebooks/GameTheory/GameTheory-02-NormalForm-Csharp-Part2.ipynb index 9c49eb734e..e072b97ddd 100644 --- a/MyIA.AI.Notebooks/GameTheory/GameTheory-02-NormalForm-Csharp-Part2.ipynb +++ b/MyIA.AI.Notebooks/GameTheory/GameTheory-02-NormalForm-Csharp-Part2.ipynb @@ -370,13 +370,6 @@ "sb.ToString().Display();" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Lecture chiffree — le principe d'indifference en acte.** Face a la strategie uniforme $\\sigma_2 = (1/3, 1/3, 1/3)$, la sortie calcule l'esperance de chacune des trois actions pures du joueur 1 : R : 0.0000, P : 0.0000, S : 0.0000. Les trois esperances sont egales a 0, et la ligne « principe d'indifference verifie » le confirme : le joueur 1 est indifferent entre ses trois actions face a ce profil. Ce n'est pas une coincidence : sur un jeu a somme nulle symetrique, chaque action pure affronte les deux autres dans les deux sens (elle en bat une de 1 et se fait battre par la troisieme de 1), donc son esperance face a l'uniforme vaut toujours $\\frac{1}{3}(0 + 1 - 1) = 0$. Cette egalite des esperances est exactement la precondition que la section 4 transforme en systeme lineaire : a l'equilibre mixte, toutes les actions du support doivent offrir la meme esperance, sinon le joueur deplacerait sa probabilite vers celle qui fait mieux.\n" - ] - }, { "cell_type": "markdown", "id": "gt2b07", @@ -470,13 +463,6 @@ "$\"Test Gauss : 2x + y = 3 ; x - 3y = -2 -> x={FI(x[0])}, y={FI(x[1])} (attendu x=1, y=1)\".Display();" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Lecture chiffree — le banc d'essai de Gauss.** La cellule resout le systeme $2x + y = 3$ ; $x - 3y = -2$ par elimination de Gauss a pivot partiel puis retro-substitution, et la sortie affiche $x = 1.0000$, $y = 1.0000$ en regard de l'attendu $(1, 1)$. Verification immediate : $2 \\times 1 + 1 = 3$ et $1 - 3 \\times 1 = -2$, le systeme est bien resolu. Deux proprietes que cette sortie porte en creux : le pivot partiel ne permute rien ici (aucun pivot nul dans la diagonale), mais c'est lui qui rendra `SolveLinear` stable sur les systemes de la section 4, ou les matrices d'indifference ne sont pas garanties bien conditionnees ; et l'affichage tombe exactement sur des entiers malgre le format `F4` — les 4 decimales ne masquent aucune erreur d'arrondi sur ce banc. C'est ce solveur que `SupportEnumeration` appellera une fois par joueur et par paire de supports : chaque systeme aura $k$ equations (egalite des esperances $k-1$ + normalisation) pour $k$ inconnues.\n" - ] - }, { "cell_type": "markdown", "id": "gt2b09", @@ -569,13 +555,6 @@ "Le principe de **l'énumération des supports** (Mangasarian–Stone, 1964 ; Stengel 2002) est de transformer la recherche d'un équilibre de Nash en une **énumération finie** : pour chaque paire de supports candidats $(S_1, S_2)$ de même taille, on résout le **système d'indifférence** (la stratégie adverse rend le joueur indifférent entre les actions de son support) puis on **vérifie la positivité** et la condition de **best-response hors-support**. Chaque support donne au plus un équilibre candidat — c'est un algorithme complet qui trouve **tous** les équilibres, au prix d'une complexité combinatoire.\n" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Lecture chiffree — les trois paires de taille 2.** La sortie de `SubsetsOfSize(3, 2)` materialise l'enumeration : {0,1}, {0,2}, {1,2} — les $\\binom{3}{2} = 3$ paires attendues, le code affichant lui-meme « attendu 3 paires ». Deux details que la sortie montre sans les dire : les indices de chaque paire sont strictement croissants ({0,1}, jamais {1,0}) — la recursion ne genere aucune permutation redondante, chaque support n'apparait qu'une fois ; et les trois paires couvrent la totalite des combinaisons de taille 2, ni plus ni moins. C'est ce generateur que `SupportEnumeration` pilote pour chaque taille de support allant de 1 a $\\min(N_1, N_2)$, et c'est lui qui fait le cout de l'algorithme : $\\binom{10}{5} = 252$ supports de taille 5 pour un jeu 10 × 10, une croissance combinatoire que les exercices de la fin du notebook demandent de chiffrer.\n" - ] - }, { "cell_type": "code", "execution_count": 6, @@ -1483,4 +1462,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file From 91235bbb01e44cd052134ad9d06b51e98f8b4fea Mon Sep 17 00:00:00 2001 From: jsboige Date: Sun, 20 Sep 2026 22:47:43 +0200 Subject: [PATCH 07/10] fix(density,#17040): GameTheory-02-NormalForm-Csharp - 6 lectures campagne supprimees --- .../GameTheory-02-NormalForm-Csharp.ipynb | 42 ------------------- 1 file changed, 42 deletions(-) diff --git a/MyIA.AI.Notebooks/GameTheory/GameTheory-02-NormalForm-Csharp.ipynb b/MyIA.AI.Notebooks/GameTheory/GameTheory-02-NormalForm-Csharp.ipynb index bb0ce93356..13760dcd25 100644 --- a/MyIA.AI.Notebooks/GameTheory/GameTheory-02-NormalForm-Csharp.ipynb +++ b/MyIA.AI.Notebooks/GameTheory/GameTheory-02-NormalForm-Csharp.ipynb @@ -399,13 +399,6 @@ "sb.ToString().Display();" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Lecture** : Les matrices affichées montrent la structure des gains pour quatre jeux 2x2 canoniques. Le Dilemme du Prisonnier a un équilibre (Defect,Defect) à (1,1), la Bataille des Sexes a deux équilibres purs (Opera,Opera) et (Foot,Foot), Pile ou Face est un jeu à somme nulle sans équilibre pur, et Coordination a deux équilibres symétriques (Left,Left) et (Right,Right)." - ] - }, { "cell_type": "markdown", "id": "gt2c07", @@ -539,13 +532,6 @@ "- **Coordination** : deux equilibres symetriques (Left,Left) et (Right,Right) — pure question d'alignement." ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Lecture** : La détection des équilibres de Nash purs confirme que le Dilemme du Prisonnier a un unique équilibre (Defect,Defect), la Bataille des Sexes en a deux (Opera,Opera) et (Foot,Foot), Pile ou Face n'en a aucun (jeu à somme nulle), et Coordination en a deux symétriques (Left,Left) et (Right,Right)." - ] - }, { "cell_type": "markdown", "id": "gt2c10", @@ -772,13 +758,6 @@ "sb.ToString().Display();" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Lecture** : L'absence d'équilibre mixte intérieur pour le Dilemme du Prisonnier illustre le théorème de dominance. Lorsque une stratégie domine strictement toutes les autres, elle est jouée avec probabilité 1 à l'équilibre, ce qui explique pourquoi (Defect,Defect) est le seul équilibre de Nash (pur ou mixte) de ce jeu." - ] - }, { "cell_type": "markdown", "id": "gt2c14", @@ -881,20 +860,6 @@ "sb.ToString().Display();" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Lecture** : Le test de déviation confirme l'inexploitabilité de l'équilibre mixte (0.5,0.5) pour Pile ou Face. Si le joueur 1 joue Heads à 100% face au mélange du joueur 2, son espérance reste à 0.0000, ce qui valide que l'équilibre mixte est bien un équilibre de Nash où aucun joueur ne peut améliorer son gain en déviant unilatéralement." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Lecture** : Pour Pile ou Face, l'équilibre mixte est (0.5,0.5) pour chaque joueur, donnant une valeur espérée de 0 (jeu équitable). Pour la Bataille des Sexes, l'équilibre mixte additionnel est J1: Opera à 0.667/Foot à 0.333, J2: Opera à 0.333/Foot à 0.667, confirmant que le Dilemme du Prisonnier n'a pas d'équilibre mixte intérieur car Defect domine strictement." - ] - }, { "cell_type": "markdown", "id": "gt2c17", @@ -1313,13 +1278,6 @@ "\"Exercice 1 a completer — Chicken : enumerer equilibres purs + mixte.\".Display();" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Lecture** : Pierre-Feuille-Ciseaux est un jeu cyclique 3x3 à somme nulle sans équilibre pur. L'IESDS ne réduit pas l'espace d'actions (aucune dominance stricte), confirmant que la solution doit passer par un équilibre mixte où chaque action a une probabilité de 1/3." - ] - }, { "cell_type": "markdown", "id": "gt2c21", From bd31b4ba9ef9ea5218cd45a19924ca58e30126ae Mon Sep 17 00:00:00 2001 From: jsboige Date: Sun, 20 Sep 2026 22:48:34 +0200 Subject: [PATCH 08/10] fix(density,#17040): GameTheory-02b-Lean-Definitions - 6 lectures campagne supprimees --- .../GameTheory-02b-Lean-Definitions.ipynb | 182 +----------------- 1 file changed, 1 insertion(+), 181 deletions(-) diff --git a/MyIA.AI.Notebooks/GameTheory/GameTheory-02b-Lean-Definitions.ipynb b/MyIA.AI.Notebooks/GameTheory/GameTheory-02b-Lean-Definitions.ipynb index 9701e4fd56..3b9d6f8b78 100644 --- a/MyIA.AI.Notebooks/GameTheory/GameTheory-02b-Lean-Definitions.ipynb +++ b/MyIA.AI.Notebooks/GameTheory/GameTheory-02b-Lean-Definitions.ipynb @@ -263,37 +263,6 @@ "#check Nat" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Lecture du smoke test\n", - "\n", - "La cellule produit la sortie :\n", - "```\n", - "#eval 2 + 2 ─▶ 4\n", - "#check Nat ─▶ Nat : Type\n", - "```\n", - "\n", - "C'est la confirmation rapide que le kernel Lean fonctionne. Si la sortie diffère,\n", - "le kernel n'est pas correctement configuré.\n", - "\n", - "### Vérification\n", - "\n", - "Le `#eval 2 + 2` doit retourner **exactement** `4` (pas `4.0`, pas `4 : Nat`, juste `4`).\n", - "Le `#check Nat` doit retourner `Nat : Type` (le type `Nat` est dans l'univers `Type`).\n", - "\n", - "### Si la sortie diffère\n", - "\n", - "1. Vérifier que `elan` est installe : `elan --version`\n", - "2. Vérifier que le kernel lean4-wsl est actif : `jupyter kernelspec list | grep lean4`\n", - "3. Vérifier que le toolchain stable est selectionne : `lean --version`\n", - "\n", - "### Coût\n", - "\n", - "Ce test prend ~0.1s." - ] - }, { "cell_type": "markdown", "id": "7cc619b7", @@ -460,40 +429,6 @@ "#check NormalFormGame" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Lecture de la définition `NormalFormGame`\n", - "\n", - "La cellule précédente a défini la structure fondamentale :\n", - "\n", - "```lean\n", - "structure NormalFormGame where\n", - " Players : Type\n", - " Actions : Players → Type\n", - " payoff : (i : Players) → ((j : Players) → Actions j) → Int\n", - "```\n", - "\n", - "Un jeu en forme normale est un triplet `(Players, Actions, payoff)` — le champ de\n", - "gain est `payoff` en minuscule en Lean — où le gain de chaque joueur dépend du\n", - "profil complet d'actions.\n", - "\n", - "### Lean 4 vs Coq\n", - "\n", - "- **Lean 4** : `structure Foo where ...` avec champs automatiquement générés\n", - "- **Coq** : `Record Foo : Type := mkFoo { ... }` avec projection explicite\n", - "- **Agda** : `record Foo : Set ...` similaire a Lean\n", - "- **Isabelle** : `record Foo = ...` syntaxe différente\n", - "\n", - "Lean 4 est plus proche de la syntaxe mathématique moderne, ce qui le rend plus\n", - "lisible.\n", - "\n", - "### Coût\n", - "\n", - "Compilation : ~0.5s (vérification de type de la structure)." - ] - }, { "cell_type": "markdown", "id": "cc705177", @@ -1038,41 +973,6 @@ "#check @PureStrategyProfile" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Lecture des stratégies pures\n", - "\n", - "La cellule a défini :\n", - "\n", - "```lean\n", - "def PureStrategy (g : FiniteGame) (i : Fin g.numPlayers) := Fin (g.numActions i)\n", - "```\n", - "\n", - "Une **stratégie pure** pour le joueur `i` dans le jeu `g` est juste une action :\n", - "un élément de `Fin (g.numActions i)`.\n", - "\n", - "### Profil\n", - "\n", - "Un **profil de stratégies pures** est une stratégie pour chaque joueur :\n", - "\n", - "```lean\n", - "def PureStrategyProfile (g : FiniteGame) := (i : Fin g.numPlayers) → Fin (g.numActions i)\n", - "```\n", - "\n", - "C'est une fonction dépendante : pour chaque joueur, on choisit une action.\n", - "\n", - "### Notation\n", - "\n", - "- `s_i` : stratégie pure du joueur i\n", - "- `s = (s_1, ..., s_n)` : profil de stratégies pures\n", - "\n", - "### Coût\n", - "\n", - "Compilation : ~0.5s." - ] - }, { "cell_type": "markdown", "id": "46e76a85", @@ -1424,42 +1324,6 @@ "#check MixedProfile2" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Lecture de MixedStrategy\n", - "\n", - "La cellule produit la sortie :\n", - "```\n", - "def MixedStrategy (numActions : Nat) :=\n", - " { f : Fin numActions → Float // (∀ i, f i >= 0) ∧\n", - " (List.ofFn f).foldl (· + ·) 0 = 1 }\n", - "```\n", - "\n", - "Un **sous-type** : une fonction `Fin numActions → Float` avec 2 propriétés :\n", - "1. Toutes les valeurs >= 0 (probabilités non-négatives)\n", - "2. La somme = 1 (normalisation)\n", - "\n", - "### Subtype pattern\n", - "\n", - "Lean 4 permet de définir des sous-types avec `{ f : T // P f }` ou `P` est une\n", - "propriété. C'est crucial pour les stratégies mixtes : on ne peut pas creer une\n", - "distribution de probabilités invalide.\n", - "\n", - "### Vérification des propriétés\n", - "\n", - "Quand on cree une `MixedStrategy`, Lean vérifie automatiquement :\n", - "- `∀ i, f i >= 0` : propriété de non-négativité\n", - "- `(List.ofFn f).foldl (· + ·) 0 = 1` : somme = 1\n", - "\n", - "Si l'une de ces propriétés n'est pas vérifiée, la compilation echoue.\n", - "\n", - "### Coût\n", - "\n", - "Compilation : ~1s (vérification des sous-types)." - ] - }, { "cell_type": "markdown", "id": "3c2ea934", @@ -2608,41 +2472,6 @@ "#check prisoners_dilemma_nash" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Lecture du théorème `prisoners_dilemma_nash`\n", - "\n", - "Le `#check` final de la cellule confirme le type :\n", - "\n", - "```\n", - "prisoners_dilemma_nash : isPureNashEquilibrium prisonersDilemma Trahir Trahir\n", - "```\n", - "\n", - "C'est un **théorème** : Lean a vérifié la preuve complète. Pas de `sorry`, pas\n", - "d'axiome non-standard.\n", - "\n", - "### Stratégie de preuve\n", - "\n", - "La preuve réelle (cellule précédente) enchaîne :\n", - "1. `constructor` : les 2 composantes de la conjonction (une par joueur)\n", - "2. `intro a` : une action alternative quelconque\n", - "3. `simp only [prisonersDilemma, Trahir]` : développe les gains\n", - "4. `cases Decidable.em (a.val = 0)` : énumère les cas de `Fin 2`\n", - "5. `omega` : décide l'inégalité finale\n", - "\n", - "### Pourquoi `omega`\n", - "\n", - "`omega` est une tactique d'arithmétique linéaire sur les entiers (Z). Elle decide\n", - "automatiquement les inégalités comme `1 > 0`, `3 < 5`, etc. C'est le sous-ensemble\n", - "decidable de l'arithmétique linéaire.\n", - "\n", - "### Coût\n", - "\n", - "Vérification : ~2s (la plus longue du notebook, car elle énumère 4 cas)." - ] - }, { "cell_type": "markdown", "id": "a4556368", @@ -4754,15 +4583,6 @@ "\n", "**Navigation** : [<- GameTheory-02-NormalForm (palier parent)](GameTheory-02-NormalForm.ipynb) | [Index](README.md) | [GameTheory-04b-Lean-NashExistence ->](GameTheory-04b-Lean-NashExistence.ipynb)" ] - }, - { - "cell_type": "markdown", - "id": "b11304ce", - "source": [ - "\n", - "> **Lien avec `lean_game_defs`** : Les definitions de ce notebook sont le cœur du module [`lean_game_defs/Basic.lean`](lean_game_defs/Basic.lean) (0 sorry), qui fournit les structures `NormalFormGame` (joueurs, actions, fonctions de gain), `FiniteGame` (jeu fini avec indices `Fin n`), et `Game2x2` (jeu 2x2 simplifié avec gains concrets). Les gains espérés (section 3.4) y sont également formalisés. Le module associé [`lean_game_defs/Nash.lean`](lean_game_defs/Nash.lean) (0 sorry) reprend les concepts de la section 4 : meilleure réponse (`isBestResponse`), équilibre de Nash pur (`isPureNash`), équilibre de Nash mixte (`isMixedNash`), et dominance stricte (`isStrictlyDominated`). Ces deux fichiers constituent le socle formel sur lequel s'appuient tous les autres modules `lean_game_defs/` (Bayesian, Regret, Combinatorial, SocialChoice)." - ], - "metadata": {} } ], "metadata": { @@ -4792,4 +4612,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file From a6e2b91928e5208b57e5612f9345f6aabbc79400 Mon Sep 17 00:00:00 2001 From: jsboige Date: Sun, 20 Sep 2026 22:48:44 +0200 Subject: [PATCH 09/10] fix(density,#17040): GameTheory-03-Topology2x2-Csharp - 10 lectures campagne supprimees --- .../GameTheory-03-Topology2x2-Csharp.ipynb | 190 +----------------- 1 file changed, 1 insertion(+), 189 deletions(-) diff --git a/MyIA.AI.Notebooks/GameTheory/GameTheory-03-Topology2x2-Csharp.ipynb b/MyIA.AI.Notebooks/GameTheory/GameTheory-03-Topology2x2-Csharp.ipynb index 0a7d0f646f..6ca4025764 100644 --- a/MyIA.AI.Notebooks/GameTheory/GameTheory-03-Topology2x2-Csharp.ipynb +++ b/MyIA.AI.Notebooks/GameTheory/GameTheory-03-Topology2x2-Csharp.ipynb @@ -270,25 +270,6 @@ "display(\"OrdinalGame defini. Validation : permutation de (1,2,3,4) enforcee.\");\n" ] }, - { - "cell_type": "markdown", - "id": "61ea35fb", - "metadata": {}, - "source": [ - "### Lecture : le rang suffit — une préférence ordinale, pas des paiements\n", - "\n", - "La validation affichée impose que chaque joueur soit une **permutation de\n", - "(1,2,3,4)** : quatre cases, quatre rangs, chacun utilisé une fois. C'est le\n", - "contrat de tout le notebook — les jeux 2x2 seront comparés par leurs\n", - "**préférences ordinales** uniquement, jamais par des paiements cardinaux.\n", - "La conséquence est une réduction drastique de l'espace : un joueur n'est plus\n", - "une matrice de nombres réels arbitraires mais l'une des `4! = 24` façons de\n", - "ranger quatre cases. Deux joueurs plus tard, l'univers complet du jeu 2x2\n", - "ordinal tiendra dans `24 x 24 = 576` configurations — énumérable de bout en\n", - "bout, donc mesurable. Tout ce qui suit (distances, classification, connexité)\n", - "vit dans cet espace fini et le parcourt exhaustivement." - ] - }, { "cell_type": "markdown", "id": "36c10632", @@ -368,24 +349,6 @@ "sb.ToString().Display();\n" ] }, - { - "cell_type": "markdown", - "id": "159e1e3c", - "metadata": {}, - "source": [ - "### Lecture : cinq personnalités, un même alphabet\n", - "\n", - "Le catalogue aligne cinq jeux célèbres sur le même format : quatre rangs par\n", - "joueur. La lecture côte à côte est instructive — `Prisoner's Dilemma` et\n", - "`Stag Hunt` de Row ne diffèrent que par l'échange des rangs `3` et `4`\n", - "(`(3,1,4,2)` contre `(4,1,3,2)`) : la différence entre trahir par peur et\n", - "coopérer par confiance tient à UN rang permuté. `Matching Pennies`, lui,\n", - "affiche Row `(4,1,2,3)` contre Col `(1,4,3,2)` — deux préférences\n", - "anti-alignées, la signature d'un jeu de pur conflit. Le catalogue n'est pas\n", - "une galerie de curiosités : ce sont des points de repère dans l'espace des\n", - "576 jeux, dont la matrice des distances de la section 9 mesurera les écarts." - ] - }, { "cell_type": "markdown", "id": "208d63db", @@ -481,25 +444,6 @@ "\"Les 3 swaps adjacents possibles : (1,2), (2,3), (3,4) — par joueur.\".Display();\n" ] }, - { - "cell_type": "markdown", - "id": "0bd6676a", - "metadata": {}, - "source": [ - "### Lecture : le swap adjacent comme mouvement élémentaire\n", - "\n", - "La sortie montre le geste minimal du notebook : permuter deux rangs\n", - "**adjacents** d'un seul joueur (`R34` échange les rangs 3 et 4 de Row). Trois\n", - "swaps existent par joueur — `(1,2)`, `(2,3)`, `(3,4)` — donc six mouvements\n", - "au total par position. Ce choix définit la métrique de tout le notebook : la\n", - "distance entre deux jeux sera le **nombre minimal de swaps adjacents** pour\n", - "transformer l'un en l'autre, exactement comme une distance d'édition entre\n", - "permutations. C'est une décision de modélisation, pas une vérité du jeu : elle\n", - "dit que passer de « j'aime moyennement » à « j'aime peu » coûte autant que\n", - "passer de « j'adore » à « j'aime moyennement », et toutes les mesures qui\n", - "suivent héritent de cette convention." - ] - }, { "cell_type": "markdown", "id": "8de7f262", @@ -631,24 +575,6 @@ "}\n" ] }, - { - "cell_type": "markdown", - "id": "99d29686", - "metadata": {}, - "source": [ - "### Lecture : `2` swaps pour Stag Hunt, `5` pour Matching Pennies — la géographie des classiques\n", - "\n", - "Le BFS rend un chemin effectif, pas seulement un compte : `PD -> Stag Hunt`\n", - "en `2` swaps `[R34 -> C34]` — chacun des deux joueurs rétrograde son\n", - "incitation à dévier, et le dilemme devient une chasse au cerf. `PD ->\n", - "Chicken` en `2` swaps aussi `[R12 -> C12]`, mais par le haut de l'échelle :\n", - "chacun promeut sa case préférée. À l'opposé, `Matching Pennies` demande `5`\n", - "swaps — presque le diamètre de l'espace : le pur conflit est loin du dilemme,\n", - "ce que confirmera la matrice finale. Noter l'asymétrie du chemin vers Battle\n", - "of Sexes (`5` swaps dont `C23` répété) : les chemins minimaux ne sont pas\n", - "uniques, le BFS en livre un arbitrairement." - ] - }, { "cell_type": "markdown", "id": "23b188ee", @@ -747,24 +673,6 @@ "$\"Jeux distincts (HashSet) : {allGames.Distinct().Count()}\".Display();\n" ] }, - { - "cell_type": "markdown", - "id": "622263b8", - "metadata": {}, - "source": [ - "### Lecture : `576` — l'univers complet, énuméré\n", - "\n", - "`24` permutations par joueur, vérifiées contre l'algorithme de Heap, et\n", - "`24 x 24 = 576` jeux ordinaux totaux, vérifiés au compte près. Ce chiffre\n", - "change le statut épistémologique de tout le notebook : rien ne sera estimé ou\n", - "échantillonné — la classification de la section 7 porte sur l'intégralité de\n", - "l'espace, la connexité de la section 8 le parcourt depuis un seul nœud. C'est\n", - "l'avantage structurel du cadre ordinal sur le cadre cardinal : avec des\n", - "paiements réels, l'espace des jeux 2x2 est non dénombrable en pratique ; avec\n", - "des rangs, il tient dans une table qu'une machine épuise en millisecondes. La\n", - "topologie des jeux devient un calcul." - ] - }, { "cell_type": "markdown", "id": "c0973729", @@ -872,25 +780,6 @@ "\"Note : 4 de ces 5 jeux classiques ont 1 ou 2 Nash purs ; Matching Pennies (anti-coordination) est l'exception avec 0 Nash pur, seul tel exemple du catalogue — voir l'histogramme cellule 7 (72/576 = 12,5% des jeux ordinaux ont 0 Nash pur).\".Display();\n" ] }, - { - "cell_type": "markdown", - "id": "1789d429", - "metadata": {}, - "source": [ - "### Lecture : Matching Pennies, l'exception à zéro Nash pur\n", - "\n", - "Quatre des cinq classiques ont un ou deux équilibres purs, et le tableau\n", - "montre leur géométrie : `Stag Hunt` et `Battle of Sexes` coordonnent sur les\n", - "deux diagonales (`TL, BR`), `Chicken` anti-coordonne (`TR, BL`), le\n", - "`Prisoner's Dilemma` verrouille sa solution unique (`BR`). `Matching Pennies`\n", - "affiche `0` — et ce n'est pas un bug de recherche : dès que les préférences\n", - "des deux joueurs sont strictement opposées sur chaque case, toute case où je\n", - "veux matcher est une case où l'autre veut dématcher, et réciproquement.\n", - "L'équilibre existe pourtant — mais en stratégies **mixtes**, à `(0,5 ; 0,5)`\n", - ": c'est exactement le point fixe que le notebook `GameTheory-04c` calculera.\n", - "L'exception du catalogue est la motivation du théorème d'existence." - ] - }, { "cell_type": "markdown", "id": "a9aa71af", @@ -1053,25 +942,6 @@ "$\"{gamesWithNash} jeux ont au moins 1 Nash pur ({100.0 * gamesWithNash / allGames.Count:F1}%).\".Display();\n" ] }, - { - "cell_type": "markdown", - "id": "4f2dbcd3", - "metadata": {}, - "source": [ - "### Lecture : `12,5% — 75,0% — 12,5%`, la distribution symétrique des 576 jeux\n", - "\n", - "L'histogramme exhaustif donne la réponse à une question que le catalogue ne\n", - "pouvait qu'effleurer : sur les `576` jeux, `432` (`75%`) ont exactement un\n", - "Nash pur, et les deux extrêmes sont parfaitement symétriques — `72` jeux\n", - "(`12,5%`) sans aucun, `72` jeux (`12,5%`) avec deux. Cette symétrie n'est pas\n", - "une coïncidence arrangée : elle tombe de l'énumération complète, et personne\n", - "n'aurait pu la deviner du seul catalogue des classiques. À retenir aussi :\n", - "`504` jeux sur `576` (`87,5%`) ont au moins un équilibre pur — mais `72` n'en\n", - "ont aucun, et pour eux le théorème de Nash garantit un équilibre mixte. La\n", - "prochaine section montre que ces 576 points ne forment pas un archipel : tout\n", - "est relié." - ] - }, { "cell_type": "markdown", "id": "67963dee", @@ -1160,25 +1030,6 @@ " : $\"[WARN] Graphe NON connexe : {reachable}/576 atteignables (composantes disjointes).\");\n" ] }, - { - "cell_type": "markdown", - "id": "9cb500a7", - "metadata": {}, - "source": [ - "### Lecture : le graphe des swaps est connexe — l'espace n'a pas d'île\n", - "\n", - "Un BFS flood-fill depuis le seul `Prisoner's Dilemma` atteint les `576` jeux.\n", - "Autrement dit : n'importe quelle préférence ordinale 2x2 peut se déformer en\n", - "n'importe quelle autre par une suite de swaps adjacents, sans jamais quitter\n", - "l'espace des jeux valides. C'est une vraie propriété topologique — elle\n", - "autorise à parler de **chemin** entre deux jeux (le BFS de la section 4 en\n", - "trouve un minimal) et de **régions** contiguës (les jeux à 0 Nash pur ne\n", - "forment pas une zone isolée mais un archipel traversé par les chemins). La\n", - "matrice de distances qui suit est d'ailleurs calculable uniquement parce que\n", - "cette connexité tient : dans un graphe à plusieurs composantes, la distance\n", - "entre composantes serait infinie." - ] - }, { "cell_type": "markdown", "id": "60d8ab70", @@ -1276,25 +1127,6 @@ "\"La diagonale = 0 (meme jeu). Symetrie par construction (graphe non oriente).\".Display();\n" ] }, - { - "cell_type": "markdown", - "id": "c39bacba", - "metadata": {}, - "source": [ - "### Lecture : la matrice des distances — `7` comme écart maximal\n", - "\n", - "La matrice condense la géographie : `BoS <-> Chicken = 7` swaps est la plus\n", - "grande distance du catalogue — coordination diagonale contre\n", - "anti-coordination anti-diagonale, deux mondes moraux opposés. À l'autre bout,\n", - "`PD <-> Stag Hunt = 2` et `PD <-> Chicken = 2` : le dilemme est un carrefour\n", - "central, à deux pas de deux autres classiques. La diagonale nulle et la\n", - "symétrie (`Prisoner 2 = Stag 2`, `5 = 5`) sont des contrôles de cohérence —\n", - "le graphe est non orienté, un swap se défait de lui-même. Noter enfin\n", - "`Stag Hunt <-> Matching Pennies = 5` : même écart que depuis PD, mais dans\n", - "une autre direction — la matrice donne l'espacement réel entre les\n", - "personnalités du catalogue, pas seulement leur distance au dilemme." - ] - }, { "cell_type": "markdown", "id": "83889397e656425db789ab3f3ff6b080", @@ -1497,26 +1329,6 @@ "$\"Parite QuikGraph vs BFS maison : {(mismatchT2 == 0 ? \"IDENTIQUE (25/25 distances)\" : $\"{mismatchT2} ecarts\")}\".Display();" ] }, - { - "cell_type": "markdown", - "id": "e32b87e5", - "metadata": {}, - "source": [ - "### Lecture : le même graphe en QuikGraph — et la parité avec le jumeau Python\n", - "\n", - "La tranche 2 rebâtit tout sur QuikGraph, la bibliothèque de graphes de\n", - "référence .NET, et la sortie réconcilie les comptes attendus : `576` nœuds,\n", - "`1728` arêtes — soit `576 x 6 / 2`, chaque jeu ayant six voisins de swap\n", - "(trois par joueur) et chaque arête comptée deux fois — degré moyen `6,0`\n", - "exactement. La parité affichée avec `networkx` n'est pas décorative : le\n", - "jumeau Python de ce notebook construit le même graphe des swaps sur la\n", - "bibliothèque de l'autre écosystème, et les deux implémentations indépendantes\n", - "rendent `25/25` distances identiques. Quand deux moteurs distincts, deux\n", - "langues et deux bibliothèques convergent au vingt-cinquième près, la mesure\n", - "est robuste à l'implémentation — c'est le type de contrôle qui distingue un\n", - "résultat d'un artefact de code." - ] - }, { "cell_type": "markdown", "id": "1ffcdb66", @@ -1823,4 +1635,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file From ab926ae1bbdfcc0523ced2dc151f6f997ef98976 Mon Sep 17 00:00:00 2001 From: jsboige Date: Sun, 20 Sep 2026 22:48:53 +0200 Subject: [PATCH 10/10] fix(density,#17040): GameTheory-04c-NashExistence-Csharp - 5 lectures campagne supprimees --- .../GameTheory-04c-NashExistence-Csharp.ipynb | 129 +----------------- 1 file changed, 1 insertion(+), 128 deletions(-) diff --git a/MyIA.AI.Notebooks/GameTheory/GameTheory-04c-NashExistence-Csharp.ipynb b/MyIA.AI.Notebooks/GameTheory/GameTheory-04c-NashExistence-Csharp.ipynb index 29143b45c4..b91f19e07b 100644 --- a/MyIA.AI.Notebooks/GameTheory/GameTheory-04c-NashExistence-Csharp.ipynb +++ b/MyIA.AI.Notebooks/GameTheory/GameTheory-04c-NashExistence-Csharp.ipynb @@ -159,25 +159,6 @@ "Console.WriteLine($\"|f(x*) - x*| : {Math.Abs(f(fixedPt) - fixedPt):E2}\");\n" ] }, - { - "cell_type": "markdown", - "id": "b9753b4d", - "metadata": {}, - "source": [ - "### Lecture : le point fixe comme équation soluble par itération\n", - "\n", - "La sortie vaut pour la méthode autant que pour le résultat : chercher `x*`\n", - "tel que `f(x*) = x*` en répétant `x <- f(x)` converge ici en `6` itérations\n", - "vers `1,0000000000`, avec un résidu `|f(x*) - x*| = 1,1E-15` — l'ordre de\n", - "grandeur de la précision machine. Ce n'est pas un hasard de l'exemple : pour\n", - "une fonction contractante, chaque itération réduit l'écart d'un facteur\n", - "constant, et la convergence est géométrique. Le théorème de point fixe de\n", - "Brouwer — l'outil central de l'existence de Nash — garantit l'EXISTENCE d'un\n", - "point fixe sur un compact convexe ; l'itération, elle, en donne un moyen\n", - "numérique. Le notebook construit ce lien en trois paliers : dimension 1 ici,\n", - "simplexe 2D ensuite, meilleure réponse enfin." - ] - }, { "cell_type": "markdown", "id": "96beab94", @@ -278,41 +259,6 @@ "Console.WriteLine($\"Iterations : {hist2d.Count}\");\n" ] }, - { - "cell_type": "markdown", - "id": "bddac889", - "metadata": {}, - "source": [ - "### Lecture : du segment au simplexe — et `106` itérations au lieu de `6`\n", - "\n", - "Le problème change de nature : les stratégies mixtes vivent sur le\n", - "**simplexe** (des probabilités qui somment à 1), pas sur un segment. La\n", - "projection affichée — clipper les négatifs puis normaliser — ramène tout\n", - "point de `R^2` sur ce triangle, et l'itération du point fixe y trouve\n", - "`[0,5 ; 0,5]`, somme exactement `1`. Notez le coût : `106` itérations contre\n", - "`6` en dimension 1.\n", - "\n", - "L'écart ne vient ni de la dimension ni d'un défaut de contraction : la carte\n", - "itérée `x ↦ 0,9·x + 0,1·(0,5 ; 0,5)` est **exactement** une contraction, de\n", - "rapport mesuré `0,9000000000` constant sur toute la trajectoire — contractante,\n", - "et non « seulement non expansive ». La projection, elle, reste **inerte** : le\n", - "clip ne se déclenche `0` fois sur `105` itérations, et la renormalisation ne\n", - "déplace le point que d'un ULP (`2,2E-16`, nul `91` fois sur `105`) — l'itéré ne\n", - "quitte jamais le simplexe.\n", - "\n", - "Le coût vient donc de la **vitesse** comparée des deux itérations. En dimension\n", - "1, `0,5(x + 1/x)` est la moyenne babylonienne, une itération de Newton : son\n", - "erreur est quadratique (`e(k+1) ≈ e(k)²/2`), d'où cinq itérations pour `6`\n", - "points d'historique. Ici le rapport est fixe et linéaire : l'erreur décroît\n", - "géométriquement, donc lentement. Et le nombre d'itérations n'est pas seulement\n", - "mesuré, il est **prédit** : le pas d'une itération vaut un dixième de la\n", - "distance au centre, laquelle décroît à ce rapport constant — le seuil `1E-6`\n", - "est franchi à l'itération d'indice `104`, exactement celle que le programme a\n", - "trouvée. C'est la leçon transposable : c'est le **rapport** qui décide du coût,\n", - "et le cas réel de Nash en hérite — jusqu'à Matching Pennies, où la dynamique\n", - "s'arrête net.\n" - ] - }, { "cell_type": "markdown", "id": "1705618a", @@ -449,27 +395,6 @@ "Console.WriteLine($\"Est un point fixe ? : {isFixed}\");\n" ] }, - { - "cell_type": "markdown", - "id": "4e43c486", - "metadata": {}, - "source": [ - "### Lecture : Matching Pennies — le point fixe égalisateur\n", - "\n", - "La sortie résume la machinerie complète sur le jeu qui n'avait aucun équilibre\n", - "pur : parti de `[0,5 ; 0,5]`, l'itérateur calcule les gains espérés (`0,0000`\n", - "chacun), évalue les meilleures réponses, les perturbe — et rend\n", - "`Est un point fixe ? True`. La lecture stratégique : à cinquante-cinquante,\n", - "aucun des deux joueurs ne peut dévier avec profit, parce que TOUTE\n", - "déviation se fait contrer. Le gain espéré nul des deux côtés dit que ce\n", - "n'est pas un hasard d'égalité — c'est la VALEUR du jeu : symétrique et\n", - "strictement compétitive, Matching Pennies ne peut pas rendre un côté\n", - "strictement meilleur que l'autre. L'équilibre que la section Nash-pure du\n", - "notebook 03 cherchait en vain existe donc bel et bien — mais sur la frontière\n", - "des stratégies mixtes, exactement là où le théorème de Nash dit de le\n", - "chercher." - ] - }, { "cell_type": "markdown", "id": "12ada44b", @@ -595,35 +520,6 @@ "Console.WriteLine(\">>> la dynamique continue BR a un point fixe sur le simplexe.\");\n" ] }, - { - "cell_type": "markdown", - "id": "ed4f6cf1", - "metadata": {}, - "source": [ - "### Lecture : trois départs, un seul attracteur — et une symétrie miroir\n", - "\n", - "Le tableau fait converger la dynamique de meilleure réponse continue depuis\n", - "trois départs distincts, et le résultat est net : après `50` itérations, tous\n", - "frôlent `(0,5 ; 0,5)` — `0,5233`, `0,4767`, `0,5220`. Les deux premières\n", - "lignes sont en miroir exact (`0,6507 / 0,3493` contre `0,3493 / 0,6507` à\n", - "l'itération 5) : la dynamique ne dépend pas du point de départ mais hérite sa\n", - "symétrie de celle du jeu. Deuxième lecture, plus fine : la convergence est\n", - "LENTE — après 50 itérations, l'écart résiduel est encore de `0,02`. Brouwer\n", - "garantit l'existence d'un point fixe, jamais la vitesse d'approche ; ici\n", - "chaque itération rapproche d'un facteur modestement inférieur à 1, d'où une\n", - "décroissance géométrique de queue longue. La figure suivante rend cette\n", - "lenteur visible : elle ne retient que deux des trois départs, tracés comme\n", - "chemins qui se lovent vers le même point.\n", - "\n", - "Dernier détail du tableau, à ne pas rater : les trois départs n'avancent pas\n", - "à la même vitesse — `[0,7 ; 0,3]` est déjà à `0,6098` après cinq itérations,\n", - "plus près du but que `[0,9 ; 0,1]` au même horizon. La dynamique ralentit à\n", - "mesure qu'elle approche du point fixe : les meilleures réponses deviennent\n", - "presque indiscernables quand les croyances s'égalisent, et le pas effectif\n", - "rétrécit. C'est le comportement attendu d'un flot dont le point fixe est\n", - "attractif mais faiblement — l'équilibre se mérite.\n" - ] - }, { "cell_type": "markdown", "id": "de39c7a4", @@ -708,29 +604,6 @@ " })" ] }, - { - "cell_type": "markdown", - "id": "dde049e2", - "metadata": {}, - "source": [ - "### Lecture : la trajectoire rendue visible — deux chemins, un seul bassin\n", - "\n", - "La figure trace sur le simplexe ce que le tableau précédent chiffre : deux\n", - "trajectoires, partant des points intérieurs `(0,9 ; 0,1)` et `(0,1 ; 0,9)`,\n", - "s'enroulant vers le même point central `(0,5 ; 0,5)` — que le troisième tracé\n", - "signale d'un simple marqueur, sans trajectoire : c'est la cible, pas un\n", - "départ. La lecture visuelle confirme les deux propriétés mesurées —\n", - "l'attracteur unique (les deux chemins mènent au même point) et la symétrie du\n", - "flot (les deux trajectoires sont l'image miroir l'une de l'autre). C'est\n", - "aussi le contrepoint utile du théorème : Brouwer est une affirmation\n", - "d'EXISTENCE — il dit qu'un point fixe est là, quelque part sur le compact —\n", - "et la dynamique itérative en est la version constructive, qui le trouve mais à\n", - "sa vitesse. Les exercices qui suivent testent les limites des deux : Chicken\n", - "(équilibre mixte ailleurs qu'au centre), Battle of Sexes (trois équilibres —\n", - "deux purs, un mixte — et donc un choix de bassin), Dilemme (équilibre rejeté\n", - "au bord du simplexe).\n" - ] - }, { "cell_type": "markdown", "id": "dab67d51", @@ -1039,4 +912,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file