Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 30 additions & 30 deletions CITATION.cff
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess this file has been reformatted because the prettier pre-commit hook doesn't recognise it as a YAML file. We could probably tweak things in the .pre-commit-config.yaml file so this also gets formatted by prettier, but possibly not worth the effort 😛

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just did cmd-s out of habit while working on this file and then this happened, not sure why

Original file line number Diff line number Diff line change
@@ -1,37 +1,37 @@
cff-version: 1.2.0
message: |
If you cite this software, please cite it as below.
If you cite this software, please cite it as below.

This work was supported via the Climate Compatible Growth (CCG) programme and the EPSRC-funded
HI-ACT project (EP/X038823/2). CCG is funded by UK Aid from the UK government. However, the views
expressed herein do not necessarily reflect the UK government's official policies.
This work was supported via the Climate Compatible Growth (CCG) programme and the EPSRC-funded
HI-ACT project (EP/X038823/2). CCG is funded by UK Aid from the UK government. However, the views
expressed herein do not necessarily reflect the UK government's official policies.
title: MUSE2
version: 2.0.0
date-released: 2025-10-14
version: 2.1.0
date-released: 2026-03-31
authors:
- family-names: Dewar
given-names: Alex
orcid: https://orcid.org/0000-0002-2432-5964
- family-names: Bland
given-names: Tom
orcid: https://orcid.org/0000-0001-6677-8817
- family-names: Raja
given-names: Sahil
- family-names: Alonso Álvarez
given-names: Diego
orcid: https://orcid.org/0000-0002-0060-9495
- family-names: D'Alessandro
given-names: Adrian
orcid: https://orcid.org/0009-0002-9503-5777
- family-names: Smith
given-names: Ryan
orcid: https://orcid.org/0009-0007-7270-6853
- family-names: Scharpf
given-names: Benjamin
- family-names: Karimi
given-names: Aurash
- family-names: Hawkes
given-names: Adam
orcid: https://orcid.org/0000-0001-9720-332X
- family-names: Dewar
given-names: Alex
orcid: https://orcid.org/0000-0002-2432-5964
- family-names: Bland
given-names: Tom
orcid: https://orcid.org/0000-0001-6677-8817
- family-names: Raja
given-names: Sahil
- family-names: Alonso Álvarez
given-names: Diego
orcid: https://orcid.org/0000-0002-0060-9495
- family-names: D'Alessandro
given-names: Adrian
orcid: https://orcid.org/0009-0002-9503-5777
- family-names: Smith
given-names: Ryan
orcid: https://orcid.org/0009-0007-7270-6853
- family-names: Scharpf
given-names: Benjamin
- family-names: Karimi
given-names: Aurash
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess @Aurashk might have an ORCID too, but I couldn't find one on his GitHub page or Imperial profile. Probably doesn't matter much...

