Skip to content

Commit 1c0e864

Browse files
committed
Update orient_uncertain_edge for PAG to fix bug
Signed-off-by: Adam Li <adam2392@gmail.com>
1 parent f33cc91 commit 1c0e864

File tree

1 file changed

+22
-2
lines changed

1 file changed

+22
-2
lines changed

pywhy_graphs/classes/pag.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,28 @@ def orient_uncertain_edge(self, u: Node, v: Node) -> None:
122122
if not self.has_edge(u, v, self.circle_edge_name):
123123
raise RuntimeError(f"There is no uncertain circular edge between {u} and {v}.")
124124

125-
self.remove_edge(u, v, self.circle_edge_name)
126-
self.add_edge(u, v, self.directed_edge_name)
125+
# Performs orientation of edges
126+
if self.has_edge(v, u, self.directed_edge_name):
127+
# Orients: u <-o v => u <-> v
128+
# when we orient (u,v) now as an arrowhead, it is a bidirected arrow
129+
self.remove_edge(v, u, self.directed_edge_name)
130+
self.remove_edge(u, v, self.circle_edge_name)
131+
self.add_edge(u, v, self.bidirected_edge_name)
132+
elif self.has_edge(v, u, self.circle_edge_name):
133+
# Orients: u o-o v => u o-> v
134+
# In this case, we have a bidirected circle edge
135+
# we only need to remove the circle edge and orient
136+
# it as a normal edge
137+
self.remove_edge(u, v, self.circle_edge_name)
138+
self.add_edge(u, v, self.directed_edge_name)
139+
elif self.has_edge(u, v, self.circle_edge_name):
140+
# In this case, we have a circle edge that is oriented into an arrowhead
141+
# we only need to remove the circle edge and orient
142+
# it as a normal edge
143+
self.remove_edge(u, v, self.circle_edge_name)
144+
self.add_edge(u, v, self.directed_edge_name)
145+
else: # noqa
146+
raise RuntimeError("The current PAG is invalid.")
127147

128148
def possible_children(self, n: Node) -> Iterator:
129149
"""Return an iterator over children of node n.

0 commit comments

Comments
 (0)