
    "h             	          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        Ze e!d:eF      dR        Zfe e!d:eF      dS               Zge e!d:eE      dT               ZhdU Zi e!d:e=       e!dVdg dWfdXg dYfg      dZ               Zje e!d:eF      d[               Zkd\ Zle e!d:eE      d]               Zmd^ Znd_ Zod` Zpe e!d:eF      ej                  j                  dab      dc                      Zr G dd dee0      Zsdf Zt e!d:eD      dg        Zudh Zvdi Zw e$edudjb      dk        Zxdl ZyeFdd Zzezj                   e|dm      D cg c]  }dn|z  	 c}       e e!d:ez       e!d1e9e8g      do                      Z} G dp dqe0      Z~ e!d1e8e9g      dr        Z e!d1e8e9g      ds        Zdt Zdu Z G dv dwej                  jh                        Z e:dxe       e e!d:g dy       e!d1e8e9g      dz                      Ze e!d;g d{       e!d:eF       e!d1e8e9g      d|                             Zd} Ze e!d~eF       e!deF       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j+                  ej,                  j/                  ej,                  j/                  ej0                                    Zed        Zdj+                  ej,                  j/                  ej,                  j/                  ej0                                    Zed        Zd Zd Zd Zee e!d:eE      d                      Zd Zeed               Zd Zd Zej                  jC                  d;g d      d        Z e!d:eD       e!d;g d      d               Zd Ze e!d:e@       e!d;g d      d                      Z e!d:e@       e!d;g d      d               Z e!d:e@       e!d;g d      d               Z e!d:e@       e!d;g d      d               Z e!dg d      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$e.du db       e!d1e8e9g      d                      ZddZej                  jn                   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 db      d               Z e$e.dudb       e!d1e8e9g      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 w xY w# e+$ r dZ.Y w 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    V/var/www/html/sandstorm/venv/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       :. :.   !   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      sQ     
^	4 @  t,???@
 4(A---@ @s	   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'("&6rl   ro   rC   r"   )r5   re   r   r<   s       r6   test_simple_parallelr      sU     !&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#$OGFOA62rl   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)###$ $Na'7s199~'MNH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%      ' /$))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    		 	 	- Bh'gLAB $,,a		,H,#& '$' $  '.cii%&HH"]a' + (J,JJ|+B B -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>   s5      /  	(&'!	 	/   "%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>   s5      5  	(&'!	 	5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'(r"6rl   r   r   )r   r   r"   ro   printr   )is_run_parallelr   s     r6   background_threadz=test_background_thread_parallelism.<locals>.background_thread  sh    $$D1 	6XHA 6,1!H6 6	6 	c(m ]a/		6 	6s   #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!"(0rl   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#      /?01]+/?   "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   )  sp    	
	 9Q/ 	98*gk*62.go.v68 9	99 9	9 	99 9s"   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%      ,-q,-s   %(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      #D1JGAJqA$6$6#D   !#N)ro   r]   r"   )re   lstr<   s      r6   test_parallel_kwargsr   9  sK     )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      9A++9r   )ro   r]   r"   _backendr   r7   )r5   r   r<   r   pmanaged_backends         r6    test_parallel_as_context_managerr   A  s   
)C#&'a!q	'H'	G	, K ** 1======1====== >/;qzz3JJJJK  
~1::&... q9S99999	~1::&... / (K K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%& ,772;,! +5   $'r   N)objectr   r   r"   ro   )r   s   @r6   test_parallel_picklingr  _  sS    
&F & 
%8	9 5*6* +5*/)+5 	55 5 5s   &AA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>p  s       ?2"#u?2rl   r   )r   r"   ro   r4   s    r6   test_parallel_timeout_successr
  m  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>y  s       :3#$NGEN2:3rl   r   )r   r	   r"   ro   r4   s    r6   test_parallel_timeout_failr  t  sE     
	 397D9 :3(-b	:3 	33 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>        CAZWQZQ//Cr   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_capturer  }  s   
 
~%& 	6/HAw/ #FF 351 #"1a( 56	6
 %& 	@/HAw/7=>!*)*1->@	@
 Q0  	Hx001===*8+<+<=)* <&)&&&9;"a ,'(+Aq1 ; << x001=== x0019IIII(-b	21QqAY2CrCCD E D  +8+<+<=)* IG13'"23A6GHI x001=== x0019IIII(-b	21QqAY2CrCCD ##X%?%?++X-?-?G D9 	H 8,,-555%& 	@HA7=>!*)*1->@	@ 
!	" G14VV1DEAWXq!$E	GG 
*	+ "%1%!Bi!	"" "q5	6 	6 ?	@ 	@;< < 3
 HI I 39 	  	P ?	@ 	@ FG G" "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                 ,    | j                  d|z         y )NzConsumed %s)append)queueitems     r6   consumerr"    s    	LL%&r8   zbatch_size, expected_queue)
