Powering Canada's Growth: methodology

This page describes what feeds the three production scenarios of the Powering Canada's Growth analysis and the conventions used to report them. It covers the data, the assumptions and the model settings that are in the scenarios; the history of how they were chosen is kept on the project branch, not here.


1. What the analysis does

The analysis quantifies the macroeconomic impact and return on investment of building out Canada's grid, by comparing the Canada Energy Regulator's Energy Futures 2026 (EF2026) Canada Net-zero scenario against Current Measures. The CER scenarios supply the energy pathway; MacroABM-CA, an agent-based macroeconomic model of Canada's ten provinces, supplies the economic response. Firms and households adjust on their own budgets and expectations, so the transition can appear as adjustment cost (idle capital, unemployment, regional divergence) or as a boost, rather than being assumed to be a departure from an optimal equilibrium.

The coupling is one-way and non-iterative: CER's published paths are fixed inputs and nothing flows back. Four channels carry them into the model:

  1. End-use energy demand sets each sector's energy intensity (fuel per unit of output), applied at annual linkage years and anchored to 2022.
  2. Quantity anchors hold realised firm and household energy purchases to CER's real path, so the intensity recipe cannot drift.
  3. Generation capacity floors the power sector's capital stock, turning the build-out into investment demand.
  4. Fuel and electricity prices replace the model's endogenous energy prices with CER's trajectories.

CER publishes no capital spend, so investment is derived inside the linkage (section 3).

CER EF2026 CSVs --> cer_data_processor.py --> linkage matrices (cer_data/)
                                                     |
                                                     v
              run_cer_linkage.py --> provincial MacroABM + firms.link()
                                                     |
                                                     v
              gdp_growth.json . simulation_shallow.h5 . production CSVs

Orchestration is linkage_cer_macroabm.py or scripts/cer_macroabm_runner.py -lp=<scenario dir>, run from the M3-linkages root. The macroABM-side driver is scripts/run_cer_linkage.py, which reuses the CIMS-linkage machinery in macroabm-ca.


2. Source data and mappings

2.1 CER inputs

The primary dataset is EF2026 end-use-demand-2026.csv (long format: scenario, region, sector, variable, year, PJ). Supply-side datasets under scripts/data/cer_supply/ provide electricity capacity, generation and interchange, hydrogen production, crude and natural-gas production, benchmark and end-use prices, and macro indicators. Aggregate rows (Total End-Use, Region == Canada) and the territories are excluded. Annual values are divided by the four model steps per year. PJ units pass through unconverted because the intensity method uses ratios between years.

When computing national shares from the supply files, sum the ten provinces rather than using the Canada rollup row.

2.2 Regions

The ten provinces map one to one (cer_macro_region_map.csv). Each Atlantic province reads its own CER demand file (linkage_data_per_province = true). Investment and capital intensity remain on CIMS regions, where the four Atlantic provinces share one aggregate, because the cost data has no finer resolution. Per-province data relies on the quantity-anchor floor of section 4.2 to handle near-zero base-year quantities.

2.3 Sectors and fuels

CER's four end-use sectors are each anchored to one CIMS-comparable industry in cer_macro_sector_map_2022.csv (Commercial to G, Industrial to C20, Residential to L, Transportation to H49), and the demand is then spread across each sector's constituent macro industries using gross-output-weighted shares from the transition-capital allocation table. Industrial demand lands on the full industrial group (B05 to C31T33), Commercial on the full service group, Transportation's freight share across H49 to H53, and Residential plus passenger transport on L. Every downstream quantity (energy intensity, investment, capital intensity, quantity anchors) inherits the spread, normalised per receiving industry by the activity it received.

Fuels map as Electricity to D, Natural Gas to B06, Coal to B05, and liquid fuels to C19.

Transport passenger and freight split (cer_transport_passenger_share.csv). CER's Transportation demand is divided into a passenger portion, which goes to the household proxy L, and a freight remainder, which is spread across the transport industries. For electricity the passenger share is scenario-specific and declines over time as freight electrifies: 1.00 in 2020 falling to 0.93 by 2050 under Current Measures and to 0.70 under Net-zero, interpolated linearly between those points. For other fuels the share is constant by region and fuel.

