
    HWhP"             
       $   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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  SS
KJrJr  SSKJr  SSKJrJr  SSKJr  SSK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/J0r0  SSK/J1r1  SSK/J2r2  SSK/J3r3  SSK/J4r4  SSK5J6r6J7r7  SSK5J8r8  SSK5J9r9  SSK5J:r:  SSK5J;r;J<r<  SSK5JrJ=r=J>r>  \=R~                  " 5       r@\@R                  SS5        S/\B" \=R                  " 5       5      -   rD\D\= V s/ s H  n \=U    " 5       PM     sn -  rD\c  / rEOSS /rE\ES!/-   rF\G" \S"5      (       a!  \DR                  \R                  " S#5      5        \=\>   rJS$ rKS% rLS& rM " S' S(\N5      rOSS* jrPS+ rQSS, jrRS- rSS. rTS/ rUS0 rV\!" S1\8\9/5      \R                  RC                  S2S3S4\;" S4S594S6// S7QS89\S9 5       5       5       rX\!" S:\D5      \!" S;/ S<Q5      \!" S=/ S>Q5      S? 5       5       5       rY\!" S:\D5      S@ 5       rZSA r[\\!" SB/ SCQ5      SD 5       5       r\\\!" S:/ SEQ5      SF 5       5       r]SG r^\!" SH\=5      \!" SI\=5      SJ 5       5       r_SK r`\SL 5       raSM rb\!" S;/ SNQ5      SO 5       rc\!" S:\F5      SP 5       rd\SQ 5       re\\\!" SR/ SSQ5      ST 5       5       5       rf\!" S:\F5      SU 5       rg\\!" S:\F5      SV 5       5       rh\\!" S:\E5      SW 5       5       ri\\!" S:\=5      SX 5       5       rjSY rk\!" S:\=5      \!" SZS/ S[Q4S\/ S]Q4/5      S^ 5       5       rl\\!" S:\F5      S_ 5       5       rmS` rn\\!" S:\E5      Sa 5       5       roSb rpSc rqSd rr\\!" S:\F5      \R                  R                  SeSf9Sg 5       5       5       rt " Sh Si\05      ruSj rv\!" S:\D5      Sk 5       rw\\!" S:\F5      \!" S;/ SlQ5      Sm 5       5       5       rxSn rySo rz\$" \SLSpSf9Sq 5       r{Sr r|\FSS r}\}R                  \" Ss5       Vs/ s H  nStU-  PM
     sn5        \\!" S:\}5      \!" S1\9\8/5      Su 5       5       5       r " Sv Sw\05      r\!" S1\8\9/5      Sx 5       r\!" S1\8\9/5      Sy 5       rSz rS{ r " S| S}\GR                  Rh                  5      r\:" S~\5        \\!" S:/ SQ5      \!" S1\8\9/5      S 5       5       5       r\\!" S;/ SQ5      \!" S:\F5      \!" S1\8\9/5      S 5       5       5       5       rS r\\!" S\F5      \!" S\F5      \!" S1\8\9/5      S 5       5       5       5       r\\!" S1\8\9/5      \!" SSS)/5      S 5       5       5       r\!" S/ SQ5      S 5       r\!" S/ SQ5      S 5       r\S 5       r\\\!" S:\E5      S 5       5       5       rSr\\!" S:\E5      S 5       5       rSrSrSrSr\\!" S:\E\c  / OS#/-   5      \!" S\\\/5      \!" S/ SQ5      S 5       5       5       5       rSGR1                  \GR2                  GR5                  \GR2                  GR5                  \GR6                  5      5      S9r\S 5       rSGR1                  \GR2                  GR5                  \GR2                  GR5                  \GR6                  5      5      S9r\S 5       rS rS rS r\\\!" S:\E5      S 5       5       5       rS r\\S 5       5       rS rS r\R                  RC                  S;/ SQ5      S 5       rS rS r\R                  RC                  S;SS\/5      \\!" S:\" \@5      S1-
  5      S 5       5       5       r\R                  RC                  S;SS4/5      \!" S1\8\9/5      \$" \.SL SSf9S 5       5       5       r\!" S:\D5      \!" S;/ SQ5      S 5       5       rS rS r\\!" S:\@5      \!" SSS/5      \!" S;/ SQ5      S 5       5       5       5       r\\R                  RC                  S;SS4/5      \!" SSS/5      \!" S1\8\9/5      \$" \.SL SSf9S 5       5       5       5       5       r\!" S:\@5      \!" SSS/5      \!" S;/ SQ5      S 5       5       5       r\!" S:\@5      \!" SSS/5      \!" S;/ SQ5      S 5       5       5       r\!" S:\@5      \!" SSS/5      \!" SSS/5      \!" S;/ SQ5      S 5       5       5       5       r\!" S/ SQ5      \!" SSS/5      \!" SSS/5      S 5       5       5       r\\\!" S:\E5      S 5       5       5       r\!" S:\c  SS!/O/ SQ5      S 5       r\\!" S:\E5      S 5       5       r\\!" S1\8\9/5      S 5       5       r\!" S1\8\9/5      S 5       rS rSS jr\\!" S:S S!/5      \!" S1\8\9/5      S 5       5       5       r\\!" S1\8\9/5      \$" \.SL SSf9S 5       5       5       rSS jr\R                  GR                  \!" S1\8\9/5      \!" S:\c  S!/OS S!/5      S 5       5       5       rS r\!" S:\b  SS /OS/5      \$" \-SL SSf9S 5       5       r\!" S1\8\9/5      \$" \.SLSSf9S 5       5       r\!" S1\8\9/5      S 5       rS rS rS rS r\\\!" S;/ SQ5      S 5       5       5       r\\\!" S/ SQ5      \!" S;SS4/5      \!" S1\8\9/5      S 5       5       5       5       5       r\\!" S;SS4/5      \!" S/ SQ5      \!" S1\8\9/5      S 5       5       5       5       r\\!" S;/ SQ5      S 5       5       rg! \+ a    Sr* G
NOf = f! \+ a    Sr- G
NWf = f! \+ a    Sr. G
Naf = fs  sn f s  snf )z
Test the parallel module.
    N)format_exception)sqrt)sleep)PicklingError)nullcontextTimeoutErrorparallel)dumpload)mp)np
with_numpy)with_multiprocessing)IS_PYPYforce_gc_pypy)parametrizeraisescheck_subprocess_callskipifwarns)get_reusable_executor)Queue   )parallel_sum)SequentialBackend)ThreadingBackend)MultiprocessingBackend)ParallelBackendBase)LokyBackend)Paralleldelayed)parallel_config)parallel_backend)register_parallel_backend)effective_n_jobs	cpu_count)r   BACKENDSDEFAULT_BACKENDmultiprocessingloky	threadingget_contextspawnc           	      2    [        U S[        U SS 5      5      $ )N_pool_workers)getattrbackends    ;/usr/lib/python3/dist-packages/joblib/test/test_parallel.pyget_workersr7   [   s    7GWWj$%GHH    c                 
    X-  $ N )xys     r6   divisionr>   _   s	    5Lr8   c                     U S-  $ N   r;   r<   s    r6   squarerC   c   s    6Mr8   c                       \ rS rSrSrS rSrg)MyExceptionWithFinickyInitg   z1An exception class with non trivial __init__
    c                     g r:   r;   )selfabcds        r6   __init__#MyExceptionWithFinickyInit.__init__j   s    r8   r;   N__name__
