Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
Archivo: forest.py Proyecto: aaw/yaupon
    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
Ejemplo n.º 3
0
Archivo: forest.py Proyecto: aaw/yaupon
 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)
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
 def edges(self, source = None, target = None):
     for e in self.graph.edges(source=target, target=source):
         yield reverse_edge(e)