- family-names: Hawkes
given-names: Adam
orcid: https://orcid.org/0000-0001-9720-332X
license: GPL-3.0-only
repository-code: https://github.com/EnergySystemsModellingLab/MUSE2
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "muse2"
version = "2.0.0"
version = "2.1.0"
authors = ["Hawkes Research Group @ Chemical Engineering, Imperial College London <a.hawkes@imperial.ac.uk>", "Imperial College London RSE Team <ict-rse-team@imperial.ac.uk>"]
edition = "2024"
description = "A tool for running simulations of energy systems"
Expand Down
1 change: 1 addition & 0 deletions docs/SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,6 @@
- [API documentation](./api/muse2/README.md)
- [Release notes](release_notes/README.md)
- [MUSE2 v2.0.0 (October 14, 2025)](release_notes/v2.0.0.md)
- [MUSE2 v2.1.0 (March 31, 2026)](release_notes/v2.1.0.md)
- [Next unreleased version](release_notes/upcoming.md)
- [Other versions of documentation](versions.md)
1 change: 1 addition & 0 deletions docs/release_notes/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@ To download the latest release for your platform, please see our [GitHub release
To see the list of changes for the current, in-progress version of MUSE2, [see here](./upcoming.md).

- [MUSE2 v2.0.0 (October 14, 2025)](./v2.0.0.md)
- [MUSE2 v2.1.0 (March 31, 2026)](./v2.1.0.md)

[GitHub releases page]: https://github.com/EnergySystemsModellingLab/MUSE2/releases
59 changes: 0 additions & 59 deletions docs/release_notes/upcoming.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,62 +13,3 @@ ready to be released, carry out the following steps:
version

-->

## New features

- You can now set both upper and lower bounds for process availabilities ([#1018])
- Default output root path is now configurable in `settings.toml` ([#1003])
- If demand cannot be satisfied by the simulation, we now inform users what the offending
commodities and time slices are ([#767])
- Trim whitespace from fields when reading in CSV files ([#976])
- Assets can now be commissioned after a specified number of years with the `mothball_years`
parameter ([#1022])
- Default to no availability limits if user doesn't provide any for a process ([#1018])
- Allow user to specify ranges of years in input files ([#1017])
- Users can now omit empty CSV files ([#961])
- Users can now optionally specify an explicit decommission year for an asset in `assets.csv` input
file ([#966])
- Allow for adding both a `prod` and `cons` levy to a commodity ([#969])
- Availability limits can now be provided at multiple levels for a process ([#1018])
- Pricing strategy can now vary by commodity ([#1021])
- `marginal` and `full` commodity pricing strategies no longer require enabling
`please_give_me_broken_results` ([#1185])

## Experimental features

- Assets can now be made divisible to represent many individual assets, such as a fleet of gas
boilers (albeit the current implementation is slow; [#1030]). These fleets can be partially
decommissioned.
- Users can now have circular dependencies between commodities, such as a hydrogen power plant that
itself requires electricity (though the current solution likely won't work in every situation;
[#986])
- There are new options for pricing strategy (`full` and `marginal`), which take capital costs into
account ([#1021])

## Bug fixes

- Fix: process availability constraints were wrongly being applied to individual time slices,
regardless of time slice level ([#1018])
- Various fixes to process flows and availabilities input code for non-milestone years ([#868],
[#1000], [#1010])
- Users can now set demand to zero in `demand.csv` ([#871])
- Fix: sign for levies of type `net` was wrong for inputs ([#969])
- Fix `--overwrite` option for `save-graphs` command ([#1001])

[#767]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/767
[#868]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/868
[#871]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/871
[#961]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/961
[#966]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/966
[#969]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/969
[#976]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/976
[#986]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/986
[#1000]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/1000
[#1001]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/1001
[#1003]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/1003
[#1010]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/1010
[#1017]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/1017
[#1018]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/1018
[#1021]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/1021
[#1022]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/1022
[#1030]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/1030
143 changes: 143 additions & 0 deletions docs/release_notes/v2.1.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
# Release notes for MUSE2 v2.1.0 (March 31, 2026)

This release represents over 5 months of development since v2.0.0, adding a number of exciting new
features, as well as some small improvements, bug fixes, and underlying code changes designed to
improve performance and maintainability.
Comment on lines +3 to +5
Copy link

Copilot AI Mar 30, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Many lines in this new release note exceed the repo’s markdownlint MD013 limit (100 chars) and are likely to fail the pre-commit markdownlint-fix hook. Please reflow/wrap the paragraphs and long list items (or explicitly disable MD013 for this file if intentional).

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Erm... not true


Please be aware that there are some breaking changes in this release, which may require you to
update the input files of any existing models. We have tried to outline these in the "Breaking
changes" section below, but please do get in touch if you have any issues adapting models to the new
version.

Some of the new features in this release are still experimental, and will continue to be worked on
for future releases. In the meantime, any feedback on these features is very welcome.

As always, you can keep track of upcoming changes for the next release in the
[upcoming release notes](upcoming.md).

## New features

### Asset mothballing

Assets can now remain unused for a certain number of years before being decommissioned, via the
global `mothball_years` parameter defined in [`model.toml`] ([#1022]). The default value for this
parameter is 0 years, meaning that assets are decommissioned immediately when they are no longer
used, which is equivalent to the behaviour in previous versions of MUSE2.

### Process investment constraints

Users can now add yearly limits on the maximum amount of investment in each process via the new
[`process_investment_constraints.csv`] file ([#1020] and [#1096]).

### Circular commodity dependencies

Users can now have circular dependencies between commodities, such as a hydrogen power plant that
itself requires electricity ([#999] and [#1004]). This is currently an experimental feature that may
not work in all cases - feedback is appreciated. There are also known limitations such as
incompatibility with the new commodity pricing strategies (see below, [#1168]), which we plan to
address in future releases. The main new parameter to be aware of is the `capacity_margin` parameter
defined in [`model.toml`].

### Divisible assets

Assets can now be made divisible to represent many individual sub-assets, such as a fleet of gas
boilers, which can be partially decommissioned ([#1030]). This is implemented via the new optional
`unit_size` column in [`processes.csv`]. For example, a `unit_size` of 10 means that the smallest
granular unit of asset capacity represents 10 capacity units (e.g. a single gas boiler, or a defined
aggregate of gas boilers, depending on the desired resolution). Omitting this column or leaving
values empty means that assets are indivisible (i.e. must be decommissioned in one go), which is the
default behaviour and the same as in previous versions of MUSE2.

It is worth noting that the current implementation incurs a potentially significant performance cost
when setting `unit_size` very small compared to overall capacity, although we plan to address this
in future releases.

### New commodity pricing strategies

There are four new pricing strategies for commodities: `full`, `marginal`, `full_average` and
`marginal_average` ([#1021] and [#1205]). Unlike previously, where the pricing strategy was set at
the model level, users can now specify the pricing strategy for each commodity individually in the
[`commodities.csv`] file via the new optional `pricing_strategy` column. The new strategies
are in addition to the existing `shadow` and `scarcity` strategies, as well as an `unpriced` option
for `oth` type commodities that should not be priced.

### Other new features

- Users can now optionally specify an explicit decommission year for an asset in [`assets.csv`]
([#966])
- Allow users to specify ranges of years in input files ([#1017])
- You can now set both upper and lower bounds in [`process_availabilities.csv`] ([#1018])
- Availability limits can now be provided at multiple levels for a process ([#1018])
- Allow for adding both a `prod` and `cons` levy to a commodity in [`commodity_levies.csv`] ([#969])
- The default output root path is now configurable in [`settings.toml`] ([#1003])
- If demand cannot be satisfied by the simulation, we now inform users what the offending
commodities and time slices are ([#767])
- Trim whitespace from fields when reading in CSV files ([#976])
- Default to no availability limits if user doesn't provide any for a process ([#1018])
- Users can now omit empty CSV files ([#961])
- Several changes to the NPV agent objective designed to improve results ([#994] and [#997])

## Breaking changes

These changes may require users to update the input files for existing models developed using
previous versions of MUSE2.

- The previously-named `year` column in [`process_flows.csv`], [`process_availabilities.csv`],
[`process_parameters.csv`] and [`process_investment_constraints.csv`] has been renamed to
`commission_years` to better reflect that these parameters refer to the year in which a process
is commissioned as an asset ([#964]).
- The [`process_availabilities.csv`] file follows new syntax that better allows for specifying
availabilities as ranges ([#1018]).
- The [`commodities.csv`] file has a new compulsory `units` column ([#1110]).
- The default value for the `max_ironing_out_iterations` parameter in [`model.toml`] has been
changed from 10 to 1 (i.e. turning the ironing-out loop off by default; [#1170]). If users wish to
use the ironing out loop, they must explicitly set this parameter to a higher value.
- Pricing strategy is now set per commodity, so there is now a `pricing_strategy` column in
[`commodities.csv`] rather than a single parameter in [`model.toml`] ([#1021]).

## Bug fixes

- Fix: process availability constraints were wrongly being applied to individual time slices,
regardless of time slice level ([#1018])
- Various fixes to process flows and availabilities input code for non-milestone years ([#868],
[#1000], [#1010])
- Users can now set demand to zero in [`demand.csv`] ([#871])
- Fix: sign for levies of type `net` was wrong for inputs ([#969])
- Fix `--overwrite` option for `save-graphs` command ([#1001])

[#767]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/767
[#868]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/868
[#871]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/871
[#961]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/961
[#964]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/964
[#966]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/966
[#969]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/969
[#976]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/976
[#994]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/994
[#997]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/997
[#999]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/999
[#1004]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/1004
[#1000]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/1000
[#1001]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/1001
[#1003]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/1003
[#1010]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/1010
[#1017]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/1017
[#1018]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/1018
[#1020]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/1020
[#1021]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/1021
[#1022]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/1022
[#1030]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/1030
[#1096]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/1096

<!-- Use absolute links so they work when we paste into release notes box -->
[`demand.csv`]: https://energysystemsmodellinglab.github.io/MUSE2/file_formats/input_files.html#demandcsv
[`processes.csv`]: https://energysystemsmodellinglab.github.io/MUSE2/file_formats/input_files.html#processescsv
[`process_flows.csv`]: https://energysystemsmodellinglab.github.io/MUSE2/file_formats/input_files.html#process_flowscsv
[`process_availabilities.csv`]: https://energysystemsmodellinglab.github.io/MUSE2/file_formats/input_files.html#process_availabilitiescsv
[`process_parameters.csv`]: https://energysystemsmodellinglab.github.io/MUSE2/file_formats/input_files.html#process_parameterscsv
[`process_investment_constraints.csv`]: https://energysystemsmodellinglab.github.io/MUSE2/file_formats/input_files.html#process_investment_constraintscsv
[`commodities.csv`]: https://energysystemsmodellinglab.github.io/MUSE2/file_formats/input_files.html#commoditiescsv
[`commodity_levies.csv`]: https://energysystemsmodellinglab.github.io/MUSE2/file_formats/input_files.html#commodity_leviescsv
[`model.toml`]: https://energysystemsmodellinglab.github.io/MUSE2/file_formats/input_files.html#model-parameters-modeltoml
[`assets.csv`]: https://energysystemsmodellinglab.github.io/MUSE2/file_formats/input_files.html#assetscsv
[`settings.toml`]: https://energysystemsmodellinglab.github.io/MUSE2/file_formats/program_settings.html
2 changes: 1 addition & 1 deletion docs/user_guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ the simulation (which should finish very quickly).
The first few lines should look something like:

```txt
[12:24:20 INFO muse2::cli] Starting MUSE2 v2.0.0
[12:24:20 INFO muse2::cli] Starting MUSE2 v2.1.0
[12:24:20 INFO muse2::cli] Loaded model from new_model/
[12:24:20 INFO muse2::cli] Output folder: muse2_results/new_model
...
Expand Down
2 changes: 1 addition & 1 deletion schemas/input/process_availabilities.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ fields:
type: string
description: The region(s) to which this entry applies
notes: One or more region IDs, separated by semicolons or the string `all`
- name: years
- name: commission_years
type: string
description: The milestone year(s) to which this entry applies
notes:
Expand Down
4 changes: 2 additions & 2 deletions schemas/input/process_flows.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ description: |
notes:
- Commodity flows can vary by region and year.
- For each process, there must be entries covering all the years and regions in which the process
operates.
can be commissioned.

fields:
- name: process_id
Expand All @@ -20,7 +20,7 @@ fields:
notes: |
One or more region IDs, separated by semicolons or the string `all`. Must be regions in which
the process operates.
- name: years
- name: commission_years
type: string
description: The year(s) to which this entry applies
notes:
Expand Down
4 changes: 2 additions & 2 deletions schemas/input/process_parameters.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ description: |

notes:
- For each process, entries must be provided which cover every combination of milestone year and
region in which the process operates.
region in which the process can be commissioned.

fields:
- name: process_id
Expand All @@ -16,7 +16,7 @@ fields:
notes: |
One or more region IDs, separated by semicolons or the string `all`. Must be regions in which
the process operates.
- name: years
- name: commission_years
type: string
description: The milestone year(s) to which this entry applies
notes:
Expand Down
Loading