Because the freight portion is routed through the household channel rather than through transport firms, an increasing share of what the model books as household electricity purchases by 2050 is, in energy-system terms, freight consumption. Total provincial electricity demand follows CER exactly; only the attribution between households and transport firms carries this caveat, and scenario differences are unaffected because both scenarios share the routing.

Activity denominator. Energy intensity is fuel PJ divided by the total energy PJ received by the macro industry, since CER publishes no activity driver. It is not energy per unit of macro output.

Industry-specific energy trends. The spread sets each industry's share of its CER sector by base-year size, but each industry's fuel mix follows its own CIMS sector's modelled trend (scripts/data/cer_industry_energy_shape.csv, built by build_cims_industry_energy_shape.py from standalone CIMS runs, using the same industry map as the cost reference). The trend is applied in trajectory mode: each factor is normalised to 1.0 at the anchor year, so the base-year fuel mix stays the IO table's and only the evolution comes from CIMS. CER's pooled sector totals are conserved exactly by construction, and industry_energy_shape_cap = 2.0 bounds each industry's divergence from its own anchor. Two resolution limits are inherited from CIMS: eleven macro industries share its single Light Industrial sector, and the four Atlantic provinces share its aggregated Atlantic region shape (their CER levels remain per province).


3. The investment signal

CER publishes demand, not investment. Two constructions supply it.

