
    7Th.             
       `   S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	J
r
  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKrSSKrSS	KJrJrJr  SS
KJr  SSKJrJrJrJr  SSK J!r!J"r"J#r#J$r$J%r%  \b  SSK&J'r'  SSK(J)r)   SSK*r* SSK,J-r-   SSK.r.SSK/J0r0J1r1J2r2J3r3J4r4  SSK5J6r6J7r7J8r8J9r9J:r:JrJ;r;J<r<J=r=  \6R|                  " 5       r?\?R                  SS5        S/\A" \6R                  " 5       5      -   rC\C\6 V s/ s H  n \6U    " 5       PM     sn -  rC\c  / rDOSS/rD\DS/-   rE\F" \S5      (       a!  \CR                  \R                  " S5      5        S rIS rJS rKS rL " S S\M5      rNSS jrOS  rPSS! jrQS" rRS# rSS$ rTS% rU\"" S&\<\;/5      \R                  RE                  S'S(S)\:" S)S*94S+// S,QS-9\S. 5       5       5       rW\"" S/\C5      \"" S0/ S1Q5      \"" S2/ S3Q5      S4 5       5       5       rX\"" S/\C5      \"" S0SS5/5      S6 5       5       rY\"" S/\C5      S7 5       rZS8 r[\\"" S9/ S:Q5      S; 5       5       r\\\"" S// S<Q5      S= 5       5       r]S> r^\"" S?\65      \"" S@\65      SA 5       5       r_SB r`\SC 5       raSD rb\"" S0/ SEQ5      SF 5       rc\"" S/\E5      SG 5       rd\SH 5       re\\\"" SI/ SJQ5      \"" SKSSL/5      SM 5       5       5       5       rf\"" S/\E5      SN 5       rg\\"" S/\E5      SO 5       5       rh\\"" S/\i" \?5      SP1-
  5      \"" SQSRSS/5      ST 5       5       5       rj\\"" S/\D5      SU 5       5       rk\\"" S/\65      SV 5       5       rlSW rm\"" S/\65      \"" SXS/ SYQ4SZ/ S[Q4/5      S\ 5       5       rn\\"" S/\E5      S] 5       5       roS^ rp\\"" S/\D5      S_ 5       5       rqS` rrSa rsSb rt\\"" S/\E5      \R                  R                  ScSd9Se 5       5       5       rv " Sf Sg\35      rwSh rx\"" S/\C5      Si 5       ry\\"" S/\E5      \"" S0/ SjQ5      Sk 5       5       5       rzSl r{Sm r|\$" \SLSnSd9So 5       r}Sp r~\ESS r\GR                  \" Sq5       Vs/ s H  nSrU-  PM
     sn5        \\"" S/\5      \"" S&\;\</5      Ss 5       5       5       r " St Su\35      r\"" S&\<\;/5      Sv 5       r\"" S&\<\;/5      Sw 5       rSx rSy r " Sz S{\GR                  R`                  5      r\=" S|\5        \\"" S// S}Q5      \"" S&\<\;/5      S~ 5       5       5       r\\"" S0/ SQ5      \"" S/\E5      \"" S&\<\;/5      S 5       5       5       5       rS r\\"" S\E5      \"" S\E5      \"" S&\<\;/5      S 5       5       5       5       r\\"" S&\<\;/5      \"" SSS/5      S 5       5       5       r\"" S/ SQ5      S 5       r\"" S/ SQ5      S 5       r\S 5       r\\\"" S/\D5      S 5       5       5       rSr\\"" S/\D5      S 5       5       rSrSrSrSr\\"" S/\D\c  / OS/-   5      \"" S\\\/5      \"" S/ SQ5      S 5       5       5       5       rSGR5                  \GR6                  GR9                  \GR6                  GR9                  \GR:                  5      5      S9r\S 5       rSGR5                  \GR6                  GR9                  \GR6                  GR9                  \GR:                  5      5      S9r\S 5       rS rS r\\\"" S/\D5      S 5       5       5       rS r\\S 5       5       rS rS r\R                  RE                  S0/ SQ5      S 5       rS rS r\R                  RE                  S0S5SZ/5      \\"" S/\i" \?5      SP1-
  5      S 5       5       5       r\"" S/\C5      \"" S0/ SQ5      S 5       5       rS rS r\\"" S/\?5      \"" SQSRSS/5      \"" S0/ SQ5      S 5       5       5       5       r\"" S/\?5      \"" SQSRSS/5      \"" S0/ SQ5      S 5       5       5       r\"" S/\?5      \"" SQSRSS/5      \"" S0/ SQ5      S 5       5       5       r\"" S/\?5      \"" SSRSS/5      \"" SSRSS/5      \"" S0/ SQ5      S 5       5       5       5       r\"" S/ SQ5      \"" SSRSS/5      \"" SSRSS/5      S 5       5       5       r\\\"" S/\D5      S 5       5       5       r\"" S/\c  SS/O/ SQ5      S 5       r\\"" S/\D5      S 5       5       r\\"" S&\<\;/5      S 5       5       r\"" S&\<\;/5      S 5       rS rSS jr\\"" S/SS/5      \"" S&\<\;/5      S 5       5       5       rSS jr\R                  GR|                  \"" S&\<\;/5      \"" S/\c  S/OSS/5      S 5       5       5       rS r\"" S/\b  SS/OS/5      \$" \-SL SSd9S 5       5       r\"" S&\<\;/5      \$" \.SLSSd9S 5       5       r\"" S&\<\;/5      S 5       rS rS rS rS r\\\"" S0/ SQ5      S 5       5       5       r\\\"" S/ SQ5      \"" S0S5S)/5      \"" S&\<\;/5      S 5       5       5       5       5       r\\"" S0S5S)/5      \"" S/ SQ5      \"" S&\<\;/5      S 5       5       5       5       r\\"" S0/ SQ5      S 5       5       rS rSS jr\\"" S0S5SZ/5      \"" S/\D5      \"" S&\<\;/5      S 5       5       5       5       r\\"" S0S5SZ/5      \"" S/\D5      S 5       5       5       r\\R                  RE                  S0S5SZ/5      S 5       5       r\\R                  RE                  S0S5SZ/5      S 5       5       rg! \+ a    Sr* G
Nwf = f! \+ a    Sr- G
Nf = f! \+ a    Sr. G
Nf = fs  sn f s  snf )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multiprocessingloky	threadingget_contextspawnc                  0    [         [        R                     $ N)r    r   DEFAULT_BACKEND     Q/var/www/auris/envauris/lib/python3.13/site-packages/joblib/test/test_parallel.pyget_default_backend_instancer3   ^   s    
 H,,--r1   c           	      2    [        U S[        U SS 5      5      $ )N_pool_workers)getattrbackends    r2   get_workersr:   f   s    7GWWj$%GHHr1   c                 
    X-  $ r.   r0   )xys     r2   divisionr>   j   s	    5Lr1   c                     U S-  $ N   r0   r<   s    r2   squarerC   n   s    a4Kr1   c                       \ rS rSrSrS rSrg)MyExceptionWithFinickyInitr   z,An exception class with non trivial __init__c                     g r.   r0   )selfabcds        r2   __init__#MyExceptionWithFinickyInit.__init__u   s    r1   r0   N__name__
