Skip to content

Commit d2113ae

Browse files
analyze/#8 analyzed bidirectional dij function
1 parent b62521b commit d2113ae

File tree

1 file changed

+119
-52
lines changed

1 file changed

+119
-52
lines changed

graphs/bi_directional_dijkstra.py

Lines changed: 119 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,34 @@
1717
import numpy as np
1818

1919

20+
flags = {
21+
1: False,
22+
2: False,
23+
3: False,
24+
4: False,
25+
5: False,
26+
6: False,
27+
7: False,
28+
8: False,
29+
9: False,
30+
10: False,
31+
11: False,
32+
12: False,
33+
13: False,
34+
14: False,
35+
15: False,
36+
16: False,
37+
17: False,
38+
18: False,
39+
19: False,
40+
20: False,
41+
21: False,
42+
22: False,
43+
23: False,
44+
24: False,
45+
}
46+
47+
2048
def bidirectional_dij(
2149
source: str, destination: str, graph_forward: dict, graph_backward: dict
2250
) -> int:
@@ -48,63 +76,96 @@ def bidirectional_dij(
4876
queue_forward.put((0, source))
4977
queue_backward.put((0, destination))
5078

51-
if source == destination:
79+
if source == destination: # ID: 1
80+
flags[1] = True
5281
return 0
53-
54-
while queue_forward and queue_backward:
55-
while not queue_forward.empty():
56-
_, v_fwd = queue_forward.get()
57-
58-
if v_fwd not in visited_forward:
82+
83+
else: # ID: 2
84+
flags[2] = True
85+
while queue_forward and queue_backward: # ID: 3
86+
flags[3] = True
87+
while not queue_forward.empty(): # ID: 4
88+
flags[4] = True
89+
_, v_fwd = queue_forward.get()
90+
91+
if v_fwd not in visited_forward: # ID: 5
92+
flags[5] = True
93+
break
94+
else: # ID: 6
95+
flags[6] = True
96+
continue
97+
else: # ID: 7
98+
flags[7] = True
5999
break
60-
else:
61-
break
62-
visited_forward.add(v_fwd)
63-
64-
while not queue_backward.empty():
65-
_, v_bwd = queue_backward.get()
66-
67-
if v_bwd not in visited_backward:
100+
visited_forward.add(v_fwd)
101+
102+
while not queue_backward.empty(): # ID: 8
103+
flags[8] = True
104+
_, v_bwd = queue_backward.get()
105+
106+
if v_bwd not in visited_backward: # ID: 9
107+
flags[9] = True
108+
break
109+
else: # ID: 10
110+
flags[10] = True
111+
continue
112+
else: # ID: 11
113+
flags[11] = True
68114
break
69-
else:
70-
break
71-
visited_backward.add(v_bwd)
72-
73-
# forward pass and relaxation
74-
for nxt_fwd, d_forward in graph_forward[v_fwd]:
75-
if nxt_fwd in visited_forward:
76-
continue
77-
old_cost_f = cst_fwd.get(nxt_fwd, np.inf)
78-
new_cost_f = cst_fwd[v_fwd] + d_forward
79-
if new_cost_f < old_cost_f:
80-
queue_forward.put((new_cost_f, nxt_fwd))
81-
cst_fwd[nxt_fwd] = new_cost_f
82-
parent_forward[nxt_fwd] = v_fwd
83-
if nxt_fwd in visited_backward:
84-
if cst_fwd[v_fwd] + d_forward + cst_bwd[nxt_fwd] < shortest_distance:
85-
shortest_distance = cst_fwd[v_fwd] + d_forward + cst_bwd[nxt_fwd]
86-
87-
# backward pass and relaxation
88-
for nxt_bwd, d_backward in graph_backward[v_bwd]:
89-
if nxt_bwd in visited_backward:
115+
visited_backward.add(v_bwd)
116+
117+
# forward pass and relaxation
118+
for nxt_fwd, d_forward in graph_forward[v_fwd]:
119+
if nxt_fwd in visited_forward: # ID: 12
120+
flags[12] = True
121+
continue
122+
else: # ID: 13
123+
flags[13] = True
124+
old_cost_f = cst_fwd.get(nxt_fwd, np.inf)
125+
new_cost_f = cst_fwd[v_fwd] + d_forward
126+
if new_cost_f < old_cost_f: # ID: 14
127+
flags[14] = True
128+
queue_forward.put((new_cost_f, nxt_fwd))
129+
cst_fwd[nxt_fwd] = new_cost_f
130+
parent_forward[nxt_fwd] = v_fwd
131+
if nxt_fwd in visited_backward: # ID: 15
132+
flags[15] = True
133+
if cst_fwd[v_fwd] + d_forward + cst_bwd[nxt_fwd] < shortest_distance: # ID: 16
134+
flags[16] = True
135+
shortest_distance = cst_fwd[v_fwd] + d_forward + cst_bwd[nxt_fwd]
136+
137+
# backward pass and relaxation
138+
for nxt_bwd, d_backward in graph_backward[v_bwd]:
139+
if nxt_bwd in visited_backward: # ID: 17
140+
flags[17] = True
141+
continue
142+
else: # ID: 18
143+
flags[18] = True
144+
old_cost_b = cst_bwd.get(nxt_bwd, np.inf)
145+
new_cost_b = cst_bwd[v_bwd] + d_backward
146+
if new_cost_b < old_cost_b: # ID: 19
147+
flags[19] = True
148+
queue_backward.put((new_cost_b, nxt_bwd))
149+
cst_bwd[nxt_bwd] = new_cost_b
150+
parent_backward[nxt_bwd] = v_bwd
151+
152+
if nxt_bwd in visited_forward: # ID: 20
153+
flags[20] = True
154+
if cst_bwd[v_bwd] + d_backward + cst_fwd[nxt_bwd] < shortest_distance: # ID: 21
155+
flags[21] = True
156+
shortest_distance = cst_bwd[v_bwd] + d_backward + cst_fwd[nxt_bwd]
157+
158+
if cst_fwd[v_fwd] + cst_bwd[v_bwd] >= shortest_distance: # ID: 22
159+
flags[22] = True
160+
break
161+
else: # ID: 23
162+
flags[23] = True
90163
continue
91-
old_cost_b = cst_bwd.get(nxt_bwd, np.inf)
92-
new_cost_b = cst_bwd[v_bwd] + d_backward
93-
if new_cost_b < old_cost_b:
94-
queue_backward.put((new_cost_b, nxt_bwd))
95-
cst_bwd[nxt_bwd] = new_cost_b
96-
parent_backward[nxt_bwd] = v_bwd
97164

98-
if nxt_bwd in visited_forward:
99-
if cst_bwd[v_bwd] + d_backward + cst_fwd[nxt_bwd] < shortest_distance:
100-
shortest_distance = cst_bwd[v_bwd] + d_backward + cst_fwd[nxt_bwd]
101-
102-
if cst_fwd[v_fwd] + cst_bwd[v_bwd] >= shortest_distance:
103-
break
104-
105-
if shortest_distance != np.inf:
106-
shortest_path_distance = shortest_distance
107-
return shortest_path_distance
165+
if shortest_distance != np.inf: # ID: 24
166+
flags[24] = True
167+
shortest_path_distance = shortest_distance
168+
return shortest_path_distance
108169

109170

110171
graph_fwd = {
@@ -128,3 +189,9 @@ def bidirectional_dij(
128189
import doctest
129190

130191
doctest.testmod()
192+
193+
print(flags)
194+
count = 0
195+
for flag in flags.values():
196+
if flag: count += 1
197+
print(f'Branch coverage: {count/24}')

0 commit comments

Comments
 (0)