ó ŸÃÒYc@s dZddlmZddlmZmZddlmZddlZ dddd d d gZ d Z ye Wne k reZ eZnXed ddƒd„ƒZedddƒd„ƒZd„Zed„Zddd„Zddd„Zd„Zd„ZdS(sa ***** Pydot ***** Import and export NetworkX graphs in Graphviz dot format using pydot. Either this module or nx_agraph can be used to interface with graphviz. See Also -------- pydot: https://github.com/erocarrera/pydot Graphviz: http://www.research.att.com/sw/tools/graphviz/ DOT Language: http://www.graphviz.org/doc/info/lang.html iÿÿÿÿ(tgetpreferredencoding(t open_filetmake_str(t parse_versionNt write_dottread_dottgraphviz_layoutt pydot_layouttto_pydott from_pydots1.2.3itmodetwcCs#t|ƒ}|j|jƒƒdS(sgWrite NetworkX graph G to Graphviz dot format on path. Path can be a string or a file handle. N(Rtwritet to_string(tGtpathtP((so/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/drawing/nx_pydot.pyR0s itrcCs2tƒ}|jƒ}|j|ƒ}t|dƒS(sBReturn a NetworkX :class:`MultiGraph` or :class:`MultiDiGraph` from the dot file with the passed path. If this file contains multiple graphs, only the first such graph is returned. All graphs _except_ the first are silently ignored. Parameters ---------- path : str or file Filename or file handle. Returns ------- G : MultiGraph or MultiDiGraph A :class:`MultiGraph` or :class:`MultiDiGraph`. Notes ----- Use `G = nx.Graph(read_dot(path))` to return a :class:`Graph` instead of a :class:`MultiGraph`. i(t _import_pydottreadtgraph_from_dot_dataR (RtpydottdatatP_list((so/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/drawing/nx_pydot.pyR;s  cCsˆ|jdƒrt}nt}|jƒdkrT|rEtjƒ}qutjƒ}n!|ritjƒ}n tj ƒ}|j ƒj dƒ}|dkr¢||_ nxQ|j ƒD]C}|j ƒj dƒ}|d krÜq¯n|j||jƒq¯Wx|jƒD]}|jƒ}|jƒ}|jƒ} g} g} t|tƒra| j|j dƒƒn+x(|dD]} | j| j dƒƒqlWt|tƒr´| j|j dƒƒn+x(|dD]} | j| j dƒƒq¿Wx2| D]*}x!| D]}|j||| qóWqæWqW|jƒ}|r:||jd>> K5 = nx.complete_graph(5) >>> A = nx.nx_pydot.to_pydot(K5) >>> G = nx.nx_pydot.from_pydot(A) # return MultiGraph # make a Graph instead of MultiGraph >>> G = nx.Graph(nx.nx_pydot.from_pydot(A)) tgrapht"ttnodetedgetnodesiN(snodesgraphsedge(t get_stricttNonetFalsetTruetget_typetnxt MultiGraphtGrapht MultiDiGraphtDiGraphtget_nametstriptnamet get_node_listtadd_nodetget_attributest get_edge_listt get_sourcetget_destinationt isinstancet basestringtappendtadd_edgeRtget_node_defaultstget_edge_defaults(Rt multiedgestNR*tptntetutvtattrtstdtunodestvnodest source_nodetdestination_nodetpattr((so/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/drawing/nx_pydot.pyR \s^           cCswtƒ}|jƒrd}nd}tj|ƒdkoC|jƒ }|j}|jjdiƒ}|dkr‘|jdd|d||}n"|jd|d|d||}y|j |jdWnt k rÞnXy|j |jd Wnt k r nXxa|j d t ƒD]M\}}td „|jƒDƒƒ} |jt|ƒ| } |j| ƒqW|jƒrxõ|jd t d t ƒD]h\} } } }td „|jƒDƒƒ}|jt| ƒt| ƒdt| ƒ|}|j|ƒq”Wnpxm|jd t ƒD]Y\} } }td„|jƒDƒƒ}|jt| ƒt| ƒ|}|j|ƒqW|S(sReturn a pydot graph from a NetworkX graph N. Parameters ---------- N : NetworkX graph A graph created with NetworkX Examples -------- >>> K5 = nx.complete_graph(5) >>> P = nx.nx_pydot.to_pydot(K5) Notes ----- tdigraphRiRt graph_typetstricts"%s"RRRcss'|]\}}|t|ƒfVqdS(N(R(t.0tkR=((so/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/drawing/nx_pydot.pys âstkeyscss3|])\}}|dkr|t|ƒfVqdS(tkeyN(R(RIRJR=((so/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/drawing/nx_pydot.pys èsRLcss'|]\}}|t|ƒfVqdS(N(R(RIRJR=((so/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/drawing/nx_pydot.pys ïs(Rt is_directedR#tnumber_of_selfloopst is_multigraphR*RtgettDottset_node_defaultstKeyErrortset_edge_defaultsRR!tdicttitemstNodeRR,tedgestEdgeR4(R8RHRRGR*tgraph_defaultsRR:tnodedatat str_nodedataR9R<R=RLtedgedatat str_edgedataR((so/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/drawing/nx_pydot.pyR¶sF   "       +"!tneatocKstd|d|d||S(sICreate node positions using Pydot and Graphviz. Returns a dictionary of positions keyed by node. Examples -------- >>> G = nx.complete_graph(4) >>> pos = nx.nx_pydot.graphviz_layout(G) >>> pos = nx.nx_pydot.graphviz_layout(G, prog='dot') Notes ----- This is a wrapper for pydot_layout. Rtprogtroot(R(RR`Ratkwds((so/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/drawing/nx_pydot.pyRõscKs‚tƒ}t|ƒ}|d k r:|jdt|ƒƒn|jd|ƒ}t|dtƒƒ}|dkr—d|GHdGHdGHdGHdGHd |GHd S|j|ƒ}t |ƒd ks¾t ‚|d } i} x­|j ƒD]Ÿ} |j t| ƒƒj ƒ} | j| ƒ} t| tƒr'| d } n| jƒd d !}|d k rÛ|jdƒ\}}t|ƒt|ƒf| | >> G = nx.complete_graph(4) >>> pos = nx.nx_pydot.pydot_layout(G) >>> pos = nx.nx_pydot.pydot_layout(G, prog='dot') RaR`tencodingRsGraphviz layout with %s failedsTo debug what happened try:sP = nx.nx_pydot.to_pydot(G)sP.write_dot("file.dot")sAnd then run %s on file.dotNiiiÿÿÿÿt,((RRRtsetRt create_dottunicodeRRtlentAssertionErrorRRWR(tget_nodeR1tlisttget_postsplittfloat(RR`RaRbRRtD_bytestDtQ_listtQtnode_posR:t pydot_nodeRtpostxxtyy((so/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/drawing/nx_pydot.pyR s8         #cCsGddl}t|jƒttƒkrCtd|jtfƒ‚n|S(sƒ Import and return the `pydot` module if the currently installed version of this module satisfies NetworkX requirements _or_ raise an exception. Returns -------- :mod:`pydot` Imported `pydot` module object. Raises -------- ImportError If the `pydot` module is either unimportable _or_ importable but of insufficient version. iÿÿÿÿNs pydot %s < %s(RRt __version__tPYDOT_VERSION_MINt ImportError(R((so/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/drawing/nx_pydot.pyRKs  cCs?ddlm}y tƒSWntk r:|dƒ‚nXdS(Niÿÿÿÿ(tSkipTestspydot not available(tnoseR{RRz(tmoduleR{((so/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/drawing/nx_pydot.pyt setup_moduleks   (t__doc__tlocaleRtnetworkx.utilsRRt pkg_resourcesRtnetworkxR#t__all__RyR2t NameErrortstrRgRRR R!RRRRRR~(((so/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/drawing/nx_pydot.pyts(       ! Z ?@