
    sKg!             	       6   d Z ddlZddlZddlZddlZddlZddlZddlZddlm	Z	 ddl
mZ ddlmZ ddlmZ ddlmZ ddlmZ ddlZddlZdd	lmZ dd
lmZmZ ddlmZ ddlmZmZ ddlmZ ddlmZmZ ddl m!Z!m"Z"m#Z#m$Z$m%Z% eddl&m'Z' ddl(m)Z) 	 ddl*Z*	 ddl,m-Z- 	 ddl.Z.ddl/m0Z0 ddl/m1Z1 ddl/m2Z2 ddl/m3Z3 ddl/m4Z4 ddl5m6Z6m7Z7 ddl5m8Z8 ddl5m9Z9 ddl5m:Z: ddl5m;Z;m<Z< ddl5mZm=Z=m>Z>  e=j~                         Z@e@j                  dd       dg eB e=j                               z   ZDeDe=D  cg c]  }  e=|            c} z  ZDeg ZEndd gZEeEd!gz   ZF eGed"      r!eDj                   ej                  d#             e=e>   ZJd$ ZKd% ZLd& ZM G d' d(eN      ZOdd*ZPd+ ZQdd,ZRd- ZSd. ZTd/ ZUd0 ZV e!d1e8e9g      ej                  jC                  d2d3d4 e;d45      fd6gg d78      ed9                      ZX e!d:eD       e!d;g d<       e!d=g d>      d?                      ZY e!d:eD      d@        ZZdA Z[e e!dBg dC      dD               Z\e e!d:g dE      dF               Z]dG Z^ e!dHe=       e!dIe=      dJ               Z_dK Z`edL        ZadM Zb e!d;g dN      dO        Zc e!d:eF      dP        ZdedQ        Zeee e!dRg dS      dT                      Zf e!d:eF      dU        Zge e!d:eF      dV               Zhe e!d:eE      dW               Zie e!d:e=      dX               ZjdY Zk e!d:e=       e!dZdg d[fd\g d]fg      d^               Zle e!d:eF      d_               Zmd` Zne e!d:eE      da               Zodb Zpdc Zqdd Zre e!d:eF      ej                  j                  def      dg                      Zt G dh die0      Zudj Zv e!d:eD      dk        Zwe e!d:eF       e!d;g dl      dm                      Zxdn Zydo Zz e$edudpf      dq        Z{dr Z|eFdd Z}e}j                   eds      D cg c]  }dt|z  	 c}       e e!d:e}       e!d1e9e8g      du                      Z G dv dwe0      Z e!d1e8e9g      dx        Z e!d1e8e9g      dy        Zdz Zd{ Z G d| d}ej                  jh                        Z e:d~e       e e!d:g d       e!d1e8e9g      d                      Ze e!d;g d       e!d:eF       e!d1e8e9g      d                             Zd Ze e!deF       e!deF       e!d1e8e9g      d                             Ze e!d1e8e9g       e!ddd)g      d                      Z e!dg d      d        Z e!dg d      d        Zed        Zee e!d:eE      d                      ZdZe e!d:eE      d               ZdZdZdZdZe e!d:eEeg nd#gz          e!deeeg       e!dg d      d                             Zdj1                  ej2                  j5                  ej2                  j5                  ej6                                    Zed        Zdj1                  ej2                  j5                  ej2                  j5                  ej6                                    Zed        Zd Zd Zd Zee e!d:eE      d                      Zd Zeed               Zd Zd Zej                  jC                  d;g d      d        Zd Zd Zej                  jC                  d;dd\g      e e!d: ee@      dhz
        d                      Zej                  jC                  d;dd4g       e!d1e8e9g       e$e.du df      d                      Z e!d:eD       e!d;g d      d               Zd Zd Ze e!d:e@       e!dddg       e!d;g d      d                             Zeej                  jC                  d;dd4g       e!dddg       e!d1e8e9g       e$e.du df      d                                    Z e!d:e@       e!dddg       e!d;g d      d                      Z e!d:e@       e!dddg       e!d;g d      d                      Z e!d:e@       e!dddg       e!dddg       e!d;g d      d                             Z e!dg d       e!dddg       e!dddg      d                      Zee e!d:eE      dÄ                      Z e!d:edd!gng dĢ      dń        Ze e!d:eE      dƄ               Ze e!d1e8e9g      dǄ               Z e!d1e8e9g      dȄ        ZdɄ ZddʄZe e!d:d d!g       e!d1e8e9g      d˄                      Ze e!d1e8e9g       e$e.du df      d̄                      Zdd̈́Zej                  j                   e!d1e8e9g       e!d:ed!gnd d!g      d΄                      Zdτ Z e!d:edd gndg       e$e-du dЬf      dф               Z e!d1e8e9g       e$e.dudf      d҄               Z e!d1e8e9g      dӄ        ZdԄ ZdՄ Zdք Zdׄ Zee e!d;g dآ      dل                      Zee e!dg dۢ       e!d;dd4g       e!d1e8e9g      d܄                                    Ze e!d;dd4g       e!dg dޢ       e!d1e8e9g      d߄                             Ze e!d;g d      d               Zy# e+$ r dZ*Y 
[w xY w# e+$ r dZ-Y 
bw xY w# e+$ r dZ.Y 
kw xY wc c} w c c}w )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    t        | dt        | dd             S )N_pool_workers)getattrbackends    ]/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/joblib/test/test_parallel.pyget_workersr7   [   s    7GWWj$%GHH    c                     | |z  S N )xys     r6   divisionr>   _   s    q5Lr8   c                     | dz  S N   r;   r<   s    r6   squarerC   c   s    6Mr8   c                       e Zd ZdZd Zy)MyExceptionWithFinickyInitz1An exception class with non trivial __init__
    c                      y r:   r;   )selfabcds        r6   __init__z#MyExceptionWithFinickyInit.__init__j   s    r8   N__name__
__module____qualname____doc__rL   r;   r8   r6   rE   rE   g   s    r8   rE   Fc                 <    | dk(  r|rt        dddd      t        | S )N   rH   rI   rJ   rK   )rE   
ValueError)r<   custom_exceptions     r6   exception_raiserrV   n   s.    Av" *#sC= 	4(2	4Hr8   c                 8    t        j                  d       t        )Ng?)timer   KeyboardInterruptrB   s    r6   interrupt_raiserrZ   u   s    JJsO
r8   c                     | dz  |z   |z   S )zO A module-level function so that it can be spawn with
    multiprocessing.
    rA   r;   )r<   r=   zs      r6   fr]   z   s     6A:>r8   c                  B    t        t        j                         d         S Nr   )typer   get_active_backendr;   r8   r6   _active_backend_typerb      s    ++-a011r8   c                 H     t        | |      d t        d      D              S )Nn_jobsr5   c              3   F   K   | ]  } t        t              |        y wr:   r#   rC   .0is     r6   	<genexpr>z parallel_func.<locals>.<genexpr>   s      :.$,qH   !   r"   range)inner_n_jobsr5   s     r6   parallel_funcrq      s)    98<9 :.$)!H:. . .r8   c                  "    t               dkD  sJ y r_   )r(   r;   r8   r6   test_cpu_countrs      s    ;??r8   c                  "    t               dkD  sJ y r_   r'   r;   r8   r6   test_effective_n_jobsrv      s    !!!r8   contextzbackend_n_jobs, expected_n_jobs)rm   rm   re   Nr   )zpositive-intznegative-intNone)idsc                      | d|      5  t        d       |k(  sJ 	 d d d        t        d       dk(  sJ y # 1 sw Y   xY w)Nr-   ry   r   ru   )rw   backend_n_jobsexpected_n_jobss      r6   test_effective_n_jobs_Noner      sF     
^	4  t,??? 
5
 4(A--- 
5	4s	   8Ar5   re   )r   rA   rx   verbose)rA      d   c                     t        d      D cg c]  }t        |       c} t        || |      d t        d      D              k(  sJ y c c}w )N   )re   r5   r   c              3   F   K   | ]  } t        t              |        y wr:   rg   ri   r<   s     r6   rk   z'test_simple_parallel.<locals>.<genexpr>   s      &6,4q"Hrl   ro   rC   r"   )r5   re   r   r<   s       r6   test_simple_parallelr      sY     !&a)1VAY)&HFG$&&6,1!H&666 7 6)s   Ac                 x   |j                  t        j                         dd       t        j                  d      5 } t        d|       d t        d	      D              }|g d
k(  sJ 	 d d d        D cg c]  }dt        |j                        vs| }}t        |      dk(  sJ y # 1 sw Y   AxY wc c}w )Nname!some_new_name_for_the_main_thread)targetr   valueTrecordrA   rd   c              3   F   K   | ]  } t        t              |        y wr:   rg   r   s     r6   rk   z6test_main_thread_renamed_no_warning.<locals>.<genexpr>   s      62(01OGFOArl   rm   )r   r      zworker timeoutr   )
setattrr-   current_threadwarningscatch_warningsr"   ro   strmessagelen)r5   monkeypatchwarninforesultsws        r6   #test_main_thread_renamed_no_warningr      s     y779A  C 
	 	 	-5(!W5 62(-a62 2)### 
. $N8a'7s199~'M8HN
 x=A 
.	- Os   -B+7B7B7+B4c                    t        j                  d      5 }t        j                  d       t        | |       d d d        D cg c]  }|j                   }}|rR|rOt        d |D              }t        t        j                  dd      rt        |      dk\  nt        |      dk(  }|xr |S y|rJ y# 1 sw Y   {xY wc c}w )	NTr   always)r5   rp   c              3   >   K   | ]  }d |j                   d   v   yw)zbacked parallel loops cannotr   N)args)ri   eachs     r6   rk   z)_assert_warning_nested.<locals>.<genexpr>   s%      '$D /$))A,>$   nogilFr   )
r   r   simplefilterrq   r   allr3   sysflagsr   )r5   rp   expectedr   r   warnings_are_correctwarnings_have_the_right_lengths          r6   _assert_warning_nestedr      s    		 	 	-h'gLA 
. $,,8a		8H,#& '$' $  '.cii%&HH"]a' + (J,JJ|+ 
.	- -s   #B4C 4B=z%parent_backend,child_backend,expected))r,   r+   T)r,   r,   F)r+   r+   T)r+   r,   T)r-   r+   T)r-   r,   Tc                 ,    t        d|       fdt        d      D                t        d|       fdt        d      D              }| dk(  r5t        r!t        |      st	        j
                  d       t        |      sJ y t        |      sJ y )	NrA   rd   c              3   N   K   | ]  } t        t              d d        yw)r   Fr5   rp   r   Nr#   r   ri   _child_backends     r6   rk   z0test_nested_parallel_warnings.<locals>.<genexpr>   s7      / A 	(&'!	 	    "%r   c              3   N   K   | ]  } t        t              d         yw)rA   r   Nr   )ri   r   r   r   s     r6   rk   z0test_nested_parallel_warnings.<locals>.<genexpr>   s7      5 A 	(&'!	 	 r   r-   zThis test often fails in PyPy.reason)r"   ro   r   anypytestxfailr   )parent_backendr   r   ress    `` r6   test_nested_parallel_warningsr      s     /HA~. / q	/  5(!^
