a
    h1                    @   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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mZmZ dd
lmZ ddlmZmZmZmZ ddl m!Z!m"Z"m#Z#m$Z$m%Z% edurddl&m'Z' ddl(m)Z) zddl*Z*W n e+y6   dZ*Y n0 zddl,m-Z- W n e+y`   dZ-Y n0 zddl.Z.W n e+y   dZ.Y n0 ddl/m0Z0m1Z1m2Z2m3Z3m4Z4 ddl5m6Z6m7Z7m8Z8m9Z9m:Z:mZm;Z;m<Z<m=Z= e6> Z?e?@dd dgeAe6B  ZCeCdd e6D 7 ZCedu rg ZDnddgZDeDdg ZEeFedrFeCGeHd dd ZIdd ZJdd ZKd d! ZLG d"d# d#eMZNdTd%d&ZOd'd( ZPdUd)d*ZQd+d, ZRd-d. ZSd/d0 ZTd1d2 ZUe"d3e<e;gejVj"d4d5d6e:d6d7fd8gg d9d:ed;d< ZWe"d=eCe"d>g d?e"d@g dAdBdC ZXe"d=eCe"d>ddDgdEdF ZYe"d=eCdGdH ZZdIdJ Z[ee"dKg dLdMdN Z\ee"d=g dOdPdQ Z]dRdS Z^e"dTe6e"dUe6dVdW Z_dXdY Z`edZd[ Zad\d] Zbe"d>g d^d_d` Zce"d=eEdadb Zdedcdd Zeeee"deg dfe"dgddhgdidj Zfe"d=eEdkdl Zgee"d=eEdmdn Zhee"d=eie?doh e"dpdqdrgdsdt Zjee"d=eDdudv Zkee"d=e6dwdx Zldydz Zme"d=e6e"d{dg d|fd}g d~fgdd Znee"d=eEdd Zodd Zpee"d=eDdd Zqdd Zrdd Zsdd Ztee"d=eEejVjudddd ZvG dd de3Zwdd Zxe"d=eCdd Zyee"d=eEe"d>g ddd Zzdd Z{dd Z|e$edudddd Z}dd Z~eEdd Zedd edD  ee"d=ee"d3e;e<gdd ZG dd de3Ze"d3e<e;gdd Ze"d3e<e;gdd Zdd Zdd ZG dd dejj0Ze=de ee"d=g de"d3e<e;gdd Zee"d>g de"d=eEe"d3e<e;gdd Zdd Zee"deEe"deEe"d3e<e;gdd Zee"d3e<e;ge"ddd$gddÄ Ze"dg dŢddǄ Ze"dg dɢdd˄ Zedd̈́ Zeee"d=eDddτ ZdZee"d=eDdd҄ ZdZdZdZdZee"d=eDe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 Zeee"d=eDdd Zdd Zeedd Zdd Zdd ZejV"d>g ddd Zdd Zdd ZejV"d>dDd}gee"d=eie?doh dd Ze"d=eCe"d>g ddd Zdd Zdd  Zee"d=e?e"dpdqdrge"d>g ddd Ze"d=e?e"dpdqdrge"d>g ddd Ze"d=e?e"dpdqdrge"d>g ddd Ze"d=e?e"ddqdrge"ddqdrge"d>g dd	d
 Ze"dg de"ddqdrge"ddqdrgdd Zeee"d=eDdd Ze"d=edu 
rddgng ddd Zee"d=eDdd Zee"d3e<e;gdd Ze"d>ddDge"dg ddd Ze"d3e<e;gdd Zdd ZdVd d!Zee"d=ddge"d3e<e;gd"d# ZdWd$d%ZejVje"d3e<e;ge"d=edu rdgnddgd&d' Zd(d) Ze"d=edurddgndge$e-du d*dd+d, Ze"d3e<e;ge$e.dud-dd.d/ Ze"d3e<e;gd0d1 ZĐd2d3 ZŐd4d5 ZƐd6d7 Zǐd8d9 Zeee"d>g d:d;d< Zeee"d=g d>e"d>dDd6ge"d3e<e;gd?d@ Zee"d>dDd6ge"dAg dBe"d3e<e;gdCdD Zee"d>g dEdFdG Z̐dHdI Z͐dXdJdKZee"d>dDd}ge"d=eDe"d3e<e;gdLdM Zee"d>dDd}ge"d=eDdNdO ZeejV"d>dDd}gdPdQ ZeejV"d>dDd}gdRdS ZdS (Y  z
Test the parallel module.
    N)nullcontextsqrtTimeoutError)PicklingError)sleep)format_exception)dumploadparallel)mp)IS_GIL_DISABLEDnpwith_multiprocessing
with_numpy)check_subprocess_callparametrizeraisesskipifwarns)get_reusable_executor)Queue   )parallel_sum)LokyBackendMultiprocessingBackendParallelBackendBaseSequentialBackendThreadingBackend)	BACKENDSParallel	cpu_countdelayedeffective_n_jobsr   parallel_backendparallel_configregister_parallel_backendmultiprocessingc                 C   s   g | ]}t |  qS  )r    ).0Zbackend_strr)   r)   U/var/www/html/assistant/venv/lib/python3.9/site-packages/joblib/test/test_parallel.py
<listcomp>R       r,   loky	threadingget_contextspawnc                   C   s
   t tj S N)r    r   DEFAULT_BACKENDr)   r)   r)   r+   get_default_backend_instance^   s    r4   c                 C   s   t | dt | dd S )N_poolZ_workers)getattrbackendr)   r)   r+   get_workersf   s    r9   c                 C   s   | | S r2   r)   )xyr)   r)   r+   divisionj   s    r<   c                 C   s   | d S N   r)   r:   r)   r)   r+   squaren   s    r@   c                   @   s   e Zd ZdZdd ZdS )MyExceptionWithFinickyInitz,An exception class with non trivial __init__c                 C   s   d S r2   r)   )selfabcdr)   r)   r+   __init__u   s    z#MyExceptionWithFinickyInit.__init__N__name__
__module____qualname____doc__rG   r)   r)   r)   r+   rA   r   s   rA   Fc                 C   s"   | dkr|rt ddddnt| S )N   rC   rD   rE   rF   )rA   
ValueError)r:   custom_exceptionr)   r)   r+   exception_raisery   s    rP   c                 C   s   t d td S )Ng?)timer   KeyboardInterruptr?   r)   r)   r+   interrupt_raiser   s    
rS   c                 C   s   | d | | S )zNA module-level function so that it can be spawn with
    multiprocessing.
    r>   r)   )r:   r;   zr)   r)   r+   f   s    rU   c                   C   s   t t d S Nr   )typer   get_active_backendr)   r)   r)   r+   _active_backend_type   s    rY   c                 C   s   t | |ddd tdD S )Nn_jobsr8   c                 s   s   | ]}t t|V  qd S r2   r#   r@   r*   ir)   r)   r+   	<genexpr>   s   z parallel_func.<locals>.<genexpr>   r!   range)inner_n_jobsr8   r)   r)   r+   parallel_func   s    rd   c                   C   s   t  dksJ d S rV   )r"   r)   r)   r)   r+   test_cpu_count   s    re   c                   C   s   t  dksJ d S rV   r$   r)   r)   r)   r+   test_effective_n_jobs   s    rg   contextzbackend_n_jobs, expected_n_jobs)r`   r`   r[   Nr   )zpositive-intznegative-intNone)Zidsc                 C   sT   | d|d" t d d|ks J W d    n1 s40    Y  t d ddksPJ d S )Nr/   rj   r   rf   )rh   Zbackend_n_jobsZexpected_n_jobsr)   r)   r+   test_effective_n_jobs_None   s    
0rm   r8   r[   )r   r>   ri   verbose)r>      d   c                 C   s:   dd t dD t|| |ddd t dD ks6J d S )Nc                 S   s   g | ]}t |qS r)   r@   r*   r:   r)   r)   r+   r,      r-   z(test_simple_parallel.<locals>.<listcomp>   r[   r8   ro   c                 s   s   | ]}t t|V  qd S r2   r\   rs   r)   r)   r+   r_      r-   z'test_simple_parallel.<locals>.<genexpr>rb   r!   )r8   r[   ro   r)   r)   r+   test_simple_parallel   s
    rw   r>   c                 C   s   d}t d}G dd dt}||| dd}|dd t|D  t }|jD ],}|| }rN| \}	}
