o
    ॵi,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?)torchno_gradfill_)weightssoftplus_inverse_1 r   n/home/ubuntu/.local/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"   mat).   ).   ).   ).   r(   .N)r   from_tensor_4x4	new_zeroslenshaper   catexpandget_rotsrot_matr   compose	unsqueeze)r   r   r   r   default_framebb_rotall_rots
all_frameschi2_frame_to_framechi3_frame_to_framechi4_frame_to_framechi1_frame_to_bbchi2_frame_to_bbchi3_frame_to_bbchi4_frame_to_bball_frames_to_bball_frames_to_globalr   r   r   torsion_angles_to_frames   s<   &(




rD   c           	      C   sv   ||df }t ||jd d}| dd d d f | }|dd }||df d}||df }||}|| }|S )N.)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   r0   map_tensor_fnr6   apply)	r   r   r   	group_idx	atom_masklit_positions
group_maskt_atoms_to_globalpred_positionsr   r   r   -frames_and_literature_positions_to_atom14_posJ   s   
rR   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 Nreluinitfinal)
superrS   __init__d_hidr   linear_1nnGELUactlinear_2)selfr[   	__class__r   r   rZ   g   s
   
z&SideChainAngleResnetIteration.__init__sreturnc                 C   s6   |  |}| |}|  |}| |}t||| jS N)r_   r\   r`   r   training)ra   rd   rH   r   r   r   forwardp   s
   



z%SideChainAngleResnetIteration.forward__name__
__module____qualname__rZ   r   Tensorrh   __classcell__r   r   rb   r   rS   e   s    	rS   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)r[   r"   )rY   ro   rZ   r   	linear_inr]   r^   r_   linear_initialr   layersrangeappendrS   
linear_out)ra   d_inr[   
num_blocks
num_angles_rb   r   r   rZ   |   s   
zSidechainAngleResnet.__init__rd   	initial_sre   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%   keepdimg-q=)min)rq   r_   rp   rr   ru   viewr0   r   sqrtclamprG   floattypedtype)ra   rd   rz   layerunnormalized_s
norm_denomr   r   r   rh      s    

zSidechainAngleResnet.forward)	rj   rk   rl   rZ   r   rm   r   rh   rn   r   r   rb   r   ro   z   s    ro   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_pairr[   	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r   r"      r+   rX   rV   )rY   r   rZ   r[   r   r   r   r   r   linear_qr   linear_klinear_v	linear_kvlinear_q_pointslinear_k_pointslinear_v_pointslinear_kv_pointslinear_br]   	Parameterr   zeroshead_weightsr   ru   Softplussoftplus)ra   r   r   r[   r   r   r   r   r   r   hchpqhpkhpvhpkvconcat_out_dimrb   r   r   rZ      s<   
z InvariantPointAttention.__init__rd   zfsquare_maskre   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!   r   r$   r,   r#   )r0   r   r}   r   r   splitstackrK   )pts	no_pointsr0   r   ra   r   r   process_points   s     z7InvariantPointAttention.forward.<locals>.process_pointsr   r,   r#   )r   r   r"   )r   r"   r   g      ?gUUUUUU?)r"   r   r   r"   r    )r!   r   g      "@g      r   r   rE   .)r   r   r   r"   )r"   r   r   r   ).NN))r   r}   r0   r   r   r   r   r   r   r   r[   r   r   r   r   r   r   r   rK   r   matmulr   rg   mathr~   r6   r   rG   r   r   r/   r   r   r   	transpose
contiguousinvert_applyr   ru   r1   unbind)ra   rd   r   r   r   qkvkvq_ptsr   k_ptsv_ptskv_ptsr   attnpt_attr   oo_pts
o_pts_normo_pairr   r   r   rh      s   


 




 


"
" zInvariantPointAttention.forward)FTr   )rj   rk   rl   intboolr   rZ   r   rm   r   rh   rn   r   r   rb   r   r      sD    
	
3r   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)   rX   rV   )rY   r   rZ   r   linear)ra   r   rb   r   r   rZ   T  s   zBackboneUpdate.__init__rd   c                 C   s
   |  |S rf   )r   )ra   rd   r   r   r   rh   X  s   
zBackboneUpdate.forwardri   r   r   rb   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 rT   )
rY   r   rZ   r   r\   r`   r]   r^   r_   linear_3)ra   crb   r   r   rZ   ^  s
   
z'StructureModuleTransitionLayer.__init__c                 C   sH   |}|  |}| |}| |}| |}| |}t||| j}|S rf   )r\   r_   r`   r   r   rg   )ra   rd   s_oldr   r   r   rh   f  s   




z&StructureModuleTransitionLayer.forwardrj   rk   rl   rZ   rh   rn   r   r   rb   r   r   \  s    r   c                       r   )StructureModuleTransitionc                    s^   t t|   || _|| _t | _t| jD ]
}| jt	| qt
| j| _t|| _d S rf   )rY   r   rZ   
num_layersdropout_rater   rr   rs   rt   r   r]   Dropoutdropoutr   
layer_norm)ra   r   r   r   ry   rb   r   r   rZ   u  s   z"StructureModuleTransition.__init__c                 C   s,   | j D ]}||}q| |}| |}|S rf   )rr   r   r   )ra   rd   r   r   r   r   rh     s
   



z!StructureModuleTransition.forwardr   r   r   rb   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)r   r   r   )rY   r   rZ   rw   trans_scale_factorr   rL   rM   rN   infr   layer_norm_slayer_norm_zr   rp   r   ipar]   r   ipa_dropoutlayer_norm_ipar   
transitionr   	bb_updatero   angle_resnet)ra   r   r   d_ipad_anglenum_heads_ipar   r   r   rw   no_transition_layersnum_resnet_blocksrx   r   r   ipa_biasepsilonr   kwargsrb   r   r   rZ     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#   rE   F)requires_gradr&   )pre_rot_matr   )framesunnormalized_anglesanglessidechain_frames	positionssingle)&new_onesr0   r6   r   r   r   r   rp   r   identityr   devicer   r   get_rot_mats	get_transrs   rw   r   r   rg   r   r   r   compose_update_vecr   r3   r   rD   scale_translationr   rR   to_tensor_4x4rt   stop_rot_gradientr   r   r   )ra   rd   r   r   maskr   rz   quat_encoderbackb_to_globaloutputsir   r   rC   rQ   predsr   r   r   rh     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)r   r   r   )r   r   )
r   r   tensorr   rL   r
   rM   r   rN   r	   )ra   float_dtyper   r   r   r   _init_residue_constants$  s8   



z'StructureModule._init_residue_constantsc                 C   s    |  |j|j t|||| jS rf   )r  r   r   rD   r   )ra   r   r   r   r   r   r   rD   A  s   z(StructureModule.torsion_angles_to_framesc                 C   s2   |  | j| j t||| j| j| j| jS rf   )	r  r3   r   r   rR   r   rL   rM   rN   )ra   r   r   r   r   r   rR   F  s   z=StructureModule.frames_and_literature_positions_to_atom14_posrf   )	rj   rk   rl   rZ   rh   r  rD   rR   rn   r   r   rb   r   r     s    G
Tr   )(r   typingr   r   torch.nnr]   unicore.modulesr   r   unicore.utilsr   r   r   8modelscope.models.science.unifold.data.residue_constantsr   r	   r
   r   
attentionsr   commonr   r   r   r   r   r   r   r   rm   rD   rR   ModulerS   ro   r   r   r   r   r   r   r   r   r   <module>   sB   
0
) 0
