o
    "ѹg!                    @   s  d Z ddlZddlZddlZddlZddlZ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mZ ddlmZ ddlZddlZdd	lmZ dd
lmZmZ ddlmZ ddlmZmZ ddlmZ ddlmZmZ ddl m!Z!m"Z"m#Z#m$Z$m%Z% edurddl&m'Z' ddl(m)Z) zddl*Z*W n e+y   dZ*Y nw zddl,m-Z- W n e+y   dZ-Y nw zddl.Z.W n e+y   dZ.Y nw ddl/m0Z0 ddl/m1Z1 ddl/m2Z2 ddl/m3Z3 ddl/m4Z4 ddl5m6Z6m7Z7 ddl5m8Z8 ddl5m9Z9 ddl5m:Z: ddl5m;Z;m<Z< ddl5mZm=Z=m>Z> e=? Z@e@Add dgeBe=C  ZDeDd d! e=D 7 ZDedu r8g ZEndd"gZEeEd#g ZFeGed$rOeDHeId% e=e> ZJd&d' ZKd(d) ZLd*d+ ZMG d,d- d-eNZOdPd/d0ZPd1d2 ZQdQd3d4ZRd5d6 ZSd7d8 ZTd9d: ZUd;d< ZVe!d=e8e9gejWj!d>d?d@e;d@dAfdBgg dCdDedEdF ZXe!dGeDe!dHg dIe!dJg dKdLdM ZYe!dGeDdNdO ZZdPdQ Z[ee!dRg dSdTdU Z\ee!dGg dVdWdX Z]dYdZ Z^e!d[e=e!d\e=d]d^ Z_d_d` Z`edadb Zadcdd Zbe!dHg dedfdg Zce!dGeFdhdi Zdedjdk Zeeee!dlg dmdndo Zfe!dGeFdpdq Zgee!dGeFdrds Zhee!dGeEdtdu Ziee!dGe=dvdw Zjdxdy Zke!dGe=e!dzdg d{fd|g d}fgd~d Zlee!dGeFdd Zmdd Znee!dGeEdd Zodd Zpdd Zqdd Zree!dGeFejWjsdddd ZtG dd de0Zudd Zve!dGeDdd Zwee!dGeFe!dHg ddd Zxdd Zydd Zze$edudddd Z{dd Z|eFdd Z}e}~dd! edD  ee!dGe}e!d=e9e8gdd ZG dd de0Ze!d=e8e9gdd Ze!d=e8e9gdd Zdd Zdd ZG dd dejj4Ze:de ee!dGg de!d=e8e9gdd Zee!dHg de!dGeFe!d=e8e9gdd Zdd Zee!deFe!deFe!d=e8e9gdd Zee!d=e8e9ge!ddd.gdd Ze!dg dĢddƄ Ze!dg dȢddʄ Zedd̄ Zeee!dGeEdd΄ ZdZee!dGeEddф ZdZdZdZdZee!dGeEedu rg nd%g e!deeege!dg dآddڄ Zdjejejejd܍Zeddބ Zdjejejejd܍Zedd Zdd Zdd Zdd Zeee!dGeEdd Zdd Zeedd Zdd Zdd ZejW!dHg ddd Zdd Zdd ZejW!dHdd|gee!dGee@dh dd ZejW!dHdd@ge!d=e8e9ge$e.du dddd Ze!dGeDe!dHg d dd Zdd Zdd Zee!dGe@e!ddd	ge!dHg d d
d ZeejW!dHdd@ge!ddd	ge!d=e8e9ge$e.du dddd Ze!dGe@e!ddd	ge!dHg d dd Ze!dGe@e!ddd	ge!dHg d dd Ze!dGe@e!ddd	ge!ddd	ge!dHg d dd Ze!dg de!ddd	ge!ddd	gdd Zeee!dGeEdd Ze!dGedu rdd#gng ddd Zee!dGeEdd  Zee!d=e8e9gd!d" Ze!d=e8e9gd#d$ Zd%d& ZdRd'd(Zee!dGd"d#ge!d=e8e9gd)d* Zee!d=e8e9ge$e.du ddd+d, ZdSd-d.ZejWje!d=e8e9ge!dGedu r4d#gnd"d#gd/d0 Zd1d2 Ze!dGedurRdd"gndge$e-du d3dd4d5 Ze!d=e8e9ge$e.duddd6d7 Ze!d=e8e9gd8d9 ZƐd:d; Zǐd<d= ZȐd>d? Zɐd@dA Zeee!dHg dBdCdD Zeee!dEg dFe!dHdd@ge!d=e8e9gdGdH Zee!dHdd@ge!dIg dJe!d=e8e9gdKdL Zee!dHg dMdNdO ZdS (T  z
Test the parallel module.
    N)format_exceptionsqrt)sleep)PicklingError)nullcontextTimeoutErrorparallel)dumpload)mp)np
with_numpy)with_multiprocessing)IS_PYPYforce_gc_pypy)parametrizeraisescheck_subprocess_callskipifwarns)get_reusable_executor)Queue   )parallel_sum)SequentialBackend)ThreadingBackend)MultiprocessingBackend)ParallelBackendBase)LokyBackend)Paralleldelayed)parallel_config)parallel_backend)register_parallel_backend)effective_n_jobs	cpu_count)r   BACKENDSDEFAULT_BACKENDmultiprocessingc                 C   s   g | ]}t |  qS  )r)   ).0Zbackend_strr,   r,   ]/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/site-packages/joblib/test/test_parallel.py
<listcomp>M   s    r/   loky	threadingget_contextspawnc                 C   s   t | dt | dd S )N_poolZ_workers)getattrbackendr,   r,   r.   get_workers[   s   r8   c                 C   s   | | S Nr,   )xyr,   r,   r.   division_      r<   c                 C      | d S N   r,   r:   r,   r,   r.   squarec   r=   rB   c                   @   s   e Zd ZdZdd ZdS )MyExceptionWithFinickyInitz1An exception class with non trivial __init__
    c                 C      d S r9   r,   )selfabcdr,   r,   r.   __init__j      z#MyExceptionWithFinickyInit.__init__N__name__
__module____qualname____doc__rJ   r,   r,   r,   r.   rC   g   s    rC   Fc                 C   s"   | dkr|rt ddddt| S )N   rF   rG   rH   rI   )rC   
ValueError)r:   custom_exceptionr,   r,   r.   exception_raisern   s   rT   c                 C   s   t d t)Ng?)timer   KeyboardInterruptrA   r,   r,   r.   interrupt_raiseru   s   
rW   c                 C   s   | d | | S )zO A module-level function so that it can be spawn with
    multiprocessing.
    r@   Nr,   )r:   r;   zr,   r,   r.   fz   s   rY   c                   C   s   t t d S Nr   )typer   get_active_backendr,   r,   r,   r.   _active_backend_type   s   r]   c                 C   s   t | |ddd tdD S )Nn_jobsr7   c                 s       | ]	}t t|V  qd S r9   r#   rB   r-   ir,   r,   r.   	<genexpr>       
z parallel_func.<locals>.<genexpr>   r"   range)inner_n_jobsr7   r,   r,   r.   parallel_func   s   rj   c                   C      t  dksJ d S rZ   )r(   r,   r,   r,   r.   test_cpu_count      rl   c                   C   rk   rZ   r'   r,   r,   r,   r.   test_effective_n_jobs   rm   ro   contextzbackend_n_jobs, expected_n_jobs)rf   rf   r_   Nr   )zpositive-intznegative-intNone)idsc                 C   sT   | d|d t d d|ksJ W d    n1 sw   Y  t d ddks(J d S )Nr1   rr   r   rn   )rp   Zbackend_n_jobsZexpected_n_jobsr,   r,   r.   test_effective_n_jobs_None   s   
rv   r7   r_   )r   r@   rq   verbose)r@      d   c                 C   s:   dd t dD t|| |ddd t dD ksJ d S )Nc                 S      g | ]}t |qS r,   rB   r-   r:   r,   r,   r.   r/          z(test_simple_parallel.<locals>.<listcomp>   )r_   r7   rx   c                 s   r`   r9   ra   r}   r,   r,   r.   rd      re   z'test_simple_parallel.<locals>.<genexpr>rh   r"   )r7   r_   rx   r,   r,   r.   test_simple_parallel   s   r   c                 C   s   |j t ddd tjdd}td| ddd	 td
D }|g dks(J W d    n1 s2w   Y  dd |D }t|dksFJ d S )NnameZ!some_new_name_for_the_main_thread)targetr   valueTrecordr@   r^   c                 s   r`   r9   ra   r}   r,   r,   r.   rd      re   z6test_main_thread_renamed_no_warning.<locals>.<genexpr>rf   )r   r      c                 S   s   g | ]}d t |jvr|qS )zworker timeout)strmessager-   wr,   r,   r.   r/          z7test_main_thread_renamed_no_warning.<locals>.<listcomp>r   )setattrr1   current_threadwarningscatch_warningsr"   rh   len)r7   monkeypatchwarninforesultsr,   r,   r.   #test_main_thread_renamed_no_warning   s   r   c                 C   s   t jdd}t d t| |d W d    n1 sw   Y  dd |D }|rN|rLtdd |D }ttjd	d
rBt|dknt|dk}|oK|S d
S |rRJ dS )NTr   always)r7   ri   c                 S   s   g | ]}|j qS r,   )r   r   r,   r,   r.   r/      s    z*_assert_warning_nested.<locals>.<listcomp>c                 s   s    | ]
}d |j d v V  qdS )zbacked parallel loops cannotr   N)args)r-   Zeachr,   r,   r.   rd      
    
