Ë
    Ï�Dj"©  ã                   ó|  — 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
Z
d dlZd dlZd dlmZmZ d dlmZ d dlmZ d dlmZmZmZ d dlmZ d dlmZmZ d d	lmZ d d
lmZ d dl m!Z! d dl m"Z" d dl m#Z# d dl m$Z$ d dl m%Z% d dl m&Z& d dl m'Z( d„ Z)d„ Z*d„ Z+d„ Z,d„ Z-eed„ «       «       Z.e eej                  dk7  xs dd¬«      d„ «       «       Z/eed„ «       «       Z0ed„ «       Z1ee edeejd                  gdd g¬!«      d"„ «       «       «       Z3ee edeejd                  gdd g¬!«      d#„ «       «       «       Z4ee ed$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d)„ «       «       Z9e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jd                  gdd g¬!«      d.„ «       «       «       Z>ee ed$ ej~                  dej€                  jƒ                  d/¬«      ¬0«      d g«      d1„ «       «       «       ZBee edeejd                  gdd g¬!«      d2„ «       «       «       ZCeee edeejd                  gdd g¬!«      d3„ «       «       «       «       ZDeee edeejd                  gdd g¬!«      d4„ «       «       «       «       ZEee edeejd                  gdd g¬!«      d5„ «       «       «       ZFd6„ ZGee edeejd                  gdd g¬!«      d7„ «       «       «       ZHd8„ ZIee ed9 eJ ej–                  eejd                  g eLd:«      «      «       ej–                  dd g eMeN eLd:«      «      «      D � �cg c]  \  } }d;jŸ                  | |«      ‘Œ c}} ¬!«      d<„ «       «       «       ZPd=„ ZQd>„ ZRe eej                  dk(  d?¬«       ed@dAdBg«      dC„ «       «       «       ZSedD„ «       ZTdE„ ZUeedF„ «       «       ZVyc c}} w )Gé    N)Úsleep)Ú
with_numpyÚnp)Úwith_multiprocessing)Úwith_dev_shm)ÚraisesÚparametrizeÚskipif)Úmake_memmap)ÚParallelÚdelayed)ÚMemmappingPool)Ú_TestingMemmappingExecutor©Úhas_shareable_memory)ÚArrayMemmapForwardReducer)Ú_strided_from_memmap)Ú_get_temp_dir)Ú_WeakArrayKeyMap©Ú_get_backing_memmapc                  ó2   — t        j                  dd¬«       y )Ni,  T)ÚtimeoutÚexit)ÚfaulthandlerÚdump_traceback_later© ó    ú_C:\Crop_Prediction\Backend\crop-ai-system\venv\Lib\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Ø€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_arrayr1   .   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_doubler4   9   sI   € ð  $Ñ€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   }t        j                  |«      }|j                  }t        d| j                  dd«      Šˆfd„} ||«      }	t        |	«      sJ ‚t!        |	t         j
                  «      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   ©r9   N)é   é   é   úr+ÚFr?   )r9   r:   r;   ÚorderÚoffseté<   é   éÿÿÿÿr3   ÚcTc                 ó$   •—  ‰| «      \  }} ||Ž S r"   r   ©ÚxÚconsr-   Úreducers      €r   Úreconstruct_array_or_memmapzEtest_memmap_based_array_reducing.<locals>.reconstruct_array_or_memmapi   ó   ø€ Ù˜Q“Z‰
