U
    qh2                     @  s   d dl mZ d dlZd dlZd dlmZ d dlmZmZ d dl	Z	d dl
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ddddZdddddZd(ddddddZd)ddddddd d!d"Zd#d$d%d&Zed'kre  dS )*    )annotationsN)defaultdict)AnyCallable)
GraphProto
ModelProto	NodeProtoZboxz#0F9D58Zfilledz#FFFFFF)shapecolorstyleZ	fontcolorr	   Zoctagonstr)namereturnc                 C  s
   t | S )N)jsondumps)r    r   9/tmp/pip-unpacked-wheel-xnis5xre/onnx/tools/net_drawer.py_escape_label'   s    r   )sr   c                 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boolr   _NodeProducer)embed_docstringkwargsr   c                   s   dddd fdd}|S )Nr   intz
pydot.Node)opop_idr   c                   s   | j r"| j  d| j d| d}n| j d| d}t| jD ] \}}|dt| d | 7 }q>t| jD ] \}}|dt| d | 7 }qjtj|f} rt| j	}|
| |S )N/z (op#r   z
 input z
 output)r   Zop_type	enumerateinputr   outputpydotNoder   Z
doc_stringZset_URL)r#   r$   Z	node_nameiZinput_r)   noder   r    r!   r   r   really_get_op_node6   s    

z-GetOpNodeProducer.<locals>.really_get_op_noder   )r    r!   r/   r   r.   r   GetOpNodeProducer3   s    r0   LRr   z
str | Nonez_NodeProducer | Nonez	pydot.Dot)graphr   rankdirnode_producerr    r   c                 C  s>  |d krt f d|it}tj||d}i }tt}t| jD ]\}}	||	|}
||
 |	j	D ]d}||krtj
t|t||  fdt|it}|||< n|| }|| |t||
 q`|	jD ]j}||kr||  d7  < tj
t|t||  fdt|it}|||< || |t|
| qq>|S )Nr    )r3   label   )r0   OP_STYLEr*   ZDotr   r"   r'   r-   add_noder(   r+   r   r   
BLOB_STYLEZadd_edgeZEdger)   )r2   r   r3   r4   r    pydot_graphZpydot_nodesZpydot_node_countsr$   r#   Zop_nodeZ
input_nameZ
input_nodeZoutput_nameZoutput_noder   r   r   GetPydotGraphH   sF    






r;   None)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 5 Q R X t
|j|jj|jtf 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	--rankdirr1   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   r3   r4   )argparseArgumentParseradd_argumentr   
parse_argsr   openr(   readZParseFromStringr;   r2   r   r3   r0   r    r7   Z	write_dotr)   )parserargsmodelZfidcontentr:   r   r   r   mainq   sP    rO   __main__)F)Nr1   NF)
__future__r   rE   r   collectionsr   typingr   r   r*   Zonnxr   r   r   r7   r9   r"   r+   r   r   r   r0   r;   rO   __name__r   r   r   r   <module>   s2        ))