§
    �ŠtjT‡  ã                   óJ  — d dl Z d dlZd dlZd dlmc mZ d dlmZm	Z	m
Z
mZmZmZmZmZ d dlmZ ddlmZ  e j        e¦  «        Z	 	 	 	 d-dej        d	ej        d
ej        dej        dz  ddf
d„Zd.dedefd„Zd.dedefd„Zd.dedefd„Z	 d.dej        dedefd„Zd.defd„Zd.dedefd„Z d.dedefd„Z!d.dedefd„Z"d.dedefd„Z#d„ Z$dej        de%ej        e&e&f         fd„Z'dej        defd„Z(dej        de&d e&d!e&dej        f
d"„Z)d#„ Z*dej        d$e&d%edej        fd&„Z+d'„ Z,d(ej        fd)„Z-d*„ Z.dej        d	ej        d
ej        dej        dz  de%ej        ej        ej        ej        dz  f         f
d+„Z/	 	 	 	 	 d/dej        d	ej        d
ej        dej        dz  fd,„Z0dS )0é    N)Úcan_use_cudnn_attentionÚcan_use_efficient_attentionÚcan_use_flash_attentionÚcudnn_sdp_enabledÚflash_sdp_enabledÚmath_sdp_enabledÚmem_efficient_sdp_enabledÚ
SDPAParams)Ú
SDPBackendé   )ÚNestedTensorç        FÚqueryÚkeyÚvalueÚ	attn_maskÚreturnc           	      óÔ  — t          | t          ¦  «        r*t          |t          ¦  «        rt          |t          ¦  «        s(t          d| j        › d|j        › d|j        › d�¦  «        ‚| j        |j        k    s| j        |j        k    r(t          d| j        › d|j        › d|j        › d�¦  «        ‚| j        |j        k    s| j        |j        k    r(t          d| j        › d	|j        › d
|j        › d�¦  «        ‚|                      ¦   «         dk     s0|                     ¦   «         dk     s|                     ¦   «         dk     rOt          d|                      ¦   «         › d|                     ¦   «         › d|                     ¦   «         › d�¦  «        ‚| j        |j        k    s| j        |j        k    r(t          d| j        › d|j        › d|j        › d�¦  «        ‚|�t          d¦  «        ‚d S )NzNExpected query, key, and value to be nested tensors, but got query.is_nested: z, key.is_nested: z, and value.is_nested: z	 instead.zLExpected query, key, and value to have the same dtype, but got query.dtype: z, key.dtype: z, and value.dtype: zSExpected query, key, and value to have the same device type, but got query.device: z, key.device: z, and value.device: é   zTExpected query, key, and value to all be at least 3 dimensional, but got query.dim: z, key.dim: z and value.dim: z[Expected query, key, and value to all be ragged on the same dimension, but got ragged dims z, z, and z, respectively.zMasks are not yet supported!)
Ú
isinstancer   Ú
ValueErrorÚ	is_nestedÚdtypeÚdeviceÚdimÚ_ragged_idxÚtorchÚbool)r   r   r   r   Ú	dropout_pÚ	is_causalÚscales          úY/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/nested/_internal/sdpa.pyÚ_validate_sdpa_inputr#      s�  € õ �u�lÑ+Ô+ð	
å˜#�|Ñ,Ô,ð	
õ ˜%¥Ñ.Ô.ð	
õ
 ð?Ø(-¬ð?ð ?ØJMÌ-ð?ð ?à$)¤Oð?ð ?ð ?ñ
ô 
ð 	
ð
 „{�c”iÒÐ 5¤;°%´+Ò#=Ð#=Ýð7Ø$)¤Kð7ð 7Ø>A¼ið7ð 7à %¤ð7ð 7ð 7ñ
ô 
ð 	
ð
 „|�s”zÒ!Ð! U¤\°U´\Ò%AÐ%AÝð9Ø%*¤\ð9ð 9ØADÄð9ð 9à!&¤ð9ð 9ð 9ñ
ô 
ð 	
ð
 ‡y‚y�{„{�Q‚€˜#Ÿ'š'™)œ) aš-˜-¨5¯9ª9©;¬;¸ª?¨?ÝðYØ�yŠy‰{Œ{ðYð YØ'*§w¢w¡y¤yðYð YØBGÇ)Â)Á+Ä+ðYð Yð Yñ
ô 
ð 	
ð Ô˜CœOÒ+Ð+¨uÔ/@ÀEÔDUÒ/UÐ/UÝðcØÔ%ðcð cØ),¬ðcð cØ@EÔ@Qðcð cð cñ
ô 
ð 	
ð ÐåÐ7Ñ8Ô8Ð8ð Ðó    Úparamsc                 ó¶   — | j                              d¦  «        }| j                             d¦  «        }| j                             d¦  «        }||k    o||k    S )Nr   )r   Úsizer   r   )r%   ÚdebugÚq_batch_sizeÚk_batch_sizeÚv_batch_sizes        r"   Ú_check_batch_size_nestedr,   L   sX   € ð ”<×$Ò$ QÑ'Ô'€LØ”:—?’? 1Ñ%Ô%€LØ”<×$Ò$ QÑ'Ô'€Lð
 ˜<Ò'ÐH¨L¸LÒ,HÐHr$   c                 ó"  — d}| j                              d¦  «        }| j                             d¦  «        }| j                             d¦  «        }||k    o||k    }|r|dz  dk    r||k    s!|rt                               d|||¦  «         dS dS )Né   éÿÿÿÿé   r   zÖFor NestedTensor inputs, Flash attention requires q,k,v to have the same last dimension and to be a multiple of 8 and less than or equal to 256. Got Query.size(-1): %d, Key.size(-1): %d, Value.size(-1): %d instead.FT©r   r'   r   r   ÚlogÚwarning©r%   r(   Úmax_sizeÚquery_size_lastÚkey_size_lastÚvalue_size_lastÚsame_head_dim_sizes          r"   Ú!_check_head_dim_size_flash_nestedr:   Y   ó»   € Ø€HØ”l×'Ò'¨Ñ+Ô+€OØ”J—O’O BÑ'Ô'€MØ”l×'Ò'¨Ñ+Ô+€Oà˜=Ò(ÐO¨_ÀÒ-Oð ð 	ðà˜qÑ  AÒ%Ð%Ø Ò(Ð(àð 	Ý�KŠKðXð  ØØñô ð ð ˆuØˆ4r$   c                 ó"  — d}| j                              d¦  «        }| j                             d¦  «        }| j                             d¦  «        }||k    o||k    }|r|dz  dk    r||k    s!|rt                               d|||¦  «         dS dS )Né€   r/   r0   r   zÖFor NestedTensor inputs, cuDNN attention requires q,k,v to have the same last dimension and to be a multiple of 8 and less than or equal to 128. Got Query.size(-1): %d, Key.size(-1): %d, Value.size(-1): %d instead.FTr1   r4   s          r"   Ú!_check_head_dim_size_cudnn_nestedr>   s   r;   r$   ÚparamÚ
