U
    ºmœd¢ ã                   @   sØ  d Z ddlZddlZddlZddlZddlZddlZddlZddlm	Z	 ddl
mZ ddlmZ ddlmZ ddlmZ ddlmZ ddlZddlZdd	lmZ dd
lmZmZ ddlmZ ddlmZmZ ddlmZ ddlmZmZ ddl m!Z!m"Z"m#Z#m$Z$m%Z% edk	�rddl&m'Z' ddl(m)Z) zddl*Z*W n e+k
�rL   dZ*Y nX zddl,m-Z- W n e+k
�rx   dZ-Y nX zddl.Z.W n e+k
�r    dZ.Y nX ddl/m0Z0 ddl/m1Z1 ddl/m2Z2 ddl/m3Z3 ddl/m4Z4 ddl5m6Z6m7Z7 ddl5m8Z8 ddl5m9Z9 ddl5m:Z: ddl5m;Z;m<Z< ddl5mZm=Z=m>Z> e= ?¡ Z@e@ Add¡ dgeBe= C¡ ƒ ZDeDd d!„ e=D ƒ7 ZDedk�r~g ZEndd"gZEeEd#g ZFeGed$ƒ�r¬eD He Id%¡¡ e=e> ZJd&d'„ ZKd(d)„ ZLd*d+„ ZMG d,d-„ d-eNƒZO�dMd/d0„ZPd1d2„ ZQ�dNd3d4„ZRd5d6„ ZSd7d8„ ZTd9d:„ ZUd;d<„ ZVe!d=e8e9gƒejWj!d>d?d@e;d@dA�fdBgdCdDdEgdF�edGdH„ ƒƒƒZXe!dIeDƒe!dJddKd@dLgƒe!dMdKdNdOgƒdPdQ„ ƒƒƒZYe!dIeDƒdRdS„ ƒZZdTdU„ Z[ee!dVdWdXdYdZd[d\gƒd]d^„ ƒƒZ\ee!dId"dd#gƒd_d`„ ƒƒZ]dadb„ Z^e!dce=ƒe!dde=ƒdedf„ ƒƒZ_dgdh„ Z`edidj„ ƒZadkdl„ Zbe!dJddKdmgƒdndo„ ƒZce!dIeFƒdpdq„ ƒZdedrds„ ƒZee!dIeFƒdtdu„ ƒZfee!dIeFƒdvdw„ ƒƒZgee!dIeEƒdxdy„ ƒƒZhdzd{„ Zie!dIe=ƒe!d|dd}d~dd€d�d‚dƒd„d…d†d‡dˆgfd‰d}dd�dƒd~d€d‚d„d…d‡d†dˆgfgƒdŠd‹„ ƒƒZjee!dIeFƒdŒd�„ ƒƒZkdŽd�„ Zlee!dIeEƒd�d‘„ ƒƒZmd’d“„ Znd”d•„ Zod–d—„ Zpee!dIeFƒejWjqd˜d™�dšd›„ ƒƒƒZrG dœd�„ d�e0ƒZsdždŸ„ Zte!dIeDƒd d¡„ ƒZud¢d£„ Zvd¤d¥„ Zwe$edk	d¦d™�d§d¨„ ƒZxd©dª„ ZyeFdd… Zzez {d«d!„ e|dmƒD ƒ¡ ee!dIezƒe!d=e9e8gƒd¬d­„ ƒƒƒZ}G d®d¯„ d¯e0ƒZ~e!d=e8e9gƒd°d±„ ƒZe!d=e8e9gƒd²d³„ ƒZ€d´dµ„ Z�d¶d·„ Z‚G d¸d¹„ d¹ejƒj4ƒZ„e:dºe„ƒ ee!dId#d"ddºgƒe!d=e8e9gƒd»d¼„ ƒƒƒZ…ee!dJdKd@dgƒe!dIeFƒe!d=e8e9gƒd½d¾„ ƒƒƒƒZ†d¿dÀ„ Z‡ee!dÁeFƒe!dÂeFƒe!d=e8e9gƒdÃdÄ„ ƒƒƒƒZˆee!d=e8e9gƒe!dÅdÆd.gƒdÇdÈ„ ƒƒƒZ‰e!dÉdd@dÊgƒdËdÌ„ ƒZŠe!dÍdÎdÏdÐdÑdÐdÒdÓdÔdÕdÖd×gƒdØdÙ„ ƒZ‹edÚdÛ„ ƒZŒeee!dIeEƒdÜdÝ„ ƒƒƒZ�dÞZŽee!dIeEƒdßdà„ ƒƒZ�dáZ�dâZ‘dãZ’däZ“ee!dIeEedk�rÞg nd%g ƒe!dåe‘e’e“gƒe!dædçdèdégƒdêdë„ ƒƒƒƒZ”dìj•ej– —ej– —ej˜¡¡dí�Z™edîdï„ ƒZšdðj•ej– —ej– —ej˜¡¡dí�Z›edñdò„ ƒZœdódô„ Z�dõdö„ Zžd÷dø„ ZŸeee!dIeEƒdùdú„ ƒƒƒZ dûdü„ Z¡eedýdþ„ ƒƒZ¢dÿ�d „ Z£�d�d„ Z¤ejW !dJddKd‰g¡�d�d„ ƒZ¥e!dIeDƒe!dJddKdLd@gƒ�d�d„ ƒƒZ¦�d�d„ Z§ee!dIe@ƒe!dJddKdLd@gƒ�d	�d
„ ƒƒƒZ¨e!dIe@ƒe!dJddKdLd@gƒ�d�d„ ƒƒZ©e!dIe@ƒe!dJddKdLd@gƒ�d�d„ ƒƒZªe!dIe@ƒe!dJddKdLd@gƒ�d�d„ ƒƒZ«e!�d�d�d�dgƒ�d�d„ ƒZ¬eee!dIeEƒ�d�d„ ƒƒƒZ­e!dIedk�
rdd#gndd"d#gƒ�d�d„ ƒZ®ee!dIeEƒ�d�d„ ƒƒZ¯ee!d=e8e9gƒ�d�d„ ƒƒZ°e!d=e8e9gƒ�d�d „ ƒZ±�d!�d"„ Z²�dO�d#�d$„Z³ee!dId"d#gƒe!d=e8e9gƒ�d%�d&„ ƒƒƒZ´ee$e.dk�d'd™�e!d=e8e9gƒ�d(�d)„ ƒƒƒZµ�dP�d*�d+„Z¶ejWj·e!d=e8e9gƒe!dIedk�r.d#gnd"d#gƒ�d,�d-„ ƒƒƒZ¸�d.�d/„ Z¹e!dIedk	�rjdd"gndgƒe$e-dk�d0d™��d1�d2„ ƒƒZºe$e.dk	�d3d™�e!d=e8e9gƒ�d4�d5„ ƒƒZ»e!d=e8e9gƒ�d6�d7„ ƒZ¼�d8�d9„ Z½�d:�d;„ Z¾�d<�d=„ Z¿�d>�d?„ ZÀeee!dJdKd‰dLd@gƒ�d@�dA„ ƒƒƒZÁeee!�dBddKd‰dgƒe!dJdKd@gƒe!d=e8e9gƒ�dC�dD„ ƒƒƒƒƒZÂee!dJdKd@gƒe!�dE�dF�dG�dHgƒe!d=e8e9gƒ�dI�dJ„ ƒƒƒƒZÃee!dJdKd‰d@gƒ�dK�dL„ ƒƒZÄdS (Q  z
Test the parallel module.
é    N)Úformat_exception©Úsqrt)Úsleep)ÚPicklingError)Únullcontext©ÚTimeoutError©Úparallel)ÚdumpÚload)Úmp)ÚnpÚ
with_numpy)Úwith_multiprocessing)ÚIS_PYPYÚforce_gc_pypy)ÚparametrizeÚraisesÚcheck_subprocess_callÚskipifÚwarns)Úget_reusable_executor)ÚQueueé   )Úparallel_sum)ÚSequentialBackend)ÚThreadingBackend)ÚMultiprocessingBackend)ÚParallelBackendBase)ÚLokyBackend)ÚParallelÚdelayed)Úparallel_config)Úparallel_backend)Úregister_parallel_backend)Úeffective_n_jobsÚ	cpu_count)r   ÚBACKENDSÚDEFAULT_BACKENDÚmultiprocessingc                 C   s   g | ]}t | ƒ ‘qS © )r)   )Ú.0Zbackend_strr,   r,   úR/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/joblib/test/test_parallel.pyÚ
<listcomp>M   s     r/   ÚlokyÚ	threadingÚget_contextÚspawnc                 C   s   t | dt | dd ƒƒS )NÚ_poolZ_workers)Úgetattr©Úbackendr,   r,   r.   Úget_workers[   s    r8   c                 C   s   | | S ©Nr,   )ÚxÚyr,   r,   r.   Údivision_   s    r<   c                 C   s   | d S ©Né   r,   ©r:   r,   r,   r.   Úsquarec   s    r@   c                   @   s   e Zd ZdZdd„ ZdS )ÚMyExceptionWithFinickyInitz1An exception class with non trivial __init__
    c                 C   s   d S r9   r,   )ÚselfÚaÚbÚcÚdr,   r,   r.   Ú__init__j   s    z#MyExceptionWithFinickyInit.__init__N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__rG   r,   r,   r,   r.   rA   g   s   rA   Fc                 C   s"   | dkr|rt ddddƒnt‚| S )Né   rC   rD   rE   rF   )rA   Ú
