o
    e                     @   s
  d dl Z d dlmZ d dlZd dlmZmZmZ d dlZd dl	m
Z
mZmZmZ ddddd	Zd
diZeeegejf ZdedefddZdedefddZd!dede
defddZ				d"dedee dedee dedejfddZd#ddZed kre  dS dS )$    N)defaultdict)
ModelProto
GraphProto	NodeProto)AnyCallableOptionalDictboxz#0F9D58Zfilledz#FFFFFF)shapecolorstyleZ	fontcolorr   Zoctagonnamereturnc                 C   s
   t | S )N)jsondumps)r    r   ED:\Projects\ConvertPro\env\Lib\site-packages\onnx/tools/net_drawer.py_escape_label#   s   
r   sc                 C   s4   d}|t | dddddd7 }|d7 }|S )Nzjavascript:alert("'< >))r   replace)r   urlr   r   r   _form_and_sanitize_docstring(   s   $r   Fembed_docstringkwargsc                    s"   dt dtdtjf fdd}|S )Nopop_idr   c                    s   | j rd| j | j|f }nd| j|f }t| jD ]\}}|dt| d | 7 }qt| jD ]\}}|dt| d | 7 }q/tj|fi } rUt| j	}|
| |S )Nz%s/%s (op#%d)z
%s (op#%d)z
 input z
 output)r   Zop_type	enumerateinputstroutputpydotNoder   Z
doc_stringZset_URL)r!   r"   Z	node_nameir%   r'   noder   r   r    r   r   ReallyGetOpNode0   s   

z*GetOpNodeProducer.<locals>.ReallyGetOpNode)r   intr(   r)   )r   r    r-   r   r,   r   GetOpNodeProducer/   s   r/   LRgraphrankdirnode_producerc                 C   s>  |d u rt dd|it}tj||d}i }tt}t| jD ]}\}}	||	|}
||
 |	j	D ]2}||vrPtj
t|t||  fdt|it}|||< n|| }|| |t||
 q0|	jD ]5}||v rt||  d7  < tj
t|t||  fdt|it}|||< || |t|
| qfq|S )Nr   )r2   label   r   )r/   OP_STYLEr(   Dotr   r.   r$   r+   add_noder%   r)   r   r&   
BLOB_STYLEZadd_edgeEdger'   )r1   r   r2   r3   r   pydot_graphZpydot_nodesZpydot_node_countsr"   r!   Zop_nodeZ
input_nameZ
input_nodeZoutput_nameZoutput_noder   r   r   GetPydotGraphA   sP   






r<   c                  C   s   t jdd} | jdtddd | jdtddd | jd	td
dd | jdddd |  }t }t|jd}| }|	| W d    n1 sJw   Y  t
|j|jj|jtdd|jitd}||j d S )NzONNX net drawer)descriptionz--inputTzThe input protobuf file.)typerequiredhelpz--outputzThe output protobuf file.z	--rankdirr0   z&The rank direction of the pydot graph.)r>   defaultr@   z--embed_docstring
store_truez;Embed docstring as javascript alert. Useful for SVG format.)actionr@   rbr   )r   r2   r3   r   )argparseArgumentParseradd_argumentr&   
parse_argsr   openr%   readZParseFromStringr<   r1   r   r2   r/   r   r6   Z	write_dotr'   )parserargsmodelZfidcontentr;   r   r   r   mainl   sH   	rO   __main__)F)Nr0   NF)r   N)rE   collectionsr   r   Zonnxr   r   r   r(   typingr   r   r   r	   r6   r9   r.   r)   Z_NodeProducerr&   r   r   boolr/   r7   r<   rO   __name__r   r   r   r   <module>   sJ   

+%