param_namec                 ó  — t          | t          ¦  «        st          d¦  «        ‚| j        dk    r|rt                               d|¦  «         dS |                      ¦   «         dk    r|rt                               d|¦  «         dS dS )Nzparam should be a jagged NTr   zMFused kernels do not support ragged num_head_dims, %s has a ragged num_heads.Fr   zAFused kernels do not support seq_len == 0, %s has a seq len of 0.T)r   r   ÚAssertionErrorr   r2   r3   Ú_get_min_seqlen)r?   r@   r(   s      r"   Ú:_check_for_seq_len_0_and_consistent_head_dim_nested_helperrD   �   s§   € õ �e�\Ñ*Ô*ð <ÝÐ:Ñ;Ô;Ð;àÔ˜AÒÐàð 	Ý�KŠKØ_Øñô ð ð ˆuð ×ÒÑÔ !Ò#Ð#Øð 	Ý�KŠKØSØñô ð ð ˆuàˆ4r$   c           
      óº   — t          | ||¦  «        }| |k    r| dk    s||k    r|dk    s||k    r+|dk    r%|r!t                               d||| ||||¦  «         dS dS )Nr   zzBoth fused kernels require query, key and value to have broadcastable %s, got Query %s %d, Key %s %d, Value %s %d instead.FT)Úmaxr2   r3   )Úq_sizeÚk_sizeÚv_sizer@   r(   r5   s         r"   Ú_try_broadcast_param_sizerJ   ¨   s‘   € Ý�6˜6 6Ñ*Ô*€Hà	�8Ò	Ð	 ¨!¢ Ø�hÒÐ 6¨Q¢; ;Ø�hÒÐ 6¨Q¢; ;àð 	Ý�KŠKðCàØØØØØØñ
ô 
ð 
ð ˆuØˆ4r$   c                 óX  — | j         j        rt          | j         d|¦  «        nd}|sdS | j        j        rt          | j        d|¦  «        nd}|sdS | j        j        rt          | j        d|¦  «        nd}|sdS | j                              d¦  «        }| j                             d¦  «        }| j                             d¦  «        }||k    o||k    }|sU| j         j        s| j        j        s| j        j        r|rt                               d¦  «         dS t          |||d|¦  «        S dS )	Nr   TFr   r   r   zFBoth fused kernels do not support training with broadcasted NT inputs.z	num heads)
r   r   rD   r   r   r'   Úrequires_gradr2   r3   rJ   )	r%   r(   Ú	q_is_safeÚ	k_is_safeÚ	v_is_safeÚq_num_headsÚk_num_headsÚv_num_headsÚsame_num_headss	            r"   Ú_check_for_seq_len_0_nestedrT   ¿   s�  € ð Œ<Ô!ð	ÕBØŒL˜' 5ñ	
ô 	
ð 	
ð ð ð ð Øˆuð Œ:Ôð	ÕBØŒJ˜˜uñ	
ô 	
ð 	
ð ð ð ð Øˆuð Œ<Ô!ð	ÕBØŒL˜' 5ñ	
ô 	
ð 	
ð ð ð ð Øˆuð ”,×#Ò# AÑ&Ô&€KØ”*—/’/ !Ñ$Ô$€KØ”,×#Ò# AÑ&Ô&€KØ  KÒ/ÐN°KÀ;Ò4N€Nàð 
àŒLÔ&ð		àŒzÔ'ð		ð Œ|Ô)ð		ð
 ð Ý—’Ø\ñô ð ð �5Ý(Ø˜ k°;Àñ
ô 
ð 	
ð ˆ4r$   c                 óV   — t           t          t          f}|D ]} || |¦  «        s dS ŒdS ©NFT)r,   r:   rT   ©r%   r(   ÚconstraintsÚ
constraints       r"   Ú_can_use_flash_sdpa_jaggedrZ   ú   sH   € å Ý)Ý#ð€Kð
 "ð ð ˆ
Øˆz˜& %Ñ(Ô(ð 	Ø�5�5ð	àˆ4r$   c                 óJ   — t           t          f}|D ]} || |¦  «        s dS ŒdS rV   )r,   rT   rW   s       r"   Ú_can_use_efficient_sdpa_jaggedr\     sE   € å Ý#ð€Kð "ð ð ˆ
Øˆz˜& %Ñ(Ô(ð 	Ø�5�5ð	àˆ4r$   c                 óš  — | j                              dd¦  «                             ¦   «         rZ| j                             dd¦  «                             ¦   «         r-| j                             dd¦  «                             ¦   «         s|rt
                               d¦  «         dS | j        r|rt
                               d¦  «         dS dS )Nr   é   zGIf inputs are nested tensors they must be contiguous after transposing.FzENested tensors for query / key are not supported when is_causal=True.T)r   Ú	transposeÚis_contiguousr   r   r2   r3   r    )r%   r(   s     r"   Ú_can_use_math_sdpa_jaggedra     sØ   € àŒL×"Ò" 1 aÑ(Ô(×6Ò6Ñ8Ô8ð	àŒz×#Ò# A qÑ)Ô)×7Ò7Ñ9Ô9ð	ð Œ|×%Ò% a¨Ñ+Ô+×9Ò9Ñ;Ô;ð	ð
 ð 	Ý�KŠKØYñô ð ð ˆuØÔð Øð 	Ý�KŠKØWñô ð ð ˆuØˆ4r$   c           	      óŽ  — t          ¦   «         s6t          ¦   «         s(t          ¦   «         st          ¦   «         st          j        S t          j        t          j        t          j        t          j	        f}t          | ||||||¦  «        }|D ]â}	|	t          j	        k    rt          |¦  «        rt          j	        c S |	t          j        k    r,t          |¦  «        rt          |¦  «        rt          j        c S |	t          j        k    r,t          |¦  «        rt          |¦  «        rt          j        c S |	t          j        k    r+t          ¦   «         rt!          |¦  «        rt          j        c S Œãt"                               d¦  «         t          |d¬¦  «         t          |d¬¦  «         t"                               d¦  «         t          |d¬¦  «         t          |d¬¦  «         t"                               d¦  «         t!          |d¬¦  «         t"                               d¦  «         t          |d¬¦  «         t          j        S )Nz)Memory efficient kernel not used because:T)r(   z(Flash attention kernel not used because:z'Math attention kernel not used because:z(cuDNN attention kernel not used because:)r   r	   r   r   r   ÚERRORÚFLASH_ATTENTIONÚEFFICIENT_ATTENTIONÚMATHÚCUDNN_ATTENTIONr
   r   r   rZ   r   r\   ra   r2   r3   )
r   r   r   r   Údropoutr    Ú
enable_gqaÚorderingr%   Úbackends
             r"   Ú_select_sdp_backendrl   %  sB  € åÑÔð å)Ñ+Ô+ð õ !Ñ"Ô"ð õ "Ñ#Ô#ð	 õ ÔÐõ 	Ô"ÝÔ&ÝŒÝÔ"ð	€Hõ ˜˜s E¨9°g¸yÈ*ÑUÔU€Fàð 'ð 'ˆØ•jÔ0Ò0Ð0Ý& vÑ.Ô.ð 2Ý!Ô1Ð1Ð1Ð1Ø•jÔ0Ò0Ð0Ý& vÑ.Ô.ð 2Õ3MÈfÑ3UÔ3Uð 2Ý!Ô1Ð1Ð1Ð1Ø•jÔ4Ò4Ð4Ý*¨6Ñ2Ô2ð 6Õ7UØñ8ô 8ð 6õ "Ô5Ð5Ð5Ð5Ø•j”oÒ%Ð%ÝÑ!Ô!ð 'Õ&?ÀÑ&GÔ&Gð 'Ý!”Ð&Ð&Ð&øå‡K‚KÐ;Ñ<Ô<Ð<Ý ¨dÐ3Ñ3Ô3Ð3Ý" 6°Ð6Ñ6Ô6Ð6Ý‡K‚KÐ:Ñ;Ô;Ð;Ý˜F¨$Ð/Ñ/Ô/Ð/Ý˜v¨TÐ2Ñ2Ô2Ð2Ý‡K‚KÐ9Ñ:Ô:Ð:Ý˜f¨DÐ1Ñ1Ô1Ð1Ý‡K‚KÐ:Ñ;Ô;Ð;Ý˜F¨$Ð/Ñ/Ô/Ð/ÝÔÐr$   Úqkvc                 ó`  — t          | t          ¦  «        st          d¦  «        ‚|                      ¦   «         €l|                      ¦   «                              t          j        | j        ¬¦  «        }|  	                    ¦   «         }|  
                    ¦   «         j        d         }n†|                      ¦   «                              d¦  «                             t          j        | j        ¬¦  «        }|  	                    ¦   «         }t          |d                              ¦   «         ¦  «        }|||fS )Nz<QKV must be nested for flash cumulative_seq_len calculation.)r   r   r   r/   )r   r   r   ÚlengthsÚoffsetsÚtor   Úint32r   Ú_get_max_seqlenÚvaluesÚshapeÚcumsumÚintÚitem)rm   Úcumulative_seqlenÚ