ˆˆdÙ�Tˆ{Ðr   r=   )r   r*   r+   ÚjoinÚstrpathÚmemmapÚfloat64Úaranger:   r9   ÚflushÚreshapeÚasarrayÚTr   r   Ú
isinstanceÚndarray)Útmpdirr+   ÚfilenameÚbufferÚaÚbrG   ÚdrM   Úa_reconstructedÚb_reconstructedÚc_reconstructedÚd_reconstructedÚa3Úa3_reconstructedÚb3Úb3_reconstructedrL   s                    @r   Ú test_memmap_based_array_reducingrh   H   sV  ø€ ô Ÿ™×6Ñ6ÐØ�{‰{˜;Ó'×/Ñ/€Hô �Y‰Y�x¤r§z¡z¸À4ÔH€Fð œŸ	™	 &§,¡,¨q¡/¸¿¹ÔFÑF€F‰1€IØ
‡L�L„Nô 	�	‰	�(¤"§*¡*°IØ 3¨qô	2€Aä�9‰9�R‹=× Ñ  §¡Ó)€A�a€Dð
 	
ˆ!ˆBˆ$��"��a˜�cˆ/Ñ€Aô 	�
‰
�1‹€AØ	�‰€Aô (¨¨f¯n©n¸cÀ4ÓH€Gôñ
 2°!Ó4€OÜ Ô0Ñ0Ü�o¤r§y¡yÔ1Ñ1Ù�¨Ô*ñ 2°!Ó4€OÜ Ô0Ñ0Ù�¨Ô*ñ 2°!Ó4€OÜ˜/¬2¯9©9Ô5Ñ5Ü Ô0Ñ0Ù�¨Ô*á1°!Ó4€OÜ˜/¬2¯9©9Ô5Ñ5Ü Ô0Ñ0Ù�¨Ô*ð 
ˆQ‰€BÜ# BÔ'Ñ'Ù2°2Ó6ÐÜ#Ð$4Ô5Ñ5ÜÐ*¬B¯I©IÔ6Ñ6ÙÐ'¨¨Q©Ô/ô 
�‰�B‹€BÜ# BÔ'Ñ'á2°2Ó6ÐÜÐ&¬¯
©
Ô3Ñ3Ü#Ð$4Ô5Ñ5ÙÐ'¨Õ,r   Úwin32r   z2PermissionError 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 ‚|dk(  sJ ‚dj                  |«      }||j                  «       v sJ ‚y )	Nr6   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)rO   rP   ÚformatÚ
subprocessÚPopenÚsysÚ
executableÚPIPEÚwaitÚcommunicateÚ
returncodeÚdecode)rZ   r[   ÚcmdÚpÚoutÚerrÚmsgs          r   Ú2test_resource_tracker_retries_when_permissionerrorr   –   s±   € ð �{‰{˜;Ó'×/Ñ/€Hð÷: 	‰˜ˆÓ!ð; ô< 	×Ñœ#Ÿ.™.¨$°Ð4¼Z¿_¹_Ü *§¡ô	1€Aà‡F�F„HØ�}‰}‹�H€CˆØ�<‰<˜1ÒÑØ�#Š:ÑØ
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 )Nr6   )éd   é   r‚   r=   r7   r8   i¬ r   é
   r>   rE   r=   r?   rG   Tc                 ó$   •—  ‰| «      \  }} ||Ž S r"   r   rI   s      €r   rM   zNtest_high_dimension_memmap_array_reducing.<locals>.reconstruct_array_or_memmapÚ   rN   r   )r   r*   r+   rO   rP   rQ   rR   rS   rU   r:   r   r   rX   )rZ   r+   r[   r]   r^   rG   r_   ÚerM   r`   ra   rb   rc   Úe_reconstructedrL   s                 @r   Ú)test_high_dimension_memmap_array_reducingr‡   Å   sp  ø€ ô Ÿ™×6Ñ6Ðà�{‰{˜;Ó'×/Ñ/€Hô 	�	‰	�(¤"§*¡*Ð4DØô	€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Ü�o¤r§y¡yÔ1Ñ1Ù�¨Ô*á1°!Ó4€OÜ Ô0Ñ0Ù�¨Ô*á1°!Ó4€OÜ Ô0Ñ0Ù�¨Ô*á1°!Ó4€OÜ Ô0Ñ0Ù�¨Ô*á1°!Ó4€OÜ Ô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 )Nr6   r>   rE   r7   )r;   r:   Úuint8ÚrÚCF)r9   r;   rC   rB   r:   ÚstridesÚtotal_buffer_lenÚunlink_on_gc_collectr3   )r3   )
rO   rP   ÚmmapÚALLOCATIONGRANULARITYr   rQ   r   rX   rC   r   )rZ   ÚfnameÚsizerC   Ú
memmap_objÚmemmap_backed_objs         r   Útest__strided_from_memmapr•   ô   sÒ   € à�K‰K˜Ó$×,Ñ,€EØŒt×)Ñ)Ñ)€DÜ×'Ñ'¨!Ñ+€Fä—‘˜5 t°4¸&±=ÔA€Jä% e°7ÀØ-3¸3ÀdØ.2ÀTØ;@ôB€Jô �j¤"§)¡)Ô,Ñ,Ø×Ñ Ò&Ñ&Ü,Ø�W 3¨v¸SØ�q‰yˆl D¸4Ø"ôÐô
 Ð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Úpoolrƒ   r3   ©Ú
