> ## Documentation Index
> Fetch the complete documentation index at: https://docs.models.dunsky.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Spécification de calcul eFleet

> Contrats eFleet : choix annuels de remplacement, énergie des véhicules, coûts, émissions, pénalités, plafonds et conventions de résultats.

eFleet évalue des stratégies de remplacement pour des besoins individuels de véhicules. Le chemin actif est `run.py → inputs.py → fleet_results.py → outputs.py`.

## Domaine et unités

Un `FleetNeed.key` identifie un besoin de service : région, établissement, distance annuelle, heures de ralenti, sous-type et véhicule initial. Chaque besoin représente un véhicule, sans pondération d’échantillon. Les options d’acquisition décrivent ICE, BEV et PHEV.

| Symbole | Définition | Unité |
| - | - | - |
| $D,I,W$ | Distance annuelle, ralenti, jours travaillés | distance/an, h/an, jours/an |
| $e,e_i$ | Intensités électriques en conduite et au ralenti | kWh/distance, kWh/h |
| $f,f_i$ | Intensités de carburant | unité de carburant/distance, unité/h |
| $B$ | Quantité de batterie fournie au calcul | kWh |
| $p^e_y,p^f_y$ | Prix de l’électricité et du carburant | monnaie/unité d’énergie correspondante |
| $g^e_y,g^f_y,c_y$ | Intensités d’émissions et prix carbone | gCO2e/unité d’énergie, monnaie/tCO2e |

Distance, rendement, seuil kilométrique et entretien doivent employer la même unité. Aucune conversion kilomètres/milles n’est faite. La division des émissions par $10^6$ suppose des facteurs en grammes. Les séries monétaires sont additionnées sans conversion de devise ni inflation.

## Classeur et valeurs par défaut

Les feuilles requises sont `Inputs`, `Annual Inputs`, `Global Data`, `Vehicle Specs`, `EV Availability`, `Maintenance Costs`, `Basic Fleet Info` et les trois `Replacement Costs (ICE)`, `(BEV)`, `(PHEV)`.

`Inputs` lit `StartYear`, `EndYear`, `Horizon`, `GHG_Penalty` et `NumPHEV_Cycles`. Les colonnes annuelles reconnues par `Y?2...` acceptent des années et des noms comme `Y2026`. La région `all` fournit les prix, intensités et valeurs carbone de repli. Le choix d’une série régionale dépend de sa première année de coût; les valeurs absentes ultérieures ne sont pas complétées individuellement.

L’importateur utilise 250 jours travaillés : son test `WorkingDays` sur des noms déjà convertis en minuscules empêche la substitution attendue avec les en-têtes usuels. La construction programmatique de `FleetNeed` utilise 365 jours par défaut. Les deux parcours ne sont donc pas équivalents.

Les multiplicateurs de pénalité sont 1,035 pour l’âge et le kilométrage, et 1,01 pour ICE. L’affectation globale `early_rep` évalue `bool("EarlyRep_Allowed")`, toujours vrai; la sélection vérifie l’autorisation propre au besoin. `ghg_penalty` et `phev_cycles` sont lus mais ne multiplient pas l’énergie annuelle dans `_calc_usage_costs`.

## Années

Les coûts vont de `start_year` à `horizon + max_ret_age`, inclusivement. Les indicateurs d’achat incluent `horizon`, mais les décisions parcourent `range(start_year, horizon)` et excluent cette dernière année. `end_year` détermine le début de la pénalité ICE après étude. La comparaison additionne les coûts sur toute la série, sans actualisation.

## Énergie et coûts d’utilisation

Poser $d=D/W$, $i=I/W$ et la demande électrique quotidienne non contrainte $E_d=de+ie_i$.

* ICE : $E_d=0$ et $F_d=df+if_i$.
* BEV : $F_d=0$; toute la demande électrique est desservie même au-delà de la capacité de batterie. La disponibilité de recharge ne limite pas la faisabilité dans ce calcul.
* PHEV : si $B>E_d$, conduite et ralenti sont électriques. Sinon, avec $B>0$, poser $E_d=B$, $d_e=(B-ie_i)/e$, $d_f=d-d_e$ et $F_d=d_ff$ si $d_f>0$. Le ralenti reste électrique. Une batterie non positive provoque une erreur.

L’égalité suit la branche limitée par la batterie. La distance électrique n’est pas bornée à zéro si le ralenti dépasse la batterie. Distance et jours positifs, rendements non nuls et cohérence batterie/ralenti sont nécessaires; leur validation n’est pas exhaustive.

