§
    Ÿ²Åjý,  ã                   ó´  — d dl Z d dlZd dlmZ d dlmZmZmZmZ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 g d¢Zeeej                 eej                 f         Zeej        ef         Zeej        j                 Ze
ej        j                 Zee         Zh d£Z ed¬	¦  «        d
„ ¦   «         Z ed¬	¦  «        deeej        j         f         dej        j        defd„¦   «         Z! ed¬	¦  «        dej        j        de"fd„¦   «         Z# ed¬	¦  «         G d„ d¦  «        ¦   «         Z$ ed¬	¦  «        dej        j%        dej        j%        fd„¦   «         Z&dS )é    N)Ú	dataclass)ÚAnyÚDictÚListÚMappingÚOptionalÚSetÚTupleÚUnion)Úcompatibility)Ú_get_qualified_name)Úget_acc_ops_nameÚget_node_targetÚis_node_output_tensorÚFxNetAccFusionsFinderÚlegalize_graph>   Úcall_methodÚcall_moduleÚcall_functionF)Úis_backward_compatiblec                 óº   — t          | t          ¦  «        r| S | j        rd| j        v r
d| j        › �S | j                             dd¦  «        }|r|nd› d| j        › �S )NÚacc_opsúacc_ops.z
torch._opsz	torch.opsÚ ú.)Ú
isinstanceÚstrÚ
__module__Ú__name__Úreplace)ÚkÚmodules     úMC:\Projects\Historical\venv\Lib\site-packages\torch/fx/passes/tools_common.pyr   r      s|   € å�!•SÑÔð :ØˆØ	
Œð :˜) q¤|Ð3Ð3Ø&˜!œ*Ð&Ð&Ð&à”×%Ò%Ø˜+ñ
ô 
ˆð #Ð*�&�&¨Ð9Ð9¨Q¬ZÐ9Ð9Ð9ó    Ú
submodulesÚnodeÚreturnc                 óü  — |j         t          v s0J dd                     t          ¦  «        z   d|j         › �z   ¦   «         ‚|j         dk    rVt          |j        t
          ¦  «        sJ ‚| |j                 }t          |dt          |¦  «        ¦  «        }t          |¦  «        S |j         dk    r0|j        }|j	        �d|j	        v r
d	|j
        › �nt          |¦  «        S t          |j        t
          ¦  «        sJ ‚|j        S )
a,  
    Given a `node` returns its target typename.

    For "call_method" node, return node.target which is the name of that method being called.
    This could potential lead to conflict but should be okay because normally it's on a tensor.

    For "call_function" node, return typename of node.target.

    For "call_module" node, return typename of the module that node.target point to.

    If seeing "_VariableFunctionsClass" in the target name string, it will be replaced by
    "torch". e.g. _VariableFunctionsClass.relu would become torch.relu.
    zExpect op types of z, z, but found r   Ú_base_class_originr   Nr   r   )ÚopÚCALLABLE_NODE_OPSÚjoinr   Útargetr   ÚgetattrÚtyper   r   r   r   )r%   r&   ÚsubmodÚsubmod_typer-   s        r#   r   r   *   s  € ð$ Œ7Õ'Ð'Ð'Ð'Ø §	¢	Õ*;Ñ <Ô <Ñ<Ð?WÈdÌgÐ?WÐ?WÑWñ (Ô'Ð'ð „w�-ÒÐÝ˜$œ+¥sÑ+Ô+Ð+Ð+Ð+Ø˜DœKÔ(ˆÝ˜fÐ&:½DÀ¹L¼LÑIÔIˆÝ Ñ,Ô,Ð,Ø	Œ�OÒ	#Ð	#Ø”kˆð Ô Ð,°¸fÔ>OÐ1OÐ1Oð )�v”Ð(Ð(Ð(å$ VÑ,Ô,ð	
õ ˜$œ+¥sÑ+Ô+Ð+Ð+Ð+ØŒ{Ðr$   c                 ót   — | j                              dd¦  «        }|duot          |t          j        ¦  «        S )a  Checks if the node output produces a Tensor or not.

    NOTE: This requires to run `ShapeProp` on the containing fx graph before
    calling this function. This is because it works by checking the `type`
    metadata on the node. This metadata is produced by the `ShapeProp`.
    r/   N)ÚmetaÚgetÚ
issubclassÚtorchÚTensor)r&   Útype_s     r#   r   r   Q   s5   € ð ŒI�MŠM˜& $Ñ'Ô'€EØ˜ÐÐ@¥¨Eµ5´<Ñ!@Ô!@Ð@r$   c                   óÄ   — e Zd ZdZdej        j        defd„Ze	 G d„ d¦  «        ¦   «         Z
	 ddd	d
eeef         dee         fd„Zdeej        j        ef         fd„ZdS )r   z…
    Finds groups of connected ACC nodes that pass non-tensor data between each other.
    Such groups are called fusion groups.
    r"   Ú	acc_nodesc                 ó^   — || _         t          |j        j        ¦  «        | _        || _        d S ©N)r"   ÚlistÚgraphÚnodesr:   )Úselfr"   r:   s      r#   Ú__init__zFxNetAccFusionsFinder.__init__d   s(   € ØˆŒÝ˜&œ,Ô,Ñ-Ô-ˆŒ
Ø"ˆŒˆˆr$   c                   ó>   — e Zd ZU eed<   eed<   eed<   eed<   d„ ZdS )ú!FxNetAccFusionsFinder.FusionGroupÚtop_node_idxr?   ÚinputsÚnodes_need_processc                 ó  ‡ — |‰ j         v rdS ‰ j                             |¦  «         ‰ j                              |¦  «         ‰ j                             |¦  «         ‰ j                             ˆ fd„|j        D ¦   «         ¦  «         dS )z5
            Add a node to fusion group.
            Nc                 óB   •— h | ]}|j         t          v ¯|‰j        v¯|’ŒS © )r*   r+   r?   )Ú.0Únr@   s     €r#   ú	<setcomp>z=FxNetAccFusionsFinder.FusionGroup.add_node.<locals>.<setcomp>‚   s=   ø€ ð ð ð àØ”tÕ0Ð0Ð0°Q¸d¼jÐ5HÐ5Hð à5HÐ5HÐ5Hr$   )r?   rF   ÚaddrE   ÚdiscardÚupdateÚall_input_nodes)r@   r&   s   ` r#   Úadd_nodez*FxNetAccFusionsFinder.FusionGroup.add_nodew   s¥   ø€ ð �t”zÐ!Ð!Ø�àÔ#×'Ò'¨Ñ-Ô-Ð-ØŒJ�NŠN˜4Ñ Ô Ð ØŒK×Ò Ñ%Ô%Ð%ØŒK×Òðð ð ð à!Ô1ðñ ô ñô ð ð ð r$   N)r   r   Ú__qualname__ÚintÚ__annotations__ÚNodeSetrQ   rI   r$   r#   ÚFusionGrouprC   i   sW   € € € € € € ð ÐÐÑð ˆˆ‰ð ˆˆ‰ð $Ð#Ð#Ñ#ð	ð 	ð 	ð 	ð 	r$   rV   NÚfusion_grouprC   rE   Úvisitedc                 ó.  — |D ]‘}|�||v rŒ	|                      |¦  «         |j        t          vrŒ-| j                             |¦  «        |j        k     rŒQ||j        v r dS |                      ||j        |¦  «        r|                     |¦  «          dS Œ’dS )z­
        Start from inputs and going reverse topological order. If any upstream node
        is in the fusion group, add all the nodes in this path to fusion group.
        NTF)	rM   r*   r+   r?   ÚindexrD   Úrecursive_add_noderP   rQ   )r@   rW   rE   rX   Úargs        r#   r[   z(FxNetAccFusionsFinder.recursive_add_node‰   sÊ   € ð ð 	ð 	ˆCàÐ"Ø˜'�>�>ØØ—’˜CÑ Ô Ð ð ŒvÕ.Ð.Ð.Øð Œz×Ò Ñ$Ô$ |Ô'@Ò@Ð@Øð �lÔ(Ð(Ð(Ø�t�tð ×&Ò& |°SÔ5HÈ'ÑRÔRð Ø×%Ò% cÑ*Ô*Ð*Ø�t�tðð ˆur$   r'   c                 ó\  — i }t          | j        ¦  «        }|D �]}||v rŒ|j        t          vrŒd|j        v rŒ!|| j        vrŒ+|                      | j                             |¦  «        |ht          |j	        ¦  «        |h¬¦  «        }|j
        �rQ|j
                             ¦   «         }|                      ||j        t          ¦   «         ¬¦  «         d|j        vra|j        D ]Y}|j        t          vrŒ||j        v rŒ|                     |¦  «         |                      ||j        t          ¦   «         ¬¦  «         ŒZ|j	        D ]•}|j        t          vrŒd|j        v rŒ||j        v rŒ%|                     |¦  «         t!          |j        | j                             |¦  «        ¦  «        |_        |                      ||j        t          ¦   «         ¬¦  «         Œ–|j
        �°Qt          |j        ¦  «        | j        k    s| xj        |j        z  c_        �Œý|j        D ]}|j        ||<   Œ�Œ|S )NÚtensor_meta)rD   r?   rE   rF   )rX   )r=   r:   r*   r+   r3   rV   r?   rZ   ÚsetrP   rF   Úpopr[   rE   ÚusersrQ   ÚminrD   )r@   Úresultr:   r&   rW   Úuserr\   rK   s           r#   Ú__call__zFxNetAccFusionsFinder.__call__¯   s   € Ø/1ˆÝ˜œÑ(Ô(ˆ	àð >	3ñ >	3ˆDØ�vˆ~ˆ~ØØŒwÕ/Ð/Ð/ØØ ¤	Ð)Ð)ØØ˜4œ>Ð)Ð)Øà>B×>NÒ>NØ!œZ×-Ò-¨dÑ3Ô3Ø�fÝ˜4Ô/Ñ0Ô0Ø$( 6ð	 ?Oñ ?ô ?ˆLð Ô1ñ (Ø#Ô6×:Ò:Ñ<Ô<�Ø×'Ò'Ø Ø Ô'Ý™EœEð (ñ ô ð ð !¨¬	Ð1Ð1Ø $¤
