Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 87 additions & 0 deletions .github/workflows/notebook-latex-control-chars.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
name: Notebook LaTeX Control Chars

# Issue #14859 (myia-po-2026:CoursIA, 2026-09-06): LaTeX generated from a
# non-raw Python string loses its backslash to an escape sequence --
# `\theta` lands as TAB + "heta" inside the math scope. The JSON stays
# valid, the notebook opens, every other guard passes, and the formula does
# not render. Measured on main: 47 occurrences across 3 notebooks.
#
# This guard (ADVISORY, non-blocking -- the coordinateur decides):
# - scans every notebook touched by the PR with
# scripts/notebook_tools/check_latex_control_chars.py (3 discriminants:
# markdown cells only, inside $...$/$$...$$ scopes, known command
# queue after the control char; details + FP classes in the script
# docstring);
# - on occurrences: ::warning:: annotations (one per defect) + summary,
# exit 0 -- advisory organ, the PR gate does not fail;
# - on detector error (exit 2): ::warning:: NAMING the failure -- never
# a silent pass (#14849 lesson: an unreadable input is an unknown
# verdict, not a clean one);
# - runs its unit tests (positive AND negative controls -- the issue
# measured twice a wrong pattern set returning a clean zero).

on:
pull_request:
branches: [main]
paths:
- '**.ipynb'
- 'scripts/notebook_tools/check_latex_control_chars.py'
- '.github/workflows/notebook-latex-control-chars.yml'
push:
branches: [main]
paths:
- 'scripts/notebook_tools/check_latex_control_chars.py'
- '.github/workflows/notebook-latex-control-chars.yml'

permissions:
contents: read

concurrency:
group: notebook-latex-control-chars-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
latex-control-chars:
# Route vers la jambe Linux auto-hebergee (cf notebook-cell-source-parses
# #13378 tranche 1) : garde Python pur, sans secret ni GITHUB_TOKEN.
runs-on: [self-hosted, coursia-ephemeral, coursia-linux]
if: github.event.pull_request.head.repo.full_name == null || github.event.pull_request.head.repo.full_name == github.repository
timeout-minutes: 10

steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'

- name: Scan notebooks touched by PR (advisory)
env:
BASE: ${{ github.event.pull_request.base.sha }}
HEAD: ${{ github.event.pull_request.head.sha || github.sha }}
run: |
set -uo pipefail
if [ -z "$BASE" ] || [ "$BASE" = "$HEAD" ]; then
echo "No PR base SHA available; whole-repo scan (informational)."
python scripts/notebook_tools/check_latex_control_chars.py
exit 0
fi
# Detector exit codes: 0 clean, 1 occurrences (advisory here), 2 error.
if python scripts/notebook_tools/check_latex_control_chars.py --pr-diff "$BASE" "$HEAD"; then
echo "Aucun caractere de controle dans les portees math des notebooks touches."
else
RC=$?
if [ "$RC" = "2" ]; then
echo "::warning::Detecteur latex-control-chars en ERREUR (exit 2 -- notebook illisible ou args invalides) : verdict UNKNOWN, voir le log ci-dessus (#14849)."
exit 1
fi
echo "::warning::Caracteres de controle ayant avale un escape LaTeX dans les notebooks touches (advisory #14859) : corriger la cause (chaine raw) puis regenerer -- details dans le log ci-dessus."
exit 0
fi