z)_assert_warning_nested.<locals>.<genexpr>ZnogilFr   )	r   r   simplefilterrj   allr5   sysflagsr   )r7   ri   expectedr   Zwarnings_are_correctZwarnings_have_the_right_lengthr,   r,   r.   _assert_warning_nested   s"   

r   z%parent_backend,child_backend,expected))r0   r+   T)r0   r0   F)r+   r+   T)r+   r0   T)r1   r+   T)r1   r0   Tc                    s   t d| d fddtdD  t d| d fddtdD }| dkr;tr3t|s3tjdd	 t|s9J d S t|sAJ d S )
Nr@   r^   c                 3   s"    | ]}t t d ddV  qdS )r   Fr7   ri   r   Nr#   r   r-   _child_backendr,   r.   rd          
z0test_nested_parallel_warnings.<locals>.<genexpr>r   c                 3   s"    | ]}t t d dV  qdS )r@   r   Nr   r   r   r   r,   r.   rd      r   r1   zThis test often fails in PyPy.reason)r"   rh   r   anypytestxfailr   )parent_backendr   r   resr,   r   r.   test_nested_parallel_warnings   s   r   )r0   r+   r1   c                 C   s>   dg}dd }t j||fd}|  |  |d sJ d S )NFc                 S   sh   t jdd}tdddd tdD  W d    n1 sw   Y  tt| t|dk| d< d S )	NTr   r@   rr   c                 s       | ]	}t td V  qdS )皙?Nr#   r   r   r,   r,   r.   rd     re   zPtest_background_thread_parallelism.<locals>.background_thread.<locals>.<genexpr>r   r   )r   r   r"   rh   printr   )is_run_parallelr   r,   r,   r.   background_thread  s   
z=test_background_thread_parallelism.<locals>.background_thread)r   r   r   )r1   Threadstartjoin)r7   r   r   tr,   r,   r.   "test_background_thread_parallelism  s   r   c                 C   s"   t d| ddd tdD  d S )Nr@   r^   c                 s   r   ){Gz?Nra   r   r,   r,   r.   rd     re   znested_loop.<locals>.<genexpr>rg   r6   r,   r,   r.   nested_loop  s   r   r   r   c                    s&   t d| d fddtdD  d S )Nr@   r^   c                 3       | ]	}t t V  qd S r9   )r#   r   r   r   r,   r.   rd   !  re   z#test_nested_loop.<locals>.<genexpr>rg   )r   r   r,   r   r.   test_nested_loop  s   r   c                 C   s   t r9   )rR   r6   r,   r,   r.   raise_exception%  rK   r   c               	   C   s   t t5 tddd} | ttdttdg W d    n1 s$w   Y  W d    d S W d    d S 1 s<w   Y  d S )Nr@   r0   r^   )r   rR   r"   r#   r   r   r
   r,   r,   r.   )test_nested_loop_with_exception_with_loky)  s   

"r   c                      s<   t dd tddd fddtdD    sJ dS )	z1Input is mutable when using the threading backendr   )maxsizer@   r1   r^   c                 3   s    | ]
}t  jd V  qdS r   N)r#   putr   qr,   r.   rd   4      
z1test_mutate_input_with_threads.<locals>.<genexpr>N)r   r"   rh   fullr,   r,   r   r.   test_mutate_input_with_threads1  s
   
r   )r   r@   rf   c                 C   s6   t d}dd |D t| ddd |D ksJ dS )z.Check the keyword argument processing of pmap.
   c                 S      g | ]}t |d dqS r   r;   rY   r}   r,   r,   r.   r/   =      z(test_parallel_kwargs.<locals>.<listcomp>rr   c                 s        | ]}t t|d dV  qdS r   r   Nr#   rY   r}   r,   r,   r.   rd   >      z'test_parallel_kwargs.<locals>.<genexpr>Nr   )r_   lstr,   r,   r.   test_parallel_kwargs9  s   r   c                 C   s   t d}dd |D }td| d4}|j}||dd |D ks"J ||dd |D ks/J td ur>t|t|ju s>J W d    n1 sHw   Y  td urZt|jd u sZJ ||d	d |D ksgJ td urtt|jd u svJ d S d S )
Nr   c                 S   r   r   r   r}   r,   r,   r.   r/   D  r   z4test_parallel_as_context_manager.<locals>.<listcomp>r   r^   c                 s   r   r   r   r}   r,   r,   r.   rd   M  r   z3test_parallel_as_context_manager.<locals>.<genexpr>c                 s   r   r   r   r}   r,   r,   r.   rd   N  r   c                 s   r   r   r   r}   r,   r,   r.   rd   Z  r   )rh   r"   _backendr   r8   )r7   r   r   pZmanaged_backendr,   r,   r.    test_parallel_as_context_managerA  s"   r   c                      sd   G dd dt  ttdd tddd fdd	td
D  W d   dS 1 s+w   Y  dS )ze Check that pmap captures the errors when it is passed an object
        that cannot be pickled.
    c                   @   s   e Zd Zdd ZdS )z1test_parallel_pickling.<locals>.UnpicklableObjectc                 S      t d)NZ123)RuntimeErrorrE   r,   r,   r.   
__reduce__e  r=   z<test_parallel_pickling.<locals>.UnpicklableObject.__reduce__N)rM   rN   rO   r   r,   r,   r,   r.   UnpicklableObjectd  s    r   zthe task to sendmatchr@   r0   r^   c                 3   s    | ]
}t t  V  qd S r9   r#   idr   r   r,   r.   rd   i  s    z)test_parallel_pickling.<locals>.<genexpr>r   N)objectr   r   r"   rh   r,   r,   r   r.   test_parallel_pickling_  s   
"r   	byteorder)<>=c                    s   dd  t dd|  djj}tddd fd	d
tdD }|D ]\}}||ks4J ||jjks<J t j	| q*d S )Nc                 S   s   | | j jfS r9   )dtyper   rA   r,   r,   r.   inspect_byteorderr     z=test_parallel_byteorder_corruption.<locals>.inspect_byteorder   )r@   rf   i4r@   r0   r^   c                 3       | ]	}t  V  qd S r9   r#   r   r   r:   r,   r.   rd   y  re   z5test_parallel_byteorder_corruption.<locals>.<genexpr>rf   )
r   ZarangeZreshapeviewr   r   r"   rh   testingassert_array_equal)r   Zinitial_np_byteorderresultZ
x_returnedZbyteorder_in_workerr,   r   r.   "test_parallel_byteorder_corruptionm  s   r   c                 C   s0   t td| dddd tdD dksJ d S )Nr@      r_   r7   timeoutc                 s   r   )gMbP?Nr   r}   r,   r,   r.   rd     re   z0test_parallel_timeout_success.<locals>.<genexpr>r   )r   r"   rh   r6   r,   r,   r.   test_parallel_timeout_success  s
   r   c                 C   sN   t t td| dddd tdD  W d    d S 1 s w   Y  d S )Nr@   r   r   c                 s   r   r   Nr   r}   r,   r,   r.   rd     re   z-test_parallel_timeout_fail.<locals>.<genexpr>r   )r   r	   r"   rh   r6   r,   r,   r.   test_parallel_timeout_fail  s
   

