@@ -122,8 +122,28 @@ def orient_uncertain_edge(self, u: Node, v: Node) -> None:
122
122
if not self .has_edge (u , v , self .circle_edge_name ):
123
123
raise RuntimeError (f"There is no uncertain circular edge between { u } and { v } ." )
124
124
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." )
127
147
128
148
def possible_children (self , n : Node ) -> Iterator :
129
149
"""Return an iterator over children of node n.
0 commit comments