max_nbytesÚtemp_folderr6   ©r=   r>   r7   r8   ç      ð?r   rE   )r>   r=   rG   g       @©rƒ   rŠ   é   )r9   r:   r;   rC   g      @N)r   r*   r+   ÚmkdirrP   rO   rQ   Úfloat32ÚfillÚmapr4   Úranger:   ÚonesÚosÚlistdirr   ÚAssertionErrorr1   ÚRuntimeErrorÚ
ValueErrorÚ	terminate)r–   rZ   r+   Úpool_temp_folderr{   r[   r]   ÚiÚjr^   rG   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Œà	�‰ŒnÜ(-¨a¯g©g°a©jÓ(9÷;Ø#$Ü(-¨a¯g©g°a©jÓ(9ò;à#$ð !" A q 6¨3Ò/ð ;Ð/ó ;ô 	<ñ 	˜1˜a¤"§'¡'¨!¯'©'Ó"2Ñ2Ô3ô �I‰I�h¤b§j¡j¸ÀSÔIˆà	�‰ŒnÜ(-¨a¯g©g°a©jÓ(9÷;Ø#$Ü(-¨a¯g©g°a©jÓ(9ò;à#$ð !" A q 6¨3Ò/ð ;Ð/ó ;ô 	<ô �z‰zÐ*Ó+¨rÒ1Ñ1ñ 	˜1˜a¤"§'¡'¨!¯'©'Ó"2Ñ2Ô3Ù˜1˜a¤"§'¡'¨!¯'©'Ó"2Ñ2Ô3ô �I‰I�h¤b§j¡j¸ÀCØ"ô$ˆô ”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ð 	
�‰ŒÙùóG;ùó;ùò"  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›   rƒ   r3   rœ   r6   rŸ   r7   r8   r    r   rE   N)r   r*   r+   r£   rP   rO   rQ   r¤   r¥   rV   rX   r   r¦   r4   r§   r:   r¨   r©   rª   r®   )
r–   rZ   r+   r¯   r{   r[   r]   Úa_viewr°   r±   s
             r   Ú test_pool_with_memmap_array_viewrµ   @  st  € ô Ÿ™×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Ü# FÔ+Ñ+à	�‰ŒnÜ(-¨a¯g©g°a©jÓ(9÷;Ø#$Ü(-¨a¯g©g°a©jÓ(9ò;à#$ð !'¨¨A¨°Ò4ð ;Ð4ó ;ô 	<ñ
 	˜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^   rl   rm   r   ú

)
rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   ©r¶   rz   r{   r|   r}   s        r   Ú-test_permission_error_windows_reference_cycler¼   g  s‹   € ð÷$ 	‰�ˆÓð% ô& 	×Ñœ#Ÿ.™.¨$°Ð4¼Z¿_¹_Ü *§¡ô	1€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 ‚t        j                   d d d	vsŒã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=   Ú
PYTHONPATHrl   ©rn   ro   Úenvr   r   ©)r=   é   r   )r=   rÂ   rE   ó   resource_tracker)rp   r§   r©   ÚenvironÚcopyÚpathÚdirnameÚ__file__rq   rr   rs   rt   ru   rv   rw   rx   Úversion_info)r¶   rz   Ú_rÀ   r{   r|   r}   s          r   Ú3test_permission_error_windows_memmap_sent_to_parentrË   Š  sÞ   € ð÷( 	‰�ˆÓð) ô, �1‹Xò 2ˆÜ�j‰j�o‰oÓˆÜŸG™GŸO™O¬HÓ5ˆˆLÑÜ×ÑœcŸn™n¨d°CÐ8Ü$.§O¡OÜ$.§O¡O¸ô>ˆð 	
�‰ŒØ—=‘=“?‰ˆˆSØ�|‰|˜qÒ Ð% #Ô%Ø�cŠzÑÜ×Ñ˜B˜QÐÐ'=Ò=ð
 '¨cÒ1Ñ1ñ2r   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@r3   rƒ   ©Ú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ùó   ƒ #rE   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   rS   Ú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Í   r3   rƒ   rÎ   c              3   óJ   •K  — | ]  } t        t        «      ‰d «      –— Œ y­wrÑ   rÒ   rÔ   s     €r   rÖ   z9test_managed_backend_reuse_temp_folder.<locals>.<genexpr>Ó  ó%   øè ø€ ò 
