ó
    oñ:iÓª  ã                   ó  • S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
Jr  S SKrS SKJr  S SKJrJrJrJrJrJr  S SKJr  S SKJr  S SKJrJr  S SKJr  S SK J!r!J"r"J#r#J$r$J%r%  S S	K&J'r'J(r(J)r)  S
 r*S r+S r,S r-S r.\%\$S 5       5       r/\%\$\)" \R                  S:g  SS9S 5       5       5       r0\%\$S 5       5       r1\%S 5       r2\%\$\'" S\\Rf                  /SS/S9S 5       5       5       r4\%\$\'" S\\Rf                  /SS/S9S 5       5       5       r5\%\$\'" SSS/5      S 5       5       5       r6\%\$\'" SSS/5      S 5       5       5       r7\%\$\'" SSS/5      S 5       5       5       r8\%\$\'" SSS/5      S  5       5       5       r9\%\$S! 5       5       r:\%\$S" 5       5       r;\%\$\'" SSS/5      S# 5       5       5       r<\%\$\'" SSS/5      S$ 5       5       5       r=\%\$\'" SSS/5      S% 5       5       5       r>\%\$\'" S\\Rf                  /SS/S9S& 5       5       5       r?\%\$\'" S\R€                  " S\R‚                  R…                  S'S9S(9S/5      S) 5       5       5       rC\%\$\'" S\\Rf                  /SS/S9S* 5       5       5       rD\%\$\#\'" S\\Rf                  /SS/S9S+ 5       5       5       5       rE\%\$\#\'" S\\Rf                  /SS/S9S, 5       5       5       5       rF\%\$\'" S\\Rf                  /SS/S9S- 5       5       5       rGS. rH\%\$\'" S\\Rf                  /SS/S9S/ 5       5       5       rIS0 rJ\%\$\'" S1\K" \R˜                  " \\Rf                  /\M" S25      5      5      \R˜                  " SS/\N" \O\M" S25      5      5       V Vs/ s H  u  pS3R¡                  X5      PM     snn S9S4 5       5       5       rQS5 rRS6 rS\%\)" \R                  S:H  S7S9\'" S8S9S:/5      S; 5       5       5       rT\%S< 5       rUS= rV\%\$S> 5       5       rW\%\$S? 5       5       rXgs  snn f )@é    N)Úsleep)ÚArrayMemmapForwardReducerÚ_get_backing_memmapÚ_get_temp_dirÚ_strided_from_memmapÚ_WeakArrayKeyMapÚhas_shareable_memory)Úmake_memmap)Ú_TestingMemmappingExecutor)ÚParallelÚdelayed)ÚMemmappingPool)ÚIS_GIL_DISABLEDÚnpÚwith_dev_shmÚwith_multiprocessingÚ
with_numpy)ÚparametrizeÚraisesÚskipifc                  ó.   • [         R                  " SSS9  g )Ni,  T)ÚtimeoutÚexit)ÚfaulthandlerÚdump_traceback_later© ó    Ú^/srv/projetos/modelo_ml_acdoc/venv/lib/python3.13/site-packages/joblib/test/test_memmapping.pyÚsetup_moduler   &   s   € Ü×%Ò%¨c¸Ó=r   c                  ó.   • [         R                  " 5         g ©N)r   Úcancel_dump_traceback_laterr   r   r   Úteardown_moduler#   *   s   € Ü×,Ò,Õ.r   c                 ó"   • [        U 5      c   eU $ r!   )r   )Úarrays    r   Úcheck_memmap_and_send_backr&   .   s   € Ü˜uÓ%Ñ1Ð1Ð1Ø€Lr   c                 óR   • U u  pn[         R                  R                  X   U5        g)z„Dummy helper function to be executed in subprocesses

Check that the provided array has the expected values in the provided
range.

