Lines#
One of the 24 fragments of examples/pypsa.yaml: PyPSA's Line. It adds a term to transmission_volume_expansion, transmission_expansion_cost, tech_capacity_expansion, Carrier_additions, Bus_injection, Cycle_angle_sum. It reads scenario_weight, transmission_losses under given.
dimensions:
scenario:
description: the futures dispatch is chosen in, each with a weight
snapshot:
description: dispatch periods
dtype: datetime
bus:
description: network nodes
line:
description: passive branches, each between two buses, their flow set by impedance
cycle:
description: independent cycles of the passive network graph — the cycle basis, data prep
segment:
description: >-
the cuts a passive branch's loss curve is held above — PyPSA's tangents,
as many as its `segments` count, or its secants, as many as its tolerance
loop places; none in a lossless run
dtype: int
global_constraint:
description: PyPSA's `GlobalConstraint` rows, one label per declared limit
period:
description: investment periods — PyPSA's `investment_periods`
dtype: int
carrier:
description: energy carriers, what a growth limit is set per
relations:
Line_carrier:
description: the carrier a line carries
key: line
values: carrier
Line_bus0:
description: the bus a line's flow is measured at
key: line
values: bus
Line_bus1:
description: the bus at a line's other end
key: line
values: bus
parameters:
Line_active:
description: whether a line stands in a snapshot's period — PyPSA's `active`, data prep
dims: [snapshot, line]
dtype: bool
Line_capital_weight:
description: the sum of period weights a line stands in — PyPSA's `active * period_weighting`, summed, data prep
dims: [line]
Line_first_active:
description: >-
one in the first period a line stands in, zero elsewhere, data prep.
PyPSA `1.3.0` takes `active.cumsum() == 1`, which also counts a line
that has retired in every later period (`global_constraints.py:276`,
PyPSA/PyPSA#1938)
dims: [period, line]
Line_s_nom:
description: nominal apparent power
dims: [scenario, line]
Line_s_nom_extendable:
description: whether the nominal apparent power is a decision
dims: [line]
dtype: bool
Line_s_max_pu:
description: most flow either way, per unit of nominal apparent power
dims: [scenario, snapshot, line]
Line_s_nom_min:
description: least nominal apparent power an extendable line may be built at
dims: [scenario, line]
Line_s_nom_max:
description: most nominal apparent power an extendable line may be built at
dims: [scenario, line]
Line_capital_cost:
description: cost of one unit of nominal apparent power — PyPSA's `capital_cost`, periodized as an annuity in data prep
dims: [scenario, line]
Line_s_nom_set:
description: a given nominal apparent power for an extendable line; one without a value has no row here
dims: [scenario, line]
Line_s_set:
description: a given flow schedule; a line without one has no row here
dims: [scenario, snapshot, line]
Line_cycle_weight:
description: >-
the line's series impedance, signed by its orientation in the cycle —
the cycle basis, data prep; a line in no cycle has no row. PyPSA builds
the cycle basis from the first scenario only (`networks.py:1354-1361`)
dims: [line, cycle]
Line_loss_max:
description: the loss at a line's rating — PyPSA's `r_pu_eff * (s_max_pu * s_nom_max)**2`, data prep
dims: [scenario, snapshot, line]
Line_loss_slope:
description: >-
the slope of a cut to the loss curve — a tangent's `2 * r_pu_eff * p_k`
at its segment's flow, a secant's `r_pu_eff * (p_k + p_k+1)` between
consecutive breakpoints, data prep
dims: [scenario, snapshot, line, segment]
Line_loss_offset:
description: >-
where that cut meets the loss axis — a tangent's `loss_k - slope_k * p_k`,
a secant's `-r_pu_eff * p_k * p_k+1`, negative, data prep
dims: [scenario, snapshot, line, segment]
Line_volume_weight:
description: >-
the line's length where its carrier is in the row's set, the first
scenario's length as PyPSA reads it (`global_constraints.py:835-836`) —
data prep; a
line outside it, or one that does not stand in the row's
`investment_period`, has no row
dims: [scenario, global_constraint, line]
Line_expansion_cost_weight:
description: >-
the line's capital cost where its carrier is in the row's set, times
the objective weights of the periods it stands in where the row names
no `investment_period` under `multi_investment_periods` — data prep; a
line outside the set, or one that does not stand in the row's period,
has no row
dims: [scenario, global_constraint, line]
Line_tech_capacity_weight:
description: >-
one where the line is in the row's carrier-and-bus set — data prep; one
outside it, or one that does not stand in the row's `investment_period`,
has no row
dims: [global_constraint, line]
variables:
Line_s:
description: >-
`Line-s` — PyPSA's `p0`, the flow measured at the `Line_bus0` end: a
positive value withdraws there and injects at `Line_bus1`, lossless
dims: [scenario, snapshot, line]
where: Line_active
Line_loss:
description: >-
`Line-loss` — what a line dissipates carrying its flow, pushed down by the
cost and held up by the cuts; absent, and zero in the balance, where
the network is lossless
dims: [scenario, snapshot, line]
where: transmission_losses AND Line_active
absence: zero
bounds:
lower: 0
Line_s_nom_ext:
description: >-
`Line-s_nom` — nominal apparent power where it is a decision; the
parameter of the same PyPSA name carries the fixed regime
dims: [line]
where: Line_s_nom_extendable
given:
parameters:
scenario_weight: { dims: [scenario] }
transmission_losses: { dims: [], dtype: bool }
expressions:
transmission_volume_expansion: { dims: [scenario, global_constraint] }
transmission_expansion_cost: { dims: [scenario, global_constraint] }
tech_capacity_expansion: { dims: [global_constraint] }
Carrier_additions: { dims: [period, carrier] }
Bus_injection: { dims: [scenario, snapshot, bus] }
Cycle_angle_sum: { dims: [scenario, snapshot, cycle] }
expressions:
Line_transmission_volume_expansion:
expression: sum(Line_s_nom_ext * Line_volume_weight, over=line)
adds_to: transmission_volume_expansion
Line_transmission_expansion_cost:
expression: sum(Line_s_nom_ext * Line_expansion_cost_weight, over=line)
adds_to: transmission_expansion_cost
Line_tech_capacity_expansion:
expression: sum(Line_s_nom_ext * Line_tech_capacity_weight, over=line)
adds_to: tech_capacity_expansion
Line_additions:
expression: >-
sum(Line_s_nom_ext * Line_first_active, by=Line_carrier, over=line, into=carrier)
adds_to: Carrier_additions
Line_s_monitored:
description: >-
the flow a line's post-contingency rows read — its flow where it stands,
nothing where it does not, since PyPSA builds those rows for every
branch of the sub-network in every snapshot
dims: [scenario, snapshot, line]
cases:
standing: { when: Line_active, expression: Line_s }
otherwise: 0
Line_injection:
expression: >-
-sum(Line_s, by=Line_bus0, over=line, into=bus)
+ sum(Line_s, by=Line_bus1, over=line, into=bus)
- (0.5 * sum(Line_loss, by=Line_bus0, over=line, into=bus))
- (0.5 * sum(Line_loss, by=Line_bus1, over=line, into=bus))
adds_to: Bus_injection
Line_angle_sum:
expression: sum(Line_s * Line_cycle_weight, over=line)
adds_to: Cycle_angle_sum
constraints:
Line_fix_s_lower:
description: "`Line-fix-s-lower` — a fixed line carries at least the negative of its rating, the loss counted against it"
dims: [scenario, snapshot, line]
where: not Line_s_nom_extendable AND Line_active
expression: Line_s - Line_loss >= -Line_s_max_pu * Line_s_nom
Line_fix_s_upper:
description: "`Line-fix-s-upper` — a fixed line carries at most its rating, the loss included"
dims: [scenario, snapshot, line]
where: not Line_s_nom_extendable AND Line_active
expression: Line_s + Line_loss <= Line_s_max_pu * Line_s_nom
Line_ext_s_lower:
description: "`Line-ext-s-lower` — an extendable line carries at least the negative of its rating of the chosen build, the loss counted against it"
dims: [scenario, snapshot, line]
where: Line_s_nom_extendable AND Line_active
expression: Line_s - Line_loss >= -Line_s_max_pu * Line_s_nom_ext
Line_ext_s_upper:
description: "`Line-ext-s-upper` — an extendable line carries at most its rating of the chosen build, the loss included"
dims: [scenario, snapshot, line]
where: Line_s_nom_extendable AND Line_active
expression: Line_s + Line_loss <= Line_s_max_pu * Line_s_nom_ext
Line_ext_s_nom_lower:
description: "`Line-ext-s_nom-lower` — the chosen build is at least its floor in every scenario"
dims: [scenario, line]
where: Line_s_nom_extendable
expression: Line_s_nom_ext >= Line_s_nom_min
Line_ext_s_nom_upper:
description: "`Line-ext-s_nom-upper` — the chosen build is at most its cap in every scenario; a cap of infinity is no row"
dims: [scenario, line]
where: Line_s_nom_extendable AND Line_s_nom_max
expression: Line_s_nom_ext <= Line_s_nom_max
Line_s_nom_set:
description: "`Line-s_nom_set` — the chosen build pinned, wherever a value is given"
dims: [scenario, line]
where: Line_s_nom_extendable AND Line_s_nom_set
expression: Line_s_nom_ext == Line_s_nom_set
Line_s_set:
description: "`Line-s_set` — flow pinned to the given schedule, wherever one is given"
dims: [scenario, snapshot, line]
where: Line_s_set AND Line_active
expression: Line_s == Line_s_set
Line_loss_upper:
description: "`Line-loss_upper` — a line dissipates at most the loss at its rating"
dims: [scenario, snapshot, line]
where: transmission_losses AND Line_active
expression: Line_loss <= Line_loss_max
Line_loss_tangents_forward:
description: >-
`Line-loss_tangents-{k}-1`, `Line-loss_secants-pos` — the loss sits above
every cut to its curve for flow one way; PyPSA names one row per tangent
`k`, or one row stacked over its `secant` axis, and this block states them
all over the segment dimension
dims: [scenario, snapshot, line, segment]
where: transmission_losses AND Line_active
expression: Line_loss + Line_loss_slope * Line_s >= Line_loss_offset
Line_loss_tangents_reverse:
description: >-
`Line-loss_tangents-{k}--1`, `Line-loss_secants-neg` — the same fan
mirrored, the loss depending on the flow's magnitude
dims: [scenario, snapshot, line, segment]
where: transmission_losses AND Line_active
expression: Line_loss - Line_loss_slope * Line_s >= Line_loss_offset
objective:
sense: minimize
expression: >-
sum(((scenario_weight * Line_s_nom_ext) * Line_capital_cost) * Line_capital_weight)
Sets#
| Symbol | Meaning |
|---|---|
| \(\Xi\) | index \(\xi\) — scenario — the futures dispatch is chosen in, each with a weight |
| \(\mathcal{T}\) | index \(t\) — snapshot — dispatch periods |
| \(\mathcal{N}\) | index \(n\) — bus with \(\mathrm{Line\_bus0}: \mathcal{K} \to \mathcal{N},\ \mathrm{Line\_bus1}: \mathcal{K} \to \mathcal{N}\) — network nodes |
| \(\mathcal{K}\) | index \(k\) — line with \(\mathrm{Line\_carrier}: \mathcal{K} \to \mathcal{I},\ \mathrm{Line\_bus0}: \mathcal{K} \to \mathcal{N},\ \mathrm{Line\_bus1}: \mathcal{K} \to \mathcal{N}\) — passive branches, each between two buses, their flow set by impedance |
| \(\mathcal{C}\) | index \(c\) — cycle — independent cycles of the passive network graph — the cycle basis, data prep |
| \(\mathcal{E}\) | index \(e\) — segment — the cuts a passive branch's loss curve is held above — PyPSA's tangents, as many as its segments count, or its secants, as many as its tolerance loop places; none in a lossless run |
| \(\mathcal{G}\) | index \(g\) — global_constraint — PyPSA's GlobalConstraint rows, one label per declared limit |
| \(\mathcal{Y}\) | index \(y\) — period — investment periods — PyPSA's investment_periods |
| \(\mathcal{I}\) | index \(i\) — carrier with \(\mathrm{Line\_carrier}: \mathcal{K} \to \mathcal{I}\) — energy carriers, what a growth limit is set per |
Parameters#
| Symbol | Meaning |
|---|---|
| \(\mathrm{on}^{s}\) | Line_active over \(\mathcal{T} \times \mathcal{K}\) — whether a line stands in a snapshot's period — PyPSA's active, data prep |
| \(\mathrm{W}^{s}\) | Line_capital_weight over \(\mathcal{K}\) — the sum of period weights a line stands in — PyPSA's active * period_weighting, summed, data prep |
| \(\mathrm{new}^{s}\) | Line_first_active over \(\mathcal{Y} \times \mathcal{K}\) — one in the first period a line stands in, zero elsewhere, data prep. PyPSA 1.3.0 takes active.cumsum() == 1, which also counts a line that has retired in every later period (global_constraints.py:276, PyPSA/PyPSA#1938) |
| \(\mathrm{s}^{\mathrm{nom}}\) | Line_s_nom over \(\Xi \times \mathcal{K}\) — nominal apparent power |
| \(\mathrm{ext}^{s}\) | Line_s_nom_extendable over \(\mathcal{K}\) — whether the nominal apparent power is a decision |
| \(\overline{\mathrm{s}}\) | Line_s_max_pu over \(\Xi \times \mathcal{T} \times \mathcal{K}\) — most flow either way, per unit of nominal apparent power |
| \(\underline{\mathrm{s}}^{\mathrm{nom}}\) | Line_s_nom_min over \(\Xi \times \mathcal{K}\) — least nominal apparent power an extendable line may be built at |
| \(\overline{\mathrm{s}}^{\mathrm{nom}}\) | Line_s_nom_max over \(\Xi \times \mathcal{K}\) — most nominal apparent power an extendable line may be built at |
| \(\mathrm{c}^{\mathrm{cap},s}\) | Line_capital_cost over \(\Xi \times \mathcal{K}\) — cost of one unit of nominal apparent power — PyPSA's capital_cost, periodized as an annuity in data prep |
| \(\mathrm{s}^{\mathrm{nom,set}}\) | Line_s_nom_set over \(\Xi \times \mathcal{K}\) — a given nominal apparent power for an extendable line; one without a value has no row here |
| \(\mathrm{s}^{\mathrm{set}}\) | Line_s_set over \(\Xi \times \mathcal{T} \times \mathcal{K}\) — a given flow schedule; a line without one has no row here |
| \(\mathrm{x}\) | Line_cycle_weight over \(\mathcal{K} \times \mathcal{C}\) — the line's series impedance, signed by its orientation in the cycle — the cycle basis, data prep; a line in no cycle has no row. PyPSA builds the cycle basis from the first scenario only (networks.py:1354-1361) |
| \(\overline{\ell}\) | Line_loss_max over \(\Xi \times \mathcal{T} \times \mathcal{K}\) — the loss at a line's rating — PyPSA's r_pu_eff * (s_max_pu * s_nom_max)**2, data prep |
| \(\mathrm{a}\) | Line_loss_slope over \(\Xi \times \mathcal{T} \times \mathcal{K} \times \mathcal{E}\) — the slope of a cut to the loss curve — a tangent's 2 * r_pu_eff * p_k at its segment's flow, a secant's r_pu_eff * (p_k + p_k+1) between consecutive breakpoints, data prep |
| \(\mathrm{b}\) | Line_loss_offset over \(\Xi \times \mathcal{T} \times \mathcal{K} \times \mathcal{E}\) — where that cut meets the loss axis — a tangent's loss_k - slope_k * p_k, a secant's -r_pu_eff * p_k * p_k+1, negative, data prep |
| \(\mathrm{len}\) | Line_volume_weight over \(\Xi \times \mathcal{G} \times \mathcal{K}\) — the line's length where its carrier is in the row's set, the first scenario's length as PyPSA reads it (global_constraints.py:835-836) — data prep; a line outside it, or one that does not stand in the row's investment_period, has no row |
| \(\mathrm{cc}\) | Line_expansion_cost_weight over \(\Xi \times \mathcal{G} \times \mathcal{K}\) — the line's capital cost where its carrier is in the row's set, times the objective weights of the periods it stands in where the row names no investment_period under multi_investment_periods — data prep; a line outside the set, or one that does not stand in the row's period, has no row |
| \(\mathrm{m}^{l}\) | Line_tech_capacity_weight over \(\mathcal{G} \times \mathcal{K}\) — one where the line is in the row's carrier-and-bus set — data prep; one outside it, or one that does not stand in the row's investment_period, has no row |
Variables#
| Symbol | Meaning |
|---|---|
| \(s\) | Line_s over \(\Xi \times \mathcal{T} \times \mathcal{K}\) — Line-s — PyPSA's p0, the flow measured at the Line_bus0 end: a positive value withdraws there and injects at Line_bus1, lossless |
| \(\ell\) | Line_loss over \(\Xi \times \mathcal{T} \times \mathcal{K}\) — Line-loss — what a line dissipates carrying its flow, pushed down by the cost and held up by the cuts; absent, and zero in the balance, where the network is lossless |
| \(S\) | Line_s_nom_ext over \(\mathcal{K}\) — Line-s_nom — nominal apparent power where it is a decision; the parameter of the same PyPSA name carries the fixed regime |
Given#
| Symbol | Meaning |
|---|---|
| \(\pi\) | scenario_weight over \(\Xi\), data another file declares |
| \(\mathrm{lossy}\) | transmission_losses (scalar), data another file declares |
| \(\mathit{transmission\_volume\_expansion}\) | transmission_volume_expansion over \(\Xi \times \mathcal{G}\), an expression this file adds Line_transmission_volume_expansion to |
| \(\mathit{transmission\_expansion\_cost}\) | transmission_expansion_cost over \(\Xi \times \mathcal{G}\), an expression this file adds Line_transmission_expansion_cost to |
| \(\mathit{tech\_capacity\_expansion}\) | tech_capacity_expansion over \(\mathcal{G}\), an expression this file adds Line_tech_capacity_expansion to |
| \(\mathit{Carrier\_additions}\) | Carrier_additions over \(\mathcal{Y} \times \mathcal{I}\), an expression this file adds Line_additions to |
| \(\mathit{Bus\_injection}\) | Bus_injection over \(\Xi \times \mathcal{T} \times \mathcal{N}\), an expression this file adds Line_injection to |
| \(\mathit{Cycle\_angle\_sum}\) | Cycle_angle_sum over \(\Xi \times \mathcal{T} \times \mathcal{C}\), an expression this file adds Line_angle_sum to |
Definitions#
| Symbol | Meaning |
|---|---|
| \(\mathit{Line\_transmission\_volume\_expansion}\) | Line_transmission_volume_expansion over \(\Xi \times \mathcal{G}\) |
| \(\mathit{Line\_transmission\_expansion\_cost}\) | Line_transmission_expansion_cost over \(\Xi \times \mathcal{G}\) |
| \(\mathit{Line\_tech\_capacity\_expansion}\) | Line_tech_capacity_expansion over \(\mathcal{G}\) |
| \(\mathit{Line\_additions}\) | Line_additions over \(\mathcal{Y} \times \mathcal{I}\) |
| \(\check{s}\) | Line_s_monitored over \(\Xi \times \mathcal{T} \times \mathcal{K}\) — the flow a line's post-contingency rows read — its flow where it stands, nothing where it does not, since PyPSA builds those rows for every branch of the sub-network in every snapshot |
| \(\mathit{Line\_injection}\) | Line_injection over \(\Xi \times \mathcal{T} \times \mathcal{N}\) |
| \(\mathit{Line\_angle\_sum}\) | Line_angle_sum over \(\Xi \times \mathcal{T} \times \mathcal{C}\) |
Objective#
\[
\min \sum_{\xi \in \Xi,\ k \in \mathcal{K}} \pi_{\xi} \cdot S_{k} \cdot \mathrm{c}^{\mathrm{cap},s}_{\xi,k} \cdot \mathrm{W}^{s}_{k}
\]
Subject to#
Line_fix_s_lower
\[
s_{\xi,t,k} - \ell_{\xi,t,k} \ge -\overline{\mathrm{s}}_{\xi,t,k} \cdot \mathrm{s}^{\mathrm{nom}}_{\xi,k} \qquad \forall\, \xi \in \Xi,\ t \in \mathcal{T},\ k \in \mathcal{K} \,:\, \neg \mathrm{ext}^{s}_{k} \wedge \mathrm{on}^{s}_{t,k}
\]
Line_fix_s_upper
\[
s_{\xi,t,k} + \ell_{\xi,t,k} \le \overline{\mathrm{s}}_{\xi,t,k} \cdot \mathrm{s}^{\mathrm{nom}}_{\xi,k} \qquad \forall\, \xi \in \Xi,\ t \in \mathcal{T},\ k \in \mathcal{K} \,:\, \neg \mathrm{ext}^{s}_{k} \wedge \mathrm{on}^{s}_{t,k}
\]
Line_ext_s_lower
\[
s_{\xi,t,k} - \ell_{\xi,t,k} \ge -\overline{\mathrm{s}}_{\xi,t,k} \cdot S_{k} \qquad \forall\, \xi \in \Xi,\ t \in \mathcal{T},\ k \in \mathcal{K} \,:\, \mathrm{ext}^{s}_{k} \wedge \mathrm{on}^{s}_{t,k}
\]
Line_ext_s_upper
\[
s_{\xi,t,k} + \ell_{\xi,t,k} \le \overline{\mathrm{s}}_{\xi,t,k} \cdot S_{k} \qquad \forall\, \xi \in \Xi,\ t \in \mathcal{T},\ k \in \mathcal{K} \,:\, \mathrm{ext}^{s}_{k} \wedge \mathrm{on}^{s}_{t,k}
\]
Line_ext_s_nom_lower
\[
S_{k} \ge \underline{\mathrm{s}}^{\mathrm{nom}}_{\xi,k} \qquad \forall\, \xi \in \Xi,\ k \in \mathcal{K} \,:\, \mathrm{ext}^{s}_{k}
\]
Line_ext_s_nom_upper
\[
S_{k} \le \overline{\mathrm{s}}^{\mathrm{nom}}_{\xi,k} \qquad \forall\, \xi \in \Xi,\ k \in \mathcal{K} \,:\, \mathrm{ext}^{s}_{k} \wedge \overline{\mathrm{s}}^{\mathrm{nom}}_{\xi,k} \text{ is defined}
\]
Line_s_nom_set
\[
S_{k} = \mathrm{s}^{\mathrm{nom,set}}_{\xi,k} \qquad \forall\, \xi \in \Xi,\ k \in \mathcal{K} \,:\, \mathrm{ext}^{s}_{k} \wedge \mathrm{s}^{\mathrm{nom,set}}_{\xi,k} \text{ is defined}
\]
Line_s_set
\[
s_{\xi,t,k} = \mathrm{s}^{\mathrm{set}}_{\xi,t,k} \qquad \forall\, \xi \in \Xi,\ t \in \mathcal{T},\ k \in \mathcal{K} \,:\, \mathrm{s}^{\mathrm{set}}_{\xi,t,k} \text{ is defined} \wedge \mathrm{on}^{s}_{t,k}
\]
Line_loss_upper
\[
\ell_{\xi,t,k} \le \overline{\ell}_{\xi,t,k} \qquad \forall\, \xi \in \Xi,\ t \in \mathcal{T},\ k \in \mathcal{K} \,:\, \mathrm{lossy} \wedge \mathrm{on}^{s}_{t,k}
\]
Line_loss_tangents_forward
\[
\ell_{\xi,t,k} + \mathrm{a}_{\xi,t,k,e} \cdot s_{\xi,t,k} \ge \mathrm{b}_{\xi,t,k,e} \qquad \forall\, \xi \in \Xi,\ t \in \mathcal{T},\ k \in \mathcal{K},\ e \in \mathcal{E} \,:\, \mathrm{lossy} \wedge \mathrm{on}^{s}_{t,k}
\]
Line_loss_tangents_reverse
\[
\ell_{\xi,t,k} - \mathrm{a}_{\xi,t,k,e} \cdot s_{\xi,t,k} \ge \mathrm{b}_{\xi,t,k,e} \qquad \forall\, \xi \in \Xi,\ t \in \mathcal{T},\ k \in \mathcal{K},\ e \in \mathcal{E} \,:\, \mathrm{lossy} \wedge \mathrm{on}^{s}_{t,k}
\]
Definitions#
Line_transmission_volume_expansion
\[
\mathit{Line\_transmission\_volume\_expansion}_{\xi,g} = \sum_{k \in \mathcal{K}} S_{k} \cdot \mathrm{len}_{\xi,g,k} \qquad \forall\, \xi \in \Xi,\ g \in \mathcal{G}
\]
Line_transmission_expansion_cost
\[
\mathit{Line\_transmission\_expansion\_cost}_{\xi,g} = \sum_{k \in \mathcal{K}} S_{k} \cdot \mathrm{cc}_{\xi,g,k} \qquad \forall\, \xi \in \Xi,\ g \in \mathcal{G}
\]
Line_tech_capacity_expansion
\[
\mathit{Line\_tech\_capacity\_expansion}_{g} = \sum_{k \in \mathcal{K}} S_{k} \cdot \mathrm{m}^{l}_{g,k} \qquad \forall\, g \in \mathcal{G}
\]
Line_additions
\[
\mathit{Line\_additions}_{y,i} = \sum_{k \in \mathcal{K} \,:\, \mathrm{Line\_carrier}(k) = i} S_{k} \cdot \mathrm{new}^{s}_{y,k} \qquad \forall\, y \in \mathcal{Y},\ i \in \mathcal{I}
\]
Line_s_monitored
\[
\check{s}_{\xi,t,k} = \begin{cases} s_{\xi,t,k} & \text{if } \mathrm{on}^{s}_{t,k} \\ 0 & \text{otherwise} \end{cases} \qquad \forall\, \xi \in \Xi,\ t \in \mathcal{T},\ k \in \mathcal{K}
\]
Line_injection
\[
\mathit{Line\_injection}_{\xi,t,n} = -\left( \sum_{k \in \mathcal{K} \,:\, \mathrm{Line\_bus0}(k) = n} s_{\xi,t,k} \right) + \sum_{k \in \mathcal{K} \,:\, \mathrm{Line\_bus1}(k) = n} s_{\xi,t,k} - 0.5 \cdot \left( \sum_{k \in \mathcal{K} \,:\, \mathrm{Line\_bus0}(k) = n} \ell_{\xi,t,k} \right) - 0.5 \cdot \left( \sum_{k \in \mathcal{K} \,:\, \mathrm{Line\_bus1}(k) = n} \ell_{\xi,t,k} \right) \qquad \forall\, \xi \in \Xi,\ t \in \mathcal{T},\ n \in \mathcal{N}
\]
Line_angle_sum
\[
\mathit{Line\_angle\_sum}_{\xi,t,c} = \sum_{k \in \mathcal{K}} s_{\xi,t,k} \cdot \mathrm{x}_{k,c} \qquad \forall\, \xi \in \Xi,\ t \in \mathcal{T},\ c \in \mathcal{C}
\]
Variable domains#
Line_s
\[
s_{\xi,t,k} \in \mathbb{R} \qquad \forall\, \xi \in \Xi,\ t \in \mathcal{T},\ k \in \mathcal{K} \,:\, \mathrm{on}^{s}_{t,k}
\]
Line_loss
\[
\ell_{\xi,t,k} \ge 0 \qquad \forall\, \xi \in \Xi,\ t \in \mathcal{T},\ k \in \mathcal{K} \,:\, \mathrm{lossy} \wedge \mathrm{on}^{s}_{t,k}
\]
Line_s_nom_ext
\[
S_{k} \in \mathbb{R} \qquad \forall\, k \in \mathcal{K} \,:\, \mathrm{ext}^{s}_{k}
\]