§
    �Štj±™  ã                   óÌ  — U d dl mZ d dlZd dlZd dlmZmZ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mZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlZddgZ ed¦  «        Z ed¦  «        Z ej        e¦  «        Z 	 d dl!m"Z# n7# e$$ r/  e%d„ dD ¦   «         ¦  «        re  &                    d¦  «         eZ#Y nw xY wej'        j(        Z(d„ Z)i Z*e+eef         e,d<   d„ Z-dFdeeeef         geeef         f         fd„Z. e.e(j/        ¦  «        ddœde0fd„¦   «         Z1 e.e(j2        ¦  «        dGde0fd„¦   «         Z3 e.e(j4        ¦  «        dGde0fd„¦   «         Z5 e.e(j6        ¦  «        dGde0fd „¦   «         Z7 e.e(j8        ¦  «        	 	 	 	 	 dHde0fd!„¦   «         Z9	 dFd"e:e0         d#e:e0         d$e:e0         d%e;de0f
d&„Z< e.e(j=        e(j>        e(j?        e(j@        e(jA        g¦  «        ddœde0fd'„¦   «         ZB e.e(jC        ¦  «        de0fd(„¦   «         ZDd)„ ZE e.e(jF        e(jG        e(jH        g¦  «        ddœde0fd*„¦   «         ZId+„ ZJdd,œdeeKeKe0d-f         eKe0d-f         eKe0d-f         eKe0d-f         dz  f                  fd.„ZLdd,œdeeKeKe0d-f         eKe0d-f         eKe0d-f         eKe0d-f         dz  f                  fd/„ZM e.e(jN        d0¬1¦  «        ddœde0fd2„¦   «         ZO e.e(jP        d0¬1¦  «        de0fd3„¦   «         ZQd4„ ZR e.e(jS        e(jT        e(jU        g¦  «        ddœde0fd5„¦   «         ZV e.e(jW        d0¬1¦  «        de0fd6„¦   «         ZX e.e(jY        d0¬1¦  «        de0fd7„¦   «         ZZdId8„Z[dd9œde0fd:„Z\dd9œde0fd;„Z]dd9œde0fd<„Z^i e(j/        e1“e(j2        e3“e(j4        e5“e(j6        e7“e(j8        e9“e(j=        eB“e(j>        eB“e(j?        eB“e(jA        eB“e(j@        eB“e(jC        eD“e(jF        eI“e(jG        eI“e(jH        eI“e(jS        eV“e(jT        eV“e(jU        eV“e(jN        eOe(jP        eQe(jW        eXe(jY        eZi¥Z* e[¦   «          d=„ Z_g d>¢Z`d?„ Zad@„ ZbdecfdA„ZddB„ Ze G dC„ d¦  «        Zf G dD„ dEe¦  «        ZgdS )Jé    )ÚNoneTypeN)Útree_mapÚtree_flattenÚtree_unflattené   )ÚModuleTracker)ÚAnyÚTypeVar)ÚCallable)ÚIterator)Ú	ParamSpec)Údefaultdict)ÚTorchDispatchMode©Úprod©ÚwrapsÚFlopCounterModeÚregister_flop_formulaÚ_TÚ_P©ÚJITFunctionc              #   óP   K  — | ]!}t          t          j        |d ¦  «        d uV — Œ"d S ©N)ÚgetattrÚtorchÚversion)Ú.0Úattrs     úV/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/utils/flop_counter.pyú	<genexpr>r"      s5   è è € Ð
]Ð
]¸d�7•5”= $¨Ñ-Ô-°TÐ9Ð
]Ð
]Ð
]Ð
]Ð
]Ð
]ó    )ÚcudaÚhipÚxpuz@triton not found; flop counting will not work for triton kernelsc                 óH   — t          | t          j        ¦  «        r| j        S | S r   )Ú
isinstancer   ÚTensorÚshape)Úis    r!   Ú	get_shaper,   #   s"   € Ý�!•U”\Ñ"Ô"ð ØŒwˆØ€Hr#   Úflop_registryc                 óB   ‡ — t          ‰ ¦  «        d dœˆ fd„
¦   «         }|S )N©Úout_valc                 óP   •— t          t          ||| f¦  «        \  }}} ‰|d|i|¤ŽS )NÚ	out_shape)r   r,   )r0   ÚargsÚkwargsr2   Úfs       €r!   Únfzshape_wrapper.<locals>.nf+   s:   ø€ å"*­9°t¸VÀWÐ6MÑ"NÔ"NÑˆˆf�iØˆq�$Ð6 )Ð6¨vÐ6Ð6Ð6r#   r   ©r5   r6   s   ` r!   Úshape_wrapperr8   *   s@   ø€ Ý
ˆ1�X„XØð 7ð 7ð 7ð 7ð 7ð 7ñ „Xð7ð €Ir#   FÚreturnc                 ó|   ‡ ‡— dt           t          t          f         dt           t          t          f         fˆˆ fd„}|S )NÚflop_formular9   c                 ó‚   •‡ — ‰st          ‰ ¦  «        Š dˆ fd„}t          j        j                             |‰¦  «         ‰ S )Nr9   c                 óð   •— ddl m} t          | t          j        j        t          |f¦  «        s"t          d| › dt          | ¦  «        › �¦  «        ‚| t          v rt          d| › �¦  «        ‚‰t          | <   d S )Nr   )ÚHigherOrderOperatorz‘register_flop_formula(targets): expected each target to be OpOverloadPacket (i.e. torch.ops.mylib.foo), JitFunction, or HigherOrderOperator, got z which is of type zduplicate registrations for )Ú
torch._opsr>   r(   r   Ú_opsÚOpOverloadPacketÚ_JITFunctionÚ
ValueErrorÚtyper-   ÚRuntimeError)Útargetr>   r;   s     €r!   Úregisterz=register_flop_formula.<locals>.register_fun.<locals>.register7   s¬   ø€ Ø6Ð6Ð6Ð6Ð6Ð6å˜v­¬
Ô(CÅ\ÐSfÐ'gÑhÔhð GÝ ðFð $ðFð Fõ 8<¸F±|´|ðFð FñGô Gð Gð
 �Ð&Ð&Ý"Ð#JÀ&Ð#JÐ#JÑKÔKÐKØ$0�M˜&Ñ!Ð!Ð!r#   ©r9   N)r8   r   ÚutilsÚ_pytreeÚ	tree_map_)r;   rG   Úget_rawÚtargetss   ` €€r!   Úregister_funz+register_flop_formula.<locals>.register_fun3   sZ   øø€ Øð 	7Ý(¨Ñ6Ô6ˆLð	1ð 	1ð 	1ð 	1ð 	1ð 	1õ 	ŒÔ×%Ò% h°Ñ8Ô8Ð8àÐr#   )r   r   r   )rM   rL   rN   s   `` r!   r   r   1   sO   øø€ ð¥8­Bµ¨FÔ#3ð ½ÅÅRÀÔ8Hð ð ð ð ð ð ð ð, Ðr#   )r2   c                ób   — | \  }}|\  }}||k    rt          d|› d|› �¦  «        ‚||z  dz  |z  S )zCount flops for matmul.z3matmul: inner dimensions must match (k == k2), got ú and é   ©ÚAssertionError)	Úa_shapeÚb_shaper2   r3   r4   ÚmÚkÚk2Úns	            r!   Úmm_floprZ   K   sR   € ð
 �D€A€qØ�E€BˆØˆB‚w€wÝÐ_ÐSTÐ_Ð_Ð[]Ð_Ð_Ñ`Ô`Ð`àˆq‰5�1‰9�q‰=Ðr#   c                 ó"   — t          ||¦  «        S )zCount flops for addmm.©rZ   ©Ú
self_shaperT   rU   r2   r4   s        r!   Ú
addmm_flopr_   W   s   € õ �7˜GÑ$Ô$Ð$r#   c                 ó¦   — | \  }}}|\  }}}	||k    rt          d|› d|› �¦  «        ‚||k    rt          d|› d|› �¦  «        ‚||z  |	z  dz  |z  }
|
S )z"Count flops for the bmm operation.z0bmm: batch dimensions must match (b == b2), got rP   z0bmm: inner dimensions must match (k == k2), got rQ   rR   )rT   rU   r2   r4   ÚbrV   rW   Úb2rX   rY   Úflops              r!   Úbmm_floprd   \   s‰   € ð
 �G€A€qˆ!Ø�I€BˆˆAØˆB‚w€wÝÐ\ÐPQÐ\Ð\ÐXZÐ\Ð\Ñ]Ô]Ð]ØˆB‚w€wÝÐ\ÐPQÐ\Ð\ÐXZÐ\Ð\Ñ]Ô]Ð]àˆq‰5�1‰9�q‰=˜1Ñ€DØ€Kr#   c                 ó"   — t          ||¦  «        S )z&Count flops for the baddbmm operation.)rd   r]   s        r!   Úbaddbmm_floprf   k   s   € õ
 �G˜WÑ%Ô%Ð%r#   c	                 ó"   — t          | |¦  «        S )zCount flops for _scaled_mm.r\   )
rT   rU   Úscale_a_shapeÚscale_b_shapeÚ
bias_shapeÚscale_result_shapeÚ	out_dtypeÚuse_fast_accumr2   r4   s
             r!   Ú_scaled_mm_floprn   r   s   € õ �7˜GÑ$Ô$Ð$r#   Úx_shapeÚw_shaper2   Ú
transposedc                 ó”   — | d         }|r| n|dd…         }|^}}}	 t          |¦  «        t          |¦  «        z  |z  |z  |z  dz  }	|	S )a  Count flops for convolution.

    Note only multiplication is
    counted. Computation for bias are ignored.
    Flops for a transposed convolution are calculated as
    flops = (x_shape[2:] * prod(w_shape) * batch_size).
    Args:
        x_shape (list(int)): The input shape before convolution.
        w_shape (list(int)): The filter shape.
        out_shape (list(int)): The output shape after convolution.
        transposed (bool): is the convolution transposed
    Returns:
        int: the number of flops
    r   rQ   Nr   )
ro   rp   r2   rq   Ú
batch_sizeÚ
conv_shapeÚc_outÚc_inÚfilter_sizerc   s
             r!   Úconv_flop_countrx   ƒ   sj   € ð( ˜”€JØ'Ð6�'�'¨Y¸¸¸Ô;€JØ 'Ð€Eˆ4�+ðõ �
ÑÔ�d ;Ñ/Ô/Ñ/°*Ñ<¸uÑDÀtÑKÈaÑO€DØ€Kr#   c                ó(   — t          | |||¬¦  «        S )zCount flops for convolution.©rq   )rx   )
ro   rp   Ú_biasÚ_strideÚ_paddingÚ	_dilationrq   r2   r3   r4   s
             r!   Ú	conv_flopr   ©   s   € õ ˜7 G¨YÀ:ÐNÑNÔNÐNr#   c                 ó|  — d„ }d}	 |
d         r+t          |d         ¦  «        }|t          | ||| ¦  «        z  }|
d         rzt          |d         ¦  «        }|r2|t           || ¦  «         ||¦  «         ||¦  «        d¬¦  «        z  }n1|t           ||¦  «         || ¦  «         ||¦  «        d¬¦  «        z  }|S )Nc                 óR   — | d         | d         gt          | dd …         ¦  «        z   S )Nr   r   rQ   )Úlist)r*   s    r!   Útzconv_backward_flop.<locals>.tÄ   s(   € Ø�a”˜% œ(Ð#¥d¨5°°°¬9¡o¤oÑ5Ð5r#   r   r   Frz   )r,   rx   )Úgrad_out_shapero   rp   r{   r|   r}   r~   rq   Ú_output_paddingÚ_groupsÚoutput_maskr2   r4   rƒ   Ú
flop_countÚgrad_input_shapeÚgrad_weight_shapes                    r!   Úconv_backward_flopr‹   ´   sÿ   € ð 6ð 6ð 6à€JðDðL �1„~ð aÝ$ Y¨q¤\Ñ2Ô2ÐØ•o n°gÐ?OÐU_ÐQ_Ñ`Ô`Ñ`ˆ
à�1„~ð qÝ% i°¤lÑ3Ô3ÐØð 	qà�/¨!¨!¨NÑ*;Ô*;¸Q¸Q¸w¹Z¼ZÈÈÐK\ÑI]ÔI]ÐjoÐpÑpÔpÑpˆJˆJð �/¨!¨!¨G©*¬*°a°a¸Ñ6GÔ6GÈÈÐK\ÑI]ÔI]ÐjoÐpÑpÔpÑpˆJàÐr#   c                 ón  — | \  }}}}|\  }}}	}
|\  }}}}||cxk    r|k    rn n||k    r||
k    r|	|k    st          d| › d|› d|› �¦  «        ‚||k     s	||z  dk    rt          d|› d|› d�¦  «        ‚d}|t          ||z  ||f||z  ||	f¦  «        z  }|t          ||z  ||	f||z  |	|f¦  «        z  }|S )z¿
    Count flops for self-attention.

    Supports GQA (grouped-query attention) where key/value have fewer heads
    than the query. The kernel broadcasts KV heads to match query heads.
    z<sdpa_flop_count: query/key/value shapes are incompatible: q=z, k=z, v=r   zsdpa_flop_count: query heads (ú)) must be a multiple of key/value heads (ú)©rS   rd   )Úquery_shapeÚ	key_shapeÚvalue_shapera   Úh_qÚs_qÚd_qÚ_b2Úh_kvÚs_kÚ_d2Ú_b3Ú_h3Ú_s3Úd_vÚtotal_flopss                   r!   Úsdpa_flop_countrŸ     sJ  € ð #Ñ€A€sˆC�Ø#Ñ€Cˆˆs�CØ$Ñ€Cˆˆc�3Ø�ˆOˆOŠOˆO˜ŠOˆOˆOˆOˆO ¨¢ °°s²
