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   o/home/app/PaddleOCR-VL-test/.venv_paddleocr/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expandZ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_andZ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sumZ	transposevaluesrangematmul)r   Zn_iterZpinverse_original_initikv_kvr   r   r   iterative_pinvA   s&   &&
*r1   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   Z
zeros_liker   )r2   r   Zmask_r   r   r   bool_mask_to_additivec   s   r3   )N)r   F)typingr   r   ZTensorintr   r	   r   r1   Zfloat32r   r3   r   r   r   r   <module>   sZ   
	

#