"r   c              	   C   s  t d urtt td| ddd tddD  W d    n1 s$w   Y  tt td| ddd dD  W d    n1 sEw   Y  td| d}t|jd usZJ t|j}tt |dd tddD  W d    n1 szw   Y  t|jd usJ t|j|usJ d	d td
D |dd td
D ksJ t|j}tt |dd dD  W d    n1 sw   Y  t|jd usJ t|j|usJ dd td
D |dd td
D ksJ |j	|j
|j|jfW d    n	1 sw   Y  t|jd u sJ n!tt tdddd dD  W d    n	1 s2w   Y  tt tdddd tddD  W d    n	1 sVw   Y  tt tddddd tdD  W d    d S 1 s{w   Y  d S )Nr@   r^   c                 S      g | ]\}}t t||qS r,   r#   r<   r-   r:   r;   r,   r,   r.   r/         z&test_error_capture.<locals>.<listcomp>)r   r   )r   r   c                 S      g | ]}t t|qS r,   r#   rW   r}   r,   r,   r.   r/     r   c                 S   r   r,   r   r   r,   r,   r.   r/     r   c                 S   r   r   r   r}   r,   r,   r.   r/     r   r   c                 s   r   r   r   r}   r,   r,   r.   rd     r   z%test_error_capture.<locals>.<genexpr>c                 S   r   r,   r   r}   r,   r,   r.   r/     r   c                 S   r   r   r   r}   r,   r,   r.   r/     r   c                 s   r   r   r   r}   r,   r,   r.   rd     r   rr   c                 S   r   r,   r   r}   r,   r,   r.   r/     r   c                 S   r   r,   r   r   r,   r,   r.   r/     r   r   )r_   rx   c                 s   r   )T)rS   Nr#   rT   rb   r,   r,   r.   rd         r   )r   r   ZeroDivisionErrorr"   ziprV   r8   r   rh   
_iteratingZn_completed_tasksZn_dispatched_tasks	_abortingrC   )r7   r   Zoriginal_workersr,   r,   r.   test_error_capture  st   









$



$r  c              	   C   s  ddd}t d| dw}ttdd |dd	 |dd
D  W d    n1 s)w   Y  ttdd |dd	 |dd
D  W d    n1 sKw   Y  ttdd |dd	 |dd
D  W d    n1 smw   Y  W d    d S W d    d S 1 sw   Y  d S )Nr   c                 s   s*    t dD ]}|| krtd|V  qd S )N   Iterator Raising Error)rh   rR   )raise_atrc   r,   r,   r.   my_generator  s   z1test_error_in_task_iterator.<locals>.my_generatorr@   r^   r  r   c                 s   r`   r9   ra   rb   r,   r,   r.   rd         z.test_error_in_task_iterator.<locals>.<genexpr>)r	  c                 s   r`   r9   ra   rb   r,   r,   r.   rd     r  r   c                 s   r`   r9   ra   rb   r,   r,   r.   rd     r     r   )r"   r   rR   )r7   r
  r   r,   r,   r.   test_error_in_task_iterator  s   
"r  c                 C   s   |  d|  d S )NzConsumed %s)append)queueitemr,   r,   r.   consumer  rm   r  zbatch_size, expected_queue)
Produced 0
Consumed 0
Produced 1
Consumed 1
Produced 2
Consumed 2
Produced 3
Consumed 3
Produced 4
Consumed 4
Produced 5
Consumed 5r   )r  r  r  r  r  r  r  r  r  r  r  r  c                    sT   t    fdd}td|| d fdd| D   |ks J t dks(J dS )	zC Test that with only one job, Parallel does act as a iterator.
    c                  3   (    t dD ]}  d|   | V  qd S Nr   zProduced %irh   r  rc   r  r,   r.   producer  
   z'test_dispatch_one_job.<locals>.producerr   r_   
batch_sizer7   c                 3   s    | ]
}t t |V  qd S r9   r#   r  r}   r#  r,   r.   rd     r   z(test_dispatch_one_job.<locals>.<genexpr>   N)listr"   r   )r7   r'  Zexpected_queuer$  r,   r#  r.   test_dispatch_one_job  s   r+  c                    s   t  }|   fdd}tddd| d fdd| D  t }|d	 d
ks,J |dd d}|dks;J |d}||ksFJ t dksNJ dS )zW Check that using pre_dispatch Parallel does indeed dispatch items
        lazily.
    c                  3   r  r   r!  r"  r#  r,   r.   r$    r%  z/test_dispatch_multiprocessing.<locals>.producerr@   r   rf   )r_   r'  pre_dispatchr7   c                 3   s    | ]
}t t d V  qdS )r   Nr(  r   r#  r,   r.   rd   !  r   z0test_dispatch_multiprocessing.<locals>.<genexpr>r   r  Nr   zConsumed anyrq   r  r)  )r   Managerr*  r"   indexr   )r7   managerr$  Zqueue_contentsZfirst_consumption_indexZproduced_3_indexr,   r#  r.   test_dispatch_multiprocessing  s   
r0  c                  C   s\   t dddd} | dd tdD  | j dksJ W d    d S 1 s'w   Y  d S )	Nr@   autor1   r&  c                 s   r`   r9   r   rb   r,   r,   r.   rd   8  r  z/test_batching_auto_threading.<locals>.<genexpr>  r   r"   rh   r   Zcompute_batch_size)r   r,   r,   r.   test_batching_auto_threading2  s   "r4  c                 C   s\   t dd| d}|dd tdD  |j dksJ W d    d S 1 s'w   Y  d S )Nr@   r1  r&  c                 s   r`   r9   r   rb   r,   r,   r.   rd   @  r  z2test_batching_auto_subprocesses.<locals>.<genexpr>r2  r   r3  )r7   r   r,   r,   r.   test_batching_auto_subprocesses<  s   "r5  c                   C   sN   t t tdddddd tdD  W d   dS 1 s w   Y  dS )	zCMake sure that exception raised during dispatch are indeed capturedr@      r   )r_   r,  rx   c                 s   r`   r9   r   rb   r,   r,   r.   rd   K  re   z*test_exception_dispatch.<locals>.<genexpr>r   N)r   rR   r"   rh   r,   r,   r,   r.   test_exception_dispatchH  s
   

"r7  c                 C       t dddd tdD  d S )Nr@   rr   c                 s   r`   r9   r   r-   jr,   r,   r.   rd   P  re   z(nested_function_inner.<locals>.<genexpr>r   rg   r"  r,   r,   r.   nested_function_innerO     r;  c                 C   r8  )Nr@   rr   c                 s   r`   r9   )r#   r;  r9  r,   r,   r.   rd   U  re   z(nested_function_outer.<locals>.<genexpr>r   rg   r"  r,   r,   r.   nested_function_outerT  r<  r=  z'https://github.com/joblib/loky/pull/255r   c                 C   s   t t}td| ddd tdD  W d   n1 sw   Y  t|j|j|j}d|}d|v s7J d	|v s=J d
|v sCJ t|jtu sLJ dS )zEnsure errors for nested joblib cases gets propagated

    We rely on the Python 3 built-in __cause__ system that already
    report this kind of information to the user.
    r@   r^   c                 s   r`   r9   )r#   r=  rb   r,   r,   r.   rd   c  re   z1test_nested_exception_dispatch.<locals>.<genexpr>r   N r=  r;  rT   )	r   rR   r"   rh   r   r[   r   tbr   )r7   excinfoZreport_linesreportr,   r,   r.   test_nested_exception_dispatchY  s   
	

rB  c                   @   s$   e Zd ZdZdddZd	ddZdS )
FakeParallelBackendz8Pretends to run concurrently while running sequentially.r   Nc                 K   s   |  || _|| _|S r9   )r'   r_   r   )rE   r_   r   Zbackend_argsr,   r,   r.   	configuret  s   zFakeParallelBackend.configurec                 C   s"   |dk rt t d | d}|S )Nr   r   )maxr   r(   rE   r_   r,   r,   r.   r'   y  s   z$FakeParallelBackend.effective_n_jobsr   )r   )rM   rN   rO   rP   rD  r'   r,   r,   r,   r.   rC  q  s    
rC  c                	   C   s   t tdd tdd W d    n1 sw   Y  t tdd tdd W d    n1 s2w   Y  W d    n1 sAw   Y  t tdd& tdd W d    n1 s]w   Y  W d    d S W d    d S 1 suw   Y  d S )NzInvalid backend:r   zunit-testingr6   )r   rR   r"   r$   r,   r,   r,   r.   test_invalid_backend  s    "rG  c                 C   s,  t t}td| d  W d    n1 sw   Y  dt|jv s%J t t}td| d  W d    n1 s<w   Y  dt|jv sJJ t t}td| d  W d    n1 saw   Y  dt|jv soJ t t}td| d  W d    n1 sw   Y  dt|jv sJ d S )Nr   r^   z&n_jobs == 0 in Parallel has no meaning      ?z2.3z$n_jobs could not be converted to intZinvalid_str)r   rR   r"   Z_initialize_backendr   r   )r7   r@  r,   r,   r.   test_invalid_njobs  s    



