o
    i                     @   s   d dl Z 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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	ImageFont
   c           	   	      s   t }t }t|D ]c 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yZ   td Y nw 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 N ).0startbincxcr   ,/mnt/c/Users/fbmor/ComfyUI/comfy/ldm/util.py	<genexpr>   s   " 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loggingwarningnparray	transposeappendstacktorchtensor)	whr   r   btxtstxtdrawr   linesr   r   r   log_txt_as_img   s$   
,

r8   c                 C   s,   t | tjsdS t| jdko| jd dkS NF   r      
isinstancer0   Tensorr   shapexr   r   r   ismap$   s   rB   c                 C   s:   t | tjsdS t| jdko| jd dkp| jd dkS r9   r<   r@   r   r   r   isimage*   s   *rC   c                 C   s   | d uS r   r   r@   r   r   r   exists0   s   rD   c                 C   s   t | r| S t|r| S |S r   )rD   r   )valdr   r   r   default4   s   rG   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    r!   r   r?   )r1   r   r   r   	mean_flat:   s   rJ   Fc                 C   s>   t dd |  D }|rt| jj d|d dd |S )Nc                 s   s    | ]}|  V  qd S r   )numel)r   pr   r   r   r   C   s    zcount_params.<locals>.<genexpr>z has gư>z.2fz
 M params.)sum
parametersr)   info	__class____name__)modelverbosetotal_paramsr   r   r   count_paramsB   s    rU   c                 C   sH   d| vr| dkr
d S | dkrd S t dt| d di | dt S )Ntarget__is_first_stage____is_unconditional__z%Expected key `target` to instantiate.paramsr   )KeyErrorget_obj_from_strgetdict)configr   r   r   instantiate_from_configI   s    r_   c                 C   s<   |  dd\}}|rt|}t| ttj|d d|S )N.r   )package)rsplit	importlibimport_modulereloadgetattr)stringre   modulecls
module_impr   r   r   r[   S   s
   

r[   c                       sB   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r"dk s,n t d|d d|d   kr8dk sBn t d|d d|ksMt d	|d|  krWdks_n 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formatr]   super__init__)selfrY   rq   rr   rs   rt   ru   rv   rw   rx   defaultsrP   r   r   r|   ]   s"   zAdamWwithEMAandWings.__init__c                    s(   t  | | jD ]}|dd q	d S )Nru   F)r{   __setstate__param_groups
setdefault)r}   stategroupr   r   r   r   r   s   
z!AdamWwithEMAandWings.__setstate__Nc                 C   s  d}|durt   | }W d   n1 sw   Y  | jD ]}g }g }g }g }g }g }	g }
|d }|d \}}|d }|d }|d D ]}|jdu rNqF|| |jjr[td||j | j| }t|dkrd|d	< t j	|t j
d
|d< t j	|t j
d
|d< |rt j	|t j
d
|d< |   |d< ||d  ||d  ||d  |r|	|d  |d	  d7  < |
|d	  qFt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.
        Nru   rr   rv   rw   rY   z'AdamW does not support sparse gradientsr   step)memory_formatexp_avg
exp_avg_sqmax_exp_avg_sqparam_exp_avgr   rq   rt   rs   F)ru   beta1beta2rq   rt   rs   maximize)alpha)r0   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_sqsema_params_with_gradmax_exp_avg_sqsstate_stepsru   r   r   rv   rw   rL   r   cur_ema_decayparam	ema_paramr   r   r   r   w   st   




zAdamWwithEMAandWings.step)rl   rm   rn   ro   Frp   r   r   r   )	rQ   
__module____qualname__r|   r   r0   no_gradr   __classcell__r   r   r   r   rk   [   s    rk   )r   )F)rc   r)   r0   r   numpyr+   inspectr   PILr   r   r   r8   rB   rC   rD   rG   rJ   rU   r_   r[   	Optimizerrk   r   r   r   r   <module>   s"    



