Skip to content

Network templater should map IASR timeslices to region-tagged PLEXOS timeslices using destination/origin rule #109

Description

@nick-gorman

Background

The IASR-derived transmission templater (src/ispypsa/templater/transmission.py) produces region-agnostic timeslices on flow-path limits — peak_demand, summer_typical, winter_reference — paired with a direction of forward / reverse.

The PLEXOS model, by contrast, attaches region-prefixed timeslice tags to Line properties: "NSW Hot Day", "QLD Typical Summer", "VIC Winter", etc. For intra-region paths the right region is obvious, but for inter-regional paths the mapping isn't.

What the PLEXOS model actually does

Investigation in notes/line_timeslice_poke.py (walks every Line object in the AEMO Draft 2026 ISP Step Change PLEXOS XML and tabulates the tag-region on Max Flow vs Min Flow) found a clean, zero-exception rule:

  • Max Flow (forward, positive limit) carries the destination region's timeslice tag.
  • Min Flow (reverse, negative limit) carries the origin region's timeslice tag.

This makes physical sense: the seasonal demand condition that constrains the limit is in the receiving region — that's where load tightens the import limit. The rule is symmetric, so reversing direction flips the tag region.

The same rule holds for Max Capacity Reserves / Min Capacity Reserves. Intra-region paths collapse to the single shared region, which is what the existing code already implicitly assumes.

Per-line evidence (all 18 Lines in the AEMO model)

Line from -> to MaxFlow tag region MinFlow tag region
EnergyConnect SNSW -> CSA SA NSW
Marinus TAS -> SEV VIC TAS
N-Q-MNSP1 NNSW -> SQ QLD NSW
NSW1-QLD1 NNSW -> SQ QLD NSW
T-V-MNSP1 TAS -> SEV VIC TAS
VIC1-NSW1 WNV -> SNSW NSW VIC
V-SA WNV -> SESA SA VIC
V-S-MNSP1 WNV -> CSA SA VIC
(intra-region lines) ... (single region) (same region)

Required change

The network templater (_template_network_transmission and helpers in src/ispypsa/templater/transmission.py) should produce timeslices that follow this destination/origin rule, so downstream code can match against PLEXOS tags without ambiguity. Concretely, the mapping is:

IASR side PLEXOS-style timeslice
(forward, peak_demand) on path X-Y "<region(Y)> Hot Day"
(forward, summer_typical) "<region(Y)> Typical Summer"
(forward, winter_reference) "<region(Y)> Winter"
(reverse, peak_demand) "<region(X)> Hot Day"
(reverse, summer_typical) "<region(X)> Typical Summer"
(reverse, winter_reference) "<region(X)> Winter"

Where region(X) / region(Y) are the NEM regions of the path's geo_from / geo_to endpoints (so the templater needs a sub-region -> NEM-region lookup at the point where it builds the timeslice column — sub_regional_geography already carries that mapping).

References

  • Investigation script: notes/line_timeslice_poke.py
  • Current templater output: src/ispypsa/templater/transmission.py (_extract_flow_path_limits, _extract_rez_limits)
  • PLEXOS-side timeslice tags as seen on extracted custom constraints: src/ispypsa/templater/plexos/7.5/rhs_values.csv

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions