ATLAS Offline Software
Loading...
Searching...
No Matches
graphAlgs.py
Go to the documentation of this file.
1# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
2
3
5 """determine whether a digraph has a cycle"""
6
7 def __init__(self, G):
8 self.onStack = [False for i in range(G.V)]
9 self.marked = [False for i in range(G.V)]
10 self.edgeTo = [-1 for i in range(G.V)]
11 self.cycle_ = []
12
13 GV = G.V
14 for v in range(GV):
15 if not self.marked[v]:
16 self.dfs_(G, v)
17
18 def has_cycle(self):
19 return len(self.cycle_) > 0
20
21 def cycle(self):
22 return self.cycle_
23
24 def dfs_(self, G, v):
25 self.onStack[v] = True
26 self.marked[v] = True
27
28 for w in G.adj(v):
29 if self.cycle_: return
30 if not self.marked[w]:
31 self.edgeTo[w] = w
32 self.dfs_(G, w)
33 elif self.onStack[w]:
34 x = v
35 while x != w:
36 self.cycle_.append(x)
37 x = self.edgeTo(x)
38 self.cycle_.append(w)
39 self.cycle_.append(v)
40
41 self.onStack[v] = False
42
43
44
46 """Carry out a depth first traversal of a graph, noting the order
47 nodes are processed."""
48
49 def __init__(self, G, roots = []):
50 self.marked = [False for v in range(G.V)]
51 self.pre_ = []
52 self.post_ = []
53 self.reversePost_ = []
54
55 if not roots:
56 for v in range(G.V):
57 if not self.marked[v]:
58 self.dfs_(G, v)
59 else:
60 for v in roots:
61 if not self.marked[v]:
62 self.dfs_(G, v)
63
64 self.reversePost_ = self.post_[:]
65 self.reversePost_.reverse()
66
67 def pre(self): return self.pre_
68 def post(self): return self.post_
69 def reversePost(self): return self.reversePost_
70
71 def dfs_(self, G, v):
72 self.pre_.append(v)
73 self.marked[v] = True
74
75 for w in G.adj(v):
76 if not self.marked[w]:
77 self.dfs_(G, w)
78
79
80 self.post_.append(v)
81
82
84 """order the nodes of a digraph in topological (i.e. execution) order."""
85
86 def __init__(self, G, roots=[]):
87 self.marked = [False for i in range(G.V)]
88 self.order_ = []
89 cycleFinder = DirectedCycle(G)
90 if not cycleFinder.has_cycle():
91 dfs = DepthFirstOrder(G, roots)
92
93 # if all edges were reversed, this would be
94 # self.order = dfs.reversePost();
95 self.order_ = dfs.post()
96
97 def order(self):
98 return self.order_
99
100 def isDAG(self):
101 return len(self.order_) != 0
__init__(self, G, roots=[])
Definition graphAlgs.py:49
__init__(self, G, roots=[])
Definition graphAlgs.py:86