o
    *jB                     @   s   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	 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 ddlmZmZmZmZmZmZ ddlmZ ddl m!Z!m"Z"m#Z# G dd dej$Z%dS )    N)tensor_tree_map   )residue_constants   )gen_msa_attn_maskgen_tri_attn_mask)AuxiliaryHeads)residual)ExtraMSAEmbedderInputEmbedderRecyclingEmbedderTemplateAngleEmbedderTemplatePairEmbedder)EvoformerStackExtraMSAStack)atom14_to_atom37build_extra_msa_featbuild_template_angle_featbuild_template_pair_featbuild_template_pair_feat_v2pseudo_beta_fn)StructureModule)TemplatePairStackTemplatePointwiseAttentionTemplateProjectionc                       s   e Zd Z fddZdd Z fddZ fddZd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Z	dddZdd Z  ZS )	AlphaFoldc                    sp  t t|   |j| _|j}|j}|j}tdi |d d|ji| _	t
di |d | _|jjrPtdi |d | _tdi |d | _tdi |d | _nd | _|d j| _| jrgtdi |d | _n
tdi |d | _tdi |d | _tdi |d	 | _tdi |d
 | _tdi |d | _t |d | _!|| _"t#j$| _%| jj&| _&| jj'r| '  d S d S )Ninput_embedderZuse_chain_relativerecycling_embeddertemplate_angle_embeddertemplate_pair_embeddertemplate_pair_stackZtemplate_pointwise_attentionextra_msa_embedderextra_msa_stackZevoformer_stackstructure_moduleZheads )(superr   __init__globalsmodeltemplate	extra_msar   Zis_multimerr   r   r   enabledr   r   r   r   r   r    #enable_template_pointwise_attentionr   template_pointwise_attr   template_projr
   r!   r   r"   r   	evoformerr   r#   r   	aux_headsconfigtorchfloatdtypeinfalphafold_original_mode)selfr1   Ztemplate_configZextra_msa_config	__class__r$   t/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/science/unifold/modules/alphafold.pyr&      sf   



zAlphaFold.__init__c                 C   s   | j  | _ | j | _d S N)r   r3   r   r7   r$   r$   r:   __make_input_float__H   s   zAlphaFold.__make_input_float__c                    *   t    t| dds|   tj| _| S N	inferenceF)r%   halfgetattrr=   r2   r4   r<   r8   r$   r:   rA   L   
   
zAlphaFold.halfc                    r>   r?   )r%   bfloat16rB   r=   r2   r4   r<   r8   r$   r:   rD   S   rC   zAlphaFold.bfloat16c                 C      dd }|  | d S )Nc                 S   s.   t | dr	|   t | drt | _d S d S )Napply_alphafold_original_modeact)hasattrrF   nnZReLUrG   moduler$   r$   r:   set_alphafold_original_mode\   s
   

zFAlphaFold.alphafold_original_mode.<locals>.set_alphafold_original_modeapply)r7   rL   r$   r$   r:   r6   Z   s   z!AlphaFold.alphafold_original_modec                 C   rE   )Nc                 S   s   t | dd d S )Nr@   T)setattrrJ   r$   r$   r:   set_inference_modef   s   z4AlphaFold.inference_mode.<locals>.set_inference_moderM   )r7   rP   r$   r$   r:   inference_moded   s   zAlphaFold.inference_modec                 C   s:   |D ]}|| j | j krd|v r|| | j ||< q|S )Nmask)r4   type)r7   batchkeyr$   r$   r:   __convert_input_dtype__k   s
   z!AlphaFold.__convert_input_dtype__c           
   
      s    j jjjr0t|f j jj j jj|d j jjd jd } fddt	|D }	n#t
