Notation¶
This page defines the canonical symbols used throughout the mathematical formulation. Each symbol maps to a specific field or variable in the code.
Sets & Indices¶
| Symbol | Description | Code |
|---|---|---|
| \(t \in \mathcal{T}\) | Timesteps | time dimension |
| \(p \in \mathcal{P}\) | Periods (multi-period only) | period dimension |
| \(f \in \mathcal{F}\) | Flows | flow dimension |
| \(b \in \mathcal{B}\) | Buses | bus dimension |
| \(s \in \mathcal{S}\) | Storages | storage dimension |
| \(k \in \mathcal{K}\) | Effects (cost, CO₂, …) | effect dimension |
| \(j \in \mathcal{K}\) | Source effect (cross-effect) | source_effect dimension |
Variables¶
| Symbol | Code | Domain | Unit | Description |
|---|---|---|---|---|
| \(P_{f,t(,p)}\) | flow--rate[flow, time(, period)] |
\(\geq 0\) | MW | Flow rate |
| \(E_{s,t(,p)}\) | storage--level[storage, time(, period)] |
\(\geq 0\) | MWh | Stored energy |
| \(\Phi_{k,t(,p)}^{\text{temporal}}\) | effect--temporal[effect, time(, period)] |
\(\mathbb{R}\) | varies | Temporal (per-timestep) effect |
| \(\Phi_{k(,p)}^{\text{lump}}\) | effect--lump[effect(, period)] |
\(\mathbb{R}\) | varies | Lump (sizing + one-time) effect |
| \(\Phi_{k(,p)}\) | effect--total[effect(, period)] |
\(\mathbb{R}\) | varies | Total effect per period |
| \(S_{f(,p)}\) | flow--size[flow(, period)] |
\(\geq 0\) | MW | Invested flow capacity |
| \(y_{f(,p)}\) | flow--size_indicator[flow(, period)] |
\(\{0, 1\}\) | — | Binary invest indicator (flow) |
| \(S_{s(,p)}\) | storage--capacity[storage(, period)] |
\(\geq 0\) | MWh | Invested storage capacity |
| \(y_{s(,p)}\) | storage--size_indicator[storage(, period)] |
\(\{0, 1\}\) | — | Binary invest indicator (storage) |
| \(\sigma_{f,t(,p)}\) | flow--on[flow, time(, period)] |
\(\{0, 1\}\) | — | On/off indicator |
| \(\tau^+_{f,t(,p)}\) | flow--startup[flow, time(, period)] |
\(\{0, 1\}\) | — | Startup event indicator |
| \(\tau^-_{f,t(,p)}\) | flow--shutdown[flow, time(, period)] |
\(\{0, 1\}\) | — | Shutdown event indicator |
| \(\mathrm{D}^{\text{up}}_{f,t(,p)}\) | uptime[flow, time(, period)] |
\(\geq 0\) | h | Consecutive uptime |
| \(\mathrm{D}^{\text{down}}_{f,t(,p)}\) | downtime[flow, time(, period)] |
\(\geq 0\) | h | Consecutive downtime |
Indexing Convention¶
Variables (the table above) are shown with all dimensions they live on. There's no broadcasting for decision variables — every \((\text{flow}, \text{time}, \ldots)\) cell is its own variable.
Optional dims — currently just period — exist in some models and not others. We mark them in parentheses, e.g. \(P_{f,t(,p)}\): the period subscript is present in multi-period models, absent in single-period ones. To keep formulas readable, constraint derivations that aren't specifically about multi-period dynamics drop the parenthetical and treat \(p\) as implicit context — the constraint applies pointwise across whichever optional dims happen to be in the model.
Parameters are different. Symbol subscripts show only the indices the formulation structurally requires — the dims a constraint iterates over and that change its meaning. Most parameters also broadcast over additional dims in the API; we don't decorate the symbols with every dim they could take, because that turns formulas into pyramids of subscripts.
The broadcast hierarchy:
- Period (\(p\)) — almost every parameter accepts this: even "scalar" things like \(\bar{\mathrm{P}}_f\), \(\mathrm{D}^{\text{up,min}}\), or \(\mathrm{S}^-\) become \(\bar{\mathrm{P}}_{f,p}\) etc. in multi-period models. Variables already reflect this in the table above (e.g. \(P_{f,t(,p)}\)).
- Time (\(t\)) — only fields typed
Variateaccept this: bounds \(\underline{\mathrm{p}}_{f,t}, \bar{\mathrm{p}}_{f,t}\), profiles \(\pi_{f,t}\), efficiencies \(\eta^c_s, \eta^d_s\), losses \(\delta_s\), conversion coefficients \(\mathrm{a}_{f,i}\), effect / running / startup costs \(\mathrm{c}_{f,k,t}, \mathrm{r}_{f,k,t}, \mathrm{u}_{f,k,t}\), cross-effects \(\alpha_{k,j,t}\). - Build period (\(p_b\)) — at-build investment coefficients only: \(\gamma^{\text{build}}_{f,k}, \phi^{\text{build}}_{f,k}\), …
When a formula shows a \(t\) subscript on a parameter, it's because time variation is structurally meaningful for that constraint (e.g. a fixed profile is meaningless without time). Parameters without a \(t\) subscript may still be time-varying when the API field accepts it — the constraint just reads it pointwise. The same applies for \(p\): omit unless we're discussing multi-period dynamics specifically.
Parameters¶
| Symbol | Code | Domain | Unit | Description |
|---|---|---|---|---|
| \(\bar{\mathrm{P}}_f\) | Flow.size |
\(\geq 0\) or \(\infty\) | MW | Nominal capacity |
| \(\underline{\mathrm{p}}_{f,t}\) | Flow.relative_minimum |
\([0, 1]\) | — | Relative lower bound |
| \(\bar{\mathrm{p}}_{f,t}\) | Flow.relative_maximum |
\([0, 1]\) | — | Relative upper bound |
| \(\pi_{f,t}\) | Flow.fixed_relative_profile |
\([0, 1]\) | — | Fixed profile |
| \(\mathrm{c}_{f,k,t}\) | Flow.effects_per_flow_hour |
\(\mathbb{R}\) | varies | Effect coefficient per flow-hour |
| \(\bar{\mathrm{E}}_s\) | Storage.capacity |
\(\geq 0\) | MWh | Storage capacity |
| \(\eta^{\text{c}}_s\) | Storage.eta_charge |
\((0, 1]\) | — | Charging efficiency |
| \(\eta^{\text{d}}_s\) | Storage.eta_discharge |
\((0, 1]\) | — | Discharging efficiency |
| \(\delta_s\) | Storage.relative_loss_per_hour |
\([0, 1]\) | 1/h | Self-discharge rate |
| \(\underline{\mathrm{e}}_s\) | Storage.relative_minimum_level |
\([0, 1]\) | — | Relative min SOC |
| \(\bar{\mathrm{e}}_s\) | Storage.relative_maximum_level |
\([0, 1]\) | — | Relative max SOC |
| \(\mathrm{a}_{f,i}\) | Converter.conversion_factors |
\(\mathbb{R}\) | — | Conversion coefficient (per flow, per equation) |
| \(\alpha_{k,j}\) | Effect.contribution_from |
\(\mathbb{R}\) | varies | Cross-effect factor (scalar) |
| \(\alpha_{k,j,t}\) | Effect.contribution_from (Variate) |
\(\mathbb{R}\) | varies | Cross-effect factor (time-varying; lump uses time-mean) |
| \(\bar{\Phi}_k\) | Effect.maximum |
\(\mathbb{R}\) | varies | Maximum aggregate (weighted sum across periods) |
| \(\underline{\Phi}_k\) | Effect.minimum |
\(\mathbb{R}\) | varies | Minimum aggregate (weighted sum across periods) |
| \(\bar{\Phi}_k^{\text{per period}}\) | Effect.maximum_per_period |
\(\mathbb{R}\) | varies | Maximum per period |
| \(\underline{\Phi}_k^{\text{per period}}\) | Effect.minimum_per_period |
\(\mathbb{R}\) | varies | Minimum per period |
| \(\bar{\Phi}_{k,t}^{\text{per hour}}\) | Effect.maximum_per_hour |
\(\mathbb{R}\) | varies/h | Maximum per hour (rate, scaled by \(\Delta t_t\)) |
| \(\underline{\Phi}_{k,t}^{\text{per hour}}\) | Effect.minimum_per_hour |
\(\mathbb{R}\) | varies/h | Minimum per hour (rate, scaled by \(\Delta t_t\)) |
| \(\mathrm{S}^-\) | Sizing.min_size |
\(\geq 0\) | MW or MWh | Minimum invested size (flow or storage) |
| \(\mathrm{S}^+\) | Sizing.max_size |
\(\geq 0\) | MW or MWh | Maximum invested size (flow or storage) |
| \(\gamma_{f,k}\), \(\gamma_{s,k}\) | Sizing.effects_per_size |
\(\mathbb{R}\) | varies | Per-size investment cost (flow or storage; one-time, sized) |
| \(\phi_{f,k}\), \(\phi_{s,k}\) | Sizing.effects_fixed |
\(\mathbb{R}\) | varies | Fixed investment cost (flow or storage; one-time, sized) |
| \(\gamma^{\text{build}}_{f,k}\) | Investment.effects_per_size_at_build |
\(\mathbb{R}\) | varies | Per-size CAPEX charged in the build period |
| \(\phi^{\text{build}}_{f,k}\) | Investment.effects_fixed_at_build |
\(\mathbb{R}\) | varies | Fixed CAPEX charged in the build period |
| \(\gamma^{\text{rec}}_{f,k}\) | Investment.effects_per_size_recurring |
\(\mathbb{R}\) | varies | Recurring per-size cost (each active period) |
| \(\phi^{\text{rec}}_{f,k}\) | Investment.effects_fixed_recurring |
\(\mathbb{R}\) | varies | Recurring fixed cost (each active period) |
| \(\mathrm{D}^{\text{up,min}}\) | Status.min_uptime |
\(\geq 0\) | h | Minimum consecutive uptime |
| \(\mathrm{D}^{\text{up,max}}\) | Status.max_uptime |
\(\geq 0\) | h | Maximum consecutive uptime |
| \(\mathrm{D}^{\text{down,min}}\) | Status.min_downtime |
\(\geq 0\) | h | Minimum consecutive downtime |
| \(\mathrm{D}^{\text{down,max}}\) | Status.max_downtime |
\(\geq 0\) | h | Maximum consecutive downtime |
| \(\mathrm{r}_{f,k,t}\) | Status.effects_per_running_hour |
\(\mathbb{R}\) | varies | Running cost coefficient |
| \(\mathrm{u}_{f,k,t}\) | Status.effects_per_startup |
\(\mathbb{R}\) | varies | Startup cost coefficient |
| \(\mathrm{w}_t\) | weights | \(> 0\) | — | Timestep weight |
| \(\Delta t_t\) | dt | \(> 0\) | h | Timestep duration |
| \(\omega_p\) | optimize(period_weights=...) |
\(> 0\) | — | Global period weight (multi-period only) |
| \(\omega_{k,p}\) | Effect.period_weights |
\(> 0\) | — | Per-effect period weight |
Naming Conventions¶
Italic letters denote decision variables; upright (\mathrm{}) letters
denote parameters — following ISO 80000-2. So \(P_{f,t}\) (italic) is the
flow rate variable, while \(\bar{\mathrm{P}}_f\) (upright with overbar) is the
parameter that bounds it.
| Convention | Meaning | Example |
|---|---|---|
| Italic (default math mode) | Decision variables | \(P\) (flow rate), \(E\) (stored energy), \(S\) (size) |
Upright (\mathrm{}) |
Parameters | \(\mathrm{c}_{f,k,t}\) (cost coefficient), \(\bar{\mathrm{P}}_f\) (capacity), \(\mathrm{a}_{f,i}\) (conversion coefficient) |
| Overbar / underbar | Bound (paired with the variable's letter) | \(\bar{\mathrm{P}}\) (upper bound on \(P\)), \(\underline{\mathrm{P}}\) (lower bound) |
| Lowercase variant | Relative bound (fraction of size/capacity) | \(\bar{\mathrm{p}}_{f,t}\), \(\underline{\mathrm{p}}_{f,t}\) (fraction of \(\bar{\mathrm{P}}_f\)); \(\bar{\mathrm{e}}_s\), \(\underline{\mathrm{e}}_s\) (fraction of \(\bar{\mathrm{E}}_s\)) |
| Greek | Parameters with established physical meaning | \(\eta\) (efficiency), \(\delta\) (loss), \(\pi\) (profile), \(\gamma\) (per-size cost) |
| Subscripts | Indexing | \(f\) (flow), \(t\) (time), \(s\) (storage), \(b\) (bus), \(k\) (effect), \(j\) (source effect) |
| Superscripts | Qualification | \(\eta^{\text{c}}\) (charge), \(\eta^{\text{d}}\) (discharge) |
Greek letters render with their conventional shape regardless of \mathrm{},
so we use them as-is for parameters without further wrapping.