Ë
    f^(hªI  ã                   ó6  — d dl Z d dlmZ d dlmZ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 	 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)ÚAnyÚOptionalÚTYPE_CHECKING)Úcompatibility)Ú_parse_stack_trace)Ú_format_argÚ_get_qualified_name)Únormalize_function)ÚTensorMetadataTFÚ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	e   d
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_shapeÚnormalize_argsc	           	      óÜ  — || _         |�|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   r5   Ú_WEIGHT_TEMPLATEÚ_to_dotÚ_dot_graphsÚgraphÚnodesÚopÚ_get_leaf_nodeÚ
isinstanceÚtorchÚfxÚGraphModuleÚtarget)Úselfr.   r/   r0   r1   r2   r3   r4   r5   ÚnodeÚ	leaf_nodes              úZ/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/fx/passes/graph_drawer.pyÚ__init__zFxGraphDrawer.__init__G   s  € ð ˆDŒJà#2Ð#>‘ÀHð Ô ð #1ˆDÔØ(,×(<Ñ(<Ô˜WÑ%ð �d—l‘lØ ØØ"Ø1Ø+Ø%óð	 ˆDÔð %×*Ñ*×0Ñ0ò �Ø—7‘7˜mÒ+Øà ×/Ñ/°¸dÓC�	ä! )¬U¯X©X×-AÑ-AÔBØà<@¿L¹LØØ�f˜A˜dŸk™k˜]Ð+Ø"Ø1Ø+Ø%ó=�× Ñ  D 6¨¨4¯;©;¨-Ð!8Ò9ñó    Úreturnc                 ó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©rG   Úsubmod_names     rJ   Úget_dot_graphzFxGraphDrawer.get_dot_graphv   s*   € ð0 Ð"Ø×.Ñ.Ó0Ð0à×0Ñ0°Ó=Ð=rL   c                 ó4   — | j                   | j                     S ©N©r=   r:   ©rG   s    rJ   rO   z FxGraphDrawer.get_main_dot_graph“   s   € Ø×#Ñ# D§J¡JÑ/Ð/rL   c                 ó>   — | j                   | j                  › d|› �   S )Nr9   rV   rQ   s     rJ   rP   z"FxGraphDrawer.get_submod_dot_graph–   s"   € Ø×#Ñ# t§z¡z l°!°K°=Ð$AÑBÐBrL   c                 ó   — | j                   S rU   )r=   rW   s    rJ   Úget_all_dot_graphsz FxGraphDrawer.get_all_dot_graphs™   s   € Ø×#Ñ#Ð#rL   rH   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(   )r8   r)   r*   r+   r)   F)Úusedforsecurityé   é   )r4   r@   Ú
_COLOR_MAPÚ_pretty_print_targetrF   ÚintÚhashlibÚmd5ÚencodeÚ	hexdigestÚ_HASH_COLOR_MAPÚlen)rG   rH   ÚtemplateÚtarget_nameÚtarget_hashs        rJ   Ú_get_node_stylezFxGraphDrawer._get_node_styleœ   s·   € à×-Ñ-Ø&Ø+Ø&ñ	ˆHð �w‰wœ*Ñ$Ü(2°4·7±7Ñ(;�˜Ñ%ð ˆOð #×7Ñ7¸¿¹ÓD�Ü!Ü—K‘KØ#×*Ñ*Ó,¸eôç‘i“k " 1ð&ð ó	�ô )8Ø¤#¤oÓ"6Ñ6ñ)�˜Ñ%ð ˆOrL   Ú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 ú!)rB   rF   ÚstrÚsplitÚhasattrÚRuntimeErrorÚgetattr)rG   rl   rH   Úpy_objÚatomsÚatoms         rJ   rA   zFxGraphDrawer._get_leaf_node³   sƒ   € ð ˆFÜ˜dŸk™k¬3Ô/Ð/Ð/Ø—K‘K×%Ñ% cÓ*ˆEØò /�Ü˜v tÔ,Ü&Ü˜F›Ð&AÑAÀDÑHÈ3ÑNóð ô ! ¨Ó.‘ð/ð ˆMrL   rF   c                 óö   — t        |t        j                  j                  «      rt        j                  |«      }nt        |t
        «      r|}nt        |«      }|j                  dd«      j                  dd«      S )Nú{ú\{ú}ú\})rB   rC   ÚnnÚModuleÚtypenamerp   r
   Úreplace)rG   rF   Úrets      rJ   Ú	_typenamezFxGraphDrawer._typenameÁ   s[   € Ü˜&¤%§(¡(§/¡/Ô2Ü—n‘n VÓ,‘Ü˜F¤CÔ(Ø‘ä)¨&Ó1�ð
 —;‘;˜s EÓ*×2Ñ2°3¸Ó>Ð>rL   Úfull_file_nameÚtruncate_to_last_nc                 ón   — |j                  d«      }t        |«      |k\  rdj                  || d  «      S |S )Nú/)rq   rg   Újoin)rG   rƒ   r„   Úsplitss       rJ   Ú_shorten_file_namez FxGraphDrawer._shorten_file_nameÑ   sB   € ð
 $×)Ñ)¨#Ó.ˆFÜ�6‹{Ð0Ò0Ø—x‘x Ð(:Ð':Ð';Ð <Ó=Ð=Ø!Ð!rL   c                 ó  ‡— ˆ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  }|ra|j(                  �Ut+        |j(                  «      }| j-                  |j.                  «      }|d|› d|j0                  › d|j2                  › �dz   z  }|dz   S c c}	w # t        $ r |j                  |j                  }}