||
|	  qNt	|d	ksJ d S )
Nrq   z(Done\s+\d+ out of \d+ \|)c                   @   s   e Zd Zg Zdd ZdS )z/test_parallel_pretty_print.<locals>.ParallelLogc                 S   s   | j | d S r2   )messagesappend)rB   msgr)   r)   r+   _print   s    z6test_parallel_pretty_print.<locals>.ParallelLog._printN)rI   rJ   rK   rx   r{   r)   r)   r)   r+   ParallelLog   s   r|   i'  ru   c                 S   s   g | ]}t t|qS r)   r#   rU   r]   r)   r)   r+   r,      r-   z.test_parallel_pretty_print.<locals>.<listcomp>r   )
recompiler!   rb   setrx   searchspanaddlen)r8   r[   n_taskspatternr|   executorZlensmessagesrC   rD   r)   r)   r+   test_parallel_pretty_print   s    

r   c                    s   |j t ddd tjdd>}td| ddd	 td
D }|g dksPJ W d    n1 sd0    Y  dd |D }| dv st| trd  fdd|D }t	|dksJ d S )NnameZ!some_new_name_for_the_main_thread)targetr   valueTrecordr>   rZ   c                 s   s   | ]}t t|V  qd S r2   r\   rs   r)   r)   r+   r_      s   z6test_main_thread_renamed_no_warning.<locals>.<genexpr>r`   )r   r      c                 S   s*   g | ]"}d t |jvrt|jts|qS )zworker timeout)strr   
isinstanceDeprecationWarningr*   wr)   r)   r+   r,      s   z7test_main_thread_renamed_no_warning.<locals>.<listcomp>)Nr(   z3multi-threaded, use of fork() may lead to deadlocksc                    s   g | ]} t |jvr|qS r)   )r   r   r   message_partr)   r+   r,      r-   r   )
setattrr/   current_threadwarningscatch_warningsr!   rb   r   r   r   )r8   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 s80    Y  dd |D }|r|rtdd |D }trzt|d	kn
t|d	k}|o|S d
S |rJ dS d S )NTr   always)r8   rc   c                 S   s   g | ]
}|j qS r)   )r   r   r)   r)   r+   r,     r-   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+   r_   
  s   z)_assert_warning_nested.<locals>.<genexpr>r   F)r   r   simplefilterrd   allr   r   )r8   rc   expectedr   Zwarnings_are_correctZwarnings_have_the_right_lengthr)   r)   r+   _assert_warning_nested  s    
*r   z%parent_backend,child_backend,expected))r.   r(   T)r.   r.   F)r(   r(   T)r(   r.   T)r/   r(   T)r/   r.   Tc                    sl   t d| d fddtdD  t d| d fddtdD }| dkr\t|shJ nt|shJ d S )Nr>   rZ   c                 3   s    | ]}t t d ddV  qdS )r   Fr8   rc   r   Nr#   r   r*   _child_backendr)   r+   r_   (  s   z0test_nested_parallel_warnings.<locals>.<genexpr>rt   c                 3   s    | ]}t t d dV  qdS )r>   r   Nr   r   r   r   r)   r+   r_   0  s   r/   )r!   rb   anyr   )parent_backendr   r   resr)   r   r+   test_nested_parallel_warnings  s    	r   )r.   r(   r/   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>0    Y  tt| t|dk| d< d S )	NTr   r>   rj   c                 s   s   | ]}t td V  qdS )皙?Nr#   r   r   r)   r)   r+   r_   F  r-   zPtest_background_thread_parallelism.<locals>.background_thread.<locals>.<genexpr>r   r   )r   r   r!   rb   printr   )is_run_parallelr   r)   r)   r+   background_threadD  s    :z=test_background_thread_parallelism.<locals>.background_thread)r   r   r   )r/   Threadstartjoin)r8   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>   rZ   c                 s   s   | ]}t td V  qdS {Gz?Nr\   r   r)   r)   r+   r_   Q  r-   znested_loop.<locals>.<genexpr>ra   r7   r)   r)   r+   nested_loopP  s    r   r   r   c                    s&   t d| d fddtdD  d S )Nr>   rZ   c                 3   s   | ]}t t V  qd S r2   )r#   r   r   r   r)   r+   r_   W  s   z#test_nested_loop.<locals>.<genexpr>ra   )r   r   r)   r   r+   test_nested_loopT  s    r   c                 C   s   t d S r2   )rN   r7   r)   r)   r+   raise_exception\  s    r   c               	   C   st   t tX tddd,} | ttdttdg W d    n1 sH0    Y  W d    n1 sf0    Y  d S )Nr>   r.   rZ   )r   rN   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    s8J dS )	z1Input is mutable when using the threading backendrt   )maxsizer>   r/   rZ   c                 3   s   | ]}t  jd V  qdS r   N)r#   putr   qr)   r+   r_   j  r-   z1test_mutate_input_with_threads.<locals>.<genexpr>N)r   r!   rb   fullr)   r)   r   r+   test_mutate_input_with_threadsg  s    
"r   )r   r>   r`   c                 C   s6   t d}dd |D t| ddd |D ks2J dS )z.Check the keyword argument processing of pmap.
   c                 S   s   g | ]}t |d dqS r   r;   rU   rs   r)   r)   r+   r,   r  r-   z(test_parallel_kwargs.<locals>.<listcomp>rj   c                 s   s   | ]}t t|d dV  qdS r   r   Nr}   rs   r)   r)   r+   r_   r  s   z'test_parallel_kwargs.<locals>.<genexpr>Nrv   )r[   lstr)   r)   r+   test_parallel_kwargsn  s    r   c                 C   s   t d}dd |D }td| dh}|j}||dd |D ksDJ ||dd |D ks^J td ur|t|t|ju s|J W d    n1 s0    Y  td urt|jd u sJ ||d	d |D ksJ td urt|jd u sJ d S )