4 5 q	5 C $3s8LL @A3xx3xxr8   )r,   r+   r-   c                     dg}d }t        j                  ||f      }|j                          |j                          |d   sJ y )NFc                     t        j                  d      5 } t        d      d t        d      D               d d d        t	        t                     t        |      dk(  | d<   y # 1 sw Y   /xY w)NTr   rA   ry   c              3   F   K   | ]  } t        t              d         yw)皙?Nr#   r   ri   r   s     r6   rk   zPtest_background_thread_parallelism.<locals>.background_thread.<locals>.<genexpr>  s      6,4qr"Hrl   r   r   )r   r   r"   ro   printr   )is_run_parallelr   s     r6   background_threadz=test_background_thread_parallelism.<locals>.background_thread  sa    $$D1XHA 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     sH     gO0 	 18JKAGGIFFH1r8   c                 J     t        d|       d t        d      D               y )NrA   rd   c              3   F   K   | ]  } t        t              d         yw){Gz?Nrg   r   s     r6   rk   znested_loop.<locals>.<genexpr>  s      (0&.hrl   rn   r4   s    r6   nested_loopr     s$    'HAw' (0&+Ah(0 0r8   r   r   c                 P     t        d|       fdt        d      D               y )NrA   rd   c              3   H   K   | ]  } t        t                      y wr:   )r#   r   r   s     r6   rk   z#test_nested_loop.<locals>.<genexpr>!  s"      /?5=]+X   "rn   )r   r   s    `r6   test_nested_loopr     s'     /HA~. /?5:1X/? ?r8   c                     t         r:   )rT   r4   s    r6   raise_exceptionr   %  s    
r8   c            	          t        t              5  t        dd      5 }  |  t        t              d       t        t
              d      g       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)NrA   r,   rd   )r   rT   r"   r#   r   r   r
   s    r6   )test_nested_loop_with_exception_with_lokyr   )  s^    	
	Q/8*gk*62.go.v68 9 0 
	// 
	s"   A,1A A, A)	%A,,A5c                       t        d        t        dd       fdt        d      D                j                         sJ y)z1Input is mutable when using the threading backendr   )maxsizerA   r-   rd   c              3   T   K   | ]  } t        j                        d        ! ywr   N)r#   put)ri   r   qs     r6   rk   z1test_mutate_input_with_threads.<locals>.<genexpr>4  s$      ,-#+aq8s   %(N)r   r"   ro   full)r   s   @r6   test_mutate_input_with_threadsr   1  s<    aA+HA{+ ,-#(8,- -668O8r8   )r   rA   rm   c                     t        d      }|D cg c]  }t        |d       c} t        |       d |D              k(  sJ yc c}w )z.Check the keyword argument processing of pmap.
   r   r=   ry   c              3   J   K   | ]  } t        t              |d         ywr   r   Nr#   r]   r   s     r6   rk   z'test_parallel_kwargs.<locals>.<genexpr>>  s!     #D1JGAJqA$6$6   !#N)ro   r]   r"   )re   lstr<   s      r6   test_parallel_kwargsr   9  sO     )C #$1QqAY$#HF##D#DDE F E$s   Ac                    t        d      }|D cg c]  }t        |d       }}t        d|       5 }|j                  }| |d |D              k(  sJ | |d |D              k(  sJ t        "t        |      t        |j                        u sJ d d d        t        t        j                        J | d |D              k(  sJ t        t        |j                        J y y c c}w # 1 sw Y   ^xY w)	Nr   r   r   r   rd   c              3   J   K   | ]  } t        t              |d         ywr   r   r   s     r6   rk   z3test_parallel_as_context_manager.<locals>.<genexpr>M  !     =AZWQZQ//r   c              3   J   K   | ]  } t        t              |d         ywr   r   r   s     r6   rk   z3test_parallel_as_context_manager.<locals>.<genexpr>N  r   r   c              3   J   K   | ]  } t        t              |d         ywr   r   r   s     r6   rk   z3test_parallel_as_context_manager.<locals>.<genexpr>Z  s!     9SA++Sr   )ro   r]   r"   _backendr   r7   )r5   r   r<   r   pmanaged_backends         r6    test_parallel_as_context_managerr   A  s    
)C#&'3a!q	3H'	G	, ** 1======1====== >/;qzz3JJJJ 
-  
~1::&... q9S99999	~1::&... / (	,	,s   C(AC--C6c                        G d dt                t        t        d      5   t        dd       fdt	        d	      D               d
d
d
       y
# 1 sw Y   y
xY w)ze Check that pmap captures the errors when it is passed an object
        that cannot be pickled.
    c                       e Zd Zd Zy)1test_parallel_pickling.<locals>.UnpicklableObjectc                     t        d      )N123)RuntimeErrorrG   s    r6   
__reduce__z<test_parallel_pickling.<locals>.UnpicklableObject.__reduce__e  s    u%%r8   N)rN   rO   rP   r   r;   r8   r6   UnpicklableObjectr   d  s    	&r8   r   zthe task to sendmatchrA   r,   rd   c              3   R   K   | ]  } t        t                               y wr:   r#   id)ri   r   r   s     r6   rk   z)test_parallel_pickling.<locals>.<genexpr>i  s*      +5*3Q ,772;,!*3   $'r   N)objectr   r   r"   ro   )r   s   @r6   test_parallel_picklingr  _  sJ    
&F & 
%8	9*6* +5*/)+5 	5 
:	9	9s   &AA	byteorder)<>=c                    d t        j                  d      j                  d      j                  |  d      j                  j
                  } t        dd      fdt        d	      D              }|D ]G  \  }}||k(  sJ ||j                  j
                  k(  sJ t         j                  j                  |       I y )
Nc                 2    | | j                   j                  fS r:   )dtyper  rB   s    r6   inspect_byteorderz=test_parallel_byteorder_corruption.<locals>.inspect_byteorderr  s    !''####r8      )rA   rm   i4rA   r,   rd   c              3   @   K   | ]  } t                      y wr:   r#   )ri   r   r  r<   s     r6   rk   z5test_parallel_byteorder_corruption.<locals>.<genexpr>y  s#      0/7!"!"1%x   rm   )
r   arangereshapeviewr  r  r"   ro   testingassert_array_equal)r  initial_np_byteorderresult
x_returnedbyteorder_in_workerr  r<   s        @@r6   "test_parallel_byteorder_corruptionr  m  s    
$ 			!V$))YKr*:;A77,,/XQ/ 0/4Qx0 F ,2'
'"&::::"j&6&6&@&@@@@


%%a4 ,2r8   c                 h    t         t        d| d      d t        d      D                    dk(  sJ y )NrA      re   r5   timeoutc              3   F   K   | ]  } t        t              d         yw)gMbP?Nr   r   s     r6   rk   z0test_parallel_timeout_success.<locals>.<genexpr>  s      ?2'0!uyrl   r   )r   r"   ro   r4   s    r6   test_parallel_timeout_successr!    sB     >xq'2> ?2',Ry?2 2 3689 9 9r8   c                     t        t              5   t        d| d      d t        d      D               d d d        y # 1 sw Y   y xY w)NrA   r   r  c              3   F   K   | ]  } t        t              d         ywr   Nr   r   s     r6   rk   z-test_parallel_timeout_fail.<locals>.<genexpr>  s      :3(11NGEN2	rl   r   )r   r	   r"   ro   r4   s    r6   test_parallel_timeout_failr%    s<     
	97D9 :3(-b	:3 	3 
			   %>Ac                 f   t         t        t              5   t        d|       t	        dd      D cg c]  \  }} t        t              ||       c}}       d d d        t        t              5   t        d|       dD cg c]  } t        t              |       c}       d d d        t        d|       5 }t        |j                        J t        |j                        }t        t              5   |t	        dd      D cg c]  \  }} t        t              ||       c}}       d d d        t        |j                        J t        |j                        |usJ t        d      D cg c]  }t        |d       c} |d t        d      D              k(  sJ t        |j                        }t        t              5   |dD cg c]  } t        t              |       c}       d d d        t        |j                        J t        |j                        |usJ t        d      D cg c]  }t        |d       c} |d	 t        d      D              k(  s3J |j                  |j                  |j                  |j                   f       	 d d d        t        j                        MJ t        t              5   t        d
      dD cg c]  } t        t              |       c}       d d d        t        t              5   t        d
      t	        dd      D cg c]  \  }} t        t              ||       c}}       d d d        t        t"              5   t        dd      d t        d      D               d d d        y c c}}w # 1 sw Y   NxY wc c}w # 1 sw Y   xY wc c}}w # 1 sw Y   xY wc c}w c c}w # 1 sw Y   xY wc c}w # 1 sw Y   WxY wc c}w # 1 sw Y   xY wc c}}w # 1 sw Y   xY w# 1 sw Y   y xY w)NrA   rd   )r   r   )r   r   r   r   r   c              3   J   K   | ]  } t        t              |d         ywr   r   r   s     r6   rk   z%test_error_capture.<locals>.<genexpr>  !     CAZWQZQ//r   c              3   J   K   | ]  } t        t              |d         ywr   r   r   s     r6   rk   z%test_error_capture.<locals>.<genexpr>  r)  r   ry   r   )re   r   c              3   J   K   | ]  } t        t              |d         yw)T)rU   Nr#   rV   rh   s     r6   rk   z%test_error_capture.<locals>.<genexpr>  s*      ! 'W%&q4@@r   r  )r   r   ZeroDivisionErrorr"   zipr#   r>   rY   rZ   r7   r   ro   r]   