ValueError)r:   Úcustom_exceptionr,   r,   r.   Úexception_raisern   s    ÿÿrP   c                 C   s   t  d¡ t‚d S )Ngš™™™™™©?)Útimer   ÚKeyboardInterruptr?   r,   r,   r.   Úinterrupt_raiseru   s    
rS   c                 C   s   | d | | S )zO A module-level function so that it can be spawn with
    multiprocessing.
    r>   r,   )r:   r;   Úzr,   r,   r.   Úfz   s    rU   c                   C   s   t t ¡ d ƒS ©Nr   )Útyper   Úget_active_backendr,   r,   r,   r.   Ú_active_backend_type�   s    rY   c                 C   s   t | |d�dd„ tdƒD ƒƒS )N©Ún_jobsr7   c                 s   s   | ]}t tƒ|ƒV  qd S r9   ©r#   r@   ©r-   Úir,   r,   r.   Ú	<genexpr>†   s    z parallel_func.<locals>.<genexpr>é   ©r"   Úrange)Úinner_n_jobsr7   r,   r,   r.   Úparallel_func…   s    ÿrd   c                   C   s   t ƒ dkst‚d S rV   )r(   ÚAssertionErrorr,   r,   r,   r.   Útest_cpu_count‹   s    rf   c                   C   s   t ƒ dkst‚d S rV   ©r'   re   r,   r,   r,   r.   Útest_effective_n_jobs�   s    rh   Úcontextzbackend_n_jobs, expected_n_jobs)r`   r`   éÿÿÿÿ©r[   ©Nr   zpositive-intznegative-intÚNone)Zidsc              	   C   s@   | d|d�� t d d�|ks t‚W 5 Q R X t d d�dks<t‚d S )Nr1   rk   r   rg   )ri   Zbackend_n_jobsZexpected_n_jobsr,   r,   r.   Útest_effective_n_jobs_None“   s    
rn   r7   r[   r>   éþÿÿÿÚverboseé   éd   c                 C   s:   dd„ t dƒD ƒt|| |d�dd„ t dƒD ƒƒks6t‚d S )Nc                 S   s   g | ]}t |ƒ‘qS r,   ©r@   ©r-   r:   r,   r,   r.   r/   ¬   s     z(test_simple_parallel.<locals>.<listcomp>é   )r[   r7   rp   c                 s   s   | ]}t tƒ|ƒV  qd S r9   r\   rt   r,   r,   r.   r_   ®   s    z'test_simple_parallel.<locals>.<genexpr>©rb   r"   re   )r7   r[   rp   r,   r,   r.   Útest_simple_parallel¨   s    ÿÿÿÿrw   c              	   C   s~   |j t ¡ ddd� tjdd��6}td| d�dd	„ td
ƒD ƒƒ}|dddgksRt‚W 5 Q R X dd„ |D ƒ}t|ƒdkszt‚d S )NÚnameZ!some_new_name_for_the_main_thread)Útargetrx   ÚvalueT©Úrecordr>   rZ   c                 s   s   | ]}t tƒ|ƒV  qd S r9   r\   rt   r,   r,   r.   r_   ¼   s    z6test_main_thread_renamed_no_warning.<locals>.<genexpr>r`   r   r   é   c                 S   s   g | ]}d t |jƒkr|‘qS )zworker timeout)ÚstrÚmessage©r-   Úwr,   r,   r.   r/   Â   s      z7test_main_thread_renamed_no_warning.<locals>.<listcomp>)	Úsetattrr1   Úcurrent_threadÚwarningsÚcatch_warningsr"   rb   re   Úlen)r7   ÚmonkeypatchÚwarninfoÚresultsr,   r,   r.   Ú#test_main_thread_renamed_no_warning²   s    ÿÿrŠ   c              	   C   s˜   t jdd��}t  d¡ t| |d� W 5 Q R X dd„ |D ƒ}|rˆ|r„tdd„ |D ƒƒ}ttjd	d
ƒrpt|ƒdkn
t|ƒdk}|o‚|S d
S |r�t	‚dS d S )NTr{   Úalways)r7   rc   c                 S   s   g | ]
}|j ‘qS r,   )r   r€   r,   r,   r.   r/   Ï   s     z*_assert_warning_nested.<locals>.<listcomp>c                 s   s   | ]}d |j d kV  qdS )zbacked parallel loops cannotr   N)Úargs)r-   Zeachr,   r,   r.   r_   Ò   s   ÿz)_assert_warning_nested.<locals>.<genexpr>ZnogilFr   )
r„   r…   Úsimplefilterrd   Úallr5   ÚsysÚflagsr†   re   )r7   rc   Úexpectedrˆ   Zwarnings_are_correctZwarnings_have_the_right_lengthr,   r,   r.   Ú_assert_warning_nestedÊ   s     
þ
þr’   z%parent_backend,child_backend,expected)r0   r+   T)r0   r0   F)r+   r+   T)r+   r0   T)r1   r+   T)r1   r0   Tc                    s„   t d| d�‡ fdd„tdƒD ƒƒ t d| d�‡ ‡fdd„tdƒD ƒƒ}| dkrttrft|ƒsftjdd	� t|ƒs€t‚nt|ƒs€t‚d S )
Nr>   rZ   c                 3   s    | ]}t tƒˆ d dd�V  qdS )r   F©r7   rc   r‘   N©r#   r’   ©r-   Ú_©Úchild_backendr,   r.   r_   ï   s   ý þz0test_nested_parallel_warnings.<locals>.<genexpr>ru   c                 3   s    | ]}t tƒˆ d ˆd�V  qdS )r>   r“   Nr”   r•   ©r˜   r‘   r,   r.   r_   ö   s   ý þr1   zThis test often fails in PyPy.©Úreason)r"   rb   r   ÚanyÚpytestÚxfailre   rŽ   )Úparent_backendr˜   r‘   Úresr,   r™   r.   Útest_nested_parallel_warningsã   s    üür¡   c                 C   s>   dg}dd„ }t j||fd�}| ¡  | ¡  |d s:t‚d S )NFc              	   S   sT   t jdd��"}tdd�dd„ tdƒD ƒƒ W 5 Q R X tt|ƒƒ t|ƒdk| d< d S )	NTr{   r>   rk   c                 s   s   | ]}t tƒd ƒV  qdS )çš™™™™™¹?N©r#   r   r•   r,   r,   r.   r_     s    zPtest_background_thread_parallelism.<locals>.background_thread.<locals>.<genexpr>r}   r   )r„   r…   r"   rb   Úprintr†   )Úis_run_parallelrˆ   r,   r,   r.   Úbackground_thread  s    ÿz=test_background_thread_parallelism.<locals>.background_thread)ry   rŒ   r   )r1   ÚThreadÚstartÚjoinre   )r7   r¥   r¦   Útr,   r,   r.   Ú"test_background_thread_parallelism  s    r«   c                 C   s"   t d| d�dd„ tdƒD ƒƒ d S )Nr>   rZ   c                 s   s   | ]}t tƒd ƒV  qdS )ç{®Gáz„?Nr\   r•   r,   r,   r.   r_     s    znested_loop.<locals>.<genexpr>ra   r6   r,   r,   r.   Únested_loop  s    ÿr­   r˜   rŸ   c                    s&   t d| d�‡ fdd„tdƒD ƒƒ d S )Nr>   rZ   c                 3   s   | ]}t tƒˆ ƒV  qd S r9   )r#   r­   r•   r—   r,   r.   r_   !  s    z#test_nested_loop.<locals>.<genexpr>ra   )rŸ   r˜   r,   r—   r.   Útest_nested_loop  s    ÿr®   c                 C   s   t ‚d S r9   )rN   r6   r,   r,   r.   Úraise_exception%  s    r¯   c               
   C   sL   t tƒ�: tddd��"} | ttƒdƒttƒdƒgƒ W 5 Q R X W 5 Q R X d S )Nr>   r0   rZ   )r   rN   r"   r#   r­   r¯   r
   r,   r,   r.   Ú)test_nested_loop_with_exception_with_loky)  s
    

ÿr°   c                      s<   t dd�‰ tddd�‡ fdd„tdƒD ƒƒ ˆ  ¡ s8t‚dS )	z1Input is mutable when using the threading backendru   )Úmaxsizer>   r1   rZ   c                 3   s   | ]}t ˆ jƒd ƒV  qdS ©r   N)r#   Úputr•   ©Úqr,   r.   r_   4  s    z1test_mutate_input_with_threads.<locals>.<genexpr>N)r   r"   rb   Úfullre   r,   r,   r´   r.   Útest_mutate_input_with_threads1  s
    
ÿr·   r`   c                 C   s6   t dƒ}dd„ |D ƒt| d�dd„ |D ƒƒks2t‚dS )z.Check the keyword argument processing of pmap.é
   c                 S   s   g | ]}t |d d�‘qS ©r   ©r;   ©rU   rt   r,   r,   r.   r/   =  s     z(test_parallel_kwargs.<locals>.<listcomp>rk   c                 s   s   | ]}t tƒ|d d�V  qdS ©r   rº   N©r#   rU   rt   r,   r,   r.   r_   >  s     z'test_parallel_kwargs.<locals>.<genexpr>Nrv   )r[   Úlstr,   r,   r.   Útest_parallel_kwargs9  s    ÿr¿   c              	   C   sØ   t dƒ}dd„ |D ƒ}td| d��^}|j}||dd„ |D ƒƒksDt‚||dd„ |D ƒƒks^t‚td k	r|t|ƒt|jƒks|t‚W 5 Q R X td k	r t|jƒd ks t‚||d	d„ |D ƒƒksºt‚td k	rÔt|jƒd ksÔt‚d S )
Nr¸   c                 S   s   g | ]}t |d d�‘qS r¹   r»   rt   r,   r,   r.   r/   D  s     z4test_parallel_as_context_manager.<locals>.<listcomp>r}   rZ   c                 s   s   | ]}t tƒ|d d�V  qdS r¼   r½   rt   r,   r,   r.   r_   M  s     z3test_parallel_as_context_manager.<locals>.<genexpr>c                 s   s   | ]}t tƒ|d d�V  qdS r¼   r½   rt   r,   r,   r.   r_   N  s     c                 s   s   | ]}t tƒ|d d�V  qdS r¼   r½   rt   r,   r,   r.   r_   Z  s     )rb   r"   Ú_backendre   r   r8   )r7   r¾   r‘   ÚpZmanaged_backendr,   r,   r.   Ú test_parallel_as_context_managerA  s     rÂ   c                	      sN   G dd„ dt ƒ‰ ttdd��( tddd�‡ fdd	„td
ƒD ƒƒ W 5 Q R X dS )ze Check that pmap captures the errors when it is passed an object
        that cannot be pickled.
    c                   @   s   e Zd Zdd„ ZdS )z1test_parallel_pickling.<locals>.UnpicklableObjectc                 S   s   t dƒ‚d S )NZ123)ÚRuntimeError©rB   r,   r,   r.   Ú