Nr   c                 S   s   g | ]}t |d dqS r   r   rs   r)   r)   r+   r,   z  r-   z4test_parallel_as_context_manager.<locals>.<listcomp>r   rZ   c                 s   s   | ]}t t|d dV  qdS r   r}   rs   r)   r)   r+   r_     r-   z3test_parallel_as_context_manager.<locals>.<genexpr>c                 s   s   | ]}t t|d dV  qdS r   r}   rs   r)   r)   r+   r_     r-   c                 s   s   | ]}t t|d dV  qdS r   r}   rs   r)   r)   r+   r_     r-   )rb   r!   _backendr   r9   )r8   r   r   pZmanaged_backendr)   r)   r+    test_parallel_as_context_managerw  s    4r   c                      sb   G dd dt  ttdd2 tddd fdd	td
D  W d   n1 sT0    Y  dS )z`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   s   t dd S )NZ123)RuntimeErrorrB   r)   r)   r+   
__reduce__  s    z<test_parallel_pickling.<locals>.UnpicklableObject.__reduce__N)rI   rJ   rK   r   r)   r)   r)   r+   UnpicklableObject  s   r   zthe task to sendmatchr>   r.   rZ   c                 3   s   | ]}t t  V  qd S r2   r#   idr   r   r)   r+   r_     s   z)test_parallel_pickling.<locals>.<genexpr>r   N)objectr   r   r!   rb   r)   r)   r   r+   test_parallel_pickling  s
    r   	byteorder)<>=
max_nbytesZ1Mc                    s   dd  t dd|  djj}tdd|d fd	d
tdD }|D ]2\}}||ksjJ ||jjkszJ t j	| qVd S )Nc                 S   s   | | j jfS r2   )dtyper   r?   r)   r)   r+   inspect_byteorder  s    z=test_parallel_byteorder_corruption.<locals>.inspect_byteorder   )r>   r`   i4r>   r.   )r[   r8   r   c                 3   s   | ]}t  V  qd S r2   r#   r   r   r:   r)   r+   r_     s   z5test_parallel_byteorder_corruption.<locals>.<genexpr>r`   )
r   ZarangeZreshapeviewr   r   r!   rb   testingassert_array_equal)r   r   Zinitial_np_byteorderresultZ
x_returnedZbyteorder_in_workerr)   r   r+   "test_parallel_byteorder_corruption  s    r   c                 C   s0   t td| dddd tdD dks,J d S )Nr>      r[   r8   timeoutc                 s   s   | ]}t td V  qdS )gMbP?Nr   rs   r)   r)   r+   r_     s   z0test_parallel_timeout_success.<locals>.<genexpr>r   )r   r!   rb   r7   r)   r)   r+   test_parallel_timeout_success  s    r   c                 C   sL   t t0 td| dddd tdD  W d    n1 s>0    Y  d S )Nr>   r   r   c                 s   s   | ]}t td V  qdS r   Nr   rs   r)   r)   r+   r_     s   z-test_parallel_timeout_fail.<locals>.<genexpr>r   )r   r   r!   rb   r7   r)   r)   r+   test_parallel_timeout_fail  s    
r   
sequential	return_as	generatorgenerator_unorderedc                 C   sx   t t6 ttd| |dddd tdD  W d    n1 sD0    Y  ttd| |dddd tdD  d S )Nr>   r   )r[   r8   r   r   c                 s   s   | ]}t td V  qdS r   r   rs   r)   r)   r+   r_     s   z<test_parallel_timeout_fail_with_generator.<locals>.<genexpr>r   c                 s   s   | ]}t td V  qdS r   r   rs   r)   r)   r+   r_     s   )r   r   listr!   rb   r8   r   r)   r)   r+   )test_parallel_timeout_fail_with_generator  s    
"r   c              	   C   s  t d ur<tt0 td| ddd tddD  W d    n1 sH0    Y  tt* td| ddd dD  W d    n1 s0    Y  td| dr}t|jd usJ t|j}tt( |dd tddD  W d    n1 s0    Y  t|jd usJ t|j|us(J d	d td
D |dd td
D ksVJ t|j}tt" |dd dD  W d    n1 s0    Y  t|jd usJ t|j|usJ dd td
D |dd td
D ksJ |j	|j
|j|jfW d    n1 s0    Y  t|jd u s~J nBtt( tdddd dD  W d    n1 st0    Y  tt. tdddd tddD  W d    n1 s0    Y  tt. tddddd tdD  W d    n1 s0    Y  d S )Nr>   rZ   c                 S   s   g | ]\}}t t||qS r)   r#   r<   r*   r:   r;   r)   r)   r+   r,     r-   z&test_error_capture.<locals>.<listcomp>)r   r   )r   r   c                 S   s   g | ]}t t|qS r)   r#   rS   rs   r)   r)   r+   r,     r-   c                 S   s   g | ]\}}t t||qS r)   r   r   r)   r)   r+   r,     r-   c                 S   s   g | ]}t |d dqS r   r   rs   r)   r)   r+   r,     r-   r   c                 s   s   | ]}t t|d dV  qdS r   r}   rs   r)   r)   r+   r_     s   z%test_error_capture.<locals>.<genexpr>c                 S   s   g | ]}t t|qS r)   r   rs   r)   r)   r+   r,     r-   c                 S   s   g | ]}t |d dqS r   r   rs   r)   r)   r+   r,     r-   c                 s   s   | ]}t t|d dV  qdS r   r}   rs   r)   r)   r+   r_     s   rj   c                 S   s   g | ]}t t|qS r)   r   rs   r)   r)   r+   r,   "  r-   c                 S   s   g | ]\}}t t||qS r)   r   r   r)   r)   r+   r,   '  r-   r   )r[   ro   c                 s   s   | ]}t t|d dV  qdS )T)rO   Nr#   rP   r]   r)   r)   r+   r_   +  r-   r   )r   r   ZeroDivisionErrorr!   ziprR   r9   r   rb   
_iteratingZn_completed_tasksZn_dispatched_tasks	_abortingrA   )r8   r   Zoriginal_workersr)   r)   r+   test_error_capture  sT    


"

"

6

2$
8
>

