Ë
    P/æj©D  ã                   ó:  — d dl Z d dlmZ d dlmZ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ÚDictÚ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   Ú_)Ú_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              ú_/root/repos/pocs/video-evals/.venv/lib/python3.12/site-packages/torch/fx/passes/graph_drawer.pyÚ__init__zFxGraphDrawer.__init__F   s  € ð ˆDŒJà#2Ð#>‘ÀHð Ô ð #1ˆDÔØ(,×(<Ñ(<Ô˜WÑ%ð �d—l‘lØ  $¨Ð8UÐWnð  qBóð ˆ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©rH   Úsubmod_names     rK   Úget_dot_graphzFxGraphDrawer.get_dot_graphp   s*   € ð0 Ð"Ø×.Ñ.Ó0Ð0à×0Ñ0°Ó=Ð=rM   c                 ó4   — | j                   | j                     S ©N©r>   r;   ©rH   s    rK   rP   z FxGraphDrawer.get_main_dot_graph�   s   € Ø×#Ñ# D§J¡JÑ/Ð/rM   c                 ó>   — | j                   | j                  › d|› �   S )Nr:   rW   rR   s     rK   rQ   z"FxGraphDrawer.get_submod_dot_graph�   s"   € Ø×#Ñ# t§z¡z l°!°K°=Ð$AÑBÐBrM   c                 ó   — | j                   S rV   )r>   rX   s    rK   Úget_all_dot_graphsz FxGraphDrawer.get_all_dot_graphs“   s   € Ø×#Ñ#Ð#rM   rI   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)   )r9   r*   r+   r,   r*   é   é   )r5   rA   Ú