__reduce__e  s    z<test_parallel_pickling.<locals>.UnpicklableObject.__reduce__N)rI   rJ   rK   rÅ   r,   r,   r,   r.   ÚUnpicklableObjectd  s   rÆ   zthe task to send©Úmatchr>   r0   rZ   c                 3   s   | ]}t tƒˆ ƒ ƒV  qd S r9   ©r#   Úidr•   ©rÆ   r,   r.   r_   i  s   ÿÿz)test_parallel_pickling.<locals>.<genexpr>r¸   N)Úobjectr   r   r"   rb   r,   r,   rË   r.   Útest_parallel_pickling_  s
    ÿrÍ   c                 C   s0   t td| dd�dd„ tdƒD ƒƒƒdks,t‚d S )Nr>   é   ©r[   r7   Útimeoutc                 s   s   | ]}t tƒd ƒV  qdS )gü©ñÒMbP?Nr£   rt   r,   r,   r.   r_   p  s    z0test_parallel_timeout_success.<locals>.<genexpr>r¸   )r†   r"   rb   re   r6   r,   r,   r.   Útest_parallel_timeout_successm  s
    ÿÿrÑ   c              	   C   s8   t tƒ�& td| dd�dd„ tdƒD ƒƒ W 5 Q R X d S )Nr>   r¬   rÏ   c                 s   s   | ]}t tƒd ƒV  qdS ©r¸   Nr£   rt   r,   r,   r.   r_   y  s    z-test_parallel_timeout_fail.<locals>.<genexpr>r¸   )r   r	   r"   rb   r6   r,   r,   r.   Útest_parallel_timeout_failt  s    
ÿrÓ   c              
   C   sd  t d k	�rÐttƒ�& td| d�dd„ tddƒD ƒƒ W 5 Q R X ttƒ�  td| d�dd„ dD ƒƒ W 5 Q R X td| d���:}t|jƒd k	sŽt‚t|jƒ}ttƒ� |dd„ tddƒD ƒƒ W 5 Q R X t|jƒd k	sÖt‚t|jƒ|k	sèt‚d	d„ t	d
ƒD ƒ|dd„ t	d
ƒD ƒƒk�st‚t|jƒ}ttƒ� |dd„ dD ƒƒ W 5 Q R X t|jƒd k	�sZt‚t|jƒ|k	�snt‚dd„ t	d
ƒD ƒ|dd„ t	d
ƒD ƒƒk�s°t|j
|j|j|jfƒ‚W 5 Q R X t|jƒd k�süt‚n,ttƒ� tdd�dd„ dD ƒƒ W 5 Q R X ttƒ�$ tdd�dd„ tddƒD ƒƒ W 5 Q R X ttƒ�$ tddd�dd„ t	dƒD ƒƒ W 5 Q R X d S )Nr>   rZ   c                 S   s   g | ]\}}t tƒ||ƒ‘qS r,   ©r#   r<   ©r-   r:   r;   r,   r,   r.   r/   …  s   ÿz&test_error_capture.<locals>.<listcomp>)r   r   )r   r   c                 S   s   g | ]}t tƒ|ƒ‘qS r,   ©r#   rS   rt   r,   r,   r.   r/   Š  s     c                 S   s   g | ]\}}t tƒ||ƒ‘qS r,   rÔ   rÕ   r,   r,   r.   r/   ’  s   ÿc                 S   s   g | ]}t |d d�‘qS r¹   r»   rt   r,   r,   r.   r/   œ  s     r¸   c                 s   s   | ]}t tƒ|d d�V  qdS r¼   r½   rt   r,   r,   r.   r_   �  s     z%test_error_capture.<locals>.<genexpr>c                 S   s   g | ]}t tƒ|ƒ‘qS r,   rÖ   rt   r,   r,   r.   r/   ¡  s     c                 S   s   g | ]}t |d d�‘qS r¹   r»   rt   r,   r,   r.   r/   ©  s     c                 s   s   | ]}t tƒ|d d�V  qdS r¼   r½   rt   r,   r,   r.   r_   ª  s     rk   c                 S   s   g | ]}t tƒ|ƒ‘qS r,   rÖ   rt   r,   r,   r.   r/   µ  s     c                 S   s   g | ]\}}t tƒ||ƒ‘qS r,   rÔ   rÕ   r,   r,   r.   r/   »  s     r   )r[   rp   c                 s   s   | ]}t tƒ|d d�V  qdS )T)rO   N©r#   rP   r]   r,   r,   r.   r_   ¿  s   ÿrÎ   )r   r   ÚZeroDivisionErrorr"   ÚziprR   r8   rÀ   re   rb   Ú
_iteratingZn_completed_tasksZn_dispatched_tasksÚ	_abortingrA   )r7   r   Zoriginal_workersr,   r,   r.   Útest_error_capture}  sh    


ÿÿ

ÿ

ÿÿ


ÿ  þÿ
ÿ
ÿ

ÿÿrÜ   c                 C   s   |   d| ¡ d S )NzConsumed %s)Úappend)ÚqueueÚitemr,   r,   r.   ÚconsumerÃ  s    rà   zbatch_size, expected_queueú
Produced 0z
Consumed 0z
Produced 1z
Consumed 1z
Produced 2z
Consumed 2ú
Produced 3z
Consumed 3z
Produced 4z
Consumed 4z
Produced 5z
Consumed 5r}   c                    sT   t ƒ ‰ ‡ fdd„}td|| d�‡ fdd„|ƒ D ƒƒ ˆ |ks@t‚tˆ ƒdksPt‚dS )	zC Test that with only one job, Parallel does act as a iterator.
    c                  3   s&   t dƒD ]} ˆ  d|  ¡ | V  qd S ©Né   zProduced %i©rb   rÝ   ©r^   ©rÞ   r,   r.   ÚproducerÙ  s    z'test_dispatch_one_job.<locals>.producerr   ©r[   Ú