r  c              	   C   s  ddd}t d| d}ttdd( |dd	 |dd
D  W d    n1 sR0    Y  ttdd( |dd	 |dd
D  W d    n1 s0    Y  ttdd( |dd	 |dd
D  W d    n1 s0    Y  W d    n1 s0    Y  d S )Nr   c                 s   s(   t dD ]}|| krtd|V  qd S )N   Iterator Raising Error)rb   rN   )raise_atr^   r)   r)   r+   my_generator2  s    z1test_error_in_task_iterator.<locals>.my_generatorr>   rZ   r  r   c                 s   s   | ]}t t|V  qd S r2   r\   r]   r)   r)   r+   r_   ;  r-   z.test_error_in_task_iterator.<locals>.<genexpr>)r  c                 s   s   | ]}t t|V  qd S r2   r\   r]   r)   r)   r+   r_   @  r-   rt   c                 s   s   | ]}t t|V  qd S r2   r\   r]   r)   r)   r+   r_   D  r-      )r   )r!   r   rN   )r8   r  r   r)   r)   r+   test_error_in_task_iterator/  s    
66r  c                 C   s   |  d|  d S )NzConsumed %s)ry   )queueitemr)   r)   r+   consumerG  s    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sPJ dS )	z=Test that with only one job, Parallel does act as a iterator.c                  3   s&   t dD ]}  d|   | V  qd S Nr   zProduced %irb   ry   r^   r	  r)   r+   producerx  s    z'test_dispatch_one_job.<locals>.producerr   r[   
batch_sizer8   c                 3   s   | ]}t t |V  qd S r2   r#   r  rs   r  r)   r+   r_   }  s   z(test_dispatch_one_job.<locals>.<genexpr>   N)r   r!   r   )r8   r  Zexpected_queuer  r)   r  r+   test_dispatch_one_jobK  s    +r!  c                    s   t  }|   fdd}tddd| d fdd| D  t }|d	 d
ksXJ |dd d}|dksvJ |d}||ksJ t dksJ dS )zRCheck that using pre_dispatch Parallel does indeed dispatch items
    lazily.
    c                  3   s&   t dD ]}  d|   | V  qd S r  r  r  r  r)   r+   r    s    z/test_dispatch_multiprocessing.<locals>.producerr>   r   r`   )r[   r  pre_dispatchr8   c                 3   s   | ]}t t d V  qdS )r   Nr  r   r  r)   r+   r_     s   z0test_dispatch_multiprocessing.<locals>.<genexpr>r   r  Nr   zConsumed anyri   r  r   )r   Managerr   r!   indexr   )r8   managerr  Zqueue_contentsZfirst_consumption_indexZproduced_3_indexr)   r  r+   test_dispatch_multiprocessing  s    
r&  c                  C   sZ   t dddd8} | dd tdD  | j dks8J W d    n1 sL0    Y  d S )	Nr>   autor/   r  c                 s   s   | ]}t t|V  qd S r2   r   r]   r)   r)   r+   r_     r-   z/test_batching_auto_threading.<locals>.<genexpr>  r   r!   rb   r   Zcompute_batch_size)r   r)   r)   r+   test_batching_auto_threading  s    r*  c                 C   sZ   t dd| d8}|dd tdD  |j dks8J W d    n1 sL0    Y  d S )Nr>   r'  r  c                 s   s   | ]}t t|V  qd S r2   r   r]   r)   r)   r+   r_     r-   z2test_batching_auto_subprocesses.<locals>.<genexpr>r(  r   r)  )r8   r   r)   r)   r+   test_batching_auto_subprocesses  s    r+  c                   C   sL   t t0 tdddddd tdD  W d   n1 s>0    Y  dS )	zCMake sure that exception raised during dispatch are indeed capturedr>      r   )r[   r"  ro   c                 s   s   | ]}t t|V  qd S r2   r   r]   r)   r)   r+   r_     s   z*test_exception_dispatch.<locals>.<genexpr>r   N)r   rN   r!   rb   r)   r)   r)   r+   test_exception_dispatch  s    
r-  c                 C   s    t dddd tdD  d S )Nr>   rj   c                 s   s   | ]}t t|V  qd S r2   r   r*   jr)   r)   r+   r_     r-   z(nested_function_inner.<locals>.<genexpr>r   ra   r  r)   r)   r+   nested_function_inner  s    r0  c                 C   s    t dddd tdD  d S )Nr>   rj   c                 s   s   | ]}t t|V  qd S r2   )r#   r0  r.  r)   r)   r+   r_     r-   z(nested_function_outer.<locals>.<genexpr>r   ra   r  r)   r)   r+   nested_function_outer  s    r1  z'https://github.com/joblib/loky/pull/255reasonc                 C   s   t t.}td| ddd tdD  W d   n1 s<0    Y  t|j|j|j}d|}d|v snJ d	|v szJ d
|v sJ t|jtu sJ 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>   rZ   c                 s   s   | ]}t t|V  qd S r2   )r#   r1  r]   r)   r)   r+   r_     s   z1test_nested_exception_dispatch.<locals>.<genexpr>r   N r1  r0  rP   )	r   rN   r!   rb   r	   rW   r   tbr   )r8   excinfoZreport_linesreportr)   r)   r+   test_nested_exception_dispatch  s    	
&
r8  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 r2   )r$   r[   r   )rB   r[   r   Zbackend_argsr)   r)   r+   	configure  s    zFakeParallelBackend.configurec                 C   s"   |dk rt t d | d}|S )Nr   r   )maxr   r"   rB   r[   r)   r)   r+   r$     s    z$FakeParallelBackend.effective_n_jobs)r   N)r   )rI   rJ   rK   rL   r:  r$   r)   r)   r)   r+   r9    s   
r9  c                	   C   s   t tdd tdd W d    n1 s,0    Y  t tdd: tdd W d    n1 sd0    Y  W d    n1 s0    Y  t tdd: tdd W d    n1 s0    Y  W d    n1 s0    Y  d S )NzInvalid backend:r   zunit-testingr7   )r   rN   r!   r&   r)   r)   r)   r+   test_invalid_backend  s    (<r=  c                 C   s0  t t }td| d  W d    n1 s.0    Y  dt|jv sJJ t t }td| d  W d    n1 sx0    Y  dt|jv sJ t t }td| d  W d    n1 s0    Y  dt|jv sJ t t }td| d  W d    n1 s0    Y  dt|jv s,J d S )Nr   rZ   z&n_jobs == 0 in Parallel has no meaning      ?z2.3z$n_jobs could not be converted to intZinvalid_str)r   rN   r!   Z_initialize_backendr   r   )r8   r6  r)   r)   r+   test_invalid_njobs  s    
.
.
.
0r?  )2gffffff@r>   c                 C   sP   t || d}| dksJ |dd tdD }tdd t|D sLJ d S )NrZ   r>   c                 s   s   | ]}t t|V  qd S r2   r\   r]   r)   r)   r+   r_     r-   z.test_njobs_converted_to_int.<locals>.<genexpr>r   c                 s   s   | ]\}}|t |kV  qd S r2   rr   )r*   r^   rr)   r)   r+   r_     r-   )r!   _effective_n_jobsrb   r   	enumerate)r8   r[   r   r   r)   r)   r+   test_njobs_converted_to_int  s    rD  c                   C   s>   z0t dt dtv sJ td tks(J W td= ntd= 0 d S )NZtest_backend)r'   r9  r    r)   r)   r)   r+   test_register_parallel_backend  s
    
rE  c                  C   s^   t j} t t ksJ z*tdtd dd t tks8J W | t _n| t _0 t t ksZJ d S )Nr/   T)Zmake_default)r   r3   rY   r4   r'   r    r   )Zdefault_backend_origr)   r)   r+   test_overwrite_default_backend%  s    rF  zOnly without multiprocessingc                   C   s   t tdd, tdddd tdD  W d    n1 s>0    Y  tdd( t dd tdD  W d    n1 s0    Y  d S )	Nz)joblib backend '.*' is not available on.*r   r.   r7   c                 s   s   | ]}t t|V  qd S r2   r\   r]   r)   r)   r+   r_   4  r-   z2test_backend_no_multiprocessing.<locals>.<genexpr>r`   c                 s   s   | ]}t t|V  qd S r2   r\   r]   r)   r)   r+   r_   8  r-   )r   UserWarningr!   rb   r&   r)   r)   r)   r+   test_backend_no_multiprocessing1  s    :rH  c                 C   s  | |dd t  \}}|dks&J tddks6J t }|jdksJJ |dkrvt|tu sbJ t|jtu sJ n|dkrt|tu sJ t|jtu sJ nX|dkrt|t	u sJ t|jt	u sJ n,|
drt|tu sJ t|jtu sJ W d    n1 s0    Y  d S )Nr`   rj   r(   r.   r/   Ztest_)r   rX   r$   r!   r[   rW   r   r   r   r   
startswithr9  )rh   backend_nameactive_backendactive_n_jobsr   r)   r)   r+   check_backend_context_manager;  s$    
rM  c                 C   s   g | ]}d | qS )ztest_backend_%dr)   r]   r)   r)   r+   r,   Q  r-   r`   c                    sr   |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snJ d S )Nr>   r/   rZ   c                 3   s    | ]}|st t |V  qd S r2   )r#   rM  )r*   rD   rh   r)   r+   r_   c  s   z/test_backend_context_manager.<locals>.<genexpr>)r    setitemr9  rY   r4   rM  r!    all_backends_for_context_manager)r   r8   rh   r)   rN  r+   test_backend_context_managerT  s    
rQ  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)rN   param)rB   rS  r)   r)   r+   rG   p  s    z%ParameterizedParallelBackend.__init__)NrH   r)   r)   r)   r+   rR  m  s   rR  c                 C   s   |  tdt t t ksJ |dddd~ t \}}t|tu sJJ |jdksXJ |dksdJ t	 }|j
dksxJ |j|u sJ |dd tdD }W d    n1 s0    Y  |dd	 tdD ksJ t t ksJ d S )
NZparam_backend*   r`   )rS  r[   c                 s   s   | ]}t t|V  qd S r2   r#   r   r]   r)   r)   r+   r_     r-   z=test_parameterized_backend_context_manager.<locals>.<genexpr>rt   c                 S   s   g | ]}t |qS r)   r   r]   r)   r)   r+   r,     r-   z>test_parameterized_backend_context_manager.<locals>.<listcomp>)rO  r    rR  rY   r4   r   rX   rW   rS  r!   r[   r   rb   )r   rh   rK  rL  r   r   r)   r)   r+   *test_parameterized_backend_context_managerv  s    4rV  c                 C   s   t  t ksJ | tdddd~ t \}}t|tu s@J |jdksNJ |dksZJ t }|jdksnJ |j	|u s|J |dd t
dD }W d    n1 s0    Y  |dd t
dD ksJ t  t ksJ d S )	N+   )rS  rt   rj   c                 s   s   | ]}t t|V  qd S r2   rU  r]   r)   r)   r+   r_     r-   zFtest_directly_parameterized_backend_context_manager.<locals>.<genexpr>c                 S   s   g | ]}t |qS r)   r   r]   r)   r)   r+   r,     r-   zGtest_directly_parameterized_backend_context_manager.<locals>.<listcomp>)rY   r4   rR  r   rX   rW   rS  r!   r[   r   rb   )rh   rK  rL  r   r   r)   r)   r+   3test_directly_parameterized_backend_context_manager  s    4rX  c                   C   s   t d t S )Nr   )r   osgetpidr)   r)   r)   r+   sleep_and_return_pid  s    r[  c                   C   s<   t  tksJ t  dks J tdddd tdD S )Nr   r>   rj   c                 s   s   | ]}t t V  qd S r2   )r#   r[  r   r)   r)   r+   r_     r-   z"get_nested_pids.<locals>.<genexpr>)rY   r   r!   rB  rb   r)   r)   r)   r+   get_nested_pids  s    r\  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 rV   )superr]  get_nested_backendr   	__class__r)   r+   r_    s    zMyBackend.get_nested_backend)rI   rJ   rK   rL   r_  __classcell__r)   r)   r`  r+   r]    s   r]  back_compat_backend)r/   r.   r(   rc  c                 C   sf   | |J t dddd tdD }|D ]}tt|dks*J q*W d    n1 sX0    Y  d S )Nr>   rj   c                 s   s   | ]}t t V  qd S r2   )r#   r\  r   r)   r)   r+   r_     r-   z6test_nested_backend_context_manager.<locals>.<genexpr>r   r   )r!   rb   r   r   )rh   r8   Z
pid_groupsZ	pid_groupr)   r)   r+   #test_nested_backend_context_manager  s    
rd  )r>   ri   Nc                    s|   dd t ddfddtdD  | d4 t dd fddtdD  W d    n1 sn0    Y  d S )	Nc                 S   s0   t  t|  ksJ t|}t  |ks,J d S r2   )rY   r    r$   r!   rB  )Zexpected_backend_typeZexpected_n_jobr)   r)   r+   check_nested_backend  s    z?test_nested_backend_in_sequential.<locals>.check_nested_backendr   rj   c                 3   s   | ]}t  tjd V  qdS r   )r#   r   r3   r   )re  r)   r+   r_     s   z4test_nested_backend_in_sequential.<locals>.<genexpr>r   c                 3   s   | ]}t  V  qd S r2   r   r   r8   re  r[   r)   r+   r_     s   ra   )r8   r[   rh   r)   rf  r+   !test_nested_backend_in_sequential  s    
rg  c                 C   sZ   | |>}| t u r|d }| tu r*|d }|j|ks8J W d    n1 sL0    Y  d S )Nr8   r   )r&   r%   nesting_level)rh   inner_backendZexpected_levelctxr8   r)   r)   r+   check_nesting_level  s    
rk  outer_backendri  c                    s~   t  |d td|d fddtdD   dd. t  fddtdD  W d    n1 sp0    Y  d S )	Nr   r>   rZ   c                 3   s   | ]}t t d V  qdS r   r#   rk  r   rh   ri  r)   r+   r_     s   z-test_backend_nesting_level.<locals>.<genexpr>r   rj   c                 3   s   | ]}t t d V  qdS r   rm  r   rn  r)   r+   r_     s   )rk  r!   rb   )rh   rl  ri  r)   rn  r+   test_backend_nesting_level  s    ro  with_retrieve_callbackTc                    s   dd l  G  fdddt}td| dd | dd}tddfd	d
tdD  | tu rt|d jdkstJ | tu r|d jdksJ W d    n1 s0    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 rk   r  r   r)   r)   r+   retrieval_context	  s    z;test_retrieval_context.<locals>.MyBackend.retrieval_contextN)rI   rJ   rK   r^   Zsupports_retrieve_callbackcontextmanagerrq  r)   )
contextlibrp  r)   r+   r]    s   r]  Z	retrievalc                 S   s   t dddd t| D S )Nr>   rj   c                 s   s   | ]}t t|V  qd S r2   r   r]   r)   r)   r+   r_     r-   z>test_retrieval_context.<locals>.nested_call.<locals>.<genexpr>ra   )nr)   r)   r+   nested_call  s    z+test_retrieval_context.<locals>.nested_callr>   rj   c                 3   s   | ]}t  |V  qd S r2   r   r]   )ru  r)   r+   r_     r-   z)test_retrieval_context.<locals>.<genexpr>rt   r8   r   )rs  r   r'   r!   rb   r&   r^   r%   )rh   rp  r]  rj  r)   )rs  ru  rp  r+   test_retrieval_context  s    	

 rv  r  )r   ri   gQ?c                 C   s6   t t t| d W d    n1 s(0    Y  d S )Nr  )r   rN   r!   rw  r)   r)   r+   test_invalid_batch_size  s    
