
    e!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Zddl	m
Z
 ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlZddlZdd	lmZmZmZ dd
lmZ ddlmZmZmZmZ ddl m!Z!m"Z"m#Z#m$Z$m%Z% ed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/m0Z0m1Z1m2Z2m3Z3m4Z4 ddl5m6Z6m7Z7m8Z8m9Z9m:Z:mZm;Z;m<Z<m=Z=  e6j|                         Z?e?j                  dd       dg eA e6j                               z   ZCeCe6D  cg c]  }  e6|            c} z  ZCeg ZDnddgZDeDdgz   ZE eFed      r!eCj                   ej                  d             d ZId ZJd ZKd ZL G d deM      ZNddZOd  ZPdd!ZQd" ZRd# ZSd$ ZTd% ZU e"d&e<e;g      ej                  jE                  d'd(d) e:d)*      fd+gg d,-      ed.                      ZW e"d/eC       e"d0g d1       e"d2g d3      d4                      ZX e"d/eC       e"d0dd5g      d6               ZY e"d/eC      d7        ZZd8 Z[e e"d9g d:      d;               Z\e e"d/g d<      d=               Z]d> Z^ e"d?e6       e"d@e6      dA               Z_dB Z`edC        ZadD Zb e"d0g dE      dF        Zc e"d/eE      dG        ZdedH        Zeee e"dIg dJ       e"dKddLg      dM                             Zf e"d/eE      dN        Zge e"d/eE      dO               Zhe e"d/ eie?      dPhz
         e"dQdRdSg      dT                      Zje e"d/eD      dU               Zke e"d/e6      dV               ZldW Zm e"d/e6       e"dXdg dYfdZg d[fg      d\               Zne e"d/eE      d]               Zod^ Zpe e"d/eD      d_               Zqd` Zrda Zsdb Zte e"d/eE      ej                  j                  dcd      de                      Zv G df dge3      Zwdh Zx e"d/eC      di        Zye e"d/eE       e"d0g dj      dk                      Zzdl Z{dm Z| e$edudnd      do        Z}dp Z~eEdd Zej                   edq      D cg c]  }dr|z  	 c}       e e"d/e       e"d&e;e<g      ds                      Z G dt due3      Z e"d&e<e;g      dv        Z e"d&e<e;g      dw        Zdx Zdy Z G dz d{ej                  j`                        Z e=d|e       e e"d/g d}       e"d&e<e;g      d~                      Ze e"d0g d       e"d/eE       e"d&e<e;g      d                             Zd Ze e"deE       e"deE       e"d&e<e;g      d                             Ze e"d&e<e;g       e"dddg      d                      Z e"dg d      d        Z e"dg d      d        Zed        Zee e"d/eD      d                      ZdZe e"d/eD      d               ZdZdZdZdZe e"d/eDeg ndgz          e"deeeg       e"dg d      d                             Zdj5                  ej6                  j9                  ej6                  j9                  ej:                                    Zed        Zdj5                  ej6                  j9                  ej6                  j9                  ej:                                    Zed        Zd Zd Zee e"d/eD      d                      Zd Zeed               Zd Zd Zej                  jE                  d0g d      d        Zd Zd Zej                  jE                  d0d5dZg      e e"d/ eie?      dPhz
        d                      Z e"d/eC       e"d0g d      d               Zd Zd Ze e"d/e?       e"dQdRdSg       e"d0g d      d                             Z e"d/e?       e"dQdRdSg       e"d0g d      d                      Z e"d/e?       e"dQdRdSg       e"d0g d      d                      Z e"d/e?       e"ddRdSg       e"ddRdSg       e"d0g d      d                             Z e"dg d       e"ddRdSg       e"ddRdSg      d                      Zee e"d/eD      d                      Z e"d/eddgng d      d        Ze e"d/eD      d               Ze e"d&e<e;g      d               Z e"d&e<e;g      d        Zd ZddZe e"d/ddg       e"d&e<e;g      d                      ZddZej                  j|                   e"d&e<e;g       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Ĭd      dń               Z e"d&e<e;g       e$e.dudƬd      dǄ               Z e"d&e<e;g      dȄ        ZdɄ Zdʄ Zd˄ Zd̄ Zee e"d0g d͢      d΄                      Zee e"dg dТ       e"d0d5d)g       e"d&e<e;g      dф                                    Ze e"d0d5d)g       e"dg dӢ       e"d&e<e;g      dԄ                             Ze e"d0g dբ      dք               Zdׄ Zdd؄Ze e"d0d5dZg       e"d/eD       e"d&e<e;g      dل                             Ze e"d0d5dZg       e"d/eD      dڄ                      Zeej                  jE                  d0d5dZg      dۄ               Zeej                  jE                  d0d5dZg      d܄               Zy# e+$ r dZ*Y 
yw 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)nullcontext)sqrtTimeoutError)PicklingError)sleep)format_exception)dumploadparallel)mp)IS_GIL_DISABLEDnpwith_multiprocessing
with_numpy)check_subprocess_callparametrizeraisesskipifwarns)get_reusable_executor)Queue   )parallel_sum)LokyBackendMultiprocessingBackendParallelBackendBaseSequentialBackendThreadingBackend)	BACKENDSParallel	cpu_countdelayedeffective_n_jobsr   parallel_backendparallel_configregister_parallel_backendmultiprocessingloky	threadingget_contextspawnc                  0    t         t        j                     S N)r    r   DEFAULT_BACKEND     a/var/www/html/diagnosisapp-backend/venv/lib/python3.12/site-packages/joblib/test/test_parallel.pyget_default_backend_instancer3   ^   s    
 H,,--r1   c           	      2    t        | dt        | dd             S )N_pool_workers)getattrbackends    r2   get_workersr:   f   s    7GWWj$%GHHr1   c                     | |z  S r.   r0   )xys     r2   divisionr>   j   s    q5Lr1   c                     | dz  S N   r0   r<   s    r2   squarerC   n   s    a4Kr1   c                       e Zd ZdZd Zy)MyExceptionWithFinickyInitz,An exception class with non trivial __init__c                      y r.   r0   )selfabcds        r2   __init__z#MyExceptionWithFinickyInit.__init__u   s    r1   N__name__
__module____qualname____doc__rL   r0   r1   r2   rE   rE   r   s
    6r1   rE   Fc                 <    | dk(  r|rt        dddd      t        | S )N   rH   rI   rJ   rK   )rE   
ValueError)r<   custom_exceptions     r2   exception_raiserrV   y   s4    Av   'sCc:	
 	

 Hr1   c                 8    t        j                  d       t        )Ng?)timer   KeyboardInterruptrB   s    r2   interrupt_raiserrZ      s    JJt
r1   c                     | dz  |z   |z   S )zNA module-level function so that it can be spawn with
    multiprocessing.
    rA   r0   )r<   r=   zs      r2   fr]      s     a4!8a<r1   c                  B    t        t        j                         d         S Nr   )typer   get_active_backendr0   r1   r2   _active_backend_typerb      s    ++-a011r1   c                 H     t        | |      d t        d      D              S )Nn_jobsr9   c              3   F   K   | ]  } t        t              |        y wr.   r#   rC   .0is     r2   	<genexpr>z parallel_func.<locals>.<genexpr>   s       : :   !   r!   range)inner_n_jobsr9   s     r2   parallel_funcrq      s)    98<9 :$)!H:  r1   c                  "    t               dkD  sJ y r_   )r"   r0   r1   r2   test_cpu_countrs      s    ;??r1   c                  "    t               dkD  sJ y r_   r$   r0   r1   r2   test_effective_n_jobsrv      s    !!!r1   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      r2   test_effective_n_jobs_Noner      sQ     