End-use capital intensity. A CIMS technology-cost reference table gives dollars per unit of activity per sector, province and milestone year, using the CIMS-linkage formulas (new stock x capital cost / activity, and total stock x capital cost / activity) with forward and back-fill and cross-province fallbacks. The tables are per industry (cims_capital_cost_reference_industry_2022_{ref,nz}.csv, built by cer_technology_cost_reference.py with cer_technology_cost_map_industry_2022.csv): each industrial macro row is priced off its own CIMS sector (C24A off Iron and Steel, C23 off Industrial Minerals, C17_18 off Pulp and Paper, B06 off Natural Gas Production plus Petroleum Crude, and eleven rows sharing Light Industrial). A province that does not measurably host a sector (below 1 % of the series' cross-region activity) takes the activity-weighted average of the provinces that do. The tables are scenario-matched: Current Measures reads a table built from the CIMS Reference run, Net-zero from the CIMS Net Zero run. CER's own fuel-demand shares allocate each sector's intensity across fuel columns.

Power-sector investment. CER capacity additions multiplied by CIMS and NREL ATB technology costs (cer_generation_investment.py) give dollars by province and year. Because asset renewal and grid modernisation do not scale with capacity, the level does not reproduce observed utility capex, but the scenario difference does; it therefore enters as a ratio (cer_generation_investment_delta.py producing cer_generation_investment_multiplier.csv), applied multiplicatively to the capacity floor with generation_investment_multiplier = true.

Transition capital is a multiplicative uplift on end-use sectors' capital requirements, sized from CIMS switching costs. It prices the premium of the electric option over the incumbent, not the gross device cost: equipment turns over in both scenarios through ordinary depreciation-driven reinvestment, so the investment caused by electrification is the difference between the electric option and the replacement that would have happened anyway. The power sector is charged at gross by the same incremental logic, because capacity that exists in only one scenario is incremental in full. Three caveats: early retirement is not costed, negative premia are clipped to zero (savings from cheaper electric options are not credited), and complementary infrastructure such as panels, wiring and charging is not in CIMS device costs. The channel's anchor (transition_anchor_year) defaults to the first CIMS milestone at or after the intensity anchor.


4. Linkage channels

All settings below are in the three production configurations.

4.1 Intensity targets

firms.link(method="intensity_target") at annual linkage years (annual_linkage = true), with fuel-mix changes applied as additive share increments (additive_intensity = true), anchor year 2022 and reset_multipliers = true. linkage_owns_coefficients = true switches off the model's endogenous technical-growth process on every (industry, input) pair the linkage writes, so CER's embedded efficiency improvement is not counted twice.

4.2 Quantity anchors

firm_energy_quantities and household_energy_quantities make CER own the realised real energy purchases, not just the budget shares; household_energy_shares applies CER's residential fuel-share changes to household consumption weights. quantity_anchor_floor = 0.001: a fuel whose anchor-year quantity is below this share of its row's total energy is anchored by CER's level change instead of its growth ratio, which is well defined at a zero base.

4.3 What reaches households

Energy use reaches household agents directly. Residential and passenger transport demand is carried on the L row and applied to households through households.apply_energy_share_increments() (with a relative-price correction and the transmission-loss gross-up) and households.anchor_energy_quantities(). Electric-vehicle electricity therefore lands on households, not on the transport industry. firms.link() also writes the residential intensity onto the real-estate industry's input coefficients as a parallel representation of housing-stock energy, and firm_energy_quantities excludes the L row so that household demand is not anchored twice.

Fuel-switching investment does not reach households: households in this model have no investment instrument (no durables stock, no depreciation, no financing margin). Heat pumps and household vehicles are purchased by the real-estate sector L as capital formation, matched to the capital-goods industries (wiring and heat pumps to C27, vehicles to C29, retrofit construction to F), and the freight remainder by the transport industries. This keeps the GDP accounting clean, since the purchases are gross fixed capital formation, which is what the ROI's investment figures read.

4.4 Prices

exogenous_energy_prices = true pins the energy bundle's prices to CER's trajectories. Electricity (D) and refined products (C19) take CER end-use prices, averaged across end-use sectors at anchor-year demand weights (a Laspeyres index). Crude and gas (B06) take the Western Canadian Select benchmark shape, since crude dominates that industry's output value; the gas end-use price still drives demand-side quantities. Coal (B05) has no CER price series and stays endogenous. Energy prices are therefore scenario inputs, not results.

4.5 Export and production pins

The rest-of-world sector carries a frozen base-year demand composition, which would create phantom export markets under a scenario that changes the economy's shape. Three pins prevent that:

  • Fossil production and exports are exogenous (exogenous_fossil_production, export_demand_pinning): B05 and B06 follow CER's own production paths, with oil and gas blended by energy content.
  • Flat export pins on refined products (C19) and the non-tradeable services (F, G, L, O, P, Q): exports are held at the base-year desired level while production stays endogenous. Export-pinned industries are listed in both _FLAT_EXPORT_PINS (processor) and _PRODUCTION_TARGET_EXCLUDED (run_cims_linkage).
  • Import cap on electricity only (ImportLimits.sectors = ["D"], mode = "level"): imports are held at base-year volume, because cross-border transfer capacity does not grow with GDP.

4.6 Hydrogen leaves as electricity

CER's generation exceeds end-use demand plus interchange by the electrolysis load (hydrogen production x 33.3 kWh/kg, an accounting identity that CER's own generation includes). The linkage treats that wedge as electricity exported:

  1. Level: the rest-of-world electricity export index is CER's gross international exports plus national electrolysis (electricity_exports_include_electrolysis).
  2. Split: those purchases are routed to provinces by CER's own exports plus electrolysis shares, refreshed yearly (electricity_row_split), in strict mode (unfilled demand is withdrawn rather than pooled) with a damped signal of 0.25 booked as excess demand on the origin province's firms.
  3. Real-terms conversion for electricity only (set_real_terms_export_industries): the export budget is converted at electricity's own market price, because that price is pinned to CER's real path.

electricity_own_use and loss_share_of_generation = 0.05 apply own-use and transmission losses as a buyer-side gross-up.

4.7 Power-sector capacity

  • Floor (capacity_floor, per province): the power sector's reference capital stock is floored at CER's capacity path. With capacity_index_basis = "capacity" and capacity_factor_from_cer = true, capital tracks CER's MW build while a capacity-factor adjustment brings the output ceiling back to CER's generation, since a MW of wind is not a MW of gas.
  • Ceiling (capacity_ceiling_margin = 1.3): reference capital is capped at the floor times this margin.
  • Gate (capacity_gate_margin = 1.1, capacity_gate_provinces = "MB,QC"): a hard cap on target production at the CER generation path times the margin, for the two provinces whose output per unit of capital otherwise escapes upward. Gated province-sectors are inputs, not results, and are disclosed as such.

