o
    *j)                     @   s  d dl mZ d dlmZmZmZmZmZmZ d dl	Z	d dl
mZ d dlm  mZ d dlZ	d dlmZ d dlmZ G dd dejZG dd	 d	ejZG d
d dejZdd Ze	jjde	jde	jde	jde	jdede	jfddZe	jjde	jde	jde	jde	jfddZdd Ze	jjde	jde	jde	jde	jde	jde	jdede	jfddZ dd Z!G d d! d!ej"Z#d"ed#ee$ef d$e%d%e%def
d&d'Z&dS )(    )partial)AnyCallableDictIterableListOptionalN)	LayerNorm)tensor_tree_mapc                	       sX   e Zd Z		ddedededef fddZdd
dZdd ZdddZ	dd Z
  ZS )LinearTdefaultd_ind_outbiasinitc                    s   t t| j|||d || _| jr+t  | jd W d    n1 s&w   Y  |dkr6| d d S |dkrA| d d S |dkrK| 	  d S |dkrW| 
| j d S |d	kra|   d S |d
krl| 
d d S td)N)r   r   r         ?relug       @ZglorotZgatingnormalfinalFzInvalid init method.)superr   __init__use_biastorchno_gradr   fill__trunc_normal_init_glorot_uniform_init
_zero_init_normal_init
ValueError)selfr   r   r   r   	__class__ q/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/science/unifold/modules/common.pyr      s&   
zLinear.__init__r   c                 C   sB   d}| j j\}}|td| }|d | }tjj| j d|d d S )Ng۶%?   g      ?        )meanstd)weightshapemaxnnr   Ztrunc_normal_)r    scaleZTRUNCATED_NORMAL_STDDEV_FACTOR_Zfan_inr(   r#   r#   r$   r   /   s
   zLinear._trunc_normal_initc                 C   s   t jj| jdd d S )Nr%   )Zgain)r,   r   Zxavier_uniform_r)   r    r#   r#   r$   r   7   s   zLinear._glorot_uniform_initc              	   C   s   t  ; | jd |r/t   | jd W d    n1 s"w   Y  W d    d S W d    d S W d    d S 1 sBw   Y  d S )Nr&   r   )r   r   r)   r   r   )r    r   r#   r#   r$   r   :   s   

"zLinear._zero_initc                 C   s   t jjj| jdd d S )NZlinear)Znonlinearity)r   r,   r   Zkaiming_normal_r)   r/   r#   r#   r$   r   A      zLinear._normal_init)Tr   )r   )T)__name__
__module____qualname__intboolstrr   r   r   r   r   __classcell__r#   r#   r!   r$   r      s     

r   c                       sh   e Zd Z fddZdd Zejjdejde	dejfdd	Z
	
ddejdee	 dejfddZ  ZS )
Transitionc                    sf   t t|   || _|| _t| j| _t| j| j| j dd| _t	
 | _t| j| j |dd| _d S )Nr   r   r   )r   r8   r   r   nr	   
layer_normr   linear_1r,   GELUactlinear_2)r    r   r:   r!   r#   r$   r   G   s   
zTransition.__init__c                 C   s,   |  |}| |}| |}| |}|S N)r;   r<   r>   r?   )r    xr#   r#   r$   _transitionS   s
   



zTransition._transitionrA   
chunk_sizereturnc                 C   s$   t | jd|i|t|jd d dS )NrA   rC   num_batch_dims)chunk_layerrB   lenr*   r    rA   rC   r#   r#   r$   _chunkZ   s   zTransition._chunkNc                 C   s(   |d ur|  ||}|S | j|d}|S )N)rA   )rK   rB   rJ   r#   r#   r$   forwardg   s
   zTransition.forwardr@   )r1   r2   r3   r   rB   r   jitignoreTensorr4   rK   r   rL   r7   r#   r#   r!   r$   r8   E   s&    r8   c                	       s   e Zd Zd fdd	Zdd Zejjdejdejde	d	ejfd
dZ
dd Z		ddejdeej dee	 d	ejfddZ  ZS )OuterProductMeanMbP?c                    s   t t|   || _|| _|| _|| _t|| _t	||| _
t	||| _t	|d |dd| _t | _t	| j| jdd| _t| j| _d S )N   r   r9   r   )r   rP   r   d_msad_paird_hidepsr	   r;   r   r<   r?   
linear_outr,   r=   r>   linear_zlayer_norm_out)r    rS   rT   rU   rV   r!   r#   r$   r   w   s   

