o
    ॵi+&                     @   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)gating)superr   __init__infr   mha)self
d_templated_paird_hid	num_headsr   kwargs	__class__ f/home/ubuntu/.local/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-   num_batch_dims)r   r   lenshape)r    r*   r+   r,   r-   
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.r2   )r      r      )r,   )	new_onesr5   r   r   	unsqueezer	   r7   r   squeeze)r    r+   r*   r8   r-   r,   r(   r(   r)   forward<   s   


z"TemplatePointwiseAttention.forwardNN)__name__
__module____qualname__r   torchTensorintr7   r   r?   __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 )Nrelu)init)	r   rH   r   r"   nn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)r5   r"   rD   zerosrP   rQ   rM   rN   )r    r+   r*   r5   z_tr(   r(   r)   r?   _   s   


zTemplateProjection.forward)rA   rB   rC   r   rD   rE   r?   rG   r(   r(   r&   r)   rH   V   s    rH   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 )Nr9   r2   )r   rT   r   r   tri_att_startr   tri_att_endr   tri_mul_outr   
tri_mul_inr   pair_transitionrY   dropoutrow_dropout_share_dimcol_dropout_share_dim)
r    r!   rU   rV   r$   rW   rX   rY   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)	attn_maskr-   )r,   re   )re   )r-   )rY   r   rZ   r`   r_   trainingr[   ra   r   r\   r]   r   r^   )r    rb   r,   rc   rd   r-   re   r(   r(   r)   r?      s   	
	




	zTemplatePairStackBlock.forwardr@   )rA   rB   rC   rF   floatboolr   rD   rE   r   r?   rG   r(   r(   r&   r)   rT   j   sB    	1rT   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!   rU   rV   r$   rW   rX   r   rY   )
r   rj   r   r   blocksrangeappendrT   r   
layer_norm)r    r!   rU   rV   
num_blocksr$   rW   rX   rY   r   r%   _r&   r(   r)   r      s    zTemplatePairStack.__init__single_templatesr,   rc   rd   	templ_dimr-   re   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,   rc   rd   r-   re   r   ).0b)re   r-   r,   rd   rc   r(   r)   
<listcomp>%  s    zCTemplatePairStack.forward.<locals>.one_template.<locals>.<listcomp>)	functionsinput)r   rl   )irb   )re   r-   r,   r    rr   rd   rc   r(   r)   one_template#  s   
z/TemplatePairStack.forward.<locals>.one_templater   r   c                    s   g | ]}|  qS r(   )r=   )ru   rb   )rs   r(   r)   rw   F  s    z-TemplatePairStack.forward.<locals>.<listcomp>)dim)r4   ro   rm   r   rg   rn   rD   cat)r    rr   r,   rc   rd   rs   r-   re   rt   r{   n_templnew_single_templatesr+   rz   rb   r(   )re   r-   r,   r    rr   rs   rd   rc   r)   r?     s.   
	
zTemplatePairStack.forward)rk   )rA   rB   rC   r   r   rD   rE   tensorrF   ri   r?   rG   r(   r(   r&   r)   rj      s(    	rj   )'math	functoolsr   typingr   r   r   rD   torch.nnrK   unicore.modulesr   unicore.utilsr   r	   r
   
attentionsr   r   r   r   commonr   r   r   r   r   r   r   featurizationr   triangle_multiplicationr   r   Moduler   rH   rT   rj   r(   r(   r(   r)   <module>   s    $> 