Ë
    ÷Q(hÓª  ã                   ód  — d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZ d dlZd dlmZ d dlmZmZmZmZmZmZ d dl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"m#Z#m$Z$m%Z% d d	l&m'Z'm(Z(m)Z) d
„ Z*d„ Z+d„ Z,d„ Z-d„ Z.e%e$d„ «       «       Z/e%e$ e)ej                  dk7  d¬«      d„ «       «       «       Z0e%e$d„ «       «       Z1e%d„ «       Z2e%e$ e'deejf                  gddg¬«      d„ «       «       «       Z4e%e$ e'deejf                  gddg¬«      d„ «       «       «       Z5e%e$ e'dddg«      d„ «       «       «       Z6e%e$ e'dddg«      d„ «       «       «       Z7e%e$ e'dddg«      d„ «       «       «       Z8e%e$ e'dddg«      d „ «       «       «       Z9e%e$d!„ «       «       Z:e%e$d"„ «       «       Z;e%e$ e'dddg«      d#„ «       «       «       Z<e%e$ e'dddg«      d$„ «       «       «       Z=e%e$ e'dddg«      d%„ «       «       «       Z>e%e$ e'deejf                  gddg¬«      d&„ «       «       «       Z?e%e$ e'd ej€                  dej‚                  j…                  d'¬«      ¬(«      dg«      d)„ «       «       «       ZCe%e$ e'deejf                  gddg¬«      d*„ «       «       «       ZDe%e$e# e'deejf                  gddg¬«      d+„ «       «       «       «       ZEe%e$e# e'deejf                  gddg¬«      d,„ «       «       «       «       ZFe%e$ e'deejf                  gddg¬«      d-„ «       «       «       ZGd.„ ZHe%e$ e'deejf                  gddg¬«      d/„ «       «       «       ZId0„ ZJe%e$ e'd1 eK ej˜                  eejf                  g eMd2«      «      «       ej˜                  ddg eNeO eMd2«      «      «      D � �cg c]  \  } }d3j¡                  | |«      ‘Œ c}} ¬«      d4„ «       «       «       ZQd5„ ZRd6„ ZSe% e)ej                  dk(  d7¬«       e'd8d9d:g«      d;„ «       «       «       ZTe%d<„ «       ZUd=„ ZVe%e$d>„ «       «       ZWe%e$d?„ «       «       ZXyc c}} w )@é    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                  ó2   — t        j                  dd¬«       y )Ni,  T)ÚtimeoutÚexit)ÚfaulthandlerÚdump_traceback_later© ó    úY/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/joblib/test/test_memmapping.pyÚsetup_moduler   &   s   € Ü×%Ñ%¨c¸Ö=r   c                  ó,   — t        j                  «        y ©N)r   Úcancel_dump_traceback_laterr   r   r   Úteardown_moduler#   *   s   € Ü×,Ñ,Õ.r   c                 ó    — t        | «      €J ‚| S r!   )r   )Úarrays    r   Úcheck_memmap_and_send_backr&   .   s   € Ü˜uÓ%Ð1Ð1Ð1Ø€Lr   c                 óV   — | \  }}}t         j                  j                  ||   |«       y)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×!Ñ! $ x¡.°(Õ;r   c                 óŠ   — | \  }}}||   |k(  sJ ‚||xx   dz  cc<   t         j                  j                  ||   d|z  «       y)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   >   sL   € ð  $Ñ€Dˆ(�HØ�‰>˜XÒ%Ð%Ð%ØˆƒN�aÑƒNÜ‡J�J×!Ñ! $ x¡.°!°h±,Õ?r   c                 óà  ‡— t         j                  j                  }| j                  d«      j                  }t        j
                  |t         j                  dd¬«      }dt        j                  |j                  d   |j                  ¬«      z  |dd |j                  «        t        j
                  |t         j                  d	d
dd¬«      }t        j                  d«      j                  |j                  «      |dd |dd…dd…dd…f   }|j                  dd«      }t        j                  |«      }|j                  }t        d| j                  dd«      Šˆfd„}	 |	|«      }
t        |
«      sJ ‚t!        |
t         j
                  «      sJ ‚ ||
|«        |	|«      }t        |«      sJ ‚ |||«        |	|«      }t        |«      sJ ‚ |||«        |	|«      }t!        |t         j
                  «      rJ ‚t        |«      sJ ‚ |||«        |	|«      }t!        |t         j
                  «      rJ ‚t        |«      sJ ‚ |||«       |dz  }t        |«      rJ ‚ |	|«      }t        |«      rJ ‚t!        |t         j
                  «      rJ ‚ |||dz  «       t        j                  |«      }t        |«      rJ ‚ |	|«      }t!        |t         j"                  «      sJ ‚t        |«      rJ ‚ |||«       y)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                 ó$   •—  ‰| «      \  }} ||Ž S r!   r   ©ÚxÚconsr,   Úreducers      €r   Úreconstruct_array_or_memmapzEtest_memmap_based_array_reducing.<locals>.reconstruct_array_or_memmaps   ó   ø€ Ù˜Q“Z‰
