def edges(self, source=None, target=None): if source is None and target is None: for e in self.graph.edges(): yield e #TODO: still think it might be a good idea to # yield reverse_edge(e) here, since if you # really wanted distinct edges, you could # always get them from any call to edges # by just filtering distinct edges elif source is not None and target is not None: for e in self.graph.edges(source=source, target=target): yield e if source != target: for e in self.graph.edges(source=target, target=source): yield reverse_edge(e) elif source is not None: for e in self.graph.edges(source=source): yield e if source != target: for e in self.graph.edges(target=source): yield reverse_edge(e) else: for e in self.graph.edges(target=target): yield e if source != target: for e in self.graph.edges(source=target): yield reverse_edge(e)
def path(self, source, target): if source == target: return starting_source, starting_target = source, target vertices_seen = set([source, target]) s_iter = self.__parent_edge.get(source) t_iter = self.__parent_edge.get(target) s_path, t_path = [], [] while s_iter != t_iter: if s_iter is not None: s_path.append(s_iter) source = other_vertex(s_iter, source) if source in vertices_seen: break vertices_seen.add(source) s_iter = self.__parent_edge.get(source) if t_iter is not None: t_path.append(t_iter) target = other_vertex(t_iter, target) if target in vertices_seen: break vertices_seen.add(target) t_iter = self.__parent_edge.get(target) if s_iter is None and t_iter is None: raise NoPathExistsError if source == starting_target or source == target: for edge in s_path: yield reverse_edge(edge) if target == starting_source or source == target: for edge in reversed(t_path): yield edge
def reroot(self, v): current_node = v deferred_edges = list() while self.__parent_edge[current_node] is not None: parent_edge = self.__parent_edge[current_node] self.split(current_node) deferred_edges.append(reverse_edge(parent_edge)) current_node = other_vertex(parent_edge, current_node) for edge in deferred_edges: self.add_edge(*edge)
def __call__(self, **kwargs): if self.tree_type == "from_source": v = kwargs["target"] else: v = kwargs["source"] # TODO: simplify this mess edges = [] while self.tree.get(v) is not None: edges.append(self.tree[v]) v = other_vertex(self.tree[v], v) if self.tree_type == "from_source": for e in reversed(edges): yield e else: for e in edges: yield reverse_edge(e)
def edges(self, source = None, target = None): for e in self.graph.edges(source=target, target=source): yield reverse_edge(e)