a
    þdtY  ã                   @   sè   d Z ddlZddlZddlmZ ddlm  mZ G dd„ dej	ƒZ
dd„ Z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G dd„ dej	ƒZdS )z9Modified from https://github.com/wzhouxiff/RestoreFormer
é    Nc                       s0   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚVectorQuantizera¥  
    see https://github.com/MishaLaskin/vqvae/blob/d761a999e2267766400dc646d82d3ac3657771d4/models/quantizer.py
    ____________________________________________
    Discretization bottleneck part of the VQ-VAE.
    Inputs:
    - n_e : number of embeddings
    - e_dim : dimension of embedding
    - beta : commitment cost used in loss term, beta * ||z_e(x)-sg[e]||^2
    _____________________________________________
    c                    sT   t t| ƒ ¡  || _|| _|| _t | j| j¡| _| jj	j
 d| j d| j ¡ d S )Ng      ð¿g      ð?)Úsuperr   Ú__init__Ún_eÚe_dimÚbetaÚnnZ	EmbeddingÚ	embeddingÚweightÚdataZuniform_)Úselfr   r   r   ©Ú	__class__© úh/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/gfpgan/archs/restoreformer_arch.pyr      s    zVectorQuantizer.__init__c              	   C   sV  |  dddd¡ ¡ }| d| j¡}tj|d dddtj| jjd dd dt || jj 	¡ ¡  }tj
|dd\}}| d¡}t |jd | j¡ |¡}| d|d¡ t || jj¡ |j¡}t | ¡ | d ¡| jt || ¡  d ¡  }|||  ¡  }tj|dd}	t t |	t |	d	 ¡ ¡ ¡}
|  dddd¡ ¡ }|||
|||ffS )
ar  
        Inputs the output of the encoder network z and maps it to a discrete
        one-hot vector that is the index of the closest embedding vector e_j
        z (continuous) -> z_q (discrete)
        z.shape = (batch, channel, height, width)
        quantization pipeline:
            1. get encoder input (B,C,H,W)
            2. flatten input to (B*H*W,C)
        r   é   é   é   éÿÿÿÿT)ÚdimZkeepdim©r   g»½×Ùß|Û=)ÚpermuteÚ
contiguousÚviewr   ÚtorchÚsumr	   r
   ÚmatmulÚtÚminZ	unsqueezeÚzerosÚshaper   ÚtoÚscatter_ÚmeanÚdetachr   ÚexpÚlog)r   ÚzZz_flattenedÚdZ	min_valueZmin_encoding_indicesÚmin_encodingsÚz_qZlossZe_meanZ
perplexityr   r   r   Úforward   s(    ÿÿÿ

2 zVectorQuantizer.forwardc                 C   sr   t  |jd | j¡ |¡}| d|d d …d f d¡ t  | ¡ | jj	¡}|d urn| 
|¡}| dddd¡ ¡ }|S )Nr   r   r   r   )r   r   r    r   r!   r"   r   Úfloatr	   r
   r   r   r   )r   Úindicesr    r)   r*   r   r   r   Úget_codebook_entryZ   s    