__module____qualname____firstlineno____doc__rM   __static_attributes__r;   r8   r6   rE   rE   g   s    r8   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     r6   exception_raiserrZ   n   s.    Av" *#sC= 	4(2	4Hr8   c                 :    [         R                  " S5        [        e)Ng?)timer   KeyboardInterruptrB   s    r6   interrupt_raiserr^   u   s    JJsO
r8   c                     U S-  U-   U-   $ )zFA module-level function so that it can be spawn with
multiprocessing.
rA   r;   )r<   r=   zs      r6   fra   z   s     6A:>r8   c                  D    [        [        R                  " 5       S   5      $ Nr   )typer   get_active_backendr;   r8   r6   _active_backend_typerf      s    ++-a011r8   c                 @    [        XS9" S [        S5       5       5      $ )Nn_jobsr5   c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr:   r#   rC   .0is     r6   	<genexpr> parallel_func.<locals>.<genexpr>   s      :.$,qH   "$   r"   range)inner_n_jobsr5   s     r6   parallel_funcrv      s%    <9 :.$)!H:. . .r8   c                  $    [        5       S:  d   eg rc   )r(   r;   r8   r6   test_cpu_countrx      s    ;??r8   c                  $    [        5       S:  d   eg rc   r'   r;   r8   r6   test_effective_n_jobsr{      s    !!!r8   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      r6   test_effective_n_jobs_Noner      sF     
^	4  t,??? 
5
 4(A--- 
5	4s   1
?r5   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   r5   r   c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr:   rk   rm   r<   s     r6   ro   'test_simple_parallel.<locals>.<genexpr>   s      &6,4q""Hrq   rt   rC   r"   )r5   ri   r   r<   s       r6   test_simple_parallelr      sS     !&a)1VAY)F$&&6,1!H&666 7 6)s   Ac                    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 H   nS[        UR                  5      ;  d  M  UPM"     nnU Vs/ s H&  n[        UR                  [        5      (       a  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     r6   ro   6test_main_thread_renamed_no_warning.<locals>.<genexpr>   s      62(01GFOArq   rr   )r   r      zworker timeoutr   )setattrr-   current_threadwarningscatch_warningsr"   rt   strmessage
isinstanceDeprecationWarninglen)r5   monkeypatchwarninforesultsws        r6   #test_main_thread_renamed_no_warningr      s     y779A  C 
	 	 	-!W5 62(-a62 2)### 
. $N8a'7s199~'M8HN $ B8a!!))-?@ 8H B x=A! 
.	- OBs#   +C1C0C0#C5C5
C-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(       aa  U(       aY  [        S U 5       5      n[        [        R                  SS5      (       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)r5   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     r6   ro   )_assert_warning_nested.<locals>.<genexpr>   s$      '$D /$))A,>$   !nogilFr   )
r   r   simplefilterrv   r   allr3   sysflagsr   )r5   ru   expectedr   r   warnings_are_correctwarnings_have_the_right_lengths          r6   _assert_warning_nestedr      s    		 	 	-h'gA 
. $,,8a		8H,#& '$' $  '.cii%&H&HH"]a' + (J,JJ|+ 
.	- -s    C
C

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                 J  ^^ [        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  aB  [        (       a$  [        U5      (       d  [        R
                  " SS9  [        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r5   ru   r   Nr#   r   rm   _child_backends     r6   ro   0test_nested_parallel_warnings.<locals>.<genexpr>   s/      / A 	&'!	    "%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     r6   ro   r      s/      5 A 	&'!	 r   r-   zThis test often fails in PyPy.reason)r"   rt   r   anypytestxfailr   )parent_backendr   r   ress    `` r6   test_nested_parallel_warningsr      s     A~. / q	/  !^
4 5 q	5 C $73s88LL @A3xxx3xxxr8   )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     r6   ro   Ptest_background_thread_parallelism.<locals>.background_thread.<locals>.<genexpr>  s      6,4qr""Hrq   r   r   )r   r   r"   rt   printr   )is_run_parallelr   s     r6   background_thread=test_background_thread_parallelism.<locals>.background_thread  s_    $$D1XA 6,1!H6 6 2 	c(m ]a/	 21s    A##
A1)r   r   r   )r-   Threadstartjoin)r5   r   r   ts       r6   "test_background_thread_parallelismr     sF     gO0 	 18JKAGGIFFH1r8   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     r6   ro   nested_loop.<locals>.<genexpr>  s      (0&.hrq   rs   r4   s    r6   nested_loopr     s"    Aw' (0&+Ah(0 0r8   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     r6   ro   #test_nested_loop.<locals>.<genexpr>%  s!      /?5=]++Xr   rs   )r   r   s    `r6   test_nested_loopr   "  s%     A~. /?5:1X/? ?r8   c                     [         er:   )rX   r4   s    r6   raise_exceptionr   )  s    
r8   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    r6   )test_nested_loop_with_exception_with_lokyr   -  sY    	
	Q/8gk*62o.v68 9 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     r6   ro   1test_mutate_input_with_threads.<locals>.<genexpr>8  s$      ,-#+aq8s   (+N)r   r"   rt   full)r   s   @r6   test_mutate_input_with_threadsr   5  s<    aAA{+ ,-#(8,- -6688O8r8   )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     r6   ro   'test_parallel_kwargs.<locals>.<genexpr>B  s     #D1GAJqA$6   !#N)rt   ra   r"   )ri   lstr<   s      r6   test_parallel_kwargsr   =  sM     )C #$1QqAY$F##D#DDE F E$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     r6   ro   3test_parallel_as_context_manager.<locals>.<genexpr>Q       =AWQZQ/r   c              3   J   #    U  H  n[        [        5      " US S9v   M     g7fr   r   r   s     r6   ro   r   R  r   r   c              3   J   #    U  H  n[        [        5      " US S9v   M     g7fr   r   r   s     r6   ro   r   ^  s     9SA+Sr   )rt   ra   r"   _backendr   r7   )r5   r   r<   r   pmanaged_backends         r6    test_parallel_as_context_managerr  E  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>.UnpicklableObjectih  c                     [        S5      e)N123)RuntimeErrorrH   s    r6   
__reduce__<test_parallel_pickling.<locals>.UnpicklableObject.__reduce__i  s    u%%r8   r;   N)rP   rQ   rR   rS   r  rU   r;   r8   r6   UnpicklableObjectr  h  s    	&r8   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     r6   ro   )test_parallel_pickling.<locals>.<genexpr>m  s,      +5*3Q ,32;,! ,!*3   '*r   N)objectr   r   r"   rt   )r  s   @r6   test_parallel_picklingr  c  sH    
&F & 
%8	96* +5*/)+5 	5 
:	9	9s   $A
A	byteorder)<>=c                   ^^ S m[         R                  " S5      R                  S5      R                  U  S35      mTR                  R
                  n[        SSS9" UU4S j[        S	5       5       5      nU HG  u  p4XA:X  d   eXCR                  R
                  :X  d   e[         R                  R                  TU5        MI     g )
Nc                 0    X R                   R                  4$ r:   )dtyper  rB   s    r6   inspect_byteorder=test_parallel_byteorder_corruption.<locals>.inspect_byteorderv  s    ''####r8      )rA   rr   i4rA   r,   rh   c              3   F   >#    U  H  n[        T5      " T5      v   M     g 7fr:   r#   )rm   r   r  r<   s     r6   ro   5test_parallel_byteorder_corruption.<locals>.<genexpr>}  s"      0/7!!"1%%x   !rr   )
r   arangereshapeviewr  r  r"   rt   testingassert_array_equal)r  initial_np_byteorderresult
x_returnedbyteorder_in_workerr  r<   s        @@r6   "test_parallel_byteorder_corruptionr0  q  s    
$ 			!V$))YKr*:;A77,,Q/ 0/4Qx0 F ,2'
":::"&6&6&@&@@@@


