o
    * iK&                     @  s   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	Z	er&d dl
mZ G dd deZG d	d
 d
eZG dd deZeG dd dZeG dd deZeG dd deZeG dd deZeG dd deZdS )    )annotations)ABCabstractmethod)	dataclass)TYPE_CHECKINGN)Sequencec                   @  s   e Zd ZeejfddZdS )AttentionBiasc                 C     t NNotImplementedErrorselfshapedtype r   h/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/paddle/incubate/nn/attn_bias.pymaterialize$   s   zAttentionBias.materializeN)__name__
__module____qualname__r   paddlefloat32r   r   r   r   r   r   #   s    r   c                   @  s"   e Zd ZejfddZdd ZdS )LowerTriangularMaskc                 C  s<   |t jur|nt j}t j|td|d}t j|dd|S )N-inf)r   
fill_valuer      Zdiagonalr   Zbfloat16r   fullfloatZtriuZastype)r   r   r   	create_astensorr   r   r   r   *   s
   
zLowerTriangularMask.materializec                 C  s   t |S r
   )!LowerTriangularMaskWithTensorBiasr   Zbiasr   r   r   add_bias1   s   zLowerTriangularMask.add_biasN)r   r   r   r   r   r   r%   r   r   r   r   r   )   s    r   c                      s*   e Zd Zdd Zejf fdd	Z  ZS )r#   c                 C  s
   || _ d S r
   )_biasr$   r   r   r   __init__6   s   
z*LowerTriangularMaskWithTensorBias.__init__c                   s   t  ||| j S r
   )superr   r&   r   	__class__r   r   r   9   s   z-LowerTriangularMaskWithTensorBias.materialize)r   r   r   r'   r   r   r   __classcell__r   r   r)   r   r#   5   s    r#   c                   @  sD   e Zd ZU ded< ded< ded< dd Zed	d
 ZdddZdS )
SeqLenInfopaddle.Tensorseqstartint
max_seqlenz	list[int]seqstart_pyc                 c  s"    t | j| jdd  E d H  d S )Nr   )zipr1   r   r   r   r   	intervalsC   s    zSeqLenInfo.intervalsc                 C  sN   dg}d}|D ]}t ||}||d |  qtj|tjd}| |||dS )Nr   r   )r0   r.   r1   )maxappendr   	to_tensorint32)clsseqlensr1   r0   seqlenr.   r   r   r   from_seqlensF   s   
zSeqLenInfo.from_seqlensNc                 C  s   | j d |jd kr|jd dksJ |d u r!dgt| j d  }g }d}|D ]}|| j ||  | j |   ||7 }q'dd t||j|ddD S )Nr5   r   r   c                 S  s,   g | ]\}}| |d g|jdd qS )r5      NZreshaper   ).0bsr"   r   r   r   
<listcomp>]   s    z$SeqLenInfo.split.<locals>.<listcomp>Zaxis)r1   r   lenr8   r2   split)r   xbatch_sizesZsplit_chunksitZ
batch_sizer   r   r   rF   R   s   &
zSeqLenInfo.splitr
   )r   r   r   __annotations__r4   classmethodr>   rF   r   r   r   r   r,   =   s   
 
r,   c                      sP   e Zd ZU ded< ded<  fddZedd Zed	d
 ZdddZ  Z	S )PaddedSeqLenInfor-   r=   zSequence[int]	seqlen_pyc                 #  s4    t t  | jD ]\\}}}||| fV  q
d S r
   )r2   r(   r4   rM   )r   start_lengthr)   r   r   r4   h   s   zPaddedSeqLenInfo.intervalsc                 C  s   t d)NzQPlease use SeqLenInfo.from_seq_lens() or PaddedSeqLenInfo.from_seq_lens_padded().r   )r;   r<   r   r   r   r>   l   s   zPaddedSeqLenInfo.from_seqlensc                   sd   t  fdd|D sJ ttdt|  d  }| tj|tjd|t|tj|tjd|dS )Nc                 3  s    | ]}| kV  qd S r
   r   )rA   r=   paddingr   r   	<genexpr>t   s    z7PaddedSeqLenInfo.from_seqlens_padded.<locals>.<genexpr>r   r   r6   )r=   rM   r0   r.   r1   )alllistrangerE   r   r9   r:   r7   )r;   r<   rR   r1   r   rQ   r   from_seqlens_paddedr   s   z$PaddedSeqLenInfo.from_seqlens_paddedNc                 C  r	   r
   r   )r   rG   rH   r   r   r   rF   ~   s   zPaddedSeqLenInfo.splitr
   )
r   r   r   rJ   r4   rK   r>   rW   rF   r+   r   r   r)   r   rL   c   s   
 

rL   c                   @  s   e Zd ZU ded< ded< dZded< ejfddZejfd	d
Ze	dddZ
e	dd Ze	dddZdd Zdd Zdd Zdd ZdS )BlockDiagonalMaskr,   	q_seqinfo	k_seqinfoNzSequence[int] | None_batch_sizesc                 C  s   t j||dS N)r   r   )r   Zzerosr   r   r   r   _create_block_mask   s   z$BlockDiagonalMask._create_block_maskc           
      C  s   |d | j jd ksJ |d | jjd ksJ tj|dd  td|d}t| j | j  D ]\\}}\}}|| || g}| |||||||f< q1t	t