$$
E_y=WE_d,\quad F_y=WF_d,\quad C^{energy}_y=W(E_dp^e_y+F_dp^f_y)
$$

Avec $a=d_e/d$, l’entretien non ICE vaut $D[am_{BEV}+(1-a)m_{ICE}]$; ICE utilise $Dm_{ICE}$.

$$
G_y=\frac{W(E_dg^e_y+F_dg^f_y)}{10^6},\qquad C^{carbon}_y=G_yc_y
$$

## Retraite et pénalités synthétiques

Le cycle récurrent est $L=\min(\lfloor M_{ret}/D\rfloor,A_{ret})$. L’admissibilité initiale utilise le minimum entre l’âge restant et $\max(0,\lceil(M_{ret}-M_0)/D\rceil)$. Un achat réinitialise l’échéancier. Un cycle nul rend la division de pénalité invalide.

L’âge de pénalité est $a_y=y-y_{vehicle}+1$; le kilométrage augmente depuis la valeur initiale. Les dépassements utilisent strictement `>`. Avec $u_y$ indiquant le dépassement d’au moins un seuil, $v_y,z_y$ les multiplicateurs d’âge/kilométrage applicables et $C_y$ le coût de remplacement de même motorisation :

$$
P^{ret}_y=\frac{\max_t(C_tu_t)}{L}v_yz_yu_y
$$

Pour ICE, $j_y=\mathbf1[y>end\_year]k_{ICE}$ et :

$$
b=\frac{\max(\max_t(C^{EV}_tj_t)-\max_t(C_tj_t),0)}{L}k_{ICE},\qquad P_y=P^{ret}_y+bj_y
$$

La référence électrique est BEV, sinon PHEV. Ces pénalités influencent le choix sans constituer une dépense réelle. Le multiplicateur ICE répété appartient au calcul implémenté.

## Sélection annuelle

Initialiser la stratégie de conservation, puis les essais de remplacement de même motorisation et de motorisations alternatives. Pour chaque année, actualiser les coûts d’achat, d’utilisation et de pénalité en conservant les décisions précédemment acceptées. L’économie candidate est :

$$
S_n=\sum_y(C^{current}_{n,y}-C^{trial}_{n,y})
$$

`total_cost_mat` comprend investissement, énergie, entretien, carbone et pénalités. Trier les besoins et parcourir les économies en ordre décroissant. Acheter seulement si l’économie est strictement positive, le remplacement anticipé ou dû est autorisé, et les plafonds permettent l’achat. Les égalités suivent l’ordre NumPy sans règle métier explicite.

Le plafond global est `round(pourcentage × nombre / 100)`. Le plafond par sous-type suit cette règle sauf qu’une valeur brute positive inférieure à un devient un; zéro reste zéro. Sans plafond global, la limite égale la taille de la flotte. Il s’agit d’un classement annuel glouton, pas d’une optimisation simultanée pluriannuelle.

### Validation des séries d’entrée

`check_inputs` exige prix/intensités des combustibles, limites par sous-type et prix d’acquisition jusqu’à **une année après la dernière année de coût**, soit `horizon + max_ret_age + 1`. Le calcul d’utilisation s’arrête une année plus tôt. Une limite par sous-type absente journalise une erreur et poursuit via `AttributeError`; une série trop courte provoque `ValueError`. Un kilométrage initial manquant devient zéro avec avertissement.

## Sorties et validation

`StudyResults.replacement_strategies` contient les matrices véhicule × année de coûts, carburant, électricité, émissions et pénalités, ainsi que les achats/remplacements et les options. `no_penalty_cost_mat` exclut les pénalités. Les rapports comprennent résumés, plans de remplacement, coûts/émissions et énergie de recharge par établissement. Cette dernière est en kWh annuels, pas en puissance de borne ni en profil horaire.

Exemple BEV : $D=20\,000$, $I=100$, $W=250$, $e=0.2$, $e_i=1$ donnent 4 100 kWh/an. À 0,15 monnaie/kWh, le coût est 615/an. À 100 g/kWh, les émissions sont 0,41 tCO2e/an. Ces valeurs ne sont pas des défauts.

Contrôler énergie, coûts réels séparés des pénalités, arrondis des plafonds, bornes annuelles, échéanciers et reproductibilité de l’ordre. Les tests couvrent utilisation, économies, plafonds et pénalités. Des options d’acquisition absentes provoquent des erreurs explicites; des colonnes manquantes, divisions par zéro ou années incompatibles peuvent échouer directement dans pandas ou l’arithmétique.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.