%%a4 ,2r8   c                 d    [        [        SU SS9" S [        S5       5       5      5      S:X  d   eg )NrA      ri   r5   timeoutc              3   L   #    U  H  n[        [        5      " S 5      v   M     g7f)gMbP?Nr   r   s     r6   ro   0test_parallel_timeout_success.<locals>.<genexpr>  s      ?2'0!uyrq   r   )r   r"   rt   r4   s    r6   test_parallel_timeout_successr7    s?     xq'2> ?2',Ry?2 2 3689 9 9r8   c                     [        [        5         [        SU SS9" S [        S5       5       5        S S S 5        g ! , (       d  f       g = f)NrA   r   r3  c              3   L   #    U  H  n[        [        5      " S 5      v   M     g7fr   Nr   r   s     r6   ro   -test_parallel_timeout_fail.<locals>.<genexpr>  s      :3(11GEN2	rq   r   )r   r	   r"   rt   r4   s    r6   test_parallel_timeout_failr<    s:     
	7D9 :3(-b	:3 	3 
			   ";
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     r6   ro   %test_error_capture.<locals>.<genexpr>       CAWQZQ/r   c              3   J   #    U  H  n[        [        5      " US S9v   M     g7fr   r   r   s     r6   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     r6   ro   r@    s$      ! %&q4@r   r2  )r   r   ZeroDivisionErrorr"   zipr#   r>   r]   r^   r7   r  rt   ra   
_iteratingn_completed_tasksn_dispatched_tasks	_abortingrE   )r5   r<   r=   r   original_workerss        r6   test_error_capturerL    s   
 
~%&Aw/ #FF 35 3 "1( 356 '
 %&Aw/7=>v!)*1-v>@ '
 Q0Hx001===*8+<+<=)*&)&&&9;&9da "(+A1&9; < + x001=== x0019IIII(-b	2	1QqAY	2CrCCD E D  +8+<+<=)*G1'"23A6GH + x001=== x0019IIII(-b	2	1QqAY	2CrCCD ##X%?%?++X-?-?G D9 1H 8,,-555%&A7=>v!)*1-v>@ ' 
!	"14VV1DE1DWXq$1DE	G 
# 
*	+1%!Bi!	" 
,	+q5 '& ? '&; +* 3
 H +* 39 10P ? '& F 
#	" 
,	+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     r6   my_generator1test_error_in_task_iterator.<locals>.my_generator  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     r6   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     r6   ro   rU    rV  rq   r   c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr:   rk   rl   s     r6   ro   rU    s     D*CQgfoa  *Crq      r   )r"   r   rX   )r5   rR  r  s      r6   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)append)queueitems     r6   consumerr`    s    	LL%&r8   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   )ra  rc  re  rg  rb  rd  rf  rh  ri  rk  rj  rl  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)zBTest 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Nr!  zProduced %irt   r]  rn   r^  s    r6   producer'test_dispatch_one_job.<locals>.producer  *     qALL*+G    ,/r   ri   
batch_sizer5   c              3   P   >#    U  H  n[        [        5      " TU5      v   M     g 7fr:   r#   r`  )rm   r<   r^  s     r6   ro   (test_dispatch_one_job.<locals>.<genexpr>  s#      ?9-7%##Z   #&   N)listr"   r   )r5   rw  expected_queuerr  r^  s       @r6   test_dispatch_one_jobr    sQ      FE
 A*> ?9-5Z?9 9N"""u:r8   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ro  rp  rq  s    r6   rr  /test_dispatch_multiprocessing.<locals>.producer   rt  ru  rA   r   rr   )ri   rw  pre_dispatchr5   c              3   P   >#    U  H  n[        [        5      " TS 5      v   M     g7f)r   Nry  )rm   r   r^  s     r6   ro   0test_dispatch_multiprocessing.<locals>.<genexpr>%  s$      F=1;A%''r{  r   ra  Nr   zConsumed anyr}   rg  r|  )r   Managerr}  r"   indexr   )r5   managerrr  queue_contentsfirst_consumption_indexproduced_3_indexr^  s         @r6   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:r8   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-   rv  c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr:   r  rl   s     r6   ro   /test_batching_auto_threading.<locals>.<genexpr><       	.+Q'"+a..+rq     r   r"   rt   r  compute_batch_size)r  s    r6   test_batching_auto_threadingr  6  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  rv  c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr:   r  rl   s     r6   ro   2test_batching_auto_subprocesses.<locals>.<genexpr>D  r  rq   r  r   r  )r5   r  s     r6   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     r6   ro   *test_exception_dispatch.<locals>.<genexpr>O  s!      7=2;QG$%a(()rq   r2  N)r   rX   r"   rt   r;   r8   r6   test_exception_dispatchr  L  s8    	
	A6 7=27)7= 	= 
		r=  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     r6   ro   (nested_function_inner.<locals>.<genexpr>T  s!      9.7 !!$$irq   r2  rs   rn   s    r6   nested_function_innerr  S  s     A 9.3Bi9 9r8   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     r6   ro   (nested_function_outer.<locals>.<genexpr>Y  s!      >3<a%&q))9rq   r2  rs   r  s    r6   nested_function_outerr  X  s     A >389> >r8   z'https://github.com/joblib/loky/pull/255r   c                 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     r6   ro   1test_nested_exception_dispatch.<locals>.<genexpr>g  s"      ,B7@!G)*1--yrq   r2  N r  r  rZ   )	r   rX   r"   rt   r   rd   r   tbr   )r5   excinforeport_linesreports       r6   test_nested_exception_dispatchr  ]  s     

	w7+ ,B7<Ry,B 	B 
 $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)	FakeParallelBackendiu  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       r6   	configureFakeParallelBackend.configurex  s    ++F3 r8   c                 \    US:  a%  [        [        R                  " 5       S-   U-   S5      nU$ )Nr   r   )maxr   r(   rH   ri   s     r6   r'   $FakeParallelBackend.effective_n_jobs}  s*    A:!+f4a8Fr8   )ri   r   r   )r   )rP   rQ   rR   rS   rT   r  r'   rU   r;   r8   r6   r  r  u  s    B
r8   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-testingr4   )r   rX   r"   r$   r;   r8   r6   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   )r5   r  s     r6   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     r6   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      r6   ro   r    s     9.$!qF1I~.s   )r"   _effective_n_jobsrt   r   	enumerate)r5   ri   r  r   s       r6   test_njobs_converted_to_intr    sT     	0A A%%%
2b	2
2C9)C.99999r8   c                       [        S[        5        S[        ;   d   e[        S   [        :X  d   e [        S	 g ! [        S	 f = f)Ntest_backend)r&   r  r)   r;   r8   r6   test_register_parallel_backendr    sE    %!.2EF)))'+>>>>^$H^$s	   /: 	Ac                      [        5       [        :X  d   e [        S[        S   SS9  [        5       [        :X  d   e [
        [        l        [        5       [        :X  d   eg ! [
        [        l        f = f)Nr-   T)make_default)rf   DefaultBackendr&   r)   r   r*   r   r;   r8   r6   test_overwrite_default_backendr    se    !^3333!+x/D/3	5#%)9999 $3 !^333 $3 s   &A! !A2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,   r4   c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr:   rk   rl   s     r6   ro   2test_backend_no_multiprocessing.<locals>.<genexpr>  s      FX!3!3Xrq   rr   c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr:   rk   rl   s     r6   ro   r    s     8x!76?1%%xrq   )r   UserWarningr"   rt   r$   r;   r8   r6   test_backend_no_multiprocessingr    si    	{@
B  FU1X FF
B
 
	(
8uQx88 
)	(
B 
B
 
)	(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        r6   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                   ^ U[         ;  a  U R                  [         U[        5        [        5       [        :X  d   e[        TU5        [        5       [        :X  d   e[        SSS9" U4S j[         5       5        [        5       [        :X  d   eg )NrA   r-   rh   c              3   `   >#    U  H#  o(       a  M  [        [        5      " TU5      v   M%     g 7fr:   )r#   r  )rm   rJ   r|   s     r6   ro   /test_backend_context_manager.<locals>.<genexpr>  s,      ,<1A 	;-.w::1s   
..)r)   setitemr  rf   r  r  r"    all_backends_for_context_manager)r   r5   r|   s     `r6   test_backend_context_managerr    s     hHg/BC!^333!'73  !^333 A{+ ,<1,< <
  !^333r8   c                   "    \ rS rSrSrSS jrSrg)ParameterizedParallelBackendi   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     r6   rM   %ParameterizedParallelBackend.__init__  s    =788
r8   r  r:   rO   r;   r8   r6   r  r     s
    Cr8   r  c                 B   U R                  [        S[        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       [        :X  d   eg ! , (       d  f       NN= 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     r6   ro   =test_parameterized_backend_context_manager.<locals>.<genexpr>       7hGDM!$$hrq   r   )r  r)   r  rf   r  r   re   rd   r  r"   ri   r  rt   r   )r   r|   r  r  r  r   rn   s          r6   *test_parameterized_backend_context_managerr  	  s   /46!^333	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  !^333 
6	5 2s   BDD
Dc                    [        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       [        :X  d   eg ! , (       d  f       NN= 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     r6   ro   Ftest_directly_parameterized_backend_context_manager.<locals>.<genexpr>,  r  rq   )rf   r  r  r   re   rd   r  r"   ri   r  rt   r   )r|   r  r  r  r   rn   s         r6   3test_directly_parameterized_backend_context_managerr    s    !^333 
-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  !^333 
C	B 2s   BC6D6
Dc                  B    [        S5        [        R                  " 5       $ )Nr   )r   osgetpidr;   r8   r6   sleep_and_return_pidr  3  s    	"I99;r8   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     r6   ro   "get_nested_pids.<locals>.<genexpr>?  s#      1'/! &&:;=='/r   )rf   r   r"   r  rt   r;   r8   r6   get_nested_pidsr  8  sT    !%5555 :'')Q... 1 1',Qx1 1 1r8   c                   ,   ^  \ rS rSrSrU 4S jrSrU =r$ )	MyBackendiC  z:Backend to test backward compatibility with older backendsc                 .   > [         [        U ]  5       S   $ rc   )superr  get_nested_backend)rH   	__class__s    r6   r  MyBackend.get_nested_backendE  s    Y8:1==r8   r;   )rP   rQ   rR   rS   rT   r  rU   __classcell__)r  s   @r6   r  r  C  s    D> >r8   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     r6   ro   6test_nested_backend_context_manager.<locals>.<genexpr>V  s"      (
 O$&&r   r   r   )r"   rt   r   set)r|   r5   
pid_groups	pid_groups       r6   #test_nested_backend_context_managerr  M  s[     
	Q' (
2Y(
 

 $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     r6   check_nested_backend?test_nested_backend_in_sequential.<locals>.check_nested_backendf  s@     $%2G)HHHH *.9z++-???r8   r   r~   c              3   P   >#    U  H  n[        T5      " [        S 5      v   M     g7fr   )r#   r*   )rm   r   r  s     r6   ro   4test_nested_backend_in_sequential.<locals>.<genexpr>p  s(      A 	$%oq99r{  r   c              3   H   >#    U  H  n[        T5      " TT5      v   M     g 7fr:   r$  )rm   r   r5   r  ri   s     r6   ro   r  v  s(      
 ()'6::s   "rs   )r5   ri   r|   r  s   `` @r6   !test_nested_backend_in_sequentialr  ^  s_    @ A r 
 
	( 
2Y
 	
 
)	(	(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)Nr5   r   )r$   r%   nesting_level)r|   inner_backendexpected_levelctxr5   s        r6   check_nesting_levelr"  |  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#   r"  rm   r   r|   r  s     r6   ro   -test_backend_nesting_level.<locals>.<genexpr>  s*      .A 	#$WmQ??   $'r   r~   c              3   R   >#    U  H  n[        [        5      " TTS 5      v   M     g7fr   r&  r'  s     r6   ro   r(    s*      '%q ./JJ%r)  )r"  r"   rt   )r|   r#  r  s   ` `r6   test_backend_nesting_levelr+    sd     2A}- .r. 
 
q	)
 '!"I' 	' 
*	)	)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    r6   retrieval_context;test_retrieval_context.<locals>.MyBackend.retrieval_context  s     FFaKFs   r;   N)	rP   rQ   rR   rS   rn   supports_retrieve_callbackcontextmanagerr1  rU   )
contextlibr,  s   r6   r  r/    s&    %;"		"	"	 
#	r8   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     r6   ro   >test_retrieval_context.<locals>.nested_call.<locals>.<genexpr>  s     !C(Q'"+a..(rq   rs   )ns    r6   nested_call+test_retrieval_context.<locals>.nested_call  s    q!!C%(!CCCr8   rA   r~   c              3   F   >#    U  H  n[        T5      " U5      v   M     g 7fr:   r$  )rm   rn   r;  s     r6   ro   )test_retrieval_context.<locals>.<genexpr>  s%      
 K ##r&  r   r5   r   )r5  r   r&   r"   rt   r$   rn   r%   )r|   r,  r  r!  r5  r;  s    `  @@r6   test_retrieval_contextr?    s      $  k95D 
	 
1X
 	
 o%y>##q(((&&q688q= = 
		s   AB
B(rw  )r   r}   gQ?c                 h    [        [        5         [        U S9  S S S 5        g ! , (       d  f       g = f)Nrw  )r   rX   r"   rA  s    r6   test_invalid_batch_sizerB    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  rC  )r   r   ri   r  )   r|  ri   r  )   r|  
2 * n_jobsr   )   r|  r   r   )rG  r|  rF  rW   )rD  r|  rF  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  rw  c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr:   rk   rl   s     r6   ro   /test_dispatch_race_condition.<locals>.<genexpr>  s      L^!3!3^rq   r;   r   )n_tasksri   r  rw  paramsrn   r   r   s           r6   test_dispatch_race_conditionrM    sZ      &(F#(>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_argsget)mp_start_methodr  r|   start_methods       r6   test_default_mp_contextrT    sK    ))+O#45Aoo!!),G++-L***r8   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     r6   ro   Atest_no_blas_crash_or_freeze_with_subprocesses.<locals>.<genexpr>  s*      (3)1A133s   7:)
r   r.   r   randomRandomStaterandnrW  rX  r"   rt   )r5   rngrI   s     @r6   .test_no_blas_crash_or_freeze_with_subprocessesr^    sy     ## ..) ))


#C 			$AFF1accN Aw' (3).q(3 3r8   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\]r4  stdout_regex)	r   rO  r   skip,UNPICKLABLE_CALLABLE_SCRIPT_TEMPLATE_NO_MAINformatr   r   
executable)r5   codes     r6   2test_parallel_with_interactively_defined_functionsri  	  sY    
 ##(;(;(=(G 6 	77>>wGD	t$b*,r8   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                  X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)rj  r5   rk  joblib_root_folderzunpicklable_func_script.pyr   ra  rb  )SQUARE_MAINr   platformr   rd  )UNPICKLABLE_CALLABLE_SCRIPT_TEMPLATE_MAINrf  r  pathdirnamejoblib__file__r   writer   rg  strpath)r5   rj  rk  tmpdirrh  	code_files         r6   0test_parallel_with_unpicklable_functions_in_argsr{  G  s     ..;&#,,'*A/04;;+77??277??6??+KL < ND 89IOOD	**+R*,r8   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)
))
)ro  c                     U R                  S5      nUR                  [        5        [        [        R
                  UR                  /SS S9  g )Nz(joblib_interactively_defined_function.pyra  )rc  r4  )r   rw  5INTERACTIVE_DEFINED_FUNCTION_AND_CLASS_SCRIPT_CONTENTr   r   rg  rx  ry  scripts     r6   7test_parallel_with_interactively_defined_functions_lokyr    s>    
 [[CDF
LLFG	(*r8   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   )rc  stderr_regexr4  )r   rw  9INTERACTIVELY_DEFINED_SUBCLASS_WITH_METHOD_SCRIPT_CONTENTr   r   rg  rx  r~  s     r6   :test_parallel_with_interactively_defined_bound_method_lokyr    s>    [[DEF
LLJK3>>6>>:'>'5"$&r8   c                  D    [        / 5      n [        SS9" U 5      / :X  d   eg )NrA   r~   )iterr"   )exhausted_iterators    r6   %test_parallel_with_exhausted_iteratorr    s%    b101R777r8   c                  D    [        5         [        R                  " S5        g)z+Helper function to force gc in each worker.r   N)r   r\   r   r;   r8   r6   _cleanup_workerr    s    OJJrNr8   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    r6   check_memmapr    s5    a##=Q! 	!668Or8   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   r  )rt   r   onesfloat32)r:  rn   s     r6   generate_arraysBtest_auto_memmap_on_arrays_from_generator.<locals>.generate_arrays  s-     qA''"BJJ/!33 s   <>rA   r   ri   
max_nbytesr5   c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr:   r#   r  rm   rI   s     r6   ro   <test_auto_memmap_on_arrays_from_generator.<locals>.<genexpr>  #      @@*>Qa  *>rq   r   r   c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr:   r  r  s     r6   ro   r    r  rq   )r"   rF  r   r   r*  r+  )r5   r  r   r-  r   s        r6   )test_auto_memmap_on_arrays_from_generatorr    s    4
 aAw? @@*9#*>@@ @GW)FG


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


%%h7 Hr8   c                     U $ r:   r;   )args    r6   identityr    s    Jr8   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     r6   ro   .test_memmap_with_big_offset.<locals>.<genexpr>  s      HCq!26!:!:Cr   rZ  r   )r   rx  mmapALLOCATIONGRANULARITYr   zerosr  r   r   r"   r   r  offsetr*  r+  )ry  fnamesizeobjr-  r  s        @r6   test_memmap_with_big_offsetr    s     KK$,,E%%D88D("''$g*F
GC%3'Fa  HC HHGFfQi++++!9d"""JJ!!#.r8   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   r4  c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr:   rk   rl   s     r6   ro   Ftest_warning_about_timeout_not_supported_by_backend.<locals>.<genexpr>  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     r6   3test_warning_about_timeout_not_supported_by_backendr    s    		 	 	-1%%L%)%LL 
.x=AAaii----qyy>	   
.	-s   !B
Bc                     X U'   U$ r:   r;   )
input_listr  r   s      r6   set_list_valuer    s    uLr8   )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   	generatorr-   ri   	return_asr5   c              3   P   >#    U  H  n[        [        5      " TX5      v   M     g 7fr:   )r#   r  )rm   rn   r  s     r6   ro   Ptest_parallel_return_order_with_return_as_generator_parameter.<locals>.<genexpr>  s$      +E;Ca
A118r{  c              3   .   #    U  H  u  pX:H  v   M     g 7fr:   r;   rm   vr  s      r6   ro   r    s     :"9$!qv"9   )r"   rt   r}  r   rF  )ri   r-  r  s     @r6   =test_parallel_return_order_with_return_as_generator_parameterr  	  sc    
 qJV{)++E;@8+EEF
 &\F:#j&"9:::::r8   c                 <    U(       a  [        S5        [        U 5      $ )Nr2  )r   r   )edelays     r6   _sqrt_with_delayr    s    b	7Nr8   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@[        5         g )
Ngenerator_unorderedr  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     r6   ro   K_test_parallel_unordered_generator_returns_fastest_first.<locals>.<genexpr>$  s,      'F;Da !!Q$a119s   )+r   c              3   :   >#    U  H  n[        T5      v   M     g 7fr:   )next)rm   r   r-  s     r6   ro   r  '  s     =Hqd6llHs   	   r   rA   c              3   .   #    U  H  u  pX:H  v   M     g 7fr:   r;   r  s      r6   ro   r  +  s      K41Kr  )r"   rt   sortedr}  r   rF  r   )r5   ri   quickly_returnedexpected_quickly_returnedr-  s       @r6   8_test_parallel_unordered_generator_returns_fastest_firstr    s     V/D%''F;@9'FFF =E!H==!"d5B<&8 8 8K     	Or8   rA   
sequentialc                     [        X5        g r:   )r  r5   ri   s     r6   7test_parallel_unordered_generator_returns_fastest_firstr  3  s     =WMr8   zThis test requires daskc                     [         R                  " SSS9   U" S5         [        S U 5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = fNrA   	n_workersthreads_per_workerdask)distributedClientr  )ri   r|   s     r6   Atest_parallel_unordered_generator_returns_fastest_first_with_daskr  =  sH     
		A
v@vN 
 

 
   	A=A
A	A
A)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     r6   ro   %test_abort_backend.<locals>.<genexpr>O  s$      14,2qGDJJ""Fs   ,.rO  )r   r  r\   r"   )ri   r5   delayst_startdts        r6   test_abort_backendr  I  sn     UbTCZF			))+0 14,214 	4 
 
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  r-  s     r6   get_large_objectr  U  s$    WWS\.FF1IMr8   c                     [        X US9 nU" S [        S5       5       5      n[        U5        [        U5        A[        5         S S S 5        g ! , (       d  f       g = f)N)ri   r5   r  c              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr:   )r#   r  rl   s     r6   ro   0_test_deadlock_with_generator.<locals>.<genexpr>`  s     J	1'"23A66	rq   r   )r"   rt   r  r   )r5   r  ri   r   r-  s        r6   _test_deadlock_with_generatorr  [  sP     
%
'*2Jb	JJVV 	
' 
' 
's   :A
Ar  r  r  c                     [        XU5        g r:   )r  )r5   r  ri   s      r6   test_deadlock_with_generatorr  i  s    
 "'f=r8   c                     [         R                  " SSS9   U " S5         [        S X5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = fr  )r  r  r  )r|   r  ri   s      r6   %test_deadlock_with_generator_and_daskr  q  sH     
		A