_iteratingn_completed_tasksn_dispatched_tasks	_abortingrE   )r5   r<   r=   r   original_workerss        r6   test_error_capturer4    s   
 
~%&/HAw/ #FF 35 31 #"1a( 356 '
 %&/HAw/7=>v!*)*1-v>@ '
 Q0Hx001===*8+<+<=)*&)&&&9;&9da ,'(+Aq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3'"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%&HA7=>v!*)*1-v>@ ' 
!	"14VV1DE1DAWXq!$1DE	G 
# 
*	+%1%!Bi!	" 
,	+q5 '& ? '&; +* 3
 H +* 39 10P ? '& F 
#	" 
,	+s   N( N"N(3N:N5
!N:=<O69O O+O3AO68OAO6O$O1O$8AO6=O1AO6P P
<PP6 PP5$P'"N((N25N::OOO	O6O$$O.	)O66P PPPP$'P0c                    dd}t        d|       5 }t        t        d      5   |d  |d      D               d d d        t        t        d      5   |d	  |d
      D               d d d        t        t        d      5   |d  |d      D               d d d        d d d        y # 1 sw Y   rxY w# 1 sw Y   NxY w# 1 sw Y   *xY w# 1 sw Y   y xY w)Nr   c              3   T   K   t        d      D ]  }|| k(  rt        d      |  y w)N   Iterator Raising Error)ro   rT   )raise_atrj   s     r6   my_generatorz1test_error_in_task_iterator.<locals>.my_generator  s,     rAH} !9::G    &(rA   rd   r8  r   c              3   F   K   | ]  } t        t              |        y wr:   rg   rh   s     r6   rk   z.test_error_in_task_iterator.<locals>.<genexpr>       C*BQogfoa *Brl   )r9  c              3   F   K   | ]  } t        t              |        y wr:   rg   rh   s     r6   rk   z.test_error_in_task_iterator.<locals>.<genexpr>  r=  rl   r   c              3   F   K   | ]  } t        t              |        y wr:   rg   rh   s     r6   rk   z.test_error_in_task_iterator.<locals>.<genexpr>  s     D*CQogfoa *Crl      r   )r"   r   rT   )r5   r:  r   s      r6   test_error_in_task_iteratorrB    s     
G	,J&>?C,*BCC @
 J&>?C,*BCC @ J&>?D,*CDD @ 
-	,??
 @? @? 
-	,sQ   CB,CB8+CCC,B5	1C8C	=CC		CCc                 ,    | j                  d|z         y )NzConsumed %s)append)queueitems     r6   consumerrG    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   )rH  rJ  rL  rN  rI  rK  rM  rO  rP  rR  rQ  rS  c                     t               fd} t        d||       fd |       D               |k(  sJ t              dk(  sJ y)zC Test that with only one job, Parallel does act as a iterator.
    c               3   ^   K   t        d      D ]  } j                  d| z         |   y wNr  zProduced %iro   rD  rj   rE  s    r6   producerz'test_dispatch_one_job.<locals>.producer  +     qALL*+G    *-r   re   