max_seqlenÚn_elems       r"   Ú_cumulative_and_max_seq_len_nnzr|   T  s÷   € õ �c�<Ñ(Ô(ð YÝÐWÑXÔXÐXà
‡{‚{�}„}ÐàŸKšK™MœM×,Ò,µ5´;ÀsÄzÐ,ÑRÔRÐØ×(Ò(Ñ*Ô*ˆ
Ø—’‘”Ô# AÔ&ˆˆð �KŠK‰MŒM× Ò  Ñ#Ô#×&Ò&­U¬[ÀÄÐ&ÑLÔLð 	ð ×(Ò(Ñ*Ô*ˆ
åÐ& rÔ*×/Ò/Ñ1Ô1Ñ2Ô2ˆØ˜j¨&Ð0Ð0r$   Útensorc                 ó  — t          | t          ¦  «        st          d¦  «        ‚|                      ¦   «         }| j        }|                     d¦  «        dz
  }|dk    rdS |d         }|dd …         D ]}||k    r dS |}ŒdS )Nztensor must be a NestedTensorr   r   Tr^   F)r   r   rB   rp   Ú_stridesr'   )r}   rp   ÚstridesÚ	n_tensorsÚprev_strideÚstrides         r"   Ú!_is_safe_to_get_storage_as_tensorr„   o  s¡   € õ �f�lÑ+Ô+ð >ÝÐ<Ñ=Ô=Ð=Ø�nŠnÑÔ€GØŒo€Gà—’˜Q‘” !Ñ#€IØ�A‚~€~Øˆtð ˜!”*€KØ˜!˜"˜"”+ð ð ˆØ˜&Ò Ð ð �5�5Øˆˆð ˆ4r$   ÚNnzÚ	num_headsÚhead_dimc                 óf   — | j         r|                      ¦   «         S |                      |||¦  «        S ©N)r   rt   Úview)r}   r…   r†   r‡   s       r"   Ú_view_as_denser‹   �  s3   € ð Ôð Ø�}Š}‰ŒÐØ�;Š;�s˜I xÑ0Ô0Ð0r$   c                 ó  — |                       d¦  «        }|                      d¦  «        }|                      d¦  «        }|                       d¦  «        }|                      d¦  «        }|                      d¦  «        }||k    r||k    r||k    r||k    st          d¦  «        ‚|                       d¦  «        }	|                       d¦  «        }