v%dI> 
 

 
r  c                 N   [        [        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[        5         g ! , (       d  f       N== f)
N)This Parallel instance is already runningr  r5   r  c              3   L   #    U  H  n[        [        5      " S 5      v   M     g7fr   r   r   s     r6   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     r6   ro   r    s     ;
1A
rq   r   rA   ZThe error should be raised immediatly when submitting a new task but it took more than 2s.)r   r
  r"   rt   r\   r   )r5   r  ri   r   gr  gen2s          r6   test_multiple_generator_callr   }  s     
A
CFyI:b	::))+;c
;;
C 99; 1$ 	$$
 	
 O!
C 
Cs   AB
B$c                    [        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[        5         g ! , (       d  f       NF= f! , (       d  f       N+= f)
Nr  c              3   L   #    U  H  n[        [        5      " S 5      v   M     g7fr:  r   r   s     r6   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     r6   ro   r    s     =*Q'"+a..*rq   r   rA   r  )r"   rt   r\   r   r
  r   )r5   r  ri   r   r  r  g2s          r6   $test_multiple_generator_call_managedr    s     
&%
'*2;r;;))+LEG=%*==BG
 yy{W$q( 	
(	
(
'  	
OG G	
' 
's#   <B1B  +B1 
B.	*B11
B?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     r6   ro   9test_multiple_generator_call_separated.<locals>.<genexpr>  s$      A'0!a1fy   %'r   c              3   R   #    U  H  n[        [        5      " US -  5      v   M     g7fr  r  rl   s     r6   ro   r    s$      B'4!a1f}r  rO  r  c              3   .   #    U  H  u  pX:H  v   M     g 7fr:   r;   rm   r   rn   s      r6   ro   r    s     8&7FCsx&7r  c              3   .   #    U  H  u  pX:H  v   M     g 7fr:   r;   r  s      r6   ro   r    s     =&<FCsx&<r  )r"   rt   r  r   rF  )r5   r  r  ri   r  r  s         r6   &test_multiple_generator_call_separatedr    s     	K@ A',RyA 	A 
&[	A B',R}B 
B ++1I++BZ8c!U2Y&788888=c"eBm&<=====r8   zbackend, error))r,   T)r-   F)r  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[        5         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r:  r   rl   s     r6   ro   <test_multiple_generator_call_separated_gc.<locals>.<genexpr>  s     7Y##Yrq   r   c                      [        S5      $ )NzGenerator collected)r   r;   r8   r6   <lambda>;test_multiple_generator_call_separated_gc.<locals>.<lambda>  s
    u-B'Cr8   z The executor underlying Parallelr  c              3   R   #    U  H  n[        [        5      " US -  5      v   M     g7fr  r  rl   s     r6   ro   r    s$      @
+8aGDM!q&!!=r  rO  r  c              3   .   #    U  H  u  pX:H  v   M     g 7fr:   r;   r  s      r6   ro   r    s     @*?38*?r  r   r   rr   r   r  )r   r   rd  r"   rt   weakreffinalizer   r
  r   r\   r   r  r   rF  aliver   r  rJ  )
r5   r  r  errorr   r  g_wrr!  r  retrys
             r6   )test_multiple_generator_call_separated_gcr!    s    	6
./ 7BH7U2Y77AACDD  	|#EF!m  

 ))+Q? @
+0R=@
 
 	//q	A@#ar2*?@@@@@# 
& 99; 1$$$ E
**


2 ** 99; 1$$$!!#q( !!!! )9 
s   ?A?F::
Gc                    UR                   n[        SSU US9 nU" S [        R                  R                  S5      /S-   5       5        [	        [
        R                  " U5      5      S:  d   eU" S [        S5       5       5        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        U" S [        S5       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  r5   temp_folderc              3   L   #    U  H  n[        [        5      " U5      v   M     g 7fr:   r  r  s     r6   ro   (test_memmapping_leaks.<locals>.<genexpr>  s     	G,Fq',

"
",Frq   r   r   c              3   J   #    U  H  n[        [        5      " 5       v   M     g 7fr:   r#   r  r   s     r6   ro   r%    s     	7h'/
"
$
$hr   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     r6   ro   r%  '  s     C(B1glA(Brq   c              3   J   #    U  H  n[        [        5      " 5       v   M     g 7fr:   r'  r   s     r6   ro   r%  (  s     3(Qgo  (r   )
rx  r"   r   rZ  r   r  listdirrt   r   AssertionError)r5   ry  r  r   s       r6   test_memmapping_leaksr,    s>    ^^F 
q'$
&)*		GRYY-=-=b-A,BQ,F	GG 2::f%&*** 	
	7eAh	77
&  3Zzz&!!b	 
 NOO 	a9AC)9)9")=(>(BCC3%(333Zzz&!!b	 
 NOOC
& 
&s   A.E,,
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@   r;   rB   s    r6   r  2test_lambda_expression.<locals>.<genexpr>.<lambda>9  s    !q&r8   Nr$  rl   s     r6   ro   )test_lambda_expression.<locals>.<genexpr>8  s!      29.7 !!$$ir   r   rs   )r5   r   rn   s      r6   test_lambda_expressionr2  2  sL     a1 29.3Bi29 9GuRy1y!Avy11111s   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   r5   c              3   b   >#    U  H$  n[        [        R                  5      " T5      v   M&     g 7fr:   r  rm   rn   	task_times     r6   ro   6test_backend_batch_statistics_reset.<locals>.<genexpr>F  "     >ogdjj)$$oru  c              3   b   >#    U  H$  n[        [        R                  5      " T5      v   M&     g 7fr:   r  r5  s     r6   ro   r7  L  r8  ru  N)r"   rt   r  _effective_batch_size_DEFAULT_EFFECTIVE_BATCH_SIZE_smoothed_batch_duration _DEFAULT_SMOOTHED_BATCH_DURATION)r5   ri   n_inputsr  r6  s       @r6   #test_backend_batch_statistics_resetr?  =  s     FHXIF<A>eHo>>JJ,,JJ445 6 5JJ//JJ778 9 8 >eHo>>JJ,,JJ445 6 5JJ//JJ778 9 8r8   c                    S H  n[        [        US9R                  5      [        :X  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   r5   rC  rC  rr   rG  r   )rd   r"   r  r  r   r!   ri   )r|   ri   r  s      r6   $test_backend_hinting_and_constraintsrJ  S  s    HF+445GGGF95AJJ#3333F;7AJJ>111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-:H7;H/<
H

H
H,/
H=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:   r;   r  s    r6   apply_asyncgtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackend.apply_async      r8   c                     U$ r:   r;   r  s     r6   r'   ltest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackend.effective_n_jobs      Mr8   r;   N	rP   rQ   rR   rS   supports_sharedmemuse_threadsrO  r'   rU   r;   r8   r6   MyCustomThreadingBackendrM    s    !		r8   rX  rA   rD  rB  rE  rF  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:   r;   r  s    r6   rO  htest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackend.apply_async  rQ  r8   c                     U$ r:   r;   r  s     r6   r'   mtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackend.effective_n_jobs  rT  r8   r;   NrU  r;   r8   r6   MyCustomProcessingBackendrZ    s    "		r8   r_  r  r   )ri   rG  r   zUsing ThreadingBackend as joblib backend instead of MyCustomProcessingBackend as the latter does not provide shared memory semantics.r5   rG  )	r    r"   rd   r  
readouterrr   stripr   rX   )capsysr|   rX  r  r_  outerrr   s           r6   9test_backend_hinting_and_constraints_with_custom_backendsrf    sr   #6  
)+	,Ak2AJJ#;;;;A{3AJJ#;;;; 
-$7  
*,	-Ak2AJJ#<<<<$$&byybyyA{B?AJJ#3333$$&@ yy{h&&&byy! 
.$ 

	24kJ 
	G 
-	," 
.	-$ 
	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invalidrH  rI  rD  rE  )rC  rG  r,   r`  r+   )r   rX   r"   r   r;   r8   r6   ,test_invalid_backend_hinting_and_constraintsri    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   Nr;   )r#   _recursive_backend_info)rm   rn   rl  rl  s     r6   ro   *_recursive_backend_info.<locals>.<genexpr>  s/      '% 34O519OO%r  r   )r"   rd   r  rP   r  rt   )rl  rl  r  
this_levelr   s   ``   r6   rm  rm    sz     
	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        [        5       S:X  a  SnSnOSnSnUR                  5       S-   nUS4US4SU4SU4/nWU:X  d   eg ! , (       d  f       NO= f)NrA   r~   r   r   r   Backendr   )rm  r(   title)r|   r5   backend_types_and_levelssecond_level_backend_type	max_leveltop_level_backend_typeexpected_types_and_levelss          r6   test_nested_parallelism_limitrx    s     
	##:#<  
$ {a$7!	$6!	$]]_y8	#	"A&	i(	i(	! $'@@@@# 
$	#s   A
A*c                 6   [         R                  " SSS9   [        R                  " [	        S5      [        R
                  S9n[        S5       HG  nU " S5         [        US9nS S S 5        [        W5      S:X  d   e[        S U 5       5      (       a  MG   e   U " S5         [        5       nS S S 5        [        W5      S:X  d   e[        S	 U 5       5      (       d   e S S S 5        g ! , (       d  f       N= f! , (       d  f       NS= f! , (       d  f       g = f)
NrA   r  g    cAr  r  )datar   c              3   0   #    U  H  u  pUS :H  v   M     g7fDaskDistributedBackendNr;   rm   r   r   s      r6   ro   4test_nested_parallelism_with_dask.<locals>.<genexpr>  s       @&>74 77&>   c              3   0   #    U  H  u  pUS :H  v   M     g7fr|  r;   r~  s      r6   ro   r    s      <":wt 33":r  )
r  r  r   r  r  r  rt   rm  r   r   )r|   rz  rn   rs  s       r6   !test_nested_parallelism_with_daskr    s     
		aA	>wws3xrxx0qA+B+M( !/0A555 @&>@ @ @ @ @	  V_'>'@$ +,111 <":< < < 	< < 
?	> ! _ 
?	>sB   AD

C(#.D
D
!C9,2D
(
C62D
9
D	D


D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     r6   ro   &_recursive_parallel.<locals>.<genexpr>  s     Ghg1244hr   rA   rs   )nesting_limits    r6   r  r  	  s    :GeAhGGGr8   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   r   RecursionError)r|   r5   r  excr  s        r6   test_thread_bomb_mitigationr    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  environrQ  r   )env_varsvars     r6   _run_parallel_sumr  +  s;    H3 

s+3 \#&&&r8   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     r6   ro   -test_parallel_thread_limit.<locals>.<genexpr>7  s      2.6!"$$hr   r   _THREADSr  1)r"   rt   r  r(   itemsendswithr   )r5   r   expected_num_threadsworker_env_varsomp_num_threadsr   r   s          r6   test_parallel_thread_limitr  4  s     a1 2.3Ah2 G y{a/3,3(666*002KD}}Z(($8 9999|+++|#| 3 -4r8   c                 d    [        [        SS9   U " S5        S S S 5        g ! , (       d  f       g = f)NzPlease install daskr  r  )r   rX   )r|   s    r6   )test_dask_backend_when_dask_not_installedr  E  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>.ZeroWorkerBackendiP  c                     grc   r;   )rH   r   rl  s      r6   r  =test_zero_worker_backend.<locals>.ZeroWorkerBackend.configureQ      r8   Nc                     [        S5      e)NzNo worker availabler   )rH   funccallbacks      r6   rO  ?test_zero_worker_backend.<locals>.ZeroWorkerBackend.apply_asyncT  s    455r8   c                     grc   r;   r  s     r6   r'   Dtest_zero_worker_backend.<locals>.ZeroWorkerBackend.effective_n_jobsW  r  r8   r;   r:   )rP   rQ   rR   rS   r  rO  r'   rU   r;   r8   r6   ZeroWorkerBackendr  P  s    		6	r8   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     r6   ro   +test_zero_worker_backend.<locals>.<genexpr>]  s     @x!wr{1~~xrq   )r   r   r   r
  r"   rt   )r|   r  expected_msgs      r6   test_zero_worker_backendr  L  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_VARIABLEr;   r8   r6   check_globals@test_globals_update_at_each_parallel_call.<locals>.check_globalsh  s    !!r8   rA   r~   c              3   D   >#    U  H  n[        T5      " 5       v   M     g 7fr:   r$  rm   rn   r  s     r6   ro   <test_globals_update_at_each_parallel_call.<locals>.<genexpr>n        14*2Q  (    zchanged valuec              3   D   >#    U  H  n[        T5      " 5       v   M     g 7fr:   r$  r  s     r6   ro   r  w  r  r  )r  r"   rt   r  )workers_global_variabler  s    @r6   )test_globals_update_at_each_parallel_callr  `  s     *" ?....&a0 14*/(14 4&',<+==== )?o---&a0 14*/(14 4&'O+<<<<r8   c                      SS K n U R                  R                  SS5      nU R                  " X5        SSKJn  U" 5       $ )Nr   r   )threadpool_info)numpyrZ  r\  rW  threadpoolctlr  )r   rI   r  s      r6   _check_numpy_threadpool_limitsr    s2     			S!AFF1L-r8   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   rf  )child_moduleparent_infoparent_modules      r6   _parent_max_num_threads_forr    sE    $$Z(@@ // % Df\*, ,r8   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          r6   check_child_num_threadsr    sI     ".1L%@&+"K@+NH.(:::	 2 ".r8   )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 [        [        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     r6   ro   ;test_threadpool_limitation_in_child_loky.<locals>.<genexpr>  s!      GE;Ca./118r   rA   r   
r  r   r   rd  r"   rt   r'   r  r(   r  )ri   r  workers_threadpool_infosexpected_child_num_threadss       r6   (test_threadpool_limitation_in_child_lokyr    s|     12K
;1CD'vF GE;@8GE  E f%F!$Y[F%:A!>468r8   inner_max_num_threads)r   rA   r   Nc                 H   [        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c  [        [        5       U-  S	5      nOUn[        WUU5        g ! , (       d  f       ND= f)
Nr   r  r   r,   r  r~   c              3   J   #    U  H  n[        [        5      " 5       v   M     g 7fr:   r  rl   s     r6   ro   >test_threadpool_limitation_in_child_context.<locals>.<genexpr>  s       ;I?G!G2355xr   rA   r   r  )r|   ri   r  r  r  r  s         r6   +test_threadpool_limitation_in_child_contextr    s     12K
;1CD	/D	E#+6#: ;I?DQx;I $I  
F f%F$%()>%B"%:"4k68 
F	Es    B
B!var_name)r  r  r  c                 D  ^^ [        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)NTreusec                 @    [         R                  R                  U 5      $ r:   )r  r  rQ  )r  s    r6   _get_env>test_threadpool_limitation_in_child_override.<locals>._get_env  s    zz~~h''r8   4r~   c              3   F   >#    U  H  n[        T5      " T5      v   M     g 7fr:   r$  rm   rn   r  r  s     r6   ro   ?test_threadpool_limitation_in_child_override.<locals>.<genexpr>  s!      *;19AGHh''r&  rA   r,   r   r  c              3   F   >#    U  H  n[        T5      " T5      v   M     g 7fr:   r$  r  s     r6   ro   r    s!      .?5=!(++Xr&  r  )r   shutdownr  r  rQ  r"   rt   )r|   ri   r  original_var_valuer   r  s     `  @r6   ,test_threadpool_limitation_in_child_overrider    s    %..0( 16"