z"VectorQuantizer.get_codebook_entry)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r+   r.   Ú__classcell__r   r   r   r   r   	   s   	<r   c                 C   s   | t  | ¡ S ©N)r   Zsigmoid)Úxr   r   r   Únonlinearitym   s    r6   c                 C   s   t jjd| dddS )Né    gíµ ÷Æ°>T)Z
num_groupsZnum_channelsZepsZaffine)r   r   Z	GroupNorm)Úin_channelsr   r   r   Ú	Normalizer   s    r9   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚUpsamplec                    s2   t ƒ  ¡  || _| jr.tjj||dddd| _d S )Nr   r   ©Úkernel_sizeÚstrideÚpadding©r   r   Ú	with_convr   r   ÚConv2dÚconv©r   r8   r@   r   r   r   r   x   s    
zUpsample.__init__c                 C   s(   t jjj|ddd}| jr$|  |¡}|S )Ng       @Znearest)Zscale_factorÚmode)r   r   Ú
functionalZinterpolater@   rB   )r   r5   r   r   r   r+   ~   s    
zUpsample.forward©r/   r0   r1   r   r+   r3   r   r   r   r   r:   v   s   r:   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )Ú
Downsamplec                    s2   t ƒ  ¡  || _| jr.tjj||dddd| _d S )Nr   r   r   r;   r?   rC   r   r   r   r   ‡   s    
zDownsample.__init__c                 C   sD   | j r,d}tjjj||ddd}|  |¡}ntjjj|ddd}|S )N)r   r   r   r   Zconstantr   )rD   Úvaluer   )r<   r=   )r@   r   r   rE   ÚpadrB   Z
avg_pool2d)r   r5   rI   r   r   r   r+   Ž   s    zDownsample.forwardrF   r   r   r   r   rG   …   s   rG   c                       s.   e Zd Zddddœ‡ fdd„
Zdd„ Z‡  ZS )	ÚResnetBlockNFé   )Úout_channelsÚconv_shortcutÚtemb_channelsc                   sÞ   t ƒ  ¡  || _|d u r|n|}|| _|| _t|ƒ| _tjj	||dddd| _
|dkrftj ||¡| _t|ƒ| _tj |¡| _tjj	||dddd| _| j| jkrÚ| jrÂtjj	||dddd| _ntjj	||dddd| _d S )Nr   r   r;   r   )r   r   r8   rL   Úuse_conv_shortcutr9   Únorm1r   r   rA   Úconv1ZLinearÚ	temb_projÚnorm2ZDropoutÚdropoutÚconv2rM   Únin_shortcut)r   r8   rL   rM   rT   rN   r   r   r   r   š   s     


zResnetBlock.__init__c                 C   s¤   |}|   |¡}t|ƒ}|  |¡}|d urN||  t|ƒ¡d d …d d …d d f  }|  |¡}t|ƒ}|  |¡}|  |¡}| j| jkrœ| j	r’|  
|¡}n
|  |¡}|| S r4   )rP   r6   rQ   rR   rS   rT   rU   r8   rL   rO   rM   rV   )r   r5   ÚtembÚhr   r   r   r+   ®   s    

&



zResnetBlock.forwardrF   r   r   r   r   rJ   ˜   s   rJ   c                       s(   e Zd Zd‡ fdd„	Zddd„Z‡  ZS )	ÚMultiHeadAttnBlockr   c                    s²   t ƒ  ¡  || _|| _|| | _|| dks4J dƒ‚t|ƒ| _t|ƒ| _tj	j
||dddd| _tj	j
||dddd| _tj	j
||dddd| _tj	j
||dddd| _d| _d S )Nr   z=The size of head should be divided by the number of channels.r   r;   )r   r   r8   Ú	head_sizeÚatt_sizer9   rP   rS   r   r   rA   ÚqÚkÚvÚproj_outÚnum)r   r8   rZ   r   r   r   r   Ç   s    



zMultiHeadAttnBlock.__init__Nc                 C   st  |}|   |¡}|d u r|}n
|  |¡}|  |¡}|  |¡}|  |¡}|j\}}}	}
| || j| j|	|
 ¡}| 	dddd¡}| || j| j|	|
 ¡}| 	dddd¡}| || j| j|	|
 ¡}| 	dddd¡}| 
dd¡}| 
dd¡}| 
dd¡ 
dd¡}t| jƒd }| |¡ t ||¡}tj|dd}| |¡}| 
dd¡ ¡ }| ||	|
d¡}| 	dddd¡}|  |¡}|| S )Nr   r   r   r   g      à¿r   r   )rP   rS   r\   r]   r^   r    ZreshaperZ   r[   r   Z	transposeÚintZmul_r   r   ÚFZsoftmaxr   r   r_   )r   r5   ÚyZh_r\   r]   r^   ÚbÚcrX   ÚwZscaleZw_r   r   r   r+   ×   s8    







zMultiHeadAttnBlock.forward)r   )NrF   r   r   r   r   rY   Å   s   rY   c                       s&   e Zd Zd‡ fd
d„	Zdd„ Z‡  ZS )ÚMultiHeadEncoder©r   r   é   é   r   ©é   ç        Tr   rK   é   r   c              
      s¬  t ƒ  ¡  || _d| _t|ƒ| _|| _|	| _|| _|| _	t
jj|| jdddd| _|	}dt|ƒ }t ¡ | _t| jƒD ]´}t ¡ }t ¡ }|||  }|||  }t| jƒD ]8}| t||| j|d¡ |}||v r¬| t||ƒ¡ q¬t ¡ }||_||_|| jd krt||ƒ|_|d }| j |¡ qv| j	rxt ¡ | _t||| j|d| j_t||ƒ| j_t||| j|d| j_t|ƒ| _t
jj||r˜d|
 n|