batch_sizer5   c              3   J   K   | ]  } t        t              |        y wr:   r#   rG  )ri   r<   rE  s     r6   rk   z(test_dispatch_one_job.<locals>.<genexpr>  s$      ?9-7%#Z    #   N)listr"   r   )r5   r]  expected_queuerY  rE  s       @r6   test_dispatch_one_jobrd    sU      FE
 ?HA*g> ?9-5Z?9 9N"""u:r8   c                 N   t        j                         }|j                         fd} t        ddd|       fd |       D               t              }|d   dk(  sJ |d	d
 j	                  d      }|dkD  sJ |j	                  d      }||kD  sJ t              dk(  sJ y	)zW Check that using pre_dispatch Parallel does indeed dispatch items
        lazily.
    c               3   ^   K   t        d      D ]  } j                  d| z         |   y wrV  rW  rX  s    r6   rY  z/test_dispatch_multiprocessing.<locals>.producer  rZ  r[  rA   r   rm   )re   r]  pre_dispatchr5   c              3   J   K   | ]  } t        t              d         yw)r   Nr_  )ri   r   rE  s     r6   rk   z0test_dispatch_multiprocessing.<locals>.<genexpr>!  s%      F=1;A%'r`  r   rH  Nr   zConsumed anyrx   rN  ra  )r   Managerrb  r"   indexr   )r5   managerrY  queue_contentsfirst_consumption_indexproduced_3_indexrE  s         @r6   test_dispatch_multiprocessingro    s     jjlGLLNE
 FHA!!WE F=19F= = %[N!,,, -Ra066~F"R'''%++L95555u:r8   c                      t        ddd      5 }  | d t        d      D               | j                  j                         dk(  sJ 	 d d d        y # 1 sw Y   y xY w)NrA   autor-   r\  c              3   F   K   | ]  } t        t              |        y wr:   r   rh   s     r6   rk   z/test_batching_auto_threading.<locals>.<genexpr>8       	.+Q+'"+a.+rl     r   r"   ro   r   compute_batch_size)r   s    r6   test_batching_auto_threadingrw  2  sL    
 
v{	Cq		.%+	..zz,,.!333 
D	C	C   8AAc                     t        dd|       5 } |d t        d      D               |j                  j                         dkD  sJ 	 d d d        y # 1 sw Y   y xY w)NrA   rq  r\  c              3   F   K   | ]  } t        t              |        y wr:   r   rh   s     r6   rk   z2test_batching_auto_subprocesses.<locals>.<genexpr>@  rs  rl   rt  r   ru  )r5   r   s     r6   test_batching_auto_subprocessesr{  <  sN     
vw	?1		.%+	..
 zz,,.222 
@	?	?rx  c                      t        t              5   t        ddd      d t        d      D               ddd       y# 1 sw Y   yxY w)zCMake sure that exception raised during dispatch are indeed capturedrA      r   )re   rg  r   c              3   F   K   | ]  } t        t              |        y wr:   r,  rh   s     r6   rk   z*test_exception_dispatch.<locals>.<genexpr>K  s"      7=2;Q%G$%a()rl   r  N)r   rT   r"   ro   r;   r8   r6   test_exception_dispatchr  H  s:    	
	6A6 7=27)7= 	= 
		r&  c                 H     t        d      d t        d      D               y )NrA   ry   c              3   F   K   | ]  } t        t              |        y wr:   r,  ri   js     r6   rk   z(nested_function_inner.<locals>.<genexpr>P  s"      9.7! !!$irl   r  rn   rj   s    r6   nested_function_innerr  O  s"    HA 9.3Bi9 9r8   c                 H     t        d      d t        d      D               y )NrA   ry   c              3   F   K   | ]  } t        t              |        y wr:   )r#   r  r  s     r6   rk   z(nested_function_outer.<locals>.<genexpr>U  s"      >3<a&%&q)9rl   r  rn   r  s    r6   nested_function_outerr  T  s"    HA >389> >r8   z'https://github.com/joblib/loky/pull/255r   c                 h   t        t              5 } t        d|       d t        d      D               ddd       t	        j
                  |j                  |j                        }dj                  |      }d|v sJ d|v sJ d	|v sJ t        |j                        t        u sJ y# 1 sw Y   uxY w)
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   rd   c              3   F   K   | ]  } t        t              |        y wr:   )r#   r  rh   s     r6   rk   z1test_nested_exception_dispatch.<locals>.<genexpr>c  s#      ,B7@!*G)*1-yrl   r  N r  r  rV   )	r   rT   r"   ro   r   r`   r   tbr   )r5   excinforeport_linesreports       r6   test_nested_exception_dispatchr  Y  s     

	w+7+ ,B7<Ry,B 	B 
 $GLL'--LLWW\"F"f,,,"f,,,'''*,,, 
	s   $B((B1c                        e Zd ZdZddZddZy)FakeParallelBackendz8Pretends to run concurrently while running sequentially.Nc                 @    | j                  |      | _        || _        |S r:   )r'   re   r   )rG   re   r   backend_argss       r6   	configurezFakeParallelBackend.configuret  s     ++F3 r8   c                 X    |dk  r$t        t        j                         dz   |z   d      }|S )Nr   r   )maxr   r(   rG   re   s     r6   r'   z$FakeParallelBackend.effective_n_jobsy  s*    A:!+f4a8Fr8   r   )r   )rN   rO   rP   rQ   r  r'   r;   r8   r6   r  r  q  s    B
r8   r  c                     t        t        d      5  t        d       d d d        t        t        d      5  t        d      5  	 d d d        d d d        t        t        d      5  t        d      5  	 d d d        d d d        y # 1 sw Y   jxY w# 1 sw Y   NxY w# 1 sw Y   RxY w# 1 sw Y   6xY w# 1 sw Y   y xY w)NzInvalid backend:r   zunit-testingr4   )r   rT   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	5sR   BB BB (B85B,7B8BB	B  B),B5	1B88Cc                    t        t              5 }t        d|       j                          d d d        dt	        j
                        v sJ t        t              5 }t        d|       j                          d d d        dt	        |j
                        v sJ t        t              5 }t        d|       j                          d d d        dt	        |j
                        v sJ t        t              5 }t        d|       j                          d d d        dt	        |j
                        v sJ y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   HxY w)Nr   rd   z&n_jobs == 0 in Parallel has no meaning      ?z2.3z$n_jobs could not be converted to intinvalid_str)r   rT   r"   _initialize_backendr   r   )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/   D2D?(E4E2D<?EEE )2gffffff@rA   c                     t        ||       }|j                         dk(  sJ  |d t        d      D              }t        d t	        |      D              sJ y )Nrd   rA   c              3   F   K   | ]  } t        t              |        y wr:   rg   rh   s     r6   rk   z.test_njobs_converted_to_int.<locals>.<genexpr>  s     2	1OGFOA	rl   r   c              3   >   K   | ]  \  }}|t        |      k(    y wr:   )rC   )ri   rj   rs      r6   rk   z.test_njobs_converted_to_int.<locals>.<genexpr>  s     9.$!QqF1I~.r   )r"   _effective_n_jobsro   r   	enumerate)r5   re   r   r   s       r6   test_njobs_converted_to_intr    sS     	0A A%%%
2b	2
2C9)C.9999r8   c                      	 t        dt               dt        v sJ t        d   t        k(  sJ 	 t        d= y # t        d= w xY w)Ntest_backend)r&   r  r)   r;   r8   r6   test_register_parallel_backendr    sE    %!.2EF)))'+>>>>^$H^$s	   ,7 	A c                      t               t        k(  sJ 	 t        dt        d   d       t               t        k(  sJ 	 t
        t        _        t               t        k(  sJ y # t
        t        _        w xY w)Nr-   T)make_default)rb   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                     t        t        d      5   t        d      d t        d      D               d d d        t	        d      5   t               d t        d      D               d d d        y # 1 sw Y   ?xY w# 1 sw Y   y xY w)Nz)joblib backend '.*' is not available on.*r   r,   r4   c              3   F   K   | ]  } t        t              |        y wr:   rg   rh   s     r6   rk   z2test_backend_no_multiprocessing.<locals>.<genexpr>  s      FX!3Xrl   rm   c              3   F   K   | ]  } t        t              |        y wr:   rg   rh   s     r6   rk   z2test_backend_no_multiprocessing.<locals>.<genexpr>  s     8x!?76?1%xrl   )r   UserWarningr"   ro   r$   r;   r8   r6   test_backend_no_multiprocessingr    sm    	{@
B   FU1X FF
B
 
	(
8uQx88 
)	(
B 
B
 
)	(s   #A3	!A?3A<?Bc                     | |d      5  t        j                         \  }}|dk(  sJ t        d      dk(  sJ t               }|j                  dk(  sJ |dk(  r0t        |      t        u sJ t        |j                        t        u sJ |dk(  r0t        |      t        u sJ t        |j                        t        u sxJ |dk(  r0t        |      t        u sJ t        |j                        t        u sCJ |j                  d      r0t        |      t        u sJ t        |j                        t        u sJ d d d        y # 1 sw Y   y xY w)Nrm   ry   r+   r,   r-   test_)r   ra   r'   r"   re   r`   r   r   r!   r   
startswithr  )rw   backend_nameactive_backendactive_n_jobsr   s        r6   check_backend_context_managerr    s8   	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   D*D>>Erm   ztest_backend_%dc                    |t         vr| j                  t         |t               t               t        k(  sJ t        |       t               t        k(  sJ  t        dd      fdt        D               t               t        k(  sJ y )NrA   r-   rd   c              3   N   K   | ]  }|s t        t              |        y wr:   )r#   r  )ri   rI   rw   s     r6   rk   z/test_backend_context_manager.<locals>.<genexpr>  s*      ,<1A 	/-.w:1r   )r)   setitemr  rb   r  r  r"    all_backends_for_context_manager)r   r5   rw   s     `r6   test_backend_context_managerr    s     hHg/BC!^333!'73  !^333 ,HA{+ ,<1,< <
  !^333r8   c                       e Zd ZdZddZy)ParameterizedParallelBackendz9Pretends to run conncurrently while running sequentially.Nc                 ,    |t        d      || _        y )Nzparam should not be None)rT   param)rG   r  s     r6   rL   z%ParameterizedParallelBackend.__init__  s    =788
r8   r:   rM   r;   r8   r6   r  r    s
    Cr8   r  c                 (   | j                  t        dt               t               t        k(  sJ  |ddd      5  t        j                         \  }}t        |      t        u sJ |j                  dk(  sJ |dk(  sJ t               }|j                  dk(  sJ |j                  |u sJ  |d t        d      D              }d d d        t        d      D cg c]  }t        |       c}k(  sJ t               t        k(  sJ y # 1 sw Y   DxY wc c}w )Nparam_backend*   rm   )r  re   c              3   F   K   | ]  } t        t              |        y wr:   r#   r   rh   s     r6   rk   z=test_parameterized_backend_context_manager.<locals>.<genexpr>       7hMGDM!$hrl   r   )r  r)   r  rb   r  r   ra   r`   r  r"   re   r   ro   r   )r   rw   r  r  r   r   rj   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                    t               t        k(  sJ  | t        d      d      5  t        j                         \  }}t        |      t        u sJ |j                  dk(  sJ |dk(  sJ t               }|j                  dk(  sJ |j                  |u sJ  |d t        d      D              }d d d        t        d      D cg c]  }t        |       c}k(  sJ t               t        k(  sJ y # 1 sw Y   DxY wc c}w )N+   )r  r   ry   c              3   F   K   | ]  } t        t              |        y wr:   r  rh   s     r6   rk   zFtest_directly_parameterized_backend_context_manager.<locals>.<genexpr>(  r  rl   )rb   r  r  r   ra   r`   r  r"   re   r   ro   r   )rw   r  r  r   r   rj   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C1C=1C:c                  @    t        d       t        j                         S )Nr   )r   osgetpidr;   r8   r6   sleep_and_return_pidr  /  s    	"I99;r8   c                      t               t        k(  sJ t               j                         dk(  sJ  t        d      d t	        d      D              S )Nr   rA   ry   c              3   D   K   | ]  } t        t                       y wr:   )r#   r  r   s     r6   rk   z"get_nested_pids.<locals>.<genexpr>;  s#      1'/! <g&:;='/    )rb   r   r"   r  ro   r;   r8   r6   get_nested_pidsr  4  sV    !%5555 :'')Q... 81 1',Qx1 1 1r8   c                   "     e Zd ZdZ fdZ xZS )	MyBackendz:Backend to test backward compatibility with older backendsc                 .    t         t        |          d   S r_   )superr  get_nested_backend)rG   	__class__s    r6   r  zMyBackend.get_nested_backendA  s    Y8:1==r8   )rN   rO   rP   rQ   r  __classcell__)r  s   @r6   r  r  ?  s    D> >r8   r  back_compat_backend)r-   r,   r+   r  c                      | |      5   t        d      d t        d      D              }|D ]  }t        t        |            dk(  rJ  	 d d d        y # 1 sw Y   y xY w)NrA   ry   c              3   D   K   | ]  } t        t                       y wr:   )r#   r  r   s     r6   rk   z6test_nested_backend_context_manager.<locals>.<genexpr>R  s"      (
 %GO$&r  r   r   )r"   ro   r   set)rw   r5   
pid_groups	pid_groups       r6   #test_nested_backend_context_managerr  I  s]     
	'XQ' (
2Y(
 

 $Is9~&!+++ $ 
		s   ?A	AA)rA   rx   Nc                      d  t        d      fdt        d      D                |       5   t        d       fdt        d      D               d d d        y # 1 sw Y   y xY w)Nc                     t               t        |    k(  sJ t        |      }t               j	                         |k(  sJ y r:   )rb   r)   r'   r"   r  )expected_backend_typeexpected_n_jobs     r6   check_nested_backendz?test_nested_backend_in_sequential.<locals>.check_nested_backendb  s@     $%2G)HHHH *.9z++-???r8   r   ry   c              3   J   K   | ]  } t              t        d         ywr   )r#   r*   )ri   r   r  s     r6   rk   z4test_nested_backend_in_sequential.<locals>.<genexpr>l  s(      A 	&$%oq9r`  r   c              3   B   K   | ]  } t                      y wr:   r  )ri   r   r5   r  re   s     r6   rk   z4test_nested_backend_in_sequential.<locals>.<genexpr>r  s(      
 *G()'6:s   rn   )r5   re   rw   r  s   `` @r6   !test_nested_backend_in_sequentialr  Z  sc    @ HA r 
 
	( 
2Y
 	
 
)	(	(s   'A%%A.c                      | |      5 }| t         u r|d   }| t        u r|d   }j                  |k(  sJ 	 d d d        y # 1 sw Y   y xY w)Nr5   r   )r$   r%   nesting_level)rw   inner_backendexpected_levelctxr5   s        r6   check_nesting_levelr  x  sO    		3o%)nG&&!fG$$666 
 		s	   ,?Aouter_backendr  c                      t         |d        t        d|       fdt        d      D                 d      5   t                fdt        d      D               d d d        y # 1 sw Y   y xY w)Nr   rA   rd   c              3   L   K   | ]  } t        t              d         ywr   r#   r  ri   r   rw   r  s     r6   rk   z-test_backend_nesting_level.<locals>.<genexpr>  s*      .A 	%#$WmQ?   !$r   ry   c              3   L   K   | ]  } t        t              d         ywr   r  r  s     r6   rk   z-test_backend_nesting_level.<locals>.<genexpr>  s*      '%q 07./J%r  )r  r"   ro   )rw   r  r  s   ` `r6   test_backend_nesting_levelr    sh     2-HA}- .r. 
 
q	)
 '!"I' 	' 
*	)	)s    $A--A6with_retrieve_callbackTc                 F   dd l  G fddt              }t        d|       d  | d      5 } t        d      fdt	        d	      D               | t
        u r|d
   j                  dk(  sJ | t        u r|d   j                  dk(  sJ d d d        y # 1 sw Y   y xY w)Nr   c                   >    e Zd ZdZW ZW  j
                  d        Zy))test_retrieval_context.<locals>.MyBackendr   c              3   >   K   | xj                   dz  c_         d  y wrz   r  r   s    r6   retrieval_contextz;test_retrieval_context.<locals>.MyBackend.retrieval_context  s     FFaKFr   N)rN   rO   rP   rj   supports_retrieve_callbackcontextmanagerr   )
contextlibr  s   r6   r  r    s&    %;"		"	"	 
#	r8   r  	retrievalc                 F     t        d      d t        |       D              S )NrA   ry   c              3   F   K   | ]  } t        t              |        y wr:   r   rh   s     r6   rk   z>test_retrieval_context.<locals>.nested_call.<locals>.<genexpr>  s     !C(Q+'"+a.(rl   rn   )ns    r6   nested_callz+test_retrieval_context.<locals>.nested_call  s    !xq!!C%(!CCCr8   rA   ry   c              3   @   K   | ]  } t              |        y wr:   r  )ri   rj   r  s     r6   rk   z)test_retrieval_context.<locals>.<genexpr>  s%      
 !GK #r  r   r5   r   )r  r   r&   r"   ro   r$   rj   r%   )rw   r  r  r  r  r  s    `  @@r6   test_retrieval_contextr
    s     $  k95D 
	 
1X
 	
 o%y>##q(((&&q688q= = 
		s   ABB r]  )r   rx   gQ?c                 d    t        t              5  t        |        d d d        y # 1 sw Y   y xY w)Nr]  )r   rT   r"   r  s    r6   test_invalid_batch_sizer    s    	
	J' 
		s   &/z)n_tasks, n_jobs, pre_dispatch, batch_size))rA   rA   r   rq  )rA   rA   re   rq  r   rA   re   rq  )i  rA   re   rq  r  )r   r   re   rq  )   ra  re   rq  )   ra  
2 * n_jobsr   )   ra  r   r   )r  ra  r  rS   )r  ra  r  rq  c                     |||d}t        |       D cg c]  }t        |       }} t        di |d t        |       D              }||k(  sJ y c c}w )N)re   rg  r]  c              3   F   K   | ]  } t        t              |        y wr:   rg   rh   s     r6   rk   z/test_dispatch_race_condition.<locals>.<genexpr>  s      L^!3^rl   r;   r   )n_tasksre   rg  r]  paramsrj   r   r   s           r6   test_dispatch_race_conditionr    s`      &(F#(>2>aq	>H2 h   LU7^ LLGh 3s   Ac                      t        j                         } t        dd      }|j                  j	                  d      }|j                         }|| k(  sJ y )NrA   r+   rd   rw   )r   get_start_methodr"   _backend_argsget)mp_start_methodr   rw   start_methods       r6   test_default_mp_contextr    sM    ))+O#45Aoo!!),G++-L?***r8   c                 &   | dk(  rt        j                  d      } t        j                  j	                  d      }|j                  dd      t        j                  j                          t        d|       fdt        d      D               y )Nr+   r/   r  i  rA   rd   c              3   r   K   | ].  } t        t        j                        j                         0 y wr:   )r#   r   dotT)ri   rj   rH   s     r6   rk   zAtest_no_blas_crash_or_freeze_with_subprocesses.<locals>.<genexpr>  s*      (3)1A133s   47)
r   r.   r   randomRandomStaterandnr!  r"  r"   ro   )r5   rngrH   s     @r6   .test_no_blas_crash_or_freeze_with_subprocessesr'    s{     ## ..) ))


#C 			$AFF1accN (HAw' (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                     | dk(  r,t        j                         dk7  rt        j                  d       t        j                  |       }t        t        j                  d|gdd       y )Nr+   forkzVRequire fork start method to use interactively defined functions with multiprocessing.z-cr   \[0, 1, 4, 9, 16\]r  stdout_regex)	r   r  r   skip,UNPICKLABLE_CALLABLE_SCRIPT_TEMPLATE_NO_MAINformatr   r   
executable)r5   codes     r6   2test_parallel_with_interactively_defined_functionsr2    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           
         | dv r1|t         k7  st        j                  dk(  rt        j                  d       t
        j                  || |t        j                  j                  t        j                  j                  t        j                                    }|j                  d      }|j                  |       t        t        j                  |j                   gdd       y )	N)r+   r/   win32zNot picklable with pickle)r3  r5   r4  joblib_root_folderzunpicklable_func_script.pyr   r*  r+  )SQUARE_MAINr   platformr   r-  )UNPICKLABLE_CALLABLE_SCRIPT_TEMPLATE_MAINr/  r  pathdirnamejoblib__file__r   writer   r0  strpath)r5   r3  r4  tmpdirr1  	code_files         r6   0test_parallel_with_unpicklable_functions_in_argsrD  C  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)
))
)r8  c                     | j                  d      }|j                  t               t        t        j
                  |j                  gdd        y )Nz(joblib_interactively_defined_function.pyr*  )r,  r  )r   r@  5INTERACTIVE_DEFINED_FUNCTION_AND_CLASS_SCRIPT_CONTENTr   r   r0  rA  rB  scripts     r6   7test_parallel_with_interactively_defined_functions_lokyrI    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                     | j                  d      }|j                  t               t        t        j
                  |j                  gddd       y )Nz)joblib_interactive_bound_method_script.pyz\[None, None, None\]LokyProcess   )r,  stderr_regexr  )r   r@  9INTERACTIVELY_DEFINED_SUBCLASS_WITH_METHOD_SCRIPT_CONTENTr   r   r0  rA  rG  s     r6   :test_parallel_with_interactively_defined_bound_method_lokyrO    s>    [[DEF
LLJK3>>6>>:'>'5"$&r8   c                  H    t        g       }  t        d      |       g k(  sJ y )NrA   ry   )iterr"   )exhausted_iterators    r6   %test_parallel_with_exhausted_iteratorrS    s'    b8101R777r8   c                  B    t                t        j                  d       y)z+Helper function to force gc in each worker.r   N)r   rX   r   r;   r8   r6   _cleanup_workerrU    s    OJJrNr8   c                     t        | t        j                        st        dt	        |             | j                         S )Nz#Expected np.memmap instance, got %r)
isinstancer   memmap	TypeErrorr`   copy)rH   s    r6   check_memmapr[    s2    a#=Q! 	!668Or8   c                    d } t        dd|       d  |d      D              }t        | |t        |                  D ]%  \  }}t        j                  j                  ||       '  t        dd|       d  |d      D              }t        | |t        |                  D ]%  \  }}t        j                  j                  ||       ' y )	Nc              3      K   t        |       D ],  }t        j                  dt        j                        |z   . y w)Nr   r  )ro   r   onesfloat32)r  rj   s     r6   generate_arrayszBtest_auto_memmap_on_arrays_from_generator.<locals>.generate_arrays  s.     qA''"BJJ/!33 s   <>rA   r   re   
max_nbytesr5   c              3   F   K   | ]  } t        t              |        y wr:   r#   r[  ri   rH   s     r6   rk   z<test_auto_memmap_on_arrays_from_generator.<locals>.<genexpr>  $      @@*>Qa *>rl   r   r   c              3   F   K   | ]  } t        t              |        y wr:   re  rf  s     r6   rk   z<test_auto_memmap_on_arrays_from_generator.<locals>.<genexpr>  rg  rl   )r"   r.  r   r   r  r  )r5   ra  r   r  r   s        r6   )test_auto_memmap_on_arrays_from_generatorri    s    4
 @haAw? @@*9#*>@@ @GW)FG


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


%%h7 Hr8   c                     | S r:   r;   )args    r6   identityrl    s    Jr8   c                    | j                  d      j                  }t        j                  }t	        j
                  |d      t	        j                  |d      g}t        ||       t        |d       t        d      fdd	D              \  }t        d
   t        j                        sJ d
   j                  |kD  sJ t        j                  j                  ||       y )Nz	test.mmapuint8r^  r  )	mmap_moderA   ry   c              3   H   K   | ]  } t        t                      y wr:   )r#   rl  )ri   r   rX  s     r6   rk   z.test_memmap_with_big_offset.<locals>.<genexpr>  s      HCq!2!26!:Cr   rA  r   )r   rA  mmapALLOCATIONGRANULARITYr   zerosr_  r   r   r"   rW  rX  offsetr  r  )rB  fnamesizeobjr  rX  s        @r6   test_memmap_with_big_offsetrx    s     KK$,,E%%D88D("''$g*F
GCe%3'F ha  HC HHGFfQi+++!9d"""JJ!!#v.r8   c                  6   t        j                  d      5 }  t        dd      d t        d      D               d d d        t	               dk(  sJ | d   }t        |j                  t              sJ t        |j                        dk(  sJ y # 1 sw Y   UxY w)	NTr   r   )re   r  c              3   F   K   | ]  } t        t              |        y wr:   rg   rh   s     r6   rk   zFtest_warning_about_timeout_not_supported_by_backend.<locals>.<genexpr>  s     %L)Qogfoa&8)rl   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"   ro   r   rW  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                     || |<   |S r:   r;   )
input_listrj  r   s      r6   set_list_valuer     s    JuLr8   )r   rA   r   c                     dgdz   t        | dd      fdt        d      D              }t        |      }t        d t	        |      D              sJ y )Nr   r   	generatorr-   re   	return_asr5   c              3   L   K   | ]  } t        t              ||        y wr:   )r#   r  )ri   rj   r~  s     r6   rk   zPtest_parallel_return_order_with_return_as_generator_parameter.<locals>.<genexpr>  s'      +E;Ca
Aq18r  c              3   ,   K   | ]  \  }}||k(    y wr:   r;   ri   vr  s      r6   rk   zPtest_parallel_return_order_with_return_as_generator_parameter.<locals>.<genexpr>  s     :"9$!QqAv"9   )r"   ro   rb  r   r.  )re   r  r~  s     @r6   =test_parallel_return_order_with_return_as_generator_parameterr    sd    
 qJ+XV{)++E;@8+EEF
 &\F:#j&"9::::r8   c                 2    |rt        d       t        |       S )Nr  )r   r   )edelays     r6   _sqrt_with_delayr    s    b	7Nr8   c                     t        |d|       d t        d      D              t        fdt        d      D              }dgt        t        dd            z   }t	        d	 t        ||      D              sJ t                y )
