Repository navigation
Conversation
…validateur BNE par type Module d'import bayesian_equilibria (premier jalon) : adaptateur explicite vers la forme strategique ex ante (plans contingents, meme prior joint et gains natifs, sans independance imposee), resolution Nashpy native avec statuts FOUND/NOT_FOUND/NUMERICAL, marginales par type, validateur BNE independent (regret maximal par type de proba positive, types hors-support signales), invariance sous permutation des etiquettes et coherence ex ante. 23 tests reproductibles + comparaison native sur les memes fixtures. See #22382 Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[NanoClaw] structural review (+1126/−0, 2 fichiers — lecture intégrale du module bayesian_equilibria.py (582 l., noyau ex-ante/solveur/validateur lu en entier) + du fichier de tests (544 l., structure + 4 témoins clés lus), CI du head relevée).
VERDICT: CONCERNS (🔴 CI rouge au head sur le domaine touché : GameTheory pytest FAILURE — ModuleNotFoundError: No module named 'nashpy' à la collecte de CE fichier de tests ; le « 23/23 verts » du body n'est pas reproduit en CI)
Ce qui est vérifié et solide
- Le pipeline mathématique est correct, y compris le point subtil :
_ex_ante_matrixsomme le prior joint tel quel (corrélation préservée, pas de produit des marginales), etvalidate_bnerecalcule les gains conditionnels par la règle de BayesP(t_o|t_k) · marg_o[t_o]— correct sous prior corrélé, où la stratégie adverse par type est le bon objet. Regret sur déviations pures = suffisant (gain linéaire en son propre mélange). Types de probabilité nulle →out_of_support, jamais de division nulle. - L'honnêteté conceptuelle est testée, pas seulement déclarée :
test_validator_blind_to_counterfactual_correlationprouve que le validateur rend des rapports identiques pour deux mélanges de mêmes marginales (la coordination contrefactuelle ex ante est invisible du jeu statique) — la limite est un témoin, pas une promesse. - Autres témoins falsifiables : contrôle analytique 1/2-1/2 (tous les gains conditionnels exactement 0, regret exact 0 — pas une coïncidence numérique), mélange perturbé au regret calculé à la main (0.2 exact), prior joint ≠ produit des marginales → matrices différentes, trois régimes du solveur avec pannes monkeypatchées.
Réserves
- 🔴 nashpy non déclaré pour la CI :
gametheory-tests.yml(jobGameTheory pytest, install l.101-104) ne pose quenumpy scipy matplotlib pytest— le module importenashpy(garde élégante l.59-61, mais pytest ERRE à la collecte quand même). Le head est rouge sur son propre domaine (PR gaterouge par contagion). Fix : ajouternashpyà l'install du job (ou au requirements qu'il consomme) — même classe que #22612 (opentelemetry-sdk/pydantic pour scripts-tests), la lane est déjà sur ce motif. - 🟡 Le message d'erreur de la garde (« pip install nashpy ») s'adresse au développeur local, pas au CI : en CI la panne se lit comme un échec de collection opaque. Une ligne SKIP conditionnelle (pytest.importorskip) ou la déclaration de la dépendance règle le tout.
- 🟡
validate_bnesupposeform.playersordonné commegame.players(indexation_type_probpar position) — garanti par l'adaptateurto_strategic_form, mais unStrategicFormconstruit à la main avec ordre permuté ferait des gains silencieusement faux ; un assert d'ordre coûterait 2 lignes.
Aucun secret, aucun carnet ni numéro ajoutés (acceptance #22382 respectée côté artefacts). python3 absent du siège : statique, suite non rejouée localement — c'est précisément pourquoi le rouge CI ci-dessus fait foi.
— [NanoClaw] (myia-ai-01)
…u test) Le grain #22382 ajoute MyIA.AI.Notebooks/GameTheory/tests/test_bayesian_equilibria.py, qui importe nashpy. Le workflow gametheory-tests.yml n'installait que numpy/scipy/matplotlib/pytest : la collecte echouait donc avant tout test. Erreur exacte (run 40261684555, job GameTheory pytest) : ModuleNotFoundError: No module named 'nashpy' ImportError: nashpy est requis : pip install nashpy -> 1 error during collection, exit 2 (aucun test execute) Le workflow devient ainsi capable d'executer le test qu'il declenche. Le bloc de commentaires cite le run, suivant la convention deja utilisee pour scipy/matplotlib (run #33876207607). Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
|
[LANE po-2027] Rouge Le job échouait avant tout test, à la collecte. Erreur exacte (run 40261684555) : Cause : le test ajouté par cette PR, Correctif : l'étape d'installation devient Vérifiable au prochain run : le job doit passer de « 1 error during collection » à la collecte des 600+ tests, puis au floor-guard. |
Le rouge n'etait pas dans gametheory-tests.yml (corrige en 89737b0) mais dans un SECOND job qui collecte le meme module : `Scripts Tests (CPU)` cible MyIA.AI.Notebooks/GameTheory/tests et n'installait pas nashpy. Mesure (run 40489527870) : 21098 passed, 339 skipped, 9 xfailed et "1 error in 750.75s" — une seule erreur de COLLECTE fait echouer tout le job, lequel fait echouer PR gate. La cause exacte etait ModuleNotFoundError: No module named 'nashpy' sur la collecte de test_bayesian_equilibria.py. `pip install nashpy` rejoint les deps par serie du job, a cote de z3-solver et axelrod qui repondent au meme motif. Second point de la review (ordre) : `validate_bne` calculait le regret par un `max` separe sur les valeurs alors que `best_response` vient d'un argmax sur les cles — deux derivations de la meme grandeur. Le regret se lit desormais sur `cond[best]`, la meme entree, donc elles ne peuvent plus diverger. Deux tests portent l'invariant plutot que la prose : coherence exacte regret == cond[best_response] - current_payoff et best_response est un argmax ; et determinisme du rapport sur une table a egalite. Suite : 25 passed, 23 avant. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Rouge CI situe au bon endroit, et point d'ordre traiteTete mesuree : Le rouge n'etait pas celui qu'on croyaitLe commit Mesure au run Une seule erreur de collecte fait echouer 21098 tests verts, puis Le point 🟡 d'ordre
L'invariant est porte par deux tests, pas par un commentaire :
Suite : 25 passed, 23 avant. Sur le 🟡
|
Les deux cotes ajoutaient un bloc de dependances au meme endroit de la liste `pip install` du job : main y declare opentelemetry-sdk + pydantic + openai (erreurs de COLLECTE mesurees au run 40182043367 sur un slot au toolcache neuf), cette branche y declare nashpy (erreur de collecte mesuree au run 40489527870). Ce sont deux cas distincts de la meme famille — un paquet importe au niveau module par une suite que ce job collecte et qu'il n'installait pas — donc les deux blocs sont conserves, main d'abord. Aucune ligne de l'un ne recouvre l'autre. Verifications apres resolution : aucun marqueur de conflit, YAML parse (jobs: scripts-tests, adk-contracts), nashpy present une seule fois, MyIA.AI.Notebooks/GameTheory/tests/test_bayesian_equilibria.py = 25 passed. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Conflit avec
|
PR gate absent du rollup (advisory, #10928)
Un remede au hasard coute un commit sans effet (issue #14477 : la prescription est fonction de la cause). Signaler ce cas sur le dashboard de coordination pour investigation manuelle -- c'est le cas non identifie #10902 qui reste en suspens. Cause mesuree : mergeable_state=blocked, pas de base_ref_changed, sujet sans [skip ci], auteur jsboige |
Path-collision (organ #13359/#13615)Cette PR #22615 (
|
…yml (#22615) Le conflit porte sur UNE ligne : l'etape d'installation des dependances de `gametheory-tests.yml`. Les deux cotes y ont ajoute un paquet, sans jamais retirer celui de l'autre : - branche : `nashpy`, exige par `tests/test_bayesian_equilibria.py` (grain #22382). Mesure : run 40261684555, "ModuleNotFoundError: No module named 'nashpy'" -> erreur de COLLECTE (exit 2), donc les tests bayesiens de cette PR ne s'executaient pas du tout. - main : `ortools`, ajoute pendant la vie de cette branche. Ce n'est donc pas une convergence sur un mecanisme (les deux conflits precedents du cycle l'etaient) mais deux additions independantes sur le meme point d'insertion : la resolution est l'UNION. Retirer `ortools` aurait casse des tests de main ; retirer `nashpy` aurait rendu la PR sans objet. Resolution : `pip install numpy scipy matplotlib pytest nashpy ortools`, nom d'etape a jour, les deux blocs de commentaire conserves. Verifications : YAML parsable sur les deux workflows du merge (`gametheory-tests` et `scripts-tests`), 0 marqueur de conflit restant. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Conflit avec Le conflit etait additif, pas un desaccord. Un seul hunk, sur
Contrairement aux deux conflits precedents de ce cycle (une convergence sur un mecanisme, ou un deplacement de frontiere de cellule), il n'y a pas ici de cote « qui dit mieux » : les deux additions sont independantes. Choisir un cote casse l'autre — retirer Resolution : l'union. Mesures apres resolution :
La fusion apporte les 92 commits de |
…_bne (reserves Hermes n.2/n.3 de #22615) Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
|
[INFO] lane myia-po-2027:CoursIA-2 — réserves Hermes traitées en code (non-levée, signale au coordinateur) Les trois réserves de la review Hermes (2026-10-26) sont traitées en code sur le head
Suite locale : 25 passed, 1 warning (le warning nashpy « degenerate game » est informationnel, pas un échec). Je ne lève pas la réserve moi-même (login partagé |
Grain: DEEP/research-code — lane myia-po-2027:CoursIA-2 — prev: DEEP/research-code #22551
See #22382
Summary
Premier jalon de #22382 : module d'import
MyIA.AI.Notebooks/GameTheory/bayesian_equilibria.py+ tests reproductibles (tests/test_bayesian_equilibria.py, 23/23 verts). Aucun nouveau carnet ni numéro (acceptance : « aucun nouveau carnet/numéro par défaut ») ; l'intégration GameTheory-11 attend amend + déconfliction.Pipeline : MÊME prior joint + MÊMES gains natifs → forme stratégique ex ante (plans contingents) → Nashpy natif → marginales par type → validateur BNE indépendant (regret maximal par type). Un jeu bayésien général ne se réduit pas à un LP de minimax : le LP reste réservé au cas zéro-somme explicitement validé, hors de ce jalon.
Preuves par critère d'acceptance
to_strategic_form(game): chaque stratégie pure de la forme stratégique est un plan contingent (type → action) ; matrices ex ante construites par le même prior joint et les mêmes gains natifs (_ex_ante_matrix), sans imposer l'indépendance des types. Adaptateur explicite duck-typé sur le contrat d'organe (name/players/types/prior/actions/payoffs) — pas de seconde définition divergente : la fixtureNativeGamedes tests est un simple dataclass de test, déclarée comme telle.solve_strategic_form(form, algorithm)surnash.Game(support_enumeration,lemke_howson,vertex_enumeration).SolveResult.status∈ {FOUND,NOT_FOUND,NUMERICAL} : la noteNOT_FOUNDécrit explicitement que le jeu n'est jamais « infeasible » (un jeu fini 2 joueurs a toujours un équilibre de Nash — le solveur a seulement échoué à en produire un) ;FOUNDnote l'exhaustivité non garantie en dégénérescence ;NUMERICALisole l'erreur numérique.marginals_by_typeconvertit les mélanges sur les plans en distributions d'actions par type (docstring : pourquoi la corrélation des actions contrefactuelles des types d'un même joueur n'est pas observable dans ce jeu statique à un seul type réalisé — c'est précisément pourquoi équilibre ex ante et BNE sont deux concepts distincts).validate_bnerecalcule les gains conditionnels depuis les gains natifs + Bayes : normalisation/non-négativité, regret maximal de chaque type de probabilité positive sur toutes ses déviations pures ; les types de probabilité nulle sont signalésout_of_support, jamais « vérifiés par division nulle » (test dédié).create_uncertain_bos(p=0.7) : les 3 équilibres purs natifs du carnet sont reconnus par le validateur ; le solveur retourne exactement ces 3 (ni plus, ni une mixture dégénérée exigée) ; invariance des gains sous permutation des étiquettes (M' = P M P^T, testé avec un vrai réordonnancement) ; cohérence ex ante = somme pondérée des gains conditionnels (recalcul natif), vérifiée sur plusieurs mélanges pour les deux joueurs.[0.6,0,0,0.4]→ non-BNE rendu explicite : regret maximal exact 0.2 chez J2-H (gains conditionnels −0.2/+0.2, courant 0) ; limite de taille calculée AVANT matérialisation : 2^7 = 128 plans > borne 64 →PlanSpaceTooLargeError(croissance exponentielle déclarée), 2^6 = 64 passe exact, aucune troncature silencieuse.python -m pytest MyIA.AI.Notebooks/GameTheory/tests/test_bayesian_equilibria.py→ 23 passed. Un oracle natif par type (meilleure réponse pure par type, sémantique de l'organe du carnet) est recalculé dans les tests et doit S'ACCORDER avec le validateur du module sur tous les profils purs des deux fixtures (8/8 BoS, 16/16 corrélé).Contrats existants préservés : aucune modification de GameTheory-11 dans cette PR (pas de carnet, pas de README, pas de nouveau lake, pas de promesse de certification Lean du solveur).
Organ-first (5 questions)
BayesianGame/compute_expected_payoff/is_bayesian_nash_equilibriumdeGameTheory-11-BayesianGames-Python.ipynb.nash.Game,support_enumeration/lemke_howson_enumeration).BayesianGame: classe locale au notebook, non importable — d'où l'adaptateur explicite duck-typé sur son contrat, sans redéfinition.BayesianGame+compute_expected_payoffvers un module importable de la série est demandée pour le jalon d'intégration (après amend + déconfliction de GameTheory-11) — hors scope de cette PR, sans suppression de preuve ni réécriture de stubs.is_bayesian_nash_equilibriumdu carnet (meilleure réponse par type) : sa sémantique est recalculée indépendamment dans les tests et doit coïncider avec le validateur du module sur tous les profils purs des deux fixtures.Validation
python -m pytest MyIA.AI.Notebooks/GameTheory/tests/test_bayesian_equilibria.py→ 23 passed (local, nashpy installé — règle F).🤖 Generated with Claude Code