ð ð ˜Øœ7Õ*;Ð;Ð;Ø$Ø <Ô#5Ð5Ð5Ø$à$×-Ò-¨dÑ3Ô3Ð3Ø×/Ò/Ø(Ø(Ô/Ý$'¡E¤Eð 0ñ ô ð ð ð  Ô/ð ð �CØ”vÕ%6Ð6Ð6Ø Ø$¨¬Ð0Ð0Ø Ø˜lÔ0Ð0Ð0Ø à ×)Ò)¨#Ñ.Ô.Ð.Ý03Ø$Ô1°4´:×3CÒ3CÀCÑ3HÔ3Hñ1ô 1�LÔ-ð ×+Ò+Ø$Ø$Ô+Ý #¡¤ð ,ñ ô ð ð ðI Ô1ñ (õT ˜Ô*Ñ+Ô+¨t¬~Ò=Ð=Ø�” ,Ô"4Ñ4�”‘à%Ô+ð 3ð 3�AØ ,Ô 2�F˜1‘I�Iñ3ð ˆr$   r<   )r   r   rR   Ú__doc__r6   ÚfxÚGraphModulerU   rA   r   rV   r   ÚNodeListr   r[   r   ÚNodere   rI   r$   r#   r   r   ]   sô   € € € € € ðð ð
#˜uœxÔ3ð #Àð #ð #ð #ð #ð
 ðð ð ð ð ñ ô ñ „YððF &*ð	$ð $à9ð$ð �g˜xÐ'Ô(ð$ð ˜'Ô"ð	$ð $ð $ð $ðLD˜$˜uœxœ}¨gÐ5Ô6ð Dð Dð Dð Dð Dð Dr$   r   Úgmc                 ó¼  ‡‡— t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j	        t           j
        t           j        t           j        t          j        j        j        j        t          j        j        j        j        t          j        j        j        j        t          j        j        j        j        t          j        j        j        j        g}t.                               | j        j        d¦  «        Št          j                             ¦   «         }| j        j        D ]}|j        D ]}‰|xx         dz  cc<   ŒŒt=          j        ¦   «         }| j        j        D ]#}‰|         dk    r|                      |¦  «         Œ$i ŠtC          |¦  «        dk    r¨| "                    ¦   «         }| #                    |ˆfd„¦  «        ‰|<   |j        D ]]}‰|xx         dz  cc<   ‰|         dk    r?|j$        dk    r|j%        |v r| &                    |¦  «         ŒH|                      |¦  «         Œ^tC          |¦  «        dk    °¨tC          |j        ¦  «        tC          | j        j        ¦  «        k     rtO          dˆfd„‰D ¦   «         › �¦  «        ‚| j        j(        |_(        || _        | S )aì  
    Replace the graph of the given GraphModule with one that contains the same nodes as the
    original, but in topologically sorted order.

    This is used by the merge_matmul transformation below, which disturbs the topologically sorted
    order of its input GraphModule, so that this order is restored before further transformation.

    Arguments:
        gm: The graph module to topologically sort. It is modified in-place.

    Returns:
        The graph module in-place sorted
    r   é   c                 ó   •— ‰|          S r<   rI   )ÚxÚenvs    €r#   ú<lambda>z legalize_graph.<locals>.<lambda>.  s   ø€ °c¸!´f€ r$   r   z&Input graph has cycles, unable to add c                 ó,   •— g | ]}‰|         d k    ¯|‘ŒS )r   rI   )rJ   r&   Úindegs     €r#   ú