Ngenerator_unorderedr  c              3   T   K   | ]   } t        t              |d z  |dk(         " yw)rA   r   N)r#   r  rh   s     r6   rk   zK_test_parallel_unordered_generator_returns_fastest_first.<locals>.<genexpr>   s-      'F;Da! !!Q$a19r;  r   c              3   4   K   | ]  }t                y wr:   )next)ri   r   r  s     r6   rk   zK_test_parallel_unordered_generator_returns_fastest_first.<locals>.<genexpr>#  s     =Hqd6lHs   	   r   rA   c              3   ,   K   | ]  \  }}||k(    y wr:   r;   r  s      r6   rk   zK_test_parallel_unordered_generator_returns_fastest_first.<locals>.<genexpr>'  s      K41aQKr  )r"   ro   sortedrb  r   r.  r   )r5   re   quickly_returnedexpected_quickly_returnedr  s       @r6   8_test_parallel_unordered_generator_returns_fastest_firstr    s    'XV/D%''F;@9'FFF =E!H==!"d5B<&8 8 8:JK    	Or8   rA   
sequentialc                     t        | |       y r:   )r  r5   re   s     r6   7test_parallel_unordered_generator_returns_fastest_firstr  /  s     =WfMr8   zThis test requires daskc                     t        j                  dd      5   |d      5  t        d |        d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY wNrA   	n_workersthreads_per_workerdask)distributedClientr  )re   rw   s     r6   Atest_parallel_unordered_generator_returns_fastest_first_with_daskr  9  sH     
		A
