o
    \i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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/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reCGe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 rBd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͐dT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 (X  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    ).0backend_strr)   r)   z/var/www/www-root/data/www/176.119.141.140/sports-predictor/venv/lib/python3.10/site-packages/joblib/test/test_parallel.py
<listcomp>R   s    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_pool_workers)getattrbackendr)   r)   r,   get_workersf   s   r:   c                 C   s   | | S r2   r)   )xyr)   r)   r,   divisionj      r=   c                 C      | d S N   r)   r;   r)   r)   r,   squaren   r>   rC   c                   @   s   e Zd ZdZdd ZdS )MyExceptionWithFinickyInitz,An exception class with non trivial __init__c                 C      d S r2   r)   )selfabcdr)   r)   r,   __init__u      z#MyExceptionWithFinickyInit.__init__N__name__
__module____qualname____doc__rK   r)   r)   r)   r,   rD   r       rD   Fc                 C   s"   | dkr|rt ddddt| S )N   rG   rH   rI   rJ   )rD   
ValueError)r;   custom_exceptionr)   r)   r,   exception_raisery   s   rV   c                 C   s   t d t)Ng?)timer   KeyboardInterruptrB   r)   r)   r,   interrupt_raiser   s   
rY   c                 C   s   | d | | S )zNA module-level function so that it can be spawn with
    multiprocessing.
    rA   r)   )r;   r<   zr)   r)   r,   f   s   r[   c                   C   s   t t d S Nr   )typer   get_active_backendr)   r)   r)   r,   _active_backend_type      r_   c                 C   s   t | |ddd tdD S )Nn_jobsr9   c                 s       | ]	}t t|V  qd S r2   r#   rC   r*   ir)   r)   r,   	<genexpr>       
z parallel_func.<locals>.<genexpr>   r!   range)inner_n_jobsr9   r)   r)   r,   parallel_func   s   rm   c                   C      t  dksJ d S r\   )r"   r)   r)   r)   r,   test_cpu_count      ro   c                   C   rn   r\   r$   r)   r)   r)   r,   test_effective_n_jobs   rp   rr   contextzbackend_n_jobs, expected_n_jobs)ri   ri   rb   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 )Nr/   ru   r   rq   )rs   backend_n_jobsexpected_n_jobsr)   r)   r,   test_effective_n_jobs_None   s   
r{   r9   rb   )r   rA   rt   verbose)rA      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)   rC   r*   r;   r)   r)   r,   r-          z(test_simple_parallel.<locals>.<listcomp>   rb   r9   r}   c                 s   rc   r2   rd   r   r)   r)   r,   rg          z'test_simple_parallel.<locals>.<genexpr>rk   r!   )r9   rb   r}   r)   r)   r,   test_simple_parallel   s
   r   rA   c                 C   s   d}t d}G dd dt}||| dd}|dd t|D  t }|jD ]}|| }r=| \}	}
