o
    ߥiC"                     @   s   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	 ddl
mZ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G dd dejZdS )    )OptionalTupleN)	LayerNorm)one_hot   )LinearSimpleModuleListresidualc                       s   e Zd Z		ddedededededed	ee f fd
dZ			ddejdeej deej deej fddZ					ddejdeej deej deej deej f
ddZ
dejdejdeejejf fddZ  ZS )InputEmbedderFNtf_dimmsa_dimd_paird_msarelpos_kuse_chain_relativemax_relative_chainc           	         s   t t|   || _|| _|| _|| _t||| _t||| _	t||| _
t||| _|| _|| _|| _| js@d| j d | _nd| j d | _|  jd7  _|  jd| d 7  _t| j|| _d S )N   r   )superr
   __init__r   r   r   r   r   linear_tf_z_ilinear_tf_z_jlinear_tf_mlinear_msa_mr   r   r   num_binslinear_relpos)	selfr   r   r   r   r   r   r   kwargs	__class__ g/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/science/unifold/modules/embedders.pyr      s$   zInputEmbedder.__init__res_idsym_idasym_id	entity_idc                 C   s  | j }|d |dd d d f  }|| || }| js|S |dd d d f |dd d d f k}d| d || < |dd d d f |dd d d f k}||jd }	|dd d d f |dd d d f  }
| j}tj|
| dd| d}d| d || < ||	|fS )N).N.r   r   r   )minmax)r   clipr   typedtyper   torchclamp)r   r!   r"   r#   r$   max_rel_resrpasym_id_sameentity_id_samerp_entity_id
rel_sym_idmax_rel_chainclipped_rel_chainr   r   r    _relpos_indices5   s    $$$
zInputEmbedder._relpos_indicesnum_symc           
      C   s   | j jj}| js| j|d}|  t|| j|dS | j||||d\}}}	t|d| j d |d}||}t|	d| j	 d |d}	|  t
j|||	gddS )N)r!   )num_classesr)   )r!   r"   r#   r$   r   dim)r   weightr)   r   r4   r   r   r   r(   r   r*   cat)
r   r!   r"   r#   r$   r5   r)   r-   r0   rp_rel_chainr   r   r    
relpos_embR   s,   
	
zInputEmbedder.relpos_embtfmsareturnc           	      C   s   | j dkr|ddd f }|| jjj}|| jjj}|jd }| |}| |d	dt
|jd d  |ddf }||7 }| |}| |}|dd d d f |dd d d d d f  }||fS )N   .r   )r7   r7   )r   r(   r   r:   r)   shaper   r   	unsqueezeexpandlenr   )	r   r>   r?   n_clustmsa_embtf_mtf_emb_itf_emb_jpair_embr   r   r    forwardo   s"   




*zInputEmbedder.forward)FN)NNN)NNNN)__name__
__module____qualname__intboolr   r   r*   Tensorr4   r=   r   rN   __classcell__r   r   r   r    r
      sh    	(
 
r
   c                       s   e Zd Z	d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ejejf fddZ	dejdeejejf fddZ
  ZS )RecyclingEmbedder    חAr   r   min_binmax_binr   infc                    sd   t t|   || _|| _|| _|| _|| _|| _d | _	t
| j| j| _t| j| _t| j| _d S N)r   rV   r   r   r   rX   rY   r   rZ   squared_binsr   linearr   layer_norm_mlayer_norm_z)r   r   r   rX   rY   r   rZ   r   r   r   r    r      s   
zRecyclingEmbedder.__init__mzr@   c                 C   s   |  |}| |}||fS r[   )r^   r_   )r   r`   ra   m_updatez_updater   r   r    rN      s   

zRecyclingEmbedder.forwardxc                 C   s   | j d u r tj| j| j| j| jrtjn|j|j	dd}|d | _ tj
| j dd  | j | jggdd}| jr;| }tj|dd d d f |dd d d d d f  d ddd	}|| j k||k  | jjj}| |}|S )
NF)r)   devicerequires_gradr   r   r7   r8   .T)r9   keepdims)r\   r*   linspacerX   rY   r   trainingfloatr)   re   r;   
new_tensorrZ   sumr(   r]   r:   )r   rd   binsupperdr   r   r    
recyle_pos   s8   

0
zRecyclingEmbedder.recyle_pos)rW   )rO   rP   rQ   rR   rj   r   r*   rT   r   rN   rp   rU   r   r   r   r    rV      s6    	
rV   c                       <   e Zd Zdedef fddZdejdejfddZ  ZS )	TemplateAngleEmbedderd_ind_outc                    sP   t t|   || _|| _t| j| jdd| _t | _	t| j| jdd| _
d S Nrelu)init)r   rr   r   rt   rs   r   linear_1nnGELUactlinear_2r   rs   rt   r   r   r   r    r      s   
zTemplateAngleEmbedder.__init__rd   r@   c                 C   s.   |  || j jj}| |}| |}|S r[   )rx   r(   r:   r)   r{   r|   r   rd   r   r   r    rN      s   

zTemplateAngleEmbedder.forward	rO   rP   rQ   rR   r   r*   rT   rN   rU   r   r   r   r    rr      s    rr   c                       sF   e Zd Z	ddededededef
 fddZd	ejfd
dZ	  Z
S )TemplatePairEmbedderFrs   v2_d_inrt   r   
v2_featurec                    s   t t|   || _|| _| jr9|| _t | _| jD ]}| jt	|| jdd qt
|| _t	|| jdd| _d S || _t	| j| jdd| _d S ru   )r   r   r   rt   r   rs   r   r]   appendr   r   z_layer_normz_linear)r   rs   r   rt   r   r   r   r   r   r    r      s   	

zTemplatePairEmbedder.__init__r@   c                 C   s   | j s| || jjj}|S | jjj}| jd |d |}t|dd  D ]\}}t|| j|d  ||| j}q)t|| | 	|| j}|S )Nr   r   )
r   r]   r(   r:   r)   r   	enumerater	   ri   r   )r   rd   ra   r)   tisr   r   r    rN     s   
zTemplatePairEmbedder.forward)F)rO   rP   rQ   rR   listrS   r   r*   rT   rN   rU   r   r   r   r    r      s     r   c                       rq   )	ExtraMSAEmbedderrs   rt   c                    s.   t t|   || _|| _t| j| j| _d S r[   )r   r   r   rs   rt   r   r]   r}   r   r   r    r     s   zExtraMSAEmbedder.__init__rd   r@   c                 C   s   |  || j jjS r[   )r]   r(   r:   r)   r~   r   r   r    rN   !  s   zExtraMSAEmbedder.forwardr   r   r   r   r    r     s    r   )typingr   r   r*   torch.nnry   unicore.modulesr   unicore.utilsr   commonr   r   r	   Moduler
   rV   rr   r   r   r   r   r   r    <module>   s   ~C,