v@vN 
 

 
s   	A?AA	AA)r   rA   r   rx   c                     dgdgdz  z   }t        t              5  t        j                         } t        | |      d |D               d d d        t        j                         z
  }|dk  sJ y # 1 sw Y   (xY w)NrH   r   r   rd   c              3   Z   K   | ]#  } t        t        j                        |       % y wr:   r#   rX   r   rh   s     r6   rk   z%test_abort_backend.<locals>.<genexpr>K  s%      14,2qGDJJ"Fs   )+r7  )r   rY  rX   r"   )re   r5   delayst_startdts        r6   test_abort_backendr  E  sr     UbTCZF			))+00 14,214 	4 
 
w	B7N7 
	s   /A00A9c                 X    t        j                  t        d      t              }d|d<   |S )Ng    Ar^  Fr   )r   r_  intbool)rk  r  s     r6   get_large_objectr  Q  s$    WWS\.FF1IMr8   c                     t        || |      5 } |d t        d      D              }t        |       t        |       ~t                d d d        y # 1 sw Y   y xY w)N)re   r5   r  c              3   F   K   | ]  } t        t              |        y wr:   )r#   r  rh   s     r6   rk   z0_test_deadlock_with_generator.<locals>.<genexpr>\  s     J	13'"23A6	rl   r   )r"   ro   r  r   )r5   r  re   r   r  s        r6   _test_deadlock_with_generatorr  W  sR     
%
'*2Jb	JJVV 	
' 
' 
's   :AAr  r  r  c                     t        | ||       y r:   )r  )r5   r  re   s      r6   test_deadlock_with_generatorr  e  s    
 "'9f=r8   c                     t        j                  dd      5   | d      5  t        d ||       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY wr  )r  r  r  )rw   r  re   s      r6   %test_deadlock_with_generator_and_daskr  m  sJ     
		A
v%dIv> 
 

 
s!   	AA A A		AAc                 L   t        t        d      5  t        || |      } |d t        d      D              }t	        j                         } |d t        d      D              }d d d        t	        j                         z
  dk  sJ d	       ~t                y # 1 sw Y   6xY w)
N)This Parallel instance is already runningr   r5   r  c              3   F   K   | ]  } t        t              d         ywr   r   r   s     r6   rk   z/test_multiple_generator_call.<locals>.<genexpr>  s     :	1^WU^A&	rl   r   c              3   F   K   | ]  } t        t              |        y wr:   r   rh   s     r6   rk   z/test_multiple_generator_call.<locals>.<genexpr>  s     ;
1A
rl   r   rA   ZThe error should be raised immediatly when submitting a new task but it took more than 2s.)r   r   r"   ro   rX   r   )r5   r  re   r   gr  gen2s          r6   test_multiple_generator_callr  y  s     
A
CFGyI:b	::))+;c
;;
C 99; 1$ 	$$
 	
 O!
C 
Cs   ABB#c                 x   t        || |      5 } |d t        d      D              }t        j                         }t        t        d      5   |d t        d      D              }d d d        t        j                         |z
  dk  sJ d	       	 d d d        ~t                y # 1 sw Y   ?xY w# 1 sw Y   !xY w)
Nr  c              3   F   K   | ]  } t        t              d         ywr$  r   r   s     r6   rk   z7test_multiple_generator_call_managed.<locals>.<genexpr>  s     ;A^WU^B'rl   r   r  r   c              3   F   K   | ]  } t        t              |        y wr:   r   rh   s     r6   rk   z7test_multiple_generator_call_managed.<locals>.<genexpr>  s     =*Q+'"+a.*rl   r   rA   r  )r"   ro   rX   r   r   r   )r5   r  re   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#   >B0B$&)B0$B-	)B00B9return_as_1return_as_2c           
      t    t        || |      d t        d      D              } t        || |      d t        dd      D              }|dk(  rt        |      }|dk(  rt        |      }t        d t	        |t        d            D              sJ t        d t	        |t        dd            D              sJ y )	Nr  c              3   L   K   | ]  } t        t              |d z          ywrA   Nr  rh   s     r6   rk   z9test_multiple_generator_call_separated.<locals>.<genexpr>  s$      A'0!a1fy   "$r   c              3   L   K   | ]  } t        t              |d z          ywr  r  rh   s     r6   rk   z9test_multiple_generator_call_separated.<locals>.<genexpr>  s$      B'4!a1f}r  r7  r  c              3   ,   K   | ]  \  }}||k(    y wr:   r;   ri   r   rj   s      r6   rk   z9test_multiple_generator_call_separated.<locals>.<genexpr>  s     8&7FCsax&7r  c              3   ,   K   | ]  \  }}||k(    y wr:   r;   r  s      r6   rk   z9test_multiple_generator_call_separated.<locals>.<genexpr>  s     =&<FCsax&<r  )r"   ro   r  r   r.  )r5   r  r  re   r  r  s         r6   &test_multiple_generator_call_separatedr    s     	AK@ A',RyA 	A 
B&'[	A B',R}B 
B ++1I++BZ8c!U2Y&78888=c"eBm&<====r8   zbackend, error))r,   T)r-   F)r  Fc                 R   | dk(  rt         t        j                  d       t        d| |      } |d t	        d      D              }t        j                  |d       }|rt        t        d	      n	t               }|5  t        j                         } t        d| |      d
 t	        dd      D              }t                |dk(  rt        |      }t        d t        |t	        dd            D              sJ 	 d d d        t        j                         z
  dk  sJ d}	|j                  r1|	dk  r,|	dz  }	t        j                   d       |j                  r|	dk  r,t        j                         |z
  dk  sJ  |j"                         dk7  r|j$                  sJ y y # 1 sw Y   xY w)Nr,   zRequires multiprocessingrA   r  c              3   F   K   | ]  } t        t              d         ywr$  r   rh   s     r6   rk   z<test_multiple_generator_call_separated_gc.<locals>.<genexpr>  s     7Y#Yrl   r   c                      t        d      S )NzGenerator collected)r   r;   r8   r6   <lambda>z;test_multiple_generator_call_separated_gc.<locals>.<lambda>  s
    u-B'Cr8   z The executor underlying Parallelr   c              3   L   K   | ]  } t        t              |d z          ywr  r  rh   s     r6   rk   z<test_multiple_generator_call_separated_gc.<locals>.<genexpr>  s$      @
+8aMGDM!q&!=r  r7  r  c              3   ,   K   | ]  \  }}||k(    y wr:   r;   r  s      r6   rk   z<test_multiple_generator_call_separated_gc.<locals>.<genexpr>  s     @*?Q3!8*?r  r   r   rm   r   r  )r   r   r-  r"   ro   weakreffinalizer   r   r   rX   r   r  r   r.  aliver   r  r2  )
r5   r  r  errorr   r  g_wrr  r  retrys
             r6   )test_multiple_generator_call_separated_gcr    s    	6
./ 7kBH7U2Y77AACDD  	|#EF!m  

 ))+?HQ;? @
+0R=@
 
 	//q	A@#ar2*?@@@@# 
& 99; 1$$$ E
**


2 ** 99; 1$$$!x!!#q( !!!! )9 
s   =A<FF&c                    |j                   }t        dd| |      5 } |d t        j                  j                  d      gdz  D               t	        t        j                  |            dkD  sJ  |d t        d      D               d d d        t        d      D ]$  }t        j                  |      s nt        d	       & t        d
      t        dd|       } |d t        j                  j                  d      gdz  D                |d t        d      D               t        d      D ]$  }t        j                  |      s y t        d	       & t        d
      # 1 sw Y   xY w)NrA   r   )re   rc  r5   temp_folderc              3   F   K   | ]  } t        t              |        y wr:   re  rf  s     r6   rk   z(test_memmapping_leaks.<locals>.<genexpr>  s      	G,Fq
',

