U
    P»{j¸! ã                   @   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�djd/d0„ZPd1d2„ ZQ�dkd3d4„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ee!dtdudvdwgƒdxdy„ ƒƒƒZfe!dIeFƒdzd{„ ƒZgee!dIeFƒd|d}„ ƒƒZhee!dIeEƒd~d„ ƒƒZiee!dIe=ƒd€d�„ ƒƒZjd‚dƒ„ Zke!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“„ ƒƒZlee!dIeFƒd”d•„ ƒƒZmd–d—„ Znee!dIeEƒd˜d™„ ƒƒZodšd›„ Zpdœd�„ ZqdždŸ„ Zree!dIeFƒejWjsd d¡�d¢d£„ ƒƒƒZtG d¤d¥„ d¥e0ƒZud¦d§„ Zve!dIeDƒd¨d©„ ƒZwee!dIeFƒe!dJdªd«dKgƒd¬d­„ ƒƒƒZxd®d¯„ Zyd°d±„ Zze$edk	d²d¡�d³d´„ ƒZ{dµd¶„ Z|eFdd… Z}e} ~d·d!„ edmƒD ƒ¡ ee!dIe}ƒ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¨�d�d„ Z©�d�d„ ZªejW !dJdKd‘g¡ee!dIe«e@ƒ�dh ƒ�d�d„ ƒƒƒZ¬ejW !dJdKd@g¡e!d=e8e9gƒe$e.dk�dd¡��d�d„ ƒƒƒZ­e!dIeDƒe!dJddKdLd@gƒ�d�d„ ƒƒZ®�d�d„ Z¯�d�d „ Z°ee!dIe@ƒe!�d!�d"�d#gƒe!dJddKdLd@gƒ�d$�d%„ ƒƒƒƒZ±eejW !dJdKd@g¡e!�d!�d"�d#gƒe!d=e8e9gƒe$e.dk�dd¡��d&�d'„ ƒƒƒƒƒZ²e!dIe@ƒe!�d!�d"�d#gƒe!dJddKdLd@gƒ�d(�d)„ ƒƒƒZ³e!dIe@ƒe!�d!�d"�d#gƒe!dJddKdLd@gƒ�d*�d+„ ƒƒƒZ´e!dIe@ƒe!�d,�d"�d#gƒe!�d-�d"�d#gƒe!dJddKdLd@gƒ�d.�d/„ ƒƒƒƒZµe!�d0�d1�d2�d3gƒe!�d,�d"�d#gƒe!�d-�d"�d#gƒ�d4�d5„ ƒƒƒZ¶eee!dIeEƒ�d6�d7„ ƒƒƒZ·e!dIedk�rdd#gndd"d#gƒ�d8�d9„ ƒZ¸ee!dIeEƒ�d:�d;„ ƒƒZ¹ee!d=e8e9gƒ�d<�d=„ ƒƒZºe!d=e8e9gƒ�d>�d?„ ƒZ»�d@�dA„ Z¼�dl�dB�dC„Z½ee!dId"d#gƒe!d=e8e9gƒ�dD�dE„ ƒƒƒZ¾ee!d=e8e9gƒe$e.dk�dd¡��dF�dG„ ƒƒƒZ¿�dm�dH�dI„ZÀejWjÁe!d=e8e9gƒe!dIedk�rd#gnd"d#gƒ�dJ�dK„ ƒƒƒZÂ�dL�dM„ ZÃe!dIedk	�rZdd"gndgƒe$e-dk�dNd¡��dO�dP„ ƒƒZÄe!d=e8e9gƒe$e.dk	�dd¡��dQ�dR„ ƒƒZÅe!d=e8e9gƒ�dS�dT„ ƒZÆ�dU�dV„ ZÇ�dW�dX„ ZÈ�dY�dZ„ ZÉ�d[�d\„ ZÊeee!dJdKd‘dLd@gƒ�d]�d^„ ƒƒƒZËeee!�d_ddKd‘dgƒe!dJdKd@gƒe!d=e8e9gƒ�d`�da„ ƒƒƒƒƒZÌee!dJdKd@gƒe!�db�dc�dd�degƒe!d=e8e9gƒ�df�dg„ ƒƒƒƒZÍee!dJdKd‘d@gƒ�dh�di„ ƒƒZÎdS (n  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,   úX/var/www/html/bwave/python/venv/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Í   Ú	byteorderú<ú>ú=c                    sŒ   dd„ ‰ t  d¡ d¡ | › d�¡‰ˆjj}tddd�‡ ‡fd	d
