diff --git a/MyIA.AI.Notebooks/Search/Applications/Hybrid/App-18b-HyperparameterTuning-CSharp.ipynb b/MyIA.AI.Notebooks/Search/Applications/Hybrid/App-18b-HyperparameterTuning-CSharp.ipynb index d1a40d93d1..3c2d68c84b 100644 --- a/MyIA.AI.Notebooks/Search/Applications/Hybrid/App-18b-HyperparameterTuning-CSharp.ipynb +++ b/MyIA.AI.Notebooks/Search/Applications/Hybrid/App-18b-HyperparameterTuning-CSharp.ipynb @@ -62,7 +62,6 @@ " The below script needs to be able to find the current output cell; this is an easy method to get it.\r\n", " \r\n", " \r\n", @@ -243,6 +234,14 @@ "Show($\"Plage X1 : [{X.Select(p => p[0]).Min():F2}, {X.Select(p => p[0]).Max():F2}] X2 : [{X.Select(p => p[1]).Min():F2}, {X.Select(p => p[1]).Max():F2}]\");\n" ] }, + { + "cell_type": "markdown", + "id": "lecture-c3b86b54", + "metadata": {}, + "source": [ + "**Lecture ancrée** : Le jeu de données synthétique compte 200 points, 2 classes équilibrées (100 + 100) et 2 features, avec X1 dans [-2,35, 6,09] et X2 dans [-1,05, 6,66] — le support de toutes les expériences suivantes." + ] + }, { "cell_type": "markdown", "id": "881c2ccb", @@ -349,6 +348,13 @@ "Show($\"Objectif [k~1, p=1 Manhattan, blend=0.5] = {FI(Objective(new[] { 0.00, 0.00, 0.5 }))}\");\n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Lecture ancrée** : Les tests de sanité de l’objectif CV 5-fold donnent 0.7150 (k~11, Euclidien, blend=0), 0.7200 (blend=1) et 0.6600 (k~1, Manhattan, blend=0.5) — le blend distance-weighting apporte +0.005, un k trop petit dégrade. La précision CV s’étale ainsi de 0.66 à 0.72 sur ces trois points de contrôle de l’espace (k, distance, blend)." + ] + }, { "cell_type": "markdown", "id": "7d5fd4d4", @@ -413,6 +419,13 @@ "Show($\" -> p = [{FI(gridBest[0], \"F3\")}, {FI(gridBest[1], \"F3\")}, {FI(gridBest[2], \"F3\")}]\");\n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Lecture ancrée** : Grid Search énumère les 5³ = 125 combinaisons et trouve 0.7650 en p = [1.000, 0.000, 0.000] — un coin du cube de recherche, typique d’une grille régulière. Ce 0.7650 sert de plancher : le tableau final affiche tous les gaps relatifs à Grid." + ] + }, { "cell_type": "markdown", "id": "b3d053df", @@ -476,6 +489,13 @@ "Show($\" -> p = [{FI(randBest[0], \"F3\")}, {FI(randBest[1], \"F3\")}, {FI(randBest[2], \"F3\")}]\");\n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Lecture ancrée** : Random Search atteint 0.7600 en 60 évaluations seulement (moitié moins que Grid) avec p = [0.964, 0.023, 0.215] — l’échantillonnage uniforme couvre mieux les dimensions peu sensibles." + ] + }, { "cell_type": "markdown", "id": "ed2df85e", @@ -653,6 +673,13 @@ "Show($\" -> p = [{FI(bayesBest[0], \"F3\")}, {FI(bayesBest[1], \"F3\")}, {FI(bayesBest[2], \"F3\")}]\");\n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Lecture ancrée** : Bayesian Optimization (GP + Expected Improvement) converge vers 0.7700 en 5+25 = 30 évaluations, p = [0.692, 0.617, 0.719] : 5 points d’initialisation aléatoire puis 25 itérations GP+EI — moins de la moitié du budget de Grid pour un meilleur optimum." + ] + }, { "cell_type": "markdown", "id": "3ee3bbcc", @@ -776,6 +803,13 @@ "Show($\" -> p = [{FI(gaBest[0], \"F3\")}, {FI(gaBest[1], \"F3\")}, {FI(gaBest[2], \"F3\")}]\");\n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Lecture ancrée** : L’Algorithme Génétique atteint 0.7750 en 71 évaluations, p = [0.684, 0.854, 0.449] — le meilleur résultat from-scratch, à égalité avec PSO, obtenu par sélection, croisement et mutation des configurations les plus performantes." + ] + }, { "cell_type": "markdown", "id": "b287c9fa", @@ -901,6 +935,13 @@ "Show($\" -> p = [{FI(psoBest[0], \"F3\")}, {FI(psoBest[1], \"F3\")}, {FI(psoBest[2], \"F3\")}]\");\n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Lecture ancrée** : PSO atteint lui aussi 0.7750 en 72 évaluations, p = [0.717, 0.926, 0.491] — deux métaheuristiques différentes, deux configurations, le même optimum." + ] + }, { "cell_type": "markdown", "id": "bed2b341", @@ -1089,6 +1130,13 @@ "Show($\" (Grid = plancher de reference, best = {FI(gridVal)})\");\n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Lecture ancrée** : Sparklines et tableau résument la hiérarchie : GA et PSO 0.7750 (+0.0100 vs Grid), Bayes 0.7700 (+0.0050 en 30 evals seulement), Grid 0.7650 (plancher), Random 0.7600 (-0.0050) — les méthodes informées dominent à budget réduit. Les sparklines racontent la convergence : GA monte dès la première génération puis stagne, Bayes reste sur un long plateau d’initialisation avant de décoller, Grid ne progresse que par marches de la grille." + ] + }, { "cell_type": "markdown", "id": "35b62223", @@ -1275,6 +1323,13 @@ "Show(\"Regions @ = haute precision (objectif maximise). Les methodes adapatives (Bayes/GA/PSO) y convergent plus vite que Grid.\");\n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Lecture ancrée** : La carte de chaleur (tranche weightBlend=0.72, k vertical 1->50 × distPow 1->4) révèle les régions @ de haute précision, échelle 0.6500 (vide) -> 0.7600 (@) — un paysage multimodal : les symboles s’organisent en bandes par ligne de k, pas en simple gradient, d’où l’intérêt des méthodes adaptatives (Bayes/GA/PSO) sur une grille régulière." + ] + }, { "cell_type": "markdown", "id": "t2m1", @@ -1453,6 +1508,13 @@ " Show($\" {r.TrainerName} : {FI(r.ValidationMetrics.Accuracy)}\");" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Lecture ancrée** : ML.NET AutoML, avec un budget de 30 secondes, effectue 405 essais (meilleur entraîneur : SdcaLogisticRegressionBinary) sur le split déterministe seed 424242 (165 train / 35 test) : accuracy test 0.7714, AUC 0.7467. Le top-3 des entraîneurs est saturé par SdcaLogisticRegressionBinary (0.7714 aux trois rangs)." + ] + }, { "cell_type": "code", "execution_count": 14, @@ -1549,6 +1611,14 @@ "Show($\" => {winner} devant sur ce split (ecart {FI(Math.Abs(binMetric.Accuracy - fsTestAcc), \"F4\")}).\");" ] }, + { + "cell_type": "markdown", + "id": "lecture-t2-exp", + "metadata": {}, + "source": [ + "**Lecture ancrée** : Sur le même split de test (35 pts), le k-NN from-scratch config Grid (k=49, distPow=1.000, blend=0.000) rend 0.7143 contre 0.7714 pour AutoML (écart 0.0571) — mais la CV 5-fold sur tout le jeu rappelle que le from-scratch atteint 0.7750 : l’écart mesure aussi le split, pas seulement les méthodes. Sur 35 points de test, un écart de 0.0571 représente deux points mal classés de différence." + ] + }, { "cell_type": "markdown", "id": "t2m2", @@ -1645,4 +1715,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/MyIA.AI.Notebooks/Search/Part2-CSP/CSP-8-Temporal.ipynb b/MyIA.AI.Notebooks/Search/Part2-CSP/CSP-8-Temporal.ipynb index 44e714cad7..2e3236f60e 100644 --- a/MyIA.AI.Notebooks/Search/Part2-CSP/CSP-8-Temporal.ipynb +++ b/MyIA.AI.Notebooks/Search/Part2-CSP/CSP-8-Temporal.ipynb @@ -92,6 +92,14 @@ "print(\"Dependances pretes.\")" ] }, + { + "cell_type": "markdown", + "id": "lecture-setup-temporal", + "metadata": {}, + "source": [ + "**Lecture ancrée** : Les dépendances requises (matplotlib, numpy) sont installées et validées — « Dependances pretes. » ouvre le notebook et prélude à toutes les visualisations (relations d’Allen, timelines STP, créneaux de réunion)." + ] + }, { "cell_type": "markdown", "id": "section-1-intro", @@ -260,6 +268,14 @@ "print(f\"Exemple : converse(BEFORE) = {get_converse(AllenRelation.BEFORE).value}\")" ] }, + { + "cell_type": "markdown", + "id": "lecture-allen-relations", + "metadata": {}, + "source": [ + "**Lecture ancrée** : Les 13 relations atomiques d’Allen sont définies avec leurs converses (l’output donne l’exemple converse(BEFORE) = AFTER) et un symbole court chacune (b pour BEFORE) — la brique élémentaire du raisonnement sur les intervalles, que la suite compose et visualise." + ] + }, { "cell_type": "markdown", "id": "009fdad6", @@ -369,6 +385,14 @@ "plot_allen_relations()" ] }, + { + "cell_type": "markdown", + "id": "lecture-allen-visualization", + "metadata": {}, + "source": [ + "**Lecture ancrée** : La figure 4×4 (16 sous-graphiques) dessine chacune des 13 relations — les cases restantes vides, une relation atomique par diagramme — chaque diagramme montre la paire de segments A et B dans la configuration de la relation." + ] + }, { "cell_type": "markdown", "id": "djqnxo5337", @@ -540,6 +564,14 @@ "print(\"Classe SimpleTemporalProblem definie.\")" ] }, + { + "cell_type": "markdown", + "id": "lecture-stp-class", + "metadata": {}, + "source": [ + "**Lecture ancrée** : La classe SimpleTemporalProblem est définie : contraintes binaires t_j - t_i dans [lb, ub], résolues par Floyd-Warshall (tous les plus courts chemins du graphe de contraintes). La fermeture transitive donne les bornes les plus lâches entre toute paire d’événements — le graphe est consistant si et seulement si aucune diagonale ne devient négative." + ] + }, { "cell_type": "markdown", "id": "ff62427b", @@ -627,6 +659,14 @@ " print(f\" {point} : {time:.1f}h\")" ] }, + { + "cell_type": "markdown", + "id": "lecture-stp-example", + "metadata": {}, + "source": [ + "**Lecture ancrée** : Le STP « Planification de Journée » est consistant et rend la solution Consistant : True, avec la solution T0 = 0.0h (référence début de journée, t=0), T1 = 9.0h, T2 = 11.0h, T3 = 12.5h, T4 = 13.0h — une affectation parmi l’infinité de solutions du d-graph, la première rendue par le solveur." + ] + }, { "cell_type": "markdown", "id": "769amh53sz3", @@ -725,6 +765,14 @@ " plot_stp_solution(solution)" ] }, + { + "cell_type": "markdown", + "id": "lecture-stp-visualization", + "metadata": {}, + "source": [ + "**Lecture ancrée** : La timeline place les cinq événements (T0 à T4) sur l’axe des heures, arcs pondérés par les bornes des contraintes, l’ensemble s’étalant de 0h à 13h — la lecture visuelle du graphe résolu par Floyd-Warshall." + ] + }, { "cell_type": "markdown", "id": "eia6je5saga", @@ -887,6 +935,14 @@ "print(\"TCSP defini. Note : resolution complete necessiterait plus de contraintes.\")" ] }, + { + "cell_type": "markdown", + "id": "lecture-tcsp-example", + "metadata": {}, + "source": [ + "**Lecture ancrée** : Le TCSP est défini (contraintes disjonctives : union d’intervalles), et l’output le dit honnêtement : « resolution complete necessiterait plus de contraintes » — pas de solution calculée ici, seulement la structure : la classe TCSPConstraint étend la contrainte binaire en union d’intervalles disjoints (t_j - t_i dans plusieurs plages possibles)." + ] + }, { "cell_type": "markdown", "id": "section-5-application", @@ -1012,6 +1068,14 @@ " print(f\" {start:.1f}h - {end:.1f}h\")" ] }, + { + "cell_type": "markdown", + "id": "lecture-meeting-planner", + "metadata": {}, + "source": [ + "**Lecture ancrée** : Les disponibilités se croisent en un unique créneau : 15.0h–16.0h pour une réunion d’1h — Alice [(9,12),(14,17)], Bob [(10,11),(13,16)], Charlie [(9,10),(11,14),(15,18)] : seul le recoupement des plages d’après-midi laisse une intersection d’une heure complète." + ] + }, { "cell_type": "markdown", "id": "0432912b", @@ -1101,6 +1165,14 @@ "plt.show()" ] }, + { + "cell_type": "markdown", + "id": "lecture-meeting-visualization", + "metadata": {}, + "source": [ + "**Lecture ancrée** : Le diagramme superpose les fenêtres de disponibilité par participant et marque le créneau commun 15h–16h, seules plages entières superposées des trois participants — la projection visuelle de l’intersection calculée." + ] + }, { "cell_type": "markdown", "id": "4okf88refvs", @@ -1335,6 +1407,14 @@ " print(f\" {r1.name:12s} o {r2.name:12s} = {fmt(FULL_COMPOSITION[(r1, r2)])}\")\n" ] }, + { + "cell_type": "markdown", + "id": "lecture-exercise-template", + "metadata": {}, + "source": [ + "**Lecture ancrée** : L’énumération des endpoints reproduit 3/5 entrées manuelles de la table de composition (divergences sur les compositions avec OVERLAPS : {b} au lieu de {b, m, o}) ; la table générée compte 169 entrées (13×13), dont 72 disjonctions, et l’identité R o EQUALS = {R} passe 13/13. Échantillon imprimé : BEFORE o BEFORE = {b}, OVERLAPS o DURING = {d, o, s}, DURING o DURING = {d}, EQUALS o OVERLAPS = {o}." + ] + }, { "cell_type": "markdown", "id": "2bb9a999", @@ -1509,6 +1589,14 @@ "print(\"Le solveur detecte le cycle negatif dans la matrice Floyd-Warshall.\")\n" ] }, + { + "cell_type": "markdown", + "id": "lecture-df41fdf2", + "metadata": {}, + "source": [ + "**Lecture ancrée** : Avec deadline 12h, release 9h, durée 1-2h : consistant, meeting_start = 11.0h, meeting_end = 12.0h. Avec deadline 10h, release 9h, durée 3h : inconsistant — la durée de 3h ne tient pas entre release 9h et deadline 10h, et le solveur le démontre par le cycle négatif dans la matrice Floyd-Warshall." + ] + }, { "cell_type": "markdown", "id": "bfac4336", @@ -1746,6 +1834,14 @@ " print(f\" {name:10s} {s:5.2f}h -> {e:5.2f}h\")\n" ] }, + { + "cell_type": "markdown", + "id": "lecture-70eeb3d6", + "metadata": {}, + "source": [ + "**Lecture ancrée** : Le planning multi-réunions avec précédences rend Kickoff 10.00h->11.00h, Review 11.00h->11.50h, Design 14.00h->15.50h — chaque réunion respecte ses prédécesseurs (Review juste après Kickoff) et les fenêtres horaires (Design l’après-midi), via le solveur OR-Tools CP-SAT chargé dans la cellule." + ] + }, { "cell_type": "markdown", "id": "8c8d9ba8", @@ -1965,6 +2061,14 @@ "print(\"\\nLes deux approches sont consistentes avec les contraintes.\")\n" ] }, + { + "cell_type": "markdown", + "id": "lecture-1de2a8a2", + "metadata": {}, + "source": [ + "**Lecture ancrée** : CP-SAT et Floyd-Warshall rendent deux solutions distinctes mais toutes deux consistantes : T1 = 8.00h / T2 = 10.00h / T3 = 12.00h / T4 = 12.50h contre T1 = 9.00h / T2 = 11.00h / T3 = 12.50h / T4 = 13.00h, T0 = 0.00h dans les deux — le STP n’exige pas l’unicité, seulement la consistance : deux témoins distincts du même d-graph." + ] + }, { "cell_type": "markdown", "id": "ffb34f74",