
    ^jL                     b   U d dl Z d dlmZ d dlmZ d dlmZmZ d dlZd dl	Zd dl
mZ d dlmZ d dlmZmZ d dlmZ d d	lmZ erd dlZd
Znedz  ed<   	 d dlZd
ZdgZddddddZg dZddddZer ed       G d d             Zyes ed       G d d             Zyy# e$ r dZdZY Sw xY w)    N)chain)
ModuleType)AnyTYPE_CHECKING)compatibility)_parse_stack_trace)_format_arg_get_qualified_name)normalize_function)TensorMetadataTpydotFFxGraphDrawerz"AliceBlue"LemonChiffon1Yellow2	LightGrey
PowderBlue)placeholdercall_module	get_paramget_attroutput)
CadetBlue1CoralDarkOliveGreen1DarkSeaGreen1
GhostWhiteKhaki1LavenderBlush1LightSkyBlue
MistyRose1
MistyRose2PaleTurquoise2
PeachPuff1SalmonThistle1Thistle3Wheat1r$   "filled,rounded"#000000)	fillcolorstyle	fontcolor)is_backward_compatiblec                      e Zd ZdZ	 	 	 	 	 	 d"dej
                  j                  dededededed	edz  d
eddfdZ	d#dedz  de
j                  fdZde
j                  fdZdede
j                  fdZdeee
j                  f   fdZdej
                  j"                  deeef   fdZdej&                  j(                  dej
                  j"                  dej&                  j(                  fdZdej
                  j,                  j.                  ej&                  j(                  z  defdZ	 d$dededefdZdej
                  j                  dej
                  j"                  dededef
dZdedefdZdedefdZdej@                  defd Z!dej
                  j                  dededededede
j                  fd!Z"y)%r   z
        Visualize a torch.fx.Graph with graphviz
        Basic usage:
            g = FxGraphDrawer(symbolic_traced, "resnet18")
            g.get_dot_graph().write_svg("a.svg")
        Ngraph_modulenameignore_getattrignore_parameters_and_buffersskip_node_names_in_argsparse_stack_tracedot_graph_shapenormalize_argsreturnc	           	         || _         ||nd| _        || _        | j                  t        d<   || j	                  ||||||      i| _        |j                  j                  D ]  }	|	j                  dk7  r| j                  ||	      }
t        |
t        j                  j                        sJ| j	                  |
| d|	j                   ||||      | j
                  | d|	j                   <    y )Nrecordshaper   _)_namer5   r6   _WEIGHT_TEMPLATE_to_dot_dot_graphsgraphnodesop_get_leaf_node
