ó žÃÒYc@s7dZdZdZdgZd„Zddd„ZdS(s“ =========================== Depth First Search on Edges =========================== Algorithms for a depth-first traversal of edges in a graph. tforwardtreversetedge_dfscsÁˆjƒo|dk‰ˆjƒo-|dk‰ˆrH‡fd†}n!ˆr`‡fd†}n ˆj}ˆsuˆrd„}n!ˆjƒr™d„}n d„}‡‡fd†}|||fS( s“ These are various G-specific functions that help us implement the algorithm for all graph types: graph, multigraph, directed or not. tignoreRc;sVx&ˆj||D]}|tfVqWx&ˆj||D]}|tfVq<WdS(N(t out_edgestFORWARDtin_edgestREVERSE(tutkwdstedge(tG(s{/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/traversal/edgedfs.pyRsc;s-x&ˆj||D]}|tfVqWdS(N(RR(RR R (R (s{/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/traversal/edgedfs.pyR!scSs|d S(Niÿÿÿÿ((R ((s{/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/traversal/edgedfs.pytkey/scSs|S(N((R ((s{/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/traversal/edgedfs.pyR 4scSst|d ƒf|d}|S(Ni(t frozenset(R tnew_edge((s{/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/traversal/edgedfs.pyR 8scsSˆs ˆr4|dtkr4|d|d}}n|d|d}}||fS(sÐ Returns the tail and head of an edge, as it was traversed. So in general, this is different from the true tail and head. (Also, undirected edges have no true tail or head.) iÿÿÿÿii(R(R ttailthead(tignore_orientationtreverse_orientation(s{/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/traversal/edgedfs.pyttraversed_tailhead<s(t is_directedtedges(R t orientationRR R((R RRs{/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/traversal/edgedfs.pyt helper_funcss      toriginalccsZt|j|ƒƒ}|s$t‚nitd6}|jƒrJt|d>> import networkx as nx >>> nodes = [0, 1, 2, 3] >>> edges = [(0, 1), (1, 0), (1, 0), (2, 1), (3, 1)] >>> list(nx.edge_dfs(nx.Graph(edges), nodes)) [(0, 1), (1, 2), (1, 3)] >>> list(nx.edge_dfs(nx.DiGraph(edges), nodes)) [(0, 1), (1, 0), (2, 1), (3, 1)] >>> list(nx.edge_dfs(nx.MultiGraph(edges), nodes)) [(0, 1, 0), (1, 0, 1), (0, 1, 2), (1, 2, 0), (1, 3, 0)] >>> list(nx.edge_dfs(nx.MultiDiGraph(edges), nodes)) [(0, 1, 0), (1, 0, 0), (1, 0, 1), (2, 1, 0), (3, 1, 0)] >>> list(nx.edge_dfs(nx.DiGraph(edges), nodes, orientation='ignore')) [(0, 1, 'forward'), (1, 0, 'forward'), (2, 1, 'reverse'), (3, 1, 'reverse')] >>> list(nx.edge_dfs(nx.MultiDiGraph(edges), nodes, orientation='ignore')) [(0, 1, 0, 'forward'), (1, 0, 0, 'forward'), (1, 0, 1, 'reverse'), (2, 1, 0, 'reverse'), (3, 1, 0, 'reverse')] Notes ----- The goal of this function is to visit edges. It differs from the more familiar depth-first traversal of nodes, as provided by :func:`networkx.algorithms.traversal.depth_first_search.dfs_edges`, in that it does not stop once every node has been visited. In a directed graph with edges [(0, 1), (1, 2), (2, 1)], the edge (2, 1) would not be visited if not for the functionality provided by this function. See Also -------- dfs_edges tdatatkeysiÿÿÿÿiN( tlistt nbunch_itert StopIterationtFalset is_multigraphtTrueRtsettitertaddtnexttpoptappend(R tsourceRtnodesR RR ttailheadt visited_edgest visited_nodesRt start_nodetstackt current_nodeR tedge_key((s{/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/traversal/edgedfs.pyRLs4K               N(t__doc__RRt__all__RtNoneR(((s{/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/traversal/edgedfs.pyts   =