°
¸sÀcºz¸zÝð?Øð?ð ?Ø"+ð?ð ?Ø1<ð?ð ?ñ
ô 
ð 	
ð ˆT‚z€z�S˜4‘Z 1’_�_Ýð(¨Sð (ð (Ø $ð(ð (ð (ñ
ô 
ð 	
ð €Kà•8˜Q ™W c¨3Ð/°!°c±'¸3ÀÐ1DÑEÔEÑE€Kà•8˜Q ™W c¨3Ð/°!°c±'¸3ÀÐ1DÑEÔEÑE€KØÐr#   c                ó$   — t          | ||¦  «        S )úCount flops for self-attention.©rŸ   )r�   r‘   r’   r2   r3   r4   s         r!   Ú	sdpa_flopr£   9  s   € õ ˜;¨	°;Ñ?Ô?Ð?r#   c                 óâ   — ddl m} ddlm} t	          | ||f¦  «        s6| j        j        dk    r&|                      ¦   «                              ¦   «         S |g|  	                    d¦  «        dz
  z  S )zŸ
    If the offsets tensor is fake, then we don't know the actual lengths.
    In that case, we can just assume the worst case; each batch has max length.
    r   )Ú
FakeTensor)ÚFunctionalTensorÚmetar   )
Útorch._subclasses.fake_tensorr¥   Ú#torch._subclasses.functional_tensorr¦   r(   ÚdevicerD   ÚdiffÚtolistÚsize)ÚoffsetsÚmax_lenr¥   r¦   s       r!   Ú_offsets_to_lengthsr°   B  s†   € ð
 9Ð8Ð8Ð8Ð8Ð8ØDÐDÐDÐDÐDÐDÝ�g 
Ð,<Ð=Ñ>Ô>ð 'À7Ä>ÔCVÐZ`ÒC`ÐC`Ø�|Š|‰~Œ~×$Ò$Ñ&Ô&Ð&Øˆ9˜Ÿš Q™œ¨!Ñ+Ñ,Ð,r#   )Úgrad_out.c              #   ó¦  K  — |��+t          |j        ¦  «        dk    rt          d¦  «        ‚t          |j        ¦  «        dk    rt          d¦  «        ‚|�|j        | j        k    rt          d¦  «        ‚| j        \  }}	}
|j        \  }}}|j        \  }}}|€t          d¦  «        ‚|€t          d¦  «        ‚|j        |j        k    rt          d¦  «        ‚t          ||¦  «        }t          ||¦  «        }t	          ||d	¬
¦  «        D ]%\  }}d|	||
f}d|||f}d|||f}|�|nd}||||fV — Œ&dS | j        |j        |j        |�|j        ndfV — dS )a;  
    Given inputs to a flash_attention_(forward|backward) kernel, this will handle behavior for
    NestedTensor inputs by effectively unbinding the NestedTensor and yielding the shapes for
    each batch element.

    In the case that this isn't a NestedTensor kernel, then it just yields the original shapes.
    Né   z7sdpa_flop_count: expected key.shape to be 3-dimensionalz9sdpa_flop_count: expected value.shape to be 3-dimensionalzDsdpa_flop_count: grad_out.shape must match query.shape when providedz+sdpa_flop_count: cum_seq_q must not be Nonez+sdpa_flop_count: cum_seq_k must not be NonezAsdpa_flop_count: cum_seq_q and cum_seq_k must have the same shapeT©Ústrictr   ©Úlenr*   rS   r°   Úzip)ÚqueryÚkeyÚvaluer±   Ú	cum_seq_qÚ	cum_seq_kÚmax_qÚmax_kÚ_r“   r•   Úh_kÚd_kÚh_vr�   Úseq_q_lengthsÚseq_k_lengthsÚ	seq_q_lenÚ	seq_k_lenÚnew_query_shapeÚnew_key_shapeÚnew_value_shapeÚnew_grad_out_shapes                          r!   Ú%_unpack_flash_attention_nested_shapesrÌ   N  s¯  è è € ð$ Ñõ ˆsŒy‰>Œ>˜QÒÐÝ Ð!ZÑ[Ô[Ð[ÝˆuŒ{ÑÔ˜qÒ Ð Ý Ð!\Ñ]Ô]Ð]ØÐ H¤N°e´kÒ$AÐ$AÝ Ð!gÑhÔhÐhØ”k‰ˆˆ3�Ø”i‰ˆˆ3�Ø”k‰ˆˆ3�ØÐÝ Ð!NÑOÔOÐOØÐÝ Ð!NÑOÔOÐOØŒ?˜iœoÒ-Ð-Ý Ð!dÑeÔeÐeÝ+¨I°uÑ=Ô=ˆÝ+¨I°uÑ=Ô=ˆÝ&)¨-¸ÈtÐ&TÑ&TÔ&Tð 	Vð 	VÑ"ˆY˜	Ø  # y°#Ð6ˆOØ  Y°Ð4ˆMØ  # y°#Ð6ˆOØ4<Ð4H  ÈdÐØ! =°/ÐCUÐUÐUÐUÐUÐUØˆà