isinstancetorchfxGraphModuletarget)selfr/   r0   r1   r2   r3   r4   r5   r6   node	leaf_nodes              g/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/fx/passes/graph_drawer.py__init__zFxGraphDrawer.__init__L   s    DJ#2#>H   #1D(,(<(<W% dll "1+%	 D %**00 77m+ //dC	!)UXX-A-AB<@LLfAdkk]+"1+%=  D64;;-!89    submod_namec                 H    || j                         S | j                  |      S )aA  
            Visualize a torch.fx.Graph with graphviz
            Example:
                >>> # xdoctest: +REQUIRES(module:pydot)
                >>> # xdoctest: +REQUIRES(module:ubelt)
                >>> # define module
                >>> class MyModule(torch.nn.Module):
                >>>     def __init__(self) -> None:
                >>>         super().__init__()
                >>>         self.linear = torch.nn.Linear(4, 5)
                >>>     def forward(self, x):
                >>>         return self.linear(x).clamp(min=0.0, max=1.0)
                >>> module = MyModule()
                >>> # trace the module
                >>> symbolic_traced = torch.fx.symbolic_trace(module)
                >>> # setup output file
                >>> import ubelt as ub
                >>> dpath = ub.Path.appdir("torch/tests/FxGraphDrawer").ensuredir()
                >>> fpath = dpath / "linear.svg"
                >>> # draw the graph
                >>> g = FxGraphDrawer(symbolic_traced, "linear")
                >>> g.get_dot_graph().write_svg(fpath)
            )get_main_dot_graphget_submod_dot_graphrI   rO   s     rL   get_dot_graphzFxGraphDrawer.get_dot_graph{   s*    0 "..0000==rN   c                 4    | j                   | j                     S Nr?   r<   rI   s    rL   rQ   z FxGraphDrawer.get_main_dot_graph   s    ##DJJ//rN   c                 >    | j                   | j                   d|    S )Nr;   rW   rS   s     rL   rR   z"FxGraphDrawer.get_submod_dot_graph   s"    ##tzzl!K=$ABBrN   c                     | j                   S rV   )r?   rX   s    rL   get_all_dot_graphsz FxGraphDrawer.get_all_dot_graphs   s    ###rN   rJ   c                 j   | j                   dddd}|j                  t        v rt        |j                     |d<   |S |j                  |j                        }t        t        j                  |j                         d      j                         d d d	      }t        |t        t              z     |d<   |S )
Nz#CAFFE3r(   r)   )r:   r*   r+   r,   r*   F)usedforsecurity      )r5   rB   
_COLOR_MAP_pretty_print_targetrH   inthashlibmd5encode	hexdigest_HASH_COLOR_MAPlen)rI   rJ   templatetarget_nametarget_hashs        rL   _get_node_stylezFxGraphDrawer._get_node_style   s    --&+&	H ww*$(2477(;% O #77D!KK#**,eik"1& 	 )8#o"66)% OrN   modulec                 .   |}t        |j                  t              s!t        dt	        |j                               |j                  j                  d      }|D ]7  }t        ||      st        t        |      dz   |z   dz         t        ||      }9 |S )NzExpected str target, got .z does not have attribute !)	rD   rH   strAssertionErrortypesplithasattrRuntimeErrorgetattr)rI   rm   rJ   py_objatomsatoms         rL   rC   zFxGraphDrawer._get_leaf_node   s     Fdkk3/$'@dkkAR@S%TUUKK%%c*E /vt,&F&AADH3N  !./ MrN   rH   c                     t        |t        j                  j                        rt        j                  |      }nt        |t
              r|}nt        |      }|j                  dd      j                  dd      S )N{\{}\})rD   rE   nnModuletypenamerq   r
   replace)rI   rH   rets      rL   	_typenamezFxGraphDrawer._typename   s[    &%((//2nnV,FC()&1
 ;;sE*223>>rN   full_file_nametruncate_to_last_nc                 n    |j                  d      }t        |      |k\  rdj                  || d        S |S )N/)rt   rh   join)rI   r   r   splitss       rL   _shorten_file_namez FxGraphDrawer._shorten_file_name   sB    
 $))#.F6{00xx(:':'; <==!!rN   c                 f   dt         t        df   t        t        t        f   z  dt        ffd}dd|j                   d|j
                   dz   }|j
                  d	k(  r{| j                  ||      }|d
| j                  |      z   dz   z  }d}t        |d      r8d
j                  |j                  D 	cg c]  }	|	 dt        ||	        c}	      }||d
z   z  }n|d| j                  |j                         d
z   z  }| j                  r2	 t        |j                  |j                  |j                   d      \  }
}n|j                  |j                   }}
t%        |
      dkD  r| ||
      z  }t%        |      dkD  r| ||      z  }|dt%        |j&                         d
z   z  }|j(                  j+                  d      }|| j-                  |      z  }|j(                  j+                  dd       }|*|d|j                   d
z   z  }|d|j.                   d
z   z  }|rc|j0                  Wt3        |j0                        }|@| j5                  |j6                        }|d| d|j8                   d|j:                   d
z   z  }|dz   S c c}	w # t"        $ r |j                  |j                   }}
Y Zw xY w)Narg.r7   c           
      2   t        | t              r d\  }}| D cg c]  }t        |d       }}nIt        | t              r8d\  }}| j	                         D cg c]  \  }}| dt        |d        }}}nyr|D cg c]	  }d|vs| }}t        |      dk(  ry|d	j                  |      z   |z   }t        |      d
