o
    Me!!                     @   s   d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZdd ZG dd de	Z
G dd de	ZG d	d
 d
e	ZG dd de	ZG dd de	ZdS )    )print_functionNc                 C   s   t | tjr
d|  S t| S )Nz"%s")
isinstancesixstring_typesstr)v r   ED:\Projects\ConvertPro\env\Lib\site-packages\paddle/fluid/graphviz.pycrepr   s   r
   c                   @      e Zd Zdd Zdd ZdS )Rankc                 C   s   || _ || _|| _g | _dS )zC
        kind: str
        name: str
        priority: int
        N)kindnameprioritynodes)selfr   r   r   r   r   r	   __init__!   s   
zRank.__init__c                 C   s4   | j sdS dd| j ddd | j D  d S )N {zrank={};,c                 S   s   g | ]}|j qS r   )r   .0noder   r   r	   
<listcomp>1   s    z Rank.__str__.<locals>.<listcomp>})r   formatr   joinr   r   r   r	   __str__,   s   zRank.__str__N__name__
__module____qualname__r   r   r   r   r   r	   r      s    r   c                   @   sZ   e Zd ZdZdd Zdd Zdd Zdd	d
Zdd Zdd Z	dd Z
dd Zdd ZdS )Graphr   c                 K   s"   || _ || _g | _g | _i | _d S N)titleattrsr   edgesrank_groups)r   r%   r&   r   r   r	   r   7   s
   
zGraph.__init__c                 C   s   |   S r$   )r   r   r   r   r	   code>   s   z
Graph.codec                 C   s2   dt j }t  jd7  _t|||}|| j|< |S )Nzrankgroup-%d   )r#   rank_counterr   r(   )r   r   r   r   rankr   r   r	   
rank_groupA   s
   

zGraph.rank_groupr   c                 K   sL   t |||fi |}d|v r| j|d  }|d= |j| | j| |S )Nr,   )Noder(   r   append)r   labelprefixdescriptionr&   r   r,   r   r   r	   r   H   s   z
Graph.nodec                 K   s"   t ||fi |}| j| |S r$   )Edger'   r/   )r   sourcetargetr&   edger   r   r	   r6   R   s   z
Graph.edgec                 C   st   t |d}||   tjtj||d d d }dd|d|g}tj|tj	tj	tj	d t
d| |S )	NwZpdfdotz-Tpdfz-ostdinstdoutstderrzwrite block debug graph to {})openwriter   ospathr   dirname
subprocessPopenPIPEloggingwarningr   )r   dot_pathfileZ
image_pathcmdr   r   r	   compileW   s   
zGraph.compilec                 C   s.   |  |}d|g}tj|tjtjtjd d S )Nr>   r:   )rK   rC   rD   rE   )r   rH   imagerJ   r   r   r	   showd   s   

z
Graph.showc                 C   sL   t t| jtdd d}g }|D ]}|t|d  qd|d S )Nc                 S   s   | d j |d j kS )Nr*   )r   )abr   r   r	   <lambda>o       z"Graph._rank_repr.<locals>.<lambda>)keyr*   
)	sortedr   	iteritemsr(   	functools
cmp_to_keyr/   r   r   )r   Zranksreprxr   r   r	   
_rank_reprl   s   zGraph._rank_reprc                 C   s   dd t| jg}| jD ]}|dj |t| j| d q||   t| j |dd | jD 7 }| j	D ]	}|t
| q9|d d|S )	Nzdigraph G {z
title = {}z{key}={value};)rR   valuec                 S   s   g | ]}t |qS r   )r   r   r   r   r	   r      rQ   z!Graph.__str__.<locals>.<listcomp>r   rS   )r   r
   r%   r&   r/   rZ   randomshuffler   r'   r   r   )r   reprsattrrY   r   r   r	   r   u   s   





