
    ިsgw%                         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y)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                 X    t        |       }|j                  |j                                y)zgWrite NetworkX graph G to Graphviz dot format on path.

    Path can be a string or a file handle.
    N)r	   write	to_string)GpathPs      L/var/www/html/venv/lib/python3.12/site-packages/networkx/drawing/nx_pydot.pyr   r   &   s"     	AJJq{{}
    rpydot_read_dotT)namegraphsreturns_graphc                 h    ddl }| j                         }|j                  |      }t        |d         S )aO  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.

    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   1   s5    0 99;D &&t,F fQi  r   )r   r   c                 r   | j                  d      rd}nd}| j                         dk(  r,|rt        j                         }n@t        j                         }n+|rt        j
                         }nt        j                         }| j                         j                  d      }|dk7  r||_	        | j                         D ]G  }|j                         j                  d      }|dv r' |j                  |fi |j                          I | j                         D ]  }|j                         }|j                         }|j                         }	g }
g }t!        |t"              r!|
j%                  |j                  d             n*|d   D ]"  }|
j%                  |j                  d             $ t!        |t"              r!|j%                  |j                  d             n*|d   D ]"  }|j%                  |j                  d             $ |
D ]  }|D ]  } |j&                  ||fi |	    | j                         }|r||j(                  d<   	 | j+                         d	   |j(                  d
<   	 | j1                         d	   |j(                  d<   |S # t,        t.        f$ r Y 4w xY w# t,        t.        f$ r Y |S w xY w)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))

    NFTgraph" )noder"   edgenodesr   r%   r&   )
get_strict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	TypeErrorget_edge_defaults)r   
multiedgesNr   pneuvattrsdunodesvnodessource_nodedestination_nodepattrs                    r   r
   r
   T   s   2 	||D

zz|wA
A!A

A ::<c"Drz __ ,JJLs#))

1+((*+	, __ BLLN!aHHQWWS\"G* ,c*+, aHHQWWS\"G* ,c*+,  	BK$% B 

;(8ADAB	B'B0 E --/2--/2 H 	"  	" Hs$    J , J# J J #J65J6c           	         ddl }| j                         rd}nd}t        j                  |       dk(  xr | j	                          }| j
                  }| j                  j                  di       }|dk(  r |j                  d||d|}n |j                  d| df||d|}	  |j                  di | j                  d    	  |j                  di | j                  d	    | j                  d
      D ]i  \  }}|j                         D 	
ci c]  \  }	}
t        |	      t        |
       }}	}
t        |      } |j                  |fi |}|j!                  |       k | j	                         r| j#                  d
d
      D ]  \  }}
}}|j                         D 	
ci c]   \  }	}
|	dk7  st        |	      t        |
      " }}	}
t        |      t        
      }
} |j$                  ||
fdt        |      i|}|j'                  |        |S | j#                  d
      D ]v  \  }}
}|j                         D 	
ci c]  \  }	}
t        |	      t        |
       }}	}
t        |      t        
      }
} |j$                  ||
fi |}|j'                  |       x |S # t        $ r Y w xY w# t        $ r Y w xY wc c}
}	w c c}
}	w c c}
}	w )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_typestrictr#   r%   r&   T)r   )r   keyskey)r$    )r   is_directedr*   number_of_selfloopsis_multigraphr   r"   getDotset_node_defaultsKeyErrorset_edge_defaultsr'   itemsr8   Noder2   edgesEdger:   )r@   r   rP   rQ   r   graph_defaultsr   rB   nodedatakrE   str_nodedatarA   rD   rS   edgedatastr_edgedatar&   s                     r   r	   r	      s   "  	}}

##A&!+EAOO4E0EF66DWW[["-NrzEIIQZQ.QEIIvQK
$.v
AO
.aggfo..aggfo. wwDw) 83;>>3CD41aAADDFEJJq)L)	

1	 	#$7747#@ 	Aq#x7?~~7GVtq!1PU:CFCFNVLVq63q6qA5::aACALADJJt		 H  gg4g0 	NAq(7?~~7GHtq!CFCFNHLHq63q6qA5::a3l3DJJt		
 H5     E W Is<   #J J- J=K,K<K		J*)J*-	J:9J:c                     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   rh   s      r   r   r      s    < !$T22r   c                    ddl }t        |       }||j                  dt        |             |j	                  |      }t        |t                     }|dk(  rJt        d| d       t                t        d	       t        d
       t        d       t        d| d       y|j                  |      }t        |      dk(  sJ |d   }i }	| j                         D ]  }
t        |
      }|j                  |j                  |            }t        |t              r|d   }|j                         dd }|Y|j                  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   Nrj   )ri   )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	   setr8   
create_dotr   printr   lenr'   get_nodequote_id_if_necessaryr7   listget_possplitfloat)r   ri   rj   r   r   D_bytesDQ_listQnode_posrB   str_nr%   posxxyys                   r   r   r     s]   L A	fc$i  lll%G 	G245ABw%dV734+,+,'(dV<01 &&q)Fv;! 	q	AHWWY 	1Azz%55e<=dD!7DllnQr"?YYs^FB 9eBi0HQK	1 Or   )neatoN)__doc__localer   networkxr*   networkx.utilsr   __all__r   _dispatchabler   r
   r	   r   r   rT   r   r   <module>r      s   , (  $ 13  13'DI! J !B T2X 3Xv>B3BNr   