ó žÃÒYc @sÜdZddlmZddlmZmZmZmZddlm Z m Z m Z m Z m Z mZmZmZmZddlmZmZmZddlmZmZddlmZdd d d d d ddddg Zde efd„ƒYZd e efd„ƒYZd e efd„ƒYZd e efd„ƒYZd e efd„ƒYZ d e efd„ƒYZ!de efd„ƒYZ"de efd„ƒYZ#de efd„ƒYZ$de efd„ƒYZ%dS(sMView of Graphs as SubGraph, Reverse, Directed, Undirected. In some algorithms it is convenient to temporarily morph a graph to exclude some nodes or edges. It should be better to do that via a view than to remove and then re-add. In other algorithms it is convenient to temporarily morph a graph to reverse directed edges, or treat a directed graph as undirected, etc. This module provides those graph views. The resulting views are essentially read-only graphs that report data from the orginal graph object. We provide three attributes related to the underlying graph object. G._graph : the parent graph used for looking up graph data. G.root_graph : the root graph of the potential chain of views. For example, if you have a subgraph of a reversed view of an edge_subgraph of a graph, this points to original graph. G.fresh_copy() : a method to return a null copy of the graph represented by the view. This is useful if you want to create a graph with the same data structure (directed/multi) as the current view. This is similar to G.root_graph.__class__() but reflects the fact that (Un)DirectedView could make the type of data structure different from the root_graph. Note: Since graphviews look like graphs, one can end up with view-of-view-of-view chains. Be careful with chains because they become very slow with about 15 nested views. For the common simple case of node induced subgraphs created from the graph class, we short-cut the chain by returning a subgraph of the original graph directly rather than a subgraph of a subgraph. We are careful not to disrupt any edge filter in the middle subgraph. In general, determining how to short-cut the chain is tricky and much harder with restricted_views than with induced subgraphs. Often it is easiest to use `.copy()` to avoid chains. iÿÿÿÿ(tMapping(tGraphtDiGrapht MultiGrapht MultiDiGraph( t ReadOnlyGrapht AtlasViewt AdjacencyViewtMultiAdjacencyViewt FilterAtlastFilterAdjacencytFilterMultiAdjacencytUnionAdjacencytUnionMultiAdjacency(t no_filtert show_nodest show_edges(t NetworkXErrortNetworkXNotImplemented(tnot_implemented_fortSubGrapht SubDiGrapht SubMultiGraphtSubMultiDiGrapht ReverseViewtMultiReverseViewt DiGraphViewtMultiDiGraphViewt GraphViewtMultiGraphViewcBseZeed„ZRS(cCsd||_|j|_||_||_|j|_t|j|ƒ|_t|j||ƒ|_dS(N( t_grapht root_grapht_NODE_OKt_EDGE_OKtgraphR t_nodeR t_adj(tselfR"t filter_nodet filter_edge((sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/classes/graphviews.pyt__init__Ds     (t__name__t __module__RR((((sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/classes/graphviews.pyRCscBseZeed„ZRS(cs¶||_||_x%t|jdƒr9|jj|_qW||_ˆ|_|j|_t|j|ƒ|_t|j |ˆƒ|_ t|j |‡fd†ƒ|_ |j |_ dS(NRcs ˆ||ƒS(N((tutv(R'(sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/classes/graphviews.pyt^s( RRthasattrR R!R"R R#R R$t_predt_succ(R%R"R&R'((R'sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/classes/graphviews.pyR(Qs      (R)R*RR((((sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/classes/graphviews.pyRPscBseZeed„ZRS(cCs‰||_||_x%t|jdƒr9|jj|_qW||_||_|j|_t|j|ƒ|_t|j ||ƒ|_ dS(NR( RRR.R R!R"R R#R R$(R%R"R&R'((sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/classes/graphviews.pyR(cs     (R)R*RR((((sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/classes/graphviews.pyRbscBseZeed„ZRS(cs¼||_||_x%t|jdƒr9|jj|_qW||_ˆ|_|j|_t|j|ƒ|_t}||j |ˆƒ|_ ||j |‡fd†ƒ|_ |j |_ dS(NRcsˆ|||ƒS(N((R+R,tk(R'(sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/classes/graphviews.pyR-€s( RRR.R R!R"R R#R R$R/R0(R%R"R&R'tFMA((R'sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/classes/graphviews.pyR(rs      (R)R*RR((((sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/classes/graphviews.pyRqscBseZd„ZRS(cCs›|jƒs!d}t|ƒ‚n||_||_x%t|jdƒrZ|jj|_q6W|j|_|j|_|j|_|j |_|j|_ dS(Ns#not implemented for undirected typeR( t is_directedRRRR.R"R#R/R$R0(R%R"tmsg((sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/classes/graphviews.pyR(…s       (R)R*R((((sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/classes/graphviews.pyR„scBseZd„ZRS(cCs›|jƒs!d}t|ƒ‚n||_||_x%t|jdƒrZ|jj|_q6W|j|_|j|_|j|_|j |_|j|_ dS(Ns#not implemented for undirected typeR( R3RRRR.R"R#R/R$R0(R%R"R4((sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/classes/graphviews.pyR(—s       (R)R*R((((sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/classes/graphviews.pyR–scBseZd„ZRS(cCsÂ|jƒr!d}t|ƒ‚n||_||_x%t|jdƒrZ|jj|_q6W|j|_|j|_|jƒrš|j|_|j |_ n|j |_|j |_ |j |_ dS(Ns'Wrong View class. Use MultiDiGraphView.R( t is_multigraphRRRR.R"R#R3R/R0R$(R%R"R4((sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/classes/graphviews.pyR(©s         (R)R*R((((sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/classes/graphviews.pyR¨scBseZd„ZRS(cCsÂ|jƒs!d}t|ƒ‚n||_||_x%t|jdƒrZ|jj|_q6W|j|_|j|_|jƒrš|j|_|j |_ n|j |_|j |_ |j |_ dS(Ns"Wrong View class. Use DiGraphView.R( R5RRRR.R"R#R3R/R0R$(R%R"R4((sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/classes/graphviews.pyR(½s         (R)R*R((((sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/classes/graphviews.pyR¼scBseZeZd„ZRS(cCs­|jƒr!d}t|ƒ‚n||_||_x%t|jdƒrZ|jj|_q6W|j|_|j|_|jƒr|j|j |j ƒ|_ n |j |_ dS(Ns%Wrong View class. Use MultiGraphView.R( R5RRRR.R"R#R3tUnionAdjR0R/R$(R%R"R4((sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/classes/graphviews.pyR(Ós      (R)R*R R6R((((sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/classes/graphviews.pyRÐscBseZeZd„ZRS(cCs­|jƒs!d}t|ƒ‚n||_||_x%t|jdƒrZ|jj|_q6W|j|_|j|_|jƒr|j|j |j ƒ|_ n |j |_ dS(Ns Wrong View class. Use GraphView.R( R5RRRR.R"R#R3R6R0R/R$(R%R"R4((sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/classes/graphviews.pyR(æs      (R)R*R R6R((((sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/classes/graphviews.pyRãsN(&t__doc__t collectionsRtnetworkx.classesRRRRtnetworkx.classes.coreviewsRRRRR R R R R tnetworkx.classes.filtersRRRtnetworkx.exceptionRRtnetworkx.utilsRt__all__RRRRRRRRRR(((sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/classes/graphviews.pyt/s("@