||
|	  q't	|d	ksFJ d S )
Nr   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)rF   msgr)   r)   r,   _print   r`   z6test_parallel_pretty_print.<locals>.ParallelLog._printN)rN   rO   rP   r   r   r)   r)   r)   r,   ParallelLog   rR   r   i'  r   c                 S      g | ]}t t|qS r)   r#   r[   re   r)   r)   r,   r-          z.test_parallel_pretty_print.<locals>.<listcomp>r   )
recompiler!   rk   setr   searchspanaddlen)r9   rb   n_taskspatternr   executorlensmessagesrG   rH   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s(J W d    n1 s2w   Y  dd |D }| dv sGt| trRd  fdd|D }t	|dksZJ d S )Nname!some_new_name_for_the_main_thread)targetr   valueTrecordrA   ra   c                 s   rc   r2   rd   r   r)   r)   r,   rg      rh   z6test_main_thread_renamed_no_warning.<locals>.<genexpr>ri   )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   )
setattrr/   current_threadwarningscatch_warningsr!   rk   r   r   r   )r9   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 }|rI|rGtdd |D }tr=t|d	knt|d	k}|oF|S d
S |rMJ dS )NTr   always)r9   rl   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*   eachr)   r)   r,   rg   
      
z)_assert_warning_nested.<locals>.<genexpr>r   F)r   r   simplefilterrm   allr   r   )r9   rl   expectedr   warnings_are_correct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                    sn   t d| d fddtdD  t d| d fddtdD }| dkr/t|s-J d S t|s5J d S )NrA   ra   c                 3   s"    | ]}t t d ddV  qdS )r   Fr9   rl   r   Nr#   r   r*   _child_backendr)   r,   rg   (      
z0test_nested_parallel_warnings.<locals>.<genexpr>r   c                 3   s"    | ]}t t d dV  qdS )rA   r   Nr   r   r   r   r)   r,   rg   0  r   r/   )r!   rk   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w   Y  tt| t|dk| d< d S )	NTr   rA   ru   c                 s       | ]	}t td V  qdS )皙?Nr#   r   r   r)   r)   r,   rg   F  r   zPtest_background_thread_parallelism.<locals>.background_thread.<locals>.<genexpr>r   r   )r   r   r!   rk   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)r9   r   r   tr)   r)   r,   "test_background_thread_parallelism?  s   r   c                 C   s"   t d| ddd tdD  d S )NrA   ra   c                 s   r   {Gz?Nrd   r   r)   r)   r,   rg   Q  r   znested_loop.<locals>.<genexpr>rj   r8   r)   r)   r,   nested_loopP  s   "r   r   r   c                    s&   t d| d fddtdD  d S )NrA   ra   c                 3       | ]	}t t V  qd S r2   )r#   r   r   r   r)   r,   rg   W  rh   z#test_nested_loop.<locals>.<genexpr>rj   )r   r   r)   r   r,   test_nested_loopT  s   r   c                 C   s   t r2   )rT   r8   r)   r)   r,   raise_exception\  rL   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 )NrA   r.   ra   )r   rT   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   )maxsizerA   r/   ra   c                 3   s    | ]
}t  jd V  qdS r   N)r#   putr   qr)   r,   rg   j      z1test_mutate_input_with_threads.<locals>.<genexpr>N)r   r!   rk   fullr)   r)   r   r,   test_mutate_input_with_threadsg  s   
"r   )r   rA   ri   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<   r[   r   r)   r)   r,   r-   r  r   z(test_parallel_kwargs.<locals>.<listcomp>ru   c                 s        | ]}t t|d dV  qdS r   r   Nr   r   r)   r)   r,   rg   r      
z'test_parallel_kwargs.<locals>.<genexpr>Nr   )rb   lstr)   r)   r,   test_parallel_kwargsn  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-   z  r   z4test_parallel_as_context_manager.<locals>.<listcomp>r   ra   c                 s   r   r   r   r   r)   r)   r,   rg         z3test_parallel_as_context_manager.<locals>.<genexpr>c                 s   r   r   r   r   r)   r)   r,   rg     r   c                 s   r   r   r   r   r)   r)   r,   rg     r   )rk   r!   _backendr   r:   )r9   r   r   pmanaged_backendr)   r)   r,    test_parallel_as_context_managerw  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 )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      t d)N123)RuntimeErrorrF   r)   r)   r,   
__reduce__  r>   z<test_parallel_pickling.<locals>.UnpicklableObject.__reduce__N)rN   rO   rP   r   r)   r)   r)   r,   UnpicklableObject  s    r   zthe task to sendmatchrA   r.   ra   c                 3   s    | ]
}t t  V  qd S r2   r#   idr   r   r)   r,   rg     r   z)test_parallel_pickling.<locals>.<genexpr>r   N)objectr   r   r!   rk   r)   r)   r   r,   test_parallel_pickling  s   
"r  	byteorder)<>=
max_nbytes1Mc                    s   dd  t dd|  djj}tdd|d fd	d
tdD }|D ]\}}||ks5J ||jjks=J t j	| q+d S )Nc                 S   s   | | j jfS r2   )dtyper  rB   r)   r)   r,   inspect_byteorder     z=test_parallel_byteorder_corruption.<locals>.inspect_byteorder   )rA   ri   i4rA   r.   )rb   r9   r  c                 3       | ]	}t  V  qd S r2   r#   r   r	  r;   r)   r,   rg     rh   z5test_parallel_byteorder_corruption.<locals>.<genexpr>ri   )
r   arangereshapeviewr  r  r!   rk   testingassert_array_equal)r  r  initial_np_byteorderresult
x_returned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 )NrA      rb   r9   timeoutc                 s   r   )gMbP?Nr   r   r)   r)   r,   rg     rh   z0test_parallel_timeout_success.<locals>.<genexpr>r   )r   r!   rk   r8   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 )NrA   r   r  c                 s   r   r   Nr   r   r)   r)   r,   rg     rh   z-test_parallel_timeout_fail.<locals>.<genexpr>r   )r   r   r!   rk   r8   r)   r)   r,   test_parallel_timeout_fail  s
   

"r  
sequential	return_as	generatorgenerator_unorderedc                 C   sx   t t ttd| |dddd tdD  W d    n1 s"w   Y  ttd| |dddd tdD  d S )NrA   r   )rb   r9   r!  r  c                 s   r   r  r   r   r)   r)   r,   rg     rh   z<test_parallel_timeout_fail_with_generator.<locals>.<genexpr>r   c                 s   r   r   r   r   r)   r)   r,   rg     rh   )r   r   listr!   rk   r9   r!  r)   r)   r,   )test_parallel_timeout_fail_with_generator  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 )NrA   ra   c                 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   r   r)   r#   rY   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,   rg     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,   rg     r   ru   c                 S   r   r)   r*  r   r)   r)   r,   r-   "  r   c                 S   r'  r)   r(  r)  r)   r)   r,   r-   '  r   r   )rb   r}   c                 s   r   )T)rU   Nr#   rV   re   r)   r)   r,   rg   +  r   r  )r   r   ZeroDivisionErrorr!   ziprX   r:   r   rk   
_iteratingn_completed_tasksn_dispatched_tasks	_abortingrD   )r9   r   original_workersr)   r)   r,   test_error_capture  sd   








'

 

$r3  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)rk   rT   )raise_atrf   r)   r)   r,   my_generator2  s   z1test_error_in_task_iterator.<locals>.my_generatorrA   ra   r5  r   c                 s   rc   r2   rd   re   r)   r)   r,   rg   ;  r   z.test_error_in_task_iterator.<locals>.<genexpr>)r6  c                 s   rc   r2   rd   re   r)   r)   r,   rg   @  r   r   c                 s   rc   r2   rd   re   r)   r)   r,   rg   D  r      r   )r!   r   rT   )r9   r7  r   r)   r)   r,   test_error_in_task_iterator/  s   
"r:  c                 C   s   |  d|  d S )NzConsumed %s)r   )queueitemr)   r)   r,   consumerG  rp   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@  rB  rD  r?  rA  rC  rE  rF  rH  rG  rI  c                    sT   t    fdd}td|| d fdd| D   |ks J t dks(J dS )	z=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rk   r   rf   r;  r)   r,   producerx  
   z'test_dispatch_one_job.<locals>.producerr   rb   
batch_sizer9   c                 3   s    | ]
}t t |V  qd S r2   r#   r=  r   rN  r)   r,   rg   }  r   z(test_dispatch_one_job.<locals>.<genexpr>   N)r$  r!   r   )r9   rR  expected_queuerO  r)   rN  r,   test_dispatch_one_jobK  s   +rV  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 )zRCheck that using pre_dispatch Parallel does indeed dispatch items
    lazily.
    c                  3   rJ  rK  rL  rM  rN  r)   r,   rO    rP  z/test_dispatch_multiprocessing.<locals>.producerrA   r   ri   )rb   rR  pre_dispatchr9   c                 3   s    | ]
}t t d V  qdS )r   NrS  r   rN  r)   r,   rg     r   z0test_dispatch_multiprocessing.<locals>.<genexpr>r   r>  Nr   zConsumed anyrt   rD  rT  )r   Managerr$  r!   indexr   )r9   managerrO  queue_contentsfirst_consumption_indexproduced_3_indexr)   rN  r,   test_dispatch_multiprocessing  s   
r^  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 )	NrA   autor/   rQ  c                 s   rc   r2   r   re   r)   r)   r,   rg     r   z/test_batching_auto_threading.<locals>.<genexpr>  r   r!   rk   r   compute_batch_size)r   r)   r)   r,   test_batching_auto_threading  s   "rc  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 )NrA   r_  rQ  c                 s   rc   r2   r   re   r)   r)   r,   rg     r   z2test_batching_auto_subprocesses.<locals>.<genexpr>r`  r   ra  )r9   r   r)   r)   r,   test_batching_auto_subprocesses  s   "rd  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 capturedrA      r   )rb   rW  r}   c                 s   rc   r2   r+  re   r)   r)   r,   rg     rh   z*test_exception_dispatch.<locals>.<genexpr>r  N)r   rT   r!   rk   r)   r)   r)   r,   test_exception_dispatch  s
   