Ø45ÐŒG”GÓ˜U J×/ñ
ùrØ   rE   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¸Ô	;ð 
¸qÙó 
Ü9>¸q»ô
ó 
‰ˆñ ó 
Ü9>¸q»ô
ó 
‰ˆ÷	
ô �7‰7�?‰?˜:Ó&¬"¯'©'¯/©/¸*Ó*EÒEÑEÐE÷
ð 
ú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˜   r3   rƒ   )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%   øè ø€ ò Ø<=Ð$”GœGÓ$ U¨J×7ñùrØ   rE   )r   r§   Úaddr©   rÆ   rÇ   )r&   Ú	temp_dirsr{   r°   r[   s   `    r   Úconcurrent_get_filenamezJtest_memmapping_temp_folder_thread_safety.<locals>.concurrent_get_filenameé  sq   ø€ Ü˜f¨Q¸2Ô>ð 	9À!Ü˜2“Yò 9�Ùó ÜAFÀqÃôó ‘
�ð —‘œbŸg™gŸo™o¨hÓ7Õ8ñ	9÷	9÷ 	9ñ 	9ús   �AA5Á5A>)Útargetr-   rE   )	r   rS   rÛ   ÚsetÚ	threadingÚThreadÚstartrO   Ú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_raiserE   )r÷   r÷   rE   rl   )Úf1Úf2rm   rÃ   )
rq   rr   rs   rt   rp   ru   rv   rw   rx   ry   )rz   Úfunctions_and_returncodesrø   rù   rx   r{   r|   r}   s           r   Ú?test_multithreaded_parallel_termination_resource_tracker_silentrû     sª   € ð1€Còd!Ðð 8ò <ÑˆˆB�
Ü×ÑœcŸn™n¨d°C·J±JÀ"È°JÓ4LÐMÜ$.§O¡O¼J¿O¹OôMˆà	�‰ŒØ—=‘=“?‰ˆˆSØ�|‰|˜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 |«       ‚|dk(  sJ ‚t        j                  d d d	vrd
|vsJ ‚y 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¾   rl   r¿   r   r   r=   rÁ   rÃ   )rp   r©   rÄ   rÅ   rÆ   rÇ   rÈ   rq   rr   rs   rt   ru   rv   rw   rx   rÉ   )r¶   rz   rÀ   r{   r|   r}   s         r   Ú'test_many_parallel_calls_on_same_objectrý   L  sÕ   € ð÷$ 	‰�ˆÓð% ô& �*‰*�/‰/Ó
€CÜŸ™Ÿ™¬Ó1€CˆÑÜ×ÑÜ	�‰˜˜sÐ#Ü�‰Ü�‰Øô		€Að ‡F�F„HØ�}‰}‹�H€CˆØ�<‰<˜1ÒÐ!˜cÔ!Ø�#Š:ÑÜ
×Ñ˜˜ÐÐ#9Ñ9ð
 #¨#Ñ-Ñ-Ð-ð :r   c                 ó¬   ‡— t        j                  t        d«      «      Š t        d| d¬«      ˆfd„t	        d«      D «       «      \  }t        |«      �J ‚y )Ng     @�@r3   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EØ67Ð+ŒÔ*Ó+¨D×1ñCEùó   ƒ"rE   )r   r¨   rÛ   r   r§   r   )r¶   Úresultr.   s     @r   Ú%test_memmap_returned_as_regular_arrayr  |  sU   ø€ ô �7‰7”3�s“8Ó€DàBŒx˜q¨'¸cÔBó CEÜ;@À»8ôCEó E�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¹   rl   rm   r   rº   Úresource_tracker)rs   ÚplatformÚ
startswithÚpytestÚxfailrp   rq   rr   rt   ru   rv   rw   ry   rx   r»   s        r   Ú2test_resource_tracker_silent_when_reference_cyclesr
  ‡  sÒ   € ð" �&ÒœSŸ\™\×4Ñ4°UÔ;ô 	�‰ð,ô	
ð
÷$ 	‰�ˆÓð% ô& 	×Ñœ#Ÿ.™.¨$°Ð4¼Z¿_¹_Ü *§¡ô	1€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=   é(   r3   )r�   rž   Úverboser>   r<   r¢   r   r    r�   é   rE   ÚabcÚobjectrƒ   çš™™™™™¹?z#temporary folder {} was not deletedN)r©   rª   rP   rÆ   ÚexistsÚ_temp_folderr   r¨   r¤   Únbytesr¦   r1   r§   r:   rR   Úisdirrï   r&   r   r®   r   r«   rp   )	r–   rZ   r{   Úsmallr°   ÚlargeÚdumped_filenamesÚobjectsÚresultss	            r   Ú%test_memmapping_pool_for_large_arraysr  ¾  sf  € ô �:‰:�f—n‘nÓ%¨Ò+Ñ+ñ 	�˜b¨f¯n©nÀaÔH€Að(ä�z‰z˜&Ÿ.™.Ó)¨RÒ/Ñ/Ü—7‘7—>‘> !§.¡.Ô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Ü�"ŒIÜ—7‘7—>‘> !§.¡.Õ1Øñ
 ð	ô
 !Ø5×<Ñ<¸Q¿^¹^ÓLóð ùò= Lùò Løð  	
�‰ŒÜ�r“ò 	ˆAÜ�"ŒIÜ—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¾   rl   r¿   ú
r   Ú )rp   r©   rÄ   rÅ   rÆ   rÇ   rÈ   rq   rr   rs   rt   ru   rv   rw   ry   Úsplitrx   r  )r¶   rz   rÀ   r{   r|   r}   r[   s          r   Ú&test_child_raises_parent_exits_cleanlyr!  ö  sé   € ð:-÷Z 	‰�ˆÓð[ ô\ �*‰*�/‰/Ó
€CÜŸ™Ÿ™¬Ó1€CˆÑÜ×Ñœ#Ÿ.™.¨$°Ð4¼Z¿_¹_Ü *§¡°Sô	:€Aà‡F�F„HØ�}‰}‹�H€CˆØ�z‰z‹|˜SŸZ™Z›\ˆ€CØ�y‰y˜‹˜qÑ!€HØ�<‰<˜1ÒÐ(˜cšj SÔ(Ø�"Š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    )rP   r©   rª   r   r¨   rR   r  r¦   r1   r§   r:   r®   )r–   rZ   r{   r  r°   s        r   Ú.test_memmapping_pool_for_large_arrays_disabledr#  N  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=   rƒ   ©r�   z"/dev/shm/joblib_memmapping_folder_r�   r<   r  rE   r3   r  z(temporary folder of pool was not deletedN)ÚjmrÚSYSTEM_SHARED_MEM_FS_MIN_SIZErÛ   r  r  r©   rÆ   r  r   r¨   rR   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+  i  s�  € ô ×1Ñ1€Ið+6ô -0°«IŒÔ)Ù�A "Ô%ˆð	ð  !Ÿ~™~ÐØ@ˆMØ#×.Ñ.¨}Ô=Ñ=Ü—7‘7—>‘>Ð"2Ô3Ñ3ô —‘˜¤2§:¡:Ô.ˆAØ—8‘8˜s’?Ñ"Ø�E‰E”"�q�c˜B‘hÔô ”r—z‘zÐ"2Ó3Ó4¸Ò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ÙÜ�"�Ið		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=   rƒ   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à,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=   rƒ   rœ   )éè  ©r-   r/  N)	r   r*   r+   rP   Úapply_asyncr¨   Úgetr   r®   )r–   rZ   r+   r{   Úresr  s         r   Ú/test_memmapping_pool_for_large_arrays_in_returnr4  ¼  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 subprocessr   )r]   Ún_timess     r   Ú_worker_multiplyr7  Ö  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=   rƒ   rœ   ip  )r/  r3   r=   rA   )rB   NrE   r0  )r   r*   r+   rP   rV   rS   rU   r1  r7  r2  r   r®   )r–   rZ   r+   r{   r]   r^   s         r   Ú6test_workaround_against_bad_memmap_with_copied_buffersr9  Ü  s¼   € ô Ÿ™×6Ñ6Ðá�˜b¨f¯n©nÔ=€Aðô �J‰J”r—y‘y “×.Ñ.¨|Ó<Ø ô"Ú"# R a 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 )
Nr6   r>   rE   r7   r‰   )r;   r:   r9   rC   r3   ©rž   r0  )rO   rP   r�   r�   r   r1  r<  r2  rX   r   rQ   rC   r*   r+   r®   )	r–   Úretry_norZ   r‘   r’   rC   Úobjr{   r  s	            r   Ú test_pool_memmap_with_big_offsetrA  ý  s¹   € ð �K‰K˜Ó$×,Ñ,€EØŒt×)Ñ)Ñ)€DÜ×'Ñ'¨!Ñ+€FÜ
�e $¨d¸'Ø#ô%€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   rP   rO   rs   r  r  Úendswith)rZ   Úpool_folder_nameÚpool_folderÚ
shared_mems       r   Útest_pool_get_temp_dirrH    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
    rC  r   NÚstatvfsr>  r  F)
Újoblib._memmapping_reducerÚhasattrÚ_memmapping_reducerr©   Údelattrr   rs   r  r  rD  )rZ   ÚmonkeypatchrE  ÚjoblibrF  rG  s         r   Ú!test_pool_get_temp_dir_no_statvfsrQ  $  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@   r7   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>.func:  s   € Øˆ‰AˆØˆ
r   rƒ   )rƒ   rƒ   rR   r<   r   r3   )rR  r�   rÏ   c              3   óH   •K  — | ]  \  }} t        ‰«      ||«      –— Œ y ­wr"   ©r   )rÕ   r°   rU  rW  s      €r   rÖ   z9test_numpy_arrays_use_different_memory.<locals>.<genexpr>@  s)   øè ø€ ò D?Ù"( ! SˆŒ�‹�c˜1×ñD?ùr   )r§   r   Úzerosr   Ú	enumerater*   r+   )rR  r°   Úarraysr  rU  rW  s        @r   Ú&test_numpy_arrays_use_different_memoryr]  5  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(  r0t        t        j                   dd«      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_collectJ  sH   € Ü�w“ò 	ˆAÜ�9‹~ Ò"ÙÜ�J‰JŒLÜ�"�Ið		ô
 �9‹~ Ò"Ñ"Ð"r   é*   r]   r^   rE   rG   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)Nre  )r   r¨   r   ÚKeyErrorr2  rë   r(  )Úmr°   r]   s      r   Úget_set_get_collectz4test_weak_array_key_map.<locals>.get_set_get_collectq  s_   € Ü�G‰G�B‹KˆÜ”HÓñ 	Ø�E‰E�!ŒH÷	à	�‰ˆa�ŒØ�u‰u�Q‹x˜1Š}ÑÜ�!‹uˆ÷		ð 	ús   ¥A2Á2A;r/  ÚCPythonÚnogilFi�  )r�   )r   r¨   r   rë   r2  r`  ra  rï   Ú_datar   rg  r§   r  Úpython_implementationrÓ   rs   Úflags)	rd  r]   rh  r^   rG   ri  r°   Ú