rx  z)n_tasks, n_jobs, pre_dispatch, batch_size))r>   r>   r   r'  )r>   r>   r[   r'  r   r>   r[   r'  )i  r>   r[   r'  ry  )r   r   r[   r'  )   r   r[   r'  )   r   
2 * n_jobsr   )   r   r   r   )r}  r   r|  rM   )rz  r   r|  r'  c                 C   sN   |||d}dd t | D }tf i |dd t | D }||ksJJ d S )N)r[   r"  r  c                 S   s   g | ]}t |qS r)   rr   r]   r)   r)   r+   r,   :  r-   z0test_dispatch_race_condition.<locals>.<listcomp>c                 s   s   | ]}t t|V  qd S r2   r\   r]   r)   r)   r+   r_   ;  r-   z/test_dispatch_race_condition.<locals>.<genexpr>rv   )r   r[   r"  r  paramsr   r   r)   r)   r+   test_dispatch_race_condition%  s     r  c                  C   s8   t  } tddd}|jd}| }|| ks4J d S )Nr>   r(   rZ   rh   )r   get_start_methodr!   Z_backend_kwargsget)Zmp_start_methodr   rh   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(   r1   rT  i  r>   rZ   c                 3   s    | ]}t tj  jV  qd S r2   )r#   r   dotTr]   rC   r)   r+   r_   ^  r-   zAtest_no_blas_crash_or_freeze_with_subprocesses.<locals>.<genexpr>)
r   r0   r   randomZRandomStaterandnr  r  r!   rb   )r8   rngr)   r  r+   .test_no_blas_crash_or_freeze_with_subprocessesH  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  pytestskip,UNPICKLABLE_CALLABLE_SCRIPT_TEMPLATE_NO_MAINformatr   sys
executable)r8   coder)   r)   r+   2test_parallel_with_interactively_defined_functionsq  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(   r1   win32zNot picklable with pickle)r  r8   r  joblib_root_folderzunpicklable_func_script.pyr   r  r  )SQUARE_MAINr  platformr  r  )UNPICKLABLE_CALLABLE_SCRIPT_TEMPLATE_MAINr  rY  pathdirnamejoblib__file__r   writer   r  strpath)r8   r  r  tmpdirr  Z	code_filer)   r)   r+   0test_parallel_with_unpicklable_functions_in_args  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>   rj   )iterr!   )Zexhausted_iteratorr)   r)   r+   %test_parallel_with_exhausted_iterator)  s    r  c                 C   s"   t | tjstdt| |  S )Nz#Expected np.memmap instance, got %r)r   r   memmap	TypeErrorrW   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|| qd S )Nc                 s   s(   t | D ]}tjdtjd| V  qd S )Nr   r   )rb   r   onesZfloat32)rt  r^   r)   r)   r+   generate_arrays<  s    zBtest_auto_memmap_on_arrays_from_generator.<locals>.generate_arraysr>   r   r[   r   r8   c                 s   s   | ]}t t|V  qd S r2   r#   r  r*   rC   r)   r)   r+   r_   B  s   z<test_auto_memmap_on_arrays_from_generator.<locals>.<genexpr>rq   r   c                 s   s   | ]}t t|V  qd S r2   r  r  r)   r)   r+   r_   K  s   )r!   r   r   r   r   r   )r8   r  r   r   r   r)   r)   r+   )test_auto_memmap_on_arrays_from_generator4  s    r  c                 C   s   | S r2   r)   )argr)   r)   r+   identityR  s    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svJ  d j|ksJ tj|| d S )Nz	test.mmapZuint8r  rA  )Z	mmap_moder>   rj   c                 3   s   | ]}t t V  qd S r2   )r#   r  r   r  r)   r+   r_   ^  r-   z.test_memmap_with_big_offset.<locals>.<genexpr>)r   r   )r   r  mmapALLOCATIONGRANULARITYr   Zzerosr  r
   r   r!   r   r  offsetr   r   )r  fnamesizeobjr   r)   r  r+   test_memmap_with_big_offsetV  s    