Produced 0
Consumed 0
Produced 1
Consumed 1
Produced 2
Consumed 2
Produced 3
Consumed 3
Produced 4
Consumed 4
Produced 5
Consumed 5r   )r#  r%  r'  r)  r$  r&  r(  r*  r+  r-  r,  r.  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N   zProduced %iro   r  rj   r   s    r6   producerz'test_dispatch_one_job.<locals>.producer  0     q 	ALL*+G	   *-r   re   
batch_sizer5   c              3   J   K   | ]  } t        t              |        y wr:   r#   r"  )ri   r<   r   s     r6   rk   z(test_dispatch_one_job.<locals>.<genexpr>  s%      ?9()%#?9    #   N)listr"   r   )r5   r9  expected_queuer5  r   s       @r6   test_dispatch_one_jobr@    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r1  r3  r4  s    r6   r5  z/test_dispatch_multiprocessing.<locals>.producer  r6  r7  rA   r   rm   )re   r9  pre_dispatchr5   c              3   J   K   | ]  } t        t              d         yw)r   Nr;  )ri   r   r   s     r6   rk   z0test_dispatch_multiprocessing.<locals>.<genexpr>  s'      F=,-%'F=r<  r   r#  Nr   zConsumed anyrx   r)  r=  )r   Managerr>  r"   indexr   )r5   managerr5  queue_contentsfirst_consumption_indexproduced_3_indexr   s         @r6   test_dispatch_multiprocessingrK    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-   r8  c              3   F   K   | ]  } t        t              |        y wr:   r   rh   s     r6   rk   z/test_batching_auto_threading.<locals>.<genexpr>	       	.Q+'"+a.	.rl     r   r"   ro   r   compute_batch_size)r   s    r6   test_batching_auto_threadingrS    sT    
 
v{	C 4q		.%+	..zz,,.!3334 4 4   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   rM  r8  c              3   F   K   | ]  } t        t              |        y wr:   r   rh   s     r6   rk   z2test_batching_auto_subprocesses.<locals>.<genexpr>  rO  rl   rP  r   rQ  )r5   r   s     r6   test_batching_auto_subprocessesrW    sV     
vw	? 31		.%+	..
 zz,,.2223 3 3rT  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   rC  r   c              3   F   K   | ]  } t        t              |        y wr:   r  rh   s     r6   rk   z*test_exception_dispatch.<locals>.<genexpr>  s#      7=-.%G$%a(7=rl   r  N)r   rT   r"   ro   r;   r8   r6   test_exception_dispatchr[    sC    	
	 =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>!  s#      9)*! !!$9rl   r  rn   rj   s    r6   nested_function_innerra     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#   ra  r^  s     r6   rk   z(nested_function_outer.<locals>.<genexpr>&  s#      >./&%&q)>rl   r  rn   r`  s    r6   nested_function_outerrd  %  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#   rd  rh   s     r6   rk   z1test_nested_exception_dispatch.<locals>.<genexpr>4  s%      ,B23*G)*1-,Brl   r  N rd  ra  rV   )	r   rT   r"   ro   r   r`   r   tbr   )r5   excinforeport_linesreports       r6   test_nested_exception_dispatchrl  *  s     

	 Bw+7+ ,B7<Ry,B 	BB $GLL'--LLWW\"F"f,,,"f,,,'''*,,,B B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.configureE  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_jobsJ  s*    A:!+f4a8Fr8   r   )r   )rN   rO   rP   rQ   rq  r'   r;   r8   r6   rn  rn  B  s    B
r8   rn  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_backendrv  P  s    	
"4	5 )() 

"4	5 ^4 		 

"4	5 ^4 		 ) )	 	 
	 	 sR   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 y # 1 sw Y   #xY w)Nr   rd   z&n_jobs == 0 in Parallel has no meaning)r   rT   r"   _initialize_backendr   r   )r5   ri  s     r6   test_invalid_njobsry  ]  sO    	
	 Bw7+??AB3s7==7IIIIB Bs   AA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&   rn  r)   r;   r8   r6   test_register_parallel_backendr|  d  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  m  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      F!3 Frl   rm   c              3   F   K   | ]  } t        t              |        y wr:   rg   rh   s     r6   rk   z2test_backend_no_multiprocessing.<locals>.<genexpr>  s     8!?76?1%8rl   )r   UserWarningr"   ro   r$   r;   r8   r6   test_backend_no_multiprocessingr  y  s|    	{@
B G   FU1X FFG
 
	( 9
8uQx889 9G G
9 9s   #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   
startswithrn  )rw   backend_nameactive_backendactive_n_jobsr   s        r6   check_backend_context_managerr    sA   	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*      ,< 	/-.w:,<r   )r)   setitemrn  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>       7MGDM!$7rl   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 8(0(C(C(E%N#'CCCC##r)))!!!Jxx1}}zz^+++7eAh778 a11tAw1111  !^3338 8 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 8(0(C(C(E%N#'CCCC##r)))!!!Jxx1}}zz^+++7eAh778 a11tAw1111  !^3338 8 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&:;= 1    )rb   r   r"   _effective_n_jobsro   r;   r8   r6   get_nested_pidsr    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_backend  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>  s"      (
 %GO$&(
r  r   r   )r"   ro   r   set)rw   r5   
pid_groups	pid_groups       r6   #test_nested_backend_context_managerr    sk     
	 ,'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_backend  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>&  s(       	&$%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>,  s(      
 *G()'6:
s   rn   )r5   re   rw   r  s   `` @r6   !test_nested_backend_in_sequentialr    sl    @ 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  2  sX    		 73o%)nG&&!fG$$6667 7 7s	   ,?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>C  s*      . 	%#$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>I  s*      ' 07./J 'r  )r  r"   ro   )rw   r  r  s   ` `r6   test_backend_nesting_levelr  ;  sq     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_contextW  s     FFaKFr   N)rN   rO   rP   rj   supports_retrieve_callbackcontextmanagerr  )
contextlibr  s   r6   r  r  S  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     !CQ+'"+a.!Crl   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>b  s%      
 !GK #
   r   r5   r   )r  r   r&   r"   ro   r$   rj   r%   )rw   r  r  r  r  r  s    `  @@r6   test_retrieval_contextr  M  s     $  k95D 
	 ! 
1X
 	
 o%y>##q(((&&q688q= =! ! !s   ABB r9  )r   rx   gQ?c                 d    t        t              5  t        |        d d d        y # 1 sw Y   y xY w)Nr9  )r   rT   r"   r  s    r6   test_invalid_batch_sizer  o  s'    	
	 (J'( ( (s   &/z)n_tasks, n_jobs, pre_dispatch, batch_size))rA   rA   r   rM  )rA   rA   re   rM  r   rA   re   rM  )i  rA   re   rM  r  )r   r   re   rM  )   r=  re   rM  )   r=  
2 * n_jobsr   )   r=  r   r   )r  r=  r  rS   )r  r=  r  rM  c                     |||d}t        |       D cg c]  }t        |       }} t        di |d t        |       D              }||k(  sJ y c c}w )N)re   rC  r9  c              3   F   K   | ]  } t        t              |        y wr:   rg   rh   s     r6   rk   z/test_dispatch_race_condition.<locals>.<genexpr>  s      L!3 Lrl   r;   r   )n_tasksre   rC  r9  paramsrj   r   r   s           r6   test_dispatch_race_conditionr  u  s_      &(F#(>2aq	2H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$%133(3s   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_functionsr    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)r  r5   r	  joblib_root_folderzunpicklable_func_script.pyr   r  r   )SQUARE_MAINr   platformr   r  )UNPICKLABLE_CALLABLE_SCRIPT_TEMPLATE_MAINr  r  pathdirnamejoblib__file__r   writer   r  strpath)r5   r  r	  tmpdirr  	code_files         r6   0test_parallel_with_unpicklable_functions_in_argsr    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)
))
)r  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   r  r  r  scripts     r6   7test_parallel_with_interactively_defined_functions_lokyr  =  s>    
 [[CDF
LLFG	(*r8   a  import sys
# Make sure that joblib is importable in the subprocess launching this
# script. This is needed in case we run the tests from the joblib root
# folder without having installed joblib
sys.path.insert(0, {joblib_root_folder!r})

from joblib import Parallel, delayed, hash
import multiprocessing as mp
mp.util.log_to_stderr(5)

class MyList(list):
    '''MyList is interactively defined by MyList.append is a built-in'''
    def __hash__(self):
        # XXX: workaround limitation in cloudpickle
        return hash(self).__hash__()

l = MyList()

print(Parallel(backend="loky", n_jobs=2)(
    delayed(l.append)(i) for i in range(3)
))
c                     | 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   r  r  r  s     r6   :test_parallel_with_interactively_defined_bound_method_lokyr$  e  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_iteratorr(  o  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_workerr*  t  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_memmapr0  z  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   dtype)ro   r   onesfloat32)r  rj   s     r6   generate_arrayszBtest_auto_memmap_on_arrays_from_generator.<locals>.generate_arrays  s3     q 	4A''"BJJ/!33	4s   <>rA   r   re   
max_nbytesr5   c              3   F   K   | ]  } t        t              |        y wr:   r#   r0  ri   rH   s     r6   rk   z<test_auto_memmap_on_arrays_from_generator.<locals>.<genexpr>  &      @@%&a @@rl   r   r   c              3   F   K   | ]  } t        t              |        y wr:   r;  r<  s     r6   rk   z<test_auto_memmap_on_arrays_from_generator.<locals>.<genexpr>  r=  rl   )r"   r  r   r   testingassert_array_equal)r5   r7  r   resultr   s        r6   )test_auto_memmap_on_arrays_from_generatorrB    s    4
 @haAw? @@*9#*>@@ @GW)FG 8


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


%%h78r8   c                     | S r:   r;   )args    r6   identityrE    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uint8r3  r)	mmap_moderA   ry   c              3   H   K   | ]  } t        t                      y wr:   )r#   rE  )ri   r   r-  s     r6   rk   z.test_memmap_with_big_offset.<locals>.<genexpr>  s      Hq!2!26!: Hr   )r   r   )r   r  mmapALLOCATIONGRANULARITYr   zerosr5  r   r   r"   r,  r-  offsetr?  r@  )r  fnamesizeobjrA  r-  s        @r6   test_memmap_with_big_offsetrR    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     %LQogfoa&8%Lrl   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   r,  r   r  r   )r   r   s     r6   3test_warning_about_timeout_not_supported_by_backendrV    s    		 	 	- M%1%%L%)%LLMx=AAaii---qyy>	  M Ms   $BBc                     || |<   |S r:   r;   )
input_listrF  r   s      r6   set_list_valuerY    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#   rY  )ri   rj   rX  s     r6   rk   zPtest_parallel_return_order_with_return_as_generator_parameter.<locals>.<genexpr>  s)      +E67
Aq1+Er  c              3   ,   K   | ]  \  }}||k(    y wr:   r;   )ri   vrH  s      r6   rk   zPtest_parallel_return_order_with_return_as_generator_parameter.<locals>.<genexpr>  s     :$!QqAv:   )r"   ro   r>  r   r  )re   rA  rX  s     @r6   =test_parallel_return_order_with_return_as_generator_parameterra    sd    
 qJ+XV{)++E;@8+EEF
 &\F:#j&"9::::r8   )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>  s&      14'(GDJJ"14s   )+   )r   r.  rX   r"   )re   r5   delayst_startdts        r6   test_abort_backendri    sy     UbTCZF			 4))+00 14,214 	44 
