o
    *j+&                     @   s   d dl Z d dlmZ d dlmZmZmZ d dlZd dlm	Z	 d dl
mZ d dlmZmZmZ ddlmZmZmZmZ ddlmZmZmZmZmZmZmZ dd	lmZ dd
lm Z m!Z! G dd de	j"Z#G dd de	j"Z$G dd de	j"Z%G dd de	j"Z&dS )    Npartial)ListOptionalTuple)	LayerNorm)checkpoint_sequentialpermute_final_dimstensor_tree_map   )	AttentionTriangleAttentionEndingTriangleAttentionStartinggen_attn_mask)LinearSimpleModuleList
Transitionbias_dropout_residualchunk_layerresidualtri_mul_residual)build_template_pair_feat_v2)TriangleMultiplicationIncomingTriangleMultiplicationOutgoingc                       sv   e Zd Z fddZdejdejdejdedejf
dd	Z	
	
ddejdejdeej dee dejf
ddZ	  Z
S )TemplatePointwiseAttentionc                    s.   t t|   || _t|||||dd| _d S )NF)Zgating)superr   __init__infr   mha)self
d_templated_pairZd_hid	num_headsr   kwargs	__class__ s/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/science/unifold/modules/template.pyr      s   z#TemplatePointwiseAttention.__init__ztmask
chunk_sizereturnc                 C   s.   ||||d}t | j||t|jd d dS )N)qkvr*   )r+   Znum_batch_dims)r   r   lenshape)r   r(   r)   r*   r+   Z
mha_inputsr&   r&   r'   _chunk(   s   z!TemplatePointwiseAttention._chunkNtemplate_maskc                 C   s   |d u r| |jd d }t|| j dd d d d d d f }|d}t|d}|d ur6| ||||}n	| j||||d}|d}|S )N.r0   )r      r      )r*   )	Znew_onesr2   r   r   	unsqueezer	   r3   r   Zsqueeze)r   r)   r(   r4   r+   r*   r&   r&   r'   forward<   s   


z"TemplatePointwiseAttention.forwardNN)__name__
__module____qualname__r   torchTensorintr3   r   r9   __classcell__r&   r&   r$   r'   r      s4    
r   c                       s,   e Zd Z fddZdejfddZ  ZS )TemplateProjectionc                    s2   t t|   || _t | _t||dd| _d S )NZrelu)init)	r   rB   r   r!   nnZReLUactr   output_linear)r   r    r!   r#   r$   r&   r'   r   X   s   
zTemplateProjection.__init__r,   c                 C   sD   |d u r|j }| j|d< tj||j|jd}| |}| |}|S )N)dtypedevice)r2   r!   r>   ZzerosrH   rI   rE   rF   )r   r)   r(   r2   Zz_tr&   r&   r'   r9   _   s   


zTemplateProjection.forward)r;   r<   r=   r   r>   r?   r9   rA   r&   r&   r$   r'   rB   V   s    rB   c                       sv   e Zd Zdedededededededef fd	d
Z		ddejdejdejdejde	e de	e fddZ
  ZS )TemplatePairStackBlockr    d_hid_tri_attd_hid_tri_mulr"   pair_transition_ndropout_ratetri_attn_firstr   c	           
         sj   t t|   t|||| _t|||| _t||| _t	||| _
t||| _|| _|| _d| _d| _d S )Nr5   r0   )r   rJ   r   r   tri_att_startr   tri_att_endr   tri_mul_outr   
tri_mul_inr   pair_transitionrO   dropoutrow_dropout_share_dimcol_dropout_share_dim)
r   r    rK   rL   r"   rM   rN   rO   r   r#   r$   r&   r'   r   l   s6   
zTemplatePairStackBlock.__init__Nsr*   tri_start_attn_masktri_end_attn_maskr+   
block_sizec              	   C   sd  | j rTt| j|| j|||d| j| j| j}t| j|| j|||d| j| j| j}t| j	|| j	|||d| j| j| j|d}t| j
|| j
|||d| j| j| j|d}nPt| j	|| j	|||d| j| j| j|d}t| j
|| j
|||d| j| j| j|d}t| j|| j|||d| j| j| j}t| j|| j|||d| j| j| j}t|| j||d| j}|S )N)Z	attn_maskr+   )r*   r[   )r[   )r+   )rO   r   rP   rV   rU   trainingrQ   rW   r   rR   rS   r   rT   )r   rX   r*   rY   rZ   r+   r[   r&   r&   r'   r9      s   	
	




	zTemplatePairStackBlock.forwardr:   )r;   r<   r=   r@   floatboolr   r>   r?   r   r9   rA   r&   r&   r$   r'   rJ   j   sB    	1rJ   c                       sV   e Zd Z	d fdd	Zdeej dejdejdejded	ed
ede	fddZ
  ZS )TemplatePairStack    eAc
                    sR   t t|   t | _t|D ]}| jt|||||||	|d qt|| _	d S )N)r    rK   rL   r"   rM   rN   r   rO   )
r   r_   r   r   blocksrangeappendrJ   r   
layer_norm)r   r    rK   rL   Z
num_blocksr"   rM   rN   rO   r   r#   _r$   r&   r'   r      s    zTemplatePairStack.__init__single_templatesr*   rY   rZ   	templ_dimr+   r[   return_meanc	                    s    fdd}	t }
|
dkr@|	dg}|r"|d }td|
D ]}|	|}|r:t||j}q'|| q'|rP|
dkrL||
 }|S d }|S tjfdd|D d}|}|S )Nc                    s0   t  fddjD |  fd\}|S )Nc              
      s    g | ]}t | d qS ))r*   rY   rZ   r+   r[   r   ).0b)r[   r+   r*   rZ   rY   r&   r'   
<listcomp>%  s    zCTemplatePairStack.forward.<locals>.one_template.<locals>.<listcomp>)Z	functionsinput)r   ra   )irX   )r[   r+   r*   r   rf   rZ   rY   r&   r'   one_template#  s   
z/TemplatePairStack.forward.<locals>.one_templater   r   c                    s   g | ]}|  qS r&   )r8   )ri   rX   )rg   r&   r'   rk   F  s    z-TemplatePairStack.forward.<locals>.<listcomp>)dim)r1   rd   rb   r   r\   rc   r>   cat)r   rf   r*   rY   rZ   rg   r+   r[   rh   rn   Zn_templZnew_single_templatesr)   rm   rX   r&   )r[   r+   r*   r   rf   rg   rZ   rY   r'   r9     s.   
	
zTemplatePairStack.forward)r`   )r;   r<   r=   r   r   r>   r?   Ztensorr@   r^   r9   rA   r&   r&   r$   r'   r_      s(    	r_   )'math	functoolsr   typingr   r   r   r>   Ztorch.nnrD   Zunicore.modulesr   Zunicore.utilsr   r	   r
   Z
attentionsr   r   r   r   commonr   r   r   r   r   r   r   Zfeaturizationr   Ztriangle_multiplicationr   r   Moduler   rB   rJ   r_   r&   r&   r&   r'   <module>   s    $> 