r  c                  C   s   t jdd.} tddddd tdD  W d    n1 s@0    Y  t| dksZJ | d }t|jtsrJ t|jd	ksJ d S )
NTr   r   )r[   r   c                 s   s   | ]}t t|V  qd S r2   r\   r]   r)   r)   r+   r_   f  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!   rb   r   r   r   rG  r   )r   r   r)   r)   r+   3test_warning_about_timeout_not_supported_by_backendd  s    <r  c                 C   s   || |< |S r2   r)   )
input_listr$  r   r)   r)   r+   set_list_valueq  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 sRJ d S )	Nr   rt   r   r/   r[   r   r8   c                 3   s   | ]}t t ||V  qd S r2   )r#   r  r]   r  r)   r+   r_   |  s   zPtest_parallel_return_order_with_return_as_generator_parameter.<locals>.<genexpr>c                 s   s   | ]\}}||kV  qd S r2   r)   r*   vrA  r)   r)   r+   r_     r-   )r!   rb   r   r   r   )r[   r   r)   r  r+   =test_parallel_return_order_with_return_as_generator_parameterv  s    
r  c                 C   s   |rt d t| S )Nr   )r   r   )edelayr)   r)   r+   _sqrt_with_delay  s    r  c                    sp   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 sjJ  d S )Nr   r  c                 s   s$   | ]}t t|d  |dkV  qdS )r>   r   N)r#   r  r]   r)   r)   r+   r_     s   zK_test_parallel_unordered_generator_returns_fastest_first.<locals>.<genexpr>r   c                 3   s   | ]}t  V  qd S r2   )nextr   r   r)   r+   r_     r-   	   r   r>   c                 s   s   | ]\}}||kV  qd S r2   r)   r  r)   r)   r+   r_     r-   )r!   rb   sortedr   r   r   )r8   r[   Zquickly_returnedZexpected_quickly_returnedr)   r  r+   8_test_parallel_unordered_generator_returns_fastest_first  s    r  c                 C   s   t | | d S r2   )r  r8   r[   r)   r)   r+   7test_parallel_unordered_generator_returns_fastest_first  s    r  )r   r>   rn   ri   c                 C   sv   dgdgd  }t t2 t }t| |ddd |D  W d    n1 sP0    Y  t | }|dk srJ d S )NrC   r   rq   rZ   c                 s   s   | ]}t tj|V  qd S r2   r#   rQ   r   r]   r)   r)   r+   r_     r-   z%test_abort_backend.<locals>.<genexpr>r  )r   r  rQ   r!   )r[   r8   Zdelayst_startdtr)   r)   r+   test_abort_backend  s    
8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_object  s    r  c                 C   sZ   t || |d8}|dd tdD }t| t| ~W d    n1 sL0    Y  d S )N)r[   r8   r   c                 s   s   | ]}t t|V  qd S r2   )r#   r  r]   r)   r)   r+   r_     r-   z0_test_deadlock_with_generator.<locals>.<genexpr>r   )r!   rb   r  )r8   r   r[   r   r   r)   r)   r+   _test_deadlock_with_generator  s
    r  c                 C   s   t | || d S r2   )r  )r8   r   r[   r)   r)   r+   test_deadlock_with_generator  s    r  c                 C   s   t tddR t|| |d}|dd tdD }t }|dd tdD }W d    n1 sd0    Y  t | d	k sJ d
~d S )N)This Parallel instance is already runningr   r   c                 s   s   | ]}t td V  qdS r   r   r   r)   r)   r+   r_     r-   z/test_multiple_generator_call.<locals>.<genexpr>r   c                 s   s   | ]}t t|V  qd S r2   r   r]   r)   r)   r+   r_     r-   rq   r>   [The error should be raised immediately when submitting a new task but it took more than 2s.)r   r   r!   rb   rQ   )r8   r   r[   r   gr  Zgen2r)   r)   r+   test_multiple_generator_call  s    4r  c              	   C   s   t || |d}|dd tdD }t }ttdd& |dd tdD }W d    n1 sf0    Y  t | d	k sJ d
W d    n1 s0    Y  ~d S )Nr   c                 s   s   | ]}t td V  qdS r   r   r   r)   r)   r+   r_     r-   z7test_multiple_generator_call_managed.<locals>.<genexpr>r   r  r   c                 s   s   | ]}t t|V  qd S r2   r   r]   r)   r)   r+   r_     r-   rq   r>   r  )r!   rb   rQ   r   r   )r8   r   r[   r   r  r  g2r)   r)   r+   $test_multiple_generator_call_managed  s    4"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rRt|}|dkrbt|}tdd t|tdD sJ td	d t|tddD sJ d S )
Nr   c                 s   s   | ]}t t|d  V  qdS r>   NrU  r]   r)   r)   r+   r_     s   z9test_multiple_generator_call_separated.<locals>.<genexpr>r   c                 s   s   | ]}t t|d  V  qdS r  rU  r]   r)   r)   r+   r_     s   r  r   c                 s   s   | ]\}}||kV  qd S r2   r)   r*   r   r^   r)   r)   r+   r_     r-   c                 s   s   | ]\}}||kV  qd S r2   r)   r  r)   r)   r+   r_     r-   )r!   rb   r  r   r   )r8   r  r  r[   r  r  r)   r)   r+   &test_multiple_generator_call_separated  s     r  zbackend, error))r.   T)r/   F)r   Fc           
      C   sV  | 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	 }|l t

 }td| |ddd tddD }|dkrt|}tdd t|tddD sJ W d    n1 s0    Y  t

 | dk sJ d}	|jr"|	dk r"|	d7 }	t
d qt

 | dk s8J | dkrR|jsRJ d S )Nr.   zRequires multiprocessingr>   r   c                 s   s   | ]}t td V  qdS r   r   r]   r)   r)   r+   r_   &  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>'  r-   z;test_multiple_generator_call_separated_gc.<locals>.<lambda>z The executor underlying Parallelr   c                 s   s   | ]}t t|d  V  qdS r  rU  r]   r)   r)   r+   r_   3  s   r  r   c                 s   s   | ]\}}||kV  qd S r2   r)   r  r)   r)   r+   r_   :  r-   rt   r   r`   r   r>  )r   r  r  r!   rb   weakreffinalizer   r   r   rQ   r  r   r   aliver   rB  r  )
r8   r  r  errorr   r  Zg_wrrj  r  retryr)   r)   r+   )test_multiple_generator_call_separated_gc  s2    
@r  c                 C   s   |j }tdd| |dF}|dd tjdgd D  tt|dksNJ W d    n1 sb0    Y  tdD ]}t|s qtd	 qtt	d
tdd| d}|dd tjdgd D  tdD ]}t|s qtd	 qt	d
d S )Nr>   r   )r[   r   r8   Ztemp_folderc                 s   s   | ]}t t|V  qd S r2   r  r  r)   r)   r+   r_   V  r-   z(test_memmapping_leaks.<locals>.<genexpr>r   r   rq   r   z/temporary directory of Parallel was not removedr  c                 s   s   | ]}t t|V  qd S r2   r  r  r)   r)   r+   r_   f  r-   )
r  r!   r   r  r   rY  listdirrb   r   AssertionError)r8   r  r   r   r)   r)   r+   test_memmapping_leaksK  s      4

 