w	B7N74 4s   /A00A9c                 X    t        j                  t        d      t              }d|d<   |S )Ng    Ar3  Fr   )r   r5  intbool)rD  rA  s     r6   get_large_objectrm    s$    WWS\.FF1IMr8   c                     t        || d      5 } |d t        d      D              }t        |       t        |       ~t                d d d        y # 1 sw Y   y xY w)Nr[  )re   r5   r\  c              3   F   K   | ]  } t        t              |        y wr:   )r#   rm  rh   s     r6   rk   z/test_deadlock_with_generator.<locals>.<genexpr>  s     J13'"23A6Jrl   r   )r"   ro   nextr   )r5   re   r   rA  s       r6   test_deadlock_with_generatorrq    sW     
'
) ,4Jb	JJVV 	  s   :AAc                 L   t        t        d      5  t        || d      } |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   r[  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   re   r   grg  gen2s         r6   test_multiple_generator_callrz    s     
A
C <FG{K:b	::))+;c
;;< 99; 1$ 	$$
 	
 O!< <s   ABB#c                 x   t        || d      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[  rt  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   rs  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   rw  )r"   ro   rX   r   r   r   )r5   re   r   rx  rg  g2s         r6   $test_multiple_generator_call_managedr    s     
&''
) 
,4;r;;))+LEG 	>=%*==B	>
 yy{W$q( 	
(	
(
  	
O	> 	>	
 
s#   >B0B$&)B0$B-	)B00B9c           
      4    t        || d      d t        d      D              } t        || d      d t        dd      D              }t        d t        |t        d            D              sJ t        d t        |t        dd            D              sJ y )	Nr[  rt  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"#a1fA   "$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"#a1fBr  re  c              3   ,   K   | ]  \  }}||k(    y wr:   r;   ri   r   rj   s      r6   rk   z9test_multiple_generator_call_separated.<locals>.<genexpr>0  s     8FCsax8r`  c              3   ,   K   | ]  \  }}||k(    y wr:   r;   r  s      r6   rk   z9test_multiple_generator_call_separated.<locals>.<genexpr>1  s     =FCsax=r`  )r"   ro   r   r  )r5   re   rx  r~  s       r6   &test_multiple_generator_call_separatedr  %  s     	AK@ A',RyA 	A 
B&'[	A B',R}B 
B 8c!U2Y&78888=c"eBm&<====r8   zbackend, error))r,   T)r-   F)
sequentialFc                 2   | dk(  rt         t        j                  d       t        d| d      } |d t	        d      D              }t        j                  |d       }|rt        t        d	
      n	t               }|5  t        j                         } t        d| d      d t	        dd      D              }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[  rt  c              3   F   K   | ]  } t        t              d         ywr  r   rh   s     r6   rk   z<test_multiple_generator_call_separated_gc.<locals>.<genexpr>A  s     7#7rl   r   c                      t        d      S )NzGenerator collected)r   r;   r8   r6   <lambda>z;test_multiple_generator_call_separated_gc.<locals>.<lambda>B  s    u-B'C r8   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>M  s&      @