|                      d¦  «        }|                      dd¦  «        }|                     dd¦  «        }|                     dd¦  «        }t          |¦  «        \  }}}t          |¦  «        \  }}}|                     ¦   «         s#t          |¦  «        s|                     ¦   «         }|                     ¦   «         s#t          |¦  «        s|                     ¦   «         }|                     ¦   «         s#t          |¦  «        s|                     ¦   «         }t          |||	|
¦  «        }t          |||	|
¦  «        }t          |||	|¦  «        }|                     ¦   «         | 	                    ¦   «         | 
                    ¦   «         |                     ¦   «         dœ}||||||||fS )Nr   r   z<This path is currently not implemented for jagged layout NT.r   r^   )rp   ro   rz   Ú
min_seqlen)r'   ÚRuntimeErrorr_   r|   r`   r„   Ú
contiguousr‹   rp   ro   rs   rC   )r   r   r   r)   r*   r+   rP   rQ   rR   r†   Úhead_dim_qkÚ
head_dim_vÚq_tÚk_tÚv_tÚcumulative_sequence_length_qÚmax_seqlen_batch_qÚNnz_qÚcumulative_sequence_length_kvÚmax_seqlen_batch_kvÚNnz_kvÚquery_buffer_reshapedÚkey_buffer_reshapedÚvalue_buffer_reshapedÚoutput_nt_infos                            r"   Ú_sdpa_nested_preprocessingrŸ   %  sx  € ð —:’:˜a‘=”=€LØ—8’8˜A‘;”;€LØ—:’:˜a‘=”=€Là—*’*˜Q‘-”-€KØ—(’(˜1‘+”+€KØ—*’*˜Q‘-”-€Kà˜LÒ(Ð(¨\¸\Ò-IÐ-IØ�{Ò"Ð" {°kÒ'AÐ'AåØJñ
ô 
ð 	
ð
 —