zOuterProductMean.__init__c                 C   s4   t d||}||jd d d }| |}|S )Nz...bac,...dae->...bdcerE   )r   einsumreshaper*   rW   )r    abouterr#   r#   r$   _opm   s   
zOuterProductMean._opmr^   r_   rC   rD   c                 C   s   | d|jdd   }| d|jdd   }g }t||D ]\}}tt| j|dd|i|dd}|| qt|dkrF|d d}nt	j
|dd}| |jd d |jdd   }|S )	NrZ   )r_   r^   r%   rF   r   )dim)r]   r*   ziprH   r   ra   appendrI   	unsqueezer   stack)r    r^   r_   rC   outZa_primeZb_primer`   r#   r#   r$   rK      s    "zOuterProductMean._chunkc                 C   s   d | _ d | _d S r@   )rX   rY   r/   r#   r#   r$   apply_alphafold_original_mode   s   
z.OuterProductMean.apply_alphafold_original_modeNmmaskc                 C   s   |  |}|d}| jd ur||dd  }| |}| |}| jr.|| }|| }n||9 }||9 }|dd}|dd}|d urN| |||}n| 	||}t
d||}|| j|  }| jd urv| |}| |}| |}|S )Nr[   rE   g      rb   z...abc,...adc->...bdc)r;   rf   rY   sizer<   r?   trainingZ	transposerK   ra   r   r\   rV   r>   rX   )r    rj   rk   rC   r^   r_   zZnormr#   r#   r$   rL      s.   









zOuterProductMean.forward)rQ   )NN)r1   r2   r3   r   ra   r   rM   rN   rO   r4   rK   ri   r   rL   r7   r#   r#   r!   r$   rP   u   s*    rP   c                 C   s   |r||  S | |7 } | S r@   r#   )residualrA   rm   r#   r#   r$   ro      s   ro   rA   r   dropmaskprobrD   c                 C   s   | | t j||dd | S NT)prm   )Fdropout)rA   r   ro   rp   rq   r#   r#   r$   fused_bias_dropout_add   s   rv   c                 C   s   |||  7 }|S r@   r#   )rA   r   ro   r#   r#   r$    fused_bias_dropout_add_inference   s   rw   c           	      C   sl   |   }|r0t|j}d||< t  ||}W d    n1 s#w   Y  t|||||S t|||S Nr%   )get_output_biaslistr*   r   r   new_onesrv   rw   )	modulero   rA   dropout_shared_dimrq   rm   r   r*   rk   r#   r#   r$   bias_dropout_residual   s   

r~   gg_biasdropout_maskc                 C   s*   t || | |  tj||dd | S rr   )r   sigmoidrt   ru   )rA   r   r   r   ro   r   rq   r#   r#   r$   fused_bias_gated_dropout_add   s   
r   c                 C   s   |r8|\}}|   \}	}
t|j}d||< t  ||}W d    n1 s)w   Y  t||	||
|||S |d u rU|\}}|   \}	}
|t||
 ||	  7 }|S ||7 }|S rx   )ry   rz   r*   r   r   r{   r   r   )r|   ro   Zoutputsr}   rq   rm   
block_sizerA   r   r   r   r*   rk   r#   r#   r$   tri_mul_residual	  s0   	

	r   c                   @   s   e Zd Zdd ZdS )SimpleModuleListc                 C   s   t t| d | d   S )Nz X ...
r   )r6   rI   __repr__r/   r#   r#   r$   r   /  s   zSimpleModuleList.__repr__N)r1   r2   r3   r   r#   r#   r#   r$   r   -  s    r   layerinputsrC   rG   c                    sr  t |dks
td fdd dd | D }fdd |D }td	d t| D d
D ]}|9 q3| d
 | }fdd}t||}d }	t|D ]W}
|
| t|
d
 | fdd}t||}| di |}|	d u rtfdd|}	t|}|tu rt|	|D ]
\}}||< qqT|t	j
u r||	< qTtdfdd}t||	}	|	S )Nr   zMust provide at least one inputc                    s|   g }t | tju r|| j |S t | tu r'|  D ]	}| | q|S t| t	r:| D ]	}| | q.|S t
d)NNot supported)typer   rO   re   r*   dictvaluesextend
isinstancer   r   )inputZshapesv)_dict_get_shapesr#   r$   r   =  s   

z%chunk_layer.<locals>._dict_get_shapesc                 S   s   i | ]\}}|d ur||qS r@   r#   ).0kr   r#   r#   r$   
<dictcomp>L  s    zchunk_layer.<locals>.<dictcomp>c                    s   g | ]}|d   qS r@   r#   )r   r*   )rG   r#   r$   
<listcomp>M  s    zchunk_layer.<locals>.<listcomp>c                 S   s   g | ]}t |qS r#   )r+   )r   sr#   r#   r$   r   P  s    r%   c                    sD   | j dg| jd  R  } | jd  ks | jd dks J d| S )Nr[   r   r%   z>batch dimension must be 1 or equal to the flat batch dimensionviewr*   t)flat_batch_dimrG   r#   r$   _flat_inputsW  s
   z!chunk_layer.<locals>._flat_inputsc                    s&   | j d dkr| dd S |   S )Nr   r%   )r*   r   )	chunk_endchunk_startr#   r$   select_chunke  s   z!chunk_layer.<locals>.select_chunkc                    s   |   f| jdd   S rx   )Z	new_zerosr*   r   )r   r#   r$   <lambda>q  s    zchunk_layer.<locals>.<lambda>r   c                    s   |   | jdd   S rx   r   r   )orig_batch_dimsr#   r$   r]   ~  r0   zchunk_layer.<locals>.reshaper#   )rI   r   itemstuplerd   r
   rangeminr   r   rO   )r   r   rC   rG   Zinitial_dimsdZ
num_chunksr   Zflat_inputsrh   ir   ZchunkesZoutput_chunkZout_typerA   yr]   r#   )r   r   r   r   rG   r   r$   rH   3  sJ   






rH   )'	functoolsr   typingr   r   r   r   r   r   r   Ztorch.nnr,   Ztorch.nn.functionalZ
functionalrt   Ztorch.utils.checkpointZunicore.modulesr	   Zunicore.utilsr
   r   Moduler8   rP   ro   rM   scriptrO   floatrv   rw   r~   r   r   Z
ModuleListr   r6   r4   rH   r#   r#   r#   r$   <module>   s    60Y
	$
