
    PhA                     *   d dl Z d dlZd dlZd dlmZmZmZmZ d dlm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ dgZ	 d dlZd	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Y Nw xY w)    N)AnyDictOptionalTYPE_CHECKING)_get_qualified_name_format_arg)_parse_stack_trace)TensorMetadata)compatibility)chainFxGraphDrawerTFz"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	e   fd
Z
d!dej                  fdZdej                  fdZ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defdZ	 d"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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_shapec           	         || _         ||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   _)_namer4   _WEIGHT_TEMPLATE_to_dot_dot_graphsgraphnodesop_get_leaf_node
isinstancetorchfxGraphModuletarget)
selfr.   r/   r0   r1   r2   r3   r4   node	leaf_nodes
             gC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/fx/passes/graph_drawer.py__init__zFxGraphDrawer.__init__>   s     DJ#2#>H   )-(<(<W% dll $8UWn  qB D %**0077m+ //dC	!)UXX-A-AB =ALLfAdkk]+"1+%=  D64;;-!89 1    returnc                 H    || j                         S | j                  |      S )a  
            Visualize a torch.fx.Graph with graphviz
            Example:
                >>> # xdoctest: +REQUIRES(module:pydot)
                >>> # define module
                >>> class MyModule(torch.nn.Module):
                >>>     def __init__(self):
                >>>         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rF   submod_names     rI   get_dot_graphzFxGraphDrawer.get_dot_graphg   s*    . "..0000==rK   c                 4    | j                   | j                     S Nr<   r9   rF   s    rI   rN   z FxGraphDrawer.get_main_dot_graph   s    ##DJJ//rK   c                 >    | j                   | j                   d|    S )Nr8   rU   rP   s     rI   rO   z"FxGraphDrawer.get_submod_dot_graph   s"    ##tzzl!K=$ABBrK   c                     | j                   S rT   )r<   rV   s    rI   get_all_dot_graphsz FxGraphDrawer.get_all_dot_graphs   s    ###rK   rG   c                 f   | j                   dddd}|j                  t        v rt        |j                     |d<   |S |j                  |j                        }t        t        j                  |j                               j                         d d d      }t        |t        t              z     |d<   |S )Nz#CAFFE3r'   r(   )r7   r)   r*   r+   r)         )r4   r?   
_COLOR_MAP_pretty_print_targetrE   inthashlibmd5encode	hexdigest_HASH_COLOR_MAPlen)rF   rG   templatetarget_nametarget_hashs        rI   _get_node_stylezFxGraphDrawer._get_node_style   s     --&+&	H ww*$(2477(;% O #77D!'++k.@.@.B"C"M"M"OPRQR"SUWX(7c/FZ8Z([%OrK   modulec                     |}t        |j                  t              sJ |j                  j                  d      }|D ]7  }t	        ||      st        t        |      dz   |z   dz         t        ||      }9 |S )N.z does not have attribute !)rA   rE   strsplithasattrRuntimeErrorgetattr)rF   rj   rG   py_objatomsatoms         rI   r@   zFxGraphDrawer._get_leaf_node   s~     Fdkk3///KK%%c*Evt,&F&AADH3N  !.  MrK   rE   c                     t        |t        j                  j                        rt        j                  |      }nt        |t
              r|}nt        |      }|j                  dd      j                  dd      S )N{\{}\})rA   rB   nnModuletypenamern   r   replace)rF   rE   rets      rI   	_typenamezFxGraphDrawer._typename   s[    &%((//2nnV,FC()&1
 ;;sE*223>>rK   full_file_nametruncate_to_last_nc                 n    |j                  d      }t        |      |k\  rdj                  || d        S |S )N/)ro   re   join)rF   r   r   splitss       rI   _shorten_file_namez FxGraphDrawer._shorten_file_name   sB    
 $))#.F6{00xx(:':'; <==!!rK   c                 b   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  }t        |j                        dkD  r| ||j                        z  }t        |j                        dkD  r| ||j                        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  }|ra|j"                  Ut%        |j"                        }| j'                  |j(                        }|d| d|j*                   d|j,                   dz   z  }|dz   S c c}	w )Nc           
      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\nrw   rx   ry   rz   )rA   tupler   dictitemsre   r   r~   )	argprefixsuffixaarg_strs_listkvarg_strsr2   s	           rI   _get_str_for_args_kwargsz?FxGraphDrawer._get_node_label.<locals>._get_str_for_args_kwargs   s,   c5)%<NFFMP$QS[%CSM$QT*%>NFF %(IIK%$/DAq #RAA >?@$/ " %
  +0=$N1AQM$N}%*!FKK$>>G}%*'//r:BB5"MH''U3;;CGG% %R% %Os   D	D	DDrw   zname=%z	|op_code=