&'MGDM!q&!@
r  re  c              3   ,   K   | ]  \  }}||k(    y wr:   r;   r  s      r6   rk   z<test_multiple_generator_call_separated_gc.<locals>.<genexpr>T  s     @Q3!8@r`  r   r   rm   r   g      ?)r   r   r  r"   ro   weakreffinalizer   r   r   rX   r   r   r  aliver   r  r  )r5   errorr   rx  g_wrr  rg  retrys           r6   )test_multiple_generator_call_separated_gcr  4  s    	6
./ 7kBH7U2Y77AACDD  	|#EF!m  
 A
 ))+?HQ;? @
+0R=@
 
 	@#ar2*?@@@@A 99; 1$$$ E
**


2 ** 99; 1$$$!x!!#q( !!!! )1A A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   r9  r5   temp_folderc              3   F   K   | ]  } t        t              |        y wr:   r;  r<  s     r6   rk   z(test_memmapping_leaks.<locals>.<genexpr>q  s     	Gq
',

"	Grl   r   r   c              3   D   K   | ]  } t        t                       y wr:   r#   r*  r   s     r6   rk   z(test_memmapping_leaks.<locals>.<genexpr>{  s     	7
"'/
"
$	7r  r   r   z/temporary directory of Parallel was not removedr8  c              3   F   K   | ]  } t        t              |        y wr:   r;  r<  s     r6   rk   z(test_memmapping_leaks.<locals>.<genexpr>  s     C1glACrl   c              3   D   K   | ]  } t        t                       y wr:   r  r   s     r6   rk   z(test_memmapping_leaks.<locals>.<genexpr>  s     3Qgo 3r  )
r  r"   r   r  r   r  listdirro   r   AssertionError)r5   r  r   r   s       r6   test_memmapping_leaksr  e  sK    ^^F 
q'$
& 8)*		GRYY-=-=b-A,BQ,F	GG 2::f%&*** 	
	7eAh	778  3Z Pzz&!b	P
 NOO 	a9AC)9)9")=(>(BCC3%(333Z Pzz&!b	P
 NOOC8 8s   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>  s
    !q& r8   Nr  rh   s     r6   rk   z)test_lambda_expression.<locals>.<genexpr>  s#      29)*! !!$29s   r   rn   )r5   r   rj   s      r6   test_lambda_expressionr    sL     2ha1 29.3Bi29 9GuRy1!qAv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:   rd  ri   rj   	task_times     r6   rk   z6test_backend_batch_statistics_reset.<locals>.<genexpr>  "     >gdjj)$>   ),c              3   \   K   | ]#  } t        t        j                               % y wr:   rd  r  s     r6   rk   z6test_backend_batch_statistics_reset.<locals>.<genexpr>  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    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    s     
4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
4 	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;   rt  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;   rt  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  rg  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    s   #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!$ 

	 K24kJK KG< <" $K K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 	E.D	E 	E # #$ $: :	: 	:	E 	E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   r
  r  s     r6   rk   z*_recursive_backend_info.<locals>.<genexpr>7  s2      ' 5G34O519OO 'r  r   )r"   r`   r   rN   r  ro   )r  r
  r   
this_levelr   s   ``   r6   r  r  0  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&zThis test requires daskc                    t        j                  dd      }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 y # 1 sw Y   oxY w# 1 sw Y   :xY w)
NrA   )	n_workersthreads_per_workerg    cAr3  dask)datar   c              3   ,   K   | ]  \  }}|d k(    ywDaskDistributedBackendNr;   ri   r   r   s      r6   rk   z4test_nested_parallelism_with_dask.<locals>.<genexpr>`  s"      <tQ 33 <r`  c              3   ,   K   | ]  \  }}|d k(    ywr  r;   r  s      r6   rk   z4test_nested_parallelism_with_dask.<locals>.<genexpr>g  s"      84 // 8r`  )
distributedClientr   r5  rk  rG  ro   r  r   r   )rw   clientr  rj   r  s        r6   !test_nested_parallelism_with_daskr  T  s     !BF 773s8288,D1X <V_ 	J'>D'I$	J+,111 <":< < 	< <	< 
 =#:#< ='(A--- 868 8 8 8	J 	J= =s   CC#C 	#C,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>m  s     G2g124Gr  rA   rn   )nesting_limits    r6   r  r  k  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   BaseExceptionr  r   &joblib.externals.loky.process_executorr  r,  r   r   r   RecursionError)rw   r5   ri  excr  s        r6   test_thread_bomb_mitigationr  p  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_sumr
    sB    H3 , 