r  )Nr.   r/   c                 C   s<   t d| ddd tdD }|dd tdD ks8J d S )Nr>   rZ   c                 s   s   | ]}t d d |V  qdS )c                 S   s   | d S r=   r)   r?   r)   r)   r+   r  v  r-   z2test_lambda_expression.<locals>.<genexpr>.<lambda>Nr   r]   r)   r)   r+   r_   u  s   z)test_lambda_expression.<locals>.<genexpr>r   c                 S   s   g | ]}|d  qS r>   r)   r]   r)   r)   r+   r,   x  r-   z*test_lambda_expression.<locals>.<listcomp>ra   )r8   r   r)   r)   r+   test_lambda_expressionp  s    r  c                    s   d}d}d|  t d|| d}| fddt|D  |jj|jjksLJ |jj|jjks`J | fddt|D  |jj|jjksJ |jj|jjksJ d	S )
zCTest that a parallel backend correctly resets its batch statistics.r>   i  g       @r   )ro   r[   r8   c                 3   s   | ]}t tj V  qd S r2   r  r]   	task_timer)   r+   r_     r-   z6test_backend_batch_statistics_reset.<locals>.<genexpr>c                 3   s   | ]}t tj V  qd S r2   r  r]   r  r)   r+   r_     r-   N)r!   rb   r   Z_effective_batch_sizeZ_DEFAULT_EFFECTIVE_BATCH_SIZEZ_smoothed_batch_durationZ _DEFAULT_SMOOTHED_BATCH_DURATION)r8   r[   Zn_inputsr   r)   r  r+   #test_backend_batch_statistics_reset{  s     r  c                 C   s  dD ]x}t t|djt u 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 sJ | d	dd: tdd}t |jtu sJ |jdksJ W d    n1 s0    Y  | d	dd@ tddd}t |jtu s"J |jdks2J W d    n1 sH0    Y  | d	dd> tdd}t |jtu s~J |jdksJ W d    n1 s0    Y  | d	dd@ tddd}t |jtu sJ |jdksJ W d    n1 s0    Y  d S )N)r   r>   ri   rj   threadsr[   prefer	processes	sharedmemr[   requirer>   r.   )r[   r8   r  r  r`   r   r   )rW   r!   r   r4   r   r   r[   )rh   r[   r   r)   r)   r+   $test_backend_hinting_and_constraints  s4    
,0
0r  r  )Nr  r  c                 C   s   dd t dD }t| |ddd t dD }||ks<J t|| d( t dd t dD }W d    n1 sv0    Y  ||ksJ d S )	Nc                 S   s   g | ]}|d  qS r  r)   r]   r)   r)   r+   r,     r-   z7test_backend_hinting_always_running.<locals>.<listcomp>r   r  c                 s   s   | ]}t t|V  qd S r2   r\   r]   r)   r)   r+   r_     s   z6test_backend_hinting_always_running.<locals>.<genexpr>)r  r[   c                 s   s   | ]}t t|V  qd S r2   r\   r]   r)   r)   r+   r_     r-   )rb   r!   r&   )r[   r  Zexpected_resultsr   r)   r)   r+   #test_backend_hinting_always_running  s    6r  c                 C   s  G dd dt }|| L tddd}t|j|u s:J tddd}t|j|u sXJ W d    n1 sl0    Y  G dd	 d	t }||  tddd}t|j|u sJ |  \}}|d
ksJ |d
ksJ tdddd}t|jtu sJ |  \}}d}| |ksJ |d
ks$J W d    n1 s:0    Y  tt t| dd W d    n1 sr0    Y  d S )Nc                   @   s$   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   s   d S r2   r)   r   r)   r)   r+   apply_async  s    zgtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackend.apply_asyncc                 S   s   |S r2   r)   r<  r)   r)   r+   r$     s    zltest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackend.effective_n_jobsNrI   rJ   rK   Zsupports_sharedmemZuse_threadsr  r$   r)   r)   r)   r+   MyCustomThreadingBackend  s   r  r>   r  r  r  r  c                   @   s$   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>.MyCustomProcessingBackendFc                 S   s   d S r2   r)   r   r)   r)   r+   r    s    zhtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackend.apply_asyncc                 S   s   |S r2   r)   r<  r)   r)   r+   r$     s    zmtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackend.effective_n_jobsNr  r)   r)   r)   r+   MyCustomProcessingBackend  s   r  r4  r   )r[   r   ro   zUsing ThreadingBackend as joblib backend instead of MyCustomProcessingBackend as the latter does not provide shared memory semantics.r8   r   )	r   r!   rW   r   Z
readouterrr   stripr   rN   )Zcapsysrh   r  r   r  outerrr   r)   r)   r+   9test_backend_hinting_and_constraints_with_custom_backends  s,    
0
.
r  c                   C   s  t t tdd W d    n1 s(0    Y  t t tdd W d    n1 sZ0    Y  t t tddd W d    n1 s0    Y  td urt t tddd W d    n1 s0    Y  t t td	dd W d    n1 s0    Y  d S )
Ninvalidr  r  r  r  )r  r   r.   r	  r(   )r   rN   r!   r   r)   r)   r)   r+   ,test_invalid_backend_hinting_and_constraints  s    
(
(
*

*
r  c                    s   t ddh}t|jj|jjfg}dkr<|W  d   S | fddtdD }||d  W  d   S 1 sx0    Y  dS )zCPerform nested parallel calls and introspect the backend on the wayr>   rj   r   Nc                 3   s(   | ] }t tf d d i V  qdS )limitr   N)r#   _recursive_backend_infor]   r  r  r)   r+   r_   '  s   z*_recursive_backend_info.<locals>.<genexpr>r   )r!   rW   r   rI   rh  rb   )r  r  r   Z
this_levelr   r)   r  r+   r     s    r  c                 C   s^   | |dd t  }W d    n1 s(0    Y  | d }|dfdddg}||ksZJ d S )Nr>   rj   Backendr   )r   r   )r   r>   )r  title)rh   r8   Zbackend_types_and_levelsZtop_level_backend_typeZexpected_types_and_levelsr)   r)   r+   test_nested_parallelism_limit.  s    $r  c                 C   s   t  dd tdD S )z6A horrible function that does recursive parallel callsc                 s   s   | ]}t t V  qd S r2   )r#   _recursive_parallelr]   r)   r)   r+   r_   A  r-   z&_recursive_parallel.<locals>.<genexpr>r>   ra   )Znesting_limitr)   r)   r+   r  ?  s    r  c              	   C   s   | |dd> t t}t  W d    n1 s20    Y  W d    n1 sP0    Y  |j}|dkrddlm} t||tfrt	d t|t
sJ d S )Nr>   rj   r.   r   )TerminatedWorkerErrorz1Loky worker crash when serializing RecursionError)r   BaseExceptionr  r   Z&joblib.externals.loky.process_executorr  r   r   r  xfailRecursionError)rh   r8   r6  excr  r)   r)   r+   test_thread_bomb_mitigationD  s    
B
r  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_IPCrq   )rY  environr  r   )Zenv_varsvarr)   r)   r+   _run_parallel_sum`  s    	r#  zNeed OpenMP helper compiledc                 C   s   t d| ddd tdD }tt d d}|D ]Z\}}||ksFJ | D ]<\}}|drr|t|ksJ qN|dks~J |dksNJ qNq2d S )	Nr>   rZ   c                 s   s   | ]}t t V  qd S r2   )r#   r#  r   r)   r)   r+   r_   r  s   z-test_parallel_thread_limit.<locals>.<genexpr>r   Z_THREADSr   1)r!   rb   r;  r"   itemsendswithr   )r8   r   Zexpected_num_threadsZworker_env_varsZomp_num_threadsr   r   r)   r)   r+   test_parallel_thread_limito  s    
r'  zThis test requires daskc                 C   s8   t tdd | d W d    n1 s*0    Y  d S )NzPlease install daskr   Zdask)r   rN   rN  r)   r)   r+   )test_dask_backend_when_dask_not_installed  s    r(  c              	   C   s   G dd dt }d}| | Z tjt|d, tdddd tdD  W d    n1 s`0    Y  W d    n1 s~0    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                 _   s   dS rV   r)   )rB   r   r  r)   r)   r+   r:    s    z=test_zero_worker_backend.<locals>.ZeroWorkerBackend.configureNc                 S   s   t dd S )NzNo worker availabler   )rB   funccallbackr)   r)   r+   r    s    z?test_zero_worker_backend.<locals>.ZeroWorkerBackend.apply_asyncc                 S   s   dS rV   r)   r<  r)   r)   r+   r$     s    zDtest_zero_worker_backend.<locals>.ZeroWorkerBackend.effective_n_jobs)N)rI   rJ   rK   r:  r  r$   r)   r)   r)   r+   ZeroWorkerBackend  s   
r+  z&ZeroWorkerBackend has no active workerr   r>   rj   c                 s   s   | ]}t t|V  qd S r2   r   r]   r)   r)   r+   r_     r-   z+test_zero_worker_backend.<locals>.<genexpr>)r   r  r   r   r!   rb   )rh   r+  Zexpected_msgr)   r)   r+   test_zero_worker_backend  s
    
