§
    Ÿ²Åj†  ã                   óò   — d dl Z d dlZd dlmZmZmZ d dlZd dlmZ d dl	m
Z
 d dlmZ dej        deej                 deej        d	f         fd
„Zdde
de
defd„Zdee
         fd„Zdej        j        fd„ZdS )é    N)ÚDictÚListÚTuple)Úsymbolic_trace)ÚNode)Úlegalize_graphÚresultÚinputsÚreturn.c                 óª   — t          | t          j        j        ¦  «        rdgt	          |¦  «        z  }nd„ |D ¦   «         }t          j        | |¦  «        S )a‰  
    A free function for use in the merge_matmul graph transformation below that
    splits the output from a merged matmul into the individual results for each
    input tensor.

    Arguments:
        result: The merged matmul result tensor.
        inputs: The list of inputs that were merged into one for the matmul.

    Returns:
        List of matmul results for each input tensor.
    r   c                 ó(   — g | ]}|j         d          ‘ŒS ©r   )Úshape)Ú.0Úxs     úSC:\Projects\Historical\venv\Lib\site-packages\torch/fx/experimental/merge_matmul.pyú
<listcomp>z(split_result_tensors.<locals>.<listcomp>    s   € Ð-Ð-Ð- �!”'˜!”*Ð-Ð-Ð-ó    )Ú
isinstanceÚtorchÚfxÚProxyÚlenÚsplit)r	   r
   Úsplitss      r   Úsplit_result_tensorsr      sS   € õ" �&�%œ(œ.Ñ)Ô)ð .Ø�•s˜6‘{”{Ñ"ˆˆà-Ð- fÐ-Ñ-Ô-ˆåŒ;�v˜vÑ&Ô&Ð&r   é   ÚaÚbÚsearch_depthc                 óœ   — | |k    rdS t          | j        ¦  «        dk    rdS |dk    rdS | j        D ]}t          |||dz
  ¦  «        r dS ŒdS )a^  
    Determine if one node depends on another in a torch.fx.Graph.

    Arguments:
        a: The node that may have a dependency on b.
        b: The node that a may have a dependency on.
        search_depth: In the case of an indirect dependency, this function
                        searches upto this many nodes away in search of a
                        data dependency. If none is found, the function
                        makes the conservative assumption that there is a
                        dependency.

    Returns:
        True if a may depend on b, False if it definitely does not.
    Tr   Fé   )r   Úall_input_nodesÚmay_depend_on)r   r   r    Úinps       r   r$   r$   %   s�   € ð" 	ˆA‚v€vØˆtõ ˆ1ÔÑÔ Ò"Ð"Øˆuð �qÒÐØˆtð Ô ð ð ˆÝ˜˜a °Ñ!1Ñ2Ô2ð 	Ø�4�4ð	ð ˆ5r   Únodesc                 ó‚   — t          j        | d¦  «        D ](\  }}t          ||¦  «        st          ||¦  «        r dS Œ)dS )zØ
    Check if all of the given nodes are pairwise-data independent.

    Arguments:
        nodes: The nodes to check for data dependencies.

    Returns:
        True if any pair in nodes has a data dependency.
    é   FT)Ú	itertoolsÚcombinationsr$   )r&   ÚiÚjs      r   Úare_nodes_independentr-   J   sZ   € õ Ô& u¨aÑ0Ô0ð ð ‰ˆˆ1Ý˜˜AÑÔð 	¥-°°1Ñ"5Ô"5ð 	Ø�5�5ð	ð ˆ4r   Úin_modc                 óâ  ‡‡— t          | ¦  «        Ši }i }‰j        j        D ]¥}|j        dk    s|j        t
          j        urŒ!|j        \  }}|j        dk    r|j        n|}|j        dk    r|j        n|}|                     |g ¦  «         	                    |¦  «         |                     |g ¦  «         	                    |¦  «         Œ¦| 
                    ¦   «         D �]d\  }}t          |¦  «        dk     rŒt          |¦  «        sŒ*d„ |D ¦   «         }ˆfd„|D ¦   «         }t          |t          ¦  «        r‰j                             |¦  «        n|}‰j                             t
          j        |fi ¦  «        }‰j                             t
          j        ||fi ¦  «        }	‰j                             t$          |	|fi ¦  «        Šˆˆfd„t'          t          |¦  «        ¦  «        D ¦   «         }
