﻿# Lest — Science calorique & tonnage

> Spécification alignée sur le moteur Dart `CalorieEngine` de l'app. Les sorties sont des **estimations**. Toujours calculer **deux** scénarios : charge réelle et baseline (`loadKg = 0`).

## Entrées (`CalorieInput`)

| Champ | Rôle |
| --- | --- |
| `activity` | Voir table activités |
| `bodyWeightKg` (`W`) | Poids corporel |
| `loadKg` (`L`) | Charge ajoutée |
| `durationSec` | Durée |
| `distanceM` | Distance (marche/rucking) |
| `elevationGainM` | D+ pour dériver la pente |
| `avgHeartRate` | Optionnel ; flag `usedHeartRate` |
| `stepsPerMin` | Stepping (défaut usage ~60 si fourni) |
| `stepHeightM` | Hauteur de marche (défaut **0,20 m**) |
| `terrainFactor` (`η`) | Facteur terrain Pandolf (défaut **1,0**) |

Si `durationSec ≤ 0` ou `bodyWeightKg ≤ 0` → 0 kcal.

## Sorties (`CalorieResult`)

- `caloriesKcal` — avec charge
- `caloriesBaselineKcal` — `L = 0`
- `differentialPct` — `(chargée − baseline) / baseline × 100`
- `usedHeartRate` — true si FC fournie

## Constantes

- `wattsToKcalPerMin = 0.01434` → `kcal/min = M_watts × 0.01434`
- Pente clampée (réf. CDC dans le code) : **−25 % … +25 %**
- Pente dérivée : `G ≈ (D+ / distance) × 100` puis clamp

## Routage par activité

| Activités | Pipeline |
| --- | --- |
| `rucking`, `walk` | Pandolf (bande 0,6–1,8 m/s) ou blend ACSM course hors bande |
| `stairs`, `stairmaster` | ACSM stepping × minutes |
| `hiit`, `crossfit`, `hyrox` | MET × facteur charge × minutes |

## Pandolf (marche / rucking)

Coût métabolique en **watts** :

```
M = 1.5·W + 2.0·(W+L)·(L/W)² + η·(W+L)·(1.5·V² + 0.35·V·G)
```

- `V` = vitesse m/s (`distance / duration` ; défaut ~1,4 m/s ≈ 5 km/h si distance absente)
- `G` = pente % ; si `G < 0`, correction **Santee** : `G_effectif = G × 0.3` (descente moins coûteuse mais non nulle)

**Bande de validité Pandolf** : `0.6 ≤ V ≤ 1.8` m/s.

Hors bande : blend vers ACSM course sur masse totale `W+L` :

```
VO2 = 0.2·v + 0.9·v·(G/100) + 3.5     (v en m/min)
kcal/min = VO2 · (W+L) / 1000 · 5
```

- Si `V < 0.6` : interpolation vers ACSM (avec facteur 0,7 côté ACSM dans le code).
- Si `V > 1.8` : interpolation Pandolf → ACSM sur ~1,2 m/s de transition.

Puis `kcal_séance = (kcal/min) × minutes`.

## ACSM stepping (escaliers / StairMaster)

```
VO2 = 0.2·f + 2.4·h·f + 3.5
kcal/min = VO2 · (W+L) / 1000 · 5
```

`f` = steps/min, `h` = hauteur de marche (m).

## MET (HIIT / CrossFit / Hyrox)

| Activité | MET de base |
| --- | --- |
| HIIT | 8.0 |
| CrossFit | 8.5 |
| Hyrox | 9.0 |

```
loadFactor = (W + L) / W
kcal/min = MET · W / 60 · loadFactor
```

(1 MET ≈ 1 kcal/kg/h.)

## Tonnage (implémentation profil)

Pour chaque séance avec distance `d` (m) :

```
tonnageKgKm += (bodyWeightKg + loadKg) × (d / 1000)
tonnageT = tonnageKgKm / 1000
```

Donc 1 tonne ≈ déplacer l'équivalent de 1000 kg·km (ex. 80 kg × 12,5 km).

## Ordres de grandeur (communication)

| Message | Statut |
| --- | --- |
| Jusqu'à ~+26 % (landing, ex. gilet 10 kg) | Illustration marketing |
| +8 à +15 % marche chargée / plat | Ordre de grandeur factuel souvent cité |
| Watch 486 vs Lest 612 (+126) | Exemple UI landing, pas une constante |

Toujours dire : dépend de `W`, `L`, vitesse, pente, durée, activité.

## Limites à énoncer

- Estimation, pas chambre calorimétrique / VO₂ labo.
- FC optionnelle : ne pas inventer de formule FC au-delà de « peut affiner / `usedHeartRate` ».
- Terrain `η` : défaut 1,0 si non renseigné.
- Pas de garantie d'exactitude métabolique (CGU).
- Ne pas donner de conseil médical personnalisé à partir de ces formules.

## Références conceptuelles (noms)

- Pandolf et al. — coût énergétique marche avec charge
- Correction type Santee — descentes
- ACSM — guidelines VO₂ course / stepping
- Compendium MET — intensités HIIT / CrossFit / Hyrox (valeurs retenues dans Lest : 8 / 8,5 / 9)

Lest n'est pas affilié à ces organismes ; les formules sont une **implémentation produit**.