’
˜1‘”€IØ—*’*˜Q‘-”-€KØ—’˜A‘”€JØ
�/Š/˜!˜QÑ
Ô
€CØ
�-Š-˜˜1Ñ
Ô
€CØ
�/Š/˜!˜QÑ
Ô
€Cõ 	(¨Ñ,Ô,ñ	Ø$ØØõ 	(¨Ñ,Ô,ñ	Ø%ØØð ×ÒÑÔð Õ'HÈÑ'MÔ'Mð Ø�nŠnÑÔˆØ×ÒÑÔð Õ'HÈÑ'MÔ'Mð Ø�nŠnÑÔˆØ×ÒÑÔð Õ'HÈÑ'MÔ'Mð Ø�nŠnÑÔˆå*¨3°°yÀ+ÑNÔNÐÝ(¨¨f°iÀÑMÔMÐÝ*¨3°¸	À:ÑNÔNÐð —;’;‘=”=Ø—;’;‘=”=Ø×)Ò)Ñ+Ô+Ø×)Ò)Ñ+Ô+ð	ð €Nð 	ØØØ$Ø%ØØØð	ð 	r$   Úalignment_sizeÚslicec                 óÀ   — |                       d¦  «        }||z  dk    r| S |||z  z
  }t          j        j                             | d|g¦  «        } |r| dd|…f         S | S )Nr/   r   .)r'   r   ÚnnÚ
