o
    }oiv                     @   s  d dl Z d dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlZd dlZd dlmZmZ d dlmZ G dd	 d	ejj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d.ddZ	d/d"e fd#d$Z!d0d%d&Z"d'd( Z#d)d* Z$d+d, Z%dS )1    N)abc)
isfunction)Queue)Thread)Image	ImageDraw)loggingc                       s   e Zd Z fddZ  ZS )DataParallelWrapperc                    s.   zt  |W S  ty   t| j| Y S w N)super__getattr__AttributeErrorgetattrmodule)selfname	__class__ l/home/ubuntu/.local/lib/python3.10/site-packages/nemo/collections/multimodal/parts/stable_diffusion/utils.pyr      s
   zDataParallelWrapper.__getattr__)__name__
__module____qualname__r   __classcell__r   r   r   r   r	      s    r	   
   c              	      s   t }t }t|D ][ tjd| dd}t|}td| d d  d fdd	tdt   D }z
|j	d
|dd W n t
yR   td Y nw t|dddd d }|| qt|}t|}|S )NRGBwhite)color(   r      
c                 3   s$    | ]}  ||  V  qd S r
   r   ).0startbincxcr   r   	<genexpr>-   s   " z!log_txt_as_img.<locals>.<genexpr>)r   r   black)fillz)Cant encode string for logging. Skipping.      g     _@g      ?)lenlistranger   newr   DrawintjointextUnicodeEncodeErrorr   infonparray	transposeappendstacktorchtensor)whr&   sizebtxtstxtdrawlinesr   r#   r   log_txt_as_img$   s"   
,

rD   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   rN   c                 C   s:   t | tjsdS t| jdko| jd dkp| jd dkS rE   rH   rL   r   r   r   isimageA   s   *rO   c                 C   s   | d uS r
   r   rL   r   r   r   existsG   s   rP   c                 C   s   t | r| S t|r| S |S r
   )rP   r   )valdr   r   r   defaultK   s   rS   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,   rK   )r<   r   r   r   	mean_flatQ   s   rV   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'   Z   s    zcount_params.<locals>.<genexpr>z has gư>z.2fz
 M params.)sum
parametersr   r5   r   r   )modelverbosetotal_paramsr   r   r   count_paramsY   s    r^   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_config`   s    rh   c                 C   sT   |  dd\}}td| d| d |r t|}t| ttj|d d|S )N.r+   zGetting module=<z>, cls=<>)package)rsplitr   r5   	importlibimport_modulereloadr   )stringro   r   cls
module_impr   r   r   rd   j   s   

rd   c                 C   s6   |r	| ||d}n| |}| ||g | d d S )N)	worker_idDone)put)funcQdataidx	idx_to_fnresr   r   r   _do_parallel_data_prefetchs   s
   r|   ndarrayTrv   c                    s  t tjr|dkrtdt tjr3t tr$td t	
 |dkr.tnt	n
tdt d|rHtd tj}ntd t}|dkrd fdd	tt|D }n5t| d
krvtt| d ntt|  fdd	tfdd	td
tD D }g }t|D ]}	|t||	 d}
||
g7 }qtd d
d l}| }dd	 t|D }zcz*|D ]}
|
  qd
}||k r  }|dkr|d7 }n|d ||d
 < ||k sW n ty } ztd| |D ]}
|
  q|d }~ww W |D ]}
|
  qtd| |  d n|D ]}
|
  q+td| |  d w |dkrbt |d
 tjs[tjdd	 |D d
dS tj|d
dS |dkrvg }|D ]}|| qk|S |S )Nr-   z'list expected but function got ndarray.zpWARNING:"data" argument passed to parallel_data_prefetch is a dict: Using only its values and disregarding keys.r}   zjThe data, that shall be processed parallel has to be either an np.ndarray or an Iterable, but is actually ri   i  c                       g | ]\}} ||gqS r   r   r!   ipartrw   rv   use_worker_idr   r   
<listcomp>   s    z*parallel_data_prefetch.<locals>.<listcomp>r   r+   c                    r~   r   r   r   r   r   r   r      s    c                    s   g | ]
} ||  qS r   r   )r!   r   )rx   stepr   r   r      s    )r_   argszStart prefetching...c                 S   s   g | ]}g qS r   r   )r!   _r   r   r   r      s    rt   zException: zPrefetching complete. [z sec.]c                 S   s   g | ]}t |qS r   )r6   asarray)r!   rr   r   r   r      s    )axis) rI   r6   r}   
ValueErrorr   Iterablerf   r   r5   r-   valuesr   	TypeErrortypempr   Processr   	enumeratearray_splitr,   r1   r.   r|   timer"   re   	Exception	terminater2   concatenateextend)rv   rx   n_proctarget_data_typecpu_intensiver   proc	arguments	processesr   rX   r   r"   
gather_reskr{   eoutr   r   )rw   rx   rv   r   r   r   parallel_data_prefetch   s   


$4"




r   c                 C   s   | S )zbOverwrite model.train with this function to make sure train/eval mode
    does not change anymore.r   )r   moder   r   r   disabled_train   s   r   c                 C   s:   || j  }|dk rtd| j  d| d| dd|   S )zNAppends dimensions to the end of a tensor until it has target_dims dimensions.r   z
input has z dims but target_dims is z, which is less).r
   )ndimr   )rM   target_dimsdims_to_appendr   r   r   append_dims   s   
r   c                 C   s.   |   |  kr| d} |   |  ks| S )N)rT   	unsqueeze)rM   yr   r   r   expand_dims_like   s   
r   c                 C   s   t | | dggS )Nr+   )r;   cat	new_zerosrL   r   r   r   append_zero   s   r   )r   )F)r}   TF)T)&rm   multiprocessingr   collectionsr   inspectr   queuer   	threadingr   numpyr6   r;   PILr   r   
nemo.utilsr   nnDataParallelr	   rD   rN   rO   rP   rS   rV   r^   rh   rd   r|   callabler   r   r   r   r   r   r   r   r   <module>   s:   




	

U