o
    ô9«ir  ã                   @   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.pthÚ d507d7349b931f0638a25a48a722f98aé   c              
   C   sò   t jt j |¡d dd tj| dd[}t|j dd¡ƒ}t|ddd2}t	|dƒ}|j
|d	D ]}|r@| |¡ | |¡ q2W d   ƒ n1 sKw   Y  W d   ƒ n1 sZw   Y  W d   ƒ d S W d   ƒ d S 1 srw   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)ÚurlÚ
local_pathr   ÚrÚ
total_sizeÚpbarÚfÚdata© r!   úM/data/cameron/vidgen/generative-models/sgm/modules/autoencoding/lpips/util.pyÚdownload   s"   

€ýÿ€ÿþ"þr#   c                 C   s@   t | dƒ}| ¡ }W d   ƒ n1 sw   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    r5   c                       s:   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<   ÚaffinerD   ©Ú	__class__r!   r"   r;   .   s   
zActNorm.__init__c                 C   sÆ   t  ¡ U | 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   ƒ d S 1 s\w   Y  d S )Nr7   r   é   é   éÿÿÿÿgíµ ÷Æ°>)r?   Úno_gradÚpermuteÚ
contiguousÚviewÚshapeÚmeanÚ	unsqueezeÚstdrA   r    Úcopy_rC   )rH   ÚinputÚflattenrU   rW   r!   r!   r"   Ú
initialize:   s"   
"ûû"îzActNorm.initializec           
      C   sê   |r|   |¡S t|jƒdkr|d d …d d …d d f }d}nd}|j\}}}}| jr;| j ¡ dkr;|  |¡ | j d¡ | j|| j	  }|rM| 
d¡ 
d¡}| jrst t | j¡¡}|| t |¡ }	|	t |jd ¡ |¡ }	||	fS |S )NrM   TFr   r7   rO   )ÚreverseÚlenrT   Útrainingr8   Úitemr[   Úfill_rC   rA   Úsqueezer<   r?   ÚlogÚabsÚsumrB   Úto)
rH   rY   r\   ra   Ú_ÚheightÚwidthÚhÚlog_absr<   r!   r!   r"   ÚforwardO   s&   

zActNorm.forwardc                 C   s   | j r| j ¡ dkr| jstdƒ‚|  |¡ | j d¡ t|jƒdkr2|d d …d d …d d f }d}nd}|| j	 | j
 }|rF| d¡ d¡}|S )Nr   zhInitializing ActNorm in reverse direction is disabled by default. Use allow_reverse_init=True to enable.r7   rM   TFrO   )r^   r8   r_   rD   ÚRuntimeErrorr[   r`   r]   rT   rC   rA   ra   )rH   Úoutputra   ri   r!   r!   r"   r\   k   s   ÿ
zActNorm.reverse)FTF©F)Ú__name__Ú
__module__Ú__qualname__r;   r[   rk   r\   Ú__classcell__r!   r!   rK   r"   r6   -   s    ÿ
r6   )r   rn   )r&   r   r   r?   Útorch.nnr=   r   r+   r-   r/   r#   r*   r5   ÚModuler6   r!   r!   r!   r"   Ú<module>   s    