^	4 @  t,???@
 4(A---@ @s	   8Ar9   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   r9   r   c              3   F   K   | ]  } t        t              |        y wr.   rg   ri   r<   s     r2   rk   z'test_simple_parallel.<locals>.<genexpr>   s     +Qogfoa+rl   ro   rC   r!   )r9   re   r   r<   s       r2   test_simple_parallelr      sP      %Qx(!F1I( -Hw-+%(+-, , , ,(s   ArA   c           	         d}t        j                  d      } G d dt              } ||| d      } |t        |      D cg c]  } t	        t
              |       c}       t               }|j                  D ]=  }|j                  |      x}	s|	j                         \  }
}|j                  ||
z
         ? t        |      dk(  sJ y c c}w )Nr   z(Done\s+\d+ out of \d+ \|)c                       e Zd Zg Zd Zy)/test_parallel_pretty_print.<locals>.ParallelLogc                 :    | j                   j                  |       y r.   )messagesappend)rG   msgs     r2   _printz6test_parallel_pretty_print.<locals>.ParallelLog._print   s    MM  %r1   N)rN   rO   rP   r   r   r0   r1   r2   ParallelLogr      s    	&r1   r   i'  r   r   )recompiler!   ro   r#   r]   setr   searchspanaddlen)r9   re   n_taskspatternr   executorrj   lensmessagesrH   rI   s               r2   test_parallel_pretty_printr      s     Gjj67G&h & &'5IHU7^4jgajm455D$$ w''1'668DAqHHQUO t9>> 5s   Cc                 .   |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]5  }dt        |j                        vrt        |j                  t              s|7 }}| dv st        | t              r)d}|D cg c]  }|t        |j                        vs| }}t        |      dk(  sJ y # 1 sw Y   xY wc c}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     r2   rk   z6test_main_thread_renamed_no_warning.<locals>.<genexpr>   s       6
#$OGFOA6
rl   rm   )r   r      zworker timeout)Nr(   z3multi-threaded, use of fork() may lead to deadlocksr   )setattrr*   current_threadwarningscatch_warningsr!   ro   strr   
isinstanceDeprecationWarningr   r   )r9   monkeypatchwarninforesultswmessage_parts         r2   #test_main_thread_renamed_no_warningr      s"    '')1   
	 	 	- $5(!W5 6
(-a6
 
 )###	$ 3qyy>1199&89 	
H  ++z'0 M'N!<s199~+MANN
 x=A9$ $ Os   -D7:DD*DD
c                 `   t        j                  d      5 }t        j                  d       t        | |       d d d        D cg c]  }|j                   }}|r=|r:t        d |D              }t        rt        |      dk\  nt        |      dk(  }|xr |S y|rJ y# 1 sw Y   fxY wc c}w )NTr   always)r9   rp   c              3   >   K   | ]  }d |j                   d   v   yw)zbacked parallel loops cannotr   N)args)ri   eachs     r2   rk   z)_assert_warning_nested.<locals>.<genexpr>
  s#      'CG.$))A,>'   r   F)r   r   simplefilterrq   r   allr   r   )r9   rp   expectedr   r   warnings_are_correctwarnings_have_the_right_lengths          r2   _assert_warning_nestedr     s    		 	 	- Bh'gLAB $,,a		,H,#& 'KS' $  '6H"3x=A;M + (J,JJ|)B B -s   #BB+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(  rt        |      sJ y t        |      sJ y )NrA   rd   c              3   N   K   | ]  } t        t              d d        yw)r   Fr9   rp   r   Nr#   r   ri   _child_backends     r2   rk   z0test_nested_parallel_warnings.<locals>.<genexpr>(  s4      /  	(&'!E	
 	
/   "%r   c              3   N   K   | ]  } t        t              d         yw)rA   r   Nr   )ri   r   r   r   s     r2   rk   z0test_nested_parallel_warnings.<locals>.<genexpr>0  s4      5  	(&'!H	
 	
5r   r*   )r!   ro   anyr   )parent_backendr   r   ress    `` r2   test_nested_parallel_warningsr     sq     /HA~. / q	/  5(!^
4 5 q	5 C $3xx3xxr1   )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     r2   rk   zPtest_background_thread_parallelism.<locals>.background_thread.<locals>.<genexpr>F  s     Eq~wu~c2Erl   r   r   )r   r   r!   ro   printr   )is_run_parallelr   s     r2   background_threadz=test_background_thread_parallelism.<locals>.background_threadD  sc    $$D1 	FXHAEE!HEE	Fc(m ]a/	F 	Fs   #A((A1)r   r   r   )r*   Threadstartjoin)r9   r   r   ts       r2   "test_background_thread_parallelismr   ?  sH     gO0 	 18JKAGGIFFH1r1   c                 J     t        d|       d t        d      D               y )NrA   rd   c              3   F   K   | ]  } t        t              d         yw{Gz?Nrg   r   s     r2   rk   znested_loop.<locals>.<genexpr>Q  s     'P!(='Prl   rn   r8   s    r2   nested_loopr   P  s    'HAw''PuQx'PPr1   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     r2   rk   z#test_nested_loop.<locals>.<genexpr>W  s#      /01]+/   "rn   )r   r   s    `r2   test_nested_loopr   T  s'     /HA~. /5:1X/ r1   c                     t         r.   )rT   r8   s    r2   raise_exceptionr   \  s    
r1   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    r2   )test_nested_loop_with_exception_with_lokyr   `  su    	
	 WQ/ 	W8*gk*624LGO4LV4TUV	WW W	W 	WW W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     r2   rk   z1test_mutate_input_with_threads.<locals>.<genexpr>j  s      +P!NGAEEN1,=+Ps   %(N)r   r!   ro   full)r   s   @r2   test_mutate_input_with_threadsr   g  s5    aA+HA{++PuQx+PP668O8r1   )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     r2   rk   z'test_parallel_kwargs.<locals>.<genexpr>r  s%      ? 

1?   !#N)ro   r]   r!   )re   lstr<   s      r2   test_parallel_kwargsr   n  sO     )C"#!Aa1I#'>xv'> ?$'? (   #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     r2   rk   z3test_parallel_as_context_manager.<locals>.<genexpr>        =AZWQZQ//=r   c              3   J   K   | ]  } t        t              |d         ywr   r   r   s     r2   rk   z3test_parallel_as_context_manager.<locals>.<genexpr>  r   r   c              3   J   K   | ]  } t        t              |d         ywr   r   r   s     r2   rk   z3test_parallel_as_context_manager.<locals>.<genexpr>  s      9A++9r   )ro   r]   r!   _backendr   r:   )r9   r   r<   r   pmanaged_backends         r2    test_parallel_as_context_managerr  w  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)z`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    r2   
__reduce__z<test_parallel_pickling.<locals>.UnpicklableObject.__reduce__  s    u%%r1   N)rN   rO   rP   r  r0   r1   r2   UnpicklableObjectr	    s    	&r1   r  zthe task to sendmatchrA   r)   rd   c              3   R   K   | ]  } t        t                               y wr.   r#   id)ri   r   r  s     r2   rk   z)test_parallel_pickling.<locals>.<genexpr>  s%      +
12KGBK)+,+
   $'r   N)objectr   r   r!   ro   )r  s   @r2   test_parallel_picklingr    sS    &F & 
%8	9 
*6* +
6;Bi+
 	

 
 
s   &AA	byteorder)<>=
max_nbytes1Mc                    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    r2   inspect_byteorderz=test_parallel_byteorder_corruption.<locals>.inspect_byteorder  s    !''####r1      )rA   rm   i4rA   r)   )re   r9   r  c              3   @   K   | ]  } t                      y wr.   r#   )ri   r   r!  r<   s     r2   rk   z5test_parallel_byteorder_corruption.<locals>.<genexpr>  s&      G*+"!"1%G   rm   )
r   arangereshapeviewr   r  r!   ro   testingassert_array_equal)r  r  initial_np_byteorderresult
x_returnedbyteorder_in_workerr!  r<   s         @@r2   "test_parallel_byteorder_corruptionr0    s    
$ 			!V$))YKr*:;A77,,FXQ:F G/4QxG F ,2 5'
'"&::::"j&6&6&@&@@@@


%%a45r1   c                 h    t         t        d| d      d t        d      D                    dk(  sJ y )NrA      re   r9   timeoutc              3   F   K   | ]  } t        t              d         yw)gMbP?Nr   r   s     r2   rk   z0test_parallel_timeout_success.<locals>.<genexpr>  s       <*+u%<rl   r   )r   r!   ro   r8   s    r2   test_parallel_timeout_successr6    sD     	;HAw; </4Ry< 	

 		r1   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   r3  c              3   F   K   | ]  } t        t              d         ywr   Nr   r   s     r2   rk   z-test_parallel_timeout_fail.<locals>.<genexpr>  s       :
#$NGEN2:
rl   r   )r   r   r!   ro   r8   s    r2   test_parallel_timeout_failr:    sE     
	 
97D9 :
(-b	:
 	

 
 
	   %>A
sequential	return_as	generatorgenerator_unorderedc           
         t        t              5  t         t        d| |d      d t	        d      D                     d d d        t         t        d| |d      d t	        d      D                     y # 1 sw Y   8xY w)NrA   r   )re   r9   r=  r4  c              3   F   K   | ]  } t        t              d         ywr9  r   r   s     r2   rk   z<test_parallel_timeout_fail_with_generator.<locals>.<genexpr>  s"      R'(r"Rrl   r   c              3   F   K   | ]  } t        t              d         ywr   r   r   s     r2   rk   z<test_parallel_timeout_fail_with_generator.<locals>.<genexpr>  s"      M
%&NGEN4 M
rl   )r   r   listr!   ro   r9   r=  s     r2   )test_parallel_timeout_fail_with_generatorrE    s     
	 
QHAw)SQ R,1"IR 	

 	L7iL M
*/)M
 	

 
s   /A66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     r2   rk   z%test_error_capture.<locals>.<genexpr>  %      >'(

1"">r   c              3   J   K   | ]  } t        t              |d         ywr   r   r   s     r2   rk   z%test_error_capture.<locals>.<genexpr>  rH  r   ry   r   )re   r   c              3   J   K   | ]  } t        t              |d         yw)T)rU   Nr#   rV   rh   s     r2   rk   z%test_error_capture.<locals>.<genexpr>+  s#     TQ&W%&q4@@Tr   r2  )r   r   ZeroDivisionErrorr!   zipr#   r>   rY   rZ   r:   r  ro   r]   
_iteratingn_completed_tasksn_dispatched_tasks	_abortingrE   )r9   r<   r=   r   original_workerss        r2   test_error_capturerS    s   
 
~%& 	/HAw/585HITQ""1a(I	
 %& 	/HAw/7=>!*)*1->	 Q0 #	Hx001===*8+<+<=)* Tc&&>QRda+'(+Aq1RST
 x001=== x0019IIII',Ry1!Aa1I1X >,1"I> 6     +8+<+<=)* IG13'"23A6GHI x001=== x0019IIII',Ry1!Aa1I1X >,1"I> 6   ##**++""	 9#	N 8,,-555%& 	OHAfM 9(8 9! <MN	O
 
!	" VFF@ST1-GH-a3TUV 
*	+ 
%1%T%PR)T	

 
u J	 	 ?	 	 ST T 2 HI I 29#	 #	T  N	O 	O UV V
 
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     r2   my_generatorz1test_error_in_task_iterator.<locals>.my_generator2  s1     r 	AH} !9::G	   &(rA   rd   rW  r  c              3   F   K   | ]  } t        t              |        y wr.   rg   rh   s     r2   rk   z.test_error_in_task_iterator.<locals>.<genexpr>;       CQogfoa Crl   )rX  c              3   F   K   | ]  } t        t              |        y wr.   rg   rh   s     r2   rk   z.test_error_in_task_iterator.<locals>.<genexpr>@  r\  rl   r   c              3   F   K   | ]  } t        t              |        y wr.   rg   rh   s     r2   rk   z.test_error_in_task_iterator.<locals>.<genexpr>D  s     DQogfoa Drl      r   )r!   r   rT   )r9   rY  r  s      r2   test_error_in_task_iteratorra  /  s     
G	, EJ&>? 	DC,*BCC	D
 J&>? 	DC,*BCC	D J&>? 	ED,*CDD	EE E	D 	D
	D 	D	E 	EE E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)r   )queueitems     r2   consumerre  G  s    	LL%&r1   zbatch_size, expected_queue)
