diff --git a/audit/mutants-equivalents.json b/audit/mutants-equivalents.json new file mode 100644 index 0000000..0675862 --- /dev/null +++ b/audit/mutants-equivalents.json @@ -0,0 +1,246 @@ +[ + { + "cle": "src/moteur/indicateurs.js:nombre-plus-un:00c7051f9d2508f1:0", + "raison": "indicateurs.js, parcourirTours, visites[t] += 2 au lieu de 1 : visites[t] ne se lit que par visites[t] > 0 et se remet à 0 après chaque personne ; un pas de 2 garde le signe, aucune sortie ne change." + }, + { + "cle": "src/moteur/indicateurs.js:nombre-plus-un:7501d61d37d5e2f8:0", + "raison": "indicateurs.js, parcourirTours, reserveeAvant[t] = 2 au lieu de 1 : la marque ne se lit que par reserveeAvant[t] === 0." + }, + { + "cle": "src/moteur/indicateurs.js:frontiere:8d0d1504ba708607:1", + "raison": "indicateurs.js, parcourirTours, remise à zéro jusqu'à r <= R : le tour de trop lit la première case de la personne suivante, dont la table vaut 0 dans visites et reserveeAvant sauf si la personne courante l'a visitée, auquel cas la boucle la remet à 0 de toute façon ; pour la dernière personne la case est undefined, et une écriture à l'index undefined pose une propriété hors des éléments du tableau typé, que rien ne lit." + }, + { + "cle": "src/moteur/indicateurs.js:si-faux:032af4d6881bbbc2:1", + "raison": "indicateurs.js, parcourirTours, remise à zéro sans le continue des cases RESERVE : la case −1 écrit visites[−1] et reserveeAvant[−1] ; un index hors des éléments d'un tableau typé n'écrit rien." + }, + { + "cle": "src/moteur/indicateurs.js:corps-si:0bf37874b7af9907:1", + "raison": "indicateurs.js, parcourirTours, if (t === RESERVE) {} : même effet que le mutant si-faux du même if — visites[−1] et reserveeAvant[−1] ; un index hors des éléments d'un tableau typé n'écrit rien." + }, + { + "cle": "src/moteur/indicateurs.js:frontiere:540d595717113ffa:0", + "raison": "indicateurs.js, parcourirTours, i <= liste.length : le tour de trop lit a = undefined ; revenu[NaN] et fixe[NaN] sont undefined, rien n'est poussé, et la boucle intérieure part de j = length + 1, au-delà de la liste." + }, + { + "cle": "src/moteur/indicateurs.js:frontiere:cde969d8987ccd53:0", + "raison": "indicateurs.js, parcourirTours, j <= liste.length : le tour de trop lit b = undefined ; k = rangPaire(N, a, undefined) vaut NaN, parPaire[NaN] et libre[NaN] n'écrivent rien sur un tableau typé, groupe[undefined] n'égale aucun groupe et parPaire[NaN] >= 2 est faux : ni collègue ni revue n'est poussé." + }, + { + "cle": "src/moteur/indicateurs.js:nombre-plus-un:227d5e978a2c6f6e:0", + "raison": "indicateurs.js, lirePaires, vu[p * G + g] = 2 au lieu de 1 : la marque ne se lit que par === 0." + }, + { + "cle": "src/moteur/indicateurs.js:frontiere:344134eea29f143b:0", + "raison": "indicateurs.js, lirePaires, a <= N : pour a = N, la boucle intérieure (b de N + 1 à N − 1) ne tourne pas, et k n'avance pas." + }, + { + "cle": "src/moteur/indicateurs.js:frontiere:d9e6e8ece30ea311:0", + "raison": "indicateurs.js, lirePaires, n >= maxRencontresPaire : à égalité, l'affectation écrit la valeur déjà retenue." + }, + { + "cle": "src/moteur/indicateurs.js:arithmetique:4883685ba05bd48f:1", + "raison": "indicateurs.js, lireTours, nombrePaires = N(N + 1)/2 : ne dimensionne que collegueVu et revueVue, indexés par rangPaire, toujours < N(N − 1)/2 ; un tableau plus long garde les mêmes cases utiles, les autres ne se lisent jamais." + }, + { + "cle": "src/moteur/indicateurs.js:nombre-zero:4883685ba05bd48f:1", + "raison": "indicateurs.js, lireTours, nombrePaires = N·N/2 : même raison que N(N + 1)/2 — une longueur au moins égale (tronquée à l'entier par le constructeur du tableau typé) pour des index rangPaire < N(N − 1)/2." + }, + { + "cle": "src/moteur/indicateurs.js:arithmetique:9befd8786dbb9e8f:1", + "raison": "indicateurs.js, lireTours, nombrePaires = 2N(N − 1) : longueur au moins égale à N(N − 1)/2, mêmes cases utiles, les autres jamais lues." + }, + { + "cle": "src/moteur/indicateurs.js:nombre-plus-un:3ab1dfff408dce14:0", + "raison": "indicateurs.js, lireTours, collegueVu[k] = 2 au lieu de 1 : la marque ne se lit que par === 0." + }, + { + "cle": "src/moteur/indicateurs.js:nombre-plus-un:b13533cdd354d276:0", + "raison": "indicateurs.js, lireTours, revueVue[k] = 2 au lieu de 1 : la marque ne se lit que par === 0." + }, + { + "cle": "src/moteur/indicateurs.js:frontiere:c87986ba8e01803b:0", + "raison": "indicateurs.js, ajouter, valeur <= min : à égalité, le minimum retenu est la même valeur." + }, + { + "cle": "src/moteur/indicateurs.js:frontiere:6f32f41253f60a4b:2", + "raison": "indicateurs.js, mesurer, p <= N au compte des effectifs : groupe[N] est undefined, différent de SANS_GROUPE ; effectifs[undefined] += 1 pose une propriété « undefined » sur un tableau ordinaire, et parGroupe ne lit que les index 0 à G − 1." + }, + { + "cle": "src/moteur/indicateurs.js:si-vrai:fcd03735b3f47217:0", + "raison": "indicateurs.js, mesurer, if (true) au compte des effectifs : une personne sans appartenance incrémente effectifs[SANS_GROUPE], soit effectifs[−1], propriété hors des index d'un tableau ordinaire ; parGroupe ne lit que les index 0 à G − 1." + }, + { + "cle": "src/moteur/plafond.js:arithmetique:4ff9d4aad2110e83:0", + "raison": "plafond.js, borne, min(N + 1, …) : le terme Σ a_t + min(n_p, S) ne dépasse jamais N − 1. Les ancrés des tables distinctes, p exclu, sont au plus k − 1 pour un ancré et k sinon ; n_p vaut n pour un ancré et n − 1 sinon ; la somme vaut au plus k + n − 1 = N − 1 (n = N − k, configuration.js). Le min extérieur ne mord jamais, que sa borne soit N − 1 ou plus." + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:4ff9d4aad2110e83:0", + "raison": "plafond.js, borne, min(N − 0, …) : même raison que min(N + 1, …) — le terme intérieur vaut au plus N − 1." + }, + { + "cle": "src/moteur/plafond.js:nombre-plus-un:1bad6b8cf97131fc:0", + "raison": "plafond.js, ancrageDe, −2 au lieu de −1 pour un non-ancré : l'ancrage ne sert qu'à t === ancrage, où t est un index de table ≥ 0, et à la clé de signature, où −2 remplace −1 pour tous les non-ancrés à la fois : aucune comparaison ni aucun regroupement ne change." + }, + { + "cle": "src/moteur/plafond.js:frontiere:66f4a0fe878c0caf:0", + "raison": "plafond.js, tablesAdmissibles, t <= T : ancresParTable[T] et capacite[T] sont undefined, undefined < undefined est faux, rien ne s'ajoute." + }, + { + "cle": "src/moteur/plafond.js:frontiere:6f32f41253f60a4b:0", + "raison": "plafond.js, plafondsRealises, p <= N : la case N × R + r est hors du plan (undefined, différent de RESERVE) ; occupation[NaN] += 1 n'écrit rien sur un Int32Array." + }, + { + "cle": "src/moteur/plafond.js:si-vrai:f99905fb09a97ec2:0", + "raison": "plafond.js, plafondsRealises, if (true) : une case RESERVE (−1) écrit occupation[−R + r], index négatif puisque r < R ; un index hors des éléments d'un tableau typé n'écrit rien." + }, + { + "cle": "src/moteur/plafond.js:si-vrai:4e2d29d60a734ece:0", + "raison": "plafond.js, signature, chaque case poussée, LIBRE comprise : le nombre de cases LIBRE vaut R moins le nombre de tours fixés, que le multiensemble des tables fixées donne déjà ; deux clés sont égales sous le mutant si et seulement si elles le sont sans lui." + }, + { + "cle": "src/moteur/plafond.js:arithmetique:1e3e1be34f22da4b:0", + "raison": "plafond.js, signature, tri par x + y : le tri ne sert qu'à rendre la clé indépendante de l'ordre des tours. Un ordre faux peut séparer deux rangées de même multiensemble en deux clés, jamais réunir deux multiensembles distincts — la clé garde ses éléments — : la valeur mémoïsée reste exacte, seul le partage se perd." + }, + { + "cle": "src/moteur/plafond.js:nombre-plus-un:d0a020f0a45907d8:0", + "raison": "plafond.js, maximiser, vMax part de 1 : vMax ne sert qu'à W, qui grandit ou reste. Tout W' ≥ W rend le même plafond : sans écrêtage (W' ≥ f·vMax) la programmation dynamique est exacte, et un écrêtage à W' ≥ cap ne fond que des états où min(n_p, sieges0 + w) vaut déjà n_p." + }, + { + "cle": "src/moteur/plafond.js:min-max:921cce52c896cad6:0", + "raison": "plafond.js, maximiser, W = max(cap, f·vMax) : W grandit ou reste ; même raison que vMax partant de 1 — tout W' ≥ W rend le même plafond." + }, + { + "cle": "src/moteur/plafond.js:nombre-plus-un:6aaa76d38a359d8b:0", + "raison": "plafond.js, maximiser, cap = max(1, n_p − sieges0) : W grandit ou reste ; tout W' ≥ W rend le même plafond (voir vMax partant de 1)." + }, + { + "cle": "src/moteur/plafond.js:arithmetique:bf9f37f58ec637aa:0", + "raison": "plafond.js, maximiser, cap = max(0, n_p + sieges0) : sieges0 ≥ 0 (v ≥ 0 pour toute table qu'un plan valide fixe), donc W grandit ou reste ; tout W' ≥ W rend le même plafond (voir vMax partant de 1)." + }, + { + "cle": "src/moteur/plafond.js:nombre-plus-un:0bde1efec9ee24ca:0", + "raison": "plafond.js, maximiser, largeur = W + 2 : une colonne de plus par rangée, jamais écrite (cible ≤ W) ni lue (w ≤ W) ; chaque état garde une case distincte." + }, + { + "cle": "src/moteur/plafond.js:nombre-plus-un:6a44835bbd054679:0", + "raison": "plafond.js, maximiser, (f + 2) × largeur cases : une rangée de plus en fin de tableau, jamais lue ni écrite (s + m ≤ f)." + }, + { + "cle": "src/moteur/plafond.js:nombre-plus-un:1bad6b8cf97131fc:1", + "raison": "plafond.js, maximiser, fill(−2) : le marqueur d'état inatteignable ne se lit que par < 0 et >= 0, et tout atteint + gain ≥ 0 le dépasse ; −2 se comporte comme −1." + }, + { + "cle": "src/moteur/plafond.js:frontiere:ebba58ec39728177:0", + "raison": "plafond.js, maximiser, s <= f : à s = f, la boucle sur m (s + m ≤ f) ne tourne pas." + }, + { + "cle": "src/moteur/plafond.js:frontiere:f0a78f7a10078a9f:0", + "raison": "plafond.js, maximiser, atteint + gain >= suivant[cible] : à égalité, l'affectation écrit la valeur déjà présente." + }, + { + "cle": "src/moteur/plafond.js:nombre-plus-un:1bad6b8cf97131fc:2", + "raison": "plafond.js, maximiser, plafond part de −2 : l'état (f, W) est toujours atteint — la table de plus grand v prise f fois — avec une somme d'ancrés ≥ 0, et sa borne vaut au moins 0 ; le maximum ne dépend pas de la valeur initiale, pourvu qu'elle ne dépasse pas 0." + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:1bad6b8cf97131fc:2", + "raison": "plafond.js, maximiser, plafond part de −0 : même raison que −2 — un état atteint donne une borne x ≥ 0, et Math.max(−0, x) = x." + }, + { + "cle": "src/moteur/plafond.js:si-vrai:717790d7ce1ce378:0", + "raison": "plafond.js, maximiser, if (true) sur ajout >= 0 : un état inatteignable porte −1, soit ancres0 − 1, à un w ≤ W ; l'état (f, W) est atteint avec une somme ≥ 0, et la borne, croissante en ses deux termes, y vaut au moins autant : un état inatteignable ne l'emporte jamais." + }, + { + "cle": "src/moteur/plafond.js:frontiere:8d0d1504ba708607:4", + "raison": "plafond.js, enumerer, r <= R : itineraire[R] est undefined, qui n'égale pas LIBRE ; aucun tour libre ne s'ajoute." + }, + { + "cle": "src/moteur/plafond.js:nombre-plus-un:1bad6b8cf97131fc:3", + "raison": "plafond.js, enumerer, plafond part de −2 : au moins un itinéraire s'évalue (f > 0 et A > 0), et son plafond est ≥ 0 ; la valeur initiale ne l'emporte jamais." + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:1bad6b8cf97131fc:3", + "raison": "plafond.js, enumerer, plafond part de −0 : au moins un itinéraire s'évalue, de plafond x ≥ 0, et Math.max(−0, x) = x." + }, + { + "cle": "src/moteur/plafond.js:frontiere:8f48d3d06744671e:0", + "raison": "plafond.js, enumerer, i <= f : libres[f] est undefined ; itineraire[undefined] = … pose une propriété hors des index de l'Int32Array, que plafondItineraire ne lit pas (il lit length et les index 0 à R − 1)." + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:3cdd668f03bae9c9:0", + "raison": "plafond.js, enumerer, j = i + 0 : le premier tour écrit choix[i] = choix[i], sans effet ; les tours suivants sont ceux du code." + }, + { + "cle": "src/moteur/plafond.js:frontiere:2ad7eaa66ad4393a:0", + "raison": "plafond.js, enumerer, j <= f : choix[f] est hors d'un Int32Array de f cases ; un index hors des éléments d'un tableau typé n'écrit rien." + }, + { + "cle": "src/moteur/plafond.js:arithmetique:c621ca71e6b7f974:6", + "raison": "plafond.js, plafondsAPrioriParEnumeration, clé subarray(p / R, …) : l'index de début se tronque, et la clé devient une tranche qui finit par la rangée de p. Pour R ≥ 2 sa longueur, (p + 1)R − ⌊p/R⌋, croît strictement avec p : aucune clé n'est partagée, chaque plafond se calcule et reste exact ; pour R = 1, la tranche est la rangée même." + }, + { + "cle": "src/moteur/plafond.js:nombre-plus-un:722cded1530bd637:1", + "raison": "plafond.js, plafondsAPrioriParEnumeration, clé subarray(pR, (p + 2)R) : la clé ajoute la rangée suivante (rien pour la dernière personne, dont la clé a R cases contre 2R) ; deux clés égales ont même longueur et même début, donc même rangée : le regroupement se fait plus fin, jamais plus large." + }, + { + "cle": "src/moteur/plafond.js:si-vrai:b5e28aed44dacc4e:1", + "raison": "plafond.js, plafondsAPrioriParEnumeration, if (true) : le plafond se recalcule pour chaque personne au lieu d'être repris de sa rangée ; même valeur, seule la mémoïsation de l'oracle se perd, et l'oracle n'a pas de budget de temps." + }, + { + "cle": "src/moteur/classement.js:frontiere:d2e0232a8a610afd:0", + "raison": "classement.js, plusGrand, valeur >= plus : à égalité, l'affectation écrit la valeur déjà retenue." + }, + { + "cle": "src/moteur/classement.js:frontiere:6d8294f499162f5c:0", + "raison": "classement.js, comparerCles, i <= a.length : a[length] et b[length] sont tous deux undefined, donc égaux ; la boucle finit et rend 0, comme sans le tour de trop." + }, + { + "cle": "src/moteur/classement.js:frontiere:d5d8d6548f2d9d52:0", + "raison": "classement.js, comparerCles, a[i] <= b[i] sous a[i] !== b[i] : pour deux nombres différents, <= et < coïncident. Une clé ne mêle jamais null et nombre : le premier critère vaut null pour une liste d'écarts vide, et toutes les entrées ont des listes de même longueur (exigerMemeTaille), toutes vides ou aucune." + }, + { + "cle": "src/moteur/classement.js:nombre-plus-un:1bad6b8cf97131fc:0", + "raison": "classement.js, comparerCles, −2 au lieu de −1 : le résultat ne se lit que par son signe, dans sort et dans le || du départage par identifiant." + }, + { + "cle": "src/moteur/classement.js:nombre-plus-un:394f51f11873175b:0", + "raison": "classement.js, comparerCles, 2 au lieu de 1 : le résultat ne se lit que par son signe, dans sort et dans le || du départage par identifiant." + }, + { + "cle": "src/moteur/manque.js:frontiere:616dbb8c2f18776c:0", + "raison": "manque.js, plusGrand, valeur >= cumul : à égalité, le cumul retenu est la même valeur." + }, + { + "cle": "src/moteur/manque.js:arithmetique:ebfa5f19c5ac6881:0", + "raison": "manque.js, profilManque, départage a.id + b.id : à manque et plafond réalisé égaux, le comparateur rend un nombre positif. Le tri de V8 ne lit que « < 0 » et est stable : un positif s'y lit comme 0, et l'ordre reçu reste, celui de instance.ids, que normaliser trie par identifiant croissant et sans doublon — l'ordre de a.id − b.id. Une liste reçue dans un autre ordre ne peut pas se construire : profilManque parcourt instance.ids." + }, + { + "cle": "src/moteur/manque.js:frontiere:a42a37da6acfc1b0:0", + "raison": "manque.js, comparerProfils, difference <= 0 : la ligne ne s'atteint que pour difference !== 0, où <= 0 et < 0 coïncident." + }, + { + "cle": "src/moteur/manque.js:nombre-plus-un:a42a37da6acfc1b0:0", + "raison": "manque.js, comparerProfils, difference < 1 : un manque est un entier (plafond réalisé − rencontres, deux comptes), et la ligne ne s'atteint que pour difference !== 0 : < 1 et < 0 coïncident." + }, + { + "cle": "src/moteur/manque.js:nombre-plus-un:1bad6b8cf97131fc:0", + "raison": "manque.js, comparerProfils, signeRang = −2 au lieu de −1 : signeRang ne se lit que par < 0 et par comparaison à signe, qui reçoit les mêmes valeurs ; signe ne se rend pas." + }, + { + "cle": "src/moteur/manque.js:nombre-plus-un:499febce3e9d753b:0", + "raison": "manque.js, comparerProfils, signeRang = 2 au lieu de 1 : signeRang ne se lit que par < 0 et par comparaison à signe, qui reçoit les mêmes valeurs ; signe ne se rend pas." + }, + { + "cle": "src/moteur/manque.js:frontiere:09493d576cddf072:0", + "raison": "manque.js, comparerProfils, signeRang <= 0 : signeRang vaut −1 ou 1, jamais 0." + }, + { + "cle": "src/moteur/manque.js:nombre-plus-un:09493d576cddf072:0", + "raison": "manque.js, comparerProfils, signeRang < 1 : signeRang vaut −1 ou 1 ; < 1 et < 0 coïncident." + }, + { + "cle": "src/moteur/manque.js:si-vrai:3f2ec15cfbc2d410:0", + "raison": "manque.js, comparerProfils, bascule posée à chaque changement : rangBascule ne la rend que pour changements === 1, où la première et la dernière affectation sont la même." + } +] diff --git a/audit/mutation-moteur.json b/audit/mutation-moteur.json new file mode 100644 index 0000000..5438d15 --- /dev/null +++ b/audit/mutation-moteur.json @@ -0,0 +1,4432 @@ +{ + "format": 1, + "entete": { + "version": "2026.10.05.01", + "perimetre": [ + "src/moteur" + ], + "empreinte": "03c4a69b22d817acb42df47fd69ad536ed9c59cec709217ba3d165300f404715", + "node": "v26.10.0" + }, + "bilan": { + "total": 2576, + "tues": 2171, + "survivants": 137, + "equivalents": 61, + "delais": 207, + "erreurs": 0 + }, + "parFichier": [ + { + "fichier": "src/moteur/classement.js", + "total": 45, + "tues": 38, + "survivants": 0, + "equivalents": 5, + "delais": 2, + "erreurs": 0 + }, + { + "fichier": "src/moteur/configuration.js", + "total": 407, + "tues": 365, + "survivants": 11, + "equivalents": 0, + "delais": 31, + "erreurs": 0 + }, + { + "fichier": "src/moteur/conflits.js", + "total": 24, + "tues": 24, + "survivants": 0, + "equivalents": 0, + "delais": 0, + "erreurs": 0 + }, + { + "fichier": "src/moteur/diagnostic.js", + "total": 383, + "tues": 312, + "survivants": 45, + "equivalents": 0, + "delais": 26, + "erreurs": 0 + }, + { + "fichier": "src/moteur/indicateurs.js", + "total": 325, + "tues": 281, + "survivants": 0, + "equivalents": 18, + "delais": 26, + "erreurs": 0 + }, + { + "fichier": "src/moteur/manque.js", + "total": 162, + "tues": 148, + "survivants": 0, + "equivalents": 9, + "delais": 5, + "erreurs": 0 + }, + { + "fichier": "src/moteur/plafond.js", + "total": 397, + "tues": 305, + "survivants": 2, + "equivalents": 29, + "delais": 61, + "erreurs": 0 + }, + { + "fichier": "src/moteur/recherche.js", + "total": 648, + "tues": 530, + "survivants": 69, + "equivalents": 0, + "delais": 49, + "erreurs": 0 + }, + { + "fichier": "src/moteur/verification.js", + "total": 185, + "tues": 168, + "survivants": 10, + "equivalents": 0, + "delais": 7, + "erreurs": 0 + } + ], + "parOperateur": [ + { + "operateur": "arithmetique", + "total": 287, + "tues": 270, + "survivants": 8, + "equivalents": 7, + "delais": 2, + "erreurs": 0 + }, + { + "operateur": "frontiere", + "total": 165, + "tues": 113, + "survivants": 31, + "equivalents": 20, + "delais": 1, + "erreurs": 0 + }, + { + "operateur": "negation", + "total": 343, + "tues": 314, + "survivants": 5, + "equivalents": 0, + "delais": 24, + "erreurs": 0 + }, + { + "operateur": "logique", + "total": 77, + "tues": 71, + "survivants": 3, + "equivalents": 0, + "delais": 3, + "erreurs": 0 + }, + { + "operateur": "retrait-non", + "total": 36, + "tues": 36, + "survivants": 0, + "equivalents": 0, + "delais": 0, + "erreurs": 0 + }, + { + "operateur": "mise-a-jour", + "total": 158, + "tues": 84, + "survivants": 2, + "equivalents": 0, + "delais": 72, + "erreurs": 0 + }, + { + "operateur": "nombre-plus-un", + "total": 540, + "tues": 469, + "survivants": 47, + "equivalents": 20, + "delais": 4, + "erreurs": 0 + }, + { + "operateur": "nombre-zero", + "total": 291, + "tues": 184, + "survivants": 6, + "equivalents": 5, + "delais": 96, + "erreurs": 0 + }, + { + "operateur": "booleen", + "total": 22, + "tues": 22, + "survivants": 0, + "equivalents": 0, + "delais": 0, + "erreurs": 0 + }, + { + "operateur": "si-vrai", + "total": 186, + "tues": 170, + "survivants": 9, + "equivalents": 6, + "delais": 1, + "erreurs": 0 + }, + { + "operateur": "si-faux", + "total": 186, + "tues": 174, + "survivants": 9, + "equivalents": 1, + "delais": 2, + "erreurs": 0 + }, + { + "operateur": "ternaire-vrai", + "total": 39, + "tues": 35, + "survivants": 4, + "equivalents": 0, + "delais": 0, + "erreurs": 0 + }, + { + "operateur": "ternaire-faux", + "total": 39, + "tues": 37, + "survivants": 2, + "equivalents": 0, + "delais": 0, + "erreurs": 0 + }, + { + "operateur": "min-max", + "total": 21, + "tues": 19, + "survivants": 1, + "equivalents": 1, + "delais": 0, + "erreurs": 0 + }, + { + "operateur": "corps-si", + "total": 186, + "tues": 173, + "survivants": 10, + "equivalents": 1, + "delais": 2, + "erreurs": 0 + } + ], + "survivants": [ + { + "cle": "src/moteur/configuration.js:nombre-plus-un:cf3bae39dd692048:0", + "fichier": "src/moteur/configuration.js", + "ligne": 58, + "colonne": 20, + "operateur": "nombre-plus-un", + "original": "2", + "remplacement": "3", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/configuration.js:ternaire-vrai:d13bbfb55053c499:0", + "fichier": "src/moteur/configuration.js", + "ligne": 76, + "colonne": 37, + "operateur": "ternaire-vrai", + "original": "typeof valeur === 'string'", + "remplacement": "true", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/configuration.js:si-faux:414f66e0c799d0f8:0", + "fichier": "src/moteur/configuration.js", + "ligne": 108, + "colonne": 7, + "operateur": "si-faux", + "original": "typeof contraintes !== 'object' || contraintes === null", + "remplacement": "false", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/configuration.js:logique:414f66e0c799d0f8:0", + "fichier": "src/moteur/configuration.js", + "ligne": 108, + "colonne": 39, + "operateur": "logique", + "original": "typeof contraintes !== 'object' || contraintes === null", + "remplacement": "((typeof contraintes !== 'object' )&&( contraintes === null))", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/configuration.js:corps-si:2dbd5c1d4b550c5f:0", + "fichier": "src/moteur/configuration.js", + "ligne": 108, + "colonne": 64, + "operateur": "corps-si", + "original": "{\n throw new TypeError('configuration.contraintes : objet attendu');\n }", + "remplacement": "{}", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/configuration.js:frontiere:6f32f41253f60a4b:0", + "fichier": "src/moteur/configuration.js", + "ligne": 204, + "colonne": 21, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/configuration.js:si-vrai:b136d63b19054e6c:0", + "fichier": "src/moteur/configuration.js", + "ligne": 207, + "colonne": 11, + "operateur": "si-vrai", + "original": "t !== LIBRE", + "remplacement": "true", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/configuration.js:frontiere:66f4a0fe878c0caf:0", + "fichier": "src/moteur/configuration.js", + "ligne": 210, + "colonne": 21, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/configuration.js:corps-si:3ea5365b91f64a8a:0", + "fichier": "src/moteur/configuration.js", + "ligne": 242, + "colonne": 17, + "operateur": "corps-si", + "original": "{\n statut[p] = STATUT.MOBILE;\n }", + "remplacement": "{}", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/configuration.js:arithmetique:5a079debdfff12da:0", + "fichier": "src/moteur/configuration.js", + "ligne": 307, + "colonne": 27, + "operateur": "arithmetique", + "original": "-", + "remplacement": "+", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/configuration.js:frontiere:6f32f41253f60a4b:2", + "fichier": "src/moteur/configuration.js", + "ligne": 431, + "colonne": 23, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:si-faux:bfff314e410f366d:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 91, + "colonne": 7, + "operateur": "si-faux", + "original": "T === 0", + "remplacement": "false", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-plus-un:bfff314e410f366d:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 91, + "colonne": 13, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:corps-si:6be2e46a3d0765fd:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 91, + "colonne": 16, + "operateur": "corps-si", + "original": "return 0;", + "remplacement": "{}", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-plus-un:6be2e46a3d0765fd:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 91, + "colonne": 23, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-zero:e8ca389f132932a8:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 95, + "colonne": 18, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:frontiere:66f4a0fe878c0caf:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 95, + "colonne": 23, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:frontiere:a9ae4ec2d66a8e27:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 95, + "colonne": 51, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-plus-un:9ac68b492485663f:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 123, + "colonne": 22, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-plus-un:a216dbba9047bdaf:2", + "fichier": "src/moteur/diagnostic.js", + "ligne": 162, + "colonne": 31, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:frontiere:6f32f41253f60a4b:3", + "fichier": "src/moteur/diagnostic.js", + "ligne": 174, + "colonne": 21, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-plus-un:3744ff7c717dd966:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 195, + "colonne": 25, + "operateur": "nombre-plus-un", + "original": "2", + "remplacement": "3", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:arithmetique:f292b274084feb7a:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 205, + "colonne": 53, + "operateur": "arithmetique", + "original": "-", + "remplacement": "+", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:si-faux:ffa976c094482cd2:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 232, + "colonne": 7, + "operateur": "si-faux", + "original": "lignes.length === 0", + "remplacement": "false", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:corps-si:978d2e9c98c1a618:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 232, + "colonne": 28, + "operateur": "corps-si", + "original": "return lignes;", + "remplacement": "{}", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:frontiere:cba81979b0566d97:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 234, + "colonne": 109, + "operateur": "frontiere", + "original": "<=", + "remplacement": "<", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:min-max:9045df4cb45ef696:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 235, + "colonne": 25, + "operateur": "min-max", + "original": "max", + "remplacement": "min", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-plus-un:8eaa567415750c40:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 236, + "colonne": 55, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:arithmetique:4d0a5097616f60a9:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 239, + "colonne": 39, + "operateur": "arithmetique", + "original": "-", + "remplacement": "+", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-zero:4d0a5097616f60a9:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 239, + "colonne": 41, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:arithmetique:082db377e017ec67:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 239, + "colonne": 80, + "operateur": "arithmetique", + "original": "+", + "remplacement": "-", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:logique:b3a92cedb61ad8cc:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 243, + "colonne": 43, + "operateur": "logique", + "original": "ligne.tablesManquantes === null && !sansRemede.has(ligne.groupe)", + "remplacement": "((ligne.tablesManquantes === null )||( !sansRemede.has(ligne.groupe)))", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:logique:7f94c629d937725f:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 243, + "colonne": 76, + "operateur": "logique", + "original": "ligne.tablesManquantes === null && !sansRemede.has(ligne.groupe) && m <= ligne.effectif", + "remplacement": "((ligne.tablesManquantes === null && !sansRemede.has(ligne.groupe) )||( m <= ligne.effectif))", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:frontiere:4dde70975ef1508f:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 243, + "colonne": 81, + "operateur": "frontiere", + "original": "<=", + "remplacement": "<", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:arithmetique:ff01cd09cdc0bc1d:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 258, + "colonne": 22, + "operateur": "arithmetique", + "original": "-", + "remplacement": "+", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-zero:ff01cd09cdc0bc1d:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 258, + "colonne": 24, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:frontiere:fe6d1e5cb9ee904a:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 258, + "colonne": 33, + "operateur": "frontiere", + "original": ">=", + "remplacement": ">", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-plus-un:fe6d1e5cb9ee904a:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 258, + "colonne": 36, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-plus-un:41db857bf70428ff:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 258, + "colonne": 48, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-plus-un:547b58a30bc0a997:4", + "fichier": "src/moteur/diagnostic.js", + "ligne": 286, + "colonne": 16, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:frontiere:6f32f41253f60a4b:4", + "fichier": "src/moteur/diagnostic.js", + "ligne": 286, + "colonne": 21, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-plus-un:1aba89bbb28411ae:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 286, + "colonne": 85, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:frontiere:66f4a0fe878c0caf:2", + "fichier": "src/moteur/diagnostic.js", + "ligne": 288, + "colonne": 21, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-plus-un:a4b2c9ff906d249f:2", + "fichier": "src/moteur/diagnostic.js", + "ligne": 288, + "colonne": 31, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:si-faux:808c6fe59930a896:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 336, + "colonne": 7, + "operateur": "si-faux", + "original": "mobile === -1", + "remplacement": "false", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-plus-un:1bad6b8cf97131fc:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 336, + "colonne": 19, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:corps-si:4ad2292cb6c5c2d3:3", + "fichier": "src/moteur/diagnostic.js", + "ligne": 336, + "colonne": 22, + "operateur": "corps-si", + "original": "return null;", + "remplacement": "{}", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:si-vrai:bb6edd982e2e0488:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 348, + "colonne": 9, + "operateur": "si-vrai", + "original": "passant === undefined", + "remplacement": "true", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:frontiere:a24249598a5087fc:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 355, + "colonne": 45, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-plus-un:8026f1dc0f945152:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 365, + "colonne": 21, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-plus-un:8026f1dc0f945152:1", + "fichier": "src/moteur/diagnostic.js", + "ligne": 366, + "colonne": 21, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:frontiere:c87986ba8e01803b:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 368, + "colonne": 16, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:si-vrai:0e62a1e486712b45:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 369, + "colonne": 9, + "operateur": "si-vrai", + "original": "valeur > max", + "remplacement": "true", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:si-faux:0e62a1e486712b45:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 369, + "colonne": 9, + "operateur": "si-faux", + "original": "valeur > max", + "remplacement": "false", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:frontiere:0e62a1e486712b45:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 369, + "colonne": 16, + "operateur": "frontiere", + "original": ">", + "remplacement": ">=", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/diagnostic.js:corps-si:e4c2b1742702861a:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 369, + "colonne": 23, + "operateur": "corps-si", + "original": "max = valeur;", + "remplacement": "{}", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/plafond.js:si-vrai:b5e28aed44dacc4e:0", + "fichier": "src/moteur/plafond.js", + "ligne": 268, + "colonne": 9, + "operateur": "si-vrai", + "original": "plafond === undefined", + "remplacement": "true", + "couverte": true, + "longue": "tue" + }, + { + "cle": "src/moteur/plafond.js:frontiere:91da8a7654bc6855:0", + "fichier": "src/moteur/plafond.js", + "ligne": 285, + "colonne": 16, + "operateur": "frontiere", + "original": ">", + "remplacement": ">=", + "couverte": true, + "longue": "tue" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:1bad6b8cf97131fc:0", + "fichier": "src/moteur/recherche.js", + "ligne": 143, + "colonne": 18, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:6596dc3bba58638c:0", + "fichier": "src/moteur/recherche.js", + "ligne": 160, + "colonne": 20, + "operateur": "nombre-plus-un", + "original": "0xffff", + "remplacement": "65536", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:nombre-zero:6596dc3bba58638c:0", + "fichier": "src/moteur/recherche.js", + "ligne": 160, + "colonne": 20, + "operateur": "nombre-zero", + "original": "0xffff", + "remplacement": "0", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:ternaire-vrai:f8189fe558316f60:0", + "fichier": "src/moteur/recherche.js", + "ligne": 165, + "colonne": 3, + "operateur": "ternaire-vrai", + "original": "typeof valeur === 'number'", + "remplacement": "true", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:ternaire-faux:f8189fe558316f60:0", + "fichier": "src/moteur/recherche.js", + "ligne": 165, + "colonne": 3, + "operateur": "ternaire-faux", + "original": "typeof valeur === 'number'", + "remplacement": "false", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:negation:f8189fe558316f60:0", + "fichier": "src/moteur/recherche.js", + "ligne": 165, + "colonne": 17, + "operateur": "negation", + "original": "===", + "remplacement": "!==", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:f0523190eade887a:0", + "fichier": "src/moteur/recherche.js", + "ligne": 200, + "colonne": 36, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:frontiere:66f4a0fe878c0caf:0", + "fichier": "src/moteur/recherche.js", + "ligne": 201, + "colonne": 21, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:85e3325768e4f4e4:1", + "fichier": "src/moteur/recherche.js", + "ligne": 204, + "colonne": 16, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:frontiere:66f4a0fe878c0caf:1", + "fichier": "src/moteur/recherche.js", + "ligne": 204, + "colonne": 21, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:7249db31e68d9e7d:1", + "fichier": "src/moteur/recherche.js", + "ligne": 204, + "colonne": 75, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:frontiere:8d0d1504ba708607:0", + "fichier": "src/moteur/recherche.js", + "ligne": 214, + "colonne": 21, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:d850f94bdaabcc65:0", + "fichier": "src/moteur/recherche.js", + "ligne": 215, + "colonne": 18, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "couverte": true, + "longue": "tue" + }, + { + "cle": "src/moteur/recherche.js:frontiere:6f32f41253f60a4b:0", + "fichier": "src/moteur/recherche.js", + "ligne": 217, + "colonne": 23, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:32ea99e99f98f65a:0", + "fichier": "src/moteur/recherche.js", + "ligne": 223, + "colonne": 23, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "couverte": true, + "longue": "tue" + }, + { + "cle": "src/moteur/recherche.js:frontiere:6f32f41253f60a4b:1", + "fichier": "src/moteur/recherche.js", + "ligne": 241, + "colonne": 21, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:a216dbba9047bdaf:1", + "fichier": "src/moteur/recherche.js", + "ligne": 241, + "colonne": 31, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "couverte": true, + "longue": "tue" + }, + { + "cle": "src/moteur/recherche.js:frontiere:8d0d1504ba708607:1", + "fichier": "src/moteur/recherche.js", + "ligne": 242, + "colonne": 23, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "couverte": true, + "longue": "tue" + }, + { + "cle": "src/moteur/recherche.js:frontiere:7d1bafe580984c35:0", + "fichier": "src/moteur/recherche.js", + "ligne": 247, + "colonne": 21, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:53fa5760154d90e8:0", + "fichier": "src/moteur/recherche.js", + "ligne": 252, + "colonne": 19, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:547b58a30bc0a997:2", + "fichier": "src/moteur/recherche.js", + "ligne": 253, + "colonne": 16, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "couverte": true, + "longue": "tue" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:a216dbba9047bdaf:2", + "fichier": "src/moteur/recherche.js", + "ligne": 253, + "colonne": 31, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "couverte": true, + "longue": "tue" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:8136471d1947f817:0", + "fichier": "src/moteur/recherche.js", + "ligne": 269, + "colonne": 37, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:frontiere:4964701bb9672a91:0", + "fichier": "src/moteur/recherche.js", + "ligne": 285, + "colonne": 13, + "operateur": "frontiere", + "original": ">", + "remplacement": ">=", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:mise-a-jour:74e1f61770d5c394:0", + "fichier": "src/moteur/recherche.js", + "ligne": 299, + "colonne": 20, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "couverte": true, + "longue": "tue" + }, + { + "cle": "src/moteur/recherche.js:frontiere:f004b1ffa3dbf9fa:0", + "fichier": "src/moteur/recherche.js", + "ligne": 301, + "colonne": 23, + "operateur": "frontiere", + "original": ">", + "remplacement": ">=", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:mise-a-jour:2a6f58021d2d2599:0", + "fichier": "src/moteur/recherche.js", + "ligne": 302, + "colonne": 31, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "couverte": true, + "longue": "tue" + }, + { + "cle": "src/moteur/recherche.js:frontiere:efe1e5c7656bf0ba:0", + "fichier": "src/moteur/recherche.js", + "ligne": 317, + "colonne": 15, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:negation:efe1e5c7656bf0ba:0", + "fichier": "src/moteur/recherche.js", + "ligne": 317, + "colonne": 15, + "operateur": "negation", + "original": "<", + "remplacement": ">=", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:frontiere:f004b1ffa3dbf9fa:1", + "fichier": "src/moteur/recherche.js", + "ligne": 325, + "colonne": 13, + "operateur": "frontiere", + "original": ">", + "remplacement": ">=", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:si-faux:94252e040e6c3290:0", + "fichier": "src/moteur/recherche.js", + "ligne": 351, + "colonne": 9, + "operateur": "si-faux", + "original": "s === exclu", + "remplacement": "false", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:corps-si:0bf37874b7af9907:0", + "fichier": "src/moteur/recherche.js", + "ligne": 351, + "colonne": 22, + "operateur": "corps-si", + "original": "continue;", + "remplacement": "{}", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:si-vrai:c9e104a555a44bd6:0", + "fichier": "src/moteur/recherche.js", + "ligne": 353, + "colonne": 9, + "operateur": "si-vrai", + "original": "q !== FANTOME", + "remplacement": "true", + "couverte": true, + "longue": "tue" + }, + { + "cle": "src/moteur/recherche.js:ternaire-vrai:24193ec16d54cc7c:0", + "fichier": "src/moteur/recherche.js", + "ligne": 417, + "colonne": 13, + "operateur": "ternaire-vrai", + "original": "R <= UINT16_MAX", + "remplacement": "true", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:ternaire-faux:24193ec16d54cc7c:0", + "fichier": "src/moteur/recherche.js", + "ligne": 417, + "colonne": 13, + "operateur": "ternaire-faux", + "original": "R <= UINT16_MAX", + "remplacement": "false", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:frontiere:24193ec16d54cc7c:0", + "fichier": "src/moteur/recherche.js", + "ligne": 417, + "colonne": 15, + "operateur": "frontiere", + "original": "<=", + "remplacement": "<", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:negation:24193ec16d54cc7c:0", + "fichier": "src/moteur/recherche.js", + "ligne": 417, + "colonne": 15, + "operateur": "negation", + "original": "<=", + "remplacement": ">", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:arithmetique:aa49e0b687abcf43:1", + "fichier": "src/moteur/recherche.js", + "ligne": 417, + "colonne": 74, + "operateur": "arithmetique", + "original": "*", + "remplacement": "/", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:f570259830c6c9ed:0", + "fichier": "src/moteur/recherche.js", + "ligne": 424, + "colonne": 31, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:si-vrai:c9e104a555a44bd6:1", + "fichier": "src/moteur/recherche.js", + "ligne": 452, + "colonne": 13, + "operateur": "si-vrai", + "original": "q !== FANTOME", + "remplacement": "true", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:13fa52edec01b188:0", + "fichier": "src/moteur/recherche.js", + "ligne": 491, + "colonne": 17, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:e0d945b61a35a200:0", + "fichier": "src/moteur/recherche.js", + "ligne": 494, + "colonne": 16, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:4f52c213e6e44b5e:0", + "fichier": "src/moteur/recherche.js", + "ligne": 494, + "colonne": 42, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:92f574f1c5e6419c:0", + "fichier": "src/moteur/recherche.js", + "ligne": 535, + "colonne": 18, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:ccf15e4f87ae4337:2", + "fichier": "src/moteur/recherche.js", + "ligne": 536, + "colonne": 16, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:92f574f1c5e6419c:1", + "fichier": "src/moteur/recherche.js", + "ligne": 542, + "colonne": 18, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:si-vrai:95476e68875729dc:0", + "fichier": "src/moteur/recherche.js", + "ligne": 547, + "colonne": 9, + "operateur": "si-vrai", + "original": "mouvement !== null", + "remplacement": "true", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:bc30efa0e866ef2a:0", + "fichier": "src/moteur/recherche.js", + "ligne": 551, + "colonne": 50, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "couverte": true, + "longue": "tue" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:bc30efa0e866ef2a:1", + "fichier": "src/moteur/recherche.js", + "ligne": 551, + "colonne": 62, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "couverte": true, + "longue": "tue" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:9e9819057aefb747:0", + "fichier": "src/moteur/recherche.js", + "ligne": 551, + "colonne": 69, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "couverte": true, + "longue": "tue" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:6bdb440888819c6a:0", + "fichier": "src/moteur/recherche.js", + "ligne": 560, + "colonne": 34, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:8af307b56c46c8de:0", + "fichier": "src/moteur/recherche.js", + "ligne": 664, + "colonne": 23, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:6b06f07fc82e91d1:0", + "fichier": "src/moteur/recherche.js", + "ligne": 670, + "colonne": 16, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:6b06f07fc82e91d1:1", + "fichier": "src/moteur/recherche.js", + "ligne": 721, + "colonne": 16, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:b3235e2c1dea830b:0", + "fichier": "src/moteur/recherche.js", + "ligne": 772, + "colonne": 34, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "couverte": true, + "longue": "tue" + }, + { + "cle": "src/moteur/recherche.js:frontiere:6f32f41253f60a4b:4", + "fichier": "src/moteur/recherche.js", + "ligne": 779, + "colonne": 21, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:si-vrai:f99905fb09a97ec2:0", + "fichier": "src/moteur/recherche.js", + "ligne": 782, + "colonne": 11, + "operateur": "si-vrai", + "original": "t !== RESERVE", + "remplacement": "true", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:si-faux:e566466e6f60af64:0", + "fichier": "src/moteur/recherche.js", + "ligne": 813, + "colonne": 7, + "operateur": "si-faux", + "original": "m < 2", + "remplacement": "false", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:frontiere:e566466e6f60af64:0", + "fichier": "src/moteur/recherche.js", + "ligne": 813, + "colonne": 9, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:nombre-plus-un:e566466e6f60af64:0", + "fichier": "src/moteur/recherche.js", + "ligne": 813, + "colonne": 11, + "operateur": "nombre-plus-un", + "original": "2", + "remplacement": "3", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:nombre-zero:e566466e6f60af64:0", + "fichier": "src/moteur/recherche.js", + "ligne": 813, + "colonne": 11, + "operateur": "nombre-zero", + "original": "2", + "remplacement": "0", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:corps-si:4ad2292cb6c5c2d3:0", + "fichier": "src/moteur/recherche.js", + "ligne": 813, + "colonne": 14, + "operateur": "corps-si", + "original": "return null;", + "remplacement": "{}", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:si-faux:5c1bba0b23c6f3c3:0", + "fichier": "src/moteur/recherche.js", + "ligne": 818, + "colonne": 7, + "operateur": "si-faux", + "original": "siege[base + a] === FANTOME && siege[base + b] === FANTOME", + "remplacement": "false", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:arithmetique:9745b61e47d9ebf1:2", + "fichier": "src/moteur/recherche.js", + "ligne": 818, + "colonne": 18, + "operateur": "arithmetique", + "original": "+", + "remplacement": "-", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:negation:309b214345322cf3:0", + "fichier": "src/moteur/recherche.js", + "ligne": 818, + "colonne": 23, + "operateur": "negation", + "original": "===", + "remplacement": "!==", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:arithmetique:ef14dbc1f166517d:2", + "fichier": "src/moteur/recherche.js", + "ligne": 818, + "colonne": 49, + "operateur": "arithmetique", + "original": "+", + "remplacement": "-", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:negation:1b84a757f3fac515:0", + "fichier": "src/moteur/recherche.js", + "ligne": 818, + "colonne": 54, + "operateur": "negation", + "original": "===", + "remplacement": "!==", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:corps-si:4ad2292cb6c5c2d3:2", + "fichier": "src/moteur/recherche.js", + "ligne": 818, + "colonne": 67, + "operateur": "corps-si", + "original": "return null;", + "remplacement": "{}", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/recherche.js:si-vrai:95476e68875729dc:1", + "fichier": "src/moteur/recherche.js", + "ligne": 832, + "colonne": 7, + "operateur": "si-vrai", + "original": "mouvement !== null", + "remplacement": "true", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/verification.js:nombre-plus-un:cf3bae39dd692048:0", + "fichier": "src/moteur/verification.js", + "ligne": 25, + "colonne": 21, + "operateur": "nombre-plus-un", + "original": "2", + "remplacement": "3", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/verification.js:nombre-plus-un:1bad6b8cf97131fc:0", + "fichier": "src/moteur/verification.js", + "ligne": 157, + "colonne": 17, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/verification.js:nombre-zero:1bad6b8cf97131fc:0", + "fichier": "src/moteur/verification.js", + "ligne": 157, + "colonne": 17, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/verification.js:ternaire-vrai:be312eab7bfc810f:0", + "fichier": "src/moteur/verification.js", + "ligne": 164, + "colonne": 17, + "operateur": "ternaire-vrai", + "original": "i < tableDeListe.length", + "remplacement": "true", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/verification.js:frontiere:be312eab7bfc810f:0", + "fichier": "src/moteur/verification.js", + "ligne": 164, + "colonne": 19, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/verification.js:si-faux:8bdf2a7e57bd9301:0", + "fichier": "src/moteur/verification.js", + "ligne": 167, + "colonne": 13, + "operateur": "si-faux", + "original": "p < 0", + "remplacement": "false", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/verification.js:corps-si:0bf37874b7af9907:0", + "fichier": "src/moteur/verification.js", + "ligne": 167, + "colonne": 20, + "operateur": "corps-si", + "original": "continue;", + "remplacement": "{}", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/verification.js:nombre-plus-un:129d7624b7199751:0", + "fichier": "src/moteur/verification.js", + "ligne": 168, + "colonne": 24, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/verification.js:nombre-plus-un:ca1a67f9214e4e8e:0", + "fichier": "src/moteur/verification.js", + "ligne": 169, + "colonne": 50, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "couverte": true, + "longue": "survivant" + }, + { + "cle": "src/moteur/verification.js:frontiere:be312eab7bfc810f:1", + "fichier": "src/moteur/verification.js", + "ligne": 174, + "colonne": 44, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "couverte": true, + "longue": "survivant" + } + ], + "equivalents": [ + { + "cle": "src/moteur/classement.js:frontiere:d2e0232a8a610afd:0", + "fichier": "src/moteur/classement.js", + "ligne": 43, + "colonne": 61, + "operateur": "frontiere", + "original": ">", + "remplacement": ">=", + "raison": "classement.js, plusGrand, valeur >= plus : à égalité, l'affectation écrit la valeur déjà retenue." + }, + { + "cle": "src/moteur/classement.js:frontiere:6d8294f499162f5c:0", + "fichier": "src/moteur/classement.js", + "ligne": 95, + "colonne": 21, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "raison": "classement.js, comparerCles, i <= a.length : a[length] et b[length] sont tous deux undefined, donc égaux ; la boucle finit et rend 0, comme sans le tour de trop." + }, + { + "cle": "src/moteur/classement.js:frontiere:d5d8d6548f2d9d52:0", + "fichier": "src/moteur/classement.js", + "ligne": 96, + "colonne": 36, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "raison": "classement.js, comparerCles, a[i] <= b[i] sous a[i] !== b[i] : pour deux nombres différents, <= et < coïncident. Une clé ne mêle jamais null et nombre : le premier critère vaut null pour une liste d'écarts vide, et toutes les entrées ont des listes de même longueur (exigerMemeTaille), toutes vides ou aucune." + }, + { + "cle": "src/moteur/classement.js:nombre-plus-un:1bad6b8cf97131fc:0", + "fichier": "src/moteur/classement.js", + "ligne": 96, + "colonne": 46, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "raison": "classement.js, comparerCles, −2 au lieu de −1 : le résultat ne se lit que par son signe, dans sort et dans le || du départage par identifiant." + }, + { + "cle": "src/moteur/classement.js:nombre-plus-un:394f51f11873175b:0", + "fichier": "src/moteur/classement.js", + "ligne": 96, + "colonne": 50, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "raison": "classement.js, comparerCles, 2 au lieu de 1 : le résultat ne se lit que par son signe, dans sort et dans le || du départage par identifiant." + }, + { + "cle": "src/moteur/indicateurs.js:nombre-plus-un:00c7051f9d2508f1:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 136, + "colonne": 21, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "raison": "indicateurs.js, parcourirTours, visites[t] += 2 au lieu de 1 : visites[t] ne se lit que par visites[t] > 0 et se remet à 0 après chaque personne ; un pas de 2 garde le signe, aucune sortie ne change." + }, + { + "cle": "src/moteur/indicateurs.js:nombre-plus-un:7501d61d37d5e2f8:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 137, + "colonne": 40, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "raison": "indicateurs.js, parcourirTours, reserveeAvant[t] = 2 au lieu de 1 : la marque ne se lit que par reserveeAvant[t] === 0." + }, + { + "cle": "src/moteur/indicateurs.js:frontiere:8d0d1504ba708607:1", + "fichier": "src/moteur/indicateurs.js", + "ligne": 139, + "colonne": 23, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "raison": "indicateurs.js, parcourirTours, remise à zéro jusqu'à r <= R : le tour de trop lit la première case de la personne suivante, dont la table vaut 0 dans visites et reserveeAvant sauf si la personne courante l'a visitée, auquel cas la boucle la remet à 0 de toute façon ; pour la dernière personne la case est undefined, et une écriture à l'index undefined pose une propriété hors des éléments du tableau typé, que rien ne lit." + }, + { + "cle": "src/moteur/indicateurs.js:si-faux:032af4d6881bbbc2:1", + "fichier": "src/moteur/indicateurs.js", + "ligne": 141, + "colonne": 11, + "operateur": "si-faux", + "original": "t === RESERVE", + "remplacement": "false", + "raison": "indicateurs.js, parcourirTours, remise à zéro sans le continue des cases RESERVE : la case −1 écrit visites[−1] et reserveeAvant[−1] ; un index hors des éléments d'un tableau typé n'écrit rien." + }, + { + "cle": "src/moteur/indicateurs.js:corps-si:0bf37874b7af9907:1", + "fichier": "src/moteur/indicateurs.js", + "ligne": 141, + "colonne": 26, + "operateur": "corps-si", + "original": "continue;", + "remplacement": "{}", + "raison": "indicateurs.js, parcourirTours, if (t === RESERVE) {} : même effet que le mutant si-faux du même if — visites[−1] et reserveeAvant[−1] ; un index hors des éléments d'un tableau typé n'écrit rien." + }, + { + "cle": "src/moteur/indicateurs.js:frontiere:540d595717113ffa:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 169, + "colonne": 25, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "raison": "indicateurs.js, parcourirTours, i <= liste.length : le tour de trop lit a = undefined ; revenu[NaN] et fixe[NaN] sont undefined, rien n'est poussé, et la boucle intérieure part de j = length + 1, au-delà de la liste." + }, + { + "cle": "src/moteur/indicateurs.js:frontiere:cde969d8987ccd53:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 174, + "colonne": 31, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "raison": "indicateurs.js, parcourirTours, j <= liste.length : le tour de trop lit b = undefined ; k = rangPaire(N, a, undefined) vaut NaN, parPaire[NaN] et libre[NaN] n'écrivent rien sur un tableau typé, groupe[undefined] n'égale aucun groupe et parPaire[NaN] >= 2 est faux : ni collègue ni revue n'est poussé." + }, + { + "cle": "src/moteur/indicateurs.js:nombre-plus-un:227d5e978a2c6f6e:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 212, + "colonne": 23, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "raison": "indicateurs.js, lirePaires, vu[p * G + g] = 2 au lieu de 1 : la marque ne se lit que par === 0." + }, + { + "cle": "src/moteur/indicateurs.js:frontiere:344134eea29f143b:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 218, + "colonne": 21, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "raison": "indicateurs.js, lirePaires, a <= N : pour a = N, la boucle intérieure (b de N + 1 à N − 1) ne tourne pas, et k n'avance pas." + }, + { + "cle": "src/moteur/indicateurs.js:frontiere:d9e6e8ece30ea311:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 224, + "colonne": 13, + "operateur": "frontiere", + "original": ">", + "remplacement": ">=", + "raison": "indicateurs.js, lirePaires, n >= maxRencontresPaire : à égalité, l'affectation écrit la valeur déjà retenue." + }, + { + "cle": "src/moteur/indicateurs.js:arithmetique:4883685ba05bd48f:1", + "fichier": "src/moteur/indicateurs.js", + "ligne": 237, + "colonne": 32, + "operateur": "arithmetique", + "original": "-", + "remplacement": "+", + "raison": "indicateurs.js, lireTours, nombrePaires = N(N + 1)/2 : ne dimensionne que collegueVu et revueVue, indexés par rangPaire, toujours < N(N − 1)/2 ; un tableau plus long garde les mêmes cases utiles, les autres ne se lisent jamais." + }, + { + "cle": "src/moteur/indicateurs.js:nombre-zero:4883685ba05bd48f:1", + "fichier": "src/moteur/indicateurs.js", + "ligne": 237, + "colonne": 34, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "raison": "indicateurs.js, lireTours, nombrePaires = N·N/2 : même raison que N(N + 1)/2 — une longueur au moins égale (tronquée à l'entier par le constructeur du tableau typé) pour des index rangPaire < N(N − 1)/2." + }, + { + "cle": "src/moteur/indicateurs.js:arithmetique:9befd8786dbb9e8f:1", + "fichier": "src/moteur/indicateurs.js", + "ligne": 237, + "colonne": 38, + "operateur": "arithmetique", + "original": "/", + "remplacement": "*", + "raison": "indicateurs.js, lireTours, nombrePaires = 2N(N − 1) : longueur au moins égale à N(N − 1)/2, mêmes cases utiles, les autres jamais lues." + }, + { + "cle": "src/moteur/indicateurs.js:nombre-plus-un:3ab1dfff408dce14:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 251, + "colonne": 27, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "raison": "indicateurs.js, lireTours, collegueVu[k] = 2 au lieu de 1 : la marque ne se lit que par === 0." + }, + { + "cle": "src/moteur/indicateurs.js:nombre-plus-un:b13533cdd354d276:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 258, + "colonne": 25, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "raison": "indicateurs.js, lireTours, revueVue[k] = 2 au lieu de 1 : la marque ne se lit que par === 0." + }, + { + "cle": "src/moteur/indicateurs.js:frontiere:c87986ba8e01803b:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 274, + "colonne": 31, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "raison": "indicateurs.js, ajouter, valeur <= min : à égalité, le minimum retenu est la même valeur." + }, + { + "cle": "src/moteur/indicateurs.js:frontiere:6f32f41253f60a4b:2", + "fichier": "src/moteur/indicateurs.js", + "ligne": 324, + "colonne": 21, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "raison": "indicateurs.js, mesurer, p <= N au compte des effectifs : groupe[N] est undefined, différent de SANS_GROUPE ; effectifs[undefined] += 1 pose une propriété « undefined » sur un tableau ordinaire, et parGroupe ne lit que les index 0 à G − 1." + }, + { + "cle": "src/moteur/indicateurs.js:si-vrai:fcd03735b3f47217:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 325, + "colonne": 9, + "operateur": "si-vrai", + "original": "groupe[p] !== SANS_GROUPE", + "remplacement": "true", + "raison": "indicateurs.js, mesurer, if (true) au compte des effectifs : une personne sans appartenance incrémente effectifs[SANS_GROUPE], soit effectifs[−1], propriété hors des index d'un tableau ordinaire ; parGroupe ne lit que les index 0 à G − 1." + }, + { + "cle": "src/moteur/manque.js:frontiere:616dbb8c2f18776c:0", + "fichier": "src/moteur/manque.js", + "ligne": 91, + "colonne": 64, + "operateur": "frontiere", + "original": ">", + "remplacement": ">=", + "raison": "manque.js, plusGrand, valeur >= cumul : à égalité, le cumul retenu est la même valeur." + }, + { + "cle": "src/moteur/manque.js:arithmetique:ebfa5f19c5ac6881:0", + "fichier": "src/moteur/manque.js", + "ligne": 231, + "colonne": 82, + "operateur": "arithmetique", + "original": "-", + "remplacement": "+", + "raison": "manque.js, profilManque, départage a.id + b.id : à manque et plafond réalisé égaux, le comparateur rend un nombre positif. Le tri de V8 ne lit que « < 0 » et est stable : un positif s'y lit comme 0, et l'ordre reçu reste, celui de instance.ids, que normaliser trie par identifiant croissant et sans doublon — l'ordre de a.id − b.id. Une liste reçue dans un autre ordre ne peut pas se construire : profilManque parcourt instance.ids." + }, + { + "cle": "src/moteur/manque.js:frontiere:a42a37da6acfc1b0:0", + "fichier": "src/moteur/manque.js", + "ligne": 287, + "colonne": 34, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "raison": "manque.js, comparerProfils, difference <= 0 : la ligne ne s'atteint que pour difference !== 0, où <= 0 et < 0 coïncident." + }, + { + "cle": "src/moteur/manque.js:nombre-plus-un:a42a37da6acfc1b0:0", + "fichier": "src/moteur/manque.js", + "ligne": 287, + "colonne": 36, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "raison": "manque.js, comparerProfils, difference < 1 : un manque est un entier (plafond réalisé − rencontres, deux comptes), et la ligne ne s'atteint que pour difference !== 0 : < 1 et < 0 coïncident." + }, + { + "cle": "src/moteur/manque.js:nombre-plus-un:1bad6b8cf97131fc:0", + "fichier": "src/moteur/manque.js", + "ligne": 287, + "colonne": 41, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "raison": "manque.js, comparerProfils, signeRang = −2 au lieu de −1 : signeRang ne se lit que par < 0 et par comparaison à signe, qui reçoit les mêmes valeurs ; signe ne se rend pas." + }, + { + "cle": "src/moteur/manque.js:nombre-plus-un:499febce3e9d753b:0", + "fichier": "src/moteur/manque.js", + "ligne": 287, + "colonne": 45, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "raison": "manque.js, comparerProfils, signeRang = 2 au lieu de 1 : signeRang ne se lit que par < 0 et par comparaison à signe, qui reçoit les mêmes valeurs ; signe ne se rend pas." + }, + { + "cle": "src/moteur/manque.js:frontiere:09493d576cddf072:0", + "fichier": "src/moteur/manque.js", + "ligne": 288, + "colonne": 19, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "raison": "manque.js, comparerProfils, signeRang <= 0 : signeRang vaut −1 ou 1, jamais 0." + }, + { + "cle": "src/moteur/manque.js:nombre-plus-un:09493d576cddf072:0", + "fichier": "src/moteur/manque.js", + "ligne": 288, + "colonne": 21, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "raison": "manque.js, comparerProfils, signeRang < 1 : signeRang vaut −1 ou 1 ; < 1 et < 0 coïncident." + }, + { + "cle": "src/moteur/manque.js:si-vrai:3f2ec15cfbc2d410:0", + "fichier": "src/moteur/manque.js", + "ligne": 292, + "colonne": 11, + "operateur": "si-vrai", + "original": "changements === 1", + "remplacement": "true", + "raison": "manque.js, comparerProfils, bascule posée à chaque changement : rangBascule ne la rend que pour changements === 1, où la première et la dernière affectation sont la même." + }, + { + "cle": "src/moteur/plafond.js:arithmetique:4ff9d4aad2110e83:0", + "fichier": "src/moteur/plafond.js", + "ligne": 55, + "colonne": 30, + "operateur": "arithmetique", + "original": "-", + "remplacement": "+", + "raison": "plafond.js, borne, min(N + 1, …) : le terme Σ a_t + min(n_p, S) ne dépasse jamais N − 1. Les ancrés des tables distinctes, p exclu, sont au plus k − 1 pour un ancré et k sinon ; n_p vaut n pour un ancré et n − 1 sinon ; la somme vaut au plus k + n − 1 = N − 1 (n = N − k, configuration.js). Le min extérieur ne mord jamais, que sa borne soit N − 1 ou plus." + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:4ff9d4aad2110e83:0", + "fichier": "src/moteur/plafond.js", + "ligne": 55, + "colonne": 32, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "raison": "plafond.js, borne, min(N − 0, …) : même raison que min(N + 1, …) — le terme intérieur vaut au plus N − 1." + }, + { + "cle": "src/moteur/plafond.js:nombre-plus-un:1bad6b8cf97131fc:0", + "fichier": "src/moteur/plafond.js", + "ligne": 65, + "colonne": 74, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "raison": "plafond.js, ancrageDe, −2 au lieu de −1 pour un non-ancré : l'ancrage ne sert qu'à t === ancrage, où t est un index de table ≥ 0, et à la clé de signature, où −2 remplace −1 pour tous les non-ancrés à la fois : aucune comparaison ni aucun regroupement ne change." + }, + { + "cle": "src/moteur/plafond.js:frontiere:66f4a0fe878c0caf:0", + "fichier": "src/moteur/plafond.js", + "ligne": 74, + "colonne": 21, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "raison": "plafond.js, tablesAdmissibles, t <= T : ancresParTable[T] et capacite[T] sont undefined, undefined < undefined est faux, rien ne s'ajoute." + }, + { + "cle": "src/moteur/plafond.js:frontiere:6f32f41253f60a4b:0", + "fichier": "src/moteur/plafond.js", + "ligne": 160, + "colonne": 21, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "raison": "plafond.js, plafondsRealises, p <= N : la case N × R + r est hors du plan (undefined, différent de RESERVE) ; occupation[NaN] += 1 n'écrit rien sur un Int32Array." + }, + { + "cle": "src/moteur/plafond.js:si-vrai:f99905fb09a97ec2:0", + "fichier": "src/moteur/plafond.js", + "ligne": 163, + "colonne": 11, + "operateur": "si-vrai", + "original": "t !== RESERVE", + "remplacement": "true", + "raison": "plafond.js, plafondsRealises, if (true) : une case RESERVE (−1) écrit occupation[−R + r], index négatif puisque r < R ; un index hors des éléments d'un tableau typé n'écrit rien." + }, + { + "cle": "src/moteur/plafond.js:si-vrai:4e2d29d60a734ece:0", + "fichier": "src/moteur/plafond.js", + "ligne": 180, + "colonne": 38, + "operateur": "si-vrai", + "original": "fixe[p * R + r] !== LIBRE", + "remplacement": "true", + "raison": "plafond.js, signature, chaque case poussée, LIBRE comprise : le nombre de cases LIBRE vaut R moins le nombre de tours fixés, que le multiensemble des tables fixées donne déjà ; deux clés sont égales sous le mutant si et seulement si elles le sont sans lui." + }, + { + "cle": "src/moteur/plafond.js:arithmetique:1e3e1be34f22da4b:0", + "fichier": "src/moteur/plafond.js", + "ligne": 181, + "colonne": 27, + "operateur": "arithmetique", + "original": "-", + "remplacement": "+", + "raison": "plafond.js, signature, tri par x + y : le tri ne sert qu'à rendre la clé indépendante de l'ordre des tours. Un ordre faux peut séparer deux rangées de même multiensemble en deux clés, jamais réunir deux multiensembles distincts — la clé garde ses éléments — : la valeur mémoïsée reste exacte, seul le partage se perd." + }, + { + "cle": "src/moteur/plafond.js:nombre-plus-un:d0a020f0a45907d8:0", + "fichier": "src/moteur/plafond.js", + "ligne": 223, + "colonne": 14, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "raison": "plafond.js, maximiser, vMax part de 1 : vMax ne sert qu'à W, qui grandit ou reste. Tout W' ≥ W rend le même plafond : sans écrêtage (W' ≥ f·vMax) la programmation dynamique est exacte, et un écrêtage à W' ≥ cap ne fond que des états où min(n_p, sieges0 + w) vaut déjà n_p." + }, + { + "cle": "src/moteur/plafond.js:min-max:921cce52c896cad6:0", + "fichier": "src/moteur/plafond.js", + "ligne": 225, + "colonne": 18, + "operateur": "min-max", + "original": "min", + "remplacement": "max", + "raison": "plafond.js, maximiser, W = max(cap, f·vMax) : W grandit ou reste ; même raison que vMax partant de 1 — tout W' ≥ W rend le même plafond." + }, + { + "cle": "src/moteur/plafond.js:nombre-plus-un:6aaa76d38a359d8b:0", + "fichier": "src/moteur/plafond.js", + "ligne": 225, + "colonne": 31, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "raison": "plafond.js, maximiser, cap = max(1, n_p − sieges0) : W grandit ou reste ; tout W' ≥ W rend le même plafond (voir vMax partant de 1)." + }, + { + "cle": "src/moteur/plafond.js:arithmetique:bf9f37f58ec637aa:0", + "fichier": "src/moteur/plafond.js", + "ligne": 225, + "colonne": 37, + "operateur": "arithmetique", + "original": "-", + "remplacement": "+", + "raison": "plafond.js, maximiser, cap = max(0, n_p + sieges0) : sieges0 ≥ 0 (v ≥ 0 pour toute table qu'un plan valide fixe), donc W grandit ou reste ; tout W' ≥ W rend le même plafond (voir vMax partant de 1)." + }, + { + "cle": "src/moteur/plafond.js:nombre-plus-un:0bde1efec9ee24ca:0", + "fichier": "src/moteur/plafond.js", + "ligne": 226, + "colonne": 23, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "raison": "plafond.js, maximiser, largeur = W + 2 : une colonne de plus par rangée, jamais écrite (cible ≤ W) ni lue (w ≤ W) ; chaque état garde une case distincte." + }, + { + "cle": "src/moteur/plafond.js:nombre-plus-un:6a44835bbd054679:0", + "fichier": "src/moteur/plafond.js", + "ligne": 227, + "colonne": 38, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "raison": "plafond.js, maximiser, (f + 2) × largeur cases : une rangée de plus en fin de tableau, jamais lue ni écrite (s + m ≤ f)." + }, + { + "cle": "src/moteur/plafond.js:nombre-plus-un:1bad6b8cf97131fc:1", + "fichier": "src/moteur/plafond.js", + "ligne": 227, + "colonne": 58, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "raison": "plafond.js, maximiser, fill(−2) : le marqueur d'état inatteignable ne se lit que par < 0 et >= 0, et tout atteint + gain ≥ 0 le dépasse ; −2 se comporte comme −1." + }, + { + "cle": "src/moteur/plafond.js:frontiere:ebba58ec39728177:0", + "fichier": "src/moteur/plafond.js", + "ligne": 233, + "colonne": 23, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "raison": "plafond.js, maximiser, s <= f : à s = f, la boucle sur m (s + m ≤ f) ne tourne pas." + }, + { + "cle": "src/moteur/plafond.js:frontiere:f0a78f7a10078a9f:0", + "fichier": "src/moteur/plafond.js", + "ligne": 239, + "colonne": 30, + "operateur": "frontiere", + "original": ">", + "remplacement": ">=", + "raison": "plafond.js, maximiser, atteint + gain >= suivant[cible] : à égalité, l'affectation écrit la valeur déjà présente." + }, + { + "cle": "src/moteur/plafond.js:nombre-plus-un:1bad6b8cf97131fc:2", + "fichier": "src/moteur/plafond.js", + "ligne": 245, + "colonne": 18, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "raison": "plafond.js, maximiser, plafond part de −2 : l'état (f, W) est toujours atteint — la table de plus grand v prise f fois — avec une somme d'ancrés ≥ 0, et sa borne vaut au moins 0 ; le maximum ne dépend pas de la valeur initiale, pourvu qu'elle ne dépasse pas 0." + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:1bad6b8cf97131fc:2", + "fichier": "src/moteur/plafond.js", + "ligne": 245, + "colonne": 18, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "raison": "plafond.js, maximiser, plafond part de −0 : même raison que −2 — un état atteint donne une borne x ≥ 0, et Math.max(−0, x) = x." + }, + { + "cle": "src/moteur/plafond.js:si-vrai:717790d7ce1ce378:0", + "fichier": "src/moteur/plafond.js", + "ligne": 248, + "colonne": 9, + "operateur": "si-vrai", + "original": "ajout >= 0", + "remplacement": "true", + "raison": "plafond.js, maximiser, if (true) sur ajout >= 0 : un état inatteignable porte −1, soit ancres0 − 1, à un w ≤ W ; l'état (f, W) est atteint avec une somme ≥ 0, et la borne, croissante en ses deux termes, y vaut au moins autant : un état inatteignable ne l'emporte jamais." + }, + { + "cle": "src/moteur/plafond.js:frontiere:8d0d1504ba708607:4", + "fichier": "src/moteur/plafond.js", + "ligne": 299, + "colonne": 21, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "raison": "plafond.js, enumerer, r <= R : itineraire[R] est undefined, qui n'égale pas LIBRE ; aucun tour libre ne s'ajoute." + }, + { + "cle": "src/moteur/plafond.js:nombre-plus-un:1bad6b8cf97131fc:3", + "fichier": "src/moteur/plafond.js", + "ligne": 316, + "colonne": 18, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "raison": "plafond.js, enumerer, plafond part de −2 : au moins un itinéraire s'évalue (f > 0 et A > 0), et son plafond est ≥ 0 ; la valeur initiale ne l'emporte jamais." + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:1bad6b8cf97131fc:3", + "fichier": "src/moteur/plafond.js", + "ligne": 316, + "colonne": 18, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "raison": "plafond.js, enumerer, plafond part de −0 : au moins un itinéraire s'évalue, de plafond x ≥ 0, et Math.max(−0, x) = x." + }, + { + "cle": "src/moteur/plafond.js:frontiere:8f48d3d06744671e:0", + "fichier": "src/moteur/plafond.js", + "ligne": 318, + "colonne": 23, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "raison": "plafond.js, enumerer, i <= f : libres[f] est undefined ; itineraire[undefined] = … pose une propriété hors des index de l'Int32Array, que plafondItineraire ne lit pas (il lit length et les index 0 à R − 1)." + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:3cdd668f03bae9c9:0", + "fichier": "src/moteur/plafond.js", + "ligne": 324, + "colonne": 22, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "raison": "plafond.js, enumerer, j = i + 0 : le premier tour écrit choix[i] = choix[i], sans effet ; les tours suivants sont ceux du code." + }, + { + "cle": "src/moteur/plafond.js:frontiere:2ad7eaa66ad4393a:0", + "fichier": "src/moteur/plafond.js", + "ligne": 324, + "colonne": 27, + "operateur": "frontiere", + "original": "<", + "remplacement": "<=", + "raison": "plafond.js, enumerer, j <= f : choix[f] est hors d'un Int32Array de f cases ; un index hors des éléments d'un tableau typé n'écrit rien." + }, + { + "cle": "src/moteur/plafond.js:arithmetique:c621ca71e6b7f974:6", + "fichier": "src/moteur/plafond.js", + "ligne": 350, + "colonne": 33, + "operateur": "arithmetique", + "original": "*", + "remplacement": "/", + "raison": "plafond.js, plafondsAPrioriParEnumeration, clé subarray(p / R, …) : l'index de début se tronque, et la clé devient une tranche qui finit par la rangée de p. Pour R ≥ 2 sa longueur, (p + 1)R − ⌊p/R⌋, croît strictement avec p : aucune clé n'est partagée, chaque plafond se calcule et reste exact ; pour R = 1, la tranche est la rangée même." + }, + { + "cle": "src/moteur/plafond.js:nombre-plus-un:722cded1530bd637:1", + "fichier": "src/moteur/plafond.js", + "ligne": 350, + "colonne": 43, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "raison": "plafond.js, plafondsAPrioriParEnumeration, clé subarray(pR, (p + 2)R) : la clé ajoute la rangée suivante (rien pour la dernière personne, dont la clé a R cases contre 2R) ; deux clés égales ont même longueur et même début, donc même rangée : le regroupement se fait plus fin, jamais plus large." + }, + { + "cle": "src/moteur/plafond.js:si-vrai:b5e28aed44dacc4e:1", + "fichier": "src/moteur/plafond.js", + "ligne": 352, + "colonne": 9, + "operateur": "si-vrai", + "original": "plafond === undefined", + "remplacement": "true", + "raison": "plafond.js, plafondsAPrioriParEnumeration, if (true) : le plafond se recalcule pour chaque personne au lieu d'être repris de sa rangée ; même valeur, seule la mémoïsation de l'oracle se perd, et l'oracle n'a pas de budget de temps." + } + ], + "delaisEtErreurs": [ + { + "cle": "src/moteur/classement.js:mise-a-jour:a09689f630889c59:0", + "fichier": "src/moteur/classement.js", + "ligne": 95, + "colonne": 35, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/classement.js:nombre-zero:a09689f630889c59:0", + "fichier": "src/moteur/classement.js", + "ligne": 95, + "colonne": 38, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:nombre-zero:a216dbba9047bdaf:0", + "fichier": "src/moteur/configuration.js", + "ligne": 129, + "colonne": 45, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:nombre-zero:a09689f630889c59:0", + "fichier": "src/moteur/configuration.js", + "ligne": 153, + "colonne": 49, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:nombre-zero:ebb134b390d9273f:0", + "fichier": "src/moteur/configuration.js", + "ligne": 182, + "colonne": 46, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:negation:6f32f41253f60a4b:0", + "fichier": "src/moteur/configuration.js", + "ligne": 204, + "colonne": 21, + "operateur": "negation", + "original": "<", + "remplacement": ">=", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:mise-a-jour:a216dbba9047bdaf:1", + "fichier": "src/moteur/configuration.js", + "ligne": 204, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:nombre-zero:a216dbba9047bdaf:1", + "fichier": "src/moteur/configuration.js", + "ligne": 204, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:mise-a-jour:ebb134b390d9273f:1", + "fichier": "src/moteur/configuration.js", + "ligne": 205, + "colonne": 30, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:nombre-zero:ebb134b390d9273f:1", + "fichier": "src/moteur/configuration.js", + "ligne": 205, + "colonne": 33, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:negation:66f4a0fe878c0caf:0", + "fichier": "src/moteur/configuration.js", + "ligne": 210, + "colonne": 21, + "operateur": "negation", + "original": "<", + "remplacement": ">=", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:mise-a-jour:a4b2c9ff906d249f:0", + "fichier": "src/moteur/configuration.js", + "ligne": 210, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:nombre-zero:a4b2c9ff906d249f:0", + "fichier": "src/moteur/configuration.js", + "ligne": 210, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:mise-a-jour:ebb134b390d9273f:2", + "fichier": "src/moteur/configuration.js", + "ligne": 211, + "colonne": 30, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:nombre-zero:ebb134b390d9273f:2", + "fichier": "src/moteur/configuration.js", + "ligne": 211, + "colonne": 33, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:negation:6f32f41253f60a4b:1", + "fichier": "src/moteur/configuration.js", + "ligne": 233, + "colonne": 21, + "operateur": "negation", + "original": "<", + "remplacement": ">=", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:mise-a-jour:a216dbba9047bdaf:2", + "fichier": "src/moteur/configuration.js", + "ligne": 233, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:nombre-zero:a216dbba9047bdaf:2", + "fichier": "src/moteur/configuration.js", + "ligne": 233, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:mise-a-jour:ebb134b390d9273f:3", + "fichier": "src/moteur/configuration.js", + "ligne": 237, + "colonne": 30, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:nombre-zero:ebb134b390d9273f:3", + "fichier": "src/moteur/configuration.js", + "ligne": 237, + "colonne": 33, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:nombre-zero:ebb134b390d9273f:4", + "fichier": "src/moteur/configuration.js", + "ligne": 418, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:nombre-zero:a09689f630889c59:1", + "fichier": "src/moteur/configuration.js", + "ligne": 427, + "colonne": 45, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:negation:6f32f41253f60a4b:2", + "fichier": "src/moteur/configuration.js", + "ligne": 431, + "colonne": 23, + "operateur": "negation", + "original": "<", + "remplacement": ">=", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:mise-a-jour:a216dbba9047bdaf:3", + "fichier": "src/moteur/configuration.js", + "ligne": 431, + "colonne": 30, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:nombre-zero:a216dbba9047bdaf:3", + "fichier": "src/moteur/configuration.js", + "ligne": 431, + "colonne": 33, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:nombre-zero:a09689f630889c59:2", + "fichier": "src/moteur/configuration.js", + "ligne": 460, + "colonne": 44, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:nombre-zero:ebb134b390d9273f:5", + "fichier": "src/moteur/configuration.js", + "ligne": 485, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:nombre-zero:a216dbba9047bdaf:4", + "fichier": "src/moteur/configuration.js", + "ligne": 490, + "colonne": 33, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:mise-a-jour:a4b2c9ff906d249f:2", + "fichier": "src/moteur/configuration.js", + "ligne": 511, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:nombre-zero:a4b2c9ff906d249f:2", + "fichier": "src/moteur/configuration.js", + "ligne": 511, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:negation:1f179becc96d017b:0", + "fichier": "src/moteur/configuration.js", + "ligne": 551, + "colonne": 21, + "operateur": "negation", + "original": "<", + "remplacement": ">=", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:mise-a-jour:a216dbba9047bdaf:5", + "fichier": "src/moteur/configuration.js", + "ligne": 551, + "colonne": 41, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/configuration.js:nombre-zero:a216dbba9047bdaf:5", + "fichier": "src/moteur/configuration.js", + "ligne": 551, + "colonne": 44, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/diagnostic.js:negation:a04f86182e47f719:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 93, + "colonne": 21, + "operateur": "negation", + "original": "<", + "remplacement": ">=", + "issue": "delai" + }, + { + "cle": "src/moteur/diagnostic.js:mise-a-jour:a09689f630889c59:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 93, + "colonne": 33, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-zero:a09689f630889c59:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 93, + "colonne": 36, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/diagnostic.js:mise-a-jour:a4b2c9ff906d249f:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 95, + "colonne": 30, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-zero:a4b2c9ff906d249f:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 95, + "colonne": 33, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/diagnostic.js:mise-a-jour:a4b2c9ff906d249f:1", + "fichier": "src/moteur/diagnostic.js", + "ligne": 99, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-zero:a4b2c9ff906d249f:1", + "fichier": "src/moteur/diagnostic.js", + "ligne": 99, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-zero:a216dbba9047bdaf:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 119, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-zero:7c8bf16d94ad269f:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 121, + "colonne": 44, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/diagnostic.js:mise-a-jour:ebb134b390d9273f:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 124, + "colonne": 30, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-zero:ebb134b390d9273f:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 124, + "colonne": 33, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/diagnostic.js:mise-a-jour:a216dbba9047bdaf:1", + "fichier": "src/moteur/diagnostic.js", + "ligne": 160, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-zero:a216dbba9047bdaf:1", + "fichier": "src/moteur/diagnostic.js", + "ligne": 160, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/diagnostic.js:mise-a-jour:a216dbba9047bdaf:2", + "fichier": "src/moteur/diagnostic.js", + "ligne": 162, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-zero:a216dbba9047bdaf:2", + "fichier": "src/moteur/diagnostic.js", + "ligne": 162, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/diagnostic.js:negation:6f32f41253f60a4b:3", + "fichier": "src/moteur/diagnostic.js", + "ligne": 174, + "colonne": 21, + "operateur": "negation", + "original": "<", + "remplacement": ">=", + "issue": "delai" + }, + { + "cle": "src/moteur/diagnostic.js:mise-a-jour:a216dbba9047bdaf:3", + "fichier": "src/moteur/diagnostic.js", + "ligne": 174, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-zero:a216dbba9047bdaf:3", + "fichier": "src/moteur/diagnostic.js", + "ligne": 174, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/diagnostic.js:mise-a-jour:41db857bf70428ff:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 258, + "colonne": 45, + "operateur": "mise-a-jour", + "original": "-=", + "remplacement": "+=", + "issue": "delai" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-zero:41db857bf70428ff:0", + "fichier": "src/moteur/diagnostic.js", + "ligne": 258, + "colonne": 48, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/diagnostic.js:negation:6f32f41253f60a4b:4", + "fichier": "src/moteur/diagnostic.js", + "ligne": 286, + "colonne": 21, + "operateur": "negation", + "original": "<", + "remplacement": ">=", + "issue": "delai" + }, + { + "cle": "src/moteur/diagnostic.js:mise-a-jour:a216dbba9047bdaf:4", + "fichier": "src/moteur/diagnostic.js", + "ligne": 286, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-zero:a216dbba9047bdaf:4", + "fichier": "src/moteur/diagnostic.js", + "ligne": 286, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/diagnostic.js:mise-a-jour:a4b2c9ff906d249f:2", + "fichier": "src/moteur/diagnostic.js", + "ligne": 288, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-zero:a4b2c9ff906d249f:2", + "fichier": "src/moteur/diagnostic.js", + "ligne": 288, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/diagnostic.js:nombre-zero:a4b2c9ff906d249f:3", + "fichier": "src/moteur/diagnostic.js", + "ligne": 341, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/indicateurs.js:negation:6f32f41253f60a4b:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 126, + "colonne": 21, + "operateur": "negation", + "original": "<", + "remplacement": ">=", + "issue": "delai" + }, + { + "cle": "src/moteur/indicateurs.js:mise-a-jour:a216dbba9047bdaf:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 126, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/indicateurs.js:nombre-zero:a216dbba9047bdaf:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 126, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/indicateurs.js:mise-a-jour:ebb134b390d9273f:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 127, + "colonne": 30, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/indicateurs.js:nombre-zero:ebb134b390d9273f:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 127, + "colonne": 33, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/indicateurs.js:mise-a-jour:ebb134b390d9273f:1", + "fichier": "src/moteur/indicateurs.js", + "ligne": 139, + "colonne": 30, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/indicateurs.js:nombre-zero:ebb134b390d9273f:1", + "fichier": "src/moteur/indicateurs.js", + "ligne": 139, + "colonne": 33, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/indicateurs.js:mise-a-jour:ebb134b390d9273f:2", + "fichier": "src/moteur/indicateurs.js", + "ligne": 157, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/indicateurs.js:nombre-zero:ebb134b390d9273f:2", + "fichier": "src/moteur/indicateurs.js", + "ligne": 157, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/indicateurs.js:nombre-zero:a216dbba9047bdaf:1", + "fichier": "src/moteur/indicateurs.js", + "ligne": 159, + "colonne": 33, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/indicateurs.js:nombre-zero:a4b2c9ff906d249f:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 164, + "colonne": 33, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/indicateurs.js:negation:540d595717113ffa:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 169, + "colonne": 25, + "operateur": "negation", + "original": "<", + "remplacement": ">=", + "issue": "delai" + }, + { + "cle": "src/moteur/indicateurs.js:mise-a-jour:a09689f630889c59:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 169, + "colonne": 43, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/indicateurs.js:nombre-zero:a09689f630889c59:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 169, + "colonne": 46, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/indicateurs.js:negation:cde969d8987ccd53:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 174, + "colonne": 31, + "operateur": "negation", + "original": "<", + "remplacement": ">=", + "issue": "delai" + }, + { + "cle": "src/moteur/indicateurs.js:mise-a-jour:03a9f167c4bb4b6d:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 174, + "colonne": 49, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/indicateurs.js:nombre-zero:03a9f167c4bb4b6d:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 174, + "colonne": 52, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/indicateurs.js:negation:344134eea29f143b:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 218, + "colonne": 21, + "operateur": "negation", + "original": "<", + "remplacement": ">=", + "issue": "delai" + }, + { + "cle": "src/moteur/indicateurs.js:mise-a-jour:c2d90d623b0f4c2e:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 218, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/indicateurs.js:nombre-zero:c2d90d623b0f4c2e:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 218, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/indicateurs.js:negation:8db2bb1bc94307d2:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 219, + "colonne": 27, + "operateur": "negation", + "original": "<", + "remplacement": ">=", + "issue": "delai" + }, + { + "cle": "src/moteur/indicateurs.js:mise-a-jour:afbf1e31d69b2dfb:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 219, + "colonne": 34, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/indicateurs.js:nombre-zero:afbf1e31d69b2dfb:0", + "fichier": "src/moteur/indicateurs.js", + "ligne": 219, + "colonne": 37, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/indicateurs.js:negation:6f32f41253f60a4b:2", + "fichier": "src/moteur/indicateurs.js", + "ligne": 324, + "colonne": 21, + "operateur": "negation", + "original": "<", + "remplacement": ">=", + "issue": "delai" + }, + { + "cle": "src/moteur/indicateurs.js:mise-a-jour:a216dbba9047bdaf:2", + "fichier": "src/moteur/indicateurs.js", + "ligne": 324, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/indicateurs.js:nombre-zero:a216dbba9047bdaf:2", + "fichier": "src/moteur/indicateurs.js", + "ligne": 324, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/manque.js:mise-a-jour:a216dbba9047bdaf:0", + "fichier": "src/moteur/manque.js", + "ligne": 80, + "colonne": 40, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/manque.js:nombre-zero:a216dbba9047bdaf:0", + "fichier": "src/moteur/manque.js", + "ligne": 80, + "colonne": 43, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/manque.js:mise-a-jour:a216dbba9047bdaf:1", + "fichier": "src/moteur/manque.js", + "ligne": 227, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/manque.js:nombre-zero:a216dbba9047bdaf:1", + "fichier": "src/moteur/manque.js", + "ligne": 227, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/manque.js:nombre-zero:a09689f630889c59:0", + "fichier": "src/moteur/manque.js", + "ligne": 281, + "colonne": 44, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:negation:66f4a0fe878c0caf:0", + "fichier": "src/moteur/plafond.js", + "ligne": 74, + "colonne": 21, + "operateur": "negation", + "original": "<", + "remplacement": ">=", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:mise-a-jour:a4b2c9ff906d249f:0", + "fichier": "src/moteur/plafond.js", + "ligne": 74, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:a4b2c9ff906d249f:0", + "fichier": "src/moteur/plafond.js", + "ligne": 74, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:mise-a-jour:d2145c6a456ebee5:0", + "fichier": "src/moteur/plafond.js", + "ligne": 81, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:d2145c6a456ebee5:0", + "fichier": "src/moteur/plafond.js", + "ligne": 81, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:mise-a-jour:ebb134b390d9273f:0", + "fichier": "src/moteur/plafond.js", + "ligne": 93, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:ebb134b390d9273f:0", + "fichier": "src/moteur/plafond.js", + "ligne": 93, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:a09689f630889c59:0", + "fichier": "src/moteur/plafond.js", + "ligne": 107, + "colonne": 47, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:negation:6f32f41253f60a4b:0", + "fichier": "src/moteur/plafond.js", + "ligne": 160, + "colonne": 21, + "operateur": "negation", + "original": "<", + "remplacement": ">=", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:mise-a-jour:a216dbba9047bdaf:0", + "fichier": "src/moteur/plafond.js", + "ligne": 160, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:a216dbba9047bdaf:0", + "fichier": "src/moteur/plafond.js", + "ligne": 160, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:mise-a-jour:ebb134b390d9273f:1", + "fichier": "src/moteur/plafond.js", + "ligne": 161, + "colonne": 30, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:ebb134b390d9273f:1", + "fichier": "src/moteur/plafond.js", + "ligne": 161, + "colonne": 33, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:negation:6f32f41253f60a4b:1", + "fichier": "src/moteur/plafond.js", + "ligne": 167, + "colonne": 21, + "operateur": "negation", + "original": "<", + "remplacement": ">=", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:mise-a-jour:a216dbba9047bdaf:1", + "fichier": "src/moteur/plafond.js", + "ligne": 167, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:a216dbba9047bdaf:1", + "fichier": "src/moteur/plafond.js", + "ligne": 167, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:mise-a-jour:ebb134b390d9273f:2", + "fichier": "src/moteur/plafond.js", + "ligne": 180, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:ebb134b390d9273f:2", + "fichier": "src/moteur/plafond.js", + "ligne": 180, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:mise-a-jour:ebb134b390d9273f:3", + "fichier": "src/moteur/plafond.js", + "ligne": 205, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:ebb134b390d9273f:3", + "fichier": "src/moteur/plafond.js", + "ligne": 205, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:mise-a-jour:2b7d084f79aabcde:0", + "fichier": "src/moteur/plafond.js", + "ligne": 233, + "colonne": 30, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:2b7d084f79aabcde:0", + "fichier": "src/moteur/plafond.js", + "ligne": 233, + "colonne": 33, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:mise-a-jour:47ac92bad4b74b59:0", + "fichier": "src/moteur/plafond.js", + "ligne": 234, + "colonne": 33, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:47ac92bad4b74b59:0", + "fichier": "src/moteur/plafond.js", + "ligne": 234, + "colonne": 36, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:arithmetique:4d0df4dd820c98b9:0", + "fichier": "src/moteur/plafond.js", + "ligne": 237, + "colonne": 27, + "operateur": "arithmetique", + "original": "+", + "remplacement": "-", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:mise-a-jour:b094b2fd82a275ea:0", + "fichier": "src/moteur/plafond.js", + "ligne": 237, + "colonne": 39, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:b094b2fd82a275ea:0", + "fichier": "src/moteur/plafond.js", + "ligne": 237, + "colonne": 42, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:mise-a-jour:47ac92bad4b74b59:1", + "fichier": "src/moteur/plafond.js", + "ligne": 246, + "colonne": 29, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:47ac92bad4b74b59:1", + "fichier": "src/moteur/plafond.js", + "ligne": 246, + "colonne": 32, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:negation:54b8d5bb74bbab71:0", + "fichier": "src/moteur/plafond.js", + "ligne": 265, + "colonne": 21, + "operateur": "negation", + "original": "<", + "remplacement": ">=", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:mise-a-jour:a216dbba9047bdaf:2", + "fichier": "src/moteur/plafond.js", + "ligne": 265, + "colonne": 37, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:a216dbba9047bdaf:2", + "fichier": "src/moteur/plafond.js", + "ligne": 265, + "colonne": 40, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:mise-a-jour:a09689f630889c59:1", + "fichier": "src/moteur/plafond.js", + "ligne": 283, + "colonne": 29, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:a09689f630889c59:1", + "fichier": "src/moteur/plafond.js", + "ligne": 283, + "colonne": 32, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:mise-a-jour:ebb134b390d9273f:4", + "fichier": "src/moteur/plafond.js", + "ligne": 299, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:ebb134b390d9273f:4", + "fichier": "src/moteur/plafond.js", + "ligne": 299, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:si-faux:56873b514f302699:0", + "fichier": "src/moteur/plafond.js", + "ligne": 303, + "colonne": 7, + "operateur": "si-faux", + "original": "f === 0 || A === 0", + "remplacement": "false", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:logique:56873b514f302699:0", + "fichier": "src/moteur/plafond.js", + "ligne": 303, + "colonne": 15, + "operateur": "logique", + "original": "f === 0 || A === 0", + "remplacement": "((f === 0 )&&( A === 0))", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:negation:366628d51cf58e53:0", + "fichier": "src/moteur/plafond.js", + "ligne": 303, + "colonne": 20, + "operateur": "negation", + "original": "===", + "remplacement": "!==", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:nombre-plus-un:366628d51cf58e53:0", + "fichier": "src/moteur/plafond.js", + "ligne": 303, + "colonne": 24, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:corps-si:da953d91ffbec0c9:0", + "fichier": "src/moteur/plafond.js", + "ligne": 303, + "colonne": 27, + "operateur": "corps-si", + "original": "return plafondItineraire(instance, p, itineraire);", + "remplacement": "{}", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:mise-a-jour:a09689f630889c59:2", + "fichier": "src/moteur/plafond.js", + "ligne": 318, + "colonne": 30, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:a09689f630889c59:2", + "fichier": "src/moteur/plafond.js", + "ligne": 318, + "colonne": 33, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:arithmetique:bf9abd8ccbf2c861:0", + "fichier": "src/moteur/plafond.js", + "ligne": 320, + "colonne": 15, + "operateur": "arithmetique", + "original": "-", + "remplacement": "+", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:bf9abd8ccbf2c861:0", + "fichier": "src/moteur/plafond.js", + "ligne": 320, + "colonne": 17, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:frontiere:e2fb8628f06dc9d1:0", + "fichier": "src/moteur/plafond.js", + "ligne": 321, + "colonne": 14, + "operateur": "frontiere", + "original": ">=", + "remplacement": ">", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:negation:e2fb8628f06dc9d1:0", + "fichier": "src/moteur/plafond.js", + "ligne": 321, + "colonne": 14, + "operateur": "negation", + "original": ">=", + "remplacement": "<", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:nombre-plus-un:e2fb8628f06dc9d1:0", + "fichier": "src/moteur/plafond.js", + "ligne": 321, + "colonne": 17, + "operateur": "nombre-plus-un", + "original": "0", + "remplacement": "1", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:nombre-plus-un:9c9e44ab9770b1b1:1", + "fichier": "src/moteur/plafond.js", + "ligne": 321, + "colonne": 39, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:mise-a-jour:08b311bd0772c514:0", + "fichier": "src/moteur/plafond.js", + "ligne": 321, + "colonne": 44, + "operateur": "mise-a-jour", + "original": "-=", + "remplacement": "+=", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:08b311bd0772c514:0", + "fichier": "src/moteur/plafond.js", + "ligne": 321, + "colonne": 47, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:si-faux:3e02bda6689ef14c:0", + "fichier": "src/moteur/plafond.js", + "ligne": 322, + "colonne": 9, + "operateur": "si-faux", + "original": "i < 0", + "remplacement": "false", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:negation:3e02bda6689ef14c:0", + "fichier": "src/moteur/plafond.js", + "ligne": 322, + "colonne": 11, + "operateur": "negation", + "original": "<", + "remplacement": ">=", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:corps-si:1a2ecfa1a882854e:0", + "fichier": "src/moteur/plafond.js", + "ligne": 322, + "colonne": 16, + "operateur": "corps-si", + "original": "return plafond;", + "remplacement": "{}", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:mise-a-jour:02f4269c6b24a551:0", + "fichier": "src/moteur/plafond.js", + "ligne": 323, + "colonne": 14, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:nombre-plus-un:02f4269c6b24a551:0", + "fichier": "src/moteur/plafond.js", + "ligne": 323, + "colonne": 17, + "operateur": "nombre-plus-un", + "original": "1", + "remplacement": "2", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:02f4269c6b24a551:0", + "fichier": "src/moteur/plafond.js", + "ligne": 323, + "colonne": 17, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:negation:2ad7eaa66ad4393a:0", + "fichier": "src/moteur/plafond.js", + "ligne": 324, + "colonne": 27, + "operateur": "negation", + "original": "<", + "remplacement": ">=", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:mise-a-jour:03a9f167c4bb4b6d:0", + "fichier": "src/moteur/plafond.js", + "ligne": 324, + "colonne": 34, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:03a9f167c4bb4b6d:0", + "fichier": "src/moteur/plafond.js", + "ligne": 324, + "colonne": 37, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/plafond.js:nombre-zero:a216dbba9047bdaf:3", + "fichier": "src/moteur/plafond.js", + "ligne": 349, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:nombre-zero:9b90e003d740760b:0", + "fichier": "src/moteur/recherche.js", + "ligne": 156, + "colonne": 18, + "operateur": "nombre-zero", + "original": "10", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:mise-a-jour:a4b2c9ff906d249f:0", + "fichier": "src/moteur/recherche.js", + "ligne": 201, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:nombre-zero:a4b2c9ff906d249f:0", + "fichier": "src/moteur/recherche.js", + "ligne": 201, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:mise-a-jour:a4b2c9ff906d249f:1", + "fichier": "src/moteur/recherche.js", + "ligne": 204, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:nombre-zero:a4b2c9ff906d249f:1", + "fichier": "src/moteur/recherche.js", + "ligne": 204, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:mise-a-jour:ebb134b390d9273f:0", + "fichier": "src/moteur/recherche.js", + "ligne": 214, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:nombre-zero:ebb134b390d9273f:0", + "fichier": "src/moteur/recherche.js", + "ligne": 214, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:mise-a-jour:a216dbba9047bdaf:0", + "fichier": "src/moteur/recherche.js", + "ligne": 217, + "colonne": 30, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:nombre-zero:a216dbba9047bdaf:0", + "fichier": "src/moteur/recherche.js", + "ligne": 217, + "colonne": 33, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:mise-a-jour:2b7d084f79aabcde:0", + "fichier": "src/moteur/recherche.js", + "ligne": 228, + "colonne": 30, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:nombre-zero:2b7d084f79aabcde:0", + "fichier": "src/moteur/recherche.js", + "ligne": 228, + "colonne": 33, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:mise-a-jour:a216dbba9047bdaf:1", + "fichier": "src/moteur/recherche.js", + "ligne": 241, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:nombre-zero:a216dbba9047bdaf:1", + "fichier": "src/moteur/recherche.js", + "ligne": 241, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:mise-a-jour:ebb134b390d9273f:1", + "fichier": "src/moteur/recherche.js", + "ligne": 242, + "colonne": 30, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:nombre-zero:ebb134b390d9273f:1", + "fichier": "src/moteur/recherche.js", + "ligne": 242, + "colonne": 33, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:mise-a-jour:a09689f630889c59:0", + "fichier": "src/moteur/recherche.js", + "ligne": 247, + "colonne": 45, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:nombre-zero:a09689f630889c59:0", + "fichier": "src/moteur/recherche.js", + "ligne": 247, + "colonne": 48, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:mise-a-jour:a216dbba9047bdaf:2", + "fichier": "src/moteur/recherche.js", + "ligne": 253, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:nombre-zero:a216dbba9047bdaf:2", + "fichier": "src/moteur/recherche.js", + "ligne": 253, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:mise-a-jour:2b7d084f79aabcde:1", + "fichier": "src/moteur/recherche.js", + "ligne": 350, + "colonne": 57, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:nombre-zero:2b7d084f79aabcde:1", + "fichier": "src/moteur/recherche.js", + "ligne": 350, + "colonne": 60, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:mise-a-jour:a216dbba9047bdaf:3", + "fichier": "src/moteur/recherche.js", + "ligne": 432, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:nombre-zero:a216dbba9047bdaf:3", + "fichier": "src/moteur/recherche.js", + "ligne": 432, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:nombre-zero:ebb134b390d9273f:2", + "fichier": "src/moteur/recherche.js", + "ligne": 438, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:mise-a-jour:a09689f630889c59:1", + "fichier": "src/moteur/recherche.js", + "ligne": 440, + "colonne": 44, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:nombre-zero:a09689f630889c59:1", + "fichier": "src/moteur/recherche.js", + "ligne": 440, + "colonne": 47, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:mise-a-jour:ebb134b390d9273f:3", + "fichier": "src/moteur/recherche.js", + "ligne": 442, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:nombre-zero:ebb134b390d9273f:3", + "fichier": "src/moteur/recherche.js", + "ligne": 442, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:mise-a-jour:2b7d084f79aabcde:2", + "fichier": "src/moteur/recherche.js", + "ligne": 444, + "colonne": 30, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:nombre-zero:2b7d084f79aabcde:2", + "fichier": "src/moteur/recherche.js", + "ligne": 444, + "colonne": 33, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:negation:4f0fa2c06bdb19fb:0", + "fichier": "src/moteur/recherche.js", + "ligne": 450, + "colonne": 42, + "operateur": "negation", + "original": "<", + "remplacement": ">=", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:mise-a-jour:21f6e4f281341896:0", + "fichier": "src/moteur/recherche.js", + "ligne": 450, + "colonne": 54, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:nombre-zero:21f6e4f281341896:0", + "fichier": "src/moteur/recherche.js", + "ligne": 450, + "colonne": 57, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:nombre-zero:03a9f167c4bb4b6d:0", + "fichier": "src/moteur/recherche.js", + "ligne": 478, + "colonne": 42, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:nombre-zero:4f52c213e6e44b5e:0", + "fichier": "src/moteur/recherche.js", + "ligne": 494, + "colonne": 42, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:logique:a9d160f29f8f91bc:0", + "fichier": "src/moteur/recherche.js", + "ligne": 536, + "colonne": 29, + "operateur": "logique", + "original": "i < arret && !estNul(courant)", + "remplacement": "((i < arret )||( !estNul(courant)))", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:mise-a-jour:a09689f630889c59:2", + "fichier": "src/moteur/recherche.js", + "ligne": 536, + "colonne": 52, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:nombre-zero:a09689f630889c59:2", + "fichier": "src/moteur/recherche.js", + "ligne": 536, + "colonne": 55, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:si-vrai:1f6ad6c0145d750f:0", + "fichier": "src/moteur/recherche.js", + "ligne": 537, + "colonne": 9, + "operateur": "si-vrai", + "original": "immobile >= patience && ordre === ORDRE_CONTRAINTES", + "remplacement": "true", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:negation:a5a530df2f89fbd4:0", + "fichier": "src/moteur/recherche.js", + "ligne": 537, + "colonne": 18, + "operateur": "negation", + "original": ">=", + "remplacement": "<", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:logique:1f6ad6c0145d750f:0", + "fichier": "src/moteur/recherche.js", + "ligne": 537, + "colonne": 30, + "operateur": "logique", + "original": "immobile >= patience && ordre === ORDRE_CONTRAINTES", + "remplacement": "((immobile >= patience )||( ordre === ORDRE_CONTRAINTES))", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:mise-a-jour:0a9f0d923d8402cc:0", + "fichier": "src/moteur/recherche.js", + "ligne": 616, + "colonne": 37, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:nombre-zero:0a9f0d923d8402cc:0", + "fichier": "src/moteur/recherche.js", + "ligne": 616, + "colonne": 40, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:mise-a-jour:df01b0b3cd785785:0", + "fichier": "src/moteur/recherche.js", + "ligne": 665, + "colonne": 47, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:nombre-zero:df01b0b3cd785785:0", + "fichier": "src/moteur/recherche.js", + "ligne": 665, + "colonne": 50, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:mise-a-jour:a216dbba9047bdaf:4", + "fichier": "src/moteur/recherche.js", + "ligne": 779, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:nombre-zero:a216dbba9047bdaf:4", + "fichier": "src/moteur/recherche.js", + "ligne": 779, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:mise-a-jour:ebb134b390d9273f:4", + "fichier": "src/moteur/recherche.js", + "ligne": 780, + "colonne": 30, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/recherche.js:nombre-zero:ebb134b390d9273f:4", + "fichier": "src/moteur/recherche.js", + "ligne": 780, + "colonne": 33, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/verification.js:nombre-zero:ebb134b390d9273f:0", + "fichier": "src/moteur/verification.js", + "ligne": 137, + "colonne": 33, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/verification.js:nombre-zero:a09689f630889c59:0", + "fichier": "src/moteur/verification.js", + "ligne": 163, + "colonne": 45, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/verification.js:nombre-zero:a09689f630889c59:1", + "fichier": "src/moteur/verification.js", + "ligne": 174, + "colonne": 72, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/verification.js:mise-a-jour:a216dbba9047bdaf:0", + "fichier": "src/moteur/verification.js", + "ligne": 181, + "colonne": 30, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/verification.js:nombre-zero:a216dbba9047bdaf:0", + "fichier": "src/moteur/verification.js", + "ligne": 181, + "colonne": 33, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + }, + { + "cle": "src/moteur/verification.js:mise-a-jour:a216dbba9047bdaf:1", + "fichier": "src/moteur/verification.js", + "ligne": 249, + "colonne": 28, + "operateur": "mise-a-jour", + "original": "+=", + "remplacement": "-=", + "issue": "delai" + }, + { + "cle": "src/moteur/verification.js:nombre-zero:a216dbba9047bdaf:1", + "fichier": "src/moteur/verification.js", + "ligne": 249, + "colonne": 31, + "operateur": "nombre-zero", + "original": "1", + "remplacement": "0", + "issue": "delai" + } + ] +} diff --git a/audit/mutation-moteur.md b/audit/mutation-moteur.md new file mode 100644 index 0000000..5da9d65 --- /dev/null +++ b/audit/mutation-moteur.md @@ -0,0 +1,475 @@ +# Audit par mutation du moteur + +Écrit par `make mutation` (`scripts/mutation/audit.js`, § 14.13) ; ne se modifie pas à la main. + +| | | +|---|---| +| version | 2026.10.05.01 | +| périmètre | `src/moteur` | +| sources et épreuves du périmètre (SHA-256) | `03c4a69b22d817acb42df47fd69ad536ed9c59cec709217ba3d165300f404715` | +| Node | v26.10.0 | + +Chaque mutant se joue contre les épreuves de la série node qui atteignent son module, sous `node --test`. +Un survivant sur une ligne couverte désigne une épreuve qui exécute sans affirmer. + +## Bilan + +| mutants | tués | survivants | équivalents | délais | erreurs | +|---:|---:|---:|---:|---:|---:| +| 2576 | 2171 | 137 | 61 | 207 | 0 | + +## Par fichier + +| fichier | total | tués | survivants | équivalents | délais | erreurs | +|---|---:|---:|---:|---:|---:|---:| +| `src/moteur/classement.js` | 45 | 38 | 0 | 5 | 2 | 0 | +| `src/moteur/configuration.js` | 407 | 365 | 11 | 0 | 31 | 0 | +| `src/moteur/conflits.js` | 24 | 24 | 0 | 0 | 0 | 0 | +| `src/moteur/diagnostic.js` | 383 | 312 | 45 | 0 | 26 | 0 | +| `src/moteur/indicateurs.js` | 325 | 281 | 0 | 18 | 26 | 0 | +| `src/moteur/manque.js` | 162 | 148 | 0 | 9 | 5 | 0 | +| `src/moteur/plafond.js` | 397 | 305 | 2 | 29 | 61 | 0 | +| `src/moteur/recherche.js` | 648 | 530 | 69 | 0 | 49 | 0 | +| `src/moteur/verification.js` | 185 | 168 | 10 | 0 | 7 | 0 | + +## Par opérateur + +| opérateur | total | tués | survivants | équivalents | délais | erreurs | +|---|---:|---:|---:|---:|---:|---:| +| arithmetique | 287 | 270 | 8 | 7 | 2 | 0 | +| frontiere | 165 | 113 | 31 | 20 | 1 | 0 | +| negation | 343 | 314 | 5 | 0 | 24 | 0 | +| logique | 77 | 71 | 3 | 0 | 3 | 0 | +| retrait-non | 36 | 36 | 0 | 0 | 0 | 0 | +| mise-a-jour | 158 | 84 | 2 | 0 | 72 | 0 | +| nombre-plus-un | 540 | 469 | 47 | 20 | 4 | 0 | +| nombre-zero | 291 | 184 | 6 | 5 | 96 | 0 | +| booleen | 22 | 22 | 0 | 0 | 0 | 0 | +| si-vrai | 186 | 170 | 9 | 6 | 1 | 0 | +| si-faux | 186 | 174 | 9 | 1 | 2 | 0 | +| ternaire-vrai | 39 | 35 | 4 | 0 | 0 | 0 | +| ternaire-faux | 39 | 37 | 2 | 0 | 0 | 0 | +| min-max | 21 | 19 | 1 | 1 | 0 | 0 | +| corps-si | 186 | 173 | 10 | 1 | 2 | 0 | + +## Survivants (137), lignes couvertes d’abord + +| lieu | opérateur | avant | après | ligne couverte | série longue | +|---|---|---|---|---|---| +| `src/moteur/configuration.js:58:20` | nombre-plus-un | `2` | `3` | oui | survit | +| `src/moteur/configuration.js:76:37` | ternaire-vrai | `typeof valeur === 'string'` | `true` | oui | survit | +| `src/moteur/configuration.js:108:7` | si-faux | `typeof contraintes !== 'object' \|\| contraintes === null` | `false` | oui | survit | +| `src/moteur/configuration.js:108:39` | logique | `typeof contraintes !== 'object' \|\| contraintes === null` | `((typeof contraintes !== 'object' )&&( contraintes === null…` | oui | survit | +| `src/moteur/configuration.js:108:64` | corps-si | `{ throw new TypeError('configuration.contraintes : objet at…` | `{}` | oui | survit | +| `src/moteur/configuration.js:204:21` | frontiere | `<` | `<=` | oui | survit | +| `src/moteur/configuration.js:207:11` | si-vrai | `t !== LIBRE` | `true` | oui | survit | +| `src/moteur/configuration.js:210:21` | frontiere | `<` | `<=` | oui | survit | +| `src/moteur/configuration.js:242:17` | corps-si | `{ statut[p] = STATUT.MOBILE; }` | `{}` | oui | survit | +| `src/moteur/configuration.js:307:27` | arithmetique | `-` | `+` | oui | survit | +| `src/moteur/configuration.js:431:23` | frontiere | `<` | `<=` | oui | survit | +| `src/moteur/diagnostic.js:91:7` | si-faux | `T === 0` | `false` | oui | survit | +| `src/moteur/diagnostic.js:91:13` | nombre-plus-un | `0` | `1` | oui | survit | +| `src/moteur/diagnostic.js:91:16` | corps-si | `return 0;` | `{}` | oui | survit | +| `src/moteur/diagnostic.js:91:23` | nombre-plus-un | `0` | `1` | oui | survit | +| `src/moteur/diagnostic.js:95:18` | nombre-zero | `1` | `0` | oui | survit | +| `src/moteur/diagnostic.js:95:23` | frontiere | `<` | `<=` | oui | survit | +| `src/moteur/diagnostic.js:95:51` | frontiere | `<` | `<=` | oui | survit | +| `src/moteur/diagnostic.js:123:22` | nombre-plus-un | `0` | `1` | oui | survit | +| `src/moteur/diagnostic.js:162:31` | nombre-plus-un | `1` | `2` | oui | survit | +| `src/moteur/diagnostic.js:174:21` | frontiere | `<` | `<=` | oui | survit | +| `src/moteur/diagnostic.js:195:25` | nombre-plus-un | `2` | `3` | oui | survit | +| `src/moteur/diagnostic.js:205:53` | arithmetique | `-` | `+` | oui | survit | +| `src/moteur/diagnostic.js:232:7` | si-faux | `lignes.length === 0` | `false` | oui | survit | +| `src/moteur/diagnostic.js:232:28` | corps-si | `return lignes;` | `{}` | oui | survit | +| `src/moteur/diagnostic.js:234:109` | frontiere | `<=` | `<` | oui | survit | +| `src/moteur/diagnostic.js:235:25` | min-max | `max` | `min` | oui | survit | +| `src/moteur/diagnostic.js:236:55` | nombre-plus-un | `1` | `2` | oui | survit | +| `src/moteur/diagnostic.js:239:39` | arithmetique | `-` | `+` | oui | survit | +| `src/moteur/diagnostic.js:239:41` | nombre-zero | `1` | `0` | oui | survit | +| `src/moteur/diagnostic.js:239:80` | arithmetique | `+` | `-` | oui | survit | +| `src/moteur/diagnostic.js:243:43` | logique | `ligne.tablesManquantes === null && !sansRemede.has(ligne.gr…` | `((ligne.tablesManquantes === null )\|\|( !sansRemede.has(lign…` | oui | survit | +| `src/moteur/diagnostic.js:243:76` | logique | `ligne.tablesManquantes === null && !sansRemede.has(ligne.gr…` | `((ligne.tablesManquantes === null && !sansRemede.has(ligne.…` | oui | survit | +| `src/moteur/diagnostic.js:243:81` | frontiere | `<=` | `<` | oui | survit | +| `src/moteur/diagnostic.js:258:22` | arithmetique | `-` | `+` | oui | survit | +| `src/moteur/diagnostic.js:258:24` | nombre-zero | `1` | `0` | oui | survit | +| `src/moteur/diagnostic.js:258:33` | frontiere | `>=` | `>` | oui | survit | +| `src/moteur/diagnostic.js:258:36` | nombre-plus-un | `1` | `2` | oui | survit | +| `src/moteur/diagnostic.js:258:48` | nombre-plus-un | `1` | `2` | oui | survit | +| `src/moteur/diagnostic.js:286:16` | nombre-plus-un | `0` | `1` | oui | survit | +| `src/moteur/diagnostic.js:286:21` | frontiere | `<` | `<=` | oui | survit | +| `src/moteur/diagnostic.js:286:85` | nombre-plus-un | `1` | `2` | oui | survit | +| `src/moteur/diagnostic.js:288:21` | frontiere | `<` | `<=` | oui | survit | +| `src/moteur/diagnostic.js:288:31` | nombre-plus-un | `1` | `2` | oui | survit | +| `src/moteur/diagnostic.js:336:7` | si-faux | `mobile === -1` | `false` | oui | survit | +| `src/moteur/diagnostic.js:336:19` | nombre-plus-un | `1` | `2` | oui | survit | +| `src/moteur/diagnostic.js:336:22` | corps-si | `return null;` | `{}` | oui | survit | +| `src/moteur/diagnostic.js:348:9` | si-vrai | `passant === undefined` | `true` | oui | survit | +| `src/moteur/diagnostic.js:355:45` | frontiere | `<` | `<=` | oui | survit | +| `src/moteur/diagnostic.js:365:21` | nombre-plus-un | `0` | `1` | oui | survit | +| `src/moteur/diagnostic.js:366:21` | nombre-plus-un | `0` | `1` | oui | survit | +| `src/moteur/diagnostic.js:368:16` | frontiere | `<` | `<=` | oui | survit | +| `src/moteur/diagnostic.js:369:9` | si-vrai | `valeur > max` | `true` | oui | survit | +| `src/moteur/diagnostic.js:369:9` | si-faux | `valeur > max` | `false` | oui | survit | +| `src/moteur/diagnostic.js:369:16` | frontiere | `>` | `>=` | oui | survit | +| `src/moteur/diagnostic.js:369:23` | corps-si | `max = valeur;` | `{}` | oui | survit | +| `src/moteur/plafond.js:268:9` | si-vrai | `plafond === undefined` | `true` | oui | tué | +| `src/moteur/plafond.js:285:16` | frontiere | `>` | `>=` | oui | tué | +| `src/moteur/recherche.js:143:18` | nombre-plus-un | `1` | `2` | oui | survit | +| `src/moteur/recherche.js:160:20` | nombre-plus-un | `0xffff` | `65536` | oui | survit | +| `src/moteur/recherche.js:160:20` | nombre-zero | `0xffff` | `0` | oui | survit | +| `src/moteur/recherche.js:165:3` | ternaire-vrai | `typeof valeur === 'number'` | `true` | oui | survit | +| `src/moteur/recherche.js:165:3` | ternaire-faux | `typeof valeur === 'number'` | `false` | oui | survit | +| `src/moteur/recherche.js:165:17` | negation | `===` | `!==` | oui | survit | +| `src/moteur/recherche.js:200:36` | nombre-plus-un | `1` | `2` | oui | survit | +| `src/moteur/recherche.js:201:21` | frontiere | `<` | `<=` | oui | survit | +| `src/moteur/recherche.js:204:16` | nombre-plus-un | `0` | `1` | oui | survit | +| `src/moteur/recherche.js:204:21` | frontiere | `<` | `<=` | oui | survit | +| `src/moteur/recherche.js:204:75` | nombre-plus-un | `1` | `2` | oui | survit | +| `src/moteur/recherche.js:214:21` | frontiere | `<` | `<=` | oui | survit | +| `src/moteur/recherche.js:215:18` | nombre-plus-un | `0` | `1` | oui | tué | +| `src/moteur/recherche.js:217:23` | frontiere | `<` | `<=` | oui | survit | +| `src/moteur/recherche.js:223:23` | nombre-plus-un | `1` | `2` | oui | tué | +| `src/moteur/recherche.js:241:21` | frontiere | `<` | `<=` | oui | survit | +| `src/moteur/recherche.js:241:31` | nombre-plus-un | `1` | `2` | oui | tué | +| `src/moteur/recherche.js:242:23` | frontiere | `<` | `<=` | oui | tué | +| `src/moteur/recherche.js:247:21` | frontiere | `<` | `<=` | oui | survit | +| `src/moteur/recherche.js:252:19` | nombre-plus-un | `0` | `1` | oui | survit | +| `src/moteur/recherche.js:253:16` | nombre-plus-un | `0` | `1` | oui | tué | +| `src/moteur/recherche.js:253:31` | nombre-plus-un | `1` | `2` | oui | tué | +| `src/moteur/recherche.js:269:37` | nombre-plus-un | `1` | `2` | oui | survit | +| `src/moteur/recherche.js:285:13` | frontiere | `>` | `>=` | oui | survit | +| `src/moteur/recherche.js:299:20` | mise-a-jour | `+=` | `-=` | oui | tué | +| `src/moteur/recherche.js:301:23` | frontiere | `>` | `>=` | oui | survit | +| `src/moteur/recherche.js:302:31` | mise-a-jour | `+=` | `-=` | oui | tué | +| `src/moteur/recherche.js:317:15` | frontiere | `<` | `<=` | oui | survit | +| `src/moteur/recherche.js:317:15` | negation | `<` | `>=` | oui | survit | +| `src/moteur/recherche.js:325:13` | frontiere | `>` | `>=` | oui | survit | +| `src/moteur/recherche.js:351:9` | si-faux | `s === exclu` | `false` | oui | survit | +| `src/moteur/recherche.js:351:22` | corps-si | `continue;` | `{}` | oui | survit | +| `src/moteur/recherche.js:353:9` | si-vrai | `q !== FANTOME` | `true` | oui | tué | +| `src/moteur/recherche.js:417:13` | ternaire-vrai | `R <= UINT16_MAX` | `true` | oui | survit | +| `src/moteur/recherche.js:417:13` | ternaire-faux | `R <= UINT16_MAX` | `false` | oui | survit | +| `src/moteur/recherche.js:417:15` | frontiere | `<=` | `<` | oui | survit | +| `src/moteur/recherche.js:417:15` | negation | `<=` | `>` | oui | survit | +| `src/moteur/recherche.js:417:74` | arithmetique | `*` | `/` | oui | survit | +| `src/moteur/recherche.js:424:31` | nombre-plus-un | `0` | `1` | oui | survit | +| `src/moteur/recherche.js:452:13` | si-vrai | `q !== FANTOME` | `true` | oui | survit | +| `src/moteur/recherche.js:491:17` | nombre-plus-un | `0` | `1` | oui | survit | +| `src/moteur/recherche.js:494:16` | nombre-plus-un | `0` | `1` | oui | survit | +| `src/moteur/recherche.js:494:42` | nombre-plus-un | `1` | `2` | oui | survit | +| `src/moteur/recherche.js:535:18` | nombre-plus-un | `0` | `1` | oui | survit | +| `src/moteur/recherche.js:536:16` | nombre-plus-un | `0` | `1` | oui | survit | +| `src/moteur/recherche.js:542:18` | nombre-plus-un | `0` | `1` | oui | survit | +| `src/moteur/recherche.js:547:9` | si-vrai | `mouvement !== null` | `true` | oui | survit | +| `src/moteur/recherche.js:551:50` | nombre-plus-un | `0` | `1` | oui | tué | +| `src/moteur/recherche.js:551:62` | nombre-plus-un | `0` | `1` | oui | tué | +| `src/moteur/recherche.js:551:69` | nombre-plus-un | `0` | `1` | oui | tué | +| `src/moteur/recherche.js:560:34` | nombre-plus-un | `1` | `2` | oui | survit | +| `src/moteur/recherche.js:664:23` | nombre-plus-un | `0` | `1` | oui | survit | +| `src/moteur/recherche.js:670:16` | nombre-plus-un | `0` | `1` | oui | survit | +| `src/moteur/recherche.js:721:16` | nombre-plus-un | `0` | `1` | oui | survit | +| `src/moteur/recherche.js:772:34` | nombre-plus-un | `0` | `1` | oui | tué | +| `src/moteur/recherche.js:779:21` | frontiere | `<` | `<=` | oui | survit | +| `src/moteur/recherche.js:782:11` | si-vrai | `t !== RESERVE` | `true` | oui | survit | +| `src/moteur/recherche.js:813:7` | si-faux | `m < 2` | `false` | oui | survit | +| `src/moteur/recherche.js:813:9` | frontiere | `<` | `<=` | oui | survit | +| `src/moteur/recherche.js:813:11` | nombre-plus-un | `2` | `3` | oui | survit | +| `src/moteur/recherche.js:813:11` | nombre-zero | `2` | `0` | oui | survit | +| `src/moteur/recherche.js:813:14` | corps-si | `return null;` | `{}` | oui | survit | +| `src/moteur/recherche.js:818:7` | si-faux | `siege[base + a] === FANTOME && siege[base + b] === FANTOME` | `false` | oui | survit | +| `src/moteur/recherche.js:818:18` | arithmetique | `+` | `-` | oui | survit | +| `src/moteur/recherche.js:818:23` | negation | `===` | `!==` | oui | survit | +| `src/moteur/recherche.js:818:49` | arithmetique | `+` | `-` | oui | survit | +| `src/moteur/recherche.js:818:54` | negation | `===` | `!==` | oui | survit | +| `src/moteur/recherche.js:818:67` | corps-si | `return null;` | `{}` | oui | survit | +| `src/moteur/recherche.js:832:7` | si-vrai | `mouvement !== null` | `true` | oui | survit | +| `src/moteur/verification.js:25:21` | nombre-plus-un | `2` | `3` | oui | survit | +| `src/moteur/verification.js:157:17` | nombre-plus-un | `1` | `2` | oui | survit | +| `src/moteur/verification.js:157:17` | nombre-zero | `1` | `0` | oui | survit | +| `src/moteur/verification.js:164:17` | ternaire-vrai | `i < tableDeListe.length` | `true` | oui | survit | +| `src/moteur/verification.js:164:19` | frontiere | `<` | `<=` | oui | survit | +| `src/moteur/verification.js:167:13` | si-faux | `p < 0` | `false` | oui | survit | +| `src/moteur/verification.js:167:20` | corps-si | `continue;` | `{}` | oui | survit | +| `src/moteur/verification.js:168:24` | nombre-plus-un | `1` | `2` | oui | survit | +| `src/moteur/verification.js:169:50` | nombre-plus-un | `1` | `2` | oui | survit | +| `src/moteur/verification.js:174:44` | frontiere | `<` | `<=` | oui | survit | + +## Mutants équivalents (61) + +Déclarés dans `audit/mutants-equivalents.json`, avec leur raison. + +| lieu | opérateur | avant | après | raison | +|---|---|---|---|---| +| `src/moteur/classement.js:43:61` | frontiere | `>` | `>=` | classement.js, plusGrand, valeur >= plus : à égalité, l'affectation écrit la valeur déjà retenue. | +| `src/moteur/classement.js:95:21` | frontiere | `<` | `<=` | classement.js, comparerCles, i <= a.length : a[length] et b[length] sont tous deux undefined, donc égaux ; la boucle finit et rend 0, comme sans le tour de trop. | +| `src/moteur/classement.js:96:36` | frontiere | `<` | `<=` | classement.js, comparerCles, a[i] <= b[i] sous a[i] !== b[i] : pour deux nombres différents, <= et < coïncident. Une clé ne mêle jamais null et nombre : le premier critère vaut null pour une liste d'écarts vide, et toutes les entrées ont des listes de même longueur (exigerMemeTaille), toutes vides ou aucune. | +| `src/moteur/classement.js:96:46` | nombre-plus-un | `1` | `2` | classement.js, comparerCles, −2 au lieu de −1 : le résultat ne se lit que par son signe, dans sort et dans le \|\| du départage par identifiant. | +| `src/moteur/classement.js:96:50` | nombre-plus-un | `1` | `2` | classement.js, comparerCles, 2 au lieu de 1 : le résultat ne se lit que par son signe, dans sort et dans le \|\| du départage par identifiant. | +| `src/moteur/indicateurs.js:136:21` | nombre-plus-un | `1` | `2` | indicateurs.js, parcourirTours, visites[t] += 2 au lieu de 1 : visites[t] ne se lit que par visites[t] > 0 et se remet à 0 après chaque personne ; un pas de 2 garde le signe, aucune sortie ne change. | +| `src/moteur/indicateurs.js:137:40` | nombre-plus-un | `1` | `2` | indicateurs.js, parcourirTours, reserveeAvant[t] = 2 au lieu de 1 : la marque ne se lit que par reserveeAvant[t] === 0. | +| `src/moteur/indicateurs.js:139:23` | frontiere | `<` | `<=` | indicateurs.js, parcourirTours, remise à zéro jusqu'à r <= R : le tour de trop lit la première case de la personne suivante, dont la table vaut 0 dans visites et reserveeAvant sauf si la personne courante l'a visitée, auquel cas la boucle la remet à 0 de toute façon ; pour la dernière personne la case est undefined, et une écriture à l'index undefined pose une propriété hors des éléments du tableau typé, que rien ne lit. | +| `src/moteur/indicateurs.js:141:11` | si-faux | `t === RESERVE` | `false` | indicateurs.js, parcourirTours, remise à zéro sans le continue des cases RESERVE : la case −1 écrit visites[−1] et reserveeAvant[−1] ; un index hors des éléments d'un tableau typé n'écrit rien. | +| `src/moteur/indicateurs.js:141:26` | corps-si | `continue;` | `{}` | indicateurs.js, parcourirTours, if (t === RESERVE) {} : même effet que le mutant si-faux du même if — visites[−1] et reserveeAvant[−1] ; un index hors des éléments d'un tableau typé n'écrit rien. | +| `src/moteur/indicateurs.js:169:25` | frontiere | `<` | `<=` | indicateurs.js, parcourirTours, i <= liste.length : le tour de trop lit a = undefined ; revenu[NaN] et fixe[NaN] sont undefined, rien n'est poussé, et la boucle intérieure part de j = length + 1, au-delà de la liste. | +| `src/moteur/indicateurs.js:174:31` | frontiere | `<` | `<=` | indicateurs.js, parcourirTours, j <= liste.length : le tour de trop lit b = undefined ; k = rangPaire(N, a, undefined) vaut NaN, parPaire[NaN] et libre[NaN] n'écrivent rien sur un tableau typé, groupe[undefined] n'égale aucun groupe et parPaire[NaN] >= 2 est faux : ni collègue ni revue n'est poussé. | +| `src/moteur/indicateurs.js:212:23` | nombre-plus-un | `1` | `2` | indicateurs.js, lirePaires, vu[p * G + g] = 2 au lieu de 1 : la marque ne se lit que par === 0. | +| `src/moteur/indicateurs.js:218:21` | frontiere | `<` | `<=` | indicateurs.js, lirePaires, a <= N : pour a = N, la boucle intérieure (b de N + 1 à N − 1) ne tourne pas, et k n'avance pas. | +| `src/moteur/indicateurs.js:224:13` | frontiere | `>` | `>=` | indicateurs.js, lirePaires, n >= maxRencontresPaire : à égalité, l'affectation écrit la valeur déjà retenue. | +| `src/moteur/indicateurs.js:237:32` | arithmetique | `-` | `+` | indicateurs.js, lireTours, nombrePaires = N(N + 1)/2 : ne dimensionne que collegueVu et revueVue, indexés par rangPaire, toujours < N(N − 1)/2 ; un tableau plus long garde les mêmes cases utiles, les autres ne se lisent jamais. | +| `src/moteur/indicateurs.js:237:34` | nombre-zero | `1` | `0` | indicateurs.js, lireTours, nombrePaires = N·N/2 : même raison que N(N + 1)/2 — une longueur au moins égale (tronquée à l'entier par le constructeur du tableau typé) pour des index rangPaire < N(N − 1)/2. | +| `src/moteur/indicateurs.js:237:38` | arithmetique | `/` | `*` | indicateurs.js, lireTours, nombrePaires = 2N(N − 1) : longueur au moins égale à N(N − 1)/2, mêmes cases utiles, les autres jamais lues. | +| `src/moteur/indicateurs.js:251:27` | nombre-plus-un | `1` | `2` | indicateurs.js, lireTours, collegueVu[k] = 2 au lieu de 1 : la marque ne se lit que par === 0. | +| `src/moteur/indicateurs.js:258:25` | nombre-plus-un | `1` | `2` | indicateurs.js, lireTours, revueVue[k] = 2 au lieu de 1 : la marque ne se lit que par === 0. | +| `src/moteur/indicateurs.js:274:31` | frontiere | `<` | `<=` | indicateurs.js, ajouter, valeur <= min : à égalité, le minimum retenu est la même valeur. | +| `src/moteur/indicateurs.js:324:21` | frontiere | `<` | `<=` | indicateurs.js, mesurer, p <= N au compte des effectifs : groupe[N] est undefined, différent de SANS_GROUPE ; effectifs[undefined] += 1 pose une propriété « undefined » sur un tableau ordinaire, et parGroupe ne lit que les index 0 à G − 1. | +| `src/moteur/indicateurs.js:325:9` | si-vrai | `groupe[p] !== SANS_GROUPE` | `true` | indicateurs.js, mesurer, if (true) au compte des effectifs : une personne sans appartenance incrémente effectifs[SANS_GROUPE], soit effectifs[−1], propriété hors des index d'un tableau ordinaire ; parGroupe ne lit que les index 0 à G − 1. | +| `src/moteur/manque.js:91:64` | frontiere | `>` | `>=` | manque.js, plusGrand, valeur >= cumul : à égalité, le cumul retenu est la même valeur. | +| `src/moteur/manque.js:231:82` | arithmetique | `-` | `+` | manque.js, profilManque, départage a.id + b.id : à manque et plafond réalisé égaux, le comparateur rend un nombre positif. Le tri de V8 ne lit que « < 0 » et est stable : un positif s'y lit comme 0, et l'ordre reçu reste, celui de instance.ids, que normaliser trie par identifiant croissant et sans doublon — l'ordre de a.id − b.id. Une liste reçue dans un autre ordre ne peut pas se construire : profilManque parcourt instance.ids. | +| `src/moteur/manque.js:287:34` | frontiere | `<` | `<=` | manque.js, comparerProfils, difference <= 0 : la ligne ne s'atteint que pour difference !== 0, où <= 0 et < 0 coïncident. | +| `src/moteur/manque.js:287:36` | nombre-plus-un | `0` | `1` | manque.js, comparerProfils, difference < 1 : un manque est un entier (plafond réalisé − rencontres, deux comptes), et la ligne ne s'atteint que pour difference !== 0 : < 1 et < 0 coïncident. | +| `src/moteur/manque.js:287:41` | nombre-plus-un | `1` | `2` | manque.js, comparerProfils, signeRang = −2 au lieu de −1 : signeRang ne se lit que par < 0 et par comparaison à signe, qui reçoit les mêmes valeurs ; signe ne se rend pas. | +| `src/moteur/manque.js:287:45` | nombre-plus-un | `1` | `2` | manque.js, comparerProfils, signeRang = 2 au lieu de 1 : signeRang ne se lit que par < 0 et par comparaison à signe, qui reçoit les mêmes valeurs ; signe ne se rend pas. | +| `src/moteur/manque.js:288:19` | frontiere | `<` | `<=` | manque.js, comparerProfils, signeRang <= 0 : signeRang vaut −1 ou 1, jamais 0. | +| `src/moteur/manque.js:288:21` | nombre-plus-un | `0` | `1` | manque.js, comparerProfils, signeRang < 1 : signeRang vaut −1 ou 1 ; < 1 et < 0 coïncident. | +| `src/moteur/manque.js:292:11` | si-vrai | `changements === 1` | `true` | manque.js, comparerProfils, bascule posée à chaque changement : rangBascule ne la rend que pour changements === 1, où la première et la dernière affectation sont la même. | +| `src/moteur/plafond.js:55:30` | arithmetique | `-` | `+` | plafond.js, borne, min(N + 1, …) : le terme Σ a_t + min(n_p, S) ne dépasse jamais N − 1. Les ancrés des tables distinctes, p exclu, sont au plus k − 1 pour un ancré et k sinon ; n_p vaut n pour un ancré et n − 1 sinon ; la somme vaut au plus k + n − 1 = N − 1 (n = N − k, configuration.js). Le min extérieur ne mord jamais, que sa borne soit N − 1 ou plus. | +| `src/moteur/plafond.js:55:32` | nombre-zero | `1` | `0` | plafond.js, borne, min(N − 0, …) : même raison que min(N + 1, …) — le terme intérieur vaut au plus N − 1. | +| `src/moteur/plafond.js:65:74` | nombre-plus-un | `1` | `2` | plafond.js, ancrageDe, −2 au lieu de −1 pour un non-ancré : l'ancrage ne sert qu'à t === ancrage, où t est un index de table ≥ 0, et à la clé de signature, où −2 remplace −1 pour tous les non-ancrés à la fois : aucune comparaison ni aucun regroupement ne change. | +| `src/moteur/plafond.js:74:21` | frontiere | `<` | `<=` | plafond.js, tablesAdmissibles, t <= T : ancresParTable[T] et capacite[T] sont undefined, undefined < undefined est faux, rien ne s'ajoute. | +| `src/moteur/plafond.js:160:21` | frontiere | `<` | `<=` | plafond.js, plafondsRealises, p <= N : la case N × R + r est hors du plan (undefined, différent de RESERVE) ; occupation[NaN] += 1 n'écrit rien sur un Int32Array. | +| `src/moteur/plafond.js:163:11` | si-vrai | `t !== RESERVE` | `true` | plafond.js, plafondsRealises, if (true) : une case RESERVE (−1) écrit occupation[−R + r], index négatif puisque r < R ; un index hors des éléments d'un tableau typé n'écrit rien. | +| `src/moteur/plafond.js:180:38` | si-vrai | `fixe[p * R + r] !== LIBRE` | `true` | plafond.js, signature, chaque case poussée, LIBRE comprise : le nombre de cases LIBRE vaut R moins le nombre de tours fixés, que le multiensemble des tables fixées donne déjà ; deux clés sont égales sous le mutant si et seulement si elles le sont sans lui. | +| `src/moteur/plafond.js:181:27` | arithmetique | `-` | `+` | plafond.js, signature, tri par x + y : le tri ne sert qu'à rendre la clé indépendante de l'ordre des tours. Un ordre faux peut séparer deux rangées de même multiensemble en deux clés, jamais réunir deux multiensembles distincts — la clé garde ses éléments — : la valeur mémoïsée reste exacte, seul le partage se perd. | +| `src/moteur/plafond.js:223:14` | nombre-plus-un | `0` | `1` | plafond.js, maximiser, vMax part de 1 : vMax ne sert qu'à W, qui grandit ou reste. Tout W' ≥ W rend le même plafond : sans écrêtage (W' ≥ f·vMax) la programmation dynamique est exacte, et un écrêtage à W' ≥ cap ne fond que des états où min(n_p, sieges0 + w) vaut déjà n_p. | +| `src/moteur/plafond.js:225:18` | min-max | `min` | `max` | plafond.js, maximiser, W = max(cap, f·vMax) : W grandit ou reste ; même raison que vMax partant de 1 — tout W' ≥ W rend le même plafond. | +| `src/moteur/plafond.js:225:31` | nombre-plus-un | `0` | `1` | plafond.js, maximiser, cap = max(1, n_p − sieges0) : W grandit ou reste ; tout W' ≥ W rend le même plafond (voir vMax partant de 1). | +| `src/moteur/plafond.js:225:37` | arithmetique | `-` | `+` | plafond.js, maximiser, cap = max(0, n_p + sieges0) : sieges0 ≥ 0 (v ≥ 0 pour toute table qu'un plan valide fixe), donc W grandit ou reste ; tout W' ≥ W rend le même plafond (voir vMax partant de 1). | +| `src/moteur/plafond.js:226:23` | nombre-plus-un | `1` | `2` | plafond.js, maximiser, largeur = W + 2 : une colonne de plus par rangée, jamais écrite (cible ≤ W) ni lue (w ≤ W) ; chaque état garde une case distincte. | +| `src/moteur/plafond.js:227:38` | nombre-plus-un | `1` | `2` | plafond.js, maximiser, (f + 2) × largeur cases : une rangée de plus en fin de tableau, jamais lue ni écrite (s + m ≤ f). | +| `src/moteur/plafond.js:227:58` | nombre-plus-un | `1` | `2` | plafond.js, maximiser, fill(−2) : le marqueur d'état inatteignable ne se lit que par < 0 et >= 0, et tout atteint + gain ≥ 0 le dépasse ; −2 se comporte comme −1. | +| `src/moteur/plafond.js:233:23` | frontiere | `<` | `<=` | plafond.js, maximiser, s <= f : à s = f, la boucle sur m (s + m ≤ f) ne tourne pas. | +| `src/moteur/plafond.js:239:30` | frontiere | `>` | `>=` | plafond.js, maximiser, atteint + gain >= suivant[cible] : à égalité, l'affectation écrit la valeur déjà présente. | +| `src/moteur/plafond.js:245:18` | nombre-plus-un | `1` | `2` | plafond.js, maximiser, plafond part de −2 : l'état (f, W) est toujours atteint — la table de plus grand v prise f fois — avec une somme d'ancrés ≥ 0, et sa borne vaut au moins 0 ; le maximum ne dépend pas de la valeur initiale, pourvu qu'elle ne dépasse pas 0. | +| `src/moteur/plafond.js:245:18` | nombre-zero | `1` | `0` | plafond.js, maximiser, plafond part de −0 : même raison que −2 — un état atteint donne une borne x ≥ 0, et Math.max(−0, x) = x. | +| `src/moteur/plafond.js:248:9` | si-vrai | `ajout >= 0` | `true` | plafond.js, maximiser, if (true) sur ajout >= 0 : un état inatteignable porte −1, soit ancres0 − 1, à un w ≤ W ; l'état (f, W) est atteint avec une somme ≥ 0, et la borne, croissante en ses deux termes, y vaut au moins autant : un état inatteignable ne l'emporte jamais. | +| `src/moteur/plafond.js:299:21` | frontiere | `<` | `<=` | plafond.js, enumerer, r <= R : itineraire[R] est undefined, qui n'égale pas LIBRE ; aucun tour libre ne s'ajoute. | +| `src/moteur/plafond.js:316:18` | nombre-plus-un | `1` | `2` | plafond.js, enumerer, plafond part de −2 : au moins un itinéraire s'évalue (f > 0 et A > 0), et son plafond est ≥ 0 ; la valeur initiale ne l'emporte jamais. | +| `src/moteur/plafond.js:316:18` | nombre-zero | `1` | `0` | plafond.js, enumerer, plafond part de −0 : au moins un itinéraire s'évalue, de plafond x ≥ 0, et Math.max(−0, x) = x. | +| `src/moteur/plafond.js:318:23` | frontiere | `<` | `<=` | plafond.js, enumerer, i <= f : libres[f] est undefined ; itineraire[undefined] = … pose une propriété hors des index de l'Int32Array, que plafondItineraire ne lit pas (il lit length et les index 0 à R − 1). | +| `src/moteur/plafond.js:324:22` | nombre-zero | `1` | `0` | plafond.js, enumerer, j = i + 0 : le premier tour écrit choix[i] = choix[i], sans effet ; les tours suivants sont ceux du code. | +| `src/moteur/plafond.js:324:27` | frontiere | `<` | `<=` | plafond.js, enumerer, j <= f : choix[f] est hors d'un Int32Array de f cases ; un index hors des éléments d'un tableau typé n'écrit rien. | +| `src/moteur/plafond.js:350:33` | arithmetique | `*` | `/` | plafond.js, plafondsAPrioriParEnumeration, clé subarray(p / R, …) : l'index de début se tronque, et la clé devient une tranche qui finit par la rangée de p. Pour R ≥ 2 sa longueur, (p + 1)R − ⌊p/R⌋, croît strictement avec p : aucune clé n'est partagée, chaque plafond se calcule et reste exact ; pour R = 1, la tranche est la rangée même. | +| `src/moteur/plafond.js:350:43` | nombre-plus-un | `1` | `2` | plafond.js, plafondsAPrioriParEnumeration, clé subarray(pR, (p + 2)R) : la clé ajoute la rangée suivante (rien pour la dernière personne, dont la clé a R cases contre 2R) ; deux clés égales ont même longueur et même début, donc même rangée : le regroupement se fait plus fin, jamais plus large. | +| `src/moteur/plafond.js:352:9` | si-vrai | `plafond === undefined` | `true` | plafond.js, plafondsAPrioriParEnumeration, if (true) : le plafond se recalcule pour chaque personne au lieu d'être repris de sa rangée ; même valeur, seule la mémoïsation de l'oracle se perd, et l'oracle n'a pas de budget de temps. | + +## Délais et erreurs (207) + +| lieu | opérateur | avant | après | issue | +|---|---|---|---|---| +| `src/moteur/classement.js:95:35` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/classement.js:95:38` | nombre-zero | `1` | `0` | délai | +| `src/moteur/configuration.js:129:45` | nombre-zero | `1` | `0` | délai | +| `src/moteur/configuration.js:153:49` | nombre-zero | `1` | `0` | délai | +| `src/moteur/configuration.js:182:46` | nombre-zero | `1` | `0` | délai | +| `src/moteur/configuration.js:204:21` | negation | `<` | `>=` | délai | +| `src/moteur/configuration.js:204:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/configuration.js:204:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/configuration.js:205:30` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/configuration.js:205:33` | nombre-zero | `1` | `0` | délai | +| `src/moteur/configuration.js:210:21` | negation | `<` | `>=` | délai | +| `src/moteur/configuration.js:210:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/configuration.js:210:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/configuration.js:211:30` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/configuration.js:211:33` | nombre-zero | `1` | `0` | délai | +| `src/moteur/configuration.js:233:21` | negation | `<` | `>=` | délai | +| `src/moteur/configuration.js:233:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/configuration.js:233:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/configuration.js:237:30` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/configuration.js:237:33` | nombre-zero | `1` | `0` | délai | +| `src/moteur/configuration.js:418:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/configuration.js:427:45` | nombre-zero | `1` | `0` | délai | +| `src/moteur/configuration.js:431:23` | negation | `<` | `>=` | délai | +| `src/moteur/configuration.js:431:30` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/configuration.js:431:33` | nombre-zero | `1` | `0` | délai | +| `src/moteur/configuration.js:460:44` | nombre-zero | `1` | `0` | délai | +| `src/moteur/configuration.js:485:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/configuration.js:490:33` | nombre-zero | `1` | `0` | délai | +| `src/moteur/configuration.js:511:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/configuration.js:511:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/configuration.js:551:21` | negation | `<` | `>=` | délai | +| `src/moteur/configuration.js:551:41` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/configuration.js:551:44` | nombre-zero | `1` | `0` | délai | +| `src/moteur/diagnostic.js:93:21` | negation | `<` | `>=` | délai | +| `src/moteur/diagnostic.js:93:33` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/diagnostic.js:93:36` | nombre-zero | `1` | `0` | délai | +| `src/moteur/diagnostic.js:95:30` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/diagnostic.js:95:33` | nombre-zero | `1` | `0` | délai | +| `src/moteur/diagnostic.js:99:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/diagnostic.js:99:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/diagnostic.js:119:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/diagnostic.js:121:44` | nombre-zero | `1` | `0` | délai | +| `src/moteur/diagnostic.js:124:30` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/diagnostic.js:124:33` | nombre-zero | `1` | `0` | délai | +| `src/moteur/diagnostic.js:160:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/diagnostic.js:160:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/diagnostic.js:162:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/diagnostic.js:162:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/diagnostic.js:174:21` | negation | `<` | `>=` | délai | +| `src/moteur/diagnostic.js:174:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/diagnostic.js:174:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/diagnostic.js:258:45` | mise-a-jour | `-=` | `+=` | délai | +| `src/moteur/diagnostic.js:258:48` | nombre-zero | `1` | `0` | délai | +| `src/moteur/diagnostic.js:286:21` | negation | `<` | `>=` | délai | +| `src/moteur/diagnostic.js:286:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/diagnostic.js:286:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/diagnostic.js:288:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/diagnostic.js:288:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/diagnostic.js:341:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/indicateurs.js:126:21` | negation | `<` | `>=` | délai | +| `src/moteur/indicateurs.js:126:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/indicateurs.js:126:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/indicateurs.js:127:30` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/indicateurs.js:127:33` | nombre-zero | `1` | `0` | délai | +| `src/moteur/indicateurs.js:139:30` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/indicateurs.js:139:33` | nombre-zero | `1` | `0` | délai | +| `src/moteur/indicateurs.js:157:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/indicateurs.js:157:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/indicateurs.js:159:33` | nombre-zero | `1` | `0` | délai | +| `src/moteur/indicateurs.js:164:33` | nombre-zero | `1` | `0` | délai | +| `src/moteur/indicateurs.js:169:25` | negation | `<` | `>=` | délai | +| `src/moteur/indicateurs.js:169:43` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/indicateurs.js:169:46` | nombre-zero | `1` | `0` | délai | +| `src/moteur/indicateurs.js:174:31` | negation | `<` | `>=` | délai | +| `src/moteur/indicateurs.js:174:49` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/indicateurs.js:174:52` | nombre-zero | `1` | `0` | délai | +| `src/moteur/indicateurs.js:218:21` | negation | `<` | `>=` | délai | +| `src/moteur/indicateurs.js:218:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/indicateurs.js:218:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/indicateurs.js:219:27` | negation | `<` | `>=` | délai | +| `src/moteur/indicateurs.js:219:34` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/indicateurs.js:219:37` | nombre-zero | `1` | `0` | délai | +| `src/moteur/indicateurs.js:324:21` | negation | `<` | `>=` | délai | +| `src/moteur/indicateurs.js:324:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/indicateurs.js:324:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/manque.js:80:40` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/manque.js:80:43` | nombre-zero | `1` | `0` | délai | +| `src/moteur/manque.js:227:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/manque.js:227:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/manque.js:281:44` | nombre-zero | `1` | `0` | délai | +| `src/moteur/plafond.js:74:21` | negation | `<` | `>=` | délai | +| `src/moteur/plafond.js:74:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/plafond.js:74:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/plafond.js:81:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/plafond.js:81:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/plafond.js:93:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/plafond.js:93:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/plafond.js:107:47` | nombre-zero | `1` | `0` | délai | +| `src/moteur/plafond.js:160:21` | negation | `<` | `>=` | délai | +| `src/moteur/plafond.js:160:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/plafond.js:160:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/plafond.js:161:30` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/plafond.js:161:33` | nombre-zero | `1` | `0` | délai | +| `src/moteur/plafond.js:167:21` | negation | `<` | `>=` | délai | +| `src/moteur/plafond.js:167:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/plafond.js:167:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/plafond.js:180:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/plafond.js:180:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/plafond.js:205:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/plafond.js:205:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/plafond.js:233:30` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/plafond.js:233:33` | nombre-zero | `1` | `0` | délai | +| `src/moteur/plafond.js:234:33` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/plafond.js:234:36` | nombre-zero | `1` | `0` | délai | +| `src/moteur/plafond.js:237:27` | arithmetique | `+` | `-` | délai | +| `src/moteur/plafond.js:237:39` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/plafond.js:237:42` | nombre-zero | `1` | `0` | délai | +| `src/moteur/plafond.js:246:29` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/plafond.js:246:32` | nombre-zero | `1` | `0` | délai | +| `src/moteur/plafond.js:265:21` | negation | `<` | `>=` | délai | +| `src/moteur/plafond.js:265:37` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/plafond.js:265:40` | nombre-zero | `1` | `0` | délai | +| `src/moteur/plafond.js:283:29` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/plafond.js:283:32` | nombre-zero | `1` | `0` | délai | +| `src/moteur/plafond.js:299:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/plafond.js:299:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/plafond.js:303:7` | si-faux | `f === 0 \|\| A === 0` | `false` | délai | +| `src/moteur/plafond.js:303:15` | logique | `f === 0 \|\| A === 0` | `((f === 0 )&&( A === 0))` | délai | +| `src/moteur/plafond.js:303:20` | negation | `===` | `!==` | délai | +| `src/moteur/plafond.js:303:24` | nombre-plus-un | `0` | `1` | délai | +| `src/moteur/plafond.js:303:27` | corps-si | `return plafondItineraire(instance, p, itineraire);` | `{}` | délai | +| `src/moteur/plafond.js:318:30` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/plafond.js:318:33` | nombre-zero | `1` | `0` | délai | +| `src/moteur/plafond.js:320:15` | arithmetique | `-` | `+` | délai | +| `src/moteur/plafond.js:320:17` | nombre-zero | `1` | `0` | délai | +| `src/moteur/plafond.js:321:14` | frontiere | `>=` | `>` | délai | +| `src/moteur/plafond.js:321:14` | negation | `>=` | `<` | délai | +| `src/moteur/plafond.js:321:17` | nombre-plus-un | `0` | `1` | délai | +| `src/moteur/plafond.js:321:39` | nombre-plus-un | `1` | `2` | délai | +| `src/moteur/plafond.js:321:44` | mise-a-jour | `-=` | `+=` | délai | +| `src/moteur/plafond.js:321:47` | nombre-zero | `1` | `0` | délai | +| `src/moteur/plafond.js:322:9` | si-faux | `i < 0` | `false` | délai | +| `src/moteur/plafond.js:322:11` | negation | `<` | `>=` | délai | +| `src/moteur/plafond.js:322:16` | corps-si | `return plafond;` | `{}` | délai | +| `src/moteur/plafond.js:323:14` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/plafond.js:323:17` | nombre-plus-un | `1` | `2` | délai | +| `src/moteur/plafond.js:323:17` | nombre-zero | `1` | `0` | délai | +| `src/moteur/plafond.js:324:27` | negation | `<` | `>=` | délai | +| `src/moteur/plafond.js:324:34` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/plafond.js:324:37` | nombre-zero | `1` | `0` | délai | +| `src/moteur/plafond.js:349:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/recherche.js:156:18` | nombre-zero | `10` | `0` | délai | +| `src/moteur/recherche.js:201:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/recherche.js:201:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/recherche.js:204:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/recherche.js:204:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/recherche.js:214:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/recherche.js:214:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/recherche.js:217:30` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/recherche.js:217:33` | nombre-zero | `1` | `0` | délai | +| `src/moteur/recherche.js:228:30` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/recherche.js:228:33` | nombre-zero | `1` | `0` | délai | +| `src/moteur/recherche.js:241:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/recherche.js:241:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/recherche.js:242:30` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/recherche.js:242:33` | nombre-zero | `1` | `0` | délai | +| `src/moteur/recherche.js:247:45` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/recherche.js:247:48` | nombre-zero | `1` | `0` | délai | +| `src/moteur/recherche.js:253:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/recherche.js:253:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/recherche.js:350:57` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/recherche.js:350:60` | nombre-zero | `1` | `0` | délai | +| `src/moteur/recherche.js:432:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/recherche.js:432:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/recherche.js:438:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/recherche.js:440:44` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/recherche.js:440:47` | nombre-zero | `1` | `0` | délai | +| `src/moteur/recherche.js:442:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/recherche.js:442:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/recherche.js:444:30` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/recherche.js:444:33` | nombre-zero | `1` | `0` | délai | +| `src/moteur/recherche.js:450:42` | negation | `<` | `>=` | délai | +| `src/moteur/recherche.js:450:54` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/recherche.js:450:57` | nombre-zero | `1` | `0` | délai | +| `src/moteur/recherche.js:478:42` | nombre-zero | `1` | `0` | délai | +| `src/moteur/recherche.js:494:42` | nombre-zero | `1` | `0` | délai | +| `src/moteur/recherche.js:536:29` | logique | `i < arret && !estNul(courant)` | `((i < arret )\|\|( !estNul(courant)))` | délai | +| `src/moteur/recherche.js:536:52` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/recherche.js:536:55` | nombre-zero | `1` | `0` | délai | +| `src/moteur/recherche.js:537:9` | si-vrai | `immobile >= patience && ordre === ORDRE_CONTRAINTES` | `true` | délai | +| `src/moteur/recherche.js:537:18` | negation | `>=` | `<` | délai | +| `src/moteur/recherche.js:537:30` | logique | `immobile >= patience && ordre === ORDRE_CONTRAINTES` | `((immobile >= patience )\|\|( ordre === ORDRE_CONTRAINTES))` | délai | +| `src/moteur/recherche.js:616:37` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/recherche.js:616:40` | nombre-zero | `1` | `0` | délai | +| `src/moteur/recherche.js:665:47` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/recherche.js:665:50` | nombre-zero | `1` | `0` | délai | +| `src/moteur/recherche.js:779:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/recherche.js:779:31` | nombre-zero | `1` | `0` | délai | +| `src/moteur/recherche.js:780:30` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/recherche.js:780:33` | nombre-zero | `1` | `0` | délai | +| `src/moteur/verification.js:137:33` | nombre-zero | `1` | `0` | délai | +| `src/moteur/verification.js:163:45` | nombre-zero | `1` | `0` | délai | +| `src/moteur/verification.js:174:72` | nombre-zero | `1` | `0` | délai | +| `src/moteur/verification.js:181:30` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/verification.js:181:33` | nombre-zero | `1` | `0` | délai | +| `src/moteur/verification.js:249:28` | mise-a-jour | `+=` | `-=` | délai | +| `src/moteur/verification.js:249:31` | nombre-zero | `1` | `0` | délai | diff --git a/src/moteur/classement.test.js b/src/moteur/classement.test.js index 48e88ee..27228ac 100644 --- a/src/moteur/classement.test.js +++ b/src/moteur/classement.test.js @@ -124,6 +124,14 @@ describe('classer : les critères et leur ordre (§ 5.7)', () => { assert.deepEqual(classer(entrees).ordre, [2, 1]); }); + test("le plus grand écart se lit sur toute la liste, non sur sa première valeur non nulle", () => { + // Écarts au plafond a priori, personne par personne : + // 1 : 1, 3, 0 ; le plus grand 3, la première valeur non nulle 1. + // 2 : 2, 2, 2 ; le plus grand 2. + const entrees = [proposition(1, { rencontres: [7, 5, 8] }), proposition(2, { rencontres: [6, 6, 6] })]; + assert.deepEqual(classer(entrees).ordre, [2, 1]); + }); + test('seules les rencontres répétées que le moteur a choisies comptent (§ 5.4)', () => { // 1 : une répétition choisie ; 2 : cinq qu'imposent les réservations. const entrees = [proposition(1, { repetees: 1 }), proposition(2, { imposees: 5 })]; diff --git a/src/moteur/indicateurs.test.js b/src/moteur/indicateurs.test.js index c19191d..6ccd2c4 100644 --- a/src/moteur/indicateurs.test.js +++ b/src/moteur/indicateurs.test.js @@ -368,6 +368,23 @@ describe('mesurer', () => { }); }); + test("le minimum d'une population est sa plus petite valeur, où qu'elle se trouve dans l'ordre des personnes", () => { + // 1 seul à la table 1 ; 2, 3 et 4 ensemble à la table 2. Le plus petit + // nombre de rencontres est celui de la première personne : un minimum + // qui retiendrait la dernière valeur lue rendrait 2. + const mesures = mesurerPlan({ + appartenance: [null, null, null, null], + capacite: 3, + tours: [[[1], [2, 3, 4]]], + }); + assert.deepEqual(mesures.rencontres, [0, 2, 2, 2]); + assert.deepEqual(mesures.aggRencontres, { + tous: { min: 0, moyenne: 6 / 4, effectif: 4 }, + mobiles: { min: 0, moyenne: 6 / 4, effectif: 4 }, + ancres: AUCUN, + }); + }); + test('une population vide rend null, jamais 0 ni Infinity', () => { const sansAncre = mesurerPlan({ appartenance: PETITE, capacite: 3, tours: PLAN_PARFAIT }); assert.deepEqual(sansAncre.aggRencontres.ancres, AUCUN); @@ -523,6 +540,46 @@ describe('mesurer', () => { assert.deepEqual(mesures.rencontresRepetees, { choisies: 1, imposees: 0 }); }); + test('maxRencontresPaire est le plus grand compte des paires, non celui de la dernière paire réunie', () => { + // (1, 2) se réunit aux tours 1 et 2, (2, 3) au seul tour 3. Dans l'ordre + // des paires, (2, 3) vient après (1, 2) : le maximum reste 2. + const mesures = mesurerPlan({ + appartenance: [null, null, null], + capacite: 2, + tours: [ + [[1, 2], [3]], + [[1, 2], [3]], + [[1], [2, 3]], + ], + }); + assert.deepEqual(mesures.rencontres, [1, 2, 1]); + assert.equal(mesures.maxRencontresPaire, 2); + assert.deepEqual(mesures.rencontresRepetees, { choisies: 1, imposees: 0 }); + }); + + test("les comptes par paire tiennent dans un Uint16Array jusqu'à 65 535 tours, dans un Uint32Array au-delà", () => { + // Deux participants à la même table à chaque tour : le compte de leur + // paire vaut R. À R = 65 535, le plus grand compte qu'un Uint16Array + // tient, la mémoire des paires reste à deux octets par paire. + const deux = (R) => + normaliser({ + participants: [ + { id: 1, nom: 'P1', appartenance: null }, + { id: 2, nom: 'P2', appartenance: null }, + ], + tables: [{ id: 1, numero: 1, capacite: 2 }], + tours: R, + reservations: [], + contraintes: SANS_CONTRAINTE, + }); + const a = parcourirTours(deux(65_535), new Int32Array(2 * 65_535)).parPaire; + assert.ok(a instanceof Uint16Array, `${a.constructor.name} à 65 535 tours`); + assert.deepEqual(Array.from(a), [65_535]); + const b = parcourirTours(deux(65_536), new Int32Array(2 * 65_536)).parPaire; + assert.ok(b instanceof Uint32Array, `${b.constructor.name} à 65 536 tours`); + assert.deepEqual(Array.from(b), [65_536]); + }); + test('personne à la même table : aucune rencontre, maximum par paire à 0', () => { const mesures = mesurerPlan({ appartenance: ['X', 'X'], diff --git a/src/moteur/plafond.test.js b/src/moteur/plafond.test.js index 152a682..94219b2 100644 --- a/src/moteur/plafond.test.js +++ b/src/moteur/plafond.test.js @@ -337,6 +337,45 @@ describe('plafonds : valeurs exactes (§ 5.5, § 15)', () => { assert.equal(plafondsAPrioriParEnumeration(instance)[p], 27); }); + test('le plafond a priori se mémoïse sur la rangée de la personne, et sur elle seule', () => { + // Tables d'index 0 et 1 : 8 sièges, v = 7 ; table d'index 2 : 7 sièges, + // v = 6. Aucun ancré, 24 participants, 2 tours : n_p = 23, N − 1 = 23. + // Les dix premiers ont pour rangée, index par index : + // 0 [libre, libre] 1 [1, libre] 2 [1, libre] 3 [libre, libre] + // 4 [0, 2] 5 à 7 [libre, libre] 8 [0, libre] + // 9 [2, libre] + // les suivants sont mobiles. [0, 2] vaut 7 + 6 = 13, [2, libre] 6 + 7 = + // 13 ; un tour libre prend une table de 8, et toute autre rangée vaut + // 7 + 7 = 14. Les voisins de 4 et de 8 sont posés pour que [0, 2] et + // [0, libre] se confondent sous une clé qui lirait, au lieu de la rangée + // de la personne, la case de la suivante, celle de la précédente ou une + // case d'un autre rang : l'une recevrait alors le plafond de l'autre. + const { instance } = forme({ + capacites: [8, 8, 7], + ancres: [0, 0, 0], + autres: 24, + tours: 2, + partiels: [ + [LIBRE, LIBRE], + [1, LIBRE], + [1, LIBRE], + [LIBRE, LIBRE], + [0, 2], + [LIBRE, LIBRE], + [LIBRE, LIBRE], + [LIBRE, LIBRE], + [0, LIBRE], + [2, LIBRE], + ], + }); + const attendu = new Array(24).fill(14); + attendu[4] = 13; + attendu[9] = 13; + assert.deepEqual(instance.ids, suite(1, 24)); + assert.deepEqual(plafondsAPriori(instance), attendu); + assert.deepEqual(plafondsAPrioriParEnumeration(instance), attendu); + }); + test("une table pleine d'ancrés n'est pas admissible ; un partiellement fixé compte parmi les mobiles", () => { // Table d'index 0 : 5 sièges, aucun ancré. Table d'index 1 : 2 sièges, // 2 ancrés, pleine. Le partiellement fixé est fixé au tour 1 à la table @@ -519,6 +558,36 @@ describe("plafond a priori : la programmation dynamique contre l'énumération ( assert.deepEqual(plafondsAPriori(instance), [1, 1]); }); + test("l'énumération visite chaque multiensemble, celui qui répète une table du milieu compris", () => { + // Tables d'index 0 et 2 : 2 sièges, un ancré, v = 0 ; table d'index 1 : + // 6 sièges, aucun ancré, v = 5. 20 mobiles, 3 tours : n_p = 19. Le seul + // meilleur itinéraire d'un mobile passe trois fois par la table 1 : + // 5 + 5 + 5 = 15. Tout autre multiensemble vaut au plus 1 ancré + 5 + 5 + // = 11 : une énumération qui sauterait {1, 1, 1} — en ne ramenant pas + // chaque rang qui suit celui qu'elle avance — rendrait 11. Un ancré + // tient sa table, 1 siège par tour : 3. + const { instance, ancres } = forme({ capacites: [2, 6, 2], ancres: [1, 0, 1], autres: 20, tours: 3 }); + const attendu = new Array(22).fill(15); + for (const [p] of [ancres[0], ancres[2]]) attendu[p] = 3; + assert.deepEqual(plafondsAPrioriParEnumeration(instance), attendu); + assert.deepEqual(plafondsAPriori(instance), attendu); + }); + + test("à 299 925 multiensembles, sous la limite, l'énumération répond", () => { + // 774 tables admissibles et 2 tours libres : C(775, 2) = 299 925, sous + // les 300 000. Le compte avance par 774, puis 774 × 775 / 2 ; un compte + // qui partirait de 2, ou d'un autre facteur que A − 1 + i, franchirait + // la limite et refuserait à tort. N − 1 = 1 borne les deux mobiles. + const { instance } = forme({ + capacites: Array(774).fill(2), + ancres: Array(774).fill(0), + autres: 2, + tours: 2, + }); + assert.deepEqual(plafondsAPrioriParEnumeration(instance), [1, 1]); + assert.deepEqual(plafondsAPriori(instance), [1, 1]); + }); + test('2 à 5 tables, 2 à 4 tours, capacités 2 à 5, ancrés et partiels : le même plafond pour chacun', () => { const bilan = eprouverAccord( arbitraireForme({ tables: [2, 5], tours: [2, 4], capacites: [2, 5], mobiles: 6, partiels: 3 }),