unique_idsÚmax_len_unique_idss	            r   Útest_weak_array_key_maprq  G  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ô %,¬C¯I©I°wÀÔ$F™SÈCÐÜ�:‹Ð!3Ò3Ñ3Ð3ð 5÷#ð üò  Fs   Å
%G>ÆH
Ç>H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)rh  s    r   Ú#test_weak_array_key_map_no_picklingrv  „  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                  ||«       ˆfd„Š t        d¬«      ˆfd„t        d«      D «       «      }t        j                  j                  |d   |«       y )Nzarr.datrƒ   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   )ÚaccessrC   r¡   )r9   r\   rC   )Úopenr�   ÚfilenoÚACCESS_READr   rY   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 )Nr3   r   )rJ   s    r   rW  ztest_direct_mmap.<locals>.func–  s   € Ø�!‰tˆr   r3   )rÏ   c              3   ó@   •K  — | ]  } t        ‰«      |«      –— Œ y ­wr"   rY  ©rÕ   rJ   rW  s     €r   rÖ   z#test_direct_mmap.<locals>.<genexpr>œ  s   øè ø€ Ò;°!˜]œW T›]¨1×-Ñ;ùó   ƒc              3   ó@   •K  — | ]  } t        ‰«      |«      –— Œ y ­wr"   rY  rƒ  s     €r   rÖ   z#test_direct_mmap.<locals>.<genexpr>Ÿ  s   øè ø€ Ò A°a ¤¨£¨q×!1Ñ Aùr„  c                  ó   •—  ‰ «       S r"   r   )r€  s   €r   Úworkerz test_direct_mmap.<locals>.worker£  s   ø€ Ù‹}Ðr   c              3   ó>   •K  — | ]  } t        ‰«      «       –— Œ y ­wr"   rY  )rÕ   rÊ   r‡  s     €r   rÖ   z#test_direct_mmap.<locals>.<genexpr>¦  s   øè ø€ Ò E°q ¤¨£×!2Ñ Eùs   ƒrE   r   )	ÚstrrO   r   rS   Útofiler   r*   r+   r§   )	rZ   r]   rU  Úrefr  r€  rW  r  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Ô Ó E¼EÀ!»HÔ EÓE€GÜ‡J�J×!Ñ! '¨!¡*¨cÕ2r   )Wr©   r�   rs   r  r`  rs  Ú	itertoolsÚtimer   rq   rì   r   r  Újoblib.test.commonr   r   r   r   Újoblib.testingr   r	   r
   Újoblib.backportsr   Újoblib.parallelr   r   Újoblib.poolr   Újoblib.executorr   ÚTestExecutorrK  r   r   r   r   r   r   rM  r&  r    r$   r'   r1   r4   rh   r   r‡   r•   Úget_memmapping_executorr²   rµ   r¼   rË   rÞ   rã   rô   rû   rý   r  r
  r  ÚparamÚmarkr	  r!  r#  r+  r-  r4  r7  r9  r<  ÚlistÚproductr§   r¦   r‰  rp   rA  rH  rQ  r]  rq  rv  rŒ  )rJ   Úys   00r   ú<module>rœ     sB  ðÛ 	Û Û 