|f j jj j jjd j jj fddtj|dD }	 j|	|||| jj jj j d	S )
N)r5   epsmultichain_mask_2dr   c                    s&   g | ]   fd dD qS )c              	      s*   g | ]}|d  ddddddf qS .Nr$   .0xtir$   r:   
<listcomp>   s    "zBAlphaFold.embed_templates_pair_core.<locals>.<listcomp>.<listcomp>r   )r\   r7   tzr^   r:   r`   ~   s    z7AlphaFold.embed_templates_pair_core.<locals>.<listcomp>)r5   rW   c                    s   g | ]}  |qS r$   ra   r[   )r7   rd   r$   r:   r`      s    
dim)tri_start_attn_masktri_end_attn_mask	templ_dim
chunk_size
block_sizeZreturn_mean)r1   r)   r   
v2_featurer   r5   rW   Z	distogramshaperanger   r2   Zunbindr    r'   rj   rk   r,   )
r7   rT   rd   	pair_maskrg   rh   ri   rX   Znum_templateZsingle_templatesr$   rb   r:   embed_templates_pair_corer   sH   
z#AlphaFold.embed_templates_pair_corec              	      sz  j jjjr&d|v r&|d dd d d f |d dd d d f kdnd js.jrk|}jrcj||d j	j
d}tj|d ddddk}|d	 |j}||9 }|S |}|S |d
 j}	t|	dkrxdnd |d
 j  }
|
dkrd }n-dd | D  f	dd}|d}td|
D ]}|||7 }q||
 }|}|S )Nasym_id.r   template_mask)rr   rj   T)rf   Zkeepdims).NNZtemplate_aatype   r   c                 S   s    i | ]\}}| d r||qS )Z	template_)
