§
    Ÿ²ÅjK  ã                   óf  — 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n# e$ r d
ZdZY nw xY w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dS es! ed
¬¦  «         G d„ d¦  «        ¦   «         ZdS dS )é    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                   ó6  — 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!dS )'r   z»
        Visualize a torch.fx.Graph with graphviz
        Basic usage:
            g = FxGraphDrawer(symbolic_traced, "resnet18")
            g.get_dot_graph().write_svg("a.svg")
        FTNÚ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<   ||                      ||||||¦  «        i| _        |j        j        D ]z}	|	j        dk    rŒ|  	                    ||	¦  «        }
t          |
t          j        j        ¦  «        sŒD|                      |
|› d|	j        › �||||¦  «        | j        |› d|	j        › �<   Œ{d S )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              úMC:\Projects\Historical\venv\Lib\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ð ð �Ø”7˜mÒ+Ð+Øà ×/Ò/°¸dÑCÔC�	å! )­U¬XÔ-AÑBÔBð Øà<@¿LºLØØÐ+Ð+˜dœkÐ+Ð+Ø"Ø1Ø+Ø%ñ=ô =�Ô  DÐ!8Ð!8¨4¬;Ð!8Ð!8Ñ9Ð9ðð ó    Úreturnc                 óX   — |€|                       ¦   «         S |                      |¦  «        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_graphv   s0   € ð0 Ð"Ø×.Ò.Ñ0Ô0Ð0à×0Ò0°Ñ=Ô=Ð=rM   c                 ó&   — | j         | j                 S ©N©r>   r;   ©rH   s    rK   rP   z FxGraphDrawer.get_main_dot_graph“   s   € ØÔ# D¤JÔ/Ð/rM   c                 ó0   — | j         | j        › d|› �         S )Nr:   rW   rR   s     rK   rQ   z"FxGraphDrawer.get_submod_dot_graph–   s    € ØÔ# t¤zÐ$AÐ$A°KÐ$AÐ$AÔBÐBrM   c                 ó   — | j         S rV   )r>   rX   s    rK   Úget_all_dot_graphsz FxGraphDrawer.get_all_dot_graphs™   s   € ØÔ#Ð#rM   rI   c                 ó€  — | j         ddddœ}|j        t          v rt          |j                 |d<   n�|                     |j        ¦  «        }t          t          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�*Ð$Ð$Ý(2°4´7Ô(;�˜Ñ%Ð%ð #×7Ò7¸¼ÑDÔD�Ý!¥'¤+¨k×.@Ò.@Ñ.BÔ.BÑ"CÔ"C×"MÒ"MÑ"OÔ"OÐPRÐQRÐPRÔ"SÐUWÑXÔX�Ý(7Ø¥#¥oÑ"6Ô"6Ñ6ô)�˜Ñ%ð ˆOrM   Úmodulec                 ó
  — |}t          |j        t          ¦  «        sJ ‚|j                             d¦  «        }|D ]G}t	          ||¦  «        s%t          t          |¦  «        dz   |z   dz   ¦  «        ‚t          ||¦  «        }ŒH|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­3Ñ/Ô/Ð/Ð/Ð/Ø”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          |¦  «        }|                     dd¦  «                             dd¦  «        S )NÚ{ú\{Ú}ú\})rC   rD   ÚnnÚModuleÚtypenamerp   r   Úreplace)rH   rG   Úrets      rK   Ú	_typenamezFxGraphDrawer._typename¼   su   € Ý˜&¥%¤(¤/Ñ2Ô2ð 2Ý”n VÑ,Ô,��Ý˜F¥CÑ(Ô(ð 2Ø��å)¨&Ñ1Ô1�ð
 —;’;˜s EÑ*Ô*×2Ò2°3¸Ñ>Ô>Ð>rM   é   Úfull_file_nameÚtruncate_to_last_nc                 ó’   — |                      d¦  «        }t          |¦  «        |k    rd                     || d …         ¦  «        S |S )Nú/)rq   rg   Újoin)rH   r„   r…   Úsplitss       rK   Ú_shorten_file_namez FxGraphDrawer._shorten_file_nameÌ   sP   € ð
 $×)Ò)¨#Ñ.Ô.ˆFÝ�6‰{Œ{Ð0Ò0Ð0Ø—x’x Ð(:Ð':Ð';Ð';Ô <Ñ=Ô=Ð=Ø!Ð!rM   c                 ó€  ‡‡— ˆfd„}dd|j         › d|j        › d�z   }|j        dk    ru|                      ||¦  «        Š|d|                      ‰¦  «        z   dz   z  }d	}t	          ‰d