"rf  c                 C       t dddd tdD  d S )NrA   ru   c                 s   rc   r2   r+  r*   jr)   r)   r,   rg     r   z(nested_function_inner.<locals>.<genexpr>r  rj   rM  r)   r)   r,   nested_function_inner      rj  c                 C   rg  )NrA   ru   c                 s   rc   r2   )r#   rj  rh  r)   r)   r,   rg     r   z(nested_function_outer.<locals>.<genexpr>r  rj   rM  r)   r)   r,   nested_function_outer  rk  rl  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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.
    rA   ra   c                 s   rc   r2   )r#   rl  re   r)   r)   r,   rg     rh   z1test_nested_exception_dispatch.<locals>.<genexpr>r  N rl  rj  rV   )	r   rT   r!   rk   r	   r]   r   tbr   )r9   excinforeport_linesreportr)   r)   r,   test_nested_exception_dispatch  s   
	

rt  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$   rb   r   )rF   rb   r   backend_argsr)   r)   r,   	configure  s   zFakeParallelBackend.configurec                 C   s"   |dk rt t d | d}|S )Nr   r   )maxr   r"   rF   rb   r)   r)   r,   r$     s   z$FakeParallelBackend.effective_n_jobsr   )r   )rN   rO   rP   rQ   rw  r$   r)   r)   r)   r,   ru    s    
ru  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-testingr8   )r   rT   r!   r&   r)   r)   r)   r,   test_invalid_backend  s    "rz  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   ra   z&n_jobs == 0 in Parallel has no meaning      ?z2.3z$n_jobs could not be converted to intinvalid_str)r   rT   r!   _initialize_backendr   r   )r9   rq  r)   r)   r,   test_invalid_njobs  s    



r~  )2gffffff@rA   c                 C   sP   t || d}| dksJ |dd tdD }tdd t|D s&J d S )Nra   rA   c                 s   rc   r2   rd   re   r)   r)   r,   rg     r   z.test_njobs_converted_to_int.<locals>.<genexpr>r   c                 s   s     | ]\}}|t |kV  qd S r2   r   )r*   rf   rr)   r)   r,   rg     r   )r!   _effective_n_jobsrk   r   	enumerate)r9   rb   r   r   r)   r)   r,   test_njobs_converted_to_int  s   r  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 )Ntest_backend)r'   ru  r    r)   r)   r)   r,   test_register_parallel_backend  s
   