ˆˆdÙ�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_reducingrk   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Ü�o¤r§y¡yÔ1Ð1Ð1Ù�¨Ô*ñ 2°!Ó4€OÜ Ô0Ð0Ð0Ù�¨Ô*ñ 3°2Ó6ÐÜÐ 0Ô1Ð1Ð1ÙÐ'¨Ô,ñ 2°!Ó4€OÜ˜/¬2¯9©9Ô5Ð5Ð5Ü Ô0Ð0Ð0Ù�¨Ô*á1°!Ó4€OÜ˜/¬2¯9©9Ô5Ð5Ð5Ü Ô0Ð0Ð0Ù�¨Ô*ð 
ˆQ‰€BÜ# BÔ'Ð'Ð'Ù2°2Ó6ÐÜ#Ð$4Ô5Ð5Ð5ÜÐ*¬B¯I©IÔ6Ð6Ð6ÙÐ'¨¨Q©Ô/ô 
�‰�B‹€BÜ# BÔ'Ð'Ð'á2°2Ó6ÐÜÐ&¬¯
©
Ô3Ð3Ð3Ü#Ð$4Ô5Ð5Ð5ÙÐ'¨Õ,r   Úwin32z2PermissionError only easily triggerable on Windows)Úreasonc                 óÎ  — | j                  d«      j                  }dj                  |¬«      }t        j                  t
        j                  d|gt        j                  t        j                  ¬«      }|j                  «        |j                  «       \  }}|j                  dk(  sJ |j                  «       «       ‚|dk(  sJ ‚dj                  |«      }||j                  «       v sJ ‚y )	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)rP   rQ   Ú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                 ó  ‡— t         j                  j                  }| j                  d«      j                  }t        j
                  |t         j                  dd¬«      }t        j                  d«      j                  |j                  «      |d d  |dd }|d d …dd…f   }|d d …d d …d d …df   }|d	d
d…   }t        d | j                  dd«      Šˆfd„} ||«      }	t        |	«      sJ ‚t        |	t         j
                  «      sJ ‚ ||	|«        ||«      }
t        |
«      sJ ‚ ||
|«        ||«      }t        |«      sJ ‚ |||«        ||«      }t        |«      sJ ‚ |||«        ||«      }t        |«      sJ ‚ |||«       y )Nr5   )éd   é   r…   r<   r6   r7   i¬ r   rF   r=   rD   r<   r>   rH   Tc                 ó$   •—  ‰| «      \  }} ||Ž S r!   r   rJ   s      €r   rN   zNtest_high_dimension_memmap_array_reducing.<locals>.reconstruct_array_or_memmapë   rO   r   )r   r)   r*   rP   rQ   rR   rS   rT   rV   r9   r   r	   rY   )r[   r*   r\   r^   r_   rH   ra   ÚerN   rb   rc   re   rf   Ú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Ü�o¤r§y¡yÔ1Ð1Ð1Ù�¨Ô*á1°!Ó4€OÜ Ô0Ð0Ð0Ù�¨Ô*á1°!Ó4€OÜ Ô0Ð0Ð0Ù�¨Ô*á1°!Ó4€OÜ Ô0Ð0Ð0Ù�¨Ô*á1°!Ó4€OÜ Ô0Ð0Ð0Ù�¨Õ*r   c                 ó¢  — | j                  d«      j                  }dt        j                  z  }t        j                  dz   }t	        j
                  |d||z   ¬«      }t        |dd|d|d d d	¬
«	      }t        |t        j
                  «      sJ ‚|j                  |k(  sJ ‚t        |dd|d|dz  fd|d	¬
«	      }t        |«      j                  |k(  sJ ‚y )Nr5   r=   rD   r6   )r:   r9   Úuint8ÚrÚCF)r8   r:   rB   rA   r9   ÚstridesÚtotal_buffer_lenÚunlink_on_gc_collectr2   )r2   )
rP   rQ   ÚmmapÚALLOCATIONGRANULARITYr   rR   r   rY   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                 óv  — t         j                  j                  }|j                  d«      j                  } | dd|¬«      }	 |j                  d«      j                  }t        j                  |t         j                  dd¬«      }|j                  d	«       |j                  t        t        |j                  d
   «      D ��cg c]&  }t        |j                  d   «      D ]	  }|||fd	f‘Œ Œ( c}}«        ||dt        j                  |j                  «      z  «       t        j                  |t         j                  dd¬«      }	|j                  t        t        |	j                  d
   «      D ��cg c]&  }t        |	j                  d   «      D ]	  }|	||fdf‘Œ Œ( c}}«       t        j                  |«      g k(  sJ ‚ ||dt        j                  |j                  «      z  «        ||	dt        j                  |	j                  «      z  «       t        j                  |t         j                  ddd¬«      }
t!        t"        «      5  |j                  t$        t        |
j                  d
   «      D �cg c]  }|
|df‘Œ	 c}«       ddd«       t!        t&        t(        f«      5  |j                  t        t        |
j                  d
   «      D �cg c]  }|
|df‘Œ	 c}«       ddd«       |j+                  «        ~yc c}}w c c}}w c c}w # 1 sw Y   Œ‡xY wc c}w # 1 sw Y   Œ=xY w# |j+                  «        ~w xY w)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*   ÚmkdirrQ   rP   rR   Ú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 !Ä%ÈÏÉÐPQÉ
ÓBSÒT¸Qˆa�!�Q�˜ÒÐTÐÓTô	
ñ
 	˜1˜a¤"§'¡'¨!¯'©'Ó"2Ñ2Ô3ô �I‰I�h¤b§j¡j¸ÀSÔIˆà	�‰ÜÜ',¨Q¯W©W°Q©ZÓ'8×T !Ä%ÈÏÉÐPQÉ
ÓBSÒT¸Qˆa�!�Q�˜ÒÐTÐÓ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Ó#ñ 	IØ�E‰E”+´U¸1¿7¹7À1¹:Ó5FÖG°  A s¢ÒGÔH÷	Iô
 ”\¤:Ð.Ó/ñ 	LØ�E‰E”.¼¸a¿g¹gÀa¹jÓ8IÖ"J°1 A q¨#¢;Ò"JÔK÷	Lð 	