¦  «        r&d                     ˆfd„‰j        D ¦   «         ¦  «        }||dz   z  }nÜ|d|                      |j        ¦  «        › �dz   z  }| j        rE	 t          |j        |j
        |j        d¬¦  «        \  }}	n,# t          $ r |j
        |j        }	}Y nw xY w|j
        |j        }	}t          |¦  «        dk    r| ||¦  «        z  }t          |	¦  «        dk    r| ||	¦  «        z  }|dt          |j        ¦  «        › �dz   z  }|j                             d¦  «        }
||                      |
¦  «        z  }|j                             dd ¦  «        }|� |d|j         › �dz   z  }|d|j        › �dz   z  }|rP|j        �It)          |j        ¦  «        }|                      |j        ¦  «        }|d|› d|j        › d|j        › �dz   z  }|dz   S )Nc                 ó  •— t          | t          ¦  «        rd\  }}d„ | D ¦   «         }n;t          | t          ¦  «        r$d\  }}d„ |                      ¦   «         D ¦   «         }ndS ‰rd„ |D ¦   «         }t	          |¦  «        dk    rdS |d                     |¦  «        z   |z   }t	          |¦  «        d	k    r*|                     d
d¦  «                             dd¦  «        }|                     dd¦  «                             dd¦  «        S )N)z	|args=(\lz,\n)\lc                 ó0   — g | ]}t          |d ¬¦  «        ‘ŒS )r]   ©Úmax_list_len©r
   ©Ú.0Úas     rK   ú
