§
    ŠŠtjÞ  ã            	       óþ   — d dl Z d dl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defd„Zde
e         defd„Zdej        j        dej        j        fd„ZdS )é    N)Ú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     ú`/var/www/html/CA-Chatbot/venv/lib/python3.11/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 up to 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*   H   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Úgraphr.   )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 r3   )r5   r-   ÚoperatorÚgetitem)r   Úoutr7   Úmerge_mm_splits     €€r   r   z merge_matmul.<locals>.<listcomp>£   sE   ø€ ð 
ð 
ð 
àð ŒH×"Ò"¥8Ô#3°nÀcÐ5JÈBÑOÔOð
ð 
ð 
r   )r   r5   r#   ÚopÚtargetr   Úmatmulr0   Ú
setdefaultÚappendÚitemsr   r*   r   r4   r.   r-   Ú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Únewr7   r<   s                @@r   Úmerge_matmulrV   Z   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&   r9   r   Útorch.fx._symbolic_tracer   Útorch.fx.noder   Útorch.fx.passes.tools_commonr   ÚTensorÚlistÚtupler   ÚintÚboolr!   r*   ÚnnÚModuler   ÚGraphModulerV   r3   r   r   ú<module>rb      s3  ðØ Ð Ð Ð Ø €€€à €€€Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø Ð Ð Ð Ð Ð Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7ð'ØŒLð'Ø"& u¤|Ô"4ð'à
ˆ5Œ<˜ÐÔð'ð 'ð 'ð 'ð2"ð "�Tð "˜dð "°#ð "¸dð "ð "ð "ð "ðJ  d¤ð °ð ð ð ð ð$Y˜œœð Y¨U¬XÔ-Að Yð Yð Yð Yð Yð Yr   