Ë
    ?çi»T  ã            K       ó  — 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Zd dlmZ ddlmZmZmZmZ dede	j&                  e	j(                  edf      fd„Z G d	„ d
ej,                  «      Z G d„ dej0                  ej2                     «      Z G d„ de«      Zdede	j&                  e   fd„Zdedede	j&                  e   defd„Zdefd„Z  G d„ dejB                  «      Z" G d„ dejF                  «      Z$ e jJ                  «       de	jL                  ee	jN                  f   fd„«       Z(	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dGdede	jR                  eef   dede	jT                  e   ded ed!e	jT                  e   d"e	jT                  e   d#e	jT                  e   d$e	jT                  e   d%e	jT                  e   d&e	jT                  e   d'e	jT                  e   d(e	jT                  e	j&                  e      d)e	jT                  e	j&                  e      d*e	jT                  e   d+e	jT                  e   d,e	jT                  e   d-ed.e	jT                  e   d/e	jT                  e   d0e	jT                  e   d1e	jT                  e   d2e	jT                  e   d3e	jT                  e   d4e	jT                  e   d5e	jT                  e   d6e	jT                  e   d7e	jT                  e	jR                  e+ef      d8ed9ed:e+d;e	jT                  e   d<e	jT                  e	jL                  ee	jN                  f      d=e	jT                  e	jX                  e      d>e+defJd?„Z-d@e.defdA„Z/dBedCe	jN                  defdD„Z0dEe	j&                  e   defdF„Z1y)Hé    N)ÚPathé   )ÚcoreÚjob_environmentÚloggerÚutilsÚjob_idÚreturn.c           	      óf  — d}t        j                  || «      }|�]|j                  d«      }|j                  d«      j                  d«      }|D �cg c]   }t	        |g|j                  d«      z   «      ‘Œ" c}S | j                  dd«      ^}}|s|fgS t        t        |d   «      «      }||fgS c c}w )	zlReads formated job id and returns a tuple with format:
    (main_id, [array_index, [final_array_index])
    z:(?P<main_id>\d+)_\[(?P<arrays>(\d+(-\d+)?(,)?)+)(\%\d+)?\]Úmain_idÚarraysÚ,Ú-Ú_é   r   )ÚreÚsearchÚgroupÚsplitÚtupleÚstrÚint)	r	   ÚpatternÚmatchÚmainÚarray_rangesÚarray_ranger   Úarray_idÚ	array_nums	            úi/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/submitit/slurm/slurm.pyÚread_job_idr!      s¼   € ð L€GÜ�I‰I�g˜vÓ&€EØÐØ�{‰{˜9Ó%ˆØ—{‘{ 8Ó,×2Ñ2°3Ó7ˆÙJVÓWÉ,¸;”�t�f˜{×0Ñ0°Ó5Ñ5Õ6È,ÑWÐWà#Ÿ\™\¨#¨qÓ1Ðˆ�(ÙØ�J�<Ðäœ˜H Q™KÓ(Ó)ˆ	Ø˜)Ð$Ð%Ð%ùò Xs   Á%B.c                   óÌ   — e Zd Zdej                  ej
                  e      fd„Zd	dededefd„Zdej                  e
ef   dej                  eej                  eef   f   fd„Zy)
ÚSlurmInfoWatcherr
   c                 óÔ   — | j                   | j                  z
  D �ch c]  }|j                  d«      d   ’Œ }}|sy g d¢}|D ]  }|j                  dt	        |«      g«       Œ  |S c c}w )Nr   r   )Úsacctz-ozJobID,State,NodeListz--parsable2z-j)Ú_registeredÚ	_finishedr   Úextendr   )ÚselfÚxÚto_checkÚcommandÚjids        r    Ú_make_commandzSlurmInfoWatcher._make_command+   sj   € ð .2×-=Ñ-=ÀÇÁÒ-NÓOÑ-N¨�A—G‘G˜C“L “OÐ-NˆÐOÙØÚHˆÛˆCØ�N‰N˜D¤# c£(Ð+Õ,ð àˆùò Ps   œA%r	   Úmodec                 óR   — | j                  ||¬«      }|j                  d«      xs dS )aS  Returns the state of the job
        State of finished jobs are cached (use watcher.clear() to remove all cache)

        Parameters
        ----------
        job_id: int
            id of the job on the cluster
        mode: str
            one of "force" (forces a call), "standard" (calls regularly) or "cache" (does not call)
        )r/   ÚStateÚUNKNOWN)Úget_infoÚget)r)   r	   r/   Úinfos       r    Ú	get_statezSlurmInfoWatcher.get_state6   s*   € ð �}‰}˜V¨$ˆ}Ó/ˆØ�x‰x˜Ó Ò- IÐ-ó    Ústringc           	      ó²  — t        |t        «      s|j                  «       }|j                  «       }t	        |«      dk  ri S |d   j                  d«      }i }|dd D ]¼  }t        ||j                  d«      «      D ��ci c]  \  }}||j                  «       “Œ }}}|d   }	|	rd|	v rŒK	 t        |	«      }
|
D ]a  }||d
j                  |dd «      <   t	        |«      dk\  sŒ)t        t        |d   «      t        |d   «      dz   «      D ]  }|||d   › d
|› �<   Œ Œc Œ¾ |S c c}}w # t        $ r*}t        j                  d|	› d	|› �t        «       Y d}~Œõd}~ww xY w)zNReads the output of sacct and returns a dictionary containing main informationr   r   Ú|r   NÚJobIDÚ.zCould not interpret z# correctly (please open an issue):
r   é   )Ú
isinstancer   ÚdecodeÚ
splitlinesÚlenr   ÚzipÚstripr!   Ú	ExceptionÚwarningsÚwarnÚDeprecationWarningÚjoinÚranger   )r)   r8   ÚlinesÚnamesÚ	all_statsÚliner*   ÚyÚstatsr	   Úmulti_split_job_idÚeÚsplit_job_idÚindexs                 r    Ú	read_infozSlurmInfoWatcher.read_infoD   sw  € ä˜&¤#Ô&Ø—]‘]“_ˆFØ×!Ñ!Ó#ˆÜˆu‹:˜Š>ØˆIØ�a‘—‘˜sÓ#ˆà57ˆ	Ø˜!˜"“IˆDÜ.1°%¸¿¹ÀC»Ô.IÔJÑ.I¡d a¨�Q˜Ÿ™›	‘\Ð.IˆEÑJØ˜7‘^ˆFÙ˜S F™]ØðÜ%0°Ó%8Ð"ó !3�àð ˜#Ÿ(™( <°°Ð#3Ó4Ñ5ô �|Ó$¨Ó)Ü!&¤s¨<¸©?Ó';¼SÀÈaÁÓ=QÐTUÑ=UÖ!V˜ØBG˜	 \°!¡_Ð$5°Q°u°gÐ">Ò?ñ "Wñ !3ð ð* Ðùó) Køô ò ä—‘Ø*¨6¨(Ð2VÐWXÐVYÐZÔ\nôô ûðús   Á=DÂ(D#Ä#	EÄ, EÅEN)Ústandard)Ú__name__Ú
__module__Ú__qualname__ÚtpÚOptionalÚListr   r.   r6   ÚUnionÚbytesÚDictrT   © r7   r    r#   r#   *   su   „ ð	˜rŸ{™{¨2¯7©7°3©<Ñ8ó 	ñ. ð .¨3ð .Àó .ð §¡¨°¨Ñ 4ð ¸¿¹ÀÀbÇgÁgÈcÐSVÈhÑFWÐAWÑ9Xô r7   r#   c                   ó4   — e Zd ZdZ ed¬«      Zddeddfd„Zy)	ÚSlurmJobÚscanceliX  )Údelay_sÚtimeoutr
   Nc                 ó¦   — d| j                   dg}|st        j                  |dgz   «       t        j                  |t        j                  gz   «       y)zØSends preemption or timeout signal to the job (for testing purpose)

        Parameter
        ---------
        timeout: bool
            Whether to trigger a job time-out (if False, it triggers preemption)
        rb   z--signalÚSIGTERMN)r	   Ú
subprocessÚ
check_callÚSlurmJobEnvironmentÚUSR_SIG)r)   rd   Úcmds      r    Ú
_interruptzSlurmJob._interruptj   sI   € ð ˜$Ÿ+™+ zÐ2ˆáÜ×!Ñ! #¨¨Ñ"3Ô4Ü×Ñ˜cÔ%8×%@Ñ%@Ð$AÑAÕBr7   )F)rV   rW   rX   Ú_cancel_commandr#   ÚwatcherÚboolrl   r_   r7   r    ra   ra   f   s'   „ Ø€OÙ sÔ+€GñC $ð C°4ô Cr7   ra   c                   ó   — e Zd Zy)ÚSlurmParseExceptionN)rV   rW   rX   r_   r7   r    rq   rq   y   s   „ Ør7   rq   Úsuffix_partsc                 ó  — g }| j                  d«      D ]s  }d|v r\|j                  d«      \  }}t        |«      }t        t        |«      t        |«      dz   «      D ]  }|j	                  |d|› �›«       Œ Œc|j	                  |«       Œu |S )z_Parse the a suffix formatted like "1-3,5,8" into
    the list of numeric values 1,2,3,5,8.
    r   r   r   Ú0)r   rA   rI   r   Úappend)rr   ÚsuffixesÚsuffix_partÚlowÚhighÚ
int_lengthÚnums          r    Ú_expand_id_suffixr|   }   sŒ   € ð €HØ#×)Ñ)¨#Ö.ˆØ�+ÑØ#×)Ñ)¨#Ó.‰IˆC�Ü˜S›ˆJÜœS ›X¤s¨4£y°1¡}Ö5�Ø—‘ 3 q¨¨ nÐ"5Õ7ñ 6ð �O‰O˜KÕ(ð /ð €Or7   Ú	node_listÚposÚparsedc                 ó†  — dg}|t        | «      k  r˜| |   }|dk(  r|j                  |«       |dz   S |dk(  rD| j                  d|«      }t        | |dz   | «      }|D ��cg c]  }|D ]  }||z   ‘Œ	 Œ }}}|dz   }n t	        |«      D ]  \  }	}||z   ||	<   Œ |dz  }|t        | «      k  rŒ˜|j                  |«       |S c c}}w )zzParse a node group of the form PREFIX[1-3,5,8] and return
    the position in the string at which the parsing stopped
    Ú r   r   Ú[Ú])rA   r(   rS   r|   Ú	enumerate)
r}   r~   r   ÚprefixesÚcÚlast_posrv   ÚprefixÚsuffixÚis
             r    Ú_parse_node_groupr‹   �   sá   € ð ˆt€HØ
”�I“Ò
Ø�c‰NˆØ�Š8Ø�M‰M˜(Ô#Ø˜‘7ˆNØ�Š8Ø —‘ s¨CÓ0ˆHÜ(¨°3¸±7¸XÐ)FÓGˆHÙ6>ÔV±h¨FËXÀ6˜ ›ÈX˜°hˆHÑVØ˜Q‘,‰Cä& xÖ0‘	��6Ø$ q™j�˜’ð 1à�1‰HˆCð ”�I“Ó
ð ‡M�M�(ÔØ€Jùó Ws   ÁB=c                 ó¨   — 	 d}g }|t        | «      k  rt        | ||«      }|t        | «      k  rŒ|S # t        $ r}t        d| › d�|«      |‚d }~ww xY w)Nr   z-Unrecognized format for SLURM_JOB_NODELIST: 'Ú')rA   r‹   Ú
ValueErrorrq   )r}   r~   r   rQ   s       r    Ú_parse_node_listr�   ¤   so   € ðjØˆØ!ˆØ”C˜	“NÒ"Ü# I¨s°FÓ;ˆCð ”C˜	“NÓ"àˆøÜò jÜ!Ð$QÐR[ÐQ\Ð\]Ð"^Ð`aÓbÐhiÐiûðjús   ‚-2 °2 ²	A»AÁAc            
       ód   — e Zd Zddddddddd	d
œ	Zdeddfd„Zedej                  e	   fd„«       Z
y)ri   ÚSLURM_JOB_IDÚSLURM_NTASKSÚSLURM_JOB_NUM_NODESÚSLURM_NODEIDÚSLURM_JOB_NODELISTÚSLURM_PROCIDÚSLURM_LOCALIDÚSLURM_ARRAY_JOB_IDÚSLURM_ARRAY_TASK_ID)	r	   Ú	num_tasksÚ	num_nodesÚnodeÚnodesÚglobal_rankÚ
local_rankÚarray_job_idÚarray_task_idÚ	countdownr
   Nc                 ó¤   — | j                   }t        j                  dd|gd¬«       t        j                  «       j                  d|› d|› d�«       y )NÚscontrolÚrequeueé<   )rd   zRequeued job z (z remaining timeouts))r	   rg   rh   r   Ú
get_loggerr5   )r)   r¢   r-   s      r    Ú_requeuezSlurmJobEnvironment._requeue¼   sI   € Ø�k‰kˆÜ×Ñ˜z¨9°cÐ:ÀBÕGÜ×ÑÓ× Ñ  =°°°R¸	°{ÐBVÐ!WÕXr7   c                 ó�   — t         j                  j                  | j                  d   d«      }|s| j                  gS t        |«      S )aÂ  Parse the content of the "SLURM_JOB_NODELIST" environment variable,
        which gives access to the list of hostnames that are part of the current job.

        In SLURM, the node list is formatted NODE_GROUP_1,NODE_GROUP_2,...,NODE_GROUP_N
        where each node group is formatted as: PREFIX[1-3,5,8] to define the hosts:
        [PREFIX1, PREFIX2, PREFIX3, PREFIX5, PREFIX8].

        Link: https://hpcc.umd.edu/hpcc/help/slurmenv.html
        r�   r�   )ÚosÚenvironr4   Ú_envÚhostnamer�   )r)   r}   s     r    Ú	hostnameszSlurmJobEnvironment.hostnamesÁ   s;   € ô —J‘J—N‘N 4§9¡9¨WÑ#5°rÓ:ˆ	ÙØ—M‘M�?Ð"Ü 	Ó*Ð*r7   )rV   rW   rX   r¬   r   r¨   ÚpropertyrY   r[   r   r®   r_   r7   r    ri   ri   ¯   s]   „ à Ø#Ø*ØØ%Ø%Ø%Ø,Ø.ñ
€DðY #ð Y¨$ó Yð
 ð+˜2Ÿ7™7 3™<ò +ó ñ+r7   ri   c                   ó®  ‡ — e Zd ZdZeZ	 	 	 ddej                  ee	f   de
dedej                  e   ddf
ˆ fd„Zedej                   fd	„«       Zedej$                  e   fd
„«       Zdej(                  eej*                  f   dej(                  eej*                  f   fˆ fd„Zdej*                  ddfˆ fd„Zdej0                  ej4                     dej0                  ej6                  ej*                        fˆ fd„Zedefd„«       Zdededefd„Zde
fd„Z de	dej0                  e   fd„Z!e"dej                  e#ef   defd„«       Z$ede
fd„«       Z%ˆ xZ&S )ÚSlurmExecutoraP  Slurm job executor
    This class is used to hold the parameters to run a job on slurm.
    In practice, it will create a batch file in the specified directory for each job,
    and pickle the task function and parameters. At completion, the job will also pickle
    the output. Logs are also dumped in the same directory.

    Parameters
    ----------
    folder: Path/str
        folder for storing job submission/output and logs.
    max_num_timeout: int
        Maximum number of time the job can be requeued after timeout (if
        the instance is derived from helpers.Checkpointable)
    python: Optional[str]
        Command to launch python. This allow to use singularity for example.
        Caller is responsible to provide a valid shell command here.
        By default reuse the current python executable

    Note
    ----
    - be aware that the log/output folder will be full of logs and pickled objects very fast,
      it may need cleaning.
    - the folder needs to point to a directory shared through the cluster. This is typically
      not the case for your tmp! If you try to use it, slurm will fail silently (since it
      will not even be able to log stderr.
    - use update_parameters to specify custom parameters (n_gpus etc...). If you
      input erroneous parameters, an error will print all parameters available for you.
    NÚfolderÚmax_num_timeoutÚmax_pickle_size_gbÚpythonr
   c                 ó¾   •— t         ‰| �  |||¬«       |€#t        j                  t        j
                  «      n|| _        | j                  «       dkD  st        d«      ‚y )N)r³   r´   r   z;Could not detect "srun", are you indeed on a slurm cluster?)	ÚsuperÚ__init__ÚshlexÚquoteÚsysÚ
executablerµ   ÚaffinityÚRuntimeError)r)   r²   r³   r´   rµ   Ú	__class__s        €r    r¸   zSlurmExecutor.__init__ó   s[   ø€ ô 	‰ÑØØ+Ø1ð 	ô 	
ð
 6<°^”e—k‘k¤#§.¡.Ô1ÈˆŒØ�}‰}‹ Ò"ÜÐ\Ó]Ð]ð #r7   c                 ó   — ddddddddœS )	NÚjob_nameÚtimeÚmemr�   Úcpus_per_taskÚgpus_per_nodeÚntasks_per_node)ÚnameÚtimeout_minÚmem_gbr�   rÄ   rÅ   Útasks_per_noder_   ©Úclss    r    Ú_equivalence_dictzSlurmExecutor._equivalence_dict  s#   € ð Ø!ØØØ,Ø,Ø/ñ
ð 	
r7   c                 ó(   — t        t        «       «      S )ú4Parameters that can be set through update_parameters)ÚsetÚ_get_default_parametersrË   s    r    Ú_valid_parameterszSlurmExecutor._valid_parameters  s   € ô Ô*Ó,Ó-Ð-r7   Úparamsc                 óP   •— t         ‰| �  |«      }d|v rt        |d   «      |d<   |S )NrÃ   )r·   Ú_convert_parametersÚ_convert_mem)r)   rÓ   r¿   s     €r    rÕ   z!SlurmExecutor._convert_parameters  s0   ø€ Ü‘Ñ,¨VÓ4ˆà�F‰?Ü(¨°©Ó7ˆF�5‰MØˆr7   Úkwargsc                 ó,  •— t        «       }t        t        |«      t        |«      z
  «      }|r@dj                  d„ t        |j	                  «       «      D «       «      }t        d|› d|› �«      ‚t        dd| j                  dœ|¤Ž t        ‰| �$  di |¤Ž y)	aõ  Updates sbatch submission file parameters

        Parameters
        ----------
        See slurm documentation for most parameters.
        Most useful parameters are: time, mem, gpus_per_node, cpus_per_task, partition
        Below are the parameters that differ from slurm documentation:

        signal_delay_s: int
            delay between the kill signal and the actual kill of the slurm job.
        setup: list
            a list of command to run in sbatch befure running srun
        array_parallelism: int
            number of map tasks that will be executed in parallel

        Raises
        ------
        ValueError
            In case an erroneous keyword argument is added, a list of all eligible parameters
            is printed, with their default values

        Note
        ----
        Best practice (as far as Quip is concerned): cpus_per_task=2x (number of data workers + gpus_per_task)
        You can use cpus_per_gpu=2 (requires using gpus_per_task and not gpus_per_node)
        z
  - c              3   óD   K  — | ]  \  }}|› d t        |«      › d�–— Œ y­w)z (default: Ú)N)Úrepr)Ú.0r*   rN   s      r    Ú	<genexpr>z<SlurmExecutor._internal_update_parameters.<locals>.<genexpr>9  s(   è ø€ Ð"dÑKcÁ4À1Àa a S¨´D¸³G°9¸AÔ#>ÑKcùs   ‚ zUnavailable parameter(s): z
Valid parameters are:
  - znothing to do©r,   r²   Nr_   )
rÑ   ÚsortedrÐ   rH   ÚitemsrŽ   Ú_make_sbatch_stringr²   r·   Ú_internal_update_parameters)r)   r×   ÚdefaultsÚin_valid_parametersr8   r¿   s        €r    râ   z)SlurmExecutor._internal_update_parameters  s•   ø€ ô6 +Ó,ˆÜ$¤S¨£[´3°x³=Ñ%@ÓAÐÙØ—]‘]Ñ"dÌ6ÐRZ×R`ÑR`ÓRbÔKcÓ"dÓdˆFÜØ,Ð-@Ð,AÐA^Ð_eÐ^fÐgóð ô 	ÐR O¸D¿K¹KÑRÈ6ÒRÜ‰Ñ+Ñ5¨fÓ5r7   Údelayed_submissionsc           	      óê  •— t        |«      dk(  rt        ‰| �	  |«      S t        j                  j                  | j                  «      }|j                  dd¬«       | j                  j                  dd«      }g }|D ]d  }|t        j                  «       j                  › d�z  }|j                  || j                  «       |j                  |«       |j!                  |«       Œf t        |«      }t#        | j                  | j                  «      } |j$                  di | j                  ¤Ž ||j                  d<   | j'                  «        |j)                  | j*                  «      }	t-        t/        |	j0                  «      «      }
t/        |«      D �cg c])  }t3        | j                  |	j4                  › d|› �|
¬	«      ‘Œ+ }}t7        ||«      D ]!  \  }}|j8                  j;                  |d
«       Œ# |S c c}w )Nr   T)ÚparentsÚexist_okrÂ   é   z.pklÚ	map_countr   )r²   r	   ÚtasksÚsubmitted_pickler_   )rA   r·   Ú_internal_process_submissionsr   ÚJobPathsÚget_first_id_independent_folderr²   ÚmkdirÚ
parametersr4   ÚuuidÚuuid4ÚhexÚset_timeoutr³   Údumpru   r±   Úupdate_parametersÚ	_throttleÚ_submit_commandÚ_submitit_command_strÚlistrI   rš   ra   r	   rB   ÚpathsÚmove_temporary_file)r)   rå   r²   rÈ   Úpickle_pathsÚdÚpickle_pathÚnÚarray_exÚ	first_jobÚ	tasks_idsÚaÚjobsÚjobr¿   s                 €r    rí   z+SlurmExecutor._internal_process_submissionsA  s¹  ø€ ô Ð"Ó# qÒ(Ü‘7Ñ8Ð9LÓMÐMä—‘×?Ñ?ÀÇÁÓLˆØ�‰˜T¨DˆÔ1Ø—o‘o×)Ñ)¨&°!Ó4ˆØˆÛ$ˆAØ ¤d§j¡j£l×&6Ñ&6Ð%7°tÐ#<Ñ<ˆKØ�M‰M˜+ t×';Ñ';Ô<Ø�F‰F�;ÔØ×Ñ Õ,ð	 %ô
 Ð#Ó$ˆô ! §¡¨d×.BÑ.BÓCˆØ"ˆ×"Ñ"Ñ5 T§_¡_Ò5Ø+,ˆ×Ñ˜KÑ(Ø�‰Ôà&.×&>Ñ&>¸t×?YÑ?YÓ&Zˆ	Üœ˜y×2Ñ2Ó3Ó4ˆ	äejÐklÔemó+
ÙemÐ`aŒH˜DŸK™K°9×3CÑ3CÐ2DÀAÀaÀSÐ0IÐQZÖ[Ðemð 	ð +
ô !$ D¨,Ö 7ÑˆC�Ø�I‰I×)Ñ)¨+Ð7IÕJð !8àˆùò+
s   Æ.G0c           	      óŠ   — dj                  | j                  dt        j                  t	        | j
                  «      «      g«      S )NÚ z-u -m submitit.core._submit)rH   rµ   r¹   rº   r   r²   )r)   s    r    rú   z#SlurmExecutor._submitit_command_stra  s3   € à�x‰x˜Ÿ™Ð&CÄUÇ[Á[ÔQTÐUY×U`ÑU`ÓQaÓEbÐcÓdÐdr7   r,   Úuidc                 óF   — t        d|| j                  dœ| j                  ¤ŽS )NrÞ   r_   )rá   r²   rñ   )r)   r,   r
  s      r    Ú_make_submission_file_textz(SlurmExecutor._make_submission_file_texte  s   € Ü"ÐZ¨7¸4¿;¹;ÑZÈ$Ï/É/ÑZÐZr7   c                 ó�   — | j                   j                  dd«      }t        d| j                   j                  dd«      «      }||z  S )Nr�   r   rÆ   )rñ   r4   Úmax)r)   r�   rÊ   s      r    Ú
_num_taskszSlurmExecutor._num_tasksh  sA   € Ø—_‘_×(Ñ(¨°!Ó4ˆÜ! ! T§_¡_×%8Ñ%8Ð9JÈAÓ%NÓOˆØ�~Ñ%Ð%r7   Úsubmission_file_pathc                 ó   — dt        |«      gS )NÚsbatch)r   )r)   r  s     r    Ú_make_submission_commandz&SlurmExecutor._make_submission_commandm  s   € Øœ#Ð2Ó3Ð4Ð4r7   r8   c                 óÆ   — t        | t        «      s| j                  «       } t        j                  d| «      }|€t        j                  d| › d�«      ‚|j                  d«      S )z3Returns the job ID from the output of sbatch stringzjob (?P<id>[0-9]+)z'Could not make sense of sbatch output "zg"
Job instance will not be able to fetch status
(you may however set the job job_id manually if needed)Úid)r>   r   r?   r   r   r   ÚFailedSubmissionErrorr   )r8   Úoutputs     r    Ú#_get_job_id_from_submission_commandz1SlurmExecutor._get_job_id_from_submission_commandp  sg   € ô ˜&¤#Ô&Ø—]‘]“_ˆFÜ—‘Ð0°&Ó9ˆØˆ>Ü×-Ñ-Ø9¸&¸ð BJð Jóð ð
 �|‰|˜DÓ!Ð!r7   c                 ó4   — t        j                  d«      €dS dS )NÚsrunéÿÿÿÿr   )ÚshutilÚwhichrË   s    r    r½   zSlurmExecutor.affinity~  s   € ä—\‘\ &Ó)Ð1ˆrÐ8°qÐ8r7   )r=   g      ð?N)'rV   rW   rX   Ú__doc__ra   Ú	job_classrY   r\   r   r   r   ÚfloatrZ   r¸   Úclassmethodr   ÚEquivalenceDictrÍ   ÚSetrÒ   r^   ÚAnyrÕ   râ   r[   r   ÚDelayedSubmissionÚJobrí   r¯   rú   r  r  r  Ústaticmethodr]   r  r½   Ú__classcell__)r¿   s   @r    r±   r±   Ó   sç  ø„ ñð: €Ið
  !Ø$'Ø#'ñ^à—‘˜˜d˜Ñ#ð^ð ð^ð "ð	^ð
 —‘˜CÑ ð^ð 
õ^ð  ð	
 $×"6Ñ"6ò 	
ó ð	
ð ð. "§&¡&¨¡+ò .ó ð.ð¨"¯'©'°#°r·v±v°+Ñ*>ð À2Ç7Á7È3ÐPR×PVÑPVÈ;ÑCWõ ð$6°B·F±Fð $6¸tõ $6ðLØ#%§7¡7¨5×+BÑ+BÑ#Cðà	�‰�—‘˜"Ÿ&™&Ñ!Ñ	"õð@ ðe sò eó ðeð[°#ð [¸Cð [ÀCó [ð&˜Có &ð
5¸Tð 5ÀbÇgÁgÈcÁló 5ð ð"°B·H±H¸UÀC¸ZÑ4Hð "ÈSò "ó ð"ð ð9˜ò 9ó ô9r7   r±   c                  óä   — t        j                  t        «      } t        | j                  t        | j                  «       d | j                  «      }|D ��ci c]  \  }}|dvsŒ||“Œ c}}S c c}}w )rÏ   N>   r²   r,   rê   )ÚinspectÚgetfullargspecrá   rB   ÚargsrA   rã   )ÚspecsÚzippedÚkeyÚvals       r    rÑ   rÑ   ƒ  se   € ô ×"Ñ"Ô#6Ó7€EÜ�—‘œS §¡Ó0Ð0Ð2Ð3°U·^±^ÓD€FÙ%+Ô]¡V™˜˜c¨sÐ:\Ò/\ˆC�‰H VÒ]Ð]ùÓ]s   ÁA,Á#A,r,   r²   rÁ   Ú	partitionrÂ   r�   rÆ   rÄ   Úcpus_per_gpuÚnum_gpusrÅ   Úgpus_per_taskÚqosÚsetupÚteardownrÃ   Úmem_per_gpuÚmem_per_cpuÚsignal_delay_sÚcommentÚ
constraintÚexcludeÚaccountÚgresÚ	mail_typeÚ	mail_userÚnodelistÚ
dependencyÚ	exclusiveÚarray_parallelismÚwckeyÚstderr_to_stdoutrê   Úadditional_parametersÚ	srun_argsÚuse_srunc$                 ó  — g d¢}$t        «       j                  «       D �%�&ci c]  \  }%}&|&€Œ	|%|$vsŒ|%|&“Œ }'}%}&t        j                  › d|› �|'d<   |	�*t	        j
                  d«       |'j                  dd«      |'d<   d|'v rd	|'vrt	        j
                  d
«       t        j                  |¬«      }(t        |(j                  «      })t        |(j                  «      }*| �Pt        | t        «      r| sJ ‚d| dz
  › dt        | |«      › �|'d<   |)j                  dd«      })|*j                  dd«      }*|)j                  dd«      |'d<   |s|*j                  dd«      |'d<   d|'d<   |!�|'j!                  |!«       g d¢}+t#        |'«      D ]   }%|+j%                  t'        |%|'|%   «      «       Œ" |�
|+ddg|z   z  }+|#r2|rg nd|*g},|"€g }"t)        ddd|)g|,¢|"¢«      }-dj+                  |-| f«      } |+dd d!| dgz  }+|�
|+dd"g|z   z  }+d#j+                  |+«      S c c}&}%w )$a�  Creates the content of an sbatch file with provided parameters

    Parameters
    ----------
    See slurm sbatch documentation for most parameters:
    https://slurm.schedmd.com/sbatch.html

    Below are the parameters that differ from slurm documentation:

    folder: str/Path
        folder where print logs and error logs will be written
    signal_delay_s: int
        delay between the kill signal and the actual kill of the slurm job.
    setup: list
        a list of command to run in sbatch before running srun
    teardown: list
        a list of command to run in sbatch after running srun
    map_size: int
        number of simultaneous map/array jobs allowed
    additional_parameters: dict
        Forces any parameter to a given value in sbatch. This can be useful
        to add parameters which are not currently available in submitit.
        Eg: {"mail-user": "blublu@fb.com", "mail-type": "BEGIN"}
    srun_args: List[str]
        Add each argument in the list to the srun call

    Raises
    ------
    ValueError
        In case an erroneous keyword argument is added, a list of all eligible parameters
        is printed, with their default values
    )Únonslurmr²   r,   rê   rE  rH  r6  r7  r:  rG  rI  rJ  Ú@ÚsignalzY"num_gpus" is deprecated, please use "gpus_per_node" instead (overwritting with num_gpus)r3  r   rÅ   r2  r4  zP"cpus_per_gpu" requires to set "gpus_per_task" to work (and not "gpus_per_node"))r²   z0-r   Ú%Úarrayz%jz%A_%az%trt   r  Úerrorru   z	open-mode)z#!/bin/bashr�   z# Parametersr�   z# setupz--errorr  z--unbufferedz--outputr	  z	# commandzexport SUBMITIT_EXECUTOR=slurmz
# teardownÚ
)Úlocalsrà   ri   rj   rE   rF   Úpopr   rî   r   ÚstdoutÚstderrr>   r   ÚminÚreplaceÚupdaterß   ru   Ú_as_sbatch_flagÚ_shlex_joinrH   ).r,   r²   rÁ   r1  rÂ   r�   rÆ   rÄ   r2  r3  rÅ   r4  r5  r6  r7  rÃ   r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rê   rH  rI  rJ  rL  ÚkÚvrñ   rü   rU  rV  rJ   Ústderr_flagsÚsrun_cmds.                                                 r    rá   rá   Œ  s]  € òL€Hô $*£8§>¡>Ô#3Ô[Ñ#3™4˜1˜a°q±}ÈÐRZÒIZ�!�Q‘$Ð#3€JÑ[ä1×9Ñ9Ð:¸!¸NÐ;KÐL€JˆxÑØÐÜ�‰Øgô	
ð '1§n¡n°ZÀÓ&Cˆ
�?Ñ#Ø˜Ñ#¨¸zÑ(IÜ�‰ÐhÔiä�N‰N &Ô)€EÜ�—‘Ó€FÜ�—‘Ó€FàÐÜ˜)¤SÔ)©iÐ7Ð7Ø " 9¨q¡= /°´3°yÐBSÓ3TÐ2UÐVˆ
�7ÑØ—‘  gÓ.ˆØ—‘  gÓ.ˆØ!Ÿ>™>¨$°Ó4€JˆxÑÙØ$Ÿn™n¨T°3Ó7ˆ
�7ÑØ&€Jˆ{ÑØÐ(Ø×ÑÐ/Ô0â/€EÜ�JÖˆØ�‰”_ Q¨
°1©Ó6Õ7ð  ð ÐØ�"�i� 5Ñ(Ñ(ˆñ ñ .‘r°I¸vÐ3FˆØÐØˆIÜ ¨¸
ÀFÐfÈ\ÐfÐ\eÐfÓgˆØ—(‘(˜H gÐ.Ó/ˆà	Ø
ØØ(àØ
ðñ €Eð ÐØ�"�lÐ# hÑ.Ñ.ˆØ�9‰9�UÓÐùóu \s    
H«H°HrÉ   c                 ó\   — | t        | «      k(  rt        | «      › d�S t        | dz  «      › d�S )NÚGBi   ÚMB)r   )rÉ   s    r    rÖ   rÖ     s6   € Ø”�V“ÒÜ�f“+�˜bÐ!Ð!Ü�&˜4‘-Ó Ð! Ð$Ð$r7   r/  Úvaluec                 ó„   — | j                  dd«      } |du rd| › �S t        j                  t        |«      «      }d| › d|› �S )Nr   r   Tz
#SBATCH --Ú=)rX  r¹   rº   r   )r/  rc  s     r    rZ  rZ  #  sK   € Ø
�+‰+�c˜3Ó
€CØ��}Ø˜C˜5Ð!Ð!ä�K‰Kœ˜E›
Ó#€EØ˜�u˜A˜e˜WÐ%Ð%r7   Úsplit_commandc                 ó2   — dj                  d„ | D «       «      S )z9Same as shlex.join, but that was only added in Python 3.8r	  c              3   óF   K  — | ]  }t        j                  |«      –— Œ y ­w)N)r¹   rº   )rÜ   Úargs     r    rÝ   z_shlex_join.<locals>.<genexpr>.  s   è ø€ Ð>±¨”E—K‘K ×$±ùs   ‚!)rH   )rf  s    r    r[  r[  ,  s   € à�8‰8Ñ>±Ó>Ó>Ð>r7   )"ÚsubmititNré   r   NNNNNNNNNNNNéZ   NNNNNNNNNNé   rj  FNNNT)2Ú	functoolsr*  rª   r   r¹   r  rg   r»   ÚtypingrY   rò   rE   Úpathlibr   r   r   r   r   r   r[   ÚTupler!   ÚInfoWatcherr#   r&  ÚRra   rD   rq   r|   r   r‹   r�   ÚJobEnvironmentri   ÚPicklingExecutorr±   Ú	lru_cacher^   r$  rÑ   r\   rZ   ro   ÚIterablerá   r   rÖ   rZ  r[  r_   r7   r    Ú<module>rw     sÑ  ðó Û Û 	Û 	Û Û Û Û 
Û Û Û Ý ç 7Ó 7ð&˜ð & §¡¨¯©°°c°Ñ(:Ñ ;ó &ô&9�t×'Ñ'ô 9ôxCˆt�x‰x˜Ÿ™Ñô Cô&	˜)ô 	ð Cð ¨B¯G©G°C©Ló ð  ð ¨3ð ¸¿¹À¹ð Èó ð.j ó jô!+˜/×8Ñ8ô !+ôHm9�D×)Ñ)ô m9ð` €×ÑÓð^ §¡¨¨b¯f©f¨Ñ!5ò ^ó ð^ð Ø"&ØØØ(,Ø&*Ø%)Ø!%Ø&*Ø&*Ø Ø'+Ø*.Ø Ø$(Ø$(ØØ $Ø#'Ø $Ø $Ø!Ø"&Ø"&Ø!%Ø#'Ø26Ø ØØ"Ø"&Ø?CØ/3ØñINØðNà�H‰H�S˜$�YÑðNð ðNð �{‰{˜3Ñð	Nð
 ðNð ðNð —[‘[ Ñ%ðNð —;‘;˜sÑ#ðNð —+‘+˜cÑ"ðNð �k‰k˜#ÑðNð —;‘;˜sÑ#ðNð —;‘;˜sÑ#ðNð 
�‰�SÑ	ðNð �;‰;�r—w‘w˜s‘|Ñ$ðNð �k‰k˜"Ÿ'™' #™,Ñ'ðNð  
�‰�SÑ	ð!Nð" —‘˜SÑ!ð#Nð$ —‘˜SÑ!ð%Nð& ð'Nð( �[‰[˜Ñð)Nð* —‘˜CÑ ð+Nð, �[‰[˜Ñð-Nð. �[‰[˜Ñð/Nð0 �+‰+�cÑ
ð1Nð2 �{‰{˜3Ñð3Nð4 �{‰{˜3Ñð5Nð6 �k‰k˜#Ñð7Nð8 —‘˜CÑ ð9Nð: �{‰{˜2Ÿ8™8 D¨# IÑ.Ñ/ð;Nð< ð=Nð> ð?Nð@ ðANðB �{‰{˜3ÑðCNðD Ÿ;™; r§w¡w¨s°B·F±F¨{Ñ';Ñ<ðENðF �{‰{˜2Ÿ;™; sÑ+Ñ,ðGNðH ðINðJ 	óKNðb%˜ð % 3ó %ð&˜ð & R§V¡Vð &°ó &ð?˜rŸw™w s™|ð ?°ô ?r7   