Œ+�s”y %¤+ÀÐAU¨x¬~¨~Ð[_Ð
_Ð_Ð_Ð_Ð_Ð_r#   c              #   ó¬  K  — |��.t          |j        ¦  «        dk    rt          d¦  «        ‚t          |j        ¦  «        dk    rt          d¦  «        ‚|�|j        | j        k    rt          d¦  «        ‚| j        \  }}}	}
|j        \  }}}}|j        \  }}}}|€t          d¦  «        ‚|€t          d¦  «        ‚|j        |j        k    rt          d¦  «        ‚t          ||¦  «        }t          ||¦  «        }t	          ||d	¬
¦  «        D ]%\  }}d|	||
f}d|||f}d|||f}|�|nd}||||fV — Œ&dS | j        |j        |j        |�|j        ndfV — dS )a?  
    Given inputs to a efficient_attention_(forward|backward) kernel, this will handle behavior for
    NestedTensor inputs by effectively unbinding the NestedTensor and yielding the shapes for
    each batch element.

    In the case that this isn't a NestedTensor kernel, then it just yields the original shapes.
    Né   zQ_unpack_efficient_attention_nested_shapes: expected key.shape to be 4-dimensionalzS_unpack_efficient_attention_nested_shapes: expected value.shape to be 4-dimensionalz^_unpack_efficient_attention_nested_shapes: grad_out.shape must match query.shape when providedzH_unpack_efficient_attention_nested_shapes: cu_seqlens_q must not be NonezH_unpack_efficient_attention_nested_shapes: cu_seqlens_k must not be Noneza_unpack_efficient_attention_nested_shapes: cu_seqlens_q and cu_seqlens_k must have the same shapeTr´   r   r¶   )r¹   rº   r»   r±   Úcu_seqlens_qÚcu_seqlens_kÚmax_seqlen_qÚmax_seqlen_krÀ   r“   r•   rÁ   rÂ   rÃ   r�   Ú	seqlens_qÚ	seqlens_kÚlen_qÚlen_krÈ   rÉ   rÊ   rË   s                          r!   Ú)_unpack_efficient_attention_nested_shapesr×   ‚  sÎ  è è € ð$ Ñõ ˆsŒy‰>Œ>˜QÒÐÝ Ð!tÑuÔuÐuÝˆuŒ{ÑÔ˜qÒ Ð Ý Ð!vÑwÔwÐwØÐ H¤N°e´kÒ$AÐ$AÝ ð  "Bñ  Cô  Cð  CØœ‰ˆˆ1ˆc�3Øœ‰ˆˆ1ˆc�3Øœ‰ˆˆ1ˆc�3ØÐÝ Ð!kÑlÔlÐlØÐÝ Ð!kÑlÔlÐlØÔ Ô!3Ò3Ð3Ý ð "Zñ [ô [ð [å'¨°lÑCÔCˆ	Ý'¨°lÑCÔCˆ	Ý 	¨9¸TÐBÑBÔBð 	Vð 	V‰LˆE�5Ø  # u¨cÐ2ˆOØ  U¨CÐ0ˆMØ  # u¨cÐ2ˆOØ4<Ð4H  ÈdÐØ! =°/ÐCUÐUÐUÐUÐUÐUØˆà
Œ+�s”y %¤+ÀÐAU¨x¬~¨~Ð[_Ð
_Ð_Ð_Ð_Ð_Ð_r#   T©rL   c          	      ó`   — t          | ||||||¬¦  «        }
t          d„ |
D ¦   «         ¦  «        S )r¡   ©r¹   rº   r»   r¼   r½   r¾   r¿   c              3   óB   K  — | ]\  }}}}t          |||¦  «        V — Œd S r   r¢   ©r   r�   r‘   r’   rÀ   s        r!   r"   z0_flash_attention_forward_flop.<locals>.<genexpr>Ó  óJ   è è € ð ð á2ˆK˜ K°õ 	˜ Y°Ñ<Ô<ðð ð ð ð ð r#   ©rÌ   Úsum)r¹   rº   r»   r¼   r½   r¾   r¿   r2   r3   r4   Úsizess              r!   Ú_flash_attention_forward_floprá   ¹  s]   € õ" 2ØØØØØØØðñ ô €Eõ ð ð à6;ðñ ô ñ ô ð r#   c           	      ó`   — t          | ||||||¬¦  «        }
t          d„ |
D ¦   «         ¦  «        S )r¡   )r¹   rº   r»   rÏ   rÐ   rÑ   rÒ   c              3   óB   K  — | ]\  }}}}t          |||¦  «        V — Œd S r   r¢   rÜ   s        r!   r"   z4_efficient_attention_forward_flop.<locals>.<genexpr>ó  rÝ   r#   ©r×   rß   )r¹   rº   r»   ÚbiasrÏ   rÐ   rÑ   rÒ   r3   r4   rà   s              r!   Ú!_efficient_attention_forward_flopræ   Ù  s]   € õ" 6ØØØØ!Ø!Ø!Ø!ðñ ô €Eõ ð ð à6;ðñ ô ñ ô ð r#   c                 ót  — |\  }}}}|\  }}	}
}|\  }}}}| \  }}}}||cxk    r|cxk    r|k    rn n|	|k    r||k    st          d¦  «        ‚||	k     s	||	z  dk    rt          d|› d|	› d�¦  «        ‚||k    r||k    r|
|k    r||k    st          d¦  «        ‚d}|t          ||z  ||f||z  ||
f¦  «        z  }|t          ||z  ||f||z  ||
f¦  «        z  }|t          ||z  |
|f||z  ||f¦  «        z  }|t          ||z  ||
f||z  |
|f¦  «        z  }|t          ||z  ||f||z  ||
f¦  «        z  }|S )Nz<sdpa_backward_flop_count: batch/heads mismatch among tensorsr   z'sdpa_backward_flop_count: query heads (r�   rŽ   zJsdpa_backward_flop_count: grad_out/value/key/query shapes are incompatibler�   )r„   r�   r‘   r’   ra   r“   r”   r•   r–   r—   r˜   r™   rš   r›   rœ   r�   Ú_b4Ú_h4Ú_s4Ú_d4rž   s                        r!   Úsdpa_backward_flop_countrì   ù  sø  € Ø"Ñ€A€sˆC�Ø#Ñ€Cˆˆs�CØ$Ñ€Cˆˆc�3Ø'Ñ€Cˆˆc�3Ø�Ð"Ð"Ò"Ð"˜Ð"Ð"Ò"Ð"˜sÒ"Ð"Ð"Ð"Ð" t¨s¢{ {°s¸c²z°zÝØJñ
ô 
ð 	
ð ˆT‚z€z�S˜4‘Z 1’_�_Ýð(°cð (ð (Ø $ð(ð (ð (ñ
ô 
ð 	
ð �3ŠJˆJ˜3 #š:˜:¨#°ª*¨*¸Àº¸ÝØXñ
ô 
ð 	
ð €Kð •8˜Q ™W c¨3Ð/°!°c±'¸3ÀÐ1DÑEÔEÑE€Kð •8˜Q ™W c¨3Ð/°!°c±'¸3ÀÐ1DÑEÔEÑE€Kà•8˜Q ™W c¨3Ð/°!°c±'¸3ÀÐ1DÑEÔEÑE€Kð •8˜Q ™W c¨3Ð/°!°c±'¸3ÀÐ1DÑEÔEÑE€Kà•8˜Q ™W c¨3Ð/°!°c±'¸3ÀÐ1DÑEÔEÑE€KØÐr#   c                ó&   — t          | |||¦  «        S )z(Count flops for self-attention backward.©rì   )r„   r�   r‘   r’   r2   r3   r4   s          r!   Úsdpa_backward_floprï     s   € õ
 $ N°KÀÈKÑXÔXÐXr#   c
           
      ób   — t          |||| ||||	¬¦  «        }t          d„ |D ¦   «         ¦  «        S )N©r¹   rº   r»   r±   r¼   r½   r¾   r¿   c              3   óD   K  — | ]\  }}}}t          ||||¦  «        V — Œd S r   rî   ©r   r�   r‘   r’   r„   s        r!   r"   z1_flash_attention_backward_flop.<locals>.<genexpr>@  óL   è è € ð ð á?ˆK˜ K°õ 	! °¸iÈÑUÔUðð ð ð ð ð r#   rÞ   )r±   r¹   rº   r»   ÚoutÚ	logsumexpr¼   r½   r¾   r¿   r3   r4   Úshapess                r!   Ú_flash_attention_backward_floprø   %  s`   € õ" 3ØØØØØØØØð	ñ 	ô 	€Fõ ð ð àCIðñ ô ñ ô ð r#   c
           
      ób   — t          |||| ||||	¬¦  «        }t          d„ |D ¦   «         ¦  «        S )N)r¹   rº   r»   r±   rÏ   rÐ   rÑ   rÒ   c              3   óD   K  — | ]\  }}}}t          ||||¦  «        V — Œd S r   rî   ró   s        r!   r"   z5_efficient_attention_backward_flop.<locals>.<genexpr>a  rô   r#   rä   )r±   r¹   rº   r»   rå   rõ   rÏ   rÐ   rÑ   rÒ   r3   r4   r÷   s                r!   Ú"_efficient_attention_backward_floprû   F  s`   € õ" 7ØØØØØ!Ø!Ø!Ø!ð	ñ 	ô 	€Fõ ð ð àCIðñ ô ñ ô ð r#   c                  óü   ‡— ddl m} m} dt          t          t
          f         dt          fd„Št          | d¬¦  «        d dœdt          fˆfd	„¦   «         }t          |d¬¦  «        d dœdt          fˆfd
„¦   «         }d S )Nr   )Úflex_attentionÚflex_attention_backwardr4   r9   c           
      óÊ   — |                       d¦  «        }|€dS |                      d¦  «        }|€dS t          dt          d|                      dd¦  «        ¦  «        ¦  «        S )NÚ
_node_metag        Úcustomç      ð?Úsparsity_hint)ÚgetÚmaxÚmin)r4   Ú	node_metar  s      r!   Ú_get_sparsity_hintz:_register_flex_attention_flops.<locals>._get_sparsity_hintm  sa   € Ø—J’J˜|Ñ,Ô,ˆ	ØÐØ�3Ø—’˜xÑ(Ô(ˆØˆ>Ø�3Ý�3�˜C §¢¨O¸SÑ!AÔ!AÑBÔBÑCÔCÐCr#   TrØ   r/   c                ó”   •— t          | j        |j        |j        ¦  «        } ‰|¦  «        }|dk    rt          |d|z
  z  ¦  «        n|S ©Nr   r  )rŸ   r*   Úint)	r¹   rº   r»   r0   r3   r4   ÚflopsÚsparsityr  s	           €r!   Úflex_attention_forward_flopzC_register_flex_attention_flops.<locals>.flex_attention_forward_flopv  sP   ø€ õ   ¤¨S¬Y¸¼ÑDÔDˆØ%Ð% fÑ-Ô-ˆØ08¸1²°�s�5˜C (™NÑ+Ñ,Ô,Ð,À%ÐGr#   c                ó¶   •— |�|j         n|j         }	t          |	| j         |j         |j         ¦  «        }
 ‰|¦  «        }|dk    rt          |
d|z
  z  ¦  «        n|
S r
  )r*   rì   r  )r¹   rº   r»   rõ   rö   r±   r0   r3   r4   r„   r  r  r  s               €r!   Úflex_attention_backward_flopzD_register_flex_attention_flops.<locals>.flex_attention_backward_flop~  sk   ø€ ð ,4Ð+?˜œ˜ÀSÄYˆÝ(Ø˜EœK¨¬°E´Kñ
ô 
ˆð &Ð% fÑ-Ô-ˆØ08¸1²°�s�5˜C (™NÑ+Ñ,Ô,Ð,À%ÐGr#   )	Ú&torch._higher_order_ops.flex_attentionrý   rþ   ÚdictÚstrr	   Úfloatr   r  )rý   rþ   r  r  r  s       @r!   Ú_register_flex_attention_flopsr  g  s  ø€ ðð ð ð ð ð ð ð ð
D¥4­­S¨¤>ð Dµeð Dð Dð Dð Dõ ˜>°4Ð8Ñ8Ô8à*.ðHð Hð Hå	ðHð Hð Hð Hð Hñ 9Ô8ðHõ Ð2¸DÐAÑAÔAàDHðHð Hð Hå	ðHð Hð Hð Hð Hñ BÔAðHð Hð Hr#   r/   c          	      óh   — t          | ||||�|n|||¬¦  «        }
t          d„ |
D ¦   «         ¦  «        S )z$Count flops for varlen_attn forward.NrÚ   c              3   óB   K  — | ]\  }}}}t          |||¦  «        V — Œd S r   r¢   rÜ   s        r!   r"   z,_varlen_attn_forward_flop.<locals>.<genexpr>   rÝ   r#   rÞ   )r¹   rº   r»   Úcu_seq_qÚcu_seq_kr¾   r¿   r0   r3   r4   rà   s              r!   Ú_varlen_attn_forward_flopr  Š  sf   € õ 2ØØØØØ&Ð2�(�(¸ØØðñ ô €Eõ ð ð à6;ðñ ô ñ ô ð r#   c          	      ó,   — t          |||||||¦  «        S )z(Count flops for varlen_attn_out forward.)r  )rõ   r¹   rº   r»   r  r  r¾   r¿   r0   r3   r4   s              r!   Ú_varlen_attn_out_flopr  ¦  s%   € õ %Øˆs�E˜8 X¨u°eñô ð r#   c
          
      ób   — t          |||| ||||	¬¦  «        }t          d„ |D ¦   «         ¦  «        S )z%Count flops for varlen_attn backward.rñ   c              3   óD   K  — | ]\  }}}}t          ||||¦  «        V — Œd S r   rî   ró   s        r!   r"   z-_varlen_attn_backward_flop.<locals>.<genexpr>Ó  rô   r#   rÞ   )r±   r¹   rº   r»   rõ   Úlser  r  r¾   r¿   r0   r3   r4   rà   s                 r!   Ú_varlen_attn_backward_flopr   ¹  s`   € õ  2ØØØØØØØØð	ñ 	ô 	€Eõ ð ð àCHðñ ô ñ ô ð r#   c                 ó6   — t          | t          ¦  «        s| fS | S r   )r(   Útuple)Úxs    r!   Únormalize_tupler$  ô  s    € Ý�a�ÑÔð ØˆtˆØ€Hr#   )Ú ÚKÚMÚBÚTc                 óÂ   — t          dt          t          t          ¦  «        dz
  t          t	          | ¦  «        ¦  «        dz
  dz  ¦  «        ¦  «        }t          |         S )Nr   r   rQ   r³   )r  r  r·   Úsuffixesr  )ÚnumberÚindexs     r!   Úget_suffix_strr.  ý  sJ   € õ �•3•s�8‘}”} qÑ(­3­s°6©{¬{Ñ+;Ô+;¸aÑ+?ÀAÑ*EÑFÔFÑGÔG€EÝ�EŒ?Ðr#   c                 ój   — t                                |¦  «        }| d|z  z  d›}|t           |         z   S )Niè  z.3f)r+  r-  )r,  Úsuffixr-  r»   s       r!   Úconvert_num_with_suffixr1    s6   € Ý�NŠN˜6Ñ"Ô"€Eà˜ ™Ñ%Ð+Ð+€Eà•8˜E”?Ñ"Ð"r#   c                 ó    — |dk    rdS | |z  d›S )Nr   ú0%z.2%© )ÚnumÚdenoms     r!   Úconvert_to_percent_strr7    s    € Ø�‚z€zØˆtØ�E‰kÐÐÐr#   c                 ó<   ‡ — t          ‰ ¦  «        ˆ fd„¦   «         }|S )Nc                 óR   •— t          | ¦  «        \  }} ‰|Ž }t          ||¦  «        S r   )r   r   )r3   Ú	flat_argsÚspecrõ   r5   s       €r!   r6   z)_pytreeify_preserve_structure.<locals>.nf  s/   ø€ å& tÑ,Ô,‰ˆ	�4Øˆa�ˆmˆÝ˜c 4Ñ(Ô(Ð(r#   r   r7   s   ` r!   Ú_pytreeify_preserve_structurer<    s3   ø€ Ý
ˆ1�X„Xð)ð )ð )ð )ñ „Xð)ð
 €Ir#   c                   óê   ‡ — e Zd ZdZ	 	 	 	 ddej        j        eej        j                 z  dz  dede	de
