o
    ॵi                     @   sv   d dl Z d dlmZ d dlZd dlmZ d dlmZ ddl	m
Z
 dddZdd
dZG dd dZdejfddZdS )    N)Iterableget_terminal_size   )Timerfile "{}" does not existc                 C   s   t | st|| d S N)ospisfileFileNotFoundErrorformat)filenamemsg_tmpl r   T/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/preprocessors/cv/util.pycheck_file_exist   s   
r     c                 C   s*   | dkrd S t | } tj| |dd d S )N T)modeexist_ok)r	   
expanduserosmakedirs)dir_namer   r   r   r   mkdir_or_exist   s   
r   c                   @   sB   e Zd ZdZdddejfddZedd Zd	d
 Z	dddZ
dS )ProgressBarz,A progress bar which can print the progress.r   2   Tc                 C   s,   || _ || _d| _|| _|r|   d S d S )Nr   )task_num	bar_width	completedfilestart)selfr   r   r!   r    r   r   r   __init__   s   zProgressBar.__init__c                 C   s   t  \}}|S r   r   )r"   width_r   r   r   terminal_width$   s   
zProgressBar.terminal_widthc                 C   sP   | j dkr| jdd| j  d| j  d n| jd | j  t | _d S )Nr   [ z] 0/z, elapsed: 0s, ETA:zcompleted: 0, elapsed: 0s)r   r    writer   flushr   timer)r"   r   r   r   r!   )   s
   
$
zProgressBar.startr   c           
      C   sH  |dksJ |  j |7  _ | j }|dkr| j | }ntd}| jdkr| j t| j }t|d|  | d }d| j  d| j d|dd	t|d  d
|dd}t| jt| jt	| d t| jd }t
d|}t|| }d| d||   }	| j||	 n| jd| j  dt|d  d|dd | j  d S )Nr   infr   g      ?z[{}] /z, z.1fz task/s, elapsed: zs, ETA: 5s   g333333?>r(   zcompleted: z, elapsed: zs, z tasks/s)r   r+   since_startfloatr   intminr   r&   lenmaxr    r)   r   r*   )
r"   	num_taskselapsedfps
percentageetamsgr   
mark_width	bar_charsr   r   r   update2   s<   



zProgressBar.updateN)r   )__name__
__module____qualname____doc__sysstdoutr#   propertyr&   r!   r@   r   r   r   r   r      s    
	r   r   c           	      K   s   t |tr(t|dksJ t |d tsJ t |d tsJ |d }|d }nt |tr2t|}ntdt|||d}g }|D ]}|| |fi | |  qA|j	
d |S )at  Track the progress of tasks execution with a progress bar.
    Tasks are done with a simple for-loop.
    Args:
        func (callable): The function to be applied to each task.
        tasks (list or tuple[Iterable, int]): A list of tasks or
            (tasks, total num).
        bar_width (int): Width of progress bar.
    Returns:
        list: The task results.
    r0   r   r   z="tasks" must be an iterable object or a (iterator, int) tuple)r    
)
isinstancetupler6   r   r4   	TypeErrorr   appendr@   r    r)   )	functasksr   r    kwargsr   prog_barresultstaskr   r   r   track_progressO   s$   




rS   )r   )r   )r   os.pathpathr	   rE   collections.abcr   shutilr   r+   r   r   r   r   rF   rS   r   r   r   r   <module>   s   

6