startswith)r\   kvr$   r$   r:   
<dictcomp>   s
    z2AlphaFold.embed_templates_pair.<locals>.<dictcomp>c              	      s2    fdd}t |}|	}|S )Nc                    s*   dd | j D }td | < | | S )Nc                 S   s   g | ]}t d qS r;   )slice)r\   _r$   r$   r:   r`      s    zmAlphaFold.embed_templates_pair.<locals>.embed_one_template.<locals>.slice_template_tensor.<locals>.<listcomp>r   )rm   ry   )rc   s)batch_templ_dimir$   r:   slice_template_tensor   s   zYAlphaFold.embed_templates_pair.<locals>.embed_one_template.<locals>.slice_template_tensor)r   rp   )r}   r~   Ztemplate_featsrc   	r|   rX   ro   r7   ri   Ztemplate_batchrh   rg   rd   )r}   r:   embed_one_template   s   z:AlphaFold.embed_templates_pair.<locals>.embed_one_template)r1   r)   r   rl   Z	unsqueezetrainingr,   rp   r-   r'   rj   r2   sumrS   r4   r.   rm   lenitemsrn   )r7   rT   rd   ro   rg   rh   ri   rc   Zt_maskZtemplate_aatype_shapeZn_templr   r}   r$   r   r:   embed_templates_pair   sZ   

'%
zAlphaFold.embed_templates_pairc                 C   s*   t || jjjjd\}}| |}||fS )N)rl   )r   r1   r)   r   rl   r   )r7   rT   Ztemplate_angle_featZtemplate_angle_maskrc   r$   r$   r:   embed_templates_angle   s   


zAlphaFold.embed_templates_anglec                 C   s  |d j d d }|d j d }|d }|d |dd d d f  }|d }	| |d |d \}
}|d u rF|
jg ||| jjjR dd	}|d u r]|jg |||| jjjR dd	}|d u rr|jg ||tjd
R dd	}t|d |d }|| j	
|7 }| 	||\}}|
ddd d d d f  |7  < ||7 }|| j|d  |dd |dd |dd |dd 7 }|
| j}
|| j}t|| j\}}| jjjr|d }t|rt|| j|||||dd| j}| jjjr| t|}t|d | jdd}| j|||d | jj| jj ||d ||d
}| jjj!r=| "|\}}tj#|
|gdd}
tj#|d |gdd}	t|	| jd\}}| j$|
||	|||||| jj| jj d
\}
}}|
|||	||fS )NZtarget_featseq_maskrZ   .msa_maskmsa_featF)Zrequires_gradrt   aatyper   Zresidue_indexZsym_idrq   Z	entity_idZnum_symrr   rY   )ri   Zextra_msa_mask)r5   Zgen_col_mask)r   rj   rk   ro   msa_row_attn_maskmsa_col_attn_maskrg   rh   re   )r5   )r   ro   r   r   rg   rh   rj   rk   )%rm   r   Z	new_zerosr1   Zd_msaZd_pairr   Zatom_type_numr   r   Z
recyle_posZ
relpos_emblonggetrS   r4   r   r5   r)   r+   r2   anyr	   r   r   r*   r!   r   r   r"   r'   rj   rk   Zembed_anglesr   catr/   )r7   featsm_1_prevz_prevx_prevZ
batch_dimsnr   ro   r   mrd   m_1_prev_emb
z_prev_embrg   rh   rr   aZextra_msa_row_maskZtemplate_1d_featZtemplate_1d_maskZmsa_row_maskZmsa_col_maskr{   r$   r$   r:   iteration_evoformer   s    







zAlphaFold.iteration_evoformerr   c                    s  d\}}	|d j d }
|dksJ t|D ]+}|| |   fdd}t||}| ||||\}}}}}}||7 }|	|7 }	~~q|dkrQ|t| }|	t| }	i }|dd |
d d d d f |d< ||d	< |	|d
< t| dds||d kr|}|ddd d d d f |  |ddd d d d f< ||  }||d< ||d< ||d< | j|	||d |d d|d< t|d d ||d< |d |d< |d d d |d< t| dds|ddd d d d f  }| }|d  }n|ddd d d d f }|}|d }||||fS )N)r   r   r   r   r   c                    s   | t | jd d  df S )Nr   r   .)minrm   )rc   idxr$   r:   fetch_cur_batche  s   zGAlphaFold.iteration_evoformer_structure_module.<locals>.fetch_cur_batch.Zmsapairsingler@   Fr   	delta_msa
delta_pairZmsa_norm_maskr   r   )rR   smZ	positionsZfinal_atom_positionsZatom37_atom_existsZfinal_atom_maskframesrs   Zpred_frame_tensor)	rm   rn   r   r   r3   rB   detachr#   r   )r7   rT   r   r   r   cycle_nonum_recyclingnum_ensemblesrd   r{   Zn_seqZensemble_nor   r   r   Zz0s0r   r   r   outputsr   r   r$   r   r:   $iteration_evoformer_structure_moduleV  sp   
 
z.AlphaFold.iteration_evoformer_structure_modulec                 C   s  | dd }| dd }| dd }t }t|d d }t|d jd | }| jr2|dks2J | |}t|D ]2}||d k}	t|oH|	 | j	|||||||d\}
}}}W d    n1 sew   Y  |	sm~
q;d	|v rz|d	 d
 |
d	< |

| |
 |
S )Nr   r   r   Znum_recycling_itersr   r   r   )r   r   r   rq   )r   .)r   r2   is_grad_enabledintrm   r   rV   rn   Zset_grad_enabledr   updater0   )r7   rT   r   r   r   r   Z	num_itersr   r   Zis_final_iterr   r$   r$   r:   forward  sD   
zAlphaFold.forward)r   )__name__
__module____qualname__r&   r=   rA   rD   r6   rQ   rV   rp   r   r   r   r   r   __classcell__r$   r$   r8   r:   r      s    .
)By
Er   )&r2   Ztorch.nnrI   Zunicore.utilsr   datar   Z
attentionsr   r   Zauxillary_headsr   commonr	   Z	embeddersr
   r   r   r   r   r/   r   r   Zfeaturizationr   r   r   r   r   r   r#   r   r)   r   r   r   Moduler   r$   r$   r$   r:   <module>   s    