__module____qualname____firstlineno____doc__rM   __static_attributes__r0   r1   r2   rE   rE   r   s
    6r1   rE   Fc                 H    U S:X  a  U(       a  [        SSSS5      e[        eU $ )N   rI   rJ   rK   rL   )rE   
ValueError)r<   custom_exceptions     r2   exception_raiserrZ   y   s4    Av   'sCc:	
 	

 Hr1   c                 :    [         R                  " S5        [        e)Ng?)timer   KeyboardInterruptrB   s    r2   interrupt_raiserr^      s    JJt
r1   c                     U S-  U-   U-   $ )zFA module-level function so that it can be spawn with
multiprocessing.
rA   r0   )r<   r=   zs      r2   fra      s     a4!8a<r1   c                  D    [        [        R                  " 5       S   5      $ Nr   )typer   get_active_backendr0   r1   r2   _active_backend_typerf      s    ++-a011r1   c                 @    [        XS9" S [        S5       5       5      $ )Nn_jobsr9   c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   r#   rC   .0is     r2   	<genexpr> parallel_func.<locals>.<genexpr>   s      :$,qH   "$   r!   range)inner_n_jobsr9   s     r2   parallel_funcrv      s%    <9 :$)!H:  r1   c                  $    [        5       S:  d   eg rc   )r"   r0   r1   r2   test_cpu_countrx      s    ;??r1   c                  $    [        5       S:  d   eg rc   r$   r0   r1   r2   test_effective_n_jobsr{      s    !!!r1   contextzbackend_n_jobs, expected_n_jobs)rr   rr   ri   Nr   )zpositive-intznegative-intNone)idsc                     U " SUS9   [        S S9U:X  d   e S S S 5        [        S S9S:X  d   eg ! , (       d  f       N= f)Nr*   r~   r   rz   )r|   backend_n_jobsexpected_n_jobss      r2   test_effective_n_jobs_Noner      sF     
^	4  t,??? 
5
 4(A--- 
5	4s   1
?r9   ri   )r   rA   r}   verbose)rA      d   c                     [        S5       Vs/ s H  n[        U5      PM     sn[        XUS9" S [        S5       5       5      :X  d   eg s  snf )N   ri   r9   r   c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   rk   rm   r<   s     r2   ro   'test_simple_parallel.<locals>.<genexpr>   s     +(Qgfoa(rq   rt   rC   r!   )r9   ri   r   r<   s       r2   test_simple_parallelr      sM      %Qx(x!F1Ix(H-+%(+-, , , ,(s   ArA   c                    Sn[         R                  " S5      n " S S[        5      nU" XSS9nU" [        U5       Vs/ s H  n[	        [
        5      " U5      PM     sn5        [        5       nUR                   HB  nUR                  U5      =n	(       d  M  U	R                  5       u  pUR                  X-
  5        MD     [        U5      S:X  d   eg s  snf )Nr   z(Done\s+\d+ out of \d+ \|)c                       \ rS rSr/ rS rSrg)/test_parallel_pretty_print.<locals>.ParallelLog   c                 :    U R                   R                  U5        g r.   )messagesappend)rH   msgs     r2   _print6test_parallel_pretty_print.<locals>.ParallelLog._print   s    MM  %r1   r0   N)rP   rQ   rR   rS   r   r   rU   r0   r1   r2   ParallelLogr      s    	&r1   r   i'  r   r   )recompiler!   rt   r#   ra   setr   searchspanaddlen)r9   ri   n_taskspatternr   executorrn   lensmessagesrI   rJ   s               r2   test_parallel_pretty_printr      s     Gjj67G&h & &5IHU7^4^gajm^455D$$w''1'668DAHHQUO % t9>> 5s   Cc                 b   UR                  [        R                  " 5       SSS9  [        R                  " SS9 n[        SU S9" S [        S	5       5       5      nU/ S
Q:X  d   e S S S 5        W Vs/ s HA  nS[        UR                  5      ;  d  M  [        UR                  [        5      (       a  M?  UPMC     nnU S;   d  [        U [        5      (       a.  SnU Vs/ s H  oE[        UR                  5      ;  d  M  UPM!     nn[        U5      S:X  d   eg ! , (       d  f       N= fs  snf s  snf )Nname!some_new_name_for_the_main_thread)targetr   valueTrecordrA   rh   c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   rk   r   s     r2   ro   6test_main_thread_renamed_no_warning.<locals>.<genexpr>   s      6
(01GFOArq   rr   )r   r      zworker timeout)Nr(   z3multi-threaded, use of fork() may lead to deadlocksr   )setattrr*   current_threadwarningscatch_warningsr!   rt   strr   
isinstanceDeprecationWarningr   r   )r9   monkeypatchwarninforesultswmessage_parts         r2   #test_main_thread_renamed_no_warningr      s'    '')1   
	 	 	-!W5 6
(-a6
 
 )###	 
. A3qyy>1 	
 199&89 	
   ++z'0 0 M'Nx!s199~+MAxN
 x=A9 
.	- Os)   +D1D'D'3D'D,<D,
D$c                    [         R                  " SS9 n[         R                  " S5        [        XS9  S S S 5        W Vs/ s H  oDR                  PM     nnU(       aL  U(       aD  [        S U 5       5      n[        (       a  [        U5      S:  O[        U5      S:H  nU=(       a    U$ gU(       a   eg! , (       d  f       N= fs  snf )NTr   always)r9   ru   c              3   F   #    U  H  nS UR                   S   ;   v   M     g7f)zbacked parallel loops cannotr   N)args)rm   eachs     r2   ro   )_assert_warning_nested.<locals>.<genexpr>
  s!      'KS4.$))A,>8   !r   F)r   r   simplefilterrv   r   allr   r   )r9   ru   expectedr   r   warnings_are_correctwarnings_have_the_right_lengths          r2   _assert_warning_nestedr     s    		 	 	-h'gA 
. $,,8a		8H,#& 'KS' $  '6oH"3x=A;M + (J,JJ|) 
.	- -s    B5C5
Cz%parent_backend,child_backend,expected))r)   r(   T)r)   r)   F)r(   r(   T)r(   r)   T)r*   r(   T)r*   r)   Tc                    ^^ [        SU S9" U4S j[        S5       5       5        [        SU S9" UU4S j[        S5       5       5      nU S:X  a  [        U5      (       d   eg [        U5      (       d   eg )NrA   rh   c              3   N   >#    U  H  n[        [        5      " TS SS9v   M     g7f)r   Fr9   ru   r   Nr#   r   rm   _child_backends     r2   ro   0test_nested_parallel_warnings.<locals>.<genexpr>(  s.      / A 	&'!E	
    "%r   c              3   N   >#    U  H  n[        [        5      " TS TS9v   M     g7f)rA   r   Nr   )rm   r   r   r   s     r2   ro   r   0  s.      5 A 	&'!H	
 r   r*   )r!   rt   anyr   )parent_backendr   r   ress    `` r2   test_nested_parallel_warningsr     sq     A~. / q	/  !^
4 5 q	5 C $3xxx3xxxr1   )r)   r(   r*   c                     S/nS n[         R                  " X!4S9nUR                  5         UR                  5         US   (       d   eg )NFc                     [         R                  " SS9 n[        SS9" S [        S5       5       5        S S S 5        [	        [        W5      5        [        U5      S:H  U S'   g ! , (       d  f       N4= f)NTr   rA   r~   c              3   L   #    U  H  n[        [        5      " S 5      v   M     g7f)皙?Nr#   r   rm   r   s     r2   ro   Ptest_background_thread_parallelism.<locals>.background_thread.<locals>.<genexpr>F  s     EHqwu~c22Hrq   r   r   )r   r   r!   rt   printr   )is_run_parallelr   s     r2   background_thread=test_background_thread_parallelism.<locals>.background_threadD  sV    $$D1XAEE!HEE 2c(m ]a/ 21s    A##
A1)r   r   r   )r*   Threadstartjoin)r9   r   r   ts       r2   "test_background_thread_parallelismr   ?  sF     gO0 	 18JKAGGIFFH1r1   c                 D    [        SU S9" S [        S5       5       5        g )NrA   rh   c              3   L   #    U  H  n[        [        5      " S 5      v   M     g7f{Gz?Nrk   r   s     r2   ro   nested_loop.<locals>.<genexpr>Q  s     'Px!(=(=xrq   rs   r8   s    r2   nested_loopr   P  s    Aw''PuQx'PPr1   r   r   c                 L   ^ [        SU S9" U4S j[        S5       5       5        g )NrA   rh   c              3   N   >#    U  H  n[        [        5      " T5      v   M     g 7fr.   )r#   r   r   s     r2   ro   #test_nested_loop.<locals>.<genexpr>W  s!      /5=]++Xr   rs   )r   r   s    `r2   test_nested_loopr   T  s%     A~. /5:1X/ r1   c                     [         er.   )rX   r8   s    r2   raise_exceptionr   \  s    
r1   c                      [        [        5         [        SSS9 n U " [        [        5      " S5      [        [
        5      " S5      /5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)NrA   r)   rh   )r   rX   r!   r#   r   r   )r   s    r2   )test_nested_loop_with_exception_with_lokyr   `  sT    	
	Q/8gk*62GO4LV4TUV 0 
	// 
	s"   A.1AA.
A+	'A..
A<c                     ^  [        SS9m [        SSS9" U 4S j[        S5       5       5        T R                  5       (       d   eg)z1Input is mutable when using the threading backendr   )maxsizerA   r*   rh   c              3   Z   >#    U  H   n[        TR                  5      " S 5      v   M"     g7fr   N)r#   put)rm   r   qs     r2   ro   1test_mutate_input_with_threads.<locals>.<genexpr>j  s!     +Px!GAEEN1,=,=xs   (+N)r   r!   rt   full)r   s   @r2   test_mutate_input_with_threadsr  g  s5    aAA{++PuQx+PP6688O8r1   )r   rA   rr   c                     [        S5      nU Vs/ s H  n[        USS9PM     sn[        U S9" S U 5       5      :X  d   egs  snf )z.Check the keyword argument processing of pmap.
   r   r=   r~   c              3   J   #    U  H  n[        [        5      " US S9v   M     g7fr   r  Nr#   ra   r   s     r2   ro   'test_parallel_kwargs.<locals>.<genexpr>r  s      ?$'q
1C   !#N)rt   ra   r!   )ri   lstr<   s      r2   test_parallel_kwargsr  n  sP     )C"#s!Aa1Is#xv'> ?$'? (   #s   Ac                    [        S5      nU Vs/ s H  n[        USS9PM     nn[        SU S9 nUR                  nX4" S U 5       5      :X  d   eX4" S U 5       5      :X  d   e[        b#  [        U5      [        UR                  5      L d   eS S S 5        [        b  [        WR                  5      b   eUW" S U 5       5      :X  d   e[        b  [        UR                  5      b   eg g s  snf ! , (       d  f       Nh= f)	Nr  r   r  r   rh   c              3   J   #    U  H  n[        [        5      " US S9v   M     g7fr  r	  r   s     r2   ro   3test_parallel_as_context_manager.<locals>.<genexpr>       =AWQZQ/r  c              3   J   #    U  H  n[        [        5      " US S9v   M     g7fr  r	  r   s     r2   ro   r    r  r  c              3   J   #    U  H  n[        [        5      " US S9v   M     g7fr  r	  r   s     r2   ro   r    s     9SA+Sr  )rt   ra   r!   _backendr   r:   )r9   r  r<   r   pmanaged_backends         r2    test_parallel_as_context_managerr  w  s    
)C#&'3a!q	3H'	G	, ** 1======1====== >/;qzz3JJJJ 
-  
~1::&... q9S99999	~1::&... / (	,	,s   C,AC11
C?c                     ^   " S S[         5      m [        [        SS9   [        SSS9" U 4S j[	        S	5       5       5        S
S
S
5        g
! , (       d  f       g
= f)zXCheck that pmap captures the errors when it is passed an object
that cannot be pickled.
c                       \ rS rSrS rSrg)1test_parallel_pickling.<locals>.UnpicklableObjecti  c                     [        S5      e)N123)RuntimeErrorrH   s    r2   
__reduce__<test_parallel_pickling.<locals>.UnpicklableObject.__reduce__  s    u%%r1   r0   N)rP   rQ   rR   rS   r  rU   r0   r1   r2   UnpicklableObjectr    s    	&r1   r!  zthe task to sendmatchrA   r)   rh   c              3   X   >#    U  H  n[        [        5      " T" 5       5      v   M!     g 7fr.   r#   id)rm   r   r!  s     r2   ro   )test_parallel_pickling.<locals>.<genexpr>  s$      +
6?GBK)+,,i   '*r  N)objectr   r   r!   rt   )r!  s   @r2   test_parallel_picklingr*    sH    &F & 
%8	96* +
6;Bi+
 	
 
:	9	9s   $A
A	byteorder)<>=
max_nbytes1Mc                   ^^ S m[         R                  " S5      R                  S5      R                  U  S35      mTR                  R
                  n[        SSUS9" UU4S j[        S	5       5       5      nU HG  u  pEXR:X  d   eXTR                  R
                  :X  d   e[         R                  R                  TU5        MI     g )
Nc                 0    X R                   R                  4$ r.   )dtyper+  rB   s    r2   inspect_byteorder=test_parallel_byteorder_corruption.<locals>.inspect_byteorder  s    ''####r1      )rA   rr   i4rA   r)   )ri   r9   r/  c              3   F   >#    U  H  n[        T5      " T5      v   M     g 7fr.   r#   )rm   r   r4  r<   s     r2   ro   5test_parallel_byteorder_corruption.<locals>.<genexpr>  s#      G/7!!"1%%x   !rr   )
r   arangereshapeviewr3  r+  r!   rt   testingassert_array_equal)r+  r/  initial_np_byteorderresult
x_returnedbyteorder_in_workerr4  r<   s         @@r2   "test_parallel_byteorder_corruptionrE    s    
$ 			!V$))YKr*:;A77,,Q:F G/4QxG F ,2'
":::"&6&6&@&@@@@


%%a4 ,2r1   c                 d    [        [        SU SS9" S [        S5       5       5      5      S:X  d   eg )NrA      ri   r9   timeoutc              3   L   #    U  H  n[        [        5      " S 5      v   M     g7f)gMbP?Nr   r   s     r2   ro   0test_parallel_timeout_success.<locals>.<genexpr>  s      </8!u%%yrq   r  )r   r!   rt   r8   s    r2   test_parallel_timeout_successrL    sB     	Aw; </4Ry< 	

 		r1   c                     [        [        5         [        SU SS9" S [        S5       5       5        S S S 5        g ! , (       d  f       g = f)NrA   r   rH  c              3   L   #    U  H  n[        [        5      " S 5      v   M     g7fr  Nr   r   s     r2   ro   -test_parallel_timeout_fail.<locals>.<genexpr>  s      :
(11GEN2	rq   r  )r   r   r!   rt   r8   s    r2   test_parallel_timeout_failrQ    s:     
	7D9 :
(-b	:
 	
 
			   ";
A	
sequential	return_as	generatorgenerator_unorderedc           
          [        [        5         [        [        SXSS9" S [	        S5       5       5      5        S S S 5        [        [        SXSS9" S [	        S5       5       5      5        g ! , (       d  f       N9= f)NrA   r   )ri   r9   rT  rI  c              3   L   #    U  H  n[        [        5      " S 5      v   M     g7frO  r   r   s     r2   ro   <test_parallel_timeout_fail_with_generator.<locals>.<genexpr>  s       R,5qr""Irq   r  c              3   L   #    U  H  n[        [        5      " S 5      v   M     g7fr   r   r   s     r2   ro   rY    s       M
*3QGEN4  )rq   )r   r   listr!   rt   r9   rT  s     r2   )test_parallel_timeout_fail_with_generatorr]    st     
	AwSQ R,1"IR 	
 
 	7L M
*/)M
 	
 
	s   +A..
A<c                    [         Gb  [        [        5         [        SU S9" [	        SS5       VVs/ s H  u  p[        [        5      " X5      PM     snn5        S S S 5        [        [        5         [        SU S9" S Vs/ s H  n[        [        5      " U5      PM     sn5        S S S 5        [        SU S9 n[        UR                  5      c   e[        UR                  5      n[        [        5         U" [	        SS5       VVs/ s H  u  p[        [        5      " X5      PM     snn5        S S S 5        [        UR                  5      c   e[        UR                  5      ULd   e[        S5       Vs/ s H  n[        USS9PM     snU" S [        S5       5       5      :X  d   e[        UR                  5      n[        [        5         U" S Vs/ s H  n[        [        5      " U5      PM     sn5        S S S 5        [        UR                  5      c   e[        UR                  5      ULd   e[        S5       Vs/ s H  n[        USS9PM     snU" S	 [        S5       5       5      :X  d3   UR                  UR                  UR                  UR                   45       e S S S 5        [        WR                  5      b   eOK[        [        5         [        SS
9" S Vs/ s H  n[        [        5      " U5      PM     sn5        S S S 5        [        [        5         [        SS
9" [	        SS5       VVs/ s H  u  p[        [        5      " X5      PM     snn5        S S S 5        [        ["        5         [        SSS9" S [        S5       5       5        S S S 5        g s  snnf ! , (       d  f       GNX= fs  snf ! , (       d  f       GN#= fs  snnf ! , (       d  f       GN= fs  snf s  snf ! , (       d  f       GN= fs  snf ! , (       d  f       GNm= fs  snf ! , (       d  f       GN = fs  snnf ! , (       d  f       N= f! , (       d  f       g = f)NrA   rh   )r   r   )r   r   r  r   r  c              3   J   #    U  H  n[        [        5      " US S9v   M     g7fr  r	  r   s     r2   ro   %test_error_capture.<locals>.<genexpr>        >,5q
1"Ir  c              3   J   #    U  H  n[        [        5      " US S9v   M     g7fr  r	  r   s     r2   ro   r`    ra  r  r~   r   )ri   r   c              3   J   #    U  H  n[        [        5      " US S9v   M     g7f)T)rY   Nr#   rZ   rl   s     r2   ro   r`  +  s     T)QW%&q4@)r  rG  )r   r   ZeroDivisionErrorr!   zipr#   r>   r]   r^   r:   r  rt   ra   
_iteratingn_completed_tasksn_dispatched_tasks	_abortingrE   )r9   r<   r=   r   original_workerss        r2   test_error_capturerl    s   
 
~%&Aw/585HI5HTQ"1(5HI '
 %&Aw/7=>v!)*1-v> ' Q0Hx001===*8+<+<=)*c&&>QR>Qda'(+A1>QRS +
 x001=== x0019IIII',Ry1y!Aa1Iy1X >,1"I> 6     +8+<+<=)*G1'"23A6GH + x001=== x0019IIII',Ry1y!Aa1Iy1X >,1"I> 6   ##**++""	 9 1N 8,,-555%&AfMf(8 9! <fMN '
 
!	"FF@ST@SGH-a3@STU 
# 
*	+1%T%PR)T	
 
,	+u J '& ? '& S +* 2 H +* 29 10T  N '& U 
#	" 
,	+s   N,!N&N,2ON>
 O9=P6O!O)O1AP8O-APO7O25O7<APP	APP%&P 
P%#P=<!P7P=<!Q&N,,
N;>O
OO
O*	%P2O77
P	P
P P%%
P47P==
Q
Qc           	         SS jn[        SU S9 n[        [        SS9   U" S U" SS9 5       5        S S S 5        [        [        SS9   U" S	 U" S
S9 5       5        S S S 5        [        [        SS9   U" S U" SS9 5       5        S S S 5        S S S 5        g ! , (       d  f       Nk= f! , (       d  f       NR= f! , (       d  f       N9= f! , (       d  f       g = f)Nr   c              3   X   #    [        S5       H  nX:X  a  [        S5      eUv   M     g 7f)N   Iterator Raising Error)rt   rX   )raise_atrn   s     r2   my_generator1test_error_in_task_iterator.<locals>.my_generator2  s)     rA} !9::G s   (*rA   rh   rp  r"  c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   rk   rl   s     r2   ro   .test_error_in_task_iterator.<locals>.<genexpr>;       C*BQgfoa  *Brq   )rq  c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   rk   rl   s     r2   ro   ru  @  rv  rq   r   c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   rk   rl   s     r2   ro   ru  D  s     D*CQgfoa  *Crq      r   )r!   r   rX   )r9   rr  r  s      r2   test_error_in_task_iteratorr{  /  s     
G	,J&>?C,*BCC @
 J&>?C,*BCC @ J&>?D,*CDD @ 
-	,??
 @? @? 
-	,sQ   CBC	B)C3B:C
B&	"C)
B7	3C:
C	C
Cc                 ,    U R                  SU-  5        g )NzConsumed %s)r   )queueitems     r2   consumerr  G  s    	LL%&r1   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                    ^ [        5       mU4S jn[        SXS9" U4S jU" 5        5       5        TU:X  d   e[        T5      S:X  d   eg)z=Test that with only one job, Parallel does act as a iterator.c               3   b   >#    [        S5       H  n TR                  SU -  5        U v   M     g 7fNr6  zProduced %irt   r   rn   r}  s    r2   producer'test_dispatch_one_job.<locals>.producerx  *     qALL*+G    ,/r   ri   
batch_sizer9   c              3   P   >#    U  H  n[        [        5      " TU5      v   M     g 7fr.   r#   r  )rm   r<   r}  s     r2   ro   (test_dispatch_one_job.<locals>.<genexpr>}  s#      ?-7%##Z   #&   N)r[  r!   r   )r9   r  expected_queuer  r}  s       @r2   test_dispatch_one_jobr  K  sT    V FE
 A*> ?-5Z?  N"""u:r1   c                 T  ^ [         R                  " 5       nUR                  5       mU4S jn[        SSSU S9" U4S jU" 5        5       5        [        T5      nUS   S:X  d   eUS	S
 R	                  S5      nUS:  d   eUR	                  S5      nXT:  d   e[        T5      S:X  d   eg	)zJCheck that using pre_dispatch Parallel does indeed dispatch items
lazily.
c               3   b   >#    [        S5       H  n TR                  SU -  5        U v   M     g 7fr  r  r  s    r2   r  /test_dispatch_multiprocessing.<locals>.producer  r  r  rA   r   rr   )ri   r  pre_dispatchr9   c              3   P   >#    U  H  n[        [        5      " TS 5      v   M     g7f)r   Nr  )rm   r   r}  s     r2   ro   0test_dispatch_multiprocessing.<locals>.<genexpr>  s$      F1;A%''r  r   r  Nr   zConsumed anyr}   r  r  )r   Managerr[  r!   indexr   )r9   managerr  queue_contentsfirst_consumption_indexproduced_3_indexr}  s         @r2   test_dispatch_multiprocessingr    s     jjlGLLNE
 A!!WE F19F  %[N!,,, -Ra066~F"R'''%++L9555u:r1   c                      [        SSSS9 n U " S [        S5       5       5        U R                  R                  5       S:X  d   e S S S 5        g ! , (       d  f       g = f)NrA   autor*   r  c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   r%  rl   s     r2   ro   /test_batching_auto_threading.<locals>.<genexpr>       	.+Q'"+a..+rq     r   r!   rt   r  compute_batch_size)r  s    r2   test_batching_auto_threadingr    sL    
 
v{	Cq		.%+	..zz,,.!333 
D	C	C   9A
Ac                     [        SSU S9 nU" S [        S5       5       5        UR                  R                  5       S:  d   e S S S 5        g ! , (       d  f       g = f)NrA   r  r  c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   r%  rl   s     r2   ro   2test_batching_auto_subprocesses.<locals>.<genexpr>  r  rq   r  r   r  )r9   r  s     r2   test_batching_auto_subprocessesr    sN     
vw	?1		.%+	..
 zz,,.222 
@	?	?r  c                      [        [        5         [        SSSS9" S [        S5       5       5        SSS5        g! , (       d  f       g= f)zCMake sure that exception raised during dispatch are indeed capturedrA      r   )ri   r  r   c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   rd  rl   s     r2   ro   *test_exception_dispatch.<locals>.<genexpr>  s!      7
2;QG$%a(()rq   rG  N)r   rX   r!   rt   r0   r1   r2   test_exception_dispatchr    s8    	
	A6 7
27)7
 	
 
		rR  c                 B    [        SS9" S [        S5       5       5        g )NrA   r~   c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   rd  rm   js     r2   ro   (nested_function_inner.<locals>.<genexpr>  s     GYw/033Yrq   rG  rs   rn   s    r2   nested_function_innerr    s    AGU2YGGr1   c                 B    [        SS9" S [        S5       5       5        g )NrA   r~   c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   )r#   r  r  s     r2   ro   (nested_function_outer.<locals>.<genexpr>  s     L)Qw45a88)rq   rG  rs   r  s    r2   nested_function_outerr    s    AL%)LLr1   z'https://github.com/joblib/loky/pull/255reasonc                 z   [        [        5       n[        SU S9" S [        S5       5       5        SSS5        [	        WR
                  UR                  UR                  5      nSR                  U5      nSU;   d   eSU;   d   eS	U;   d   e[        UR                  5      [        L d   eg! , (       d  f       N= f)
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   rh   c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   )r#   r  rl   s     r2   ro   1test_nested_exception_dispatch.<locals>.<genexpr>  s!      ,
7@!G)*1--yrq   rG  N r  r  rZ   )	r   rX   r!   rt   r	   rd   r   tbr   )r9   excinforeport_linesreports       r2   test_nested_exception_dispatchr    s     

	w7+ ,
7<Ry,
 	
 
 $GLL'--LLWW\"F"f,,,"f,,,'''*,,, 
	s   !B,,
B:c                   ,    \ rS rSrSrSS jrSS jrSrg)	FakeParallelBackendi  z8Pretends to run concurrently while running sequentially.Nc                 >    U R                  U5      U l        X l        U$ r.   )r$   ri   r   )rH   ri   r   backend_argss       r2   	configureFakeParallelBackend.configure  s    ++F3 r1   c                 \    US:  a%  [        [        R                  " 5       S-   U-   S5      nU$ )Nr   r   )maxr   r"   rH   ri   s     r2   r$   $FakeParallelBackend.effective_n_jobs  s*    A:!+f4a8Fr1   )ri   r   r   )r   )rP   rQ   rR   rS   rT   r  r$   rU   r0   r1   r2   r  r    s    B
r1   r  c                     [        [        SS9   [        SS9  S S S 5        [        [        SS9   [        SS9    S S S 5        S S S 5        [        [        SS9   [        SS9    S S S 5        S S S 5        g ! , (       d  f       Nc= f! , (       d  f       NR= f! , (       d  f       N[= f! , (       d  f       NJ= f! , (       d  f       g = f)NzInvalid backend:r"  zunit-testingr8   )r   rX   r!   r&   r0   r1   r2   test_invalid_backendr    s    	
"4	5( 
6 

"4	5^4 5 
6 

"4	5^4 5 
6	5 
6	5 54 
6	5
 54 
6	5sP   
A6
BBB
B:#B)%B:6
B
B	B
B&)
B7	3B::
Cc                    [        [        5       n[        SU S9R                  5         S S S 5        S[	        WR
                  5      ;   d   e[        [        5       n[        SU S9R                  5         S S S 5        S[	        UR
                  5      ;   d   e[        [        5       n[        SU S9R                  5         S S S 5        S[	        UR
                  5      ;   d   e[        [        5       n[        SU S9R                  5         S S S 5        S[	        UR
                  5      ;   d   eg ! , (       d  f       GN= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N^= f)Nr   rh   z&n_jobs == 0 in Parallel has no meaning      ?z2.3z$n_jobs could not be converted to intinvalid_str)r   rX   r!   _initialize_backendr   r   )r9   r  s     r2   test_invalid_njobsr    s
   	
	w7+??A 
3s7==7IIII	
	wW-AAC 
3s7==7IIII	
	ww/CCE 
1S5GGGG	
	ww7KKM 
1S5GGGG 
	 
	 
	 
	s/   D.E &E1E".
D= 
E
E"
E0)2gffffff@rA   c                     [        XS9nUR                  5       S:X  d   eU" S [        S5       5       5      n[        S [	        U5       5       5      (       d   eg )Nrh   rA   c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   rk   rl   s     r2   ro   .test_njobs_converted_to_int.<locals>.<genexpr>  s     2	1GFOA	rq   r  c              3   B   #    U  H  u  pU[        U5      :H  v   M     g 7fr.   )rC   )rm   rn   rs      r2   ro   r    s     9.$!qF1I~.s   )r!   _effective_n_jobsrt   r   	enumerate)r9   ri   r  r   s       r2   test_njobs_converted_to_intr    sT     	0A A%%%
2b	2
2C9)C.99999r1   c                       [        S[        5        S[        ;   d   e[        S   [        :X  d   e [        S	 g ! [        S	 f = f)Ntest_backend)r'   r  r    r0   r1   r2   test_register_parallel_backendr    sE    %!.2EF)))'+>>>>^$H^$s	   /: 	Ac                  
   [         R                  n [        5       [        5       :X  d   e [	        S[
        S   SS9  [        5       [        :X  d   e U [         l        [        5       [        5       :X  d   eg ! U [         l        f = f)Nr*   T)make_default)r   r/   rf   r3   r'   r    r   )default_backend_origs    r2   test_overwrite_default_backendr  %  sw    #33!%A%CCCC8!+x/DSWX#%)9999 $8 !%A%CCCC $8 s   &A5 5BzOnly without multiprocessingc                     [        [        SS9   [        SS9" S [        S5       5       5        S S S 5        [	        SS9   [        5       " S [        S5       5       5        S S S 5        g ! , (       d  f       NA= f! , (       d  f       g = f)Nz)joblib backend '.*' is not available on.*r"  r)   r8   c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   rk   rl   s     r2   ro   2test_backend_no_multiprocessing.<locals>.<genexpr>4  s      FX!3!3Xrq   rr   c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   rk   rl   s     r2   ro   r  8  s     8x!76?1%%xrq   )r   UserWarningr!   rt   r&   r0   r1   r2   test_backend_no_multiprocessingr  1  sc    	{"M	N  FU1X FF 
O 
	(
8uQx88 
)	(	 
O	N 
)	(s    A* !A;*
A8;
B	c                    U " USS9   [         R                  " 5       u  p#US:X  d   e[        S5      S:X  d   e[        5       nUR                  S:X  d   eUS:X  a3  [        U5      [        L d   e[        UR                  5      [        L d   eOUS:X  a3  [        U5      [        L d   e[        UR                  5      [        L d   eOUS:X  a3  [        U5      [        L d   e[        UR                  5      [        L d   eOHUR                  S5      (       a2  [        U5      [        L d   e[        UR                  5      [        L d   eS S S 5        g ! , (       d  f       g = f)Nrr   r~   r(   r)   r*   test_)r   re   r$   r!   ri   rd   r   r  r   r   
startswithr  )r|   backend_nameactive_backendactive_n_jobsr  s        r2   check_backend_context_managerr  ;  s9   	a	((0(C(C(E%!!!"a'''Jxx1}},,'+AAAA

#'====V#';666

#{222[('+;;;;

#'7777$$W--'+>>>>

#'::::# 
)	(	(s   E E
Err   ztest_backend_%dc                 4  ^ U[         ;  a  U R                  [         U[        5        [        5       [	        5       :X  d   e[        TU5        [        5       [	        5       :X  d   e[        SSS9" U4S j[         5       5        [        5       [	        5       :X  d   eg )NrA   r*   rh   c              3   b   >#    U  H$  nU(       a  M  [        [        5      " TU5      v   M&     g 7fr.   )r#   r  )rm   rJ   r|   s     r2   ro   /test_backend_context_manager.<locals>.<genexpr>c  s-      ,1A 	;-.w::1s   //)r    setitemr  rf   r3   r  r!    all_backends_for_context_manager)r   r9   r|   s     `r2   test_backend_context_managerr  T  s     hHg/BC!%A%CCCC!'73  !%A%CCCC A{+ ,1,   !%A%CCCCr1   c                   "    \ rS rSrSrSS jrSrg)ParameterizedParallelBackendim  z9Pretends to run conncurrently while running sequentially.Nc                 ,    Uc  [        S5      eXl        g )Nzparam should not be None)rX   param)rH   r  s     r2   rM   %ParameterizedParallelBackend.__init__p  s    =788
r1   r  r.   rO   r0   r1   r2   r	  r	  m  s
    Cr1   r	  c                 R   U R                  [        S[        5        [        5       [	        5       :X  d   eU" SSSS9   [
        R                  " 5       u  p#[        U5      [        L d   eUR                  S:X  d   eUS:X  d   e[        5       nUR                  S:X  d   eUR                  UL d   eU" S [        S5       5       5      nS S S 5        W[        S5       Vs/ s H  n[        U5      PM     sn:X  d   e[        5       [	        5       :X  d   eg ! , (       d  f       NR= fs  snf )Nparam_backend*   rr   )r  ri   c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   r#   r   rl   s     r2   ro   =test_parameterized_backend_context_manager.<locals>.<genexpr>       7hGDM!$$hrq   r   )r  r    r	  rf   r3   r   re   rd   r  r!   ri   r  rt   r   )r   r|   r  r   r  r   rn   s          r2   *test_parameterized_backend_context_managerr  v  s
   /3OP!%A%CCCC	1	5(0(C(C(E%N#'CCCC##r)))!!!Jxx1}}zz^+++7eAh77 
6 a11tAw1111  !%A%CCCC 
6	5 2s   BDD$
D!c                 (   [        5       [        5       :X  d   eU " [        SS9SS9   [        R                  " 5       u  p[        U5      [        L d   eUR                  S:X  d   eUS:X  d   e[        5       nUR                  S:X  d   eUR                  UL d   eU" S [        S5       5       5      nS S S 5        W[        S5       Vs/ s H  n[        U5      PM     sn:X  d   e[        5       [        5       :X  d   eg ! , (       d  f       NR= fs  snf )N+   r  r   r~   c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   r  rl   s     r2   ro   Ftest_directly_parameterized_backend_context_manager.<locals>.<genexpr>  r  rq   )rf   r3   r	  r   re   rd   r  r!   ri   r  rt   r   )r|   r  r   r  r   rn   s         r2   3test_directly_parameterized_backend_context_managerr    s    !%A%CCCC 
-B7	B(0(C(C(E%N#'CCCC##r)))!!!Jxx1}}zz^+++7eAh77 
C a11tAw1111  !%A%CCCC 
C	B 2s   BC>D>
Dc                  B    [        S5        [        R                  " 5       $ )Nr   )r   osgetpidr0   r1   r2   sleep_and_return_pidr    s    	#J99;r1   c                      [        5       [        :X  d   e[        5       R                  5       S:X  d   e[        SS9" S [	        S5       5       5      $ )Nr   rA   r~   c              3   J   #    U  H  n[        [        5      " 5       v   M     g 7fr.   )r#   r  r   s     r2   ro   "get_nested_pids.<locals>.<genexpr>  s     Px!g&:;==xr  )rf   r   r!   r  rt   r0   r1   r2   get_nested_pidsr"    sK    !%5555 :'')Q... 1PuQxPPPr1   c                   ,   ^  \ rS rSrSrU 4S jrSrU =r$ )	MyBackendi  z:Backend to test backward compatibility with older backendsc                 .   > [         [        U ]  5       S   $ rc   )superr$  get_nested_backend)rH   	__class__s    r2   r'  MyBackend.get_nested_backend  s     Y8:1==r1   r0   )rP   rQ   rR   rS   rT   r'  rU   __classcell__)r(  s   @r2   r$  r$    s    D> >r1   r$  back_compat_backend)r*   r)   r(   r+  c                     U " U5         [        SS9" S [        S5       5       5      nU H  n[        [        U5      5      S:X  a  M   e   S S S 5        g ! , (       d  f       g = f)NrA   r~   c              3   J   #    U  H  n[        [        5      " 5       v   M     g 7fr.   )r#   r"  r   s     r2   ro   6test_nested_backend_context_manager.<locals>.<genexpr>  s     'VIq(@(B(BIr  r  r   )r!   rt   r   r   )r|   r9   
pid_groups	pid_groups       r2   #test_nested_backend_context_managerr1    sS     
	Q''VERTI'VV
#Is9~&!+++ $ 
		s   ;AA
A#)rA   r}   Nc                    ^ ^^ S m[        SS9" U4S j[        S5       5       5        U" T TS9   [        SS9" U UU4S j[        S5       5       5        S S S 5        g ! , (       d  f       g = f)Nc                     [        5       [        U    :X  d   e[        U5      n[        5       R	                  5       U:X  d   eg r.   )rf   r    r$   r!   r  )expected_backend_typeexpected_n_jobs     r2   check_nested_backend?test_nested_backend_in_sequential.<locals>.check_nested_backend  s@     $%2G)HHHH *.9z++-???r1   r   r~   c              3   d   >#    U  H%  n[        T5      " [        R                  S 5      v   M'     g7fr   )r#   r   r/   )rm   r   r6  s     r2   ro   4test_nested_backend_in_sequential.<locals>.<genexpr>  s*      LUq$%h&>&>BBIs   -0r  c              3   H   >#    U  H  n[        T5      " TT5      v   M     g 7fr.   r9  )rm   r   r9   r6  ri   s     r2   ro   r9    s$      
DMqG()'6::Is   "rs   )r9   ri   r|   r6  s   `` @r2   !test_nested_backend_in_sequentialr;    s`    @ A LQRTI  
	( 
DI"I
 	
 
)	(	(s   %A
A,c                     U " U5       nU [         L a  US   nU [        L a  US   nWR                  U:X  d   e S S S 5        g ! , (       d  f       g = f)Nr9   r   )r&   r%   nesting_level)r|   inner_backendexpected_levelctxr9   s        r2   check_nesting_levelrA    sO    		3o%)nG&&!fG$$666 
 		s   /A
Aouter_backendr>  c                    ^ ^ [        T US5        [        SUS9" U U4S j[        S5       5       5        T " TSS9   [        5       " U U4S j[        S5       5       5        S S S 5        g ! , (       d  f       g = f)Nr   rA   rh   c              3   R   >#    U  H  n[        [        5      " TTS 5      v   M     g7fr   r#   rA  rm   r   r|   r>  s     r2   ro   -test_backend_nesting_level.<locals>.<genexpr>  s&      .IRA#$WmQ??   $'r  r~   c              3   R   >#    U  H  n[        [        5      " TTS 5      v   M     g7fr   rE  rF  s     r2   ro   rG    s&      
MVG'(-CCYrH  )rA  r!   rt   )r|   rB  r>  s   ` `r2   test_backend_nesting_levelrJ    se     2A}- .INr.  
q	)
 
MRSUY
 	
 
*	)	)s   %A))
A7with_retrieve_callbackTc                 V  ^^^ SS K m " UU4S jS[        5      n[        SU5        S mU " S5       n[        SS9" U4S j[	        S	5       5       5        U [
        L a  US
   R                  S:X  d   eU [        L a  US   R                  S:X  d   eS S S 5        g ! , (       d  f       g = f)Nr   c                   F   > \ rS rSrSr Yr Y R                  S 5       rSrg))test_retrieval_context.<locals>.MyBackendi  r   c              3   >   #    U =R                   S-  sl         S v   g 7fr   r  r  s    r2   retrieval_context;test_retrieval_context.<locals>.MyBackend.retrieval_context	  s     FFaKFs   r0   N)	rP   rQ   rR   rS   rn   supports_retrieve_callbackcontextmanagerrP  rU   )
contextlibrK  s   r2   r$  rN    s&    %;"		"	"	 
#	r1   r$  	retrievalc                 @    [        SS9" S [        U 5       5       5      $ )NrA   r~   c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   r%  rl   s     r2   ro   >test_retrieval_context.<locals>.nested_call.<locals>.<genexpr>  s     !C(Q'"+a..(rq   rs   )ns    r2   nested_call+test_retrieval_context.<locals>.nested_call  s    q!!C%(!CCCr1   rA   r~   c              3   F   >#    U  H  n[        T5      " U5      v   M     g 7fr.   r9  )rm   rn   rZ  s     r2   ro   )test_retrieval_context.<locals>.<genexpr>  s     EHq7;/22Hr;  r   r9   r   )rT  r   r'   r!   rt   r&   rn   r%   )r|   rK  r$  r@  rT  rZ  s    `  @@r2   test_retrieval_contextr^    s      $  k95D 
	EE!HEEo%y>##q(((&&q688q= = 
		s   AB
B(r  )r   r}   gQ?c                 h    [        [        5         [        U S9  S S S 5        g ! , (       d  f       g = f)Nr  )r   rX   r!   r`  s    r2   test_invalid_batch_sizera    s    	
	J' 
		s   
#
1z)n_tasks, n_jobs, pre_dispatch, batch_size))rA   rA   r   r  )rA   rA   ri   r  r  rA   ri   r  )i  rA   ri   r  rb  )r  r   ri   r  )   r  ri   r  )   r  
2 * n_jobsr   )   r  r   r   )rf  r  re  rW   )rc  r  re  r  c                     XUS.n[        U 5       Vs/ s H  n[        U5      PM     nn[        S0 UD6" S [        U 5       5       5      nXv:X  d   eg s  snf )N)ri   r  r  c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   rk   rl   s     r2   ro   /test_dispatch_race_condition.<locals>.<genexpr>;  s      L^!3!3^rq   r0   r   )r   ri   r  r  paramsrn   r   r   s           r2   test_dispatch_race_conditionrk  %  sW    ( JWF#(>2>aq	>H2   LU7^ LLG 3s   Ac                      [         R                  " 5       n [        SSS9nUR                  R	                  S5      nUR                  5       nX0:X  d   eg )NrA   r(   rh   r|   )r   get_start_methodr!   _backend_kwargsget)mp_start_methodr  r|   start_methods       r2   test_default_mp_contextrr  ?  sM    ))+O#45A##I.G++-L***r1   c                 (  ^ U S:X  a  [         R                  " S5      n [        R                  R	                  S5      nUR                  SS5      m[        R                  " TTR                  5        [        SU S9" U4S j[        S5       5       5        g )Nr(   r,   r  i  rA   rh   c              3   x   >#    U  H/  n[        [        R                  5      " TTR                  5      v   M1     g 7fr.   )r#   r   dotT)rm   rn   rI   s     r2   ro   Atest_no_blas_crash_or_freeze_with_subprocesses.<locals>.<genexpr>^  s'     'RA133(?(?s   7:)
r   r+   r   randomRandomStaterandnru  rv  r!   rt   )r9   rngrI   s     @r2   .test_no_blas_crash_or_freeze_with_subprocessesr|  H  sr     ## ..) ))


#C 			$AFF1accN Aw''Rq'RRr1   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                     U S:X  a/  [         R                  " 5       S:w  a  [        R                  " S5        [        R                  U 5      n[        [        R                  SU/SSS9  g )Nr(   forkzVRequire fork start method to use interactively defined functions with multiprocessing.z-cr  \[0, 1, 4, 9, 16\]rI  stdout_regex)	r   rm  pytestskip,UNPICKLABLE_CALLABLE_SCRIPT_TEMPLATE_NO_MAINformatr   sys
executable)r9   codes     r2   2test_parallel_with_interactively_defined_functionsr  q  s[    
 ##(;(;(=(G.	
 8>>wGD	t$b?Tr1   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           
         U S;   a4  U[         :w  d  [        R                  S:X  a  [        R                  " S5        [
        R                  UU U[        R                  R                  [        R                  R                  [        R                  5      5      S9nUR                  S5      nUR                  U5        [        [        R                  UR                   /SSS9  g )	N)r(   r,   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_files         r2   0test_parallel_with_unpicklable_functions_in_argsr    s     ..{"cllg&=/04;;+77??277??6??+KL	 < D 89IOOD	**+*r1   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                     U R                  S5      nUR                  [        5        [        [        R
                  UR                  /SS S9  g )Nz(joblib_interactively_defined_function.pyr  )r  rI  )r   r  5INTERACTIVE_DEFINED_FUNCTION_AND_CLASS_SCRIPT_CONTENTr   r  r  r  r  scripts     r2   7test_parallel_with_interactively_defined_functions_lokyr    s>    
 [[CDF
LLFG	(*r1   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                     U R                  S5      nUR                  [        5        [        [        R
                  UR                  /SSSS9  g )Nz)joblib_interactive_bound_method_script.pyz\[None, None, None\]LokyProcess   )r  stderr_regexrI  )r   r  9INTERACTIVELY_DEFINED_SUBCLASS_WITH_METHOD_SCRIPT_CONTENTr   r  r  r  r  s     r2   :test_parallel_with_interactively_defined_bound_method_lokyr    s?    [[DEF
LLJK	(,#	r1   c                  D    [        / 5      n [        SS9" U 5      / :X  d   eg )NrA   r~   )iterr!   )exhausted_iterators    r2   %test_parallel_with_exhausted_iteratorr  )  s%    b101R777r1   c                     [        U [        R                  5      (       d  [        S[	        U 5      5      eU R                  5       $ )Nz#Expected np.memmap instance, got %r)r   r   memmap	TypeErrorrd   copy)rI   s    r2   check_memmapr  .  s0    a##=tAwGG668Or1   c                    S n[        SSU S9" S U" S5       5       5      n[        X!" [        U5      5      5       H$  u  p4[        R                  R                  XC5        M&     [        SSU S9" S U" S5       5       5      n[        X!" [        U5      5      5       H$  u  p4[        R                  R                  XC5        M&     g )	Nc              3      #    [        U 5       H+  n[        R                  " S[        R                  S9U-  v   M-     g 7f)Nr  r3  )rt   r   onesfloat32)rY  rn   s     r2   generate_arraysBtest_auto_memmap_on_arrays_from_generator.<locals>.generate_arrays<  s-     qA''"BJJ/!33 s   <>rA   r   ri   r/  r9   c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   r#   r  rm   rI   s     r2   ro   <test_auto_memmap_on_arrays_from_generator.<locals>.<genexpr>B  "      @*>Qa  *>rq   r   r   c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   r  r  s     r2   ro   r  K  r  rq   )r!   rf  r   r   r?  r@  )r9   r  r   rB  r   s        r2   )test_auto_memmap_on_arrays_from_generatorr  4  s    4 aAw? @*9#*>@ G  W)FG


%%h7 H aAw? @*9#*>@ G  W)FG


%%h7 Hr1   c                     U $ r.   r0   )args    r2   identityr  R  s    Jr1   c                   ^ U R                  S5      R                  n[        R                  n[        R
                  " USS9[        R                  " USS9/n[        X15        [        USS9m[        SS9" U4S jS	 5       5      u  n[        TS
   [        R                  5      (       d   eTS
   R                  U:  d   e[        R                  R                  X45        g )Nz	test.mmapuint8r  r  )	mmap_moderA   r~   c              3   N   >#    U  H  n[        [        5      " T5      v   M     g 7fr.   )r#   r  )rm   r   r  s     r2   ro   .test_memmap_with_big_offset.<locals>.<genexpr>^  s     "Jc78#4V#<#<cr   rz  r   )r   r  mmapALLOCATIONGRANULARITYr   zerosr  r
   r   r!   r   r  offsetr?  r@  )r  fnamesizeobjrB  r  s        @r2   test_memmap_with_big_offsetr  V  s     KK$,,E%%D88D("''$g*F
GC%3'F""Jc"JJIVfQi++++!9d"""JJ!!#.r1   c                  D   [         R                  " SS9 n [        SSS9" S [        S5       5       5        S S S 5        [	        W 5      S:X  d   eU S   n[        UR                  [        5      (       d   e[        UR                  5      S:X  d   eg ! , (       d  f       Na= f)	NTr   r   )ri   rI  c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   rk   rl   s     r2   ro   Ftest_warning_about_timeout_not_supported_by_backend.<locals>.<genexpr>f  s     %L)Qgfoa&8&8)rq   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!   rt   r   r   r   r  r   )r   r   s     r2   3test_warning_about_timeout_not_supported_by_backendr  d  s    		 	 	-1%%L%)%LL 
.x=AAaii----qyy>	   
.	-s   !B
Bc                     X U'   U$ r.   r0   )
input_listr  r   s      r2   set_list_valuer  q  s    uLr1   )r   rA   r   c                    ^ S/S-  m[        U SSS9" U4S j[        S5       5       5      n[        U5      n[        S [	        TU5       5       5      (       d   eg )Nr   r   rU  r*   ri   rT  r9   c              3   P   >#    U  H  n[        [        5      " TX5      v   M     g 7fr.   )r#   r  )rm   rn   r  s     r2   ro   Ptest_parallel_return_order_with_return_as_generator_parameter.<locals>.<genexpr>|  s$      Q;Ca
A118r  c              3   .   #    U  H  u  pX:H  v   M     g 7fr.   r0   rm   vr  s      r2   ro   r    s     :"9$!qv"9   )r!   rt   r[  r   rf  )ri   rB  r  s     @r2   =test_parallel_return_order_with_return_as_generator_parameterr  v  s_    
 qJV{KP Q;@8Q F
 &\F:#j&"9:::::r1   c                 <    U(       a  [        S5        [        U 5      $ )NrG  )r   r   )edelays     r2   _sqrt_with_delayr    s    b	7Nr1   c                    ^ [        USU S9" S [        S5       5       5      m[        U4S j[        S5       5       5      nS/[        [        SS5      5      -   n[	        S	 [        X25       5       5      (       d   e@g )
NrV  r  c              3   Z   #    U  H!  n[        [        5      " US -  US:H  5      v   M#     g7f)rA   r   N)r#   r  rl   s     r2   ro   K_test_parallel_unordered_generator_returns_fastest_first.<locals>.<genexpr>  s,      W;Da !!Q$a119s   )+r  c              3   :   >#    U  H  n[        T5      v   M     g 7fr.   )next)rm   r   rB  s     r2   ro   r    s     =Hqd6llHs   	   r   rA   c              3   .   #    U  H  u  pX:H  v   M     g 7fr.   r0   r  s      r2   ro   r    s     S"R$!qv"Rr  )r!   rt   sortedr[  r   rf  )r9   ri   quickly_returnedexpected_quickly_returnedrB  s       @r2   8_test_parallel_unordered_generator_returns_fastest_firstr    s{     V/DgV W;@9W F =E!H==!"d5B<&8 8S#&?"RSSSSSr1   c                     [        X5        g r.   )r  r9   ri   s     r2   7test_parallel_unordered_generator_returns_fastest_firstr    s     =WMr1   )r   rA   r   r}   c                     S/S/S-  -   n[        [        5         [        R                  " 5       n[        XS9" S U 5       5        S S S 5        [        R                  " 5       W-
  nUS:  d   eg ! , (       d  f       N/= f)NrI   r  r   rh   c              3   `   #    U  H$  n[        [        R                  5      " U5      v   M&     g 7fr.   r#   r\   r   rl   s     r2   ro   %test_abort_backend.<locals>.<genexpr>  s#     0XQWA1DQ1G1GQWs   ,.ro  )r   r  r\   r!   )ri   r9   delayst_startdts        r2   test_abort_backendr    sh     UbTCZF			))+00XQW0XX 
 
w	B7N7	 
	s   ,A//
A=c                 T    [         R                  " [        S5      [        S9nSUS'   U$ )Ng    Ar  Fr   )r   r  intbool)r  rB  s     r2   get_large_objectr    s$    WWS\.FF1IMr1   c                     [        X US9 nU" S [        S5       5       5      n[        U5        [        U5        AS S S 5        g ! , (       d  f       g = f)N)ri   r9   rT  c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   )r#   r  rl   s     r2   ro   0_test_deadlock_with_generator.<locals>.<genexpr>  s     J	1'"23A66	rq   r  )r!   rt   r  )r9   rT  ri   r   rB  s        r2   _test_deadlock_with_generatorr    sB     
I	F(Jb	JJVV	 
G	F	Fs   0A
Ac                     [        XU5        g r.   )r  )r9   rT  ri   s      r2   test_deadlock_with_generatorr    s    
 "'f=r1   c                 :   [        [        SS9   [        X US9nU" S [        S5       5       5      n[        R                  " 5       nU" S [        S5       5       5      nS S S 5        [        R                  " 5       W-
  S:  d   S	5       eAg ! , (       d  f       N3= f)
N)This Parallel instance is already runningr"  r\  c              3   L   #    U  H  n[        [        5      " S 5      v   M     g7fr   r   r   s     r2   ro   /test_multiple_generator_call.<locals>.<genexpr>  s     :	1WU^A&&	rq   r  c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   r%  rl   s     r2   ro   r    s     ;
1A
rq   r   rA   [The error should be raised immediately when submitting a new task but it took more than 2s.)r   r  r!   rt   r\   )r9   rT  ri   r   gr  gen2s          r2   test_multiple_generator_callr    s     
$O	PFyI:b	::))+;c
;;	 
Q 99; 1$ 	$$
 	
 
Q	Ps   AB
Bc                 r   [        X US9 nU" S [        S5       5       5      n[        R                  " 5       n[        [        SS9   U" S [        S5       5       5      nS S S 5        [        R                  " 5       U-
  S:  d   S	5       e S S S 5        Ag ! , (       d  f       N<= f! , (       d  f       Ag = f)
Nr\  c              3   L   #    U  H  n[        [        5      " S 5      v   M     g7frO  r   r   s     r2   ro   7test_multiple_generator_call_managed.<locals>.<genexpr>  s     ;AWU^B''rq   r  r  r"  c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   r%  rl   s     r2   ro   r    s     =*Q'"+a..*rq   r   rA   r	  )r!   rt   r\   r   r  )r9   rT  ri   r   r
  r  g2s          r2   $test_multiple_generator_call_managedr    s     
&Y	?8;r;;))+L(ST=%*==B U yy{W$q( 	
(	
( 
@ 	
 UT 
@	? 	
s#   <B'B +B'
B$	 B''
B6return_as_1return_as_2c           
      |   [        X0US9" S [        S5       5       5      n[        X0US9" S [        SS5       5       5      nUS:X  a  [        U5      nUS:X  a  [        U5      n[        S [	        U[        S5      5       5       5      (       d   e[        S [	        U[        SS5      5       5       5      (       d   eg )	Nr\  c              3   R   #    U  H  n[        [        5      " US -  5      v   M     g7frA   Nr  rl   s     r2   ro   9test_multiple_generator_call_separated.<locals>.<genexpr>  s$      A%.adY   %'r  c              3   R   #    U  H  n[        [        5      " US -  5      v   M     g7fr  r  rl   s     r2   ro   r    s$      B%2ad]r  ro  rV  c              3   .   #    U  H  u  pX:H  v   M     g 7fr.   r0   rm   r   rn   s      r2   ro   r    s     8&7FCsx&7r  c              3   .   #    U  H  u  pX:H  v   M     g 7fr.   r0   r  s      r2   ro   r    s     =&<FCsx&<r  )r!   rt   r  r   rf  )r9   r  r  ri   r
  r  s         r2   &test_multiple_generator_call_separatedr    s     	K@ A%*2YA 	A 
&[	A B%*2r]B 
B ++1I++BZ8c!U2Y&788888=c"eBm&<=====r1   zbackend, error))r)   T)r*   F)rS  Fc                    U S:X  a  [         c  [        R                  " S5        [        SXS9nU" S [	        S5       5       5      n[
        R                  " US 5      nU(       a  [        [        SS	9O	[        5       nU   [        R                  " 5       n[        SXS9" S
 [	        SS5       5       5      nUS:X  a  [        U5      n[        S [        U[	        SS5      5       5       5      (       d   e S S S 5        [        R                  " 5       W-
  S:  d   eSn	UR                  (       a:  U	S:  a4  U	S-  n	[        R                  " S5        UR                  (       a  U	S:  a  M4  [        R                  " 5       U-
  S:  d   eUR                   " 5       S:w  a  UR"                  (       d   eg g ! , (       d  f       N= f)Nr)   zRequires multiprocessingrA   r\  c              3   L   #    U  H  n[        [        5      " S 5      v   M     g7frO  r   rl   s     r2   ro   <test_multiple_generator_call_separated_gc.<locals>.<genexpr>&  s     7Y##Yrq   r  c                      [        S5      $ )NzGenerator collected)r   r0   r1   r2   <lambda>;test_multiple_generator_call_separated_gc.<locals>.<lambda>'  s
    u-B'Cr1   z The executor underlying Parallelr"  c              3   R   #    U  H  n[        [        5      " US -  5      v   M     g7fr  r  rl   s     r2   ro   r!  3  s$      @
)6AGDM!Q$r  ro  rV  c              3   .   #    U  H  u  pX:H  v   M     g 7fr.   r0   r  s      r2   ro   r!  :  s     @*?38*?r  r   r   rr   r   r  )r   r  r  r!   rt   weakreffinalizer   r  r   r\   r  r   rf  aliver   r  rj  )
r9   r  r  errorr   r
  g_wrr@  r  retrys
             r2   )test_multiple_generator_call_separated_gcr-    s    	6
./ 7BH7U2Y77AACDD  	|#EF] 
 

 ))+Q? @
).r2@
 
 //q	A@#ar2*?@@@@@ 
 99; 1$$$ E
**


3 ** 99; 1$$$!!#q( !!!! )1 
s   ?A5F00
F>c                    UR                   n[        SSXS9 nU" S [        R                  R                  S5      /S-   5       5        [	        [
        R                  " U5      5      S:  d   e S S S 5        [        S5       H+  n[
        R                  " U5      (       d    O[        S5        M-     [        S	5      e[        SSU S
9nU" S [        R                  R                  S5      /S-   5       5        [        S5       H+  n[
        R                  " U5      (       d    g [        S5        M-     [        S	5      e! , (       d  f       N= f)NrA   r   )ri   r/  r9   temp_folderc              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   r  r  s     r2   ro   (test_memmapping_leaks.<locals>.<genexpr>V  s     	G,Fq',

"
",Frq   r  r   r   r   z/temporary directory of Parallel was not removedr  c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   r  r  s     r2   ro   r1  f  s     C(B1glA(Brq   )
r  r!   r   rx  r   r  listdirrt   r   AssertionError)r9   r  r  r   s       r2   test_memmapping_leaksr5  K  s    ^^F 
q'	NRS		GRYY-=-=b-A,BQ,F	GG 2::f%&***	 
O 3Zzz&!!c
 
 NOO 	a9AC)9)9")=(>(BCC3Zzz&!!c
 
 NOO1 
O	Ns   AD<<
E
)Nr)   r*   c                     [        SU S9" S [        S5       5       5      nU[        S5       Vs/ s H  o"S-  PM	     sn:X  d   eg s  snf )NrA   rh   c              3   F   #    U  H  n[        S  5      " U5      v   M     g7f)c                     U S-  $ r@   r0   rB   s    r2   r#  2test_lambda_expression.<locals>.<genexpr>.<lambda>v  s    !Q$r1   Nr9  rl   s     r2   ro   )test_lambda_expression.<locals>.<genexpr>u  s       2,5q""Ir   r  rs   )r9   r   rn   s      r2   test_lambda_expressionr;  p  sN    
 a1 2,1"I2 G U2Y/Y!tY/////s   Ac                   ^ SnSnSU-  m[        SXS9nU" U4S j[        U5       5       5        UR                  R                  UR                  R                  :X  d   eUR                  R
                  UR                  R                  :X  d   eU" U4S j[        U5       5       5        UR                  R                  UR                  R                  :X  d   eUR                  R
                  UR                  R                  :X  d   eg)	zCTest that a parallel backend correctly resets its batch statistics.rA   i  g       @r  )r   ri   r9   c              3   b   >#    U  H$  n[        [        R                  5      " T5      v   M&     g 7fr.   r  rm   rn   	task_times     r2   ro   6test_backend_batch_statistics_reset.<locals>.<genexpr>  "     >ogdjj)$$or  c              3   b   >#    U  H$  n[        [        R                  5      " T5      v   M&     g 7fr.   r  r>  s     r2   ro   r@    rA  r  N)r!   rt   r  _effective_batch_size_DEFAULT_EFFECTIVE_BATCH_SIZE_smoothed_batch_duration _DEFAULT_SMOOTHED_BATCH_DURATION)r9   ri   n_inputsr  r?  s       @r2   #test_backend_batch_statistics_resetrH  {  s     FHhIF<A>eHo>>::++qzz/W/WWWW	

++::66	7	7 >eHo>>::++qzz/W/WWWW	

++::66	7	7r1   c                    S H  n[        [        US9R                  5      [        5       L d   e[        USS9n[        UR                  5      [        L d   e[        USS9n[        UR                  5      [
        L d   e[        USS9n[        UR                  5      [        L a  M   e   [        SS	SS
9n[        UR                  5      [
        L d   eU " S	SS9   [        SS9n[        UR                  5      [
        L d   eUR                  S:X  d   e S S S 5        U " S	SS9   [        SSS9n[        UR                  5      [
        L d   eUR                  S:X  d   e S S S 5        U " S	SS9   [        SS9n[        UR                  5      [        L d   eUR                  S:X  d   e S S S 5        U " S	SS9   [        SSS9n[        UR                  5      [        L d   eUR                  S:X  d   e S S S 5        g ! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N|= f! , (       d  f       g = f)N)r   rA   r}   r~   threadsri   prefer	processes	sharedmemri   requirerA   r)   )ri   r9   rL  rL  rr   rP  r   )rd   r!   r  r3   r   r   ri   )r|   ri   r  s      r2   $test_backend_hinting_and_constraintsrS    s    HF+4459U9WWWWF95AJJ#3333F;7AJJ;...FK8AJJ#3333  	6)<A

{***		" I&AJJ;...xx1}} 
# 
	"Ai0AJJ;...xx1}}	 
# 
	"
 [)AJJ#3333xx1}} 
# 
	"A{3AJJ#3333xx1}} 
#	"- 
#	" 
#	" 
#	" 
#	"s0   :G?%;H0:H!:;H2?
H
H!
H/2
I c                 "    " S S[         5      nU" U" 5       5         [        SSS9n[        UR                  5      UL d   e[        SSS9n[        UR                  5      UL d   e S S S 5         " S S	[         5      nU" U" 5       5         [        SSS9n[        UR                  5      UL d   eU R	                  5       u  pVUS
:X  d   eUS
:X  d   e[        SSSS9n[        UR                  5      [
        L d   eU R	                  5       u  pVSnUR                  5       U:X  d   eUS
:X  d   e S S S 5        [        [        5         [        U" 5       SS9  S S S 5        g ! , (       d  f       N= f! , (       d  f       NG= f! , (       d  f       g = f)Nc                   (    \ rS rSrSrSrS rS rSrg)[test_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackendi  Tc                     g r.   r0   r  s    r2   apply_asyncgtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackend.apply_async      r1   c                     U$ r.   r0   r  s     r2   r$   ltest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackend.effective_n_jobs      Mr1   r0   N	rP   rQ   rR   rS   supports_sharedmemuse_threadsrX  r$   rU   r0   r1   r2   MyCustomThreadingBackendrV    s    !		r1   ra  rA   rM  rK  rN  rO  c                   (    \ rS rSrSrSrS rS rSrg)\test_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackendi  Fc                     g r.   r0   r  s    r2   rX  htest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackend.apply_async  rZ  r1   c                     U$ r.   r0   r  s     r2   r$   mtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackend.effective_n_jobs  r]  r1   r0   Nr^  r0   r1   r2   MyCustomProcessingBackendrc    s    "		r1   rh  r  r  )ri   rP  r   zUsing ThreadingBackend as joblib backend instead of MyCustomProcessingBackend as the latter does not provide shared memory semantics.r9   rP  )	r   r!   rd   r  
readouterrr   stripr   rX   )capsysr|   ra  r  rh  outerrr   s           r2   9test_backend_hinting_and_constraints_with_custom_backendsro    st   #6  
)+	,Ak2AJJ#;;;;A{3AJJ#;;;; 
-$7  
*,	-Ak2AJJ#<<<<$$&byybyyA{B?AJJ#3333$$&8 	
 yy{h&&&byy% 
.( 

	24kJ 
	K 
-	," 
.	-( 
	s%   A	EB"E/F 
E,/
E= 
Fc                     [        [        5         [        SS9  S S S 5        [        [        5         [        SS9  S S S 5        [        [        5         [        SSS9  S S S 5        [        bE  [        [        5         [        SSS9  S S S 5        [        [        5         [        S	SS9  S S S 5        g g ! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N}= f! , (       d  f       Ne= f! , (       d  f       g = f)
NinvalidrQ  rR  rM  rN  )rL  rP  r)   ri  r(   )r   rX   r!   r   r0   r1   r2   ,test_invalid_backend_hinting_and_constraintsrr    s    	
		" 
 

	# 
 

	 	[9 

 
~ JV[9  J.D    
	 
	 
	  s:   
B2
CC;C%C62
C 
C
C"%
C36
Dc                 "  ^ ^ [        SS9 n[        UR                  5      R                  UR                  R                  4/nT S:X  a  UsSSS5        $ U" UU 4S j[        S5       5       5      nX4S   -   sSSS5        $ ! , (       d  f       g= f)zCPerform nested parallel calls and introspect the backend on the wayrA   r~   r   Nc              3   X   >#    U  H  n[        [        5      " SS TS-
  0TD6v   M!     g7f)limitr   Nr0   )r#   _recursive_backend_info)rm   rn   r  ru  s     r2   ro   *_recursive_backend_info.<locals>.<genexpr>  s/      
 +,G519GGr(  r   )r!   rd   r  rP   r=  rt   )ru  r  r  
this_levelr   s   ``   r2   rv  rv    s|     
	qAJJ'00!**2J2JKL
A: 
	  
1X
 
 AJ& 
		s   >B "B  
Bc                     U " USS9   [        5       nS S S 5        UR                  5       S-   nUS4SSS/nWU:X  d   eg ! , (       d  f       N2= f)NrA   r~   Backendr   )r   r   )r   rA   )rv  title)r|   r9   backend_types_and_levelstop_level_backend_typeexpected_types_and_levelss        r2   test_nested_parallelism_limitr    sb     
	##:#<  
$ %]]_y8	#  	! $'@@@@ 
$	#s	   ?
Ac                 B    [        5       " S [        S5       5       5      $ )z6A horrible function that does recursive parallel callsc              3   J   #    U  H  n[        [        5      " 5       v   M     g 7fr.   )r#   _recursive_parallelrl   s     r2   ro   &_recursive_parallel.<locals>.<genexpr>0  s     Ghg1244hr  rA   rs   )nesting_limits    r2   r  r  .  s    :GeAhGGGr1   c                 b   U " USS9   [        [        5       n[        5         S S S 5        S S S 5        WR                  nUS:X  a2  SSKJn  [        X4[        45      (       a  [        R                  " S5        [        U[        5      (       d   eg ! , (       d  f       Nr= f! , (       d  f       N{= f)NrA   r~   r)   r   )TerminatedWorkerErrorz1Loky worker crash when serializing RecursionError)r   BaseExceptionr  r   &joblib.externals.loky.process_executorr  r   r   r  xfailRecursionError)r|   r9   r  excr  s        r2   test_thread_bomb_mitigationr  3  s     
	#M"g! # 
$ --C& 	Qc=ABB LLLMc>****# #" 
$	#s!   B BB 
B	B  
B.c                  t    0 n S H$  n[         R                  R                  U5      X'   M&     U [        S5      4$ )N)OMP_NUM_THREADSOPENBLAS_NUM_THREADSMKL_NUM_THREADSVECLIB_MAXIMUM_THREADSNUMEXPR_NUM_THREADSNUMBA_NUM_THREADS
ENABLE_IPCr   )r  environro  r   )env_varsvars     r2   _run_parallel_sumr  O  s;    H 

s+ \#&&&r1   zNeed OpenMP helper compiledc                 :   [        SU S9" S [        S5       5       5      n[        [        5       S-  S5      nU H^  u  p4XB:X  d   eUR	                  5        H>  u  pVUR                  S5      (       a  U[        U5      :X  d   eM.  US:X  d   eUS:X  a  M>   e   M`     g )NrA   rh   c              3   J   #    U  H  n[        [        5      " 5       v   M     g 7fr.   )r#   r  r   s     r2   ro   -test_parallel_thread_limit.<locals>.<genexpr>a  s      2.6!"$$hr  r   _THREADSr  1)r!   rt   r  r"   itemsendswithr   )r9   r   expected_num_threadsworker_env_varsomp_num_threadsr   r   s          r2   test_parallel_thread_limitr  ^  s     a1 2.3Ah2 G y{a/3,3(666*002KD}}Z(($8 9999|+++|#| 3 -4r1   zThis test requires daskc                 d    [        [        SS9   U " S5        S S S 5        g ! , (       d  f       g = f)NzPlease install daskr"  dask)r   rX   )r|   s    r2   )test_dask_backend_when_dask_not_installedr  o  s"     

"7	8 
9	8	8s   	!
/c                     " S S[         5      nSnU " U" 5       5         [        R                  " [        US9   [	        SS9" S [        S5       5       5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nc                   *    \ rS rSrS rSS jrS rSrg)3test_zero_worker_backend.<locals>.ZeroWorkerBackendiz  c                     grc   r0   )rH   r   r  s      r2   r  =test_zero_worker_backend.<locals>.ZeroWorkerBackend.configure{      r1   Nc                     [        S5      e)NzNo worker availabler   )rH   funccallbacks      r2   rX  ?test_zero_worker_backend.<locals>.ZeroWorkerBackend.apply_async~  s    455r1   c                     grc   r0   r  s     r2   r$   Dtest_zero_worker_backend.<locals>.ZeroWorkerBackend.effective_n_jobs  r  r1   r0   r.   )rP   rQ   rR   rS   r  rX  r$   rU   r0   r1   r2   ZeroWorkerBackendr  z  s    		6	r1   r  z&ZeroWorkerBackend has no active workerr"  rA   r~   c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr.   r%  rl   s     r2   ro   +test_zero_worker_backend.<locals>.<genexpr>  s     @x!wr{1~~xrq   )r   r  r   r  r!   rt   )r|   r  expected_msgs      r2   test_zero_worker_backendr  v  sd    ,  <L	"$	%]]<|<A@uQx@@ = 
&	%<< 
&	%s"   A; A*A;*
A8	4A;;
B	c                    ^ Sq S mT" 5       S:X  d   e[        SS9" U4S j[        S5       5       5      n [        U 5      S1:X  d   eSq T" 5       S:X  d   e[        SS9" U4S j[        S5       5       5      n [        U 5      S1:X  d   eg )Nzoriginal valuec                      [         $ r.   )MY_GLOBAL_VARIABLEr0   r1   r2   check_globals@test_globals_update_at_each_parallel_call.<locals>.check_globals  s    !!r1   rA   r~   c              3   D   >#    U  H  n[        T5      " 5       v   M     g 7fr.   r9  rm   rn   r  s     r2   ro   <test_globals_update_at_each_parallel_call.<locals>.<genexpr>        1*2Q  (    zchanged valuec              3   D   >#    U  H  n[        T5      " 5       v   M     g 7fr.   r9  r  s     r2   ro   r    r  r  )r  r!   rt   r   )workers_global_variabler  s    @r2   )test_globals_update_at_each_parallel_callr    s     *" ?....&a0 1*/(1  &',<+==== )?o---&a0 1*/(1  &'O+<<<<r1   c                      SS K n U R                  R                  SS5      nU R                  " X5        [        R
                  " S5      nUR                  5       $ )Nr   r   threadpoolctl)numpyrx  rz  ru  r  importorskipthreadpool_info)r   rI   r  s      r2   _check_numpy_threadpool_limitsr    sE    
 			S!AFF1L''8M((**r1   c                 n    U H  nUS   U S   :X  d  M  US   s  $    [        SR                  U 5      5      e)Nfilepathnum_threadsz,An unexpected module was loaded in child:
{})rX   r  )child_moduleparent_infoparent_modules      r2   _parent_max_num_threads_forr    sF    $$Z(@@ // % 7>>|L r1   c                 n    U  H/  nU H&  n[        XA5      n[        X%5      U1nUS   U;   a  M&   e   M1     g )Nr  )r  min)workers_infor  r  child_threadpool_infor  parent_max_num_threadsr   s          r2   check_child_num_threadsr    sK     ".1L%@&" K@+NH.(::: 2 ".r1   )rA   r   r   r}   c                    [        5       n[        U5      S:X  a  [        R                  " SS9  [	        SU S9" S [        S5       5       5      n[        U 5      n U S:X  a	  US   S	   nO[        [        5       U -  S5      n[        X!U5        g )
Nr   &Need a version of numpy linked to BLASr  r)   r  c              3   J   #    U  H  n[        [        5      " 5       v   M     g 7fr.   r#   r  rl   s     r2   ro   ;test_threadpool_limitation_in_child_loky.<locals>.<genexpr>  s       G;Ca./118r  rA   r   r  
r  r   r  r  r!   rt   r$   r  r"   r  )ri   r  workers_threadpool_infosexpected_child_num_threadss       r2   (test_threadpool_limitation_in_child_lokyr    s     12K
;1CD'vF G;@8G   f%F{%0^M%B"%()>%B" /Ir1   inner_max_num_threads)r   rA   r   Nc                 d   [        5       n[        U5      S:X  a  [        R                  " SS9  U " SUS9   [	        US9" S [        S5       5       5      nS S S 5        [        U5      nUS	:X  a	  US   S
   nOUc  [        [        5       U-  S	5      nOUn[        WX55        g ! , (       d  f       NR= f)Nr   r  r  r)   r  r~   c              3   J   #    U  H  n[        [        5      " 5       v   M     g 7fr.   r  rl   s     r2   ro   >test_threadpool_limitation_in_child_context.<locals>.<genexpr>  s      ;
?G!G2355xr  rA   r   r  r  )r|   ri   r  r  r  r  s         r2   +test_threadpool_limitation_in_child_contextr    s     12K
;1CD	/D	E#+6#: ;
?DQx;
 $
  
F
 f%F{%0^M%B"		&%()>%B"%:" + 
F	Es    B!!
B/var_name)r  r  r  c                   ^^ [        U5      S:X  a  [        R                  " S5        [        SS9R	                  5         S m[
        R                  R                  T5      n S[
        R                  T'   [        US9" UU4S j[        S	5       5       5      nUSS/:X  d   eU " S
SS9   [        US9" UU4S j[        S	5       5       5      nS S S 5        USS/:X  d   e Uc  [
        R                  T	 g U[
        R                  T'   g ! , (       d  f       NB= f! Uc  [
        R                  T	 f U[
        R                  T'   f = f)Nr   zSkip test when n_jobs == 1Treusec                 @    [         R                  R                  U 5      $ r.   )r  r  ro  )r  s    r2   _get_env>test_threadpool_limitation_in_child_override.<locals>._get_env  s    zz~~h''r1   4r~   c              3   F   >#    U  H  n[        T5      " T5      v   M     g 7fr.   r9  rm   rn   r  r  s     r2   ro   ?test_threadpool_limitation_in_child_override.<locals>.<genexpr>"  s     )Xx!'(*;H*E*Exr;  rA   r)   r  c              3   F   >#    U  H  n[        T5      " T5      v   M     g 7fr.   r9  r  s     r2   ro   r  &  s!      .5=!(++Xr;  r  )
r$   r  r  r   shutdownr  r  ro  r!   rt   )r|   ri   r  original_var_valuer   r  s     `  @r2   ,test_threadpool_limitation_in_child_overrider    s    1$01 %..0( 16"

8&))XuUVx)XX3*$$$V15f- .5:1X. G 6 3*$$$ %

8$#5BJJx  65 %

8$#5BJJx s%   "AD )$D	D 	
DD *E)rA   r   r}   c                     S nU" U 5        [        SS9n[        S5       H  nU" U 5        [        SS9nXB:X  a  M   e   g )Nc                 `   ^ [        S5      m[        U S9" U4S j[        S5       5       5        g )Nr  r~   c              3   N   >#    U  H  n[        [        5      " T5      v   M     g 7fr.   )r#   sum)rm   rn   r<   s     r2   ro   Atest_loky_reuse_workers.<locals>.parallel_call.<locals>.<genexpr>:  s     CAQr   )rt   r!   )ri   r<   s    @r2   parallel_call.test_loky_reuse_workers.<locals>.parallel_call8  s#    "ICrCCr1   Tr  r  )r   rt   )ri   r  first_executorr   r   s        r2   test_loky_reuse_workersr  2  sJ    D
 &*6N 2Yf(t4))) r1   c                 4    SU [         R                  " 5       '   g )Ninitialized)r  r  )statuss    r2   _set_initializedr  H  s    'F299;r1   c                    [         R                  " 5       nU R                  US 5      nUS;   d
   SU 35       eU(       d  g SX'   [        R                  " 5       S-   n[	        U R                  5        VVs/ s H  u  p6US:X  d  M  UPM     snn5      n[        R                  " 5       U:  aq  Xq:  al  [        R                  " S5        [	        U R                  5        VVs/ s H  u  p6US:X  d  M  UPM     snn5      n[        R                  " 5       U:  a  Xq:  a  Ml  [        R                  " 5       U:  a  [        S5      eW$ s  snnf s  snnf )N)r   startedz2worker should have been in initialized state, got r  rG  r   z-Waited more than 30s to start all the workers)r  r  ro  r\   r   r  r   r   )r  ri   wait_workerspidstatedeadliner  	n_starteds           r2   _check_statusr
  L  s
   
))+CJJsD!E.. 
<UGD. FKyy{RHv||~H~VSiS~HII
))+
 Y%7

36<<>L>Q)^>LM	 ))+
 Y%7 yy{hJKKJ I Ms   4E
E
E
.E
c                    ^ ^ [         R                  " 5       nUR                  5       mU" UT [        T4S9   [	        5       " U U4S j[        S5       5       5        S S S 5        g ! , (       d  f       g = f)Nr9   ri   initializerinitargsc              3   P   >#    U  H  n[        [        5      " TT5      v   M     g 7fr.   r#   r
  rm   rn   ri   r  s     r2   ro   +test_initializer_context.<locals>.<genexpr>s  s      N:a7=)&&99:r  r   )r   r  dictr  r!   rt   )ri   r9   r|   r  r  s   `   @r2   test_initializer_contextr  c  sY    
 jjlG\\^F 
$	
 	
N5:NN
 
 
s   %A$$
A2c                    ^ ^ [         R                  " 5       nUR                  5       m[        UT [        T4S9" U U4S j[        S5       5       5        g )Nr  c              3   P   >#    U  H  n[        [        5      " TT5      v   M     g 7fr.   r  r  s     r2   ro   ,test_initializer_parallel.<locals>.<genexpr>  s      AjgmVV,,jr  r   )r   r  r  r!   r  rt   )ri   r9   r  r  s   `  @r2   test_initializer_parallelr  v  sH     jjlG\\^F $	
 BeCjABr1   c                 D  ^ ^ Sn[         R                  " 5       nUR                  5       m[        5       n[	        U5       HH  n[        ST [        T4S9" U U4S j[	        T 5       5       5      nUR                  [        U5      5      nMJ     [        U5      T :X  d   S5       eg )Nrr   r)   r  c              3   N   >#    U  H  n[        [        5      " TTS S9v   M     g7fT)r  Nr  r  s     r2   ro   *test_initializer_reused.<locals>.<genexpr>  &      

" M"66E"r   z=The workers should be reused when the initializer is the same)	r   r  r  r   rt   r!   r  unionr   ri   n_repetitionsr  pidsrn   r   r  s   `     @r2   test_initializer_reusedr"    s    
 MjjlG\\^F5D=!(Y	



6]


 zz#g,' " t9 Gr1   c                 J  ^ ^ Sn[         R                  " 5       n[        5       n[        U5       HX  nUR	                  5       m[        ST [        T4S9" U U4S j[        T 5       5       5      nUR                  [        U5      5      nMZ     [        U5      UT -  :X  d   S5       eg )Nrr   r)   r  c              3   N   >#    U  H  n[        [        5      " TTS S9v   M     g7fr  r  r  s     r2   ro   .test_initializer_not_reused.<locals>.<genexpr>  r  r   zFThe workers should not be reused when the initializer arguments change)	r   r  r   rt   r  r!   r  r  r   r  s   `     @r2   test_initializer_not_reusedr&    s     MjjlG5D=!(Y	



6]


 zz#g,' " t9.. P.r1   )F)r   r   )rr   r.   )rT   r  r  r   r  r*   r\   r   r'  rT  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   r+   r3   r:   r>   rC   	ExceptionrE   rZ   r^   ra   rf   rv   rx   r{   markr   r   r   r   r   r   r   r   r   r   r   r  r  r  r*  rE  rL  rQ  r   r]  rl  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  extendrt   r  r	  r  r  r  r"  _parallel_backendsr$  r1  r;  rA  rJ  r^  ra  rk  rr  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  r  r  r  r  r  r  r  r  r  r-  r5  r;  rH  rS  ro  rr  rv  r  r  no_coverr  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r"  r&  )backend_strrn   s   00r2   <module>rC     sw    	 	 
     "  (    &   ' ' .  U T>; > 
 
 
 %MMO    / 6VfX]]_55  (K(;x,.(K K :)62$}4 
2}bnnW56.I 
2" Y*:;<%b""-.	:0  
 .  =. Y*+X~&Y%, & ' ,, Y*+X1v  ,( Y*+' ,'T0 +

 2 Y@A B Q _h'x( ) ( W W Xy! " Y)*/ +/: 
 
 [/*\At9%5 & +  5$ Y)*	 +	 Y)*
 + 
 Y56,GH[;(=>? @ I $ Y()C
 * C
L Y!E " E,' Y!  	
$ 	
%$'PQ' "R  Y)* + <4 Y()3 * 3
HM Y)*CD- E + -,+ 
 Y*+H ,H$ Y)*X}%: & + :%	D $=>9 ?9;* $5Q#7     ' 'a(Q1):Q)>(Q R Y89Y)?;<D = : D,#4  Y*:;<D =D& Y*:;<D =D(
Q>))55 > / ; YWXY*:;<, = Y , X}%Y)*Y*:;<
 = + & 
07 _/0_/0Y*:;<
 = 1 1 
 Y*:;<%e}5! 6 = !: \=)( *(
 / !  + + Y()S *  S,0 ,  Y() * - )@
 Y("*B7)LM][,FG "?@ A H N ,(9P Fbggoobggoofoo.NOFPQ 6V 
 
=, Fbggoobggoofoo.NOFP- :2  8
 Y()8 *  86 	/  	/

 9-; .;" Aq6* Y56,GHN I 	 +N Y*+X~& ' , Y12[;(=>?X~&> ' @ 3 > Y12[;(=>?X~&
 ' @ 3
& Y12[;(=>?X~&
 ' @ 3
& Y12][*?@A][*?@AX~&> ' B B 3>&  ][*?@A][*?@A)" B B)"X Y()P *  PD rz{#7R00 Y() * , Y*:;<+ = +\ Y*:;<3K =3KlE*' Y-.Y*:;<A = / AH
 Y*:;<Y"*+6;:OQ+ R = +2' Y2>$vG%BC$ D H$ Y*:;<4(AB C =
 Y*:;<A =A&=H	+
; X~& '  0 $o6X2wY*:;< =   7  
6 X2wZWXY*:;< 6 = Y    6F Xz"* # *((. X1vY()Y*:;<O = *  O X1vY()B *  B Aq6* + 0 Aq6* + mC  E
  L
  K6 L~ )RsB   	k9 l l  l&?l+9lllll#"l#