",Frl   r   r   c              3   D   K   | ]  } t        t                       y wr:   r#   rU  r   s     r6   rk   z(test_memmapping_leaks.<locals>.<genexpr>  s     	7h
"'/
"
$hr  r   r   z/temporary directory of Parallel was not removedrb  c              3   F   K   | ]  } t        t              |        y wr:   re  rf  s     r6   rk   z(test_memmapping_leaks.<locals>.<genexpr>#  s      C(B1glA(Brl   c              3   D   K   | ]  } t        t                       y wr:   r  r   s     r6   rk   z(test_memmapping_leaks.<locals>.<genexpr>$  s     3(Qgo (r  )
rA  r"   r   r#  r   r  listdirro   r   AssertionError)r5   rB  r   r   s       r6   test_memmapping_leaksr     s8    ^^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                      t        d|       d t        d      D              }|t        d      D cg c]  }|dz  	 c}k(  sJ y c c}w )NrA   rd   c              3   @   K   | ]  } t        d        |        yw)c                     | dz  S r@   r;   rB   s    r6   r  z2test_lambda_expression.<locals>.<genexpr>.<lambda>5  s    !q&r8   Nr  rh   s     r6   rk   z)test_lambda_expression.<locals>.<genexpr>4  s"      29.7! !!$is   r   rn   )r5   r   rj   s      r6   test_lambda_expressionr  .  sP     2ha1 29.3Bi29 9GuRy1y!qAvy11111s   Ac                    d}d}d|z  t        d||       } |fdt        |      D               |j                  j                  |j                  j                  k(  sJ |j                  j
                  |j                  j                  k(  sJ  |fdt        |      D               |j                  j                  |j                  j                  k(  sJ |j                  j
                  |j                  j                  k(  sJ y)	zCTest that a parallel backend correctly resets its batch statistics.rA   i  g       @r   )r   re   r5   c              3   \   K   | ]#  } t        t        j                               % y wr:   r  ri   rj   	task_times     r6   rk   z6test_backend_batch_statistics_reset.<locals>.<genexpr>B  #     >ogdjj)$o   ),c              3   \   K   | ]#  } t        t        j                               % y wr:   r  r  s     r6   rk   z6test_backend_batch_statistics_reset.<locals>.<genexpr>H  r  r  N)r"   ro   r   _effective_batch_size_DEFAULT_EFFECTIVE_BATCH_SIZE_smoothed_batch_duration _DEFAULT_SMOOTHED_BATCH_DURATION)r5   re   n_inputsr   r  s       @r6   #test_backend_batch_statistics_resetr  9  s     FHXIFG<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                    dD ]  }t        t        |      j                        t        k(  sJ t        |d      }t        |j                        t        u sJ t        |d      }t        |j                        t        u sJ t        |d      }t        |j                        t        u rJ  t        dd	d
      }t        |j                        t
        u sJ  | d	d      5  t        d      }t        |j                        t
        u sJ |j                  dk(  sJ 	 d d d         | d	d      5  t        dd      }t        |j                        t
        u sJ |j                  dk(  sJ 	 d d d         | d	d      5  t        d      }t        |j                        t        u sJ |j                  dk(  sJ 	 d d d         | d	d      5  t        dd      }t        |j                        t        u sJ |j                  dk(  sJ 	 d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   qxY w# 1 sw Y   y xY w)N)r   rA   rx   ry   threadsre   prefer	processes	sharedmemre   requirerA   r,   )re   r5   r  r  rm   r   r   )r`   r"   r   r  r   r!   re   )rw   re   r   s      r6   $test_backend_hinting_and_constraintsr  O  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   #;H1<H  ;H,<H8H H),H58Ic                     G d dt               } | |             5  t        dd      }t        |j                        |u sJ t        dd      }t        |j                        |u sJ 	 d d d         G d d	t               } | |             5  t        dd      }t        |j                        |u sJ | j	                         \  }}|d
k(  sJ |d
k(  sJ t        ddd      }t        |j                        t
        u sJ | j	                         \  }}d}|j                         |k(  sJ |d
k(  sJ 	 d d d        t        t              5  t         |       d       d d d        y # 1 sw Y   xY w# 1 sw Y   @xY w# 1 sw Y   y xY w)Nc                        e Zd ZdZdZd Zd Zy)[test_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackendTc                      y r:   r;   r   s    r6   apply_asynczgtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackend.apply_async      r8   c                     |S r:   r;   r  s     r6   r'   zltest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackend.effective_n_jobs      Mr8   NrN   rO   rP   supports_sharedmemuse_threadsr  r'   r;   r8   r6   MyCustomThreadingBackendr    s    !		r8   r  rA   r  r  r  r  c                        e Zd ZdZdZd Zd Zy)\test_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackendFc                      y r:   r;   r   s    r6   r  zhtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackend.apply_async  r	  r8   c                     |S r:   r;   r  s     r6   r'   zmtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackend.effective_n_jobs  r  r8   Nr  r;   r8   r6   MyCustomProcessingBackendr    s    "		r8   r  r  r   )re   r   r   zUsing ThreadingBackend as joblib backend instead of MyCustomProcessingBackend as the latter does not provide shared memory semantics.r5   r   )	r    r"   r`   r   
readouterrr   stripr   rT   )capsysrw   r  r   r  outerrr   s           r6   9test_backend_hinting_and_constraints_with_custom_backendsr    sv   #6  
)+	,Ak2AJJ#;;;;A{3AJJ#;;;; 
-$7  
*,	-Ak2AJJ#<<<<$$&SbyybyyA{B?AJJ#3333$$&S@ yy{h&&&byy! 
.$ 

	24kJ 
	G 
-	," 
.	-$ 
	s%   AE'B$E3E?'E03E<?Fc                     t        t              5  t        d       d d d        t        t              5  t        d       d d d        t        t              5  t        dd       d d d        t        Kt        t              5  t        dd       d d d        t        t              5  t        d	d       d d d        y y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   sxY w# 1 sw Y   TxY w# 1 sw Y   y xY w)
Ninvalidr  r  r  r  )r  r   r,   r  r+   )r   rT   r"   r   r;   r8   r6   ,test_invalid_backend_hinting_and_constraintsr    s    	
		" 
 

	# 
 

	 	[9 

 
~ JV[9  J.D    
	 
	 
	  s:   C CCC$(C0 C	CC!$C-0C9c                     t        d      5 }t        |j                        j                  |j                  j                  fg} dk(  r|cddd       S  | fdt        d      D              }||d   z   cddd       S # 1 sw Y   yxY w)zCPerform nested parallel calls and introspect the backend on the wayrA   ry   r   Nc              3   R   K   | ]  } t        t              dd dz
  i   yw)limitr   Nr;   )r#   _recursive_backend_info)ri   rj   r5  r!  s     r6   rk   z*_recursive_backend_info.<locals>.<genexpr>  s2      '% 5G34O519OO%r  r   )r"   r`   r   rN   r  ro   )r!  r5  r   
this_levelr   s   ``   r6   r"  r"    s|     
	qAJJ'00!**2J2JKL
A: 
	  '"1X' 'GAJ& 
		s   =B"BBc                      | |d      5  t               }d d d        t               dk(  rd}d}nd}d}|j                         dz   }|df|dfd|fd|fg}|k(  sJ y # 1 sw Y   HxY w)NrA   ry   r   r   r   Backendr   )r"  r(   title)rw   r5   backend_types_and_levelssecond_level_backend_type	max_leveltop_level_backend_typeexpected_types_and_levelss          r6   test_nested_parallelism_limitr,    s     
	##:#<  
$ {a$7!	$6!	$]]_y8	#	"A&	i(	i(	! $'@@@@# 
$	#s   AA&c                 
   t        j                  dd      5  t        j                  t	        d      t        j
                        }t        d      D ]C  } | d      5  t        |      }d d d        t              dk(  sJ t        d |D              rCJ   | d      5  t               }d d d        t              dk(  sJ t        d	 |D              sJ 	 d d d        y # 1 sw Y   xxY w# 1 sw Y   CxY w# 1 sw Y   y xY w)
NrA   r  g    cAr^  r  )datar   c              3   ,   K   | ]  \  }}|d k(    ywDaskDistributedBackendNr;   ri   r   r   s      r6   rk   z4test_nested_parallelism_with_dask.<locals>.<genexpr>  s#      @&>74 77&>r  c              3   ,   K   | ]  \  }}|d k(    ywr0  r;   r2  s      r6   rk   z4test_nested_parallelism_with_dask.<locals>.<genexpr>  s"      <":wtQ 33":r  )
r  r  r   r_  r  rn  ro   r"  r   r   )rw   r.  rj   r'  s       r6   !test_nested_parallelism_with_daskr4    s     
		aA	>wws3xrxx0qA+B+M( !/0A555 @&>@ @ @ @	  V_'>'@$ +,111 <":< < 	< < 
?	> ! _ 
?	>sB   AC9C!**C9C9 C-+,C9!C*&C9-C6	2C99Dc                 B     t               d t        d      D              S )z6A horrible function that does recursive parallel callsc              3   D   K   | ]  } t        t                       y wr:   )r#   _recursive_parallelrh   s     r6   rk   z&_recursive_parallel.<locals>.<genexpr>  s     Gh2g124hr  rA   rn   )nesting_limits    r6   r7  r7    s    8:GeAhGGGr8   c                 >    | |d      5  t        t              5 }t                d d d        d d d        j                  }|dk(  r-ddlm} t        ||t        f      rt        j                  d       t        |t              sJ y # 1 sw Y   bxY w# 1 sw Y   fxY w)NrA   ry   r,   r   )TerminatedWorkerErrorz1Loky worker crash when serializing RecursionError)r   BaseExceptionr7  r   &joblib.externals.loky.process_executorr:  rW  r   r   r   RecursionError)rw   r5   r  excr:  s        r6   test_thread_bomb_mitigationr?  
  s     
	#M"g! # 
$ --C& 	Qc1=AB LLLMc>***! #" 
$	#s!   BBBB	BBc                  r    i } dD ]$  }t         j                  j                  |      | |<   & | t        d      fS )N)OMP_NUM_THREADSOPENBLAS_NUM_THREADSMKL_NUM_THREADSVECLIB_MAXIMUM_THREADSNUMEXPR_NUM_THREADSNUMBA_NUM_THREADS
ENABLE_IPCr   )r  environr  r   )env_varsvars     r6   _run_parallel_sumrK  '  s=    H3 

