a
    
d                     @   s   d dl Z d dlZd dlmZ d dlZd dlmZ d dlmZm	Z	m
Z
 dd Zddd	Zd
d Zdd Zdd Zdd Zdd ZdddZdd ZdddZG dd dejZdS )     N)optim)
isfunction)Image	ImageDraw	ImageFontc                    s    fdd}|S )Nc                     sN   t jjjdt  t  d  | i |W  d    S 1 s@0    Y  d S )NT)enableddtypecache_enabled)torchcudaampautocastget_autocast_gpu_dtypeis_autocast_cache_enabled)argskwargsf [/var/www/html/stable-diffusion-webui/repositories/stable-diffusion-stability-ai/ldm/util.pydo_autocast   s
    
zautocast.<locals>.do_autocastr   )r   r   r   r   r   r      s    r   
   c           	   	      s   t }t }t|D ]ĉ tjd| dd}t|}tjd|d}t	d| d d  d	
 fd
dtdt   D }z|jd|d|d W n ty   td Y n0 t|dddd d }|| qt|}t|}|S )NRGBwhite)colorzdata/DejaVuSans.ttf)size(   r      
c                 3   s"   | ]}  ||  V  qd S Nr   ).0startbincxcr   r   	<genexpr>       z!log_txt_as_img.<locals>.<genexpr>)r   r   black)fillfontz)Cant encode string for logging. Skipping.      g     _@      ?)lenlistranger   newr   Drawr   truetypeintjointextUnicodeEncodeErrorprintnparray	transposeappendstackr
   tensor)	whr%   r   btxtstxtdrawr*   linesr   r"   r   log_txt_as_img   s"    
,

rE   c                 C   s,   t | tjsdS t| jdko*| jd dkS NF   r,      
isinstancer
   Tensorr.   shapexr   r   r   ismap-   s    rO   c                 C   s:   t | tjsdS t| jdko8| jd dkp8| jd dkS rF   rI   rM   r   r   r   isimage3   s    rP   c                 C   s   | d uS r   r   rM   r   r   r   exists9   s    rQ   c                 C   s   t | r| S t|r| S |S r   )rQ   r   )valdr   r   r   default=   s    rT   c                 C   s   | j ttdt| jdS )z
    https://github.com/openai/guided-diffusion/blob/27c20a8fab9cb472df5d6bdd6c8d11c8f430b924/guided_diffusion/nn.py#L86
    Take the mean over all non-batch dimensions.
    r,   )dim)meanr/   r0   r.   rL   )r>   r   r   r   	mean_flatC   s    rW   Fc                 C   s<   t dd |  D }|r8t| jj d|d dd |S )Nc                 s   s   | ]}|  V  qd S r   )numel)r    pr   r   r   r&   L   r'   zcount_params.<locals>.<genexpr>z has gư>z.2fz
 M params.)sum
parametersr8   	__class____name__)modelverbosetotal_paramsr   r   r   count_paramsK   s    ra   c                 C   sH   d| vr(| dkrd S | dkr d S t dt| d f i | dt S )Ntarget__is_first_stage____is_unconditional__z%Expected key `target` to instantiate.params)KeyErrorget_obj_from_strgetdict)configr   r   r   instantiate_from_configR   s    rk   c                 C   s<   |  dd\}}|r(t|}t| ttj|d d|S )N.r,   )package)rsplit	importlibimport_modulereloadgetattr)stringrq   modulecls
module_impr   r   r   rg   \   s
    

rg   c                       s<   e Zd Zd fd	d
	Z fddZe dddZ  ZS )AdamWwithEMAandWingsMbP?g?g+?:0yE>{Gz?FH.?r-   r   c
              
      s   d|kst d|d|ks,t d|d|d   krDdk sXn t d|d d|d   krpdk sn t d|d d|kst d	|d|  krdksn t d
|t||||||||	d}
t ||
 dS )z0AdamW that saves EMA versions of the parameters.g        zInvalid learning rate: {}zInvalid epsilon value: {}r   r-   z%Invalid beta parameter at index 0: {}r,   z%Invalid beta parameter at index 1: {}zInvalid weight_decay value: {}zInvalid ema_decay value: {})lrbetasepsweight_decayamsgrad	ema_decay	ema_powerparam_namesN)
ValueErrorformatri   super__init__)selfre   r}   r~   r   r   r   r   r   r   defaultsr\   r   r   r   f   s"    zAdamWwithEMAandWings.__init__c                    s(   t  | | jD ]}|dd qd S )Nr   F)r   __setstate__param_groups
setdefault)r   stategroupr   r   r   r   {   s    
z!AdamWwithEMAandWings.__setstate__Nc                 C   s   d}|dur:t   | }W d   n1 s00    Y  | jD ]}g }g }g }g }g }g }	g }
g }|d }|d \}}|d }|d }|d D ]}|jdu rq|| |jjrtd||j | j| }t|dkr@d|d	< t j	|t j
d
|d< t j	|t j
d
|d< |r,t j	|t j
d
|d< |   |d< ||d  ||d  ||d  |r~|
|d  |d	  d7  < ||d	  qtjj|||||
|||||d |d |d dd t|d|d	 |   }t||D ]&\}}||j| d| d qq@|S )zPerforms a single optimization step.
        Args:
            closure (callable, optional): A closure that reevaluates the model
                and returns the loss.
        Nr   r~   r   r   re   z'AdamW does not support sparse gradientsr   step)memory_formatexp_avg
exp_avg_sqmax_exp_avg_sqZparam_exp_avgr,   r}   r   r   F)r   beta1beta2r}   r   r   maximize)alpha)r
   enable_gradr   gradr<   	is_sparseRuntimeErrorr   r.   
zeros_likepreserve_formatdetachfloatcloner   _functionaladamwminzipmul_add_)r   closurelossr   params_with_gradgradsexp_avgsexp_avg_sqsZema_params_with_grad
state_sumsmax_exp_avg_sqsstate_stepsr   r   r   r   r   rY   r   Zcur_ema_decayparamZ	ema_paramr   r   r   r      sr    
$


"zAdamWwithEMAandWings.step)rx   ry   rz   r{   Fr|   r-   r   )N)	r]   
__module____qualname__r   r   r
   no_gradr   __classcell__r   r   r   r   rw   d   s      rw   )r   )F)F)ro   r
   r   numpyr9   inspectr   PILr   r   r   r   rE   rO   rP   rQ   rT   rW   ra   rk   rg   	Optimizerrw   r   r   r   r   <module>   s    




