o
     i                     @   s   d dl mZ d dlZdejdedejfddZdejded	ed
edejf
ddZ	ddeej deej ded	ed
edee deej fddZddejfddZej	fdejdeej
 dejfddZdS )    )OptionalNkey_padding_maskbatched_dimreturnc                 C   s0   | j dksJ |  \}}|| }t| |||S )N   )ndimsize_reshape_key_padding_mask)r   r   
batch_sizesrc_len	num_heads r   W/home/ubuntu/.local/lib/python3.10/site-packages/xformers/components/attention/utils.pyreshape_key_padding_mask   s   r   r
   r   r   c                 C   s@   | j ||fks	J | |dd|d|dd|| d|} | S )N   )shapeviewexpandreshape)r   r
   r   r   r   r   r   r	      s   r	   att_masktgt_lenc                 C   s~   |d u r|}|d ur=|j ||fksJ t||||}| d u r'|d|d} | S | jtjkr4| |} | S | | td} | S )Nr   -inf)	r   r	   r   dtypetorchboollogical_andmasked_fillfloat)r   r   r
   r   r   r   r   r   r   maybe_merge_masks%   s   
r      Fsoftmax_matc                 C   s   t j| d| j| jd}| }|r$dt t j|dd |dd }ndt jt j|ddddjddddf  |dd }t	|D ]$}t 
||}t 
d| d| t 
|d	| t 
|d
| |   }qD|S )z
    Computing the Moore-Penrose inverse.
    Use an iterative method from (Razavi et al. 2014) to approximate the Moore-Penrose inverse via efficient
    matrix-matrix multiplications.
    r   )devicer   r   )dimNg      ?         )r   eyer   r"   r   maxsum	transposevaluesrangematmul)r!   n_iterpinverse_original_initikv_kvr   r   r   iterative_pinvA   s&   &&
*r6   maskr   c                 C   s4   | j tjks
J dtj| |d}td||  < |S )NzEThis util is meant to convert in between bool masks and additive ones)r   r   )r   r   r   
zeros_liker   )r7   r   mask_r   r   r   bool_mask_to_additivec   s   r:   )N)r    F)typingr   r   Tensorintr   r	   r   r6   float32r   r:   r   r   r   r   <module>   sZ   
	

#