k(  r"|j                  dd      j                  dd      }|j                  dd      j                  dd      S c c}w c c}}w c c}w )N)z	|args=(\lz,\n)\lr^   )max_list_len)z|kwargs={\lz,\n}\l:  %r   z,\n   z\l\nr|   r}   r~   r   )rD   tupler	   dictitemsrh   r   r   )	r   prefixsuffixaarg_strs_listkvarg_strsr3   s	           rL   _get_str_for_args_kwargsz?FxGraphDrawer._get_node_label.<locals>._get_str_for_args_kwargs   s"   c5)%<NFFMP$Q[%C$QM$QT*%>NFFMPYY[%EIQ1#RAA >?@%M %  +0=$N1AQ$NM$N}%*!FKK$>>G}%*'//r:BB5"MH''U3;;CGG# %R% %Os   D	D	DDr|   zname=%z	|op_code=
r   r   z\n|r   __constants__r   z|target=T)normalize_to_only_use_kwargsr   z|num_users=tensor_metabuf_metaz|buf=z
|n_origin=z|file=: r~   )r   r   r   rq   r0   rB   rC   r   ru   r   r   rw   rH   r6   r   argskwargs	Exceptionrh   usersmetaget_tensor_meta_to_labeln_originstack_tracer   r   filelinenocode)rI   rm   rJ   r3   r4   r   labelleaf_moduleextracr   r   r   r   parsed_stack_tracefnames      `            rL   _get_node_labelzFxGraphDrawer._get_node_label   s   HeCHoS#X.N HSV H, F499+YtwwirBBEww-'"11&$?!<<vEE;8!JJ &1%>%> !  !cGK$;#<=E &8DNN4;;$?#@AEII&&
>'9 KK II KK9=	(f $(99dkk&Dt9q=5d;;Ev;?5f==E;s4::&785@@))--6KT//<<E yy}}Z6H#50588:h&7&7%89EAA !T%5%5%A%78H8H%I"%1 334F4K4KLE q);)B)B(C1EWE\E\D]^ E
 3;c  % > (,yy$++f>s   3J0J !J0/J0tmc                    |yt        |t              r| j                  |      S t        |t              rd}|D ]  }|| j	                  |      z  } |S t        |t
              r-d}|j                         D ]  }|| j	                  |      z  } |S t        |t              rd}|D ]  }|| j	                  |      z  } |S t        dt        |             )Nr   zUnsupported tensor meta type )
rD   r   _stringify_tensor_metalistr   r   valuesr   rv   rs   )rI   r   resultitemr   s        rL   r   z#FxGraphDrawer._tensor_meta_to_label9  s    zB/22266B% ?Dd88>>F?B% <Ad88;;F<B& ?Dd88>>F?"%B48*#MNNrN   c                 &   d}t        |d      st        d|       |dt        |j                        z   dz   z  }|dt        t	        |j
                              z   dz   z  }|dt        |j                        z   dz   z  }|dt        |j                        z   dz   z  }|j                  rh|j                  t        d	      d
|j                  vrt        d      |j                  d
   }|t        j                  t        j                  hv rC|dt        |j                  d         z   dz   z  }|dt        |j                  d         z   dz   z  }n|t        j                  t        j                  t        j                   hv rd|dt        |j                  d         z   dz   z  }|dt        |j                  d         z   dz   z  }|dt        |j                  d         z   dz   z  }nt#        d|       |dt        |j                  d
         z   dz   z  }|S )Nr   dtyper   z|dtype=r   z|shape=z|requires_grad=z|stride=z$qparams is None for quantized tensorqschemezqscheme not in qparamsz	|q_scale=scalez|q_zero_point=
zero_pointz|q_per_channel_scale=z|q_per_channel_zero_point=z|q_per_channel_axis=axiszUnsupported qscheme: z	|qscheme=)ru   printrq   r   r   r:   requires_gradstrideis_quantizedqparamsrr   rE   per_tensor_affineper_tensor_symmetricper_channel_affineper_channel_symmetric per_channel_affine_float_qparamsrv   )rI   r   r   r   s       rL   r   z$FxGraphDrawer._stringify_tensor_metaP  sO   F2w'dB)CM9EAAF)Cbhh,@@5HHF1C8H8H4IIEQQF*S^;eCCF::%()OPPBJJ.()ABB**Y/++..  3c"**W:M6NNQVVVF bjj678  	 F ,,//::! 
  bjj123  	 F  bjj678  	 F  bjj012  	 F ')>wi'HII/#bjj6K2LLuTTMrN   tc                 p    t        |j                        t        t        |j                              z   dz   S )Nr   )rq   r   r   r:   )rI   r   s     rL   _get_tensor_labelzFxGraphDrawer._get_tensor_label  s'    qww<#d177m"44u<<rN   c                 X    t        j                  |d      i }|j                  j                  D ]1  |rj                  dk(  r j                        }t        j                  j                  fd j                  |||      i|}	}
j                  j                  dd      }|J|j                  dkD  r;|j                  }||vrt        j                  ||      ||<   |j                  |      }
|
j                  |	       d fd	}j                  d
k(  s j                  |      |rt        t         j"                  j$                        r+ |        4 |j'                         D ]7  }|j)                  dd       |j)                  dd       j+                  |       9 |j                  j                  D ]^  |rj                  dk(  rj,                  D ];  }j/                  t        j0                  j                  |j                               = ` S )a  
            Actual interface to visualize a fx.Graph. Note that it takes in the GraphModule instead of the Graph.
            If ignore_parameters_and_buffers is True, the parameters and buffers
            created with the module will not be added as nodes and edges.
            TB)rankdirr   r   r   Nr   )r   c            	         t        j                         j                               D ]  \  } }j                  dz   | z   }t	        |t
        j                  j                        r|dz   dz   nd}t        j                  |fdd|z   j                  |      z   dz   it        }j                  |       j                  t        j                  |j                                y )Nro   z|op_code=get_	parameterzbuffer\lr   r|   r~   )r   named_parametersnamed_buffersr0   rD   rE   r   	Parameterr   Noder   r=   add_nodeadd_edgeEdge)	pnameptensorpname1label1