batch_sizer7   c                 3   s   | ]}t tƒˆ |ƒV  qd S r9   ©r#   rà   rt   rç   r,   r.   r_   Þ  s    z(test_dispatch_one_job.<locals>.<genexpr>é   N)Úlistr"   re   r†   )r7   rê   Zexpected_queuerè   r,   rç   r.   Útest_dispatch_one_jobÇ  s    ÿrî   c                    s    t  ¡ }| ¡ ‰ ‡ fdd„}tddd| d�‡ fdd„|ƒ D ƒƒ tˆ ƒ}|d	 d
ksXt‚|dd…  d¡}|dksvt‚| d¡}||ksŒt‚tˆ ƒdksœt‚dS )zW Check that using pre_dispatch Parallel does indeed dispatch items
        lazily.
    c                  3   s&   t dƒD ]} ˆ  d|  ¡ | V  qd S rã   rå   ræ   rç   r,   r.   rè   í  s    z/test_dispatch_multiprocessing.<locals>.producerr>   r   r`   )r[   rê   Úpre_dispatchr7   c                 3   s   | ]}t tƒˆ d ƒV  qdS )rœ   Nrë   r•   rç   r,   r.   r_   ò  s    z0test_dispatch_multiprocessing.<locals>.<genexpr>r   rá   Nr}   zConsumed anyrj   râ   rì   )r   ÚManagerrí   r"   re   Úindexr†   )r7   Úmanagerrè   Zqueue_contentsZfirst_consumption_indexZproduced_3_indexr,   rç   r.   Útest_dispatch_multiprocessingä  s    ÿ
ró   c               	   C   sF   t dddd��.} | dd„ tdƒD ƒƒ | j ¡ dks8t‚W 5 Q R X d S )	Nr>   Úautor1   ré   c                 s   s   | ]}t tƒ|ƒV  qd S r9   rÉ   r]   r,   r,   r.   r_   	  s     z/test_batching_auto_threading.<locals>.<genexpr>éˆ  r   ©r"   rb   rÀ   Zcompute_batch_sizere   )rÁ   r,   r,   r.   Útest_batching_auto_threading  s    r÷   c              	   C   sF   t dd| d��.}|dd„ tdƒD ƒƒ |j ¡ dks8t‚W 5 Q R X d S )Nr>   rô   ré   c                 s   s   | ]}t tƒ|ƒV  qd S r9   rÉ   r]   r,   r,   r.   r_     s     z2test_batching_auto_subprocesses.<locals>.<genexpr>rõ   r   rö   )r7   rÁ   r,   r,   r.   Útest_batching_auto_subprocesses  s    rø   c                	   C   s8   t tƒ�& tdddd�dd„ tdƒD ƒƒ W 5 Q R X dS )	zCMake sure that exception raised during dispatch are indeed capturedr>   é   r   )r[   rï   rp   c                 s   s   | ]}t tƒ|ƒV  qd S r9   r×   r]   r,   r,   r.   r_     s    z*test_exception_dispatch.<locals>.<genexpr>rÎ   N)r   rN   r"   rb   r,   r,   r,   r.   Útest_exception_dispatch  s    
ÿrú   c                 C   s    t dd�dd„ tdƒD ƒƒ d S )Nr>   rk   c                 s   s   | ]}t tƒ|ƒV  qd S r9   r×   ©r-   Újr,   r,   r.   r_   !  s    z(nested_function_inner.<locals>.<genexpr>rÎ   ra   ræ   r,   r,   r.   Únested_function_inner   s    ÿrý   c                 C   s    t dd�dd„ tdƒD ƒƒ d S )Nr>   rk   c                 s   s   | ]}t tƒ|ƒV  qd S r9   )r#   rý   rû   r,   r,   r.   r_   &  s    z(nested_function_outer.<locals>.<genexpr>rÎ   ra   ræ   r,   r,   r.   Únested_function_outer%  s    ÿrþ   z'https://github.com/joblib/loky/pull/255rš   c              	   C   sˆ   t tƒ�$}td| d�dd„ tdƒD ƒƒ W 5 Q R X t|j|j|jƒ}d |¡}d|ksZt	‚d|ksft	‚d	|ksrt	‚t|jƒtks„t	‚d
S )z¯Ensure 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.
    r>   rZ   c                 s   s   | ]}t tƒ|ƒV  qd S r9   )r#   rþ   r]   r,   r,   r.   r_   4  s    z1test_nested_exception_dispatch.<locals>.<genexpr>rÎ   Ú rþ   rý   rP   N)
r   rN   r"   rb   r   rW   rz   Útbr©   re   )r7   ÚexcinfoZreport_linesÚreportr,   r,   r.   Útest_nested_exception_dispatch*  s    	
ÿ
r  c                   @   s$   e Zd ZdZddd„Zd	dd„ZdS )
ÚFakeParallelBackendz8Pretends to run concurrently while running sequentially.r   Nc                 K   s   |   |¡| _|| _|S r9   )r'   r[   r   )rB   r[   r   Zbackend_argsr,   r,   r.   Ú	configureE  s    zFakeParallelBackend.configurec                 C   s"   |dk rt t ¡ d | dƒ}|S )Nr   r   )Úmaxr   r(   ©rB   r[   r,   r,   r.   r'   J  s    z$FakeParallelBackend.effective_n_jobs)r   N)r   )rI   rJ   rK   rL   r  r'   r,   r,   r,   r.   r  B  s   
r  c                
   C   s‚   t tdd�� tdd� W 5 Q R X t tdd�� tdd�� W 5 Q R X W 5 Q R X t tdd�� tdd�� W 5 Q R X W 5 Q R X d S )NzInvalid backend:rÇ   zunit-testingr6   )r   rN   r"   r$   r,   r,   r,   r.   Útest_invalid_backendP  s    r  c              	   C   s:   t tƒ�}td| d� ¡  W 5 Q R X dt|jƒks6t‚d S )Nr   rZ   z&n_jobs == 0 in Parallel has no meaning)r   rN   r"   Z_initialize_backendr~   rz   re   )r7   r  r,   r,   r.   Útest_invalid_njobs]  s    
r	  c                   C   s8   z*tdtƒ dt kst‚t d tks(t‚W 5 t d= X d S )NZtest_backend)r)   r&   r  re   r,   r,   r,   r.   Útest_register_parallel_backendd  s
    
r
  c                   C   sN   t ƒ tkst‚z$tdtd dd� t ƒ tks0t‚W 5 tt_X t ƒ tksJt‚d S )Nr1   T)Zmake_default)rY   ÚDefaultBackendre   r*   r   r&   r)   r   r,   r,   r,   r.   Útest_overwrite_default_backendm  s    
ÿr  zOnly without multiprocessingc                	   C   sf   t tdd��" tdd�dd„ tdƒD ƒƒ W 5 Q R X tdd�� tƒ dd„ tdƒD ƒƒ W 5 Q R X d S )	Nz)joblib backend '.*' is not available on.*rÇ   r0   r6   c                 s   s   | ]}t tƒ|ƒV  qd S r9   r\   r]   r,   r,   r.   r_   }  s     z2test_backend_no_multiprocessing.<locals>.<genexpr>r`   c                 s   s   | ]}t tƒ|ƒV  qd S r9   r\   r]   r,   r,   r.   r_   �  s     )r   ÚUserWarningr"   rb   r$   r,   r,   r,   r.   Útest_backend_no_multiprocessingy  s    ÿ&r  c              	   C   s  | |dd��ò t  ¡ \}}|dks&t‚tdƒdks6t‚tƒ }|jdksJt‚|dkrvt|ƒtksbt‚t|jƒtksút‚n„|dkr¢t|ƒt	ksŽt‚t|jƒt	ksút‚nX|dkrÎt|ƒt
ksºt‚t|jƒt
ksút‚n,| d¡rút|ƒtksèt‚t|jƒtksút‚W 5 Q R X d S )Nr`   rk   r+   r0   r1   Ztest_)r   rX   re   r'   r"   r[   rW   r   rÀ   r!   r   Ú
startswithr  )ri   Úbackend_nameÚactive_backendÚactive_n_jobsrÁ   r,   r,   r.   Úcheck_backend_context_manager„  s$    
r  c                 C   s   g | ]}d | ‘qS )ztest_backend_%dr,   r]   r,   r,   r.   r/   ›  s     c                    sl   |t kr|  t |t¡ tƒ tks$t‚tˆ |ƒ tƒ tks<t‚tddd�‡ fdd„tD ƒƒ tƒ tksht‚d S )Nr>   r1   rZ   c                 3   s    | ]}|st tƒˆ |ƒV  qd S r9   )r#   r  )r-   rD   ©ri   r,   r.   r_   ®  s    ÿz/test_backend_context_manager.<locals>.<genexpr>)	r)   Úsetitemr  rY   r  re   r  r"   Ú all_backends_for_context_manager)r‡   r7   ri   r,   r  r.   Útest_backend_context_managerŸ  s    
þr  c                   @   s   e Zd ZdZddd„ZdS )ÚParameterizedParallelBackendz9Pretends to run conncurrently while running sequentially.Nc                 C   s   |d krt dƒ‚|| _d S )Nzparam should not be None)rN   Úparam)rB   r  r,   r,   r.   rG   ¹  s    z%ParameterizedParallelBackend.__init__)NrH   r,   r,   r,   r.   r  ¶  s   r  c              	   C   sÐ   |   tdt¡ tƒ tkst‚|dddd��t t ¡ \}}t|ƒtksHt‚|j	dksVt‚|dksbt‚t
ƒ }|jdksvt‚|j|ks„t‚|dd„ tdƒD ƒƒ}W 5 Q R X |dd	„ tdƒD ƒks¾t‚tƒ tksÌt‚d S )
NZparam_backendé*   r`   )r  r[   c                 s   s   | ]}t tƒ|ƒV  qd S r9   ©r#   r   r]   r,   r,   r.   r_   Í  s     z=test_parameterized_backend_context_manager.<locals>.<genexpr>ru   c                 S   s   g | ]}t |ƒ‘qS r,   r   r]   r,   r,   r.   r/   Î  s     z>test_parameterized_backend_context_manager.<locals>.<listcomp>)r  r)   r  rY   r  re   r   rX   rW   r  r"   r[   rÀ   rb   )r‡   ri   r  r  rÁ   r‰   r,   r,   r.   Ú*test_parameterized_backend_context_manager¿  s    ÿ r  c              	   C   sÆ   t ƒ tkst‚| tdd�dd��t t ¡ \}}t|ƒtks>t‚|jdksLt‚|dksXt‚tƒ }|j	dkslt‚|j
|kszt‚|dd„ tdƒD ƒƒ}W 5 Q R X |dd„ tdƒD ƒks´t‚t ƒ tksÂt‚d S )	Né+   )r  ru   rk   c                 s   s   | ]}t tƒ|ƒV  qd S r9   r  r]   r,   r,   r.   r_   â  s     zFtest_directly_parameterized_backend_context_manager.<locals>.<genexpr>c                 S   s   g | ]}t |ƒ‘qS r,   r   r]   r,   r,   r.   r/   ã  s     zGtest_directly_parameterized_backend_context_manager.<locals>.<listcomp>)rY   r  re   r  r   rX   rW   r  r"   r[   rÀ   rb   )ri   r  r  rÁ   r‰   r,   r,   r.   Ú3test_directly_parameterized_backend_context_managerÔ  s     r  c                   C   s   t dƒ t ¡ S )Nr¢   )r   ÚosÚgetpidr,   r,   r,   r.   Úsleep_and_return_pidé  s    r!  c                   C   s<   t ƒ tkst‚tƒ  ¡ dks t‚tdd�dd„ tdƒD ƒƒS )Nr   r>   rk   c                 s   s   | ]}t tƒƒ V  qd S r9   )r#   r!  r•   r,   r,   r.   r_   õ  s   ÿz"get_nested_pids.<locals>.<genexpr>)rY   r   re   r"   Ú_effective_n_jobsrb   r,   r,   r,   r.   Úget_nested_pidsî  s
    ÿr#  c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )Ú	MyBackendz:Backend to test backward compatibility with older backendsc                    s   t t| ƒ ¡ d S rV   )Úsuperr$  Úget_nested_backendrÄ   ©Ú	__class__r,   r.   r&  û  s    zMyBackend.get_nested_backend)rI   rJ   rK   rL   r&  Ú__classcell__r,   r,   r'  r.   r$  ù  s   r$  Zback_compat_backendc              	   C   sR   | |ƒ�@ t dd�dd„ tdƒD ƒƒ}|D ]}tt|ƒƒdks*t‚q*W 5 Q R X d S )Nr>   rk   c                 s   s   | ]}t tƒƒ V  qd S r9   )r#   r#  r•   r,   r,   r.   r_     s   ÿz6test_nested_backend_context_manager.<locals>.<genexpr>r¸   r   )r"   rb   r†   Úsetre   )ri   r7   Z