Produced 0
Consumed 0
Produced 1
Consumed 1
Produced 2
Consumed 2
Produced 3
Consumed 3
Produced 4
Consumed 4
Produced 5
Consumed 5r   )rf  rh  rj  rl  rg  ri  rk  rm  rn  rp  ro  rq  c                     t               fd} t        d||       fd |       D               |k(  sJ t              dk(  sJ y)z=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   r   rj   rc  s    r2   producerz'test_dispatch_one_job.<locals>.producerx  0     q 	ALL*+G	   *-r   re   
batch_sizer9   c              3   J   K   | ]  } t        t              |        y wr.   r#   re  )ri   r<   rc  s     r2   rk   z(test_dispatch_one_job.<locals>.<genexpr>}  s%      ?()%#?    #   N)rC  r!   r   )r9   r{  expected_queuerw  rc  s       @r2   test_dispatch_one_jobr  K  sX    V FE
 ?HA*g> ?-5Z?  N"""u:r1   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	)zRCheck that using pre_dispatch Parallel does indeed dispatch items
    lazily.
    c               3   ^   K   t        d      D ]  } j                  d| z         |   y wrt  ru  rv  s    r2   rw  z/test_dispatch_multiprocessing.<locals>.producer  rx  ry  rA   r   rm   )re   r{  pre_dispatchr9   c              3   J   K   | ]  } t        t              d         yw)r   Nr}  )ri   r   rc  s     r2   rk   z0test_dispatch_multiprocessing.<locals>.<genexpr>  s'      F,-%'Fr~  r   rf  Nr   zConsumed anyrx   rl  r  )r   ManagerrC  r!   indexr   )r9   managerrw  queue_contentsfirst_consumption_indexproduced_3_indexrc  s         @r2   test_dispatch_multiprocessingr    s     jjlGLLNE
 FHA!!WE F19F  %[N!,,, -Ra066~F"R'''%++L95555u:r1   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*   rz  c              3   F   K   | ]  } t        t              |        y wr.   r  rh   s     r2   rk   z/test_batching_auto_threading.<locals>.<genexpr>       	.Q+'"+a.	.rl     r   r!   ro   r  compute_batch_size)r  s    r2   test_batching_auto_threadingr    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   r  rz  c              3   F   K   | ]  } t        t              |        y wr.   r  rh   s     r2   rk   z2test_batching_auto_subprocesses.<locals>.<genexpr>  r  rl   r  r   r  )r9   r  s     r2   test_batching_auto_subprocessesr    sV     
vw	? 31		.%+	..
 zz,,.2223 3 3r  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   r  r   c              3   F   K   | ]  } t        t              |        y wr.   rK  rh   s     r2   rk   z*test_exception_dispatch.<locals>.<genexpr>  s#      7
-.%G$%a(7
rl   r2  N)r   rT   r!   ro   r0   r1   r2   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.   rK  ri   js     r2   rk   z(nested_function_inner.<locals>.<genexpr>  s     G0w/03Grl   r2  rn   rj   s    r2   nested_function_innerr    s    HAGU2YGGr1   c                 H     t        d      d t        d      D               y )NrA   ry   c              3   F   K   | ]  } t        t              |        y wr.   )r#   r  r  s     r2   rk   z(nested_function_outer.<locals>.<genexpr>  s     LQ5w45a8Lrl   r2  rn   r  s    r2   nested_function_outerr    s    HAL%)LLr1   z'https://github.com/joblib/loky/pull/255reasonc                 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     r2   rk   z1test_nested_exception_dispatch.<locals>.<genexpr>  s#      ,
23*G)*1-,
rl   r2  N r  r  rV   )	r   rT   r!   ro   r	   r`   r   tbr   )r9   excinforeport_linesreports       r2   test_nested_exception_dispatchr    s     

	 
w+7+ ,
7<Ry,
 	

 $GLL'--LLWW\"F"f,,,"f,,,'''*,,,
 
s   $B((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       r2   	configurezFakeParallelBackend.configure  s     ++F3 r1   c                 X    |dk  r$t        t        j                         dz   |z   d      }|S )Nr   r   )maxr   r"   rG   re   s     r2   r$   z$FakeParallelBackend.effective_n_jobs  s*    A:!+f4a8Fr1   r   )r   )rN   rO   rP   rQ   r  r$   r0   r1   r2   r  r    s    B
r1   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-testingr8   )r   rT   r!   r&   r0   r1   r2   test_invalid_backendr    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 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   )r9   r  s     r2   test_invalid_njobsr    s6   	
	 Bw7+??AB3s7==7IIII	
	 DwW-AACD3s7==7IIII	
	 Fww/CCEF1S5GGGG	
	 Nww7KKMN1S5GGGGB BD DF FN N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     r2   rk   z.test_njobs_converted_to_int.<locals>.<genexpr>  s     21OGFOA2rl   r   c              3   >   K   | ]  \  }}|t        |      k(    y wr.   )rC   )ri   rj   rs      r2   rk   z.test_njobs_converted_to_int.<locals>.<genexpr>  s     9$!QqF1I~9r   )r!   _effective_n_jobsro   r   	enumerate)r9   re   r  r   s       r2   test_njobs_converted_to_intr    sS     	0A A%%%
2b	2
2C9)C.9999r1   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    r0   r1   r2   test_register_parallel_backendr    sE    %!.2EF)))'+>>>>^$H^$s	   ,7 	A c                  
   t         j                  } t               t               k(  sJ 	 t	        dt
        d   d       t               t        k(  sJ 	 | t         _        t               t               k(  sJ y # | t         _        w xY w)Nr*   T)make_default)r   r/   rb   r3   r'   r    r   )default_backend_origs    r2   test_overwrite_default_backendr  %  sw    #33!%A%CCCC8!+x/DSWX#%)9999 $8 !%A%CCCC $8 s   (A5 5BzOnly without multiprocessingc                     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)   r8   c              3   F   K   | ]  } t        t              |        y wr.   rg   rh   s     r2   rk   z2test_backend_no_multiprocessing.<locals>.<genexpr>4  s      F!3 Frl   rm   c              3   F   K   | ]  } t        t              |        y wr.   rg   rh   s     r2   rk   z2test_backend_no_multiprocessing.<locals>.<genexpr>8  s     8!?76?1%8rl   )r   UserWarningr!   ro   r&   r0   r1   r2   test_backend_no_multiprocessingr  1  sy    	{"M	N 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   
startswithr  )rw   backend_nameactive_backendactive_n_jobsr  s        r2   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     r2   rk   z/test_backend_context_manager.<locals>.<genexpr>c  s+      , 	/-.w:,r   )r    setitemr  rb   r3   r  r!    all_backends_for_context_manager)r   r9   rw   s     `r2   test_backend_context_managerr  T  s     hHg/BC!%A%CCCC!'73  !%A%CCCC ,HA{+ ,1,   !%A%CCCCr1   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     r2   rL   z%ParameterizedParallelBackend.__init__p  s    =788
r1   r.   rM   r0   r1   r2   r  r  m  s
    Cr1   r  c                 8   | 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   HxY wc c}w )Nparam_backend*   rm   )r  re   c              3   F   K   | ]  } t        t              |        y wr.   r#   r   rh   s     r2   rk   z=test_parameterized_backend_context_manager.<locals>.<genexpr>       7MGDM!$7rl   r   )r  r    r  rb   r3   r   ra   r`   r  r!   re   r  ro   r   )r   rw   r  r  r  r   rj   s          r2   *test_parameterized_backend_context_managerr  v  s   /3OP!%A%CCCC	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  !%A%CCCC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   HxY wc c}w )N+   )r  r   ry   c              3   F   K   | ]  } t        t              |        y wr.   r  rh   s     r2   rk   zFtest_directly_parameterized_backend_context_manager.<locals>.<genexpr>  r  rl   )rb   r3   r  r   ra   r`   r  r!   re   r  ro   r   )rw   r  r  r  r   rj   s         r2   3test_directly_parameterized_backend_context_managerr    s   !%A%CCCC 
-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  !%A%CCCC8 8 2s   BC9D9Dc                  @    t        d       t        j                         S )Nr   )r   osgetpidr0   r1   r2   sleep_and_return_pidr    s    	#J99;r1   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     r2   rk   z"get_nested_pids.<locals>.<genexpr>  s     P!;g&:;=P    )rb   r   r!   r  ro   r0   r1   r2   get_nested_pidsr    sM    !%5555 :'')Q... 81PuQxPPPr1   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    r2   r  zMyBackend.get_nested_backend  s     Y8:1==r1   )rN   rO   rP   rQ   r  __classcell__)r  s   @r2   r  r    s    D> >r1   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     r2   rk   z6test_nested_backend_context_manager.<locals>.<genexpr>  s     'Vq(@(@(B'Vr  r   r   )r!   ro   r   r   )rw   r9   
pid_groups	pid_groups       r2   #test_nested_backend_context_managerr    sc     
	 ,'XQ''VERTI'VV
# 	,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     r2   check_nested_backendz?test_nested_backend_in_sequential.<locals>.check_nested_backend  s@     $%2G)HHHH *.9z++-???r1   r   ry   c              3   ^   K   | ]$  } t              t        j                  d        & ywr   )r#   r   r/   )ri   r   r  s     r2   rk   z4test_nested_backend_in_sequential.<locals>.<genexpr>  s,      GH%$%h&>&>Bry  r   c              3   B   K   | ]  } t                      y wr.   r%  )ri   r   r9   r  re   s     r2   rk   z4test_nested_backend_in_sequential.<locals>.<genexpr>  s&      
?@)G()'6:
s   rn   )r9   re   rw   r  s   `` @r2   !test_nested_backend_in_sequentialr
    sm    @ HA LQRTI  
	( 
 
DI"I
 	

 
 
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)Nr9   r   )r&   r%   nesting_level)rw   inner_backendexpected_levelctxr9   s        r2   check_nesting_levelr    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     r2   rk   z-test_backend_nesting_level.<locals>.<genexpr>  s(      .DE$#$WmQ?.   !$r   ry   c              3   L   K   | ]  } t        t              d         ywr   r  r  s     r2   rk   z-test_backend_nesting_level.<locals>.<genexpr>  s(      
HI(G'(-C
r  )r  r!   ro   )rw   r  r  s   ` `r2   test_backend_nesting_levelr    sr     2-HA}- .INr.  
q	) 

 
MRSUY
 	

 
 
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    r2   retrieval_contextz;test_retrieval_context.<locals>.MyBackend.retrieval_context	  s     FFaKFr   N)rN   rO   rP   rj   supports_retrieve_callbackcontextmanagerr  )
contextlibr  s   r2   r  r    s&    %;"		"	"	 
#	r1   r  	retrievalc                 F     t        d      d t        |       D              S )NrA   ry   c              3   F   K   | ]  } t        t              |        y wr.   r  rh   s     r2   rk   z>test_retrieval_context.<locals>.nested_call.<locals>.<genexpr>  s     !CQ+'"+a.!Crl   rn   )ns    r2   nested_callz+test_retrieval_context.<locals>.nested_call  s    !xq!!C%(!CCCr1   rA   ry   c              3   @   K   | ]  } t              |        y wr.   r%  )ri   rj   r&  s     r2   rk   z)test_retrieval_context.<locals>.<genexpr>  s     Eq/7;/2Er&  r   r9   r   )r!  r   r'   r!   ro   r&   rj   r%   )rw   r  r  r  r!  r&  s    `  @@r2   test_retrieval_contextr(    s     $  k95D 
	 !EE!HEE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    r2   test_invalid_batch_sizer+    s'    	
	 (J'( ( (s   &/z)n_tasks, n_jobs, pre_dispatch, batch_size))rA   rA   r   r  )rA   rA   re   r  r   rA   re   r  )i  rA   re   r  r,  )r   r   re   r  )   r  re   r  )   r  
2 * n_jobsr   )   r  r   r   )r0  r  r/  rS   )r-  r  r/  r  c                     |||d}t        |       D cg c]  }t        |       }} t        di |d t        |       D              }||k(  sJ y c c}w )N)re   r  r{  c              3   F   K   | ]  } t        t              |        y wr.   rg   rh   s     r2   rk   z/test_dispatch_race_condition.<locals>.<genexpr>;  s      L!3 Lrl   r0   r   )r   re   r  r{  paramsrj   r   r   s           r2   test_dispatch_race_conditionr4  %  s\    ( JWF#(>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_kwargsget)mp_start_methodr  rw   start_methods       r2   test_default_mp_contextr;  ?  sO    ))+O#45A##I.G++-L?***r1   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     r2   rk   zAtest_no_blas_crash_or_freeze_with_subprocesses.<locals>.<genexpr>^  s&     'RA133(?'Rs   47)
r   r+   r   randomRandomStaterandnr>  r?  r!   ro   )r9   rngrH   s     @r2   .test_no_blas_crash_or_freeze_with_subprocessesrD  H  st     ## ..) ))


#C 			$AFF1accN (HAw''Rq'RRr1   a  from joblib import Parallel, delayed

def square(x):
    return x ** 2

backend = "{}"
if backend == "spawn":
    from multiprocessing import get_context
    backend = get_context(backend)

print(Parallel(n_jobs=2, backend=backend)(
      delayed(square)(i) for i in range(5)))
c                     | 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\]r4  stdout_regex)	r   r6  pytestskip,UNPICKLABLE_CALLABLE_SCRIPT_TEMPLATE_NO_MAINformatr   sys
executable)r9   codes     r2   2test_parallel_with_interactively_defined_functionsrQ  q  s[    
 ##(;(;(=(G.	
 8>>wGD	t$b?Tr1   a  import sys
# Make sure that joblib is importable in the subprocess launching this
# script. This is needed in case we run the tests from the joblib root
# folder without having installed joblib
sys.path.insert(0, {joblib_root_folder!r})

from joblib import Parallel, delayed

def run(f, x):
    return f(x)

{define_func}

if __name__ == "__main__":
    backend = "{backend}"
    if backend == "spawn":
        from multiprocessing import get_context
        backend = get_context(backend)

    callable_position = "{callable_position}"
    if callable_position == "delayed":
        print(Parallel(n_jobs=2, backend=backend)(
                delayed(square)(i) for i in range(5)))
    elif callable_position == "args":
        print(Parallel(n_jobs=2, backend=backend)(
                delayed(run)(square, i) for i in range(5)))
    else:
        print(Parallel(n_jobs=2, backend=backend)(
                delayed(run)(f=square, x=i) for i in range(5)))
z!def square(x):
    return x ** 2
zcdef gen_square():
    def square(x):
        return x ** 2
    return square
square = gen_square()
zsquare = lambda x: x ** 2
define_funccallable_position)r#   r   kwargsc           
         | 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)rR  r9   rS  joblib_root_folderzunpicklable_func_script.pyr   rG  rH  )SQUARE_MAINrN  platformrJ  rK  )UNPICKLABLE_CALLABLE_SCRIPT_TEMPLATE_MAINrM  r  pathdirnamejoblib__file__r   writer   rO  strpath)r9   rR  rS  tmpdirrP  	code_files         r2   0test_parallel_with_unpicklable_functions_in_argsrc    s     ..{"cllg&=/04;;+77??277??6??+KL	 < D 89IOOD	**+*r1   a  import sys
import faulthandler
# Make sure that joblib is importable in the subprocess launching this
# script. This is needed in case we run the tests from the joblib root
# folder without having installed joblib
sys.path.insert(0, {joblib_root_folder!r})

from joblib import Parallel, delayed
from functools import partial

class MyClass:
    '''Class defined in the __main__ namespace'''
    def __init__(self, value):
        self.value = value


def square(x, ignored=None, ignored2=None):
    '''Function defined in the __main__ namespace'''
    return x.value ** 2


square2 = partial(square, ignored2='something')

# Here, we do not need the `if __name__ == "__main__":` safeguard when
# using the default `loky` backend (even on Windows).

# To make debugging easier
faulthandler.dump_traceback_later(30, exit=True)

# The following baroque function call is meant to check that joblib
# introspection rightfully uses cloudpickle instead of the (faster) pickle
# module of the standard library when necessary. In particular cloudpickle is
# necessary for functions and instances of classes interactively defined in the
# __main__ module.

print(Parallel(backend="loky", n_jobs=2)(
    delayed(square2)(MyClass(i), ignored=[dict(a=MyClass(1))])
    for i in range(5)
))
)rW  c                     | j                  d      }|j                  t               t        t        j
                  |j                  gdd        y )Nz(joblib_interactively_defined_function.pyrG  )rI  r4  )r   r_  5INTERACTIVE_DEFINED_FUNCTION_AND_CLASS_SCRIPT_CONTENTr   rN  rO  r`  ra  scripts     r2   7test_parallel_with_interactively_defined_functions_lokyrh    s>    
 [[CDF
LLFG	(*r1   a  import sys
# Make sure that joblib is importable in the subprocess launching this
# script. This is needed in case we run the tests from the joblib root
# folder without having installed joblib
sys.path.insert(0, {joblib_root_folder!r})

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

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

l = MyList()

print(Parallel(backend="loky", n_jobs=2)(
    delayed(l.append)(i) for i in range(3)
))
c                     | j                  d      }|j                  t               t        t        j
                  |j                  gddd       y )Nz)joblib_interactive_bound_method_script.pyz\[None, None, None\]LokyProcess   )rI  stderr_regexr4  )r   r_  9INTERACTIVELY_DEFINED_SUBCLASS_WITH_METHOD_SCRIPT_CONTENTr   rN  rO  r`  rf  s     r2   :test_parallel_with_interactively_defined_bound_method_lokyrn    s?    [[DEF
LLJK	(,#	r1   c                  H    t        g       }  t        d      |       g k(  sJ y )NrA   ry   )iterr!   )exhausted_iterators    r2   %test_parallel_with_exhausted_iteratorrr  )  s'    b8101R777r1   c                     t        | t        j                        st        dt	        |             | j                         S )Nz#Expected np.memmap instance, got %r)r   r   memmap	TypeErrorr`   copy)rH   s    r2   check_memmaprw  .  s-    a#=tAwGG668Or1   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     r2   generate_arrayszBtest_auto_memmap_on_arrays_from_generator.<locals>.generate_arrays<  s3     q 	4A''"BJJ/!33	4s   <>rA   r   re   r  r9   c              3   F   K   | ]  } t        t              |        y wr.   r#   rw  ri   rH   s     r2   rk   z<test_auto_memmap_on_arrays_from_generator.<locals>.<genexpr>B  $      @%&a @rl   r   r   c              3   F   K   | ]  } t        t              |        y wr.   r  r  s     r2   rk   z<test_auto_memmap_on_arrays_from_generator.<locals>.<genexpr>K  r  rl   )r!   rM  r   r   r*  r+  )r9   r}  r   r-  r   s        r2   )test_auto_memmap_on_arrays_from_generatorr  4  s    4 @haAw? @*9#*>@ G  W)FG 8


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


%%h78r1   c                     | S r.   r0   )args    r2   identityr  R  s    Jr1   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uint8rz  r  )	mmap_moderA   ry   c              3   H   K   | ]  } t        t                      y wr.   )r#   r  )ri   r   rt  s     r2   rk   z.test_memmap_with_big_offset.<locals>.<genexpr>^  s     "J#478#4V#<"Jr   r`  r   )r   r`  mmapALLOCATIONGRANULARITYr   zerosr{  r
   r   r!   r   rt  offsetr*  r+  )ra  fnamesizeobjr-  rt  s        @r2   test_memmap_with_big_offsetr  V  s     KK$,,E%%D88D("''$g*F
GCe%3'F"""Jc"JJIVfQi+++!9d"""JJ!!#v.r1   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   r4  c              3   F   K   | ]  } t        t              |        y wr.   rg   rh   s     r2   rk   zFtest_warning_about_timeout_not_supported_by_backend.<locals>.<genexpr>f  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     r2   3test_warning_about_timeout_not_supported_by_backendr  d  s    		 	 	- M%1%%L%)%LLMx=AAaii---qyy>	  M Ms   $BBc                     || |<   |S r.   r0   )
input_listr  r   s      r2   set_list_valuer  q  s    JuLr1   )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   r>  r*   re   r=  r9   c              3   L   K   | ]  } t        t              ||        y wr.   )r#   r  )ri   rj   r  s     r2   rk   zPtest_parallel_return_order_with_return_as_generator_parameter.<locals>.<genexpr>|  s)      Q67
Aq1Qr  c              3   ,   K   | ]  \  }}||k(    y wr.   r0   ri   vr  s      r2   rk   zPtest_parallel_return_order_with_return_as_generator_parameter.<locals>.<genexpr>  s     :$!QqAv:   )r!   ro   rC  r   rM  )re   r-  r  s     @r2   =test_parallel_return_order_with_return_as_generator_parameterr  v  s^    
 qJPXV{KP Q;@8Q F
 &\F:#j&"9::::r1   c                 2    |rt        d       t        |       S )Nr2  )r   r   )edelays     r2   _sqrt_with_delayr    s    b	7Nr1   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 y )
Nr?  r  c              3   T   K   | ]   } t        t              |d z  |dk(         " yw)rA   r   N)r#   r  rh   s     r2   rk   zK_test_parallel_unordered_generator_returns_fastest_first.<locals>.<genexpr>  s/      W67! !!Q$a1WrZ  r   c              3   4   K   | ]  }t                y wr.   )next)ri   r   r-  s     r2   rk   zK_test_parallel_unordered_generator_returns_fastest_first.<locals>.<genexpr>  s     =qd6l=s   	   r   rA   c              3   ,   K   | ]  \  }}||k(    y wr.   r0   r  s      r2   rk   zK_test_parallel_unordered_generator_returns_fastest_first.<locals>.<genexpr>  s     S$!QqAvSr  )r!   ro   sortedrC  r   rM  )r9   re   quickly_returnedexpected_quickly_returnedr-  s       @r2   8_test_parallel_unordered_generator_returns_fastest_firstr    s~     WXV/DgV W;@9W F =E!H==!"d5B<&8 8S#&?AQ"RSSSSr1   c                     t        | |       y r.   )r  r9   re   s     r2   7test_parallel_unordered_generator_returns_fastest_firstr    s     =WfMr1   )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     r2   rk   z%test_abort_backend.<locals>.<genexpr>  s!     0XA1D1DQ1G0Xs   )+rV  )r   ru  rX   r!   )re   r9   delayst_startdts        r2   test_abort_backendr    sw     UbTCZF			 Y))+000XQW0XXY 
w	B7N7	Y Ys   /A00A9c                 X    t        j                  t        d      t              }d|d<   |S )Ng    Arz  Fr   )r   r{  intbool)r  r-  s     r2   get_large_objectr    s$    WWS\.FF1IMr1   c                     t        || |      5 } |d t        d      D              }t        |       t        |       ~d d d        y # 1 sw Y   y xY w)N)re   r9   r=  c              3   F   K   | ]  } t        t              |        y wr.   )r#   r  rh   s     r2   rk   z0_test_deadlock_with_generator.<locals>.<genexpr>  s     J13'"23A6Jrl   r   )r!   ro   r  )r9   r=  re   r   r-  s        r2   _test_deadlock_with_generatorr    sL     
I	F (Jb	JJVV	  s   0AAc                     t        | ||       y r.   )r  )r9   r=  re   s      r2   test_deadlock_with_generatorr    s    
 "'9f=r1   c                 8   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	       ~y # 1 sw Y   ,xY w)