rI  )2gffffff@r@   c                 C   sP   t || d}| dksJ |dd tdD }tdd t|D s&J d S )Nr^   r@   c                 s   r`   r9   ra   rb   r,   r,   r.   rd     r  z.test_njobs_converted_to_int.<locals>.<genexpr>r   c                 s   s     | ]\}}|t |kV  qd S r9   r|   )r-   rc   rr,   r,   r.   rd     r   )r"   _effective_n_jobsrh   r   	enumerate)r7   r_   r   r   r,   r,   r.   test_njobs_converted_to_int  s   rN  c                   C   s<   zt dt dtv sJ td tksJ W td= d S td= w )NZtest_backend)r&   rC  r)   r,   r,   r,   r.   test_register_parallel_backend  s
   
rO  c                   C   sT   t  tksJ ztdtd dd t  tksJ W tt_ntt_w t  tks(J d S )Nr1   T)Zmake_default)r]   DefaultBackendr&   r)   r   r*   r   r,   r,   r,   r.   test_overwrite_default_backend  s   
rQ  zOnly without multiprocessingc                   C   s   t tdd tdddd tdD  W d    n1 sw   Y  tdd t dd tdD  W d    d S 1 sAw   Y  d S )	Nz)joblib backend '.*' is not available on.*r   r0   r6   c                 s   r`   r9   ra   rb   r,   r,   r.   rd     r  z2test_backend_no_multiprocessing.<locals>.<genexpr>rf   c                 s   r`   r9   ra   rb   r,   r,   r.   rd     r  )r   UserWarningr"   rh   r$   r,   r,   r,   r.   test_backend_no_multiprocessing  s   "rS  c                 C   s^  | |dd t  \}}|dksJ tddksJ t }|jdks%J |dkr;t|tu s1J t|jtu s:J nB|dkrQt|tu sGJ t|jtu sPJ n4|dkrgt|t	u s]J t|jt	u sfJ n.|
drt|tu stJ t|jtu sJ W d    d S W d    d S W d    d S W d    d S W d    d S 1 sw   Y  d S )Nrf   rr   r+   r0   r1   Ztest_)r   r\   r'   r"   r_   r[   r   r   r!   r   
startswithrC  )rp   backend_nameactive_backendactive_n_jobsr   r,   r,   r.   check_backend_context_manager  s8   
"rX  c                 C   s   g | ]}d | qS )ztest_backend_%dr,   rb   r,   r,   r.   r/     r~   rf   c                    sl   |t vr| t |t t tksJ t | t tksJ tddd fddtD  t tks4J d S )Nr@   r1   r^   c                 3   s"    | ]}|st t |V  qd S r9   )r#   rX  )r-   rG   rp   r,   r.   rd     s    
z/test_backend_context_manager.<locals>.<genexpr>)r)   setitemrC  r]   rP  rX  r"    all_backends_for_context_manager)r   r7   rp   r,   rY  r.   test_backend_context_manager  s   
r\  c                   @   s   e Zd ZdZdddZdS )ParameterizedParallelBackendz9Pretends to run conncurrently while running sequentially.Nc                 C   s   |d u rt d|| _d S )Nzparam should not be None)rR   param)rE   r^  r,   r,   r.   rJ     s   
z%ParameterizedParallelBackend.__init__r9   rL   r,   r,   r,   r.   r]    s    r]  c                 C   s   |  tdt t tksJ |dddd? t \}}t|tu s$J |jdks+J |dks1J t	 }|j
dks;J |j|u sBJ |dd tdD }W d    n1 sWw   Y  |dd	 tdD ksiJ t tkspJ d S )
NZparam_backend*   rf   )r^  r_   c                 s   r`   r9   r#   r   rb   r,   r,   r.   rd     r  z=test_parameterized_backend_context_manager.<locals>.<genexpr>r   c                 S   r{   r,   r   rb   r,   r,   r.   r/     r~   z>test_parameterized_backend_context_manager.<locals>.<listcomp>)rZ  r)   r]  r]   rP  r   r\   r[   r^  r"   r_   r   rh   )r   rp   rV  rW  r   r   r,   r,   r.   *test_parameterized_backend_context_manager  s    	ra  c                 C   s   t  tksJ | tdddd? t \}}t|tu sJ |jdks&J |dks,J t }|jdks6J |j	|u s=J |dd t
dD }W d    n1 sRw   Y  |dd t
dD ksdJ t  tkskJ d S )	N+   )r^  r   rr   c                 s   r`   r9   r`  rb   r,   r,   r.   rd   (  r  zFtest_directly_parameterized_backend_context_manager.<locals>.<genexpr>c                 S   r{   r,   r   rb   r,   r,   r.   r/   )  r~   zGtest_directly_parameterized_backend_context_manager.<locals>.<listcomp>)r]   rP  r]  r   r\   r[   r^  r"   r_   r   rh   )rp   rV  rW  r   r   r,   r,   r.   3test_directly_parameterized_backend_context_manager  s   	rc  c                   C   s   t d t S )Nr   )r   osgetpidr,   r,   r,   r.   sleep_and_return_pid/  s   rf  c                   C   s<   t  tksJ t  dksJ tdddd tdD S )Nr   r@   rr   c                 s       | ]}t t V  qd S r9   )r#   rf  r   r,   r,   r.   rd   ;  s    z"get_nested_pids.<locals>.<genexpr>)r]   r   r"   rL  rh   r,   r,   r,   r.   get_nested_pids4  s
   rh  c                       s    e Zd ZdZ fddZ  ZS )	MyBackendz:Backend to test backward compatibility with older backendsc                    s   t t|  d S rZ   )superri  get_nested_backendr   	__class__r,   r.   rk  A  s   zMyBackend.get_nested_backend)rM   rN   rO   rP   rk  __classcell__r,   r,   rl  r.   ri  ?  s    ri  back_compat_backend)r1   r0   r+   ro  c                 C   sh   | |& t dddd tdD }|D ]}tt|dks!J qW d    d S 1 s-w   Y  d S )Nr@   rr   c                 s   rg  r9   )r#   rh  r   r,   r,   r.   rd   R  s
    
z6test_nested_backend_context_manager.<locals>.<genexpr>r   r   )r"   rh   r   set)rp   r7   Z
pid_groupsZ	pid_groupr,   r,   r.   #test_nested_backend_context_managerI  s   
"rq  )r@   rq   Nc                    s~   dd t ddfddtdD  | d t dd fddtdD  W d    d S 1 s8w   Y  d S )	Nc                 S   s0   t  t|  ks	J t|}t  |ksJ d S r9   )r]   r)   r'   r"   rL  )Zexpected_backend_typeZexpected_n_jobr,   r,   r.   check_nested_backendb  s   z?test_nested_backend_in_sequential.<locals>.check_nested_backendr   rr   c                 3   s    | ]
}t  td V  qdS r   )r#   r*   r   )rr  r,   r.   rd   l  r   z4test_nested_backend_in_sequential.<locals>.<genexpr>r   c                 3   s    | ]
}t  V  qd S r9   r   r   r7   rr  r_   r,   r.   rd   r  r   rg   )r7   r_   rp   r,   rs  r.   !test_nested_backend_in_sequentialZ  s   

"rt  c                 C   s\   | | }| t u r|d }| tu r|d }|j|ksJ W d    d S 1 s'w   Y  d S )Nr7   r   )r$   r%   nesting_level)rp   inner_backendZexpected_levelctxr7   r,   r,   r.   check_nesting_levelx  s   
"rx  outer_backendrv  c                    s   t  |d td|d fddtdD   dd t  fddtdD  W d    d S 1 s9w   Y  d S )	Nr   r@   r^   c                 3        | ]}t t d V  qdS r   r#   rx  r   rp   rv  r,   r.   rd     s
    
