Portage Infer.NET → Python — MyIA.AI.Notebooks/Probas/
Référence pérenne. Ce document porte le périmètre intentionnel et la recommandation de bibliothèques d’un portage de la série Infer.NET (.NET Interactive, C#) vers des notebooks Python (PyMC, NumPyro, pgmpy, hmmlearn, Pyro). Il ne porte PAS le mapping d’API détaillé (daté PyMC v5, 2026-05-11) — voir section « Mapping d’API = à re-dériver ».
Source canonique : issue #297 (CLOSED 2026-05-02 — le plan détaillé a été suivi en partie mais n’est plus défendable comme artefact commité).
Substance portée ici depuis MyIA.AI.Notebooks/Probas/PORT_PYTHON_PLAN.md (sha 48428c7e3d2fd20c682a2f4e49cec4b9894f4f30, supprimé par #9914 c.1284) + PORT_PYTHON_PLAN.en.md (sha 0fc67bae3da3902722dc943225d4ea5238d22a3a, supprimé idem).
Note sur ce qui est pérenne et ce qui ne l’est pas
La colonne de droite de ce document mélange deux natures. Le périmètre intentionnel (combien de notebooks, quelle bibliothèque pour quel concept, quelle convention de nommage) est durable : ce sont des décisions de conception du dépôt, et c’est l’objet de cette référence. Le mapping d’API ligne-à-ligne (Variable.Bernoulli → pm.Bernoulli(...) et la table de traduction C# ↔︎ Python complète) est périssable : les API des PPL bougent à chaque release mineure, et un mapping non re-vérifié est un poison (un lecteur qui l’utiliserait sans le re-tester reproduirait du faux).
C’est pourquoi la table d’API détaillée n’est pas reproduite ici. Pour tout portage concret, re-dériver contre la version actuelle de la bibliothèque cible (PyMC v5+, NumPyro, pgmpy, hmmlearn).
Contexte
Le dossier MyIA.AI.Notebooks/Probas/ contient deux séries parallèles :
- Infer.NET (C# .NET Interactive) — notebooks
Infer-1..19-*.ipynb, série canonique pour le contenu probabiliste. - PyMC (Python) — notebooks
PyMC-1..19-*.ipynb, portage en cours depuis 2024.
L’objectif du portage (intent original, 2024) : rendre la série accessible aux profils Python sans imposer le runtime .NET. Le portage n’est pas une refonte : la couverture thématique doit rester équivalente (mêmes concepts, mêmes exercices, mêmes sorties). Le lecteur doit pouvoir passer d’un Infer-X à un PyMC-X et trouver les mêmes notions.
Recommandation de bibliothèques
| Bibliothèque | Usage | Justification |
|---|---|---|
| PyMC v5+ | Bibliothèque principale pour ~85% du portage | Active, samplers NUTS robustes, JAX backend optionnel pour la perf, doc exhaustive |
| NumPyro | LDA (topic models), HMM, modèles à grandes dimensions | Backend JAX, très performant sur GPU, primitives HMM/LDS natives |
| pgmpy | Réseaux bayésiens structurés, inference exacte | API plus proche d’Infer.NET Variable.BayesianNetwork que PyMC |
| hmmlearn | Modèles de Markov cachés simples | API légère et lisible, complémentaire de NumPyro |
| Pyro | Précédent pour RSA (sémantique hyperbole) | Pré-installé sur la machine, déjà utilisé par Pyro_RSA_Hyperbole.ipynb |
NumPyro n’est PAS un remplacement universel de PyMC : sur les modèles où PyMC excelle (factor graphs, modèle hiérarchique standard, classification), NumPyro n’apporte rien. Inversement, PyMC est mal adapté pour les modèles où NumPyro est conçu (LDA, HMM de grande taille). Le plan détaillé (daté) suggérait de tout basculer vers PyMC ; ce n’est PAS la position actuelle : on choisit la bibliothèque la mieux adaptée au concept, pas une bibliothèque par défaut.
Périmètre du portage (20 notebooks, 6 phases)
| # | Notebook | Concept dominant | Bibliothèque recommandée | Statut sur main (2026-08-07) |
|---|---|---|---|---|
| 1 | Setup | Environnement + sanity checks | PyMC | Absorbé (PyMC-01-Setup.ipynb) |
| 2 | Gaussian Mixtures | Modèles de mélange | PyMC | Absorbé (PyMC-02-Gaussian-Mixtures.ipynb) |
| 3 | Factor Graphs | Message passing, inférence exacte | PyMC | Absorbé (PyMC-03-Factor-Graphs.ipynb) |
| 4 | Bayesian Networks | DAG, conditional probability | pgmpy | Absorbé (PyMC-04-Bayesian-Networks.ipynb, pgmpy corespondance) |
| 5 | Causal Inference | do-calculus, contrefactuels | PyMC + DoWhy | Absorbé (PyMC-05-Causal-Inference.ipynb) |
| 6 | Debugging | Diagnostic des chaînes MCMC | PyMC | Absorbé (PyMC-02b-Debugging-Python.ipynb, ex-06) |
| 7 | Skills / IRT | Item Response Theory | PyMC | Absorbé (PyMC-07-Skills-IRT.ipynb) |
| 8 | TrueSkill | Matchmaking, ratings | PyMC | Absorbé (PyMC-08-TrueSkill.ipynb) |
| 9 | Classification | Modèles discriminatifs | PyMC | Absorbé (PyMC-09-Classification.ipynb) |
| 10 | Model Selection | WAIC, LOO, comparaison | PyMC (ArviZ) | Absorbé (PyMC-10-Model-Selection.ipynb) |
| 11 | Topic Models (LDA) | Latent Dirichlet Allocation | NumPyro | Absorbé (PyMC-11-Topic-Models.ipynb) |
| 12 | Modèles Hiérarchiques | Partial pooling | PyMC | Absorbé (PyMC-12-Modeles-Hierarchiques.ipynb) |
| 13 | Crowdsourcing | Worker reliability, Dawid-Skene | PyMC | Absorbé (PyMC-13-Crowdsourcing.ipynb) |
| 14 | Sequences (HMM) | Hidden Markov Models | NumPyro ou hmmlearn | Absorbé (PyMC-14-Sequences.ipynb) |
| 15 | Recommenders | Collaborative filtering | PyMC | Absorbé (PyMC-15-Recommenders.ipynb) |
| 16 | Sparse Gaussian Process | Kernel sparse, inducing points | PyMC | Absorbé (PyMC-16-Sparse-Gaussian-Process.ipynb) |
| 17 | Kalman Filter | Filtre de Kalman, état-espace | PyMC | Absorbé (PyMC-17-Kalman-Filter.ipynb) |
| 18 | Change Point Detection | Détection de ruptures | PyMC | Absorbé (PyMC-18-Change-Point.ipynb) |
| 19 | Survival Analysis | Modèles de survie, censures | PyMC (lifelines) | Absorbé (PyMC-19-Survival-Analysis.ipynb) |
| 20 | Decision Theory (track séparé) | Utility, value of information | PyMC | Absorbé (DecisionTheory/DecPyMC/DecPyMC-1..7.ipynb) |
Total : 20 notebooks PyMC + 7 notebooks DecPyMC + 1 notebook Pyro_RSA = 28 notebooks Python trackés, soit largement plus que les 20 initialement planifiés — le périmètre a été étendu (track Decision Theory) et plusieurs notebooks ont été dédoublés.
Estimation d’effort (référence, datée 2026-05-11)
Le plan original estimait 77 heures réparties sur 6 phases (Setup → Bayesian Networks & Gaussian Mixtures → Models → NumPyro → ArviZ → Finalisation). Cette estimation est datée et n’est PAS re-validée ici. Le périmètre a été absorbé sur main sans suivi rigoureux des heures, donc cette borne est indicative, non auditée.
Si un nouveau portage équivalent était à planifier aujourd’hui, l’estimer à partir du contenu actuel des notebooks Infer-X-*.ipynb (qui restent la source canonique en .NET), pas à partir de cette table.
Convention de nommage
| Cible | Pattern | Exemple |
|---|---|---|
| Portage direct d’un notebook Infer | PyMC-{N}-{Title}.ipynb |
PyMC-02-Gaussian-Mixtures.ipynb |
| Track Decision Theory | DecPyMC-{N}-{Title}.ipynb |
DecPyMC-1-Utility-Foundations.ipynb |
| Numéro non-Infer | Préfixe thématique | Pyro_RSA_Hyperbole.ipynb |
Nommage par concept, pas par source : un PyMC-12-Modeles-Hierarchiques.ipynb est rangé par le concept qu’il couvre (modèles hiérarchiques), pas par le numéro du notebook Infer correspondant.
Dépendances (borne haute indicative)
Le plan suggérait requirements-python-port.txt avec un environnement conda. La borne haute indicative :
- Python 3.10+
pymc>=5.0(ArviZ, NumPyro, JAX optionnel)pgmpy>=0.1.20hmmlearn>=0.3pyro-ppl>=1.9lifelines>=0.27(survival analysis)dowhy>=0.11(causal inference, optionnel)matplotlib>=3.7,seaborn>=0.12
Ces dépendances ne sont pas figées : les notebooks trackés utilisent probablement un sous-ensemble, et des versions plus récentes peuvent avoir été adoptées localement. Vérifier contre l’environnement réel (pip freeze) avant ajout.
Mapping d’API = À RE-DÉRIVER (HARD)
NE PAS reproduire ici le mapping d’API détaillé de PORT_PYTHON_PLAN.md. Pour les raisons suivantes :
- API des PPL bougent vite : PyMC v5 a changé plusieurs signatures depuis 2026-05-11 ; pgmpy et NumPyro idem. Un mapping daté est un piège.
- Document poison : un lecteur qui copie-colle un mapping non re-vérifié produit du code qui ne tourne pas, et perd plus de temps à débugger que s’il avait lu la doc officielle.
- Source canonique existe :
https://www.pymc.io/projects/docs/en/stable/api.html,https://num.pyro.org/en/stable/,https://pgmpy.org/. Pour tout portage, **lire la doc cible en parallèle de l’Infer-X-*.ipynb** et traduire concept par concept.
Si quelqu’un veut malgré tout porter ce mapping (par exemple pour un sprint de reprise rapide) : le re-dériver dans une PR dédiée docs(probas,#X): add API mapping reference v<date>, jamais dans ce fichier. Ce fichier-ci porte le périmètre intentionnel, pas l’implémentation.
Voir aussi
- #9911 — issue qualification (c.1283), contributeur au seed EPIC #9535
- #9535 — EPIC parent « Nettoyage & rangement du dépôt »
- #297 — issue cible exemple, CLOSED 2026-05-02 (work absorbé)
- #9914 — PR d’archive c.1284 (
feature/c1284-9535-port-py-plan-archive) qui a suppriméPORT_PYTHON_PLAN.md+PORT_PYTHON_PLAN.en.md - #1650 — EPIC traduction multilingue (interdit de traduire des fichiers transitoires)
MyIA.AI.Notebooks/Probas/DecisionTheory/DecPyMC/DecPyMC-1..7.ipynb— track Decision Theory en PyMCMyIA.AI.Notebooks/Probas/Applications/Pyro_RSA_Hyperbole.ipynb— précédent Pyrodocs/reference/mbml-source-attribution.md— modèle de référence suivi pour ce document (note « ce qui est pérenne et ce qui ne l’est pas »)
Historique
- 2026-08-07 — Création (c.1285), portée depuis
PORT_PYTHON_PLAN.md(sha48428c7e3d2fd20c682a2f4e49cec4b9894f4f30) suite à la note de préservation user 2026-08-07T18:56:55Z sur #9911 (comment #5220921176) : « la suppression sans que la substance ait été portée ailleurs d’abord » est l’interdit, pas la suppression elle-même.