N)This Parallel instance is already runningr  rD  c              3   F   K   | ]  } t        t              d         ywr   r   r   s     r2   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     r2   rk   z/test_multiple_generator_call.<locals>.<genexpr>  s     ;1A;rl   r   rA   [The error should be raised immediately when submitting a new task but it took more than 2s.)r   r  r!   ro   rX   )r9   r=  re   r   gr  gen2s          r2   test_multiple_generator_callr    s     
$O	P <FGyI:b	::))+;c
;;	< 99; 1$ 	$$
 	
< <s   ABBc                 f   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        ~y # 1 sw Y   5xY w# 1 sw Y   ~y xY w)
NrD  c              3   F   K   | ]  } t        t              d         ywr9  r   r   s     r2   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     r2   rk   z7test_multiple_generator_call_managed.<locals>.<genexpr>  s     =Q+'"+a.=rl   r   rA   r  )r!   ro   rX   r   r  )r9   r=  re   r   r  r  g2s          r2   $test_multiple_generator_call_managedr    s     
&'Y	? 

8;r;;))+L(ST 	>=%*==B	> yy{W$q( 	
(	
(

 	
	> 	>

 	
s#   >B&B&)B&B#	B&&B0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 )	NrD  c              3   L   K   | ]  } t        t              |d z          ywrA   Nr  rh   s     r2   rk   z9test_multiple_generator_call_separated.<locals>.<genexpr>  s&      A !adA   "$r   c              3   L   K   | ]  } t        t              |d z          ywr  r  rh   s     r2   rk   z9test_multiple_generator_call_separated.<locals>.<genexpr>  s&      B !adBr  rV  r?  c              3   ,   K   | ]  \  }}||k(    y wr.   r0   ri   r   rj   s      r2   rk   z9test_multiple_generator_call_separated.<locals>.<genexpr>  s     8FCsax8r  c              3   ,   K   | ]  \  }}||k(    y wr.   r0   r  s      r2   rk   z9test_multiple_generator_call_separated.<locals>.<genexpr>  s     =FCsax=r  )r!   ro   r  r   rM  )r9   r  r  re   r  r  s         r2   &test_multiple_generator_call_separatedr    s     	AK@ A%*2YA 	A 
B&'[	A B%*2r]B 
B ++1I++BZ8c!U2Y&78888=c"eBm&<====r1   zbackend, error))r)   T)r*   F)r<  Fc                 >   | 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              }|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   rD  c              3   F   K   | ]  } t        t              d         ywr9  r   rh   s     r2   rk   z<test_multiple_generator_call_separated_gc.<locals>.<genexpr>&  s     7#7rl   r   c                      t        d      S )NzGenerator collected)r   r0   r1   r2   <lambda>z;test_multiple_generator_call_separated_gc.<locals>.<lambda>'  s    u-B'C r1   z The executor underlying Parallelr  c              3   L   K   | ]  } t        t              |d z          ywr  r  rh   s     r2   rk   z<test_multiple_generator_call_separated_gc.<locals>.<genexpr>3  s&      @
$%MGDM!Q$@
r  rV  r?  c              3   ,   K   | ]  \  }}||k(    y wr.   r0   r  s      r2   rk   z<test_multiple_generator_call_separated_gc.<locals>.<genexpr>:  s     @Q3!8@r  r   r   rm   r   r  )r   rJ  rK  r!   ro   weakreffinalizer   r  r   rX   r  r   rM  aliver   r  rQ  )
r9   r  r  errorr   r  g_wrr  r  retrys
             r2   )test_multiple_generator_call_separated_gcr    s    	6