eef         dz  d	df
ˆ fd
„Zd	efd„Zd	e
ee
eef         f         fd„Zdd„Zd„ Zd„ Zd„ Zˆ xZS )r   aþ  
    ``FlopCounterMode`` is a context manager that counts the number of flops within its context.

    It does this using a ``TorchDispatchMode``.

    It also supports hierarchical output by passing a module (or list of
    modules) to FlopCounterMode on construction. If you do not need hierarchical
    output, you do not need to use it with a module.

    Example usage

    .. code-block:: python

        mod = ...
        with FlopCounterMode(mod) as flop_counter:
            mod.sum().backward()

    NrQ   TÚmodsÚdepthÚdisplayÚcustom_mappingr9   c                 óR  •— t          ¦   «                              ¦   «          t          d„ ¦  «        | _        || _        || _        d | _        |€i }|�t          j        dd¬¦  «         i t          ¥d„ | 
                    ¦   «         D ¦   «         ¥| _	        t          ¦   «         | _        d S )Nc                  ó*   — t          t          ¦  «        S r   )r   r  r4  r#   r!   ú<lambda>z*FlopCounterMode.__init__.<locals>.<lambda>5  s   € Í+ÕVYÑJZÔJZ€ r#   z<mods argument is not needed anymore, you can stop passing itrQ   )Ú
