o
    )j^                     @   s   d dl Z d dlmZ d dlZd dlZd dlmZmZm	Z	 d dl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)
isfunction)Image	ImageDraw	ImageFont)optim
   c           	   	      s   t }t }t|D ]b 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yY   td Y nw t|dddd d }|| qt|}t|}|S )NRGBwhite)colorzfont/DejaVuSans.ttf)size(   r      
c                 3   s$    | ]}  ||  V  qd S N ).0startZbincxcr   f/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/cv/anydoor/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   ZDrawr   ZtruetypeintjointextUnicodeEncodeErrorprintnparrayZ	transposeappendstacktorchtensor)	Zwhr   r   bZtxtstxtZdrawr   linesr   r   r   log_txt_as_img
   s(   


r0   c                 C   s,   t | tjsdS t| jdko| jd dkS NF   r      
isinstancer+   ZTensorr   shapexr   r   r   ismap#   s   r9   c                 C   s:   t | tjsdS t| jdko| jd dkp| jd dkS r1   r4   r7   r   r   r   isimage)   s   *r:   c                 C   s   | d uS r   r   r7   r   r   r   exists/   s   r;   c                 C   s   t | r| S t|r| S |S r   )r;   r   )valdr   r   r   default3   s   r>   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   r6   )r,   r   r   r   	mean_flat9   s   rA   Fc                 C   s<   t dd |  D }|rt| jj d|d dd |S )Nc                 s   s    | ]}|  V  qd S r   )Znumel)r   pr   r   r   r   B   s    zcount_params.<locals>.<genexpr>z has gư>z.2fz
 M params.)sum
parametersr&   	__class____name__)modelverboseZtotal_paramsr   r   r   count_paramsA   s   rI   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targetZ__is_first_stage__Z__is_unconditional__z%Expected key `target` to instantiate.paramsr   )KeyErrorget_obj_from_strgetdict)configr   r   r   instantiate_from_configJ   s    rQ   c                 C   s<   |  dd\}}|rt|}t| ttj|d d|S )N.r   )package)rsplit	importlibimport_modulereloadgetattr)stringrW   moduleclsZ
module_impr   r   r   rM   T   s
   

rM   c                       sL   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formatrO   super__init__)selfrK   rb   rc   rd   re   rf   rg   rh   ri   defaultsrE   r   r   rm   ^   s:   	zAdamWwithEMAandWings.__init__c                    s(   t  | | jD ]}|dd q	d S )Nrf   F)rl   __setstate__param_groups
setdefault)rn   stategrouprp   r   r   rq      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.
        Nrf   rc   rg   rh   rK   z'AdamW does not support sparse gradientsr   step)Zmemory_formatZexp_avgZ
exp_avg_sqZmax_exp_avg_sqZparam_exp_avgr   rb   re   rd   F)rf   beta1beta2rb   re   rd   Zmaximize)alpha)r+   Zenable_gradrr   Zgradr)   Z	is_sparseRuntimeErrorrt   r   Z
zeros_likeZpreserve_formatdetachfloatcloner   Z_functionalZadamwminzipZmul_Zadd_)rn   closureZlossru   Zparams_with_gradZgradsZexp_avgsZexp_avg_sqsZema_params_with_gradZmax_exp_avg_sqsZstate_stepsrf   rw   rx   rg   rh   rB   rt   Zcur_ema_decayparamZ	ema_paramr   r   r   rv      s   








zAdamWwithEMAandWings.step)r]   r^   r_   r`   Fra   r   r   r   )	rF   
__module____qualname__rm   rq   r+   Zno_gradrv   __classcell__r   r   rp   r   r\   \   s    %r\   )r   )F)rU   inspectr   numpyr'   r+   ZPILr   r   r   r   r0   r9   r:   r;   r>   rA   rI   rQ   rM   Z	Optimizerr\   r   r   r   r   <module>   s     

	