Y �ŒXw xY 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ú\nry   rz   r{   r|   )rB   Útupler	   ÚdictÚitemsrg   r‡   r€   )	ÚargÚprefixÚsuffixÚaÚarg_strs_listÚkÚvÚarg_strsr2   s	           €rJ   Ú_get_str_for_args_kwargsz?FxGraphDrawer._get_node_label.<locals>._get_str_for_args_kwargsâ   s"  ø€ Ü˜c¤5Ô)Ø%<‘N�F˜FØMPÖ$QÈ¤[°ÀÖ%CÐ$Q�MÑ$QÜ ¤TÔ*Ø%>‘N�F˜FàMPÏYÉYË[÷%ÙEIÀQÈ˜1˜#˜R¤¨A¸AÔ >Ð?Ò@ð%�Mò %ð ñ +Ø0=Ö$N¨1ÀÈAÂ¢QÐ$N�MÐ$NÜ�}Ó%¨Ò*ØØ! F§K¡K°Ó$>Ñ>ÀÑG�Ü�}Ó%¨Ò*Ø'×/Ñ/°°rÓ:×BÑBÀ5È"ÓM�HØ×'Ñ'¨¨UÓ3×;Ñ;¸CÀÓGÐGùò# %Rùó%ùò %Os   ›D	ÁDÂ	DÂDry   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@   rA   r‚   rr   r‡   rŸ   rt   rF   r5   r   ÚargsÚkwargsÚ	Exceptionrg   ÚusersÚmetaÚgetÚ_tensor_meta_to_labelÚn_originÚstack_tracer   r‰   ÚfileÚlinenoÚcode)rG   rl   rH   r2   r3   r�   ÚlabelÚleaf_moduleÚextraÚcr¥   r¦   r¡   r¢   Úparsed_stack_traceÚfnames      `            rJ   Ú_get_node_labelzFxGraphDrawer._get_node_labelÛ   s¥  ø€ ôHð, ˜F 4§9¡9 +¨Y°t·w±w°i¸rÐBÑBˆEà�w‰w˜-Ò'Ø"×1Ñ1°&¸$Ó?�Ø˜ §¡°Ó!<Ñ<¸vÑEÑE�Ø�Ü˜;¨Ô8Ø!ŸJ™Jð &1×%>Ñ%>öà !ð  !˜c ¤G¨K¸Ó$;Ð#<Ò=òó�Eð ˜ ™Ñ&‘à˜8 D§N¡N°4·;±;Ó$?Ð#@ÐAÀEÑIÑI�Ø×&Ò&ð
>Ü'9Ø ŸK™KØ ŸI™IØ ŸK™KØ9=ô	(™˜™fð $(§9¡9¨d¯k©k˜&�DÜ�t“9˜q’=ØÑ5°dÓ;Ñ;�EÜ�v“; ’?ØÑ5°fÓ=Ñ=�EØ˜;¤s¨4¯:©:£Ð&7Ð8¸5Ñ@Ñ@�àŸ)™)Ÿ-™-¨Ó6ˆKØ�T×/Ñ/°Ó<Ñ<ˆEð —y‘y—}‘} Z°Ó6ˆHØÐ#Ø˜5 §¡ Ð0°5Ñ8Ñ8�Ø˜: h×&7Ñ&7Ð%8Ð9¸EÑAÑA�ñ ! T×%5Ñ%5Ð%AÜ%7¸×8HÑ8HÓ%IÐ"Ø×/Ñ/Ð0B×0GÑ0GÓH�ØØ˜U˜G 1Ð%7×%>Ñ%>Ð$?¸qÐAS×AXÑAXÐ@YÐZØññ�ð
 ˜3‘;Ðùòaøô  %ò >ð (,§y¡y°$·+±+˜f›ð>ús   Â	IÃ"0I É!JÊJ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 )
rB   r   Ú_stringify_tensor_metaÚlistr«   r“   Úvaluesr’   rs   Útype)rG   ÚtmÚresultÚitemr›   s        rJ   r«   z#FxGraphDrawer._tensor_meta_to_label2  sê   € ØˆzØÜ˜B¤Ô/Ø×2Ñ2°2Ó6Ð6Ü˜B¤Ô%Ø�Øò ?�DØ˜d×8Ñ8¸Ó>Ñ>‘Fð?à�Ü˜B¤Ô%Ø�ØŸ™›ò <�AØ˜d×8Ñ8¸Ó;Ñ;‘Fð<à�Ü˜B¤Ô&Ø�Øò ?�DØ˜d×8Ñ8¸Ó>Ñ>‘Fð?à�ä"Ð%BÄ4ÈÃ8À*Ð#MÓNÐNrL   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=)rr   Úprintrp   rÁ   r’   r8   Úrequires_gradÚstrideÚis_quantizedÚqparamsrC   Úper_tensor_affineÚper_tensor_symmetricÚper_channel_affineÚper_channel_symmetricÚ per_channel_affine_float_qparamsrs   )rG   r½   r¾   rÂ   s       rJ   r¹   z$FxGraphDrawer._stringify_tensor_metaI  sC  € ØˆFÜ˜2˜wÔ'Ü�d˜B”ØÐ)¬C°·±«MÑ9¸EÑAÑAˆFØÐ)¬C´°b·h±h³Ó,@Ñ@À5ÑHÑHˆFØÐ1´C¸×8HÑ8HÓ4IÑIÈEÑQÑQˆFØÐ*¬S°·±«^Ñ;¸eÑCÑCˆFØ�‹Ø—z‘zÐ-Ð-Ð-Ø  B§J¡JÑ.Ð.Ð.ØŸ*™* YÑ/�ØÜ×+Ñ+Ü×.Ñ.ðñ ð Ð3´c¸"¿*¹*ÀWÑ:MÓ6NÑNÐQVÑVÑV�FØðô ˜bŸj™j¨Ñ6Ó7ñ8ð  ñ	 ñ‘Fð Ü×,Ñ,Ü×/Ñ/Ü×:Ñ:ð!ñ ð
 ðô ˜bŸj™j¨Ñ1Ó2ñ3ð  ñ	 ñ�Fð ðô ˜bŸj™j¨Ñ6Ó7ñ8ð  ñ	 ñ�Fð ðô ˜bŸj™j¨Ñ0Ó1ñ2ð  ñ	 ñ‘Fô 'Ð)>¸w¸iÐ'HÓIÐIØÐ/´#°b·j±jÀÑ6KÓ2LÑLÈuÑTÑT�ØˆMrL   Útc                 óp   — t        |j                  «      t        t        |j                  «      «      z   dz   S )Nr‘   )rp   rÁ   rº   r8   )rG   rÐ   s     rJ   Ú_get_tensor_labelzFxGraphDrawer._get_tensor_label€  s'   € Ü�q—w‘w“<¤#¤d¨1¯7©7£mÓ"4Ñ4°uÑ<Ð<rL   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 )Nrn   z|op_code=get_Ú	parameterzbuffer\lr±   ry   r{   )r   Únamed_parametersÚnamed_buffersr/   rB   rC   r}   Ú	ParameterÚpydotÚNoderÒ   r;   Úadd_nodeÚadd_edgeÚEdge)	ÚpnameÚptensorÚpname1Úlabel1Ú