4.8 Value versus physical units

The model trades value at frozen base-year densities, so a province's dollars per MWh embed its base-year realised prices. Newfoundland and Labrador's electricity is valued at the 1969 Churchill Falls contract price ($27.8/MWh against $76.5 in Quebec and over $100 elsewhere), so NL is 6.4 % of 2022 physical generation but 1.8 % of electricity value. Provincial generation is presented in both views; the reporting-layer correction for NL is in section 8.4.


5. Data foundations: the 2022 base

The scenarios run on the 2022 provincial input-output table (OECD 50-sector scheme, folded from thirteen regions to ten provinces with the territories in the rest of world and the grand total preserved).

  • B06 merges crude and natural gas, because the OECD scheme has no split; CER pins use an energy-weighted blend (about 61:39 oil to gas in 2022). Coal is B05.
  • Emissions, methane and the output-based pricing system (OBPS) run on the same scheme: a value-weighted emission-factor blend for B06, the national methane inventory over national production, and an OBPS reference window equal to the first simulated year.
  • Households are built from Canadian microdata: Survey of Financial Security 2023 balance sheets, Canadian Income Survey 2022 income, Survey of Household Spending 2023 consumption and Canadian Housing Survey 2022 tenure, in Canadian dollars, with base-year unemployment calibrated to each province's Labour Force Survey 2022 mean. The model carries about 17.8 million households against Canada's 15.5 million, so aggregate household levels are about 15 % overstated.
  • The pinned population is io2022_10prov_2022_v2_pumf_built-2026-08-18.pkl. Its base year must equal sim_start_year (2022); the wrapper enforces this.
  • Provincial macro series, tax rates, investment splits and labour data come from the Statistics Canada readers in canadian_inputs/, using effective rather than statutory tax rates and five-year pooled windows (see dependencies/macroabm-ca/docs/provincial_raw_data.md).

6. The policy environment

Policies are generated from the shared policies.csv assumptions database and delivered through the linkage prehook. All of the following are on in the production scenarios.

  • Investment tax credit schedule: the legislated phase-downs. Clean Technology 30 % falling to 15 % in 2034 and then to zero; Clean Electricity ending in 2035; carbon capture 50 % falling to 25 % over 2036 to 2040 and then to zero; Alberta's ACCIP adding 12 percentage points. Credits accrue to the power sector through apply_investment_tax_credit, a production-subsidy-rate channel that gets the dollar value right with approximate incidence.
  • Provincial OBPS stringency (obps_provincial_stringency): each province's own tightening rate, start year and reduction and assistance factors. Tightening stops in 2030 as legislated under Current Measures; the Net-zero configuration extends it to 2050 (obps_tightening_extend = 2050), which is CER's own reading of its Net-zero scenario.
  • Quebec at the Western Climate Initiative price (obps_wci_price): Quebec is cap-and-trade, so the observed WCI settlement (about CAD 40/t in 2026), escalating at the reserve floor of about 5 %/yr real, replaces the federal $170/t path. Quebec's consumer-side carbon price on distributed fuels is captured implicitly through CER's Quebec end-use prices and demand paths.
  • Household transfers and firm grants: rebate programs and large grants enter as quarterly cash (household deposits and spending; deposits to the target industries), debt-financed, so the debt stock carries the programs while the deficit flow series does not show them. Ontario's electric-vehicle package goes to C29; the Smart Renewables and Electrification Pathways program goes to the power sector by clean-capacity share.
  • No OBPS revenue recycling: industrial carbon cost is a pure wedge, a conservative assumption for the Net-zero case.
  • Industrial carbon price: the OBPS charges the legislated $170/t nominal. CER's Net-zero scenario embeds a much higher effective industrial carbon cost in its industrial gas price, but on the 2022 scheme that series pins no seller price, so the model under-prices industrial carbon relative to CER's own assumption, again a conservative direction.
  • The proposed Oil and Gas Emissions Cap is excluded, consistent with CER's own cut-off rule for Current Measures.