z-test_backend_nesting_level.<locals>.<genexpr>r   rr   c                 3   rz  r   r{  r   r|  r,   r.   rd     r  )rx  r"   rh   )rp   ry  rv  r,   r|  r.   test_backend_nesting_level  s   
"r}  with_retrieve_callbackTc                    s   dd l  G  fdddt}td| dd | d;}tddfd	d
tdD  | tu r:|d jdks:J | tu rG|d jdksOJ W d    d S W d    d S 1 sZw   Y  d S )Nr   c                       s"   e Zd ZdZZ jdd ZdS )z)test_retrieval_context.<locals>.MyBackendr   c                 s   s    |  j d7  _ d V  d S rs   r"  r   r,   r,   r.   retrieval_context  s   
z;test_retrieval_context.<locals>.MyBackend.retrieval_contextN)rM   rN   rO   rc   Zsupports_retrieve_callbackcontextmanagerr  r,   )
contextlibr~  r,   r.   ri    s
    ri  Z	retrievalc                 S   s   t dddd t| D S )Nr@   rr   c                 s   r`   r9   r   rb   r,   r,   r.   rd     r  z>test_retrieval_context.<locals>.nested_call.<locals>.<genexpr>rg   )nr,   r,   r.   nested_call  s   z+test_retrieval_context.<locals>.nested_callr@   rr   c                 3   s    | ]	}t  |V  qd S r9   r   rb   )r  r,   r.   rd     s
    

z)test_retrieval_context.<locals>.<genexpr>r   r7   r   )r  r   r&   r"   rh   r$   rc   r%   )rp   r~  ri  rw  r,   )r  r  r~  r.   test_retrieval_context  s    
	
"r  r'  )r   rq   gQ?c                 C   s8   t t t| d W d    d S 1 sw   Y  d S )Nr'  )r   rR   r"   r  r,   r,   r.   test_invalid_batch_size  s   
"r  z)n_tasks, n_jobs, pre_dispatch, batch_size))r@   r@   r   r1  )r@   r@   r_   r1  r   r@   r_   r1  )i  r@   r_   r1  r  )r   r   r_   r1  )   r)  r_   r1  )   r)  
2 * n_jobsr   )   r)  r   r   )r  r)  r  rQ   )r  r)  r  r1  c                 C   sN   |||d}dd t | D }tdi |dd t | D }||ks%J d S )N)r_   r,  r'  c                 S   r{   r,   r|   rb   r,   r,   r.   r/     r~   z0test_dispatch_race_condition.<locals>.<listcomp>c                 s   r`   r9   ra   rb   r,   r,   r.   rd     r  z/test_dispatch_race_condition.<locals>.<genexpr>r,   r   )Zn_tasksr_   r,  r'  paramsr   r   r,   r,   r.   test_dispatch_race_condition  s    r  c                  C   s8   t  } tddd}|jd}| }|| ksJ d S )Nr@   r+   r^   rp   )r   get_start_methodr"   Z_backend_argsget)Zmp_start_methodr   rp   Zstart_methodr,   r,   r.   test_default_mp_context  s
   r  c                    s^   | dkr	t d} tjd}|dd t  j td| d fddt	dD  d S )	Nr+   r3   r_  i  r@   r^   c                 3   s"    | ]}t tj  jV  qd S r9   )r#   r   dotTrb   rF   r,   r.   rd     s    
zAtest_no_blas_crash_or_freeze_with_subprocesses.<locals>.<genexpr>)
r   r2   r   randomZRandomStaterandnr  r  r"   rh   )r7   rngr,   r  r.   .test_no_blas_crash_or_freeze_with_subprocesses  s   
r  a  from joblib import Parallel, delayed

def square(x):
    return x ** 2

backend = "{}"
if backend == "spawn":
    from multiprocessing import get_context
    backend = get_context(backend)

print(Parallel(n_jobs=2, backend=backend)(
      delayed(square)(i) for i in range(5)))
c                 C   sB   | dkrt  dkrtd t| }ttjd|gddd d S )Nr+   forkzVRequire fork start method to use interactively defined functions with multiprocessing.z-cr   \[0, 1, 4, 9, 16\]r   stdout_regex)	r   r  r   skip,UNPICKLABLE_CALLABLE_SCRIPT_TEMPLATE_NO_MAINformatr   r   
executable)r7   coder,   r,   r.   2test_parallel_with_interactively_defined_functions  s   


r  a  import sys
# Make sure that joblib is importable in the subprocess launching this
# script. This is needed in case we run the tests from the joblib root
# folder without having installed joblib
sys.path.insert(0, {joblib_root_folder!r})

from joblib import Parallel, delayed

def run(f, x):
    return f(x)

{define_func}

if __name__ == "__main__":
    backend = "{backend}"
    if backend == "spawn":
        from multiprocessing import get_context
        backend = get_context(backend)

    callable_position = "{callable_position}"
    if callable_position == "delayed":
        print(Parallel(n_jobs=2, backend=backend)(
                delayed(square)(i) for i in range(5)))
    elif callable_position == "args":
        print(Parallel(n_jobs=2, backend=backend)(
                delayed(run)(square, i) for i in range(5)))
    else:
        print(Parallel(n_jobs=2, backend=backend)(
                delayed(run)(f=square, x=i) for i in range(5)))
z!def square(x):
    return x ** 2
zcdef gen_square():
    def square(x):
        return x ** 2
    return square
square = gen_square()
zsquare = lambda x: x ** 2
define_funccallable_position)r#   r   kwargsc              	   C   sv   | dv r|t kstjdkrtd tj|| |tj	tj	t
jd}|d}|| ttj|jgddd d S )	N)r+   r3   win32zNot picklable with pickle)r  r7   r  joblib_root_folderzunpicklable_func_script.pyr   r  r  )SQUARE_MAINr   platformr   r  )UNPICKLABLE_CALLABLE_SCRIPT_TEMPLATE_MAINr  rd  pathdirnamejoblib__file__r   writer   r  strpath)r7   r  r  tmpdirr  Z	code_filer,   r,   r.   0test_parallel_with_unpicklable_functions_in_argsC  s"   



r  a  import sys
import faulthandler
# Make sure that joblib is importable in the subprocess launching this
# script. This is needed in case we run the tests from the joblib root
# folder without having installed joblib
sys.path.insert(0, {joblib_root_folder!r})

from joblib import Parallel, delayed
from functools import partial

class MyClass:
    '''Class defined in the __main__ namespace'''
    def __init__(self, value):
        self.value = value


def square(x, ignored=None, ignored2=None):
    '''Function defined in the __main__ namespace'''
    return x.value ** 2


square2 = partial(square, ignored2='something')

# Here, we do not need the `if __name__ == "__main__":` safeguard when
# using the default `loky` backend (even on Windows).

# To make debugging easier
faulthandler.dump_traceback_later(30, exit=True)

# The following baroque function call is meant to check that joblib
# introspection rightfully uses cloudpickle instead of the (faster) pickle
# module of the standard library when necessary. In particular cloudpickle is
# necessary for functions and instances of classes interactively defined in the
# __main__ module.

print(Parallel(backend="loky", n_jobs=2)(
    delayed(square2)(MyClass(i), ignored=[dict(a=MyClass(1))])
    for i in range(5)
))
)r  c                 C   s.   |  d}|t ttj|jgdd d d S )Nz(joblib_interactively_defined_function.pyr  )r  r   )r   r  5INTERACTIVE_DEFINED_FUNCTION_AND_CLASS_SCRIPT_CONTENTr   r   r  r  r  scriptr,   r,   r.   7test_parallel_with_interactively_defined_functions_loky  s   



r  a  import sys
# Make sure that joblib is importable in the subprocess launching this
# script. This is needed in case we run the tests from the joblib root
# folder without having installed joblib
sys.path.insert(0, {joblib_root_folder!r})

from joblib import Parallel, delayed, hash
import multiprocessing as mp
mp.util.log_to_stderr(5)

class MyList(list):
    '''MyList is interactively defined by MyList.append is a built-in'''
    def __hash__(self):
        # XXX: workaround limitation in cloudpickle
        return hash(self).__hash__()

l = MyList()

print(Parallel(backend="loky", n_jobs=2)(
    delayed(l.append)(i) for i in range(3)
))
c                 C   s0   |  d}|t ttj|jgdddd d S )Nz)joblib_interactive_bound_method_script.pyz\[None, None, None\]ZLokyProcess   )r  Zstderr_regexr   )r   r  9INTERACTIVELY_DEFINED_SUBCLASS_WITH_METHOD_SCRIPT_CONTENTr   r   r  r  r  r,   r,   r.   :test_parallel_with_interactively_defined_bound_method_loky  s   


r  c                  C   s"   t g } tdd| g ksJ d S )Nr@   rr   )iterr"   )Zexhausted_iteratorr,   r,   r.   %test_parallel_with_exhausted_iterator  s   r  c                   C   s   t   td dS )z+Helper function to force gc in each worker.r   N)r   rU   r   r,   r,   r,   r.   _cleanup_worker  s   r  c                 C   s"   t | tjstdt| |  S )Nz#Expected np.memmap instance, got %r)
isinstancer   memmap	TypeErrorr[   copyr  r,   r,   r.   check_memmap  s
   r  c                 C   s   dd }t dd| ddd |dD }t||t|D ]\}}tj|| qt d	d| dd