pid_groupsZ	pid_groupr,   r,   r.   Ú#test_nested_backend_context_manager  s    
þr+  c              	      sh   dd„ ‰t dd�‡fdd„tdƒD ƒƒ |ˆ ˆd��* t dd�‡ ‡‡fdd„tdƒD ƒƒ W 5 Q R X d S )	Nc                 S   s0   t ƒ t|  kst‚t|ƒ}tƒ  ¡ |ks,t‚d S r9   )rY   r)   re   r'   r"   r"  )Zexpected_backend_typeZexpected_n_jobr,   r,   r.   Úcheck_nested_backend  s    z?test_nested_backend_in_sequential.<locals>.check_nested_backendr   rk   c                 3   s   | ]}t ˆ ƒtd ƒV  qdS r²   )r#   r*   r•   )r,  r,   r.   r_   &  s   ÿz4test_nested_backend_in_sequential.<locals>.<genexpr>r¸   c                 3   s   | ]}t ˆƒˆ ˆƒV  qd S r9   ©r#   r•   ©r7   r,  r[   r,   r.   r_   ,  s   ÿra   )r7   r[   ri   r,   r.  r.   Ú!test_nested_backend_in_sequential  s    
þþr/  c              	   C   sF   | |ƒ�4}| t kr|d }| tkr*|d }|j|ks8t‚W 5 Q R X d S )Nr7   r   )r$   r%   Únesting_levelre   )ri   Úinner_backendZexpected_levelÚctxr7   r,   r,   r.   Úcheck_nesting_level2  s    
r3  Úouter_backendr1  c              	      sj   t ˆ |dƒ td|d�‡ ‡fdd„tdƒD ƒƒ ˆ ˆdd��$ tƒ ‡ ‡fdd„tdƒD ƒƒ W 5 Q R X d S )	Nr   r>   rZ   c                 3   s   | ]}t tƒˆ ˆd ƒV  qdS r²   ©r#   r3  r•   ©ri   r1  r,   r.   r_   C  s   ÿz-test_backend_nesting_level.<locals>.<genexpr>r¸   rk   c                 3   s   | ]}t tƒˆ ˆd ƒV  qdS r²   r5  r•   r6  r,   r.   r_   I  s   ÿ)r3  r"   rb   )ri   r4  r1  r,   r6  r.   Útest_backend_nesting_level;  s    þÿr7  Úwith_retrieve_callbackTc              	      sœ   dd l ‰ G ‡ ‡fdd„dtƒ}td|ƒ dd„ ‰| dƒ�Z}tdd�‡fd	d
„tdƒD ƒƒ | tkrt|d jdkstt‚| tkrŽ|d jdksŽt‚W 5 Q R X d S )Nr   c                       s"   e Zd ZdZ”Z” jdd„ ƒZdS )z)test_retrieval_context.<locals>.MyBackendr   c                 s   s   |  j d7  _ d V  d S rl   ræ   rÄ   r,   r,   r.   Úretrieval_contextW  s    z;test_retrieval_context.<locals>.MyBackend.retrieval_contextN)rI   rJ   rK   r^   Zsupports_retrieve_callbackÚcontextmanagerr9  r,   )Ú
contextlibr8  r,   r.   r$  S  s   r$  Z	retrievalc                 S   s   t dd�dd„ t| ƒD ƒƒS )Nr>   rk   c                 s   s   | ]}t tƒ|ƒV  qd S r9   rÉ   r]   r,   r,   r.   r_   _  s     z>test_retrieval_context.<locals>.nested_call.<locals>.<genexpr>ra   )Únr,   r,   r.   Únested_call^  s    z+test_retrieval_context.<locals>.nested_callr>   rk   c                 3   s   | ]}t ˆ ƒ|ƒV  qd S r9   r-  r]   )r=  r,   r.   r_   b  s   ÿz)test_retrieval_context.<locals>.<genexpr>ru   r7   r   )	r;  r   r&   r"   rb   r$   r^   re   r%   )ri   r8  r$  r2  r,   )r;  r=  r8  r.   Útest_retrieval_contextM  s    	

þr>  rê   g¸…ëQ¸ö?c              	   C   s"   t tƒ� t| d� W 5 Q R X d S )N©rê   )r   rN   r"   r?  r,   r,   r.   Útest_invalid_batch_sizeo  s    
r@  z)n_tasks, n_jobs, pre_dispatch, batch_size)r>   r>   rŽ   rô   )r>   r>   r[   rô   )r¸   r>   r[   rô   )i  r>   r[   rô   )r¸   r}   r[   rô   )éÈ   rì   r[   rô   )é   rì   ú
2 * n_jobsr   )éú   rì   rŽ   r   )rD  rì   rC  rM   )rA  rì   rC  rô   c                 C   sJ   |||dœ}dd„ t | ƒD ƒ}tf |Ždd„ t | ƒD ƒƒ}||ksFt‚d S )N)r[   rï   rê   c                 S   s   g | ]}t |ƒ‘qS r,   rs   r]   r,   r,   r.   r/   ‡  s     z0test_dispatch_race_condition.<locals>.<listcomp>c                 s   s   | ]}t tƒ|ƒV  qd S r9   r\   r]   r,   r,   r.   r_   ˆ  s     z/test_dispatch_race_condition.<locals>.<genexpr>rv   )Zn_tasksr[   rï   rê   Úparamsr‘   r‰   r,   r,   r.   Útest_dispatch_race_conditionu  s    ÿrF  c                  C   s8   t  ¡ } tddd�}|j d¡}| ¡ }|| ks4t‚d S )Nr>   r+   rZ   ri   )r   Úget_start_methodr"   Z_backend_argsÚgetre   )Zmp_start_methodrÁ   ri   Zstart_methodr,   r,   r.   Útest_default_mp_contextŒ  s
    rI  c                    s^   | dkrt  d¡} tj d¡}| dd¡‰ t ˆ ˆ j¡ td| d�‡ fdd„t	dƒD ƒƒ d S )	Nr+   r3   r  iè  r>   rZ   c                 3   s    | ]}t tjƒˆ ˆ jƒV  qd S r9   )r#   r   ÚdotÚTr]   ©rC   r,   r.   r_   «  s    zAtest_no_blas_crash_or_freeze_with_subprocesses.<locals>.<genexpr>)
r   r2   r   ÚrandomZRandomStateÚrandnrJ  rK  r"   rb   )r7   Úrngr,   rL  r.   Ú.test_no_blas_crash_or_freeze_with_subprocesses•  s    
ÿrP  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                 C   sB   | dkrt  ¡ dkrt d¡ t | ¡}ttjd|gddd� d S )Nr+   ÚforkzVRequire fork start method to use interactively defined functions with multiprocessing.z-cr¸   ú\[0, 1, 4, 9, 16\]©rÐ   Ústdout_regex)	r   rG  r�   ÚskipÚ,UNPICKLABLE_CALLABLE_SCRIPT_TEMPLATE_NO_MAINÚformatr   r�   Ú
executable)r7   Úcoder,   r,   r.   Ú2test_parallel_with_interactively_defined_functions¿  s    


 þrZ  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_positionr#   rŒ   Úkwargsc              	   C   sv   | dkr$|t kstjdkr$t d¡ tj|| |tj 	tj 	t
j¡¡d�}| d¡}| |¡ ttj|jgddd� d S )	N)r+   r3   Úwin32zNot picklable with pickle)r[  r7   r\  Újoblib_root_folderzunpicklable_func_script.pyr¸   rR  rS  )ÚSQUARE_MAINr�   Úplatformr�   rU  Ú)UNPICKLABLE_CALLABLE_SCRIPT_TEMPLATE_MAINrW  r  ÚpathÚdirnameÚjoblibÚ__file__r©   Úwriter   rX  Ústrpath)r7   r[  r\  ÚtmpdirrY  Z	code_filer,   r,   r.   Ú0test_parallel_with_unpicklable_functions_in_argsý  s&    ÿÿ
 ý


 þrj  aý  import sys
import faulthandler
# Make sure that joblib is importable in the subprocess launching this
# script. This is needed in case we run the tests from the joblib root
# folder without having installed joblib
sys.path.insert(0, {joblib_root_folder!r})

from joblib import Parallel, delayed
from functools import partial

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


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


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

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

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

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

print(Parallel(backend="loky", n_jobs=2)(
    delayed(square2)(MyClass(i), ignored=[dict(a=MyClass(1))])
    for i in range(5)
))
)r_  c                 C   s.   |   d¡}| t¡ ttj|jgdd d� d S )Nz(joblib_interactively_defined_function.pyrR  )rT  rÐ   )r©   rg  Ú5INTERACTIVE_DEFINED_FUNCTION_AND_CLASS_SCRIPT_CONTENTr   r�   rX  rh  ©ri  Úscriptr,   r,   r.   Ú7test_parallel_with_interactively_defined_functions_loky=  s    


ýrn  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                 C   s0   |   d¡}| t¡ ttj|jgdddd� d S )Nz)joblib_interactive_bound_method_script.pyz\[None, None, None\]ZLokyProcessé   )rT  Zstderr_regexrÐ   )r©   rg  Ú9INTERACTIVELY_DEFINED_SUBCLASS_WITH_METHOD_SCRIPT_CONTENTr   r�   rX  rh  rl  r,   r,   r.   Ú:test_parallel_with_interactively_defined_bound_method_lokye  s    

ýrq  c                  C   s"   t g ƒ} tdd�| ƒg kst‚d S )Nr>   rk   )Úiterr"   re   )Zexhausted_iteratorr,   r,   r.   Ú%test_parallel_with_exhausted_iteratoro  s    rs  c                   C   s   t ƒ  t d¡ dS )z+Helper function to force gc in each worker.r¢   N)r   rQ   r   r,   r,   r,   r.   Ú_cleanup_workert  s    rt  c                 C   s"   t | tjƒstdt| ƒƒ‚|  ¡ S )Nz#Expected np.memmap instance, got %r)Ú
isinstancer   ÚmemmapÚ	TypeErrorrW   ÚcopyrL  r,   r,   r.   Úcheck_memmapz  s
    ÿry  c                 C   s    dd„ }t dd| d�dd„ |dƒD ƒƒ}t||t|ƒƒƒD ]\}}tj ||¡ q:t d	d| d�d