r  c                  C   s^   t j} t t ksJ ztdtd dd t tksJ W | t _n| t _w t t ks-J d S )Nr/   T)make_default)r   r3   r_   r4   r'   r    r   )default_backend_origr)   r)   r,   test_overwrite_default_backend%  s   r  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   r.   r8   c                 s   rc   r2   rd   re   r)   r)   r,   rg   4  r   z2test_backend_no_multiprocessing.<locals>.<genexpr>ri   c                 s   rc   r2   rd   re   r)   r)   r,   rg   8  r   )r   UserWarningr!   rk   r&   r)   r)   r)   r,   test_backend_no_multiprocessing1  s   "r  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 )Nri   ru   r(   r.   r/   test_)r   r^   r$   r!   rb   r]   r   r   r   r   
startswithru  )rs   backend_nameactive_backendactive_n_jobsr   r)   r)   r,   check_backend_context_manager;  s8   
"r  c                 C   s   g | ]}d | qS )ztest_backend_%dr)   re   r)   r)   r,   r-   Q  r   ri   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s7J d S )NrA   r/   ra   c                 3   s"    | ]}|st t |V  qd S r2   )r#   r  )r*   rH   rs   r)   r,   rg   c  s    
z/test_backend_context_manager.<locals>.<genexpr>)r    setitemru  r_   r4   r  r!    all_backends_for_context_manager)r   r9   rs   r)   r  r,   test_backend_context_managerT  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)rT   param)rF   r  r)   r)   r,   rK   p  s   
z%ParameterizedParallelBackend.__init__r2   rM   r)   r)   r)   r,   r  m  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s2J t	 }|j
dks<J |j|u sCJ |dd tdD }W d    n1 sXw   Y  |dd	 tdD ksjJ t t ksrJ d S )
Nparam_backend*   ri   )r  rb   c                 s   rc   r2   r#   r   re   r)   r)   r,   rg     r   z=test_parameterized_backend_context_manager.<locals>.<genexpr>r   c                 S   r   r)   r   re   r)   r)   r,   r-     r   z>test_parameterized_backend_context_manager.<locals>.<listcomp>)r  r    r  r_   r4   r   r^   r]   r  r!   rb   r   rk   )r   rs   r  r  r   r   r)   r)   r,   *test_parameterized_backend_context_managerv  s   	r  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s7J |j	|u s>J |dd t
dD }W d    n1 sSw   Y  |dd t
dD kseJ t  t ksmJ d S )	N+   )r  r   ru   c                 s   rc   r2   r  re   r)   r)   r,   rg     r   zFtest_directly_parameterized_backend_context_manager.<locals>.<genexpr>c                 S   r   r)   r   re   r)   r)   r,   r-     r   zGtest_directly_parameterized_backend_context_manager.<locals>.<listcomp>)r_   r4   r  r   r^   r]   r  r!   rb   r   rk   )rs   r  r  r   r   r)   r)   r,   3test_directly_parameterized_backend_context_manager  s   	r  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   rA   ru   c                 s       | ]}t t V  qd S r2   )r#   r  r   r)   r)   r,   rg         z"get_nested_pids.<locals>.<genexpr>)r_   r   r!   r  rk   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 r\   )superr  get_nested_backendr   	__class__r)   r,   r    s   zMyBackend.get_nested_backend)rN   rO   rP   rQ   r  __classcell__r)   r)   r  r,   r    s    r  back_compat_backend)r/   r.   r(   r  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 )NrA   ru   c                 s   r  r2   )r#   r  r   r)   r)   r,   rg     r  z6test_nested_backend_context_manager.<locals>.<genexpr>r   r   )r!   rk   r   r   )rs   r9   
pid_groups	pid_groupr)   r)   r,   #test_nested_backend_context_manager  s   
"r  )rA   rt   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 r2   )r_   r    r$   r!   r  )expected_backend_typeexpected_n_jobr)   r)   r,   check_nested_backend  s   z?test_nested_backend_in_sequential.<locals>.check_nested_backendr   ru   c                 3   s     | ]}t  tjd V  qdS r   )r#   r   r3   r   )r  r)   r,   rg     r   z4test_nested_backend_in_sequential.<locals>.<genexpr>r   c                 3   s    | ]
}t  V  qd S r2   r  r   r9   r  rb   r)   r,   rg     r   rj   )r9   rb   rs   r)   r  r,   !test_nested_backend_in_sequential  s   

"r  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 )Nr9   r   )r&   r%   nesting_level)rs   inner_backendexpected_levelctxr9   r)   r)   r,   check_nesting_level  s   
"r  outer_backendr  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   rA   ra   c                 3        | ]}t t d V  qdS r   r#   r  r   rs   r  r)   r,   rg     r   z-test_backend_nesting_level.<locals>.<genexpr>r   ru   c                 3   r  r   r  r   r  r)   r,   rg     r   )r  r!   rk   )rs   r  r  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 rv   rM  r   r)   r)   r,   retrieval_context	  s   
z;test_retrieval_context.<locals>.MyBackend.retrieval_contextN)rN   rO   rP   rf   supports_retrieve_callbackcontextmanagerr  r)   )
contextlibr  r)   r,   r    s
    r  	retrievalc                 S   s   t dddd t| D S )NrA   ru   c                 s   rc   r2   r   re   r)   r)   r,   rg     r   z>test_retrieval_context.<locals>.nested_call.<locals>.<genexpr>rj   )nr)   r)   r,   nested_call  s   z+test_retrieval_context.<locals>.nested_callrA   ru   c                 3   s    | ]	}t  |V  qd S r2   r  re   )r  r)   r,   rg     r   z)test_retrieval_context.<locals>.<genexpr>r   r9   r   )r  r   r'   r!   rk   r&   rf   r%   )rs   r  r  r  r)   )r  r  r  r,   test_retrieval_context  s   
	
 "r  rR  )r   rt   gQ?c                 C   s8   t t t| d W d    d S 1 sw   Y  d S )NrR  )r   rT   r!   r  r)   r)   r,   test_invalid_batch_size  s   