The policy settings move fiscal flows and margins rather than real output, because Net-zero real quantities are pinned to CER; they determine the defensibility of the result rather than its size.


7. Major projects

One assumptions table (major_projects.csv, public figures) is expanded by cer_major_projects.py into the following inputs.

  • Capital-expenditure floors (project_capex): a west-coast pipeline at $39.5 billion (Alberta and British Columbia 25:75, 2028 to 2034) and the Prince Rupert Gas Transmission line at $11 billion, as capacity floors on the pipeline-transport industry H49. They compose additively with the CER floor.
  • Pathways Alliance credits (project_credits): $16.5 billion of eligible capex x 0.85 x the carbon-capture credit and ACCIP rates, about $8.7 billion into Alberta oil and gas, Net-zero only.
  • Net-zero LNG completion (nz_lng_completion, Net-zero only): Current Measures already contains both hypothetical British Columbia LNG projects (48 million tonnes per year) while Net-zero carries one (33), so the second is restored as a derived gas-production series at CER's own feedgas ratio.
  • Pathways capture wedge (project_capture, Net-zero only): captured CO2e ramping over 2029 to 2032 to 16 Mt/yr and held (a placeholder schedule) is subtracted only in the OBPS cost expression. The baseline reference window and the 50 kt coverage threshold stay gross.
  • Churchill Falls repricing (project_transfers, both scenarios, since it is signed policy): the 2026 Definitive Agreement's repricing of existing Churchill output enters as an external cash schedule to Newfoundland and Labrador, $1 billion/yr in 2026 rising to $3 billion/yr by 2041 (a placeholder pending the binding agreements; about $59 billion cumulative), 10 % to households as the rate rebate and 90 % to NL's power-sector firms, with Hydro-Quebec debited by the same schedule so that the government nets to zero. The transfer delivers income, not GDP; it is quoted in the NL benefit accounting (section 8.4), not as a macro driver.
  • Deliberately not included: a crude-production uplift for the pipeline (CER already assumes unconstrained egress), Wind West under Current Measures (not a current measure), and LNG facility capex (already implied by the production paths).

The Net-zero scenario's Nova Scotia and Newfoundland wind and hydrogen build is CER scenario content. The real-world project pipeline behind it weakened materially in 2026; results in those provinces that lean on the hydrogen build should carry that disclosure.


8. Calibration and reporting conventions

8.1 Calibration settings

  • Growth driver: autonomous household demand per head grows at 0.75 %/yr (household_demand_growth = 0.0075), compounded with each province's labour-force index (household_demand_from_labour_force = true). Total factor productivity is held at calibration constants (tfp_base_growth_rate = 0.001, tfp_investment_effectiveness = 0.01).
  • Labour supply: per-province working-age population paths from Statistics Canada table 17-10-0057-01 (projection M1, ages 15 to 64, 2025 to 2050) plus 0.25 percentage points, ranging from +1.58 %/yr in Alberta to slightly negative in Quebec and Newfoundland and Labrador. Current Measures uses the same construction. No provincial labour-force caps are applied.
  • Capital-adjustment speed: CandidateCapitalRule.target_capital_inputs_fraction is 0.15 in the Net-zero scenario and the preset 0.10 in Current Measures and the status-quo leg. This is the "investment climate" assumption of the enabling package. Read as the quarterly coefficient of a flexible accelerator, 0.10 closes 34 % of a capital gap per year and 0.15 closes 48 %, against empirical estimates of roughly 22 to 40 %/yr; the Net-zero value sits at the fast edge of the evidence. It is the single largest documented sensitivity of the grid ROI.
  • Price regime: price_setting_speed_gf = 0.5, price_setting_noise_std = 0.01, national_inflation_expectation = true. These runs cannot speak to inflation in either direction; real comparisons are valid because both scenarios share the regime.
  • Run plumbing: trim_agent_history = 4 and save_shallow_h5 only, which is what makes a 2050 horizon feasible in memory.

8.2 The core run

