o
    i                     @   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	m
Z
mZ d dlZd dlmZ dd Zd	d
 Zdd Zdd Zedd Zdd Zddddddde	fddZdS )    Nwraps)
ThreadPool)Thread)CallableDictList)tqdmc                    s   t   fdd}|S )Nc                     s*   t  }|jd  g| R i |I d H S N)asyncioget_event_looprun_in_executor)argskwargsloopfunc C/data/cameron/da3_repo/src/depth_anything_3/utils/parallel_utils.pywrapper   s    z async_call_func.<locals>.wrapperr   )r   r   r   r   r   async_call_func   s   r   c                 C   s   t d g| t | | | g S r
   )slice)Zchunk_index	chunk_dim
chunk_sizer   r   r   <lambda>#   s    r   c                    s    fdd}|S )Nc                     s   t  | |d  d S )N)targetr   r   )r   start)r   r   fnr   r   r   )   s   zasync_call.<locals>.wrapperr   )r   r   r   r   r   
async_call(   s   r   c                 C   s&   t jt j|dd t||  dS )zGCommon implementation for saving images synchronously or asynchronouslyT)exist_okN)osmakedirspathdirnameimageioimwriteZsave_imgZ	save_pathr   r   r   _save_image_impl/   s   r(   c                 C      t | | dS )zSave image asynchronouslyNr(   r'   r   r   r   save_image_async5   s   r+   c                 C   r)   )zSave image synchronouslyNr*   r'   r   r   r   
save_image;   s   r,       F)num_processesprint_progress
sequentialasync_returndescactionc                 O   s"  t |}dtdtfdd}dtdtdtdtfdd}	|sft|d	}
g }g }|||}t|D ]}|	||||\}}|
| ||}|| q.|sdt||| d
D ]	}||	  qP|

  |
  |S |
S g }|||}tt||| d
D ]}|	||||\}}| |i |}|| qw|S )Nr   r   c                 S   sH   | D ]}t |trt|  S q| D ]}t |tr!t|  S qtr
   )
isinstancelistlenvaluesNotImplementedError)r   r   avr   r   r   
get_lengthP   s   

z&parallel_execution.<locals>.get_lengthlengthic                    s2    fdd|D } fddD }||fS )Nc                    s.   g | ]}t |trt|kr|  n|qS r   r4   r5   r6   ).0arg)r=   r<   r   r   
<listcomp>Z   s    "z?parallel_execution.<locals>.get_action_args.<locals>.<listcomp>c                    s@   i | ]}|t | trt| kr|   n| qS r   r>   )r?   keyr=   r   r<   r   r   
<dictcomp>^   s    z?parallel_execution.<locals>.get_action_args.<locals>.<dictcomp>r   )r<   r   r   r=   action_argsaction_kwargsr   rC   r   get_action_argsY   s   z+parallel_execution.<locals>.get_action_args)	processes)r2   disable)r5   r   r   intr   rangeZapply_asyncappendr	   getclosejoin)r3   r.   r/   r0   r1   r2   r   r   r;   rG   poolresultsZasyncsr<   r=   rE   rF   Zasync_resultr   r   r   parallel_execution@   s4   	


rR   )r   r!   	functoolsr   Zmultiprocessing.poolr   	threadingr   typingr   r   r   r%   r	   r   Z
slice_funcr   r(   r+   r,   rR   r   r   r   r   <module>   s.   