"r  z)n_tasks, n_jobs, pre_dispatch, batch_size))rA   rA   r   r_  )rA   rA   rb   r_  r   rA   rb   r_  )i  rA   rb   r_  r  )r   r   rb   r_  )   rT  rb   r_  )   rT  
2 * n_jobsr   )   rT  r   r   )r  rT  r  rS   )r  rT  r  r_  c                 C   sN   |||d}dd t | D }tdi |dd t | D }||ks%J d S )N)rb   rW  rR  c                 S   r   r)   r   re   r)   r)   r,   r-   :  r   z0test_dispatch_race_condition.<locals>.<listcomp>c                 s   rc   r2   rd   re   r)   r)   r,   rg   ;  r   z/test_dispatch_race_condition.<locals>.<genexpr>r)   r   )r   rb   rW  rR  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 )NrA   r(   ra   rs   )r   get_start_methodr!   _backend_kwargsget)mp_start_methodr   rs   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   r  i  rA   ra   c                 3   s"    | ]}t tj  jV  qd S r2   )r#   r   dotTre   rG   r)   r,   rg   ^  s     zAtest_no_blas_crash_or_freeze_with_subprocesses.<locals>.<genexpr>)
r   r0   r   randomRandomStaterandnr  r  r!   rk   )r9   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)r9   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  r9   r  joblib_root_folderzunpicklable_func_script.pyr   r  r  )SQUARE_MAINr  platformr  r  )UNPICKLABLE_CALLABLE_SCRIPT_TEMPLATE_MAINr  r  pathdirnamejoblib__file__r   writer   r  strpath)r9   r  r  tmpdirr  	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\]LokyProcess   )r  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 )NrA   ru   )iterr!   )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	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  )rk   r   onesfloat32)r  rf   r)   r)   r,   generate_arrays<  s   zBtest_auto_memmap_on_arrays_from_generator.<locals>.generate_arraysrA   r   rb   r  r9   c                 s   rc   r2   r#   r  r*   rG   r)   r)   r,   rg   B  rh   z<test_auto_memmap_on_arrays_from_generator.<locals>.<genexpr>r   r   c                 s   rc   r2   r  r  r)   r)   r,   rg   K  rh   )r!   r-  r   r   r  r  )r9   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  rL   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	  r  )	mmap_moderA   ru   c                 3   r   r2   )r#   r  r   r  r)   r,   rg   ^  r   z.test_memmap_with_big_offset.<locals>.<genexpr>r9  r   )r   r  mmapALLOCATIONGRANULARITYr   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 w   Y  t| dks-J | d }t|jts9J t|jd	ksBJ d S )
NTr   r   )rb   r  c                 s   rc   r2   rd   re   r)   r)   r,   rg   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!   rk   r   r   r   r  r   )r   r   r)   r)   r,   3test_warning_about_timeout_not_supported_by_backendd  s    r  c                 C   s   || |< |S r2   r)   )
input_listrY  r   r)   r)   r,   set_list_valueq  s   r!  )r   rA   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   r"  r/   rb   r!  r9   c                 3   s     | ]}t t ||V  qd S r2   )r#   r!  re   r   r)   r,   rg   |  r   zPtest_parallel_return_order_with_return_as_generator_parameter.<locals>.<genexpr>c                 s       | ]	\}}||kV  qd S r2   r)   r*   vr  r)   r)   r,   rg     r   )r!   rk   r$  r   r-  )rb   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 s5J  d S )Nr#  r"  c                 s   s&    | ]}t t|d  |dkV  qdS )rA   r   N)r#   r*  re   r)   r)   r,   rg     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,   rg     s    	   r   rA   c                 s   r$  r2   r)   r%  r)   r)   r,   rg     r   )r!   rk   sortedr$  r   r-  )r9   rb   quickly_returnedexpected_quickly_returnedr)   r,  r,   8_test_parallel_unordered_generator_returns_fastest_first  s   r1  c                 C   s   t | | d S r2   )r1  r9   rb   r)   r)   r,   7test_parallel_unordered_generator_returns_fastest_first  s   r3  )r   rA   r|   rt   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 )NrG   r   r   ra   c                 s   s    | ]
}t tj|V  qd S r2   r#   rW   r   re   r)   r)   r,   rg     r   z%test_abort_backend.<locals>.<genexpr>r4  )r   r  rW   r!   )rb   r9   delayst_startdtr)   r)   r,   test_abort_backend  s   
r8  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   s\   t || |d}|dd tdD }t| t| ~W d    d S 1 s'w   Y  d S )N)rb   r9   r!  c                 s   rc   r2   )r#   r;  re   r)   r)   r,   rg     r   z0_test_deadlock_with_generator.<locals>.<genexpr>r   )r!   rk   r+  )r9   r!  rb   r   r  r)   r)   r,   _test_deadlock_with_generator  s   "r<  c                 C   s   t | || d S r2   )r<  )r9   r!  rb   r)   r)   r,   test_deadlock_with_generator  s   r=  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
~d S )N)This Parallel instance is already runningr   r%  c                 s   r   r   r   r   r)   r)   r,   rg     r   z/test_multiple_generator_call.<locals>.<genexpr>r   c                 s   rc   r2   r   re   r)   r)   r,   rg     r   r   rA   [The error should be raised immediately when submitting a new task but it took more than 2s.)r   r   r!   rk   rW   )r9   r!  rb   r   gr6  gen2r)   r)   r,   test_multiple_generator_call  s   rB  c              	   C   s   t || |dF}|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    ~d S 1 sPw   Y  ~d S )Nr%  c                 s   r   r  r   r   r)   r)   r,   rg     r   z7test_multiple_generator_call_managed.<locals>.<genexpr>r   r>  r   c                 s   rc   r2   r   re   r)   r)   r,   rg     r   r   rA   r?  )r!   rk   rW   r   r   )r9   r!  rb   r   r@  r6  g2r)   r)   r,   $test_multiple_generator_call_managed  s   
rD  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 rA   Nr  re   r)   r)   r,   rg     r   z9test_multiple_generator_call_separated.<locals>.<genexpr>r   c                 s   rG  rH  r  re   r)   r)   r,   rg     r   r4  r#  c                 s   r$  r2   r)   r*   r   rf   r)   r)   r,   rg     r   c                 s   r$  r2   r)   rI  r)   r)   r,   rg     r   )r!   rk   r.  r   r-  )r9   rE  rF  rb   r@  rC  r)   r)   r,   &test_multiple_generator_call_separated  s    &rJ  zbackend, error))r.   T)r/   F)r   Fc           
      C   s\  | 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	 }|6 t

 }td| |ddd tddD }|dkrRt|}tdd t|tddD scJ W d    n1 smw   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 )Nr.   zRequires multiprocessingrA   r%  c                 s   r   r  r   re   r)   r)   r,   rg   &  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   rG  rH  r  re   r)   r)   r,   rg   3  r   r4  r#  c                 s   r$  r2   r)   rI  r)   r)   r,   rg   :  r   r   r   ri   r   r{  )r   r  r  r!   rk   weakreffinalizer   r   r   rW   r.  r   r-  aliver   r  r1  )