<listcomp>zSFxGraphDrawer._get_node_label.<locals>._get_str_for_args_kwargs.<locals>.<listcomp>à   s%   € Ð$QÐ$QÐ$QÈ¥[°ÀÐ%CÑ%CÔ%CÐ$QÐ$QÐ$QrM   )z|kwargs={\lz,\n}\lc                 ó@   — g | ]\  }}|› d t          |d¬¦  «        › �‘ŒS )ú: r]   rŽ   r�   )r’   ÚkÚvs      rK   r”   zSFxGraphDrawer._get_node_label.<locals>._get_str_for_args_kwargs.<locals>.<listcomp>ã   sD   € ð %ð %ð %ÙEIÀQÈ˜1Ð@Ð@¥¨A¸AÐ >Ñ >Ô >Ð@Ð@ð%ð %ð %rM   Ú c                 ó   — g | ]}d |v¯|‘Œ	S )ú%© r‘   s     rK   r”   zSFxGraphDrawer._get_node_label.<locals>._get_str_for_args_kwargs.<locals>.<listcomp>ë   s   € Ð$NÐ$NÐ$N¨1ÀÈAÀÀ QÀÀÀrM   r   z,\né   z\lú\nry   rz   r{   r|   )rC   ÚtupleÚdictÚitemsrg   rˆ   r€   )ÚargÚprefixÚsuffixÚarg_strs_listÚ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Ø$QÐ$QÈSÐ$QÑ$QÔ$Q�M�MÝ ¥TÑ*Ô*ð Ø%>‘N�F˜Fð%ð %ØMPÏYÊYÉ[Ì[ð%ñ %ô %�M�Mð ˜2ð +ð OØ$NÐ$N°Ð$NÑ$NÔ$N�MÝ�}Ñ%Ô%¨Ò*Ð*Ø˜2Ø! F§K¢K°Ñ$>Ô$>Ñ>ÀÑG�Ý�}Ñ%Ô%¨Ò*Ð*Ø'×/Ò/°°rÑ:Ô:×BÒBÀ5È"ÑMÔM�HØ×'Ò'¨¨UÑ3Ô3×;Ò;¸CÀÑGÔGÐGrM   ry   zname=%z	|op_code=ú
r   rž   z\n|r™   Ú__constants__c                 ó:   •— g | ]}|› d t          ‰|¦  «        › �‘ŒS )r–   )rt   )r’   ÚcÚleaf_modules     €rK   r”   z1FxGraphDrawer._get_node_label.<locals>.<listcomp>û   sA   ø€ ð ð ð à !ð  !Ð=Ð=¥G¨K¸Ñ$;Ô$;Ð=Ð=ðð ð rM   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©   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Úextrar²   r³   r®   r¯   Úparsed_stack_traceÚfnamer¬   s      `          @rK   Ú_get_node_labelzFxGraphDrawer._get_node_labelÖ   sð  øø€ ðHð Hð Hð Hð Hð, ÐB 4¤9ÐBÐB°t´wÐBÐBÐBÑBˆEàŒw˜-Ò'Ð'Ø"×1Ò1°&¸$Ñ?Ô?�Ø˜ §¢°Ñ!<Ô!<Ñ<¸vÑEÑE�Ø�Ý˜;¨Ñ8Ô8ð Ø!ŸJšJðð ð ð à%0Ô%>ðñ ô ñô �Eð ˜ ™Ñ&��àÐA D§N¢N°4´;Ñ$?Ô$?ÐAÐAÀEÑIÑI�ØÔ&ð :ð
>Ý'9Ø œKØ œIØ œKØ9=ð	(ñ (ô (™˜˜f˜føõ %ð >ð >ð >ð (,¤y°$´+˜f˜˜˜ð>øøøð
 $(¤9¨d¬k˜&�DÝ�t‘9”9˜q’=�=ØÐ5Ð5°dÑ;Ô;Ñ;�EÝ�v‘;”; ’?�?ØÐ5Ð5°fÑ=Ô=Ñ=�EØÐ8¥s¨4¬:¡¤Ð8Ð8¸5Ñ@Ñ@�àœ)Ÿ-š-¨Ñ6Ô6ˆKØ�T×/Ò/°Ñ<Ô<Ñ<ˆEð ”y—}’} Z°Ñ6Ô6ˆHØÐ#ØÐ0 ¤Ð0Ð0°5Ñ8Ñ8�ØÐ9 hÔ&7Ð9Ð9¸EÑAÑA�ð !ð  TÔ%5Ð%AÝ%7¸Ô8HÑ%IÔ%IÐ"Ø×/Ò/Ð0BÔ0GÑHÔH�ØØZ˜UÐZÐZÐ%7Ô%>ÐZÐZÐASÔAXÐZÐZØññ�ð
 ˜3‘;Ðs   Ã	%C/ Ã/D
Ä	D
c                 ó  — |€dS t          |t          ¦  «        r|                      |¦  «        S t          |t          ¦  «        r!d}|D ]}||                      |¦  «        z  }Œ|S t          |t
          ¦  «        r3d}|                     ¦   «         D ]}||                      |¦  «        z  }Œ|S t          |t          ¦  «        r!d}|D ]}||                      |¦  «        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Ø�rÝ˜B¥Ñ/Ô/ð OØ×2Ò2°2Ñ6Ô6Ð6Ý˜B¥Ñ%Ô%ð OØ�Øð ?ð ?�DØ˜d×8Ò8¸Ñ>Ô>Ñ>�F�FØ�Ý˜B¥Ñ%Ô%ð OØ�ØŸš™œð <ð <�AØ˜d×8Ò8¸Ñ;Ô;Ñ;�F�FØ�Ý˜B¥Ñ&Ô&ð OØ�Øð ?ð ?�DØ˜d×8Ò8¸Ñ>Ô>Ñ>�F�FØ�å"Ð#MÅ4ÈÁ8Ä8Ð#MÐ#MÑNÔ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        �rF|j	        €J ‚d	|j	        v sJ ‚|j	        d	         }|t          j        t          j        hv rG|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 rj|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_metaD  s\  € ØˆFÝ˜2˜wÑ'Ô'ð  Ý�d˜B‘”�ØÐ)­C°´©M¬MÑ9¸EÑAÑAˆFØÐ)­Cµ°b´h±´Ñ,@Ô,@Ñ@À5ÑHÑHˆFØÐ1µC¸Ô8HÑ4IÔ4IÑIÈEÑQÑQˆFØÐ*­S°´©^¬^Ñ;¸eÑCÑCˆFØŒñ ,UØ”zÐ-Ð-Ð-Ø  B¤JÐ.Ð.Ð.Ð.Øœ* YÔ/�ØÝÔ+ÝÔ.ðð ð ð Ð3µc¸"¼*ÀWÔ:MÑ6NÔ6NÑNÐQVÑVÑV�FØðõ ˜bœj¨Ô6Ñ7Ô7ñ8ð  ñ	 ñ�F�Fð ÝÔ,ÝÔ/ÝÔ:ð!ð ð ð
 ðõ ˜bœj¨Ô1Ñ2Ô2ñ3ð  ñ	 ñ�Fð ðõ ˜bœj¨Ô6Ñ7Ô7ñ8ð  ñ	 ñ�Fð ðõ ˜bœj¨Ô0Ñ1Ô1ñ2ð  ñ	 ñ�F�Fõ 'Ð'H¸wÐ'HÐ'HÑIÔIÐIØÐ/µ#°b´jÀÔ6KÑ2LÔ2LÑLÈuÑTÑT�ØˆMrM   Útc                 ót   — t          |j        ¦  «        t          t          |j        ¦  «        ¦  «        z   dz   S )Nrž   )rp   rÌ   rÅ   r9   )rH   rÛ   s     rK   Ú_get_tensor_labelzFxGraphDrawer._get_tensor_label{  s*   € Ý�q”w‘<”<¥#¥d¨1¬7¡m¤mÑ"4Ô"4Ñ4°uÑ<Ð<rM   c                 óþ  ‡ ‡‡‡— t          j        |d¬¦  «        Ši }|j        j        D �]!Š|r‰j        dk    rŒ‰                      ‰¦  «        }t          j        ‰j        fd‰                      |‰||¦  «        i|¤Ž}	‰}
‰j	         
                    dd¦  «        }|�D|j        dk    r9|j        }||vrt          j        ||¬¦  «        ||<   | 
                    |¦  «        }
|
                     |	¦  «         ˆˆˆˆ fd	„}‰j        d
k    rA‰                      |‰¦  «        Š|s)t          ‰t           j        j        ¦  «        s
 |¦   «          �Œ#|                     ¦   «         D ]C}|                     dd¦  «         |                     dd¦  «         ‰                     |¦  «         ŒD|j        j        D ]LŠ|r‰j        dk    rŒ‰j        D ]4}‰                     t          j        ‰j        |j        ¦  «        ¦  «         Œ5ŒM‰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          ‰                     ¦   «         ‰                     ¦   «         ¦  «        D ]²\  } }‰j        dz   | z   }t	          |t
          j        j        ¦  «        r|dz   dz   nd}t          j	        |fdd|z   ‰ 
                    |¦  «        z   dz   it          ¤Ž}‰                     |¦  «         ‰                     t          j        |‰j        ¦  «        ¦  «         Œ³d S )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Ô6¸×8QÒ8QÑ8SÔ8Sñ+ô +ð Jð J™˜˜wð "&¤¨S¡°5Ñ!8˜õ  *¨'µ5´8Ô3EÑFÔFð2˜F _Ñ4°{ÑBÐBà!1ð õ
 &+¤ZØ"ð&ð &à"%¨¡,°×1GÒ1GÈÑ1PÔ1PÑ"PÐSVÑ"Vð&õ /ð&ð &˜
ð
 "×*Ò*¨:Ñ6Ô6Ð6Ø!×*Ò*­5¬:°f¸d¼iÑ+HÔ+HÑIÔIÐIÐIðJð 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Ñ5Ô5ˆIà#%Ð à$Ô*Ô0ð 27ñ 27�Ø!ð  d¤g°Ò&;Ð&;Øà×,Ò,¨TÑ2Ô2�Ý œ:Ø”Iðð à×.Ò.Ø$ dÐ,CÐEVñô ðð
 ðð �ð !*�àœ9Ÿ=š=¨°TÑ:Ô:�ØÐ'¨HÔ,=ÀÒ,AÐ,AØ'œ}�HØÐ';Ð;Ð;Ý9>¼Ø$¨Hð:ñ :ô :Ð,¨XÑ6ð %9×$<Ò$<¸XÑ$FÔ$F�Mà×&Ò& xÑ0Ô0Ð0ðJð Jð Jð Jð Jð Jð Jð Jð$ ”7˜mÒ+Ð+Ø"&×"5Ò"5°lÀDÑ"IÔ"I�Kà8ð 7ÅØ#¥U¤XÔ%9ñBô Bð 7ð 5Ð4Ñ6Ô6Ð6ùà0×7Ò7Ñ9Ô9ð 1ð 1�Ø—’˜W kÑ2Ô2Ð2Ø—’˜Z¨Ñ-Ô-Ð-Ø×&Ò& xÑ0Ô0Ð0Ð0à$Ô*Ô0ð Ið I�Ø!ð  d¤g°Ò&;Ð&;Øà œJð Ið I�DØ×&Ò&¥u¤z°$´)¸T¼YÑ'GÔ'GÑHÔHÐHÐHðIð ÐrM   ©FFTFNFrV   )rƒ   )"Ú__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=   rœ   rM   rK   r   r   >   s  € € € € € ð	ð 	ð $)Ø27Ø,0Ø&+Ø-1Ø#(ð-	ð -	àœ(Ô.ð-	ð ð-	ð !ð	-	ð
 ,0ð-	ð &*ð-	ð  $ð-	ð & cœ]ð-	ð !ð-	ð -	ð -	ð -	ð^	>ð 	>°U´Yð 	>ð 	>ð 	>ð 	>ð:	0¨¬	ð 	0ð 	0ð 	0ð 	0ð	C°u´yð 	Cð 	Cð 	Cð 	Cð	$¨¨S°%´)¨^Ô(<ð 	$ð 	$ð 	$ð 	$ð	¨¬¬ð 	¸$¸sÀC¸x¼.ð 	ð 	ð 	ð 	ð$	Øœ(œ/ð	Ø16´´ð	àŒXŒ_ð	ð 	ð 	ð 	ð	? Cð 	?¨Cð 	?ð 	?ð 	?ð 	?ð& '(ð	"ð 	"àð	"ð !$ð	"ð 	"ð 	"ð 	"ðU	à”HÔ(ðU	ð ”(”-ðU	ð &*ð	U	ð
  $ðU	ð ðU	ð U	ð U	ð U	ðn	O¨sð 	Oð 	Oð 	Oð 	Oð.5	¨^ð 5	Àð 5	ð 5	ð 5	ð 5	ðn	= u¤|ð 	=¸ð 	=ð 	=ð 	=ð 	=ð
T	àœ(Ô.ðT	ð ðT	ð !ð	T	ð
 ,0ðT	ð &*ðT	ð  $ðT	ð ŒYðT	ð T	ð T	ð T	ð T	ð T	rM   c                   ód   — 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	dS )r   FTNr/   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   € õ #ðJñô ð rM   r   )
r  r  r  rD   rE   rF   rp   r  r   rL   rœ   rM   rK   r   r   Ù  s˜   € € € € € ð (-Ø6;Ø04Ø*/Ø15Ø',ðð à#œhÔ2ðð ðð !%ð	ð
 04ðð *.ðð $(ðð "*¨#¤ðð !%ðð ð ð ð ð 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Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5à €€€Ø €€€Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø -Ð -Ð -Ð -Ð -Ð -Ø :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5ðØ€L€L€Là€I€IøØð ð ð Ø€IØ€E€E€Eðøøøð
 Ð
€ð !Ø"ØØØðð €
ðð ð €ð( ØØðð Ð ð ð mà€]¨%Ð0Ñ0Ô0ðUð Uð Uð Uð Uñ Uô Uñ 1Ô0ðUð Uð Uðp ð à	ˆ¨eÐ	4Ñ	4Ô	4ð	ð 	ð 	ð 	ð 	ñ 	ô 	ñ 
5Ô	4ð	ð 	ð 	ðð s   Á A Á	AÁA