From f50062bc5e44a7697d0bac7bb23a8e76daec1197 Mon Sep 17 00:00:00 2001 From: Aurash Karimi Date: Thu, 12 Feb 2026 16:19:33 +0000 Subject: [PATCH 01/23] update appraisal documentation --- docs/model/investment.md | 261 ++++++++++++++++++++++++++++++++++----- 1 file changed, 230 insertions(+), 31 deletions(-) diff --git a/docs/model/investment.md b/docs/model/investment.md index 2ee29bbaf..0dd425553 100644 --- a/docs/model/investment.md +++ b/docs/model/investment.md @@ -24,7 +24,7 @@ shadow prices for each commodity adjusted to remove the impact of binding capaci Note: there is an option to iterate over each year so that investment decisions are based on equilibrium prices in the _current year_, in what's referred to as the "[ironing-out loop]". -In this case, \\( \lambda\_{c,r,t} \\) will reflect prices from previous iteration of the +In this case, \\( \lambda\_{c,r,t} \\) will reflect prices from the previous iteration of the ironing-out loop. ## Candidate and existing asset data @@ -69,33 +69,50 @@ providing investment and dynamic decommissioning decisions. ### Pre-calculation of metrics for each supply option -> Note: This section contains a reference to "scopes", a feature that is not yet implemented - - Annualised fixed costs per unit of capacity (\\( AFC_{opt,r} \\)): For new candidates, this is their annualised CAPEX plus FOM. For existing assets, the relevant fixed cost is its FOM. -- Costs per unit of activity in each time slice, calculated as follows: +- Calculate net revenue per unit of activity \\(AC_{t}^{NPV} \\) (Tool A): + \\[ + \begin{aligned} + AC_{t}^{NPV} = & \quad -cost\_{\text{var}}[t] \\\\ + &- \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c] + + cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) \\\\ + &+ \sum\_{c} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c] \Big) + \cdot \lambda\_{c,r,t} \\\\ + &+ \sum\_{s,c} in\\_scope[s] \cdot \Big\\{ \\\\ + &\quad \quad (\mu\_{s,c}^{\text{prod}} - cost\_{\text{prod}}[s,c]) + \cdot output\_{\text{coeff}}[c] \\\\ + &\quad \quad + (\mu\_{s,c}^{\text{cons}} - cost\_{\text{cons}}[s,c]) + \cdot input\_{\text{coeff}}[c] \\\\ + &\quad \quad + (\mu\_{s,c}^{\text{net}} - cost\_{\text{net}}[s,c]) + \cdot (output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c]) \\\\ + &\Big\\} + \end{aligned} + \\] +- Calculate cost per unit of activity \\( AC_{t}^{LCOX} \\) (Tool B). Note that the commodity + of interest (primary output \\( c_{primary} \\)) is excluded from the price term: \\[ - \begin{aligned} - AC_t = & \quad cost\_{\text{var}}[t] \\\\ - &+ \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c] - + cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) \\\\ - &+ \sum\_{c} \Big( input\_{\text{coeff}}[c] - output\_{\text{coeff}}[c] \Big) - \cdot \lambda\_{c,r,t} \\\\ - &+ \sum\_{s,c} in\\_scope[s] \cdot \Big\\{ \\\\ - &\quad \quad (cost\_{\text{prod}}[s,c] - \mu\_{s,c}^{\text{prod}}) - \cdot output\_{\text{coeff}}[c] \\\\ - &\quad \quad + (cost\_{\text{cons}}[s,c] - \mu\_{s,c}^{\text{cons}}) - \cdot input\_{\text{coeff}}[c] \\\\ - &\quad \quad + (cost\_{\text{net}}[s,c] - \mu\_{s,c}^{\text{net}}) - \cdot (output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c]) \\\\ - &\Big\\} - \end{aligned} + \begin{aligned} + AC_{t}^{LCOX} = & \quad cost\_{\text{var}}[t] \\\\ + &+ \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c]+ + cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) \\\\ + &+ \sum\_{c \neq c_{primary}} \Big( input\_{\text{coeff}}[c] - output\_{\text{coeff}} + [c] \Big) + \cdot \lambda\_{c,r,t} \\\\ + &+ \sum\_{s,c} in\\_scope[s] \cdot \Big\\{ \\\\ + &\quad \quad (cost\_{\text{prod}}[s,c] - \mu\_{s,c}^{\text{prod}}) + \cdot output\_{\text{coeff}}[c] \\\\ + &\quad \quad + (cost\_{\text{cons}}[s,c] - \mu\_{s,c}^{\text{cons}}) + \cdot input\_{\text{coeff}}[c] \\\\ + &\quad \quad + (cost\_{\text{net}}[s,c] - \mu\_{s,c}^{\text{net}}) + \cdot (output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c]) \\\\ + &\Big\\} + \end{aligned} \\] - When using the LCOX objective, the calculation is adjusted to exclude the commodity of interest - (\\( \lambda\_{c,r,t} \\) are set to zero). + > Note: "scopes" are not implemented in the current model. ### Initialise demand profiles for commodity of interest @@ -131,7 +148,7 @@ providing investment and dynamic decommissioning decisions. #### Tool A: NPV This method is used when decision rule is single objective and objective is annualised profit for -agents' serving commodity \\( c \\). This method iteratively builds a supply portfolio by selecting +agents' serving commodity \\( c \\). It iteratively builds a supply portfolio by selecting options that offer the highest annualised profit for serving the current commodity demand. The economic evaluation uses \\( \pi_{prevMSY} \\) prices and takes account of asset-specific operational constraints (e.g., minimum load levels) and the balance level of the target commodity @@ -140,10 +157,10 @@ operational constraints (e.g., minimum load levels) and the balance level of the - **Optimise capacity and dispatch to maximise annualised profit:** Solve a small optimisation sub-problem to maximise the asset's surplus, subject to its operational rules and the specific demand tranche it is being asked to serve. \\(\varepsilon \approx 1×10^{-14}\\) is added to each - \\(AC_t \\) to allow assets which are breakeven (or very close to breakeven) to be dispatched. + \\(AC_{t}^{NPV} \\) to allow assets which are breakeven (or very close to breakeven) to be dispatched. \\[ - maximise \Big\\{ - \sum_t act_t \* (AC_t + \varepsilon) + maximise \Big\\{\sum_t act_t (AC_{t}^{NPV} + \varepsilon) \Big\\} \\] @@ -158,9 +175,12 @@ operational constraints (e.g., minimum load levels) and the balance level of the - Capacity is constrained to \\( CapMaxBuild \\) for candidates, and to known capacity for existing assets. -- **Calculate a profitability index:** This is the total annualised surplus (\\( - \sum_t - act_t \* AC \\)) divided by the annualised fixed cost (\\( - AFC \* cap \\)). +- **Calculate a profitability index:** This is the total annualised surplus divided by the + annualised fixed cost. + \\[ + \text{Profitability Index} = + \frac{\sum_t \text{act}_t \times \text{AC}_t^{\text{NPV}}}{\text{AFC} \times \text{cap}} + \\] #### Tool B: LCOX @@ -180,7 +200,7 @@ For each asset option: \\[ minimise \Big\\{ - AF \* cap + \sum_t act_t \* AC_t + VoLL \* UnmetD_t + AF \* cap + \sum_t act_t \* AC_{t}^{LCOX} + VoLL \* UnmetD_t \Big\\} \\] @@ -199,9 +219,188 @@ For each asset option: - VoLL variables are active to ensure a feasible solution alongside maximum operation of the asset. -- **Calculate a cost index:** This is the total annualised cost (\\( - AFC \* cap_r + \sum_{t} act_t \* AC_t \\)), divided by the annual output - \\( \sum_t act_t \\). +- **Calculate a cost index:** This is the total annualised cost divided by the annual output. + \\[ + \text{Cost Index} = \frac{\text{AFC} \times \text{cap}_r + \sum_t \text{act}_t + \times \text{AC}_t^{\text{LCOX}}}{\sum_t \text{act}_t} + \\] + +## Example: Gas Power Plant + +The following is an illustrative example of how the NPV and LCOX approaches work, using a simple +gas combined-cycle power plant as the supply option under consideration. +This example demonstrates the evaluation across two time periods +t1 (peak period) and t2 (off-peak period) with variable operating costs \\( cost\_{var}[t] \\) +fixed. + +### Model Parameters + +#### Asset Parameters + +| Parameter | Notation | Value | Description | +|-----------|----------|-------|-------------| +| Primary output (Electricity) | \\( output\_{coeff}[c_{primary}] \\) | 1.0 MWh per unit activity | Main commodity produced | +| By-product output (Waste heat) | \\( output\_{coeff}[c_{heat}] \\) | 0.5 MWh per unit activity | Co-product from generation | +| Input (Natural gas) | \\( input\_{coeff}[c_{gas}] \\) | 2.5 MWh per unit activity | Fuel consumption | +| Variable operating cost | \\( cost\_{var}[t] \\) | £5/MWh of activity | Operating costs per unit activity | + + +#### Investment Parameters + +| Parameter | Notation | Value | +|-----------|----------|-------| +| Annualised fixed cost | \\( AFC\_{opt,r} \\) | £1,000/MW | +| Capacity | \\( cap \\) | 100 MW | + +#### Market Prices by Time Period + +| Commodity | Notation | t1 (Peak) | t2 (Off-peak) | +|-----------|----------|-----------|---------------| +| Electricity | \\( \lambda\_{c_{elec},r,t} \\) | £90/MWh | £50/MWh | +| Heat | \\( \lambda\_{c_{heat},r,t} \\) | £25/MWh | £15/MWh | +| Natural gas | \\( \lambda\_{c_{gas},r,t} \\) | £35/MWh | £25/MWh | + +### NPV Approach (Tool A) + +#### Calculate Net Revenue per Unit of Activity + +The net revenue calculation follows the general form: + +\\[ +AC_t^{NPV} = \sum_{c} \Big( output\_{coeff}[c] - input\_{coeff}[c] \Big) \cdot \lambda_{c,r,t} - cost\_{var}[t] +\\] + +**For t1 (peak period):** + +\\[ +\begin{aligned} +AC_{t1}^{NPV} &= (1.0 \times 90) + (0.5 \times 25) + (-2.5 \times 35) - 5 \\\\ +&= 90 + 12.5 - 87.5 - 5 \\\\ +&= 10 \text{ £/MWh} +\end{aligned} +\\] + +The asset earns £10 profit for every MWh it operates during peak periods. + +**For t2 (off-peak period):** + +\\[ +\begin{aligned} +AC_{t2}^{NPV} &= (1.0 \times 50) + (0.5 \times 15) + (-2.5 \times 25) - 5 \\\\ +&= 50 + 7.5 - 62.5 - 5 \\\\ +&= -10 \text{ £/MWh} +\end{aligned} +\\] + +The asset loses £10 for every MWh it operates during off-peak periods. + +#### Dispatch Optimisation + +The optimisation maximises total net revenue across all time periods: + +\\[ +\max \sum_t act_t \cdot AC_t^{NPV} = act_{t1} \cdot 10 + act_{t2} \cdot (-10) +\\] + +where \\( act_t \\) is the activity (operational level) in each time slice, subject to operational + constraints and demand requirements. + +In this case, the optimiser will prefer to dispatch the asset during t1 (profitable) and + minimise operation during t2 (unprofitable), subject to technical constraints such as minimum +load requirements. + +#### Profitability Index + +The profitability index is calculated as: + +\\[ +\text{Profitability Index} = \frac{\sum_t act_t \cdot AC_t^{NPV}}{AFC \times cap} +\\] + +Suppose the dispatch optimiser determines \\( act_{t1} = 80 \\) MWh and \\( act_{t2} = 20 \\) MWh are +the optimal activity levels: + +\\[ +\begin{aligned} +\text{Profitability Index} &= \frac{(80 \times 10) + (20 \times (-10))}{1{,}000 \times 100} \\\\ +&= \frac{800 - 200}{100{,}000} \\\\ +&= \frac{600}{100{,}000} \\\\ +&= 0.006 +\end{aligned} +\\] + +The profitability index is then compared against all other options to determine which asset provides + the best return on investment for serving the demand. + +### LCOX Approach (Tool B) + +#### Net Cost per Unit of Activity + +The net cost excludes the primary output (electricity) and is calculated as: + +\\[ +AC_t^{LCOX} = cost\_{var}[t] + \sum_{c \neq c_{primary}} \Big( input\_{coeff}[c] - + output\_{coeff}[c] \Big) \cdot \lambda_{c,r,t} +\\] + +**For t1 (peak period):** + +\\[ +\begin{aligned} +AC_{t1}^{LCOX} &= 5 + (2.5 \times 35) - (0.5 \times 25) \\\\ +&= 5 + 87.5 - 12.5 \\\\ +&= 80 \text{ £/MWh} +\end{aligned} +\\] + +It costs £80 per MWh to operate during peak periods (net of heat by-product sales). + +**For t2 (off-peak period):** + +\\[ +\begin{aligned} +AC_{t2}^{LCOX} &= 5 + (2.5 \times 25) - (0.5 \times 15) \\\\ +&= 5 + 62.5 - 7.5 \\\\ +&= 60 \text{ £/MWh} +\end{aligned} +\\] +It costs £60 per MWh to operate during off-peak periods, reflecting lower gas prices + and lower heat by-product value. + +#### Capacity and Dispatch Optimisation + +The optimiser determines the most cost-effective capacity and dispatch pattern to meet demand across + both time periods by minimising the total annualised cost with respect to decision variables + \\( cap \\) and \\( act_t \\): + +\\[ +AFC \cdot cap + \sum_t act_t \cdot AC_t^{LCOX} = 1{,}000 \cdot cap + act_{t1} + \cdot 80 + act_{t2} \cdot 60 +\\] + +#### Cost Index (Levelised Cost of X) + +The cost index is calculated as: + +\\[ +\text{cost index} = \frac{AFC \cdot cap + \sum_t act_t \cdot AC_t^{LCOX}}{\sum_t act_t} +\\] + +Suppose the optimiser determines \\( cap = 100 \\) MW, \\( act_{t1} = 150 \\) MWh, + and \\( act_{t2} = 80 \\) MWh are the optimal capacity and activity levels: + +\\[ +\begin{aligned} +\text{cost index} &= \frac{(1{,}000 \times 100) + (150 \times 80) + (80 \times 60)}{150 + 80} \\\\ +&= \frac{100{,}000 + 12{,}000 + 4{,}800}{230} \\\\ +&= \frac{116{,}800}{230} \\\\ +&= 508 \text{ £/MWh} +\end{aligned} +\\] + +The cost index is £508 per MWh of electricity produced. + This metric is compared across all supply options to identify + the lowest-cost solution for meeting demand. [overall MUSE2 workflow]: ./README.md#framework-overview [Dispatch Optimisation Formulation]: ./dispatch_optimisation.md From 25b2ae2a21ea7c3d0f956ecf74d9989d585b69cb Mon Sep 17 00:00:00 2001 From: Aurashk Date: Fri, 13 Feb 2026 12:10:39 +0000 Subject: [PATCH 02/23] Apply suggestions from code review Co-authored-by: Alex Dewar --- docs/model/investment.md | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/docs/model/investment.md b/docs/model/investment.md index 0dd425553..336ec0351 100644 --- a/docs/model/investment.md +++ b/docs/model/investment.md @@ -75,7 +75,7 @@ providing investment and dynamic decommissioning decisions. - Calculate net revenue per unit of activity \\(AC_{t}^{NPV} \\) (Tool A): \\[ \begin{aligned} - AC_{t}^{NPV} = & \quad -cost\_{\text{var}}[t] \\\\ + AC_{t}^{NPV} = &-cost\_{\text{var}}[t] \\\\ &- \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c] + cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) \\\\ &+ \sum\_{c} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c] \Big) @@ -92,13 +92,13 @@ providing investment and dynamic decommissioning decisions. \\] - Calculate cost per unit of activity \\( AC_{t}^{LCOX} \\) (Tool B). Note that the commodity - of interest (primary output \\( c_{primary} \\)) is excluded from the price term: + of interest (primary output \\( c_{primary} \\)) is excluded from the price term: \\[ \begin{aligned} AC_{t}^{LCOX} = & \quad cost\_{\text{var}}[t] \\\\ &+ \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c]+ cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) \\\\ - &+ \sum\_{c \neq c_{primary}} \Big( input\_{\text{coeff}}[c] - output\_{\text{coeff}} + &- \sum\_{c \neq c_{primary}} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}} [c] \Big) \cdot \lambda\_{c,r,t} \\\\ &+ \sum\_{s,c} in\\_scope[s] \cdot \Big\\{ \\\\ @@ -147,8 +147,8 @@ providing investment and dynamic decommissioning decisions. #### Tool A: NPV -This method is used when decision rule is single objective and objective is annualised profit for -agents' serving commodity \\( c \\). It iteratively builds a supply portfolio by selecting +This method is used when the decision rule is `single` and the objective is annualised profit for +agents serving commodity \\( c \\). It iteratively builds a supply portfolio by selecting options that offer the highest annualised profit for serving the current commodity demand. The economic evaluation uses \\( \pi_{prevMSY} \\) prices and takes account of asset-specific operational constraints (e.g., minimum load levels) and the balance level of the target commodity @@ -179,7 +179,7 @@ operational constraints (e.g., minimum load levels) and the balance level of the annualised fixed cost. \\[ \text{Profitability Index} = - \frac{\sum_t \text{act}_t \times \text{AC}_t^{\text{NPV}}}{\text{AFC} \times \text{cap}} + \frac{\sum_t \text{act}_t \cdot \text{AC}_t^{\text{NPV}}}{\text{AFC} \cdot \text{cap}} \\] #### Tool B: LCOX @@ -200,7 +200,7 @@ For each asset option: \\[ minimise \Big\\{ - AF \* cap + \sum_t act_t \* AC_{t}^{LCOX} + VoLL \* UnmetD_t + AF \times cap + \sum_t act_t \times AC_{t}^{LCOX} + VoLL \times UnmetD_t \Big\\} \\] @@ -276,7 +276,7 @@ AC_t^{NPV} = \sum_{c} \Big( output\_{coeff}[c] - input\_{coeff}[c] \Big) \cdot \ \begin{aligned} AC_{t1}^{NPV} &= (1.0 \times 90) + (0.5 \times 25) + (-2.5 \times 35) - 5 \\\\ &= 90 + 12.5 - 87.5 - 5 \\\\ -&= 10 \text{ £/MWh} +&= \text{£10/MWh} \end{aligned} \\] @@ -288,7 +288,7 @@ The asset earns £10 profit for every MWh it operates during peak periods. \begin{aligned} AC_{t2}^{NPV} &= (1.0 \times 50) + (0.5 \times 15) + (-2.5 \times 25) - 5 \\\\ &= 50 + 7.5 - 62.5 - 5 \\\\ -&= -10 \text{ £/MWh} +&= \text{£} -10 \text{/MWh} \end{aligned} \\] @@ -349,7 +349,7 @@ AC_t^{LCOX} = cost\_{var}[t] + \sum_{c \neq c_{primary}} \Big( input\_{coeff}[c] \begin{aligned} AC_{t1}^{LCOX} &= 5 + (2.5 \times 35) - (0.5 \times 25) \\\\ &= 5 + 87.5 - 12.5 \\\\ -&= 80 \text{ £/MWh} +&= \text{£80/MWh} \end{aligned} \\] @@ -361,9 +361,10 @@ It costs £80 per MWh to operate during peak periods (net of heat by-product sal \begin{aligned} AC_{t2}^{LCOX} &= 5 + (2.5 \times 25) - (0.5 \times 15) \\\\ &= 5 + 62.5 - 7.5 \\\\ -&= 60 \text{ £/MWh} +&= \text{£60/MWh} \end{aligned} \\] + It costs £60 per MWh to operate during off-peak periods, reflecting lower gas prices and lower heat by-product value. @@ -394,7 +395,7 @@ Suppose the optimiser determines \\( cap = 100 \\) MW, \\( act_{t1} = 150 \\) MW \text{cost index} &= \frac{(1{,}000 \times 100) + (150 \times 80) + (80 \times 60)}{150 + 80} \\\\ &= \frac{100{,}000 + 12{,}000 + 4{,}800}{230} \\\\ &= \frac{116{,}800}{230} \\\\ -&= 508 \text{ £/MWh} +&= \text{£508/MWh} \end{aligned} \\] From 0703e1fadef918028b2044131497dc82a3962b61 Mon Sep 17 00:00:00 2001 From: Aurash Karimi Date: Fri, 13 Feb 2026 12:47:29 +0000 Subject: [PATCH 03/23] fix indent --- docs/model/investment.md | 62 ++++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/docs/model/investment.md b/docs/model/investment.md index 336ec0351..794a5e212 100644 --- a/docs/model/investment.md +++ b/docs/model/investment.md @@ -74,42 +74,42 @@ providing investment and dynamic decommissioning decisions. - Calculate net revenue per unit of activity \\(AC_{t}^{NPV} \\) (Tool A): \\[ - \begin{aligned} - AC_{t}^{NPV} = &-cost\_{\text{var}}[t] \\\\ - &- \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c] + - cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) \\\\ - &+ \sum\_{c} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c] \Big) - \cdot \lambda\_{c,r,t} \\\\ - &+ \sum\_{s,c} in\\_scope[s] \cdot \Big\\{ \\\\ - &\quad \quad (\mu\_{s,c}^{\text{prod}} - cost\_{\text{prod}}[s,c]) - \cdot output\_{\text{coeff}}[c] \\\\ - &\quad \quad + (\mu\_{s,c}^{\text{cons}} - cost\_{\text{cons}}[s,c]) - \cdot input\_{\text{coeff}}[c] \\\\ - &\quad \quad + (\mu\_{s,c}^{\text{net}} - cost\_{\text{net}}[s,c]) - \cdot (output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c]) \\\\ - &\Big\\} - \end{aligned} + \begin{aligned} + AC_{t}^{NPV} = &-cost\_{\text{var}}[t] \\\\ + &- \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c] + + cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) \\\\ + &+ \sum\_{c} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c] \Big) + \cdot \lambda\_{c,r,t} \\\\ + &+ \sum\_{s,c} in\\_scope[s] \cdot \Big\\{ \\\\ + &\quad \quad (\mu\_{s,c}^{\text{prod}} - cost\_{\text{prod}}[s,c]) + \cdot output\_{\text{coeff}}[c] \\\\ + &\quad \quad + (\mu\_{s,c}^{\text{cons}} - cost\_{\text{cons}}[s,c]) + \cdot input\_{\text{coeff}}[c] \\\\ + &\quad \quad + (\mu\_{s,c}^{\text{net}} - cost\_{\text{net}}[s,c]) + \cdot (output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c]) \\\\ + &\Big\\} + \end{aligned} \\] - Calculate cost per unit of activity \\( AC_{t}^{LCOX} \\) (Tool B). Note that the commodity of interest (primary output \\( c_{primary} \\)) is excluded from the price term: \\[ - \begin{aligned} - AC_{t}^{LCOX} = & \quad cost\_{\text{var}}[t] \\\\ - &+ \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c]+ - cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) \\\\ - &- \sum\_{c \neq c_{primary}} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}} - [c] \Big) - \cdot \lambda\_{c,r,t} \\\\ - &+ \sum\_{s,c} in\\_scope[s] \cdot \Big\\{ \\\\ - &\quad \quad (cost\_{\text{prod}}[s,c] - \mu\_{s,c}^{\text{prod}}) - \cdot output\_{\text{coeff}}[c] \\\\ - &\quad \quad + (cost\_{\text{cons}}[s,c] - \mu\_{s,c}^{\text{cons}}) - \cdot input\_{\text{coeff}}[c] \\\\ - &\quad \quad + (cost\_{\text{net}}[s,c] - \mu\_{s,c}^{\text{net}}) - \cdot (output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c]) \\\\ - &\Big\\} - \end{aligned} + \begin{aligned} + AC_{t}^{LCOX} = & \quad cost\_{\text{var}}[t] \\\\ + &+ \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c]+ + cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) \\\\ + &- \sum\_{c \neq c_{primary}} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}} + [c] \Big) + \cdot \lambda\_{c,r,t} \\\\ + &+ \sum\_{s,c} in\\_scope[s] \cdot \Big\\{ \\\\ + &\quad \quad (cost\_{\text{prod}}[s,c] - \mu\_{s,c}^{\text{prod}}) + \cdot output\_{\text{coeff}}[c] \\\\ + &\quad \quad + (cost\_{\text{cons}}[s,c] - \mu\_{s,c}^{\text{cons}}) + \cdot input\_{\text{coeff}}[c] \\\\ + &\quad \quad + (cost\_{\text{net}}[s,c] - \mu\_{s,c}^{\text{net}}) + \cdot (output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c]) \\\\ + &\Big\\} + \end{aligned} \\] > Note: "scopes" are not implemented in the current model. From bcd1255f9f768785422f6696b522607602b42e51 Mon Sep 17 00:00:00 2001 From: Aurash Karimi Date: Fri, 13 Feb 2026 12:48:26 +0000 Subject: [PATCH 04/23] fix indent --- docs/model/investment.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/model/investment.md b/docs/model/investment.md index 794a5e212..87f8d0d3e 100644 --- a/docs/model/investment.md +++ b/docs/model/investment.md @@ -75,19 +75,19 @@ providing investment and dynamic decommissioning decisions. - Calculate net revenue per unit of activity \\(AC_{t}^{NPV} \\) (Tool A): \\[ \begin{aligned} - AC_{t}^{NPV} = &-cost\_{\text{var}}[t] \\\\ - &- \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c] + - cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) \\\\ - &+ \sum\_{c} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c] \Big) - \cdot \lambda\_{c,r,t} \\\\ - &+ \sum\_{s,c} in\\_scope[s] \cdot \Big\\{ \\\\ - &\quad \quad (\mu\_{s,c}^{\text{prod}} - cost\_{\text{prod}}[s,c]) - \cdot output\_{\text{coeff}}[c] \\\\ - &\quad \quad + (\mu\_{s,c}^{\text{cons}} - cost\_{\text{cons}}[s,c]) - \cdot input\_{\text{coeff}}[c] \\\\ - &\quad \quad + (\mu\_{s,c}^{\text{net}} - cost\_{\text{net}}[s,c]) - \cdot (output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c]) \\\\ - &\Big\\} + AC_{t}^{NPV} = &-cost\_{\text{var}}[t] \\\\ + &- \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c] + + cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) \\\\ + &+ \sum\_{c} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c] \Big) + \cdot \lambda\_{c,r,t} \\\\ + &+ \sum\_{s,c} in\\_scope[s] \cdot \Big\\{ \\\\ + &\quad \quad (\mu\_{s,c}^{\text{prod}} - cost\_{\text{prod}}[s,c]) + \cdot output\_{\text{coeff}}[c] \\\\ + &\quad \quad + (\mu\_{s,c}^{\text{cons}} - cost\_{\text{cons}}[s,c]) + \cdot input\_{\text{coeff}}[c] \\\\ + &\quad \quad + (\mu\_{s,c}^{\text{net}} - cost\_{\text{net}}[s,c]) + \cdot (output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c]) \\\\ + &\Big\\} \end{aligned} \\] From 97204d249b22d18cd4569205b1dda7cd20cb3b74 Mon Sep 17 00:00:00 2001 From: Aurash Karimi Date: Fri, 13 Feb 2026 13:00:47 +0000 Subject: [PATCH 05/23] fix indent --- docs/model/investment.md | 52 ++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/docs/model/investment.md b/docs/model/investment.md index 87f8d0d3e..7cd9077d7 100644 --- a/docs/model/investment.md +++ b/docs/model/investment.md @@ -76,18 +76,18 @@ providing investment and dynamic decommissioning decisions. \\[ \begin{aligned} AC_{t}^{NPV} = &-cost\_{\text{var}}[t] \\\\ - &- \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c] + - cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) \\\\ - &+ \sum\_{c} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c] \Big) - \cdot \lambda\_{c,r,t} \\\\ - &+ \sum\_{s,c} in\\_scope[s] \cdot \Big\\{ \\\\ - &\quad \quad (\mu\_{s,c}^{\text{prod}} - cost\_{\text{prod}}[s,c]) - \cdot output\_{\text{coeff}}[c] \\\\ - &\quad \quad + (\mu\_{s,c}^{\text{cons}} - cost\_{\text{cons}}[s,c]) - \cdot input\_{\text{coeff}}[c] \\\\ - &\quad \quad + (\mu\_{s,c}^{\text{net}} - cost\_{\text{net}}[s,c]) - \cdot (output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c]) \\\\ - &\Big\\} + &- \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c] + + cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) \\\\ + &+ \sum\_{c} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c] \Big) + \cdot \lambda\_{c,r,t} \\\\ + &+ \sum\_{s,c} in\\_scope[s] \cdot \Big\\{ \\\\ + &\quad \quad (\mu\_{s,c}^{\text{prod}} - cost\_{\text{prod}}[s,c]) + \cdot output\_{\text{coeff}}[c] \\\\ + &\quad \quad + (\mu\_{s,c}^{\text{cons}} - cost\_{\text{cons}}[s,c]) + \cdot input\_{\text{coeff}}[c] \\\\ + &\quad \quad + (\mu\_{s,c}^{\text{net}} - cost\_{\text{net}}[s,c]) + \cdot (output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c]) \\\\ + &\Big\\} \end{aligned} \\] @@ -96,19 +96,19 @@ providing investment and dynamic decommissioning decisions. \\[ \begin{aligned} AC_{t}^{LCOX} = & \quad cost\_{\text{var}}[t] \\\\ - &+ \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c]+ - cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) \\\\ - &- \sum\_{c \neq c_{primary}} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}} - [c] \Big) - \cdot \lambda\_{c,r,t} \\\\ - &+ \sum\_{s,c} in\\_scope[s] \cdot \Big\\{ \\\\ - &\quad \quad (cost\_{\text{prod}}[s,c] - \mu\_{s,c}^{\text{prod}}) - \cdot output\_{\text{coeff}}[c] \\\\ - &\quad \quad + (cost\_{\text{cons}}[s,c] - \mu\_{s,c}^{\text{cons}}) - \cdot input\_{\text{coeff}}[c] \\\\ - &\quad \quad + (cost\_{\text{net}}[s,c] - \mu\_{s,c}^{\text{net}}) - \cdot (output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c]) \\\\ - &\Big\\} + &+ \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c]+ + cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) \\\\ + &- \sum\_{c \neq c_{primary}} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}} + [c] \Big) + \cdot \lambda\_{c,r,t} \\\\ + &+ \sum\_{s,c} in\\_scope[s] \cdot \Big\\{ \\\\ + &\quad \quad (cost\_{\text{prod}}[s,c] - \mu\_{s,c}^{\text{prod}}) + \cdot output\_{\text{coeff}}[c] \\\\ + &\quad \quad + (cost\_{\text{cons}}[s,c] - \mu\_{s,c}^{\text{cons}}) + \cdot input\_{\text{coeff}}[c] \\\\ + &\quad \quad + (cost\_{\text{net}}[s,c] - \mu\_{s,c}^{\text{net}}) + \cdot (output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c]) \\\\ + &\Big\\} \end{aligned} \\] @@ -231,7 +231,7 @@ The following is an illustrative example of how the NPV and LCOX approaches work gas combined-cycle power plant as the supply option under consideration. This example demonstrates the evaluation across two time periods t1 (peak period) and t2 (off-peak period) with variable operating costs \\( cost\_{var}[t] \\) -fixed. +constant in all time periods. ### Model Parameters From 1c2cc68ee0deee5c22018354049a4e929cb962ca Mon Sep 17 00:00:00 2001 From: Aurash Karimi Date: Fri, 13 Feb 2026 13:01:48 +0000 Subject: [PATCH 06/23] fix indent --- docs/model/investment.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/model/investment.md b/docs/model/investment.md index 7cd9077d7..d85c708a9 100644 --- a/docs/model/investment.md +++ b/docs/model/investment.md @@ -95,20 +95,20 @@ providing investment and dynamic decommissioning decisions. of interest (primary output \\( c_{primary} \\)) is excluded from the price term: \\[ \begin{aligned} - AC_{t}^{LCOX} = & \quad cost\_{\text{var}}[t] \\\\ - &+ \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c]+ - cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) \\\\ - &- \sum\_{c \neq c_{primary}} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}} - [c] \Big) - \cdot \lambda\_{c,r,t} \\\\ - &+ \sum\_{s,c} in\\_scope[s] \cdot \Big\\{ \\\\ - &\quad \quad (cost\_{\text{prod}}[s,c] - \mu\_{s,c}^{\text{prod}}) - \cdot output\_{\text{coeff}}[c] \\\\ - &\quad \quad + (cost\_{\text{cons}}[s,c] - \mu\_{s,c}^{\text{cons}}) - \cdot input\_{\text{coeff}}[c] \\\\ - &\quad \quad + (cost\_{\text{net}}[s,c] - \mu\_{s,c}^{\text{net}}) - \cdot (output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c]) \\\\ - &\Big\\} + AC_{t}^{LCOX} = & \quad cost\_{\text{var}}[t] \\\\ + &+ \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c]+ + cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) \\\\ + &- \sum\_{c \neq c_{primary}} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}} + [c] \Big) + \cdot \lambda\_{c,r,t} \\\\ + &+ \sum\_{s,c} in\\_scope[s] \cdot \Big\\{ \\\\ + &\quad \quad (cost\_{\text{prod}}[s,c] - \mu\_{s,c}^{\text{prod}}) + \cdot output\_{\text{coeff}}[c] \\\\ + &\quad \quad + (cost\_{\text{cons}}[s,c] - \mu\_{s,c}^{\text{cons}}) + \cdot input\_{\text{coeff}}[c] \\\\ + &\quad \quad + (cost\_{\text{net}}[s,c] - \mu\_{s,c}^{\text{net}}) + \cdot (output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c]) \\\\ + &\Big\\} \end{aligned} \\] From 9cb3f6946e540c6f7bddf195a142261d27f1be57 Mon Sep 17 00:00:00 2001 From: Aurash Karimi Date: Fri, 13 Feb 2026 13:49:11 +0000 Subject: [PATCH 07/23] fix indent --- docs/model/investment.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/model/investment.md b/docs/model/investment.md index d85c708a9..9e2e661a4 100644 --- a/docs/model/investment.md +++ b/docs/model/investment.md @@ -75,19 +75,19 @@ providing investment and dynamic decommissioning decisions. - Calculate net revenue per unit of activity \\(AC_{t}^{NPV} \\) (Tool A): \\[ \begin{aligned} - AC_{t}^{NPV} = &-cost\_{\text{var}}[t] \\\\ - &- \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c] + - cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) \\\\ - &+ \sum\_{c} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c] \Big) - \cdot \lambda\_{c,r,t} \\\\ - &+ \sum\_{s,c} in\\_scope[s] \cdot \Big\\{ \\\\ - &\quad \quad (\mu\_{s,c}^{\text{prod}} - cost\_{\text{prod}}[s,c]) - \cdot output\_{\text{coeff}}[c] \\\\ - &\quad \quad + (\mu\_{s,c}^{\text{cons}} - cost\_{\text{cons}}[s,c]) - \cdot input\_{\text{coeff}}[c] \\\\ - &\quad \quad + (\mu\_{s,c}^{\text{net}} - cost\_{\text{net}}[s,c]) - \cdot (output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c]) \\\\ - &\Big\\} + AC_{t}^{NPV} = &-cost\_{\text{var}}[t] \\\\ + &- \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c] + + cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) \\\\ + &+ \sum\_{c} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c] \Big) + \cdot \lambda\_{c,r,t} \\\\ + &+ \sum\_{s,c} in\\_scope[s] \cdot \Big\\{ \\\\ + &\quad \quad (\mu\_{s,c}^{\text{prod}} - cost\_{\text{prod}}[s,c]) + \cdot output\_{\text{coeff}}[c] \\\\ + &\quad \quad + (\mu\_{s,c}^{\text{cons}} - cost\_{\text{cons}}[s,c]) + \cdot input\_{\text{coeff}}[c] \\\\ + &\quad \quad + (\mu\_{s,c}^{\text{net}} - cost\_{\text{net}}[s,c]) + \cdot (output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c]) \\\\ + &\Big\\} \end{aligned} \\] From 63f682f534c5b29f0c055ca7499187a1bd4112ab Mon Sep 17 00:00:00 2001 From: Aurash Karimi Date: Fri, 13 Feb 2026 13:52:58 +0000 Subject: [PATCH 08/23] fix equation indent --- docs/model/investment.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/model/investment.md b/docs/model/investment.md index 9e2e661a4..6e2f6c4ce 100644 --- a/docs/model/investment.md +++ b/docs/model/investment.md @@ -95,20 +95,20 @@ providing investment and dynamic decommissioning decisions. of interest (primary output \\( c_{primary} \\)) is excluded from the price term: \\[ \begin{aligned} - AC_{t}^{LCOX} = & \quad cost\_{\text{var}}[t] \\\\ - &+ \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c]+ - cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) \\\\ - &- \sum\_{c \neq c_{primary}} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}} - [c] \Big) - \cdot \lambda\_{c,r,t} \\\\ - &+ \sum\_{s,c} in\\_scope[s] \cdot \Big\\{ \\\\ - &\quad \quad (cost\_{\text{prod}}[s,c] - \mu\_{s,c}^{\text{prod}}) - \cdot output\_{\text{coeff}}[c] \\\\ - &\quad \quad + (cost\_{\text{cons}}[s,c] - \mu\_{s,c}^{\text{cons}}) - \cdot input\_{\text{coeff}}[c] \\\\ - &\quad \quad + (cost\_{\text{net}}[s,c] - \mu\_{s,c}^{\text{net}}) - \cdot (output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c]) \\\\ - &\Big\\} + AC_{t}^{LCOX} = & \quad cost\_{\text{var}}[t] \\\\ + &+ \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c]+ + cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) \\\\ + &- \sum\_{c \neq c_{primary}} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}} + [c] \Big) + \cdot \lambda\_{c,r,t} \\\\ + &+ \sum\_{s,c} in\\_scope[s] \cdot \Big\\{ \\\\ + &\quad \quad (cost\_{\text{prod}}[s,c] - \mu\_{s,c}^{\text{prod}}) + \cdot output\_{\text{coeff}}[c] \\\\ + &\quad \quad + (cost\_{\text{cons}}[s,c] - \mu\_{s,c}^{\text{cons}}) + \cdot input\_{\text{coeff}}[c] \\\\ + &\quad \quad + (cost\_{\text{net}}[s,c] - \mu\_{s,c}^{\text{net}}) + \cdot (output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c]) \\\\ + &\Big\\} \end{aligned} \\] From 9345a93532e41a5785d2e10c0d24bfacfdcff844 Mon Sep 17 00:00:00 2001 From: Aurash Karimi Date: Fri, 13 Feb 2026 16:23:33 +0000 Subject: [PATCH 09/23] add npv metrics and deadlock details to docs --- docs/model/investment.md | 48 +++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/docs/model/investment.md b/docs/model/investment.md index 6e2f6c4ce..9fb3db0c9 100644 --- a/docs/model/investment.md +++ b/docs/model/investment.md @@ -80,14 +80,6 @@ providing investment and dynamic decommissioning decisions. cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) \\\\ &+ \sum\_{c} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c] \Big) \cdot \lambda\_{c,r,t} \\\\ - &+ \sum\_{s,c} in\\_scope[s] \cdot \Big\\{ \\\\ - &\quad \quad (\mu\_{s,c}^{\text{prod}} - cost\_{\text{prod}}[s,c]) - \cdot output\_{\text{coeff}}[c] \\\\ - &\quad \quad + (\mu\_{s,c}^{\text{cons}} - cost\_{\text{cons}}[s,c]) - \cdot input\_{\text{coeff}}[c] \\\\ - &\quad \quad + (\mu\_{s,c}^{\text{net}} - cost\_{\text{net}}[s,c]) - \cdot (output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c]) \\\\ - &\Big\\} \end{aligned} \\] @@ -101,19 +93,9 @@ providing investment and dynamic decommissioning decisions. &- \sum\_{c \neq c_{primary}} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}} [c] \Big) \cdot \lambda\_{c,r,t} \\\\ - &+ \sum\_{s,c} in\\_scope[s] \cdot \Big\\{ \\\\ - &\quad \quad (cost\_{\text{prod}}[s,c] - \mu\_{s,c}^{\text{prod}}) - \cdot output\_{\text{coeff}}[c] \\\\ - &\quad \quad + (cost\_{\text{cons}}[s,c] - \mu\_{s,c}^{\text{cons}}) - \cdot input\_{\text{coeff}}[c] \\\\ - &\quad \quad + (cost\_{\text{net}}[s,c] - \mu\_{s,c}^{\text{net}}) - \cdot (output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c]) \\\\ - &\Big\\} \end{aligned} \\] - > Note: "scopes" are not implemented in the current model. - ### Initialise demand profiles for commodity of interest - Initialise \\( D[c,t] \\) from the MSY dispatch run output \\( U_c \\). @@ -175,13 +157,33 @@ operational constraints (e.g., minimum load levels) and the balance level of the - Capacity is constrained to \\( CapMaxBuild \\) for candidates, and to known capacity for existing assets. -- **Calculate a profitability index:** This is the total annualised surplus divided by the - annualised fixed cost. +- **Decide on metric:** The type of metric used to compare profitability is dependent on the value of +\\(\text{AFC}\\). If \\(\text{AFC} = 0\\), this is always preferred over options with +\\(\text{AFC} > 0\\) so the latter are discarded as investment options. + +- **If \\(\text{AFC} > 0\\), Use the profitability index \\(\text{PI}\\) metric:** This is the total + annualised surplus divided by the annualised fixed cost. \\[ - \text{Profitability Index} = + \text{PI} = \frac{\sum_t \text{act}_t \cdot \text{AC}_t^{\text{NPV}}}{\text{AFC} \cdot \text{cap}} \\] +- **If \\(\text{AFC} = 0\\), Use the total annualised surplus metric \\(\text{TAS}\\):** + \\[ + \text{TAS} = + \sum_t \text{act}_t \cdot \text{AC}_t^{\text{NPV}} + \\] + +- **Metric deadlock fallback** If two or more investment options have equal metrics, the following + tie-breaking rules are applied in order: + + 1. Assets which are already commissioned are preferred over new candidate assets. + + 2. Newer (commissioned later) assets are preferred over older assets. + + 3. If there is still a tie, the first option in the data structure is selected, + which is non-deterministic. A warning is emitted when this occurs. + #### Tool B: LCOX This method is used when decision rule is single objective and objective is LCOX for agents' serving @@ -314,7 +316,7 @@ load requirements. The profitability index is calculated as: \\[ -\text{Profitability Index} = \frac{\sum_t act_t \cdot AC_t^{NPV}}{AFC \times cap} +\text{PI} = \frac{\sum_t act_t \cdot AC_t^{NPV}}{AFC \times cap} \\] Suppose the dispatch optimiser determines \\( act_{t1} = 80 \\) MWh and \\( act_{t2} = 20 \\) MWh are @@ -322,7 +324,7 @@ the optimal activity levels: \\[ \begin{aligned} -\text{Profitability Index} &= \frac{(80 \times 10) + (20 \times (-10))}{1{,}000 \times 100} \\\\ +\text{PI} &= \frac{(80 \times 10) + (20 \times (-10))}{1{,}000 \times 100} \\\\ &= \frac{800 - 200}{100{,}000} \\\\ &= \frac{600}{100{,}000} \\\\ &= 0.006 From e7b4d2e26955de21f8878e62587e7b9aca67def9 Mon Sep 17 00:00:00 2001 From: Aurash Karimi Date: Fri, 13 Feb 2026 16:37:16 +0000 Subject: [PATCH 10/23] improve typesetting --- docs/model/investment.md | 47 ++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/docs/model/investment.md b/docs/model/investment.md index 9fb3db0c9..3ba4ae6e3 100644 --- a/docs/model/investment.md +++ b/docs/model/investment.md @@ -197,12 +197,12 @@ commodities are set to zero, and the commodity of interest is assumed to have ze For each asset option: - **Optimise capacity and dispatch to minimise annualised cost:** Solve a small optimisation - sub-problem to maximise the asset's surplus, subject to its operational rules and the specific + sub-problem to minimise the asset's annualised cost, subject to its operational rules and the specific demand tranche it is being asked to serve. \\[ minimise \Big\\{ - AF \times cap + \sum_t act_t \times AC_{t}^{LCOX} + VoLL \times UnmetD_t + \text{AFC} \times cap + \sum_t act_t \times AC_{t}^{LCOX} + VoLL \times UnmetD_t \Big\\} \\] @@ -232,8 +232,8 @@ For each asset option: The following is an illustrative example of how the NPV and LCOX approaches work, using a simple gas combined-cycle power plant as the supply option under consideration. This example demonstrates the evaluation across two time periods -t1 (peak period) and t2 (off-peak period) with variable operating costs \\( cost\_{var}[t] \\) -constant in all time periods. +\\(t_0\\) (peak period) and \\(t_1\\) (off-peak period) with variable operating costs + \\( cost\_{var}[t] \\) constant in all time periods. ### Model Parameters @@ -256,7 +256,7 @@ constant in all time periods. #### Market Prices by Time Period -| Commodity | Notation | t1 (Peak) | t2 (Off-peak) | +| Commodity | Notation | \\(t_0\\) (Peak) | \\(t_1\\) (Off-peak) | |-----------|----------|-----------|---------------| | Electricity | \\( \lambda\_{c_{elec},r,t} \\) | £90/MWh | £50/MWh | | Heat | \\( \lambda\_{c_{heat},r,t} \\) | £25/MWh | £15/MWh | @@ -269,14 +269,15 @@ constant in all time periods. The net revenue calculation follows the general form: \\[ -AC_t^{NPV} = \sum_{c} \Big( output\_{coeff}[c] - input\_{coeff}[c] \Big) \cdot \lambda_{c,r,t} - cost\_{var}[t] +AC_t^{NPV} = \sum_{c} \Big( output\_{coeff}[c] - input\_{coeff}[c] \Big) +\cdot \lambda_{c,r,t} - cost\_{var}[t] \\] -**For t1 (peak period):** +**For \\(t_0\\) (peak period):** \\[ \begin{aligned} -AC_{t1}^{NPV} &= (1.0 \times 90) + (0.5 \times 25) + (-2.5 \times 35) - 5 \\\\ +AC_{t_{0}}^{NPV} &= (1.0 \times 90) + (0.5 \times 25) + (-2.5 \times 35) - 5 \\\\ &= 90 + 12.5 - 87.5 - 5 \\\\ &= \text{£10/MWh} \end{aligned} @@ -284,11 +285,11 @@ AC_{t1}^{NPV} &= (1.0 \times 90) + (0.5 \times 25) + (-2.5 \times 35) - 5 \\\\ The asset earns £10 profit for every MWh it operates during peak periods. -**For t2 (off-peak period):** +**For \\(t_1\\) (off-peak period):** \\[ \begin{aligned} -AC_{t2}^{NPV} &= (1.0 \times 50) + (0.5 \times 15) + (-2.5 \times 25) - 5 \\\\ +AC_{t_1}^{NPV} &= (1.0 \times 50) + (0.5 \times 15) + (-2.5 \times 25) - 5 \\\\ &= 50 + 7.5 - 62.5 - 5 \\\\ &= \text{£} -10 \text{/MWh} \end{aligned} @@ -301,14 +302,14 @@ The asset loses £10 for every MWh it operates during off-peak periods. The optimisation maximises total net revenue across all time periods: \\[ -\max \sum_t act_t \cdot AC_t^{NPV} = act_{t1} \cdot 10 + act_{t2} \cdot (-10) +\max \sum_t act_t \cdot AC_t^{NPV} = act_{t_{0}} \cdot 10 + act_{t_1} \cdot (-10) \\] where \\( act_t \\) is the activity (operational level) in each time slice, subject to operational constraints and demand requirements. -In this case, the optimiser will prefer to dispatch the asset during t1 (profitable) and - minimise operation during t2 (unprofitable), subject to technical constraints such as minimum +In this case, the optimiser will prefer to dispatch the asset during \\(t_0\\) (profitable) and + minimise operation during \\(t_1\\) (unprofitable), subject to technical constraints such as minimum load requirements. #### Profitability Index @@ -319,8 +320,8 @@ The profitability index is calculated as: \text{PI} = \frac{\sum_t act_t \cdot AC_t^{NPV}}{AFC \times cap} \\] -Suppose the dispatch optimiser determines \\( act_{t1} = 80 \\) MWh and \\( act_{t2} = 20 \\) MWh are -the optimal activity levels: +Suppose the dispatch optimiser determines \\( act_{t_{0}} = 80 \\) MWh and \\( act_{t_1} = 20 \\) +MWh are the optimal activity levels: \\[ \begin{aligned} @@ -345,11 +346,11 @@ AC_t^{LCOX} = cost\_{var}[t] + \sum_{c \neq c_{primary}} \Big( input\_{coeff}[c] output\_{coeff}[c] \Big) \cdot \lambda_{c,r,t} \\] -**For t1 (peak period):** +**For \\(t_0\\) (peak period):** \\[ \begin{aligned} -AC_{t1}^{LCOX} &= 5 + (2.5 \times 35) - (0.5 \times 25) \\\\ +AC_{t_{0}}^{LCOX} &= 5 + (2.5 \times 35) - (0.5 \times 25) \\\\ &= 5 + 87.5 - 12.5 \\\\ &= \text{£80/MWh} \end{aligned} @@ -357,11 +358,11 @@ AC_{t1}^{LCOX} &= 5 + (2.5 \times 35) - (0.5 \times 25) \\\\ It costs £80 per MWh to operate during peak periods (net of heat by-product sales). -**For t2 (off-peak period):** +**For \\(t_1\\) (off-peak period):** \\[ \begin{aligned} -AC_{t2}^{LCOX} &= 5 + (2.5 \times 25) - (0.5 \times 15) \\\\ +AC_{t_1}^{LCOX} &= 5 + (2.5 \times 25) - (0.5 \times 15) \\\\ &= 5 + 62.5 - 7.5 \\\\ &= \text{£60/MWh} \end{aligned} @@ -377,8 +378,8 @@ The optimiser determines the most cost-effective capacity and dispatch pattern t \\( cap \\) and \\( act_t \\): \\[ -AFC \cdot cap + \sum_t act_t \cdot AC_t^{LCOX} = 1{,}000 \cdot cap + act_{t1} - \cdot 80 + act_{t2} \cdot 60 +AFC \cdot cap + \sum_t act_t \cdot AC_t^{LCOX} = 1{,}000 \cdot cap + act_{t_{0}} + \cdot 80 + act_{t_1} \cdot 60 \\] #### Cost Index (Levelised Cost of X) @@ -389,8 +390,8 @@ The cost index is calculated as: \text{cost index} = \frac{AFC \cdot cap + \sum_t act_t \cdot AC_t^{LCOX}}{\sum_t act_t} \\] -Suppose the optimiser determines \\( cap = 100 \\) MW, \\( act_{t1} = 150 \\) MWh, - and \\( act_{t2} = 80 \\) MWh are the optimal capacity and activity levels: +Suppose the optimiser determines \\( cap = 100 \\) MW, \\( act_{t_{0}} = 150 \\) MWh, + and \\( act_{t_1} = 80 \\) MWh are the optimal capacity and activity levels: \\[ \begin{aligned} From 046b16f4e95460eea4418d2dfdb1fa2660e31481 Mon Sep 17 00:00:00 2001 From: Aurash Karimi Date: Fri, 13 Feb 2026 16:41:14 +0000 Subject: [PATCH 11/23] pretty table --- docs/model/investment.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/model/investment.md b/docs/model/investment.md index 3ba4ae6e3..9e08105b0 100644 --- a/docs/model/investment.md +++ b/docs/model/investment.md @@ -239,28 +239,28 @@ This example demonstrates the evaluation across two time periods #### Asset Parameters -| Parameter | Notation | Value | Description | -|-----------|----------|-------|-------------| -| Primary output (Electricity) | \\( output\_{coeff}[c_{primary}] \\) | 1.0 MWh per unit activity | Main commodity produced | -| By-product output (Waste heat) | \\( output\_{coeff}[c_{heat}] \\) | 0.5 MWh per unit activity | Co-product from generation | -| Input (Natural gas) | \\( input\_{coeff}[c_{gas}] \\) | 2.5 MWh per unit activity | Fuel consumption | -| Variable operating cost | \\( cost\_{var}[t] \\) | £5/MWh of activity | Operating costs per unit activity | +| Parameter | Notation | Value | Description | +|--------------------------------|--------------------------------------|---------------------------|-----------------------------------| +| Primary output (Electricity) | \\( output\_{coeff}[c_{primary}] \\) | 1.0 MWh per unit activity | Main commodity produced | +| By-product output (Waste heat) | \\( output\_{coeff}[c_{heat}] \\) | 0.5 MWh per unit activity | Co-product from generation | +| Input (Natural gas) | \\( input\_{coeff}[c_{gas}] \\) | 2.5 MWh per unit activity | Fuel consumption | +| Variable operating cost | \\( cost\_{var}[t] \\) | £5/MWh of activity | Operating costs per unit activity | #### Investment Parameters -| Parameter | Notation | Value | -|-----------|----------|-------| +| Parameter | Notation | Value | +|-----------------------|----------------------|-----------| | Annualised fixed cost | \\( AFC\_{opt,r} \\) | £1,000/MW | -| Capacity | \\( cap \\) | 100 MW | +| Capacity | \\( cap \\) | 100 MW | #### Market Prices by Time Period -| Commodity | Notation | \\(t_0\\) (Peak) | \\(t_1\\) (Off-peak) | -|-----------|----------|-----------|---------------| -| Electricity | \\( \lambda\_{c_{elec},r,t} \\) | £90/MWh | £50/MWh | -| Heat | \\( \lambda\_{c_{heat},r,t} \\) | £25/MWh | £15/MWh | -| Natural gas | \\( \lambda\_{c_{gas},r,t} \\) | £35/MWh | £25/MWh | +| Commodity | Notation | \\(t_0\\) (Peak) | \\(t_1\\) (Off-peak) | +|-------------|---------------------------------|------------------|----------------------| +| Electricity | \\( \lambda\_{c_{elec},r,t} \\) | £90/MWh | £50/MWh | +| Heat | \\( \lambda\_{c_{heat},r,t} \\) | £25/MWh | £15/MWh | +| Natural gas | \\( \lambda\_{c_{gas},r,t} \\) | £35/MWh | £25/MWh | ### NPV Approach (Tool A) From 1656187135381b4e70732e0d3c9528036a48cb58 Mon Sep 17 00:00:00 2001 From: Aurash Karimi Date: Fri, 13 Feb 2026 16:41:34 +0000 Subject: [PATCH 12/23] pretty table --- docs/model/investment.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/model/investment.md b/docs/model/investment.md index 9e08105b0..3ba4ae6e3 100644 --- a/docs/model/investment.md +++ b/docs/model/investment.md @@ -239,28 +239,28 @@ This example demonstrates the evaluation across two time periods #### Asset Parameters -| Parameter | Notation | Value | Description | -|--------------------------------|--------------------------------------|---------------------------|-----------------------------------| -| Primary output (Electricity) | \\( output\_{coeff}[c_{primary}] \\) | 1.0 MWh per unit activity | Main commodity produced | -| By-product output (Waste heat) | \\( output\_{coeff}[c_{heat}] \\) | 0.5 MWh per unit activity | Co-product from generation | -| Input (Natural gas) | \\( input\_{coeff}[c_{gas}] \\) | 2.5 MWh per unit activity | Fuel consumption | -| Variable operating cost | \\( cost\_{var}[t] \\) | £5/MWh of activity | Operating costs per unit activity | +| Parameter | Notation | Value | Description | +|-----------|----------|-------|-------------| +| Primary output (Electricity) | \\( output\_{coeff}[c_{primary}] \\) | 1.0 MWh per unit activity | Main commodity produced | +| By-product output (Waste heat) | \\( output\_{coeff}[c_{heat}] \\) | 0.5 MWh per unit activity | Co-product from generation | +| Input (Natural gas) | \\( input\_{coeff}[c_{gas}] \\) | 2.5 MWh per unit activity | Fuel consumption | +| Variable operating cost | \\( cost\_{var}[t] \\) | £5/MWh of activity | Operating costs per unit activity | #### Investment Parameters -| Parameter | Notation | Value | -|-----------------------|----------------------|-----------| +| Parameter | Notation | Value | +|-----------|----------|-------| | Annualised fixed cost | \\( AFC\_{opt,r} \\) | £1,000/MW | -| Capacity | \\( cap \\) | 100 MW | +| Capacity | \\( cap \\) | 100 MW | #### Market Prices by Time Period -| Commodity | Notation | \\(t_0\\) (Peak) | \\(t_1\\) (Off-peak) | -|-------------|---------------------------------|------------------|----------------------| -| Electricity | \\( \lambda\_{c_{elec},r,t} \\) | £90/MWh | £50/MWh | -| Heat | \\( \lambda\_{c_{heat},r,t} \\) | £25/MWh | £15/MWh | -| Natural gas | \\( \lambda\_{c_{gas},r,t} \\) | £35/MWh | £25/MWh | +| Commodity | Notation | \\(t_0\\) (Peak) | \\(t_1\\) (Off-peak) | +|-----------|----------|-----------|---------------| +| Electricity | \\( \lambda\_{c_{elec},r,t} \\) | £90/MWh | £50/MWh | +| Heat | \\( \lambda\_{c_{heat},r,t} \\) | £25/MWh | £15/MWh | +| Natural gas | \\( \lambda\_{c_{gas},r,t} \\) | £35/MWh | £25/MWh | ### NPV Approach (Tool A) From d4f7cd373dbaf6c3db6c199b0b8c665469a613b2 Mon Sep 17 00:00:00 2001 From: Aurash Karimi Date: Mon, 16 Feb 2026 10:55:56 +0000 Subject: [PATCH 13/23] simplify doc --- docs/model/investment.md | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/docs/model/investment.md b/docs/model/investment.md index 3ba4ae6e3..378b7cb7d 100644 --- a/docs/model/investment.md +++ b/docs/model/investment.md @@ -258,7 +258,7 @@ This example demonstrates the evaluation across two time periods | Commodity | Notation | \\(t_0\\) (Peak) | \\(t_1\\) (Off-peak) | |-----------|----------|-----------|---------------| -| Electricity | \\( \lambda\_{c_{elec},r,t} \\) | £90/MWh | £50/MWh | +| Electricity | \\( \lambda\_{c_{primary},r,t} \\) | £90/MWh | £50/MWh | | Heat | \\( \lambda\_{c_{heat},r,t} \\) | £25/MWh | £15/MWh | | Natural gas | \\( \lambda\_{c_{gas},r,t} \\) | £35/MWh | £25/MWh | @@ -266,13 +266,6 @@ This example demonstrates the evaluation across two time periods #### Calculate Net Revenue per Unit of Activity -The net revenue calculation follows the general form: - -\\[ -AC_t^{NPV} = \sum_{c} \Big( output\_{coeff}[c] - input\_{coeff}[c] \Big) -\cdot \lambda_{c,r,t} - cost\_{var}[t] -\\] - **For \\(t_0\\) (peak period):** \\[ @@ -339,13 +332,6 @@ The profitability index is then compared against all other options to determine #### Net Cost per Unit of Activity -The net cost excludes the primary output (electricity) and is calculated as: - -\\[ -AC_t^{LCOX} = cost\_{var}[t] + \sum_{c \neq c_{primary}} \Big( input\_{coeff}[c] - - output\_{coeff}[c] \Big) \cdot \lambda_{c,r,t} -\\] - **For \\(t_0\\) (peak period):** \\[ From d2116c1e03a0ccf0042a78968a353d134cefe038 Mon Sep 17 00:00:00 2001 From: Aurash Karimi Date: Mon, 16 Feb 2026 12:12:46 +0000 Subject: [PATCH 14/23] make capitalisation consistent --- docs/model/investment.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/model/investment.md b/docs/model/investment.md index 378b7cb7d..2275c833c 100644 --- a/docs/model/investment.md +++ b/docs/model/investment.md @@ -221,7 +221,7 @@ For each asset option: - VoLL variables are active to ensure a feasible solution alongside maximum operation of the asset. -- **Calculate a cost index:** This is the total annualised cost divided by the annual output. +- **Calculate a Cost Index:** This is the total annualised cost divided by the annual output. \\[ \text{Cost Index} = \frac{\text{AFC} \times \text{cap}_r + \sum_t \text{act}_t \times \text{AC}_t^{\text{LCOX}}}{\sum_t \text{act}_t} @@ -370,10 +370,10 @@ AFC \cdot cap + \sum_t act_t \cdot AC_t^{LCOX} = 1{,}000 \cdot cap + act_{t_{0}} #### Cost Index (Levelised Cost of X) -The cost index is calculated as: +The Cost Index is calculated as: \\[ -\text{cost index} = \frac{AFC \cdot cap + \sum_t act_t \cdot AC_t^{LCOX}}{\sum_t act_t} +\text{Cost Index} = \frac{AFC \cdot cap + \sum_t act_t \cdot AC_t^{LCOX}}{\sum_t act_t} \\] Suppose the optimiser determines \\( cap = 100 \\) MW, \\( act_{t_{0}} = 150 \\) MWh, @@ -381,14 +381,14 @@ Suppose the optimiser determines \\( cap = 100 \\) MW, \\( act_{t_{0}} = 150 \\) \\[ \begin{aligned} -\text{cost index} &= \frac{(1{,}000 \times 100) + (150 \times 80) + (80 \times 60)}{150 + 80} \\\\ +\text{Cost Index} &= \frac{(1{,}000 \times 100) + (150 \times 80) + (80 \times 60)}{150 + 80} \\\\ &= \frac{100{,}000 + 12{,}000 + 4{,}800}{230} \\\\ &= \frac{116{,}800}{230} \\\\ &= \text{£508/MWh} \end{aligned} \\] -The cost index is £508 per MWh of electricity produced. +The Cost Index is £508 per MWh of electricity produced. This metric is compared across all supply options to identify the lowest-cost solution for meeting demand. From e2c0d1bbd991d2761a8c84ddb1dfcd22d19dfd48 Mon Sep 17 00:00:00 2001 From: Aurash Karimi Date: Tue, 3 Mar 2026 10:58:02 +0000 Subject: [PATCH 15/23] cut out part of doc no longer relevant remove /text{act} for consistency --- docs/model/investment.md | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/docs/model/investment.md b/docs/model/investment.md index 2275c833c..23573c3e3 100644 --- a/docs/model/investment.md +++ b/docs/model/investment.md @@ -41,12 +41,6 @@ investments. - \\( \text{FOM}_{opt,r} \\): Annual fixed Operations & Maintenance costs per unit of capacity for \\( opt \\) in \\( r \\). - - \\( FinancingInDecomDec_{ex} \\) (binary flag). This user-defined option specifies whether to - include estimated financing costs in the economic viability threshold when considering the - decommissioning of an existing asset. This can only be used on profit-evaluable assets. Used - with \\( PercentDebt_{ex} \\). Where financing costs are included, the percentage debt is - multiplied by the original capex, and the result is annualised. - - For new candidate assets: - \\( \text{CAPEX}_{ca,r} \\): Upfront capital expenditure required per unit of new capacity for @@ -165,13 +159,13 @@ operational constraints (e.g., minimum load levels) and the balance level of the annualised surplus divided by the annualised fixed cost. \\[ \text{PI} = - \frac{\sum_t \text{act}_t \cdot \text{AC}_t^{\text{NPV}}}{\text{AFC} \cdot \text{cap}} + \frac{\sum_t act_t \cdot \text{AC}_t^{\text{NPV}}}{\text{AFC} \cdot \text{cap}} \\] - **If \\(\text{AFC} = 0\\), Use the total annualised surplus metric \\(\text{TAS}\\):** \\[ \text{TAS} = - \sum_t \text{act}_t \cdot \text{AC}_t^{\text{NPV}} + \sum_t act_t \cdot \text{AC}_t^{\text{NPV}} \\] - **Metric deadlock fallback** If two or more investment options have equal metrics, the following @@ -223,8 +217,8 @@ For each asset option: - **Calculate a Cost Index:** This is the total annualised cost divided by the annual output. \\[ - \text{Cost Index} = \frac{\text{AFC} \times \text{cap}_r + \sum_t \text{act}_t - \times \text{AC}_t^{\text{LCOX}}}{\sum_t \text{act}_t} + \text{Cost Index} = \frac{\text{AFC} \times \text{cap}_r + \sum_t act_t + \times \text{AC}_t^{\text{LCOX}}}{\sum_t act_t} \\] ## Example: Gas Power Plant @@ -247,6 +241,9 @@ This example demonstrates the evaluation across two time periods | Variable operating cost | \\( cost\_{var}[t] \\) | £5/MWh of activity | Operating costs per unit activity | +All per-flow costs associated represented in the general formulas as \\( cost\_{input} \\) and +\\( cost\_{output} \\) are assumed to be zero. + #### Investment Parameters | Parameter | Notation | Value | From 5601da0a9e7d78e44381d83e3b5d8459e259d33e Mon Sep 17 00:00:00 2001 From: Aurash Karimi Date: Tue, 3 Mar 2026 12:04:48 +0000 Subject: [PATCH 16/23] seperate metric fallback for both tools --- docs/model/investment.md | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/docs/model/investment.md b/docs/model/investment.md index 23573c3e3..c7dfb13a6 100644 --- a/docs/model/investment.md +++ b/docs/model/investment.md @@ -148,7 +148,7 @@ operational constraints (e.g., minimum load levels) and the balance level of the - A demand constraint, where output cannot exceed demand in the tranche, which adapts based on the commodity's balance level (time slice, season, annual). - - Capacity is constrained to \\( CapMaxBuild \\) for candidates, and to known capacity for + - Capacity is constrained up to \\( CapMaxBuild \\) for candidates, and to known capacity for existing assets. - **Decide on metric:** The type of metric used to compare profitability is dependent on the value of @@ -168,16 +168,6 @@ operational constraints (e.g., minimum load levels) and the balance level of the \sum_t act_t \cdot \text{AC}_t^{\text{NPV}} \\] -- **Metric deadlock fallback** If two or more investment options have equal metrics, the following - tie-breaking rules are applied in order: - - 1. Assets which are already commissioned are preferred over new candidate assets. - - 2. Newer (commissioned later) assets are preferred over older assets. - - 3. If there is still a tie, the first option in the data structure is selected, - which is non-deterministic. A warning is emitted when this occurs. - #### Tool B: LCOX This method is used when decision rule is single objective and objective is LCOX for agents' serving @@ -209,18 +199,30 @@ For each asset option: each timeslice of the tranche, which adapts based on the commodity's balance level (time slice, season, annual). - - Capacity is constrained to \\( CapMaxBuild \\) for candidates, and to known capacity for + - Capacity is constrained up to \\( CapMaxBuild \\) for candidates, and to known capacity for existing assets. - VoLL variables are active to ensure a feasible solution alongside maximum operation of the asset. -- **Calculate a Cost Index:** This is the total annualised cost divided by the annual output. +- **Calculate a Cost Index Metric:** This is the total annualised cost divided by the annual output. \\[ \text{Cost Index} = \frac{\text{AFC} \times \text{cap}_r + \sum_t act_t \times \text{AC}_t^{\text{LCOX}}}{\sum_t act_t} \\] +#### Equal-Metric Fallback + +If two or more investment options from the same tool have equal metrics, the following tie-breaking +rules are applied in order: + +1. Assets which are already commissioned are preferred over new candidate assets. + +2. Newer (commissioned later) assets are preferred over older assets. + +3. If there is still a tie, the first option in the data structure storing the metrics is selected, + which is non-deterministic. A warning is emitted when this occurs. + ## Example: Gas Power Plant The following is an illustrative example of how the NPV and LCOX approaches work, using a simple From 8ee0ca46e15b9ef9939944949a2894ea26460fa5 Mon Sep 17 00:00:00 2001 From: Aurash Karimi Date: Tue, 3 Mar 2026 14:50:24 +0000 Subject: [PATCH 17/23] break down activity coefficients explainer --- docs/model/investment.md | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/docs/model/investment.md b/docs/model/investment.md index e3b0f4d22..67f8aa591 100644 --- a/docs/model/investment.md +++ b/docs/model/investment.md @@ -66,12 +66,20 @@ providing investment and dynamic decommissioning decisions. - Annualised fixed costs per unit of capacity (\\( AFC_{opt,r} \\)): For new candidates, this is their annualised CAPEX plus FOM. For existing assets, the relevant fixed cost is its FOM. +- Calculate the specific process and commodity flow costs: + + \\[ + \text{SPCF} = \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c] + + cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) + \\] + +#### Coefficients of activity + - Calculate net revenue per unit of activity \\(AC_{t}^{NPV} \\) (Tool A): \\[ \begin{aligned} AC_{t}^{NPV} = &-cost\_{\text{var}}[t] \\\\ - &- \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c] + - cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) \\\\ + &- \text{SPCF} \\\\ &+ \sum\_{c} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c] \Big) \cdot \lambda\_{c,r,t} \\\\ \end{aligned} @@ -82,14 +90,18 @@ providing investment and dynamic decommissioning decisions. \\[ \begin{aligned} AC_{t}^{LCOX} = & \quad cost\_{\text{var}}[t] \\\\ - &+ \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c]+ - cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) \\\\ + &+ \text{SPCF} \\\\ &- \sum\_{c \neq c_{primary}} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}} [c] \Big) \cdot \lambda\_{c,r,t} \\\\ \end{aligned} \\] +- The third term in both activity coefficients accounts for commodity price flow costs, which are + the net costs or revenues associated with the commodity flows. In the LCOX case the commodity of +interest is excluded from this term because the cost of production shouldn't depend on the market +price of the commodity being produced. + ### Initialise demand profiles for commodity of interest - Initialise \\( D[c,t] \\) from the MSY dispatch run output \\( U_c \\). @@ -236,7 +248,7 @@ This example demonstrates the evaluation across two time periods #### Asset Parameters | Parameter | Notation | Value | Description | -|-----------|----------|-------|-------------| +| ----------- | ---------- | ------- | ------------- | | Primary output (Electricity) | \\( output\_{coeff}[c_{primary}] \\) | 1.0 MWh per unit activity | Main commodity produced | | By-product output (Waste heat) | \\( output\_{coeff}[c_{heat}] \\) | 0.5 MWh per unit activity | Co-product from generation | | Input (Natural gas) | \\( input\_{coeff}[c_{gas}] \\) | 2.5 MWh per unit activity | Fuel consumption | @@ -249,14 +261,14 @@ All per-flow costs associated represented in the general formulas as \\( cost\_{ #### Investment Parameters | Parameter | Notation | Value | -|-----------|----------|-------| +| ----------- | ---------- | ------- | | Annualised fixed cost | \\( AFC\_{opt,r} \\) | £1,000/MW | | Capacity | \\( cap \\) | 100 MW | #### Market Prices by Time Period | Commodity | Notation | \\(t_0\\) (Peak) | \\(t_1\\) (Off-peak) | -|-----------|----------|-----------|---------------| +| ----------- | ---------- | ----------- | --------------- | | Electricity | \\( \lambda\_{c_{primary},r,t} \\) | £90/MWh | £50/MWh | | Heat | \\( \lambda\_{c_{heat},r,t} \\) | £25/MWh | £15/MWh | | Natural gas | \\( \lambda\_{c_{gas},r,t} \\) | £35/MWh | £25/MWh | From 6ac775f1156ca11aa628377b8973a436b10b2e61 Mon Sep 17 00:00:00 2001 From: Aurashk Date: Wed, 4 Mar 2026 10:19:42 +0000 Subject: [PATCH 18/23] escape underscores Co-authored-by: Alex Dewar Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- docs/model/investment.md | 74 +++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 38 deletions(-) diff --git a/docs/model/investment.md b/docs/model/investment.md index 67f8aa591..8ccb16ef8 100644 --- a/docs/model/investment.md +++ b/docs/model/investment.md @@ -66,7 +66,7 @@ providing investment and dynamic decommissioning decisions. - Annualised fixed costs per unit of capacity (\\( AFC_{opt,r} \\)): For new candidates, this is their annualised CAPEX plus FOM. For existing assets, the relevant fixed cost is its FOM. -- Calculate the specific process and commodity flow costs: +- Calculate the specific process and commodity flow costs (SPCF): \\[ \text{SPCF} = \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c] + @@ -98,9 +98,9 @@ providing investment and dynamic decommissioning decisions. \\] - The third term in both activity coefficients accounts for commodity price flow costs, which are - the net costs or revenues associated with the commodity flows. In the LCOX case the commodity of -interest is excluded from this term because the cost of production shouldn't depend on the market -price of the commodity being produced. + the net costs or revenues associated with the commodity flows. In the LCOX case the commodity of + interest is excluded from this term because the cost of production shouldn't depend on the market + price of the commodity being produced. ### Initialise demand profiles for commodity of interest @@ -144,11 +144,11 @@ operational constraints (e.g., minimum load levels) and the balance level of the - **Optimise capacity and dispatch to maximise annualised profit:** Solve a small optimisation sub-problem to maximise the asset's surplus, subject to its operational rules and the specific - demand tranche it is being asked to serve. \\(\varepsilon \approx 1×10^{-14}\\) is added to each + demand tranche it is being asked to serve. \\(\varepsilon \approx 1\times 10^{-14}\\) is added to each \\(AC_{t}^{NPV} \\) to allow assets which are breakeven (or very close to breakeven) to be dispatched. \\[ - maximise \Big\\{\sum_t act_t (AC_{t}^{NPV} + \varepsilon) + maximise \Big\\{\sum_t act_t (AC\_{t}^{NPV} + \varepsilon) \Big\\} \\] @@ -164,20 +164,20 @@ operational constraints (e.g., minimum load levels) and the balance level of the existing assets. - **Decide on metric:** The type of metric used to compare profitability is dependent on the value of -\\(\text{AFC}\\). If \\(\text{AFC} = 0\\), this is always preferred over options with -\\(\text{AFC} > 0\\) so the latter are discarded as investment options. + \\(\text{AFC}\\). If \\(\text{AFC} = 0\\), this is always preferred over options with + \\(\text{AFC} > 0\\) so the latter are discarded as investment options. - **If \\(\text{AFC} > 0\\), Use the profitability index \\(\text{PI}\\) metric:** This is the total annualised surplus divided by the annualised fixed cost. \\[ \text{PI} = - \frac{\sum_t act_t \cdot \text{AC}_t^{\text{NPV}}}{\text{AFC} \cdot \text{cap}} + \frac{\sum\_t act\_t \cdot \text{AC}\_t^{\text{NPV}}}{\text{AFC} \cdot \text{cap}} \\] - **If \\(\text{AFC} = 0\\), Use the total annualised surplus metric \\(\text{TAS}\\):** \\[ \text{TAS} = - \sum_t act_t \cdot \text{AC}_t^{\text{NPV}} + \sum\_t act\_t \cdot \text{AC}\_t^{\text{NPV}} \\] #### Tool B: LCOX @@ -198,7 +198,7 @@ For each asset option: \\[ minimise \Big\\{ - \text{AFC} \times cap + \sum_t act_t \times AC_{t}^{LCOX} + VoLL \times UnmetD_t + \text{AFC} \times cap + \sum\_t act\_t \times AC\_{t}^{LCOX} + VoLL \times UnmetD\_t \Big\\} \\] @@ -229,18 +229,16 @@ If two or more investment options from the same tool have equal metrics, the fol rules are applied in order: 1. Assets which are already commissioned are preferred over new candidate assets. - 2. Newer (commissioned later) assets are preferred over older assets. - 3. If there is still a tie, the first option in the data structure storing the metrics is selected, - which is non-deterministic. A warning is emitted when this occurs. + which is an arbitrary choice. A warning is emitted when this occurs. ## Example: Gas Power Plant The following is an illustrative example of how the NPV and LCOX approaches work, using a simple gas combined-cycle power plant as the supply option under consideration. This example demonstrates the evaluation across two time periods -\\(t_0\\) (peak period) and \\(t_1\\) (off-peak period) with variable operating costs +\\(t\_0\\) (peak period) and \\(t\_1\\) (off-peak period) with variable operating costs \\( cost\_{var}[t] \\) constant in all time periods. ### Model Parameters @@ -255,7 +253,7 @@ This example demonstrates the evaluation across two time periods | Variable operating cost | \\( cost\_{var}[t] \\) | £5/MWh of activity | Operating costs per unit activity | -All per-flow costs associated represented in the general formulas as \\( cost\_{input} \\) and +All per-flow costs represented in the general formulas as \\( cost\_{input} \\) and \\( cost\_{output} \\) are assumed to be zero. #### Investment Parameters @@ -269,15 +267,15 @@ All per-flow costs associated represented in the general formulas as \\( cost\_{ | Commodity | Notation | \\(t_0\\) (Peak) | \\(t_1\\) (Off-peak) | | ----------- | ---------- | ----------- | --------------- | -| Electricity | \\( \lambda\_{c_{primary},r,t} \\) | £90/MWh | £50/MWh | -| Heat | \\( \lambda\_{c_{heat},r,t} \\) | £25/MWh | £15/MWh | -| Natural gas | \\( \lambda\_{c_{gas},r,t} \\) | £35/MWh | £25/MWh | +| Electricity | \\( \lambda\_{c\_{primary},r,t} \\) | £90/MWh | £50/MWh | +| Heat | \\( \lambda\_{c\_{heat},r,t} \\) | £25/MWh | £15/MWh | +| Natural gas | \\( \lambda\_{c\_{gas},r,t} \\) | £35/MWh | £25/MWh | ### NPV Approach (Tool A) #### Calculate Net Revenue per Unit of Activity -**For \\(t_0\\) (peak period):** +**For \\(t\_0\\) (peak period):** \\[ \begin{aligned} @@ -289,11 +287,11 @@ AC_{t_{0}}^{NPV} &= (1.0 \times 90) + (0.5 \times 25) + (-2.5 \times 35) - 5 \\\ The asset earns £10 profit for every MWh it operates during peak periods. -**For \\(t_1\\) (off-peak period):** +**For \\(t\_1\\) (off-peak period):** \\[ \begin{aligned} -AC_{t_1}^{NPV} &= (1.0 \times 50) + (0.5 \times 15) + (-2.5 \times 25) - 5 \\\\ +AC_{t\_1}^{NPV} &= (1.0 \times 50) + (0.5 \times 15) + (-2.5 \times 25) - 5 \\\\ &= 50 + 7.5 - 62.5 - 5 \\\\ &= \text{£} -10 \text{/MWh} \end{aligned} @@ -306,14 +304,14 @@ The asset loses £10 for every MWh it operates during off-peak periods. The optimisation maximises total net revenue across all time periods: \\[ -\max \sum_t act_t \cdot AC_t^{NPV} = act_{t_{0}} \cdot 10 + act_{t_1} \cdot (-10) +\max \sum\_t act\_t \cdot AC\_t^{NPV} = act\_{t_{0}} \cdot 10 + act\_{t\_1} \cdot (-10) \\] -where \\( act_t \\) is the activity (operational level) in each time slice, subject to operational +where \\( act\_t \\) is the activity (operational level) in each time slice, subject to operational constraints and demand requirements. -In this case, the optimiser will prefer to dispatch the asset during \\(t_0\\) (profitable) and - minimise operation during \\(t_1\\) (unprofitable), subject to technical constraints such as minimum +In this case, the optimiser will prefer to dispatch the asset during \\(t\_0\\) (profitable) and +minimise operation during \\(t\_1\\) (unprofitable), subject to technical constraints such as minimum load requirements. #### Profitability Index @@ -321,10 +319,10 @@ load requirements. The profitability index is calculated as: \\[ -\text{PI} = \frac{\sum_t act_t \cdot AC_t^{NPV}}{AFC \times cap} +\text{PI} = \frac{\sum\_t act\_t \cdot AC\_t^{NPV}}{AFC \times cap} \\] -Suppose the dispatch optimiser determines \\( act_{t_{0}} = 80 \\) MWh and \\( act_{t_1} = 20 \\) +Suppose the dispatch optimiser determines \\( act\_{t\_{0}} = 80 \\) MWh and \\( act\_{t\_1} = 20 \\) MWh are the optimal activity levels: \\[ @@ -343,11 +341,11 @@ The profitability index is then compared against all other options to determine #### Net Cost per Unit of Activity -**For \\(t_0\\) (peak period):** +**For \\(t\_0\\) (peak period):** \\[ \begin{aligned} -AC_{t_{0}}^{LCOX} &= 5 + (2.5 \times 35) - (0.5 \times 25) \\\\ +AC\_{t\_{0}}^{LCOX} &= 5 + (2.5 \times 35) - (0.5 \times 25) \\\\ &= 5 + 87.5 - 12.5 \\\\ &= \text{£80/MWh} \end{aligned} @@ -359,7 +357,7 @@ It costs £80 per MWh to operate during peak periods (net of heat by-product sal \\[ \begin{aligned} -AC_{t_1}^{LCOX} &= 5 + (2.5 \times 25) - (0.5 \times 15) \\\\ +AC\_{t\_1}^{LCOX} &= 5 + (2.5 \times 25) - (0.5 \times 15) \\\\ &= 5 + 62.5 - 7.5 \\\\ &= \text{£60/MWh} \end{aligned} @@ -371,12 +369,12 @@ It costs £60 per MWh to operate during off-peak periods, reflecting lower gas p #### Capacity and Dispatch Optimisation The optimiser determines the most cost-effective capacity and dispatch pattern to meet demand across - both time periods by minimising the total annualised cost with respect to decision variables - \\( cap \\) and \\( act_t \\): +both time periods by minimising the total annualised cost with respect to decision variables +\\( cap \\) and \\( act\_t \\): \\[ -AFC \cdot cap + \sum_t act_t \cdot AC_t^{LCOX} = 1{,}000 \cdot cap + act_{t_{0}} - \cdot 80 + act_{t_1} \cdot 60 +AFC \cdot cap + \sum\_t act\_t \cdot AC\_t^{LCOX} = 1{,}000 \cdot cap + act\_{t\_{0}} + \cdot 80 + act\_{t\_1} \cdot 60 \\] #### Cost Index (Levelised Cost of X) @@ -384,11 +382,11 @@ AFC \cdot cap + \sum_t act_t \cdot AC_t^{LCOX} = 1{,}000 \cdot cap + act_{t_{0}} The Cost Index is calculated as: \\[ -\text{Cost Index} = \frac{AFC \cdot cap + \sum_t act_t \cdot AC_t^{LCOX}}{\sum_t act_t} +\text{Cost Index} = \frac{AFC \cdot cap + \sum\_t act\_t \cdot AC\_t^{LCOX}}{\sum\_t act\_t} \\] -Suppose the optimiser determines \\( cap = 100 \\) MW, \\( act_{t_{0}} = 150 \\) MWh, - and \\( act_{t_1} = 80 \\) MWh are the optimal capacity and activity levels: +Suppose the optimiser determines \\( cap = 100 \\) MW, \\( act\_{t\_{0}} = 150 \\) MWh, + and \\( act\_{t\_1} = 80 \\) MWh are the optimal capacity and activity levels: \\[ \begin{aligned} From 1a49a56726c135b30ec4e13bcc44f64f1d9a567c Mon Sep 17 00:00:00 2001 From: Aurash Karimi Date: Wed, 4 Mar 2026 10:39:47 +0000 Subject: [PATCH 19/23] fix AFC details --- docs/model/investment.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/model/investment.md b/docs/model/investment.md index 8ccb16ef8..e3794947c 100644 --- a/docs/model/investment.md +++ b/docs/model/investment.md @@ -144,8 +144,9 @@ operational constraints (e.g., minimum load levels) and the balance level of the - **Optimise capacity and dispatch to maximise annualised profit:** Solve a small optimisation sub-problem to maximise the asset's surplus, subject to its operational rules and the specific - demand tranche it is being asked to serve. \\(\varepsilon \approx 1\times 10^{-14}\\) is added to each - \\(AC_{t}^{NPV} \\) to allow assets which are breakeven (or very close to breakeven) to be dispatched. + demand tranche it is being asked to serve. \\(\varepsilon \approx 1\times 10^{-14}\\) is added to + each \\(AC_{t}^{NPV} \\) to allow assets which are breakeven (or very close to breakeven) to be + dispatched. \\[ maximise \Big\\{\sum_t act_t (AC\_{t}^{NPV} + \varepsilon) @@ -164,8 +165,8 @@ operational constraints (e.g., minimum load levels) and the balance level of the existing assets. - **Decide on metric:** The type of metric used to compare profitability is dependent on the value of - \\(\text{AFC}\\). If \\(\text{AFC} = 0\\), this is always preferred over options with - \\(\text{AFC} > 0\\) so the latter are discarded as investment options. + \\(\text{AFC}\\). If \\(\text{AFC} = 0\\) within the tolerance provided by the `float_cmp` crate, + the associated investment option is always prioritised over options with \\(\text{AFC} > 0\\). - **If \\(\text{AFC} > 0\\), Use the profitability index \\(\text{PI}\\) metric:** This is the total annualised surplus divided by the annualised fixed cost. From c30ec263e5150fd6342eb5413ea2efb6e6086ff1 Mon Sep 17 00:00:00 2001 From: Aurash Karimi Date: Wed, 4 Mar 2026 11:03:23 +0000 Subject: [PATCH 20/23] add time dependency SPCF change warning message to log message --- docs/model/investment.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/model/investment.md b/docs/model/investment.md index e3794947c..82a05687e 100644 --- a/docs/model/investment.md +++ b/docs/model/investment.md @@ -66,10 +66,10 @@ providing investment and dynamic decommissioning decisions. - Annualised fixed costs per unit of capacity (\\( AFC_{opt,r} \\)): For new candidates, this is their annualised CAPEX plus FOM. For existing assets, the relevant fixed cost is its FOM. -- Calculate the specific process and commodity flow costs (SPCF): +- Calculate the specific process and commodity flow costs (\\(\text{SPCF}\_{t})\\): \\[ - \text{SPCF} = \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c] + + \text{SPCF}\_{t} = \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c] + cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) \\] @@ -78,8 +78,8 @@ providing investment and dynamic decommissioning decisions. - Calculate net revenue per unit of activity \\(AC_{t}^{NPV} \\) (Tool A): \\[ \begin{aligned} - AC_{t}^{NPV} = &-cost\_{\text{var}}[t] \\\\ - &- \text{SPCF} \\\\ + AC\_{t}^{NPV} = &-cost\_{\text{var}}[t] \\\\ + &- \text{SPCF}\_{t} \\\\ &+ \sum\_{c} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c] \Big) \cdot \lambda\_{c,r,t} \\\\ \end{aligned} @@ -89,8 +89,8 @@ providing investment and dynamic decommissioning decisions. of interest (primary output \\( c_{primary} \\)) is excluded from the price term: \\[ \begin{aligned} - AC_{t}^{LCOX} = & \quad cost\_{\text{var}}[t] \\\\ - &+ \text{SPCF} \\\\ + AC\_{t}^{LCOX} = & \quad cost\_{\text{var}}[t] \\\\ + &+ \text{SPCF}\_{t} \\\\ &- \sum\_{c \neq c_{primary}} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}} [c] \Big) \cdot \lambda\_{c,r,t} \\\\ @@ -232,7 +232,7 @@ rules are applied in order: 1. Assets which are already commissioned are preferred over new candidate assets. 2. Newer (commissioned later) assets are preferred over older assets. 3. If there is still a tie, the first option in the data structure storing the metrics is selected, - which is an arbitrary choice. A warning is emitted when this occurs. + which is an arbitrary choice. A `debug` level log message is emitted in this case. ## Example: Gas Power Plant From 32801e6d43bfbd0b1295c4c377153aa212682f26 Mon Sep 17 00:00:00 2001 From: Aurash Karimi Date: Wed, 4 Mar 2026 11:12:21 +0000 Subject: [PATCH 21/23] make usage of epsilon constant in npv coefficients clearer --- docs/model/investment.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/model/investment.md b/docs/model/investment.md index 82a05687e..2e157c8da 100644 --- a/docs/model/investment.md +++ b/docs/model/investment.md @@ -82,8 +82,12 @@ providing investment and dynamic decommissioning decisions. &- \text{SPCF}\_{t} \\\\ &+ \sum\_{c} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c] \Big) \cdot \lambda\_{c,r,t} \\\\ + &+ \varepsilon \\\\ \end{aligned} \\] + \\(\varepsilon \approx 1\times 10^{-14}\\) is added to + each \\(AC_{t}^{NPV} \\) to allow assets which are breakeven (or very close to breakeven) to be + dispatched. - Calculate cost per unit of activity \\( AC_{t}^{LCOX} \\) (Tool B). Note that the commodity of interest (primary output \\( c_{primary} \\)) is excluded from the price term: @@ -144,12 +148,10 @@ operational constraints (e.g., minimum load levels) and the balance level of the - **Optimise capacity and dispatch to maximise annualised profit:** Solve a small optimisation sub-problem to maximise the asset's surplus, subject to its operational rules and the specific - demand tranche it is being asked to serve. \\(\varepsilon \approx 1\times 10^{-14}\\) is added to - each \\(AC_{t}^{NPV} \\) to allow assets which are breakeven (or very close to breakeven) to be - dispatched. + demand tranche it is being asked to serve. \\[ - maximise \Big\\{\sum_t act_t (AC\_{t}^{NPV} + \varepsilon) + maximise \Big\\{\sum_t act_t AC\_{t}^{NPV} \Big\\} \\] From d496a439d2f4d67ddfde1495c0086edd2cb1f839 Mon Sep 17 00:00:00 2001 From: Alex Dewar Date: Wed, 4 Mar 2026 11:34:31 +0000 Subject: [PATCH 22/23] investment.md: Reformat tables with `markdown-table-formatter` --- docs/model/investment.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/model/investment.md b/docs/model/investment.md index 2e157c8da..d89fedab5 100644 --- a/docs/model/investment.md +++ b/docs/model/investment.md @@ -248,12 +248,12 @@ This example demonstrates the evaluation across two time periods #### Asset Parameters -| Parameter | Notation | Value | Description | -| ----------- | ---------- | ------- | ------------- | -| Primary output (Electricity) | \\( output\_{coeff}[c_{primary}] \\) | 1.0 MWh per unit activity | Main commodity produced | -| By-product output (Waste heat) | \\( output\_{coeff}[c_{heat}] \\) | 0.5 MWh per unit activity | Co-product from generation | -| Input (Natural gas) | \\( input\_{coeff}[c_{gas}] \\) | 2.5 MWh per unit activity | Fuel consumption | -| Variable operating cost | \\( cost\_{var}[t] \\) | £5/MWh of activity | Operating costs per unit activity | +| Parameter | Notation | Value | Description | +|--------------------------------|--------------------------------------|---------------------------|-----------------------------------| +| Primary output (Electricity) | \\( output\_{coeff}[c_{primary}] \\) | 1.0 MWh per unit activity | Main commodity produced | +| By-product output (Waste heat) | \\( output\_{coeff}[c_{heat}] \\) | 0.5 MWh per unit activity | Co-product from generation | +| Input (Natural gas) | \\( input\_{coeff}[c_{gas}] \\) | 2.5 MWh per unit activity | Fuel consumption | +| Variable operating cost | \\( cost\_{var}[t] \\) | £5/MWh of activity | Operating costs per unit activity | All per-flow costs represented in the general formulas as \\( cost\_{input} \\) and @@ -261,18 +261,18 @@ All per-flow costs represented in the general formulas as \\( cost\_{input} \\) #### Investment Parameters -| Parameter | Notation | Value | -| ----------- | ---------- | ------- | +| Parameter | Notation | Value | +|-----------------------|----------------------|-----------| | Annualised fixed cost | \\( AFC\_{opt,r} \\) | £1,000/MW | -| Capacity | \\( cap \\) | 100 MW | +| Capacity | \\( cap \\) | 100 MW | #### Market Prices by Time Period -| Commodity | Notation | \\(t_0\\) (Peak) | \\(t_1\\) (Off-peak) | -| ----------- | ---------- | ----------- | --------------- | -| Electricity | \\( \lambda\_{c\_{primary},r,t} \\) | £90/MWh | £50/MWh | -| Heat | \\( \lambda\_{c\_{heat},r,t} \\) | £25/MWh | £15/MWh | -| Natural gas | \\( \lambda\_{c\_{gas},r,t} \\) | £35/MWh | £25/MWh | +| Commodity | Notation | \\(t_0\\) (Peak) | \\(t_1\\) (Off-peak) | +|-------------|-------------------------------------|------------------|----------------------| +| Electricity | \\( \lambda\_{c\_{primary},r,t} \\) | £90/MWh | £50/MWh | +| Heat | \\( \lambda\_{c\_{heat},r,t} \\) | £25/MWh | £15/MWh | +| Natural gas | \\( \lambda\_{c\_{gas},r,t} \\) | £35/MWh | £25/MWh | ### NPV Approach (Tool A) From c5d5234ae8c01754040ea72ba30ac5ba60eda0b6 Mon Sep 17 00:00:00 2001 From: Aurashk Date: Wed, 4 Mar 2026 12:21:01 +0000 Subject: [PATCH 23/23] escape underscores Co-authored-by: Alex Dewar --- docs/model/investment.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/model/investment.md b/docs/model/investment.md index d89fedab5..cc753cdab 100644 --- a/docs/model/investment.md +++ b/docs/model/investment.md @@ -75,7 +75,7 @@ providing investment and dynamic decommissioning decisions. #### Coefficients of activity -- Calculate net revenue per unit of activity \\(AC_{t}^{NPV} \\) (Tool A): +- Calculate net revenue per unit of activity \\(AC\_{t}^{NPV} \\) (Tool A): \\[ \begin{aligned} AC\_{t}^{NPV} = &-cost\_{\text{var}}[t] \\\\ @@ -86,16 +86,16 @@ providing investment and dynamic decommissioning decisions. \end{aligned} \\] \\(\varepsilon \approx 1\times 10^{-14}\\) is added to - each \\(AC_{t}^{NPV} \\) to allow assets which are breakeven (or very close to breakeven) to be + each \\(AC\_{t}^{NPV} \\) to allow assets which are breakeven (or very close to breakeven) to be dispatched. -- Calculate cost per unit of activity \\( AC_{t}^{LCOX} \\) (Tool B). Note that the commodity - of interest (primary output \\( c_{primary} \\)) is excluded from the price term: +- Calculate cost per unit of activity \\( AC\_{t}^{LCOX} \\) (Tool B). Note that the commodity + of interest (primary output \\( c\_{primary} \\)) is excluded from the price term: \\[ \begin{aligned} AC\_{t}^{LCOX} = & \quad cost\_{\text{var}}[t] \\\\ &+ \text{SPCF}\_{t} \\\\ - &- \sum\_{c \neq c_{primary}} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}} + &- \sum\_{c \neq c\_{primary}} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}} [c] \Big) \cdot \lambda\_{c,r,t} \\\\ \end{aligned}