d„ |dƒD ƒƒ}t||t|ƒƒƒD ]\}}tj ||¡ q„d S )Nc                 s   s(   t | ƒD ]}tjdtjd�| V  qd S )Nr¸   ©Zdtype)rb   r   ÚonesZfloat32)r<  r^   r,   r,   r.   Úgenerate_arrays‰  s    zBtest_auto_memmap_on_arrays_from_generator.<locals>.generate_arraysr>   r   ©r[   Ú
max_nbytesr7   c                 s   s   | ]}t tƒ|ƒV  qd S r9   ©r#   ry  ©r-   rC   r,   r,   r.   r_   Ž  s    z<test_auto_memmap_on_arrays_from_generator.<locals>.<genexpr>rr   r}   c                 s   s   | ]}t tƒ|ƒV  qd S r9   r  r€  r,   r,   r.   r_   –  s    )r"   rÙ   r†   r   ÚtestingÚassert_array_equal)r7   r|  r‰   Úresultr‘   r,   r,   r.   Ú)test_auto_memmap_on_arrays_from_generator�  s    ÿÿr„  c                 C   s   | S r9   r,   )Úargr,   r,   r.   Úidentityœ  s    r†  c                    sš   |   d¡j}tj}tj|dd�tj|dd�g}t||ƒ t|dd�‰ t	dd�‡ fdd	„d
D ƒƒ\}t
ˆ d tjƒsvt‚ˆ d j|ksˆt‚tj ||¡ d S )Nz	test.mmapÚuint8rz  Úr)Z	mmap_moder>   rk   c                 3   s   | ]}t tƒˆ ƒV  qd S r9   )r#   r†  r•   ©rv  r,   r.   r_   ¨  s     z.test_memmap_with_big_offset.<locals>.<genexpr>)r   r   )r©   rh  ÚmmapÚALLOCATIONGRANULARITYr   Zzerosr{  r   r   r"   ru  rv  re   Úoffsetr�  r‚  )ri  ÚfnameÚsizeÚobjrƒ  r,   r‰  r.   Útest_memmap_with_big_offset   s    
r�  c               	   C   st   t jdd��$} tddd�dd„ tdƒD ƒƒ W 5 Q R X t| ƒdksFt‚| d }t|jtƒs^t‚t	|jƒd	kspt‚d S )
NTr{   r   )r[   rÐ   c                 s   s   | ]}t tƒ|ƒV  qd S r9   r\   r]   r,   r,   r.   r_   °  s     zFtest_warning_about_timeout_not_supported_by_backend.<locals>.<genexpr>é2   r   z’The 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"   rb   r†   re   ru  r   r  r~   )rˆ   r�   r,   r,   r.   Ú3test_warning_about_timeout_not_supported_by_backend®  s    (ÿr’  c                 C   s   || |< |S r9   r,   )Ú
input_listrñ   rz   r,   r,   r.   Úset_list_valueº  s    r”  c                    sV   dgd ‰ t | ddd�‡ fdd„tdƒD ƒƒ}t|ƒ}tdd„ tˆ |ƒD ƒƒsRt‚d S )	Nr   ru   Ú	generatorr1   )r[   Ú	return_asr7   c                 3   s   | ]}t tƒˆ ||ƒV  qd S r9   )r#   r”  r]   ©r“  r,   r.   r_   Æ  s    zPtest_parallel_return_order_with_return_as_generator_parameter.<locals>.<genexpr>c                 s   s   | ]\}}||kV  qd S r9   r,   )r-   Úvrˆ  r,   r,   r.   r_   Ì  s     )r"   rb   rí   rŽ   rÙ   re   )r[   rƒ  r,   r—  r.   Ú=test_parallel_return_order_with_return_as_generator_parameter¿  s    
ÿ
ÿÿr™  c              	   C   sb   dgdgd  }t tƒ�( t ¡ }t| |d�dd„ |D ƒƒ W 5 Q R X t ¡ | }|dk s^t‚d S )NrC   r¸   rr   rZ   c                 s   s   | ]}t tjƒ|ƒV  qd S r9   ©r#   rQ   r   r]   r,   r,   r.   r_   Õ  s    z%test_abort_backend.<locals>.<genexpr>é   )r   rw  rQ   r"   re   )r[   r7   ZdelaysÚt_startÚdtr,   r,   r.   Útest_abort_backendÏ  s    
ÿrž  c                 C   s   t jtdƒtd�}d|d< |S )Ng    €„Arz  Fr   )r   r{  ÚintÚbool)r…  rƒ  r,   r,   r.   Úget_large_objectÛ  s    r¡  c              	   C   sL   t || dd��4}|dd„ tdƒD ƒƒ}t|ƒ t|ƒ ~tƒ  W 5 Q R X d S )Nr•  )r[   r7   r–  c                 s   s   | ]}t tƒ|ƒV  qd S r9   )r#   r¡  r]   r,   r,   r.   r_   é  s     z/test_deadlock_with_generator.<locals>.<genexpr>r¸   )r"   rb   Únextr   )r7   r[   r   rƒ  r,   r,   r.   Útest_deadlock_with_generatorá  s    ÿr£  c              	   C   s~   t tdd��H t|| dd�}|dd„ tdƒD ƒƒ}t ¡ }|dd„ td	ƒD ƒƒ}W 5 Q R X t ¡ | d
k srtdƒ‚~tƒ  d S )Nú)This Parallel instance is already runningrÇ   r•  ©r7   r–  c                 s   s   | ]}t tƒd ƒV  qdS r²   r£   r•   r,   r,   r.   r_   û  s     z/test_multiple_generator_call.<locals>.<genexpr>r¸   c                 s   s   | ]}t tƒ|ƒV  qd S r9   rÉ   r]   r,   r,   r.   r_   ý  s     rr   r>   úZThe error should be raised immediatly when submitting a new task but it took more than 2s.)r   rÃ   r"   rb   rQ   re   r   )r7   r[   r   Úgrœ  Zgen2r,   r,   r.   Útest_multiple_generator_callò  s    ÿ ÿr¨  c              
   C   sŠ   t || dd��j}|dd„ tdƒD ƒƒ}t ¡ }ttdd�� |dd„ td	ƒD ƒƒ}W 5 Q R X t ¡ | d
k sttdƒ‚W 5 Q R X ~tƒ  d S )Nr•  r¥  c                 s   s   | ]}t tƒd ƒV  qdS rÒ   r£   r•   r,   r,   r.   r_     s     z7test_multiple_generator_call_managed.<locals>.<genexpr>r¸   r¤  rÇ   c                 s   s   | ]}t tƒ|ƒV  qd S r9   rÉ   r]   r,   r,   r.   r_     s     rr   r>   r¦  )r"   rb   rQ   r   rÃ   re   r   )r7   r[   r   r§  rœ  Úg2r,   r,   r.   Ú$test_multiple_generator_call_managed  s    ÿÿ ÿrª  c                 C   sˆ   t || dd�dd„ tdƒD ƒƒ}t || dd�dd„ tddƒD ƒƒ}tdd„ t|tdƒƒD ƒƒsbt‚td	d„ t|tddƒƒD ƒƒs„t‚d S )
Nr•  r¥  c                 s   s   | ]}t tƒ|d  ƒV  qdS ©r>   Nr  r]   r,   r,   r.   r_   )  s    z9test_multiple_generator_call_separated.<locals>.<genexpr>r¸   c                 s   s   | ]}t tƒ|d  ƒV  qdS r«  r  r]   r,   r,   r.   r_   ,  s    r›  c                 s   s   | ]\}}||kV  qd S r9   r,   ©r-   r    r^   r,   r,   r.   r_   0  s     c                 s   s   | ]\}}||kV  qd S r9   r,   r¬  r,   r,   r.   r_   1  s     )r"   rb   rŽ   rÙ   re   )r7   r[   r§  r©  r,   r,   r.   Ú&test_multiple_generator_call_separated%  s    ÿÿ r­  zbackend, error)r0   T)r1   F)Ú
sequentialFc              	   C   s8  | dkrt d krt d¡ td| dd�}|dd„ tdƒD ƒƒ}t |d	d
„ ¡}|r^ttdd�nt	ƒ }|�X t
 
¡ }td| dd�dd„ tddƒD ƒƒ}tƒ  tdd„ t|tddƒƒD ƒƒs¼t‚W 5 Q R X t
 
¡ | dk sÚt‚d}|j�r|dk �r|d7 }t
 d¡ qÞt
 
