Skip to content

MIMOSA 2.0.0

Status: released 26 October 2026

The main addition in MIMOSA 2.0.0 is the ACCREU damage module, with sector-specific climate damages and adaptation options.

MIMOSA now builds a Pyomo ConcreteModel directly, with parameter values initialized where components declare them. The normal MIMOSA(params) interface, model equations, units, simulation and optimisation workflows are preserved.

ACCREU damages and adaptation

The new ACCREU module provides damage estimates for riverine flooding, labour productivity, sea-level rise and mortality. It also includes adaptation costs and effectiveness for the first three sectors, allowing users to explore damages without adaptation, adaptation alone, or joint mitigation and adaptation strategies.

Select it with params["model structure"]["damage module"] = "ACCREU". Adaptation is disabled by default and can be enabled with params["economics"]["damages"]["accreu"]["adaptation"] = "sectoral". See ACCREU damages and adaptation for the model description and Doing an ACCREU run for runnable examples.

Building and extending the model

mimosa/model_builder.py replaces mimosa/abstract_model.py. The preprocessor validates and parses configuration, prepares data stores and input lookup, then builds the concrete model. There is no abstract-model construction, cloning or separate instantiation stage.

Every component receives the initialized model and prepared inputs:

from mimosa.common import ConcreteModel, Param
from mimosa.core.model_inputs import ModelInputs


def get_constraints(m: ConcreteModel, inputs: ModelInputs):
    m.alpha = Param(initialize=inputs.config("economics.GDP.alpha"))
    # Declare the component's variables and return its equations and constraints.

m.t, m.regions, calendar years and baseline inputs are available before components run. Declare other dependencies before an initializer or bound that reads them. Collected constraints are attached after all component declarations, followed by custom constraints, the existing Pyomo transformations and initial-abatement fixing.

The builder calls components explicitly in the existing order. Selectable packages read their own module selector from model structure and use their existing selection dictionaries. Module choices and unknown-module errors are unchanged. The objective still returns its Pyomo objective together with any additional constraints.

To add a component, import it and add a call in create_model. To add a variant, extend the package's selection dictionary and configuration enum. See Creating model components and Selectable modules.

Parameter initialization and documentation

Initialize parameters with ordinary values or prepared input lookup:

  • Param(initialize=3.0) for a constant;
  • Param(initialize=inputs.config("economics.GDP.alpha")) for a configuration value;
  • Param(m.regions, initialize=inputs.regional(category, column)) for regional data;
  • Param(m.t, m.regions, initialize=inputs.time_regional(name)) for baseline input data.

inputs.time_config(path) interpolates numeric calendar-year keyframes onto model timesteps. inputs.config_value(path) returns plain configuration values or sections for Python decisions. Configuration defaults, quantity conversion, regional overrides and data interpolation are preserved. Finalize configuration before preparing the stores and input lookup.

Sourced initialization automatically retains the metadata used by param:: documentation markers in source_key. doc is available for descriptions alongside any initializer and does not load or override values. Replace Param(doc="::economics.PRTP") with Param(initialize=inputs.config("economics.PRTP")).

Components own their scientific input choices. Mitigation now declares its SSP calibration parameter; COACCH selects combined/separate coefficient sources directly. Their numerical values are unchanged, and source metadata identifies the inputs actually used. Fixed COACCH placeholder values have no source label. Regional metadata rendering retains its existing limitations. See Adding parameters and data.

The emissions component validates nonzero pulse years against the model time grid using Param(validate=...). Off-grid nonzero pulses raise ValueError; zero off-grid pulses remain allowed. ACCREU calibration, mortality bounds, adaptation delays and joint/sequential CBA workflows are preserved. The no-policy baseline disables analytical adaptation in a temporary model so avoided damages use a reference without mitigation or adaptation.

Loading adaptation-readiness data

from mimosa import load_adaptation_readiness provides the packaged readiness data as a pandas table indexed by SSP and Region, with calendar-year string columns. It works independently of the current working directory and returns a fresh table on each call. See the Python reference.

Removed custom parameter mappings

custom_constraints.custom_mapping has been removed. Remove this key from configuration dictionaries or YAML files; supplying it raises the normal obsolete-configuration error, including for empty mappings.

custom_constraints.constraint_variables and custom_constraints.disabled_constraints remain supported, including prescribed trajectories and constraint deactivation. Regional input overrides under params["regions"] also remain supported.

Compatibility for model extensions

The emissions control variable relative_abatement has been renamed to mitigation_level. Update simulation keyword arguments, model attribute access, custom constraints, and saved-output variable lookups to use the new name. Its definition, units, bounds, and numerical behavior are unchanged.

Component signatures now use get_constraints(m: ConcreteModel, inputs: ModelInputs). MIMOSA.inputs and ModelBuildResult.inputs replace the former context attributes. ModelBuildResult still unpacks to the model, parsed parameters and equations (three values). Preruns, simulation preparation and solver entry points remain available as before.

Removed internal APIs include ModelContext, ComponentConfig, mimosa.core.helpers, InstantiatedModel, Preprocessor._abstract_model, instantiated_model, mimosa.core.component_definition, MODEL_COMPONENTS, ALL_COMPONENTS, OBJECTIVE_COMPONENT and ComponentDefinition. Extensions should use prepared inputs, direct construction calls and the package entry points instead.

ACCREU adaptation option name

The sector-specific ACCREU adaptation mode is now named sectoral instead of separate. Update existing configuration dictionaries and YAML files to use economics.damages.accreu.adaptation: sectoral. The behavior is unchanged; noadaptation and combined remain available. The old separate value is no longer accepted.

ACCREU adaptation now defaults to noadaptation. Select sectoral or combined explicitly to enable adaptation. Other ACCREU defaults are unchanged.

Configuration option locations

Options live beside their related scientific parameters. The ACCREU section remains flat, alongside mortality valuation, effectiveness scale and adaptation delay parameters. Module selectors stay under model structure. Defaults and supported values are unchanged.

Former path New path
model structure.damage module options.ACCREU_adaptation economics.damages.accreu.adaptation
model structure.damage module options.ACCREU_CBA_strategy economics.damages.accreu.cba_strategy
model structure.damage module options.ACCREU_adaptation_determination economics.damages.accreu.adaptation_determination
model structure.damage module options.ACCREU_adaptation_calibration economics.damages.accreu.adaptation_calibration
model structure.damage module options.ACCREU_monetise_mortality economics.damages.accreu.monetise_mortality
model structure.sealevelrise options.projection sealevelrise.projection

Update existing configuration dictionaries and YAML files to these paths. Old paths raise the normal obsolete-configuration error; they are not silently ignored or automatically translated.

Native parameter type

Use PyomoParam for component filtering, type checks and type annotations:

from mimosa.common import PyomoParam

parameters = list(m.component_objects(PyomoParam))

Continue using Param(...) to declare parameters. It is a factory rather than a class, so isinstance(parameter, Param) must be replaced with isinstance(parameter, PyomoParam). The constructed components themselves remain ordinary Pyomo parameters.

See Adding parameters and data for the declaration conventions.