a
    
dp!                     @   s   d dl Z d dlZd dlm  mZ d dlmZ d dl	m
Z
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jZdS )    N)contextmanager)EncoderDecoder)DiagonalGaussianDistribution)instantiate_from_config)LitEmac                       s   e Zd Zdg dddddf fdd	Ze fddZed$dd	Zd
d Zdd Z	dd Z
d%ddZdd Zdd Zdd Zd&ddZdd Zdd Ze d'd d!Zd"d# Z  ZS )(AutoencoderKLNimageFc              	      s>  t    |
| _|| _tf i || _tf i || _t|| _	|d sLJ t
jd|d  d| d| _t
j||d d| _|| _|d urt|tksJ | dt
d|dd |d ur|| _|	d u| _| jr"|	| _d|	  k rdk sn J t| |	d	| _td
tt| j  d |d ur:| j||d d S )Ndouble_z   
z_channels   colorize   g              ?)decayzKeeping EMAs of .)ignore_keys)super__init__learn_logvar	image_keyr   encoderr   decoderr   losstorchnnConv2d
quant_convpost_quant_conv	embed_dimtypeintregister_bufferrandnmonitoruse_ema	ema_decayr   	model_emaprintlenlistbuffersinit_from_ckpt)selfddconfig
lossconfigr    	ckpt_pathr   r   Zcolorize_nlabelsr%   r'   r   	__class__ i/var/www/html/stable-diffusion-webui/repositories/stable-diffusion-stability-ai/ldm/models/autoencoder.pyr      s.    



zAutoencoderKL.__init__c                 C   sp   t j|ddd }t| }|D ],}|D ]"}||r*td| ||= q*q"| j|dd td|  d S )Ncpu)map_location
state_dictz Deleting key {} from state_dict.F)strictzRestored from )r   loadr+   keys
startswithr)   formatload_state_dict)r.   pathr   sdr;   kikr4   r4   r5   r-   4   s    

zAutoencoderKL.init_from_ckptc              
   c   s   | j r8| j|   | j|  |d ur8t| d z6d V  W | j r| j|   |d urt| d n.| j r| j|   |d urt| d 0 d S )Nz: Switched to EMA weightsz: Restored training weights)r&   r(   store
parameterscopy_tor)   restore)r.   contextr4   r4   r5   	ema_scope?   s    zAutoencoderKL.ema_scopec                 O   s   | j r| |  d S N)r&   r(   )r.   argskwargsr4   r4   r5   on_train_batch_endN   s    z AutoencoderKL.on_train_batch_endc                 C   s    |  |}| |}t|}|S rI   )r   r   r   )r.   xhmoments	posteriorr4   r4   r5   encodeR   s    

zAutoencoderKL.encodec                 C   s   |  |}| |}|S rI   )r   r   )r.   zdecr4   r4   r5   decodeX   s    

zAutoencoderKL.decodeTc                 C   s2   |  |}|r| }n| }| |}||fS rI   )rQ   samplemoderT   )r.   inputZsample_posteriorrP   rR   rS   r4   r4   r5   forward]   s    


zAutoencoderKL.forwardc                 C   s@   || }t |jdkr|d }|ddddjtjd }|S )Nr   ).Nr   r   r   )memory_format)r*   shapepermutetor   contiguous_formatfloat)r.   batchrA   rM   r4   r4   r5   	get_inputf   s
    zAutoencoderKL.get_inputc              	   C   s   |  || j}| |\}}|dkrr| j||||| j|  dd\}}| jd|ddddd | j|ddddd |S |dkr| j||||| j|  dd\}	}