functionalÚpad)r}   r    r¡   Úlast_dim_sizeÚ	pad_counts        r"   Ú_pad_last_dimr¨   o  sv   € ð —K’K ‘O”O€MØ�~Ñ%¨Ò*Ð*ØˆØ -°.Ñ"@ÑA€IÝŒXÔ ×$Ò$ V¨a°¨^Ñ<Ô<€FØð ,Ø�c˜1˜]˜?Ð*Ô+Ð+Ø€Mr$   c                 ób   — |�|n)t          j        d|                      d¦  «        z  ¦  «        }|S )Ng      ð?r/   )r   Úsym_sqrtr'   )r   r!   Úsoftmax_scales      r"   Ú_calculate_scaler¬   ‚  s0   € à"Ð.�E�EµE´NÀ3ÈÏÊÐTVÉÌÑCWÑ4XÔ4X€MØÐr$   Úoutc                 ó^   — | j         s%|                      d¦  «        |k    r| dd|…f         } | S )Nr/   .r   )r   r'   )r­   Úog_sizes     r"   Ú_post_process_flash_outputr°   ˆ  s7   € ØŒ=ð "˜SŸXšX b™\œ\¨WÒ4Ð4Ø�#�q˜�y�.Ô!ˆØ€Jr$   c                 óÚ   — t           j                             ¦   «         sL| j        j        dk    r<t           j        j                             ¦   «         }t          d„ |D ¦   «         ¦  «        S dS )NÚmetac              3   ó`   K  — | ])}t          |¦  «        t          j        j        j        u V — Œ*d S r‰   )Útyper   ÚutilsÚflop_counterÚ_FlopCounterMode)Ú.0Úxs     r"   ú	<genexpr>z+_is_computing_meta_flops.<locals>.<genexpr>•  sI   è è € ð 
ð 
àõ �‰GŒG•u”{Ô/Ô@Ð@ð
ð 
ð 
ð 
ð 
ð 
r$   F)	r   ÚjitÚis_scriptingr   r´   rµ   Ú_python_dispatchÚ _get_current_dispatch_mode_stackÚany)r¹   Útorch_dispatch_mode_stacks     r"   Ú_is_computing_meta_flopsrÁ   Ž  sx   € õ Œ9×!Ò!Ñ#Ô#ð 
¨¬¬¸Ò(?Ð(?åŒKÔ(×IÒIÑKÔKð 	"õ ð 
ð 
à.ð
ñ 
ô 
ñ 
ô 
ð 	
ð ˆ5r$   c                 óÌ   ‡— | j         j        Št          | ¦  «        st          j        ‰¦  «        s| |||fS ˆfd„} || ¦  «         ||¦  «         ||¦  «         ||¦  «        fS )a*  
    [Autocasting SDPA for NJT]

    Normal autocasting doesn't work for NJT+SDPA right now:
    * NJT intercepts the __torch_function__ call for scaled_dot_product_attention, which happens
      before we get to any aten ops or dispatcher logic; then the torch_function logic calls into
      efficient attention or flash attention. So, autocasting on the scaled_dot_product_attention
      op won't work because we never see that aten op.
    * If we put autocasting on `_flash_attention_forward`, then we'll get autocasting to run, but
      the kernel selection logic in torch_function handling (ie. jagged_scaled_dot_product_attention)
      won't work correctly: the kernel selection logic will run before autocasting, and choose
      a kernel based on the un-autocasted dtypes; but then autocasting will run and the actual
      attention computation will happen in a different dtype.

    An alternative is to just change the backend selection logic for SDPA+NJT to be autocast-aware
    and rely on autocasting to do the actual conversions for flash attention / efficient attention.
    However, by manually doing the actual autocast before the backend selection, we ensure that the
    autocast handling for backend selection doesn't diverge from the autocast handling for the
    actual dtype conversions.
    c                 óº   •— | €| S t          j        ‰¦  «        }| j        j        r | j        |k    s| j        t           j        k    r| S |                      |¦  «        S r‰   )r   Úget_autocast_dtyper   Úis_floating_pointÚfloat64rq   )r¹   Útarget_dtypeÚdevice_types     €r"   Úcvtz_autocast.<locals>.cvt»  s]   ø€ Øˆ9ØˆHÝÔ/°Ñ<Ô<ˆà”Ô*ð	àŒw˜,Ò&Ð&ØŒw�%œ-Ò'Ð'àˆHØ�tŠt�LÑ!Ô!Ð!r$   )r   r´   rÁ   r   Úis_autocast_enabled)r   r   r   r   rÉ   rÈ   s        @r"   Ú	_autocastrË   œ  sŠ   ø€ ð4 ”,Ô#€Kå Ñ&Ô&ð ,­eÔ.GÈÑ.TÔ.Tð ,Ø�c˜5 )Ð+Ð+ð
"ð 
"ð 
"ð 
"ð 
"ð ˆ3ˆu‰:Œ:�s�s˜3‘x”x   U¡¤¨S¨S°©^¬^Ð;Ð;r$   c                 ót
  — t          | |||¦  «        \  } }}}t          | ||||||¦  «         t          | t          ¦  «        r*t          |t          ¦  «        rt          |t          ¦  «        st	          d¦  «        ‚ddlm} |                      ¦   «         dk    ró|                     ¦   «         dk    rÛ|                     ¦   «         dk    rÃ| j        dk    r¸t          j
        |                      ¦   «         |                     ¦   «         |                     ¦   «         t          |t          ¦  «        r|                     ¦   «         n||||¬¦  «        }	 ||	|                      ¦   «         |                      ¦   «         | j        | j        ¬¦  «        S | j        p|j        p|j        }
t#          | ||||||¦  «        }t%          | ¦  «        rt&          j        }|t&          j        k    rÔ|                      d¦  «        }t-          | d	d
¦  «        }t-          |d	d
¦  «        }t-          |d	d
¦  «        }t/          | |¦  «        }t1          |||¦  «        \  }}}}}}}}t2          j        j                             |||||||||d
|¬¦  «        \  }}}}} ||fi |¤Ž                     dd¦  «        }t=          ||¦  «        S |t&          j        k    rÇt1          | ||¦  «        \  }}} }}}}}t2          j        j                              | !                    d¦  «        | !                    d¦  «        |  !                    d¦  «        d |||||tE          |¦  «        |
|¬¦  «        \  }}!}"}#}$} || #                    d¦  «        fi |¤Ž                     dd¦  «        S |t&          j$        k    rrt1          | ||¦  «        \  }}} }}}}}t2          j        j         %                    ||| ||||||
||d
|¬¦  «        \	  }}%}&}'}$}(}"}#}) ||fi |¤Ž                     dd¦  «        S |t&          j&        k    �r|                      ¦   «         }*|                      ¦   «         }+| j        },| j        }-| j'        d         }.|j'        d         }/d„ }0 |0| ¦  «        }  |0|¦  «        } |0|¦  «        }t3          j(        | ||||||¬¦  «        d         }1|1                     dd¦  «         )                    ¦   «                              ¦   «         }1|1 *                    d|.|/¦  «        }1 ||1|*|+|,|-¬¦  «                             dd¦  «        }1|1S tW          d¦  «        ‚)Nz8query, key, and value must all be NestedTensor instancesr   )Ú'nested_view_from_values_offsets_lengthsr   r   )r   r   r    r!   )r�   rz   r/   r0   F)r!   r^   c                 ó„  — | j         dd …         | j         d d…         z
  }t          j        | dd¦  «        }|                     ¦   «                              t          |¦  «        d¬¦  «        }t          j                             t          |¦  «        ¦  «        }|                     dd¦  «                             ¦   «         }|S )Nr   r/   r^   r   )r   )	Ú_offsetsr   r_   rt   ÚsplitÚlistÚnestedÚas_nested_tensorr�   )Újagged_layout_ntro   r_   Útensor_listÚ
