a
    h                     @   sp   d dl mZ d dlZejeejdddZd
ejjejejejeej eee ee	 e
ejdf d	dd	ZdS )    )OptionalN)hidden_statesn_repreturnc                 C   s^   | j \}}}}|dkr| S | dddddddddf |||||} | ||| ||S )z
    This is the equivalent of torch.repeat_interleave(x, dim=1, repeats=n_rep). The hidden states go from (batch,
    num_key_value_heads, seqlen, head_dim) to (batch, num_attention_heads, seqlen, head_dim)
       N)shapeexpandZreshape)r   r   batchZnum_key_value_headsslenZhead_dim r   `/var/www/html/assistant/venv/lib/python3.9/site-packages/transformers/integrations/sdpa_paged.py	repeat_kv   s
    0r           )	modulequerykeyvalueattention_maskdropoutscaling	is_causalr   c              	   K   s   | dd }	|	d ur0|	j||| jfi |\}}t| drRt|| j}t|| j}|}
| }| }| }tjj	j
||||
||dd}|dd }|d fS )Ncachenum_key_value_groupsF)Z	attn_maskZ	dropout_pscaler   r      )popupdateZ	layer_idxhasattrr   r   
contiguoustorchnnZ
functionalZscaled_dot_product_attentionZ	transpose)r   r   r   r   r   r   r   r   kwargsr   Zcausal_maskZattn_outputr   r   r   sdpa_attention_paged_forward   s*    
	r"   )r   NN)typingr   r   ZTensorintr   r    Modulefloatbooltupler"   r   r   r   r   <module>   s       