�‰ŒÙùóE Uùó Uùò  H÷	Ið 	Iüò #K÷	Lð 	Lûð 	
�‰ŒÙús�   ÁA>L% Ã +K7Ã+BL% Å.+K=ÆB+L% É+LÉ/LÉ;LÊL% Ê+LË
LËLËL% Ë7L% ÌLÌLÌL% ÌLÌL"ÌL% Ì%L8c                 ó˜  — t         j                  j                  }|j                  d«      j                  } | dd|¬«      }	 |j                  d«      j                  }t        j                  |t         j                  dd¬«      }|j                  d	«       t        j                  |«      }t        |t         j                  «      rJ ‚t        |«      sJ ‚|j                  t        t        |j                  d
   «      D ��	cg c]&  }t        |j                  d   «      D ]	  }	|||	fd	f‘Œ Œ( c}	}«        ||dt        j                   |j                  «      z  «        ||dt        j                   |j                  «      z  «       t#        j$                  |«      g k(  sJ ‚	 |j'                  «        ~yc c}	}w # |j'                  «        ~w xY w)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¥   rQ   rP   rR   r¦   r§   rW   rY   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Ü# FÔ+Ð+Ð+à	�‰Üô ˜qŸw™w q™zÓ*÷àÜ˜qŸw™w q™zÓ*òð ð ˜!˜Q˜ Ò%ðØ%óô	
ñ 	˜1˜a¤"§'¡'¨!¯'©'Ó"2Ñ2Ô3Ù˜6 1¤r§w¡w¨q¯w©wÓ'7Ñ#7Ô8ô �z‰zÐ*Ó+¨rÒ1Ð1Ñ1ð 	
�‰ŒÙùó#øð  	
�‰ŒÙús    ÁB<F6 Ã>+F0Ä)A4F6 Æ0F6 Æ6G	Úbackendc                 óh  — dj                  | ¬«      }t        j                  t        j                  d|gt        j
                  t        j
                  ¬«      }|j                  «        |j                  «       \  }}|j                  dk(  s)J |j                  «       dz   |j                  «       z   «       ‚y )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_   ro   rp   r   ú

)
rs   rt   ru   rv   rw   rx   ry   rz   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                 óè  — dj                  | ¬«      }t        d«      D ]Ò  }t        j                  j	                  «       }t        j
                  j                  t        «      |d<   t        j                  t        j                  d|gt        j                  t        j                  |¬«      }|j                  «        |j                  «       \  }}|j                  dk(  sJ |«       ‚|dk(  sJ ‚d	|vrŒÒJ ‚ y )
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<   Ú
PYTHONPATHro   ©rq   rr   Úenvr   r   ó   resource_tracker)rs   r©   r«   ÚenvironÚcopyÚpathÚdirnameÚ__file__rt   ru   rv   rw   rx   ry   rz   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Ð'Ü—?‘?Ü—?‘?Øô	
ˆð 	
�‰ŒØ—=‘=“?‰ˆˆSØ�|‰|˜qÒ Ð% #Ó%Ð Ø�cŠzÐˆzØ"¨#Ò-Ð-Ð-ñ.r   c                 ód  ‡— t        j                  t        d«      «      Š t        d| d¬«      ˆfd„t	        d«      D «       «      \  } t        d| d¬«      ˆfd„t	        d«      D «       «      \  }t
        j                  j                  |«      t
        j                  j                  |«      k7  sJ ‚y )Nç      Y@r2   rF   ©Ún_jobsr¸   rŸ   c              3   óJ   •K  — | ]  } t        t        «      ‰d «      –— Œ y­w©r\   N©r   Úgetattr©Ú.0rÉ   r%   s     €r   ú	<genexpr>z6test_parallel_isolated_temp_folders.<locals>.<genexpr>ë  ó'   øè ø€ ò FØ01ÐŒ”Ó˜ 
×+ñFùó   ƒ #rD   c              3   óJ   •K  — | ]  } t        t        «      ‰d «      –— Œ y­wrÐ   rÑ   rÓ   s     €r   rÕ   z6test_parallel_isolated_temp_folders.<locals>.<genexpr>î  rÖ   r×   ©r   rT   Úintr   r©   r«   rÆ   rÇ   )r¸   Ú
filename_1Ú
filename_2r%   s      @r   Ú#test_parallel_isolated_temp_foldersrÝ   ä  s˜   ø€ ô �I‰I”c˜#“hÓ€EØE”8 1¨gÀ"ÔEó FÜ5:¸1³XôFó �L€Zð F”8 1¨gÀ"ÔEó FÜ5:¸1³XôFó �L€Zô �7‰7�?‰?˜:Ó&¬"¯'©'¯/©/¸*Ó*EÒEÐEÑEr   c                 óz  ‡— t        j                  t        d«      «      Št        d| d¬«      5 } |ˆfd„t	        d«      D «       «      \  } |ˆfd„t	        d«      D «       «      \  }d d d «       t
        j                  j                  «      t
        j                  j                  «      k(  sJ ‚y # 1 sw Y   ŒKxY w)NrÌ   r2   rF   rÍ   c              3   óJ   •K  — | ]  } t        t        «      ‰d «      –— Œ y­wrÐ   rÑ   rÓ   s     €r   rÕ   z9test_managed_backend_reuse_temp_folder.<locals>.<genexpr>û  ó    øè ø€ ÒOÀÐ)œ¤Ó)¨%°×<ÑOùr×   rD   c              3   óJ   •K  — | ]  } t        t        «      ‰d «      –— Œ y­wrÐ   rÑ   rÓ   s     €r   rÕ   z9test_managed_backend_reuse_temp_folder.<locals>.<genexpr>ü  rà   r×   rÙ   )r¸   r~   rÛ   rÜ   r%   s       @r   Ú&test_managed_backend_reuse_temp_folderrâ   ô  s”   ø€ ô
 �I‰I”c˜#“hÓ€EÜ	˜ G¸Ô	;ð P¸qÙÓOÄeÈAÃhÔOÓO‰ˆÙÓOÄeÈAÃhÔOÓO‰ˆ÷Pô �7‰7�?‰?˜:Ó&¬"¯'©'¯/©/¸*Ó*EÒEÐEÑE÷Pð Pús   ®9B1Â1B:c                  ó   — t        j                  t        d«      «      } t        «       }t        «       }d„ }t	        j
                  || |f¬«      }t	        j
                  || |f¬«      }|j                  «        |j                  «        |j                  «        |j                  «        t        |«      dk(  sJ ‚t        |«      dk(  sJ ‚||k7  sJ ‚y )NrÌ   c                 ó  ‡ — t        ddd¬«      5 }t        d«      D ]L  } |ˆ fd„t        d«      D «       «      \  }|j                  t        j                  j                  |«      «       ŒN 	 d d d «       y # 1 sw Y   y xY w)Nrš   r2   rF   )r¸   rÎ   rŸ   c              3   óJ   •K  — | ]  } t        t        «      ‰d «      –— Œ y­wrÐ   rÑ   rÓ   s     €r   rÕ   z]test_memmapping_temp_folder_thread_safety.<locals>.concurrent_get_filename.<locals>.<genexpr>  s    øè ø€ ÒUÀqÐ/œw¤wÓ/°°z×BÑUùr×   rD   )r   r©   Úaddr«   rÆ   rÇ   )r%   Ú	temp_dirsr~   r²   r\   s   `    r   Úconcurrent_get_filenamezJtest_memmapping_temp_folder_thread_safety.<locals>.concurrent_get_filename  si   ø€ Ü˜f¨Q¸2Ô>ð 	9À!Ü˜2“Yò 9�ÙÓUÌEÐRSËHÔUÓU‘
�Ø—‘œbŸg™gŸo™o¨hÓ7Õ8ñ9÷	9÷ 	9ñ 	9ús   �AA5Á5A>)Útargetr,   rD   )	r   rT   rÚ   ÚsetÚ	threadingÚThreadÚstartrP   Ú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ô 
×	Ñ	Ø&¨eÐ5GÐ-Hô
€Bô 
×	Ñ	Ø&¨eÐ5GÐ-Hô
€Bð ‡H�H„JØ‡H�H„Jà‡G�G„IØ‡G�G„IäÐ!Ó" aÒ'Ð'Ð'ÜÐ!Ó" aÒ'Ð'Ð'àÐ!3Ò3Ð3Ñ3r   c            	      ó’  — d} g d¢}|D ]¼  \  }}}t        j                  t        j                  d| j	                  ||¬«      gt         j
                  t         j
                  ¬«      }|j                  «        |j                  «       \  }}|j                  |k(  sJ |j                  «       «       ‚d|vrŒ©J |j                  «       «       ‚ y )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   ro   )Úf1Úf2rp   rÃ   )
rt   ru   rv   rw   rs   rx   ry   rz   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ò 	<ÑˆˆB�
Ü×ÑÜ�^‰^˜T 3§:¡:°¸ :Ó#;Ð<Ü—?‘?Ü—?‘?ô
ˆð
 	
�‰ŒØ—‘“‰ˆˆ3Ø�|‰|˜zÒ)Ð7¨3¯:©:«<Ó7Ð)Ø"¨#Ò-Ð;¨s¯z©z«|Ó;Ð-ñ	<r   c                 ó
  — dj                  | ¬«      }t        j                  j                  «       }t        j                  j                  t        «      |d<   t        j                  t        j                  d|gt        j                  t        j                  |¬«      }|j                  «        |j                  «       \  }}|j                  dk(  sJ |j                  «       «       ‚|dk(  sJ |j                  «       «       ‚d|vsJ ‚y )	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À   ro   rÁ   r   r   rÃ   )rs   r«   rÄ   rÅ   rÆ   rÇ   rÈ   rt   ru   rv   rw   rx   ry   rz   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                 ó¬   ‡— t        j                  t        d«      «      Š t        d| d¬«      ˆfd„t	        d«      D «       «      \  }t        |«      �J ‚y )Ng     @�@r2   r„   rÍ   c              3   óH   •K  — | ]  } t        t        «      ‰«      –— Œ y ­wr!   )r   r&   )rÔ   rÉ   r-   s     €r   rÕ   z8test_memmap_returned_as_regular_array.<locals>.<genexpr>¢  s&   øè ø€ ò CØ67Ð+ŒÔ*Ó+¨D×1ñCùó   ƒ"rD   )r   rª   rÚ   r   r©   r   )r¸   Úresultr-   s     @r   Ú%test_memmap_returned_as_regular_arrayr  œ  sT   ø€ ô �7‰7”3�s“8Ó€DàBŒx˜q¨'¸cÔBó CÜ;@À»8ôCó �H€Vô ˜vÓ&Ð.Ð.Ñ.r   c                 óø  — | dk(  r4t         j                  j                  d«      rt        j                  d«       dj                  | ¬«      }t        j                  t         j                  d|gt        j                  t        j                  ¬«      }|j                  «        |j                  «       \  }}|j                  «       }|j                  «       }|j                  dk(  sJ |d	z   |z   «       ‚d