zGraph.__str__Nr   )r    r!   r"   r+   r   r)   r-   r   r6   rK   rM   rZ   r   r   r   r   r	   r#   4   s    

	r#   c                   @   s"   e Zd ZdZdddZdd ZdS )	r.   r*   r   c                 K   s4   || _ d|tjf | _|| _|| _t jd7  _d S )Nz%s_%dr*   )r0   r.   counterr   r2   r&   )r   r0   r1   r2   r&   r   r   r	   r      s
   zNode.__init__c              
   C   s>   dj | j| j| jrdddd t| jD  ndd}|S )Nz {name} [label={label} {extra} ];r   c                 s   s$    | ]\}}d |t |f V  qdS )z%s=%sN)r
   )r   rR   r[   r   r   r	   	<genexpr>   s    zNode.__str__.<locals>.<genexpr>r   )r   r0   extra)r   r   r0   r&   r   r   rU   )r   r^   r   r   r	   r      s   

zNode.__str__Nr`   )r    r!   r"   ra   r   r   r   r   r   r	   r.      s    
r.   c                   @   r   )r3   c                 K   s   || _ || _|| _dS )z
        Link source to target.
        :param source: Node
        :param target: Node
        :param graph: Graph
        :param attrs: dic
        N)r4   r5   r&   )r   r4   r5   r&   r   r   r	   r      s   
zEdge.__init__c              
   C   sF   dj | jj| jj| jsdndddd t| jD  d d}|S )	Nz{source} -> {target} {extra}r   [r   c                 s   s(    | ]}d  |d t|d V  qdS )z{}={}r   r*   N)r   r
   )r   r_   r   r   r	   rb      s     zEdge.__str__.<locals>.<genexpr>])r4   r5   rc   )r   r4   r   r5   r&   r   r   rU   )r   rX   r   r   r	   r      s   

zEdge.__str__Nr   r   r   r   r	   r3      s    r3   c                   @   sF   e Zd ZdZdd ZdddZddd	Zd
d ZdddZdd Z	dS )GraphPreviewGeneratorz0
    Generate a graph image for ONNX proto.
    c                 C   sF   t |dddd| _| jdd| _| jdd| _| jdd| _d S )	Nr9   trueTB)ZlayoutZconcentrateZrankdirZsame   r*   r   )r#   graphr-   Zop_rankZ
param_rankZarg_rank)r   r%   r   r   r	   r      s   zGraphPreviewGenerator.__init__temp.dotFc                 C   s$   |s
| j | d S | j | d S r$   )rj   rK   rM   )r   rA   rM   r   r   r	   __call__   s   zGraphPreviewGenerator.__call__c                 C   sN   d dddd|ddddd	t|d
dg}| jj|d|ddd|s!dndddd	S )NrS   z<<table cellpadding="5">z  <tr>z    <td bgcolor="#2b787e">z    <b>z    </b>z	    </td>z  </tr>z    <td>z    </td>  </tr>z	</table>>paramnonerounded,filled,bold1.3z#148b97orange#ffffffArial)r1   r2   shapestylewidthcolor	fontcolorfontname)r   r   rj   r   )r   r   Z	data_type	highlightr0   r   r   r	   	add_param   s2   
zGraphPreviewGenerator.add_paramc                 K   sF   d}d|v r|d }|d= | j jd| d|dd|sdndd	d
ddd
S )NFrz   z<<B>%s</B>>opboxzrounded, filled, boldz#303A3Arq   rs   rr   rp   z0.84)	r1   r2   rt   ru   rw   ry   rx   rv   height)rj   r   )r   ZopTypekwargsrz   r   r   r	   add_op   s    
zGraphPreviewGenerator.add_opc              
   C   s,   | j jt|d|dddd|sddS ddS )	Nargr}   ro   rs   z#999999z#ddddddrq   )r1   r2   rt   ru   ry   rx   rw   )rj   r   r
   )r   r   rz   r   r   r	   add_arg   s   zGraphPreviewGenerator.add_argc                 K   s<   d}d|v r|d }|d= | j j||fd|sdndi|S )NFrz   rw   z#00000rq   )rj   r6   )r   r4   r5   r   rz   r   r   r	   add_edge  s   
zGraphPreviewGenerator.add_edgeN)rk   F)F)
r    r!   r"   __doc__r   rl   r{   r   r   r   r   r   r   r	   rf      s    



rf   )
__future__r   r@   r\   r   rV   rC   rF   r
   objectr   r#   r.   r3   rf   r   r   r   r	   <module>   s   W