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.
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.
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
prodandconslevy to a commodity incommodity_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
yearcolumn inprocess_flows.csv,process_availabilities.csv,process_parameters.csvandprocess_investment_constraints.csvhas been renamed tocommission_yearsto better reflect that these parameters refer to the year in which a process is commissioned as an asset (#964). - The
process_availabilities.csvfile follows new syntax that better allows for specifying availabilities as ranges (#1018). - The
commodities.csvfile has a new compulsoryunitscolumn (#1110). - The default value for the
max_ironing_out_iterationsparameter inmodel.tomlhas 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_strategycolumn incommodities.csvrather than a single parameter inmodel.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
netwas wrong for inputs (#969) - Fix
--overwriteoption forsave-graphscommand (#1001)