r9   rE  rF  errorr   r@  g_wrr  r6  retryr)   r)   r,   )test_multiple_generator_call_separated_gc  s:   
$

rS  c                 C   s   |j }tdd| |d#}|dd tjdgd D  tt|dks'J W d    n1 s1w   Y  tdD ]}t|sC n	td	 q:t	d
tdd| d}|dd tjdgd D  tdD ]}t|sq d S td	 qgt	d
)NrA   r   )rb   r  r9   temp_folderc                 s   rc   r2   r  r  r)   r)   r,   rg   V  r   z(test_memmapping_leaks.<locals>.<genexpr>r   r   r   r   z/temporary directory of Parallel was not removedr  c                 s   rc   r2   r  r  r)   r)   r,   rg   f  r   )
r  r!   r   r  r   r  listdirrk   r   AssertionError)r9   r  r   r   r)   r)   r,   test_memmapping_leaksK  s"    

 

rW  )Nr.   r/   c                 C   s<   t d| ddd tdD }|dd tdD ksJ d S )NrA   ra   c                 s   s     | ]}t d d |V  qdS )c                 S   r?   r@   r)   rB   r)   r)   r,   rK  v  rL  z2test_lambda_expression.<locals>.<genexpr>.<lambda>Nr  re   r)   r)   r,   rg   u  r   z)test_lambda_expression.<locals>.<genexpr>r   c                 S      g | ]}|d  qS rA   r)   re   r)   r)   r,   r-   x  r   z*test_lambda_expression.<locals>.<listcomp>rj   )r9   r   r)   r)   r,   test_lambda_expressionp  s   rZ  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.rA   i  g       @r   )r}   rb   r9   c                 3       | ]
}t tj V  qd S r2   r4  re   	task_timer)   r,   rg     r   z6test_backend_batch_statistics_reset.<locals>.<genexpr>c                 3   r[  r2   r4  re   r\  r)   r,   rg     r   N)r!   rk   r   _effective_batch_size_DEFAULT_EFFECTIVE_BATCH_SIZE_smoothed_batch_duration _DEFAULT_SMOOTHED_BATCH_DURATION)r9   rb   n_inputsr   r)   r\  r,   #test_backend_batch_statistics_reset{  s   rc  c                 C   s   dD ]<}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 sOJ | d	dd tdd}t |jtu sdJ |jdkskJ W d    n1 suw   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   rA   rt   ru   threadsrb   prefer	processes	sharedmemrb   requirerA   r.   )rb   r9   rf  rf  ri   rj  r   )r]   r!   r   r4   r   r   rb   )rs   rb   r   r)   r)   r,   $test_backend_hinting_and_constraints  s<   

	"rm  rf  )Nrg  rd  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 s;w   Y  ||ksFJ d S )	Nc                 S   rX  rY  r)   re   r)   r)   r,   r-     r   z7test_backend_hinting_always_running.<locals>.<listcomp>r   re  c                 s   rc   r2   rd   re   r)   r)   r,   rg     rh   z6test_backend_hinting_always_running.<locals>.<genexpr>)rf  rb   c                 s   rc   r2   rd   re   r)   r)   r,   rg     r   )rk   r!   r&   )rb   rf  expected_resultsr   r)   r)   r,   #test_backend_hinting_always_running  s   ro  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   rE   r2   r)   r   r)   r)   r,   apply_async  rL   zgtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackend.apply_asyncc                 S      |S r2   r)   ry  r)   r)   r,   r$     rL   zltest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackend.effective_n_jobsNrN   rO   rP   supports_sharedmemuse_threadsrq  r$   r)   r)   r)   r,   MyCustomThreadingBackend  
    rv  rA   rg  re  rh  ri  c                   @   rp  )z\test_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackendFc                 S   rE   r2   r)   r   r)   r)   r,   rq    rL   zhtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackend.apply_asyncc                 S   rr  r2   r)   ry  r)   r)   r,   r$     rL   zmtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackend.effective_n_jobsNrs  r)   r)   r)   r,   MyCustomProcessingBackend  rw  rx  ro  r   )rb   rj  r}   zUsing ThreadingBackend as joblib backend instead of MyCustomProcessingBackend as the latter does not provide shared memory semantics.r9   rj  )	r   r!   r]   r   