s+, \#&&&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#   r
  r   s     r6   rk   z-test_parallel_thread_limit.<locals>.<genexpr>  s!      2)*"!"$2r  r   _THREADSr  1)r"   ro   rs  r(   itemsendswithr   )r5   r   expected_num_threadsworker_env_varsomp_num_threadsr   r   s          r6   test_parallel_thread_limitr    s     2ha1 2.3Ah2 G y{a/3,3 $("6666*002 	$KD%}}Z($8 9999|+++|#|	$$r8   z%This test requires dask NOT installedc                 `    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_installedr    s+     

"7	8   s   	$-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   r
  s      r6   rq  z=test_zero_worker_backend.<locals>.ZeroWorkerBackend.configure      r8   Nc                     t        d      )NzNo worker availabler   )rG   funccallbacks      r6   r  z?test_zero_worker_backend.<locals>.ZeroWorkerBackend.apply_async  s    455r8   c                      yr_   r;   rt  s     r6   r'   zDtest_zero_worker_backend.<locals>.ZeroWorkerBackend.effective_n_jobs  r  r8   r:   )rN   rO   rP   rq  r  r'   r;   r8   r6   ZeroWorkerBackendr    s    		6	r8   r   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>  s     @!{wr{1~@rl   )r   r   r   r   r"   ro   )rw   r   expected_msgs      r6   test_zero_worker_backendr#    s    ,  <L	"$	% A]]<|< 	AHA@uQx@@	AA A	A 	AA A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_globals  s    !!r8   rA   ry   c              3   >   K   | ]  } t                       y wr:   r  ri   rj   r'  s     r6   rk   z<test_globals_update_at_each_parallel_call.<locals>.<genexpr>  !      14%& 14   zchanged valuec              3   >   K   | ]  } t                       y wr:   r  r)  s     r6   rk   z<test_globals_update_at_each_parallel_call.<locals>.<genexpr>  r*  r+  )r&  r"   ro   r  )workers_global_variabler'  s    @r6   )test_globals_update_at_each_parallel_callr.    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  threadpoolctlr0  )r   rH   r0  s      r6   _check_numpy_threadpool_limitsr3    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:    sJ    $ 0$Z(@@ //0 Df\*, ,r8   c                 f    | D ],  }|D ]%  }t        ||      }t        ||      |h}|d   |v r%J  . y )Nr6  )r:  min)workers_infor8  r6  child_threadpool_infor7  parent_max_num_threadsr   s          r6   check_child_num_threadsr@    sX     ". ;1 	;L%@k&+"K)?@+NH.(:::		;;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 BLASmsgr,   )r5   re   c              3   D   K   | ]  } t        t                       y wr:   r#   r3  rh   s     r6   rk   z;test_threadpool_limitation_in_child_loky.<locals>.<genexpr>  s%      GE67/./1GEr  rA   r   
r3  r   r   r  r"   ro   r'   rs  r(   r@  )re   r8  workers_threadpool_infosexpected_child_num_threadss       r6   (test_threadpool_limitation_in_child_lokyrJ    s     12K
;1@AFxvF GE;@8GE  E f%F!$Y[F%:A!>4k68r8   inner_max_num_threads)r   rA   r   NrA   c                 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   rB  rC  r,   rK  ry   c              3   D   K   | ]  } t        t                       y wr:   rF  rh   s     r6   rk   z>test_threadpool_limitation_in_child_context.<locals>.<genexpr>*  s#      ;I:;3G235;Ir  rA   r   rG  )rw   re   rK  r8  rH  rI  s         r6   +test_threadpool_limitation_in_child_contextrO    s     12K
;1@A	/D	E I#:86#: ;I?DQx;I $I I f%F$%()>%B"%:"4k68I Is   #BB"var_name)r  r  r   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  r  r  )rP  s    r6   _get_envz>test_threadpool_limitation_in_child_override.<locals>._get_envE  s    zz~~h''r8   4ry   c              3   @   K   | ]  } t                      y wr:   r  ri   rj   rU  rP  s     r6   rk   z?test_threadpool_limitation_in_child_override.<locals>.<genexpr>L  s#      *;,-GHh'*;r  rA   r,   r   rM  c              3   @   K   | ]  } t                      y wr:   r  rX  s     r6   rk   z?test_threadpool_limitation_in_child_override.<locals>.<genexpr>Q  s#      .?01!!(+.?r  r  )r   shutdownr  r  r  r"   ro   )rw   re   rP  original_var_valuer   rU  s     `  @r6   ,test_threadpool_limitation_in_child_overrider\  7  s    %..0( 16"

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

