@@ -288,24 +288,24 @@ def build_graph_model(self):
288288 tranformers_gnodes = set (list (itertools .chain (* tranformers )))
289289 # Evaluate r_grid
290290 for gnode in self .global_nodes :
291- # Finad all paths from current node to each source
291+ # Find all paths from current node to each source
292292 r_grids = {}
293293 for source in self .graph_source_nodes :
294294 try :
295295 simple_paths = nx .all_simple_paths (self .graph , gnode , source )
296+ for simple_path in simple_paths :
297+ # Iterate over each gnode of path
298+ for path_gnode in simple_path :
299+ # If bus is found update and break
300+ if path_gnode in bus_gnodes :
301+ r_grids [path_gnode ] = bus_gnodes [path_gnode ]
302+ break
303+ # If transformer is found break
304+ # Current gnode excluded from tranformer list for cases when gnode is upstream node of transformer
305+ if path_gnode in (tranformers_gnodes - set ([gnode ])):
306+ break
296307 except nx .NodeNotFound :
297308 continue
298- for simple_path in simple_paths :
299- # Iterate over each gnode of path
300- for path_gnode in simple_path :
301- # If bus is found update and break
302- if path_gnode in bus_gnodes :
303- r_grids [path_gnode ] = bus_gnodes [path_gnode ]
304- break
305- # If transformer is found break
306- # Current gnode excluded from tranformer list for cases when gnode is upstream node of transformer
307- if path_gnode in (tranformers_gnodes - set ([gnode ])):
308- break
309309 # If r_grids populated, find parallel resistance of all grids
310310 if r_grids :
311311 r_grids_array = np .array (list (r_grids .values ()))
@@ -341,11 +341,11 @@ def get_nodes_between_gnodes(self, gnode1, gnode2, ignore_disabled=True):
341341 # Search in a path from gnode1 to gnode2
342342 try :
343343 simple_paths = nx .all_simple_paths (graph , gnode1 , gnode2 )
344+ result = set (itertools .chain (* simple_paths ))
345+ return result
344346 except nx .NodeNotFound :
345347 return set ()
346- result = set (itertools .chain (* simple_paths ))
347- return result
348-
348+
349349 def get_upstream_nodes (self , ekey , source_node = None , ignore_disabled = True ):
350350 # Select graph
351351 if ignore_disabled :
@@ -392,25 +392,25 @@ def get_upstream_element(self, ekey, codes=None, ignore_disabled=True):
392392 for source in graph_source_nodes :
393393 try :
394394 simple_paths = nx .all_simple_paths (graph , gnodes [0 ], source )
395+ for path in map (nx .utils .pairwise , simple_paths ): # For all elements in path
396+ for e_pair in path :
397+ ekey_check = graph .edges [e_pair [0 ], e_pair [1 ]]['key' ]
398+ element_check = self .base_elements [ekey_check ]
399+ # Case 1 - 1 node load elements; break as cannot be upstream
400+ if set (e_pair ) & self .graph_sink_nodes :
401+ break
402+ # Case 2 - 1 node supply elements; no need to check if current element
403+ elif set (e_pair ) & graph_source_nodes :
404+ if (codes is None ) or (element_check .code in codes ):
405+ results [ekey_check ] = element_check
406+ break
407+ # Case 3 - 2+ node elements; check if same as current element
408+ elif not set (e_pair ).issubset (set (gnodes )):
409+ if (codes is None ) or (element_check .code in codes ):
410+ results [ekey_check ] = element_check
411+ break
395412 except nx .NodeNotFound :
396413 continue
397- for path in map (nx .utils .pairwise , simple_paths ): # For all elements in path
398- for e_pair in path :
399- ekey_check = graph .edges [e_pair [0 ], e_pair [1 ]]['key' ]
400- element_check = self .base_elements [ekey_check ]
401- # Case 1 - 1 node load elements; break as cannot be upstream
402- if set (e_pair ) & self .graph_sink_nodes :
403- break
404- # Case 2 - 1 node supply elements; no need to check if current element
405- elif set (e_pair ) & graph_source_nodes :
406- if (codes is None ) or (element_check .code in codes ):
407- results [ekey_check ] = element_check
408- break
409- # Case 3 - 2+ node elements; check if same as current element
410- elif not set (e_pair ).issubset (set (gnodes )):
411- if (codes is None ) or (element_check .code in codes ):
412- results [ekey_check ] = element_check
413- break
414414 return results
415415
416416 def get_downstream_element (self , ekey , codes = None , ignore_disabled = True ):
@@ -449,30 +449,30 @@ def get_downstream_element(self, ekey, codes=None, ignore_disabled=True):
449449 for start_gnode in start_gnodes :
450450 try :
451451 simple_paths = nx .all_simple_paths (graph , start_gnode , self .graph_sink_nodes )
452+ for path in map (nx .utils .pairwise , simple_paths ):
453+ path_it1 , path_it2 = itertools .tee (path , 2 )
454+ path_nodes = set (itertools .chain (* path_it1 ))
455+ # If path shares nodes with upstream skip path
456+ if not (path_nodes & upstream_nodes ):
457+ for e_pair in path_it2 :
458+ ekey_check = graph .edges [e_pair [0 ], e_pair [1 ]]['key' ]
459+ element_check = self .base_elements [ekey_check ]
460+ # Case 1 - 1 node source elements; break as cannot be downstream
461+ if set (e_pair ) & graph_source_nodes :
462+ break
463+ # Case 2 - 1 node load elements; no need to check if current element
464+ elif set (e_pair ) & self .graph_sink_nodes :
465+ if (codes is None ) or (element_check .code in codes ):
466+ results [ekey_check ] = element_check
467+ break
468+ # Case 3 - 2+ node elements; check if same as current element
469+ elif not set (e_pair ).issubset (set (gnodes )):
470+ # Add element and break path if <codes not specified> or <code matches>
471+ if (codes is None ) or (element_check .code in codes ):
472+ results [ekey_check ] = element_check
473+ break
452474 except nx .NodeNotFound :
453475 continue
454- for path in map (nx .utils .pairwise , simple_paths ):
455- path_it1 , path_it2 = itertools .tee (path , 2 )
456- path_nodes = set (itertools .chain (* path_it1 ))
457- # If path shares nodes with upstream skip path
458- if not (path_nodes & upstream_nodes ):
459- for e_pair in path_it2 :
460- ekey_check = graph .edges [e_pair [0 ], e_pair [1 ]]['key' ]
461- element_check = self .base_elements [ekey_check ]
462- # Case 1 - 1 node source elements; break as cannot be downstream
463- if set (e_pair ) & graph_source_nodes :
464- break
465- # Case 2 - 1 node load elements; no need to check if current element
466- elif set (e_pair ) & self .graph_sink_nodes :
467- if (codes is None ) or (element_check .code in codes ):
468- results [ekey_check ] = element_check
469- break
470- # Case 3 - 2+ node elements; check if same as current element
471- elif not set (e_pair ).issubset (set (gnodes )):
472- # Add element and break path if <codes not specified> or <code matches>
473- if (codes is None ) or (element_check .code in codes ):
474- results [ekey_check ] = element_check
475- break
476476 return results
477477
478478 def get_downstream_element_of_node (self , gnode , codes = None , ignore_disabled = True ):
0 commit comments