|vsJ |«       ‚y )Nrš   ÚwinzVThe temporary folder cannot be deleted on Windows in the presence of a reference cyclerº   r»   ro   rp   r   r¼   Úresource_tracker)rv   ÚplatformÚ
startswithÚpytestÚxfailrs   rt   ru   rw   rx   ry   rz   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           	      óZ  — t        j                  |j                  «      g k(  sJ ‚ | dd|j                  d¬«      }	 t        j                  |j                  «      g k(  sJ ‚t         j                  j	                  |j
                  «      rJ ‚t        j                  dt        j                  ¬«      }|j                  dk(  sJ ‚|j                  t        t        |j                  d   «      D �cg c]  }||d	f‘Œ	 c}«       t        j                  |j                  «      g k(  sJ ‚t        j                  d
t        j                  ¬«      }|j                  dk(  sJ ‚|j                  t        t        |j                  d   «      D �cg c]  }||d	f‘Œ	 c}«       t         j                  j                  |j
                  «      sJ ‚t        j                  |j
                  «      }t!        |«      dk(  sJ ‚t        j"                  dgd
z  d¬«      }|j                  t$        |g«      }|d   rJ ‚	 |j'                  «        t        d«      D ]9  }t)        d«       t         j                  j	                  |j
                  «      rŒ8 ~y t+        dj-                  |j
                  «      «      ‚c c}w c c}w # |j'                  «        t        d«      D ]9  }t)        d«       t         j                  j	                  |j
                  «      rŒ8 ~w  t+        dj-                  |j
                  «      «      ‚xY w)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¬   rQ   rÆ   ÚexistsÚ_temp_folderr   rª   r¦   Únbytesr¨   r0   r©   r9   rS   Úisdirrî   r%   r	   r°   r   r­   rs   )	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ä—‘˜¤§¡Ô,ˆØ�|‰|˜rÒ!Ð!Ð!Ø	�‰Œk´U¸5¿;¹;Àq¹>Ó5JÖK°˜U A sšOÒKÔLô �z‰z˜&Ÿ.™.Ó)¨RÒ/Ð/Ð/ô —‘˜¤2§:¡:Ô.ˆØ�|‰|˜sÒ"Ð"Ð"Ø	�‰Œk´U¸5¿;¹;Àq¹>Ó5JÖK°˜U A sšOÒKÔLô �w‰w�}‰}˜QŸ^™^Ô,Ð,Ð,ÜŸ:™: a§n¡nÓ5ÐÜÐ#Ó$¨Ò)Ð)Ð)ô —(‘(˜E˜7 S™=°Ô9ˆØ—%‘%Ô,¨w¨iÓ8ˆØ˜1’:Ðˆ~�:ð 	
�‰ŒÜ�r“ò 	ˆAÜ�#ŒJÜ—7‘7—>‘> !§.¡.Õ1Øñ
 ð	ô
 !Ø5×<Ñ<¸Q¿^¹^ÓLóð ùò= Lùò Løð  	
�‰ŒÜ�r“ò 	ˆAÜ�#ŒJÜ—7‘7—>‘> !§.¡.Õ1Øñ
 ð	ô
 !Ø5×<Ñ<¸Q¿^¹^ÓLóð ús3   ¼B/J. Ã+J$
Ã7BJ. ÆJ)
ÆBJ. Ê$
J. Ê.AL*Ì(L*z,https://github.com/joblib/joblib/issues/1086)Úmarksc                 ón  — dj                  | ¬«      }t        j                  j                  «       }t        j                  j                  t        «      |d<   t        j                  t        j                  d|gt        j                  t        j                  |¬«      }|j                  «        |j                  «       \  }}|j                  «       |j                  «       }}|j                  d«      d   }|j                   dk(  sJ |xs |«       ‚|dk(  sJ ‚t        j                  j#                  |«      rJ ‚y )	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À   ro   rÁ   ú
r   Ú )rs   r«   rÄ   rÅ   rÆ   rÇ   rÈ   rt   ru   rv   rw   rx   ry   rz   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›\ˆ€CØ�y‰y˜‹˜qÑ!€HØ�<‰<˜1ÒÐ(˜cšj SÓ(ÐØ�"Š9Ðˆ9Ü�w‰w�~‰~˜hÔ'Ð'Ð'Ð'r   c           	      ó   —  | dd|j                   ¬«      }	 t        j                  |j                   «      g k(  sJ ‚t        j                  dt        j
                  ¬«      }|j                  dk(  sJ ‚|j                  t        t        |j                  d   «      D �cg c]  }||df‘Œ	 c}«       t        j                  |j                   «      g k(  sJ ‚	 |j                  «        ~yc c}w # |j                  «        ~w xY w)	z2Check that large arrays memmapping can be disabledr<   Nrž   r„   r;   r  r   r¢   )rQ   r«   r¬   r   rª   rS   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°˜U A sšOÒKÔLô �z‰z˜&Ÿ.™.Ó)¨RÒ/Ð/Ñ/ð 	
