o
    ߥiF+                     @   s   d dl mZ d dl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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mZ G d	d
 d
ejZG dd dejZG dd deZdS )    partial)OptionalTupleN)checkpoint_sequential   )MSAColumnAttentionMSAColumnGlobalAttentionMSARowAttentionWithPairBiasTriangleAttentionEndingTriangleAttentionStarting)LinearOuterProductMeanSimpleModuleList
Transitionbias_dropout_residualresidualtri_mul_residual)TriangleMultiplicationIncomingTriangleMultiplicationOutgoingc                       s   e Zd Z	d!dedededededede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jde	ej dejdejde	e de	e de
ejejf fdd Z  ZS )#EvoformerIterationFd_msad_paird_hid_msa_att	d_hid_opm	d_hid_muld_hid_pair_attnum_heads_msanum_heads_pairtransition_nmsa_dropoutpair_dropoutouter_product_mean_firstinfeps_is_extra_msa_stackc                    s   t t|   || _|| _t||||d| _|r#t|||||d| _nt	|||| _t
||	d| _t|||| _t||| _t||| _t|||| _t|||| _t
||	d| _d| _d| _|
| _|| _d S )N)r   r   d_hid	num_heads)d_inr&   r'   r#   r$   )r(   n)superr   __init__r%   r"   r
   msa_att_rowr	   msa_att_colr   r   msa_transitionr   outer_product_meanr   tri_mul_outr   
tri_mul_inr   tri_att_startr   tri_att_endpair_transitionrow_dropout_share_dimcol_dropout_share_dimr    r!   )selfr   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   	__class__ g/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/science/unifold/modules/evoformer.pyr-      sr   

zEvoformerIteration.__init__Nmzmsa_mask	pair_maskmsa_row_attn_maskmsa_col_attn_masktri_start_attn_masktri_end_attn_mask
chunk_size
block_sizereturnc              	   C   s  | j rt|| j|||	d| j}t| j|| j||||	d| j| j| j}| jr5t|| j	|||	d| j}nt| j	|| j	|||	d| j
| j| j}t|| j||	d| j}| j sdt|| j|||	d| j}t| 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}||fS )N)maskrF   )r?   	attn_maskrF   )rJ   rF   )rF   )rI   rG   )rG   )r"   r   r1   trainingr   r.   r7   r    r%   r/   r8   r0   r   r2   r!   r3   r4   r5   r6   )r9   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   r<   r<   r=   forwardl   s   		


	zEvoformerIteration.forwardF)NN)__name__
__module____qualname__intfloatboolr-   torchTensorr   r   rL   __classcell__r<   r<   r:   r=   r      st    	
`	
r   c                #       s   e Zd Z	d"dededededededed	ed
ededededededededef" fddZdejdejdejdejdejdejdejdejdedede	ejeje
ej f fd d!Z  ZS )#EvoformerStackFr   r   r   r   r   r   d_singler   r   
num_blocksr   r    r!   r"   r#   r$   r%   c                    sx   t t|   || _t | _t|
D ]}| jt||||||||	|||||||d q| js7t	||| _
d S d | _
d S )N)r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   )r,   rW   r-   r%   r   blocksrangeappendr   r   linear)r9   r   r   r   r   r   r   rX   r   r   rY   r   r    r!   r"   r#   r$   r%   kwargs_r:   r<   r=   r-      s4   
zEvoformerStack.__init__r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   c                    s    fdd| j D }t|||fd\}}d }| js;d}tjdg|jd}| tj|||d}||}|||fS )Nc                    s&   g | ]}t | d 	qS )r@   rA   rB   rC   rD   rE   rF   rG   r   ).0brG   rF   rC   r@   rB   rA   rE   rD   r<   r=   
<listcomp>  s    
z*EvoformerStack.forward.<locals>.<listcomp>)inputr*   r   )device)dimindex)	rZ   r   r%   rT   tensorrf   r]   index_selectsqueeze)r9   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rZ   sseq_dimrh   r<   rc   r=   rL      s   



zEvoformerStack.forwardrM   )rN   rO   rP   rQ   rR   rS   r-   rT   rU   r   r   rL   rV   r<   r<   r:   r=   rW      sx    	
3	
rW   c                       s   e Zd Zdedededededede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	ej de	ej dejdejdejdejdededejf fddZ
  ZS )!ExtraMSAStackr   r   r   r   r   r   r   r   rY   r   r    r!   r"   r#   r$   c                    s|   t t| jdi d|d|d|d|d|d|dd d|d	|d
|	d|
d|d|d|d|d|dd d S )Nr   r   r   r   r   r   rX   r   r   rY   r   r    r!   r"   r#   r$   r%   Tr<   )r,   rn   r-   )r9   r   r   r   r   r   r   r   r   rY   r   r    r!   r"   r#   r$   r^   r:   r<   r=   r-   +  sF   	
zExtraMSAStack.__init__Nr>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   c                    s*   t  j|||||||||	|
d
\}}}|S )Nr`   )r,   rL   )r9   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   r_   r:   r<   r=   rL   R  s   zExtraMSAStack.forward)NNNNNNNN)rN   rO   rP   rQ   rR   rS   r-   rT   rU   r   rL   rV   r<   r<   r:   r=   rn   )  s~    	
+	
rn   )	functoolsr   typingr   r   rT   torch.nnnnunicore.utilsr   
attentionsr   r	   r
   r   r   commonr   r   r   r   r   r   r   triangle_multiplicationr   r   Moduler   rW   rn   r<   r<   r<   r=   <module>   s   $ 8^