d |dD }t||t|D ]\}}tj|| qBd S )Nc                 s   s*    t | D ]}tjdtjd| V  qd S )Nr   r   )rh   r   onesZfloat32)r  rc   r,   r,   r.   generate_arrays  s   zBtest_auto_memmap_on_arrays_from_generator.<locals>.generate_arraysr@   r   r_   
max_nbytesr7   c                 s   r`   r9   r#   r  r-   rF   r,   r,   r.   rd     re   z<test_auto_memmap_on_arrays_from_generator.<locals>.<genexpr>rz   r   c                 s   r`   r9   r  r  r,   r,   r.   rd     re   )r"   r  r   r   r   r   )r7   r  r   r   r   r,   r,   r.   )test_auto_memmap_on_arrays_from_generator  s   r  c                 C   s   | S r9   r,   )argr,   r,   r.   identity  rK   r  c                    s   |  dj}tj}tj|ddtj|ddg}t|| t|dd t	dd fdd	d
D \}t
 d tjs;J  d j|ksDJ tj|| d S )Nz	test.mmapuint8r  rK  )Z	mmap_moder@   rr   c                 3   r   r9   )r#   r  r   r  r,   r.   rd     r  z.test_memmap_with_big_offset.<locals>.<genexpr>r  r   )r   r  mmapZALLOCATIONGRANULARITYr   zerosr  r   r   r"   r  r  offsetr   r   )r  fnamesizeobjr   r,   r  r.   test_memmap_with_big_offset  s   
r  c                  C   s   t jdd} tddddd tdD  W d    n1 s w   Y  t| dks-J | d }t|jts9J t|jd	ksBJ d S )
NTr   r   )r_   r   c                 s   r`   r9   ra   rb   r,   r,   r.   rd     r  zFtest_warning_about_timeout_not_supported_by_backend.<locals>.<genexpr>2   r   zThe backend class 'SequentialBackend' does not support timeout. You have set 'timeout=1' in Parallel but the 'timeout' parameter will not be used.)	r   r   r"   rh   r   r  r   rR  r   )r   r   r,   r,   r.   3test_warning_about_timeout_not_supported_by_backend  s    r  c                 C   s   || |< |S r9   r,   )
input_listr.  r   r,   r,   r.   set_list_value   s   r  )r   r@   r   c                    sV   dgd  t | ddd fddtdD }t|}tdd t |D s)J d S )	Nr   r   	generatorr1   r_   	return_asr7   c                 3   s     | ]}t t ||V  qd S r9   )r#   r  rb   r  r,   r.   rd         
zPtest_parallel_return_order_with_return_as_generator_parameter.<locals>.<genexpr>c                 s       | ]	\}}||kV  qd S r9   r,   r-   vrK  r,   r,   r.   rd     r  )r"   rh   r*  r   r  )r_   r   r,   r  r.   =test_parallel_return_order_with_return_as_generator_parameter  s   

 r  c                 C   s   |rt d t| S )Nr   )r   r   )edelayr,   r,   r.   _sqrt_with_delay  s   r  c                    sv   t |d| ddd tdD  t fddtdD }dgttd	d }td
d t||D s5J  t  d S )Ngenerator_unorderedr  c                 s   s&    | ]}t t|d  |dkV  qdS )r@   r   N)r#   r  rb   r,   r,   r.   rd      s    
zK_test_parallel_unordered_generator_returns_fastest_first.<locals>.<genexpr>r   c                 3   s    | ]}t  V  qd S r9   )nextr   r   r,   r.   rd   #  s    	   r   r@   c                 s   r  r9   r,   r  r,   r,   r.   rd   '  re   )r"   rh   sortedr*  r   r  r   )r7   r_   Zquickly_returnedZexpected_quickly_returnedr,   r  r.   8_test_parallel_unordered_generator_returns_fastest_first  s   
r  r@   
sequentialc                 C   s   t | | d S r9   )r  r7   r_   r,   r,   r.   7test_parallel_unordered_generator_returns_fastest_first/  s   r  zThis test requires daskc              	   C   sv   t jddd* |d td |  W d    n1 sw   Y  W d    d S W d    d S 1 s4w   Y  d S Nr@   Z	n_workersZthreads_per_workerdask)distributedClientr  )r_   rp   r,   r,   r.   Atest_parallel_unordered_generator_returns_fastest_first_with_dask9  s   Pr  )r   r@   rw   rq   c                 C   sv   dgdgd  }t t t }t| |ddd |D  W d    n1 s(w   Y  t | }|dk s9J d S )NrF   r   rz   r^   c                 s   s    | ]
}t tj|V  qd S r9   r#   rU   r   rb   r,   r,   r.   rd   K  r   z%test_abort_backend.<locals>.<genexpr>r  )r   r  rU   r"   )r_   r7   Zdelayst_startdtr,   r,   r.   test_abort_backendE  s   

r  c                 C   s   t jtdtd}d|d< |S )Ng    Ar  Fr   )r   r  intbool)r  r   r,   r,   r.   get_large_objectQ  s   r  c                 C   sb   t || |d }|dd tdD }t| t| ~t  W d    d S 1 s*w   Y  d S )N)r_   r7   r  c                 s   r`   r9   )r#   r  rb   r,   r,   r.   rd   \  r  z0_test_deadlock_with_generator.<locals>.<genexpr>r   )r"   rh   r  r   )r7   r  r_   r   r   r,   r,   r.   _test_deadlock_with_generatorW  s   "r  r  r  r  c                 C   s   t | || d S r9   )r  )r7   r  r_   r,   r,   r.   test_deadlock_with_generatore  s   r  c              	   C   sx   t jddd+ | d td || W d    n1 sw   Y  W d    d S W d    d S 1 s5w   Y  d S r  )r  r  r  )rp   r  r_   r,   r,   r.   %test_deadlock_with_generator_and_daskm  s   Pr  c                 C   s   t tdd) t|| |d}|dd tdD }t }|dd tdD }W d    n1 s2w   Y  t | d	k sCJ d
~t  d S )N)This Parallel instance is already runningr   r7   r  c                 s   r   r   r   r   r,   r,   r.   rd     r  z/test_multiple_generator_call.<locals>.<genexpr>r   c                 s   r`   r9   r   rb   r,   r,   r.   rd     r  rz   r@   ZThe error should be raised immediatly when submitting a new task but it took more than 2s.)r   r   r"   rh   rU   r   )r7   r  r_   r   gr  Zgen2r,   r,   r.   test_multiple_generator_cally  s   
r  c              	   C   s   t || |dD}|dd tdD }t }ttdd |dd tdD }W d    n1 s3w   Y  t | d	k sDJ d
W d    n1 sNw   Y  ~t  d S )Nr  c                 s   r   r   r   r   r,   r,   r.   rd     r  z7test_multiple_generator_call_managed.<locals>.<genexpr>r   r  r   c                 s   r`   r9   r   rb   r,   r,   r.   rd     r  rz   r@   r  )r"   rh   rU   r   r   r   )r7   r  r_   r   r   r  g2r,   r,   r.   $test_multiple_generator_call_managed  s"   
r  return_as_1return_as_2c                 C   s   t || |ddd tdD }t || |ddd tddD }|dkr)t|}|dkr1t|}tdd t|tdD sAJ td	d t|tddD sRJ d S )
Nr  c                 s        | ]}t t|d  V  qdS r@   Nr`  rb   r,   r,   r.   rd     r  z9test_multiple_generator_call_separated.<locals>.<genexpr>r   c                 s   r  r  r`  rb   r,   r,   r.   rd     r  r  r  c                 s   r  r9   r,   r-   r   rc   r,   r,   r.   rd     r  c                 s   r  r9   r,   r  r,   r,   r.   rd     r  )r"   rh   r  r   r  )r7   r  r  r_   r   r  r,   r,   r.   &test_multiple_generator_call_separated  s    &r	  zbackend, error))r0   T)r1   F)r  Fc           
      C   sb  | dkrt d u rtd td| |d}|dd tdD }t|dd	 }|r/ttd
dnt	 }|9 t

 }td| |ddd tddD }t  |dkrUt|}tdd t|tddD sfJ W d    n1 spw   Y  t

 | dk sJ d}	|jr|	dk r|	d7 }	t