�‰ŒÙùò Løð 	
�‰ŒÙús   —BC* ÂC%
Â'+C* Ã%C* Ã*C=c                 óÐ  — t         j                  }	 t        d«      t         _         | dd¬«      }	 |j                  }d}|j	                  |«      sJ ‚t
        j                  j                  |«      sJ ‚t        j                  dt        j                  ¬«      }|j                  dk(  sJ ‚|j                  t        |gdz  «       t        t        j                  |«      «      d	k(  sJ ‚t        j                  dt        j                  ¬«      d
z  }|j                  dk(  sJ ‚|j                  t        |gdz  «       t        t        j                  |«      «      d
k(  sJ ‚	 |j!                  «        ~t#        d«      D ].  }t
        j                  j                  |«      s nt%        d«       Œ0 t'        d«      ‚	 |t         _        y# |j!                  «        ~w xY w# |t         _        w xY w)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ª   rS   r  r¨   Úidrî   r¬   r°   r©   r   r­   )r˜   Ú	orig_sizer~   r±   Úfolder_prefixr^   r_   r²   s           r   Ú'test_memmapping_on_large_enough_dev_shmr*  ”  sš  € ô ×1Ñ1€Ið+6ô -0°«IŒÔ)Ù�A "Ô%ˆð	ð  !Ÿ~™~ÐØ@ˆMØ#×.Ñ.¨}Ô=Ð=Ð=Ü—7‘7—>‘>Ð"2Ô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“ò 	MˆAä—7‘7—>‘>Ð"2Ô3ÙÜ�#�Jð		Mô !Ð!KÓLÐLð ð
 -6ŒÕ)øð �K‰KŒMÙûð -6ŒÕ)ús$   ’G ±D+G ÅAG ÇGÇG ÇG%c                 ól  — t         j                  }	 t        d«      t         _         | dd¬«      }	 |j                  }|j	                  d«      rJ ‚	 |j                  «        ~t        j                  j                  |«      rJ ‚	 |t         _        y # |j                  «        ~w xY w# |t         _        w xY w)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_shmr,  Í  s£   € ô ×1Ñ1€Ið6ô -0°«JŒÔ)á�A "Ô%ˆð	ð  !Ÿ~™~ÐØ'×2Ñ2°:Ô>Ð>Ð>Ð>ð �K‰KŒMØô —7‘7—>‘>Ð"2Ô3Ð3Ð3Ð3à,5ŒÕ)øð �K‰KŒMÙûð
 -6ŒÕ)ús"   ’B& ±B Á2B& ÂB#Â#B& Â&B3c                 óf  — t         j                  j                  } | dd|j                  ¬«      }	 |j	                  t         j
                  d¬«      }|j                  «       }t        |«      rJ ‚ ||t        j
                  d«      «       |j                  «        ~y# |j                  «        ~w xY w)z:Check that large arrays are not copied in memory in returnr<   rF   rž   )éè  ©r,   r.  N)	r   r)   r*   rQ   Úapply_asyncrª   Úgetr	   r°   )r˜   r[   r*   r~   Úresr  s         r   Ú/test_memmapping_pool_for_large_arrays_in_returnr3  í  sŠ   € ô Ÿ™×6Ñ6Ðñ 	�˜b¨f¯n©nÔ=€AðØ�m‰mœBŸG™G¨'ˆmÓ2ˆØ—‘“	ˆÜ'¨Ô.Ð.Ð.Ù˜5¤"§'¡'¨$£-Ô0à	�‰ŒÙøð 	
�‰ŒÙús   ±AB ÂB0c                 ó&   — t        | «      sJ ‚| |z  S )z4Multiplication function to be executed by subprocess)r	   )r^   Ún_timess     r   Ú_worker_multiplyr6  
  s   € ä Ô"Ð"Ð"Øˆw‰;Ðr   c                 ó¼  — t         j                  j                  } | dd|j                  ¬«      }	 t        j                  t        j
                  d«      j                  d«      d¬«      dd…dd	…dd…f   }|j                  t        |df¬
«      j                  «       }t        |«      rJ ‚ ||d|z  «       |j                  «        ~y# |j                  «        ~w xY w)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  )r.  r2   r<   r@   )rA   NrD   r/  )r   r)   r*   rQ   rW   rT   rV   r0  r6  r1  r	   r°   )r˜   r[   r*   r~   r^   r_   s         r   Ú6test_workaround_against_bad_memmap_with_copied_buffersr8    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                 ó   — | S r!   r   )Úargs    r   Úidentityr;  /  s   € Ø€Jr   zfactory,retry_nor<   z{}, {}c                 óÔ  — |j                  d«      j                  }dt        j                  z  }t        j                  dz   }t	        |d|d|¬«      } | d|j                  ¬«      }|j                  t        |f¬	«      j                  «       }t        |t        j                  «      sJ ‚|j                  |k(  sJ ‚t        j                  j                  ||«       |j                  «        y )
Nr5   r=   rD   r6   r‹   )r:   r9   r8   rB   r2   ©r    r/  )rP   rQ   r‘   r’   r
   r0  r;  r1  rY   r   rR   rB   r)   r*   r°   )	r˜   Úretry_nor[   r“   r”   rB   Úobjr~   r   s	            r   Ú test_pool_memmap_with_big_offsetr@  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×!Ñ! # vÔ.Ø‡K�K…Mr   c                 ó  — d}t        || j                  «      \  }}|du sJ ‚|| j                  d«      j                  k(  sJ ‚t        |d ¬«      \  }}t        j                  j                  d«      r|du sJ ‚|j                  |«      sJ ‚y )Nútest.tmpdirFr=  r  )r   rQ   rP   rv   r  r  Úendswith)r[   Úpool_folder_nameÚpool_folderÚ
shared_mems       r   Útest_pool_get_temp_dirrG  S  s�   € Ø$ÐÜ+Ð,<¸f¿n¹nÓMÑ€K�Ø˜ÑÐÐØ˜&Ÿ+™+ mÓ4×<Ñ<Ò<Ð<Ð<ä+Ð,<È$ÔOÑ€K�Ü
‡|�|×Ñ˜uÔ%Ø˜UÑ"Ð"Ð"Ø×ÑÐ 0Ô1Ð1Ñ1r   c                 ó,  — d}ddl }t        |j                  j                  d«      r&|j	                  |j                  j                  d«       t        |d¬«      \  }}t        j                  j                  d«      r|du sJ ‚|j                  |«      sJ ‚y)z`Check that _get_temp_dir works when os.statvfs is not defined

    Regression test for #902
    rB  r   NÚstatvfsr=  r  F)
Újoblib._memmapping_reducerÚhasattrÚ_memmapping_reducerr«   Údelattrr   rv   r  r  rC  )r[   ÚmonkeypatchrD  ÚjoblibrE  rF  s         r   Ú!test_pool_get_temp_dir_no_statvfsrP  _  s†   € ð
 %ÐÛ%äˆv×)Ñ)×,Ñ,¨iÔ8à×Ñ˜F×6Ñ6×9Ñ9¸9ÔEä+Ð,<È$ÔOÑ€K�Ü
