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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions