Ë
    O/æjÞU  ã                   óÆ  — U d Z ddlmZmZ ddlmZmZm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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 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%  e	jL                  e'«      Z(ejR                  g df   Z*g Z+ejX                  e*   e-d<   de*fd„Z. G d„ d«      Z/ G d„ d«      Z0de1fd„Z2e G d„ d«      «       Z3 G d„ d«      Z4y)z)Scheduling and job monitoring utilities.
é    )ÚcontextmanagerÚ	ExitStack)Ú	dataclassÚfieldÚasdictN)ÚPath)ÚSlurmJobé   )Úgit_save)ÚSlurmConfigÚSubmitRules)Údisable_loggingÚsetup_logging)ÚDecoratedMain)Útry_load)ÚXPÚ_get_sigÚget_xpÚ_preemption_callbacksÚcallbackc                 ó.   — t         j                  | «       y ©N)r   Úappend)r   s    úL/root/repos/pocs/video-evals/.venv/lib/python3.12/site-packages/dora/shep.pyÚregister_preemption_callabackr   (   s   € Ü× Ñ  Õ*ó    c            	       óJ   — e Zd Z	 	 ddedej
                  e   dedefd„Zd„ Z	y)	Ú_SubmitItTargetÚmain_pickledÚargvÚrequeueÚ
local_codec                 ó´  — t        «        t        j                  dt        j                  t        j
                  «       t        j                  dt        j                  «       «       t        «       5 }|�r´t        d«      j                  «       }|j                  |j                  dz   z  }|j                  «       s+t        j                  d|«       t        j                  d«       t        |j!                  t#        j$                  «       «      «      }t        j                  d||«       t'        j(                  dd	t+        |«      g|¬
«       ||j,                  z  }	|	j                  «       st        j                  d|	«       t        j.                  j1                  t        j                  «       «       t        j2                  |	«       t        j.                  j5                  dt+        |	«      «       t        j                  d|	«       t        j                  dt        j.                  «       ddlm}
 || _         |
«       }t+        |j<                  «      t        j>                  d<   |t        j@                  dd  t        j                  d«       tC        jD                  |«      }t        j                  d«       tG        «         |«        d d d «       y # 1 sw Y   y xY w)Nz4SubmitItTarget starting, python is %s, version is %rz	CWD is %sú.z.tarz2Could not find tar file %s to run the code locallyr
   zExtracting tar file %s to %sÚtarÚxf)ÚcwdzCould not find code folder %sr   zSuccessfully changed dir to %szsys.path is now %r©Úget_distrib_specÚRANKzLoading pickled mainzGoing into main)$r   ÚloggerÚinfoÚsysÚ
executableÚversionÚosÚgetcwdr   r   ÚresolveÚparentÚnameÚexistsÚcriticalÚexitÚenter_contextÚtempfileÚTemporaryDirectoryr   Úrun_commandÚstrÚstemÚpathÚremoveÚchdirÚinsertÚdistribr)   r!   ÚrankÚenvironr    ÚpickleÚloadsr   )Úselfr   r    r!   r"   ÚstackÚ	code_pathÚtar_pathÚtarget_folderÚlocal_code_folderr)   ÚspecÚmains                r   Ú__call__z_SubmitItTarget.__call__-   så  € äŒÜ�‰ÐJÜ—N‘N¤C§K¡Kô	1ä�‰�K¤§¡£Ô-Ü‹[ð 	˜EÚÜ  ›I×-Ñ-Ó/�	Ø$×+Ñ+¨y¯~©~ÀÑ/FÑG�Ø—‘Ô(Ü—O‘OÐ$XÐZbÔcÜ—H‘H˜Q”KÜ $ U×%8Ñ%8¼×9TÑ9TÓ9VÓ%WÓ X�Ü—‘Ð:¸HÀmÔTÜ×$Ñ$ e¨T´3°x³=Ð%AÀ}ÕUØ$1°H·M±MÑ$AÐ!Ø(×/Ñ/Ô1Ü—O‘OÐ$CÐEVÔWÜ—‘—‘¤§	¡	£Ô,Ü—‘Ð*Ô+Ü—‘—‘ ¤3Ð'8Ó#9Ô:Ü—‘Ð<Ð>OÔPÜ—‘Ð0´#·(±(Ô;å1Ø"ˆDŒLÙ#Ó%ˆDô "% T§Y¡Y£ŒB�J‰J�vÑØŒC�H‰H�Q�RˆLÜ�K‰KÐ.Ô/Ü—<‘< Ó-ˆDÜ�K‰KÐ)Ô*ÜÔÙŒF÷=	÷ 	ñ 	ús   Á0IKËKc                 ó^  — ddl m} t        D ]	  } |«        Œ | j                  st	        j
                  d«        |«       j                  dk(  r>t        «       }|j                  j                  «       r|j                  j                  «        t        j                  j                  | g|¢­i |¤ŽS )Nr
   r(   r   )rB   r)   r   r!   r-   r7   rC   r   Úrendezvous_filer5   ÚunlinkÚsubmititÚhelpersÚDelayedSubmission)rG   ÚargsÚkwargsr)   r   Úxps         r   Ú
checkpointz_SubmitItTarget.checkpointS   sŠ   € Ý-Ü-ò 	ˆHÙ�Jð	ð �|Š|Ü�H‰H�QŒKáÓ×"Ñ" aÒ'ä“ˆBØ×!Ñ!×(Ñ(Ô*Ø×"Ñ"×)Ñ)Ô+Ü×Ñ×1Ñ1°$ÐH¸ÒHÀÑHÐHr   N)TF)
Ú__name__Ú
__module__Ú__qualname__ÚbytesÚtpÚSequencer<   ÚboolrO   rY   © r   r   r   r   ,   s:   „ ØTXØ$)ñ$ Uð $°"·+±+¸cÑ2Bð $ÈTð $Ø!ó$óLIr   r   c                   óÖ   — e Zd ZdZdefd„Zedefd„«       Zedefd„«       Z	e
g dfd„«       Ze
dd	„«       Zdd
„Zdd„Zdedefd„Zedej$                  e   fd„«       Zed„ «       Zd„ Zy)ÚSheepz[
    A Sheep is a specific run for a given XP. Sheeps are managed
    by the Shepherd.
    rX   c                 ód  — || _         d | _        g | _        g | _        | j                  j                  «       rzt        | j                  «      }t        |t        «      rMt        |«      dk(  r|\  | _        | _        y t        |«      dk(  r|\  | _        | _        | _        y t        d«      ‚|| _        y y )Né   é   zInvalid content for job file.)rX   ÚjobÚ_other_jobsÚ_dependent_jobsÚ	_job_filer5   r   Ú
isinstanceÚtupleÚlenÚRuntimeError)rG   rX   Úcontents      r   Ú__init__zSheep.__init__h   s›   € ØˆŒØ37ˆŒà79ˆÔØ;=ˆÔØ�>‰>× Ñ Ô"Ü˜tŸ~™~Ó.ˆGÜ˜'¤5Ô)Ü�w“< 1Ò$Ø18Ñ.�D”H˜dÕ.Ü˜“\ QÒ&ØGNÑD�D”H˜dÔ.°Õ0Dä&Ð'FÓGÐGà"�•ð #r   Úreturnc                 ó„   — | j                   j                  | j                   j                  j                  j                  z  S r   )rX   ÚfolderÚdoraÚshepÚjob_file©rG   s    r   rj   zSheep._job_filez   s)   € à�w‰w�~‰~ §¡§¡× 1Ñ 1× :Ñ :Ñ:Ð:r   c                 ó„   — | j                   j                  | j                   j                  j                  j                  z  S r   )rX   rs   rt   ru   Újson_job_filerw   s    r   Ú_json_job_filezSheep._json_job_file~   s)   € à�w‰w�~‰~ §¡§¡× 1Ñ 1× ?Ñ ?Ñ?Ð?r   Ústandardc                 ó²   — | €y| j                   j                  | j                  |«      }|dk(  r|rt        d„ |D «       «      rd}|j	                  d«      ry|S )z1Return the current state of the `Sheep`.
        NÚUNKNOWNc              3   ó:   K  — | ]  }|j                   d k7  –— Œ y­w)r}   N)Ústate)Ú.0rg   s     r   ú	<genexpr>z#Sheep._get_state.<locals>.<genexpr>Š   s   è ø€ Ò@¨c�3—9‘9 	Õ)Ñ@ùs   ‚ÚMISSINGÚ	CANCELLED)ÚwatcherÚ	get_stateÚjob_idÚanyÚ
startswith)rg   Ú
other_jobsÚmoder   s       r   Ú
_get_statezSheep._get_state‚   s[   € ð ˆ;ØØ—‘×%Ñ% c§j¡j°$Ó7ˆØ�IÒ¡*ÜÑ@°ZÔ@Ô@ð "�Ø×Ñ˜KÔ(ØØˆr   c                 óT   — | €y| j                   j                  | j                  |«      S )úDReturn True if the job is no longer running on the cluster.
        T)r„   Úis_doner†   )rg   rŠ   s     r   Ú_is_donezSheep._is_done“   s'   € ð ˆ;ØØ�{‰{×"Ñ" 3§:¡:¨tÓ4Ð4r   c                 óp  — | j                   €y| j                  rdt        | j                  «      dk  sJ ‚| j                   g| j                  z   }|D ]*  }|j                  j                  |j                  |«      rŒ* y y| j                   j                  j                  | j                   j                  |«      S )r�   Tr
   F)rg   ri   rm   rh   r„   rŽ   r†   )rG   rŠ   Úchainrg   s       r   rŽ   zSheep.is_done›   s�   € ð �8‰8ÐØØ×ÒÜ�t×'Ñ'Ó(¨AÒ-Ð-Ð-Ø—X‘X�J ×!5Ñ!5Ñ5ˆEØò !�Ø—{‘{×*Ñ*¨3¯:©:°tÕ<Ù ð!ð à—8‘8×#Ñ#×+Ñ+¨D¯H©H¯O©O¸TÓBÐBr   c                 óv  — | j                   r‡| j                  €J ‚t        | j                  «      dk  sJ ‚| j                  g| j                   z   }d }|D ]8  }t        j                  |g |«      }|dk(  st        j                  ||«      rŒ6|c S  |€J ‚|S | j                  | j                  | j                  |«      S )Nr
   Ú	COMPLETED)ri   rg   rm   rh   rc   r‹   r�   )rG   rŠ   r‘   r   rg   s        r   r   zSheep.stateª   s¼   € Ø×ÒØ—8‘8Ð'Ð'Ð'Ü�t×'Ñ'Ó(¨AÒ-Ð-Ð-Ø—X‘X�J ×!5Ñ!5Ñ5ˆEØˆEØò !�Ü×(Ñ(¨¨b°$Ó7�Ø˜KÒ'¬u¯~©~¸cÀ4Õ/HØ ’Lð!ð Ð$Ð$Ð$ØˆLà—?‘? 4§8¡8¨T×-=Ñ-=¸tÓDÐDr   r†   c                 ó:   — | j                   j                  |› d�z  S )Nz
_0_log.out)rX   rS   ©rG   r†   s     r   Ú_logz
Sheep._log¹   s   € Ø�w‰w×Ñ V H¨JÐ"7Ñ7Ð7r   c                 óÚ   — | j                   €y| j                   j                  }| j                  D ]8  }| j                  |j                  «      j	                  «       sŒ-|j                  }Œ: |S )zPReturn the current job id, especially useful when using dependent jobs.
        N)rg   r†   ri   r–   r5   )rG   r†   rg   s      r   Úcurrent_job_idzSheep.current_job_id¼   s\   € ð �8‰8ÐØØ—‘—‘ˆà×'Ñ'ò 	$ˆCØ�y‰y˜Ÿ™Ó$×+Ñ+Õ-ØŸ™‘ð	$ð ˆr   c                 óB   — | j                   }|€y| j                  |«      S )z)Return the path to the main log.
        N)r˜   r–   r•   s     r   Úlogz	Sheep.logÉ   s&   € ð ×$Ñ$ˆØˆ>ØØ�y‰y˜Ó Ð r   c                 óÔ   — d| j                   j                  › d| j                  «       › d�}| j                  �|d| j                  › d�z  }|d| j                   j
                  › d�z  }|S )NzSheep(z, state=z, zsid=zargv=ú))rX   Úsigr   rg   r˜   r    )rG   Úouts     r   Ú__repr__zSheep.__repr__Ò   sh   € Ø�t—w‘w—{‘{�m 8¨D¯J©J«L¨>¸Ð<ˆØ�8‰8ÐØ�T˜$×-Ñ-Ð.¨bÐ1Ñ1ˆCØ��t—w‘w—|‘|�n AÐ&Ñ&ˆØˆ
r   N)r{   )rZ   r[   r\   Ú__doc__r   rp   Úpropertyr   rj   rz   Ústaticmethodr‹   r�   rŽ   r   r<   r–   r^   ÚOptionalr˜   rš   rŸ   ra   r   r   rc   rc   c   sÕ   „ ñð#˜2ó #ð$ ð;˜4ò ;ó ð;ð ð@ ò @ó ð@ð Ø#%¨Jò ó ðð  ò5ó ð5óCóEð8˜3ð 8 4ó 8ð ð
 §¡¨CÑ 0ò 
ó ð
ð ñ!ó ð!ór   rc   Úxc                  ó   — y)z7No logging logging function, passed to `Shepherd`.
    Nra   )r¤   s    r   Úno_logr¦   Ú   s   € ð 	r   c                   óN   — e Zd ZU eed<    ee¬«      Zej                  e
   ed<   y)Ú	_JobArrayÚslurm_config)Údefault_factoryÚsheepsN)rZ   r[   r\   r   Ú__annotations__r   Úlistr«   r^   ÚListrc   ra   r   r   r¨   r¨   à   s   … àÓÙ"°4Ô8€FˆB�G‰G�E‰NÔ8r   r¨   c                   óF  — e Zd ZdZefdedej                  egdf   fd„Z	dej                  e   defd„Zd	edej                  e   fd
„Zdedej                  e   fd„Zd„ Zedefd„«       Zdededefd„Zdg dfdej                  ej.                     dej                  ej.                     dej                  e   fd„Zd„ Zedefd„«       Zedefd„«       Zedefd„«       Zdej>                  e   fd„Z dedededejB                  fd„Z"d„ Z#edefd „«       Z$d!e%fd"„Z&y)#ÚShepherdzÖ
    Takes care of the little jobs.

    Args:
        main (DecoratedMain): main function decorated by Dora.
        log (callable): log function, if provided should take a single string
            argument.
    rN   rš   Nc                 ó&  — || _         | j                  j                  dd¬«       | j                  j                  dd¬«       | j                  j                  dd¬«       || _        d| _        d | _        g | _        g | _	        | j                  «        y )NT)Úexist_okÚparentsF)rN   Ú_by_idÚmkdirÚ_orphansÚ_arraysrš   Ú_in_job_arrayÚ_existing_git_cloneÚ
_to_cancelÚ
_to_submitÚ_check_orphans)rG   rN   rš   s      r   rp   zShepherd.__init__ï   s   € ØˆŒ	Ø�‰×Ñ 4°ÐÔ6Ø�‰×Ñ T°4ÐÔ8Ø�‰×Ñ D°$ÐÔ7ØˆŒà#(ˆÔØ6:ˆÔ Ø68ˆŒØ.0ˆŒà×ÑÕr   r    rq   c                 ór   — t        |t        «      rJ ‚| j                  j                  |«      }t	        |«      S )zÄ
        Given a list of of arguments, return the matching `Sheep`,
        which will contain both information on the `dora.xp.XP`, and on
        the latest job associated with that XP.
        )rk   r<   rN   r   rc   )rG   r    rX   s      r   Úget_sheep_from_argvzShepherd.get_sheep_from_argvý   s2   € ô ˜d¤CÔ(Ð(Ð(Ø�Y‰Y×Ñ˜dÓ#ˆÜ�R‹yÐr   r�   c                 óN   — | j                   j                  |«      }t        |«      S )zj
        Returns a `Sheep` given the XP signature, if any exists, otherwise
        returns None.
        )rN   Úget_xp_from_sigrc   )rG   r�   rX   s      r   Úget_sheep_from_sigzShepherd.get_sheep_from_sig  s"   € ð
 �Y‰Y×&Ñ& sÓ+ˆÜ�R‹yÐr   r†   c                 óÂ   — | j                   |z  }|j                  «       r@|j                  «       j                  }| j                  j                  |«      }t        |«      S y)zu
        Returns the `Sheep` associated with the given `job_id`. If no sheep
        is found, returns None.
        N)r´   Ú
is_symlinkr2   r4   rN   rÀ   rc   )rG   r†   Úlinkr�   rX   s        r   Úget_sheep_from_job_idzShepherd.get_sheep_from_job_id  sN   € ð
 �{‰{˜VÑ#ˆØ�?‰?ÔØ—,‘,“.×%Ñ%ˆCØ—‘×*Ñ*¨3Ó/ˆBÜ˜“9ÐØr   c                 ó@   — t         j                  j                  «        y)zB
        Force an update of all job states with submitit.
        N)r	   r„   Úupdaterw   s    r   rÇ   zShepherd.update  s   € ô 	×Ñ×ÑÕ!r   r©   c              #   ó®   K  — | j                   rJ ‚| j                  j                  t        |«      «       d| _         	 d–— d| _         y# d| _         w xY w­w)z*Context manager to launch XP in job array.TNF)r¸   r»   r   r¨   )rG   r©   s     r   Ú	job_arrayzShepherd.job_array!  sN   è ø€ ð ×%Ò%Ð%Ð%Ø�‰×Ñœy¨Ó6Ô7Ø!ˆÔð	'Ûà!&ˆDÕø ˆDÕüs   ‚:A½A	 ÁAÁ		AÁAÚsheepÚrulesc                 óþ  — |j                   �î|j                  «       }|dk(  r@|j                  rÍt        j	                  d|j                   j
                  › �«       d|_         n™|dv rAt        j	                  d|j                   j
                  › d�«       |j                  r\d|_         nT|j                  rHt        j	                  d|j                   j
                  › d|› �«       | j                  |¬	«       d|_         |j                   €w| j                  s$| j                  j                  t        |«      «       || j                  d
   j                  k(  sJ ‚| j                  d
   j                  j                  |«       yy)zÈ
        Decides whether to schedule a new job for the given sheep, based on the rules
        given in `rules`.
        Jobs are actually only scheduled once the `commit()` method is called.
        Nr“   z"Ignoring previously completed job )ÚFAILEDrƒ   ÚOUT_OF_MEMORYÚTIMEOUTr‚   Ú	NODE_FAILzPrevious job z failed or was canceledzCancelling previous job z with status )rÊ   éÿÿÿÿ)rg   r   Úreplace_doner+   Údebugr†   ÚretryÚreplaceÚcancel_lazyr¸   r»   r   r¨   r©   r«   )rG   rÊ   r©   rË   r   s        r   Úmaybe_submit_lazyzShepherd.maybe_submit_lazy,  s;  € ð �9‰9Ð Ø—K‘K“MˆEØ˜Ò#Ø×%Ò%Ü—L‘LÐ#EÀeÇiÁi×FVÑFVÐEWÐ!XÔYØ $�E•IØð (ñ (ä—‘˜}¨U¯Y©Y×-=Ñ-=Ð,>Ð>UÐVÔWØ—;’;Ø $�E•Ià—=’=Ü—L‘LÐ#;¸E¿I¹I×<LÑ<LÐ;MÈ]Ð[`ÐZaÐ!bÔcØ×$Ñ$¨5Ð$Ô1Ø $�E”Ià�9‰9ÐØ×%Ò%Ø—‘×&Ñ&¤y°Ó'>Ô?Ø 4§?¡?°2Ñ#6×#CÑ#CÒCÐCÐCØ�O‰O˜BÑ×&Ñ&×-Ñ-¨eÕ4ð	 r   rg   Údependent_jobsc                 óä   — |€H|€J ‚|j                   �7| xj                  |j                   gt        |j                  «      z   z  c_        yy|�J ‚| xj                  |gt        |«      z   z  c_        y)zÝ
        Cancel a job. The job is actually cancelled only when `commit()` is called.
        You can either provide manually both a job and its dependents, or a sheep that
        will be automatically processed.
        N)rg   rº   r­   ri   )rG   rg   rØ   rÊ   s       r   rÖ   zShepherd.cancel_lazyI  sn   € ð ˆ;ØÐ$Ð$Ð$Ø�y‰yÐ$Ø—’ E§I¡I ;´°e×6KÑ6KÓ1LÑ#LÑL–ð %ð �=Ð �=Ø�OŠO ˜u¤t¨NÓ';Ñ;Ñ;ŽOr   c                 óú   — | j                   r"| j                  | j                   «       g | _         d| _        | j                  r:| j                  j	                  d«      }| j                  |«       | j                  rŒ9yy)zu
        Commit all changes registered so far with either `maybe_submit_lazy()`
        and `cancel_lazy()`.
        Nr   )rº   Ú_cancelr¹   r»   ÚpopÚ_submit)rG   rÉ   s     r   ÚcommitzShepherd.commitY  sZ   € ð
 �?Š?Ø�L‰L˜Ÿ™Ô)Ø ˆDŒOà#'ˆÔ Ø�oŠoØŸ™×+Ñ+¨AÓ.ˆIØ�L‰L˜Ô#ð �o�or   c                 ó˜   — | j                   j                  j                  | j                   j                  j                  j                  z  S r   )rN   rt   Údirru   Úby_idrw   s    r   r´   zShepherd._by_idg  s/   € à�y‰y�~‰~×!Ñ! D§I¡I§N¡N×$7Ñ$7×$=Ñ$=Ñ=Ð=r   c                 ó˜   — | j                   j                  j                  | j                   j                  j                  j                  z  S r   )rN   rt   rà   ru   Úorphansrw   s    r   r¶   zShepherd._orphansk  s/   € à�y‰y�~‰~×!Ñ! D§I¡I§N¡N×$7Ñ$7×$?Ñ$?Ñ?Ð?r   c                 ó˜   — | j                   j                  j                  | j                   j                  j                  j                  z  S r   )rN   rt   rà   ru   Úarraysrw   s    r   r·   zShepherd._arrayso  s/   € à�y‰y�~‰~×!Ñ! D§I¡I§N¡N×$7Ñ$7×$>Ñ$>Ñ>Ð>r   Újobsc                 óÂ   — dg|D �cg c]  }|j                   ‘Œ c}z   }t        j                  ddj                  |«      «       t	        j
                  |d¬«       y c c}w )NÚscancelz
Running %sú T©Úcheck)r†   r+   rÓ   ÚjoinÚspÚrun)rG   ræ   rg   Ú
cancel_cmds       r   rÛ   zShepherd._cancels  sH   € Ø�[¸$Ö#?°3 C§J£JÒ#?Ñ?ˆ
Ü�‰�\ 3§8¡8¨JÓ#7Ô8Ü
�‰ˆz Ö&ùò $@s   ‡Ar4   rs   c                 óð  — dt         j                  d<   t        |j                  «      }t	        j
                  ||j                  d«      |j                  d«      ¬«      }|j                  }|dkD  r|dz  dk7  rt        d«      ‚|dz  |d	<   d}n|}d
|d	<   |dk(  }|rd
}|j                  }	|	r|j                  |z  }
|
› d�|d<   |sd|› �|d<   |j                  r$d
|d<   |j                  €3||j                  z  |d<   n ||d<   |j                  €|j                  |d<   |j                  d«      }|j                  d«      }|�|}|r<|j                  dg «      }|j                  dt        j                  «       g«       ||d<   i }|j                  d«      �#dj!                  |j                  d«      «      |d<   ||d<   |d= |d= |d= |d= |d= t"        j%                  d|«        |j&                  d |ddœ|¤Ž |S )!NÚ1ÚSLURM_KILL_BAD_EXITÚmax_num_timeoutÚpython)rs   ró   rô   é   r   z.Can only take <= 8 gpus, or multiple of 8 gpusÚnodesr
   ÚGBÚmemzgpu:ÚgresÚntasks_per_nodeÚcpus_per_taskÚcontainer_chdirÚforce_chdirÚ	srun_argsz--container-workdirÚnodelistú,Úadditional_parametersÚgpusÚmem_per_gpuÚcpus_per_gpuÚone_task_per_nodeÚ
dependentszSlurm parameters %rT)Újob_nameÚstderr_to_stdoutra   )r0   rD   ÚdictÚ__dict__rS   ÚSlurmExecutorrÜ   r  Ú
ValueErrorr  r  rû   r  ÚgetÚextendr1   rì   r+   rÓ   Úupdate_parameters)rG   r4   rs   r©   rW   Úexecutorr  Úgpus_per_nodeÚno_gpusr  rø   rü   rý   rþ   Ú
additionals                  r   Ú_get_submitit_executorzShepherd._get_submitit_executorx  sA  € à,/Œ�
‰
Ð(Ñ)Ü�l×+Ñ+Ó,ˆÜ×)Ñ)Ø¨6¯:©:Ð6GÓ+HØ—:‘:˜hÓ'ô)ˆð × Ñ ˆØ�!Š8Ø�a‰x˜1Š}Ü Ð!QÓRÐRØ" a™iˆF�7‰OØ‰Mà ˆMØˆF�7‰OØ˜!‘)ˆÙØˆMØ"×.Ñ.ˆÙØ×*Ñ*¨]Ñ:ˆCØ"˜e 2˜JˆF�5‰MáØ# M ?Ð3ˆF�6‰NØ×)Ò)Ø()ˆFÐ$Ñ%Ø×)Ñ)Ð1Ø*7¸,×:SÑ:SÑ*S��Ò'à(5ˆFÐ$Ñ%Ø×)Ñ)Ð1Ø*6×*CÑ*C��Ñ'Ø Ÿ*™*Ð%6Ó7ˆØ—j‘j Ó/ˆØÐ"Ø)ˆOÙØŸ
™
 ;°Ó3ˆIØ×ÑÐ3´R·Y±Y³[ÐAÔBØ"+ˆF�;ÑØ(*ˆ
Ø�:‰:�jÓ!Ð-Ø%(§X¡X¨f¯j©j¸Ó.DÓ%EˆJ�zÑ"Ø*4ˆÐ&Ñ'Ø�6ˆNØ�=Ð!Ø�>Ð"ØÐ&Ð'Ø�<Ð Ü�‰Ð*¨FÔ3à"ˆ×"Ñ"ð 	ØØ!ñ	ð ò	ð ˆr   c                 ó8  — | j                   j                  «       D ]ø  }|j                  }t        j	                  d|› d�«       t        j                  ddt        j                  «       d|dddgd	d	¬
«      }|j                  j                  «       j                  «       j                  d«      D �cg c]  }|sŒ|j                  d«      d   ‘Œ }}|r4t        j	                  d|› d�«       t        j                  dg|z   d	¬«       |j                  «        Œú yc c}w )zCheck for orphaned jobs.zFound dirty tag z`, meaning a job might have been scheduled but Dora or Slurm crashed before the job id was saved.Úsqueuez-uz-nz-oz%iz-hT)Úcapture_outputrë   ú
Ú_r   zFound orphan job ids z, will cancelrè   rê   N)r¶   Úiterdirr4   r+   Úwarningrí   rî   r0   ÚgetloginÚstdoutÚdecodeÚstripÚsplitrR   )rG   Údirtyr4   ÚprocÚlineÚidss         r   r¼   zShepherd._check_orphans³  sö   € à—]‘]×*Ñ*Ó,ò 
	ˆEØ—:‘:ˆDÜ�N‰NÐ-¨d¨Vð 4Tð Tô Uä—6‘6˜8 T¬2¯;©;«=¸$ÀÀdÈDÐRVÐWØ)-°Tô;ˆDà26·+±+×2DÑ2DÓ2F×2LÑ2LÓ2N×2TÑ2TÐUYÓ2ZÖc¨$Ò^b�4—:‘:˜c“? 1Ó%ÐcˆCÐcÙÜ—‘Ð!6°s°e¸=ÐIÔJÜ—‘˜	�{ SÑ(°Õ5Ø�L‰L�Nñ
	ùò ds   Â.DÂ6Dc              #   óž   K  — | j                   |z  }|j                  «        	 d–— |j                  «        y# |j                  «        w xY w­w)z,Context manager to enter a potential orphan.N)r¶   ÚtouchrR   )rG   r4   Útokens      r   Ú_enter_orphanzShepherd._enter_orphanÁ  s9   è ø€ ð —‘ Ñ$ˆØ�‰Œð	Ûà�L‰L�NøˆE�L‰L�Nüs   ‚ A£8 §A¸A
Á
ArÉ   c                 óÔ  ‡— |j                   }|j                  }|sy t        |«      dkD  }|d   }| j                  j	                  |j
                  «       |j
                  j                  j                  Št        ˆfd„|D «       «      sJ d«       ‚d}|j                  r|rJ d«       ‚d}|r7t        t        |D �cg c]  }|j
                  j                  ‘Œ c}«      «      }n|j
                  j                  }|r| j                  j                  dz   |z   }	n| j                  j                  d	z   |z   }	|r| j                  |	z  }
n|j
                  j                  }
|
j!                  d¬
«       |D ]^  }|j
                  }| j                  j	                  |«       |j"                  j%                  «       sŒE|j"                  j'                  «        Œ` t)        j*                  | j                  «      }| j                  j                  j,                  r	‰sJ d«       ‚g }‰r0| j.                  €$t        j0                  | j                  «      | _        | j3                  |	«      5  t5        «       5 }‰r<| j.                  €J ‚|j7                  t        j8                  | j.                  «      «       | j;                  |	|
|«      }t5        «       5 }|r|j7                  |j=                  «       «       |j                   D �]B  }‰r8| j.                  €J ‚t        j>                  |j
                  | j.                  «       ||j
                  j@                  || j                  j                  j,                  g}|jC                   |jD                  tG        «       g|¢­Ž «       |j                  sŒ­t        |j                   «      dk(  sJ ‚tI        |j                  «      D ]d  }||j                  dz
  k(  }|d   jJ                  }|jM                  dd|› �i¬«       |jC                   |jD                  tG        «       g|¢­Ž «       Œf �ŒE 	 d d d «       g }|j                  r
|dd  }|d d }tO        ||«      D �];  \  }}|jJ                  |D �cg c]  }|jJ                  ‘Œ c}|D �cg c]  }|jJ                  ‘Œ c}tQ        |«      dœ}|jR                  jU                  tW        j*                  |«      «       t)        jX                  |||ft[        |j\                  d«      «       t^        ja                  d|jJ                  «       ||_1        ||_2        ||_3        | jh                  |jJ                  z  }|}|jk                  |j
                  jl                  jo                  «       «       |rg|j
                  jl                  |
j                  z  }|j%                  «       r#|jo                  «       |
jo                  «       k(  sJ ‚|jk                  |
«       |j
                  jp                  }|j%                  «       r|j'                  «        |jk                  |
«       | j                  js                  |j
                  «      }	| ju                  d|jJ                  › d|j
                  j                  › d|	› �«       �Œ> 	 d d d «       d d d «       y c c}w # 1 sw Y   �Œ„xY wc c}w c c}w # 1 sw Y   Œ.xY w# 1 sw Y   y xY w)Nr
   r   c              3   ód   •K  — | ]'  }|j                   j                  j                  ‰k(  –— Œ) y ­wr   )rX   rt   r   )r€   ÚotherÚuse_git_saves     €r   r�   z#Shepherd._submit.<locals>.<genexpr>Õ  s$   øè ø€ ÒN¸e�5—8‘8—=‘=×)Ñ)¨\Õ9ÑNùs   ƒ-0z?All jobs inside an array must have the same value for git_save.Tz(Cannot use dependent jobs and job arraysFÚ_array_r  )r²   z(Cannot use local_code without git_save !rÑ   Ú
dependencyzafternotok:)r  )r†   Úarray_job_idsÚdependent_job_idsr©   ÚwbzCreated job with id %szScheduled job z for sheep ú/);r«   r©   rm   rN   Úinit_xprX   rt   r   Úallr  r   Úsortedr�   r4   r·   Ú_xp_submititrµ   rQ   r5   rR   rE   Údumpsr"   r¹   Úget_new_cloner(  r   r8   Úenter_cloner  ÚbatchÚassign_cloner    r   Úsubmitr   Úranger†   r  Úzipr   rz   Ú
write_textÚjsonÚdumpÚopenrj   r+   rÓ   rg   rh   ri   r´   Ú
symlink_tors   r2   Ú_latest_submititÚget_namerš   )rG   rÉ   r«   r©   Úis_arrayÚfirstr!   rÊ   Úname_sigr4   Úsubmitit_folderrX   r   ræ   rH   r  Úarray_stackÚsubmitit_argsÚ	dep_indexÚlast_job_idrØ   rg   Ú	other_jobÚjob_info_for_jsonrÄ   Úsubmitit_linkÚlatestr,  s                              @r   rÝ   zShepherd._submitË  sØ  ø€ Ø×!Ñ!ˆØ ×-Ñ-ˆÙØä�v“; ‘?ˆØ�q‘	ˆØ�	‰	×Ñ˜%Ÿ(™(Ô#Ø—x‘x—}‘}×-Ñ-ˆÜÓNÀvÔNÔNð 	PØOó	PÐNð ˆØ×"Ò"ÙÐKÐ!KÓK�<ØˆGÙÜ¤À&Ö'I¸¨¯©¯«Ò'IÓ JÓK‰Hà—x‘x—|‘|ˆHÙØ—9‘9—>‘> IÑ-°Ñ8‰Dà—9‘9—>‘> CÑ'¨(Ñ2ˆDáØ"Ÿl™l¨TÑ1‰Oà#Ÿh™h×3Ñ3ˆOØ×Ñ tÐÔ,àò 	,ˆEØ—‘ˆBØ�I‰I×Ñ˜bÔ!Ø×!Ñ!×(Ñ(Õ*Ø×"Ñ"×)Ñ)Õ+ð		,ô —|‘| D§I¡IÓ.ˆØ�9‰9�>‰>×$Ò$ÙÐKÐ!KÓK�<Ø&(ˆÙ˜D×4Ñ4Ð<Ü'/×'=Ñ'=¸d¿i¹iÓ'HˆDÔ$Ø×Ñ Ó%ñ =	X¤y£{ð =	X°eÙØ×/Ñ/Ð;Ð;Ð;Ø×#Ñ#¤H×$8Ñ$8¸×9QÑ9QÓ$RÔSØ×2Ñ2°4¸È,ÓWˆHÜ“ð \ ÙØ×-Ñ-¨h¯n©nÓ.>Ô?Ø&×-Ñ-ó \�EÙ#Ø#×7Ñ7ÐCÐCÐCÜ ×-Ñ-¨e¯h©h¸×8PÑ8PÔQØ%1°5·8±8·=±=Ø%,¨d¯i©i¯n©n×.GÑ.Gð%I�Mà—K‘K  §¡´Ó0AÐ RÀMÒ RÔSØ#×.Ó.Ü" 9×#3Ñ#3Ó4¸Ò9Ð9Ð9Ü).¨|×/FÑ/FÓ)Gò \˜IØ&/°<×3JÑ3JÈQÑ3NÑ&N˜GØ*.¨r©(¯/©/˜KØ$×6Ñ6Ø7CÀ{ÐS^ÐR_ÐE`Ð6að 7ô cà ŸK™K¨¨¯©¼Ó8IÐ(ZÈMÒ(ZÕ[ò\ñ\÷\ð$  ˆNØ×&Ò&Ø!% a b �Ø˜B˜Q�x�ô " &¨$Ó/ó  X‘
��sà!Ÿj™jØHLÖ%M¸9 i×&6Ó&6Ò%MØLZÖ)[¸y¨)×*:Ó*:Ò)[Ü$*¨<Ó$8ñ	%Ð!ð ×$Ñ$×/Ñ/´·
±
Ð;LÓ0MÔNä—‘˜S $¨Ð7¼¸e¿o¹oÈtÓ9TÔUÜ—‘Ð5°s·z±zÔBØ�”	Ø$(�Ô!Ø(6�Ô%Ø—{‘{ S§Z¡ZÑ/�Ø�Ø—‘ §¡§¡× 7Ñ 7Ó 9Ô:Ùð &+§X¡X§_¡_°×7KÑ7KÑ%K�MØ$×+Ñ+Ô-Ø,×4Ñ4Ó6¸/×:QÑ:QÓ:SÒSÐSÐSà%×0Ñ0°ÔAØŸ™×2Ñ2�Ø—=‘=”?Ø—M‘M”OØ×!Ñ! /Ô2à—y‘y×)Ñ)¨%¯(©(Ó3�Ø—‘˜>¨#¯*©*¨°[ÀÇÁÇÁÀÈaÐPTÈvÐVÖWñA X÷;=	X÷ =	Xð =	Xùò5 (J÷>\ñ \üò6 &NùÚ)[÷C=	Xð =	Xú÷ =	Xð =	Xúse   Â9Z6É[É(A[ËCZ;ÎBZ;Ð9A[Ñ;[Ò[Ò[Ò'G=[Ú%[Ú;[Û [Û[	Û[Û[')'rZ   r[   r\   r    r¦   r   r^   ÚCallabler<   rp   r_   rc   r¾   r£   rÁ   rÅ   rÇ   r   r   rÉ   r   r×   rS   r	   rÖ   rÞ   r¡   r   r´   r¶   r·   r®   rÛ   r  r  r¼   r(  r¨   rÝ   ra   r   r   r°   r°   æ   s×  „ ñð MSñ ˜]ð °·±¸c¸UÀD¸[Ñ1Ió ð¨¯©°CÑ(8ð ¸Uó ð cð ¨b¯k©k¸%Ñ.@ó ð
¨Cð 
°B·K±KÀÑ4Fó 
ò"ð ð' kò 'ó ð'ð5 uð 5¸Kð 5ÐP[ó 5ð: AEØEGØ04ñ<˜rŸ{™{¨8×+<Ñ+<Ñ=ð <Ø$&§K¡K°×0AÑ0AÑ$Bð<àŸ;™; uÑ-ó<ò $ð ð>˜ò >ó ð>ð ð@˜$ò @ó ð@ð ð?˜ò ?ó ð?ð'˜BŸG™G HÑ-ó 'ð
9¨3ð 9¸ð 9Ø-8ð9Ø=E×=SÑ=Só9òvð ð #ò ó ððiX ô iXr   r°   )5r    Ú
contextlibr   r   Údataclassesr   r   r   r@  ÚloggingÚpathlibr   rE   r0   Ú
subprocessrí   r-   r9   Útypingr^   rS   r	   Ú r   Úconfr   r   rš   r   r   rN   r   Úutilsr   rX   r   r   r   Ú	getLoggerrZ   r+   rR  ÚPreemptionCallbackr   r®   r¬   r   r   rc   r<   r¦   r¨   r°   ra   r   r   ú<module>r^     sã   ðòç 0ß 0Ñ 0Û Û Ý Û Û 	Û Û 
Û Û õ Û å ß *ß /Ý Ý ß $Ñ $ð 
ˆ×	Ñ	˜8Ó	$€ð —[‘[  T Ñ*Ð Ø57Ð �r—w‘wÐ1Ñ2Ó 7ð+Ð,>ó +÷4Iñ 4I÷ntñ tðn	ˆcó 	ð ÷9ð 9ó ð9÷
NXò NXr   