stacklevelc                 óZ   — i | ](\  }}|t          |d d¦  «        r|nt          |¦  «        “Œ)S )Ú_get_rawF)r   r8   ©r   rW   Úvs      r!   ú
<dictcomp>z,FlopCounterMode.__init__.<locals>.<dictcomp>?  s<   € ÐnÐnÐnÉtÈqÐRSˆq•w˜q *¨eÑ4Ô4ÐJ�!�!½-ÈÑ:JÔ:JÐnÐnÐnr#   )ÚsuperÚ__init__r   Úflop_countsr?  r@  ÚmodeÚwarningsÚwarnr-   Úitemsr   Úmod_tracker)Úselfr>  r?  r@  rA  Ú	__class__s        €r!   rL  zFlopCounterMode.__init__.  sµ   ø€ õ 	‰Œ×ÒÑÔÐÝ6AÐBZÐBZÑ6[Ô6[ˆÔØˆŒ
ØˆŒØ-1ˆŒ	ØÐ!ØˆNØÐÝŒMÐXÐefÐgÑgÔgÐgð
Ýð
ànÐnÐWe×WkÒWkÑWmÔWmÐnÑnÔnð
ˆÔõ )™?œ?ˆÔÐÐr#   c                 óZ   — t          | j        d                              ¦   «         ¦  «        S )NÚGlobal)rß   rM  Úvalues©rS  s    r!   Úget_total_flopszFlopCounterMode.get_total_flopsC  s$   € Ý�4Ô# HÔ-×4Ò4Ñ6Ô6Ñ7Ô7Ð7r#   c                 óH   — d„ | j                              ¦   «         D ¦   «         S )a  Return the flop counts as a dictionary of dictionaries.

        The outer
        dictionary is keyed by module name, and the inner dictionary is keyed by
        operation name.

        Returns:
            Dict[str, Dict[Any, int]]: The flop counts as a dictionary.
        c                 ó4   — i | ]\  }}|t          |¦  «        “ŒS r4  )r  rH  s      r!   rJ  z3FlopCounterMode.get_flop_counts.<locals>.<dictcomp>P  s$   € Ð@Ð@Ð@™t˜q !�•4˜‘7”7Ð@Ð@Ð@r#   )rM  rQ  rX  s    r!   Úget_flop_countszFlopCounterMode.get_flop_countsF  s(   € ð AÐ@ tÔ'7×'=Ò'=Ñ'?Ô'?Ð@Ñ@Ô@Ð@r#   c                 ó@  ‡ ‡
