1- # Copyright 2024 Zeppelin Bend Pty Ltd
1+ # Copyright 2025 Zeppelin Bend Pty Ltd
22# This Source Code Form is subject to the terms of the Mozilla Public
33# License, v. 2.0. If a copy of the MPL was not distributed with this
44# file, You can obtain one at https://mozilla.org/MPL/2.0/.
5- from collections .abc import Iterable
6- from typing import Collection , List , Generator , TypeVar , Dict
75
6+ from typing import Collection , List , Generator , TypeVar , Dict , Set
87
98from zepben .evolve import Switch , AuxiliaryEquipment , ProtectedSwitch
109from zepben .evolve .model .cim .iec61970 .base .core .conducting_equipment import ConductingEquipment
@@ -64,6 +63,7 @@ async def run(self,
6463 for feeder in head_equipment .feeders (self .network_state_operators ):
6564 self .network_state_operators .associate_energizing_feeder (feeder , lv_feeder )
6665
66+ # We can run from each LV feeder as we process them, as being associated with their energizing feeders is not a requirement of the trace.
6767 await self .run_with_feeders (lv_feeder .normal_head_terminal ,
6868 lv_feeder_start_points ,
6969 terminal_to_aux_equipment ,
@@ -77,7 +77,7 @@ async def run(self,
7777
7878 async def run_with_feeders (self ,
7979 terminal : Terminal ,
80- lv_feeder_start_points : Iterable [ConductingEquipment ],
80+ lv_feeder_start_points : Set [ConductingEquipment ],
8181 terminal_to_aux_equipment : Dict [Terminal , List [AuxiliaryEquipment ]],
8282 lv_feeders_to_assign : List [LvFeeder ]):
8383
@@ -89,12 +89,12 @@ async def run_with_feeders(self,
8989 if isinstance (start_ce , Switch ) and self .network_state_operators .is_open (start_ce ):
9090 self ._associate_equipment_with_containers (lv_feeders_to_assign , [start_ce ])
9191 else :
92- traversal = await self ._create_trace (terminal_to_aux_equipment , lv_feeder_start_points , lv_feeders_to_assign )
92+ traversal = self ._create_trace (terminal_to_aux_equipment , lv_feeder_start_points , lv_feeders_to_assign )
9393 await traversal .run (terminal , False )
9494
95- async def _create_trace (self ,
95+ def _create_trace (self ,
9696 terminal_to_aux_equipment : Dict [Terminal , List [AuxiliaryEquipment ]],
97- lv_feeder_start_points : Iterable [ConductingEquipment ],
97+ lv_feeder_start_points : Set [ConductingEquipment ],
9898 lv_feeders_to_assign : List [LvFeeder ]) -> NetworkTrace [T ]:
9999
100100 def _reached_hv (ce : ConductingEquipment ):
@@ -123,19 +123,18 @@ async def _process(self,
123123 found_lv_feeder : bool ,
124124 step_context : StepContext ,
125125 terminal_to_aux_equipment : Dict [Terminal , Collection [AuxiliaryEquipment ]],
126- lv_feeder_start_points : Iterable [ConductingEquipment ],
126+ lv_feeder_start_points : Set [ConductingEquipment ],
127127 lv_feeders_to_assign : List [LvFeeder ]):
128128
129129 if step_path .traced_internally and not step_context .is_start_item :
130130 return
131131
132132 if found_lv_feeder :
133- found_lv_feeders = self ._find_lv_feeders (step_path .to_equipment , lv_feeder_start_points )
133+ found_lv_feeders = list ( self ._find_lv_feeders (step_path .to_equipment , lv_feeder_start_points ) )
134134
135- energizing_feeders = list (self .network_state_operators .get_energizing_feeders (it ) for it in found_lv_feeders )
136-
137- for feeder_group in (lv_feeders_to_assign , found_lv_feeders ):
138- self ._feeder_energizes (feeder_group , energizing_feeders )
135+ for energizing_feeder in (self .network_state_operators .get_energizing_feeders (it ) for it in found_lv_feeders ):
136+ for feeder_group in (lv_feeders_to_assign , found_lv_feeders ):
137+ self ._feeder_energizes (feeder_group , energizing_feeder )
139138
140139 try :
141140 aux_equip_for_this_terminal = terminal_to_aux_equipment [step_path .to_terminal ]
@@ -148,7 +147,7 @@ async def _process(self,
148147 if isinstance (step_path .to_equipment , ProtectedSwitch ):
149148 self ._associate_relay_systems_with_containers (lv_feeders_to_assign , step_path .to_equipment )
150149
151- def _find_lv_feeders (self , ce : ConductingEquipment , lv_feeder_start_points : Iterable [ConductingEquipment ]) -> Generator [LvFeeder , None , None ]:
150+ def _find_lv_feeders (self , ce : ConductingEquipment , lv_feeder_start_points : Set [ConductingEquipment ]) -> Generator [LvFeeder , None , None ]:
152151 sites = list (ce .sites )
153152 if sites :
154153 for site in sites :
@@ -159,4 +158,4 @@ def _find_lv_feeders(self, ce: ConductingEquipment, lv_feeder_start_points: Iter
159158 yield feeder
160159
161160 def _lv_feeders_from_terminal (self , terminal : Terminal ) -> List [LvFeeder ]:
162- return terminal .conducting_equipment .lv_feeders (self .network_state_operators )
161+ return list ( terminal .conducting_equipment .lv_feeders (self .network_state_operators ) )
0 commit comments