./ 7kBH7U2Y77AACDD  	|#EF] 
 
 A
 ))+?HQ;? @
).r2@
 
 //q	A@#ar2*?@@@@A 99; 1$$$ E
**


3 ** 99; 1$$$!x!!#q( !!!! )1A As   =A2FFc                 z   |j                   }t        dd| |      5 } |d t        j                  j                  d      gdz  D               t	        t        j                  |            dkD  sJ 	 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               t        d      D ]$  }t        j                  |      s y t        d       & t        d	      # 1 sw Y   xY w)NrA   r   )re   r  r9   temp_folderc              3   F   K   | ]  } t        t              |        y wr.   r  r  s     r2   rk   z(test_memmapping_leaks.<locals>.<genexpr>V  s     	Gq
',

"	Grl   r   r   r   r   z/temporary directory of Parallel was not removedr~  c              3   F   K   | ]  } t        t              |        y wr.   r  r  s     r2   rk   z(test_memmapping_leaks.<locals>.<genexpr>f  s     C1glACrl   )
r`  r!   r   r@  r   r  listdirro   r   AssertionError)r9   ra  r  r   s       r2   test_memmapping_leaksr  K  s!    ^^F 
q'v	N +RS		GRYY-=-=b-A,BQ,F	GG 2::f%&***	+ 3Z Pzz&!c
P
 NOO 	a9AC)9)9")=(>(BCC3Z Pzz&!c
P
 NOO1+ +s   AD11D:)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@   r0   rB   s    r2   r  z2test_lambda_expression.<locals>.<genexpr>.<lambda>v  s
    !Q$ r1   Nr%  rh   s     r2   rk   z)test_lambda_expression.<locals>.<genexpr>u  s"      2'("2s   r   rn   )r9   r   rj   s      r2   test_lambda_expressionr  p  sN    
 2ha1 2,1"I2 G U2Y/q!t/////s   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   r9   c              3   \   K   | ]#  } t        t        j                               % y wr.   r  ri   rj   	task_times     r2   rk   z6test_backend_batch_statistics_reset.<locals>.<genexpr>  "     >gdjj)$>   ),c              3   \   K   | ]#  } t        t        j                               % y wr.   r  r  s     r2   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)r9   re   n_inputsr  r  s       @r2   #test_backend_batch_statistics_resetr   {  s     FHhIFG<A>eHo>>::++qzz/W/WWWW	

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

++::66	7	7r1   c                    dD ]  }t        t        |      j                        t               u 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   r9   r  r  rm   r  r   )r`   r!   r  r3   r   r   re   )rw   re   r  s      r2   $test_backend_hinting_and_constraintsr    s     
4HF+4459U9WWWWF95AJJ#3333F;7AJJ;...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4<H#;H/<H;H #H,/H8;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.   r0   r  s    r2   apply_asynczgtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackend.apply_async      r1   c                     |S r.   r0   r  s     r2   r$   zltest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackend.effective_n_jobs      Mr1   NrN   rO   rP   supports_sharedmemuse_threadsr  r$   r0   r1   r2   MyCustomThreadingBackendr    s    !		r1   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.   r0   r  s    r2   r  zhtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackend.apply_async  r  r1   c                     |S r.   r0   r  s     r2   r$   zmtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackend.effective_n_jobs  r  r1   Nr  r0   r1   r2   MyCustomProcessingBackendr    s    "		r1   r  r  r   )re   r  r   zUsing ThreadingBackend as joblib backend instead of MyCustomProcessingBackend as the latter does not provide shared memory semantics.r9   r  )	r   r!   r`   r  
readouterrr   stripr   rT   )capsysrw   r  r  r  outerrr   s           r2   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8 	
 yy{h&&&byy%( 

	 K24kJK KK< <" (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   r0   r1   r2   ,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   Nr0   )r#   _recursive_backend_info)ri   rj   rT  r)  s     r2   rk   z*_recursive_backend_info.<locals>.<genexpr>  s2      
 -G+,G519GG
r  r   )r!   r`   r  rN   r  ro   )r)  rT  r  
this_levelr   s   ``   r2   r*  r*    s     
	 'qAJJ'00!**2J2JKL
A:' '  
1X
 
 GAJ&' ' 's   =B"BBc                      | |d      5  t               }d d d        |j                         dz   }|dfdddg}|k(  sJ y # 1 sw Y   ,xY w)NrA   ry   Backendr   )r   r   )r   rA   )r*  title)rw   r9   backend_types_and_levelstop_level_backend_typeexpected_types_and_levelss        r2   test_nested_parallelism_limitr2    si     
	# =#:#< = %]]_y8	#  	! $'@@@@= =s   AA
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     r2   rk   z&_recursive_parallel.<locals>.<genexpr>0  s     G2g124Gr  rA   rn   )nesting_limits    r2   r5  r5  .  s    8:GeAhGGGr1   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   BaseExceptionr5  r   &joblib.externals.loky.process_executorr8  r   r   rJ  xfailRecursionError)rw   r9   r  excr8  s        r2   test_thread_bomb_mitigationr>  3  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  environr8  r   )env_varsvars     r2   _run_parallel_sumrJ  O  sB    H 	, 

s+	, \#&&&r1   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#   rJ  r   s     r2   rk   z-test_parallel_thread_limit.<locals>.<genexpr>a  s!      2)*"!"$2r  r   _THREADSrF  1)r!   ro   r  r"   itemsendswithr   )r9   r   expected_num_threadsworker_env_varsomp_num_threadsr   r   s          r2   test_parallel_thread_limitrT  ^  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|+++|#|	$$r1   zThis test requires daskc                 `    t        t        d      5   | d       d d d        y # 1 sw Y   y xY w)NzPlease install daskr  dask)r   rT   )rw   s    r2   )test_dask_backend_when_dask_not_installedrW  o  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_   r0   )rG   r   rT  s      r2   r  z=test_zero_worker_backend.<locals>.ZeroWorkerBackend.configure{      r1   Nc                     t        d      )NzNo worker availabler   )rG   funccallbacks      r2   r  z?test_zero_worker_backend.<locals>.ZeroWorkerBackend.apply_async~  s    455r1   c                      yr_   r0   r  s     r2   r$   zDtest_zero_worker_backend.<locals>.ZeroWorkerBackend.effective_n_jobs  r\  r1   r.   )rN   rO   rP   r  r  r$   r0   r1   r2   ZeroWorkerBackendrZ  z  s    		6	r1   ra  z&ZeroWorkerBackend has no active workerr  rA   ry   c              3   F   K   | ]  } t        t              |        y wr.   r  rh   s     r2   rk   z+test_zero_worker_backend.<locals>.<genexpr>  s     @!{wr{1~@rl   )r   rJ  r   r  r!   ro   )rw   ra  expected_msgs      r2   test_zero_worker_backendrd  v  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_VARIABLEr0   r1   r2   check_globalsz@test_globals_update_at_each_parallel_call.<locals>.check_globals  s    !!r1   rA   ry   c              3   >   K   | ]  } t                       y wr.   r%  ri   rj   rh  s     r2   rk   z<test_globals_update_at_each_parallel_call.<locals>.<genexpr>  !      1%& 1   zchanged valuec              3   >   K   | ]  } t                       y wr.   r%  rj  s     r2   rk   z<test_globals_update_at_each_parallel_call.<locals>.<genexpr>  rk  rl  )rg  r!   ro   r   )workers_global_variablerh  s    @r2   )test_globals_update_at_each_parallel_callro    s     *" ?....0ha0 1*/(1  &',<+==== )?o---0ha0 1*/(1  &'O+<<<<r1   c                      dd l } | j                  j                  dd      } | j                  ||       t	        j
                  d      }|j                         S )Nr   r   threadpoolctl)numpyr@  rB  r>  rJ  importorskipthreadpool_info)r   rH   rq  s      r2   _check_numpy_threadpool_limitsru    sI    
 			S!A
