Terminal conditions in G-Cubed
G-Cubed offers an opt-in equilibrium terminal closure alongside the original legacy calculation. A terminal closure specifies how the model treats the future beyond the last year it explicitly projects. The new option continues the solved, linearised model under declared assumptions about exogenous inputs and calibration constants. The default remains legacy.
Why the economy needs a future beyond the last projection year
The last projection year is a computational boundary, not the end of economic life. A factory installed near that date still produces afterwards. Households still receive income, and assets still have value. Forward-looking decisions today therefore depend on what is assumed to happen after the reported path.
For example, an asset price reflects both the income it pays next year and its resale value. Omitting the resale value merely because a spreadsheet ends can distort today’s price and investment. A terminal closure supplies the missing continuation. Its effects can reach years well before the endpoint.
Two distinctions matter. State variables, such as inherited capital and asset positions, carry the history of the economy into each year. Jump variables, such as forward-looking valuations, can respond immediately to news about future income or policy. The closure must value the future consistently with inherited states; it cannot simply start the economy afresh at the terminal date.
What the two methods assume
| Choice | Treatment of the boundary | Economic interpretation |
|---|---|---|
legacy | Uses the original terminal matrices, the final exogenous vector and terminal adjustments to initialise the backward projection calculation. | Retains the historical endpoint approximation and supports comparison with earlier runs. It does not apply the new explicit post-horizon trend assumptions. |
equilibrium with constant | Solves a continuation of the converged projection equations with exogenous working coordinates held at their final values, except for explicit overrides. | The final exogenous environment persists, while the economy continues to adjust according to the solved model. |
equilibrium with linear | Uses the same continuation but repeats each exogenous coordinate’s final annual increment, except for explicit overrides. | Trends in the final two observations continue indefinitely. This is a stronger economic assumption than retaining final values. |
The legacy calculation treats the terminal corrections to jump and expected variables as stationary in its endpoint subsystem. It does not impose stationarity on every endogenous variable or zero growth on the economy.
Even with constant, the two methods need not agree: they calculate the boundary differently. The new calculation jointly continues the complete forward-looking intercepts, including the effects of state-equation constants, and respects their configured decay. An intercept here is the part of a solved variable’s value attributable to exogenous inputs and calibration adjustments, alongside its dependence on inherited states.
The new closure retains the model’s solved state transition and the rules linking jump variables to states. It does not require capital, foreign assets, wealth or government debt to be zero, or Tobin’s q to equal one in the final year. Investment, valuation and budget relationships remain those of the solved model. Nor does it require all variables to have reached a steady state by the endpoint.
For the reference region, the implementation retains the model’s REXC(reference_region) = 0 working-coordinate normalization when that coordinate is a jump variable. This fixes the reference currency coordinate; it is not an additional restriction on real wealth or debt. The solver checks that the existing state-dependent rule already respects that normalization.
Explicit YAML choices
Put these settings in the build’s model_configuration.yaml, under its existing projections mapping. They are model-wide settings, not entries in setup.yaml, baseline_design.yaml or an experiment design. These are partial configuration examples: retain the model identity and all other required settings, and do not introduce a second projections key.
Lock in the new closure with constant exogenous inputs
projections:
terminal_closure:
method: equilibrium
exogenous_tail: constant
Writing method and exogenous_tail makes the selected closure and tail explicit. annual_changes is optional and defaults to an empty mapping (no overrides), so it is omitted here. method: equilibrium alone currently selects the same settings.
Switch back to the original terminal calculation
Replace the terminal-closure mapping with the following, removing any previous annual_changes overrides:
projections:
terminal_closure:
method: legacy
exogenous_tail: constant
Also restore any other economic assumptions changed for the comparison, such as constants_decay_rate, if the aim is to reproduce an earlier run. Removing terminal_closure entirely currently selects legacy too, but explicit settings record the intended choice. An empty mapping also selects the defaults. Old cached configurations without these settings retain legacy behaviour; editing YAML does not update an already loaded object.
Available settings
The entire terminal_closure mapping is optional, as is every setting below. Omitting the mapping selects method: legacy, exogenous_tail: constant and no annual-change overrides. Within a supplied mapping, each omitted setting takes its own default. The separate constants_decay_rate setting is also optional.
| YAML path | Required? | Allowed values and default | Meaning |
|---|---|---|---|
projections.terminal_closure.method | No | legacy (default), equilibrium | Selects the original endpoint calculation or the new continuation. |
projections.terminal_closure.exogenous_tail | No | constant (default), linear | Sets the post-horizon rule for exogenous working coordinates without explicit overrides. linear requires equilibrium and at least two exogenous observations. |
projections.terminal_closure.annual_changes | No | Mapping of selectors to finite YAML numbers; default {} | Sets explicit annual increments in exogenous adjustment-file units. A nonempty mapping requires equilibrium. |
projections.constants_decay_rate | No | Number at least 0 and less than 1; default 0.0 | Existing model-wide annual decay rate for combined projection constants. The equilibrium closure continues this decay beyond the endpoint. It is outside terminal_closure. |
annual_changes defaults to {}, meaning that every exogenous variable follows exogenous_tail. Include it only when specifying overrides; the examples omit it when there are none.
Unknown fields and unsupported choices are errors. null, quoted numerical increments, booleans used as increments, non-finite numbers and empty selectors are invalid. A selector must match an exogenous variable in the selected model; it cannot impose a terminal path on an endogenous variable. legacy with linear or nonempty annual_changes is rejected, rather than ignoring them.
Choosing the economic continuation
Let T be years.last_projection. The tail describes years after T, not after years.last_publishable_projection. It leaves supplied exogenous observations through T intact, although changed expectations can alter endogenous outcomes throughout the projection.
Constant means constant in model working coordinates. These are the numbers used internally in the solved equations, which can represent logs, rates or scaled levels. If an exogenous variable is a growth rate of 2%, holding that rate constant allows the associated quantity to keep growing. It does not set growth to zero. Conversely, holding a logged productivity level constant means no further growth of that productivity level.
For a linear tail, the program takes the difference between years T and T−1 in those working coordinates and repeats it:
constant: x(T+h) = x(T)
linear: x(T+h) = x(T) + h × [x(T) − x(T−1)]
Thus a rate increasing from 2.0% to 2.1% would keep increasing by 0.1 percentage point each year under a linear continuation. That is not constant 2.1% growth. Equal annual increments in a logged level, in contrast, correspond to constant proportional growth of the underlying level.
To select the automatic linear rule explicitly:
projections:
terminal_closure:
method: equilibrium
exogenous_tail: linear
This extends every final exogenous increment, including any final-year policy adjustment. Use it only if that is the intended long-run assumption. A constant tail with selected explicit increments often makes the individual economic assumptions easier to inspect.
Selected annual changes and their units
projections:
terminal_closure:
method: equilibrium
exogenous_tail: constant
annual_changes:
SHEF: 1.4
"SHEF(a01,USA)": 1.0
This illustrates selector syntax, not a prescribed efficiency assumption. Use names present in your model. A bare prefix such as SHEF selects all its exogenous members. The qualified name overrides that prefix for one variable, regardless of YAML order. Other variables follow exogenous_tail. An explicit zero holds a selected coordinate constant even when the general tail is linear. Each explicit increment applies every year after T, starting from the actual value at T.
Numbers use the same conventions as baseline exogenous adjustment files. They are not raw increments to the internal variable and are not uniformly percentage growth rates. The conversion is:
working annual increment = configured annual change × GDP-ratio scaling factor / 100
The scaling factor is evaluated at the original first projection year. If it is one, 1.4 becomes 0.014 in working coordinates. For a logged efficiency level this is about 1.4% annual growth (exactly exp(0.014) − 1); for a rate coordinate it is an additive change in the rate. Check the selected variable’s adjustment convention before assigning an economic interpretation. The automatic linear difference is already in working coordinates and is not converted again.
Calibration constants also have an economic future
Combined projection constants comprise reconciliation differences between the linear representation and calibration data, plus solved intertemporal adjustments that align initial projections with their targets. Keeping these adjustments forever or allowing them to disappear changes the long-run economy, even if the exogenous path is unchanged.
For example, to make persistence explicit alongside the new closure:
projections:
constants_decay_rate: 0.0
terminal_closure:
method: equilibrium
exogenous_tail: constant
A decay rate of 0.0 retains the constants indefinitely. A rate of 0.02 retains 98% of the preceding year’s amount each year. The equilibrium tail continues that same decay from the amount remaining at T. This setting also affects the years within the horizon; it does not decay model parameters or exogenous adjustments. Increasing decay simply to obtain a smoother path would change the economic assumptions.
How the continuation works, without a matrix derivation
After solving the model, the backward calculation relates this year’s forward-looking intercepts to next year’s intercepts, this year’s exogenous inputs and this year’s combined constants. The equilibrium closure finds a path satisfying that same relation beyond T: a constant or steadily changing component driven by exogenous inputs, plus the configured decaying component.
It supplies the implied intercepts for T+1, then lets the ordinary backward calculation process T and earlier years. Full projections, first-year anchoring calculations and the perturbations used to find intertemporal constants share this boundary calculation. Changed scenario paths supply their own final values and, for linear, final increments.
The continuation must be uniquely determined and compatible with the model’s reference normalization. If a variable combination remains undetermined, or the backward equations contain an explosive or undamped oscillating component, the new method fails with an explanation. It does not invent a debt target, discard an equation or alter a root to obtain a result. Apart from supported reference unit modes, all roots of the backward recurrence must be strictly inside the unit circle. These checks are not additional YAML tuning options, and solution.unit_root_tolerance is not their control.
Applying and assessing a change
- Record the chosen method, tail, overrides and constants-decay rate in the model configuration. Keep the exogenous history and other assumptions fixed when comparing terminal methods.
- Run with a newly loaded configuration and rebuild baseline projections and their intertemporal constants. In maintained run scripts that reuse a solved-model file, set
FORCE_MODEL_TO_RESOLVE = Truefor the changed configuration so the old embedded configuration is not reused. A report-only run cannot apply the change. Rerun dependent experiments too. - Compare a longer horizon using the same economic continuation, with intertemporal constants recalculated at each horizon. Earlier years should be insensitive to where the computational endpoint is placed. Extending the horizon while changing the exogenous continuation is a different economic experiment.
- Check initial targets, investment and capital accumulation, asset and government budgets, reference normalization, and residuals in the original model equations. Finite, smooth results alone are insufficient.
The option is an affine continuation of the solved linearised model, not a new nonlinear balanced-growth calibration or a general proof of solvency. It preserves the model’s economic relationships in that solved representation; accuracy against the original equations still needs checking. As recorded in the 24 September 2026 implementation assessment, the 22AEPR/200 test removed terminal overflow and passed same-tail horizon checks, but substantial nonlinear investment discrepancies remained. Production activation for that baseline was deferred. Enabling the option is therefore a declared modelling choice, not evidence that a baseline has been economically validated.
G-Cubed