‡|�|×Ñ˜uÔ%Ø˜UÑ"Ð"Ð"Ø×ÑÐ 0Ô1Ð1Ñ1r   z1This test fails with a PermissionError on WindowsÚ	mmap_moder?   r6   c                 ó"  ‡— d„ Št        d«      D �cg c]  }t        j                  dd¬«      ‘Œ }} t        | dd¬«      ˆfd	„t	        |«      D «       «      }t	        |«      D ]%  \  }}t        j
                  j                  ||«       Œ' y c c}w )
Nc                 ó   — || d d  | S r!   r   )ÚarrÚvalues     r   Úfuncz4test_numpy_arrays_use_different_memory.<locals>.funcw  s   € Øˆ‰AˆØˆ
r   rF   )rF   rF   rS   r;   r   r2   )rQ  rŸ   rÎ   c              3   óH   •K  — | ]  \  }} t        ‰«      ||«      –— Œ y ­wr!   ©r   )rÔ   r²   rT  rV  s      €r   rÕ   z9test_numpy_arrays_use_different_memory.<locals>.<genexpr>}  s)   øè ø€ ò DÙ"( ! SˆŒ�‹�c˜1×ñDùrÿ   )r©   r   Úzerosr   Ú	enumerater)   r*   )rQ  r²   Úarraysr  rT  rV  s        @r   Ú&test_numpy_arrays_use_different_memoryr\  q  sŠ   ø€ òô <AÀ»9ÖE°aŒb�h‰h�x yÖ1ÐE€FÐEàCŒh °qÀÔCó DÜ,5°fÓ,=ôDó €Gô ˜GÓ$ò .‰ˆˆ3Ü
�
‰
×%Ñ% c¨1Õ-ñ.ùò Fs   ’Bc            	      óô  — dd„} t        j                  d«      }t        «       }|j                  |d«       |j	                  |«      dk(  sJ ‚|}|j	                  |«      dk(  sJ ‚|j                  |d«       |j	                  |«      dk(  sJ ‚~t        j                  «        t        |j                  «      dk(  sJ ‚|j	                  |«      dk(  sJ ‚~ | |j                  «       t        j                  d«      }|j                  |d«       t        |j                  «      dk(  sJ ‚|j	                  |«      dk(  sJ ‚t        t        «      5  |j	                  t        j                  d«      «       d d d «       ~ | |j                  «       d„ }t        t        d	«      D �cg c]  } |||«      ‘Œ c}«      }t        j                  «       d
k(  rt        rdnd}t        |«      |k  sJ ‚y y # 1 sw Y   Œ{xY wc c}w )Nr„   c                 ó¢   — t        |«      D ]1  }t        | «      dk(  r y t        j                  «        t	        d«       Œ3 t        | «      dk(  sJ ‚y )Nr   r  )r©   rî   ÚgcÚcollectr   )Ú	containerÚretriesr²   s      r   Úassert_empty_after_gc_collectz>test_weak_array_key_map.<locals>.assert_empty_after_gc_collect‡  sH   € Ü�w“ò 	ˆAÜ�9‹~ Ò"ÙÜ�J‰JŒLÜ�#�Jð		ô
 �9‹~ Ò"Ð"Ñ"r   é*   r^   r_   rD   rH   c                 óü   — t        j                  d«      }t        t        «      5  | j	                  |«       d d d «       | j                  ||«       | j	                  |«      |k(  sJ ‚t        |«      S # 1 sw Y   Œ<xY w)Nrd  )r   rª   r   ÚKeyErrorr1  rê   r'  )Úmr²   r^   s      r   Úget_set_get_collectz4test_weak_array_key_map.<locals>.get_set_get_collect®  sa   € Ü�G‰G�B‹KˆÜ”HÓñ 	Ø�E‰E�!ŒH÷	à	�‰ˆa�ŒØ�u‰u�Q‹x˜1Š}Ðˆ}Ü�!‹uˆ÷		ð 	ús   ¥A2Á2A;r.  ÚCPythoni�  )r„   )r   rª   r   rê   r1  r_  r`  rî   Ú_datar   rf  r©   r  Úpython_implementationr   )	rc  r^   rg  r_   rH   rh  r²   Ú