readouterrr   stripr   rT   )capsysrs   rv  r   rx  outerrr   r)   r)   r,   9test_backend_hinting_and_constraints_with_custom_backends  s2   


"r  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invalidrk  rl  rg  rh  )rf  rj  r.   ry  r(   )r   rT   r!   r   r)   r)   r)   r,   ,test_invalid_backend_hinting_and_constraints  s"   




"r  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 wayrA   ru   r   Nc                 3   s*    | ]}t tdd d i V  qdS )limitr   Nr)   )r#   _recursive_backend_infore   r  r  r)   r,   rg   '  s
    
z*_recursive_backend_info.<locals>.<genexpr>r   )r!   r]   r   rN   r  rk   )r  r  r   
this_levelr   r)   r  r,   r     s   
$r  c                 C   s^   | |dd t  }W d    n1 sw   Y  | d }|dfdddg}||ks-J d S )NrA   ru   Backendr   )r   r   )r   rA   )r  title)rs   r9   backend_types_and_levelstop_level_backend_type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   r  r2   )r#   _recursive_parallelre   r)   r)   r,   rg   A  r  z&_recursive_parallel.<locals>.<genexpr>rA   rj   )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 )NrA   ru   r.   r   )TerminatedWorkerErrorz1Loky worker crash when serializing RecursionError)r   BaseExceptionr  r   &joblib.externals.loky.process_executorr  r   r   r  xfailRecursionError)rs   r9   rq  excr  r)   r)   r,   test_thread_bomb_mitigationD  s   

r  c                  C   s*   i } dD ]
}t j|| |< q| tdfS )N)OMP_NUM_THREADSOPENBLAS_NUM_THREADSMKL_NUM_THREADSVECLIB_MAXIMUM_THREADSNUMEXPR_NUM_THREADSNUMBA_NUM_THREADS
ENABLE_IPCr   )r  environr  r   )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 ]-\}}||ks#J | D ]\}}|dr9|t|ks8J q'|dks?J |dksEJ q'qd S )	NrA   ra   c                 s   r  r2   )r#   r  r   r)   r)   r,   rg   r      

z-test_parallel_thread_limit.<locals>.<genexpr>r   _THREADSr  1)r!   rk   rx  r"   itemsendswithr   )r9   r   expected_num_threadsworker_env_varsomp_num_threadsr   r   r)   r)   r,   test_parallel_thread_limito  s   
r  zThis test requires daskc                 C   s:   t tdd | d W d    d S 1 sw   Y  d S )NzPlease install daskr   dask)r   rT   r  r)   r)   r,   )test_dask_backend_when_dask_not_installed  s   
"r  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 r\   r)   )rF   r   r  r)   r)   r,   rw    rL   z=test_zero_worker_backend.<locals>.ZeroWorkerBackend.configureNc                 S   r   )NzNo worker availabler   )rF   funccallbackr)   r)   r,   rq    r>   z?test_zero_worker_backend.<locals>.ZeroWorkerBackend.apply_asyncc                 S   r  r\   r)   ry  r)   r)   r,   r$     rL   zDtest_zero_worker_backend.<locals>.ZeroWorkerBackend.effective_n_jobsr2   )rN   rO   rP   rw  rq  r$   r)   r)   r)   r,   ZeroWorkerBackend  s    
r  z&ZeroWorkerBackend has no active workerr   rA   ru   c                 s   rc   r2   r   re   r)   r)   r,   rg     r   z+test_zero_worker_backend.<locals>.<genexpr>)r   r  r   r   r!   rk   )rs   r  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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 r2   )MY_GLOBAL_VARIABLEr)   r)   r)   r,   check_globals  s   z@test_globals_update_at_each_parallel_call.<locals>.check_globalsrA   ru   c                 3       | ]}t   V  qd S r2   r  re   r  r)   r,   rg     r  z<test_globals_update_at_each_parallel_call.<locals>.<genexpr>zchanged valuec                 3   r  r2   r  re   r  r)   r,   rg     r  )r  r!   rk   r   )workers_global_variabler)   r  r,   )test_globals_update_at_each_parallel_call  s   r  c                  C   s4   dd l } | jdd}| || td}| S )Nr   r   threadpoolctl)numpyr  r  r  r  importorskipthreadpool_info)r   rG   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:
{})rT   r  )child_moduleparent_infoparent_moduler)   r)   r,   _parent_max_num_threads_for  s   r  c                 C   s@   | D ]}|D ]}t ||}t|||h}|d |v sJ qqd S )Nr  )r  min)workers_infor  r  child_threadpool_infor  parent_max_num_threadsr   r)   r)   r,   check_child_num_threads  s   r  )rA   r   r|   rt   c                 C   sz   t  }t|dkrtjdd td| ddd tdD }t| } | d	kr-|d d
 }ntt |  d	}t	||| d S )Nr   &Need a version of numpy linked to BLASrm  r.   r2  c                 s   r  r2   r#   r  re   r)   r)   r,   rg     r  z;test_threadpool_limitation_in_child_loky.<locals>.<genexpr>rA   r   r  
r  r   r  r  r!   rk   r$   rx  r"   r  )rb   r  workers_threadpool_infosexpected_child_num_threadsr)   r)   r,   (test_threadpool_limitation_in_child_loky  s   r  inner_max_num_threads)r   rA   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
krB|d d }n|d u rOtt | d
}n|}t	||| d S )Nr   r  rm  r.   r  ru   c                 s   r  r2   r  re   r)   r)   r,   rg     r  z>test_threadpool_limitation_in_child_context.<locals>.<genexpr>rA   r   r  r  )rs   rb   r  r  r  r  r)   r)   r,   +test_threadpool_limitation_in_child_context  s"   