<listcomp>z"legalize_graph.<locals>.<listcomp>:  s+   ø€ Ð5aÐ5aÐ5a¸tÐPUÐVZÔP[Ð_`ÒP`ÐP`°dÐP`ÐP`ÐP`r$   ))ÚoperatorrM   ÚmulÚsubÚfloordivÚtruedivÚmodÚleÚltÚgeÚgtÚeqÚner6   ÚopsÚatenÚsym_constrain_rangeÚdefaultÚsym_constrain_range_for_sizeÚ_assert_asyncÚmsgÚscalar_tensorÚ_assert_scalarÚdictÚfromkeysr>   r?   rg   ÚGraphra   ÚcollectionsÚdequeÚappendÚlenÚpopleftÚ	node_copyr*   r-   Ú
appendleftÚRuntimeErrorÚ_codegen)	rk   ÚPRIORITIZED_OPSÚ	new_graphr&   rd   ÚqueueÚcurrp   rs   s	          @@r#   r   r   ö   sz  øø€ õ* 	ŒÝŒÝŒÝÔÝÔÝŒÝŒÝŒÝŒÝŒÝŒÝŒÝŒ	ŒÔ*Ô2ÝŒ	ŒÔ3Ô;ÝŒ	ŒÔ$Ô(ÝŒ	ŒÔ$Ô,ÝŒ	ŒÔ%Ô-ð#€Oõ( �MŠM˜"œ(œ.¨!Ñ,Ô,€EÝ”—’Ñ Ô €Ià””ð ð ˆØ”Jð 	ð 	ˆDØ�$ˆKˆKŒK˜1ÑˆKˆK‰KˆKð	å*Ô0Ñ2Ô2€Eà””ð ð ˆØ�Œ;˜!ÒÐØ�LŠL˜ÑÔÐøØ.0€Cõ ˆe‰*Œ*�qŠ.ˆ.Ø�mŠm‰oŒoˆØ×&Ò& sÐ,<Ð,<Ð,<Ð,<Ñ=Ô=ˆˆC‰Ø”Ið 	'ð 	'ˆDØ�$ˆKˆKŒK˜1ÑˆKˆK‰KØ�TŒ{˜aÒÐØ”7˜oÒ-Ð-°$´+ÀÐ2PÐ2PØ×$Ò$ TÑ*Ô*Ð*Ð*à—L’L Ñ&Ô&Ð&øõ ˆe‰*Œ*�qŠ.ˆ.õ ˆ9Œ?ÑÔ�c "¤(¤.Ñ1Ô1Ò1Ð1ÝØcÐ5aÐ5aÐ5aÐ5aÀuÐ5aÑ5aÔ5aÐcÐcñ
ô 
ð 	
ð œÔ*€IÔØ€B„HØ€Ir$   )'r�   ru   Údataclassesr   Útypingr   r   r   r   r   r	   r
   r   r6   Útorch.fxÚtorch.fx._compatibilityr   Útorch.fx.noder   Ú__all__r7   ÚTensorsÚTensorOrTensorsrg   rj   ri   rU   r   ÚNamesr+   r   ÚnnÚModuler   Úboolr   r   rh   r   rI   r$   r#   ú<module>r¦      s{  ðà Ð Ð Ð Ø €€€Ø !Ð !Ð !Ð !Ð !Ð !Ø HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ Hà €€€Ø €€€Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø -Ð -Ð -Ð -Ð -Ð -ðð ð €ð ��e”lÔ# T¨%¬,Ô%7Ð7Ô
8€Ø˜œ gÐ-Ô.€Ø�””Ô€Ø
ˆeŒhŒmÔ
€ØˆSŒ	€ØCÐCÐCÐ ð € eÐ,Ñ,Ô,ð	:ð 	:ñ -Ô,ð	:ð € eÐ,Ñ,Ô,ð#Ø˜˜UœXœ_Ð,Ô-ð#Ø5:´X´]ð#àð#ð #ð #ñ -Ô,ð#ðL € eÐ,Ñ,Ô,ðA ¤¤ð A°$ð Að Að Añ -Ô,ðAð € eÐ,Ñ,Ô,ðUð Uð Uð Uð Uñ Uô Uñ -Ô,ðUðp € eÐ,Ñ,Ô,ðG�u”xÔ+ð G°´Ô0Dð Gð Gð Gñ -Ô,ðGð Gð Gr$   