t)          ||
¦  «        D ]4\  }}|                     |¦  «         ‰j                             |¦  «         Œ5t/          ‰¦  «         �Œf‰                     ¦   «          ‰j                             ¦   «          ‰S )aÚ  
    A graph transformation that merges matrix multiplication operations that share the same right-hand
    side operand into one large matrix multiplication.
               ____      _________        _________
      ----    |    |    |         |     M|  A * C  |
    M| A  |  T| B  | * K|    C    | =    |---------|
      ---- ,  |    |    |         |     T|  B * C  |
       K       ----      ---------        ---------
                K            R                R
    Úcall_functionÚget_attrr(   c                 ó(   — g | ]}|j         d          ‘ŒS r   )Úargs)r   Úmms     r   r   z merge_matmul.<locals>.<listcomp>‡   s   € Ð-Ð-Ð- 2�B”G˜A”JÐ-Ð-Ð-r   c                 ór   •— g | ]3}t          |t          ¦  «        r‰j                             |¦  «        n|‘Œ4S © )r   ÚstrÚgraphr1   )r   ÚlÚgms     €r   r   z merge_matmul.<locals>.<listcomp>‹   s=   ø€ ÐSÐSÐSÀQ¥z°!µSÑ'9Ô'9Ð@ˆrŒx× Ò  Ñ#Ô#Ð#¸qÐSÐSÐSr   c                 ó`   •— g | ]*}‰j                              t          j        ‰|fi ¦  «        ‘Œ+S r6   )r8   r0   ÚoperatorÚgetitem)r   Úoutr:   Úmerge_mm_splits     €€r   r   z merge_matmul.<locals>.<listcomp>¢   sE   ø€ ð 
ð 
ð 
àð ŒH×"Ò"¥8Ô#3°nÀcÐ5JÈBÑOÔOð
ð 
ð 
r   )r   r8   r&   ÚopÚtargetr   Úmatmulr3   Ú
setdefaultÚappendÚitemsr   r-   r   r7   r1   r0   Úcatr   ÚrangeÚzipÚreplace_all_uses_withÚ
erase_noder   Ú	recompileÚlint)r.   Ú	rhs_usersÚ	lhs_usersÚnodeÚlhsÚrhsÚmmsÚlhs_valsÚmerge_mm_catÚmerge_mmÚmerge_mm_resÚoldÚnewr:   r?   s                @@r   Úmerge_matmulrY   \   sœ  øø€ õ 
˜Ñ	Ô	€Bà(*€IØ(*€Ið ””ð 3ð 3ˆØŒ7�oÒ%Ð%¨¬½E¼LÐ)HÐ)HØà”9‰ˆˆSð
  œF jÒ0Ð0ˆcŒjˆj°cˆØœF jÒ0Ð0ˆcŒjˆj°cˆà×Ò˜S "Ñ%Ô%×,Ò,¨TÑ2Ô2Ð2Ø×Ò˜S "Ñ%Ô%×,Ò,¨TÑ2Ô2Ð2Ð2à—O’OÑ%Ô%ð 1ñ 1‰ˆˆSåˆs‰8Œ8�aŠ<ˆ<Øõ % SÑ)Ô)ð 	Øà-Ð-¨Ð-Ñ-Ô-ˆð TÐSÐSÐSÈ(ÐSÑSÔSˆÝ(2°3½Ñ(<Ô(<ÐEˆbŒh×Ò Ñ$Ô$Ð$À#ˆð ”x×-Ò-­e¬i¸#¸ÀÑDÔDˆð
 ”8×)Ò)ÝŒLàØðð ñ
ô 
ˆð œ×/Ò/Ý  8¨S /°2ñ
ô 
ˆð
ð 
ð 
ð 
ð 
å�S ™XœX‘”ð
ñ 
ô 
ˆõ ˜C Ñ.Ô.ð 	%ð 	%‰HˆC�Ø×%Ò% cÑ*Ô*Ð*ØŒH×Ò Ñ$Ô$Ð$Ð$õ 	�rÑÔÐÑà‡L‚L�N„N€NØ„H‡M‚M�O„O€OØ€Ir   )r   )r)   r<   Útypingr   r   r   r   Útorch.fx._symbolic_tracer   Útorch.fx.noder   Útorch.fx.passes.tools_commonr   ÚTensorr   Úintr$   r-   ÚnnÚModulerY   r6   r   r   ú<module>rb      s6  ðà Ð Ð Ð Ø €€€Ø $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $à €€€Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø Ð Ð Ð Ð Ð Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7ð'ØŒLð'Ø"& u¤|Ô"4ð'à
ˆ5Œ<˜ÐÔð'ð 'ð 'ð 'ð2"ð "�Tð "˜dð "°#ð "ð "ð "ð "ðJ  d¤ð ð ð ð ð$V˜œœð Vð Vð Vð Vð Vð Vr   