dddd| _ d S )Nr   r   r   r;   )r   ©r8   rL   rN   rT   r   )!r   r   ÚchÚtemb_chÚlenÚnum_resolutionsÚnum_res_blocksÚ
resolutionr8   Ú
enable_midr   r   rA   Úconv_inÚtupleÚ
ModuleListÚdownÚrangeÚappendrJ   rY   ÚModuleÚblockÚattnrG   Ú
downsampleÚmidÚblock_1Úattn_1Úblock_2r9   Únorm_outÚconv_out)r   rp   Úout_chÚch_multrt   Úattn_resolutionsrT   Úresamp_with_convr8   ru   Ú
z_channelsÚdouble_zrv   rZ   Zignore_kwargsÚcurr_resZ
in_ch_multÚi_levelr~   r   Úblock_inÚ	block_outÚi_blockrz   r   r   r   r     s\    



ÿÿ

ÿ

ÿ

ÿzMultiHeadEncoder.__init__c                 C   s  i }d }|   |¡}||d< t| jƒD ]€}t| jƒD ]B}| j| j| ||ƒ}t| j| jƒdkr2| j| j| |ƒ}q2|| jd kr$||dt|ƒ < | j|  	|¡}q$| j
rð| j ||¡}||dt|ƒ d < | j |¡}| j ||¡}||d< |  |¡}t|ƒ}|  |¡}||d< |S )NÚinr   r   Úblock_Ú_attenÚ	mid_attenÚout)rw   r{   rs   rt   rz   r~   rr   r   Ústrr€   rv   r   r‚   rƒ   r„   r…   r6   r†   )r   r5   ÚhsrW   rX   rŽ   r‘   r   r   r   r+   D  s.    


zMultiHeadEncoder.forward)rh   r   rk   rm   Tr   rK   rn   TTr   rF   r   r   r   r   rg     s              ó@rg   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚMultiHeadDecoderrh   r   rk   rm   Tr   rK   rn   Fr   c              
      sÚ  t ƒ  ¡  || _d| _t|ƒ| _|| _|	| _|| _|| _	|| _
||| jd   }|	d| jd   }d|
||f| _td | jt | j¡¡ƒ tjj|
|dddd| _| j
rìt ¡ | _t||| j|d| j_t||ƒ| j_t||| j|d| j_t ¡ | _tt| jƒƒD ]®}t ¡ }t ¡ }|||  }t| jd ƒD ]<}| t||| j|d¡ |}||v r2| t||ƒ¡ q2t ¡ }||_ ||_!|dkr¢t"||ƒ|_#|d }| j $d|¡ qt%|ƒ| _&tjj||dddd| _'d S ©Nr   r   r   z+Working with z of shape {} = {} dimensions.r   r;   ro   ©(r   r   rp   rq   rr   rs   rt   ru   r8   Úgive_pre_endrv   Zz_shapeÚprintÚformatÚnpÚprodr   r   rA   rw   r}   r   rJ   r‚   rY   rƒ   r„   ry   ÚupÚreversedr{   r|   r~   r   r:   ÚupsampleÚinsertr9   r…   r†   ©r   rp   r‡   rˆ   rt   r‰   rT   rŠ   r8   ru   r‹   rœ   rv   rZ   Zignorekwargsr   r   rŽ   r~   r   r   r‘   r¡   r   r   r   r   l  s\    



ÿ

ÿ


ÿÿ


zMultiHeadDecoder.__init__c                 C   sì   |j | _d }|  |¡}| jrD| j ||¡}| j |¡}| j ||¡}tt	| j
ƒƒD ]n}t	| jd ƒD ]B}| j| j| ||ƒ}t| j| jƒdkrd| j| j| |ƒ}qd|dkrR| j|  |¡}qR| jrÌ|S |  |¡}t|ƒ}|  |¡}|S )Nr   r   )r    Zlast_z_shaperw   rv   r   r‚   rƒ   r„   r¢   r{   rs   rt   r¡   r~   rr   r   r£   rœ   r…   r6   r†   )r   r'   rW   rX   rŽ   r‘   r   r   r   r+   °  s(    