unique_idsÚmax_len_unique_idss	            r   Útest_weak_array_key_maprn  …  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Ñ)¨!¨QÕ/ÒEÓF€JÜ×%Ñ%Ó'¨9Ò4õ %4™S¸ÐÜ�:‹Ð!3Ò3Ð3Ñ3ð 5÷#ð üò  Fs   Å
%G)ÆG5Ç)G2c                  óž   — t        «       } t        t        j                  «      5  t        j                  | «       d d d «       y # 1 sw Y   y xY wr!   )r   r   ÚpickleÚPicklingErrorÚdumps)rg  s    r   Ú#test_weak_array_key_map_no_picklingrs  Á  s8   € ÜÓ€AÜ	”×$Ñ$Ó	%ñ Ü�‰�QŒ÷÷ ñ ús   ¤AÁAc                 óê  ‡‡‡— t        | j                  d«      «      Št        j                  dd¬«      }|j	                  ‰«       ˆfd„Šd„ Š ‰«       } t        d¬«      ˆfd	„|fD «       «      } t        d¬«      ˆfd
„|fD «       «      }t        j                  j                  ||«        t        d¬«      ˆfd„t        d«      D «       «      }t        j                  j                  |d   |«       y )Nzarr.datrF   r‹   r;   c                  óü   •— t        ‰«      5 } t        j                  | j                  «       dt        j                  d¬«      }d d d «       t	        j
                  dt        j                  d¬«      S # 1 sw Y   Œ0xY w)Nr   )ÚaccessrB   r£   )r8   r]   rB   )Úopenr‘   ÚfilenoÚACCESS_READr   rZ   r‹   )ÚfdÚmmÚtestfiles     €r   Ú_read_arrayz%test_direct_mmap.<locals>._read_arrayÎ  s^   ø€ Ü�(‹^ð 	N˜rÜ—‘˜2Ÿ9™9›;¨´$×2BÑ2BÈ1ÔMˆB÷	Nä�z‰z˜%¤r§x¡x¸À1ÔEÐE÷	Nð 	Nús   �6A2Á2A;c                 ó   — | dz  S ©Nr2   r   ©rK   s    r   rV  ztest_direct_mmap.<locals>.funcÓ  ó   € Ø�!‰tˆr   r2   ©rÎ   c              3   ó@   •K  — | ]  } t        ‰«      |«      –— Œ y ­wr!   rX  ©rÔ   rK   rV  s     €r   rÕ   z#test_direct_mmap.<locals>.<genexpr>Ù  ó   øè ø€ Ò;°!˜]œW T›]¨1×-Ñ;ùó   ƒc              3   ó@   •K  — | ]  } t        ‰«      |«      –— Œ y ­wr!   rX  r„  s     €r   rÕ   z#test_direct_mmap.<locals>.<genexpr>Ü  ó   øè ø€ Ò A°a ¤¨£¨q×!1Ñ Aùr†  c              3   ó>   •K  — | ]  } t        ‰«      «       –— Œ y ­wr!   rX  ©rÔ   rÉ   r}  s     €r   rÕ   z#test_direct_mmap.<locals>.<genexpr>à  ó   øè ø€ Ò J¸AÐ!5¤¨Ó!5×!7Ñ Jùó   ƒrD   r   )	ÚstrrP   r   rT   Útofiler   r)   r*   r©   ©r[   r^   rT  Úrefr  r}  rV  r|  s        @@@r   Útest_direct_mmapr‘  Ç  sÇ   ú€ ô �6—;‘;˜yÓ)Ó*€HÜ
�	‰	�"˜GÔ$€AØ‡H�HˆXÔôFò
ñ ‹-€Cð Œ(˜!Ô
Ó;¸°sÔ;Ó
;€Cð !Œh˜aÔ Ó A¸C¸5Ô AÓA€GÜ‡J�J×!Ñ! '¨3Ô/ð !Œh˜aÔ Ó JÄÀqÃÔ JÓJ€GÜ‡J�J×!Ñ! '¨!¡*¨cÕ2r   c                 ó2  ‡‡‡— t        | j                  d«      «      Št        j                  dd¬«      j	                  dd«      }|j                  ‰«       ˆfd„Šd„ Š ‰«       } t        d¬	«      ˆfd
„|fD «       «      } t        d¬	«      ˆfd„|fD «       «      }|d   j                  d   rJ ‚t        j                  j                  ||«        t        d¬	«      ˆfd„t        d«      D «       «      }t        j                  j                  |d   |«       y )Nzarr2.datrF   r‹   r;   r=   r2   c                  óR   •— t        j                  ‰«      } | j                  dd«      S )Nr=   r2   )r   rR   rV   )r{  r|  s    €r   r}  z=test_parallel_memmap2d_as_memmap_1d_base.<locals>._read_arrayí  s"   ø€ Ü�Y‰Y�xÓ ˆØ�z‰z˜!˜QÓÐr   c                 ó   — | dz  S r  r   r€  s    r   rV  z6test_parallel_memmap2d_as_memmap_1d_base.<locals>.funcñ  r�  r   r‚  c              3   ó@   •K  — | ]  } t        ‰«      |«      –— Œ y ­wr!   rX  r„  s     €r   rÕ   z;test_parallel_memmap2d_as_memmap_1d_base.<locals>.<genexpr>÷  r…  r†  c              3   ó@   •K  — | ]  } t        ‰«      |«      –— Œ y ­wr!   rX  r„  s     €r   rÕ   z;test_parallel_memmap2d_as_memmap_1d_base.<locals>.<genexpr>ú  rˆ  r†  r   ÚF_CONTIGUOUSc              3   ó>   •K  — | ]  } t        ‰«      «       –— Œ y ­wr!   rX  rŠ  s     €r   rÕ   z;test_parallel_memmap2d_as_memmap_1d_base.<locals>.<genexpr>ÿ  r‹  rŒ  rD   )r�  rP   r   rT   rV   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ð !Œh˜aÔ Ó A¸C¸5Ô AÓA€GØ�q‰z×Ñ Ò/Ð/Ð/Ü‡J�J×!Ñ! '¨3Ô/ð !Œh˜aÔ Ó JÄÀqÃÔ JÓJ€GÜ‡J�J×!Ñ! '¨!¡*¨aÕ0r   )Yr   r_  Ú	itertoolsr‘   r«   rp  r  rt   rv   rë   Útimer   r  rJ  rL  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   rk   r‚   r‰   r—   Úget_memmapping_executorr´   r·   r¾   rÊ   rÝ   râ   ró   rú   rü   r  r	  r  ÚparamÚmarkr  r   r"  r*  r,  r3  r6  r8  r;  ÚlistÚproductr©   r¨   r�  rs   r@  rG  rP  r\  rn  rs  r‘  rš  )rK   Úys   00r   ú<module>rª     sr  ðÛ Û 	Û Û Û 	Û Û Û Û 
Û Ý ã å (÷÷ õ )Ý 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ó	
óð &�I×%Ñ%Ð'8¸&Ð&AÁ3ÀsÉEÐRSËHÓCUÓV÷	áˆAˆqð 	�‰˜˜1Õó	ôñóó ó ðò$	2ò2ð$ ÙØ‡L�L�GÑÐ$Wôñ ˆ[˜4 ˜,Ó'ñ.ó (óó ð
.ð ñ84ó ð84òvð Øñ3ó ó ð3ð6 Øñ1ó ó ñ1ùóU	s   ÎP,