r,  c                     s   da dd    dksJ tdd fddtdD } t| dhksLJ da   dks^J tdd fd	dtdD } t| dhksJ d S )
Nzoriginal valuec                   S   s   t S r2   )MY_GLOBAL_VARIABLEr)   r)   r)   r+   check_globals  s    z@test_globals_update_at_each_parallel_call.<locals>.check_globalsr>   rj   c                 3   s   | ]}t   V  qd S r2   r   r]   r.  r)   r+   r_     s   z<test_globals_update_at_each_parallel_call.<locals>.<genexpr>zchanged valuec                 3   s   | ]}t   V  qd S r2   r   r]   r/  r)   r+   r_     s   )r-  r!   rb   r   )Zworkers_global_variabler)   r/  r+   )test_globals_update_at_each_parallel_call  s    r0  c                  C   s4   dd l } | jdd}| || td}| S )Nr   rq   threadpoolctl)numpyr  r  r  r  ZimportorskipZthreadpool_info)r   rC   r1  r)   r)   r+   _check_numpy_threadpool_limits  s
    
r3  c                 C   s8   |D ] }|d | d kr|d   S qt d| d S )Nfilepathnum_threadsz,An unexpected module was loaded in child:
{})rN   r  )child_moduleparent_infoparent_moduler)   r)   r+   _parent_max_num_threads_for  s    r9  c                 C   s@   | D ]6}|D ],}t ||}t|||h}|d |v sJ qqd S )Nr5  )r9  min)Zworkers_infor7  r5  Zchild_threadpool_infor6  Zparent_max_num_threadsr   r)   r)   r+   check_child_num_threads  s    r;  )r>   r   rn   ri   c                 C   sz   t  }t|dkrtjdd td| ddd tdD }t| } | d	krZ|d d
 }ntt |  d	}t	||| d S )Nr   &Need a version of numpy linked to BLASr2  r.   r  c                 s   s   | ]}t t V  qd S r2   r#   r3  r]   r)   r)   r+   r_     s   z;test_threadpool_limitation_in_child_loky.<locals>.<genexpr>r>   r   r5  
r3  r   r  r  r!   rb   r$   r;  r"   r;  )r[   r7  workers_threadpool_infosexpected_child_num_threadsr)   r)   r+   (test_threadpool_limitation_in_child_loky  s    rA  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\0    Y  t|}|d
kr|d d }n|d u rtt | d
}n|}t	||| d S )Nr   r<  r2  r.   rB  rj   c                 s   s   | ]}t t V  qd S r2   r=  r]   r)   r)   r+   r_     s   z>test_threadpool_limitation_in_child_context.<locals>.<genexpr>r>   r   r5  r>  )rh   r[   rB  r7  r?  r@  r)   r)   r+   +test_threadpool_limitation_in_child_context  s     
&rD  var_name)r  r  r  c              	      s  t |dkrtd tdd  dd  tj}zdtj< t|d fd	d
t	dD }|ddgksvJ | ddd2 t|d fdd
t	dD }W d    n1 s0    Y  |ddgksJ W |d u rtj= n
|tj< n |d u rtj= n
|tj< 0 d S )Nr   zSkip test when n_jobs == 1TZreusec                 S   s   t j| S r2   )rY  r!  r  )rE  r)   r)   r+   _get_env,  s    z>test_threadpool_limitation_in_child_override.<locals>._get_env4rj   c                 3   s   | ]}t  V  qd S r2   r   r]   rG  rE  r)   r+   r_   3  r-   z?test_threadpool_limitation_in_child_override.<locals>.<genexpr>r>   r.   rC  c                 3   s   | ]}t  V  qd S r2   r   r]   rI  r)   r+   r_   7  s   r$  )
r$   r  r  r   shutdownrY  r!  r  r!   rb   )rh   r[   rE  Zoriginal_var_valuer   r)   rI  r+   ,test_threadpool_limitation_in_child_override  s(    	

"&


rK  )r>   r   ri   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   rj   c                 3   s   | ]}t t V  qd S r2   )r#   sumr]   r?   r)   r+   r_   K  r-   zAtest_loky_reuse_workers.<locals>.parallel_call.<locals>.<genexpr>rv   rj   r)   r?   r+   parallel_callI  s    z.test_loky_reuse_workers.<locals>.parallel_callTrF  r   )r   rb   )r[   rM  Zfirst_executorr   r   r)   r)   r+   test_loky_reuse_workersC  s    

rN  c                 C   s   d| t  < d S )Ninitialized)rY  rZ  )statusr)   r)   r+   _set_initializedY  s    rQ  c                 C   s   t  }| |d }|dv s*J d| |s2d S d| |< t d }tdd |  D }t |k r||k rtd tdd |  D }q\t |krtd	|S )
N)rO  startedz2worker should have been in initialized state, got rR  r   c                 S   s   g | ]\}}|d kr|qS rR  r)   r*   pidr  r)   r)   r+   r,   i  r-   z!_check_status.<locals>.<listcomp>r   c                 S   s   g | ]\}}|d kr|qS rS  r)   rT  r)   r)   r+   r,   l  r-   z-Waited more than 30s to start all the workers)rY  rZ  r  rQ   r   r%  r   r   )rP  r[   wait_workersrU  statedeadlineZ	n_startedr)   r)   r+   _check_status]  s     

rY  c                    sd   t  }| || tfd. t  fddtdD  W d    n1 sV0    Y  d S )Nr8   r[   ZinitializerZinitargsc                 3   s   | ]}t t V  qd S r2   r#   rY  r]   r[   rP  r)   r+   r_     r-   z+test_initializer_context.<locals>.<genexpr>rq   )r   r#  dictrQ  r!   rb   )r[   r8   rh   r%  r)   r\  r+   test_initializer_contextt  s    r^  c                    s>   t  }| t| tfd fddtdD  d S )NrZ  c                 3   s   | ]}t t V  qd S r2   r[  r]   r\  r)   r+   r_     r-   z,test_initializer_parallel.<locals>.<genexpr>rq   )r   r#  r]  r!   rQ  rb   )r[   r8   r%  r)   r\  r+   test_initializer_parallel  s    r_  c                    sx   d}t  }| t }t|D ]<}td tfd fddt D }|t|}q"t| kstJ dd S )Nr`   r.   rZ  c                 3   s    | ]}t t d dV  qdS T)rV  Nr[  r]   r\  r)   r+   r_     s   z*test_initializer_reused.<locals>.<genexpr>z=The workers should be reused when the initializer is the same)	r   r#  r]  r   rb   r!   rQ  unionr   r[   Zn_repetitionsr%  Zpidsr^   r   r)   r\  r+   test_initializer_reused  s&    	rc  c                    s|   d}t  }t }t|D ]D}| td tfd fddt D }|t|}qt||  ksxJ dd S )Nr`   r.   rZ  c                 3   s    | ]}t t d dV  qdS r`  r[  r]   r\  r)   r+   r_     s   z.test_initializer_not_reused.<locals>.<genexpr>zFThe workers should not be reused when the initializer arguments change)	r   r#  r   rb   r]  r!   rQ  ra  r   rb  r)   r\  r+   test_initializer_not_reused  s&    	rd  )F)r   r   )r`   )N)F)rL   r  rY  r~   r  r/   rQ   r   r  rs  r   mathr   r(   r   pickler   r   	tracebackr	   r  r  r
   r   r   Zjoblib._multiprocessing_helpersr   Zjoblib.test.commonr   r   r   r   Zjoblib.testingr   r   r   r   r   Zjoblib.externals.lokyr   r	  r   posixImportErrorZ _openmp_test_helper.parallel_sumr   distributedZjoblib._parallel_backendsr   r   r   r   r   Zjoblib.parallelr    r!   r"   r#   r$   r%   r&   r'   r  ZRETURN_GENERATOR_BACKENDSpopr  keysZALL_VALID_BACKENDSZPROCESS_BACKENDSZPARALLEL_BACKENDShasattrry   r0   r4   r9   r<   r@   	ExceptionrA   rP   rS   rU   rY   rd   re   rg   markrm   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r!  r&  r*  r+  r-  r0  r1  r  r8  r9  r=  r?  rD  rE  rF  rH  rM  rP  extendrb   rQ  rR  rV  rX  r[  r\  Z_parallel_backendsr]  rd  rg  rk  ro  rv  rx  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  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  Zno_coverr  r#  r'  r(  r,  r0  r3  r9  r;  rA  rD  rK  rN  rQ  rY  r^  r_  rc  rd  r)   r)   r)   r+   <module>   s  



,



*




F(


	
		





	



 (+



	


,".6$	#