The three production scenarios are CER Current Measures 2022io CORE, CER Net-zero 2022io CORE and CER Net-zero 2022io CORE status quo (the Net-zero energy pathway with the enabling-package levers removed). Random seed 4 is the designated core run. Its purpose is a feasibility demonstration, not a forecast: a coherent pathway in which the transition, properly enabled, raises GDP. The headline ROI is the return on grid investment conditional on the enabling package and is quoted with the transition-alone figure from the status-quo leg beside it. Reproduction of the production runs from their configurations is bit-identical.

8.3 The ROI convention

scripts/cer_arup_roi.py computes gross value added unlocked (all sectors, volume basis: real production x 2022 value-added ratios) over incremental power-sector investment, cumulative over 2026 to 2050, with base year and simulation start 2022:

python scripts/cer_arup_roi.py --nz <NZ shallow.h5> --cm <CM shallow.h5> \
    --sim-start-year 2022 --base-year 2022 --start 2026 --end 2050
  • The GDP-gap figure and the ROI and GVA figures are on different bases (nominal gap versus volume); check the basis before placing two numbers in one table.
  • cer_totex.py adds the incremental operating-cost half of a total-expenditure denominator. The denominator must be incremental like the numerator, and end-use fuel savings must not be both netted from the denominator and added to the numerator.
  • The model's GDP series are quarterly flows; annualise by multiplying by four. Percentages, ratios and windowed sums are unaffected.

8.4 The Newfoundland and Labrador view

Because NL's base valuation embeds the Churchill Falls contract price, its ROI reads low on the standard basis while its capex is full cost. scripts/cer_nl_density_view.py restates NL's incremental electricity output at the density implied by repricing Churchill's 30 TWh at about $59/MWh, and the NL benefit accounting also counts the modelled Churchill contract income. This is an NL-only view and is never summed into the national total.


9. Validation

  • Electricity tracks CER. Sector-D output over 2022 to 2050 grows in line with CER generation in both scenarios, within a few percent under Net-zero and somewhat short under Current Measures, where part of the gap is CER's rising real electricity price, which a quantity index does not carry. End-use energy is aligned in shape with CER.
  • Macro level. The model's growth level runs below CER's own macro assumption; this is a disclosed assumption, not a calibration target, and results are quoted as differences between scenarios. Net-zero diverges upward from Current Measures by design, since CER's framework takes GDP as given and modelling the transition effect is the point of the project. Prices run cooler than CER's 2 % inflation world.
  • Investment benchmark. Transition-only incremental investment is of the same order as the Trottier Institute's NATEM estimates and about a quarter lower in total, with electricity investment higher and buildings investment nearly absent by deliberate scope (section 10).

10. Standing limitations and disclosures

  1. The growth rate is an assumption (demand per head x labour-force path). Present results as differences between scenarios.
  2. Provincial labour demand is national, which is why provincial unemployment is seed-dependent. Per-province labour demand and migration is the top open model item.
  3. No feedback to CER: the economy cannot alter the energy pathway.
  4. Building envelope upgrades are out of scope. The assessment covers investments that are grid-related or directly tied to electrification; insulation, windows and deep retrofits are efficiency investments and are not represented. This is the main reason buildings investment reads far below whole-pathway studies. The fuel-switching equipment premium for buildings is priced through transition capital.
  5. No OBPS revenue recycling, stated wherever affected numbers are used.
  6. Inflation: backward-looking expectations with no anchor; the runs cannot speak to inflation.
  7. Emissions: fuel inputs x inventory factors plus process factors; carbon capture is represented only through the OBPS capture wedge (no methane split, no capture energy penalty, no credit trading).
  8. Placeholder schedules: the Pathways capture ramp and the Churchill payment profile are placeholders until the binding agreements publish.
  9. Prince Edward Island's high terminal unemployment is structural in every scenario (its population path against a tiny labour market); Newfoundland and Labrador and Quebec at zero likewise (shrinking supply meeting the build).
  10. Provincial export shares to the rest of the world are not published. The national and provincial export totals are stable, but the split across (province, industry) cells is the model's residual allocation and varies with the random seed.
  11. CER EF2026's modelling cut-off is late 2025; later developments in interchange and export rights are not reflected, and the CER capacity vintage is kept as published.