o
    *j,H                     @   sV  d dl Z d dlmZ d dlZd dlmZ d dlmZ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 ddlmZmZmZ dd	lmZmZmZ d
d ZdedejdejdejfddZdedejfdd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%G dd dej Z&G d d! d!ej Z'dS )"    N)Tuple)	LayerNormsoftmax_dropout)dict_multimapone_hotpermute_final_dims)restype_atom14_mask$restype_atom14_rigid_group_positionsrestype_atom14_to_rigid_group!restype_rigid_group_default_frame   )gen_attn_mask)LinearSimpleModuleListresidual)Frame
QuaternionRotationc                 C   s<   t   d}| | W d    d S 1 sw   Y  d S )NgabR?)torchZno_gradZfill_)weightsZsoftplus_inverse_1 r   {/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/science/unifold/modules/structure_module.pyipa_point_weights_init_   s   
"r   framealphaaatypedefault_framesc                 C   sT  t ||df }|g dt|jd d  dR }d|d< tj|jg |jd d ddR  |gdd}|| j	j}d|d	< |d |d
< |d  |d< ||dddd f< t t
|dd }||}|d }|d }	|d }
|d }||}||	}||
}t j|dd df |d|d|dgdd}| d |}|S )N.r      r   ).r   dim).r   r   ).r   r   ).r   ).r   r   Zmat).   ).   ).   ).   r$   .N)r   Zfrom_tensor_4x4Z	new_zeroslenshaper   catexpandget_rotsZrot_matr   Zcompose	unsqueeze)r   r   r   r   Zdefault_frameZbb_rotZall_rotsZ
all_framesZchi2_frame_to_frameZchi3_frame_to_frameZchi4_frame_to_frameZchi1_frame_to_bbZchi2_frame_to_bbZchi3_frame_to_bbZchi4_frame_to_bbZall_frames_to_bball_frames_to_globalr   r   r   torsion_angles_to_frames   s<   &(




r0   c           	      C   sv   ||df }t ||jd d}| dd d d f | }|dd }||df d}||df }||}|| }|S )N.)Znum_classesc                 S   s   t j| ddS )Nr   r!   )r   sum)xr   r   r   <lambda>Z   s    z?frames_and_literature_positions_to_atom14_pos.<locals>.<lambda>r   )r   r*   Zmap_tensor_fnr.   apply)	r   r   r   	group_idx	atom_masklit_positionsZ
group_maskZt_atoms_to_globalpred_positionsr   r   r   -frames_and_literature_positions_to_atom14_posJ   s   
r:   c                       s2   e Zd Z fddZdejdejfddZ  ZS )SideChainAngleResnetIterationc                    sJ   t t|   || _t| j| jdd| _t | _t| j| jdd| _	d S NZreluinitfinal)
superr;   __init__d_hidr   linear_1nnGELUactlinear_2)selfrB   	__class__r   r   rA   g   s
   
z&SideChainAngleResnetIteration.__init__sreturnc                 C   s6   |  |}| |}|  |}| |}t||| jS N)rF   rC   rG   r   training)rH   rK   r3   r   r   r   forwardp   s
   



z%SideChainAngleResnetIteration.forward__name__
__module____qualname__rA   r   TensorrO   __classcell__r   r   rI   r   r;   e   s    	r;   c                       sB   e Zd Z fddZdejdejdeejejf fddZ  ZS )SidechainAngleResnetc                    sl   t t|   t||| _t | _t||| _t	 | _
t|D ]}| j
t|d q t||d | _d S )N)rB   r   )r@   rV   rA   r   	linear_inrD   rE   rF   linear_initialr   layersrangeappendr;   
linear_out)rH   Zd_inrB   
num_blocks
num_angles_rI   r   r   rA   |   s   
zSidechainAngleResnet.__init__rK   	initial_srL   c                 C   s   |  | |}| | |}|| }| jD ]}||}q| | |}||jd d d }|}ttj	tj
| d ddddd}| | }|||jfS )Nr   )r   r   r   T)r"   Zkeepdimg-q=)min)rX   rF   rW   rY   r\   viewr*   r   sqrtclampr2   floattypedtype)rH   rK   r`   layerZunnormalized_sZ
norm_denomr   r   r   rO      s    

