U
    -e                     @   s   d dl Z d dlmZmZ d dlmZ ddlmZmZ e	e
ZG dd dZedd	 Zd
d Zdd Zee jedddZdS )    N)PoolRLock)tqdm   )experimentalloggingc                   @   s   e Zd ZdZdS )ParallelBackendConfigN)__name__
__module____qualname__backend_name r   r   [/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/datasets/parallel/parallel.pyr      s   r   c                 C   s2   t jdkrt| ||||||S t| ||||||S )a  
    **Experimental.** Apply a function to iterable elements in parallel, where the implementation uses either
    multiprocessing.Pool or joblib for parallelization.

    Args:
        function (`Callable[[Any], Any]`): Function to be applied to `iterable`.
        iterable (`list`, `tuple` or `np.ndarray`): Iterable elements to apply function to.
        num_proc (`int`): Number of processes (if no backend specified) or jobs (using joblib).
        types (`tuple`): Additional types (besides `dict` values) to apply `function` recursively to their elements.
        disable_tqdm (`bool`): Whether to disable the tqdm progressbar.
        desc (`str`): Prefix for the tqdm progressbar.
        single_map_nested_func (`Callable`): Map function that applies `function` to an element from `iterable`.
            Takes a tuple of function, data_struct, types, rank, disable_tqdm, desc as input, where data_struct is an
            element of `iterable`, and `rank` is used for progress bar.
    N)r   r   _map_with_multiprocessing_pool_map_with_joblibfunctioniterablenum_proctypesdisable_tqdmdescsingle_map_nested_funcr   r   r   parallel_map   s    
      r   c              	   C   sr  |t |kr|nt |}g }t|D ]d}t || }	t || }
|	| t||
 }||	 ||
k rddnd }|| ||| ||||f q$t |tdd |D krtdt | dtdd |D  td| d	t | d
dd |D   d\}}|st ft	j
 }}t|||d}|||}W 5 Q R X td| d dd |D }tdt | d |S )N   r   c                 s   s   | ]}t |d  V  qdS r   Nlen.0ir   r   r   	<genexpr>3   s     z1_map_with_multiprocessing_pool.<locals>.<genexpr>zHError dividing inputs iterable among processes. Total number of objects z
, length: c                 s   s   | ]}t |d  V  qdS r   r   r   r   r   r   r!   5   s     z	Spawning z processes for z objects in slices of c                 S   s   g | ]}t |d  qS )r   r   r   r   r   r   
<listcomp>;   s     z2_map_with_multiprocessing_pool.<locals>.<listcomp>)NN)initargsinitializerz	Finished z
 processesc                 S   s   g | ]}|D ]}|qqS r   r   )r   Zproc_resobjr   r   r   r"   C   s       z	Unpacked z objects)r   rangeminappendsum
ValueErrorloggerinfor   r   Zset_lockr   map)r   r   r   r   r   r   r   Z
split_kwdsindexdivmodstartendr#   r$   poolZmappedr   r   r   r   )   s0      "r   c              
      sP   dd l jtj|d.   fdd|D W  5 Q R  S Q R X d S )Nr   )Zn_jobsc                 3   s(   | ] }  |d dd fV  qd S )NT)Zdelayed)r   r%   r   joblibr   r   r   r   r!   O   s    z#_map_with_joblib.<locals>.<genexpr>)r5   parallel_backendr   r   ZParallelr   r   r4   r   r   I   s
    r   )r   c                 c   s8   | t _| dkr ddlm} |  z
dV  W 5 dt _X dS )a  
    **Experimental.**  Configures the parallel backend for parallelized dataset loading, which uses the parallelization
    implemented by joblib.

    Args:
        backend_name (str): Name of backend for parallelization implementation, has to be supported by joblib.

     Example usage:
     ```py
     with parallel_backend('spark'):
       dataset = load_dataset(..., num_proc=2)
     ```
    Zsparkr   )register_sparkN)r   r   Zjoblibsparkr7   )r   r7   r   r   r   r6   T   s    
r6   )
contextlibmultiprocessingr   r   Z	tqdm.autor   utilsr   r   Z
get_loggerr	   r+   r   r   r   r   contextmanagerstrr6   r   r   r   r   <module>   s   

 