s+3 \#&&&r8   zNeed OpenMP helper compiledc                 *    t        d|       d t        d      D              }t        t               dz  d      }|D ]T  \  }}||k(  sJ |j	                         D ]5  \  }}|j                  d      r|t        |      k(  r&J |dk(  sJ |dk(  r5J  V y )NrA   rd   c              3   D   K   | ]  } t        t                       y wr:   )r#   rK  r   s     r6   rk   z-test_parallel_thread_limit.<locals>.<genexpr>3  s       2.6"!"$hr  r   _THREADSrG  1)r"   ro   r  r(   itemsendswithr   )r5   r   expected_num_threadsworker_env_varsomp_num_threadsr   r   s          r6   test_parallel_thread_limitrU  0  s     2ha1 2.3Ah2 G y{a/3,3("6666*002KD%}}Z($8 9999|+++|#| 3 -4r8   c                 `    t        t        d      5   | d       d d d        y # 1 sw Y   y xY w)NzPlease install daskr   r  )r   rT   )rw   s    r6   )test_dask_backend_when_dask_not_installedrW  A  s"     

"7	8 
9	8	8s   	$-c                     G d dt               }d} |  |             5  t        j                  t        |      5   t	        d      d t        d      D               d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nc                        e Zd Zd ZddZd Zy)3test_zero_worker_backend.<locals>.ZeroWorkerBackendc                      yr_   r;   )rG   r   r5  s      r6   r  z=test_zero_worker_backend.<locals>.ZeroWorkerBackend.configureM      r8   Nc                     t        d      )NzNo worker availabler   )rG   funccallbacks      r6   r  z?test_zero_worker_backend.<locals>.ZeroWorkerBackend.apply_asyncP  s    455r8   c                      yr_   r;   r  s     r6   r'   zDtest_zero_worker_backend.<locals>.ZeroWorkerBackend.effective_n_jobsS  r\  r8   r:   )rN   rO   rP   r  r  r'   r;   r8   r6   ZeroWorkerBackendrZ  L  s    		6	r8   ra  z&ZeroWorkerBackend has no active workerr   rA   ry   c              3   F   K   | ]  } t        t              |        y wr:   r   rh   s     r6   rk   z+test_zero_worker_backend.<locals>.<genexpr>Y  s     @x!{wr{1~xrl   )r   r   r   r   r"   ro   )rw   ra  expected_msgs      r6   test_zero_worker_backendrd  H  sf    ,  <L	"$	%]]<|<HA@uQx@@ = 
&	%<< 
&	%s"   A;#A/A;/A8	4A;;Bc                     da d         dk(  sJ  t        d      fdt        d      D              } t        |       dhk(  sJ da         dk(  sJ  t        d      fdt        d      D              } t        |       dhk(  sJ y )Nzoriginal valuec                      t         S r:   )MY_GLOBAL_VARIABLEr;   r8   r6   check_globalsz@test_globals_update_at_each_parallel_call.<locals>.check_globalsd  s    !!r8   rA   ry   c              3   >   K   | ]  } t                       y wr:   r  ri   rj   rh  s     r6   rk   z<test_globals_update_at_each_parallel_call.<locals>.<genexpr>j         14*2Q (   zchanged valuec              3   >   K   | ]  } t                       y wr:   r  rj  s     r6   rk   z<test_globals_update_at_each_parallel_call.<locals>.<genexpr>s  rk  rl  )rg  r"   ro   r  )workers_global_variablerh  s    @r6   )test_globals_update_at_each_parallel_callro  \  s     *" ?....0ha0 14*/(14 4&',<+==== )?o---0ha0 14*/(14 4&'O+<<<<r8   c                      dd l } | j                  j                  dd      } | j                  ||       ddlm}  |       S )Nr   r   )threadpool_info)numpyr#  r%  r!  threadpoolctlrq  )r   rH   rq  s      r6   _check_numpy_threadpool_limitsrt  }  s6     			S!A
BFF1aL-r8   c                 h    |D ]  }|d   | d   k(  s|d   c S  t        dj                  |             )Nfilepathnum_threadsz,An unexpected module was loaded in child:
{})rT   r/  )child_moduleparent_infoparent_modules      r6   _parent_max_num_threads_forr{    sE    $$Z(@@ // % Df\*, ,r8   c                 f    | D ],  }|D ]%  }t        ||      }t        ||      |h}|d   |v r%J  . y )Nrw  )r{  min)workers_infory  rw  child_threadpool_inforx  parent_max_num_threadsr   s          r6   check_child_num_threadsr    sN     ".1L%@k&+"K)?@+NH.(:::	 2 ".r8   )rA   r   r   rx   c                    t               }t        |      dk(  rt        j                  d        t	        d|       d t        d      D              }t        |       } t        t               | z  d      }t        |||       y )	Nr   &Need a version of numpy linked to BLASr   r,   r  c              3   D   K   | ]  } t        t                       y wr:   r#   rt  rh   s     r6   rk   z;test_threadpool_limitation_in_child_loky.<locals>.<genexpr>  s"      GE;Ca/./18r  rA   r   
rt  r   r   r-  r"   ro   r'   r  r(   r  )re   ry  workers_threadpool_infosexpected_child_num_threadss       r6   (test_threadpool_limitation_in_child_lokyr    s     12K
;1CDFxvF GE;@8GE  E f%F!$Y[F%:A!>4k68r8   inner_max_num_threads)r   rA   r   Nc                 J   t               }t        |      dk(  rt        j                  d        | d|      5   t	        |      d t        d      D              }d d d        t        |      }|t        t               |z  d	      }n|}t        ||       y # 1 sw Y   >xY w)
Nr   r  r   r,   r  ry   c              3   D   K   | ]  } t        t                       y wr:   r  rh   s     r6   rk   z>test_threadpool_limitation_in_child_context.<locals>.<genexpr>  s!      ;I?G!3G235xr  rA   r   r  )rw   re   r  ry  r  r  s         r6   +test_threadpool_limitation_in_child_contextr    s     12K
;1CD	/D	E#:86#: ;I?DQx;I $I  
F f%F$%()>%B"%:"4k68 
F	Es   #BB"var_name)rB  rC  rA  c                 F   t        d      j                          d t        j                  j	                        }	 dt        j                  <    t        |      fdt        d      D              }|ddgk(  sJ  | dd	
      5   t        |      fdt        d      D              }d d d        |ddgk(  sJ 	 |t        j                  = y |t        j                  <   y # 1 sw Y   ;xY w# |t        j                  = w |t        j                  <   w xY w)NTreusec                 @    t         j                  j                  |       S r:   )r  rH  r  )r  s    r6   _get_envz>test_threadpool_limitation_in_child_override.<locals>._get_env  s    zz~~h''r8   4ry   c              3   @   K   | ]  } t                      y wr:   r  ri   rj   r  r  s     r6   rk   z?test_threadpool_limitation_in_child_override.<locals>.<genexpr>  s"      *;19AGHh'r  rA   r,   r   r  c              3   @   K   | ]  } t                      y wr:   r  r  s     r6   rk   z?test_threadpool_limitation_in_child_override.<locals>.<genexpr>  s"      .?5=!!(+Xr  rO  )r   shutdownr  rH  r  r"   ro   )rw   re   r  original_var_valuer   r  s     `  @r6   ,test_threadpool_limitation_in_child_overrider    s
    %..0( 16"

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

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

8$#5BJJx s%    AC7 &C+1C7 +C40C7 7)D )rA   r   rx   c                     d } ||        t        d      }t        d      D ]  } ||        t        d      }||k(  rJ  y )Nc                 d    t        d       t        |       fdt        d      D               y )Nr   ry   c              3   H   K   | ]  } t        t                      y wr:   )r#   sum)ri   rj   r<   s     r6   rk   zAtest_loky_reuse_workers.<locals>.parallel_call.<locals>.<genexpr>  s     CAQr   )ro   r"   )re   r<   s    @r6   parallel_callz.test_loky_reuse_workers.<locals>.parallel_call  s%    "ICrCCr8   Tr  r   )r   ro   )re   r  first_executorr   executors        r6   test_loky_reuse_workersr    sL    D
 &*6N 2Yf(t4>))) r8   )F)r   r   )rm   r:   )rQ   r  r   rX   rq  r  r   r-   	tracebackr   mathr   r   pickler   r  r   r+   r	   r   r>  r   r   r   joblib._multiprocessing_helpersr   joblib.test.commonr   r   r   r   r   joblib.testingr   r   r   r   r   joblib.externals.lokyr   rE  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*   rZ  RETURN_GENERATOR_BACKENDSpopr  keysALL_VALID_BACKENDSPROCESS_BACKENDSPARALLEL_BACKENDShasattrrD  r.   r  r7   r>   rC   	ExceptionrE   rV   rZ   r]   rb   rq   rs   rv   markr   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r!  r%  r4  rB  rG  rd  ro  rw  r{  r  r  r  r   r  r  r  r  r  r  r  r  r  r  extendro   r  r  r  r  r  r  _parallel_backendsr  r  r  r  r  r
  r  r  r  r'  r.  r2  r;  r9  SQUARE_LOCALSQUARE_LAMBDArD  r/  r<  r=  r?  rF  rI  rN  rO  rS  rU  r[  ri  rl  rx  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,  r4  r7  no_coverr?  rK  rU  rW  rd  ro  rt  r{  r  r  r  r  r  )backend_strrj   s   00r6   <module>r     s!   
 
      &     " (     . - 3 5+ + >; > 8 6 < 9 1 - + , 5 7 9 9 *HMMO    / 6Vf]X]]_55  (K(;,x,.(K K :)62$}4 
2}nbnnW56/*I 
2." Y*:;<%b""-.	:0  
 .  =. Y*+X~&Y%7 & ' ,7 Y*+ ,.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"* # *W>  E
  L
  K. Lh .sB   k' k5 l /ll'k21k25l ?l ll