
    \Mh'                        d Z ddlmZ ddlZddlmZ g dZ edd          d	             Z edd
           ej	        ddd          d                         Z
 ej	        dd          d             Zd ZddZddZdS )a  
*****
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.

Examples
--------
>>> G = nx.complete_graph(5)
>>> PG = nx.nx_pydot.to_pydot(G)
>>> H = nx.nx_pydot.from_pydot(PG)

See Also
--------
 - pydot:         https://github.com/erocarrera/pydot
 - Graphviz:      https://www.graphviz.org
 - DOT Language:  http://www.graphviz.org/doc/info/lang.html
    )getpreferredencodingN)	open_file)	write_dotread_dotgraphviz_layoutpydot_layoutto_pydot
from_pydot   w)modec                 r    t          |           }|                    |                                           dS )zWrite NetworkX graph G to Graphviz dot format on path.

    Parameters
    ----------
    G : NetworkX graph

    path : string or file
       Filename or file handle for data output.
       Filenames ending in .gz or .bz2 will be compressed.
    N)r	   write	to_string)GpathPs      Y/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/networkx/drawing/nx_pydot.pyr   r   &   s.     	AJJq{{}}
F    rpydot_read_dotT)namegraphsreturns_graphc                     ddl }|                                 }|                    |          }t          |d                   S )a  Returns 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 to read.
        Filenames ending in .gz or .bz2 will be decompressed.

    Returns
    -------
    G : MultiGraph or MultiDiGraph
        A :class:`MultiGraph` or :class:`MultiDiGraph`.

    Notes
    -----
    Use `G = nx.Graph(nx.nx_pydot.read_dot(path))` to return a :class:`Graph` instead of a
    :class:`MultiGraph`.
    r   N)pydotreadgraph_from_dot_datar
   )r   r   dataP_lists       r   r   r   7   sC    2 LLL99;;D &&t,,F fQi   r   )r   r   c                 Z   	 |                                  }n%# t          $ r |                      d          }Y nw xY w| }|                                 dk    r*|rt          j                    }n=t          j                    }n)|rt          j                    }nt          j                    }|                                 	                    d          }|dk    r||_
        |                                 D ]N}|                                	                    d          }|dv r. |j        |fi |                                 O|                                 D ]>}|                                }|                                }	|                                }
g }g }t#          |t$                    r)|                    |	                    d                     n3|d         D ]*}|                    |	                    d                     +t#          |	t$                    r)|                    |		                    d                     n3|	d         D ]*}|                    |	                    d                     +|D ]}|D ]} |j        ||fi |
 @|                                 }|r
||j        d<   	 |                                 d         |j        d<   n# t.          t          f$ r Y nw xY w	 |                                 d         |j        d	<   n# t.          t          f$ r Y nw xY w|S )
a  Returns a NetworkX graph from a Pydot graph.

    Parameters
    ----------
    P : Pydot graph
      A graph created with Pydot

    Returns
    -------
    G : NetworkX multigraph
        A MultiGraph or MultiDiGraph.

    Examples
    --------
    >>> 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))

    Ngraph" )noder"   edgenodesr   r%   r&   )
get_strict	TypeErrorget_typenx
MultiGraphGraphMultiDiGraphDiGraphget_namestripr   get_node_listadd_nodeget_attributesget_edge_list
get_sourceget_destination
isinstancestrappendadd_edger"   get_node_defaults
IndexErrorget_edge_defaults)r   strict
multiedgesNr   pneuvattrsdunodesvnodessource_nodedestination_nodepattrs                     r   r
   r
   [   sj   4$ $ $ $d##$Jzz||w 	AA

AA 	!!AA
A ::<<c""Drzz __ , ,JJLLs##)))
1++((**++++ __ B BLLNN!!a 	,HHQWWS\\""""G* , ,c**++++a 	,HHQWWS\\""""G* , ,c**++++ 	B 	BK$% B B 
;(8AADAAAAB	B
 E ! --//2	"   --//2	"   Hs0    996"K K-,K-1"L L('L(c                    ddl }|                                 rd}nd}t          j        |           dk    o|                                  }| j        }| j                            di           }|dk    r |j        d||d|}n |j        d| df||d|}	  |j	        di | j        d          n# t          $ r Y nw xY w	  |j        di | j        d	          n# t          $ r Y nw xY w|                     d
          D ]U\  }}d |                                D             }	t          |          } |j        |fi |	}
|                    |
           V|                                 r|                     d
d
          D ]v\  }}}}d |                                D             }t          |          t          |          }} |j        ||fdt          |          i|}|                    |           wn}|                     d
          D ]f\  }}}d |                                D             }t          |          t          |          }} |j        ||fi |}|                    |           g|S )a  Returns 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
    -----

    r   Ndigraphr"   r$   )
