a
    Ad5!                     @   sh  d dl Z d dlZd dlmZ d dlmZmZmZmZm	Z	m
Z
mZmZmZ d dlZd dlmZ e je jejdZddhZi adadadae Zdd	 Zd
d Zdd Zdd Z dd Z!dd Z"dd Z#dd Z$dd Z%eG dd dZ&dd Z'e&ddd Z(e&dd!d"Z)e&dd#d$Z*e&dd%d&Z+d'd( Z,d2d*d+Z-d,d- Z.d.d/ Z/e0 Z1de1fd0d1Z2dS )3    N)	dataclass)	pathsshareddevicesscript_callbacks	sd_modelsextra_networkslowvram	sd_hijackhashes)deepcopyVAEzmodel_ema.decayzmodel_ema.num_updatesc                   C   s   t d u rd S tjt S N)loaded_vae_fileospathbasename r   r   6/var/www/html/stable-diffusion-webui/modules/sd_vae.pyget_loaded_vae_name   s    r   c                  C   s,   t d u rd S tt d} | r(| dd S d S )Nvaer   
   )r   r   sha256)r   r   r   r   get_loaded_vae_hash   s    r   c                 C   s   t d urt| jkr| rt S d S r   )base_vaecheckpoint_infosd_checkpoint_infomodelr   r   r   get_base_vae'   s    r   c                 C   s.   t | jkr*trJ dt| j a| ja d S )NzTrying to store non-base VAE!)r   r   r   r   first_stage_model
state_dictr   r   r   r   r   store_base_vae-   s    
r"   c                   C   s   d a d ad S r   )r   r   r   r   r   r   delete_base_vae5   s    r#   c                 C   s2   t d ur(t| jkr(td t| t  d at  d S )NzRestoring base VAE)r   r   r   print_load_vae_dictr   r#   r   r   r   r   restore_base_vae;   s
    
r&   c                 C   s   t j| S r   )r   r   r   )filepathr   r   r   get_filenameD   s    r(   c               	   C   sf  t   tjtjdtjtjdtjtjdtjtdtjtdtjtdg} tj	j
d urtjtj	j
r| tjtj	j
dtjtj	j
dtjtj	j
dg7 } tj	jd urtjtj	jr| tjtj	jdtjtj	jdtjtj	jdg7 } g }| D ]}|tj|dd7 }q|D ]}t|}|t |< q,t ttt  d	d
 d d S )Nz**/*.vae.ckptz**/*.vae.ptz**/*.vae.safetensorsz	**/*.ckptz**/*.ptz**/*.safetensorsT)	recursivec                 S   s   t | d S )Nr   )r   natural_sort_key)itemr   r   r   <lambda>j       z"refresh_vae_list.<locals>.<lambda>)key)vae_dictclearr   r   joinr   
model_pathvae_pathr   cmd_optsckpt_dirisdirvae_dirglobiglobr(   updatedictsorteditems)r   
candidatesr   r'   namer   r   r   refresh_vae_listH   s6    	 r@   c                 C   sD   t j| ddd }t D ]}t j||r |  S q d S )N.   r   )r   r   r   rsplitr/   values
startswith)checkpoint_filecheckpoint_pathvae_filer   r   r   find_vae_near_checkpointm   s
    
rI   c                   @   s:   e Zd ZU dZeed< dZeed< dZeed< dd Z	dS )VaeResolutionNr   sourceTresolvedc                 C   s   | j | jfS r   )r   rK   )selfr   r   r   tuple|   s    zVaeResolution.tuple)
__name__
__module____qualname__r   str__annotations__rK   rL   boolrN   r   r   r   r   rJ   v   s   
rJ   c                   C   s   t jjdv S )N>   auto	Automatic)r   optssd_vaer   r   r   r   is_automatic   s    rY   )returnc                  C   sX   t jjdkrt S tt jjd } | d ur4t| dS t sNtdt jj d tddS )NNonezspecified in settingszCouldn't find VAE named z; using None insteadFrL   )r   rW   rX   rJ   r/   getrY   r$   )Zvae_from_optionsr   r   r   resolve_vae_from_setting   s    
r^   c                 C   s\   t | }|dd }|d urR|dkrR|dkr4t S t|d }|d urRt|dS tddS )Nr   rV   r[   zfrom user metadataFr\   )r   Zget_user_metadatar]   rJ   r/   )rF   metadataZvae_metadataZvae_from_metadatar   r   r   resolve_vae_from_user_metadata   s    

r`   c                 C   s2   t | }|d ur(tjjrt r(t|dS tddS )Nzfound near the checkpointFr\   )rI   r   rW   &sd_vae_overrides_per_model_preferencesrY   rJ   )rF   Zvae_near_checkpointr   r   r   resolve_vae_near_checkpoint   s    
rb   c                 C   s\   t jjd urtt jjdS t jjr.t s.t S t| }|j	r@|S t
| }|j	rR|S t }|S )Nzfrom commandline argument)r   r4   r3   rJ   rW   ra   rY   r^   r`   rL   rb   )rF   resr   r   r   resolve_vae   s    rd   c                 C   s$   t j| |d}dd | D }|S )Nmap_locationc                 S   s.   i | ]&\}}|d d dkr|t vr||qS )r      loss)vae_ignore_keys).0kvr   r   r   
<dictcomp>   r-   z!load_vae_dict.<locals>.<dictcomp>)r   read_state_dictr=   )filenamerf   Zvae_ckpt
vae_dict_1r   r   r   load_vae_dict   s    rq   from unknown sourcec                 C   s  t jjdk}|r|rL|tv rLtd| dt|  t|  t| t|  ndtj	
|slJ d| d| td| d|  t|  t|t jd}t| | |r| t|< |rttt jjd krtjd	d
 qt|}|tvr|t|< ntrt|  |at| _t| _d S )Nr   zLoading VAE weights z	: cached zVAE z doesn't exist: z: re   rB   F)last)r   rW   sd_vae_checkpoint_cachecheckpoints_loadedr$   r(   r"   r%   r   r   isfilerq   weight_load_locationcopylenpopitemr/   r   r&   r   )r   rH   
vae_sourcecache_enabledrp   Zvae_optr   r   r   load_vae   s0     

r}   c                 C   s   | j | | j tj d S r   )r    load_state_dicttor   	dtype_vae)r   rp   r   r   r   r%      s    r%   c                   C   s   d a d S r   )r   r   r   r   r   clear_loaded_vae   s    r   c                 C   s   | s
t j} | j}|j}|tkr0t| \}}nd}t|kr@d S | jrPt	  n| 
tj tj|  t| || tj|  t|  | js| 
tj td | S )Nzfrom function argumentzVAE weights loaded.)r   sd_modelr   ro   unspecifiedrd   rN   r   r	   send_everything_to_cpur   r   cpur
   model_hijackundo_hijackr}   hijackr   model_loaded_callbackdevicer$   )r   rH   r   rF   r{   r   r   r   reload_vae_weights   s(    

r   )Nrr   )3r   collectionsdataclassesr   modulesr   r   r   r   r   r   r	   r
   r   r8   rx   r   r   abspathr1   models_pathr3   ri   r/   r   r   r   OrderedDictru   r   r   r   r"   r#   r&   r(   r@   rI   rJ   rY   r^   r`   rb   rd   rq   r}   r%   r   objectr   r   r   r   r   r   <module>   sD   ,		%		
,