d |jr|	dk st

 | dk sJ | dkr|jsJ d S d S )Nr0   zRequires multiprocessingr@   r  c                 s   r   r   r   rb   r,   r,   r.   rd     r  z<test_multiple_generator_call_separated_gc.<locals>.<genexpr>r   c                   S   s   t dS )NzGenerator collected)r   r,   r,   r,   r.   <lambda>      z;test_multiple_generator_call_separated_gc.<locals>.<lambda>z The executor underlying Parallelr   c                 s   r  r  r`  rb   r,   r,   r.   rd     r  r  r  c                 s   r  r9   r,   r  r,   r,   r.   rd     r  r   r   rf   r   rH  )r   r   r  r"   rh   weakreffinalizer   r   r   rU   r   r  r   r  aliver   rL  r  )
r7   r  r  errorr   r   Zg_wrrw  r  retryr,   r,   r.   )test_multiple_generator_call_separated_gc  s<   
$

r  c                 C   s   |j }tdd| |d.}|dd tjdgd D  tt|dks'J |dd tdD  W d    n1 s<w   Y  td	D ]}t|sN qWtd
 qEt	dtdd| d}|dd tjdgd D  |dd tdD  td	D ]}t|s d S td
 q}t	d)Nr@   r   )r_   r  r7   Ztemp_folderc                 s   r`   r9   r  r  r,   r,   r.   rd     r  z(test_memmapping_leaks.<locals>.<genexpr>r   r   c                 s   rg  r9   r#   r  r   r,   r,   r.   rd         rz   r   z/temporary directory of Parallel was not removedr  c                 s   r`   r9   r  r  r,   r,   r.   rd   #  r  c                 s   rg  r9   r  r   r,   r,   r.   rd   $  r  )
r  r"   r   r  r   rd  listdirrh   r   AssertionError)r7   r  r   r   r,   r,   r.   test_memmapping_leaks   s,    

 

r  )Nr0   r1   c                 C   s<   t d| ddd tdD }|dd tdD ksJ d S )Nr@   r^   c                 s   s     | ]}t d d |V  qdS )c                 S   r>   r?   r,   rA   r,   r,   r.   r
  5  r  z2test_lambda_expression.<locals>.<genexpr>.<lambda>Nr   rb   r,   r,   r.   rd   4  r  z)test_lambda_expression.<locals>.<genexpr>r   c                 S   s   g | ]}|d  qS )r@   r,   rb   r,   r,   r.   r/   6  r~   z*test_lambda_expression.<locals>.<listcomp>rg   )r7   r   r,   r,   r.   test_lambda_expression.  s   r  c                    s   d}d}d|  t d|| d}| fddt|D  |jj|jjks&J |jj|jjks0J | fddt|D  |jj|jjksGJ |jj|jjksQJ d	S )
zCTest that a parallel backend correctly resets its batch statistics.r@   i  g       @r   )rx   r_   r7   c                 3       | ]
}t tj V  qd S r9   r  rb   Z	task_timer,   r.   rd   B      z6test_backend_batch_statistics_reset.<locals>.<genexpr>c                 3   r  r9   r  rb   r  r,   r.   rd   H  r  N)r"   rh   r   Z_effective_batch_sizeZ_DEFAULT_EFFECTIVE_BATCH_SIZEZ_smoothed_batch_durationZ _DEFAULT_SMOOTHED_BATCH_DURATION)r7   r_   Zn_inputsr   r,   r  r.   #test_backend_batch_statistics_reset9  s$   r  c                 C   s  dD ];}t t|djtksJ t|dd}t |jtu sJ t|dd}t |jtu s.J t|dd}t |jtu s=J qtdd	dd
}t |jtu sNJ | d	dd tdd}t |jtu scJ |jdksjJ W d    n1 stw   Y  | d	dd tddd}t |jtu sJ |jdksJ W d    n1 sw   Y  | d	dd tdd}t |jtu sJ |jdksJ W d    n1 sw   Y  | d	dd tddd}t |jtu sJ |jdksJ W d    d S 1 sw   Y  d S )N)r   r@   rq   rr   threadsr_   prefer	processes	sharedmemr_   requirer@   r0   )r_   r7   r  r  rf   r"  r   )r[   r"   r   rP  r   r!   r_   )rp   r_   r   r,   r,   r.   $test_backend_hinting_and_constraintsO  s<   

	"r%  c                 C   sz  G dd dt }|| & tddd}t|j|u sJ tddd}t|j|u s,J W d    n1 s6w   Y  G dd	 d	t }|| O tddd}t|j|u sXJ |  \}}|d
ksdJ |d
ksjJ tdddd}t|jtu szJ |  \}}d}| |ksJ |d
ksJ W d    n1 sw   Y  tt t| dd W d    d S 1 sw   Y  d S )Nc                   @   $   e Zd ZdZdZdd Zdd ZdS )z[test_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackendTc                 S   rD   r9   r,   r   r,   r,   r.   apply_async  rK   zgtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackend.apply_asyncc                 S      |S r9   r,   rF  r,   r,   r.   r'     rK   zltest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackend.effective_n_jobsNrM   rN   rO   Zsupports_sharedmemZuse_threadsr'  r'   r,   r,   r,   r.   MyCustomThreadingBackend  
    r*  r@   r  r  r   r!  c                   @   r&  )z\test_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackendFc                 S   rD   r9   r,   r   r,   r,   r.   r'    rK   zhtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackend.apply_asyncc                 S   r(  r9   r,   rF  r,   r,   r.   r'     rK   zmtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackend.effective_n_jobsNr)  r,   r,   r,   r.   MyCustomProcessingBackend  r+  r,  r>  r   )r_   r"  rx   zUsing ThreadingBackend as joblib backend instead of MyCustomProcessingBackend as the latter does not provide shared memory semantics.r7   r"  )	r    r"   r[   r   Z
readouterrr   stripr   rR   )Zcapsysrp   r*  r   r,  outerrr   r,   r,   r.   9test_backend_hinting_and_constraints_with_custom_backends  s0   


"r1  c                   C   s  t t tdd W d    n1 sw   Y  t t tdd W d    n1 s-w   Y  t t tddd W d    n1 sGw   Y  td urt t tddd W d    n1 sew   Y  t t td	dd W d    d S 1 sw   Y  d S d S )
Ninvalidr#  r$  r  r   )r  r"  r0   r-  r+   )r   rR   r"   r   r,   r,   r,   r.   ,test_invalid_backend_hinting_and_constraints  s"   




"r3  c                    s   t dd4}t|jj|jjfg}dkr|W  d   S | fddtdD }||d  W  d   S 1 s<w   Y  dS )zCPerform nested parallel calls and introspect the backend on the wayr@   rr   r   Nc                 3   s*    | ]}t tdd d i V  qdS )limitr   Nr,   )r#   _recursive_backend_inforb   r  r4  r,   r.   rd     s    "z*_recursive_backend_info.<locals>.<genexpr>r   )r"   r[   r   rM   ru  rh   )r4  r  r   Z
this_levelr   r,   r6  r.   r5    s   
$r5  c                 C   s   | |dd t  }W d    n1 sw   Y  t dkr#d}d}nd}d}| d }|df|dfd|fd|fg}||ksAJ d S )Nr@   rr   r   r   r   ZBackendr   )r5  r(   title)rp   r7   backend_types_and_levelsZsecond_level_backend_typeZ	max_levelZtop_level_backend_typeZexpected_types_and_levelsr,   r,   r.   test_nested_parallelism_limit  s   
r9  c              
   C   s  t jdddp tjtdtjd}tdD ].}| d t|d}W d    n1 s,w   Y  t|dks9J t	dd	 |D sDJ q| d t }W d    n1 sWw   Y  t|dksdJ t	d
d	 |D soJ W d    d S 1 szw   Y  d S )Nr@   r  g    cAr  r  )datar   c                 s       | ]	\}}|d kV  qdS ZDaskDistributedBackendNr,   r-   r   r   r,   r,   r.   rd         z4test_nested_parallelism_with_dask.<locals>.<genexpr>c                 s   r;  r<  r,   r=  r,   r,   r.   rd     r>  )
r  r  r   r  r  r  rh   r5  r   r   )rp   r:  rc   r8  r,   r,   r.   !test_nested_parallelism_with_dask  s$   

"r?  c                 C   s   t  dd tdD S )z6A horrible function that does recursive parallel callsc                 s   rg  r9   )r#   _recursive_parallelrb   r,   r,   r.   rd     r  z&_recursive_parallel.<locals>.<genexpr>r@   Nrg   )Znesting_limitr,   r,   r.   r@    s   r@  c              	   C   s   | |dd t t}t  W d    n1 sw   Y  W d    n1 s(w   Y  |j}|dkrFddlm} t||tfrFt	d t|t
sMJ d S )Nr@   rr   r0   r   )TerminatedWorkerErrorz1Loky worker crash when serializing RecursionError)r   BaseExceptionr@  r   Z&joblib.externals.loky.process_executorrA  r  r   r   r   RecursionError)rp   r7   r@  excrA  r,   r,   r.   test_thread_bomb_mitigation
  s   	