zSidechainAngleResnet.forward)	rQ   rR   rS   rA   r   rT   r   rO   rU   r   r   rI   r   rV   z   s    rV   c                       sp   e Zd Z			d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	dejdejf
ddZ
  ZS )InvariantPointAttentionFT:0yE>d_singled_pairrB   	num_headsnum_qk_pointsnum_v_pointsseparate_kvbiasepsc
                    s\  t t|   || _|| _|| _|| _|	| _| j| j }
t||
|d| _	|| _
| j
r;t||
|d| _t||
|d| _n
t|d|
 |d| _| j| j d }t||| _| j| j d }| j| j d }| j
rst||| _t||| _n
|| }t||| _t|| j| _tt|| _t| j | j|| j | jd   }t||dd| _t | _d S )Nrq   r      r'   r?   r=   )r@   ri   rA   rB   rm   rn   ro   rr   r   linear_qrp   linear_klinear_v	linear_kvlinear_q_pointslinear_k_pointslinear_v_pointslinear_kv_pointslinear_brD   	Parameterr   Zzeroshead_weightsr   r\   ZSoftplussoftplus)rH   rk   rl   rB   rm   rn   ro   rp   rq   rr   ZhcZhpqZhpkZhpvZhpkvZconcat_out_dimrI   r   r   rA      s<   
z InvariantPointAttention.__init__rK   zfsquare_maskrL   c                    s   |}||jd d jdf }jr@|}|}||jd d jdf }||jd d jdf }n|}||jd d jdf }tj	|j
dd\}}|}	 fdd}
|
|	j}	jr|}|}|
|j}|
|j}n>|}tj	||jd d dd}tj|dd} d |}||jd d jddf }tj	|jjgdd\}}|}tt|dt|d	}jr|td
dj
   }|tdt|d  }|	d|d }| d }n&|td
dj
  9 }|tdt|d 7 }|	d|d }||9 }|jdd}jjdt|jd d  d  }|td
djd d    }||d 9 }tj|dd}t|d}||7 }t|dj| |j!d}~~	~~t||"dd"dd}|# jg |jd d dR  }~~~tj|dd d d d d d f t|ddd d d d d f  dd}t|d} d $|}jrttj| d ddj%  |j!}nttj|d ddj%  |j!}|jg |jd d dR  }|jg |jd d ddR  }t|"dd|}|jg |jd d dR  }&tj'|gtj(|dd||R dd}|S )Nr   r!   c                    s   | j d d | j d d df }jr$| | j d d j|d f } tj| | j d d dd} tj| ddj| }  d | } | | j d d j|df } | S )Nr   rt   r!   r(   r    )r*   rp   rb   rm   r   splitstackr5   )ZptsZ	no_pointsr*   r   rH   r   r   process_points   s     z7InvariantPointAttention.forward.<locals>.process_pointsrt   r(   r    )r   r   r   )r   r   r   g      ?gUUUUUU?)r   r   r   r   r   )r   r   g      "@g      r   rs   r1   .)r   rt   r   r   )r   r   rt   r   ).NN))ru   rb   r*   rm   rp   rv   rw   rx   r   r   rB   ry   rn   rz   r{   ro   r|   r   r5   r}   matmulr   rN   mathrc   r.   re   r2   r   r   r)   r   rf   rg   Z	transpose
contiguousZinvert_applyrr   r\   r+   Zunbind)rH   rK   r   r   r   qkvkvZq_ptsr   Zk_ptsZv_ptsZkv_ptsrq   ZattnZpt_attr   oZo_ptsZ
o_pts_normZo_pairr   r   r   rO      s   


 




 


"
" zInvariantPointAttention.forward)FTrj   )rQ   rR   rS   intboolre   rA   r   rT   r   rO   rU   r   r   rI   r   ri      sD    
	
3ri   c                       s,   e Zd Z fddZdejfddZ  ZS )BackboneUpdatec                    s"   t t|   t|ddd| _d S )Nr%   r?   r=   )r@   r   rA   r   linear)rH   rk   rI   r   r   rA   T  s   zBackboneUpdate.__init__rK   c                 C   s
   |  |S rM   )r   )rH   rK   r   r   r   rO   X  s   
zBackboneUpdate.forwardrP   r   r   rI   r   r   R  s    r   c                       $   e Zd Z fddZdd Z  ZS )StructureModuleTransitionLayerc                    sL   t t|   t||dd| _t||dd| _t | _t||dd| _	d S r<   )
r@   r   rA   r   rC   rG   rD   rE   rF   linear_3)rH   crI   r   r   rA   ^  s
   
