a
    Ã
þdr  ã                   @   s‚   d dl Z d dlZd dlZd dlZd dlmZ d dlmZ ddiZddiZddiZ	ddd	„Z
d
d„ Zddd„ZG dd„ dejƒZdS )é    N)ÚtqdmÚ	vgg_lpipsz=https://heibox.uni-heidelberg.de/f/607503859c864bc1b30b/?dl=1zvgg.pthZ d507d7349b931f0638a25a48a722f98aé   c              
   C   sà   t jt j |¡d dd tj| dd¤}t|j dd¡ƒ}t|dddd}t	|dƒ:}|j
|d	D ]}|rd| |¡ | |¡ qdW d   ƒ n1 s–0    Y  W d   ƒ n1 s´0    Y  W d   ƒ n1 sÒ0    Y  d S )
Nr   T)Úexist_ok)Ústreamzcontent-lengthÚB)ÚtotalÚunitÚ
unit_scaleÚwb)Ú
chunk_size)ÚosÚmakedirsÚpathÚsplitÚrequestsÚgetÚintÚheadersr   ÚopenÚiter_contentÚwriteÚupdate)ÚurlZ
local_pathr   ÚrÚ
total_sizeÚpbarÚfÚdata© r   új/var/www/html/stable-diffusion-webui/repositories/generative-models/sgm/modules/autoencoding/lpips/util.pyÚdownload   s    
r!   c                 C   s@   t | dƒ}| ¡ }W d   ƒ n1 s(0    Y  t |¡ ¡ S )NÚrb)r   ÚreadÚhashlibÚmd5Ú	hexdigest)r   r   Úcontentr   r   r    Úmd5_hash   s    &r(   Fc                 C   s‚   | t v sJ ‚tj |t|  ¡}tj |¡r>|r~t|ƒt|  ks~td 	| t |  |¡ƒ t
t |  |ƒ t|ƒ}|t|  ks~J |ƒ‚|S )Nz"Downloading {} model from {} to {})ÚURL_MAPr   r   ÚjoinÚCKPT_MAPÚexistsr(   ÚMD5_MAPÚprintÚformatr!   )ÚnameÚrootÚcheckr   r%   r   r   r    Úget_ckpt_path"   s     r3   c                       s8   e Zd Zd‡ fdd„	Zdd„ Zddd„Zd	d
„ Z‡  ZS )ÚActNormFTc                    sj   |sJ ‚t ƒ  ¡  || _t t d|dd¡¡| _t t d|dd¡¡| _	|| _
|  dtjdtjd¡ d S )Né   Úinitializedr   )Údtype)ÚsuperÚ__init__ÚlogdetÚnnÚ	ParameterÚtorchÚzerosÚlocÚonesÚscaleÚallow_reverse_initÚregister_bufferÚtensorÚuint8)ÚselfÚnum_featuresr:   ÚaffinerB   ©Ú	__class__r   r    r9   .   s    
zActNorm.__init__c                 C   sÄ   t  ¡ ¨ | dddd¡ ¡  |jd d¡}| d¡ d¡ d¡ d¡ dddd¡}| d¡ d¡ d¡ d¡ dddd¡}| j	j
 | ¡ | jj
 d|d  ¡ W d   ƒ n1 s¶0    Y  d S )Nr5   r   é   é   éÿÿÿÿgíµ ÷Æ°>)r=   Úno_gradÚpermuteÚ
contiguousÚviewÚshapeÚmeanÚ	unsqueezeÚstdr?   r   Úcopy_rA   )rF   ÚinputÚflattenrS   rU   r   r   r    Ú
initialize:   s0    
"
ÿþýüÿ
ÿþýüÿzActNorm.initializec           
      C   sê   |r|   |¡S t|jƒdkr:|d d …d d …d d f }d}nd}|j\}}}}| jrv| j ¡ dkrv|  |¡ | j d¡ | j|| j	  }|rš| 
d¡ 
d¡}| jræt t | j¡¡}|| t |¡ }	|	t |jd ¡ |¡ }	||	fS |S )NrK   TFr   r5   rM   )ÚreverseÚlenrR   Útrainingr6   ÚitemrY   Úfill_rA   r?   Úsqueezer:   r=   ÚlogÚabsÚsumr@   Úto)
rF   rW   rZ   r_   Ú_ÚheightÚwidthÚhZlog_absr:   r   r   r    ÚforwardO   s&    

zActNorm.forwardc                 C   s’   | j r:| j ¡ dkr:| js$tdƒ‚n|  |¡ | j d¡ t|jƒdkrf|d d …d d …d d f }d}nd}|| j	 | j
 }|rŽ| d¡ d¡}|S )Nr   zhInitializing ActNorm in reverse direction is disabled by default. Use allow_reverse_init=True to enable.r5   rK   TFrM   )r\   r6   r]   rB   ÚRuntimeErrorrY   r^   r[   rR   rA   r?   r_   )rF   Úoutputr_   rg   r   r   r    rZ   k   s    ÿ
zActNorm.reverse)FTF)F)Ú__name__Ú
__module__Ú__qualname__r9   rY   rh   rZ   Ú__classcell__r   r   rI   r    r4   -   s
    ÿ
r4   )r   )F)r$   r   r   r=   Útorch.nnr;   r   r)   r+   r-   r!   r(   r3   ÚModuler4   r   r   r   r    Ú<module>   s   

