> ## 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 répartition LDM

> Définir les tableaux LDM, identifiants, propensions, adoption initiale, inversion Bass, normalisation et réconciliation des prévisions.

LDM répartit des prévisions régionales sans recalculer l’économie du modèle d’origine. Les équations décrivent les modules `structure` actuels.

## Classeur et identifiants

| Feuille | Tableau nommé | Contrat |
| - | - | - |
| `market_and_propensity` | `TBE_market_and_propensity` | Marchés, taille, poids, méthodes initiales/de partition, diffusion |
| `region_forecast` | `TBE_region_forecast` | Valeurs annuelles et attributs |
| `region_forecast_parameters` | `TBE_region_forecast_parameters` | `column_name` classé `id` ou `disaggregate` par `parameter_type` |
| `region_parameters` | `TBE_region_parameters` | Dénominateurs régionaux |
| `subregion_parameters` | `TBE_subregion_parameters` | Régions parentes, sous-régions, types et numérateurs locaux |

`MarketPropensityID` comprend `region`, `sector`, `segment`, `type`, `sub_type`. Les prévisions gardent `scenario.name`, `potential`, `impact_type`, `savings_reporting_level`, identifiants supplémentaires et `variable`. Les doublons peuvent faire échouer le pivot. Chaque marché doit trouver sa configuration et chaque sous-région son parent.

Les propensions textuelles sont des entrées clé/valeur séparées par virgules, converties en poids flottants. Blancs et textes `none`/`nan` donnent l’absence de dictionnaire. `attribute.partition_type` est conservé, mais n’est pas un filtre automatique de partition.

## Années et unités

L’importateur extrait les années uniques et pivote les variables. Fournir des années entières triées et consécutives : la diffusion avance d’une unité par position, même si les années comportent des écarts.

Les poids sont sans dimension. Numérateur/dénominateur de marché et chaque paire de propension doivent partager une unité. La sortie conserve l’unité de prévision sans conversion. Une part ou un indicateur intensif ne doit pas être traité comme une quantité additive sans interprétation explicite.

## Propension relative

$$
B_i=\sum_k a_k\frac{x_{i,k}}{x_{R,k}}
$$

Avec `adoption_propensity_parameters=None` ou texte `none`, $B_i=1$. Les coefficients ne sont ni normalisés ni contraints positifs. Transformer ou pondérer les indicateurs selon leur relation comportementale. Les dénominateurs nuls, clés absentes et valeurs non numériques ne sont pas réparés.

## Adoption initiale

Pour `starting_point_method="sales_and_barriers"`, lire le marché $M_i$ avec `<market_share_parameter>.<sector>.<segment>` et les ventes initiales $N_i$ avec `starting_sales_parameter` :

$$
s_i=\begin{cases}N_i/M_i,&M_i\ne0\\0,&M_i=0\end{cases},\qquad s_i^0=\min(s_iB_i,0.999)
$$

Marché nul et ventes non nulles produisent zéro avec avertissement. La borne est seulement supérieure : les valeurs négatives échouent ensuite au contrôle de diffusion. Le texte `"none"` produit l’absence de point initial. Le test écrit `starting_point_method == "none" or None` n’accepte pas Python `None`, qui atteint l’erreur de méthode invalide.

## Méthodes de partition brute

`market_size` donne $r_{i,y}=M_i/M_R$, constant pour des marchés fixes. `barriers_and_market_size` donne $r_{i,y}=(M_i/M_R)B_i$. `diffusion` donne $r_{i,y}=(M_i/M_R)F_i(y)$. Toute autre valeur de `partition_method` provoque `ValueError`.

Avec $p,q,t_0$ :

$$
F(t)=\frac{1-e^{-(p+q)(t-t_0)}}{1+(q/p)e^{-(p+q)(t-t_0)}}
$$

L’âge initial équivalent est :

$$
t_i^0=\frac{\ln(1+s_i^0q/p)-\ln(1-s_i^0)}{p+q}+t_0
$$

Évaluer la première position à $t_i^0+1$, puis avancer d’un an et réétiqueter avec les années fournies. Fractions initiales et calculées sont contrôlées dans $[0,1]$. La borne exacte un passe le premier contrôle mais rend l’inverse singulier; le calcul initial usuel l’évite avec 0,999. Exiger $p$ positif, $p+q$ non nul et des valeurs finies.

## Normalisation

Pour chaque configuration, calculer une ligne pour chaque sous-région fournie, puis :

$$
w_{i,y}=\frac{r_{i,y}}{\sum_jr_{j,y}},\qquad f_{i,y}=w_{i,y}F_y
$$

L’ensemble de normalisation est la liste fournie, sans regroupement supplémentaire par type de partition ou parent. Le code peut donc inclure des territoires sans lien si l’appelant ne les filtre pas. Utiliser une partition cohérente et réconcilier par région.

Avec poids finis et somme non nulle, $\sum_i f_{i,y}=F_y$. Cela ne démontre pas la validité géographique. Poids négatifs, chevauchements et dénominateurs incohérents peuvent créer des allocations invalides. Aucun repli général pour somme nulle, bornage positif ou arrondissement en clients entiers n’est implémenté.

## Sorties et exécution

`get_disaggregated_forecasts` multiplie les partitions par chaque série puis ajoute attributs, sous-région, scénario, potentiel, impact, niveau, identifiants et variable. Les colonnes annuelles suivent `study_years`. Le CLI concatène et exporte un CSV horodaté dans `./results/`, index du dataframe inclus.

`--input-data-xlsx` utilise `./data/DERP_input.xlsx` par défaut et `--log-file` utilise `./logs/ldm.log`. Ces noms ne limitent pas les modèles admissibles. Une liste vide ou un appariement absent peut échouer à la concaténation ou à `next(...)`; aucun rétablissement général n’est prévu.

## Contrôles reproductibles

Pour 100 GWh, des parts 0,6/0,4 et facteurs 0,5/1,5 donnent des poids 0,3/0,6, normalisés à 1/3 et 2/3 : 33,333… et 66,666… GWh. Passer en MWh modifie seulement les valeurs allouées, pas les poids.

Contrôler tableaux nommés, unicité, couverture, ordre annuel, poids finis/non négatifs, adoption initiale et conservation. Tester les dénominateurs nuls avant production. Les tests existants couvrent import, syntaxe des dictionnaires, points initiaux, diffusion, partition et journaux; ils ne valident pas empiriquement les indicateurs spatiaux.


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