graph_typer?   r#   r%   r&   T)r   c                 N    i | ]"\  }}t          |          t          |          #S  r9   .0krF   s      r   
<dictcomp>zto_pydot.<locals>.<dictcomp>   s*    DDD41aAADDDr   )r   keysc                 Z    i | ](\  }}|d k    t          |          t          |          )S )keyrT   rU   s      r   rX   zto_pydot.<locals>.<dictcomp>   s0    VVVtq!1PU::CFFCFF:::r   r[   c                 N    i | ]"\  }}t          |          t          |          #S rS   rT   rU   s      r   rX   zto_pydot.<locals>.<dictcomp>   s*    HHHtq!CFFCFFHHHr   )r$   rS   )r   is_directedr+   number_of_selfloopsis_multigraphr   r"   getDotset_node_defaultsKeyErrorset_edge_defaultsr'   itemsr9   Noder3   edgesEdger;   )rA   r   rQ   r?   r   graph_defaultsr   rC   nodedatastr_nodedatarB   rE   rF   r[   edgedatastr_edgedatar&   s                    r   r	   r	      s   " LLL 	}} 


#A&&!+EAOO4E4E0EF6DW[["--NrzzEIQZQQ.QQEIKKK
$.v
 
AO
 
..agfo....   ..agfo....    wwDw))  8DD8>>3C3CDDDFFEJq))L))	

1 #$7747#@#@ 	 	Aq#xVVx~~7G7GVVVLq663q66qA5:aAACALAADJJt		  gg4g00 	 	NAq(HHx~~7G7GHHHLq663q66qA5:a33l33DJJtHs$   B3 3
C ?C C 
C*)C*neatoc                 &    t          | ||          S )a=  Create node positions using Pydot and Graphviz.

    Returns a dictionary of positions keyed by node.

    Parameters
    ----------
    G : NetworkX Graph
        The graph for which the layout is computed.
    prog : string (default: 'neato')
        The name of the GraphViz program to use for layout.
        Options depend on GraphViz version but may include:
        'dot', 'twopi', 'fdp', 'sfdp', 'circo'
    root : Node from G or None (default: None)
        The node of G from which to start some layout algorithms.

    Returns
    -------
      Dictionary of (x, y) 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.
    r   progroot)r   rp   s      r   r   r      s    < !$T2222r   c                    ddl }t          |           }|#|                    dt          |                     |                    |          }t          |t                                }|dk    rct          d| d           t                       t          d	           t          d
           t          d           t          d| d           dS |                    |          }t          |          dk    sJ |d         }i }	| 	                                D ]}
t          |
          }|
                    |                    |                    }t          |t                    r|d         }|                                dd         }|9|                    d          \  }}t!          |          t!          |          f|	|
<   |	S )a  Create node positions using :mod:`pydot` and Graphviz.

    Parameters
    ----------
    G : Graph
        NetworkX graph to be laid out.
    prog : string  (default: 'neato')
        Name of the GraphViz command to use for layout.
        Options depend on GraphViz version but may include:
        'dot', 'twopi', 'fdp', 'sfdp', 'circo'
    root : Node from G or None (default: None)
        The node of G from which to start some layout algorithms.

    Returns
    -------
    dict
        Dictionary of positions keyed by node.

    Examples
    --------
    >>> G = nx.complete_graph(4)
    >>> pos = nx.nx_pydot.pydot_layout(G)
    >>> pos = nx.nx_pydot.pydot_layout(G, prog="dot")

    Notes
    -----
    If you use complex node objects, they may have the same string
    representation and GraphViz could treat them as the same node.
    The layout may assign both nodes a single location. See Issue #1568
    If this occurs in your case, consider relabeling the nodes just
    for the layout computation using something similar to::

        H = nx.convert_node_labels_to_integers(G, label_attribute="node_label")
        H_layout = nx.nx_pydot.pydot_layout(H, prog="dot")
        G_layout = {H.nodes[n]["node_label"]: p for n, p in H_layout.items()}

    r   Nrr   )rq   )encodingr$   zGraphviz layout with z failedzTo debug what happened try:zP = nx.nx_pydot.to_pydot(G)zP.write_dot("file.dot")zAnd then run z on file.dotr   ,)r   r	   setr9   
create_dotr   printr   lenr'   get_nodequote_id_if_necessaryr8   listget_possplitfloat)r   rq   rr   r   r   D_bytesDQ_listQnode_posrC   str_nr%   posxxyys                   r   r   r     s   L LLLA	fc$ii    lll%%G 	G244555ABww3d333444+,,,+,,,'(((0d000111 &&q))Fv;;! 	q	AHWWYY 	1 	1Azz%55e<<==dD!! 	7DllnnQrT"?YYs^^FB 99eBii0HQKOr   )rn   N)__doc__localer   networkxr+   networkx.utilsr   __all__r   _dispatchabler   r
   r	   r   r   rS   r   r   <module>r      sE   , ( ' ' ' ' '     $ $ $ $ $ $   13    13'DIII! ! JI !D T222Z Z 32Zz> > >B3 3 3 3BN N N N N Nr   