dot_w_nodeÚ	dot_graphr²   rH   rG   s	        €€€€rJ   Úget_module_params_or_buffersz;FxGraphDrawer._to_dot.<locals>.get_module_params_or_buffers³  sá   ø€ Ü*/Ø#×4Ñ4Ó6¸×8QÑ8QÓ8Só+ò J™˜˜wð "&§¡¨S¡°5Ñ!8˜ô  *¨'´5·8±8×3EÑ3EÔFð # _Ñ4°{ÒBà!1ð ô
 &+§Z¡ZØ"ñ&à"%¨¡,°×1GÑ1GÈÓ1PÑ"PÐSVÑ"Vð&ô /ñ&˜
ð
 "×*Ñ*¨:Ô6Ø!×*Ñ*¬5¯:©:°f¸d¿i¹iÓ+HÕIñJrL   r   ÚcolorÚ	royalblueÚpenwidthÚ2)rÛ   ÚDotr>   r?   r@   rk   rÜ   r/   r·   r©   rª   r¬   ÚClusterrÝ   rA   rB   rC   rD   rE   r»   ÚsetÚadd_subgraphr¨   rÞ   rß   )rG   r.   r/   r0   r1   r2   r3   Úbuf_name_to_subgraphr*   Údot_nodeÚcurrent_graphr¢   Úbuf_nameræ   ÚsubgraphÚuserrå   r²   rH   s   `               @@@rJ   r<   zFxGraphDrawer._to_dot…  s	  û€ ô  Ÿ	™	 $°Ô5ˆIà#%Ð à$×*Ñ*×0Ñ0ó 27�Ù! d§g¡g°Ò&;Øà×,Ñ,¨TÓ2�Ü Ÿ:™:Ø—I‘Iñà×.Ñ.Ø$ dÐ,CÐEVóðð
 ñ�ð !*�àŸ9™9Ÿ=™=¨°TÓ:�ØÐ'¨H×,=Ñ,=ÀÒ,AØ'Ÿ}™}�HØÐ';Ñ;Ü9>¿¹Ø$¨Hô:Ð,¨XÑ6ð %9×$<Ñ$<¸XÓ$F�Mà×&Ñ& xÔ0÷Jð$ —7‘7˜mÓ+Ø"&×"5Ñ"5°lÀDÓ"I�Kã8ÄØ#¤U§X¡X×%9Ñ%9öBñ 5Ö6ðe27ðh 1×7Ñ7Ó9ò 1�Ø—‘˜W kÔ2Ø—‘˜Z¨Ô-Ø×&Ñ& xÕ0ð1ð
 %×*Ñ*×0Ñ0ò I�Ù! d§g¡g°Ò&;Øà ŸJ™Jò I�DØ×&Ñ&¤u§z¡z°$·)±)¸T¿Y¹YÓ'GÕHñIð	Ið ÐrL   ©FFTFNFrU   )é   )"Ú__name__Ú