z'StructureModuleTransitionLayer.__init__c                 C   sH   |}|  |}| |}| |}| |}| |}t||| j}|S rM   )rC   rF   rG   r   r   rN   )rH   rK   Zs_oldr   r   r   rO   f  s   




z&StructureModuleTransitionLayer.forwardrQ   rR   rS   rA   rO   rU   r   r   rI   r   r   \  s    r   c                       r   )StructureModuleTransitionc                    s^   t t|   || _|| _t | _t| jD ]
}| jt	| qt
| j| _t|| _d S rM   )r@   r   rA   
num_layersdropout_rater   rY   rZ   r[   r   rD   Dropoutdropoutr   
layer_norm)rH   r   r   r   r_   rI   r   r   rA   u  s   z"StructureModuleTransition.__init__c                 C   s,   | j D ]}||}q| |}| |}|S rM   )rY   r   r   )rH   rK   rh   r   r   r   rO     s
   



z!StructureModuleTransition.forwardr   r   r   rI   r   r   s  s    r   c                       s@   e Zd Z fddZ	dddZdd Zdd	 Zd
d Z  ZS )StructureModulec                    s   t t|   |	| _|| _d | _d | _d | _d | _|| _	t
|| _t
|| _t||| _t|||||||||d	| _t|| _t
|| _t||
|| _t|| _t||||| _d S )N)rp   rq   rr   )r@   r   rA   r]   trans_scale_factorr   r6   r7   r8   infr   layer_norm_slayer_norm_zr   rW   ri   iparD   r   ipa_dropoutlayer_norm_ipar   
transitionr   	bb_updaterV   angle_resnet)rH   rk   rl   Zd_ipaZd_angleZnum_heads_iparn   ro   r   r]   Zno_transition_layersZnum_resnet_blocksr^   r   rp   Zipa_biasepsilonr   kwargsrI   r   r   rA     sH   




zStructureModule.__init__Nc              	   C   s  |d u r| |jd d }|d|d }t|| j d}| |}| |}|}| |}tj	|jd d |j
|jdd}tt| d| }g }	t| jD ]v}
t|| ||||| j}| |}| |}| |}|j| || d}| ||\}}tt| d| }|
| jd kr| || j||}| ||}|| j  ||d	}|	!| |
| jd k r|" }|" }qVt#t$j%|	}	|  |	d
< ||	d< ||	d< |	S )Nr   r    r1   F)requires_gradr#   )Zpre_rot_matr   )framesunnormalized_anglesanglesZsidechain_framesZ	positionssingle)&Znew_onesr*   r.   r   r   r   r   rW   r   identityrg   devicer   r   Zget_rot_matsZ	get_transrZ   r]   r   r   rN   r   r   r   Zcompose_update_vecr   r-   r   r0   Zscale_translationr   r:   Zto_tensor_4x4r[   Zstop_rot_gradientr   r   r   )rH   rK   r   r   maskr   r`   Zquat_encoderZbackb_to_globalZoutputsir   r   r/   r9   predsr   r   r   rO     sz   








zStructureModule.forwardc                 C   s~   | j d u rtjt||dd| _ | jd u rtjt|dd| _| jd u r,tjt||dd| _| jd u r=tjt	||dd| _d S d S )NF)rg   r   r   )r   r   )
r   r   Ztensorr   r6   r
   r7   r   r8   r	   )rH   Zfloat_dtyper   r   r   r   _init_residue_constants$  s8   



z'StructureModule._init_residue_constantsc                 C   s    |  |j|j t|||| jS rM   )r   rg   r   r0   r   )rH   r   r   r   r   r   r   r0   A  s   z(StructureModule.torsion_angles_to_framesc                 C   s2   |  | j| j t||| j| j| j| jS rM   )	r   r-   rg   r   r:   r   r6   r7   r8   )rH   r   r   r   r   r   r:   F  s   z=StructureModule.frames_and_literature_positions_to_atom14_posrM   )	rQ   rR   rS   rA   rO   r   r0   r:   rU   r   r   rI   r   r     s    G
Tr   )(r   typingr   r   Ztorch.nnrD   Zunicore.modulesr   r   Zunicore.utilsr   r   r   Z8modelscope.models.science.unifold.data.residue_constantsr   r	   r
   r   Z
attentionsr   commonr   r   r   r   r   r   r   r   rT   r0   r:   Moduler;   rV   ri   r   r   r   r   r   r   r   r   <module>   sB   
0
) 0