8&) *;16q*; ;3*$$$V15f- .?5:1X.? ?G 6 3*$$$ %

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

8$#5BJJx s$   AC5 $C$(C5 $
C2.C5 5*D)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     r6   ro   Atest_loky_reuse_workers.<locals>.parallel_call.<locals>.<genexpr>  s     CAQr   )rt   r"   )ri   r<   s    @r6   parallel_call.test_loky_reuse_workers.<locals>.parallel_call  s#    "ICrCCr8   Tr  r   )r   rt   )ri   r  first_executorr   executors        r6   test_loky_reuse_workersr    sJ    D
 &*6N 2Yf(t4))) r8   )F)r   r   )rr   r:   )rT   r  r   r\   r  r  r   r-   	tracebackr   mathr   r   pickler   r5  r   r+   r	   r   ru  r   r   r   joblib._multiprocessing_helpersr   joblib.test.commonr   r   r   r   r   joblib.testingr   r   r   r   r   joblib.externals.lokyr   r^  r   posixImportError _openmp_test_helper.parallel_sumr   r  joblib._parallel_backendsr   r   r   r    r!   joblib.parallelr"   r#   r$   r%   r&   r'   r(   r)   r*   r  RETURN_GENERATOR_BACKENDSpopr  keysALL_VALID_BACKENDSPROCESS_BACKENDSPARALLEL_BACKENDShasattrr]  r.   r  r7   r>   rC   	ExceptionrE   rZ   r^   ra   rf   rv   rx   r{   markr   r   r   r   r   r   r   r   r   r   r   r   r  r  r0  r7  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  r  r  r"  r+  r?  rB  rM  rT  r^  re  ri  rr  rp  SQUARE_LOCALSQUARE_LAMBDAr{  rf  rs  rt  rv  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r!  r,  r2  r?  rJ  rf  ri  rm  rx  r  r  no_coverr  r  r  r  r  r  r  r  r  r  r  r  r  )backend_strrn   s   00r6   <module>r     s   
 
      &     " (     . - 3 5+ + >; > 8 6 < 9 1 - + , 5 7 9 9 %MMO    / 6VfX]]_55  (K(;x,.(K K :)62$}4 