¡ | dk �st‚| ¡ dk�r4|j�s4t‚d S )Nr0   zRequires multiprocessingr>   r•  r¥  c                 s   s   | ]}t tƒd ƒV  qdS rÒ   r£   r]   r,   r,   r.   r_   A  s     z<test_multiple_generator_call_separated_gc.<locals>.<genexpr>r¸   c                   S   s   t dƒS )NzGenerator collected)r¤   r,   r,   r,   r.   Ú<lambda>B  ó    z;test_multiple_generator_call_separated_gc.<locals>.<lambda>z The executor underlying ParallelrÇ   c                 s   s   | ]}t tƒ|d  ƒV  qdS r«  r  r]   r,   r,   r.   r_   M  s    r›  c                 s   s   | ]\}}||kV  qd S r9   r,   r¬  r,   r,   r.   r_   T  s     ru   r   r`   r   g      à?)r   r�   rU  r"   rb   ÚweakrefÚfinalizer   rÃ   r   rQ   r   rŽ   rÙ   re   Úaliver   r"  rÛ   )r7   Úerrorr   r§  Zg_wrr2  rœ  Úretryr,   r,   r.   Ú)test_multiple_generator_call_separated_gc4  s0    
ÿþÿ,r¶  c              	   C   s  |j }tdd| |d��R}|dd„ tj d¡gd D ƒƒ tt |¡ƒdksNt‚|dd„ tdƒD ƒƒ W 5 Q R X td	ƒD ]}t |¡sˆ qšt	d
ƒ qvtdƒ‚tdd| d�}|dd„ tj d¡gd D ƒƒ |dd„ tdƒD ƒƒ td	ƒD ]}t |¡sú �qt	d
ƒ qætdƒ‚d S )Nr>   r   )r[   r~  r7   Ztemp_folderc                 s   s   | ]}t tƒ|ƒV  qd S r9   r  r€  r,   r,   r.   r_   q  s     z(test_memmapping_leaks.<locals>.<genexpr>r¸   r   c                 s   s   | ]}t tƒƒ V  qd S r9   ©r#   rt  r•   r,   r,   r.   r_   {  s     rr   r¢   z/temporary directory of Parallel was not removedr}  c                 s   s   | ]}t tƒ|ƒV  qd S r9   r  r€  r,   r,   r.   r_   ˆ  s     c                 s   s   | ]}t tƒƒ V  qd S r9   r·  r•   r,   r,   r.   r_   ‰  s     )
rh  r"   r   rM  r†   r  Úlistdirre   rb   r   )r7   ri  rÁ   r–   r,   r,   r.   Útest_memmapping_leakse  s*    ÿ  

 

r¹  c                 C   s<   t d| d�dd„ tdƒD ƒƒ}|dd„ tdƒD ƒks8t‚d S )Nr>   rZ   c                 s   s   | ]}t d d„ ƒ|ƒV  qdS )c                 S   s   | d S r=   r,   r?   r,   r,   r.   r¯  š  r°  z2test_lambda_expression.<locals>.<genexpr>.<lambda>Nr-  r]   r,   r,   r.   r_   ™  s    z)test_lambda_expression.<locals>.<genexpr>r¸   c                 S   s   g | ]}|d  ‘qS )r>   r,   r]   r,   r,   r.   r/   ›  s     z*test_lambda_expression.<locals>.<listcomp>)r"   rb   re   )r7   r‰   r,   r,   r.   Útest_lambda_expression“  s    ÿrº  c                    s¦   d}d}d| ‰ t d|| d�}|‡ fdd„t|ƒD ƒƒ |jj|jjksLt‚|jj|jjks`t‚|‡ fdd„t|ƒD ƒƒ |jj|jjksŽt‚|jj|jjks¢t‚d	S )
zCTest that a parallel backend correctly resets its batch statistics.r>   iô  g       @r¸   )rp   r[   r7   c                 3   s   | ]}t tjƒˆ ƒV  qd S r9   rš  r]   ©Ú	task_timer,   r.   r_   §  s     z6test_backend_batch_statistics_reset.<locals>.<genexpr>c                 3   s   | ]}t tjƒˆ ƒV  qd S r9   rš  r]   r»  r,   r.   r_   ­  s     N)r"   rb   rÀ   Z_effective_batch_sizeZ_DEFAULT_EFFECTIVE_BATCH_SIZEre   Z_smoothed_batch_durationZ _DEFAULT_SMOOTHED_BATCH_DURATION)r7   r[   Zn_inputsrÁ   r,   r»  r.   Ú#test_backend_batch_statistics_resetž  s$    ÿÿÿÿr½  c              	   C   s¸  dD ]v}t t|d�jƒtks t‚t|dd�}t |jƒtks>t‚t|dd�}t |jƒtks\t‚t|dd�}t |jƒtkst‚qtdd	dd
�}t |jƒtksœt‚| d	dd��0 tdd�}t |jƒtksÆt‚|jdksÔt‚W 5 Q R X | d	dd��6 tddd�}t |jƒtk�st‚|jdk�st‚W 5 Q R X | d	dd��4 tdd�}t |jƒtk�sRt‚|jdk�sbt‚W 5 Q R X | d	dd��6 tddd�}t |jƒtk�sšt‚|jdk�sªt‚W 5 Q R X d S )N)r   r>   rj   rk   Úthreads©r[   ÚpreferÚ	processesÚ	sharedmem©r[   Úrequirer>   r0   )r[   r7   rÀ  ©rÀ  r`   ©rÄ  r   )rW   r"   rÀ   r  re   r   r!   r[   )ri   r[   rÁ   r,   r,   r.   Ú$test_backend_hinting_and_constraints´  s4    

rÇ  c              	   C   s@  G dd„ dt ƒ}||ƒ ƒ�B tddd�}t|jƒ|ks:t‚tddd�}t|jƒ|ksXt‚W 5 Q R X G dd	„ d	t ƒ}||ƒ ƒ�˜ tddd�}t|jƒ|ksœt‚|  ¡ \}}|d
ks´t‚|d
ksÀt‚tdddd�}t|jƒtksàt‚|  ¡ \}}d}| ¡ |k�st‚|d
k�st‚W 5 Q R X tt	ƒ� t|ƒ dd� W 5 Q R X d S )Nc                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )z[test_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackendTc                 S   s   d S r9   r,   rÄ   r,   r,   r.   Úapply_asyncî  s    zgtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackend.apply_asyncc                 S   s   |S r9   r,   r  r,   r,   r.   r'   ñ  s    zltest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackend.effective_n_jobsN©rI   rJ   rK   Zsupports_sharedmemZuse_threadsrÈ  r'   r,   r,   r,   r.   ÚMyCustomThreadingBackendê  s   rÊ  r>   rÁ  r¿  rÂ  rÃ  c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )z\test_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackendFc                 S   s   d S r9   r,   rÄ   r,   r,   r.   rÈ  ÿ  s    zhtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackend.apply_asyncc                 S   s   |S r9   r,   r  r,   r,   r.   r'     s    zmtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackend.effective_n_jobsNrÉ  r,   r,   r,   r.   ÚMyCustomProcessingBackendû  s   rË  rÿ   r¸   )r[   rÄ  rp   z…Using ThreadingBackend as joblib backend instead of MyCustomProcessingBackend as the latter does not provide shared memory semantics.©r7   rÄ  )
r    r"   rW   rÀ   re   Z
readouterrr   Ústripr   rN   )Zcapsysri   rÊ  rÁ   rË  ÚoutÚerrr‘   r,   r,   r.   Ú9test_backend_hinting_and_constraints_with_custom_backendsä  s*    


rÐ  c                	   C   s¨   t tƒ� tdd� W 5 Q R X t tƒ� tdd� W 5 Q R X t tƒ� tddd� W 5 Q R X td k	r¤t tƒ� tddd� W 5 Q R X t tƒ� td	dd� W 5 Q R X d S )
NÚinvalidrÅ  rÆ  rÁ  rÂ  )rÀ  rÄ  r0   rÌ  r+   )r   rN   r"   r   r,   r,   r,   r.   Ú,test_invalid_backend_hinting_and_constraints  s    




rÒ  c              
      sx   t dd��d}t|jƒj|jjfg}ˆdkr:|W  5 Q R £ S |‡ ‡fdd„tdƒD ƒƒ}||d  W  5 Q R £ S Q R X dS )zCPerform nested parallel calls and introspect the backend on the wayr>   rk   r   c                 3   s(   | ] }t tƒf d ˆd iˆ —ŽV  qdS )Úlimitr   N)r#   Ú_recursive_backend_infor]   ©r]  rÓ  r,   r.   r_   7  s   ÿz*_recursive_backend_info.<locals>.<genexpr>r   N)r"   rW   rÀ   rI   r0  rb   )rÓ  r]  rÁ   Z
this_levelr‰   r,   rÕ  r.   rÔ  0  s    ÿrÔ  c              	   C   sr   | |dd�� t ƒ }W 5 Q R X tƒ dkr2d}d}nd}d}| ¡ d }|df|dfd|fd|fg}||ksnt‚d S )Nr>   rk   r   r   r   ÚBackendr   )rÔ  r(   Útitlere   )ri   r7   Úbackend_types_and_levelsZsecond_level_backend_typeZ	max_levelZtop_level_backend_typeZexpected_types_and_levelsr,   r,   r.   Útest_nested_parallelism_limit<  s    
ürÙ  zThis test requires daskc              
   C   s¸   t jddd�}tjtdƒtjd�}tdƒD ]H}| dƒ� t|d�}W 5 Q R X t|ƒdks\t	‚t
dd	„ |D ƒƒs*t	‚q*| dƒ� tƒ }W 5 Q R X t|ƒdksžt	‚t
d
d	„ |D ƒƒs´t	‚d S )Nr>   )Z	n_workersZthreads_per_workerg    ÐcArz  Údask)Údatar}   c                 s   s   | ]\}}|d kV  qdS ©ZDaskDistributedBackendNr,   ©r-   rx   r–   r,   r,   r.   r_   `  s   ÿz4test_nested_parallelism_with_dask.<locals>.<genexpr>c                 s   s   | ]\}}|d kV  qdS rÜ  r,   rÝ  r,   r,   r.   r_   g  s   ÿ)ÚdistributedZClientr   r{  rŸ  r‡  rb   rÔ  r†   re   rŽ   )ri   ÚclientrÛ  r^   rØ  r,   r,   r.   Ú!test_nested_parallelism_with_daskT  s    
ÿ
ÿrà  c                 C   s   t ƒ dd„ tdƒD ƒƒS )z6A horrible function that does recursive parallel callsc                 s   s   | ]}t tƒƒ V  qd S r9   )r#   Ú_recursive_parallelr]   r,   r,   r.   r_   m  s     z&_recursive_parallel.<locals>.<genexpr>r>   ra   )Znesting_limitr,   r,   r.   rá  k  s    rá  c              
   C   sv   | |dd��  t tƒ�}tƒ  W 5 Q R X W 5 Q R X |j}|dkrdddlm} t||tfƒrdt 	d¡ t|t
ƒsrt‚d S )Nr>   rk   r0   r   )ÚTerminatedWorkerErrorz1Loky worker crash when serializing RecursionError)r   ÚBaseExceptionrá  rz   Z&joblib.externals.loky.process_executorrâ  ru  r   r�   rž   ÚRecursionErrorre   )ri   r7   r  Úexcrâ  r,   r,   r.   Útest_thread_bomb_mitigationp  s    	