zMultiHeadDecoder.forward)rh   r   rk   rm   Tr   rK   rn   FTr   rF   r   r   r   r   r™   j  s              óDr™   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚMultiHeadDecoderTransformerrh   r   rk   rm   Tr   rK   rn   Fr   c              
      sÚ  t ƒ  ¡  || _d| _t|ƒ| _|| _|	| _|| _|| _	|| _
||| jd   }|	d| jd   }d|
||f| _td | jt | j¡¡ƒ tjj|
|dddd| _| j
rìt ¡ | _t||| j|d| j_t||ƒ| j_t||| j|d| j_t ¡ | _tt| jƒƒD ]®}t ¡ }t ¡ }|||  }t| jd ƒD ]<}| t||| j|d¡ |}||v r2| t||ƒ¡ q2t ¡ }||_ ||_!|dkr¢t"||ƒ|_#|d }| j $d|¡ qt%|ƒ| _&tjj||dddd| _'d S rš   r›   r¥   r   r   r   r   Õ  s\    



ÿ

ÿ


ÿÿ


z$MultiHeadDecoderTransformer.__init__c                 C   sü   d }|   |¡}| jrB| j ||¡}| j ||d ¡}| j ||¡}tt| jƒƒD ]€}t| j	d ƒD ]T}| j
| j| ||ƒ}t| j
| jƒdkrb| j
| j| ||dt|ƒ d  ƒ}qb|dkrP| j
|  |¡}qP| jrÜ|S |  |¡}t|ƒ}|  |¡}|S )Nr•   r   r   r“   r”   )rw   rv   r   r‚   rƒ   r„   r¢   r{   rs   rt   r¡   r~   rr   r   r—   r£   rœ   r…   r6   r†   )r   r'   r˜   rW   rX   rŽ   r‘   r   r   r   r+     s&    
(

z#MultiHeadDecoderTransformer.forward)rh   r   rk   rm   Tr   rK   rn   FTr   rF   r   r   r   r   r¦   Ó  s              óDr¦   c                       s6   e Zd Zd‡ fdd„	Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚRestoreFormeré   rn   é@   r   ©r   r   r   ri   ri   rj   r   rk   rm   rK   FTrj   c                    s  t t| ƒ ¡  t|||||||	|
||||d| _t|||||||	|
|||d| _t||dd| _t	j
 ||d¡| _t	j
 ||d¡| _|rØ| j ¡ D ]\}}d|_q’| j ¡ D ]\}}d|_q¬| j ¡ D ]\}}d|_qÆn|rö| j ¡ D ]\}}d|_qæ|r| j ¡ D ]\}}d|_qd S )N)rp   r‡   rˆ   rt   r‰   rT   r8   ru   r‹   rŒ   rv   rZ   )rp   r‡   rˆ   rt   r‰   rT   r8   ru   r‹   rv   rZ   g      Ð?)r   r   F)r   r§   r   rg   Úencoderr¦   Údecoderr   Úquantizer   r   rA   Ú
quant_convÚpost_quant_convZnamed_parametersZrequires_grad)r   Zn_embedZ	embed_dimrp   r‡   rˆ   rt   r‰   rT   r8   ru   r‹   rŒ   rv   Zfix_decoderZfix_codebookZfix_encoderrZ   Ú_Úparamr   r   r   r   ?  sX    ôõ
zRestoreFormer.__init__c                 C   s4   |   |¡}|  |d ¡}|  |¡\}}}||||fS )Nr–   )r«   r®   r­   )r   r5   r˜   rX   ÚquantZemb_lossÚinfor   r   r   Úencode  s    
zRestoreFormer.encodec                 C   s   |   |¡}|  ||¡}|S r4   )r¯   r¬   )r   r²   r˜   Údecr   r   r   Údecodeˆ  s    
zRestoreFormer.decodec                 K   s&   |   |¡\}}}}|  ||¡}|d fS r4   )r´   r¶   )r   ÚinputÚkwargsr²   Údiffr³   r˜   rµ   r   r   r   r+   Ž  s    zRestoreFormer.forward)r¨   rn   r©   r   rª   r   rk   rm   r   rK   rn   FTFTFrj   )r/   r0   r1   r   r´   r¶   r+   r3   r   r   r   r   r§   =  s*                    ïBr§   )r2   ÚnumpyrŸ   r   Ztorch.nnr   Ztorch.nn.functionalrE   rb   r}   r   r6   r9   r:   rG   rJ   rY   rg   r™   r¦   r§   r   r   r   r   Ú<module>   s   d-=hij