| jd	|	ddddd | j|
ddddd |	S d S )
Nr   train
last_layersplitaelossT)prog_barloggeron_stepon_epochFr   disclossr`   r   r   global_stepget_last_layerloglog_dict)r.   r_   	batch_idxoptimizer_idxinputsreconstructionsrP   re   log_dict_aerj   log_dict_discr4   r4   r5   training_stepm   s     

zAutoencoderKL.training_stepc                 C   sH   |  ||}|    | j ||dd}W d    n1 s:0    Y  |S )N_ema)postfix)_validation_steprH   )r.   r_   rp   ro   log_dict_emar4   r4   r5   validation_step   s    
.zAutoencoderKL.validation_step c              	   C   s   |  || j}| |\}}| j|||d| j|  d| d\}}| j|||d| j|  d| d\}	}
| d| d|d| d  | | | |
 | jS )Nr   valrb   r   z	/rec_lossrk   )r.   r_   rp   rx   rr   rs   rP   re   rt   rj   ru   r4   r4   r5   ry      s    

 

zAutoencoderKL._validation_stepc                 C   s   | j }t| j t| j  t| j  t| j  }| jrdt| j	j
 d || jj tjj||dd}tjj| jj |dd}||gg fS )Nz: Learning logvar)g      ?g?)lrbetas)learning_rater+   r   rD   r   r   r   r   r)   r3   __name__appendr   logvarr   optimAdamdiscriminator)r.   r~   Zae_params_listopt_aeopt_discr4   r4   r5   configure_optimizers   s     z"AutoencoderKL.configure_optimizersc                 C   s
   | j jjS rI   )r   conv_outweight)r.   r4   r4   r5   rm      s    zAutoencoderKL.get_last_layerc                 K   s  t  }| || j}|| j}|s| |\}}|jd dkrf|jd dksRJ | |}| |}| t	|
 |d< ||d< |s| jr|  f | |\}	}
|jd dkr|	jd dksJ | |	}	| t	|

 |d< |	|d< W d    n1 s0    Y  ||d< |S )Nr   r   samplesrs   Zsamples_emareconstructions_emarr   )dictr`   r   r\   devicerZ   to_rgbrT   r   
randn_likerU   r&   rH   )r.   r_   only_inputsZlog_emarK   rn   rM   xrecrP   xrec_emaZposterior_emar4   r4   r5   
log_images   s*    



(zAutoencoderKL.log_imagesc              	   C   st   | j dksJ t| ds<| dtd|jd dd| tj|| j	d}d||
   | |
   d }|S )Nsegmentationr   r   r   )r   g       @r   )r   hasattrr#   r   r$   rZ   r\   Fconv2dr   minmax)r.   rM   r4   r4   r5   r      s    
$$zAutoencoderKL.to_rgb)N)T)r|   )FF)r   
__module____qualname__r   r+   r-   r   rH   rL   rQ   rT   rX   r`   rv   r{   ry   r   rm   r   no_gradr   r   __classcell__r4   r4   r2   r5   r      s0   &
	
r   c                       sB   e Zd Zdd fdd
Zdd Zdd Zd	d
 Zdd Z  ZS )IdentityFirstStageFvq_interfacec                   s   || _ t   d S rI   )r   r   r   )r.   r   rJ   rK   r2   r4   r5   r      s    zIdentityFirstStage.__init__c                 O   s   |S rI   r4   r.   rM   rJ   rK   r4   r4   r5   rQ      s    zIdentityFirstStage.encodec                 O   s   |S rI   r4   r   r4   r4   r5   rT      s    zIdentityFirstStage.decodec                 O   s   | j r|d g dfS |S )N)NNNr   r   r4   r4   r5   quantize   s    zIdentityFirstStage.quantizec                 O   s   |S rI   r4   r   r4   r4   r5   rX      s    zIdentityFirstStage.forward)	r   r   r   r   rQ   rT   r   rX   r   r4   r4   r2   r5   r      s
   r   )r   pytorch_lightningplZtorch.nn.functionalr   
functionalr   
contextlibr   Z"ldm.modules.diffusionmodules.modelr   r   'ldm.modules.distributions.distributionsr   ldm.utilr   ldm.modules.emar   LightningModuler   Moduler   r4   r4   r4   r5   <module>   s    =