ræ  c                  C   s*   i } dD ]}t j |¡| |< q| tdƒfS )N)ÚOMP_NUM_THREADSÚOPENBLAS_NUM_THREADSÚMKL_NUM_THREADSZVECLIB_MAXIMUM_THREADSZNUMEXPR_NUM_THREADSZNUMBA_NUM_THREADSÚ
ENABLE_IPCrr   )r  ÚenvironrH  r   )Zenv_varsÚvarr,   r,   r.   Ú_run_parallel_sum�  s    rí  zNeed OpenMP helper compiledc                 C   s’   t d| d�dd„ tdƒD ƒƒ}ttƒ d dƒ}|D ]Z\}}||ksFt‚| ¡ D ]<\}}| d¡rr|t|ƒksŠt‚qN|dks~t‚|dksNt‚qNq2d S )	Nr>   rZ   c                 s   s   | ]}t tƒƒ V  qd S r9   )r#   rí  r•   r,   r,   r.   r_   ™  s    z-test_parallel_thread_limit.<locals>.<genexpr>r   Z_THREADSrê  Ú1)r"   rb   r  r(   re   ÚitemsÚendswithr~   )r7   r‰   Zexpected_num_threadsZworker_env_varsZomp_num_threadsrx   rz   r,   r,   r.   Útest_parallel_thread_limit–  s    ÿ
rñ  z%This test requires dask NOT installedc              	   C   s$   t tdd�� | dƒ W 5 Q R X d S )NzPlease install daskrÇ   rÚ  )r   rN   r  r,   r,   r.   Ú)test_dask_backend_when_dask_not_installed§  s    rò  c              
   C   sd   G dd„ dt ƒ}d}| |ƒ ƒ�< tjt|d��" tdd�dd„ tdƒD ƒƒ W 5 Q R X W 5 Q R X d S )	Nc                   @   s&   e Zd Zdd„ Zddd„Zdd„ ZdS )	z3test_zero_worker_backend.<locals>.ZeroWorkerBackendc                 _   s   dS rV   r,   )rB   rŒ   r]  r,   r,   r.   r  ´  s    z=test_zero_worker_backend.<locals>.ZeroWorkerBackend.configureNc                 S   s   t dƒ‚d S )NzNo worker availabler   )rB   ÚfuncÚcallbackr,   r,   r.   rÈ  ·  s    z?test_zero_worker_backend.<locals>.ZeroWorkerBackend.apply_asyncc                 S   s   dS rV   r,   r  r,   r,   r.   r'   º  s    zDtest_zero_worker_backend.<locals>.ZeroWorkerBackend.effective_n_jobs)N)rI   rJ   rK   r  rÈ  r'   r,   r,   r,   r.   ÚZeroWorkerBackend³  s   
rõ  z&ZeroWorkerBackend has no active workerrÇ   r>   rk   c                 s   s   | ]}t tƒ|ƒV  qd S r9   rÉ   r]   r,   r,   r.   r_   À  s     z+test_zero_worker_backend.<locals>.<genexpr>)r   r�   r   rÃ   r"   rb   )ri   rõ  Zexpected_msgr,   r,   r.   Útest_zero_worker_backend¯  s
    
rö  c                     s”   da dd„ ‰ ˆ ƒ dkst‚tdd�‡ fdd„tdƒD ƒƒ} t| ƒdhksLt‚da ˆ ƒ dks^t‚tdd�‡ fd	d„tdƒD ƒƒ} t| ƒdhks�t‚d S )
Nzoriginal valuec                   S   s   t S r9   )ÚMY_GLOBAL_VARIABLEr,   r,   r,   r.   Úcheck_globalsË  s    z@test_globals_update_at_each_parallel_call.<locals>.check_globalsr>   rk   c                 3   s   | ]}t ˆ ƒƒ V  qd S r9   r-  r]   ©rø  r,   r.   r_   Ñ  s    z<test_globals_update_at_each_parallel_call.<locals>.<genexpr>zchanged valuec                 3   s   | ]}t ˆ ƒƒ V  qd S r9   r-  r]   rù  r,   r.   r_   Ú  s    )r÷  re   r"   rb   r*  )Zworkers_global_variabler,   rù  r.   Ú)test_globals_update_at_each_parallel_callÃ  s    ÿÿrú  c                  C   s4   dd l } | j dd¡}|  ||¡ ddlm} |ƒ S )Nr   rr   )Úthreadpool_info)ÚnumpyrM  rN  rJ  Zthreadpoolctlrû  )r   rC   rû  r,   r,   r.   Ú_check_numpy_threadpool_limitsä  s
    rý  c                 C   s8   |D ] }|d | d kr|d   S qt d | ¡ƒ‚d S )NÚfilepathÚnum_threadsz,An unexpected module was loaded in child:
{})rN   rW  )Úchild_moduleÚparent_infoÚparent_moduler,   r,   r.   Ú_parent_max_num_threads_forï  s    ÿr  c                 C   s@   | D ]6}|D ],}t ||ƒ}t||ƒ|h}|d |kst‚qqd S )Nrÿ  )r  Úminre   )Zworkers_infor  rÿ  Zchild_threadpool_infor   Zparent_max_num_threadsr‘   r,   r,   r.   Úcheck_child_num_threads÷  s     ÿr  c                 C   sd   t ƒ }t|ƒdkrtjdd� td| d�dd„ tdƒD ƒƒ}t| ƒ} ttƒ |  d	ƒ}t	|||ƒ d S )
Nr   ú&Need a version of numpy linked to BLAS©Úmsgr0   )r7   r[   c                 s   s   | ]}t tƒƒ V  qd S r9   ©r#   rý  r]   r,   r,   r.   r_     s    z;test_threadpool_limitation_in_child_loky.<locals>.<genexpr>r>   r   ©
rý  r†   r�   rU  r"   rb   r'   r  r(   r  )r[   r  Úworkers_threadpool_infosÚexpected_child_num_threadsr,   r,   r.   Ú(test_threadpool_limitation_in_child_loky  s    ÿÿr  Úinner_max_num_threadsc              	   C   sˆ   t ƒ }t|ƒdkrtjdd� | d|d��" t|d�dd„ td	ƒD ƒƒ}W 5 Q R X t|ƒ}|d krtttƒ | d
ƒ}n|}t	|||ƒ d S )Nr   r  r  r0   ©r  rk   c                 s   s   | ]}t tƒƒ V  qd S r9   r	  r]   r,   r,   r.   r_   *  s    z>test_threadpool_limitation_in_child_context.<locals>.<genexpr>r>   r   r
  )ri   r[   r  r  r  r  r,   r,   r.   Ú+test_threadpool_limitation_in_child_context  s    ÿÿr  Úvar_namerè  ré  rç  c              	      sÐ   t dd� ¡  dd„ ‰ tj ˆ¡}zŠdtjˆ< t|d�‡ ‡fdd„td	ƒD ƒƒ}|ddgks`t‚| d
dd��( t|d�‡ ‡fdd„td	ƒD ƒƒ}W 5 Q R X |ddgksªt‚W 5 |d krÀtjˆ= n
|tjˆ< X d S )NT©Zreusec                 S   s   t j | ¡S r9   )r  rë  rH  )r  r,   r,   r.   Ú_get_envE  s    z>test_threadpool_limitation_in_child_override.<locals>._get_envÚ4rk   c                 3   s   | ]}t ˆ ƒˆƒV  qd S r9   r-  r]   ©r  r  r,   r.   r_   L  s    z?test_threadpool_limitation_in_child_override.<locals>.<genexpr>r>   r0   r   r  c                 3   s   | ]}t ˆ ƒˆƒV  qd S r9   r-  r]   r  r,   r.   r_   Q  s    rî  )r   Úshutdownr  rë  rH  r"   rb   re   )ri   r[   r  Zoriginal_var_valuer‰   r,   r  r.   Ú,test_threadpool_limitation_in_child_override7  s"    
ÿÿ
r  c                 C   sJ   dd„ }|| ƒ t dd�}tdƒD ]"}|| ƒ t dd�}||ks"t‚q"d S )Nc                    s,   t dƒ‰ t| d�‡ fdd„t dƒD ƒƒ d S )Nr¸   rk   c                 3   s   | ]}t tƒˆ ƒV  qd S r9   )r#   Úsumr]   r?   r,   r.   r_   d  s     zAtest_loky_reuse_workers.<locals>.parallel_call.<locals>.<genexpr>)rb   r"   rk   r,   r?   r.   Úparallel_callb  s    z.test_loky_reuse_workers.<locals>.parallel_callTr  r¸   )r   rb   re   )r[   r  Zfirst_executorr–   Úexecutorr,   r,   r.   Útest_loky_reuse_workers\  s    

r  )F)r   r   )r`   )N)ÅrL   r  r�   rQ   rŠ  r±  r„   r1   Ú	tracebackr   Úmathr   r   Úpickler   r;  r   r+   r	   r�   re  r   r   r   Zjoblib._multiprocessing_helpersr   Zjoblib.test.commonr   r   r   r   r   Zjoblib.testingr   r   r   r   r   Zjoblib.externals.lokyr   rÞ   r   ÚposixÚImportErrorZ _openmp_test_helper.parallel_sumr   rÞ  Zjoblib._parallel_backendsr   r   r   r    r!   Zjoblib.parallelr"   r#   r$   r%   r&   r'   r(   r)   r*   rx  ZRETURN_GENERATOR_BACKENDSÚpopÚsortedÚkeysZALL_VALID_BACKENDSZPROCESS_BACKENDSZPARALLEL_BACKENDSÚhasattrrÝ   r2   r  r8   r<   r@   Ú	ExceptionrA   rP   rS   rU   rY   rd   rf   rh   Úmarkrn   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ž   r  r  r  r	  r
  r  r  r  r  Úextendrb   r  r  r  r  r!  r#  Z_parallel_backendsr$  r+  r/  r3  r7  r>  r@  rF  rI  rP  rV  rZ  rb  r`  ZSQUARE_LOCALZSQUARE_LAMBDArj  rW  rc  rd  rf  rk  rn  rp  rq  rs  rt  ry  r„  r†  r�  r’  r”  r™  rž  r¡  r£  r¨  rª  r­  r¶  r¹  rº  r½  rÇ  rÐ  rÒ  rÔ  rÙ  rà  rá  Zno_coverræ  rí  rñ  rò  rö  rú  rý  r  r  r  r  r  r  r,   r,   r,   r.   Ú<module>   sè  





ý
ú




D     û         üúÿ


	

ÿ	



ÿ	
öÿ

 (ÿØ,
ÿê
	

ý,+þ.6 ÿ	ÿ!
þ