BFF1aL''8M((**r1   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   rM  )child_moduleparent_infoparent_modules      r2   _parent_max_num_threads_forr|    sK    $ 0$Z(@@ //0 7>>|L r1   c                 f    | D ],  }|D ]%  }t        ||      }t        ||      |h}|d   |v r%J  . y )Nrx  )r|  min)workers_inforz  rx  child_threadpool_infory  parent_max_num_threadsr   s          r2   check_child_num_threadsr    sZ     ". ;1 	;L%@k&" K)?@+NH.(:::	;;r1   )rA   r   r   rx   c                     t               }t        |      dk(  rt        j                  d        t	        d|       d t        d      D              }t        |       } | dk(  r	|d   d	   }n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#   ru  rh   s     r2   rk   z;test_threadpool_limitation_in_child_loky.<locals>.<genexpr>  s#      G67/./1Gr  rA   r   rx  
ru  r   rJ  rK  r!   ro   r$   r  r"   r  )re   rz  workers_threadpool_infosexpected_child_num_threadss       r2   (test_threadpool_limitation_in_child_lokyr    s     12K
;1CDFxvF G;@8G   f%F{%0^M%B"%()>%B" +/Ir1   inner_max_num_threads)r   rA   r   Nc                 f   t               }t        |      dk(  rt        j                  d        | d|      5   t	        |      d t        d      D              }d d d        t        |      }|d	k(  r	|d   d
   }n|t        t               |z  d	      }n|}t        ||       y # 1 sw Y   LxY w)Nr   r  r  r)   r  ry   c              3   D   K   | ]  } t        t                       y wr.   r  rh   s     r2   rk   z>test_threadpool_limitation_in_child_context.<locals>.<genexpr>  s!      ;