r   r   z\n|r   __constants__r   z|target=r   z|num_users=tensor_metabuf_metaz|buf=z
|n_origin=z|file=: ry   )r/   r?   r@   r   rp   r   r   rr   rE   re   argskwargsusersmetaget_tensor_meta_to_labeln_originstack_tracer	   r   filelinenocode)rF   rj   rG   r2   r3   r   labelleaf_moduleextracr   r   parsed_stack_tracefnames      `          rI   _get_node_labelzFxGraphDrawer._get_node_label   sD   H0 F499+YtwwirBBEww-'"11&$?!<<vEE;8!JJDOD]D]^D]qA3ba!8 9:D]^E &8DNN4;;$?#@AEIItyy>A%5dii@@Et{{#a'5dkkBBE;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"//0B0G0GH6%*<*C*C)DAFXF]F]E^_bggg 3;; _s   	H,c                    |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 )
rA   r
   _stringify_tensor_metalistr   r   valuesr   rq   type)rF   tmresultitemr   s        rI   r   z#FxGraphDrawer._tensor_meta_to_label  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NrK   r   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                  rV|j                  J d	|j                  v sJ |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=qschemez	|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=)rp   printrn   r   r   r7   requires_gradstrideis_quantizedqparamsrB   per_tensor_affineper_tensor_symmetricper_channel_affineper_channel_symmetric per_channel_affine_float_qparamsrq   )rF   r   r   r   s       rI   r   z$FxGraphDrawer._stringify_tensor_meta#  s
   F2w'dB)CM9EAAF)Cbhh,@@5HHF1C8H8H4IIEQQF*S^;eCCFzz--- BJJ...**Y///22  3c"**W:M6NNQVVVF83rzz,?W;XX[```F0033>>! 
 ?#bjjQXFYBZZ]bbbFDs2::VbKcGddglllF>RZZPVEWAXX[```F&)>wi'HII/#bjj6K2LLuTTMrK   tc                 p    t        |j                        t        t        |j                              z   dz   S )Nr   )rn   r   r   r7   )rF   r   s     rI   _get_tensor_labelzFxGraphDrawer._get_tensor_labelB  s'    qww<#d177m"44u<<rK   c                 V    t        j                  |d      i }|j                  j                  D ]0  |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                  |	        fd	}j                  d
k(  s j                  |      |rt        t         j"                  j$                        r* |        3 |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 )Nrl   z|op_code=get_	parameterzbuffer\lr   rw   ry   )r   named_parametersnamed_buffersr/   rA   rB   r{   	ParameterpydotNoder   r:   add_nodeadd_edgeEdge)	pnameptensorpname1label1
dot_w_node	dot_graphr   rG   rF   s	        rI   get_module_params_or_buffersz;FxGraphDrawer._to_dot.<locals>.get_module_params_or_buffersp  s    */#4468Q8Q8S+w "&S5!8  *'5883E3EF #_4{B!1 
 &+ZZ"&"%,1G1G1P"PSV"V& /&

 "**:6!**5::fdii+HI+rK   r   color	royalbluepenwidth2)r   Dotr=   r>   r?   ri   r   r/   r   r   r   r   Clusterr   r@   rA   rB   rC   rD   r   setadd_subgraphr   r   r   )rF   r.   r/   r0   r1   r2   r3   buf_name_to_subgraphr*   dot_nodecurrent_graphr   buf_namer   subgraphuserr   r   rG   s   `               @@@rI   r;   zFxGraphDrawer._to_dotG  s     		$5I $& $**00!dgg&;,,T2 ::II%)%9%9,Negx%y ~C !*99==T:'H,=,=,A'}}H';;9>xW_9`,X6$8$<$<X$FM&&x0J$ 77m+"&"5"5lD"IK8KY^YaYaYmYmAn46U 1X 1779Wk2Z-&&x0 :
 %**00!dgg&; JJD&&uzz$))TYY'GH '	 1 rK   )FFTFNrT   )   )"__name__
__module____qualname____doc__rB   rC   rD   rn   boolr   rJ   r   r   rR   rN   rO   r   rY   r   ri   r{   r|   r@   r   r   r_   r   r   r   r
   r   Tensorr   r;    rK   rI   r   r   5   s'   	 $)27,0&+-1'	((..'	 '	 !	'	
 ,0'	 &*'	  $'	 &c]'	R	>UYY 	>8	0		 	0	Cuyy 	C	$S%))^(< 	$	 	$sCx. 	"	((//	16	XX__		?C 	?C 	?& '(	"	" !$	"D	HH((D	 ((--D	 &*	D	
  $D	 D	L	Os 	O.	^ 	 	>	=u|| 	= 	=
M	((..M	 M	 !	M	
 ,0M	 &*M	  $M	 YYM	rK   c            	       R    e Zd Z	 	 ddej                  j
                  dededefdZy)r   r.   r/   r0   r3   c                     t        d      )Nz|FXGraphDrawer requires the pydot package to be installed. Please install pydot through your favorite Python package manager.)rq   )rF   r.   r/   r0   r3   s        rI   rJ   zFxGraphDrawer.__init__  s     # $Y Z ZrK   N)FF)	r   r   r   rB   rC   rD   rn   r   rJ   r   rK   rI   r   r     sD     (-*/Z#hh22Z Z !%	Z
 $(ZrK   )r`   rB   torch.fxtypingr   r   r   r   torch.fx.noder   r   torch.fx.graphr	   torch.fx.passes.shape_propr
   torch.fx._compatibilityr   	itertoolsr   __all__r   	HAS_PYDOTImportErrorr]   rd   r:   r   r   rK   rI   <module>r     s       5 5 : - 5 1 
I
 !"
(   %0^ ^ 1^B 	e	4		Z 		Z 
5		Z O  Is   B BB