_COLOR_MAPÚ_pretty_print_targetrG   ÚintÚhashlibÚmd5ÚencodeÚ	hexdigestÚ_HASH_COLOR_MAPÚlen)rH   rI   ÚtemplateÚtarget_nameÚtarget_hashs        rK   Ú_get_node_stylezFxGraphDrawer._get_node_style–   sª   € ð ×-Ñ-Ø&Ø+Ø&ñ	ˆHð �w‰wœ*Ñ$Ü(2°4·7±7Ñ(;�˜Ñ%ð ˆOð #×7Ñ7¸¿¹ÓD�Ü!¤'§+¡+¨k×.@Ñ.@Ó.BÓ"C×"MÑ"MÓ"OÐPRÐQRÐ"SÐUWÓX�Ü(7¸ÄcÌ/ÓFZÑ8ZÑ([�˜Ñ%ØˆOrM   Ú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 ú!)rC   rG   ÚstrÚsplitÚhasattrÚRuntimeErrorÚgetattr)rH   rl   rI   Úpy_objÚatomsÚatoms         rK   rB   zFxGraphDrawer._get_leaf_node§   sƒ   € ð ˆFÜ˜dŸk™k¬3Ô/Ð/Ð/Ø—K‘K×%Ñ% cÓ*ˆEØò /�Ü˜v tÔ,Ü&Ü˜F›Ð&AÑAÀDÑHÈ3ÑNóð ô ! ¨Ó.‘ð/ð ˆMrM   rG   c                 óö   — t        |t        j                  j                  «      rt        j                  |«      }nt        |t
        «      r|}nt        |«      }|j                  dd«      j                  dd«      S )Nú{ú\{ú}ú\})rC   rD   ÚnnÚModuleÚtypenamerp   r   Úreplace)rH   rG   Úrets      rK   Ú	_typenamezFxGraphDrawer._typenameµ   s[   € Ü˜&¤%§(¡(§/¡/Ô2Ü—n‘n VÓ,‘Ü˜F¤CÔ(Ø‘ä)¨&Ó1�ð
 —;‘;˜s EÓ*×2Ñ2°3¸Ó>Ð>rM   Úfull_file_nameÚtruncate_to_last_nc                 ón   — |j                  d«      }t        |«      |k\  rdj                  || d  «      S |S )Nú/)rq   rg   Újoin)rH   rƒ   r„   Úsplitss       rK   Ú_shorten_file_namez FxGraphDrawer._shorten_file_nameÅ   sB   € ð
 $×)Ñ)¨#Ó.ˆFÜ�6‹{Ð0Ò0Ø—x‘x Ð(:Ð':Ð';Ð <Ó=Ð=Ø!Ð!rM   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|   )rC   Útupler
   ÚdictÚitemsrg   r‡   r€   )	ÚargÚprefixÚsuffixÚaÚarg_strs_listÚkÚvÚarg_strsr3   s	           €rK   Ú_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ð %(§I¡I£K÷%á ˜A˜qð ˜#˜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{   )r0   rA   rB   r‚   rr   r‡   rŸ   rt   rG   r6   r   ÚargsÚkwargsÚ	Exceptionrg   ÚusersÚmetaÚgetÚ_tensor_meta_to_labelÚn_originÚstack_tracer	   r‰   ÚfileÚlinenoÚcode)rH   rl   rI   r3   r4   r�   ÚlabelÚleaf_moduleÚextraÚcr¥   r¦   r¡   r¢   Úparsed_stack_traceÚfnames      `            rK   Ú_get_node_labelzFxGraphDrawer._get_node_labelÐ   s•  ø€ ôHð0 ˜F 4§9¡9 +¨Y°t·w±w°i¸rÐBÑBˆEà�w‰w˜-Ò'Ø"×1Ñ1°&¸$Ó?�Ø˜ §¡°Ó!<Ñ<¸vÑEÑE�Ø�Ü˜;¨Ô8Ø!ŸJ™JØDO×D]ÑD]Ö^¸q˜A˜3˜b¤¨°aÓ!8Ð 9Ò:Ò^ó�Eð ˜ ™Ñ&‘à˜8 D§N¡N°4·;±;Ó$?Ð#@ÐAÀEÑIÑI�Ø×&Ò&ð>Ü'9Ø ŸK™K¨¯©°D·K±KÐ^bô(™˜™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�Ø˜6 % ¨Ð*<×*CÑ*CÐ)DÀAÐFX×F]ÑF]ÐE^Ð_ÐbgÑgÑg�ð ˜3‘;ÐùòQ _øô %ò >ð (,§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 )
rC   r   Ú_stringify_tensor_metaÚlistr«   r“   Úvaluesr’   rs   Útype)rH   ÚtmÚresultÚitemr›   s        rK   r«   z#FxGraphDrawer._tensor_meta_to_label!  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ÐNrM   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’   r9   Úrequires_gradÚstrideÚis_quantizedÚqparamsrD   Úper_tensor_affineÚper_tensor_symmetricÚper_channel_affineÚper_channel_symmetricÚ per_channel_affine_float_qparamsrs   )rH   r½   r¾   rÂ   s       rK   r¹   z$FxGraphDrawer._stringify_tensor_meta8  s
  € Øˆ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Ñ/�ØÜ×/Ñ/Ü×2Ñ2ðñ ð Ð3´c¸"¿*¹*ÀWÑ:MÓ6NÑNÐQVÑVÑV�FØÐ8¼3¸r¿z¹zÈ,Ñ?WÓ;XÑXÐ[`Ñ`Ñ`‘FØÜ×0Ñ0Ü×3Ñ3Ü×>Ñ>ð!ñ ð
 Ð?Ä#ÀbÇjÁjÐQXÑFYÓBZÑZÐ]bÑbÑb�FØÐDÄsÈ2Ï:É:ÐVbÑKcÓGdÑdÐglÑlÑl�FØÐ>ÄÀRÇZÁZÐPVÑEWÓAXÑXÐ[`Ñ`Ñ`‘Fä&Ð)>¸w¸iÐ'HÓIÐIØÐ/´#°b·j±jÀÑ6KÓ2LÑLÈuÑTÑT�ØˆMrM   Útc                 óp   — t        |j                  «      t        t        |j                  «      «      z   dz   S )Nr‘   )rp   rÁ   rº   r9   )rH   rÐ   s     rK   Ú_get_tensor_labelzFxGraphDrawer._get_tensor_labelW  s'   € Ü�q—w‘w“<¤#¤d¨1¯7©7£mÓ"4Ñ4°uÑ<Ð<rM   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_buffersr0   rC   rD   r}   Ú	ParameterÚpydotÚNoderÒ   r<   Úadd_nodeÚadd_edgeÚEdge)	ÚpnameÚptensorÚpname1Úlabel1Ú