‡‡— |€‰ j         }|€d}dd l}d|_        g d¢}g }‰                      ¦   «         Š
t	          ‰
¦  «        ŠdŠˆ
ˆˆˆ fd„}t          ‰ j                             ¦   «         ¦  «        D ]L}|dk    rŒ	|                     d¦  «        d	z   }||k    rŒ( |||d	z
  ¦  «        }| 	                    |¦  «         ŒMd‰ j        v r$‰s"|D ]}	d
|	d         z   |	d<   Œ |dd¦  «        |z   }t          |¦  «        dk    rg d¢g}|                     ||d¬¦  «        S )Ni?B r   T)ÚModuleÚFLOPz% TotalFc           	      óÆ  •— t          ‰
j        |                               ¦   «         ¦  «        }‰	|‰k    z  Š	d|z  }g }|                     || z   t	          |‰¦  «        t          |‰¦  «        g¦  «         ‰
j        |                               ¦   «         D ]L\  }}|                     |dz   t          |¦  «        z   t	          |‰¦  «        t          |‰¦  «        g¦  «         ŒM|S )Nú z - )rß   rM  rW  Úappendr1  r7  rQ  r  )Úmod_namer?  rž   ÚpaddingrW  rW   rI  Úglobal_flopsÚglobal_suffixÚis_global_subsumedrS  s          €€€€r!   Úprocess_modz.FlopCounterMode.get_table.<locals>.process_modb  sý   ø€ õ ˜dÔ.¨xÔ8×?Ò?ÑAÔAÑBÔBˆKà +°Ò"=Ñ=Ðà˜E‘kˆGØˆFØ�MŠMØ˜(Ñ"Ý'¨°]ÑCÔCÝ& {°LÑAÔAðñ ô ð ð
 Ô(¨Ô2×8Ò8Ñ:Ô:ð ð ‘��1Ø—’Ø˜e‘O¥c¨!¡f¤fÑ,Ý+¨A¨}Ñ=Ô=Ý*¨1¨lÑ;Ô;ðñ ô ð ð ð
 ˆMr#   rV  ú.r   ra  )rV  Ú0r3  )ÚleftÚrightrl  )ÚheadersÚcolalign)r?  ÚtabulateÚPRESERVE_WHITESPACErY  r.  ÚsortedrM  ÚkeysÚcountÚextendr·   )rS  r?  ro  ÚheaderrW  rh  ÚmodÚ	mod_depthÚ
cur_valuesr»   re  rf  rg  s   `         @@@r!   Ú	get_tablezFlopCounterMode.get_tableR  s”  øøøø€ Øˆ=Ø”JˆEØˆ=ØˆEð 	ˆˆˆà'+ˆÔ$Ø.Ð.Ð.ˆØˆØ×+Ò+Ñ-Ô-ˆÝ& |Ñ4Ô4ˆØ"Ðð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	õ, ˜$Ô*×/Ò/Ñ1Ô1Ñ2Ô2ð 	&ð 	&ˆCØ�hŠˆØØŸ	š	 #™œ¨Ñ*ˆIØ˜5Ò Ð Øà$˜ S¨)°a©-Ñ8Ô8ˆJØ�MŠM˜*Ñ%Ô%Ð%Ð%ð
 �tÔ'Ð'Ð'Ð0BÐ'Øð *ð *�Ø  q¤™>��a‘�à �[ ¨1Ñ-Ô-°Ñ6ˆFåˆv‰;Œ;˜!ÒÐØ+Ð+Ð+Ð,ˆFà× Ò  °ÐB\Ð Ñ]Ô]Ð]r#   c                 óÄ   — | j                              ¦   «          | j                             ¦   «          t	          | ¦  «        | _        | j                             ¦   «          | S r   )rM  ÚclearrR  Ú	__enter__Ú_FlopCounterModerN  rX  s    r!   r|  zFlopCounterMode.__enter__‘  sT   € ØÔ×ÒÑ Ô Ð ØÔ×"Ò"Ñ$Ô$Ð$Ý$ TÑ*Ô*ˆŒ	ØŒ	×ÒÑÔÐØˆr#   c                 óì   — | j         €t          d¦  «        ‚ | j         j        |Ž }d | _         | j                             ¦   «          | j        r't          |                      | j        ¦  «        ¦  «         |S )Nz<Internal error: FlopCounter.__exit__ called but mode is None)rN  rS   Ú__exit__rR  r@  Úprintry  r?  )rS  r3   ra   s      r!   r  zFlopCounterMode.__exit__˜  sq   € ØŒ9ÐÝ Ð!_Ñ`Ô`Ð`ØˆDŒIÔ Ð%ˆØˆŒ	ØÔ×!Ò!Ñ#Ô#Ð#ØŒ<ð 	.Ý�$—.’. ¤Ñ,Ô,Ñ-Ô-Ð-Øˆr#   c                 ó¸   — || j         v rP| j         |         } ||i |¤d|i¤Ž}t          | j        j        ¦  «        D ]}| j        |         |xx         |z  cc<   Œ|S )Nr0   )r-   ÚsetrR  ÚparentsrM  )rS  Úfunc_packetrõ   r3   r4   Úflop_count_funcrˆ   Úpars           r!   Ú_count_flopszFlopCounterMode._count_flops¢  s‡   € Ø˜$Ô,Ð,Ð,Ø"Ô0°Ô=ˆOØ(˜¨$ÐF°&ÐFÐFÀ#ÐFÐFÐFˆJÝ˜4Ô+Ô3Ñ4Ô4ð Að A�ØÔ  Ô% kÐ2Ð2Ô2°jÑ@Ð2Ð2Ñ2Ð2Øˆ
r#   )NrQ   TNr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Únnr^  r‚   r  Úboolr  r	   rL  rY  r  r\  ry  r|  r  r‡  Ú__classcell__)rT  s   @r!   r   r     sD  ø€ € € € € ðð ð* DHØØ Ø48ð+ð +à”(”/ D¨¬¬Ô$9Ñ9¸DÑ@ð+ð ð+ð ð	+ð
 !  c œN¨TÑ1ð+ð
 >Bð+ð +ð +ð +ð +ð +ð*8 ð 8ð 8ð 8ð 8ð
A  c¨4°°S°¬>Ð&9Ô!:ð 
Að 
Að 
Að 
Að<^ð <^ð <^ð <^ð~ð ð ðð ð ðð ð ð ð ð ð r#   c                   ó6   — e Zd ZdZdeddfd„Zd„ Zd„ Zd
d	„ZdS )r}  TÚcounterr9   Nc                 ó   — || _         d S r   )r�  )rS  r�  s     r!   rL  z_FlopCounterMode.__init__­  s   € ØˆŒˆˆr#   c                 óä   — ddl }|                      | j        j        ¦  «        }| 5   ||Ž }ddd¦  «         n# 1 swxY w Y   |                      | j        j        ¦  «        }|| j        _        ||fS )a�  Execute a branch function and capture its FLOP counts without
        affecting self.counter.flop_counts

        Args:
            branch_fn: The branch function to execute
            operands: Arguments to pass to the branch function

        Returns:
            Tuple of (result, flop_counts) where result is the branch output
            and flop_counts is a copy of the FLOP counts after execution
        r   N)Úcopyr�  rM  )rS  Ú	branch_fnÚoperandsr“  Úcheckpointed_flop_countsÚresultrM  s          r!   Ú$_execute_with_isolated_flop_countingz5_FlopCounterMode._execute_with_isolated_flop_counting°  s¶   € ð 	ˆˆˆØ#'§9¢9¨T¬\Ô-EÑ#FÔ#FÐ Øð 	*ð 	*Ø�Y Ð)ˆFð	*ð 	*ð 	*ñ 	*ô 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*øøøð 	*ð 	*ð 	*ð 	*à—i’i ¤Ô 8Ñ9Ô9ˆØ#;ˆŒÔ Ø�{Ð"Ð"s   ¦8¸<¿<c                 óŒ  — |t           j        j        j        t           j        j        j        hv }|rsddlm} ddlm}  ||d         ¦  «        }t          ||¦  «        s)t          |d¦  «        r|j        }nnt          ||¦  «        ¯)| j                             |d ||¦  «        S |t           j        j        j        u �r‚|\  }	}
}}|                      |
|¦  «        \  }}|t           u rt           S |                      ||¦  «        \  }}|t           u rt           S t#          |                     ¦   «         ¦  «        t#          |                     ¦   «         ¦  «        z  }i }|D ] }||         }||         }i }t#          |                     ¦   «         ¦  «        t#          |                     ¦   «         ¦  «        z  }|D ]A}|                     |d¦  «        }|                     |d¦  «        }t)          ||¦  «        ||<   ŒB|||<   Œ¡|                     ¦   «         D ]*\  }}| j        j        |                              |¦  «         Œ+|S t           S )Nr   )Ú
get_kernelr   Ú
kernel_idxÚfn)r   ÚopsÚhigher_orderÚtriton_kernel_wrapper_mutationÚ triton_kernel_wrapper_functionalÚ*torch._higher_order_ops.triton_kernel_wraprš  Útriton.runtime.jitr   r(   Úhasattrrœ  r�  r‡  Úcondr˜  ÚNotImplementedr‚  rr  r  r  rQ  rM  Úupdate)rS  ÚfuncÚtypesr3   r4   Ú	is_tritonrš  r   Úkernel_nameÚpredÚtrue_branchÚfalse_branchr•  Útrue_outÚtrue_flop_countsÚ	false_outÚfalse_flop_countsÚall_mod_keysÚmerged_flop_countsÚ	outer_keyÚtrue_func_countsÚfalse_func_countsÚmerged_func_countsÚall_func_keysÚfunc_keyÚtrue_valÚ	false_valÚ
inner_dicts                               r!   Ú_handle_higher_order_opsz)_FlopCounterMode._handle_higher_order_opsÄ  s£  € Ø�UœYÔ3ÔRÝ"œYÔ3ÔTðVð Vˆ	àð 8	"ØMÐMÐMÐMÐMÐMà6Ð6Ð6Ð6Ð6Ð6Ø$˜* V¨LÔ%9Ñ:Ô:ˆKå  ¨kÑ:Ô:ð Ý˜;¨Ñ-Ô-ð Ø"-¤.�K�Kàõ	 ! ¨kÑ:Ô:ð ð
 ”<×,Ò,¨[¸$ÀÀfÑMÔMÐMØ•U”YÔ+Ô0Ð0Ñ0ð
 9=Ñ5ˆD�+˜|¨Xà)-×)RÒ)RØ˜Xñ*ô *Ñ&ˆHÐ&ð �>Ð)Ð)Ý%Ð%à+/×+TÒ+TØ˜hñ,ô ,Ñ(ˆIÐ(ð �NÐ*Ð*Ý%Ð%õ Ð/×4Ò4Ñ6Ô6Ñ7Ô7½#Ð>O×>TÒ>TÑ>VÔ>VÑ:WÔ:WÑWˆLØ!#ÐØ)ð Cð C�	Ø#3°IÔ#>Ð Ø$5°iÔ$@Ð!à%'Ð"Ý #Ð$4×$9Ò$9Ñ$;Ô$;Ñ <Ô <½sÐCT×CYÒCYÑC[ÔC[Ñ?\Ô?\Ñ \�à -ð Lð L�HØ/×3Ò3°H¸aÑ@Ô@�HØ 1× 5Ò 5°hÀÑ BÔ B�IÝ36°xÀÑ3KÔ3KÐ& xÑ0Ð0à0BÐ" 9Ñ-Ð-ð *<×)AÒ)AÑ)CÔ)Cð Gð GÑ%�	˜:Ø”Ô(¨Ô3×:Ò:¸:ÑFÔFÐFÐFð ˆOå!Ð!r#   r4  c                 óÆ  — |r|ni }|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        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        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        hv rt(          S t+          |t           j        j        ¦  «        r|                      ||||¦  «        S || j        j        vr\|t           j        j        j        j        ur?| 5   |j        |i |¤Ž}|t(          ur|cd d d ¦  «         S 	 d d d ¦  «         n# 1 swxY w Y    ||i |¤Ž}| j                             |j        |||¦  «        S r   )r   r�  ÚatenÚsym_is_contiguousÚdefaultÚis_contiguousÚmemory_formatÚis_strides_like_formatÚis_non_overlapping_and_denser­   Úsym_sizeÚstrideÚ
sym_strideÚstorage_offsetÚsym_storage_offsetÚnumelÚ	sym_numelÚdimÚprimÚlayoutr¥  r(   r@   r>   r½  r�  r-   rª   Ú	decomposer‡  Ú_overloadpacket)rS  r§  r¨  r3   r4   Úrrõ   s          r!   Ú__torch_dispatch__z#_FlopCounterMode.__torch_dispatch__  s%  € Ø!Ð)�� rˆð •E”I”NÔ4Ô<Ý”I”NÔ0Ô8Ý”I”NÔ0Ô>Ý”I”NÔ9ÔAÝ”I”NÔ?ÔGÝ”I”NÔ'Ô/Ý”I”NÔ+Ô3Ý”I”NÔ)Ô1Ý”I”NÔ-Ô5Ý”I”NÔ1Ô9Ý”I”NÔ5Ô=Ý”I”NÔ(Ô0Ý”I”NÔ,Ô4Ý”I”NÔ&Ô.Ý”I”NÔ)Ô1ð3ð 3ð 3õ  "Ð!å�d�EœJÔ:Ñ;Ô;ð 	LØ×0Ò0°°u¸dÀFÑKÔKÐKð �t”|Ô1Ð1Ð1°dÅ%Ä)Ä.ÔBWÔB_Ð6_Ð6_Øð ð Ø"�D”N DÐ3¨FÐ3Ð3�Ø�NÐ*Ð*Øðð ð ð ñ ô ð ð à*ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ˆd�DÐ#˜FÐ#Ð#ˆØŒ|×(Ò(¨Ô)=¸sÀDÈ&ÑQÔQÐQs   Ç<H.È.H2È5H2)r4  N)	rˆ  r‰  rŠ  Úsupports_higher_order_operatorsr   rL  r˜  r½  rÓ  r4  r#   r!   r}  r}  ª  su   € € € € € Ø&*Ð#ð ð °Dð ð ð ð ð#ð #ð #ð(;"ð ;"ð ;"ðz"Rð "Rð "Rð "Rð "Rð "Rr#   r}  )Fr   )NNNFNrH   )hr¨  r   Úloggingr   Útorch.utils._pytreer   r   r   Úmodule_trackerr   Útypingr	   r
   Úcollections.abcr   r   Útyping_extensionsr   Úcollectionsr   Útorch.utils._python_dispatchr   Úmathr   Ú	functoolsr   rO  Ú__all__r   r   Ú	getLoggerrˆ  Úlogr¢  r   rB   ÚImportErrorÚanyÚwarningr�  r¿  r,   r-   r  Ú__annotations__r8   r   Úmmr  rZ   Úaddmmr_   Úbmmrd   Úbaddbmmrf   Ú
_scaled_mmrn   r‚   r�  rx   ÚconvolutionÚ_convolutionÚcudnn_convolutionÚ_slow_conv2d_forwardÚconvolution_overrideabler   Úconvolution_backwardr‹   rŸ   Ú'_scaled_dot_product_efficient_attentionÚ#_scaled_dot_product_flash_attentionÚ#_scaled_dot_product_cudnn_attentionr£   r°   r"  rÌ   r×   Ú_flash_attention_forwardrá   Ú_efficient_attention_forwardræ   rì   Ú0_scaled_dot_product_efficient_attention_backwardÚ,_scaled_dot_product_flash_attention_backwardÚ,_scaled_dot_product_cudnn_attention_backwardrï   Ú_flash_attention_backwardrø   Ú_efficient_attention_backwardrû   r  r  r  r   r$  r+  r.  r1  r  r7  r<  r   r}  r4  r#   r!   ú<module>rû     s%
  ðà Ð Ð Ð Ð Ð Ð Ø €€€Ø €€€Ø FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FØ )Ð )Ð )Ð )Ð )Ð )Ø Ð Ð Ð Ð Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ø $Ð $Ð $Ð $Ð $Ð $Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø #Ð #Ð #Ð #Ð #Ð #Ø :Ð :Ð :Ð :Ð :Ð :Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø €€€àÐ5Ð
