\r\n",
+ "
\r\n",
" 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",
@@ -181,7 +190,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Repertoire de travail: Part2-CSP\r\n"
+ "Repertoire de travail: Part2-CSP\n"
]
}
],
@@ -217,16 +226,16 @@
"id": "e7c41269",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-31T19:43:30.538837Z",
- "iopub.status.busy": "2026-07-31T19:43:30.538435Z",
- "iopub.status.idle": "2026-07-31T19:43:33.856460Z",
- "shell.execute_reply": "2026-07-31T19:43:33.856260Z"
+ "iopub.execute_input": "2026-09-27T07:23:52.677442Z",
+ "iopub.status.busy": "2026-09-27T07:23:52.677137Z",
+ "iopub.status.idle": "2026-09-27T07:23:53.904798Z",
+ "shell.execute_reply": "2026-09-27T07:23:53.904531Z"
},
"papermill": {
- "duration": 3.324792,
- "end_time": "2026-07-31T19:43:33.856530",
+ "duration": 1.235637,
+ "end_time": "2026-09-27T07:23:53.904928+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:30.531738",
+ "start_time": "2026-09-27T07:23:52.669291+00:00",
"status": "completed"
},
"tags": []
@@ -245,7 +254,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "IKVM 8.15.0 pret (home=ikvm-home-8.15.0-win-x64, tzdb=True) - Choco-solver charge\r\n"
+ "IKVM 8.15.0 pret (home=ikvm-home-8.15.0-linux-x64, tzdb=True) - Choco-solver charge\n"
]
}
],
@@ -257,15 +266,19 @@
"// qui epinglaient 8.0.0.5), ce qui laisse le kernel resoudre une version compatible.\n",
"// 2. \"Could not locate ikvm home path\" : IKVM 8.15 ne consulte PAS la variable d env IKVM_HOME ;\n",
"// il lit AppContext[\"IKVM.Home\"]. On assemble le home complet (fusion de l image arch-independante\n",
- "// any/any -- classes + tzdb.dat -- et de l image native win-x64) puis on le declare via AppContext,\n",
+ "// any/any -- classes + tzdb.dat -- et de l image native de la plateforme) puis on le declare via AppContext,\n",
"// AVANT tout premier appel Java (l init de la JVM se declenche au premier type java.*, en cellule suivante).\n",
"#r \"nuget: IKVM, 8.15.0\"\n",
"#r \"nuget: IKVM.Image, 8.15.0\"\n",
- "#r \"nuget: IKVM.Image.runtime.win-x64, 8.15.0\"\n",
"\n",
"using System.IO;\n",
+ "using System.Runtime.InteropServices;\n",
"\n",
- "string ikvmVer = \"8.15.0\", ikvmRid = \"win-x64\";\n",
+ "// RID de la machine courante (win-x64, linux-x64, osx-arm64, ...) : le paquet IKVM.Image\n",
+ "// tire deja l'image native de chaque plateforme, il suffit de choisir la bonne.\n",
+ "string ikvmOs = OperatingSystem.IsWindows() ? \"win\" : OperatingSystem.IsMacOS() ? \"osx\" : \"linux\";\n",
+ "string ikvmRid = ikvmOs + \"-\" + RuntimeInformation.ProcessArchitecture.ToString().ToLowerInvariant();\n",
+ "string ikvmVer = \"8.15.0\";\n",
"string nugetRoot = Environment.GetEnvironmentVariable(\"NUGET_PACKAGES\")\n",
" ?? Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), \".nuget\", \"packages\");\n",
"string ikvmBaseAny = Path.Combine(nugetRoot, \"ikvm.image\", ikvmVer, \"ikvm\", \"any\", \"any\");\n",
@@ -288,7 +301,7 @@
"{\n",
" Directory.CreateDirectory(ikvmHome);\n",
" IkvmCopyMerge(ikvmBaseAny, ikvmHome); // classes Java + tzdb.dat (arch-independant)\n",
- " IkvmCopyMerge(ikvmArchDir, ikvmHome); // bibliotheques natives win-x64 (bin/ + lib/)\n",
+ " IkvmCopyMerge(ikvmArchDir, ikvmHome); // bibliotheques natives de la plateforme (bin/ + lib/)\n",
"}\n",
"AppContext.SetData(\"IKVM.Home\", ikvmHome);\n",
"\n",
@@ -302,16 +315,16 @@
"id": "e6295c97",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-31T19:43:33.867038Z",
- "iopub.status.busy": "2026-07-31T19:43:33.866868Z",
- "iopub.status.idle": "2026-07-31T19:43:34.506235Z",
- "shell.execute_reply": "2026-07-31T19:43:34.505845Z"
+ "iopub.execute_input": "2026-09-27T07:23:53.920029Z",
+ "iopub.status.busy": "2026-09-27T07:23:53.919767Z",
+ "iopub.status.idle": "2026-09-27T07:23:54.163530Z",
+ "shell.execute_reply": "2026-09-27T07:23:54.163156Z"
},
"papermill": {
- "duration": 0.645709,
- "end_time": "2026-07-31T19:43:34.506384",
+ "duration": 0.251704,
+ "end_time": "2026-09-27T07:23:54.163651+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:33.860675",
+ "start_time": "2026-09-27T07:23:53.911947+00:00",
"status": "completed"
},
"tags": []
@@ -321,7 +334,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Choco-solver via IKVM 8.15.0 - Pret pour propagation et consistance\r\n"
+ "Choco-solver via IKVM 8.15.0 - Pret pour propagation et consistance\n"
]
}
],
@@ -345,10 +358,10 @@
"id": "2f59658f",
"metadata": {
"papermill": {
- "duration": 0.003962,
- "end_time": "2026-07-31T19:43:34.514546",
+ "duration": 0.005273,
+ "end_time": "2026-09-27T07:23:54.175074+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:34.510584",
+ "start_time": "2026-09-27T07:23:54.169801+00:00",
"status": "completed"
},
"tags": []
@@ -374,10 +387,10 @@
"id": "75c9ebf3",
"metadata": {
"papermill": {
- "duration": 0.005036,
- "end_time": "2026-07-31T19:43:34.523939",
+ "duration": 0.005074,
+ "end_time": "2026-09-27T07:23:54.185558+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:34.518903",
+ "start_time": "2026-09-27T07:23:54.180484+00:00",
"status": "completed"
},
"tags": []
@@ -394,16 +407,16 @@
"id": "640c0c49",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-31T19:43:34.537358Z",
- "iopub.status.busy": "2026-07-31T19:43:34.537166Z",
- "iopub.status.idle": "2026-07-31T19:43:34.855518Z",
- "shell.execute_reply": "2026-07-31T19:43:34.855398Z"
+ "iopub.execute_input": "2026-09-27T07:23:54.198478Z",
+ "iopub.status.busy": "2026-09-27T07:23:54.198203Z",
+ "iopub.status.idle": "2026-09-27T07:23:54.744434Z",
+ "shell.execute_reply": "2026-09-27T07:23:54.744159Z"
},
"papermill": {
- "duration": 0.326073,
- "end_time": "2026-07-31T19:43:34.855580",
+ "duration": 0.553846,
+ "end_time": "2026-09-27T07:23:54.744539+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:34.529507",
+ "start_time": "2026-09-27T07:23:54.190693+00:00",
"status": "completed"
},
"tags": []
@@ -413,7 +426,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Classes CSP et BinaryConstraint definies (C#/.NET)\r\n"
+ "Classes CSP et BinaryConstraint definies (C#/.NET)\n"
]
}
],
@@ -482,10 +495,10 @@
"id": "19676238",
"metadata": {
"papermill": {
- "duration": 0.004152,
- "end_time": "2026-07-31T19:43:34.864194",
+ "duration": 0.005554,
+ "end_time": "2026-09-27T07:23:54.756130+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:34.860042",
+ "start_time": "2026-09-27T07:23:54.750576+00:00",
"status": "completed"
},
"tags": []
@@ -502,16 +515,16 @@
"id": "f47c5c6a",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-31T19:43:34.872646Z",
- "iopub.status.busy": "2026-07-31T19:43:34.872470Z",
- "iopub.status.idle": "2026-07-31T19:43:35.039639Z",
- "shell.execute_reply": "2026-07-31T19:43:35.039466Z"
+ "iopub.execute_input": "2026-09-27T07:23:54.769024Z",
+ "iopub.status.busy": "2026-09-27T07:23:54.768736Z",
+ "iopub.status.idle": "2026-09-27T07:23:55.121302Z",
+ "shell.execute_reply": "2026-09-27T07:23:55.120846Z"
},
"papermill": {
- "duration": 0.171739,
- "end_time": "2026-07-31T19:43:35.039718",
+ "duration": 0.359984,
+ "end_time": "2026-09-27T07:23:55.121470+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:34.867979",
+ "start_time": "2026-09-27T07:23:54.761486+00:00",
"status": "completed"
},
"tags": []
@@ -521,14 +534,14 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Australie : CSP(7 variables, 9 contraintes binaires)\r\n"
+ "Australie : CSP(7 variables, 9 contraintes binaires)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "N-Reines (8x8) : CSP(8 variables, 28 contraintes binaires)\r\n"
+ "N-Reines (8x8) : CSP(8 variables, 28 contraintes binaires)\n"
]
}
],
@@ -609,10 +622,10 @@
"id": "9adb6bad",
"metadata": {
"papermill": {
- "duration": 0.003814,
- "end_time": "2026-07-31T19:43:35.047969",
+ "duration": 0.006941,
+ "end_time": "2026-09-27T07:23:55.136795+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:35.044155",
+ "start_time": "2026-09-27T07:23:55.129854+00:00",
"status": "completed"
},
"tags": []
@@ -629,16 +642,16 @@
"id": "a4dc9dbb",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-31T19:43:35.056611Z",
- "iopub.status.busy": "2026-07-31T19:43:35.056436Z",
- "iopub.status.idle": "2026-07-31T19:43:35.125229Z",
- "shell.execute_reply": "2026-07-31T19:43:35.125104Z"
+ "iopub.execute_input": "2026-09-27T07:23:55.155290Z",
+ "iopub.status.busy": "2026-09-27T07:23:55.154847Z",
+ "iopub.status.idle": "2026-09-27T07:23:55.287713Z",
+ "shell.execute_reply": "2026-09-27T07:23:55.287342Z"
},
"papermill": {
- "duration": 0.073372,
- "end_time": "2026-07-31T19:43:35.125291",
+ "duration": 0.14436,
+ "end_time": "2026-09-27T07:23:55.287823+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:35.051919",
+ "start_time": "2026-09-27T07:23:55.143463+00:00",
"status": "completed"
},
"tags": []
@@ -648,28 +661,28 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Garde diagonale (#7721) :\r\n"
+ "Garde diagonale (#7721) :\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " IsConsistent({Q0:0, Q1:1}) = False (attendu : False, attaque en diagonale)\r\n"
+ " IsConsistent({Q0:0, Q1:1}) = False (attendu : False, attaque en diagonale)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " IsConsistent({Q0:0, Q1:4}) = True (attendu : True, pas d'attaque)\r\n"
+ " IsConsistent({Q0:0, Q1:4}) = True (attendu : True, pas d'attaque)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " -> OK : contrainte diagonale active (Bug 1 maitrise)\r\n"
+ " -> OK : contrainte diagonale active (Bug 1 maitrise)\n"
]
}
],
@@ -694,10 +707,10 @@
"id": "c5ec7cb3",
"metadata": {
"papermill": {
- "duration": 0.003936,
- "end_time": "2026-07-31T19:43:35.133451",
+ "duration": 0.005774,
+ "end_time": "2026-09-27T07:23:55.300313+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:35.129515",
+ "start_time": "2026-09-27T07:23:55.294539+00:00",
"status": "completed"
},
"tags": []
@@ -714,16 +727,16 @@
"id": "5ad5527d",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-31T19:43:35.142272Z",
- "iopub.status.busy": "2026-07-31T19:43:35.142114Z",
- "iopub.status.idle": "2026-07-31T19:43:35.222899Z",
- "shell.execute_reply": "2026-07-31T19:43:35.222565Z"
+ "iopub.execute_input": "2026-09-27T07:23:55.313755Z",
+ "iopub.status.busy": "2026-09-27T07:23:55.313535Z",
+ "iopub.status.idle": "2026-09-27T07:23:55.425043Z",
+ "shell.execute_reply": "2026-09-27T07:23:55.424612Z"
},
"papermill": {
- "duration": 0.085685,
- "end_time": "2026-07-31T19:43:35.223033",
+ "duration": 0.119124,
+ "end_time": "2026-09-27T07:23:55.425219+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:35.137348",
+ "start_time": "2026-09-27T07:23:55.306095+00:00",
"status": "completed"
},
"tags": []
@@ -733,56 +746,56 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Domaines apres node consistency (WA != Rouge) :\r\n"
+ "Domaines apres node consistency (WA != Rouge) :\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " WA : [Vert, Bleu]\r\n"
+ " WA : [Vert, Bleu]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " NT : [Rouge, Vert, Bleu]\r\n"
+ " NT : [Rouge, Vert, Bleu]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " SA : [Rouge, Vert, Bleu]\r\n"
+ " SA : [Rouge, Vert, Bleu]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " Q : [Rouge, Vert, Bleu]\r\n"
+ " Q : [Rouge, Vert, Bleu]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " NSW : [Rouge, Vert, Bleu]\r\n"
+ " NSW : [Rouge, Vert, Bleu]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " V : [Rouge, Vert, Bleu]\r\n"
+ " V : [Rouge, Vert, Bleu]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " T : [Rouge, Vert, Bleu]\r\n"
+ " T : [Rouge, Vert, Bleu]\n"
]
}
],
@@ -819,10 +832,10 @@
"id": "f6d09070",
"metadata": {
"papermill": {
- "duration": 0.004062,
- "end_time": "2026-07-31T19:43:35.234693",
+ "duration": 0.011106,
+ "end_time": "2026-09-27T07:23:55.448606+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:35.230631",
+ "start_time": "2026-09-27T07:23:55.437500+00:00",
"status": "completed"
},
"tags": []
@@ -838,10 +851,10 @@
"id": "51c9d13f",
"metadata": {
"papermill": {
- "duration": 0.004195,
- "end_time": "2026-07-31T19:43:35.242942",
+ "duration": 0.010985,
+ "end_time": "2026-09-27T07:23:55.470926+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:35.238747",
+ "start_time": "2026-09-27T07:23:55.459941+00:00",
"status": "completed"
},
"tags": []
@@ -869,16 +882,16 @@
"id": "bf302925",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-31T19:43:35.252369Z",
- "iopub.status.busy": "2026-07-31T19:43:35.252207Z",
- "iopub.status.idle": "2026-07-31T19:43:35.340073Z",
- "shell.execute_reply": "2026-07-31T19:43:35.339946Z"
+ "iopub.execute_input": "2026-09-27T07:23:55.496126Z",
+ "iopub.status.busy": "2026-09-27T07:23:55.495690Z",
+ "iopub.status.idle": "2026-09-27T07:23:55.580562Z",
+ "shell.execute_reply": "2026-09-27T07:23:55.580314Z"
},
"papermill": {
- "duration": 0.092979,
- "end_time": "2026-07-31T19:43:35.340135",
+ "duration": 0.098402,
+ "end_time": "2026-09-27T07:23:55.580670+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:35.247156",
+ "start_time": "2026-09-27T07:23:55.482268+00:00",
"status": "completed"
},
"tags": []
@@ -888,7 +901,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Fonction Revise definie (operation de base d AC-3)\r\n"
+ "Fonction Revise definie (operation de base d AC-3)\n"
]
}
],
@@ -935,16 +948,16 @@
"id": "c543fba3",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-31T19:43:35.350095Z",
- "iopub.status.busy": "2026-07-31T19:43:35.349937Z",
- "iopub.status.idle": "2026-07-31T19:43:35.391933Z",
- "shell.execute_reply": "2026-07-31T19:43:35.391763Z"
+ "iopub.execute_input": "2026-09-27T07:23:55.596105Z",
+ "iopub.status.busy": "2026-09-27T07:23:55.595823Z",
+ "iopub.status.idle": "2026-09-27T07:23:55.655403Z",
+ "shell.execute_reply": "2026-09-27T07:23:55.655148Z"
},
"papermill": {
- "duration": 0.047375,
- "end_time": "2026-07-31T19:43:35.391998",
+ "duration": 0.068123,
+ "end_time": "2026-09-27T07:23:55.655539+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:35.344623",
+ "start_time": "2026-09-27T07:23:55.587416+00:00",
"status": "completed"
},
"tags": []
@@ -954,7 +967,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Fonction AC3 definie (Mackworth 1977)\r\n"
+ "Fonction AC3 definie (Mackworth 1977)\n"
]
}
],
@@ -992,10 +1005,10 @@
"id": "443ef982",
"metadata": {
"papermill": {
- "duration": 0.004091,
- "end_time": "2026-07-31T19:43:35.400366",
+ "duration": 0.005895,
+ "end_time": "2026-09-27T07:23:55.667905+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:35.396275",
+ "start_time": "2026-09-27T07:23:55.662010+00:00",
"status": "completed"
},
"tags": []
@@ -1010,16 +1023,16 @@
"id": "80aabb73",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-31T19:43:35.410761Z",
- "iopub.status.busy": "2026-07-31T19:43:35.410365Z",
- "iopub.status.idle": "2026-07-31T19:43:35.574968Z",
- "shell.execute_reply": "2026-07-31T19:43:35.574800Z"
+ "iopub.execute_input": "2026-09-27T07:23:55.682517Z",
+ "iopub.status.busy": "2026-09-27T07:23:55.682228Z",
+ "iopub.status.idle": "2026-09-27T07:23:55.780955Z",
+ "shell.execute_reply": "2026-09-27T07:23:55.780645Z"
},
"papermill": {
- "duration": 0.17024,
- "end_time": "2026-07-31T19:43:35.575040",
+ "duration": 0.106544,
+ "end_time": "2026-09-27T07:23:55.781153+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:35.404800",
+ "start_time": "2026-09-27T07:23:55.674609+00:00",
"status": "completed"
},
"tags": []
@@ -1029,133 +1042,133 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Domaines AVANT AC-3 :\r\n"
+ "Domaines AVANT AC-3 :\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " WA : 3 valeurs\r\n"
+ " WA : 3 valeurs\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " NT : 3 valeurs\r\n"
+ " NT : 3 valeurs\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " SA : 3 valeurs\r\n"
+ " SA : 3 valeurs\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " Q : 3 valeurs\r\n"
+ " Q : 3 valeurs\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " NSW : 3 valeurs\r\n"
+ " NSW : 3 valeurs\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " V : 3 valeurs\r\n"
+ " V : 3 valeurs\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " T : 3 valeurs\r\n"
+ " T : 3 valeurs\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "\r\n"
+ "\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Apres AC-3 : 0 revisions d arcs effectuees\r\n"
+ "Apres AC-3 : 0 revisions d arcs effectuees\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "\r\n"
+ "\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Domaines APRES AC-3 :\r\n"
+ "Domaines APRES AC-3 :\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " WA : 3 valeurs [Rouge, Vert, Bleu]\r\n"
+ " WA : 3 valeurs [Rouge, Vert, Bleu]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " NT : 3 valeurs [Rouge, Vert, Bleu]\r\n"
+ " NT : 3 valeurs [Rouge, Vert, Bleu]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " SA : 3 valeurs [Rouge, Vert, Bleu]\r\n"
+ " SA : 3 valeurs [Rouge, Vert, Bleu]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " Q : 3 valeurs [Rouge, Vert, Bleu]\r\n"
+ " Q : 3 valeurs [Rouge, Vert, Bleu]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " NSW : 3 valeurs [Rouge, Vert, Bleu]\r\n"
+ " NSW : 3 valeurs [Rouge, Vert, Bleu]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " V : 3 valeurs [Rouge, Vert, Bleu]\r\n"
+ " V : 3 valeurs [Rouge, Vert, Bleu]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " T : 3 valeurs [Rouge, Vert, Bleu]\r\n"
+ " T : 3 valeurs [Rouge, Vert, Bleu]\n"
]
}
],
@@ -1187,10 +1200,10 @@
"id": "d5ad161d",
"metadata": {
"papermill": {
- "duration": 0.006807,
- "end_time": "2026-07-31T19:43:35.590742",
+ "duration": 0.013093,
+ "end_time": "2026-09-27T07:23:55.807042+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:35.583935",
+ "start_time": "2026-09-27T07:23:55.793949+00:00",
"status": "completed"
},
"tags": []
@@ -1206,10 +1219,10 @@
"id": "9cfe2b71",
"metadata": {
"papermill": {
- "duration": 0.008053,
- "end_time": "2026-07-31T19:43:35.606162",
+ "duration": 0.013848,
+ "end_time": "2026-09-27T07:23:55.833811+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:35.598109",
+ "start_time": "2026-09-27T07:23:55.819963+00:00",
"status": "completed"
},
"tags": []
@@ -1224,16 +1237,16 @@
"id": "d390fc54",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-31T19:43:35.625247Z",
- "iopub.status.busy": "2026-07-31T19:43:35.624705Z",
- "iopub.status.idle": "2026-07-31T19:43:35.741291Z",
- "shell.execute_reply": "2026-07-31T19:43:35.741108Z"
+ "iopub.execute_input": "2026-09-27T07:23:55.863743Z",
+ "iopub.status.busy": "2026-09-27T07:23:55.863281Z",
+ "iopub.status.idle": "2026-09-27T07:23:55.957693Z",
+ "shell.execute_reply": "2026-09-27T07:23:55.957486Z"
},
"papermill": {
- "duration": 0.127607,
- "end_time": "2026-07-31T19:43:35.741354",
+ "duration": 0.110483,
+ "end_time": "2026-09-27T07:23:55.957785+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:35.613747",
+ "start_time": "2026-09-27T07:23:55.847302+00:00",
"status": "completed"
},
"tags": []
@@ -1243,133 +1256,133 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Domaines AVANT AC-3 (apres WA = Rouge) :\r\n"
+ "Domaines AVANT AC-3 (apres WA = Rouge) :\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " WA : [Rouge]\r\n"
+ " WA : [Rouge]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " NT : [Rouge, Vert, Bleu]\r\n"
+ " NT : [Rouge, Vert, Bleu]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " SA : [Rouge, Vert, Bleu]\r\n"
+ " SA : [Rouge, Vert, Bleu]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " Q : [Rouge, Vert, Bleu]\r\n"
+ " Q : [Rouge, Vert, Bleu]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " NSW : [Rouge, Vert, Bleu]\r\n"
+ " NSW : [Rouge, Vert, Bleu]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " V : [Rouge, Vert, Bleu]\r\n"
+ " V : [Rouge, Vert, Bleu]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " T : [Rouge, Vert, Bleu]\r\n"
+ " T : [Rouge, Vert, Bleu]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "\r\n"
+ "\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Apres AC-3 : 2 revisions d arcs\r\n"
+ "Apres AC-3 : 2 revisions d arcs\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "\r\n"
+ "\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Domaines APRES AC-3 :\r\n"
+ "Domaines APRES AC-3 :\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " WA : [Rouge]\r\n"
+ " WA : [Rouge]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " NT : [Vert, Bleu]\r\n"
+ " NT : [Vert, Bleu]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " SA : [Vert, Bleu]\r\n"
+ " SA : [Vert, Bleu]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " Q : [Rouge, Vert, Bleu]\r\n"
+ " Q : [Rouge, Vert, Bleu]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " NSW : [Rouge, Vert, Bleu]\r\n"
+ " NSW : [Rouge, Vert, Bleu]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " V : [Rouge, Vert, Bleu]\r\n"
+ " V : [Rouge, Vert, Bleu]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " T : [Rouge, Vert, Bleu]\r\n"
+ " T : [Rouge, Vert, Bleu]\n"
]
}
],
@@ -1402,10 +1415,10 @@
"id": "56a9c0b9",
"metadata": {
"papermill": {
- "duration": 0.004964,
- "end_time": "2026-07-31T19:43:35.751541",
+ "duration": 0.007325,
+ "end_time": "2026-09-27T07:23:55.972933+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:35.746577",
+ "start_time": "2026-09-27T07:23:55.965608+00:00",
"status": "completed"
},
"tags": []
@@ -1425,10 +1438,10 @@
"id": "7defc0f8",
"metadata": {
"papermill": {
- "duration": 0.005247,
- "end_time": "2026-07-31T19:43:35.763495",
+ "duration": 0.007333,
+ "end_time": "2026-09-27T07:23:55.987558+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:35.758248",
+ "start_time": "2026-09-27T07:23:55.980225+00:00",
"status": "completed"
},
"tags": []
@@ -1445,16 +1458,16 @@
"id": "822a850c",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-31T19:43:35.781495Z",
- "iopub.status.busy": "2026-07-31T19:43:35.781316Z",
- "iopub.status.idle": "2026-07-31T19:43:36.220696Z",
- "shell.execute_reply": "2026-07-31T19:43:36.220931Z"
+ "iopub.execute_input": "2026-09-27T07:23:56.004223Z",
+ "iopub.status.busy": "2026-09-27T07:23:56.003901Z",
+ "iopub.status.idle": "2026-09-27T07:24:07.676747Z",
+ "shell.execute_reply": "2026-09-27T07:24:07.676959Z"
},
"papermill": {
- "duration": 0.452213,
- "end_time": "2026-07-31T19:43:36.221065",
+ "duration": 11.682482,
+ "end_time": "2026-09-27T07:24:07.677125+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:35.768852",
+ "start_time": "2026-09-27T07:23:55.994643+00:00",
"status": "completed"
},
"tags": []
@@ -1471,7 +1484,9 @@
},
{
"data": {
- "text/plain": []
+ "text/plain": [
+ "Loading extensions from `/root/.nuget/packages/skiasharp/2.88.9/interactive-extensions/dotnet/SkiaSharp.DotNet.Interactive.dll`"
+ ]
},
"metadata": {},
"output_type": "display_data"
@@ -1480,13 +1495,13 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Graphique ScottPlot prepare : comparaison avant/apres AC-3 (7 variables)\r\n"
+ "Graphique ScottPlot prepare : comparaison avant/apres AC-3 (7 variables)\n"
]
},
{
"data": {
"text/html": [
- "

"
+ "

"
]
},
"metadata": {},
@@ -1496,9 +1511,9 @@
"name": "stderr",
"output_type": "stream",
"text": [
- "\r\n",
- "warning CS1701: En supposant que la référence d'assembly 'Microsoft.AspNetCore.Html.Abstractions, Version=2.3.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' utilisée par 'Microsoft.DotNet.Interactive' correspond à l'identité 'Microsoft.AspNetCore.Html.Abstractions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' de 'Microsoft.AspNetCore.Html.Abstractions', il se peut que vous deviez fournir une stratégie runtime\r\n",
- "\r\n"
+ "\n",
+ "warning CS1701: Assuming assembly reference 'Microsoft.AspNetCore.Html.Abstractions, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' used by 'Microsoft.DotNet.Interactive' matches identity 'Microsoft.AspNetCore.Html.Abstractions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' of 'Microsoft.AspNetCore.Html.Abstractions', you may need to supply runtime policy\n",
+ "\n"
]
}
],
@@ -1539,10 +1554,10 @@
"id": "118a2321",
"metadata": {
"papermill": {
- "duration": 0.007634,
- "end_time": "2026-07-31T19:43:36.235262",
+ "duration": 0.007862,
+ "end_time": "2026-09-27T07:24:07.694494+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:36.227628",
+ "start_time": "2026-09-27T07:24:07.686632+00:00",
"status": "completed"
},
"tags": []
@@ -1559,16 +1574,16 @@
"id": "fce16f11",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-31T19:43:36.253916Z",
- "iopub.status.busy": "2026-07-31T19:43:36.253194Z",
- "iopub.status.idle": "2026-07-31T19:43:36.379702Z",
- "shell.execute_reply": "2026-07-31T19:43:36.379398Z"
+ "iopub.execute_input": "2026-09-27T07:24:07.713423Z",
+ "iopub.status.busy": "2026-09-27T07:24:07.713159Z",
+ "iopub.status.idle": "2026-09-27T07:24:07.769147Z",
+ "shell.execute_reply": "2026-09-27T07:24:07.768901Z"
},
"papermill": {
- "duration": 0.13546,
- "end_time": "2026-07-31T19:43:36.379871",
+ "duration": 0.065639,
+ "end_time": "2026-09-27T07:24:07.769247+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:36.244411",
+ "start_time": "2026-09-27T07:24:07.703608+00:00",
"status": "completed"
},
"tags": []
@@ -1578,35 +1593,35 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Chemin A-B-C (2 couleurs) apres AC-3 :\r\n"
+ "Chemin A-B-C (2 couleurs) apres AC-3 :\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " A : [0]\r\n"
+ " A : [0]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " B : [1]\r\n"
+ " B : [1]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " C : [0]\r\n"
+ " C : [0]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Revisions : 2\r\n"
+ "Revisions : 2\n"
]
}
],
@@ -1652,10 +1667,10 @@
"id": "3637dc02",
"metadata": {
"papermill": {
- "duration": 0.00544,
- "end_time": "2026-07-31T19:43:36.391635",
+ "duration": 0.009329,
+ "end_time": "2026-09-27T07:24:07.787445+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:36.386195",
+ "start_time": "2026-09-27T07:24:07.778116+00:00",
"status": "completed"
},
"tags": []
@@ -1683,10 +1698,10 @@
"id": "27444f04",
"metadata": {
"papermill": {
- "duration": 0.005299,
- "end_time": "2026-07-31T19:43:36.402769",
+ "duration": 0.008873,
+ "end_time": "2026-09-27T07:24:07.805150+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:36.397470",
+ "start_time": "2026-09-27T07:24:07.796277+00:00",
"status": "completed"
},
"tags": []
@@ -1707,16 +1722,16 @@
"id": "e8494c37",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-31T19:43:36.414786Z",
- "iopub.status.busy": "2026-07-31T19:43:36.414558Z",
- "iopub.status.idle": "2026-07-31T19:43:36.962619Z",
- "shell.execute_reply": "2026-07-31T19:43:36.962497Z"
+ "iopub.execute_input": "2026-09-27T07:24:07.822718Z",
+ "iopub.status.busy": "2026-09-27T07:24:07.822481Z",
+ "iopub.status.idle": "2026-09-27T07:24:08.301805Z",
+ "shell.execute_reply": "2026-09-27T07:24:08.301553Z"
},
"papermill": {
- "duration": 0.554543,
- "end_time": "2026-07-31T19:43:36.962681",
+ "duration": 0.488801,
+ "end_time": "2026-09-27T07:24:08.301904+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:36.408138",
+ "start_time": "2026-09-27T07:24:07.813103+00:00",
"status": "completed"
},
"tags": []
@@ -1726,70 +1741,70 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Choco solveur : solved = True, solutions trouvees = 1\r\n"
+ "Choco solveur : solved = True, solutions trouvees = 1\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "\r\n"
+ "\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Assignation trouvee par Choco :\r\n"
+ "Assignation trouvee par Choco :\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " WA = 1\r\n"
+ " WA = 1\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " NT = 3\r\n"
+ " NT = 3\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " SA = 2\r\n"
+ " SA = 2\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " Q = 1\r\n"
+ " Q = 1\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " NSW = 3\r\n"
+ " NSW = 3\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " V = 1\r\n"
+ " V = 1\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " T = 1\r\n"
+ " T = 1\n"
]
}
],
@@ -1850,10 +1865,10 @@
"id": "5340e47e",
"metadata": {
"papermill": {
- "duration": 0.005547,
- "end_time": "2026-07-31T19:43:36.974015",
+ "duration": 0.008137,
+ "end_time": "2026-09-27T07:24:08.318796+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:36.968468",
+ "start_time": "2026-09-27T07:24:08.310659+00:00",
"status": "completed"
},
"tags": []
@@ -1881,10 +1896,10 @@
"id": "f0a05e54",
"metadata": {
"papermill": {
- "duration": 0.005115,
- "end_time": "2026-07-31T19:43:36.984575",
+ "duration": 0.012844,
+ "end_time": "2026-09-27T07:24:08.339702+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:36.979460",
+ "start_time": "2026-09-27T07:24:08.326858+00:00",
"status": "completed"
},
"tags": []
@@ -1903,16 +1918,16 @@
"id": "40e758dc",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-31T19:43:36.996983Z",
- "iopub.status.busy": "2026-07-31T19:43:36.996825Z",
- "iopub.status.idle": "2026-07-31T19:43:37.075759Z",
- "shell.execute_reply": "2026-07-31T19:43:37.075650Z"
+ "iopub.execute_input": "2026-09-27T07:24:08.359790Z",
+ "iopub.status.busy": "2026-09-27T07:24:08.359274Z",
+ "iopub.status.idle": "2026-09-27T07:24:08.415600Z",
+ "shell.execute_reply": "2026-09-27T07:24:08.415335Z"
},
"papermill": {
- "duration": 0.08574,
- "end_time": "2026-07-31T19:43:37.075815",
+ "duration": 0.06693,
+ "end_time": "2026-09-27T07:24:08.415717+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:36.990075",
+ "start_time": "2026-09-27T07:24:08.348787+00:00",
"status": "completed"
},
"tags": []
@@ -1922,7 +1937,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "BacktrackingFC defini (avec heuristique MRV)\r\n"
+ "BacktrackingFC defini (avec heuristique MRV)\n"
]
}
],
@@ -1978,10 +1993,10 @@
"id": "2a7555e7",
"metadata": {
"papermill": {
- "duration": 0.0055,
- "end_time": "2026-07-31T19:43:37.087000",
+ "duration": 0.009897,
+ "end_time": "2026-09-27T07:24:08.435287+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:37.081500",
+ "start_time": "2026-09-27T07:24:08.425390+00:00",
"status": "completed"
},
"tags": []
@@ -1996,16 +2011,16 @@
"id": "c928c722",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-31T19:43:37.100114Z",
- "iopub.status.busy": "2026-07-31T19:43:37.099941Z",
- "iopub.status.idle": "2026-07-31T19:43:37.191422Z",
- "shell.execute_reply": "2026-07-31T19:43:37.191290Z"
+ "iopub.execute_input": "2026-09-27T07:24:08.460570Z",
+ "iopub.status.busy": "2026-09-27T07:24:08.460277Z",
+ "iopub.status.idle": "2026-09-27T07:24:08.536739Z",
+ "shell.execute_reply": "2026-09-27T07:24:08.536521Z"
},
"papermill": {
- "duration": 0.098654,
- "end_time": "2026-07-31T19:43:37.191485",
+ "duration": 0.092912,
+ "end_time": "2026-09-27T07:24:08.536833+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:37.092831",
+ "start_time": "2026-09-27T07:24:08.443921+00:00",
"status": "completed"
},
"tags": []
@@ -2015,35 +2030,35 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "8-Reines + Forward Checking :\r\n"
+ "8-Reines + Forward Checking :\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " Noeuds explores : 75\r\n"
+ " Noeuds explores : 75\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " Temps : 2,6 ms\r\n"
+ " Temps : 8.1 ms\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " Solution trouvee : OUI\r\n"
+ " Solution trouvee : OUI\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " Assignation : Q0->0 Q1->4 Q2->7 Q3->5 Q4->2 Q5->6 Q6->1 Q7->3\r\n"
+ " Assignation : Q0->0 Q1->4 Q2->7 Q3->5 Q4->2 Q5->6 Q6->1 Q7->3\n"
]
}
],
@@ -2075,10 +2090,10 @@
"id": "fb3e446c",
"metadata": {
"papermill": {
- "duration": 0.006252,
- "end_time": "2026-07-31T19:43:37.203829",
+ "duration": 0.009516,
+ "end_time": "2026-09-27T07:24:08.555602+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:37.197577",
+ "start_time": "2026-09-27T07:24:08.546086+00:00",
"status": "completed"
},
"tags": []
@@ -2096,10 +2111,10 @@
"id": "3d270c35",
"metadata": {
"papermill": {
- "duration": 0.005842,
- "end_time": "2026-07-31T19:43:37.215670",
+ "duration": 0.00989,
+ "end_time": "2026-09-27T07:24:08.578712+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:37.209828",
+ "start_time": "2026-09-27T07:24:08.568822+00:00",
"status": "completed"
},
"tags": []
@@ -2116,16 +2131,16 @@
"id": "99752c32",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-31T19:43:37.229321Z",
- "iopub.status.busy": "2026-07-31T19:43:37.228980Z",
- "iopub.status.idle": "2026-07-31T19:43:37.305315Z",
- "shell.execute_reply": "2026-07-31T19:43:37.305196Z"
+ "iopub.execute_input": "2026-09-27T07:24:08.599107Z",
+ "iopub.status.busy": "2026-09-27T07:24:08.598819Z",
+ "iopub.status.idle": "2026-09-27T07:24:08.636793Z",
+ "shell.execute_reply": "2026-09-27T07:24:08.636596Z"
},
"papermill": {
- "duration": 0.08342,
- "end_time": "2026-07-31T19:43:37.305375",
+ "duration": 0.04882,
+ "end_time": "2026-09-27T07:24:08.636880+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:37.221955",
+ "start_time": "2026-09-27T07:24:08.588060+00:00",
"status": "completed"
},
"tags": []
@@ -2135,7 +2150,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "BacktrackingMAC defini (FC + AC-3 apres chaque assignation)\r\n"
+ "BacktrackingMAC defini (FC + AC-3 apres chaque assignation)\n"
]
}
],
@@ -2192,16 +2207,16 @@
"id": "912a8364",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-31T19:43:37.317681Z",
- "iopub.status.busy": "2026-07-31T19:43:37.317513Z",
- "iopub.status.idle": "2026-07-31T19:43:37.409506Z",
- "shell.execute_reply": "2026-07-31T19:43:37.409370Z"
+ "iopub.execute_input": "2026-09-27T07:24:08.657241Z",
+ "iopub.status.busy": "2026-09-27T07:24:08.656913Z",
+ "iopub.status.idle": "2026-09-27T07:24:08.694876Z",
+ "shell.execute_reply": "2026-09-27T07:24:08.694717Z"
},
"papermill": {
- "duration": 0.098431,
- "end_time": "2026-07-31T19:43:37.409571",
+ "duration": 0.048571,
+ "end_time": "2026-09-27T07:24:08.694963+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:37.311140",
+ "start_time": "2026-09-27T07:24:08.646392+00:00",
"status": "completed"
},
"tags": []
@@ -2211,28 +2226,28 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "8-Reines + MAC :\r\n"
+ "8-Reines + MAC :\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " Noeuds explores : 20\r\n"
+ " Noeuds explores : 20\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " Temps : 3,4 ms\r\n"
+ " Temps : 8.9 ms\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " Solution trouvee : OUI\r\n"
+ " Solution trouvee : OUI\n"
]
}
],
@@ -2256,10 +2271,10 @@
"id": "6b358d81",
"metadata": {
"papermill": {
- "duration": 0.005875,
- "end_time": "2026-07-31T19:43:37.421526",
+ "duration": 0.009123,
+ "end_time": "2026-09-27T07:24:08.715525+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:37.415651",
+ "start_time": "2026-09-27T07:24:08.706402+00:00",
"status": "completed"
},
"tags": []
@@ -2276,16 +2291,16 @@
"id": "b3a4b064",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-31T19:43:37.434463Z",
- "iopub.status.busy": "2026-07-31T19:43:37.434294Z",
- "iopub.status.idle": "2026-07-31T19:43:37.508797Z",
- "shell.execute_reply": "2026-07-31T19:43:37.508658Z"
+ "iopub.execute_input": "2026-09-27T07:24:08.736115Z",
+ "iopub.status.busy": "2026-09-27T07:24:08.735834Z",
+ "iopub.status.idle": "2026-09-27T07:24:08.808369Z",
+ "shell.execute_reply": "2026-09-27T07:24:08.807947Z"
},
"papermill": {
- "duration": 0.081395,
- "end_time": "2026-07-31T19:43:37.508863",
+ "duration": 0.083994,
+ "end_time": "2026-09-27T07:24:08.808532+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:37.427468",
+ "start_time": "2026-09-27T07:24:08.724538+00:00",
"status": "completed"
},
"tags": []
@@ -2295,28 +2310,28 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Comparaison BT vs FC vs MAC sur 8-Reines :\r\n"
+ "Comparaison BT vs FC vs MAC sur 8-Reines :\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " BT (no propagation) : 876 noeuds, 5,4 ms\r\n"
+ " BT (no propagation) : 876 noeuds, 15.2 ms\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " FC (forward check) : 75 noeuds, 2,6 ms\r\n"
+ " FC (forward check) : 75 noeuds, 8.1 ms\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " MAC (AC-3 complet) : 20 noeuds, 3,4 ms\r\n"
+ " MAC (AC-3 complet) : 20 noeuds, 8.9 ms\n"
]
}
],
@@ -2363,10 +2378,10 @@
"id": "97f92567",
"metadata": {
"papermill": {
- "duration": 0.006079,
- "end_time": "2026-07-31T19:43:37.521365",
+ "duration": 0.01425,
+ "end_time": "2026-09-27T07:24:08.837851+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:37.515286",
+ "start_time": "2026-09-27T07:24:08.823601+00:00",
"status": "completed"
},
"tags": []
@@ -2381,16 +2396,16 @@
"id": "90d657a7",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-31T19:43:37.537103Z",
- "iopub.status.busy": "2026-07-31T19:43:37.536818Z",
- "iopub.status.idle": "2026-07-31T19:43:37.638588Z",
- "shell.execute_reply": "2026-07-31T19:43:37.638684Z"
+ "iopub.execute_input": "2026-09-27T07:24:08.864836Z",
+ "iopub.status.busy": "2026-09-27T07:24:08.864458Z",
+ "iopub.status.idle": "2026-09-27T07:24:08.924405Z",
+ "shell.execute_reply": "2026-09-27T07:24:08.924550Z"
},
"papermill": {
- "duration": 0.110994,
- "end_time": "2026-07-31T19:43:37.638749",
+ "duration": 0.073636,
+ "end_time": "2026-09-27T07:24:08.924660+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:37.527755",
+ "start_time": "2026-09-27T07:24:08.851024+00:00",
"status": "completed"
},
"tags": []
@@ -2400,13 +2415,13 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Graphique prepare : BT=876, FC=75, MAC=20 noeuds\r\n"
+ "Graphique prepare : BT=876, FC=75, MAC=20 noeuds\n"
]
},
{
"data": {
"text/html": [
- "

"
+ "

"
]
},
"metadata": {},
@@ -2416,9 +2431,9 @@
"name": "stderr",
"output_type": "stream",
"text": [
- "\r\n",
- "warning CS1701: En supposant que la référence d'assembly 'Microsoft.AspNetCore.Html.Abstractions, Version=2.3.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' utilisée par 'Microsoft.DotNet.Interactive' correspond à l'identité 'Microsoft.AspNetCore.Html.Abstractions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' de 'Microsoft.AspNetCore.Html.Abstractions', il se peut que vous deviez fournir une stratégie runtime\r\n",
- "\r\n"
+ "\n",
+ "warning CS1701: Assuming assembly reference 'Microsoft.AspNetCore.Html.Abstractions, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' used by 'Microsoft.DotNet.Interactive' matches identity 'Microsoft.AspNetCore.Html.Abstractions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' of 'Microsoft.AspNetCore.Html.Abstractions', you may need to supply runtime policy\n",
+ "\n"
]
}
],
@@ -2444,10 +2459,10 @@
"id": "6adf1701",
"metadata": {
"papermill": {
- "duration": 0.005978,
- "end_time": "2026-07-31T19:43:37.650945",
+ "duration": 0.009723,
+ "end_time": "2026-09-27T07:24:08.946406+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:37.644967",
+ "start_time": "2026-09-27T07:24:08.936683+00:00",
"status": "completed"
},
"tags": []
@@ -2471,6 +2486,16 @@
{
"cell_type": "markdown",
"id": "524f1d7a",
+ "metadata": {
+ "papermill": {
+ "duration": 0.009487,
+ "end_time": "2026-09-27T07:24:08.965679+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:24:08.956192+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"## 7. Path Consistency et k-consistance (au-delà de l'arc-consistance)\n",
"\n",
@@ -2509,18 +2534,17 @@
"En théorie, monter en k-consistance est séduisant : plus on propage, moins la recherche backtracke. En pratique, **le coût croît exponentiellement avec `k`**. Le nombre de `k`-uplets à examiner croît en `O(n^k * d^k)` pour la k-consistance, tandis que le gain sur la recherche est **incrémental**. Pour `k=3` (PC-2) le surcoût est déjà `O(n^3 * d^3)` ; pour `k=4`, `O(n^4 * d^4)`, etc.\n",
"\n",
"C'est exactement pourquoi **les solveurs réels, dont Choco-solver, s'arrêtent à la consistance d'arc** en phase de pré-traitement : le ratio `(coût de propagation) / (coût d'un nœud exploré)` bascule très vite en défaveur de la propagation dès que `k` augmente. Le **MAC** que nous avons implémenté en section 6 applique AC-3 à chaque nœud — c'est le **bon compromis** : il récupère l'essentiel du filtrage sans payer le coût exponentiel de la k-consistance."
- ],
- "metadata": {}
+ ]
},
{
"cell_type": "markdown",
"id": "8fa1c907",
"metadata": {
"papermill": {
- "duration": 0.006944,
- "end_time": "2026-07-31T19:43:37.664185",
+ "duration": 0.011569,
+ "end_time": "2026-09-27T07:24:08.987005+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:37.657241",
+ "start_time": "2026-09-27T07:24:08.975436+00:00",
"status": "completed"
},
"tags": []
@@ -2536,10 +2560,10 @@
"id": "9d574219",
"metadata": {
"papermill": {
- "duration": 0.006233,
- "end_time": "2026-07-31T19:43:37.676844",
+ "duration": 0.010273,
+ "end_time": "2026-09-27T07:24:09.007733+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:37.670611",
+ "start_time": "2026-09-27T07:24:08.997460+00:00",
"status": "completed"
},
"tags": []
@@ -2565,16 +2589,16 @@
"id": "20a4dde7",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-31T19:43:37.690340Z",
- "iopub.status.busy": "2026-07-31T19:43:37.690172Z",
- "iopub.status.idle": "2026-07-31T19:43:37.726244Z",
- "shell.execute_reply": "2026-07-31T19:43:37.726111Z"
+ "iopub.execute_input": "2026-09-27T07:24:09.034906Z",
+ "iopub.status.busy": "2026-09-27T07:24:09.034512Z",
+ "iopub.status.idle": "2026-09-27T07:24:09.051731Z",
+ "shell.execute_reply": "2026-09-27T07:24:09.051435Z"
},
"papermill": {
- "duration": 0.043228,
- "end_time": "2026-07-31T19:43:37.726309",
+ "duration": 0.033652,
+ "end_time": "2026-09-27T07:24:09.051839+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:37.683081",
+ "start_time": "2026-09-27T07:24:09.018187+00:00",
"status": "completed"
},
"tags": []
@@ -2584,7 +2608,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Exercice a completer\r\n"
+ "Exercice a completer\n"
]
}
],
@@ -2614,10 +2638,10 @@
"id": "99fe3f71",
"metadata": {
"papermill": {
- "duration": 0.006199,
- "end_time": "2026-07-31T19:43:37.739035",
+ "duration": 0.009477,
+ "end_time": "2026-09-27T07:24:09.071375+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:37.732836",
+ "start_time": "2026-09-27T07:24:09.061898+00:00",
"status": "completed"
},
"tags": []
@@ -2634,16 +2658,16 @@
"id": "499cdcf2",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-31T19:43:37.753862Z",
- "iopub.status.busy": "2026-07-31T19:43:37.753645Z",
- "iopub.status.idle": "2026-07-31T19:43:37.786521Z",
- "shell.execute_reply": "2026-07-31T19:43:37.786285Z"
+ "iopub.execute_input": "2026-09-27T07:24:09.092594Z",
+ "iopub.status.busy": "2026-09-27T07:24:09.092364Z",
+ "iopub.status.idle": "2026-09-27T07:24:09.107287Z",
+ "shell.execute_reply": "2026-09-27T07:24:09.107088Z"
},
"papermill": {
- "duration": 0.04112,
- "end_time": "2026-07-31T19:43:37.786612",
+ "duration": 0.026493,
+ "end_time": "2026-09-27T07:24:09.107374+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:37.745492",
+ "start_time": "2026-09-27T07:24:09.080881+00:00",
"status": "completed"
},
"tags": []
@@ -2653,7 +2677,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Exercice a completer\r\n"
+ "Exercice a completer\n"
]
}
],
@@ -2681,10 +2705,10 @@
"id": "87e9d8a6",
"metadata": {
"papermill": {
- "duration": 0.010796,
- "end_time": "2026-07-31T19:43:37.803986",
+ "duration": 0.010879,
+ "end_time": "2026-09-27T07:24:09.128132+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:37.793190",
+ "start_time": "2026-09-27T07:24:09.117253+00:00",
"status": "completed"
},
"tags": []
@@ -2701,16 +2725,16 @@
"id": "7733d74e",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-31T19:43:37.828410Z",
- "iopub.status.busy": "2026-07-31T19:43:37.828195Z",
- "iopub.status.idle": "2026-07-31T19:43:37.871530Z",
- "shell.execute_reply": "2026-07-31T19:43:37.871235Z"
+ "iopub.execute_input": "2026-09-27T07:24:09.150810Z",
+ "iopub.status.busy": "2026-09-27T07:24:09.150582Z",
+ "iopub.status.idle": "2026-09-27T07:24:09.166264Z",
+ "shell.execute_reply": "2026-09-27T07:24:09.166057Z"
},
"papermill": {
- "duration": 0.056261,
- "end_time": "2026-07-31T19:43:37.871623",
+ "duration": 0.02725,
+ "end_time": "2026-09-27T07:24:09.166360+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:37.815362",
+ "start_time": "2026-09-27T07:24:09.139110+00:00",
"status": "completed"
},
"tags": []
@@ -2720,7 +2744,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Exercice a completer\r\n"
+ "Exercice a completer\n"
]
}
],
@@ -2749,10 +2773,10 @@
"id": "ca3c3c9c",
"metadata": {
"papermill": {
- "duration": 0.011308,
- "end_time": "2026-07-31T19:43:37.893433",
+ "duration": 0.01124,
+ "end_time": "2026-09-27T07:24:09.187758+00:00",
"exception": false,
- "start_time": "2026-07-31T19:43:37.882125",
+ "start_time": "2026-09-27T07:24:09.176518+00:00",
"status": "completed"
},
"tags": []
@@ -2840,17 +2864,17 @@
},
"papermill": {
"default_parameters": {},
- "duration": 11.398279,
- "end_time": "2026-07-31T19:43:38.142208",
+ "duration": 21.796921,
+ "end_time": "2026-09-27T07:24:09.314298+00:00",
"environment_variables": {},
"exception": null,
"input_path": "CSP-2-Consistency-CSharp.ipynb",
- "output_path": "csp2-out.ipynb",
+ "output_path": "CSP-2-Consistency-CSharp.ipynb",
"parameters": {},
- "start_time": "2026-07-31T19:43:26.743929",
+ "start_time": "2026-09-27T07:23:47.517377+00:00",
"version": "2.6.0"
}
},
"nbformat": 4,
"nbformat_minor": 5
-}
+}
\ No newline at end of file
diff --git a/MyIA.AI.Notebooks/Search/Part2-CSP/CSP-3-Advanced-CSharp.ipynb b/MyIA.AI.Notebooks/Search/Part2-CSP/CSP-3-Advanced-CSharp.ipynb
index 0ffa2fd81e..f922f2a121 100644
--- a/MyIA.AI.Notebooks/Search/Part2-CSP/CSP-3-Advanced-CSharp.ipynb
+++ b/MyIA.AI.Notebooks/Search/Part2-CSP/CSP-3-Advanced-CSharp.ipynb
@@ -3,7 +3,16 @@
{
"cell_type": "markdown",
"id": "5c448bff",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.004188,
+ "end_time": "2026-09-27T07:24:16.341437+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:24:16.337249+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"# CSP-3 : CSP Avancé — Contraintes globales et stratégies Choco\n",
"\n",
@@ -17,8 +26,8 @@
"3. Montrer la **réification** : transformer une contrainte en variable booléenne.\n",
"\n",
"**Pattern d'exécution** (cf. leçon C146 / IKVM bridge) :\n",
- "1. `#r \"nuget: IKVM, 8.15.0\"` + `IKVM.Image` + `IKVM.Image.runtime.win-x64`\n",
- "2. Configuration `IKVM_HOME` via fusion `ikvm.image/any/any` + `ikvm.image.runtime.win-x64`\n",
+ "1. `#r \"nuget: IKVM, 8.15.0\"` + `IKVM.Image` (qui tire les images natives de toutes les plateformes)\n",
+ "2. Configuration `IKVM_HOME` via fusion `ikvm.image/any/any` + `ikvm.image.runtime.
` (RID de la machine : `win-x64`, `linux-x64`, `osx-arm64`...)\n",
"3. `AppContext.SetData(\"IKVM.Home\", ikvmHome)`\n",
"4. `#r \"org.chocosolver.solver.dll\"` + `using org.chocosolver.solver.*`\n",
"5. Désambiguïsation `using Task = System.Threading.Tasks.Task;` (sinon conflit avec `org.chocosolver.solver.variables.Task`)\n",
@@ -39,11 +48,19 @@
"language": "csharp"
},
"execution": {
- "iopub.execute_input": "2026-08-01T09:33:28.020226Z",
- "iopub.status.busy": "2026-08-01T09:33:28.014016Z",
- "iopub.status.idle": "2026-08-01T09:33:29.872495Z",
- "shell.execute_reply": "2026-08-01T09:33:29.866458Z"
- }
+ "iopub.execute_input": "2026-09-27T07:24:16.365038Z",
+ "iopub.status.busy": "2026-09-27T07:24:16.356700Z",
+ "iopub.status.idle": "2026-09-27T07:24:18.551918Z",
+ "shell.execute_reply": "2026-09-27T07:24:18.546814Z"
+ },
+ "papermill": {
+ "duration": 2.20683,
+ "end_time": "2026-09-27T07:24:18.552103+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:24:16.345273+00:00",
+ "status": "completed"
+ },
+ "tags": []
},
"outputs": [
{
@@ -51,7 +68,7 @@
"text/html": [
"\r\n",
"\r\n",
- "
\r\n",
+ "
\r\n",
" 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",
+ "
"
+ ]
},
- "metadata": {}
+ "metadata": {},
+ "output_type": "display_data"
},
{
- "output_type": "stream",
"name": "stdout",
- "text": "Répertoire de travail: Part2-CSP\r\n"
+ "output_type": "stream",
+ "text": [
+ "Répertoire de travail: Part2-CSP\n"
+ ]
}
],
"source": [
@@ -81,13 +208,22 @@
{
"cell_type": "markdown",
"id": "a1d4249d",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.004881,
+ "end_time": "2026-09-27T07:24:32.969998+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:24:32.965117+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"## Configuration IKVM et Choco-solver\n",
"\n",
"### Approche : DLL pré-compilée + runtime IKVM NuGet\n",
"\n",
- "Le JAR `choco-solver-4.10.17` a été pré-compilé en DLL .NET avec IKVM 8.15.0. La DLL `org.chocosolver.solver.dll` (12 Mo) est située à côté de ce notebook. Le runtime IKVM est chargé via NuGet (`IKVM`, `IKVM.Image`, `IKVM.Image.runtime.win-x64` en 8.15.0).\n",
+ "Le JAR `choco-solver-4.10.17` a été pré-compilé en DLL .NET avec IKVM 8.15.0. La DLL `org.chocosolver.solver.dll` (12 Mo) est située à côté de ce notebook. Le runtime IKVM est chargé via NuGet (`IKVM` et `IKVM.Image` en 8.15.0 ; `IKVM.Image` tire l'image native de chaque plateforme).\n",
"\n",
"Cette approche (DLL pré-compilée + runtime NuGet) débloque l'exécution **réelle** de Choco-solver dans le kernel dotnet-interactive (cf. [#4711](https://github.com/jsboige/CoursIA/pull/4711) pour le diagnostic complet des deux verrous IKVM levés)."
]
@@ -98,35 +234,51 @@
"id": "9ca7b3b7",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-03T05:55:09.958694Z",
- "iopub.status.busy": "2026-07-03T05:55:09.958164Z",
- "iopub.status.idle": "2026-07-03T05:55:10.637831Z",
- "shell.execute_reply": "2026-07-03T05:55:10.637047Z"
- }
+ "iopub.execute_input": "2026-09-27T07:24:32.980941Z",
+ "iopub.status.busy": "2026-09-27T07:24:32.980592Z",
+ "iopub.status.idle": "2026-09-27T07:24:33.485327Z",
+ "shell.execute_reply": "2026-09-27T07:24:33.484941Z"
+ },
+ "papermill": {
+ "duration": 0.511042,
+ "end_time": "2026-09-27T07:24:33.485453+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:24:32.974411+00:00",
+ "status": "completed"
+ },
+ "tags": []
},
"outputs": [
{
- "output_type": "display_data",
"data": {
- "text/html": "
Installing Packages- IKVM
- IKVM.Image
- IKVM.Image.runtime.win-x64
"
+ "text/html": [
+ "
Installed Packages- IKVM, 8.15.0
- IKVM.Image, 8.15.0
"
+ ]
},
- "metadata": {}
+ "metadata": {},
+ "output_type": "display_data"
},
{
- "output_type": "stream",
"name": "stdout",
- "text": "IKVM 8.15.0 prêt (home=ikvm-home-8.15.0-win-x64, tzdb=True) - Choco-solver charge\r\n"
+ "output_type": "stream",
+ "text": [
+ "IKVM 8.15.0 prêt (home=ikvm-home-8.15.0-linux-x64, tzdb=True) - Choco-solver charge\n"
+ ]
}
],
"source": [
"// Configuration IKVM 8.15.0 pour Choco-solver (identique à CSP-4-Scheduling-Csharp.ipynb, cf. #4711)\n",
"#r \"nuget: IKVM, 8.15.0\"\n",
"#r \"nuget: IKVM.Image, 8.15.0\"\n",
- "#r \"nuget: IKVM.Image.runtime.win-x64, 8.15.0\"\n",
"\n",
"using System.IO;\n",
+ "using System.Runtime.InteropServices;\n",
"\n",
- "string ikvmVer = \"8.15.0\", ikvmRid = \"win-x64\";\n",
+ "// RID de la machine courante (win-x64, linux-x64, osx-arm64, ...) : le paquet IKVM.Image\n",
+ "// tire deja l'image native de chaque plateforme, il suffit de choisir la bonne.\n",
+ "string ikvmOs = OperatingSystem.IsWindows() ? \"win\" : OperatingSystem.IsMacOS() ? \"osx\" : \"linux\";\n",
+ "string ikvmRid = ikvmOs + \"-\" + RuntimeInformation.ProcessArchitecture.ToString().ToLowerInvariant();\n",
+ "string ikvmVer = \"8.15.0\";\n",
"string nugetRoot = Environment.GetEnvironmentVariable(\"NUGET_PACKAGES\")\n",
" ?? Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), \".nuget\", \"packages\");\n",
"string ikvmBaseAny = Path.Combine(nugetRoot, \"ikvm.image\", ikvmVer, \"ikvm\", \"any\", \"any\");\n",
@@ -163,17 +315,27 @@
"id": "14a411fb",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-03T05:55:10.640347Z",
- "iopub.status.busy": "2026-07-03T05:55:10.639866Z",
- "iopub.status.idle": "2026-07-03T05:55:10.721994Z",
- "shell.execute_reply": "2026-07-03T05:55:10.721582Z"
- }
+ "iopub.execute_input": "2026-09-27T07:24:33.496547Z",
+ "iopub.status.busy": "2026-09-27T07:24:33.496076Z",
+ "iopub.status.idle": "2026-09-27T07:24:33.717284Z",
+ "shell.execute_reply": "2026-09-27T07:24:33.717052Z"
+ },
+ "papermill": {
+ "duration": 0.228051,
+ "end_time": "2026-09-27T07:24:33.717401+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:24:33.489350+00:00",
+ "status": "completed"
+ },
+ "tags": []
},
"outputs": [
{
- "output_type": "stream",
"name": "stdout",
- "text": "Choco-solver via IKVM 8.15.0 - Prêt pour optimisation combinatoire\r\n"
+ "output_type": "stream",
+ "text": [
+ "Choco-solver via IKVM 8.15.0 - Prêt pour optimisation combinatoire\n"
+ ]
}
],
"source": [
@@ -197,7 +359,16 @@
{
"cell_type": "markdown",
"id": "722907d2",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.003447,
+ "end_time": "2026-09-27T07:24:33.724756+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:24:33.721309+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"## 1. Bin Packing Problem (BPP) avec Choco\n",
"\n",
@@ -223,32 +394,48 @@
"id": "710a6870",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-03T05:55:10.724501Z",
- "iopub.status.busy": "2026-07-03T05:55:10.724017Z",
- "iopub.status.idle": "2026-07-03T05:55:12.050804Z",
- "shell.execute_reply": "2026-07-03T05:55:12.050104Z"
- }
+ "iopub.execute_input": "2026-09-27T07:24:33.733948Z",
+ "iopub.status.busy": "2026-09-27T07:24:33.733608Z",
+ "iopub.status.idle": "2026-09-27T07:24:34.741720Z",
+ "shell.execute_reply": "2026-09-27T07:24:34.741063Z"
+ },
+ "papermill": {
+ "duration": 1.013679,
+ "end_time": "2026-09-27T07:24:34.741851+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:24:33.728172+00:00",
+ "status": "completed"
+ },
+ "tags": []
},
"outputs": [
{
- "output_type": "stream",
"name": "stdout",
- "text": "Bin Packing : nombre optimal de bins = 3 (capacite 10)\r\n"
+ "output_type": "stream",
+ "text": [
+ "Bin Packing : nombre optimal de bins = 3 (capacite 10)\n"
+ ]
},
{
- "output_type": "stream",
"name": "stdout",
- "text": " Bin 0 (charge 7/10) : objets [1,4] tailles [5,2]\r\n"
+ "output_type": "stream",
+ "text": [
+ " Bin 0 (charge 7/10) : objets [1,4] tailles [5,2]\n"
+ ]
},
{
- "output_type": "stream",
"name": "stdout",
- "text": " Bin 1 (charge 4/10) : objets [2] tailles [4]\r\n"
+ "output_type": "stream",
+ "text": [
+ " Bin 1 (charge 4/10) : objets [2] tailles [4]\n"
+ ]
},
{
- "output_type": "stream",
"name": "stdout",
- "text": " Bin 2 (charge 9/10) : objets [0,3] tailles [2,7]\r\n"
+ "output_type": "stream",
+ "text": [
+ " Bin 2 (charge 9/10) : objets [0,3] tailles [2,7]\n"
+ ]
}
],
"source": [
@@ -344,7 +531,16 @@
{
"cell_type": "markdown",
"id": "d7ef13e5",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.0035,
+ "end_time": "2026-09-27T07:24:34.749834+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:24:34.746334+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"## 2. Knapsack Problem (0/1) avec Choco\n",
"\n",
@@ -367,27 +563,41 @@
"id": "d3984b1b",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-03T05:55:12.052965Z",
- "iopub.status.busy": "2026-07-03T05:55:12.052498Z",
- "iopub.status.idle": "2026-07-03T05:55:12.225508Z",
- "shell.execute_reply": "2026-07-03T05:55:12.224894Z"
- }
+ "iopub.execute_input": "2026-09-27T07:24:34.758733Z",
+ "iopub.status.busy": "2026-09-27T07:24:34.758479Z",
+ "iopub.status.idle": "2026-09-27T07:24:34.866134Z",
+ "shell.execute_reply": "2026-09-27T07:24:34.865850Z"
+ },
+ "papermill": {
+ "duration": 0.112954,
+ "end_time": "2026-09-27T07:24:34.866242+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:24:34.753288+00:00",
+ "status": "completed"
+ },
+ "tags": []
},
"outputs": [
{
- "output_type": "stream",
"name": "stdout",
- "text": "Knapsack : valeur optimale = 31 (poids 10/10)\r\n"
+ "output_type": "stream",
+ "text": [
+ "Knapsack : valeur optimale = 31 (poids 10/10)\n"
+ ]
},
{
- "output_type": "stream",
"name": "stdout",
- "text": " Objets selectionnes : [0,1,3]\r\n"
+ "output_type": "stream",
+ "text": [
+ " Objets selectionnes : [0,1,3]\n"
+ ]
},
{
- "output_type": "stream",
"name": "stdout",
- "text": " Poids : [2,3,5], Valeurs : [6,10,15]\r\n"
+ "output_type": "stream",
+ "text": [
+ " Poids : [2,3,5], Valeurs : [6,10,15]\n"
+ ]
}
],
"source": [
@@ -445,7 +655,16 @@
{
"cell_type": "markdown",
"id": "bdbe3a65",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.004297,
+ "end_time": "2026-09-27T07:24:34.874672+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:24:34.870375+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"## 3. Cutting Stock Problem avec Choco\n",
"\n",
@@ -467,67 +686,97 @@
"id": "9f9e08b0",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-03T05:55:12.227639Z",
- "iopub.status.busy": "2026-07-03T05:55:12.227287Z",
- "iopub.status.idle": "2026-07-03T05:55:27.778950Z",
- "shell.execute_reply": "2026-07-03T05:55:27.778528Z"
- }
+ "iopub.execute_input": "2026-09-27T07:24:34.884824Z",
+ "iopub.status.busy": "2026-09-27T07:24:34.884443Z",
+ "iopub.status.idle": "2026-09-27T07:24:45.431229Z",
+ "shell.execute_reply": "2026-09-27T07:24:45.430868Z"
+ },
+ "papermill": {
+ "duration": 10.552573,
+ "end_time": "2026-09-27T07:24:45.431363+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:24:34.878790+00:00",
+ "status": "completed"
+ },
+ "tags": []
},
"outputs": [
{
- "output_type": "stream",
"name": "stdout",
- "text": "Cutting Stock : nombre optimal de barres = 10 (longueur stock 10)\r\n"
+ "output_type": "stream",
+ "text": [
+ "Cutting Stock : nombre optimal de barres = 10 (longueur stock 10)\n"
+ ]
},
{
- "output_type": "stream",
"name": "stdout",
- "text": " Barre 0 (longueur 9/10) : pieces [11] longueurs [9]\r\n"
+ "output_type": "stream",
+ "text": [
+ " Barre 0 (longueur 9/10) : pieces [11] longueurs [9]\n"
+ ]
},
{
- "output_type": "stream",
"name": "stdout",
- "text": " Barre 1 (longueur 8/10) : pieces [3,4] longueurs [4,4]\r\n"
+ "output_type": "stream",
+ "text": [
+ " Barre 1 (longueur 8/10) : pieces [3,4] longueurs [4,4]\n"
+ ]
},
{
- "output_type": "stream",
"name": "stdout",
- "text": " Barre 2 (longueur 9/10) : pieces [12] longueurs [9]\r\n"
+ "output_type": "stream",
+ "text": [
+ " Barre 2 (longueur 9/10) : pieces [12] longueurs [9]\n"
+ ]
},
{
- "output_type": "stream",
"name": "stdout",
- "text": " Barre 3 (longueur 9/10) : pieces [10] longueurs [9]\r\n"
+ "output_type": "stream",
+ "text": [
+ " Barre 3 (longueur 9/10) : pieces [10] longueurs [9]\n"
+ ]
},
{
- "output_type": "stream",
"name": "stdout",
- "text": " Barre 4 (longueur 8/10) : pieces [1,2] longueurs [4,4]\r\n"
+ "output_type": "stream",
+ "text": [
+ " Barre 4 (longueur 8/10) : pieces [1,2] longueurs [4,4]\n"
+ ]
},
{
- "output_type": "stream",
"name": "stdout",
- "text": " Barre 5 (longueur 7/10) : pieces [9] longueurs [7]\r\n"
+ "output_type": "stream",
+ "text": [
+ " Barre 5 (longueur 7/10) : pieces [9] longueurs [7]\n"
+ ]
},
{
- "output_type": "stream",
"name": "stdout",
- "text": " Barre 6 (longueur 8/10) : pieces [0,5] longueurs [4,4]\r\n"
+ "output_type": "stream",
+ "text": [
+ " Barre 6 (longueur 8/10) : pieces [0,5] longueurs [4,4]\n"
+ ]
},
{
- "output_type": "stream",
"name": "stdout",
- "text": " Barre 7 (longueur 7/10) : pieces [6] longueurs [7]\r\n"
+ "output_type": "stream",
+ "text": [
+ " Barre 7 (longueur 7/10) : pieces [6] longueurs [7]\n"
+ ]
},
{
- "output_type": "stream",
"name": "stdout",
- "text": " Barre 8 (longueur 7/10) : pieces [8] longueurs [7]\r\n"
+ "output_type": "stream",
+ "text": [
+ " Barre 8 (longueur 7/10) : pieces [8] longueurs [7]\n"
+ ]
},
{
- "output_type": "stream",
"name": "stdout",
- "text": " Barre 9 (longueur 7/10) : pieces [7] longueurs [7]\r\n"
+ "output_type": "stream",
+ "text": [
+ " Barre 9 (longueur 7/10) : pieces [7] longueurs [7]\n"
+ ]
}
],
"source": [
@@ -614,7 +863,16 @@
{
"cell_type": "markdown",
"id": "d34d5215",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.004324,
+ "end_time": "2026-09-27T07:24:45.440730+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:24:45.436406+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"## 4. Optimisation de Portefeuille (version linéaire) avec Choco\n",
"\n",
@@ -635,27 +893,41 @@
"id": "a9cf198a",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-03T05:55:27.781663Z",
- "iopub.status.busy": "2026-07-03T05:55:27.781186Z",
- "iopub.status.idle": "2026-07-03T05:55:28.055610Z",
- "shell.execute_reply": "2026-07-03T05:55:28.055144Z"
- }
+ "iopub.execute_input": "2026-09-27T07:24:45.452268Z",
+ "iopub.status.busy": "2026-09-27T07:24:45.451915Z",
+ "iopub.status.idle": "2026-09-27T07:24:45.607705Z",
+ "shell.execute_reply": "2026-09-27T07:24:45.607323Z"
+ },
+ "papermill": {
+ "duration": 0.162763,
+ "end_time": "2026-09-27T07:24:45.607815+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:24:45.445052+00:00",
+ "status": "completed"
+ },
+ "tags": []
},
"outputs": [
{
- "output_type": "stream",
"name": "stdout",
- "text": "Portfolio : rendement optimal = 27 (risque 48/50, 3/3 actifs)\r\n"
+ "output_type": "stream",
+ "text": [
+ "Portfolio : rendement optimal = 27 (risque 48/50, 3/3 actifs)\n"
+ ]
},
{
- "output_type": "stream",
"name": "stdout",
- "text": " Actifs selectionnes : [0,1,4]\r\n"
+ "output_type": "stream",
+ "text": [
+ " Actifs selectionnes : [0,1,4]\n"
+ ]
},
{
- "output_type": "stream",
"name": "stdout",
- "text": " Rendements : [5,12,10], Risques : [10,20,18]\r\n"
+ "output_type": "stream",
+ "text": [
+ " Rendements : [5,12,10], Risques : [10,20,18]\n"
+ ]
}
],
"source": [
@@ -716,7 +988,16 @@
{
"cell_type": "markdown",
"id": "c131csp5-portfolio-tie",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.004359,
+ "end_time": "2026-09-27T07:24:45.616952+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:24:45.612593+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"### Lecture de la sortie : deux optima ex aequo, un seul affiché\n",
"\n",
@@ -726,7 +1007,16 @@
{
"cell_type": "markdown",
"id": "f47a7ce9",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.004247,
+ "end_time": "2026-09-27T07:24:45.625242+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:24:45.620995+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"## 5. Comparaison OR-Tools CP-SAT (Python) vs Choco (C#/.NET)\n",
"\n",
@@ -748,7 +1038,16 @@
{
"cell_type": "markdown",
"id": "cp-sat-intro",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.003897,
+ "end_time": "2026-09-27T07:24:45.633218+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:24:45.629321+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"### 5.1 Pont exécutable : CP-SAT natif .NET (Google.OrTools)\n",
"\n",
@@ -757,46 +1056,75 @@
},
{
"cell_type": "code",
- "id": "cp-sat-bpp",
- "metadata": {},
"execution_count": 8,
+ "id": "cp-sat-bpp",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-09-27T07:24:45.643598Z",
+ "iopub.status.busy": "2026-09-27T07:24:45.643263Z",
+ "iopub.status.idle": "2026-09-27T07:24:55.256719Z",
+ "shell.execute_reply": "2026-09-27T07:24:55.256452Z"
+ },
+ "papermill": {
+ "duration": 9.619726,
+ "end_time": "2026-09-27T07:24:55.256835+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:24:45.637109+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"outputs": [
{
- "output_type": "display_data",
"data": {
- "text/html": "
Installing Packages- Google.OrTools
- IKVM.Image.runtime.win-x64
"
+ "text/html": [
+ "
Installed Packages- Google.OrTools, 9.11.4210
"
+ ]
},
- "metadata": {}
+ "metadata": {},
+ "output_type": "display_data"
},
{
- "output_type": "stream",
"name": "stdout",
- "text": "CP-SAT (.NET natif) : status = Optimal\r\n"
+ "output_type": "stream",
+ "text": [
+ "CP-SAT (.NET natif) : status = Optimal\n"
+ ]
},
{
- "output_type": "stream",
"name": "stdout",
- "text": "Bin Packing : nombre optimal de bins = 3 (capacite 10)\r\n"
+ "output_type": "stream",
+ "text": [
+ "Bin Packing : nombre optimal de bins = 3 (capacite 10)\n"
+ ]
},
{
- "output_type": "stream",
"name": "stdout",
- "text": " bin 0 : objets 1(t5),2(t4) -- charge 9/10\r\n"
+ "output_type": "stream",
+ "text": [
+ " bin 0 : objets 3(t7) -- charge 7/10\n"
+ ]
},
{
- "output_type": "stream",
"name": "stdout",
- "text": " bin 1 : objets 3(t7),4(t2) -- charge 9/10\r\n"
+ "output_type": "stream",
+ "text": [
+ " bin 1 : objets 0(t2),2(t4),4(t2) -- charge 8/10\n"
+ ]
},
{
- "output_type": "stream",
"name": "stdout",
- "text": " bin 2 : objets 0(t2) -- charge 2/10\r\n"
+ "output_type": "stream",
+ "text": [
+ " bin 2 : objets 1(t5) -- charge 5/10\n"
+ ]
},
{
- "output_type": "stream",
"name": "stdout",
- "text": "Branches explorees : 300, temps : 0,0 ms\r\n"
+ "output_type": "stream",
+ "text": [
+ "Branches explorees : 65, temps : 0.0 ms\n"
+ ]
}
],
"source": [
@@ -865,7 +1193,16 @@
{
"cell_type": "markdown",
"id": "cp-sat-interp",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.004666,
+ "end_time": "2026-09-27T07:24:55.266506+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:24:55.261840+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"### Lecture du résultat : parité de machinerie atteinte\n",
"\n",
@@ -877,7 +1214,16 @@
{
"cell_type": "markdown",
"id": "7c814125",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.004396,
+ "end_time": "2026-09-27T07:24:55.275678+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:24:55.271282+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"## 6. Exercices\n",
"\n",
@@ -890,17 +1236,27 @@
"id": "02c65980",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-03T05:55:28.058807Z",
- "iopub.status.busy": "2026-07-03T05:55:28.058341Z",
- "iopub.status.idle": "2026-07-03T05:55:28.153370Z",
- "shell.execute_reply": "2026-07-03T05:55:28.152693Z"
- }
+ "iopub.execute_input": "2026-09-27T07:24:55.287142Z",
+ "iopub.status.busy": "2026-09-27T07:24:55.286890Z",
+ "iopub.status.idle": "2026-09-27T07:24:55.388699Z",
+ "shell.execute_reply": "2026-09-27T07:24:55.387985Z"
+ },
+ "papermill": {
+ "duration": 0.107871,
+ "end_time": "2026-09-27T07:24:55.388810+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:24:55.280939+00:00",
+ "status": "completed"
+ },
+ "tags": []
},
"outputs": [
{
- "output_type": "stream",
"name": "stdout",
- "text": "Exercice à compléter\r\n"
+ "output_type": "stream",
+ "text": [
+ "Exercice à compléter\n"
+ ]
}
],
"source": [
@@ -932,17 +1288,27 @@
"id": "7c247ef2",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-03T05:55:28.155691Z",
- "iopub.status.busy": "2026-07-03T05:55:28.155123Z",
- "iopub.status.idle": "2026-07-03T05:55:28.206279Z",
- "shell.execute_reply": "2026-07-03T05:55:28.205632Z"
- }
+ "iopub.execute_input": "2026-09-27T07:24:55.408934Z",
+ "iopub.status.busy": "2026-09-27T07:24:55.408462Z",
+ "iopub.status.idle": "2026-09-27T07:24:55.446952Z",
+ "shell.execute_reply": "2026-09-27T07:24:55.446704Z"
+ },
+ "papermill": {
+ "duration": 0.048923,
+ "end_time": "2026-09-27T07:24:55.447058+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:24:55.398135+00:00",
+ "status": "completed"
+ },
+ "tags": []
},
"outputs": [
{
- "output_type": "stream",
"name": "stdout",
- "text": "Exercice à compléter\r\n"
+ "output_type": "stream",
+ "text": [
+ "Exercice à compléter\n"
+ ]
}
],
"source": [
@@ -972,17 +1338,27 @@
"id": "feaaab44",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-07-03T05:55:28.208918Z",
- "iopub.status.busy": "2026-07-03T05:55:28.207940Z",
- "iopub.status.idle": "2026-07-03T05:55:28.266798Z",
- "shell.execute_reply": "2026-07-03T05:55:28.266121Z"
- }
+ "iopub.execute_input": "2026-09-27T07:24:55.461965Z",
+ "iopub.status.busy": "2026-09-27T07:24:55.461493Z",
+ "iopub.status.idle": "2026-09-27T07:24:55.494719Z",
+ "shell.execute_reply": "2026-09-27T07:24:55.494471Z"
+ },
+ "papermill": {
+ "duration": 0.042937,
+ "end_time": "2026-09-27T07:24:55.494827+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:24:55.451890+00:00",
+ "status": "completed"
+ },
+ "tags": []
},
"outputs": [
{
- "output_type": "stream",
"name": "stdout",
- "text": "Exercice à compléter\r\n"
+ "output_type": "stream",
+ "text": [
+ "Exercice à compléter\n"
+ ]
}
],
"source": [
@@ -1010,7 +1386,16 @@
{
"cell_type": "markdown",
"id": "a2be939c",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.004955,
+ "end_time": "2026-09-27T07:24:55.505561+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:24:55.500606+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"## Conclusion\n",
"\n",
@@ -1045,6 +1430,23 @@
}
],
"metadata": {
+ "cost": {
+ "api_provider": "none",
+ "api_usd_est": 0.0,
+ "cpu_min": 2,
+ "external_account": "none",
+ "free_alternative": "self",
+ "gpu_min": 0,
+ "gpu_required": false,
+ "metadata_written": "2026-07-28",
+ "network": false,
+ "qcc_tokens_est": 0,
+ "reduced_pedagogical": null,
+ "reproducibility": "HIGH",
+ "validator": "manual",
+ "vram_gb": 0,
+ "vram_tier": "NONE"
+ },
"kernelspec": {
"display_name": ".NET (C#)",
"language": "C#",
@@ -1055,26 +1457,21 @@
"mimetype": "text/x-csharp",
"name": "C#",
"pygments_lexer": "csharp",
- "version": "12.0"
+ "version": "13.0"
},
- "cost": {
- "api_usd_est": 0.0,
- "api_provider": "none",
- "qcc_tokens_est": 0,
- "cpu_min": 2,
- "gpu_min": 0,
- "gpu_required": false,
- "vram_gb": 0,
- "vram_tier": "NONE",
- "network": false,
- "external_account": "none",
- "free_alternative": "self",
- "reduced_pedagogical": null,
- "reproducibility": "HIGH",
- "metadata_written": "2026-07-28",
- "validator": "manual"
+ "papermill": {
+ "default_parameters": {},
+ "duration": 27.314836,
+ "end_time": "2026-09-27T07:24:55.627673+00:00",
+ "environment_variables": {},
+ "exception": null,
+ "input_path": "CSP-5-Optimization-CSharp.ipynb",
+ "output_path": "CSP-5-Optimization-CSharp.ipynb",
+ "parameters": {},
+ "start_time": "2026-09-27T07:24:28.312837+00:00",
+ "version": "2.7.0"
}
},
"nbformat": 4,
"nbformat_minor": 5
-}
+}
\ No newline at end of file
diff --git a/MyIA.AI.Notebooks/Search/Part2-CSP/CSP-7-Soft-CSharp.ipynb b/MyIA.AI.Notebooks/Search/Part2-CSP/CSP-7-Soft-CSharp.ipynb
index f33286204a..3e299dcbb9 100644
--- a/MyIA.AI.Notebooks/Search/Part2-CSP/CSP-7-Soft-CSharp.ipynb
+++ b/MyIA.AI.Notebooks/Search/Part2-CSP/CSP-7-Soft-CSharp.ipynb
@@ -3,7 +3,16 @@
{
"cell_type": "markdown",
"id": "1d4bc7d4",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.005272,
+ "end_time": "2026-09-27T07:25:03.176873+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:03.171601+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"# CSP-7 : Contraintes Souples avec Choco-solver\n",
"\n",
@@ -33,11 +42,19 @@
"language": "csharp"
},
"execution": {
- "iopub.execute_input": "2026-08-21T16:07:42.320082Z",
- "iopub.status.busy": "2026-08-21T16:07:42.314404Z",
- "iopub.status.idle": "2026-08-21T16:07:43.802267Z",
- "shell.execute_reply": "2026-08-21T16:07:43.799973Z"
- }
+ "iopub.execute_input": "2026-09-27T07:25:03.202163Z",
+ "iopub.status.busy": "2026-09-27T07:25:03.193367Z",
+ "iopub.status.idle": "2026-09-27T07:25:05.404056Z",
+ "shell.execute_reply": "2026-09-27T07:25:05.397759Z"
+ },
+ "papermill": {
+ "duration": 2.222703,
+ "end_time": "2026-09-27T07:25:05.404247+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:03.181544+00:00",
+ "status": "completed"
+ },
+ "tags": []
},
"outputs": [
{
@@ -45,10 +62,11 @@
"text/html": [
"\r\n",
"
\r\n",
- "
\r\n",
+ "
\r\n",
" 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",
@@ -150,14 +176,14 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "DLL Choco trouvée : org.chocosolver.solver.dll\r\n"
+ "DLL Choco trouvée : org.chocosolver.solver.dll\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Existe : True\r\n"
+ "Existe : True\n"
]
}
],
@@ -191,11 +217,19 @@
"language": "csharp"
},
"execution": {
- "iopub.execute_input": "2026-08-21T16:07:43.803964Z",
- "iopub.status.busy": "2026-08-21T16:07:43.803732Z",
- "iopub.status.idle": "2026-08-21T16:07:45.769956Z",
- "shell.execute_reply": "2026-08-21T16:07:45.769718Z"
- }
+ "iopub.execute_input": "2026-09-27T07:25:05.417491Z",
+ "iopub.status.busy": "2026-09-27T07:25:05.417127Z",
+ "iopub.status.idle": "2026-09-27T07:25:05.996918Z",
+ "shell.execute_reply": "2026-09-27T07:25:05.996471Z"
+ },
+ "papermill": {
+ "duration": 0.587006,
+ "end_time": "2026-09-27T07:25:05.997069+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:05.410063+00:00",
+ "status": "completed"
+ },
+ "tags": []
},
"outputs": [
{
@@ -211,7 +245,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "IKVM 8.15.0 pret (home=ikvm-home-8.15.0-win-x64, tzdb=True) - Choco-solver charge\r\n"
+ "IKVM 8.15.0 pret (home=ikvm-home-8.15.0-linux-x64, tzdb=True) - Choco-solver charge\n"
]
}
],
@@ -219,16 +253,20 @@
"// Configuration IKVM 8.15.0 pour Choco-solver -- recette #4711 (IkvmCopyMerge recursif)\n",
"// Leve \"Could not locate ikvm home path\" : IKVM 8.15 lit AppContext[\"IKVM.Home\"], pas la variable\n",
"// d'environnement. On assemble le home complet (fusion image arch-independante any/any + native\n",
- "// win-x64) via copie RECURSIVE (la copie plate rate les sous-dossiers lib/ et tzdb.dat), AVANT\n",
+ "// de la plateforme) via copie RECURSIVE (la copie plate rate les sous-dossiers lib/ et tzdb.dat), AVANT\n",
"// tout premier appel Java (l'init JVM se declenche au premier type java.*, cellule suivante).\n",
"// See #4667, See #3801, See #4956.\n",
"#r \"nuget: IKVM, 8.15.0\"\n",
"#r \"nuget: IKVM.Image, 8.15.0\"\n",
- "#r \"nuget: IKVM.Image.runtime.win-x64, 8.15.0\"\n",
"\n",
"using System.IO;\n",
+ "using System.Runtime.InteropServices;\n",
"\n",
- "string ikvmVer = \"8.15.0\", ikvmRid = \"win-x64\";\n",
+ "// RID de la machine courante (win-x64, linux-x64, osx-arm64, ...) : le paquet IKVM.Image\n",
+ "// tire deja l'image native de chaque plateforme, il suffit de choisir la bonne.\n",
+ "string ikvmOs = OperatingSystem.IsWindows() ? \"win\" : OperatingSystem.IsMacOS() ? \"osx\" : \"linux\";\n",
+ "string ikvmRid = ikvmOs + \"-\" + RuntimeInformation.ProcessArchitecture.ToString().ToLowerInvariant();\n",
+ "string ikvmVer = \"8.15.0\";\n",
"string nugetRoot = Environment.GetEnvironmentVariable(\"NUGET_PACKAGES\")\n",
" ?? Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), \".nuget\", \"packages\");\n",
"string ikvmBaseAny = Path.Combine(nugetRoot, \"ikvm.image\", ikvmVer, \"ikvm\", \"any\", \"any\");\n",
@@ -251,7 +289,7 @@
"{\n",
" Directory.CreateDirectory(ikvmHome);\n",
" IkvmCopyMerge(ikvmBaseAny, ikvmHome); // classes Java + tzdb.dat (arch-independant)\n",
- " IkvmCopyMerge(ikvmArchDir, ikvmHome); // bibliotheques natives win-x64 (bin/ + lib/)\n",
+ " IkvmCopyMerge(ikvmArchDir, ikvmHome); // bibliotheques natives de la plateforme (bin/ + lib/)\n",
"}\n",
"AppContext.SetData(\"IKVM.Home\", ikvmHome);\n",
"\n",
@@ -268,18 +306,26 @@
"language": "csharp"
},
"execution": {
- "iopub.execute_input": "2026-08-21T16:07:45.771270Z",
- "iopub.status.busy": "2026-08-21T16:07:45.771048Z",
- "iopub.status.idle": "2026-08-21T16:07:46.055384Z",
- "shell.execute_reply": "2026-08-21T16:07:46.055024Z"
- }
+ "iopub.execute_input": "2026-09-27T07:25:06.018080Z",
+ "iopub.status.busy": "2026-09-27T07:25:06.017583Z",
+ "iopub.status.idle": "2026-09-27T07:25:06.086862Z",
+ "shell.execute_reply": "2026-09-27T07:25:06.086512Z"
+ },
+ "papermill": {
+ "duration": 0.081586,
+ "end_time": "2026-09-27T07:25:06.087024+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:06.005438+00:00",
+ "status": "completed"
+ },
+ "tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Choco-solver 4.10.17 chargé — WeightedSum + CostRegular disponibles\r\n"
+ "Choco-solver 4.10.17 chargé — WeightedSum + CostRegular disponibles\n"
]
}
],
@@ -300,7 +346,16 @@
{
"cell_type": "markdown",
"id": "d67a3cc6",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.006034,
+ "end_time": "2026-09-27T07:25:06.099123+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:06.093089+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"***\n",
"\n",
@@ -330,53 +385,61 @@
"language": "csharp"
},
"execution": {
- "iopub.execute_input": "2026-08-21T16:07:46.056904Z",
- "iopub.status.busy": "2026-08-21T16:07:46.056713Z",
- "iopub.status.idle": "2026-08-21T16:07:46.585194Z",
- "shell.execute_reply": "2026-08-21T16:07:46.584944Z"
- }
+ "iopub.execute_input": "2026-09-27T07:25:06.113136Z",
+ "iopub.status.busy": "2026-09-27T07:25:06.112826Z",
+ "iopub.status.idle": "2026-09-27T07:25:06.818956Z",
+ "shell.execute_reply": "2026-09-27T07:25:06.818744Z"
+ },
+ "papermill": {
+ "duration": 0.714285,
+ "end_time": "2026-09-27T07:25:06.819074+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:06.104789+00:00",
+ "status": "completed"
+ },
+ "tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Réunion optimale : créneau = 9h (index 0)\r\n"
+ "Réunion optimale : créneau = 9h (index 0)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Coût total = 1\r\n"
+ "Coût total = 1\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " Alice : coût = 0\r\n"
+ " Alice : coût = 0\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " Bob : coût = 1\r\n"
+ " Bob : coût = 1\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " Charlie : coût = 0\r\n"
+ " Charlie : coût = 0\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Temps résolution : 103 ms\r\n"
+ "Temps résolution : 154 ms\n"
]
}
],
@@ -447,7 +510,16 @@
{
"cell_type": "markdown",
"id": "de5a73dd",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.005387,
+ "end_time": "2026-09-27T07:25:06.831204+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:06.825817+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"**Interprétation** : Choco résout ce Weighted CSP en explorant les 5 créneaux et en propageant le coût de chaque participant. La contrainte `élément` permet d'indexer dynamiquement dans une matrice de coûts selon la valeur de la variable de décision. C'est l'équivalent natif de `cp_model.AddElement(table, index, cost)` en OR-Tools.\n",
"\n",
@@ -465,32 +537,40 @@
"language": "csharp"
},
"execution": {
- "iopub.execute_input": "2026-08-21T16:07:46.586738Z",
- "iopub.status.busy": "2026-08-21T16:07:46.586498Z",
- "iopub.status.idle": "2026-08-21T16:07:46.665388Z",
- "shell.execute_reply": "2026-08-21T16:07:46.665179Z"
- }
+ "iopub.execute_input": "2026-09-27T07:25:06.844909Z",
+ "iopub.status.busy": "2026-09-27T07:25:06.844627Z",
+ "iopub.status.idle": "2026-09-27T07:25:06.941163Z",
+ "shell.execute_reply": "2026-09-27T07:25:06.940939Z"
+ },
+ "papermill": {
+ "duration": 0.104992,
+ "end_time": "2026-09-27T07:25:06.941305+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:06.836313+00:00",
+ "status": "completed"
+ },
+ "tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Énumération des solutions (par coût croissant) :\r\n"
+ "Énumération des solutions (par coût croissant) :\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " Créneau 9h (idx 0) → coût total = 1\r\n"
+ " Créneau 9h (idx 0) → coût total = 1\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Total créneaux distincts : 1, coût optimal = 1\r\n"
+ "Total créneaux distincts : 1, coût optimal = 1\n"
]
}
],
@@ -532,7 +612,16 @@
{
"cell_type": "markdown",
"id": "ee6a1744",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.005645,
+ "end_time": "2026-09-27T07:25:06.952941+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:06.947296+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"**Interprétation** : Choco permet d'énumérer les solutions en **respectant l'ordre de l'objectif** lorsqu'on appelle `FindSolution` successivement après une optimisation. Cela produit les **Pareto-fronts** dans le cas multi-objectif.\n",
"\n",
@@ -550,39 +639,47 @@
"language": "csharp"
},
"execution": {
- "iopub.execute_input": "2026-08-21T16:07:46.666850Z",
- "iopub.status.busy": "2026-08-21T16:07:46.666652Z",
- "iopub.status.idle": "2026-08-21T16:07:46.770486Z",
- "shell.execute_reply": "2026-08-21T16:07:46.770246Z"
- }
+ "iopub.execute_input": "2026-09-27T07:25:06.968796Z",
+ "iopub.status.busy": "2026-09-27T07:25:06.968401Z",
+ "iopub.status.idle": "2026-09-27T07:25:07.130052Z",
+ "shell.execute_reply": "2026-09-27T07:25:07.129793Z"
+ },
+ "papermill": {
+ "duration": 0.169154,
+ "end_time": "2026-09-27T07:25:07.130165+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:06.961011+00:00",
+ "status": "completed"
+ },
+ "tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Sac multi-objectif résolu en 9 ms :\r\n"
+ "Sac multi-objectif résolu en 14 ms :\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " Coût pondéré = 0\r\n"
+ " Coût pondéré = 0\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " Poids total = 0 / 12\r\n"
+ " Poids total = 0 / 12\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " Coût total = 0\r\n"
+ " Coût total = 0\n"
]
},
{
@@ -621,7 +718,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "\r\n"
+ "\n"
]
}
],
@@ -697,7 +794,16 @@
{
"cell_type": "markdown",
"id": "d7865b08",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.005548,
+ "end_time": "2026-09-27T07:25:07.141686+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:07.136138+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"**Interprétation** : Le **ScalProd** (produit scalaire) est l'API native de Choco pour les **combinaisons linéaires pondérées**. Combiné avec `SetObjective`, il permet de modéliser des problèmes multi-objectifs où l'on cherche à minimiser `α·coût₁ + β·coût₂ + ...`.\n",
"\n",
@@ -707,7 +813,16 @@
{
"cell_type": "markdown",
"id": "6ef41c42",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.005474,
+ "end_time": "2026-09-27T07:25:07.152619+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:07.147145+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"***\n",
"\n",
@@ -727,32 +842,40 @@
"language": "csharp"
},
"execution": {
- "iopub.execute_input": "2026-08-21T16:07:46.771958Z",
- "iopub.status.busy": "2026-08-21T16:07:46.771759Z",
- "iopub.status.idle": "2026-08-21T16:07:46.851538Z",
- "shell.execute_reply": "2026-08-21T16:07:46.851298Z"
- }
+ "iopub.execute_input": "2026-09-27T07:25:07.166617Z",
+ "iopub.status.busy": "2026-09-27T07:25:07.166080Z",
+ "iopub.status.idle": "2026-09-27T07:25:07.271460Z",
+ "shell.execute_reply": "2026-09-27T07:25:07.271190Z"
+ },
+ "papermill": {
+ "duration": 0.113683,
+ "end_time": "2026-09-27T07:25:07.271635+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:07.157952+00:00",
+ "status": "completed"
+ },
+ "tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Séquence routage optimale : [0, 0, 0]\r\n"
+ "Séquence routage optimale : [0, 0, 0]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Coût total = 3\r\n"
+ "Coût total = 3\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Temps résolution : 3 ms\r\n"
+ "Temps résolution : 5 ms\n"
]
}
],
@@ -817,7 +940,16 @@
{
"cell_type": "markdown",
"id": "a53c98e9",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.00569,
+ "end_time": "2026-09-27T07:25:07.283720+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:07.278030+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"**Interprétation** : `CostRegular` est l'**équivalent pondéré** de `Regular` (automate de contrainte). Chaque transition de l'automate porte un coût, et Choco garantit que le coût total est minimisé lors de la recherche.\n",
"\n",
@@ -832,7 +964,16 @@
{
"cell_type": "markdown",
"id": "9021bac5",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.006522,
+ "end_time": "2026-09-27T07:25:07.295723+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:07.289201+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"***\n",
"\n",
@@ -852,39 +993,47 @@
"language": "csharp"
},
"execution": {
- "iopub.execute_input": "2026-08-21T16:07:46.853038Z",
- "iopub.status.busy": "2026-08-21T16:07:46.852837Z",
- "iopub.status.idle": "2026-08-21T16:07:46.937575Z",
- "shell.execute_reply": "2026-08-21T16:07:46.937181Z"
- }
+ "iopub.execute_input": "2026-09-27T07:25:07.317734Z",
+ "iopub.status.busy": "2026-09-27T07:25:07.317281Z",
+ "iopub.status.idle": "2026-09-27T07:25:07.447898Z",
+ "shell.execute_reply": "2026-09-27T07:25:07.447424Z"
+ },
+ "papermill": {
+ "duration": 0.143238,
+ "end_time": "2026-09-27T07:25:07.448056+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:07.304818+00:00",
+ "status": "completed"
+ },
+ "tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "SoftAllDifferent résolu en 1 ms :\r\n"
+ "SoftAllDifferent résolu en 2 ms :\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " Solution : [4, 1, 0, 3, 2]\r\n"
+ " Solution : [4, 1, 0, 3, 2]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " Coût de violation = 0\r\n"
+ " Coût de violation = 0\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " (Optimum = 0 si toutes les valeurs sont distinctes)\r\n"
+ " (Optimum = 0 si toutes les valeurs sont distinctes)\n"
]
}
],
@@ -938,7 +1087,16 @@
{
"cell_type": "markdown",
"id": "dc498b73",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.008711,
+ "end_time": "2026-09-27T07:25:07.465175+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:07.456464+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"**Interprétation** : Le pattern `reify + IfThenElse` permet de transformer une **contrainte** en **variable**, puis de conditionner un coût sur cette variable. C'est la primitive de base pour construire des contraintes souples en Choco.\n",
"\n",
@@ -948,7 +1106,16 @@
{
"cell_type": "markdown",
"id": "fix-10382-fuzzy-intro",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.006411,
+ "end_time": "2026-09-27T07:25:07.477970+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:07.471559+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"***## 4. Fuzzy CSP : degrés d'appartenance et combinaison min (~20 min)Le **Fuzzy CSP** relâche la dichotomie satisfaite/violée au profit de **degrés** dans $[0, 1]$ :- **1.0** : contrainte parfaitement satisfaite- **0.5** : contrainte partiellement satisfaite- **0.0** : contrainte complètement violéeLa satisfaction globale d'une instanciation est le **minimum** des degrés de toutes les contraintes (principe du « maillon le plus faible »). Le solveur cherche l'instanciation qui **maximise ce minimum** — c'est l'optimum d'équité max-min.### Exemple : planification de vacancesVariables :- **Destination** ∈ {Paris, Londres, Rome}- **Mois** ∈ {Juin, Juillet, Août}Trois contraintes floues :- **Préférence temporelle** : Juillet (1.0) > Août (0.7) > Juin (0.4)- **Préférence géographique** : Rome (1.0) > Paris (0.8) > Londres (0.3)- **Budget** : satisfaction = max(0, 1 − (cout − 1000) / 500) si 1000 ≤ cout ≤ 1500, 1.0 si cout ≤ 1000, 0.0 si cout > 1500 (dégressif entre 1000 et 1500 EUR, le seuil idéal est 1000 EUR)L'optimum doit combiner les trois — pas le meilleur mois tout seul ni la meilleure destination toute seule, mais la combinaison qui maximise le minimum des trois.### Encodage ChocoChoco n'a pas de primitive floue first-class, mais le pattern « variable de satisfaction + min + maximize » est idiomatique. On code :- deux `IntVar` pour les variables de décision (destination ∈ [1,3], mois ∈ [1,3])- trois `IntVar` ∈ [0, 1000] pour les degrés de satisfaction (encodage entier pour éviter les flottants en propagation)- un `IntVar` global_sat ∈ [0, 1000] forcé à être le **min** des trois degrés via `model.min(...)`- l'objectif : **maximiser** global_sat (`model.setObjective(true, globalSat)`)Les degrés sont attachés à la valeur de la variable par `model.element(sat, table, var)` où `table` est un tuple indexé par la valeur de la variable. Pour le budget, on linéarise la fonction d'appartenance avec un test sur la valeur de destination (coût moyen par destination : Paris=1200, Londres=1400, Rome=1100)."
]
@@ -959,53 +1126,61 @@
"id": "fix-10382-fuzzy-code",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-08-21T16:07:46.939151Z",
- "iopub.status.busy": "2026-08-21T16:07:46.938956Z",
- "iopub.status.idle": "2026-08-21T16:07:47.006963Z",
- "shell.execute_reply": "2026-08-21T16:07:47.006325Z"
- }
+ "iopub.execute_input": "2026-09-27T07:25:07.495773Z",
+ "iopub.status.busy": "2026-09-27T07:25:07.495276Z",
+ "iopub.status.idle": "2026-09-27T07:25:07.611473Z",
+ "shell.execute_reply": "2026-09-27T07:25:07.611056Z"
+ },
+ "papermill": {
+ "duration": 0.127455,
+ "end_time": "2026-09-27T07:25:07.611706+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:07.484251+00:00",
+ "status": "completed"
+ },
+ "tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "--- Fuzzy CSP : recherche de l'optimum max-min sur l'espace 3 destinations x 3 mois ---\r\n"
+ "--- Fuzzy CSP : recherche de l'optimum max-min sur l'espace 3 destinations x 3 mois ---\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "dest mois satM satD satB min (degres sur 1000)\r\n"
+ "dest mois satM satD satB min (degres sur 1000)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Rome Juillet 1000 1000 800 800\r\n"
+ "Rome Juillet 1000 1000 800 800\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "\r\n"
+ "\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "--- Meilleur max-min : Rome en Juillet (sat_min=800/1000) ---\r\n"
+ "--- Meilleur max-min : Rome en Juillet (sat_min=800/1000) ---\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "--- Encodage entier : 1000 = degré 1.0 (sat parfaite) ---\r\n"
+ "--- Encodage entier : 1000 = degré 1.0 (sat parfaite) ---\n"
]
}
],
@@ -1086,7 +1261,16 @@
{
"cell_type": "markdown",
"id": "semiring-md-1",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.010326,
+ "end_time": "2026-09-27T07:25:07.633483+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:07.623157+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"***\n",
"\n",
@@ -1114,16 +1298,49 @@
"cell_type": "code",
"execution_count": 10,
"id": "semiring-code-a",
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-09-27T07:25:07.648131Z",
+ "iopub.status.busy": "2026-09-27T07:25:07.647843Z",
+ "iopub.status.idle": "2026-09-27T07:25:07.883882Z",
+ "shell.execute_reply": "2026-09-27T07:25:07.883696Z"
+ },
+ "papermill": {
+ "duration": 0.244147,
+ "end_time": "2026-09-27T07:25:07.883990+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:07.639843+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Semi-anneaux definis : Boolean, Fuzzy, Weighted\r\n",
- "Fuzzy : Project(1.0, 0.7) = 0,7 (Top neutre), Combine(0.0, 0.7) = 0,7 (Bottom neutre)\r\n",
- "Weighted : Project(0.0, 5.0) = 5 (Top neutre), Combine(+inf, 5.0) = 5 (Bottom neutre)\r\n",
- "Boolean : Project(true, false) = False, Combine(false, false) = False\r\n"
+ "Semi-anneaux definis : Boolean, Fuzzy, Weighted\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Fuzzy : Project(1.0, 0.7) = 0.7 (Top neutre), Combine(0.0, 0.7) = 0.7 (Bottom neutre)\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Weighted : Project(0.0, 5.0) = 5 (Top neutre), Combine(+inf, 5.0) = 5 (Bottom neutre)\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Boolean : Project(true, false) = False, Combine(false, false) = False\n"
]
}
],
@@ -1176,7 +1393,16 @@
{
"cell_type": "markdown",
"id": "semiring-md-2",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.005999,
+ "end_time": "2026-09-27T07:25:07.897158+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:07.891159+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"### `SoftCsp
` : résolution générique sur n'importe quel semi-anneau\n",
"\n",
@@ -1189,23 +1415,98 @@
"cell_type": "code",
"execution_count": 11,
"id": "semiring-code-b",
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-09-27T07:25:07.912614Z",
+ "iopub.status.busy": "2026-09-27T07:25:07.912300Z",
+ "iopub.status.idle": "2026-09-27T07:25:08.233821Z",
+ "shell.execute_reply": "2026-09-27T07:25:08.233615Z"
+ },
+ "papermill": {
+ "duration": 0.330874,
+ "end_time": "2026-09-27T07:25:08.233933+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:07.903059+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "--- Fuzzy via semiring : enumeration des 9 combinaisons (degre = min des 3) ---\r\n",
- "Paris Juin degre = 0,4\r\n",
- "Paris Juillet degre = 0,6\r\n",
- "Paris Aout degre = 0,6\r\n",
- "Londres Juin degre = 0,2\r\n",
- "Londres Juillet degre = 0,2\r\n",
- "Londres Aout degre = 0,2\r\n",
- "Rome Juin degre = 0,4\r\n",
- "Rome Juillet degre = 0,8\r\n",
- "Rome Aout degre = 0,7\r\n",
- "Optimum semiring (brute force) : Rome en Juillet -> degre 0,8\r\n"
+ "--- Fuzzy via semiring : enumeration des 9 combinaisons (degre = min des 3) ---\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Paris Juin degre = 0.4\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Paris Juillet degre = 0.6\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Paris Aout degre = 0.6\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Londres Juin degre = 0.2\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Londres Juillet degre = 0.2\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Londres Aout degre = 0.2\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Rome Juin degre = 0.4\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Rome Juillet degre = 0.8\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Rome Aout degre = 0.7\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Optimum semiring (brute force) : Rome en Juillet -> degre 0.8\n"
]
}
],
@@ -1306,7 +1607,16 @@
{
"cell_type": "markdown",
"id": "semiring-md-3",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.011226,
+ "end_time": "2026-09-27T07:25:08.252474+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:08.241248+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"### Accord framework ↔ moteur Choco\n",
"\n",
@@ -1317,15 +1627,42 @@
"cell_type": "code",
"execution_count": 12,
"id": "semiring-code-c",
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-09-27T07:25:08.277805Z",
+ "iopub.status.busy": "2026-09-27T07:25:08.277522Z",
+ "iopub.status.idle": "2026-09-27T07:25:08.372823Z",
+ "shell.execute_reply": "2026-09-27T07:25:08.372487Z"
+ },
+ "papermill": {
+ "duration": 0.109116,
+ "end_time": "2026-09-27T07:25:08.372976+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:08.263860+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Framework semiring (brute force) : Rome en Juillet -> 0,8\r\n",
- "Moteur Choco (propagation max-min) : Rome en Juillet -> 0,8\r\n",
- "Accord exact framework vs moteur : True\r\n"
+ "Framework semiring (brute force) : Rome en Juillet -> 0.8\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Moteur Choco (propagation max-min) : Rome en Juillet -> 0.8\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Accord exact framework vs moteur : True\n"
]
}
],
@@ -1367,14 +1704,33 @@
{
"cell_type": "markdown",
"id": "semiring-md-4",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.009896,
+ "end_time": "2026-09-27T07:25:08.394800+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:08.384904+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"**Interprétation** : les deux voies trouvent indépendamment **Rome en Juillet, degré 0.8** — le min(1.0, 1.0, 0.8) du budget, exactement l'optimum de la section 4. Le framework sémiring (force brute, 9 combinaisons) et le moteur Choco (propagation de contraintes) sont **deux implémentations du même ordre de préférence** : le premier exhibe l'algèbre, le second la met à l'échelle. C'est la lecture .NET de la section 2 du jumeau Python — le semi-anneau n'est pas une abstraction décorative, c'est le dénominateur commun des sections 1 à 4.\n"
]
},
{
"cell_type": "markdown",
- "metadata": {},
+ "id": "f6efb288",
+ "metadata": {
+ "papermill": {
+ "duration": 0.010274,
+ "end_time": "2026-09-27T07:25:08.415853+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:08.405579+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"***\n",
"\n",
@@ -1390,35 +1746,183 @@
{
"cell_type": "code",
"execution_count": 13,
- "metadata": {},
+ "id": "60296aef",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-09-27T07:25:08.438790Z",
+ "iopub.status.busy": "2026-09-27T07:25:08.438240Z",
+ "iopub.status.idle": "2026-09-27T07:25:08.728897Z",
+ "shell.execute_reply": "2026-09-27T07:25:08.728507Z"
+ },
+ "papermill": {
+ "duration": 0.301616,
+ "end_time": "2026-09-27T07:25:08.729060+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:08.427444+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"outputs": [
{
+ "name": "stdout",
"output_type": "stream",
+ "text": [
+ "Configuration PC optimale (Choco, 12 ms)\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " CPU : Intel Core i5-12400 200 EUR score=70 Intel/Nvidia\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " Carte mere : MSI PRO B660M 130 EUR\n"
+ ]
+ },
+ {
"name": "stdout",
+ "output_type": "stream",
"text": [
- "Configuration PC optimale (Choco, 93 ms)\n",
- "\n",
- " CPU : Intel Core i5-12400 200 EUR score=70 Intel/Nvidia\n",
- " Carte mere : MSI PRO B660M 130 EUR\n",
- " GPU : RTX 3060 320 EUR score=75 Intel/Nvidia\n",
- " Alimentation: Corsair CV 550W 75 EUR 550W garantie 3 ans\n",
- " Boitier : NZXT H510 90 EUR noir\n",
- "\n",
- "=== Bilan ===\n",
- " Prix total : 815 EUR (budget 820) => OK\n",
- " Score total : 145 (min 145) => OK\n",
- " TDP total : 235W + 80W = 315W (alim 550W)\n",
- "\n",
- "Contraintes souples\n",
- " [STRONG] Budget : satisfaite\n",
- " [STRONG] Perf min : satisfaite\n",
- " [WEAK] Marque CPU : Intel/Nvidia (non prefere -- compromis budget/perf)\n",
- " [WEAK] Marque GPU : Intel/Nvidia (non prefere -- compromis budget/perf)\n",
- " [WEAK] Couleur : noir (prefere)\n",
- " [WEAK] Garantie : 3 ans (courte)\n",
- "\n",
- " Score objectif : 5 x 0 (strong) + 3 (weak) = 3\n",
- " Accord cross-moteurs : le jumeau Python (CP-SAT) trouve le meme objectif = 3 sur le meme catalogue."
+ " GPU : RTX 3060 320 EUR score=75 Intel/Nvidia\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " Alimentation: Corsair CV 550W 75 EUR 550W garantie 3 ans\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " Boitier : NZXT H510 90 EUR noir\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "=== Bilan ===\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " Prix total : 815 EUR (budget 820) => OK\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " Score total : 145 (min 145) => OK\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " TDP total : 235W + 80W = 315W (alim 550W)\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Contraintes souples\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " [STRONG] Budget : satisfaite\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " [STRONG] Perf min : satisfaite\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " [WEAK] Marque CPU : Intel/Nvidia (non prefere -- compromis budget/perf)\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " [WEAK] Marque GPU : Intel/Nvidia (non prefere -- compromis budget/perf)\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " [WEAK] Couleur : noir (prefere)\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " [WEAK] Garantie : 3 ans (courte)\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " Score objectif : 5 x 0 (strong) + 3 (weak) = 3\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " Accord cross-moteurs : le jumeau Python (CP-SAT) trouve le meme objectif = 3 sur le meme catalogue.\n"
]
}
],
@@ -1571,7 +2075,17 @@
},
{
"cell_type": "markdown",
- "metadata": {},
+ "id": "f6510b84",
+ "metadata": {
+ "papermill": {
+ "duration": 0.013821,
+ "end_time": "2026-09-27T07:25:08.757383+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:08.743562+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"**Interpretation** : accord **cross-moteurs** — Choco (Java/IKVM, propagation + branch-and-bound) et CP-SAT (Python, SAT-based) trouvent **le meme optimum objectif = 3** sur le meme catalogue : toutes les contraintes STRONG satisfaites (budget 815 <= 820, score 145 = 145), trois WEAK sacrifiees (marques CPU/GPU Intel/Nvidia, garantie 3 ans). C'est le budget serre qui force le compromis : a 820 EUR, la configuration 100% AMD preferee n'atteint pas le score STRONG — la hierarchie a arbitre exactement comme prevu : MANDATORY > STRONG > WEAK.\n",
"\n",
@@ -1583,7 +2097,17 @@
},
{
"cell_type": "markdown",
- "metadata": {},
+ "id": "0632e896",
+ "metadata": {
+ "papermill": {
+ "duration": 0.013267,
+ "end_time": "2026-09-27T07:25:08.784066+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:08.770799+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"### Exercice 4 : Station de travail a budget 1200 EUR\n",
"\n",
@@ -1603,17 +2127,57 @@
{
"cell_type": "code",
"execution_count": 14,
- "metadata": {},
+ "id": "597f231a",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-09-27T07:25:08.825144Z",
+ "iopub.status.busy": "2026-09-27T07:25:08.824833Z",
+ "iopub.status.idle": "2026-09-27T07:25:08.941749Z",
+ "shell.execute_reply": "2026-09-27T07:25:08.941586Z"
+ },
+ "papermill": {
+ "duration": 0.150124,
+ "end_time": "2026-09-27T07:25:08.941842+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:08.791718+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"outputs": [
{
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Exercice 4 a completer : adaptez la Configuration PC (section 6) au budget 1200 EUR.\n"
+ ]
+ },
+ {
+ "name": "stdout",
"output_type": "stream",
+ "text": [
+ "Etape 1 : definir le catalogue de composants (RAM et SSD deviennent des variables).\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Etape 2 : poster MANDATORY (compatibilite, alimentation), reifier STRONG puis WEAK.\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Etape 3 : objectif = M*strong + weak, M > |WEAK|, puis while (solverExo.solve()).\n"
+ ]
+ },
+ {
"name": "stdout",
+ "output_type": "stream",
"text": [
- "Exercice 4 a completer : adaptez la Configuration PC (section 6) au budget 1200 EUR.\n",
- "Etape 1 : definir le catalogue de composants (RAM et SSD deviennent des variables).\n",
- "Etape 2 : poster MANDATORY (compatibilite, alimentation), reifier STRONG puis WEAK.\n",
- "Etape 3 : objectif = M*strong + weak, M > |WEAK|, puis while (solverExo.solve()).\n",
- "Verifier en fin : la solution respecte le budget de 1200 EUR."
+ "Verifier en fin : la solution respecte le budget de 1200 EUR.\n"
]
}
],
@@ -1635,7 +2199,16 @@
{
"cell_type": "markdown",
"id": "71873b59",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.007679,
+ "end_time": "2026-09-27T07:25:08.957543+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:08.949864+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"***\n",
"\n",
@@ -1662,60 +2235,68 @@
"language": "csharp"
},
"execution": {
- "iopub.execute_input": "2026-08-21T16:07:47.008726Z",
- "iopub.status.busy": "2026-08-21T16:07:47.008522Z",
- "iopub.status.idle": "2026-08-21T16:07:47.049259Z",
- "shell.execute_reply": "2026-08-21T16:07:47.049115Z"
- }
+ "iopub.execute_input": "2026-09-27T07:25:08.975409Z",
+ "iopub.status.busy": "2026-09-27T07:25:08.975044Z",
+ "iopub.status.idle": "2026-09-27T07:25:09.011644Z",
+ "shell.execute_reply": "2026-09-27T07:25:09.011303Z"
+ },
+ "papermill": {
+ "duration": 0.046422,
+ "end_time": "2026-09-27T07:25:09.011750+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:08.965328+00:00",
+ "status": "completed"
+ },
+ "tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Exercice 1 - TSP pondéré : en attente de votre implementation\r\n"
+ "Exercice 1 - TSP pondéré : en attente de votre implementation\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Schema :\r\n"
+ "Schema :\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " int n = 5;\r\n"
+ " int n = 5;\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " int[,] dist = { {0,3,1,5,8}, ... };\r\n"
+ " int[,] dist = { {0,3,1,5,8}, ... };\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " double[] prixParKm = { 1.5, 1.2, 1.8, 1.3, 1.6 }; // par arête\r\n"
+ " double[] prixParKm = { 1.5, 1.2, 1.8, 1.3, 1.6 }; // par arête\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " // Objectif : sum( dist[i,succ[i]] * prixParKm[i,succ[i]] ) minimum\r\n"
+ " // Objectif : sum( dist[i,succ[i]] * prixParKm[i,succ[i]] ) minimum\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- " // Utiliser ScalProd avec termes par arête\r\n"
+ " // Utiliser ScalProd avec termes par arête\n"
]
}
],
@@ -1733,7 +2314,16 @@
{
"cell_type": "markdown",
"id": "94dedd70",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.008229,
+ "end_time": "2026-09-27T07:25:09.027978+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:09.019749+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"### Exercice 2 : Affectation de salles avec capacité souple\n",
"\n",
@@ -1757,32 +2347,40 @@
"language": "csharp"
},
"execution": {
- "iopub.execute_input": "2026-08-21T16:07:47.050670Z",
- "iopub.status.busy": "2026-08-21T16:07:47.050477Z",
- "iopub.status.idle": "2026-08-21T16:07:47.093976Z",
- "shell.execute_reply": "2026-08-21T16:07:47.093598Z"
- }
+ "iopub.execute_input": "2026-09-27T07:25:09.045735Z",
+ "iopub.status.busy": "2026-09-27T07:25:09.045484Z",
+ "iopub.status.idle": "2026-09-27T07:25:09.090902Z",
+ "shell.execute_reply": "2026-09-27T07:25:09.090715Z"
+ },
+ "papermill": {
+ "duration": 0.05551,
+ "end_time": "2026-09-27T07:25:09.091106+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:09.035596+00:00",
+ "status": "completed"
+ },
+ "tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Exercice 2 - 3 cours / 4 salles (capacités 30, 50, 20, 35)\r\n"
+ "Exercice 2 - 3 cours / 4 salles (capacités 30, 50, 20, 35)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "En attente de votre implementation\r\n"
+ "En attente de votre implementation\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Indices : element(coût_taille, table_pénalités, x_i) + sum + minimize\r\n"
+ "Indices : element(coût_taille, table_pénalités, x_i) + sum + minimize\n"
]
}
],
@@ -1800,7 +2398,16 @@
{
"cell_type": "markdown",
"id": "bbaedd17",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.007708,
+ "end_time": "2026-09-27T07:25:09.107403+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:09.099695+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"### Exercice 3 : Emploi du temps avec indisponibilités pondérées\n",
"\n",
@@ -1830,39 +2437,47 @@
"language": "csharp"
},
"execution": {
- "iopub.execute_input": "2026-08-21T16:07:47.095359Z",
- "iopub.status.busy": "2026-08-21T16:07:47.095162Z",
- "iopub.status.idle": "2026-08-21T16:07:47.140130Z",
- "shell.execute_reply": "2026-08-21T16:07:47.139770Z"
- }
+ "iopub.execute_input": "2026-09-27T07:25:09.124690Z",
+ "iopub.status.busy": "2026-09-27T07:25:09.124425Z",
+ "iopub.status.idle": "2026-09-27T07:25:09.175182Z",
+ "shell.execute_reply": "2026-09-27T07:25:09.174996Z"
+ },
+ "papermill": {
+ "duration": 0.060253,
+ "end_time": "2026-09-27T07:25:09.175337+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:09.115084+00:00",
+ "status": "completed"
+ },
+ "tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Exercice 3 - 4 cours sur 5 jours\r\n"
+ "Exercice 3 - 4 cours sur 5 jours\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Préférences : A(idéal), A(idéal), B(OK), B(OK), C(à éviter) (coûts 0, 0, 1, 1, 5)\r\n"
+ "Préférences : A(idéal), A(idéal), B(OK), B(OK), C(à éviter) (coûts 0, 0, 1, 1, 5)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "En attente de votre implementation\r\n"
+ "En attente de votre implementation\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Contraintes : allDifferent(days) + max 2 type C + minimise sum(coût_jour_i)\r\n"
+ "Contraintes : allDifferent(days) + max 2 type C + minimise sum(coût_jour_i)\n"
]
}
],
@@ -1882,7 +2497,16 @@
{
"cell_type": "markdown",
"id": "64337001",
- "metadata": {},
+ "metadata": {
+ "papermill": {
+ "duration": 0.007854,
+ "end_time": "2026-09-27T07:25:09.191691+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:09.183837+00:00",
+ "status": "completed"
+ },
+ "tags": []
+ },
"source": [
"***\n",
"\n",
@@ -1949,8 +2573,20 @@
"name": "C#",
"pygments_lexer": "csharp",
"version": "13.0"
+ },
+ "papermill": {
+ "default_parameters": {},
+ "duration": 8.834466,
+ "end_time": "2026-09-27T07:25:09.316530+00:00",
+ "environment_variables": {},
+ "exception": null,
+ "input_path": "CSP-7-Soft-CSharp.ipynb",
+ "output_path": "CSP-7-Soft-CSharp.ipynb",
+ "parameters": {},
+ "start_time": "2026-09-27T07:25:00.482064+00:00",
+ "version": "2.7.0"
}
},
"nbformat": 4,
"nbformat_minor": 5
-}
+}
\ No newline at end of file
diff --git a/MyIA.AI.Notebooks/Sudoku/Sudoku-11-Choco-Csharp.ipynb b/MyIA.AI.Notebooks/Sudoku/Sudoku-11-Choco-Csharp.ipynb
index e885c46b4d..8850b9f43f 100644
--- a/MyIA.AI.Notebooks/Sudoku/Sudoku-11-Choco-Csharp.ipynb
+++ b/MyIA.AI.Notebooks/Sudoku/Sudoku-11-Choco-Csharp.ipynb
@@ -5,10 +5,10 @@
"id": "09f280ec",
"metadata": {
"papermill": {
- "duration": 0.003264,
- "end_time": "2026-09-13T15:07:04.604264+00:00",
+ "duration": 0.004542,
+ "end_time": "2026-09-27T07:25:16.568692+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:04.601000+00:00",
+ "start_time": "2026-09-27T07:25:16.564150+00:00",
"status": "completed"
},
"tags": []
@@ -51,10 +51,10 @@
"id": "89ad3112",
"metadata": {
"papermill": {
- "duration": 0.002812,
- "end_time": "2026-09-13T15:07:04.612377+00:00",
+ "duration": 0.003586,
+ "end_time": "2026-09-27T07:25:16.576536+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:04.609565+00:00",
+ "start_time": "2026-09-27T07:25:16.572950+00:00",
"status": "completed"
},
"tags": []
@@ -69,8 +69,8 @@
"Le JAR Choco-solver a été pre-compilé en DLL .NET avec IKVM 8.15.0 :\n",
"- **org.chocosolver.solver.dll** : Choco-solver compilé (12 Mo)\n",
"\n",
- "Le runtime IKVM lui-même est charge via NuGet (paquets `IKVM`, `IKVM.Image`,\n",
- "`IKVM.Image.runtime.win-x64` en 8.15.0), ce qui évite d'epingler une version précise de\n",
+ "Le runtime IKVM lui-même est charge via NuGet (paquets `IKVM` et `IKVM.Image`\n",
+ "en 8.15.0, ce dernier tirant l'image native de chaque plateforme), ce qui évite d'epingler une version précise de\n",
"`System.Text.Json`.\n",
"\n",
"### Compilation de la DLL Choco\n",
@@ -91,16 +91,16 @@
"id": "c969154e",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-09-13T15:07:04.629922Z",
- "iopub.status.busy": "2026-09-13T15:07:04.623330Z",
- "iopub.status.idle": "2026-09-13T15:07:07.868690Z",
- "shell.execute_reply": "2026-09-13T15:07:07.865623Z"
+ "iopub.execute_input": "2026-09-27T07:25:16.600571Z",
+ "iopub.status.busy": "2026-09-27T07:25:16.591195Z",
+ "iopub.status.idle": "2026-09-27T07:25:19.961760Z",
+ "shell.execute_reply": "2026-09-27T07:25:19.957944Z"
},
"papermill": {
- "duration": 3.254144,
- "end_time": "2026-09-13T15:07:07.869433+00:00",
+ "duration": 3.381482,
+ "end_time": "2026-09-27T07:25:19.961930+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:04.615289+00:00",
+ "start_time": "2026-09-27T07:25:16.580448+00:00",
"status": "completed"
},
"tags": []
@@ -111,10 +111,11 @@
"text/html": [
"\r\n",
"\r\n",
- "
\r\n",
+ "
\r\n",
" 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",
@@ -216,21 +225,21 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Telechargement (optionnel) de choco-solver-4.10.17-jar-with-dependencies.jar depuis Maven...\r\n"
+ "Telechargement (optionnel) de choco-solver-4.10.17-jar-with-dependencies.jar depuis Maven...\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Telecharge: choco-solver-4.10.17-jar-with-dependencies.jar (11043898 bytes)\r\n"
+ "Telecharge: choco-solver-4.10.17-jar-with-dependencies.jar (11043898 bytes)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Repertoire de travail: Sudoku\r\n"
+ "Repertoire de travail: Sudoku\n"
]
}
],
@@ -294,7 +303,13 @@
"cell_type": "markdown",
"id": "c401b65f",
"metadata": {
- "papermill": {},
+ "papermill": {
+ "duration": 0.003978,
+ "end_time": "2026-09-27T07:25:19.970740+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:19.966762+00:00",
+ "status": "completed"
+ },
"tags": []
},
"source": [
@@ -308,10 +323,10 @@
"id": "40cc7900",
"metadata": {
"papermill": {
- "duration": 0.003334,
- "end_time": "2026-09-13T15:07:07.876533+00:00",
+ "duration": 0.003992,
+ "end_time": "2026-09-27T07:25:19.978715+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:07.873199+00:00",
+ "start_time": "2026-09-27T07:25:19.974723+00:00",
"status": "completed"
},
"tags": []
@@ -329,16 +344,16 @@
"language": "csharp"
},
"execution": {
- "iopub.execute_input": "2026-09-13T15:07:07.885030Z",
- "iopub.status.busy": "2026-09-13T15:07:07.884827Z",
- "iopub.status.idle": "2026-09-13T15:07:09.770421Z",
- "shell.execute_reply": "2026-09-13T15:07:09.770225Z"
+ "iopub.execute_input": "2026-09-27T07:25:19.989070Z",
+ "iopub.status.busy": "2026-09-27T07:25:19.988822Z",
+ "iopub.status.idle": "2026-09-27T07:25:20.505267Z",
+ "shell.execute_reply": "2026-09-27T07:25:20.504990Z"
},
"papermill": {
- "duration": 1.890557,
- "end_time": "2026-09-13T15:07:09.770504+00:00",
+ "duration": 0.522647,
+ "end_time": "2026-09-27T07:25:20.505456+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:07.879947+00:00",
+ "start_time": "2026-09-27T07:25:19.982809+00:00",
"status": "completed"
},
"tags": [],
@@ -360,7 +375,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "IKVM 8.15.0 pret (home=ikvm-home-8.15.0-win-x64, tzdb=True) - Choco-solver charge\r\n"
+ "IKVM 8.15.0 pret (home=ikvm-home-8.15.0-linux-x64, tzdb=True) - Choco-solver charge\n"
]
}
],
@@ -372,15 +387,19 @@
"// qui epinglaient 8.0.0.5), ce qui laisse le kernel resoudre une version compatible.\n",
"// 2. \"Could not locate ikvm home path\" : IKVM 8.15 ne consulte PAS la variable d'env IKVM_HOME ;\n",
"// il lit AppContext[\"IKVM.Home\"]. On assemble le home complet (fusion de l'image arch-independante\n",
- "// any/any -- classes + tzdb.dat -- et de l'image native win-x64) puis on le déclare via AppContext,\n",
+ "// any/any -- classes + tzdb.dat -- et de l'image native de la plateforme) puis on le déclare via AppContext,\n",
"// AVANT tout premier appel Java (l'init de la JVM se declenche au premier type java.*, en cellule suivante).\n",
"#r \"nuget: IKVM, 8.15.0\"\n",
"#r \"nuget: IKVM.Image, 8.15.0\"\n",
- "#r \"nuget: IKVM.Image.runtime.win-x64, 8.15.0\"\n",
"\n",
"using System.IO;\n",
+ "using System.Runtime.InteropServices;\n",
"\n",
- "string ikvmVer = \"8.15.0\", ikvmRid = \"win-x64\";\n",
+ "// RID de la machine courante (win-x64, linux-x64, osx-arm64, ...) : le paquet IKVM.Image\n",
+ "// tire deja l'image native de chaque plateforme, il suffit de choisir la bonne.\n",
+ "string ikvmOs = OperatingSystem.IsWindows() ? \"win\" : OperatingSystem.IsMacOS() ? \"osx\" : \"linux\";\n",
+ "string ikvmRid = ikvmOs + \"-\" + RuntimeInformation.ProcessArchitecture.ToString().ToLowerInvariant();\n",
+ "string ikvmVer = \"8.15.0\";\n",
"string nugetRoot = Environment.GetEnvironmentVariable(\"NUGET_PACKAGES\")\n",
" ?? Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), \".nuget\", \"packages\");\n",
"string ikvmBaseAny = Path.Combine(nugetRoot, \"ikvm.image\", ikvmVer, \"ikvm\", \"any\", \"any\");\n",
@@ -403,7 +422,7 @@
"{\n",
" Directory.CreateDirectory(ikvmHome);\n",
" IkvmCopyMerge(ikvmBaseAny, ikvmHome); // classes Java + tzdb.dat (arch-independant)\n",
- " IkvmCopyMerge(ikvmArchDir, ikvmHome); // bibliotheques natives win-x64 (bin/ + lib/)\n",
+ " IkvmCopyMerge(ikvmArchDir, ikvmHome); // bibliotheques natives de la plateforme (bin/ + lib/)\n",
"}\n",
"AppContext.SetData(\"IKVM.Home\", ikvmHome);\n",
"\n",
@@ -415,13 +434,19 @@
"cell_type": "markdown",
"id": "c92f7e86",
"metadata": {
- "papermill": {},
+ "papermill": {
+ "duration": 0.004171,
+ "end_time": "2026-09-27T07:25:20.514225+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:20.510054+00:00",
+ "status": "completed"
+ },
"tags": []
},
"source": [
"### Lecture de la disponibilité IKVM : les deux verrous, levés\n",
"\n",
- "`IKVM 8.15.0 pret (home=ikvm-home-8.15.0-win-x64, tzdb=True)` condense la résolution des deux blocages historiques documentés plus bas (note technique de la section 3). **`tzdb=True`** : la base des fuseaux horaires Java (`tzdb.dat`) est chargée — sans elle, toute initialisation de la machine virtuelle Java échoue silencieusement ou avec une erreur cryptique. **`home=ikvm-home-8.15.0-win-x64`** : IKVM 8.15 ne lit pas la variable d'environnement `IKVM_HOME` mais `AppContext[\"IKVM.Home\"]` ; la cellule de configuration a assemblé ce home complet (fusion de l'image arch-indépendante et de l'image native `win-x64`) et l'a déclaré **avant tout premier appel Java** — l'ordre est obligatoire, car la JVM s'initialise une seule fois."
+ "`IKVM 8.15.0 pret (home=ikvm-home-8.15.0-
, tzdb=True)` condense la résolution des deux blocages historiques documentés plus bas (note technique de la section 3). **`tzdb=True`** : la base des fuseaux horaires Java (`tzdb.dat`) est chargée — sans elle, toute initialisation de la machine virtuelle Java échoue silencieusement ou avec une erreur cryptique. **`home=ikvm-home-8.15.0-`** (`` : `win-x64`, `linux-x64` ou `osx-arm64` selon la machine) : IKVM 8.15 ne lit pas la variable d'environnement `IKVM_HOME` mais `AppContext[\"IKVM.Home\"]` ; la cellule de configuration a assemblé ce home complet (fusion de l'image arch-indépendante et de l'image native de la plateforme) et l'a déclaré **avant tout premier appel Java** — l'ordre est obligatoire, car la JVM s'initialise une seule fois."
]
},
{
@@ -429,10 +454,10 @@
"id": "94ca1b2a",
"metadata": {
"papermill": {
- "duration": 0.004715,
- "end_time": "2026-09-13T15:07:09.778931+00:00",
+ "duration": 0.004737,
+ "end_time": "2026-09-27T07:25:20.528058+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:09.774216+00:00",
+ "start_time": "2026-09-27T07:25:20.523321+00:00",
"status": "completed"
},
"tags": []
@@ -447,16 +472,16 @@
"id": "14393b19",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-09-13T15:07:09.786996Z",
- "iopub.status.busy": "2026-09-13T15:07:09.786786Z",
- "iopub.status.idle": "2026-09-13T15:07:10.099131Z",
- "shell.execute_reply": "2026-09-13T15:07:10.098979Z"
+ "iopub.execute_input": "2026-09-27T07:25:20.539056Z",
+ "iopub.status.busy": "2026-09-27T07:25:20.538741Z",
+ "iopub.status.idle": "2026-09-27T07:25:20.651436Z",
+ "shell.execute_reply": "2026-09-27T07:25:20.650988Z"
},
"papermill": {
- "duration": 0.316802,
- "end_time": "2026-09-13T15:07:10.099213+00:00",
+ "duration": 0.11938,
+ "end_time": "2026-09-27T07:25:20.651681+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:09.782411+00:00",
+ "start_time": "2026-09-27T07:25:20.532301+00:00",
"status": "completed"
},
"tags": []
@@ -466,7 +491,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Choco-solver via IKVM 8.15.0 - Pret pour resolution Sudoku\r\n"
+ "Choco-solver via IKVM 8.15.0 - Pret pour resolution Sudoku\n"
]
}
],
@@ -496,14 +521,19 @@
"cell_type": "markdown",
"id": "cfde5f67",
"metadata": {
- "papermill": {},
+ "papermill": {
+ "duration": 0.007231,
+ "end_time": "2026-09-27T07:25:20.667075+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:20.659844+00:00",
+ "status": "completed"
+ },
"tags": []
},
"source": [
"### Ce que « prêt pour résolution » signifie\n",
"\n",
- "À ce point, les espaces de noms Java de Choco sont importés dans le kernel .NET : la suite du notebook peut instancier `Model`, `IntVar`, `Constraint` comme s'ils étaient des classes C#. C'est le pont IKVM : chaque objet Java est manipulé via un proxy .NET, les appels traversent la frontière à chaque méthode — le coût de ce marshaling fera partie des 473 ms mesurés en section 3, et il est indissociable de la résolution elle-même sur cette architecture.",
- "\n",
+ "À ce point, les espaces de noms Java de Choco sont importés dans le kernel .NET : la suite du notebook peut instancier `Model`, `IntVar`, `Constraint` comme s'ils étaient des classes C#. C'est le pont IKVM : chaque objet Java est manipulé via un proxy .NET, les appels traversent la frontière à chaque méthode — le coût de ce marshaling fera partie du temps de résolution mesuré en section 3, et il est indissociable de la résolution elle-même sur cette architecture.\n",
"Ce pont est aussi ce qui distingue ce notebook de ses cousins Python de la série : ici, le solveur n'est ni réimplémenté ni appelé par script — il vit **dans** le kernel, inspectable au point d'arrêt comme toute classe .NET.\n"
]
},
@@ -512,10 +542,10 @@
"id": "dd052198",
"metadata": {
"papermill": {
- "duration": 0.003124,
- "end_time": "2026-09-13T15:07:10.105841+00:00",
+ "duration": 0.004419,
+ "end_time": "2026-09-27T07:25:20.676976+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:10.102717+00:00",
+ "start_time": "2026-09-27T07:25:20.672557+00:00",
"status": "completed"
},
"tags": []
@@ -530,16 +560,16 @@
"id": "d7aa0870",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-09-13T15:07:10.113272Z",
- "iopub.status.busy": "2026-09-13T15:07:10.113087Z",
- "iopub.status.idle": "2026-09-13T15:07:16.928141Z",
- "shell.execute_reply": "2026-09-13T15:07:16.927950Z"
+ "iopub.execute_input": "2026-09-27T07:25:20.687726Z",
+ "iopub.status.busy": "2026-09-27T07:25:20.687292Z",
+ "iopub.status.idle": "2026-09-27T07:25:29.639906Z",
+ "shell.execute_reply": "2026-09-27T07:25:29.639479Z"
},
"papermill": {
- "duration": 6.819248,
- "end_time": "2026-09-13T15:07:16.928254+00:00",
+ "duration": 8.958922,
+ "end_time": "2026-09-27T07:25:29.640035+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:10.109006+00:00",
+ "start_time": "2026-09-27T07:25:20.681113+00:00",
"status": "completed"
},
"tags": []
@@ -591,7 +621,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "SudokuGrid defini.\r\n"
+ "SudokuGrid defini.\n"
]
},
{
@@ -636,7 +666,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "ISudokuSolver defini.\r\n"
+ "ISudokuSolver defini.\n"
]
},
{
@@ -684,7 +714,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "SudokuHelper defini.\r\n"
+ "SudokuHelper defini.\n"
]
},
{
@@ -698,7 +728,7 @@
"|--------|--------|---------------|\n",
"| `GetSudokus()` | 51/95/100 grilles | Trois niveaux de difficulté (Easy/Medium/Hard) |\n",
"| `TestSolvers()` | Performance multi-solveurs | Exécution parallèle avec timeout |\n",
- "| `DisplayResults()` | Graphiques Plotly.NET | Visualisation des temps de résolution |\n",
+ "| `DisplayResults()` | Graphiques SVG inline (SvgChartHelper) | Comparaison des temps par difficulté, sérialisée dans le notebook |\n",
"| `SolveSudoku()` | Test unitaire | Résolution individuelle avec affichage |\n",
"\n",
"**Points clés** :\n",
@@ -738,7 +768,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Exercice a completer\r\n"
+ "Exercice a completer\n"
]
},
{
@@ -746,7 +776,7 @@
"text/markdown": [
"## Résumé et perspectives\n",
"\n",
- "Ce notebook a posé les fondations de toute la série Sudoku en définissant trois composants essentiels. La classe `SudokuGrid` encapsule la représentation d'une grille 9x9 avec le pré-calcul des voisins (`AllNeighbours`, `CellNeighbours`), ce qui évite les recalculs coûteux lors de la résolution. L'interface `ISudokuSolver` implante le pattern Stratégie, permettant de permuter les algorithmes de résolution sans modifier le code client. Enfin, la classe `SudokuHelper` fournit une infrastructure de benchmark complète avec chargement de puzzles, mesures de performance et visualisation Plotly.NET.\n",
+ "Ce notebook a posé les fondations de toute la série Sudoku en définissant trois composants essentiels. La classe `SudokuGrid` encapsule la représentation d'une grille 9x9 avec le pré-calcul des voisins (`AllNeighbours`, `CellNeighbours`), ce qui évite les recalculs coûteux lors de la résolution. L'interface `ISudokuSolver` implante le pattern Stratégie, permettant de permuter les algorithmes de résolution sans modifier le code client. Enfin, la classe `SudokuHelper` fournit une infrastructure de benchmark complète avec chargement de puzzles, mesures de performance et visualisation SVG inline (SvgChartHelper, zéro dépendance).\n",
"\n",
"L'infrastructure de test (`TestSolvers`, `DisplayResults`) permet de comparer objectivement les solveurs sur trois niveaux de difficulté (Easy, Medium, Hard) avec gestion des timeouts et des disqualifications. Ce cadre de benchmark sera utilisé dans tous les notebooks suivants pour mesurer les performances de chaque algorithme.\n",
"\n",
@@ -767,10 +797,10 @@
"id": "39592b3b",
"metadata": {
"papermill": {
- "duration": 0.005662,
- "end_time": "2026-09-13T15:07:16.940001+00:00",
+ "duration": 0.004877,
+ "end_time": "2026-09-27T07:25:29.650465+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:16.934339+00:00",
+ "start_time": "2026-09-27T07:25:29.645588+00:00",
"status": "completed"
},
"tags": []
@@ -786,10 +816,10 @@
"id": "d263b3d3",
"metadata": {
"papermill": {
- "duration": 0.006692,
- "end_time": "2026-09-13T15:07:16.952746+00:00",
+ "duration": 0.004767,
+ "end_time": "2026-09-27T07:25:29.659976+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:16.946054+00:00",
+ "start_time": "2026-09-27T07:25:29.655209+00:00",
"status": "completed"
},
"tags": []
@@ -811,16 +841,16 @@
"id": "785014a2",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-09-13T15:07:16.966380Z",
- "iopub.status.busy": "2026-09-13T15:07:16.966019Z",
- "iopub.status.idle": "2026-09-13T15:07:17.005370Z",
- "shell.execute_reply": "2026-09-13T15:07:17.005116Z"
+ "iopub.execute_input": "2026-09-27T07:25:29.671400Z",
+ "iopub.status.busy": "2026-09-27T07:25:29.671121Z",
+ "iopub.status.idle": "2026-09-27T07:25:29.702363Z",
+ "shell.execute_reply": "2026-09-27T07:25:29.702130Z"
},
"papermill": {
- "duration": 0.046623,
- "end_time": "2026-09-13T15:07:17.005505+00:00",
+ "duration": 0.037983,
+ "end_time": "2026-09-27T07:25:29.702483+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:16.958882+00:00",
+ "start_time": "2026-09-27T07:25:29.664500+00:00",
"status": "completed"
},
"tags": []
@@ -845,16 +875,16 @@
"language": "csharp"
},
"execution": {
- "iopub.execute_input": "2026-09-13T15:07:17.019816Z",
- "iopub.status.busy": "2026-09-13T15:07:17.019540Z",
- "iopub.status.idle": "2026-09-13T15:07:17.106165Z",
- "shell.execute_reply": "2026-09-13T15:07:17.105846Z"
+ "iopub.execute_input": "2026-09-27T07:25:29.725097Z",
+ "iopub.status.busy": "2026-09-27T07:25:29.724832Z",
+ "iopub.status.idle": "2026-09-27T07:25:29.807910Z",
+ "shell.execute_reply": "2026-09-27T07:25:29.807587Z"
},
"papermill": {
- "duration": 0.094836,
- "end_time": "2026-09-13T15:07:17.106308+00:00",
+ "duration": 0.093121,
+ "end_time": "2026-09-27T07:25:29.808026+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:17.011472+00:00",
+ "start_time": "2026-09-27T07:25:29.714905+00:00",
"status": "completed"
},
"tags": [],
@@ -867,7 +897,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "ChocoSimpleSolver defini.\r\n"
+ "ChocoSimpleSolver defini.\n"
]
}
],
@@ -958,10 +988,10 @@
"id": "a5cb857e",
"metadata": {
"papermill": {
- "duration": 0.00944,
- "end_time": "2026-09-13T15:07:17.124073+00:00",
+ "duration": 0.005055,
+ "end_time": "2026-09-27T07:25:29.819254+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:17.114633+00:00",
+ "start_time": "2026-09-27T07:25:29.814199+00:00",
"status": "completed"
},
"tags": []
@@ -984,16 +1014,16 @@
"language": "csharp"
},
"execution": {
- "iopub.execute_input": "2026-09-13T15:07:17.140586Z",
- "iopub.status.busy": "2026-09-13T15:07:17.140129Z",
- "iopub.status.idle": "2026-09-13T15:07:17.234074Z",
- "shell.execute_reply": "2026-09-13T15:07:17.233777Z"
+ "iopub.execute_input": "2026-09-27T07:25:29.833118Z",
+ "iopub.status.busy": "2026-09-27T07:25:29.832850Z",
+ "iopub.status.idle": "2026-09-27T07:25:29.955557Z",
+ "shell.execute_reply": "2026-09-27T07:25:29.954852Z"
},
"papermill": {
- "duration": 0.102622,
- "end_time": "2026-09-13T15:07:17.234190+00:00",
+ "duration": 0.131698,
+ "end_time": "2026-09-27T07:25:29.955721+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:17.131568+00:00",
+ "start_time": "2026-09-27T07:25:29.824023+00:00",
"status": "completed"
},
"tags": [],
@@ -1006,7 +1036,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "ChocoSolverVariableSelector defini avec strategie FirstFail.\r\n"
+ "ChocoSolverVariableSelector defini avec strategie FirstFail.\n"
]
}
],
@@ -1234,7 +1264,13 @@
"cell_type": "markdown",
"id": "b0e4d724",
"metadata": {
- "papermill": {},
+ "papermill": {
+ "duration": 0.005073,
+ "end_time": "2026-09-27T07:25:29.966638+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:29.961565+00:00",
+ "status": "completed"
+ },
"tags": []
},
"source": [
@@ -1248,10 +1284,10 @@
"id": "937a956a",
"metadata": {
"papermill": {
- "duration": 0.007882,
- "end_time": "2026-09-13T15:07:17.248066+00:00",
+ "duration": 0.004917,
+ "end_time": "2026-09-27T07:25:29.976229+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:17.240184+00:00",
+ "start_time": "2026-09-27T07:25:29.971312+00:00",
"status": "completed"
},
"tags": []
@@ -1266,7 +1302,7 @@
"> une version compatible.\n",
"> 2. **Home IKVM introuvable** : IKVM 8.15 ne lit pas la variable d'environnement `IKVM_HOME` mais\n",
"> `AppContext[\"IKVM.Home\"]`. La cellule de configuration assemble le home complet (fusion de\n",
- "> l'image arch-independante et de l'image native `win-x64`, incluant `tzdb.dat`) puis le déclarer\n",
+ "> l'image arch-independante et de l'image native de la plateforme, incluant `tzdb.dat`) puis le déclarer\n",
"> via `AppContext.SetData`, avant tout premier appel Java.\n",
">\n",
"> **Statut** : la résolution ci-dessous produit une vraie solution Sudoku calculee par Choco-solver."
@@ -1277,10 +1313,10 @@
"id": "65b6619c",
"metadata": {
"papermill": {
- "duration": 0.006269,
- "end_time": "2026-09-13T15:07:17.260606+00:00",
+ "duration": 0.005012,
+ "end_time": "2026-09-27T07:25:29.985838+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:17.254337+00:00",
+ "start_time": "2026-09-27T07:25:29.980826+00:00",
"status": "completed"
},
"tags": []
@@ -1294,10 +1330,10 @@
"id": "273c3bf7",
"metadata": {
"papermill": {
- "duration": 0.006706,
- "end_time": "2026-09-13T15:07:17.273699+00:00",
+ "duration": 0.004575,
+ "end_time": "2026-09-27T07:25:29.995052+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:17.266993+00:00",
+ "start_time": "2026-09-27T07:25:29.990477+00:00",
"status": "completed"
},
"tags": []
@@ -1319,16 +1355,16 @@
"id": "9cf567cf",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-09-13T15:07:17.289414Z",
- "iopub.status.busy": "2026-09-13T15:07:17.289001Z",
- "iopub.status.idle": "2026-09-13T15:07:17.333980Z",
- "shell.execute_reply": "2026-09-13T15:07:17.333736Z"
+ "iopub.execute_input": "2026-09-27T07:25:30.007220Z",
+ "iopub.status.busy": "2026-09-27T07:25:30.006736Z",
+ "iopub.status.idle": "2026-09-27T07:25:30.041208Z",
+ "shell.execute_reply": "2026-09-27T07:25:30.040964Z"
},
"papermill": {
- "duration": 0.05323,
- "end_time": "2026-09-13T15:07:17.334088+00:00",
+ "duration": 0.04157,
+ "end_time": "2026-09-27T07:25:30.041317+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:17.280858+00:00",
+ "start_time": "2026-09-27T07:25:29.999747+00:00",
"status": "completed"
},
"tags": []
@@ -1353,16 +1389,16 @@
"language": "csharp"
},
"execution": {
- "iopub.execute_input": "2026-09-13T15:07:17.346315Z",
- "iopub.status.busy": "2026-09-13T15:07:17.346077Z",
- "iopub.status.idle": "2026-09-13T15:07:17.400982Z",
- "shell.execute_reply": "2026-09-13T15:07:17.400785Z"
+ "iopub.execute_input": "2026-09-27T07:25:30.055056Z",
+ "iopub.status.busy": "2026-09-27T07:25:30.054587Z",
+ "iopub.status.idle": "2026-09-27T07:25:30.094994Z",
+ "shell.execute_reply": "2026-09-27T07:25:30.094770Z"
},
"papermill": {
- "duration": 0.06144,
- "end_time": "2026-09-13T15:07:17.401076+00:00",
+ "duration": 0.0483,
+ "end_time": "2026-09-27T07:25:30.095112+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:17.339636+00:00",
+ "start_time": "2026-09-27T07:25:30.046812+00:00",
"status": "completed"
},
"tags": [],
@@ -1375,7 +1411,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Puzzle initial:\r\n"
+ "Puzzle initial:\n"
]
},
{
@@ -1394,7 +1430,7 @@
"| 2 4 | 5 3 | 6 | \n",
"| 7 5 | 2 | 3 4 | \n",
"| 8 | 4 1 | 9 5 | \n",
- "-------------------------------\r\n"
+ "-------------------------------\n"
]
}
],
@@ -1421,7 +1457,13 @@
"cell_type": "markdown",
"id": "7c975dc1",
"metadata": {
- "papermill": {},
+ "papermill": {
+ "duration": 0.00534,
+ "end_time": "2026-09-27T07:25:30.106285+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:30.100945+00:00",
+ "status": "completed"
+ },
"tags": []
},
"source": [
@@ -1438,10 +1480,10 @@
"id": "c06ed19b",
"metadata": {
"papermill": {
- "duration": 0.005765,
- "end_time": "2026-09-13T15:07:17.412745+00:00",
+ "duration": 0.005538,
+ "end_time": "2026-09-27T07:25:30.117095+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:17.406980+00:00",
+ "start_time": "2026-09-27T07:25:30.111557+00:00",
"status": "completed"
},
"tags": []
@@ -1459,16 +1501,16 @@
"language": "csharp"
},
"execution": {
- "iopub.execute_input": "2026-09-13T15:07:17.425150Z",
- "iopub.status.busy": "2026-09-13T15:07:17.424834Z",
- "iopub.status.idle": "2026-09-13T15:07:17.970112Z",
- "shell.execute_reply": "2026-09-13T15:07:17.969832Z"
+ "iopub.execute_input": "2026-09-27T07:25:30.130257Z",
+ "iopub.status.busy": "2026-09-27T07:25:30.129889Z",
+ "iopub.status.idle": "2026-09-27T07:25:30.545461Z",
+ "shell.execute_reply": "2026-09-27T07:25:30.545280Z"
},
"papermill": {
- "duration": 0.551766,
- "end_time": "2026-09-13T15:07:17.970244+00:00",
+ "duration": 0.423381,
+ "end_time": "2026-09-27T07:25:30.545612+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:17.418478+00:00",
+ "start_time": "2026-09-27T07:25:30.122231+00:00",
"status": "completed"
},
"tags": [],
@@ -1482,7 +1524,7 @@
"output_type": "stream",
"text": [
"\n",
- "Solution trouvee en 473 ms:\r\n"
+ "Solution trouvee en 356 ms:\n"
]
},
{
@@ -1501,7 +1543,7 @@
"| 2 4 9 | 5 3 8 | 6 1 7 | \n",
"| 7 1 5 | 2 9 6 | 3 8 4 | \n",
"| 6 8 3 | 7 4 1 | 9 5 2 | \n",
- "-------------------------------\r\n"
+ "-------------------------------\n"
]
}
],
@@ -1521,18 +1563,24 @@
"cell_type": "markdown",
"id": "db3c671e",
"metadata": {
- "papermill": {},
+ "papermill": {
+ "duration": 0.005426,
+ "end_time": "2026-09-27T07:25:30.557220+00:00",
+ "exception": false,
+ "start_time": "2026-09-27T07:25:30.551794+00:00",
+ "status": "completed"
+ },
"tags": []
},
"source": [
- "### Lecture de la solution : 473 ms, toutes contraintes honorées\n",
+ "### Lecture de la solution : quelques centaines de millisecondes, toutes contraintes honorées\n",
"\n",
"La grille complétée respecte chacun des 45 indices (vérifiez la première ligne : 9 et 2 en place, le 5 central, 4 et 3 en fin — rien n'a bougé), et chaque ligne, colonne et bloc contient 1-9 exactement une fois : c'est la définition même de la solution, et Choco la certifie par construction (le modèle **déclare** ces contraintes, il ne les vérifie pas a posteriori).\n",
"\n",
- "Que mesure **473 ms** ? Sur l'architecture IKVM, bien plus que la recherche pure : cette première résolution inclut le chargement des classes Java du solveur, la compilation JIT du code Choco et le marshaling .NET-à-Java de chaque appel. Un second appel dans la même session serait sensiblement plus rapide — c'est le coût d'amorçage typique d'un solveur hébergé. Le solveur utilisé ici est l'**optimisé** (`ChocoSolverVariableSelector`, stratégie `FirstFail` déclarée en section 2) : il choisit à chaque nœud la variable au domaine le plus petit, ce qui réduit le facteur de branchement bien avant que la recherche ne s'enlise.\n",
+ "Que mesure ce temps (quelques centaines de millisecondes, valeur qui dépend de la machine : voir la sortie ci-dessus) ? Sur l'architecture IKVM, bien plus que la recherche pure : cette première résolution inclut le chargement des classes Java du solveur, la compilation JIT du code Choco et le marshaling .NET-à-Java de chaque appel. Un second appel dans la même session serait sensiblement plus rapide — c'est le coût d'amorçage typique d'un solveur hébergé. Le solveur utilisé ici est l'**optimisé** (`ChocoSolverVariableSelector`, stratégie `FirstFail` déclarée en section 2) : il choisit à chaque nœud la variable au domaine le plus petit, ce qui réduit le facteur de branchement bien avant que la recherche ne s'enlise.\n",
"\n",
"\n",
- "Mettez ce chiffre en perspective série : Sudoku-06 résout **la même grille** (le témoin commun à 45 indices) en **56 ms** avec MAC en C# natif. L'écart 473 contre 56 ne dit pas « Choco est lent » — il mesure l'**architecture d'hébergement** : solveur Java re-compilé à la volée derrière un pont .NET, contre code C# déjà JIT-é par le kernel. C'est une donnée précieuse pour l'ingénierie : le choix d'un solveur industriel se paie en coût d'intégration, et ce coût se voit — ici, presque un facteur 10 sur la grille témoin, l'essentiel étant de l'amorçage."
+ "Mettez ce chiffre en perspective série : Sudoku-06 résout **la même grille** (le témoin commun à 45 indices) en quelques dizaines de millisecondes avec MAC en C# natif. Cet écart ne dit pas « Choco est lent » — il mesure l'**architecture d'hébergement** : solveur Java re-compilé à la volée derrière un pont .NET, contre code C# déjà JIT-é par le kernel. C'est une donnée précieuse pour l'ingénierie : le choix d'un solveur industriel se paie en coût d'intégration, et ce coût se voit — ici, près d'un ordre de grandeur sur la grille témoin, l'essentiel étant de l'amorçage."
]
},
{
@@ -1540,10 +1588,10 @@
"id": "8ce31cbf",
"metadata": {
"papermill": {
- "duration": 0.006858,
- "end_time": "2026-09-13T15:07:17.985602+00:00",
+ "duration": 0.004906,
+ "end_time": "2026-09-27T07:25:30.567210+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:17.978744+00:00",
+ "start_time": "2026-09-27T07:25:30.562304+00:00",
"status": "completed"
},
"tags": []
@@ -1575,10 +1623,10 @@
"id": "45bbc7a1",
"metadata": {
"papermill": {
- "duration": 0.005899,
- "end_time": "2026-09-13T15:07:17.996597+00:00",
+ "duration": 0.005284,
+ "end_time": "2026-09-27T07:25:30.577609+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:17.990698+00:00",
+ "start_time": "2026-09-27T07:25:30.572325+00:00",
"status": "completed"
},
"tags": []
@@ -1599,16 +1647,16 @@
"id": "6894efce",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-09-13T15:07:18.014197Z",
- "iopub.status.busy": "2026-09-13T15:07:18.013919Z",
- "iopub.status.idle": "2026-09-13T15:07:18.047397Z",
- "shell.execute_reply": "2026-09-13T15:07:18.047151Z"
+ "iopub.execute_input": "2026-09-27T07:25:30.591048Z",
+ "iopub.status.busy": "2026-09-27T07:25:30.590821Z",
+ "iopub.status.idle": "2026-09-27T07:25:30.620027Z",
+ "shell.execute_reply": "2026-09-27T07:25:30.619799Z"
},
"papermill": {
- "duration": 0.043067,
- "end_time": "2026-09-13T15:07:18.047493+00:00",
+ "duration": 0.03766,
+ "end_time": "2026-09-27T07:25:30.620134+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:18.004426+00:00",
+ "start_time": "2026-09-27T07:25:30.582474+00:00",
"status": "completed"
},
"tags": []
@@ -1629,10 +1677,10 @@
"id": "ba684dab",
"metadata": {
"papermill": {
- "duration": 0.004671,
- "end_time": "2026-09-13T15:07:18.057540+00:00",
+ "duration": 0.00548,
+ "end_time": "2026-09-27T07:25:30.631730+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:18.052869+00:00",
+ "start_time": "2026-09-27T07:25:30.626250+00:00",
"status": "completed"
},
"tags": []
@@ -1661,16 +1709,16 @@
"id": "e706275e",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-09-13T15:07:18.068709Z",
- "iopub.status.busy": "2026-09-13T15:07:18.068387Z",
- "iopub.status.idle": "2026-09-13T15:07:18.109085Z",
- "shell.execute_reply": "2026-09-13T15:07:18.108909Z"
+ "iopub.execute_input": "2026-09-27T07:25:30.644305Z",
+ "iopub.status.busy": "2026-09-27T07:25:30.644067Z",
+ "iopub.status.idle": "2026-09-27T07:25:30.693408Z",
+ "shell.execute_reply": "2026-09-27T07:25:30.693224Z"
},
"papermill": {
- "duration": 0.046779,
- "end_time": "2026-09-13T15:07:18.109171+00:00",
+ "duration": 0.056803,
+ "end_time": "2026-09-27T07:25:30.693503+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:18.062392+00:00",
+ "start_time": "2026-09-27T07:25:30.636700+00:00",
"status": "completed"
},
"tags": []
@@ -1680,7 +1728,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "TODO: Implementez NQueensChocoSolver.CountSolutions() pour le problème des 8-Reines\r\n"
+ "TODO: Implementez NQueensChocoSolver.CountSolutions() pour le problème des 8-Reines\n"
]
}
],
@@ -1735,10 +1783,10 @@
"id": "fb737f20",
"metadata": {
"papermill": {
- "duration": 0.005181,
- "end_time": "2026-09-13T15:07:18.119888+00:00",
+ "duration": 0.005139,
+ "end_time": "2026-09-27T07:25:30.704623+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:18.114707+00:00",
+ "start_time": "2026-09-27T07:25:30.699484+00:00",
"status": "completed"
},
"tags": []
@@ -1758,10 +1806,10 @@
"id": "b1b47d08",
"metadata": {
"papermill": {
- "duration": 0.005504,
- "end_time": "2026-09-13T15:07:18.130894+00:00",
+ "duration": 0.005068,
+ "end_time": "2026-09-27T07:25:30.714602+00:00",
"exception": false,
- "start_time": "2026-09-13T15:07:18.125390+00:00",
+ "start_time": "2026-09-27T07:25:30.709534+00:00",
"status": "completed"
},
"tags": []
@@ -1808,14 +1856,14 @@
},
"papermill": {
"default_parameters": {},
- "duration": 17.993651,
- "end_time": "2026-09-13T15:07:19.353737+00:00",
+ "duration": 16.787252,
+ "end_time": "2026-09-27T07:25:30.835996+00:00",
"environment_variables": {},
"exception": null,
"input_path": "Sudoku-11-Choco-Csharp.ipynb",
"output_path": "Sudoku-11-Choco-Csharp.ipynb",
"parameters": {},
- "start_time": "2026-09-13T15:07:01.360086+00:00",
+ "start_time": "2026-09-27T07:25:14.048744+00:00",
"version": "2.7.0"
},
"polyglot_notebook": {
@@ -1833,4 +1881,4 @@
},
"nbformat": 4,
"nbformat_minor": 5
-}
+}
\ No newline at end of file
diff --git a/scripts/notebook_tools/twin_pairs.d/csp-1-fundamentals.yaml b/scripts/notebook_tools/twin_pairs.d/csp-1-fundamentals.yaml
index 75b284348e..3272553465 100644
--- a/scripts/notebook_tools/twin_pairs.d/csp-1-fundamentals.yaml
+++ b/scripts/notebook_tools/twin_pairs.d/csp-1-fundamentals.yaml
@@ -6,6 +6,7 @@
bridge_verdict: SOTA-OK
bridge_verdict_reason: 'Les DEUX jumeaux atteignent le meme moteur de production Choco (parite lib-vs-lib stricte, mandat owner #10382 ''lib vs lib c''est encore mieux''). C# = Choco-solver 4.10.17 (Java, Apache-2.0) via IKVM 8.15.0 home shade DLL (recette #4711). Python = pychoco (binding Python officiel de Choco, PyPI MIT), section 6bis ajoutee 2026-08-19 (#10382) : les trois demonstrations du jumeau C# sont rejouees avec le meme modele (IntVar par etat 0..2 + arithm ''!='' pour l''Australie ; boucle solve() pour l''enumeration ; all_different + scalar/arithm diagonales pour les 8-Reines). Convergence mesuree : enumeration Australie = 18 solutions des deux cotes ; solutions valides sur les memes instances. Socle pedagogique from-scratch (classe CSP, backtracking, MRV, LCV) conserve intact des deux cotes ; python-constraint reste en section 6 cote Python comme moteur leger avant le pont industriel. Visualisation : Python = matplotlib, C# = rendu ASCII (inchange).'
known_differences:
+ - "2026-09-27 (drift unilateral, session cloud d'agnosticisme hors flotte) : cote C# seul. La cellule de configuration IKVM codait le RID win-x64 en dur (ikvmRid = win-x64, plus une reference NuGet IKVM.Image.runtime.win-x64) : sous Linux et macOS, l'init de la JVM IKVM echouait au premier appel Java (TypeInitializationException sur IKVM.Runtime.LibJava, mesure sur CSP-1 avant correctif). Le RID est desormais derive de OperatingSystem et RuntimeInformation.ProcessArchitecture ; IKVM.Image 8.15.0 depend deja des onze paquets IKVM.Image.runtime., la reference explicite win-x64 est retiree. Re-execution complete sous Linux (dotnet-interactive 1.0.617701) : 0 erreur, sorties identiques a la base hors RID du home IKVM, separateur decimal (culture) et temps mesures. Jumeau Python inchange. Strips outilles appliques avant l'attestation (probe banner, papermill). Prose : la duree du brute force epinglee (3,9 ms) remplacee par un descripteur machine-dependant (#9434)."
- 'Re-baseline 2026-09-11 (myia-po-2023:CoursIA, #15447 / chore #15429) : normalisation str->list des cellules `source` -- re-encodage de representation, aucun contenu pedagogique touche. Verifie firsthand : le SHA canonique du carnet (toutes listes-de-chaines jointes, metadata de niveau carnet exclue) est IDENTIQUE base vs head, et les champs `text` des sorties sont inchanges ; seul le content_sha du registre bouge. Le garde #8057 demande une attestation de parite, pas une reparation.'
- 'Correction 2026-08-19 (myia-po-2025:CoursIA-2, review #11789 / NanoClaw + ai-01 re-derive) : la contrainte anti-diagonale 8-Reines etait mal ecrite dans les DEUX jumeaux (q_i + q_j != i + j au lieu de q_i + i != q_j + j) ; les solutions committees etaient invalides (Python : 6 paires en attaque, C# : 1 paire). Fixe des deux cotes en `scalar [1,-1] + arithm != j-i` (equivalent exact de q_i + i != q_j + j) puis re-execute : Python [4,6,1,5,2,0,7,3] et C# [4,6,1,5,2,0,3,7], toutes deux 0 attaque (verifie).'
- 'Edition 2026-08-19 (myia-po-2025:CoursIA-2, #10382 tranche lib-vs-lib) : section 6bis ajoutee au jumeau Python -- Choco via pychoco (binding officiel PyPI MIT), miroir de la section 6 du jumeau C# (Choco via IKVM). Memes modeles, memes instances : enumeration Australie = 18 solutions des deux cotes (convergence verifiee sur grandeur observable), 8-Reines solution valide. La premiere solution 8-Reines differe potentiellement entre jumeaux (ordre de creation des variables auxiliaires diagonales influence lheuristique par defaut) -- documente dans la cellule dinterpretation. Temps de resolution en prose = descripteurs machine-dep renvoyant aux sorties live (regle #9434). Re-exec complete du notebook (86 cellules, 33 code, 0 erreur). Verdict RECOVERABLE-LOCAL -> SOTA-OK.'
diff --git a/scripts/notebook_tools/twin_pairs.d/csp-1-fundamentals/0020-2026-09-27-claude-cloud-hors-flotte.yaml b/scripts/notebook_tools/twin_pairs.d/csp-1-fundamentals/0020-2026-09-27-claude-cloud-hors-flotte.yaml
new file mode 100644
index 0000000000..aa1f6e7810
--- /dev/null
+++ b/scripts/notebook_tools/twin_pairs.d/csp-1-fundamentals/0020-2026-09-27-claude-cloud-hors-flotte.yaml
@@ -0,0 +1,6 @@
+date: '2026-09-27'
+by: claude-cloud:hors-flotte
+python_sha: ce501ad216fd553b300a18947a08aab49f6a861a
+csharp_sha: 546b3c5a4b1131014757a78555180cd123475d3a
+content_python_sha: dc94006e6ee45a38fbadbd1067a27c1e1f09fa5224c6e2b2a9dba739202807bd
+content_csharp_sha: c6bb4365ab659d764c2458fe1fa2ca20d6d4f9cc5d8688c2b9547601212d5ef4
diff --git a/scripts/notebook_tools/twin_pairs.d/csp-2-consistency.yaml b/scripts/notebook_tools/twin_pairs.d/csp-2-consistency.yaml
index c91c7c45eb..c1c2892110 100644
--- a/scripts/notebook_tools/twin_pairs.d/csp-2-consistency.yaml
+++ b/scripts/notebook_tools/twin_pairs.d/csp-2-consistency.yaml
@@ -6,6 +6,7 @@
bridge_verdict: SOTA-OK
bridge_verdict_reason: "Les DEUX jumeaux atteignent le meme moteur de production Choco (parite lib-vs-lib stricte, mandat owner #10382 'lib vs lib c'est encore mieux'). C# = Choco-solver 4.10.17 (Apache-2.0) via IKVM 8.15.0 home shade DLL (recette #4711) : propagation AC-3 + fixpoint + bench AC-3 vs backtracking + coloration Australie. Python = socle from-scratch conserve (AC-3 sur `collections.deque`, forward checking, MAC — c'est le choix pedagogique du notebook : implementer AC-3 a la main) + section 3.6 ajoutee 2026-08-19 (#10382) : Choco via **pychoco** (binding Python officiel, PyPI MIT), meme modele Australie (7 IntVar 1..3, `arithm !=` sur adjacences, `WA = 1`) rejoue en un `solve()` — propagation integree du solveur observee cote a cote avec l'AC-3 maison de la cellule precedente. Solution unique valide des deux cotes. Viz : Python = matplotlib + networkx, C# = Console.WriteLine. `parity_level: semantic` preserve."
known_differences:
+ - "2026-09-27 (drift unilateral, session cloud d'agnosticisme hors flotte) : cote C# seul. La cellule de configuration IKVM codait le RID win-x64 en dur (ikvmRid = win-x64, plus une reference NuGet IKVM.Image.runtime.win-x64) : sous Linux et macOS, l'init de la JVM IKVM echouait au premier appel Java (TypeInitializationException sur IKVM.Runtime.LibJava, mesure sur CSP-1 avant correctif). Le RID est desormais derive de OperatingSystem et RuntimeInformation.ProcessArchitecture ; IKVM.Image 8.15.0 depend deja des onze paquets IKVM.Image.runtime., la reference explicite win-x64 est retiree. Re-execution complete sous Linux (dotnet-interactive 1.0.617701) : 0 erreur, sorties identiques a la base hors RID du home IKVM, separateur decimal (culture) et temps mesures. Jumeau Python inchange. Strips outilles appliques avant l'attestation (probe banner, papermill)."
- "Edition 2026-08-19 (myia-po-2025:CoursIA-2, #10382 tranche lib-vs-lib) : section 3.6 ajoutee au jumeau Python -- propagation native Choco via pychoco (binding officiel PyPI MIT), miroir de la section 4 du jumeau C# (AC-3 avec Choco via IKVM). Meme modele Australie (7 IntVar 1..3, arithm '!=' sur adjacences, WA=1) : solve() retourne une solution valide des deux cotes. L'assignation exacte des variables non-fixees peut differer entre jumeaux et vs l'AC-3 maison (heuristique de recherche par defaut du solveur) -- documente dans la cellule d'interpretation du notebook. Temps de resolution en prose = descripteurs machine-dep renvoyant aux sorties live (regle #9434). Re-exec complete du notebook (70 cellules, 28 code, 0 erreur). Verdict RECOVERABLE-LOCAL -> SOTA-OK."
- "Socle pedagogique commun : node consistency + AC-3 + Forward Checking + MAC, implementes from-scratch des deux cotes."
- "Cote C# : extension Choco-solver 4.10.17 via IKVM 8.15.0 (memes recettes infrastructure que CSP-1) pour comparer les algorithmes custom avec la propagation native de Choco (variable x, contrainte arithmetique, model.getSolver().propagate())."
diff --git a/scripts/notebook_tools/twin_pairs.d/csp-2-consistency/0012-2026-09-27-claude-cloud-hors-flotte.yaml b/scripts/notebook_tools/twin_pairs.d/csp-2-consistency/0012-2026-09-27-claude-cloud-hors-flotte.yaml
new file mode 100644
index 0000000000..71fd135b35
--- /dev/null
+++ b/scripts/notebook_tools/twin_pairs.d/csp-2-consistency/0012-2026-09-27-claude-cloud-hors-flotte.yaml
@@ -0,0 +1,6 @@
+date: '2026-09-27'
+by: claude-cloud:hors-flotte
+python_sha: fe54d361efc1a2b747cc2d4614502957fb47b0f3
+csharp_sha: c2531ac105b90598b7ea3fd93f7769bc9a112725
+content_python_sha: 6028275fae847c7e0525f6b14a9bf42ab07fbc2d291056e7e6f000fc1c807f5e
+content_csharp_sha: 8f212919f0d6f80407059dfc85f9ff4d2a1dbb75700c2254b5c0bc03e875b800
diff --git a/scripts/notebook_tools/twin_pairs.d/csp-3-advanced.yaml b/scripts/notebook_tools/twin_pairs.d/csp-3-advanced.yaml
index 4afa3b5510..e0124fbfcb 100644
--- a/scripts/notebook_tools/twin_pairs.d/csp-3-advanced.yaml
+++ b/scripts/notebook_tools/twin_pairs.d/csp-3-advanced.yaml
@@ -6,6 +6,7 @@
bridge_verdict: SOTA-OK
bridge_verdict_reason: "REBRIDGE LIVRE 2026-08-19 (annexe 'parite lib-vs-lib', cote Python du notebook) : `pychoco` (binding Python officiel de Choco, PyPI, MIT) rejoue les 5 demonstrations Choco du jumeau C# sur le MEME moteur -- instances exactes du twin C# (Mini-Sudoku 4x4 allDifferent, Cumulative [3,4,2,5] cap 2, TSP 5 villes matrice symetrique, Table 3 tuples, Reification XOR). Convergence mesuree : makespan optimal 9 = 9, cout TSP 18 = 18 avec tour identique 0->1->3->4->2->0, solution Table HDD+16GB+750W identique, solution Reif x=0,y=1,b=1,c=0 identique. Les sections principales preservent le pattern double-lib pedagogique (PY = python-constraint academique + OR-Tools CP-SAT industriel, C# = Choco 4.10.17 via IKVM 8.15.0 shade DLL recette #4711) ; l'annexe ajoute la comparaison lib-vs-lib sur les instances du C#. Les DEUX cotes atteignent desormais le meme moteur industriel (Choco) -- le critere SOTA-OK (vrai outil SOTA execute des deux cotes, sorties reelles committees) est satisfait. `parity_level: semantic` preserve pour le corps du notebook ; l'annexe porte la parite numerique exacte."
known_differences:
+ - "2026-09-27 (drift unilateral, session cloud d'agnosticisme hors flotte) : cote C# seul. La cellule de configuration IKVM codait le RID win-x64 en dur (ikvmRid = win-x64, plus une reference NuGet IKVM.Image.runtime.win-x64) : sous Linux et macOS, l'init de la JVM IKVM echouait au premier appel Java (TypeInitializationException sur IKVM.Runtime.LibJava, mesure sur CSP-1 avant correctif). Le RID est desormais derive de OperatingSystem et RuntimeInformation.ProcessArchitecture ; IKVM.Image 8.15.0 depend deja des onze paquets IKVM.Image.runtime., la reference explicite win-x64 est retiree. Re-execution complete sous Linux (dotnet-interactive 1.0.617701) : 0 erreur, sorties identiques a la base hors RID du home IKVM, separateur decimal (culture) et temps mesures. Jumeau Python inchange. Strips outilles appliques avant l'attestation (probe banner, papermill)."
- '2026-08-31 : ATTESTATION UNILATERALE (PR #13659, lane myia-ai-01:CoursIA) -- reparation d''echappements JSON manges dans le markdown du cote Python. CAUSE : dans le .ipynb, la sequence dollar-\bot-dollar ecrite avec UN SEUL antislash est lue par le parseur JSON comme l''echappement \b (backspace, U+0008) ; la source chargee porte un caractere de controle et le notebook rend un dollar-ot-dollar prive de sa commande LaTeX. FIX : doubler l''antislash (\\bot). Le DRIFT est UNILATERAL parce que le DEFAUT l''est : la contrepartie CSP-3-Advanced-CSharp.ipynb (C#), 14 cellules markdown, a ete scannee sous controle positif (le litteral defectueux passe a json.loads doit rendre U+0008 -- assertion verifiee avant le scan) et ne porte AUCUN caractere de controle U+0008/U+000B/U+000C. Il n''y a donc rien a reparer de ce cote : l''attestation ne consacre aucune asymetrie de contenu. PORTEE DU DIFF cote repare (comparaison des JSON parses origin/main -> HEAD) : markdown uniquement, 0 cellule code touchee, 0 sortie modifiee, 0 execution_count deplace, 0 cellule ajoutee ou retiree.'
- "Socle pedagogique commun : global constraints (all_different, sum, element) + backtracking avec propagation globale + symetrie breaking (lexicographique)."
- "Cote C# : Choco-solver (memes recettes infrastructure) - global constraints implementes en Python pur (classe AllDifferent via matching de Hall), cote C# delegue a Choco.IntVar+Constraint via IKVM."
diff --git a/scripts/notebook_tools/twin_pairs.d/csp-3-advanced/0011-2026-09-27-claude-cloud-hors-flotte.yaml b/scripts/notebook_tools/twin_pairs.d/csp-3-advanced/0011-2026-09-27-claude-cloud-hors-flotte.yaml
new file mode 100644
index 0000000000..e1a41dd24e
--- /dev/null
+++ b/scripts/notebook_tools/twin_pairs.d/csp-3-advanced/0011-2026-09-27-claude-cloud-hors-flotte.yaml
@@ -0,0 +1,6 @@
+date: '2026-09-27'
+by: claude-cloud:hors-flotte
+python_sha: 3b3c1bed277c5b013d59757b24ad950f0f1b9ccf
+csharp_sha: f922f2a1217d3484470537c4e3ce116170925595
+content_python_sha: 2b422e9b601d4daf79a6f0f14c5c332b549be13bd9d3ccc9aa9a04612a4abd48
+content_csharp_sha: ecb80ad982bb4762096f01ae39b972f19be635ece1417029d17c9f8bf00dcf89
diff --git a/scripts/notebook_tools/twin_pairs.d/csp-5-optimization.yaml b/scripts/notebook_tools/twin_pairs.d/csp-5-optimization.yaml
index d8ebb872e6..f006f8bda2 100644
--- a/scripts/notebook_tools/twin_pairs.d/csp-5-optimization.yaml
+++ b/scripts/notebook_tools/twin_pairs.d/csp-5-optimization.yaml
@@ -6,6 +6,7 @@
bridge_verdict: SOTA-OK
bridge_verdict_reason: "DEUX PONTS LIVRES 2026-08-20, fermeture par les deux bouts de la meme asymetrie de machinerie. (a) Cote Python -- annexe 'parite lib-vs-lib' (myia-po-2025:CoursIA-2, PR #11891) : `pychoco` (binding Python officiel de Choco, PyPI, MIT) rejoue les 4 demos Choco du jumeau C# sur les instances exactes des cellules 6/8/10/12 (BPP [2,5,4,7,2] cap 10 reification+scalar, Knapsack 5 objets cap 10, Cutting Stock 13 pieces via contrainte GLOBALE bin_packing, Portfolio lineaire 5 actifs). Convergence 4/4 : 3 bins = 3, valeur 31 = 31 avec selection identique {0,1,3}, 10 barres = 10 avec meme decomposition 3x[9] + 4x[7] + 3x[4,4], rendement 27 = 27 avec meme choix {0,1,4}. Re-exec complete (25 cellules code, 0 erreur, nbconvert --execute). (b) Cote C# -- section 5.1 'CP-SAT natif .NET' (myia-po-2024:CoursIA, PR #11976) : `#r \"nuget: Google.OrTools, 9.11.4210\"` sans IKVM + formulation booleenne miroir du Python (x[i,j]/y[j], capacite linearisee, symmetry breaking, Minimize(sum(y))) sur les memes donnees [2,5,4,7,2]/cap 10. Re-exec .NET Interactive : status Optimal, 3 bins -- meme optimum que Choco section 1 et que solve_bin_packing_cp Python (optimum verifie independamment : aucun sous-ensemble de [2,5,4,7,2] ne somme a exactement 10, donc 2 bins est infaisable et 3 est optimal). Consequence sur parity_level : `native-both` est desormais atteint PAR L'AXE CP-SAT -- chaque cote invoque CP-SAT dans son ecosysteme natif (Python `ortools.sat.python.cp_model`, C# NuGet `Google.OrTools` sans pont IKVM), ce qui est la definition retenue par l'arbitrage #11200. L'axe Choco reste asymetrique (pychoco natif cote Python, IKVM shade cote C#) et n'est pas ce qui porte le verdict. Le `semantic` inscrit par (a) etait correct AVANT que (b) n'existe ; il est superseded, pas contredit. Les sections principales preservent le pattern double-lib pedagogique (PY = OR-Tools CP-SAT, C# = Choco 4.10.17 via IKVM 8.15.0 recette #4711). --- Etat precedent (2026-08-04) : verdict RECOVERABLE-LOCAL, ASYMETRIE DE MACHINERIE -- PY = Google OR-Tools CP-SAT vs C# = Choco via IKVM. Les deux remedes nommes a l'epoque (`pychoco` pour aligner sur Choco, `Google.OrTools` NuGet pour aligner sur OR-Tools) ont ete appliques, chacun par une lane differente."
known_differences:
+ - "2026-09-27 (drift unilateral, session cloud d'agnosticisme hors flotte) : cote C# seul. La cellule de configuration IKVM codait le RID win-x64 en dur (ikvmRid = win-x64, plus une reference NuGet IKVM.Image.runtime.win-x64) : sous Linux et macOS, l'init de la JVM IKVM echouait au premier appel Java (TypeInitializationException sur IKVM.Runtime.LibJava, mesure sur CSP-1 avant correctif). Le RID est desormais derive de OperatingSystem et RuntimeInformation.ProcessArchitecture ; IKVM.Image 8.15.0 depend deja des onze paquets IKVM.Image.runtime., la reference explicite win-x64 est retiree. Re-execution complete sous Linux (dotnet-interactive 1.0.617701) : 0 erreur, sorties identiques a la base hors RID du home IKVM, separateur decimal (culture) et temps mesures. Jumeau Python inchange. Strips outilles appliques avant l'attestation (probe banner, papermill)."
- "Pont 2026-08-20 (myia-po-2024:CoursIA, #10382 bucket 1 OR-Tools) : le twin C# ajoute une section 5.1 CP-SAT natif (Google.OrTools 9.11.4210 NuGet, sans IKVM) qui reprend la formulation booleenne du Python (x[i,j]/y[j], Minimize(sum(y))) sur les memes donnees BPP. Sortie executee : Optimal, 3 bins -- convergence avec Choco section 1 et avec le twin Python. Combinee a l'annexe pychoco cote Python (entree ci-dessus, meme date, autre lane), cette section porte parity_level a native-both sur l'axe CP-SAT. L'entree 'Idiomes framework' ci-dessous decrit l'etat pre-ponts (sections 1-4 Choco/IKVM cote C#, inchangees)."
- "Rebridge 2026-08-20 (myia-po-2025:CoursIA-2, #10382) : annexe 'parite lib-vs-lib' ajoutee au twin Python (9 cellules avant References, ids annexe-libvslib-*) -- pychoco rejoue les 4 demos Choco du twin C# (BPP reification+scalar, Knapsack scalar, Cutting Stock bin_packing globale, Portfolio lineaire) sur les instances exactes des cellules 6/8/10/12 du C#. Re-exec complete du notebook (25 cellules code, 0 erreur, nbconvert --execute). Convergence 4/4 : 3 bins, 31/{0,1,3}, 10 barres meme structure, 27/{0,1,4}. Verdict flip RECOVERABLE-LOCAL -> SOTA-OK (le remede nomme dans le verdict precedent -- pychoco pour aligner les 2 jambes sur Choco -- est applique). Twin C# non modifie."
- "Edition 2026-08-17 (myia-po-2025:CoursIA, #9434) : le twin Python a evacue ses durees wall-clock machine-dependantes de la prose d'interpretation de la cellule 33 (benchmark FFD vs CP-SAT, pins ~20 ms / ~0,5 s / limite 30 s / < 1 ms / n <= 50 en une seconde) au profit d'ordres de grandeur + renvois vers la sortie du benchmark (cellule 32 ci-dessus), avec note mandat #9377/#9434. Les resultats deterministes (gaps 50 %/0 %/7 %, statuts OPTIMAL/FEASIBLE) sont conserves verbatim. Markdown-only, pas de re-exec (exception C.2). Twin C# non modifie (pins absents cote C#, 19 cellules sans benchmark scaling). Parite semantique tenue : socle optimisation, modelisation, contraintes, benchmark empirique inchanges."
diff --git a/scripts/notebook_tools/twin_pairs.d/csp-5-optimization/0012-2026-09-27-claude-cloud-hors-flotte.yaml b/scripts/notebook_tools/twin_pairs.d/csp-5-optimization/0012-2026-09-27-claude-cloud-hors-flotte.yaml
new file mode 100644
index 0000000000..2f8c1ea507
--- /dev/null
+++ b/scripts/notebook_tools/twin_pairs.d/csp-5-optimization/0012-2026-09-27-claude-cloud-hors-flotte.yaml
@@ -0,0 +1,6 @@
+date: '2026-09-27'
+by: claude-cloud:hors-flotte
+python_sha: eac3772a8ef97842d1ccc49e826e66da45bbfffe
+csharp_sha: 0de8e26d6064d4e90d2bba406f905bebd7c0af40
+content_python_sha: fdcaed3d179ea47a6f57910e921c11b4ad2f787edfa64095c4325694fd2ff940
+content_csharp_sha: 4d036661dc6483f3b90967f888f0b72311d3aeec3e0d3b5a0ea16104b21c3adf
diff --git a/scripts/notebook_tools/twin_pairs.d/csp-7-soft.yaml b/scripts/notebook_tools/twin_pairs.d/csp-7-soft.yaml
index 1ce54b8312..a35439a96b 100644
--- a/scripts/notebook_tools/twin_pairs.d/csp-7-soft.yaml
+++ b/scripts/notebook_tools/twin_pairs.d/csp-7-soft.yaml
@@ -6,6 +6,7 @@
bridge_verdict: SOTA-OK
bridge_verdict_reason: 'Python = `ortools.sat.python.cp_model` (Google, Apache-2.0, CP-SAT SOTA soft constraints : `CpModel()` + variables + `AddMaxEquality` + cout de violation + `solver.Solve()` pour optimisation sous contraintes souples) + abstractions `abc.ABC`/`abstractmethod` (4 paradigmes : Semiring-based CSP, Fuzzy CSP, Weighted CSP, OR-Tools CP-SAT integration) + `dataclasses`. C# = Choco-solver 4.10.17 (Apache-2.0) via IKVM 8.15.0 home shade DLL (recette #4711) avec `org.chocosolver.solver.Model` + `IntVar` + `arithm` + cost-aware constraints + `getSolver().findOptimalSolution(cost, MINIMIZE)` pour Weighted CSP uniquement (24 cellules C# au verdict initial, 38 apres les tranches #12159/#12616/Hierarchical vs 53 cellules PY, 17 code C# vs 20 code PY). Verdict RECOVERABLE-LOCAL : ASYMETRIE STRUCTURELLE DOCUMENTEE -- le C# est un twin PARTIEL (Weighted CSP uniquement), le PY couvre 4 paradigmes soft constraints (Semiring/Fuzzy/Weighted/OR-Tools). `parity_level: surface` preserve deja cette couverture limitee. La section PY Fuzzy est desormais portee cote C# (section 4 du twin C#, livree par PR #12159 MERGED 2026-08-21, commit bb5750e64 : planification de vacances Choco avec degres [0..1000], combinaison min, verifiee firsthand c.1301+334 -- 26 cellules dont 12 code, 12/12 executees). La section PY Semiring est desormais portee cote C# (section 5 du twin C#, livree par PR #12616 : interface generique ISemiring + classe SoftCsp, accord numerique exact verifie contre le moteur Choco sur le probleme de vacances floues). Le fil Hierarchical CSP est porte cote C# depuis la tranche du 2026-08-24 (section 6, accord numerique Choco<->CP-SAT : meme optimum objectif 3 sur le catalogue PC) — le registre ne porte plus de gap de moteur. Cote C# : Fuzzy livre par #12159 (IntVar [0,1000] + model.min + setObjective), Semiring par #12616 (ISemiring + SoftCsp), Hierarchical par la tranche du 2026-08-24 (reification ifThenElse + scalar lexicographique). Cote PY : `python-constraint` MIT + `pychoco` (binding Choco Python, MIT) ajouteraient une lib SOTA alignable sur Choco C#. `parity_level: surface` preserve : parite seulement sur la couverture Weighted CSP (surface limit du twin C#). Adjudication 2026-08-19 (dispatch #10382, comment 5335643895, lane myia-po-2026:CoursIA) : surface CONFIRME pour l''etat livre, verifie firsthand sur deux fondements -- (1) twin C# partiel : 0 occurrence Semiring/Fuzzy dans le C# (24 cellules) contre 33/28 cote Python (53 cellules) + fil Hierarchical CSP absent ; (2) le cote Python est LUI-MEME partiellement solver-free : les sections Semiring/Fuzzy sont des frameworks from-scratch sur abstractions stdlib (`abc.ABC`, `dataclasses`), pas un moteur externe -- le test native-both (nommer moteur + point d''entree par cote) echoue donc au-dela du sous-ensemble Weighted, des deux cotes. Le sous-ensemble couvert est en parite de moteurs REELS : Choco/IKVM 11/11 cellules code executees cote C#, OR-Tools CP-SAT 20/20 cote Python. Verdict reevalue SOTA-OK le 2026-08-24 : les deux cotes executent un moteur reel (Choco 4.10.17 via IKVM 8.15.0 / OR-Tools CP-SAT), les quatre paradigmes soft + le fil Hierarchical sont couverts des deux cotes, accords numeriques verifies x2 (Semiring framework<->Choco : Rome degre 0.8 ; Hierarchical Choco<->CP-SAT : objectif 3, meme configuration 815 EUR). parity_level passe surface -> semantic : l''avertissement de perimetre decrivait l''etat ante-#12159/#12616/tranche-Hierarchical. Asymetries residuelles mineures (enrichissements, pas des gaps) documentees en known_differences.'
known_differences:
+ - "2026-09-27 (drift unilateral, session cloud d'agnosticisme hors flotte) : cote C# seul. La cellule de configuration IKVM codait le RID win-x64 en dur (ikvmRid = win-x64, plus une reference NuGet IKVM.Image.runtime.win-x64) : sous Linux et macOS, l'init de la JVM IKVM echouait au premier appel Java (TypeInitializationException sur IKVM.Runtime.LibJava, mesure sur CSP-1 avant correctif). Le RID est desormais derive de OperatingSystem et RuntimeInformation.ProcessArchitecture ; IKVM.Image 8.15.0 depend deja des onze paquets IKVM.Image.runtime., la reference explicite win-x64 est retiree. Re-execution complete sous Linux (dotnet-interactive 1.0.617701) : 0 erreur, sorties identiques a la base hors RID du home IKVM, separateur decimal (culture) et temps mesures. Jumeau Python inchange. Strips outilles appliques avant l'attestation (probe banner, papermill)."
- '2026-08-31 : ATTESTATION UNILATERALE (PR #13659, lane myia-ai-01:CoursIA) -- reparation d''echappements JSON manges dans le markdown du cote Python. CAUSE : dans le .ipynb, la sequence dollar-\bot-dollar ecrite avec UN SEUL antislash est lue par le parseur JSON comme l''echappement \b (backspace, U+0008) ; la source chargee porte un caractere de controle et le notebook rend un dollar-ot-dollar prive de sa commande LaTeX. FIX : doubler l''antislash (\\bot). Le DRIFT est UNILATERAL parce que le DEFAUT l''est : la contrepartie CSP-7-Soft-CSharp.ipynb (C#), 21 cellules markdown, a ete scannee sous controle positif (le litteral defectueux passe a json.loads doit rendre U+0008 -- assertion verifiee avant le scan) et ne porte AUCUN caractere de controle U+0008/U+000B/U+000C. Il n''y a donc rien a reparer de ce cote : l''attestation ne consacre aucune asymetrie de contenu. PORTEE DU DIFF cote repare (comparaison des JSON parses origin/main -> HEAD) : markdown uniquement, 0 cellule code touchee, 0 sortie modifiee, 0 execution_count deplace, 0 cellule ajoutee ou retiree.'
- '2026-08-24 : TRANCHE HIERARCHICAL (PR empilee sur #12616, lane myia-po-2024:CoursIA) : section 6 Hierarchical CSP ajoutee au twin C# (notebook 33 -> 38 cellules). csharp_sha c71f75e0 -> d46ed16d (ratchet exec 26a25a318f) -> 020dfe9a, python_sha inchange. REEVALUATION : bridge_verdict RECOVERABLE-LOCAL -> SOTA-OK, parity_level surface -> semantic — dernier gap nomme (fil Hierarchical) ferme ; les 4 paradigmes soft + Hierarchical sont couverts des deux cotes, accords numeriques x2 (Semiring #12616 : Rome degre 0.8 ; Hierarchical : objectif 3 Choco<->CP-SAT, meme config 815 EUR). Asymetries residuelles mineures (enrichissements, pas des gaps) : visualisations matplotlib + nurse scheduling + rendus etudiants cote PY ; CostRegular + SoftAllDifferent cote C#.'
- '2026-08-23 : REBASELINE twin-pair CSP-7 Soft -- PR #12616 (lane myia-po-2024:CoursIA, tranche Semiring de #10382). Section 5 Semiring CSP ajoutee au twin C# (7 cellules, notebook 26 -> 33). csharp_sha 44308c7b -> c71f75e0, content_csharp_sha re-atteste. python_sha inchange. Gap residuel : Hierarchical CSP uniquement.'
diff --git a/scripts/notebook_tools/twin_pairs.d/csp-7-soft/0011-2026-09-27-claude-cloud-hors-flotte.yaml b/scripts/notebook_tools/twin_pairs.d/csp-7-soft/0011-2026-09-27-claude-cloud-hors-flotte.yaml
new file mode 100644
index 0000000000..2ebc71317f
--- /dev/null
+++ b/scripts/notebook_tools/twin_pairs.d/csp-7-soft/0011-2026-09-27-claude-cloud-hors-flotte.yaml
@@ -0,0 +1,6 @@
+date: '2026-09-27'
+by: claude-cloud:hors-flotte
+python_sha: 17e90b774a28e1b844c653cf2bdc42c5da965e06
+csharp_sha: 3e299dcbb9e1daa52f1c08c35700a8e5d8e09c3d
+content_python_sha: c14865378789aef5afed6cc08169ce981f47dec9e981d56f1e11766bc30b909d
+content_csharp_sha: 269c49f4ce3fdebd3aa72c0b8bc1bc77b40285b2f744579b7e953ae381fcd660
diff --git a/scripts/notebook_tools/twin_pairs.d/sudoku-11-choco.yaml b/scripts/notebook_tools/twin_pairs.d/sudoku-11-choco.yaml
index fa5d65acec..21f4058460 100644
--- a/scripts/notebook_tools/twin_pairs.d/sudoku-11-choco.yaml
+++ b/scripts/notebook_tools/twin_pairs.d/sudoku-11-choco.yaml
@@ -6,6 +6,7 @@
bridge_verdict: SOTA-OK
bridge_verdict_reason: "Lib-vs-lib meme moteur Java Choco-Solver : C# branche IKVM-Choco via DLL `org.chocosolver.solver.dll` trackee sur disque (Choco 4.10.17, IKVM 8.15.0) + 5 `using org.choco.*` explicites + 18 refs `IKVM` runtime + cells 12. Python branche JPype + 11 refs `choco` + 19 refs `jpype` + `from org.chocosolver.solver import Model` runtime. Meme moteur Java Choco-Solver 4.10.17 des deux cotes, accessible via deux chemins distincts (JPype-JVM-runtime cote Python, IKVM-bytecode .NET cote C#). Verifie firsthand (c.234 audit 2026-08-12, myia-po-2023:CoursIA-2) : DLL trackee, csproj IKVM-Choco deja construit (c.218 PR #10561 \"tranche 5 CSP\" a couvert 5 paires dont Choco-bridgeable), kernel .NET Interactive execute le twin C#. Pont IKVM-bytecode .NET vs JPype-JVM-runtime sur le meme moteur Java. Verdict SOTA-OK : Choco-Solver est la SOTA CSP solver pour les deux stacks, aucun autre solveur ne le remplacerait avantageusement. Build IKVM deja fait sur le runner (DLL trackee = artefact build, pas a reconstruire)."
known_differences:
+ - "2026-09-27 (drift unilateral, session cloud d'agnosticisme hors flotte) : cote C# seul. La cellule de configuration IKVM codait le RID win-x64 en dur (ikvmRid = win-x64, plus une reference NuGet IKVM.Image.runtime.win-x64) : sous Linux et macOS, l'init de la JVM IKVM echouait au premier appel Java (TypeInitializationException sur IKVM.Runtime.LibJava, mesure sur CSP-1 avant correctif). Le RID est desormais derive de OperatingSystem et RuntimeInformation.ProcessArchitecture ; IKVM.Image 8.15.0 depend deja des onze paquets IKVM.Image.runtime., la reference explicite win-x64 est retiree. Re-execution complete sous Linux (dotnet-interactive 1.0.617701) : 0 erreur, sorties identiques a la base hors RID du home IKVM, separateur decimal (culture) et temps mesures. Jumeau Python inchange. Strips outilles appliques avant l'attestation (probe banner, papermill). Prose : les durees epinglees (473 ms, 56 ms) remplacees par des descripteurs machine-dependants (#9434)."
- "Edition 2026-08-08 (myia-po-2023:CoursIA-2, #9434 item 3) : les DEUX twins ont evacue leurs valeurs de timing absolues machine-dependantes de la prose d'interpretation (Python cell[18/23/26] : 64.01/8.38/50.43 ms etc. ; C# cell[28] : 728 ms startup JVM IKVM) au profit de descripteurs qualitatifs pointant vers la cellule de mesure live ci-dessus. Markdown-only, pas de re-exec (exception C.2). Parite semantique tenue : socle CP, modelisation, contraintes, asymetrie IKVM/from-scratch inchanges."
- "Socle pedagogique commun : resolution de Sudoku par programmation par contraintes (CP) avec le solveur Choco -- modelisation (variables, domaines, contraintes), propagation, recherche. Meme solveur (Choco), meme cas d'application (Sudoku). Les deux couvrent Choco, choco, Solver."
- "Divergence d'implementation : le C# accede a Choco via IKVM (bridge Java->.NET, NuGet IKVM 8.15.0 + IKVM.Image) -- Choco etant une lib Java, le C# la consomme a travers le runtime IKVM ; le Python (pur stdlib, 0 dependance Choco) implemente un solveur CP a la Choco from scratch (propagation, recherche). Meme paradigme CP, deux niveaux : le C# wrappe le vrai Choco via IKVM (RECOVERABLE-MACHINE per SOTA ledger Entry #008 : IKVM instable dans dotnet-interactive), le Python reconstruit la logique CP didactiquement."
diff --git a/scripts/notebook_tools/twin_pairs.d/sudoku-11-choco/0010-2026-09-27-claude-cloud-hors-flotte.yaml b/scripts/notebook_tools/twin_pairs.d/sudoku-11-choco/0010-2026-09-27-claude-cloud-hors-flotte.yaml
new file mode 100644
index 0000000000..5026ffdf8c
--- /dev/null
+++ b/scripts/notebook_tools/twin_pairs.d/sudoku-11-choco/0010-2026-09-27-claude-cloud-hors-flotte.yaml
@@ -0,0 +1,6 @@
+date: '2026-09-27'
+by: claude-cloud:hors-flotte
+python_sha: 554a580c9a0a1626025f9757365f31715e8d36e6
+csharp_sha: 8850b9f43f1de802b858919394ee314398530706
+content_python_sha: c3c4ffc3b8c86d98e16cf4766bca6254ef39886759071adbab75af82eb45c993
+content_csharp_sha: 213245c8e34b8ec8a7f4fc371dc485ab90caaea795505410026e9124d6cdcf44