N©r   ÚtestingÚassert_array_equal©ÚargsÚdataÚpositionÚexpecteds       r   Úcheck_arrayr0   3   s$   € ð  $Ñ€D�HÜ‡J�J×!Ñ! $¡.°(Õ;r   c                 ó„   • U u  pnX   U:X  d   eX==   S-  ss'   [         R                  R                  X   SU-  5        g)zÌDummy helper function to be executed in subprocesses


Check that the input array has the right values in the provided range
and perform an inplace modification to double the values in the range by
two.

é   Nr(   r+   s       r   Úinplace_doubler3   >   sD   € ð  $Ñ€D�HØ‰>˜XÓ%Ð%Ð%ØƒN�aÑƒNÜ‡J�J×!Ñ! $¡.°!°h±,Õ?r   c           	      ó^  ^• [         R                  R                  nU R                  S5      R                  n[         R
                  " U[         R                  SSS9nS[         R                  " UR                  S   UR                  S9-  USS& UR                  5         [         R
                  " U[         R                  S	S
SSS9n[         R                  " S5      R                  UR                  5      USS& USS2SS2SS24   nUR                  SS5      n[         R                  " U5      nUR                  n[        SU R                  SS5      mU4S jn	U	" U5      n
[        U
5      (       d   e[!        U
[         R
                  5      (       d   eU" X¤5        U	" U5      n[        U5      (       d   eU" Xµ5        U	" U5      n[        U5      (       d   eU" XÆ5        U	" U5      n[!        U[         R
                  5      (       a   e[        U5      (       d   eU" X×5        U	" U5      n[!        U[         R
                  5      (       a   e[        U5      (       d   eU" Xè5        US-  n[        U5      (       a   eU	" U5      n[        U5      (       a   e[!        U[         R
                  5      (       a   eU" UUS-  5        [         R                  " U5      n[        U5      (       a   eU	" U5      n[!        U[         R"                  5      (       d   e[        U5      (       a   eU" UU5        g)z9Check that it is possible to reduce a memmap backed arrayú	test.mmapiô  úw+©ÚdtypeÚshapeÚmodeg      ð¿r   ©r8   N)é   é   é   úr+ÚFr>   )r8   r9   r:   ÚorderÚoffseté<   é   éÿÿÿÿr2   é
   é2   ÚcTc                 ó"   >• T" U 5      u  pU" U6 $ r!   r   ©ÚxÚconsr,   Úreducers      €r   Úreconstruct_array_or_memmapÚEtest_memmap_based_array_reducing.<locals>.reconstruct_array_or_memmaps   ó   ø€ Ù˜Q“Z‰
ˆÙ�Tˆ{Ðr   r<   )r   r)   r*   ÚjoinÚstrpathÚmemmapÚfloat64Úaranger9   r8   ÚflushÚreshapeÚasarrayÚTr   r	   Ú
isinstanceÚndarray)Útmpdirr*   ÚfilenameÚbufferÚaÚbÚb2rH   ÚdrN   Úa_reconstructedÚb_reconstructedÚb2_reconstructedÚc_reconstructedÚd_reconstructedÚa3Úa3_reconstructedÚb3Úb3_reconstructedrM   s                      @r   Ú test_memmap_based_array_reducingrl   M   sÙ  ø€ ô Ÿ™×6Ñ6ÐØ�{‰{˜;Ó'×/Ñ/€Hô �YŠY�x¤r§z¡z¸À4ÑH€Fð ”r—y’y §¡¨a¡¸¿¹ÑEÑE€F‰1€IØ
‡L�L„Nô 	�	Š	ØœŸ
™
¨)¸$ÀcÐRSñ	€Aô �9Š9�R‹=× Ñ  §¡Ó)€A�a€Dð
 	
ˆ!ˆBˆ$��"��a˜�cˆ/Ñ€Að 
�‰˜˜BÓ	€Bô 	�
Š
�1‹€AØ	�‰€Aô (¨¨f¯n©n¸cÀ4ÓH€Gõñ
 2°!Ó4€OÜ ×0Ñ0Ð0Ð0Ü�o¤r§y¡y×1Ñ1Ð1Ð1Ù�Ô*ñ 2°!Ó4€OÜ ×0Ñ0Ð0Ð0Ù�Ô*ñ 3°2Ó6ÐÜÐ 0×1Ñ1Ð1Ð1ÙÐ'Ô,ñ 2°!Ó4€OÜ˜/¬2¯9©9×5Ñ5Ð5Ð5Ü ×0Ñ0Ð0Ð0Ù�Ô*á1°!Ó4€OÜ˜/¬2¯9©9×5Ñ5Ð5Ð5Ü ×0Ñ0Ð0Ð0Ù�Ô*ð 
ˆQ‰€BÜ# B×'Ñ'Ð'Ð'Ù2°2Ó6ÐÜ#Ð$4×5Ñ5Ð5Ð5ÜÐ*¬B¯I©I×6Ñ6Ð6Ð6ÙÐ'¨¨Q©Ô/ô 
�Š�B‹€BÜ# B×'Ñ'Ð'Ð'á2°2Ó6ÐÜÐ&¬¯
©
×3Ñ3Ð3Ð3Ü#Ð$4×5Ñ5Ð5Ð5ÙÐ'¨Õ,r   Úwin32z2PermissionError only easily triggerable on Windows)Úreasonc                 óÈ  • U R                  S5      R                  nSR                  US9n[        R                  " [
        R                  SU/[        R                  [        R                  S9nUR                  5         UR                  5       u  pEUR                  S:X  d   UR                  5       5       eUS:X  d   eSR                  U5      nXeR                  5       ;   d   eg )	Nr5   aæ  if 1:
    import os
    import numpy as np
    import time
    from joblib.externals.loky.backend import resource_tracker
    resource_tracker.VERBOSE = 1

    # Start the resource tracker
    resource_tracker.ensure_running()
    time.sleep(1)

    # Create a file containing numpy data
    memmap = np.memmap(r"{filename}", dtype=np.float64, shape=10, mode='w+')
    memmap[:] = np.arange(10).astype(np.int8).data
    memmap.flush()
    assert os.path.exists(r"{filename}")
    del memmap

    # Create a np.memmap backed by this file
    memmap = np.memmap(r"{filename}", dtype=np.float64, shape=10, mode='w+')
    resource_tracker.register(r"{filename}", "file")

    # Ask the resource_tracker to delete the file backing the np.memmap , this
    # should raise PermissionError that the resource_tracker will log.
    resource_tracker.maybe_unlink(r"{filename}", "file")

    # Wait for the resource_tracker to process the maybe_unlink before cleaning
    # up the memmap
    time.sleep(2)
    )r]   ú-c©ÚstderrÚstdoutr   r   z'tried to unlink {}, got PermissionError)rQ   rR   ÚformatÚ
subprocessÚPopenÚsysÚ
executableÚPIPEÚwaitÚcommunicateÚ
returncodeÚdecode)r\   r]   ÚcmdÚpÚoutÚerrÚmsgs          r   Ú2test_resource_tracker_retries_when_permissionerrorrƒ   ¥   s¿   € ð �{‰{˜;Ó'×/Ñ/€Hð÷: 	‰˜ˆÐ!ð; ô< 	×ÒÜ	�‰˜˜sÐ#¬J¯O©OÄJÇOÁOñ	€Að ‡F�F„HØ�}‰}‹�H€CØ�<‰<˜1ÓÐ*˜cŸj™j›lÓ*ÐØ�#‹:Ðˆ:Ø
3×
:Ñ
:¸8Ó
D€CØ—*‘*“,ÓÐÑr   c                 ó>  ^• [         R                  R                  nU R                  S5      R                  n[         R
                  " U[         R                  SSS9n[         R                  " S5      R                  UR                  5      US S & USS nUS S 2SS24   nUS S 2S S 2S S 2S4   nUS	S
S2   n[        S U R                  SS5      mU4S jnU" U5      n	[        U	5      (       d   e[        U	[         R
                  5      (       d   eU" X“5        U" U5      n
[        U
5      (       d   eU" X¤5        U" U5      n[        U5      (       d   eU" Xµ5        U" U5      n[        U5      (       d   eU" XÆ5        U" U5      n[        U5      (       d   eU" X×5        g )Nr5   )éd   é   r†   r<   r6   r7   i¬ r   rF   r=   rD   r<   r>   rH   Tc                 ó"   >• T" U 5      u  pU" U6 $ r!   r   rJ   s      €r   rN   ÚNtest_high_dimension_memmap_array_reducing.<locals>.reconstruct_array_or_memmapë   rP   r   )r   r)   r*   rQ   rR   rS   rT   rU   rW   r9   r   r	   rZ   )r\   r*   r]   r_   r`   rH   rb   ÚerN   rc   rd   rf   rg   Úe_reconstructedrM   s                 @r   Ú)test_high_dimension_memmap_array_reducingr‹   ×   s‡  ø€ ô Ÿ™×6Ñ6Ðà�{‰{˜;Ó'×/Ñ/€Hô 	�	Š	�(¤"§*¡*Ð4DÈ4ÑP€AÜ�9Š9Ð&Ó'×/Ñ/°·±Ó8€A�a€Dð 	
ˆ!ˆBˆ€AØ	Š!ˆQˆrˆTˆ'‰
€AØ	Š!ŠQ’�1ˆ*‰€AØ	ˆ!ˆAˆaˆ%‰€Aô (¨¨f¯n©n¸cÀ4ÓH€Gõñ 2°!Ó4€OÜ ×0Ñ0Ð0Ð0Ü�o¤r§y¡y×1Ñ1Ð1Ð1Ù�Ô*á1°!Ó4€OÜ ×0Ñ0Ð0Ð0Ù�Ô*á1°!Ó4€OÜ ×0Ñ0Ð0Ð0Ù�Ô*á1°!Ó4€OÜ ×0Ñ0Ð0Ð0Ù�Ô*á1°!Ó4€OÜ ×0Ñ0Ð0Ð0Ù�Õ*r   c                 óž  • U R                  S5      R                  nS[        R                  -  n[        R                  S-   n[        R
                  " USX#-   S9n[        USSUSUS S S	S
9	n[        U[        R
                  5      (       d   eUR                  U:X  d   e[        USSUSUS-  4SUS	S
9	n[        U5      R                  U:X  d   eg )Nr5   r=   rD   r6   )r:   r9   Úuint8ÚrÚCF)r8   r:   rB   rA   r9   ÚstridesÚtotal_buffer_lenÚunlink_on_gc_collectr2   )r2   )
rQ   rR   ÚmmapÚALLOCATIONGRANULARITYr   rS   r   rZ   rB   r   )r\   ÚfnameÚsizerB   Ú
memmap_objÚmemmap_backed_objs         r   Útest__strided_from_memmapr™     sä   € à�K‰K˜Ó$×,Ñ,€EØŒt×)Ñ)Ñ)€DÜ×'Ñ'¨!Ñ+€Fä—’˜5 t°4±=ÑA€Jä%ØØØØØØØØØ"ñ
€Jô �j¤"§)¡)×,Ñ,Ð,Ð,Ø×Ñ Ó&Ð&Ð&Ü,ØØØØØØ�q‰yˆlØØØ"ñ
Ðô Ð0Ó1×8Ñ8¸FÓBÐBÑBr   ÚfactoryÚmultiprocessingÚloky)Úidsc                 óš  • [         R                  R                  nUR                  S5      R                  nU " SSUS9n UR                  S5      R                  n[         R                  " U[         R                  SSS9nUR                  S	5        UR                  [        [        UR                  S
   5       VVs/ s H(  n[        UR                  S   5        H  o†Xx4S	4PM
     M*     snn5        U" US[         R                  " UR                  5      -  5        [         R                  " U[         R                  SSS9n	UR                  [        [        U	R                  S
   5       VVs/ s H(  n[        U	R                  S   5        H  o‰Xx4S4PM
     M*     snn5        [        R                  " U5      / :X  d   eU" US[         R                  " UR                  5      -  5        U" U	S[         R                  " U	R                  5      -  5        [         R                  " U[         R                  SSSS9n
[!        ["        5         UR                  [$        [        U
R                  S
   5       Vs/ s H  ozUS4PM	     sn5        SSS5        [!        [&        [(        45         UR                  [        [        U
R                  S
   5       Vs/ s H  ozUS4PM	     sn5        SSS5        UR+                  5         Ags  snnf s  snnf s  snf ! , (       d  f       NŽ= fs  snf ! , (       d  f       NG= f! UR+                  5         Af = f)z@Check that subprocess can access and update shared memory memmapÚpoolrF   r2   ©Ú
max_nbytesÚtemp_folderr5   ©r<   r=   r6   r7   ç      ð?r   rD   )r=   r<   rH   g       @©rF   rŽ   é   )r8   r9   r:   rB   g      @N)r   r)   r*   ÚmkdirrR   rQ   rS   Úfloat32ÚfillÚmapr3   Úranger9   ÚonesÚosÚlistdirr   ÚAssertionErrorr0   ÚRuntimeErrorÚ
ValueErrorÚ	terminate)rš   r\   r*   Úpool_temp_folderr   r]   r_   ÚiÚjr`   rH   s              r   Útest_pool_with_memmapr¶   (  s…  € ô Ÿ™×6Ñ6Ðð —|‘| FÓ+×3Ñ3ÐÙ�˜qÐ.>Ñ?€Að)Ø—;‘;˜{Ó+×3Ñ3ˆÜ�IŠI�h¤b§j¡j¸ÀTÑJˆØ	�‰ˆsŒà	�‰ÜÜ',¨Q¯W©W°Q©ZÔ'8ÔTÒ'8 !Ä%ÈÏÉÐPQÉ
×BS¸Q�!�˜ÓÑBSÑÑ'8ÒTô	
ñ
 	˜1˜a¤"§'¢'¨!¯'©'Ó"2Ñ2Ô3ô �IŠI�h¤b§j¡j¸ÀSÑIˆà	�‰ÜÜ',¨Q¯W©W°Q©ZÔ'8ÔTÒ'8 !Ä%ÈÏÉÐPQÉ
×BS¸Q�!�˜ÓÑBSÑÑ'8ÒTô	
ô �zŠzÐ*Ó+¨rÓ1Ð1Ð1ñ 	˜1˜a¤"§'¢'¨!¯'©'Ó"2Ñ2Ô3Ù˜1˜a¤"§'¢'¨!¯'©'Ó"2Ñ2Ô3ô �IŠI�h¤b§j¡j¸ÀCÐPUÑVˆä”NÕ#Ø�E‰E”+´U¸1¿7¹7À1¹:Ô5FÓGÒ5F° A s£Ñ5FÑGÔH÷ $ô
 ”\¤:Ð.Õ/Ø�E‰E”.¼¸a¿g¹gÀa¹jÔ8IÓ"JÒ8I°1 q¨#£;Ñ8IÑ"JÔK÷ 0ð 	
�‰ŒÙùóE Uùó Uùò  H÷ $Õ#üò #K÷ 0Õ/ûð 	
�‰ŒÙús€   ¿A<L7 Â;/K?Ã*BL7 Å,/LÆB-L7 É+LÉ3LÊLÊL7 Ê%+L&ËL!ËL&Ë%L7 Ë?L7 ÌLÌ
LÌL7 Ì!L&Ì&
L4Ì0L7 Ì7M
c                 ó¶  • [         R                  R                  nUR                  S5      R                  nU " SSUS9n UR                  S5      R                  n[         R                  " U[         R                  SSS9nUR                  S	5        [         R                  " U5      n[        U[         R                  5      (       a   e[        U5      (       d   eUR                  [        [        UR                  S
   5       VV	s/ s H)  n[        UR                  S   5        H	  n	XxU	4S	4PM     M+     sn	n5        U" US[         R                   " UR                  5      -  5        U" US[         R                   " UR                  5      -  5        ["        R$                  " U5      / :X  d   e UR'                  5         Ags  sn	nf ! UR'                  5         Af = f)z?Check that subprocess can access and update shared memory arrayrŸ   rF   r2   r    r5   r£   r6   r7   r¤   r   rD   N)r   r)   r*   r§   rR   rQ   rS   r¨   r©   rX   rZ   r	   rª   r3   r«   r9   r¬   r­   r®   r²   )
rš   r\   r*   r³   r   r]   r_   Úa_viewr´   rµ   s
             r   Ú test_pool_with_memmap_array_viewr¹   b  s€  € ô Ÿ™×6Ñ6Ðð —|‘| FÓ+×3Ñ3ÐÙ�˜qÐ.>Ñ?€AðØ—;‘;˜{Ó+×3Ñ3ˆÜ�IŠI�h¤b§j¡j¸ÀTÑJˆØ	�‰ˆsŒô —’˜A“ˆÜ˜f¤b§i¡i×0Ñ0Ð0Ð0Ü# F×+Ñ+Ð+Ð+à	�‰Üô ˜qŸw™w q™zÔ*ôâ*�AÜ˜qŸw™w q™z×*�Að ˜Q˜ Ó%á*ñ &Ù*òô	
ñ 	˜1˜a¤"§'¢'¨!¯'©'Ó"2Ñ2Ô3Ù˜6 1¤r§w¢w¨q¯w©wÓ'7Ñ#7Ô8ô �zŠzÐ*Ó+¨rÓ1Ð1Ñ1ð 	
�‰ŒÙùó#øð  	
�‰ŒÙús   ¿CG Ä0F?Ä4A8G Æ?G ÇGÚbackendc                 ó^  • SR                  U S9n[        R                  " [        R                  SU/[        R
                  [        R
                  S9nUR                  5         UR                  5       u  p4UR                  S:X  d)   UR                  5       S-   UR                  5       -   5       eg )Ná€  if 1:
        import numpy as np
        from joblib import Parallel, delayed


        data = np.random.rand(int(2e6)).reshape((int(1e6), 2))

        # Build a complex cyclic reference that is likely to delay garbage
        # collection of the memmapped array in the worker processes.
        first_list = current_list = [data]
        for i in range(10):
            current_list = [current_list]
        first_list.append(current_list)

        if __name__ == "__main__":
            results = Parallel(n_jobs=2, backend="{b}")(
                delayed(len)(current_list) for i in range(10))
            assert results == [1] * 10
    ©r`   rp   rq   r   ú

)
rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   ©rº   r~   r   r€   r�   s        r   Ú-test_permission_error_windows_reference_cyclerÀ   �  s‹   € ð÷$ 	‰�ˆÐð% ô& 	×ÒÜ	�‰˜˜sÐ#¬J¯O©OÄJÇOÁOñ	€Að ‡F�F„HØ�}‰}‹�H€CØ�<‰<˜1ÓÐB˜cŸj™j›l¨VÑ3°c·j±j³lÑBÓBÑr   c                 óè  • SR                  U S9n[        S5       HÔ  n[        R                  R	                  5       n[        R
                  R                  [        5      US'   [        R                  " [        R                  SU/[        R                  [        R                  US9nUR                  5         UR                  5       u  pVUR                  S:X  d   U5       eUS:X  d   eS	U;  a  MÔ   e   g )
Nak  if 1:
        import os
        import time

        import numpy as np

        from joblib import Parallel, delayed
        from testutils import return_slice_of_data

        data = np.ones(int(2e6))

        if __name__ == '__main__':
            # warm-up call to launch the workers and start the resource_tracker
            _ = Parallel(n_jobs=2, verbose=5, backend='{b}')(
                delayed(id)(i) for i in range(20))

            time.sleep(0.5)

            slice_of_data = Parallel(n_jobs=2, verbose=5, backend='{b}')(
                delayed(return_slice_of_data)(data, 0, 20) for _ in range(10))
    r½   r<   Ú
PYTHONPATHrp   ©rr   rs   Úenvr   r   ó   resource_tracker)rt   r«   r­   ÚenvironÚcopyÚpathÚdirnameÚ__file__ru   rv   rw   rx   ry   rz   r{   r|   )rº   r~   Ú_rÄ   r   r€   r�   s          r   Ú3test_permission_error_windows_memmap_sent_to_parentrÌ   ´  sÉ   € ð÷( 	‰�ˆÐð) ô, �1ŽXˆÜ�j‰j�o‰oÓˆÜŸG™GŸO™O¬HÓ5ˆˆLÑÜ×ÒÜ�^‰^˜T 3Ð'Ü—?‘?Ü—?‘?Øñ	
ˆð 	
�‰ŒØ—=‘=“?‰ˆØ�|‰|˜qÓ Ð% #Ó%Ð Ø�c‹zÐˆzØ"¨#Õ-Ð-Ð-ò r   c                 ó`  ^• [         R                  " [        S5      5      m[        SU SS9" U4S j[	        S5       5       5      u  n[        SU SS9" U4S j[	        S5       5       5      u  n[
        R                  R                  U5      [
        R                  R                  U5      :w  d   eg )Nç      Y@r2   rF   ©Ún_jobsrº   r¡   c              3   óP   >#   • U  H  n[        [        5      " TS 5      v •  M     g7f©r]   N©r   Úgetattr©Ú.0rË   r%   s     €r   Ú	<genexpr>Ú6test_parallel_isolated_temp_folders.<locals>.<genexpr>ë  ó$   øé € ð FÚ5=°Œ”Ô˜ 
×+Ð+²Xùó   ƒ#&rD   c              3   óP   >#   • U  H  n[        [        5      " TS 5      v •  M     g7frÒ   rÓ   rÕ   s     €r   r×   rØ   î  rÙ   rÚ   ©r   rU   Úintr   r«   r­   rÈ   rÉ   )rº   Ú
filename_1Ú
filename_2r%   s      @r   Ú#test_parallel_isolated_temp_foldersrà   ä  s“   ø€ ô �IŠI”c˜#“hÓ€EÜ 1¨gÀ"ÒEô FÜ5:¸1´XóFó �L€Zô  1¨gÀ"ÒEô FÜ5:¸1´XóFó �L€Zô �7‰7�?‰?˜:Ó&¬"¯'©'¯/©/¸*Ó*EÓEÐEÑEr   c                 ó†  ^• [         R                  " [        S5      5      m[        SU SS9 nU" U4S j[	        S5       5       5      u  nU" U4S j[	        S5       5       5      u  nS S S 5        [
        R                  R                  W5      [
        R                  R                  W5      :X  d   eg ! , (       d  f       NQ= f)NrÎ   r2   rF   rÏ   c              3   óP   >#   • U  H  n[        [        5      " TS 5      v •  M     g7frÒ   rÓ   rÕ   s     €r   r×   Ú9test_managed_backend_reuse_temp_folder.<locals>.<genexpr>û  ó    øé € ÐOÂhÀœ¤Ô)¨%°×<Ð<ÂhùrÚ   rD   c              3   óP   >#   • U  H  n[        [        5      " TS 5      v •  M     g7frÒ   rÓ   rÕ   s     €r   r×   rã   ü  rä   rÚ   rÜ   )rº   r   rÞ   rß   r%   s       @r   Ú&test_managed_backend_reuse_temp_folderræ   ô  s‰   ø€ ô
 �IŠI”c˜#“hÓ€EÜ	˜ G¸Ò	;¸qÙÔOÄeÈAÄhÓOÓO‰ˆÙÔOÄeÈAÄhÓOÓO‰ˆ÷ 
<ô �7‰7�?‰?˜:Ó&¬"¯'©'¯/©/¸*Ó*EÓEÐEÑE÷ 
<Õ	;ús   ¬;B2Â2
C c                  óš  • [         R                  " [        S5      5      n [        5       n[        5       nS n[        R
                  " X0U4S9n[        R
                  " X0U4S9nUR                  5         UR                  5         UR                  5         UR                  5         [        U5      S:X  d   e[        U5      S:X  d   eX:w  d   eg )NrÎ   c                 ó
  ^ • [        SSSS9 n[        S5       HN  nU" U 4S j[        S5       5       5      u  nUR                  [        R                  R                  U5      5        MP     S S S 5        g ! , (       d  f       g = f)Nrœ   r2   rF   )rº   rÐ   r¡   c              3   óP   >#   • U  H  n[        [        5      " TS 5      v •  M     g7frÒ   rÓ   rÕ   s     €r   r×   Ú]test_memmapping_temp_folder_thread_safety.<locals>.concurrent_get_filename.<locals>.<genexpr>  s    øé € ÐUÊHÀqœw¤wÔ/°°z×BÐBÊHùrÚ   rD   )r   r«   Úaddr­   rÈ   rÉ   )r%   Ú	temp_dirsr   r´   r]   s   `    r   Úconcurrent_get_filenameÚJtest_memmapping_temp_folder_thread_safety.<locals>.concurrent_get_filename  s[   ø€ Ü˜f¨Q¸2Ò>À!Ü˜2–Y�ÙÔUÌEÐRSÌHÓUÓU‘
�Ø—‘œbŸg™gŸo™o¨hÓ7Ö8ñ ÷ ?×>Ö>ús   �AA4Á4
B)Útargetr,   rD   )	r   rU   rÝ   ÚsetÚ	threadingÚThreadÚstartrQ   Úlen)r%   Útemp_dirs_thread_1Útemp_dirs_thread_2rí   Út1Út2s         r   Ú)test_memmapping_temp_folder_thread_safetyrù      s»   € ô �IŠI”c˜#“hÓ€Eä›ÐÜ›Ðò9ô 
×	Ò	Ø&Ð5GÐ-Hñ
€Bô 
×	Ò	Ø&Ð5GÐ-Hñ
€Bð ‡H�H„JØ‡H�H„Jà‡G�G„IØ‡G�G„IäÐ!Ó" aÓ'Ð'Ð'ÜÐ!Ó" aÓ'Ð'Ð'àÓ3Ð3Ñ3r   c            
      óŒ  • Sn / SQnU H¸  u  p#n[         R                  " [        R                  SU R	                  X#S9/[         R
                  [         R
                  S9nUR                  5         UR                  5       u  pgUR                  U:X  d   UR                  5       5       eSU;  a  M¥   UR                  5       5       e   g )Na>  if 1:
        import os
        import numpy as np
        from joblib import Parallel, delayed
        from joblib.externals.loky.backend import resource_tracker
        from concurrent.futures import ThreadPoolExecutor, wait

        resource_tracker.VERBOSE = 0

        array = np.arange(int(1e2))

        temp_dirs_thread_1 = set()
        temp_dirs_thread_2 = set()


        def raise_error(array):
            raise ValueError


        def parallel_get_filename(array, temp_dirs):
            with Parallel(backend="loky", n_jobs=2, max_nbytes=10) as p:
                for i in range(10):
                    [filename] = p(
                        delayed(getattr)(array, "filename") for _ in range(1)
                    )
                    temp_dirs.add(os.path.dirname(filename))


        def parallel_raise(array, temp_dirs):
            with Parallel(backend="loky", n_jobs=2, max_nbytes=10) as p:
                for i in range(10):
                    [filename] = p(
                        delayed(raise_error)(array) for _ in range(1)
                    )
                    temp_dirs.add(os.path.dirname(filename))


        executor = ThreadPoolExecutor(max_workers=2)

        # both function calls will use the same loky executor, but with a
        # different Parallel object.
        future_1 = executor.submit({f1}, array, temp_dirs_thread_1)
        future_2 = executor.submit({f2}, array, temp_dirs_thread_2)

        # Wait for both threads to terminate their backend
        wait([future_1, future_2])

        future_1.result()
        future_2.result()
    ))Úparallel_get_filenamerû   r   )rû   Úparallel_raiserD   )rü   rü   rD   rp   )Úf1Úf2rq   rÅ   )
ru   rv   rw   rx   rt   ry   rz   r{   r|   r}   )r~   Úfunctions_and_returncodesrý   rþ   r|   r   rË   r�   s           r   Ú?test_multithreaded_parallel_termination_resource_tracker_silentr   &  s¨   € ð1€Còd!Ðó 8Ñˆ�
Ü×ÒÜ�^‰^˜T 3§:¡:° :Ð#;Ð<Ü—?‘?Ü—?‘?ñ
ˆð
 	
�‰ŒØ—‘“‰ˆØ�|‰|˜zÓ)Ð7¨3¯:©:«<Ó7Ð)Ø"¨#Õ-Ð;¨s¯z©z«|Ó;Ð-ò 8r   c                 ó  • SR                  U S9n[        R                  R                  5       n[        R                  R                  [        5      US'   [        R                  " [        R                  SU/[        R                  [        R                  US9nUR                  5         UR                  5       u  pEUR                  S:X  d   UR                  5       5       eUS:X  d   UR                  5       5       eSU;  d   eg )	Na÷  if 1:
        import os
        import time

        import numpy as np

        from joblib import Parallel, delayed
        from testutils import return_slice_of_data

        data = np.ones(100)

        if __name__ == '__main__':
            for i in range(5):
                slice_of_data = Parallel(
                    n_jobs=2, max_nbytes=1, backend='{b}')(
                        delayed(return_slice_of_data)(data, 0, 20)
                        for _ in range(10)
                    )
    r½   rÂ   rp   rÃ   r   r   rÅ   )rt   r­   rÆ   rÇ   rÈ   rÉ   rÊ   ru   rv   rw   rx   ry   rz   r{   r|   r}   )rº   r~   rÄ   r   r€   r�   s         r   Ú'test_many_parallel_calls_on_same_objectr  q  sÌ   € ð÷$ 	‰�ˆÐð% ô& �*‰*�/‰/Ó
€CÜŸ™Ÿ™¬Ó1€CˆÑÜ×ÒÜ	�‰˜˜sÐ#Ü�‰Ü�‰Øñ		€Að ‡F�F„HØ�}‰}‹�H€CØ�<‰<˜1ÓÐ*˜cŸj™j›lÓ*ÐØ�#‹:Ð#�s—z‘z“|Ó#ˆ:Ø cÓ)Ð)Ñ)r   c                 ó¬   ^• [         R                  " [        S5      5      m[        SU SS9" U4S j[	        S5       5       5      u  n[        U5      b   eg )Ng     @�@r2   r…   rÏ   c              3   óN   >#   • U  H  n[        [        5      " T5      v •  M     g 7fr!   )r   r&   )rÖ   rË   r-   s     €r   r×   Ú8test_memmap_returned_as_regular_array.<locals>.<genexpr>¢  s#   øé € ð CÚ;C°aŒÔ*Ô+¨D×1Ð1º8ùs   ƒ"%rD   )r   r¬   rÝ   r   r«   r   )rº   Úresultr-   s     @r   Ú%test_memmap_returned_as_regular_arrayr  œ  sR   ø€ ô �7Š7”3�s“8Ó€Dä˜q¨'¸cÒBô CÜ;@À¼8óCó �H€Vô ˜vÓ&Ñ.Ð.Ñ.r   c                 ó   • U S:X  a:  [         R                  R                  S5      (       a  [        R                  " S5        SR                  U S9n[        R                  " [         R                  SU/[        R                  [        R                  S9nUR                  5         UR                  5       u  p4UR                  5       nUR                  5       nUR                  S:X  d   US	-   U-   5       eS
U;  d   U5       eg )Nrœ   ÚwinzVThe temporary folder cannot be deleted on Windows in the presence of a reference cycler¼   r½   rp   rq   r   r¾   Úresource_tracker)rw   ÚplatformÚ
startswithÚpytestÚxfailrt   ru   rv   rx   ry   rz   r{   r}   r|   r¿   s        r   Ú2test_resource_tracker_silent_when_reference_cyclesr  ¨  sØ   € ð" �&ÓœSŸ\™\×4Ñ4°U×;Ñ;ô 	�Šð,ô	
ð
÷$ 	‰�ˆÐð% ô& 	×ÒÜ	�‰˜˜sÐ#¬J¯O©OÄJÇOÁOñ	€Að ‡F�F„HØ�}‰}‹�H€CØ
�*‰*‹,€CØ
�*‰*‹,€CØ�<‰<˜1ÓÐ0˜c F™l¨SÑ0Ó0ÐØ SÓ(Ð-¨#Ó-Ñ(r   c           	      óž  • [         R                  " UR                  5      / :X  d   eU " SSUR                  SS9n [         R                  " UR                  5      / :X  d   e[         R                  R	                  UR
                  5      (       a   e[        R                  " S[        R                  S9nUR                  S:X  d   eUR                  [        [        UR                  S   5       Vs/ s H  oCUS	4PM	     sn5        [         R                  " UR                  5      / :X  d   e[        R                  " S
[        R                  S9nUR                  S:X  d   eUR                  [        [        UR                  S   5       Vs/ s H  oEUS	4PM	     sn5        [         R                  R                  UR
                  5      (       d   e[         R                  " UR
                  5      n[!        U5      S:X  d   e[        R"                  " S/S
-  SS9nUR                  [$        U/5      nUS   (       a   e UR'                  5         [        S5       H?  n[)        S5        [         R                  R	                  UR
                  5      (       a  M>    Ag   [+        SR-                  UR
                  5      5      es  snf s  snf ! UR'                  5         [        S5       H?  n[)        S5        [         R                  R	                  UR
                  5      (       a  M>    Af    [+        SR-                  UR
                  5      5      e= f)z0Check that large arrays are not copied in memoryr<   é(   r2   )r¡   r¢   Úverboser=   r;   r¦   r   r¤   r…   é   rD   ÚabcÚobjectrF   çš™™™™™¹?z#temporary folder {} was not deletedN)r­   r®   rR   rÈ   ÚexistsÚ_temp_folderr   r¬   r¨   Únbytesrª   r0   r«   r9   rT   Úisdirrô   r%   r	   r²   r   r¯   rt   )	rš   r\   r   Úsmallr´   ÚlargeÚdumped_filenamesÚobjectsÚresultss	            r   Ú%test_memmapping_pool_for_large_arraysr   à  sŠ  € ô �:Š:�f—n‘nÓ%¨Ó+Ð+Ð+ñ 	�˜b¨f¯n©nÀaÑH€Að(ä�zŠz˜&Ÿ.™.Ó)¨RÓ/Ð/Ð/Ü—7‘7—>‘> !§.¡.×1Ñ1Ð1Ð1ä—’˜¤§¡Ñ,ˆØ�|‰|˜rÓ!Ð!Ð!Ø	�‰Œk´U¸5¿;¹;Àq¹>Ô5JÓKÒ5J° A s›OÑ5JÑKÔLô �zŠz˜&Ÿ.™.Ó)¨RÓ/Ð/Ð/ô —’˜¤2§:¡:Ñ.ˆØ�|‰|˜sÓ"Ð"Ð"Ø	�‰Œk´U¸5¿;¹;Àq¹>Ô5JÓKÒ5J° A s›OÑ5JÑKÔLô �w‰w�}‰}˜QŸ^™^×,Ñ,Ð,Ð,ÜŸ:š: a§n¡nÓ5ÐÜÐ#Ó$¨Ó)Ð)Ð)ô —(’(˜E˜7 S™=°Ñ9ˆØ—%‘%Ô,¨w¨iÓ8ˆØ˜1—:Ðˆ~�:ð 	
�‰ŒÜ�r–ˆAÜ�#ŒJÜ—7‘7—>‘> !§.¡.×1Ó1Øñ
 ñ ô
 !Ø5×<Ñ<¸Q¿^¹^ÓLóð ùò= Lùò Løð  	
�‰ŒÜ�r–ˆAÜ�#ŒJÜ—7‘7—>‘> !§.¡.×1Ó1Øñ
 ñ ô
 !Ø5×<Ñ<¸Q¿^¹^ÓLóð ús3   »B5K	 Ã0J?
Ã>BK	 Æ
K
ÆB$K	 Ê?
K	 Ë	AMÌ#)Mz,https://github.com/joblib/joblib/issues/1086)Úmarksc                 óx  • SR                  U S9n[        R                  R                  5       n[        R                  R                  [        5      US'   [        R                  " [        R                  SU/[        R                  [        R                  US9nUR                  5         UR                  5       u  pEUR                  5       UR                  5       pTUR                  S5      S   nUR                   S:X  d   U=(       d    U5       eUS:X  d   e[        R                  R#                  U5      (       a   eg )	Naï  if 1:
        import os
        from pathlib import Path
        from time import sleep

        import numpy as np
        from joblib import Parallel, delayed
        from testutils import print_filename_and_raise

        data = np.random.rand(1000)

        def get_temp_folder(parallel_obj, backend):
            if "{b}" == "loky":
                return Path(parallel_obj._backend._workers._temp_folder)
            else:
                return Path(parallel_obj._backend._pool._temp_folder)


        if __name__ == "__main__":
            try:
                with Parallel(n_jobs=2, backend="{b}", max_nbytes=100) as p:
                    temp_folder = get_temp_folder(p, "{b}")
                    p(delayed(print_filename_and_raise)(data)
                              for i in range(1))
            except ValueError as e:
                # the temporary folder should be deleted by the end of this
                # call but apparently on some file systems, this takes
                # some time to be visible.
                #
                # We attempt to write into the temporary folder to test for
                # its existence and we wait for a maximum of 10 seconds.
                for i in range(100):
                    try:
                        with open(temp_folder / "some_file.txt", "w") as f:
                            f.write("some content")
                    except FileNotFoundError:
                        # temp_folder has been deleted, all is fine
                        break

                    # ... else, wait a bit and try again
                    sleep(.1)
                else:
                    raise AssertionError(
                        str(temp_folder) + " was not deleted"
                    ) from e
    r½   rÂ   rp   rÃ   Ú
r   Ú )rt   r­   rÆ   rÇ   rÈ   rÉ   rÊ   ru   rv   rw   rx   ry   rz   r{   r}   Úsplitr|   r  )rº   r~   rÄ   r   r€   r�   r]   s          r   Ú&test_child_raises_parent_exits_cleanlyr&    sõ   € ð:-÷Z 	‰�ˆÐð[ ô\ �*‰*�/‰/Ó
€CÜŸ™Ÿ™¬Ó1€CˆÑÜ×ÒÜ	�‰˜˜sÐ#Ü�‰Ü�‰Øñ		€Að ‡F�F„HØ�}‰}‹�H€CØ�z‰z‹|˜SŸZ™Z›\ˆØ�y‰y˜‹˜qÑ!€HØ�<‰<˜1ÓÐ(˜cŸj SÓ(ÐØ�"‹9Ðˆ9Ü�w‰w�~‰~˜h×'Ñ'Ð'Ð'Ð'r   c           	      ó  • U " SSUR                   S9n [        R                  " UR                   5      / :X  d   e[        R                  " S[        R
                  S9nUR                  S:X  d   eUR                  [        [        UR                  S   5       Vs/ s H  oCUS4PM	     sn5        [        R                  " UR                   5      / :X  d   e UR                  5         Ags  snf ! UR                  5         Af = f)	z2Check that large arrays memmapping can be disabledr<   Nr    r…   r;   r  r   r¤   )rR   r­   r®   r   r¬   rT   r  rª   r0   r«   r9   r²   )rš   r\   r   r  r´   s        r   Ú.test_memmapping_pool_for_large_arrays_disabledr(  w  sÏ   € ñ 	�˜d°·±Ñ?€Aðä�zŠz˜&Ÿ.™.Ó)¨RÓ/Ð/Ð/ô —’˜¤2§:¡:Ñ.ˆØ�|‰|˜sÓ"Ð"Ð"Ø	�‰Œk´U¸5¿;¹;Àq¹>Ô5JÓKÒ5J° A s›OÑ5JÑKÔLô �zŠz˜&Ÿ.™.Ó)¨RÓ/Ð/Ñ/ð 	
�‰ŒÙùò Løð 	
�‰ŒÙús   ”BC, ÂC'
Â'-C, Ã'C, Ã,C?c                 óð  • [         R                  n [        S5      [         l        U " SSS9n UR                  nSnUR	                  U5      (       d   e[
        R                  R                  U5      (       d   e[        R                  " S[        R                  S9nUR                  S:X  d   eUR                  [        U/S-  5        [        [
        R                  " U5      5      S	:X  d   e[        R                  " S[        R                  S9S
-  nUR                  S:X  d   eUR                  [        U/S-  5        [        [
        R                  " U5      5      S
:X  d   e UR!                  5         A[#        S5       H4  n[
        R                  R                  U5      (       d    O[%        S5        M6     ['        S5      e U[         l        g! UR!                  5         Af = f! U[         l        f = f)z1Check that memmapping uses /dev/shm when possibleg    €„~Ar<   rF   ©r¡   z"/dev/shm/joblib_memmapping_folder_r…   r;   r  rD   r2   r  z(temporary folder of pool was not deletedN)ÚjmrÚSYSTEM_SHARED_MEM_FS_MIN_SIZErÝ   r  r  r­   rÈ   r  r   r¬   rT   r  rª   Úidrô   r®   r²   r«   r   r¯   )rš   Ú	orig_sizer   r³   Úfolder_prefixr_   r`   r´   s           r   Ú'test_memmapping_on_large_enough_dev_shmr0  ”  sœ  € ô ×1Ñ1€Ið+6ô -0°«IŒÔ)Ù�A "Ñ%ˆð	ð  !Ÿ~™~ÐØ@ˆMØ#×.Ñ.¨}×=Ñ=Ð=Ð=Ü—7‘7—>‘>Ð"2×3Ñ3Ð3Ð3ô —’˜¤2§:¡:Ñ.ˆAØ—8‘8˜s“?Ð"�?Ø�E‰E”"�q�c˜B‘hÔô ”r—z’zÐ"2Ó3Ó4¸Ó9Ð9Ð9ô
 —’˜¤2§:¡:Ñ.°Ñ2ˆAØ—8‘8˜s“?Ð"�?Ø�E‰E”"�q�c˜B‘hÔä”r—z’zÐ"2Ó3Ó4¸Ó9Ð9Ñ9ð �K‰KŒMØä�s–ˆAä—7‘7—>‘>Ð"2×3Ñ3ÙÜ�#ŽJñ	 ô !Ð!KÓLÐLð ð
 -6ŒÕ)øð �K‰KŒMÙûð -6ŒÕ)ús$   ’G( ®D7G Å&AG( ÇG%Ç%G( Ç(G5c                 óz  • [         R                  n [        S5      [         l        U " SSS9n UR                  nUR	                  S5      (       a   e UR                  5         A[        R                  R                  U5      (       a   e U[         l        g ! UR                  5         Af = f! U[         l        f = f)Ng@³ËËï6Dr<   rF   r*  z/dev/shm)	r+  r,  rÝ   r  r  r²   r­   rÈ   r  )rš   r.  r   r³   s       r   Ú$test_memmapping_on_too_small_dev_shmr2  Í  s©   € ô ×1Ñ1€Ið6ô -0°«JŒÔ)á�A "Ñ%ˆð	ð  !Ÿ~™~ÐØ'×2Ñ2°:×>Ñ>Ð>Ð>Ð>ð �K‰KŒMØô —7‘7—>‘>Ð"2×3Ñ3Ð3Ð3Ð3à,5ŒÕ)øð �K‰KŒMÙûð
 -6ŒÕ)ús"   ’B- ®$B Á7B- ÂB*Â*B- Â-B:c                 óf  • [         R                  R                  nU " SSUR                  S9n UR	                  [         R
                  SS9nUR                  5       n[        U5      (       a   eU" U[         R
                  " S5      5        UR                  5         Ag! UR                  5         Af = f)z:Check that large arrays are not copied in memory in returnr<   rF   r    )éè  ©r,   r4  N)	r   r)   r*   rR   Úapply_asyncr¬   Úgetr	   r²   )rš   r\   r*   r   Úresr  s         r   Ú/test_memmapping_pool_for_large_arrays_in_returnr9  í  s�   € ô Ÿ™×6Ñ6Ðñ 	�˜b¨f¯n©nÑ=€AðØ�m‰mœBŸG™G¨'ˆmÐ2ˆØ—‘“	ˆÜ'¨×.Ñ.Ð.Ð.Ù˜5¤"§'¢'¨$£-Ô0à	�‰ŒÙøð 	
�‰ŒÙús   ®AB ÂB0c                 ó.   • [        U 5      (       d   eX-  $ )z4Multiplication function to be executed by subprocess)r	   )r_   Ún_timess     r   Ú_worker_multiplyr<  
  s   € ä ×"Ñ"Ð"Ð"Ø‰;Ðr   c                 ó¸  • [         R                  R                  nU " SSUR                  S9n [         R                  " [         R
                  " S5      R                  S5      SS9SS2SS	2SS24   nUR                  [        US4S
9R                  5       n[        U5      (       a   eU" USU-  5        UR                  5         Ag! UR                  5         Af = f)zÃCheck that memmaps with a bad buffer are returned as regular arrays

Unary operations and ufuncs on memmap instances return a new memmap
instance with an in-memory buffer (probably a numpy bug).
r<   rF   r    ip  )r4  r2   r<   r@   )rA   NrD   r5  )r   r)   r*   rR   rX   rU   rW   r6  r<  r7  r	   r²   )rš   r\   r*   r   r_   r`   s         r   Ú6test_workaround_against_bad_memmap_with_copied_buffersr>    s½   € ô Ÿ™×6Ñ6Ðá�˜b¨f¯n©nÑ=€Aðô �JŠJ”r—y’y “×.Ñ.¨|Ó<ÀCÑHÊÈBÈQÈBÒPQÈÑRˆð �M‰MÔ*°!°Q°ˆMÐ8×<Ñ<Ó>ˆÜ'¨×*Ñ*Ð*Ð*Ù˜1˜a !™eÔ$à	�‰ŒÙøð 	
�‰ŒÙús   ®BC ÃCc                 ó   • U $ r!   r   )Úargs    r   ÚidentityrA  /  s   € Ø€Jr   zfactory,retry_nor<   z{}, {}c                 óÌ  • UR                  S5      R                  nS[        R                  -  n[        R                  S-   n[	        USUSUS9nU " SUR                  S9nUR                  [        U4S	9R                  5       n[        U[        R                  5      (       d   eUR                  U:X  d   e[        R                  R                  Xh5        UR                  5         g )
Nr5   r=   rD   r6   r�   )r:   r9   r8   rB   r2   ©r¢   r5  )rQ   rR   r“   r”   r
   r6  rA  r7  rZ   r   rS   rB   r)   r*   r²   )	rš   Úretry_nor\   r•   r–   rB   Úobjr   r  s	            r   Ú test_pool_memmap_with_big_offsetrF  3  s»   € ð& �K‰K˜Ó$×,Ñ,€EØŒt×)Ñ)Ñ)€DÜ×'Ñ'¨!Ñ+€FÜ
�e $¨d¸'È&Ñ
Q€Cá�˜vŸ~™~Ñ.€AØ�]‰]œ8¨3¨&ˆ]Ð1×5Ñ5Ó7€FÜ�fœbŸi™i×(Ñ(Ð(Ð(Ø�=‰=˜FÓ"Ð"Ð"Ü‡J�J×!Ñ! #Ô.Ø‡K�K…Mr   c                 ó"  • Sn[        XR                  5      u  p#USL d   eX R                  S5      R                  :X  d   e[        US S9u  p#[        R                  R                  S5      (       a  USL d   eUR                  U5      (       d   eg )Nútest.tmpdirFrC  r	  )r   rR   rQ   rw   r  r  Úendswith)r\   Úpool_folder_nameÚpool_folderÚ
shared_mems       r   Útest_pool_get_temp_dirrM  S  sŽ   € Ø$ÐÜ+Ð,<¿n¹nÓMÑ€KØ˜ÒÐÐØŸ+™+ mÓ4×<Ñ<Ó<Ð<Ð<ä+Ð,<È$ÑOÑ€KÜ
‡|�|×Ñ˜u×%Ñ%Ø˜UÒ"Ð"Ð"Ø×ÑÐ 0×1Ñ1Ð1Ñ1r   c                 óD  • SnSSK n[        UR                  R                  S5      (       a&  UR	                  UR                  R                  S5        [        USS9u  pE[        R                  R                  S5      (       a  USL d   eUR                  U5      (       d   eg)zXCheck that _get_temp_dir works when os.statvfs is not defined

Regression test for #902
rH  r   NÚstatvfsrC  r	  F)
Újoblib._memmapping_reducerÚhasattrÚ_memmapping_reducerr­   Údelattrr   rw   r  r  rI  )r\   ÚmonkeypatchrJ  ÚjoblibrK  rL  s         r   Ú!test_pool_get_temp_dir_no_statvfsrV  _  s�   € ð
 %ÐÛ%äˆv×)Ñ)×,Ñ,¨i×8Ñ8à×Ñ˜F×6Ñ6×9Ñ9¸9ÔEä+Ð,<È$ÑOÑ€KÜ
‡|�|×Ñ˜u×%Ñ%Ø˜UÒ"Ð"Ð"Ø×ÑÐ 0×1Ñ1Ð1Ñ1r   z1This test fails with a PermissionError on WindowsÚ	mmap_moder?   r6   c                 ó   ^• S m[        S5       Vs/ s H  n[        R                  " SSS9PM     nn[        U SSS9" U4S	 j[	        U5       5       5      n[	        U5       H$  u  p[        R
                  R                  XA5        M&     g s  snf )
Nc                 ó   • XS S & U $ r!   r   )ÚarrÚvalues     r   ÚfuncÚ4test_numpy_arrays_use_different_memory.<locals>.funcw  s   € Ø‰AˆØˆ
r   rF   )rF   rF   rT   r;   r   r2   )rW  r¡   rÐ   c              3   óJ   >#   • U  H  u  p[        T5      " X!5      v •  M     g 7fr!   ©r   )rÖ   r´   rZ  r\  s      €r   r×   Ú9test_numpy_arrays_use_different_memory.<locals>.<genexpr>}  s$   øé € ð DÚ,=¡& !Œ�Œ�c×ÐÒ,=ùs   ƒ #)r«   r   Úzerosr   Ú	enumerater)   r*   )rW  r´   Úarraysr  rZ  r\  s        @r   Ú&test_numpy_arrays_use_different_memoryrd  q  s€   ø€ òô <AÀ¼9ÓEº9°aŒb�hŠh�x yÔ1¹9€FÐEä °qÀÒCô DÜ,5°fÔ,=óDó €Gô ˜GÖ$‰ˆÜ
�
‰
×%Ñ% cÖ-ò %ùò Fs   ’Bc            	      ó(  • SS jn [         R                  " S5      n[        5       nUR                  US5        UR	                  U5      S:X  d   eUnUR	                  U5      S:X  d   eUR                  US5        UR	                  U5      S:X  d   eA[
        R                  " 5         [        UR                  5      S:X  d   eUR	                  U5      S:X  d   eAU " UR                  5        [         R                  " S5      nUR                  US5        [        UR                  5      S:X  d   eUR	                  U5      S:X  d   e[        [        5         UR	                  [         R                  " S5      5        S S S 5        AU " UR                  5        S n[        [        S	5       Vs/ s H
  oe" X&5      PM     sn5      n[        R                  " 5       S
:X  a!  [        (       a  SOSn[        U5      U:  d   eg g ! , (       d  f       N‰= fs  snf )Nr…   c                 ó¬   • [        U5       H4  n[        U 5      S:X  a    g [        R                  " 5         [	        S5        M6     [        U 5      S:X  d   eg )Nr   r  )r«   rô   ÚgcÚcollectr   )Ú	containerÚretriesr´   s      r   Úassert_empty_after_gc_collectÚ>test_weak_array_key_map.<locals>.assert_empty_after_gc_collect‡  sC   € Ü�w–ˆAÜ�9‹~ Ó"ÙÜ�JŠJŒLÜ�#ŽJñ	  ô
 �9‹~ Ó"Ð"Ñ"r   é*   r_   r`   rD   rH   c                 ó  • [         R                  " S5      n[        [        5         U R	                  U5        S S S 5        U R                  X!5        U R	                  U5      U:X  d   e[        U5      $ ! , (       d  f       NA= f)Nrm  )r   r¬   r   ÚKeyErrorr7  rð   r-  )Úmr´   r_   s      r   Úget_set_get_collectÚ4test_weak_array_key_map.<locals>.get_set_get_collect®  sX   € Ü�GŠG�B‹KˆÜ”HÕØ�E‰E�!ŒH÷ à	�‰ˆaŒØ�u‰u�Q‹x˜1‹}Ðˆ}Ü�!‹uˆ÷	 Õús   ¦A3Á3
Br4  ÚCPythoni�  )r…   )r   r¬   r   rð   r7  rg  rh  rô   Ú_datar   ro  r«   r  Úpython_implementationr   )	rk  r_   rp  r`   rH   rq  r´   Ú
unique_idsÚmax_len_unique_idss	            r   Útest_weak_array_key_maprx  …  s£  € ô#ô 	�Š�‹€AÜÓ€AØ‡E�Eˆ!ˆS„MØ�5‰5�‹8�s‹?Ðˆ?à	€AØ�5‰5�‹8�s‹?Ðˆ?Ø‡E�Eˆ!ˆS„MØ�5‰5�‹8�s‹?Ðˆ?à	Ü‡J‚J„LÜˆq�w‰w‹<˜1ÓÐÐØ�5‰5�‹8�s‹?Ðˆ?à	Ù! !§'¡'Ô*ä
�Š�‹€AØ‡E�Eˆ!ˆS„MÜˆq�w‰w‹<˜1ÓÐÐØ�5‰5�‹8�s‹?Ðˆ?ä	”Õ	Ø	�‰Œb�gŠg�b‹kÔ÷ 
ð 	
Ù! !§'¡'Ô*òô ¼¸t¼ÓEº°AÐ)¨!Ö/¹ÑEÓF€JÜ×%Ò%Ó'¨9Ó4÷ %4¢O™S¸ÐÜ�:‹Ð!3Ó3Ð3Ñ3ð 5÷# 
Õ	üò  Fs   Å&G>Æ+HÇ>
Hc                  óª   • [        5       n [        [        R                  5         [        R                  " U 5        S S S 5        g ! , (       d  f       g = fr!   )r   r   ÚpickleÚPicklingErrorÚdumps)rp  s    r   Ú#test_weak_array_key_map_no_picklingr}  Á  s/   € ÜÓ€AÜ	”×$Ñ$Õ	%Ü�Š�QŒ÷ 
&×	%Ö	%ús   ¤AÁ
Ac                 óÚ  ^^^• [        U R                  S5      5      m[        R                  " SSS9nUR	                  T5        U4S jmS mT" 5       n[        SS9" U4S	 jU4 5       5      n[        SS9" U4S
 jU4 5       5      n[        R                  R                  XC5        [        SS9" U4S j[        S5       5       5      n[        R                  R                  US   U5        g )Nzarr.datrF   r�   r;   c                  óþ   >• [        T5       n [        R                  " U R                  5       S[        R                  SS9nS S S 5        [        R
                  " S[        R                  WSS9$ ! , (       d  f       N3= f)Nr   )ÚaccessrB   r¥   )r8   r^   rB   )Úopenr“   ÚfilenoÚACCESS_READr   r[   r�   )ÚfdÚmmÚtestfiles     €r   Ú_read_arrayÚ%test_direct_mmap.<locals>._read_arrayÎ  sR   ø€ Ü�(Œ^˜rÜ—’˜2Ÿ9™9›;¨´$×2BÑ2BÈ1ÑMˆB÷ ä�zŠz˜%¤r§x¡x¸À1ÑEÐE÷ �^ús   �4A.Á.
A<c                 ó   • U S-  $ ©Nr2   r   ©rK   s    r   r\  Útest_direct_mmap.<locals>.funcÓ  ó   € Ø�!‰tˆr   r2   ©rÐ   c              3   óF   >#   • U  H  n[        T5      " U5      v •  M     g 7fr!   r_  ©rÖ   rK   r\  s     €r   r×   Ú#test_direct_mmap.<locals>.<genexpr>Ù  ó   øé € Ð;²s°!œW Tœ]¨1×-Ð-²sùó   ƒ!c              3   óF   >#   • U  H  n[        T5      " U5      v •  M     g 7fr!   r_  r�  s     €r   r×   r‘  Ü  ó   øé € Ð Aº5°a¤¨¤¨q×!1Ð!1º5ùr“  c              3   óD   >#   • U  H  n[        T5      " 5       v •  M     g 7fr!   r_  ©rÖ   rË   r‡  s     €r   r×   r‘  à  ó   øé € Ð JÂ¸A¤¨Ô!5×!7Ð!7Âùó   ƒ rD   r   )	ÚstrrQ   r   rU   Útofiler   r)   r*   r«   ©r\   r_   rZ  Úrefr  r‡  r\  r†  s        @@@r   Útest_direct_mmaprž  Ç  s¿   ú€ ô �6—;‘;˜yÓ)Ó*€HÜ
�	Š	�"˜GÑ$€AØ‡H�HˆXÔõFò
ñ ‹-€Cô ˜!Ò
Ô;¸±sÓ;Ó
;€Cô ˜aÒ Ô A¸C¹5Ó AÓA€GÜ‡J�J×!Ñ! 'Ô/ô ˜aÒ Ô JÄÀqÄÓ JÓJ€GÜ‡J�J×!Ñ! '¨!¡*¨cÕ2r   c                 ó,  ^^^• [        U R                  S5      5      m[        R                  " SSS9R	                  SS5      nUR                  T5        U4S jmS mT" 5       n[        SS	9" U4S
 jU4 5       5      n[        SS	9" U4S jU4 5       5      nUS   R                  S   (       a   e[        R                  R                  XC5        [        SS	9" U4S j[        S5       5       5      n[        R                  R                  US   U5        g )Nzarr2.datrF   r�   r;   r=   r2   c                  óT   >• [         R                  " T5      n U R                  SS5      $ )Nr=   r2   )r   rS   rW   )r…  r†  s    €r   r‡  Ú=test_parallel_memmap2d_as_memmap_1d_base.<locals>._read_arrayí  s"   ø€ Ü�YŠY�xÓ ˆØ�z‰z˜!˜QÓÐr   c                 ó   • U S-  $ rŠ  r   r‹  s    r   r\  Ú6test_parallel_memmap2d_as_memmap_1d_base.<locals>.funcñ  r�  r   rŽ  c              3   óF   >#   • U  H  n[        T5      " U5      v •  M     g 7fr!   r_  r�  s     €r   r×   Ú;test_parallel_memmap2d_as_memmap_1d_base.<locals>.<genexpr>÷  r’  r“  c              3   óF   >#   • U  H  n[        T5      " U5      v •  M     g 7fr!   r_  r�  s     €r   r×   r¥  ú  r•  r“  r   ÚF_CONTIGUOUSc              3   óD   >#   • U  H  n[        T5      " 5       v •  M     g 7fr!   r_  r—  s     €r   r×   r¥  ÿ  r˜  r™  rD   )rš  rQ   r   rU   rW   r›  r   Úflagsr)   r*   r«   rœ  s        @@@r   Ú(test_parallel_memmap2d_as_memmap_1d_baserª  ä  sã   ú€ ô
 �6—;‘;˜zÓ*Ó+€HÜ
�	Š	�"˜GÑ$×,Ñ,¨Q°Ó2€AØ‡H�HˆXÔõ òñ ‹-€Cô ˜!Ò
Ô;¸±sÓ;Ó
;€Cô ˜aÒ Ô A¸C¹5Ó AÓA€GØ�q‰z×Ñ ×/Ð/Ð/Ü‡J�J×!Ñ! 'Ô/ô ˜aÒ Ô JÄÀqÄÓ JÓJ€GÜ‡J�J×!Ñ! '¨!¡*¨aÕ0r   )Yr   rg  Ú	itertoolsr“   r­   rz  r  ru   rw   rñ   Útimer   r  rP  rR  r+  r   r   r   r   r   r	   Újoblib.backportsr
   Újoblib.executorr   ÚTestExecutorÚjoblib.parallelr   r   Újoblib.poolr   Újoblib.test.commonr   r   r   r   r   Újoblib.testingr   r   r   r   r#   r&   r0   r3   rl   rƒ   r‹   r™   Úget_memmapping_executorr¶   r¹   rÀ   rÌ   rà   ræ   rù   r   r  r  r  r   ÚparamÚmarkr  r&  r(  r0  r2  r9  r<  r>  rA  ÚlistÚproductr«   rª   rš  rt   rF  rM  rV  rd  rx  r}  rž  rª  )rK   Úys   00r   Ú<module>rº     sm  ðÛ Û 	Û Û Û 	Û Û Û Û 
Û Ý ã å (÷÷ õ )Ý Fß -Ý &÷õ ÷ 7Ñ 6ò>ò/òò
<ò@ð ØñS-ó ó ðS-ðl ØÙØ‡L�L�GÑÐ$Xññ*óó ó ð
*ðZ Øñ)+ó ó ð)+ðX ñCó ðCðD ØÙØØ�\×9Ñ9Ð:Ø	˜FÐ#ññ
0óó ó ð0ðf ØÙØØ�\×9Ñ9Ð:Ø	˜FÐ#ññ
$óó ó ð$ðN ØÙˆYÐ*¨FÐ3Ó4ñCó 5ó ó ðCðB ØÙˆYÐ*¨FÐ3Ó4ñ*.ó 5ó ó ð*.ðZ ØÙˆYÐ*¨FÐ3Ó4ñ
Fó 5ó ó ð
Fð ØÙˆYÐ*¨FÐ3Ó4ñFó 5ó ó ðFð Øñ!4ó ó ð!4ðH ØñF<ó ó ðF<ðR ØÙˆYÐ*¨FÐ3Ó4ñ%*ó 5ó ó ð%*ðP ØÙˆYÐ*¨FÐ3Ó4ñ/ó 5ó ó ð/ð ØÙˆYÐ*¨FÐ3Ó4ñ2.ó 5ó ó ð2.ðj ØÙØØ�\×9Ñ9Ð:Ø	˜FÐ#ññ
1óó ó ð1ðh ØÙØà�ŠØØ—+‘+×#Ñ#ØEð $ð ñ	
ð 	ðóñK(óó ó ðK(ð\ ØÙØØ�\×9Ñ9Ð:Ø	˜FÐ#ññ
óó ó ðð, ØØÙØØ�\×9Ñ9Ð:Ø	˜FÐ#ññ
.6óó ó ó ð.6ðb ØØÙØØ�\×9Ñ9Ð:Ø	˜FÐ#ññ
6óó ó ó ð6ð0 ØÙØØ�\×9Ñ9Ð:Ø	˜FÐ#ññ
óó ó ðò,ð ØÙØØ�\×9Ñ9Ð:Ø	˜FÐ#ññ
óó ó ðò0ð ØÙØÙØ×ÒØ˜\×AÑAÐBÁEÈ!ÃHó	
óð ×%Ò%Ð'8¸&Ð&AÁ3ÀsÉEÐRSËHÓCUÔVô	âV‰DˆAð 	�‰˜ÖÙVò	ññóó ó ðò$	2ò2ð$ ÙØ‡L�L�GÑÐ$Wññ ˆ[˜4 ˜,Ó'ñ.ó (óó ð
.ð ñ84ó ð84òvð Øñ3ó ó ð3ð6 Øñ1ó ó ñ1ùóU	s   Í<P