„tdƒD ƒƒ}|D ]2\}}||ksht‚||jjksxt‚t j	 
ˆ|¡ qTd S )Nc                 S   s   | | j jfS r9   )ÚdtyperÎ   r?   r,   r,   r.   Úinspect_byteorderr  s    z=test_parallel_byteorder_corruption.<locals>.inspect_byteorderé   )r>   r`   Úi4r>   r0   rZ   c                 3   s   | ]}t ˆ ƒˆƒV  qd S r9   ©r#   r•   ©rÓ   r:   r,   r.   r_   y  s    z5test_parallel_byteorder_corruption.<locals>.<genexpr>r`   )r   ZarangeZreshapeÚviewrÒ   rÎ   r"   rb   re   ÚtestingÚassert_array_equal)rÎ   Zinitial_np_byteorderÚresultZ
x_returnedZbyteorder_in_workerr,   r×   r.   Ú"test_parallel_byteorder_corruptionm  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_   †  s    z0test_parallel_timeout_success.<locals>.<genexpr>r¸   )r†   r"   rb   re   r6   r,   r,   r.   Útest_parallel_timeout_successƒ  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_   �  s    z-test_parallel_timeout_fail.<locals>.<genexpr>r¸   )r   r	   r"   rb   r6   r,   r,   r.   Útest_parallel_timeout_failŠ  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d„}t d| d��–}ttdd�� |dd	„ |dd
�D ƒƒ W 5 Q R X ttdd�� |dd	„ |dd
�D ƒƒ W 5 Q R X ttdd�� |dd	„ |dd
�D ƒƒ W 5 Q R X W 5 Q R X d S )Nr   c                 s   s(   t dƒD ]}|| krtdƒ‚|V  qd S )Né   úIterator Raising Error)rb   rN   )Úraise_atr^   r,   r,   r.   Úmy_generatorÝ  s    z1test_error_in_task_iterator.<locals>.my_generatorr>   rZ   rí   rÇ   c                 s   s   | ]}t tƒ|ƒV  qd S r9   r\   r]   r,   r,   r.   r_   æ  s     z.test_error_in_task_iterator.<locals>.<genexpr>)rî   c                 s   s   | ]}t tƒ|ƒV  qd S r9   r\   r]   r,   r,   r.   r_   ë  s     ru   c                 s   s   | ]}t tƒ|ƒV  qd S r9   r\   r]   r,   r,   r.   r_   ï  s     é   )r   )r"   r   rN   )r7   rï   rÁ   r,   r,   r.   Útest_error_in_task_iteratorÙ  s    
""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 ©NrÔ   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_   8  s     z/test_batching_auto_threading.<locals>.<genexpr>éˆ  r   ©r"   rb   rÀ   Zcompute_batch_sizere   )rÁ   r,   r,   r.   Útest_batching_auto_threading2  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_   K  s    z*test_exception_dispatch.<locals>.<genexpr>rÝ   N)r   rN   r"   rb   r,   r,   r,   r.   Útest_exception_dispatchH  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_   P  s    z(nested_function_inner.<locals>.<genexpr>rÝ   ra   rú   r,   r,   r.   Únested_function_innerO  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_   U  s    z(nested_function_outer.<locals>.<genexpr>rÝ   ra   rú   r,   r,   r.   Únested_function_outerT  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_   c  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_dispatchY  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.   Ú	configuret  s    zFakeParallelBackend.configurec                 C   s"   |dk rt t ¡ d | dƒ}|S )Nr   r   )Úmaxr   r(   ©rB   r[   r,   r,   r.   r'   y  s    z$FakeParallelBackend.effective_n_jobs)r   N)r   )rI   rJ   rK   rL   r  r'   r,   r,   r,   r.   r  q  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_backend  s    r  c              	   C   sÜ   t tƒ�}td| d� ¡  W 5 Q R X dt|jƒks6t‚t tƒ�}td| d� ¡  W 5 Q R X dt|jƒkslt‚t tƒ�}td| d� ¡  W 5 Q R X dt|jƒks¢t‚t tƒ�}td| d� ¡  W 5 Q R X dt|jƒksØt‚d S )Nr   rZ   z&n_jobs == 0 in Parallel has no meaningç      à?z2.3z$n_jobs could not be converted to intZinvalid_str)r   rN   r"   Z_initialize_backendr~   rz   re   )r7   r  r,   r,   r.   Útest_invalid_njobsŒ  s    



r  Ú2gffffff@c                 C   sP   t || d�}| ¡ dkst‚|dd„ tdƒD ƒƒ}tdd„ t|ƒD ƒƒsLt‚d S )NrZ   r>   c                 s   s   | ]}t tƒ|ƒV  qd S r9   r\   r]   r,   r,   r.   r_   ¦  s     z.test_njobs_converted_to_int.<locals>.<genexpr>r¸   c                 s   s   | ]\}}|t |ƒkV  qd S r9   rs   )r-   r^   Úrr,   r,   r.   r_   §  s     )r"   Ú_effective_n_jobsre   rb   rŽ   Ú	enumerate)r7   r[   rÁ   r    r,   r,   r.   Útest_njobs_converted_to_intŸ  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_backendª  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_backend³  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_multiprocessing¿  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    
þr1  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   r3  r,   r,   r.   rG   ÿ  s    z%ParameterizedParallelBackend.__init__)NrH   r,   r,   r,   r.   r2  ü  s   r2  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`   )r3  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)   r2  rY   r%  re   r   rX   rW   r3  r"   r[   rÀ   rb   )r‡   ri   r+  r,  rÁ   r‰   r,   r,   r.   Ú*test_parameterized_backend_context_manager  s    ÿ r6  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é+   )r3  ru   rk   c                 s   s   | ]}t tƒ|ƒV  qd S r9   r5  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   r2  r   rX   rW   r3  r"   r[   rÀ   rb   )ri   r+  r,  rÁ   r‰   r,   r,   r.   Ú3test_directly_parameterized_backend_context_manager  s     r8  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"   r!  rb   r,   r,   r,   r.   Úget_nested_pids4  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?  A  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_   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_managerI  s    
þrD  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_backendb  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•   )rE  r,   r.   r_   l  s   ÿz4test_nested_backend_in_sequential.<locals>.<genexpr>r¸   c                 3   s   | ]}t ˆƒˆ ˆƒV  qd S r9   rÖ   r•   ©r7   rE  r[   r,   r.   r_   r  s   ÿra   )r7   r[   ri   r,   rF  r.   Ú!test_nested_backend_in_sequentialZ  s    
þþrG  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_levelx  s    
rK  Úouter_backendrI  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#   rK  r•   ©ri   rI  r,   r.   r_   ‰  s   ÿz-test_backend_nesting_level.<locals>.<genexpr>r¸   rk   c                 3   s   | ]}t tƒˆ ˆd ƒV  qdS r²   rM  r•   rN  r,   r.   r_   �  s   ÿ)rK  r"   rb   )ri   rL  rI  r,   rN  r.   Útest_backend_nesting_level�  s    þÿrO  Ú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_context�  s    z;test_retrieval_context.<locals>.MyBackend.retrieval_contextN)rI   rJ   rK   r^   Zsupports_retrieve_callbackÚcontextmanagerrQ  r,   )Ú
contextlibrP  r,   r.   r=  ™  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]   )rU  r,   r.   r_   ¨  s   ÿz)test_retrieval_context.<locals>.<genexpr>ru   r7   r   )	rS  r   r&   r"   rb   r$   r^   re   r%   )ri   rP  r=  rJ  r,   )rS  rU  rP  r.   Útest_retrieval_context“  s    	

þrV  rþ   g¸…ëQ¸ö?c              	   C   s"   t tƒ� t| d� W 5 Q R X d S )N©rþ   )r   rN   r"   rW  r,   r,   r.   Útest_invalid_batch_sizeµ  s    
rX  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   )r\  r   r[  rM   )rY  r   r[  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_condition»  s    ÿr^  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
    ra  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   r4  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Úrandnrb  rc  r"   rb   )r7   Úrngr,   rd  r.   Ú.test_no_blas_crash_or_freeze_with_subprocessesÛ  s    
ÿrh  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   r_  r�   ÚskipÚ,UNPICKLABLE_CALLABLE_SCRIPT_TEMPLATE_NO_MAINÚformatr   r�   Ú
executable)r7   Úcoder,   r,   r.   Ú2test_parallel_with_interactively_defined_functions  s    


 þrr  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)rs  r7   rt  Újoblib_root_folderzunpicklable_func_script.pyr¸   rj  rk  )ÚSQUARE_MAINr�   Úplatformr�   rm  Ú)UNPICKLABLE_CALLABLE_SCRIPT_TEMPLATE_MAINro  r9  ÚpathÚdirnameÚjoblibÚ__file__r©   Úwriter   rp  Ústrpath)r7   rs  rt  Útmpdirrq  Z	code_filer,   r,   r.   Ú0test_parallel_with_unpicklable_functions_in_argsC  s&    ÿÿ
 ý


 þr‚  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                 C   s.   |   d¡}| t¡ ttj|jgdd d� d S )Nz(joblib_interactively_defined_function.pyrj  )rl  rß   )r©   r  Ú5INTERACTIVE_DEFINED_FUNCTION_AND_CLASS_SCRIPT_CONTENTr   r�   rp  r€  ©r�  Úscriptr,   r,   r.   Ú7test_parallel_with_interactively_defined_functions_lokyƒ  s    


ýr†  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é   )rl  Zstderr_regexrß   )r©   r  Ú9INTERACTIVELY_DEFINED_SUBCLASS_WITH_METHOD_SCRIPT_CONTENTr   r�   rp  r€  r„  r,   r,   r.   Ú:test_parallel_with_interactively_defined_bound_method_loky«  s    

ýr‰  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_iteratorµ  s    r‹  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_workerº  s    rŒ  c                 C   s"   t | tjƒstdt| ƒƒ‚|  ¡ S )Nz#Expected np.memmap instance, got %r)Ú
isinstancer   ÚmemmapÚ	TypeErrorrW   Úcopyrd  r,   r,   r.   Úcheck_memmapÀ  s
    ÿr‘  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¸   ©rÒ   )rb   r   ÚonesZfloat32)rT  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#   r‘  ©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   rÙ   rÚ   )r7   r”  r‰   rÛ   r‘   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Úuint8r’  r   )Z	mmap_moder>   rk   c                 3   s   | ]}t tƒˆ ƒV  qd S r9   )r#   r›  r•   ©rŽ  r,   r.   r_   î  s     z.test_memmap_with_big_offset.<locals>.<genexpr>)r   r   )r©   r€  ÚmmapÚALLOCATIONGRANULARITYr   Zzerosr“  r   r   r"   r�  rŽ  re   ÚoffsetrÙ   rÚ   )r�  Ú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   r�  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   s   |rt dƒ t| ƒS )NrÝ   )r   r   )ÚeÚdelayr,   r,   r.   Ú_sqrt_with_delay  s    r²  c                    sv   t |d| d�dd„ tdƒD ƒƒ‰ t‡ fdd„tdƒD ƒƒ}dgttd	dƒƒ }td
d„ t||ƒD ƒƒsjt‚Š tƒ  d S )NÚgenerator_unorderedrª  c                 s   s$   | ]}t tƒ|d  |dkƒV  qdS )r>   r   N)r#   r²  r]   r,   r,   r.   r_      s    zK_test_parallel_unordered_generator_returns_fastest_first.<locals>.<genexpr>r¸   c                 3   s   | ]}t ˆ ƒV  qd S r9   )Únextr•   ©rÛ   r,   r.   r_   #  s     é	   r   r>   c                 s   s   | ]\}}||kV  qd S r9   r,   r­  r,   r,   r.   r_   '  s    )r"   rb   Úsortedr  rŽ   rè   re   r   )r7   r[   Zquickly_returnedZexpected_quickly_returnedr,   rµ  r.   Ú8_test_parallel_unordered_generator_returns_fastest_first  s    ÿÿÿÿr¸  Ú
sequentialc                 C   s   t | |ƒ d S r9   )r¸  ©r7   r[   r,   r,   r.   Ú7test_parallel_unordered_generator_returns_fastest_first/  s    r»  zThis test requires daskc              
   C   s<   t jddd��$ |dƒ� td | ƒ W 5 Q R X W 5 Q R X d S ©Nr>   ©Z	n_workersZthreads_per_workerÚdask)ÚdistributedÚClientr¸  )r[   ri   r,   r,   r.   ÚAtest_parallel_unordered_generator_returns_fastest_first_with_dask9  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_   K  s    z%test_abort_backend.<locals>.<genexpr>rì   )r   r�  rQ   r"   re   )r[   r7   ZdelaysÚt_startÚdtr,   r,   r.   Útest_abort_backendE  s    
ÿrÅ  c                 C   s   t jtdƒtd�}d|d< |S )Ng    €„Ar’  Fr   )r   r“  ÚintÚbool)rš  rÛ   r,   r,   r.   Úget_large_objectQ  s    rÈ  c              	   C   sL   t || |d��4}|dd„ tdƒD ƒƒ}t|ƒ t|ƒ ~tƒ  W 5 Q R X d S )N)r[   r7   r«  c                 s   s   | ]}t tƒ|ƒV  qd S r9   )r#   rÈ  r]   r,   r,   r.   r_   \  s     z0_test_deadlock_with_generator.<locals>.<genexpr>r¸   )r"   rb   r´  r   )r7   r«  r[   r   rÛ   r,   r,   r.   Ú_test_deadlock_with_generatorW  s    ÿrÉ  r«  r©  r³  c                 C   s   t | ||ƒ d S r9   )rÉ  )r7   r«  r[   r,   r,   r.   Útest_deadlock_with_generatore  s    rÊ  c              
   C   s>   t jddd��& | dƒ� td ||ƒ W 5 Q R X W 5 Q R X d S r¼  )r¿  rÀ  rÉ  )ri   r«  r[   r,   r,   r.   Ú%test_deadlock_with_generator_and_daskm  s     ÿþrË  c              	   C   s~   t tdd��H t|| |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Ç   ©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[   r   ÚgrÃ  Zgen2r,   r,   r.   Útest_multiple_generator_cally  s    ÿ ÿrÐ  c              
   C   sŠ   t || |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Í  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Ï  rÃ  Úg2r,   r,   r.   Ú$test_multiple_generator_call_managed“  s    ÿÿ ÿrÒ  Úreturn_as_1Úreturn_as_2c                 C   s¨   t || |d�dd„ tdƒD ƒƒ}t || |d�dd„ tddƒD ƒƒ}|dkrRt|ƒ}|dkrbt|ƒ}tdd„ t|tdƒƒD ƒƒs‚t‚td	d„ t|tddƒƒD ƒƒs¤t‚d S )
NrÍ  c                 s   s   | ]}t tƒ|d  ƒV  qdS ©r>   Nr5  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Õ  r5  r]   r,   r,   r.   r_   ¹  s    rì   r³  c                 s   s   | ]\}}||kV  qd S r9   r,   ©r-   r    r^   r,   r,   r.   r_   Ã  s     c                 s   s   | ]\}}||kV  qd S r9   r,   rÖ  r,   r,   r.   r_   Ä  s     )r"   rb   r·  rŽ   rè   re   )r7   rÓ  rÔ  r[   rÏ  rÑ  r,   r,   r.   Ú&test_multiple_generator_call_separated®  s    ÿÿ r×  zbackend, error)r0   T)r1   F)r¹  Fc           
   	   C   sH  | dkrt d krt d¡ td| |d�}|dd„ tdƒD ƒƒ}t |dd	„ ¡}|r^ttd
d�nt	ƒ }|�h t
 
¡ }td| |d�dd„ tddƒD ƒƒ}tƒ  |dkrª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�rD|j�sDt‚d S )Nr0   zRequires multiprocessingr>   rÍ  c                 s   s   | ]}t tƒd ƒV  qdS rá   r£   r]   r,   r,   r.   r_   Ø  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>Ù  ó    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Õ  r5  r]   r,   r,   r.   r_   ä  s    rì   r³  c                 s   s   | ]\}}||kV  qd S r9   r,   rÖ  r,   r,   r.   r_   ï  s     ru   r   r`   r   r  )r   r�   rm  r"   rb   ÚweakrefÚfinalizer   rÃ   r   rQ   r   r·  rŽ   rè   re   Úaliver   r!  rê   )
r7   rÓ  rÔ  Úerrorr   rÏ  Zg_wrrJ  rÃ  Úretryr,   r,   r.   Ú)test_multiple_generator_call_separated_gcÇ  s4    
ÿþÿ,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_     s     z(test_memmapping_leaks.<locals>.<genexpr>r¸   r   c                 s   s   | ]}t tƒƒ V  qd S r9   ©r#   rŒ  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     )
r€  r"   r   re  r†   r9  Úlistdirre   rb   r   )r7   r�  rÁ   r–   r,   r,   r.   Útest_memmapping_leaks   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Ø  5  rÙ  z2test_lambda_expression.<locals>.<genexpr>.<lambda>NrÖ   r]   r,   r,   r.   r_   4  s    z)test_lambda_expression.<locals>.<genexpr>r¸   c                 S   s   g | ]}|d  ‘qS )r>   r,   r]   r,   r,   r.   r/   6  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_   B  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_   H  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_reset9  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_constraintsO  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]   ©ru  rü  r,   r.   r_   Ò  s   ÿz*_recursive_backend_info.<locals>.<genexpr>r   N)r"   rW   rÀ   rI   rH  rb   )rü  ru  rÁ   Z
this_levelr‰   r,   rþ  r.   rý  Ë  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  c                 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	‚W 5 Q R X d S )Nr>   r½  g    ÐcAr’  r¾  )Ú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_     s   ÿ)r¿  rÀ  r   r“  rÆ  rœ  rb   rý  r†   re   rŽ   )ri   r  r^   r  r,   r,   r.   Ú!test_nested_parallelism_with_daskï  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_     s     z&_recursive_parallel.<locals>.<genexpr>r>   ra   )Znesting_limitr,   r,   r.   r    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  r�  r   r�   rž   ÚRecursionErrorre   )ri   r7   r  Úexcr  r,   r,   r.   Útest_thread_bomb_mitigation
  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   )r9  Úenvironr`  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_   3  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_limit0  s    ÿ
r  c              	   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_installedA  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Œ   ru  r,   r,   r.   r  M  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ñ  P  s    z?test_zero_worker_backend.<locals>.ZeroWorkerBackend.apply_asyncc                 S   s   dS rV   r,   r  r,   r,   r.   r'   S  s    zDtest_zero_worker_backend.<locals>.ZeroWorkerBackend.effective_n_jobs)N)rI   rJ   rK   r  rñ  r'   r,   r,   r,   r.   ÚZeroWorkerBackendL  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_   Y  s     z+test_zero_worker_backend.<locals>.<genexpr>)r   r�   r   rÃ   r"   rb   )ri   r  Zexpected_msgr,   r,   r.   Útest_zero_worker_backendH  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_globalsd  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_   j  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  s    )r  re   r"   rb   rC  )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)Únumpyre  rf  rb  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   ro  )Ú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 BLASrš   r0   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�   rm  r"   rb   r'   r  r(   r+  )r[   r'  Úworkers_threadpool_infosÚexpected_child_num_threadsr,   r,   r.   Ú(test_threadpool_limitation_in_child_lokyœ  s    ÿÿr1  Ú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   ©r2  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[   r2  r'  r/  r0  r,   r,   r.   Ú+test_threadpool_limitation_in_child_context²  s    ÿÿr4  Ú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   )r9  r  r`  )r5  r,   r,   r.   Ú_get_envÞ  s    z>test_threadpool_limitation_in_child_override.<locals>._get_envÚ4rk   c                 3   s   | ]}t ˆ ƒˆƒV  qd S r9   rÖ   r]   ©r7  r5  r,   r.   r_   å  s    z?test_threadpool_limitation_in_child_override.<locals>.<genexpr>r>   r0   r   r3  c                 3   s   | ]}t ˆ ƒˆƒV  qd S r9   rÖ   r]   r9  r,   r.   r_   ê  s    r  )r   Úshutdownr9  r  r`  r"   rb   re   )ri   r[   r5  Zoriginal_var_valuer‰   r,   r9  r.   Ú,test_threadpool_limitation_in_child_overrideÐ  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_   ý  s     zAtest_loky_reuse_workers.<locals>.parallel_call.<locals>.<genexpr>)rb   r"   rk   r,   r?   r.   Úparallel_callû  s    z.test_loky_reuse_workers.<locals>.parallel_callTr6  r¸   )r   rb   re   )r[   r=  Zfirst_executorr–   Úexecutorr,   r,   r.   Útest_loky_reuse_workersõ  s    

r?  )F)r   r   )r`   )N)ÏrL   r9  r�   rQ   rž  rÚ  r„   r1   Ú	tracebackr   Úmathr   r   Úpickler   rS  r   r+   r	   r�   r}  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*   r�  ZRETURN_GENERATOR_BACKENDSÚpopr·  Ú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&  r(  r-  r0  Úextendrb   r1  r2  r6  r8  r;  r<  Z_parallel_backendsr=  rD  rG  rK  rO  rV  rX  r^  ra  rh  rn  rr  rz  rx  ZSQUARE_LOCALZSQUARE_LAMBDAr‚  ro  r{  r|  r~  rƒ  r†  rˆ  r‰  r‹  rŒ  r‘  r™  r›  r¤  r¦  r¨  r¯  r²  r¸  rC  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+  r1  r4  r;  r?  r,   r,   r,   r.   Ú<module>   s*  





ý
ú




D     û         üúÿ


	

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