2}bnnW56/*I 
2." Y*:;<%b""-.	:0  
 .  =. Y*+X~&Y%7 & ' ,7 Y*+ ,62 4 7  6 Y@A B  0
 _h'x(? ) (?
 9 9 Xy!F "F Y)*/ +/: 
5 
5 [/*5 +  5& Y)*9 +9 Y)*3 + 3 Y()A" * A"H Y!E " E.' Y!) / 0  J K
LMM "  Y)* + :4 Y()3 * 3=9
>
 Y)*CD- E + -*+ 
 Y*+H ,H$ Y)*X}%: & + :%	4 $=>9 ?9;* $5Q#7     ' '$)!H-HqH-
 Y89Y)?;<4 = : 4(#4  Y*:;<4 =4( Y*:;<4 =4(
1>))55 > / ; Y 0 1Y*:;<
, =1 
, X}%Y)*Y*:;<
 = + & 
47 _/0_/0Y*:;<' = 1 1 ' Y*:;<%e}5! 6 = !> \=)( *(
 8
/00 + + Y()3 *  3.0 ,  Y()	, * 	,- )@
 Y("*B7)LM][,FG "?@, A H N , (9P FbggooGGOOFOO$&F 'Q 6X 
 
=, FbggooGGOOFOO$&F '- :4 & &8
 Y()8 *  80 	/  	/	
 9-; .;( Aq6* Y56,GHN I 	 +N Ar7+Y*:;<t$=>O ? = ,O Y*+X~& ' , Y12[;(=>?X~&> ' @ 3 > Ar7+[;(=>?Y*:;<t$=>? ? = @ , 
? Y12[;(=>?X~& ' @ 3. Y12[;(=>?X~& ' @ 30 Y12][*?@A][*?@AX~&> ' B B 3>*    
 ][*?@A][*?@A/" B B/"d Y()(P *  (PV Y%'Zt[!.2	2 Y()9 * 9( Y*:;<+ = +\ Y*:;<3K =3KlE*	' Y-.Y*:;<A = / A* Y*:;<t$=>< ? = <&H
 Y*:;<&+1F+ = 
+0' Y2>$vG%BC$ D H$ Y*:;<4(AB C =
 Y*:;<A =A&=B,	; X~&8 '  8& $o6X2wY*:;<8 =   7  
82 X2wZ - . Y*:;<6 =.   6> Xz"* # *_>  E
  L
  K. Lp .sB   k k* k9 0llk'&k'*k65k69ll