:;3G235;
r  rA   r   rx  r  )rw   re   r  rz  r  r  s         r2   +test_threadpool_limitation_in_child_contextr    s     12K
;1CD	/D	E 
#:86#: ;
?DQx;
 $
 

 f%F{%0^M%B"		&%()>%B"%:" +/I
 
s   #B''B0var_name)rA  rB  r@  c                    t        |      dk(  rt        j                  d       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)Nr   zSkip test when n_jobs == 1Treusec                 @    t         j                  j                  |       S r.   )r  rG  r8  )r  s    r2   _get_envz>test_threadpool_limitation_in_child_override.<locals>._get_env  s    zz~~h''r1   4ry   c              3   @   K   | ]  } t                      y wr.   r%  ri   rj   r  r  s     r2   rk   z?test_threadpool_limitation_in_child_override.<locals>.<genexpr>"  s     )X!*;'(*;H*E)Xr&  rA   r)   r  c              3   @   K   | ]  } t                      y wr.   r%  r  s     r2   rk   z?test_threadpool_limitation_in_child_override.<locals>.<genexpr>&  s#      .01!!(+.r&  rN  )
r$   rJ  rK  r   shutdownr  rG  r8  r!   ro   )rw   re   r  original_var_valuer   r  s     `  @r2   ,test_threadpool_limitation_in_child_overrider    s'    1$01 %..0( 16"

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

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

8$#5BJJx s%   #AD .&DD DD )E)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     r2   rk   zAtest_loky_reuse_workers.<locals>.parallel_call.<locals>.<genexpr>:  s     CAQCr   )ro   r!   )re   r<   s    @r2   parallel_callz.test_loky_reuse_workers.<locals>.parallel_call8  s%    "ICrCCr1   Tr  r   )r   ro   )re   r  first_executorr   r   s        r2   test_loky_reuse_workersr  2  sQ    D
 &*6N 2Y *f(t4>)))*r1   c                 2    d| t        j                         <   y )Ninitialized)r  r  )statuss    r2   _set_initializedr  H  s    'F299;r1   c                 l   t        j                         }| j                  |d       }|dv s
J d|        |sy d| |<   t        j                         dz   }t	        | j                         D cg c]  \  }}|dk(  s| c}}      }t        j                         |k  ri||k  rdt        j                  d       t	        | j                         D cg c]  \  }}|dk(  s| c}}      }t        j                         |k  r||k  rdt        j                         |k\  rt        d      S c c}}w c c}}w )N)r  startedz2worker should have been in initialized state, got r  r2  r   z-Waited more than 30s to start all the workers)r  r  r8  rX   r   rO  r   r   )r  re   wait_workerspidstatedeadliner  	n_starteds           r2   _check_statusr  L  s   
))+CJJsD!E.. 
<UGD. F3Kyy{RHv||~HVS!iSHII
))+
 Y%7

36<<>LaQ)^LM	 ))+
 Y%7 yy{hJKKJ I Ms   ,D*
:D*
D0
D0
c                      t        j                         }|j                          || t        f      5   t	                fdt        d      D               d d d        y # 1 sw Y   y xY w)Nr9   re   initializerinitargsc              3   J   K   | ]  } t        t                      y wr.   r#   r  ri   rj   re   r  s     r2   rk   z+test_initializer_context.<locals>.<genexpr>s  s      Na)7=)&&9Nr~  r   )r   r  dictr  r!   ro   )re   r9   rw   r  r  s   `   @r2   test_initializer_contextr  c  sd    
 jjlG\\^F 
$	
 O 	
N5:NNO O Os   $A%%A.c                      t        j                         }|j                          t        | t        f       fdt        d      D               y )Nr  c              3   J   K   | ]  } t        t                      y wr.   r  r  s     r2   rk   z,test_initializer_parallel.<locals>.<genexpr>  s      AgmVV,Ar~  r   )r   r  r  r!   r  ro   )re   r9   r  r  s   `  @r2   test_initializer_parallelr  v  sJ     jjlG\\^FH$	
 BeCjABr1   c                 @    d}t        j                         }|j                         t               }t	        |      D ]I  } t        d t        f       fdt	               D              }|j                  t        |            }K t        |       k(  sJ d       y )Nrm   r)   r  c              3   N   K   | ]  } t        t              d         ywT)r  Nr  r  s     r2   rk   z*test_initializer_reused.<locals>.<genexpr>  ,      

 #GM"66EE

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



6]


 zz#g,'
( t9 Gr1   c                 F    d}t        j                         }t               }t        |      D ]Y  }|j	                          t        d t        f       fdt               D              }|j                  t        |            }[ t        |      | z  k(  sJ d       y )Nrm   r)   r  c              3   N   K   | ]  } t        t              d         ywr  r  r  s     r2   rk   z.test_initializer_not_reused.<locals>.<genexpr>  r  r   zFThe workers should not be reused when the initializer arguments change)	r   r  r   ro   r  r!   r  r  r   r  s   `     @r2   test_initializer_not_reusedr    s     MjjlG5D=! (
((Y	



6]


 zz#g,'( t9.. P.r1   )F)r   r   )rm   r.   )rQ   r  r  r   rN  r*   rX   r   r  r!  r   mathr   r(   r   pickler   r   	tracebackr	   rJ  r]  r
   r   r   joblib._multiprocessing_helpersr   joblib.test.commonr   r   r   r   joblib.testingr   r   r   r   r   joblib.externals.lokyr   rc  r   posixImportError _openmp_test_helper.parallel_sumr   distributedjoblib._parallel_backendsr   r   r   r   r   joblib.parallelr    r!   r"   r#   r$   r%   r&   r'   rv  RETURN_GENERATOR_BACKENDSpopr  keysALL_VALID_BACKENDSPROCESS_BACKENDSPARALLEL_BACKENDShasattrr   r+   r3   r:   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  r0  r6  r:  r   rE  rS  ra  re  r  r  r  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+  r4  r;  rD  rL  rQ  rZ  rX  SQUARE_LOCALSQUARE_LAMBDArc  rM  r[  r\  r^  re  rh  rm  rn  rr  rw  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r#  r&  r*  r2  r5  no_coverr>  rJ  rT  rW  rd  ro  ru  r|  r  r  r  r  r  r  r  r  r  r  r  )backend_strrj   s   00r2   <module>r     su    	 	 
     "  (    &   ' ' .  U T>; > 
 
 
 *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%, & ' ,, Y*+X1v  ,( Y*+' ,'T0 +

 2 Y@A B Q _h'x( ) ( W W Xy! " Y)*/ +/: 
 
 [/*\At9%5 & +  5$ Y)*	 +	 Y)*
 + 
 Y56,GH[;(=>? @ I $ Y()C
 * C
L Y!E " E,' Y!  	
$ 	
%$'PQ' "R  Y)* + <4 Y()3 * 3
HM Y)*CD- E + -,+ 
 Y*+H ,H$ Y)*X}%: & + :%	D $=>9 ?9;* $5Q#7     ' 'a(Q1):Q)>(Q R Y89Y)?;<D = : D,#4  Y*:;<D =D& Y*:;<D =D(
Q>))55 > / ; YWXY*:;<, = Y , X}%Y)*Y*:;<
 = + & 
07 _/0_/0Y*:;<
 = 1 1 
 Y*:;<%e}5! 6 = !: \=)( *(
 / !  + + Y()S *  S,0 ,  Y() * - )@
 Y("*B7)LM][,FG "?@ A H N ,(9P Fbggoobggoofoo.NOFPQ 6V 
 
=, Fbggoobggoofoo.NOFP- :2  8
 Y()8 *  86 	/  	/

 9-; .;" Aq6* Y56,GHN I 	 +N Y*+X~& ' , Y12[;(=>?X~&> ' @ 3 > Y12[;(=>?X~&
 ' @ 3
& Y12[;(=>?X~&
 ' @ 3
& Y12][*?@A][*?@AX~&> ' B B 3>&  ][*?@A][*?@A)" B B)"X Y()P *  PD rz{#7R00 Y() * , Y*:;<+ = +\ Y*:;<3K =3KlE*' Y-.Y*:;<A = / AH
 Y*:;<Y"*+6;:OQ+ R = +2' Y2>$vG%BC$ D H$ Y*:;<4(AB C =
 Y*:;<A =A&=H	+
; X~& '  0 $o6X2wY*:;< =   7  
6 X2wZWXY*:;< 6 = Y    6F Xz"* # *((. X1vY()Y*:;<O = *  O X1vY()B *  B Aq6* + 0 Aq6* + mC  E
  L
  K6 L~ )RsB   k; l	 l ?l%?l*;ll	lll"!l"