Û Û 	Û Û Ý Û Û Û ã ç -Ý 3Ý +ß 6Ñ 6Ý (ß -å &Ý FÝ ;Ý @Ý ;Ý 4Ý 7Ý :Ý (ò>ò/òò
<ò@ð ØñI-ó ó ðI-ðX Ùˆ�‰˜Ñ	 Ò' RØCôEñ)óEó ð)ðX Øñ*+ó ó ð*+ðZ ñCó ðCð* ØÙˆY˜¨×)MÑ)MÐNØ# VÐ,ô.ñ/ó.ó ó ð/ðd ØÙˆY˜¨×)MÑ)MÐNØ# VÐ,ô.ñ ó.ó ó ð ðF ØÙˆYÐ*¨FÐ3Ó4ñCó 5ó ó ðCð@ ØÙˆYÐ*¨FÐ3Ó4ñ,2ó 5ó ó ð,2ð^ ØÙˆYÐ*¨FÐ3Ó4ñ
Fó 5ó ó ð
Fð ØÙˆYÐ*¨FÐ3Ó4ñ
Fó 5ó ó ð
Fð Øñ#4ó ó ð#4ðL ØñC<ó ó ðC<ðL ØÙˆYÐ*¨FÐ3Ó4ñ*.ó 5ó ó ð*.ðZ ØÙˆYÐ*¨FÐ3Ó4ñ/ó 5ó ó ð/ð ØÙˆYÐ*¨FÐ3Ó4ñ1.ó 5ó ó ð1.ðh ØÙˆY˜¨×)MÑ)MÐNØ# VÐ,ô.ñ1ó.ó ó ð1ðh ØÙØàˆ�‰ØØ—+‘+×#Ñ#ØEð $ó ô	
ð 	ðóñG(óó ó ðG(ðT ØÙˆY˜¨×)MÑ)MÐNØ# VÐ,ô.ñó.ó ó ðð. ØØÙˆY˜¨×)MÑ)MÐNØ# VÐ,ô.ñ.6ó.ó ó ó ð
.6ðb ØØÙˆY˜¨×)MÑ)MÐNØ# VÐ,ô.ñ6ó.ó ó ó ð
6ð0 ØÙˆY˜¨×)MÑ)MÐNØ# VÐ,ô.ñó.ó ó ðò,ð ØÙˆY˜¨×)MÑ)MÐNØ# VÐ,ô.ñó.ó ó ðò2ð ØÙØÙÐ	ˆ×	Ñ	Ø	˜×=Ñ=Ð>ÁÀaÃó
Jó Kà+<¨9×+<Ñ+<Ø	˜FÐ#¡S¨©e°A«hÓ%7ó,9÷ 	:¡4 1 aˆ�‰˜˜AÕ	ó 	:ô	;ñó;ó ó ðò&	2ò2ð" Ùˆ�‰˜Ñð )%ô &áˆ[˜4 ˜,Ó'ñ.ó (ó&ó ð.ð ñ94ó ð94òxð Øñ3ó ó ñ3ùóS	:s   Î6P8