strided_nts        r"   Ú get_strided_layout_nested_tensorzMjagged_scaled_dot_product_attention.<locals>.get_strided_layout_nested_tensor‰  sª   € Ø&Ô/°°°Ô3Ð6FÔ6OÐPSÐQSÐPSÔ6TÑTˆGÝœÐ(8¸!¸QÑ?Ô?ˆIØ#×*Ò*Ñ,Ô,×2Ò2µ4¸±=´=ÀaÐ2ÑHÔHˆKÝœ×6Ò6µt¸KÑ7HÔ7HÑIÔIˆJØ#×-Ò-¨a°Ñ3Ô3×>Ò>Ñ@Ô@ˆJØÐr$   )ro   r�   rz   z=No viable backend for scaled_dot_product_attention was found.),rË   r#   r   r   rB   Ú$torch.nested._internal.nested_tensorrÍ   r   r   ÚFÚscaled_dot_product_attentionrt   rp   ro   Ú_maybe_min_seqlenÚ_maybe_max_seqlenrL   rl   rÁ   r   rd   r'   r¨   r¬   rŸ   r   ÚopsÚatenÚ_flash_attention_forwardr_   r°   re   Ú_efficient_attention_forwardÚ	unsqueezerw   Úsqueezerg   Ú_cudnn_attention_forwardrf   Ú_sizeÚ"_scaled_dot_product_attention_mathr�   rŠ   rŽ   )2r   r   r   r   r   r    r!   ri   rÍ   ÚoutputÚcompute_logsumexpÚbackend_choicer¯   Úquery_paddedÚ
key_paddedÚvalue_paddedÚog_scaler›   rœ   r�   r•   r˜   r–   r™   rž   Ú	attentionÚ
_logsumexpÚ_philox_seedÚ_philox_offsetÚ_debug_attn_maskÚquery_reshapedÚkey_reshapedÚvalue_reshapedÚ
log_sumexpÚseedÚoffsetÚmax_seqlen_qÚ	logsumexpÚcum_seqlen_qÚcum_seqlen_kvÚmax_seqlen_kvÚ_rp   Ú	q_lengthsr�   rz   Úd1Úd2r×   Úattn_outs2                                                     r"   Ú#jagged_scaled_dot_product_attentionr  Ê  sC  € õ $-¨U°C¸À	Ñ#JÔ#JÑ €Eˆ3��yÝ˜  U¨I°yÀ)ÈUÑSÔSÐSõ 	�5�,Ñ'Ô'ðYå�s�LÑ)Ô)ðYõ �u�lÑ+Ô+ðYõ
 ÐWÑXÔXÐXðð ð ð ð ð ð ‡y‚y�{„{�Q‚€˜3Ÿ7š7™9œ9 qš=˜=¨U¯YªY©[¬[¸1ª_¨_ÀÔARÐVWÒAWÐAWÝÔ/Ø�LŠL‰NŒNØ�JŠJ‰LŒLØ�LŠL‰NŒNå&0°½LÑ&IÔ&IÐX�	× Ò Ñ"Ô"Ð"ÈyàØØð

ñ 

ô 

ˆð 7Ð6ØØ�MŠM‰OŒOØ�MŠM‰OŒOØÔ.ØÔ.ð
ñ 
ô 
ð 	
ð Ô+ÐW¨sÔ/@ÐWÀEÔDWÐå(Øˆs�E˜9 i°¸Jñô €Nõ   Ñ&Ô&ð 4õ
 $Ô3ˆà�Ô3Ò3Ð3Ø—*’*˜R‘.”.ˆÝ$ U¨A¨uÑ5Ô5ˆÝ" 3¨¨5Ñ1Ô1ˆ
Ý$ U¨A¨uÑ5Ô5ˆå# E¨5Ñ1Ô1ˆõ ' |°ZÀÑNÔNñ		
Ø!ØØ!Ø(Ø)ØØØõ ŒIŒN×3Ò3Ø!ØØ!Ø(Ø)ØØØØØØð 4ñ 
ô 
ñ	
ØØØØØð <Ð;Øð
ð 
àð
ð 
÷ Š)�A�q‰/Œ/ð 	õ *¨)°WÑ=Ô=Ð=Ø	�:Ô9Ò	9Ð	9õ ' u¨c°5Ñ9Ô9ñ		
ØØØØ(Ø)ØØØõ ŒIŒN×7Ò7Ø×$Ò$ QÑ'Ô'Ø×"Ò" 1Ñ%Ô%Ø×$Ò$ QÑ'Ô'ØØ(Ø)ØØØÝ�	‰NŒNØØð 8ñ 
ô 
ñ	
ØØØØØØð  7Ð6Ø×Ò˜aÑ Ô ð
ð 
àð
ð 
÷ Š)�A�q‰/Œ/ð	ð 
�:Ô5Ò	5Ð	5õ ' u¨c°5Ñ9Ô9ñ		
ØØØØ(Ø)ØØØõ ŒIŒN×3Ò3ØØØØØ(Ø)ØØØØØØØð 4ñ 
ô 
ñ
	
ØØØØØØØØØð  7Ð6Øð
ð 
àð
ð 
÷ Š)�A�q‰/Œ/ð	ð 
�:œ?Ò	*Ñ	*ð —-’-‘/”/ˆØ—M’M‘O”Oˆ	ØÔ,ˆ
ØÔ,ˆ
ØŒ[˜Œ^ˆØŒ[˜Œ_ˆð	ð 	ð 	ð 1Ð0°Ñ7Ô7ˆØ.Ð.¨sÑ3Ô3ˆØ0Ð0°Ñ7Ô7ˆåÔ;Ø�3˜˜y¨)°YÀeð
ñ 
ô 
à
ôˆð
 ×%Ò% a¨Ñ+Ô+×6Ò6Ñ8Ô8×?Ò?ÑAÔAˆØ—=’=  R¨Ñ,Ô,ˆØ:Ð:ØØØØ!Ø!ð
ñ 
ô 
÷ Š)�A�q‰/Œ/ð 	ð ˆåØKñ
ô 
ð 	
r$   )Nr   FN)F)Nr   FNF)1Úloggingr   Útorch.nnÚtorch.nn.functionalr£   r¤   rÙ   Útorch.backends.cudar   r   r   r   r   r   r	   r
   Útorch.nn.attentionr   Únested_tensorr   Ú	getLoggerÚ__name__r2   ÚTensorr#   r   r,   r:   r>   ÚstrrD   rJ   rT   rZ   r\   ra   rl   Útuplerw   r|   r„   r‹   rŸ   r¨   r¬   r°   rÁ   rË   r  © r$   r"   ú<module>r     s¸  ðà €€€à €€€Ø €€€Ø Ð Ð Ð Ð Ð Ð Ð Ð ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð *Ð )Ð )Ð )Ð )Ð )à 'Ð 'Ð 'Ð 'Ð 'Ð 'ð €gÔ˜Ñ!Ô!€ð &*ØØØ