6€à€WˆT�]„]€Ø€Yˆt�_„_€à€gÔ˜Ñ!Ô!€ðØ>Ð>Ð>Ð>Ð>Ð>Ð>øØð ð ð Ø
€sÐ
]Ð
]ÐF\Ð
]Ñ
]Ô
]Ñ]Ô]ð XØ�ŠÐVÑWÔWÐWØ€L€L€Lðøøøð „y„~€ðð ð ð
 !#€ˆt�C˜�HŒ~Ð "Ð "Ñ "ðð ð ðð °X¸xÈÈBÈÔ?OÐ>PÐRZÐ[]Ð_aÐ[aÔRbÐ>bÔ5cð ð ð ð ð4 Ð�t”wÑÔØ/3ð 	ð 	ð 	À#ð 	ð 	ð 	ñ  Ôð	ð Ð�t”zÑ"Ô"ð%ð %È#ð %ð %ð %ñ #Ô"ð%ð Ð�t”xÑ Ô ðð ¸Cð ð ð ñ !Ô ðð Ð�t”|Ñ$Ô$ð&ð &ÈCð &ð &ð &ñ %Ô$ð&ð Ð�t”Ñ'Ô'ð ØØØØð%ð %ð 	ð%ð %ð %ñ (Ô'ð%ð( ð	$ð $Ø�#ŒYð$à�#ŒYð$ð �CŒyð$ð ð	$ð
 	ð$ð $ð $ð $ðL Ð˜Ô(ØÔ)ØÔ.ØÔ1ØÔ5ð	7ñ 8ô 8ð
 cgð Oð Oð OÐuxð Oð Oð Oñ8ô 8ð
Oð Ð�tÔ0Ñ1Ô1ðfð ðfð fð fñ 2Ô1ðfðPð ð ð8 Ð˜ÔDØÔ@ØÔ@ðBñ Cô Cð EIð @ð @ð @ÐWZð @ð @ð @ñCô Cð@ð	-ð 	-ð 	-ð" ð1`ð 1`ð 1`ð ˆe�E˜#˜s˜(”O U¨3°¨8¤_°e¸CÀ¸H´oÀuÈSÐRUÈXÄÐY]ÑG]Ð]Ô^Ô_ð1`ð 1`ð 1`ð 1`ðr ð4`ð 4`ð 4`ð ˆe�E˜#˜s˜(”O U¨3°¨8¤_°e¸CÀ¸H´oÀuÈSÐRUÈXÄÐY]ÑG]Ð]Ô^Ô_ð4`ð 4`ð 4`ð 4`ðn Ð�tÔ4¸dÐCÑCÔCð ðð ð ð 	ðð ð ñ DÔCðð> Ð�tÔ8À$ÐGÑGÔGðð 	ðð ð ñ HÔGðð>"ð "ð "ðJ Ð˜ÔMØÔIØÔIðKñ Lô Lð ^bð Yð Yð YÐpsð Yð Yð YñLô LðYð Ð�tÔ5¸tÐDÑDÔDðð 	ðð ð ñ EÔDðð@ Ð�tÔ9À4ÐHÑHÔHðð 	ðð ð ñ IÔHðð@ Hð  Hð  Hð  HðX ðð ð ð 	ðð ð ð ðL ðð ð ð 	ðð ð ð ð> ðð ð ð 	ðð ð ð ð@Ø„GˆWðà„J�
ðð 	„Hˆhðð 	„L�,ð	ð
 	„O�_ðð 	Ô�iðð 	Ô�yðð 	Ô˜Iðð 	Ô! 9ðð 	Ô˜yðð 	ÔÐ1ðð 	Ô0°)ðð 	Ô,¨iðð 	Ô,¨iðð 	Ô9Ð;Mðð  	Ô5Ð7Ið!ð" 	Ô5Ð7Ið#ð$ 	Ô!Ð#@ØÔ%Ð'HØÔ"Ð$BØÔ&Ð(Jð+ð €ð0 Ð Ñ  Ô  Ð  ðð ð ð $Ð#Ð#€ðð ð ð#ð #ð #ð ¨#ð  ð  ð  ð  ð
ð ð ðNð Nð Nð Nð Nñ Nô Nð Nð`yRð yRð yRð yRð yRÐ(ñ yRô yRð yRð yRð yRs   ÂB Â1B<Â;B<