a
    
d@                     @   s  d dl Z d dlZd dlmZ d dlmZ d dlZd dlmZ d dl	Z	d dl	m
Z
 d dlmZ d dlm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dd Zdd ZefddZejddd!ddZG dd de	jjZdd Zejddd"dd Z dS )#    N)Path)InceptionV3W)resize)nn)
functional)
transforms)trange   )utilsc                       s&   e Zd Zd fdd	Zdd Z  ZS )InceptionV3FeatureExtractorcpuc                    sd   t    ttjdt d d }d}d}t|d || t	t
|dd|| _d	| _d S )
NXDG_CACHE_HOMEz.cachezk-diffusionzahttps://nvlabs-fi-cdn.nvidia.com/stylegan2-ada-pytorch/pretrained/metrics/inception-2015-12-05.ptZ@f58cb9b6ec323ed63459aa4fb441fe750cfe39fafad6da5cb504a16f19e958f4zinception-2015-12-05.ptF)Zresize_inside)+  r   )super__init__r   osenvirongethomer
   download_filer   strtomodelsize)selfdevicepathurldigest	__class__ W/var/www/html/stable-diffusion-webui/repositories/k-diffusion/k_diffusion/evaluation.pyr      s    
z$InceptionV3FeatureExtractor.__init__c                 C   sd   |j dd | jkr$t|| jdd}|j d dkrFtj|gd dd}|d d d	d
}| |S )N      reflect	out_shapepad_moder	      dimg     _@r      )shaper   r   torchcatclampr   r   xr!   r!   r"   forward   s    z#InceptionV3FeatureExtractor.forward)r   __name__
__module____qualname__r   r3   __classcell__r!   r!   r   r"   r      s   	r   c                       s&   e Zd Zd fdd	Zdd Z  ZS )CLIPFeatureExtractorViT-L/14@336pxr   c                    sR   t    tj||dd  d| _tjddd| _	| jj
j| jj
jf| _d S )N)r   r   F)g3<4'?gwgM?gy{ ?)gB91?gwt.?g	U?)meanstd)r   r   cliploadevalrequires_grad_r   r   	Normalize	normalizevisualinput_resolutionr   )r   namer   r   r!   r"   r   %   s    
zCLIPFeatureExtractor.__init__c                 C   sn   |j dd | jkr8t|dd| jdddd}| |}| j|	 }t
||j d d  }|S )Nr#   r$   r	   r%   r&   r   g      ?)r-   r   r   adddivr0   rB   r   encode_imagefloatFr1   r!   r!   r"   r3   ,   s    $
zCLIPFeatureExtractor.forward)r:   r   r4   r!   r!   r   r"   r9   $   s   r9   c           
      C   s   t || j }g }zPtd||| j dD ]6}t|| |}||d | }	|| ||	 q*W n tyv   Y n0 t	
|d | S )Nr   )disable)mathceilnum_processesr   is_main_processminappendgatherStopIterationr.   r/   )
acceleratorZ	sample_fnZextractor_fnn
batch_sizeZ
n_per_procZ	feats_alliZcur_batch_sizesamplesr!   r!   r"   compute_features5   s    rY   c                 C   s*   | j d }| |dd }|| d d S )Nr	   r)   )r-   	transpose)r2   yddotr!   r!   r"   polynomial_kernelB   s    
r`   c                 C   s   | j d }|j d }|| | }|||}|| |}|ddg|jdddd }|ddg|jdddd }	|ddg}
|| |d  }|	| |d  }|
d | | }|| | S )Nr[   rZ   )dim1dim2r	   r#   )r-   sumdiagonal)r2   r]   kernelmrU   ZkxxZkyyZkxyZkxx_sumZkyy_sumZkxy_sumterm_1term_2term_3r!   r!   r"   squared_mmdH   s    




""rj   F)matmul  c           
      C   s   | j d |j d  }}tt|| || }| g }t|D ]b}| t|| | t|d | |  }|t|| | t|d | |  }	|t||	 }q@|| S )Nr   r	   )r-   rL   rM   max	new_zerosrangeroundrj   )
r2   r]   max_sizex_sizeZy_sizen_partitionsZ	total_mmdrW   cur_xcur_yr!   r!   r"   kidW   s    
((rv   c                   @   s$   e Zd Zedd Zedd ZdS )_MatrixSquareRootEigc                 C   s<   t j|\}}| || ||    |dd S )Nr[   rZ   )r.   linalgeighsave_for_backwardabssqrt
diag_embedr\   )ctxavalsvecsr!   r!   r"   r3   d   s    z_MatrixSquareRootEig.forwardc                 C   sZ   | j \}}|  d|jd d}|dd}||| | ||dd   | S )NrZ   r[   )saved_tensorsr{   r|   	unsqueezerepeat_interleaver-   r\   )r~   grad_outputr   r   r^   Zvecs_tr!   r!   r"   backwardj   s    
 z_MatrixSquareRootEig.backwardN)r5   r6   r7   staticmethodr3   r   r!   r!   r!   r"   rw   c   s   
rw   c                 C   s8   | j dk rtd| jd | jd kr.tdt| S )Nr#   z2tensor of matrices must have at least 2 dimensionsr[   rZ   z)tensor must be batches of square matrices)ndimRuntimeErrorr-   rw   apply)r   r!   r!   r"   	sqrtm_eigr   s
    
r   :0yE>c                 C   s   | j dd}|j dd}|| d }t| j}t|j}tj|jd |j|j	d| }|| }|| }t
|}	t|| dt
|	| |	   }
||
 S )Nr   r*   r#   )r   dtype)r;   powrc   r.   covTeyer-   r   r   r   trace)r2   r]   epsx_meanZy_meanZ	mean_termZx_covZy_covZeps_eyeZ
x_cov_sqrtZcov_termr!   r!   r"   fidz   s    "r   )rl   )r   )!rL   r   pathlibr   Zcleanfid.inception_torchscriptr   r=   Zresize_rightr   r.   r   torch.nnr   rJ   torchvisionr   	tqdm.autor    r
   Moduler   r9   rY   r`   rj   	tf32_moderv   autogradFunctionrw   r   r   r!   r!   r!   r"   <module>   s,   