rE  c                  C   s*   i } dD ]
}t j|| |< q| tdfS )N)OMP_NUM_THREADSOPENBLAS_NUM_THREADSMKL_NUM_THREADSZVECLIB_MAXIMUM_THREADSZNUMEXPR_NUM_THREADSZNUMBA_NUM_THREADS
ENABLE_IPCrz   )rd  environr  r   )Zenv_varsvarr,   r,   r.   _run_parallel_sum'  s   rL  zNeed OpenMP helper compiledc                 C   s   t d| ddd tdD }tt d d}|D ]-\}}||ks#J | D ]\}}|dr9|t|ks8J q'|dks?J |dksEJ q'qd S )	Nr@   r^   c                 s   rg  r9   )r#   rL  r   r,   r,   r.   rd   3      

z-test_parallel_thread_limit.<locals>.<genexpr>r   Z_THREADSrI  1)r"   rh   rE  r(   itemsendswithr   )r7   r   Zexpected_num_threadsZworker_env_varsZomp_num_threadsr   r   r,   r,   r.   test_parallel_thread_limit0  s   
rQ  c                 C   s:   t tdd | d W d    d S 1 sw   Y  d S )NzPlease install daskr   r  )r   rR   rY  r,   r,   r.   )test_dask_backend_when_dask_not_installedA  s   
"rR  c              	   C   s   G dd dt }d}| | 6 tjt|d tdddd tdD  W d    n1 s0w   Y  W d    d S W d    d S 1 sHw   Y  d S )	Nc                   @   s&   e Zd Zdd ZdddZdd ZdS )	z3test_zero_worker_backend.<locals>.ZeroWorkerBackendc                 _      dS rZ   r,   )rE   r   r  r,   r,   r.   rD  M  rK   z=test_zero_worker_backend.<locals>.ZeroWorkerBackend.configureNc                 S   r   )NzNo worker availabler   )rE   funccallbackr,   r,   r.   r'  P  r=   z?test_zero_worker_backend.<locals>.ZeroWorkerBackend.apply_asyncc                 S   rS  rZ   r,   rF  r,   r,   r.   r'   S  rK   zDtest_zero_worker_backend.<locals>.ZeroWorkerBackend.effective_n_jobsr9   )rM   rN   rO   rD  r'  r'   r,   r,   r,   r.   ZeroWorkerBackendL  s    
rV  z&ZeroWorkerBackend has no active workerr   r@   rr   c                 s   r`   r9   r   rb   r,   r,   r.   rd   Y  r  z+test_zero_worker_backend.<locals>.<genexpr>)r   r   r   r   r"   rh   )rp   rV  Zexpected_msgr,   r,   r.   test_zero_worker_backendH  s   
"rW  c                     s   da dd    dksJ tdd fddtdD } t| dhks&J da   dks/J tdd fd	dtdD } t| dhksHJ d S )
Nzoriginal valuec                   S   s   t S r9   )MY_GLOBAL_VARIABLEr,   r,   r,   r.   check_globalsd  s   z@test_globals_update_at_each_parallel_call.<locals>.check_globalsr@   rr   c                 3       | ]}t   V  qd S r9   r   rb   rY  r,   r.   rd   j  rM  z<test_globals_update_at_each_parallel_call.<locals>.<genexpr>zchanged valuec                 3   rZ  r9   r   rb   r[  r,   r.   rd   s  rM  )rX  r"   rh   rp  )Zworkers_global_variabler,   r[  r.   )test_globals_update_at_each_parallel_call\  s   r\  c                  C   s4   dd l } | jdd}| || ddlm} | S )Nr   rz   )threadpool_info)Znumpyr  r  r  Zthreadpoolctlr]  )r   rF   r]  r,   r,   r.   _check_numpy_threadpool_limits}  s
   r^  c                 C   s4   |D ]}|d | d kr|d   S qt d| )Nfilepathnum_threadsz,An unexpected module was loaded in child:
{})rR   r  )child_moduleparent_infoparent_moduler,   r,   r.   _parent_max_num_threads_for  s   rd  c                 C   s@   | D ]}|D ]}t ||}t|||h}|d |v sJ qqd S )Nr`  )rd  min)Zworkers_inforb  r`  Zchild_threadpool_infora  Zparent_max_num_threadsr   r,   r,   r.   check_child_num_threads  s   rf  )r@   r   rw   rq   c                 C   sd   t  }t|dkrtjdd td| ddd tdD }t| } tt |  d	}t	||| d S )
Nr   &Need a version of numpy linked to BLASr   r0   r  c                 s   rg  r9   r#   r^  rb   r,   r,   r.   rd     rM  z;test_threadpool_limitation_in_child_loky.<locals>.<genexpr>r@   r   
r^  r   r   r  r"   rh   r'   rE  r(   rf  )r_   rb  workers_threadpool_infosexpected_child_num_threadsr,   r,   r.   (test_threadpool_limitation_in_child_loky  s   rl  inner_max_num_threads)r   r@   r   Nc                 C   s   t  }t|dkrtjdd | d|d t|ddd td	D }W d    n1 s.w   Y  t|}|d u rDtt | d
}n|}t	||| d S )Nr   rg  r   r0   rm  rr   c                 s   rg  r9   rh  rb   r,   r,   r.   rd     rM  z>test_threadpool_limitation_in_child_context.<locals>.<genexpr>r@   r   ri  )rp   r_   rm  rb  rj  rk  r,   r,   r.   +test_threadpool_limitation_in_child_context  s   
ro  var_name)rG  rH  rF  c              	      s   t dd  dd  tj}z_dtj< t|d fddtd	D }|ddgks0J | d
dd t|d fddtd	D }W d    n1 sRw   Y  |ddgks_J W |d u rjtj= d S |tj< d S |d u rztj= w |tj< w )NTZreusec                 S   s   t j| S r9   )rd  rJ  r  )rp  r,   r,   r.   _get_env  r   z>test_threadpool_limitation_in_child_override.<locals>._get_env4rr   c                 3   r   r9   r   rb   rr  rp  r,   r.   rd     re   z?test_threadpool_limitation_in_child_override.<locals>.<genexpr>r@   r0   r   rn  c                 3   r   r9   r   rb   rt  r,   r.   rd     re   rN  )r   shutdownrd  rJ  r  r"   rh   )rp   r_   rp  Zoriginal_var_valuer   r,   rt  r.   ,test_threadpool_limitation_in_child_override  s*   

rv  )r@   r   rq   c                 C   sJ   dd }||  t dd}tdD ]}||  t dd}||ks"J qd S )Nc                    s,   t d t| d fddt dD  d S )Nr   rr   c                 3   r   r9   )r#   sumrb   rA   r,   r.   rd     r  zAtest_loky_reuse_workers.<locals>.parallel_call.<locals>.<genexpr>r   rr   r,   rA   r.   parallel_call  s   $z.test_loky_reuse_workers.<locals>.parallel_callTrq  r   )r   rh   )r_   rx  Zfirst_executorr   executorr,   r,   r.   test_loky_reuse_workers  s   

rz  )F)r   r   )rf   r9   )rP   rd  r   rU   r  r  r   r1   	tracebackr   mathr   r   pickler   r  r   r+   r	   r   r  r   r   r   Zjoblib._multiprocessing_helpersr   Zjoblib.test.commonr   r   r   r   r   Zjoblib.testingr   r   r   r   r   Zjoblib.externals.lokyr   r  r   posixImportErrorZ _openmp_test_helper.parallel_sumr   r  Zjoblib._parallel_backendsr   r   r   r    r!   Zjoblib.parallelr"   r#   r$   r%   r&   r'   r(   r)   r*   r  ZRETURN_GENERATOR_BACKENDSpopr  keysZALL_VALID_BACKENDSZPROCESS_BACKENDSZPARALLEL_BACKENDShasattrr  r2   rP  r8   r<   rB   	ExceptionrC   rT   rW   rY   r]   rj   rl   ro   markrv   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r+  r0  r4  r5  r7  r;  r=  r   rB  rC  rG  rI  rN  rO  rQ  rS  rX  r[  extendrh   r\  r]  ra  rc  rf  rh  Z_parallel_backendsri  rq  rt  rx  r}  r  r  r  r  r  r  r  r  r  ZSQUARE_LOCALZSQUARE_LAMBDAr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rp  r  r  r  r  r  r  r  r  r  r	  r  r  r  r  r%  r1  r3  r5  r9  r?  r@  Zno_coverrE  rL  rQ  rR  rW  r\  r^  rd  rf  rl  ro  rv  rz  r,   r,   r,   r.   <module>   s   







D




	

	


	


 (,

	
	
2+.6	!