-
Notifications
You must be signed in to change notification settings - Fork 2
update appraisal documentation #1125
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
f50062b
25b2ae2
0703e1f
bcd1255
97204d2
1c2cc68
9cb3f69
63f682f
9345a93
e7b4d2e
046b16f
1656187
d4f7cd3
d2116c1
1e0486c
e2c0d1b
5601da0
d116e36
8ee0ca4
6ac775f
1a49a56
c30ec26
32801e6
d496a43
c5d5234
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -69,33 +63,48 @@ 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 the specific process and commodity flow costs (\\(\text{SPCF}\_{t})\\): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| \\[ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| \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) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| \\] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #### Coefficients of activity | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - Calculate net revenue per unit of activity \\(AC\_{t}^{NPV} \\) (Tool A): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| \\[ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| \begin{aligned} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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} \\\\ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| &+ \varepsilon \\\\ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| \end{aligned} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| \\] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| \\(\varepsilon \approx 1\times 10^{-14}\\) is added to | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| \\(\varepsilon \approx 1\times 10^{-14}\\) is added to | |
| \\(\varepsilon = \texttt{f64::EPSILON} \times 100 \approx 2.22\times 10^{-14}\\) is added to |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Has this block been changed, other than the indentation?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Copilot
AI
Mar 4, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This section refers to \( \pi_{prevMSY} \) prices, but earlier the document defines and uses previous-milestone prices as \( \lambda_{c,r,t} \). If these are the same concept, please use one symbol consistently; if they differ, add a short clarification of the relationship to avoid ambiguity.
| economic evaluation uses \\( \pi_{prevMSY} \\) prices and takes account of asset-specific | |
| economic evaluation uses previous-milestone prices \\( \lambda_{c,r,t} \\) and takes account of asset-specific |
Copilot
AI
Mar 3, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The docs state that if (\text{AFC}=0) it is always preferred and options with (\text{AFC}>0) are “discarded as investment options”. In the implementation, zero/approximately-zero AFC options are prioritised (and compared by total surplus), but the non-zero AFC options are not discarded—they can still be selected if needed. Consider rewording to match the code’s behaviour, and note that “approximately zero” is treated as zero (see ProfitabilityIndex::is_zero_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{PI} = | |
| \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}\\):** | |
| \\[ | |
| - **Decide on metric:** The type of metric used to compare profitability depends on whether the | |
| option has (approximately) zero annualised fixed cost \\( \text{AFC} \\). Options with zero or | |
| approximately zero AFC (as determined by `ProfitabilityIndex::is_zero_fixed_cost`) are | |
| prioritised over options with strictly positive AFC when constructing the portfolio. | |
| - **If \\(\text{AFC} > 0\\), use the profitability index \\(\text{PI}\\) metric:** This is the total | |
| annualised surplus divided by the annualised fixed cost. The PI is used to rank options with | |
| strictly positive AFC; such options may still be selected if no zero/approximately-zero AFC | |
| option can profitably meet the remaining demand. | |
| \\[ | |
| \text{PI} = | |
| \frac{\sum_t act_t \cdot \text{AC}_t^{\text{NPV}}}{\text{AFC} \cdot \text{cap}} | |
| \\] | |
| - **If \\(\text{AFC} \approx 0\\) (treated as zero), use the total annualised surplus metric | |
| \\(\text{TAS}\\):** | |
| \\[ |
Copilot
AI
Mar 4, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Similarly, the TAS formula uses (AC_t^{NPV}) without the (\varepsilon) adjustment, but the code computes total annualised surplus from the same adjusted activity coefficients used in the optimisation. Consider reflecting that in the formula or clarifying that (\varepsilon) is included in the coefficients used for TAS.
| \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}} | |
| \frac{\sum\_t act\_t \cdot \left(\text{AC}\_t^{\text{NPV}} + \varepsilon\right)}{\text{AFC} \cdot \text{cap}} | |
| \\] | |
| - **If \\(\text{AFC} = 0\\), Use the total annualised surplus metric \\(\text{TAS}\\):** | |
| \\[ | |
| \text{TAS} = | |
| \sum\_t act\_t \cdot \left(\text{AC}\_t^{\text{NPV}} + \varepsilon\right) |
Copilot
AI
Mar 4, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The PI formula here uses (AC_t^{NPV}) without the (\varepsilon) adjustment. In the implementation, (\varepsilon) is added directly to the NPV activity coefficients before optimisation and the profitability index is computed from those adjusted coefficients, so PI will (slightly) include (\varepsilon). Consider reflecting that in the formula or adding a note that the metric uses the adjusted coefficients.
| \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}} | |
| \frac{\sum\_t act\_t \cdot \left(\text{AC}\_t^{\text{NPV}} + \varepsilon\right)}{\text{AFC} \cdot \text{cap}} | |
| \\] | |
| - **If \\(\text{AFC} = 0\\), Use the total annualised surplus metric \\(\text{TAS}\\):** | |
| \\[ | |
| \text{TAS} = | |
| \sum\_t act\_t \cdot \left(\text{AC}\_t^{\text{NPV}} + \varepsilon\right) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should also mention that we fall back on comparing the numerator of the PI when AFC is zero.
Copilot
AI
Feb 13, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LaTeX variable formatting is inconsistent within this file: the profitability index uses \text{act}_t, \text{AC}_t, \text{AFC}, etc., while surrounding formulas and the worked example use act_t, AC_t, AFC without \text{}. Pick one style for variables in formulas (either remove \text{} here, or update the other formulas) to keep the notation consistent and easier to read.
Copilot
AI
Mar 4, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This line exceeds the configured markdownlint MD013 line-length limit (100 chars) and will be flagged by the repo’s markdownlint pre-commit hook. Please wrap the sentence (e.g., break after a comma) to keep each line within the limit.
| 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. | |
| 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. |
Aurashk marked this conversation as resolved.
Show resolved
Hide resolved
Copilot
AI
Feb 13, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Tool B’s optimisation bullet says it ‘minimise[s] annualised cost’ but then describes solving the sub-problem ‘to maximise the asset's surplus’, which is contradictory. Also, the objective uses AF × cap while the rest of the document defines the annualised fixed cost as AFC; please align the wording and notation so the objective is unambiguous and consistent with the earlier AFC_{opt,r} definition and the cost-index formula.
Copilot
AI
Feb 16, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The LCOX optimisation objective shows a single “VoLL × UnmetD_t” term, but in the implementation unmet-demand variables exist per time slice and each contributes to the objective. To match the code (and the dispatch optimisation docs), this should be expressed as a sum over time slices (e.g., Σ_t VoLL · UnmetD_t).
Copilot
AI
Mar 3, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In the Cost Index formula, the numerator uses (\text{cap}_r) but elsewhere in this section (and in the optimisation objective just above) the capacity decision variable is (cap). This (r) subscript looks inconsistent and could confuse readers; consider using the same notation consistently (e.g., (cap) or (cap{opt,r}) if the region index is intended).
Copilot
AI
Mar 3, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The Cost Index formula uses (\text{cap}r), but the optimisation problem and the underlying lcox() implementation use a capacity scalar (no region subscript) for the annual fixed cost term. Using (cap_r) here is inconsistent with the surrounding text and may imply region-indexed capacity. Consider changing to (cap) (or (cap{opt,r}) if you want to be explicit) and keep it consistent throughout the section.
Copilot
AI
Mar 4, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The “Equal-Metric Fallback” section claims that if there is still a tie then “the first option in the data structure … is selected” and that a debug log is emitted. The current implementation sorts with a fallback on commissioned status / commission year, but does not emit a log and does not guarantee preserving original order when all compared fields are equal (Rust’s sort_by is not stable). Please adjust the wording to match the actual behavior (ties may remain unresolved / ordering unspecified), or update the implementation if deterministic tie-breaking + logging is required.
| 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 `debug` level log message is emitted in this case. | |
| preferences are applied: | |
| 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 after applying these preferences, the relative ordering of the remaining | |
| options is implementation-defined and may not be deterministic (for example, it may depend on the | |
| underlying sort algorithm). No specific log message is guaranteed to be emitted in this case. |
Copilot
AI
Mar 4, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This list claims a final tie-breaker of selecting the first option in the data structure and emitting a warning. The current implementation only falls back to comparing (is_commissioned, commission_year) and explicitly notes that it does not guarantee all ties will be resolved; it also does not emit a warning on unresolved ties. Please update this section to reflect the actual fallback behaviour (and avoid implying deterministic selection or warnings that don’t occur).
| 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. | |
| After applying these rules, remaining ties may still exist. The current implementation does not | |
| guarantee that all such ties are resolved deterministically and does not emit a warning when they | |
| occur. |
Aurashk marked this conversation as resolved.
Show resolved
Hide resolved
Copilot
AI
Mar 4, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In the NPV example for the off-peak period, the rendered unit value is written as \text{£} -10 \text{/MWh}, which is likely to typeset awkwardly (currency symbol separated from the negative sign/value). Consider formatting it as a single unit/value (e.g., -\text{£}10/\text{MWh} or \text{£-10/MWh}) for readability.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I guess this doesn't really need to be a math block, but it's ok this way too.