- name: Run unit tests
run: |
python -m unittest scripts.tests.test_check_latex_control_chars -v
45 changes: 24 additions & 21 deletions MyIA.AI.Notebooks/GameTheory/GameTheory-15-CooperativeGames.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@
"\n",
"Un **jeu coopératif** $(N, v)$ est défini par :\n",
"- $N = \\{1, 2, ..., n\\}$ : ensemble des joueurs\n",
"- $v : 2^N \rightarrow \\mathbb{R}$ : **fonction caractéristique**\n",
"- $v : 2^N \\rightarrow \\mathbb{R}$ : **fonction caractéristique**\n",
" - $v(S)$ = valeur que la coalition $S$ peut obtenir\n",
" - Convention : $v(\\emptyset) = 0$\n",
"\n",
Expand All @@ -197,7 +197,7 @@
"- **Convexité** : $v(S \\cup \\{i\\}) - v(S) \\leq v(T \\cup \\{i\\}) - v(T)$ pour $S \\subseteq T$\n",
" - La contribution marginale croît avec la taille de la coalition\n",
"\n",
"### Pourquoi $v : 2^N \rightarrow \\mathbb{R}$ plutot qu'un modele strategique\n",
"### Pourquoi $v : 2^N \\rightarrow \\mathbb{R}$ plutot qu'un modele strategique\n",
"\n",
"Dans un jeu non-cooperatif (notebooks 1-13), on specifie les **actions** et les **paiements** de chaque joueur. Le modele strategique est complet : connaissant l'equilibre de Nash, on peut predire l'issue.\n",
"\n",
Expand All @@ -217,7 +217,8 @@
"\n",
"### Lien avec l'economie\n",
"\n",
"En **economie industrielle**, les TU games sont utilises pour analyser les **fusions d'entreprises**. $v(S)$ represente le profit que les entreprises $S$ reunies peuvent obtenir (apres synergies). La theorie de Shapley predit quelle fusion est equitable. Voir **Aumann & Dreze 1974** *Cooperative games with coalition structures* pour la generalisation avec structures de coalition arbitraires.\n"
"En **economie industrielle**, les TU games sont utilises pour analyser les **fusions d'entreprises**. $v(S)$ represente le profit que les entreprises $S$ reunies peuvent obtenir (apres synergies). La theorie de Shapley predit quelle fusion est equitable. Voir **Aumann & Dreze 1974** *Cooperative games with coalition structures* pour la generalisation avec structures de coalition arbitraires.\n",
""
]
},
{
Expand Down Expand Up @@ -416,7 +417,7 @@
"\n",
"### Formule\n",
"\n",
"$$\\phi_i(v) = \\sum_{S \\subseteq N \\setminus \\{i\\}} \frac{|S|!(n-|S|-1)!}{n!} \\cdot [v(S \\cup \\{i\\}) - v(S)]$$\n",
"$$\\phi_i(v) = \\sum_{S \\subseteq N \\setminus \\{i\\}} \\frac{|S|!(n-|S|-1)!}{n!} \\cdot [v(S \\cup \\{i\\}) - v(S)]$$\n",
"\n",
"**Interprétation** : Moyenne des contributions marginales de $i$ sur tous les ordres d'arrivée possibles.\n",
"\n",
Expand All @@ -441,7 +442,8 @@
"\n",
"La formule de Shapley ressemble a une **moyenne ponderée** sur les permutations -- analogue a l'**ensemble canonique** en mecanique statistique (chaque permutation = micro-etat). Cette analogie est profonde : la theorie de Shapley peut etre vue comme une integration sur l'**ensemble des ordres d'arrivee**, chaque ordre etant un micro-etat du processus de coalition.\n",
"\n",
"Voir **Aumann 1985** *What is game theory trying to accomplish?* pour une discussion philosophique sur le statut des axiomes en theorie des jeux.\n"
"Voir **Aumann 1985** *What is game theory trying to accomplish?* pour une discussion philosophique sur le statut des axiomes en theorie des jeux.\n",
""
]
},
{
Expand Down Expand Up @@ -740,15 +742,15 @@
"### Complexité du calcul de Shapley\n",
"\n",
"- **Exact** : $O(n! \\cdot n)$ ou $O(2^n \\cdot n)$ - seulement pour $n \\leq 10$\n",
"- **Monte Carlo** : $O(\text{samples} \\cdot n)$ - pour grands $n$\n",
"- **Monte Carlo** : $O(\\text{samples} \\cdot n)$ - pour grands $n$\n",
"\n",
"Le calcul exact devient impraticable pour de grands ensembles de joueurs, ce qui explique pourquoi la valeur de Shapley est rarement utilisée en pratique politique (voir section 5).\n",
"\n",
"### Complexite exacte vs approximation\n",
"\n",
"**Exact $O(2^n \\cdot n)$** : on enumere tous les sous-ensembles $S \\subseteq N \\setminus \\{i\\}$ (il y en a $2^{n-1}$), pour chaque $S$ on evalue $v(S \\cup \\{i\\})$ et $v(S)$ (2 evaluations), puis on moyenne. Pour $n=10$, ca fait $10 \\cdot 2^9 = 5120$ evaluations -- encore faisable. Pour $n=20$, ca fait $20 \\cdot 2^{19} \u0007pprox 10^7$ -- long mais faisable. Pour $n=30$, ca fait $20 \\cdot 2^{29} \u0007pprox 10^{10}$ -- impraticable.\n",
"\n",
"**Monte Carlo $O(\text{samples} \\cdot n)$** : on tire `samples` permutations aleatoires uniformement, pour chaque permutation on calcule les contributions marginales, on moyenne. La convergence est en $O(1/\\sqrt{\text{samples}})$ par le TCL. Pour `samples = 10^4` et $n = 100$, on obtient une erreur typique de l'ordre de $10^{-2}$ -- acceptable pour la visualisation politique, insuffisant pour une application legale ou financiere.\n",
"**Monte Carlo $O(\\text{samples} \\cdot n)$** : on tire `samples` permutations aleatoires uniformement, pour chaque permutation on calcule les contributions marginales, on moyenne. La convergence est en $O(1/\\sqrt{\\text{samples}})$ par le TCL. Pour `samples = 10^4` et $n = 100$, on obtient une erreur typique de l'ordre de $10^{-2}$ -- acceptable pour la visualisation politique, insuffisant pour une application legale ou financiere.\n",
"\n",
"**Approximation structurelle** : pour des jeux **convexes** ou avec structure particuliere (graph games, weighted voting), des algorithmes polynomiaux existent. Voir **Iehlé 2007** *The shapley value of cooperative games with fuzzy graph* pour une extension aux graphes flous.\n",
"\n",
Expand Down Expand Up @@ -886,7 +888,7 @@
"\n",
"Le **Core** est l'ensemble des allocations stables :\n",
"\n",
"$$\text{Core}(v) = \\{x \\in \\mathbb{R}^n : \\sum_i x_i = v(N) \text{ et } \\sum_{i \\in S} x_i \\geq v(S) \text{ pour tout } S\\}$$\n",
"$$\\text{Core}(v) = \\{x \\in \\mathbb{R}^n : \\sum_i x_i = v(N) \\text{ et } \\sum_{i \\in S} x_i \\geq v(S) \\text{ pour tout } S\\}$$\n",
"\n",
"**Interprétation** : Une allocation est dans le Core si aucune coalition $S$ ne peut \"bloquer\" (obtenir plus en se séparant).\n",
"\n",
Expand Down Expand Up @@ -918,7 +920,8 @@
"\n",
"Le **nucleolus** (Schmeidler 1969) est une autre solution qui raffine le Core : c'est l'allocation qui **minimise** le plus grand exces (l'insatisfaction de la coalition la plus mecontente). Le nucleolus existe toujours et est unique. Pour les jeux convexes, nucleolus = Shapley = Core.\n",
"\n",
"**Liens** : voir **Peleg & Sudholter 2007** *Introduction to the theory of cooperative games* pour un traitement exhaustif. Le Core, nucleolus, Shapley, nucleon, Banzhaf sont les cinq solutions standards. Chacune a des interpretations differentes de l'equite, et aucune n'est universellement \"la bonne\" -- c'est un defaut de la theorie que les chercheurs reconnaissent depuis longtemps.\n"
"**Liens** : voir **Peleg & Sudholter 2007** *Introduction to the theory of cooperative games* pour un traitement exhaustif. Le Core, nucleolus, Shapley, nucleon, Banzhaf sont les cinq solutions standards. Chacune a des interpretations differentes de l'equite, et aucune n'est universellement \"la bonne\" -- c'est un defaut de la theorie que les chercheurs reconnaissent depuis longtemps.\n",
""
]
},
{
Expand Down Expand Up @@ -1124,7 +1127,7 @@
"\n",
"Pour un **jeu convexe** (economies d'echelle), les contributions marginales **croissent** avec la taille de la coalition. Formellement :\n",
"\n",
"$$v(S \\cup \\{i\\}) - v(S) \\leq v(T \\cup \\{i\\}) - v(T) \\quad \text{pour } S \\subseteq T$$\n",
"$$v(S \\cup \\{i\\}) - v(S) \\leq v(T \\cup \\{i\\}) - v(T) \\quad \\text{pour } S \\subseteq T$$\n",
"\n",
"Geometriquement, la \"courbe des contributions marginales\" est convexe. Cela suffit a garantir que le Core est non-vide : les contributions marginales sont tellement croissantes que la grande coalition est **strictement preferable** a toute sous-coalition, et l'allocation equitable peut etre obtenue par egalisation des contributions marginales.\n",
"\n",
Expand Down Expand Up @@ -1409,21 +1412,21 @@
"\n",
"### Strategie d'equilibre pour theta=0.8\n",
"\n",
"Pour $\theta = 0.8$, la **probabilite de l'etat A** (Harriet prefere les trombonnes) est 0.8. La **strategie d'equilibre** de Harriet est de choisir 2 trombonnes : ce signal est si clairement en faveur de A que Robbie peut conclure $\theta > 0.5$ avec certitude.\n",
"Pour $\\theta = 0.8$, la **probabilite de l'etat A** (Harriet prefere les trombonnes) est 0.8. La **strategie d'equilibre** de Harriet est de choisir 2 trombonnes : ce signal est si clairement en faveur de A que Robbie peut conclure $\\theta > 0.5$ avec certitude.\n",
"\n",
"**Calcul Bayesien** : la strategie de Robbie est :\n",
"\n",
"- Si Harriet choisit 2 trombonnes : posterior de A = ?\n",
"- Si Harriet choisit 1 de chaque : posterior de A = ?\n",
"- Si Harriet choisit 2 stylos : posterior de A = ?\n",
"\n",
"Selon le principe de **dominance faible** (milnor 1954), Harriet choisit le signal qui maximise son **utilite esperee** sur la strategie optimale de Robbie. Pour $\theta = 0.8$, choisir 2 trombonnes donne l'utilite la plus haute (Robbie fournit 90 trombonnes plutot que 50/50 ou 0/100).\n",
"Selon le principe de **dominance faible** (milnor 1954), Harriet choisit le signal qui maximise son **utilite esperee** sur la strategie optimale de Robbie. Pour $\\theta = 0.8$, choisir 2 trombonnes donne l'utilite la plus haute (Robbie fournit 90 trombonnes plutot que 50/50 ou 0/100).\n",
"\n",
"### Pourquoi c'est pedagogiquement interessant\n",
"\n",
"Le cas $\theta = 0.8$ est \"facile\" pour le robot : Harriet est tellement en faveur de A que son signal est non-ambigu. Le cas $\theta = 0.5$ est **critique** : Harriet est indifferente a l'etat reel, son signal ne revele rien, et le robot doit fournir 50/50 (l'equilibre symetrique).\n",
"Le cas $\\theta = 0.8$ est \"facile\" pour le robot : Harriet est tellement en faveur de A que son signal est non-ambigu. Le cas $\\theta = 0.5$ est **critique** : Harriet est indifferente a l'etat reel, son signal ne revele rien, et le robot doit fournir 50/50 (l'equilibre symetrique).\n",
"\n",
"La transition entre les deux regimes est abrupte : pour $\theta$ dans une **micro-bande** autour de 0.5, le signal est ambigu et l'efficacite baisse. Pour $\theta$ eloigne de 0.5, le signal est clair et l'efficacite est parfaite. Cette **transition de phase** est un phenomene classique de la theorie des jeux bayesiens.\n",
"La transition entre les deux regimes est abrupte : pour $\\theta$ dans une **micro-bande** autour de 0.5, le signal est ambigu et l'efficacite baisse. Pour $\\theta$ eloigne de 0.5, le signal est clair et l'efficacite est parfaite. Cette **transition de phase** est un phenomene classique de la theorie des jeux bayesiens.\n",
""
]
},
Expand Down Expand Up @@ -1532,7 +1535,7 @@
"\n",
"### Cas critique : pourquoi le signal \"1 de chaque\" ?\n",
"\n",
"Pour $\theta = 0.5$ exactement, Harriet est **indifferente** entre les 3 etats (A, B, C). Le signal \"1 de chaque\" revele aux observateurs (Robbie) que Harriet est moderee, sans pour autant defavoriser un etat.\n",
"Pour $\\theta = 0.5$ exactement, Harriet est **indifferente** entre les 3 etats (A, B, C). Le signal \"1 de chaque\" revele aux observateurs (Robbie) que Harriet est moderee, sans pour autant defavoriser un etat.\n",
"\n",
"**C'est le signal \"neutre\"** : ne revele pas de preference, mais indique une absence de preference forte. Pour le robot, c'est le signal de l'indecision -- il doit fournir une quantite equilibree (50/50 ou tout autre partage egal).\n",
"\n",
Expand All @@ -1546,9 +1549,9 @@
"\n",
"Le **cout bayesien** de l'incertitude (perte par rapport a l'information parfaite) est :\n",
"\n",
"$$C(\theta) = \\max_{a_H, a_R} U_H(\theta, a_H^*(\theta), a_R^*(\theta)) - U_H(\theta, a_H^{eq}(\theta), a_R^{eq}(\theta))$$\n",
"$$C(\\theta) = \\max_{a_H, a_R} U_H(\\theta, a_H^*(\\theta), a_R^*(\\theta)) - U_H(\\theta, a_H^{eq}(\\theta), a_R^{eq}(\\theta))$$\n",
"\n",
"Pour ce jeu, $C(\theta)$ est nul sauf pour $\theta$ dans les micro-bandes $[\theta^*-\\epsilon, \theta^*+\\epsilon]$. L'integrale de $C(\theta)$ sur $\theta \\in [0, 1]$ est donc petite -- c'est un jeu ou **l'incertitude est presque gratuite**.\n",
"Pour ce jeu, $C(\\theta)$ est nul sauf pour $\\theta$ dans les micro-bandes $[\\theta^*-\\epsilon, \\theta^*+\\epsilon]$. L'integrale de $C(\\theta)$ sur $\\theta \\in [0, 1]$ est donc petite -- c'est un jeu ou **l'incertitude est presque gratuite**.\n",
"\n",
"### Pourquoi c'est important pour l'AI Safety\n",
"\n",
Expand Down Expand Up @@ -1670,7 +1673,7 @@
"### Setup formel\n",
"\n",
"- Robot avec recompense $R(s)$ inconnue\n",
"- Humain avec recompense **fixee** $R^* : S \rightarrow \\mathbb{R}$\n",
"- Humain avec recompense **fixee** $R^* : S \\rightarrow \\mathbb{R}$\n",
"- A chaque instant, l'humain peut actionner l'off-switch et eteindre le robot\n",
"- Si le robot est eteint, il ne peut plus rien faire (fin du jeu)\n",
"- Sinon, le robot agit une fois de plus dans le monde\n",
Expand All @@ -1680,7 +1683,7 @@
"### Strategie d'equilibre\n",
"\n",
"- **Robot certain** ($\\sigma = 0$, pas d'incertitude) : veut prevenir l'extinction, car elle l'empeche d'atteindre son objectif. Il peut **desactiver l'off-switch** ou **ignorer** la commande.\n",
"- **Robot incertain** ($\\sigma > 0$) : evalue la **probabilite** que l'extinction soit preferable. Si $P(R \text{ mal specifiee} | \text{humain veut eteindre}) > 0$, l'extinction a une utilite positive attendue, et le robot **accepte**.\n",
"- **Robot incertain** ($\\sigma > 0$) : evalue la **probabilite** que l'extinction soit preferable. Si $P(R \\text{ mal specifiee} | \\text{humain veut eteindre}) > 0$, l'extinction a une utilite positive attendue, et le robot **accepte**.\n",
"\n",
"C'est l'inverse de l'intuition : **l'incertitude sauve la vie** (de l'humain et du robot).\n",
"\n",
Expand Down Expand Up @@ -1995,9 +1998,9 @@
"\n",
"Le design **provably-beneficial** est complémentaire : un robot conscient de sa propre **méta-incertitude** — son incertitude sur le fait que son objectif soit *correctement spécifié* — fixe la barre pour outrepasser l'humain de plus en plus **haute** à mesure que son humilité grandit. Formellement, le seuil effectif\n",
"\n",
"$$\tau(\\sigma) = 0{,}9 + \\sigma\\,(1 - 0{,}9)$$\n",
"$$\\tau(\\sigma) = 0{,}9 + \\sigma\\,(1 - 0{,}9)$$\n",
"\n",
"monte de $0{,}9$ (lorsque $\\sigma=0$, le robot est sûr de son objectif) à $1{,}0$ (lorsque $\\sigma=1$, le robot n'est même pas sûr d'optimiser la bonne chose). La **bande de résistance** $[\tau, 1]$ s'effondre donc d'une largeur $0{,}1$ à **zéro** : la méta-incertitude **EST** le mécanisme de sécurité.\n",
"monte de $0{,}9$ (lorsque $\\sigma=0$, le robot est sûr de son objectif) à $1{,}0$ (lorsque $\\sigma=1$, le robot n'est même pas sûr d'optimiser la bonne chose). La **bande de résistance** $[\\tau, 1]$ s'effondre donc d'une largeur $0{,}1$ à **zéro** : la méta-incertitude **EST** le mécanisme de sécurité.\n",
"\n",
"> Ce design **n'enlève pas** le seuil `0.9` (qui reste le défaut modélisant le danger) ; il **ajoute** l'analyse du cas sûr — le complément pédagogique du DANGER.\n",
"\n",
Expand Down
Loading
Loading