@open3cl/engine 1.8.62 → 1.8.63
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/9_chauffage.js +21 -2
- package/9_chauffage.spec.js +47 -1
- package/9_emetteur_ch.js +31 -3
- package/9_emetteur_ch.spec.js +122 -1
- package/README.md +25 -25
- package/engine.js +1 -1
- package/package.json +1 -1
package/9_chauffage.js
CHANGED
|
@@ -22,6 +22,25 @@ export function isImmeuble(map_id) {
|
|
|
22
22
|
return map.includes('immeuble') && !map.includes('appartement') && !map.includes('maison');
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
+
/**
|
|
26
|
+
* Installation hybride collective-individuelle (enum_type_installation_id = 4) en configuration
|
|
27
|
+
* « chauffage collectif avec base + appoint » (enum_cfg_installation_ch_id = 10) : le premier
|
|
28
|
+
* émetteur est celui de la base collective, les suivants sont les émetteurs de l'appoint
|
|
29
|
+
* individuel. L'intermittence de ces derniers relève de la table « immeuble collectif, chauffage
|
|
30
|
+
* individuel » (Tribu Calcul_emetteur.cs : Is_individuel = oui pour l'émetteur d'appoint).
|
|
31
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §9.8
|
|
32
|
+
* @param {object} instChDe donnee_entree de l'installation de chauffage
|
|
33
|
+
* @param {number} idx rang de l'émetteur dans l'installation
|
|
34
|
+
* @returns {boolean}
|
|
35
|
+
*/
|
|
36
|
+
export function isEmetteurAppointIndividuel(instChDe, idx) {
|
|
37
|
+
return (
|
|
38
|
+
idx >= 1 &&
|
|
39
|
+
Number(instChDe.enum_type_installation_id) === 4 &&
|
|
40
|
+
Number(instChDe.enum_cfg_installation_ch_id) === 10
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
25
44
|
export default function calc_chauffage(
|
|
26
45
|
dpe,
|
|
27
46
|
ch,
|
|
@@ -50,8 +69,8 @@ export default function calc_chauffage(
|
|
|
50
69
|
di.besoin_ch_depensier = bch_dep;
|
|
51
70
|
|
|
52
71
|
const em_ch = ch.emetteur_chauffage_collection.emetteur_chauffage;
|
|
53
|
-
em_ch.forEach((em_ch) => {
|
|
54
|
-
calc_emetteur_ch(em_ch, de, map_id, inertie_id);
|
|
72
|
+
em_ch.forEach((em_ch, idx) => {
|
|
73
|
+
calc_emetteur_ch(em_ch, de, map_id, inertie_id, isEmetteurAppointIndividuel(de, idx));
|
|
55
74
|
});
|
|
56
75
|
|
|
57
76
|
if (de.surface_chauffee !== Sh) {
|
package/9_chauffage.spec.js
CHANGED
|
@@ -61,7 +61,8 @@ const {
|
|
|
61
61
|
isImmeuble,
|
|
62
62
|
generateursPrincipauxCascade,
|
|
63
63
|
ratioDimensionnement,
|
|
64
|
-
reseauCirculateurUnique
|
|
64
|
+
reseauCirculateurUnique,
|
|
65
|
+
isEmetteurAppointIndividuel
|
|
65
66
|
} = await import('./9_chauffage.js');
|
|
66
67
|
const { requestInput, tv, tvColumnIDs } = await import('./utils.js');
|
|
67
68
|
const { calc_emetteur_ch } = await import('./9_emetteur_ch.js');
|
|
@@ -289,6 +290,51 @@ describe('calc_chauffage - rdim de l’installation transmis au générateur', (
|
|
|
289
290
|
});
|
|
290
291
|
});
|
|
291
292
|
|
|
293
|
+
describe('isEmetteurAppointIndividuel (issue #292)', () => {
|
|
294
|
+
test.each([
|
|
295
|
+
['4', '10', 0, false],
|
|
296
|
+
['4', '10', 1, true],
|
|
297
|
+
['4', '10', 3, true],
|
|
298
|
+
[4, 10, 1, true],
|
|
299
|
+
['4', '11', 1, false],
|
|
300
|
+
['4', '3', 1, false],
|
|
301
|
+
['2', '10', 1, false],
|
|
302
|
+
['1', '10', 1, false]
|
|
303
|
+
])('type installation %s, cfg %s, rang %s → %s', (ti, cfg, idx, attendu) => {
|
|
304
|
+
expect(
|
|
305
|
+
isEmetteurAppointIndividuel(
|
|
306
|
+
{ enum_type_installation_id: ti, enum_cfg_installation_ch_id: cfg },
|
|
307
|
+
idx
|
|
308
|
+
)
|
|
309
|
+
).toBe(attendu);
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
describe('calc_chauffage - émetteurs d’une installation base + appoint (issue #292)', () => {
|
|
314
|
+
test('type 4 / cfg 10 : seul l’émetteur de rang ≥ 1 est traité comme appoint individuel', () => {
|
|
315
|
+
const ch = installation([generateur(), generateur()], [emetteur('1'), emetteur('1')], {
|
|
316
|
+
enum_type_installation_id: '4',
|
|
317
|
+
enum_cfg_installation_ch_id: '10'
|
|
318
|
+
});
|
|
319
|
+
appel(ch);
|
|
320
|
+
|
|
321
|
+
const appels = vi.mocked(calc_emetteur_ch).mock.calls;
|
|
322
|
+
expect(appels).toHaveLength(2);
|
|
323
|
+
expect(appels[0][4]).toBe(false);
|
|
324
|
+
expect(appels[1][4]).toBe(true);
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
test('autre configuration : aucun émetteur d’appoint individuel', () => {
|
|
328
|
+
const ch = installation([generateur()], [emetteur('1'), emetteur('1')], {
|
|
329
|
+
enum_type_installation_id: '4',
|
|
330
|
+
enum_cfg_installation_ch_id: '11'
|
|
331
|
+
});
|
|
332
|
+
appel(ch);
|
|
333
|
+
|
|
334
|
+
expect(vi.mocked(calc_emetteur_ch).mock.calls.map((c) => c[4])).toEqual([false, false]);
|
|
335
|
+
});
|
|
336
|
+
});
|
|
337
|
+
|
|
292
338
|
describe('isImmeuble', () => {
|
|
293
339
|
test('immeuble uniquement, pas appartement issu d’un immeuble ni méthode inconnue', () => {
|
|
294
340
|
expect(isImmeuble(6)).toBe(true);
|
package/9_emetteur_ch.js
CHANGED
|
@@ -65,7 +65,20 @@ function tv_rendement_regulation(di, de) {
|
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
|
|
68
|
+
/**
|
|
69
|
+
* En bug_for_bug_compat, indique si l'intermittence saisie par le logiciel (tv_intermittence_id)
|
|
70
|
+
* correspond à une ligne de la table réservée aux installations collectives.
|
|
71
|
+
* @param {object} de donnee_entree de l'émetteur
|
|
72
|
+
* @returns {boolean}
|
|
73
|
+
*/
|
|
74
|
+
export function isIntermittenceCollectiveSaisie(de) {
|
|
75
|
+
if (!bug_for_bug_compat || !de.tv_intermittence_id) return false;
|
|
76
|
+
const row = tv('intermittence', { tv_intermittence_id: de.tv_intermittence_id }, de);
|
|
77
|
+
if (!row || !row.enum_type_installation_id) return false;
|
|
78
|
+
return !row.enum_type_installation_id.split('|').includes('1');
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function tv_intermittence(di, de, inst_ch_de, map_id, inertie_id, isAppointIndividuel) {
|
|
69
82
|
let hasComptage = false;
|
|
70
83
|
let row;
|
|
71
84
|
|
|
@@ -106,6 +119,15 @@ function tv_intermittence(di, de, inst_ch_de, map_id, inertie_id) {
|
|
|
106
119
|
matcher.enum_classe_inertie_id = inertie_id;
|
|
107
120
|
}
|
|
108
121
|
|
|
122
|
+
// Émetteur d'appoint individuel d'une installation base collective + appoint individuel :
|
|
123
|
+
// table « chauffage individuel », sans notion de comptage individuel (§9.8).
|
|
124
|
+
// En bug_for_bug_compat, on conserve la table collective si le logiciel l'a retenue pour cet
|
|
125
|
+
// émetteur (tv_intermittence_id saisi sur une ligne sans installation individuelle).
|
|
126
|
+
if (isAppointIndividuel && !isIntermittenceCollectiveSaisie(de)) {
|
|
127
|
+
matcher.enum_type_installation_id = '1';
|
|
128
|
+
delete matcher.comptage_individuel;
|
|
129
|
+
}
|
|
130
|
+
|
|
109
131
|
row = tv('intermittence', matcher, de);
|
|
110
132
|
if (row) {
|
|
111
133
|
di.i0 = Number(row.i0);
|
|
@@ -115,7 +137,13 @@ function tv_intermittence(di, de, inst_ch_de, map_id, inertie_id) {
|
|
|
115
137
|
}
|
|
116
138
|
}
|
|
117
139
|
|
|
118
|
-
export function calc_emetteur_ch(
|
|
140
|
+
export function calc_emetteur_ch(
|
|
141
|
+
em_ch,
|
|
142
|
+
inst_ch_de,
|
|
143
|
+
map_id,
|
|
144
|
+
inertie_id,
|
|
145
|
+
isAppointIndividuel = false
|
|
146
|
+
) {
|
|
119
147
|
const de = em_ch.donnee_entree;
|
|
120
148
|
const di = {};
|
|
121
149
|
const du = {};
|
|
@@ -123,7 +151,7 @@ export function calc_emetteur_ch(em_ch, inst_ch_de, map_id, inertie_id) {
|
|
|
123
151
|
tv_rendement_distribution_ch(di, de);
|
|
124
152
|
tv_rendement_emission(di, de);
|
|
125
153
|
tv_rendement_regulation(di, de);
|
|
126
|
-
tv_intermittence(di, de, inst_ch_de, map_id, inertie_id);
|
|
154
|
+
tv_intermittence(di, de, inst_ch_de, map_id, inertie_id, isAppointIndividuel);
|
|
127
155
|
|
|
128
156
|
em_ch.donnee_intermediaire = di;
|
|
129
157
|
em_ch.donnee_utilisateur = du;
|
package/9_emetteur_ch.spec.js
CHANGED
|
@@ -26,7 +26,8 @@ vi.mock('./core/tv/infrastructure/tvs.store.js', () => ({
|
|
|
26
26
|
TvsStore: vi.fn(() => mockTvsStore)
|
|
27
27
|
}));
|
|
28
28
|
|
|
29
|
-
const { rendement_emission, calc_emetteur_ch } =
|
|
29
|
+
const { rendement_emission, calc_emetteur_ch, isIntermittenceCollectiveSaisie } =
|
|
30
|
+
await import('./9_emetteur_ch.js');
|
|
30
31
|
const { tv } = await import('./utils.js');
|
|
31
32
|
|
|
32
33
|
beforeEach(() => {
|
|
@@ -409,6 +410,126 @@ describe('tv_intermittence - intermittence', () => {
|
|
|
409
410
|
});
|
|
410
411
|
});
|
|
411
412
|
|
|
413
|
+
/**
|
|
414
|
+
* Issue #292 : émetteur d'appoint individuel d'une installation hybride (type 4) base collective +
|
|
415
|
+
* appoint individuel (cfg 10). Tribu (Calcul_emetteur.cs l.80-129) lit I0 dans la table
|
|
416
|
+
* « chauffage individuel » pour cet émetteur.
|
|
417
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §9.8
|
|
418
|
+
*/
|
|
419
|
+
describe('tv_intermittence - émetteur d’appoint individuel (issue #292)', () => {
|
|
420
|
+
function emetteurAppoint(tvIntermittenceId) {
|
|
421
|
+
const em = emetteur({ typeEmissionDistributionId: '11' });
|
|
422
|
+
Object.assign(em.donnee_entree, {
|
|
423
|
+
enum_type_chauffage_id: '2',
|
|
424
|
+
enum_equipement_intermittence_id: '1',
|
|
425
|
+
enum_type_regulation_id: '1',
|
|
426
|
+
tv_intermittence_id: tvIntermittenceId
|
|
427
|
+
});
|
|
428
|
+
return em;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
const ligneIndividuelle = {
|
|
432
|
+
i0: '0.97',
|
|
433
|
+
tv_intermittence_id: '112',
|
|
434
|
+
enum_type_installation_id: '1|4'
|
|
435
|
+
};
|
|
436
|
+
const ligneCollective = {
|
|
437
|
+
i0: '1.07',
|
|
438
|
+
tv_intermittence_id: '158',
|
|
439
|
+
enum_type_installation_id: '2|3|4'
|
|
440
|
+
};
|
|
441
|
+
|
|
442
|
+
test('appoint individuel : matcher sur installation individuelle, sans comptage', () => {
|
|
443
|
+
const em = emetteurAppoint();
|
|
444
|
+
mockTv({ intermittence: ligneIndividuelle });
|
|
445
|
+
|
|
446
|
+
calc_emetteur_ch(em, { enum_type_installation_id: '4' }, '31', '3', true);
|
|
447
|
+
|
|
448
|
+
expect(tvMatchers('intermittence')).toEqual([
|
|
449
|
+
{
|
|
450
|
+
enum_methode_application_dpe_log_id: '31',
|
|
451
|
+
enum_type_installation_id: '1',
|
|
452
|
+
enum_type_chauffage_id: '2',
|
|
453
|
+
enum_equipement_intermittence_id: '1',
|
|
454
|
+
enum_type_regulation_id: '1',
|
|
455
|
+
enum_type_emission_distribution_id: '11'
|
|
456
|
+
}
|
|
457
|
+
]);
|
|
458
|
+
expect(em.donnee_intermediaire.i0).toBeCloseTo(0.97, 10);
|
|
459
|
+
expect(em.donnee_entree.tv_intermittence_id).toBe(112);
|
|
460
|
+
});
|
|
461
|
+
|
|
462
|
+
test('émetteur de base (non appoint) : matcher inchangé (type 4, comptage)', () => {
|
|
463
|
+
const em = emetteurAppoint();
|
|
464
|
+
mockTv({ intermittence: ligneCollective });
|
|
465
|
+
|
|
466
|
+
calc_emetteur_ch(em, { enum_type_installation_id: '4' }, '31', '3');
|
|
467
|
+
|
|
468
|
+
const [matcher] = tvMatchers('intermittence');
|
|
469
|
+
expect(matcher.enum_type_installation_id).toBe('4');
|
|
470
|
+
expect(matcher.comptage_individuel).toBe('Absence');
|
|
471
|
+
expect(em.donnee_intermediaire.i0).toBeCloseTo(1.07, 10);
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
test('bug_for_bug_compat : ligne individuelle saisie par le logiciel → table individuelle', () => {
|
|
475
|
+
utilsState.bugForBugCompat = true;
|
|
476
|
+
const em = emetteurAppoint(112);
|
|
477
|
+
mockTv({ intermittence: ligneIndividuelle });
|
|
478
|
+
|
|
479
|
+
calc_emetteur_ch(em, { enum_type_installation_id: '4' }, '31', '3', true);
|
|
480
|
+
|
|
481
|
+
const matchers = tvMatchers('intermittence');
|
|
482
|
+
expect(matchers.at(-1).enum_type_installation_id).toBe('1');
|
|
483
|
+
expect(matchers.at(-1)).not.toHaveProperty('comptage_individuel');
|
|
484
|
+
});
|
|
485
|
+
|
|
486
|
+
test('bug_for_bug_compat : ligne collective saisie par le logiciel → table collective conservée', () => {
|
|
487
|
+
utilsState.bugForBugCompat = true;
|
|
488
|
+
const em = emetteurAppoint(158);
|
|
489
|
+
mockTv({ intermittence: ligneCollective });
|
|
490
|
+
|
|
491
|
+
calc_emetteur_ch(em, { enum_type_installation_id: '4' }, '27', '3', true);
|
|
492
|
+
|
|
493
|
+
const matchers = tvMatchers('intermittence');
|
|
494
|
+
expect(matchers.at(-1).enum_type_installation_id).toBe('4');
|
|
495
|
+
expect(matchers.at(-1).comptage_individuel).toBe('Absence');
|
|
496
|
+
expect(em.donnee_intermediaire.i0).toBeCloseTo(1.07, 10);
|
|
497
|
+
});
|
|
498
|
+
});
|
|
499
|
+
|
|
500
|
+
describe('isIntermittenceCollectiveSaisie', () => {
|
|
501
|
+
test('hors bug_for_bug_compat : toujours faux, sans lecture de table', () => {
|
|
502
|
+
expect(isIntermittenceCollectiveSaisie({ tv_intermittence_id: 158 })).toBe(false);
|
|
503
|
+
expect(tv).not.toHaveBeenCalled();
|
|
504
|
+
});
|
|
505
|
+
|
|
506
|
+
test('bug_for_bug_compat sans tv_intermittence_id : faux', () => {
|
|
507
|
+
utilsState.bugForBugCompat = true;
|
|
508
|
+
expect(isIntermittenceCollectiveSaisie({})).toBe(false);
|
|
509
|
+
expect(tv).not.toHaveBeenCalled();
|
|
510
|
+
});
|
|
511
|
+
|
|
512
|
+
test.each([
|
|
513
|
+
['2|3|4', true],
|
|
514
|
+
['2', true],
|
|
515
|
+
['1|4', false],
|
|
516
|
+
['1', false],
|
|
517
|
+
[undefined, false]
|
|
518
|
+
])('type d’installation de la ligne saisie = %s → %s', (types, attendu) => {
|
|
519
|
+
utilsState.bugForBugCompat = true;
|
|
520
|
+
mockTv({ intermittence: { tv_intermittence_id: '7', enum_type_installation_id: types } });
|
|
521
|
+
|
|
522
|
+
expect(isIntermittenceCollectiveSaisie({ tv_intermittence_id: 7 })).toBe(attendu);
|
|
523
|
+
expect(tvMatchers('intermittence')).toEqual([{ tv_intermittence_id: 7 }]);
|
|
524
|
+
});
|
|
525
|
+
|
|
526
|
+
test('ligne saisie introuvable : faux', () => {
|
|
527
|
+
utilsState.bugForBugCompat = true;
|
|
528
|
+
mockTv({});
|
|
529
|
+
expect(isIntermittenceCollectiveSaisie({ tv_intermittence_id: 7 })).toBe(false);
|
|
530
|
+
});
|
|
531
|
+
});
|
|
532
|
+
|
|
412
533
|
describe('calc_emetteur_ch - résultat', () => {
|
|
413
534
|
test('initialise donnee_utilisateur et remplace donnee_intermediaire', () => {
|
|
414
535
|
const em = emetteur({ typeEmissionDistributionId: '12' });
|
package/README.md
CHANGED
|
@@ -375,29 +375,29 @@ Ces résultats sont **générés automatiquement** à la fin de `npm run test:co
|
|
|
375
375
|
|
|
376
376
|
<!-- CORPUS:START -->
|
|
377
377
|
|
|
378
|
-
> **Version `1.8.
|
|
378
|
+
> **Version `1.8.62`** · branche `main` · généré le 2026-10-15
|
|
379
379
|
> Seuil de tolérance **5%**
|
|
380
380
|
|
|
381
381
|
<table>
|
|
382
382
|
<tr>
|
|
383
383
|
<td align="center"><strong>9</strong><br/><sub>corpus</sub></td>
|
|
384
384
|
<td align="center"><strong>89 418</strong><br/><sub>DPE analysés</sub></td>
|
|
385
|
-
<td align="center"><strong>
|
|
386
|
-
<td align="center"><strong>79,
|
|
385
|
+
<td align="center"><strong>71 082</strong><br/><sub>DPE conformes</sub></td>
|
|
386
|
+
<td align="center"><strong>79,49 %</strong><br/><sub>réussite globale</sub></td>
|
|
387
387
|
</tr>
|
|
388
388
|
</table>
|
|
389
389
|
|
|
390
390
|
| | Corpus | Réussite | | DPE conformes |
|
|
391
391
|
| :-: | :---------------------------------------------------------------------------------------------------------------------- | ----------: | :--------------------- | -------------: |
|
|
392
|
-
| 🔴 | **Généraliste**<br/><sub>`corpus_dpe.csv`</sub> | **47,
|
|
393
|
-
| 🟢 | **Appartement · chauffage
|
|
394
|
-
| 🟢 | **Appartement · chauffage
|
|
395
|
-
| 🟢 | **Logement individuel (2025)**<br/><sub>`dpe_logement_individuel_2025.csv`</sub> | **
|
|
396
|
-
| 🟢 | **Maison individuelle (2025)**<br/><sub>`dpe_maison_individuelle_2025.csv`</sub> | **
|
|
397
|
-
| 🟢 | **Immeuble · chauffage collectif**<br/><sub>`dpe_immeuble_chauffage_collectif.csv`</sub> | **88,
|
|
398
|
-
| 🟢 | **Immeuble · chauffage individuel**<br/><sub>`dpe_immeuble_chauffage_individuel.csv`</sub> | **85,
|
|
399
|
-
| 🟡 | **Immeuble · chauffage mixte**<br/><sub>`dpe_immeuble_chauffage_mixte.csv`</sub> | **69,
|
|
400
|
-
| 🔴 | **Individuel généré depuis l'immeuble (2026)**<br/><sub>`dpe_individuel_a_partir_dpe_immeuble_2026.csv`</sub> | **56,
|
|
392
|
+
| 🔴 | **Généraliste**<br/><sub>`corpus_dpe.csv`</sub> | **47,82 %** | `██████████░░░░░░░░░░` | 4 782 / 9 999 |
|
|
393
|
+
| 🟢 | **Appartement · chauffage individuel (2025)**<br/><sub>`dpe_appartement_individuel_chauffage_individuel_2025.csv`</sub> | **93,94 %** | `███████████████████░` | 9 394 / 10 000 |
|
|
394
|
+
| 🟢 | **Appartement · chauffage collectif (2025)**<br/><sub>`dpe_appartement_individuel_chauffage_collectif_2025.csv`</sub> | **93,64 %** | `███████████████████░` | 9 364 / 10 000 |
|
|
395
|
+
| 🟢 | **Logement individuel (2025)**<br/><sub>`dpe_logement_individuel_2025.csv`</sub> | **91,54 %** | `██████████████████░░` | 9 147 / 9 992 |
|
|
396
|
+
| 🟢 | **Maison individuelle (2025)**<br/><sub>`dpe_maison_individuelle_2025.csv`</sub> | **89,44 %** | `██████████████████░░` | 8 943 / 9 999 |
|
|
397
|
+
| 🟢 | **Immeuble · chauffage collectif**<br/><sub>`dpe_immeuble_chauffage_collectif.csv`</sub> | **88,20 %** | `██████████████████░░` | 8 656 / 9 814 |
|
|
398
|
+
| 🟢 | **Immeuble · chauffage individuel**<br/><sub>`dpe_immeuble_chauffage_individuel.csv`</sub> | **85,14 %** | `█████████████████░░░` | 8 512 / 9 998 |
|
|
399
|
+
| 🟡 | **Immeuble · chauffage mixte**<br/><sub>`dpe_immeuble_chauffage_mixte.csv`</sub> | **69,39 %** | `██████████████░░░░░░` | 6 673 / 9 616 |
|
|
400
|
+
| 🔴 | **Individuel généré depuis l'immeuble (2026)**<br/><sub>`dpe_individuel_a_partir_dpe_immeuble_2026.csv`</sub> | **56,11 %** | `███████████░░░░░░░░░` | 5 611 / 10 000 |
|
|
401
401
|
|
|
402
402
|
<sub>🟢 ≥ 85 % · 🟡 ≥ 60 % · 🔴 < 60 %</sub>
|
|
403
403
|
|
|
@@ -408,24 +408,24 @@ Ces résultats sont **générés automatiquement** à la fin de `npm run test:co
|
|
|
408
408
|
|
|
409
409
|
<table>
|
|
410
410
|
<tr>
|
|
411
|
-
<td align="center"><strong>5,
|
|
412
|
-
<td align="center"><strong>
|
|
413
|
-
<td align="center"><strong>0,
|
|
414
|
-
<td align="center"><strong>
|
|
411
|
+
<td align="center"><strong>5,85 ms</strong><br/><sub>moyenne</sub></td>
|
|
412
|
+
<td align="center"><strong>5,12 ms</strong><br/><sub>médiane</sub></td>
|
|
413
|
+
<td align="center"><strong>0,10 ms</strong><br/><sub>min</sub></td>
|
|
414
|
+
<td align="center"><strong>1,05 s</strong><br/><sub>max</sub></td>
|
|
415
415
|
</tr>
|
|
416
416
|
</table>
|
|
417
417
|
|
|
418
418
|
| Corpus | Moyenne | Médiane | Min | Max | p95 | p99 |
|
|
419
419
|
| :--------------------------------------------- | ------: | ------: | ------: | -------: | ------: | ------: |
|
|
420
|
-
| **Généraliste** |
|
|
421
|
-
| **Appartement · chauffage
|
|
422
|
-
| **Appartement · chauffage
|
|
423
|
-
| **Logement individuel (2025)** | 4,
|
|
424
|
-
| **Maison individuelle (2025)** | 5,
|
|
425
|
-
| **Immeuble · chauffage collectif** | 5,
|
|
426
|
-
| **Immeuble · chauffage individuel** | 6,
|
|
427
|
-
| **Immeuble · chauffage mixte** | 5,
|
|
428
|
-
| **Individuel généré depuis l'immeuble (2026)** |
|
|
420
|
+
| **Généraliste** | 6,93 ms | 5,75 ms | 0,40 ms | 73,5 ms | 15,6 ms | 24,8 ms |
|
|
421
|
+
| **Appartement · chauffage individuel (2025)** | 5,03 ms | 4,64 ms | 1,66 ms | 38,8 ms | 8,73 ms | 12,6 ms |
|
|
422
|
+
| **Appartement · chauffage collectif (2025)** | 6,12 ms | 5,80 ms | 1,86 ms | 62,0 ms | 9,63 ms | 15,0 ms |
|
|
423
|
+
| **Logement individuel (2025)** | 4,76 ms | 4,26 ms | 1,72 ms | 33,5 ms | 8,74 ms | 11,8 ms |
|
|
424
|
+
| **Maison individuelle (2025)** | 5,58 ms | 5,02 ms | 1,86 ms | 47,1 ms | 9,86 ms | 13,1 ms |
|
|
425
|
+
| **Immeuble · chauffage collectif** | 5,90 ms | 5,14 ms | 0,17 ms | 139,6 ms | 11,0 ms | 17,6 ms |
|
|
426
|
+
| **Immeuble · chauffage individuel** | 6,51 ms | 5,59 ms | 0,10 ms | 88,8 ms | 13,0 ms | 20,7 ms |
|
|
427
|
+
| **Immeuble · chauffage mixte** | 5,71 ms | 4,62 ms | 0,19 ms | 1,05 s | 11,9 ms | 18,8 ms |
|
|
428
|
+
| **Individuel généré depuis l'immeuble (2026)** | 6,12 ms | 5,29 ms | 1,69 ms | 64,4 ms | 11,4 ms | 18,8 ms |
|
|
429
429
|
|
|
430
430
|
<sub>La moyenne est tirée vers le haut par les DPE collectifs, dont le coût atteint plusieurs
|
|
431
431
|
dizaines de fois la médiane : c’est la médiane qui décrit le cas courant, et p95/p99 le cas
|
package/engine.js
CHANGED
|
@@ -35,7 +35,7 @@ import DpeSanitizerService from './dpe-sanitizer.service.js';
|
|
|
35
35
|
import { reconstituerRdimDpeGenereImmeuble } from './17.2_rdim_dpe_genere_immeuble.js';
|
|
36
36
|
import { reconstituerRdimEcsIndividuelleUnique } from './11_rdim_ecs_individuelle_unique.js';
|
|
37
37
|
|
|
38
|
-
const LIB_VERSION = '1.8.
|
|
38
|
+
const LIB_VERSION = '1.8.63';
|
|
39
39
|
|
|
40
40
|
const dpeSanitizerService = new DpeSanitizerService();
|
|
41
41
|
|