o
    ߥi^                     @   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bincxcr   Y/home/ubuntu/.local/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   Drawr   truetypeintjointextUnicodeEncodeErrorprintnparray	transposeappendstacktorchtensor)	whr   r   btxtstxtdrawr   linesr   r   r   log_txt_as_img
   s(   


r7   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   rA   c                 C   s:   t | tjsdS t| jdko| jd dkp| jd dkS r8   r;   r?   r   r   r   isimage)   s   *rB   c                 C   s   | d uS r   r   r?   r   r   r   exists/   s   rC   c                 C   s   t | r| S t|r| S |S r   )rC   r   )valdr   r   r   default3   s   rF   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>   )r0   r   r   r   	mean_flat9   s   rI   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   B   s    zcount_params.<locals>.<genexpr>z has gư>z.2fz
 M params.)sum
parametersr)   	__class____name__)modelverbosetotal_paramsr   r   r   count_paramsA   s   rS   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_configJ   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)stringrc   modulecls
module_impr   r   r   rY   T   s
   

rY   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formatr[   super__init__)selfrW   ro   rp   rq   rr   rs   rt   ru   rv   defaultsrN   r   r   rz   ^   s:   	zAdamWwithEMAandWings.__init__c                    s(   t  | | jD ]}|dd q	d S )Nrs   F)ry   __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 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.
        Nrs   rp   rt   ru   rW   z'AdamW does not support sparse gradientsr   step)memory_formatexp_avg
exp_avg_sqmax_exp_avg_sqparam_exp_avgr   ro   rr   rq   F)rs   beta1beta2ro   rr   rq   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_sqsema_params_with_gradmax_exp_avg_sqsstate_stepsrs   r   r   rt   ru   rK   r   cur_ema_decayparam	ema_paramr   r   r   r      s   








zAdamWwithEMAandWings.step)rj   rk   rl   rm   Frn   r   r   r   )	rO   
__module____qualname__rz   r~   r/   no_gradr   __classcell__r   r   r}   r   ri   \   s    %ri   )r   )F)ra   inspectr   numpyr*   r/   PILr   r   r   r   r7   rA   rB   rC   rF   rI   rS   r]   rY   	Optimizerri   r   r   r   r   <module>   s     

	