ð0ð 0ØŒ<ð0à	Œð0ð Œ<ð0ð Œ|˜dÑ"ð	0ð 
ð0ð 0ð 0ð 0ðf
Ið 
I Zð 
IÀð 
Ið 
Ið 
Ið 
Iðð ¨jð È$ð ð ð ð ð4ð ¨jð È$ð ð ð ð ð6 16ðð ØŒ<ðØ%(ðà	ðð ð ð ð6ð ÐRVð ð ð ð ð.8ð 8¨
ð 8ÀDð 8ð 8ð 8ð 8ðv	ð 	 zð 	À4ð 	ð 	ð 	ð 	ðð ¨:ð Àtð ð ð ð ðð  jð À$ð ð ð ð ð(,ð ,ð ,ð^1¨¬ð 1¸%ÀÄÈcÐSVÐ@VÔ:Wð 1ð 1ð 1ð 1ð6¨e¬lð ¸tð ð ð ð ð@1ØŒLð1Ø"ð1Ø/2ð1Ø>Að1à
„\ð1ð 1ð 1ð 1ðlGð Gð GðTØŒLðØ*-ðØ6:ðà
„\ðð ð ð ð&ð ð ð E¤Lð ð ð ð ðð ð ð+<ØŒ<ð+<à	Œð+<ð Œ<ð+<ð Œ|˜dÑ"ð	+<ð
 ˆ5Œ<˜œ u¤|°U´\ÀDÑ5HÐHÔIð+<ð +<ð +<ð +<ðd &*ØØØ
Øð^
ð ^
ØŒ<ð^
à	Œð^
ð Œ<ð^
ð Œ|˜dÑ"ð	^
ð ^
ð ^
ð ^
ð ^
ð ^
r$   