8$#5BJJx 	? 	? %

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>d  s     CAQCr   )ro   r"   )re   r<   s    @r6   parallel_callz.test_loky_reuse_workers.<locals>.parallel_callb  s%    "ICrCCr8   TrR  r   )r   ro   )re   ra  first_executorr   executors        r6   test_loky_reuse_workersrd  \  sQ    D
 &*6N 2Y *f(t4>)))*r8   )F)r   r   )rm   r:   )rQ   r  r   rX   rK  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   r   r   posixImportError _openmp_test_helper.parallel_sumr   r  joblib._parallel_backendsr   r   r   r    r!   joblib.parallelr"   r#   r$   r%   r&   r'   r(   r)   r*   r/  RETURN_GENERATOR_BACKENDSpopsortedkeysALL_VALID_BACKENDSPROCESS_BACKENDSPARALLEL_BACKENDShasattrr  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  r"  r@  rK  rS  rW  r[  ra  rd  r   rl  rn  rv  ry  r|  r  r  r  r  extendro   r  r  r  r  r  r  _parallel_backendsr  r  r  r  r  r  r  r  r  r  r  r  r  r  SQUARE_LOCALSQUARE_LAMBDAr  r  r  r  r  r  r  r#  r$  r(  r*  r0  rB  rE  rR  rV  rY  ra  ri  rm  rq  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  no_coverr  r
  r  r  r#  r.  r3  r:  r@  rJ  rO  r\  rd  )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 Y)*9 +9 Y)*3 + 3 Y()A" * A"H' Y!) / 0  J K
LMM "  Y)* + :4 Y()3 * 3=9
>
 Y)*CD- E + -*+ 
 Y*+J ,J%	4 $=>9 ?9;* $5Q#7     ' '$)!H-q-
 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-; .; Y*+X~& ' , Y12X~& ' 3  Y12X~& ' 3. Y12X~& ' 30 Y12X~&
> ' 3
>    
)"
)"X Y()(P *  (PV Y%'Zt[!.2	2 Y()9 * 9( Y*:;<+ = +\ Y*:;<3K =3KlE*	' Y-.Y*:;<A = / A* t$=>Y*:;<8 = ? 8(H
 Y*:;<&+1F+ = 
+0' Y2>$vG%BC$ D H$ 468Y*:;< =8
 Y*:;<A =A&=B,	; X~&8 '  8& $o6X2wY*:;<8 =   7  
82 X2wZ - . Y*:;<6 =.   6> Xz"* # *e9  E
  L
  K. L\ .sB   e e% e3 /ffe"!e"%e0/e03e>=e>