r  var_name)r  r  r  c              	      s  t |dkrtd tdd  dd  tj}z_dtj< t|d fd	d
t	dD }|ddgks;J | ddd t|d fdd
t	dD }W d    n1 s]w   Y  |ddgksjJ W |d u rutj= d S |tj< d S |d u rtj= w |tj< w )Nr   zSkip test when n_jobs == 1Treusec                 S   s   t j| S r2   )r  r  r  )r  r)   r)   r,   _get_env,  r
  z>test_threadpool_limitation_in_child_override.<locals>._get_env4ru   c                 3   r  r2   r  re   r  r  r)   r,   rg   3  r   z?test_threadpool_limitation_in_child_override.<locals>.<genexpr>rA   r.   r  c                 3   r  r2   r  re   r  r)   r,   rg   7  rh   r  )
r$   r  r  r   shutdownr  r  r  r!   rk   )rs   rb   r  original_var_valuer   r)   r  r,   ,test_threadpool_limitation_in_child_override  s*   	

"
r  )rA   r   rt   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   ru   c                 3   r   r2   )r#   sumre   rB   r)   r,   rg   K  r   zAtest_loky_reuse_workers.<locals>.parallel_call.<locals>.<genexpr>r   ru   r)   rB   r,   parallel_callI  s   $z.test_loky_reuse_workers.<locals>.parallel_callTr  r   )r   rk   )rb   r  first_executorr   r   r)   r)   r,   test_loky_reuse_workersC  s   

r  c                 C   s   d| t  < d S )Ninitialized)r  r  )statusr)   r)   r,   _set_initializedY  r`   r  c                 C   s   t  }| |d }|dv sJ d| |sd S d| |< t d }tdd |  D }t |k rR||k rRtd tdd |  D }t |k rR||k s8t |kr\td	|S )
N)r  startedz2worker should have been in initialized state, got r  r  c                 S      g | ]
\}}|d kr|qS r  r)   r*   pidr&  r)   r)   r,   r-   i      z!_check_status.<locals>.<listcomp>r   c                 S   r  r  r)   r  r)   r)   r,   r-   l  r  z-Waited more than 30s to start all the workers)r  r  r  rW   r   r  r   r   )r  rb   wait_workersr  statedeadline	n_startedr)   r)   r,   _check_status]  s"   

r  c                    sf   t  }| || tfd t  fddtdD  W d    d S 1 s,w   Y  d S )Nr9   rb   initializerinitargsc                 3       | ]
}t t V  qd S r2   r#   r  re   rb   r  r)   r,   rg     r   z+test_initializer_context.<locals>.<genexpr>r   )r   rX  dictr  r!   rk   )rb   r9   rs   rZ  r)   r  r,   test_initializer_contextt  s    "r  c                    s>   t  }| t| tfd fddtdD  d S )Nr  c                 3   r  r2   r  re   r  r)   r,   rg     r   z,test_initializer_parallel.<locals>.<genexpr>r   )r   rX  r  r!   r  rk   )rb   r9   rZ  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s:J dd S )Nri   r.   r  c                 3   "    | ]}t t d dV  qdS T)r  Nr  re   r  r)   r,   rg     
    
z*test_initializer_reused.<locals>.<genexpr>z=The workers should be reused when the initializer is the same)	r   rX  r  r   rk   r!   r  unionr   rb   n_repetitionsrZ  pidsrf   r   r)   r  r,   test_initializer_reused  s&   	r  c                    s|   d}t  }t }t|D ]"}| td tfd fddt D }|t|}qt||  ks<J dd S )Nri   r.   r  c                 3   r  r  r  re   r  r)   r,   rg     r  z.test_initializer_not_reused.<locals>.<genexpr>zFThe workers should not be reused when the initializer arguments change)	r   rX  r   rk   r  r!   r  r  r   r  r)   r  r,   test_initializer_not_reused  s&   	r  )F)r   r   )ri   r2   )rQ   r  r  r   r  r/   rW   r   rM  r  r   mathr   r(   r   pickler   r   	tracebackr	   r  r  r
   r   r   joblib._multiprocessing_helpersr   joblib.test.commonr   r   r   r   joblib.testingr   r   r   r   r   joblib.externals.lokyr   r;  r   posixImportError _openmp_test_helper.parallel_sumr   distributedjoblib._parallel_backendsr   r   r   r   r   joblib.parallelr    r!   r"   r#   r$   r%   r&   r'   r  RETURN_GENERATOR_BACKENDSpopr.  keysALL_VALID_BACKENDSPROCESS_BACKENDSPARALLEL_BACKENDShasattrr   r0   r4   r:   r=   rC   	ExceptionrD   rV   rY   r[   r_   rm   ro   rr   markr{   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r   r&  r3  r:  r=  rV  r^  rc  rd  rf  rj  rl  r  rt  ru  rz  r~  r  r  r  r  r  r  extendrk   r  r  r  r  r  r  _parallel_backendsr  r  r  r  r  r  r  r  r  r  r  r  r  r  SQUARE_LOCALSQUARE_LAMBDAr  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r!  r'  r*  r1  r3  r8  r;  r<  r=  rB  rD  rJ  rS  rW  rZ  rc  rm  ro  r  r  r  r  r  no_coverr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r)   r)   r)   r,   <module>   s   ,



*




F(


	
		




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

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

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