dot_w_node	dot_graphr   rJ   rI   s	        rL   get_module_params_or_buffersz;FxGraphDrawer._to_dot.<locals>.get_module_params_or_buffers  s    */#446#113+ Jw
 "&S5!8  *'5883E3EF #_4{B!1 
 &+ZZ"&"%,1G1G1P"PSV"V& /&

 "**:6!**5::fdii+HI#JrN   r   color	royalbluepenwidth2)r7   N)r   Dotr@   rA   rB   rl   r   r0   r   r   r   r   Clusterr   rC   rD   rE   rF   rG   r   setadd_subgraphr   r   r   )rI   r/   r0   r1   r2   r3   r4   buf_name_to_subgraphr+   dot_nodecurrent_graphr   buf_namer   subgraphuserr   r   rJ   s   `               @@@rL   r>   zFxGraphDrawer._to_dot  s     		$5I=? $**00 57!dgg&;,,T2 ::II..$d,CEV
  !*99==T:'H,=,=,A'}}H';;9>$H:,X6 %9$<$<X$FM &&x0J J( 77m+"&"5"5lD"IK8#UXX%9%9B 56k57n 1779 1Wk2Z-&&x01
 %**00 I!dgg&; JJ ID&&uzz$))TYY'GHI	I rN   FFTFNFrV   )   )#__name__
__module____qualname____doc__rE   rF   rG   rq   boolrM   r   r   rT   rQ   rR   r   r[   r   rl   r   r   rC   rJ   Targetr   rb   r   r   objectr   r   r   Tensorr   r>    rN   rL   r   r   C   s   	 $)27,0&+*.#(-	((..-	 -	 !	-	
 ,0-	 &*-	  $-	 !4Z-	 !-	 -	^	>S4Z 	>599 	>:	0		 	0	CC 	CEII 	C	$S%))^(< 	$	 	$sCx. 	.	((//	16	XX__		?EHHMM$8$8588??$J 	?s 	?& '(	"	" !$	" 		"V	HH((V	 ((--V	 &*	V	
  $V	 V	p	OF 	Os 	O.7	^ 7	 7	r	=u|| 	= 	=
W	((..W	 W	 !	W	
 ,0W	 &*W	  $W	 YYW	rN   c                   p    e Zd Z	 	 	 	 	 	 ddej                  j
                  dededededededz  d	efd
Zy)r   Nr/   r0   r1   r2   r3   r4   r5   r6   c	                     t        d      )Nz|FXGraphDrawer requires the pydot package to be installed. Please install pydot through your favorite Python package manager.)rv   )	rI   r/   r0   r1   r2   r3   r4   r5   r6   s	            rL   rM   zFxGraphDrawer.__init__  s     #J rN   r   )	r   r   r   rE   rF   rG   rq   r   rM   r   rN   rL   r   r     sw     (-6;04*/.2',#hh22  !%	
 04 *. $( "%t !%rN   )rc   	itertoolsr   typesr   typingr   r   rE   torch.fxtorch.fx._compatibilityr   torch.fx.graphr   torch.fx.noder	   r
   torch.fx.operator_schemasr   torch.fx.passes.shape_propr   r   	HAS_PYDOT__annotations__ModuleNotFoundError__all__r`   rg   r=   r   r   rN   rL   <module>r     s       %   1 - : 8 5 I	 
 !"
(   %0a a 1aH 	e	4	 	 
5	 _  	s   B" "	B.-B.