dot_w_nodeÚ	dot_graphr²   rI   rH   s	        €€€€rK   Ú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rM   r   ÚcolorÚ	royalblueÚpenwidthÚ2)rÛ   ÚDotr?   r@   rA   rk   rÜ   r0   r·   r©   rª   r¬   ÚClusterrÝ   rB   rC   rD   rE   rF   r»   ÚsetÚadd_subgraphr¨   rÞ   rß   )rH   r/   r0   r1   r2   r3   r4   Úbuf_name_to_subgraphr+   Údot_nodeÚcurrent_graphr¢   Úbuf_nameræ   ÚsubgraphÚuserrå   r²   rI   s   `               @@@rK   r=   zFxGraphDrawer._to_dot\  s  û€ ô  Ÿ	™	 $°Ô5ˆIð $&Ð à$×*Ñ*×0Ñ0ó *7�Ù! d§g¡g°Ò&;Øà×,Ñ,¨TÓ2�Ü Ÿ:™:Ø—I‘IñØ%)×%9Ñ%9¸,ÈÐNeÐgxÓ%yðð ~Cñ�ð !*�àŸ9™9Ÿ=™=¨°TÓ:�ØÐ'¨H×,=Ñ,=ÀÒ,AØ'Ÿ}™}�HØÐ';Ñ;Ü9>¿¹ÀxÐW_Ô9`Ð,¨XÑ6Ø$8×$<Ñ$<¸XÓ$F�Mà×&Ñ& xÔ0÷Jð$ —7‘7˜mÓ+Ø"&×"5Ñ"5°lÀDÓ"I�Kã8ÄÈKÔY^×YaÑYa×YmÑYmÖAnÙ4Ö6ðU*7ðX 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ð ÐrM   ©FFTFNFrV   )é   )"Ú__name__Ú
__module__Ú__qualname__Ú__doc__rD   rE   rF   rp   Úboolr   rL   rÛ   rë   rT   rP   rQ   r   r[   rÜ   rk   r}   r~   rB   r   r‚   ra   r‰   r·   r«   r   r¹   ÚTensorrÒ   r=   © rM   rK   r   r   =   s4  „ ñ	ð $)Ø27Ø,0Ø&+Ø-1Ø#(ñ(	àŸ(™(×.Ñ.ð(	ð ð(	ð !ð	(	ð
 ,0ð(	ð &*ð(	ð  $ð(	ð & c™]ð(	ð !ó(	ñT	>°U·Y±Yó 	>ð:	0¨¯	©	ó 	0ð	C°u·y±yó 	Cð	$¨¨S°%·)±)¨^Ñ(<ó 	$ð	¨¯©¯©ð 	¸$¸sÀC¸x¹.ó 	ð"	ØŸ(™(Ÿ/™/ð	Ø16·±·±ð	à�X‰X�_‰_ó	ð	? Cð 	?¨Có 	?ð& '(ñ	"àð	"ð !$ó	"ðO	à—H‘H×(Ñ(ðO	ð —(‘(—-‘-ðO	ð &*ð	O	ð
  $ðO	ð óO	ðb	O¨só 	Oð.	¨^ð 	Àó 	ð>	= u§|¡|ð 	=¸ó 	=ð
M	àŸ(™(×.Ñ.ðM	ð ðM	ð !ð	M	ð
 ,0ðM	ð &*ðM	ð  $ðM	ð �Y‰YôM	rM   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/   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.)rs   )	rH   r/   r0   r1   r2   r3   r4   r5   r6   s	            rK   rL   zFxGraphDrawer.__init__¯  s   € ô #ð $Yó Zð ZrM   rõ   )
r÷   rø   rù   rD   rE   rF   rp   rû   r   rL   rý   rM   rK   r   r   ­  s€   „ ð (-Ø6;Ø04Ø*/Ø15Ø',ñZà#Ÿh™h×2Ñ2ðZð ðZð !%ð	Zð
 04ðZð *.ðZð $(ðZð "*¨#¡ðZð !%ôZrM   )rb   Ú	itertoolsr   Útypingr   r   r   r   rD   Ú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ý   rM   rK   ú<module>r     sÛ   ðó Ý ß 5Ó 5ã Û Ý 1Ý -ß :Ý 8Ý 5ðÛà€Ið Ð
€ð !Ø"ØØØñ€
ò€ð( ØØñÐ ñ Ù¨%Ô0÷kð kó 1ñkñ\ Ù	¨eÔ	4÷	Zð 	Zó 
5ñ	Zð øðq ò Ø€IØ‚Eðús   Á B Â	BÂB