// Valeurs committées : 10d (PR #12645), 10e Phase 2 CPU (PR #12759), 10e régime GPU (PR #14364).
// Valeurs ORT : run courant (re-exécution end-to-end de ce notebook, cf #14365).
// Note attribution GPU (cf #14157 (a), verification 2026-09-01) : la ligne LLamaSharp CPU ci-dessous a ete corrigee
// de "in-process, RTX 3080 Ti, 6,2 Go VRAM libres" vers "in-process, CPU (CUDA jamais charge)"
// car la mesure sur le meme harnais a montre `backend_ptrs.size() = 1` (CPU seul), 0/36 couches
// sur GPU, VRAM plate pendant l'inference, debit reproduit 13,90 et 11,51 tok/s. La jambe n'a
// jamais utilise le GPU. Le debit 14,14 tok/s reste authentique ; c'est son attribution qui etait
// fausse. La cellule [c11-lecture-bakeoff] corrige la meme assertion en miroir.
// Régime GPU LLamaSharp (mesure committée 10e §1bis, run du 2026-09-02, PR #14364, même harnais) :
// `backend_ptrs.size() = 2`, 37/37 couches offloaded vers CUDA0, VRAM +3163 MiB pendant l'inférence,
// exactement les mêmes 353 jetons que le régime CPU (Temperature = 0.0, échantillonnage déterministe), 0 <pad>.
// Réserves du tableau : les moteurs ne servent ni le même format (ONNX int4 block-128 contre GGUF Q4_K_M)
// ni la même charge (tokenizers et critères d'arrêt distincts) — on compare des débits, pas des charges identiques.
var lignes = new (string Moteur, string Modele, string Conditions, string Jetons, string Debit, string Pads, string Qualite)[]
{
("TensorSharp 3.2.1.0", "Gemma 4 E4B Q8_0 (GGUF)", "serveur HTTP distant, RTX 3080 16 Go",
"160", "~50 tok/s (côté serveur)", "159/160 (99,4 %)", "dégénérée (<pad>)"),
("LLamaSharp 0.27.0", "Qwen3-4B Q4_K_M (GGUF)", "in-process, CPU (CUDA jamais chargé ; voir #14157 (a))",
"353", "14,14 tok/s (CPU)", "0 (0 %)", "propre, français"),
("LLamaSharp 0.27.0", "Qwen3-4B Q4_K_M (GGUF)", "in-process, RTX 3080 Ti (37/37 couches CUDA0 ; voir #14364)",
"353", "36,57 tok/s (GPU)", "0 (0 %)", "propre, français"),
("ORT GenAI 0.15.2", "Qwen3-4B int4 (ONNX)", "in-process, RTX 3080 Ti, 16 Go VRAM libres",
$"{totalJetons10f}", $"{totalJetons10f / totalSecondes10f:F2} tok/s", $"{totalPads10f} ({100.0 * totalPads10f / totalJetons10f:F1} %)", "propre, français"),
};
Console.WriteLine($"| {"Moteur",-20} | {"Modèle",-24} | {"Conditions",-38} | {"Jetons",6} | {"Débit",-22} | {"Pads",-18} | {"Qualité",-18} |");
Console.WriteLine($"|{"",-22}|{"",-26}|{"",-40}|{"",-8}|{"",-24}|{"",-20}|{"",-20}|");
foreach (var l in lignes)
Console.WriteLine($"| {l.Moteur,-20} | {l.Modele,-24} | {l.Conditions,-38} | {l.Jetons,6} | {l.Debit,-22} | {l.Pads,-18} | {l.Qualite,-18} |");
Console.WriteLine($"\nLecture : les moteurs n'ont PAS servi le même format de modèle (GGUF Q4_K_M contre ONNX int4 block-128), ni le même déploiement (distant vs in-process), ni la même charge ({totalJetons10f} jetons émis côté ORT contre 353 côté LLamaSharp, tokenizers et critères d'arrêt distincts). Seuls les deux régimes LLamaSharp se comparent à charge identique (mêmes 353 jetons, échantillonnage déterministe) ; partout ailleurs ce tableau compare des débits, pas des charges. Le taux de jetons <pad> reste le seul axe strictement comparable entre les trois moteurs.");