|d D ]}	|d}qX||S )Nr5   r   )r   r   r?   r   )rZ   r1   rY   r   r   r    r2   r4   r]   rV   rE   	unsqueezeexpand)
r   r   r   maskq_startq_endk_startk_endZ	sub_shaperO   r   r   r   r      s   
zBlockDiagonalMask.materializec                 C  sR   |d u st |t |ksJ t|}|d u s||kr|}nt|}| ||dS )N)rY   rZ   )rE   r,   r>   )r;   q_seqlen	kv_seqlenrY   rZ   r   r   r   r>      s   

zBlockDiagonalMask.from_seqlensc                 C  sp   dd |D }g }|D ]}t |jd D ]
}||jd  qq| |}||_tjdd |D dd}||fS )Nc                 S     g | ]}|j d  qS r   r   rA   r"   r   r   r   rC          z6BlockDiagonalMask.from_tensor_list.<locals>.<listcomp>r   r   c                 S  (   g | ]}| d dg|jdd qS r   r5   r?   Nr@   rA   rG   r   r   r   rC         ( rD   )rV   r   r8   r>   r[   r   concat)r;   ZtensorsrH   r<   rG   rO   
block_diagZconcated_tensorr   r   r   from_tensor_list   s   
z"BlockDiagonalMask.from_tensor_listc                 C  sR  t |t |ks
J |d u st |t |ksJ dd |D }g g }}tt||D ]D\}\}}	|jd |	jd ks=J ||jd g|jd   ||	jd g|	jd   |d u so|| jd d |	jd d ksoJ q+| ||}
dd |D |
_|
tjdd |D ddtjd	d |D dd|d urtjd
d |D ddfS d fS )Nc                 S  rh   ri   rj   rk   r   r   r   rC      rl   z;BlockDiagonalMask.from_tensor_lists_qkv.<locals>.<listcomp>r   r   r?   c                 S  rh   ri   rj   ro   r   r   r   rC      rl   c                 S  rm   rn   r@   ro   r   r   r   rC      rp   rD   c                 S  rm   rn   r@   ro   r   r   r   rC      rp   c                 S  rm   rn   r@   ro   r   r   r   rC      rp   )	rE   	enumerater2   r   extendr>   r[   r   rq   )r;   Z	tensors_qZ	tensors_kZ	tensors_vrH   Z	q_seqlensZ
kv_seqlensiqkrr   r   r   r   from_tensor_lists_qkv   s6   
,z'BlockDiagonalMask.from_tensor_lists_qkvc                 C     | j || jS r
   )rY   rF   r[   r   r"   r   r   r   split_queries      zBlockDiagonalMask.split_queriesc                 C  rz   r
   )rZ   rF   r[   r{   r   r   r   split_kv   r}   zBlockDiagonalMask.split_kvc                 C  s    | j | ju sJ | j || jS r
   )rY   rZ   rF   r[   r{   r   r   r   rF      s   zBlockDiagonalMask.splitc                 C  s   t | j| j| jdS )N)rY   rZ   r[   )BlockDiagonalCausalMaskrY   rZ   r[   r3   r   r   r   make_causal   s
   zBlockDiagonalMask.make_causalr
   )r   r   r   rJ   r[   r   r   r]   r   rK   r>   rs   ry   r|   r~   rF   r   r   r   r   r   rX      s    
 	
rX   c                   @  s   e Zd ZejfddZdS )r   c                 C  s   t  j||dS r\   )r   r   r   r   r   r   r]      r}   z*BlockDiagonalCausalMask._create_block_maskN)r   r   r   r   r   r]   r   r   r   r   r      s    r   c                   @  sX   e Zd ZU ded< ded< dZded< dejfd	d
ZejfddZe		dddZ
dS )+BlockDiagonalCausalWithOffsetPaddedKeysMaskr,   rY   rL   rZ   Nzpaddle.Tensor | Nonecausal_diagonalr   c                 C  s@   |t jur|nt j}t j||tdd}t j|d| d|S )Nr   r   r   r   r   r   )r   r   offsetr   r!   r"   r   r   r   r]      s   z>BlockDiagonalCausalWithOffsetPaddedKeysMask._create_block_maskc           
      C  s   |d | j jd ksJ |d | jjd ksJ tj|dd  |tdd}tt| j | j  D ].\}\\}}\}}| j	|| || f| j
d u rMdnt| j
|  |d|||||f< q3tt|d D ]}	|d}qj||S )Nr5   r^   r   r   r   )r   r   r?   )rZ   r1   rY   r   r   r    rt   r2   r4   r]   r   r/   itemrV   rE   r_   r`   )
r   r   r   ra   rv   rb   rc   rd   re   rO   r   r   r   r      s    
	
z7BlockDiagonalCausalWithOffsetPaddedKeysMask.materializec                 C  s@   |d u st |t |ksJ t|}t||}| |||dS )N)rY   rZ   r   )rE   r,   r>   rL   rW   )r;   rf   Z
kv_paddingrg   r   rY   rZ   r   r   r   r>     s   
z8BlockDiagonalCausalWithOffsetPaddedKeysMask.from_seqlensr
   )r   r   r   rJ   r   r   r   r]   r   rK   r>   r   r   r   r   r      s   
 r   )
__future__r   abcr   r   dataclassesr   typingr   r   collections.abcr   r   r   r#   r,   rL   rX   r   r   r   r   r   r   <module>   s(   %`