__module__Ú__qualname__Ú__doc__rC   rD   rE   rp   Úboolr   rK   rÛ   rë   rS   rO   rP   r“   rZ   rÜ   rk   r}   r~   rA   r   r‚   ra   r‰   r·   r«   r   r¹   ÚTensorrÒ   r<   © rL   rJ   r   r   >   s5  „ ñ	ð $)Ø27Ø,0Ø&+Ø-1Ø#(ñ-	àŸ(™(×.Ñ.ð-	ð ð-	ð !ð	-	ð
 ,0ð-	ð &*ð-	ð  $ð-	ð & c™]ð-	ð !ó-	ñ^	>°U·Y±Yó 	>ð:	0¨¯	©	ó 	0ð	C°u·y±yó 	Cð	$¨¨S°%·)±)¨^Ñ(<ó 	$ð	¨¯©¯©ð 	¸$¸sÀC¸x¹.ó 	ð.	ØŸ(™(Ÿ/™/ð	Ø16·±·±ð	à�X‰X�_‰_ó	ð	? Cð 	?¨Có 	?ð& '(ñ	"àð	"ð !$ó	"ðU	à—H‘H×(Ñ(ðU	ð —(‘(—-‘-ðU	ð &*ð	U	ð
  $ðU	ð óU	ðn	O¨só 	Oð.5	¨^ð 5	Àó 5	ðn	= u§|¡|ð 	=¸ó 	=ð
T	àŸ(™(×.Ñ.ðT	ð ðT	ð !ð	T	ð
 ,0ðT	ð &*ðT	ð  $ðT	ð �Y‰YôT	rL   c                   óp   — e Zd Z	 	 	 	 	 	 ddej                  j
                  dedededededee   d	efd
„Z	y)r   Nr.   r/   r0   r1   r2   r3   r4   r5   c	                 ó   — t        d«      ‚)Nz|FXGraphDrawer requires the pydot package to be installed. Please install pydot through your favorite Python package manager.)rs   )	rG   r.   r/   r0   r1   r2   r3   r4   r5   s	            rJ   rK   zFxGraphDrawer.__init__à  s   € ô #ðJóð rL   rõ   )
r÷   rø   rù   rC   rD   rE   rp   rû   r   rK   rý   rL   rJ   r   r   Þ  sw   „ ð (-Ø6;Ø04Ø*/Ø15Ø',ñà#Ÿh™h×2Ñ2ðð ðð !%ð	ð
 04ðð *.ðð $(ðð "*¨#¡ðð !%ôrL   )rb   Ú	itertoolsr   Útypingr   r   r   rC   Útorch.fxÚtorch.fx._compatibilityr   Útorch.fx.graphr   Útorch.fx.noder	   r
   Útorch.fx.operator_schemasr   Útorch.fx.passes.shape_propr   rÛ   Ú	HAS_PYDOTÚModuleNotFoundErrorÚ__all__r_   rf   r;   r   rý   rL   rJ   ú<module>r     sØ   ðó Ý ß /Ñ /ã Û Ý 1Ý -ß :Ý 8Ý 5ðÛà€Ið Ð
€ð !Ø"ØØØñ€
ò€ð( ØØñÐ ñ á¨%Ô0÷Zð Zó 1ñZñz á	¨eÔ	4÷	ð 	ó 
5ñ	ð øðQ ò Ø€IØ‚Eðús   ¾B Â	BÂB