
    ]i+                        S r SSKrSSKJrJr  SSKJr  SSKrSSKrSSK	J
r
  SSKrSSKrSSKJr  SSKrSSKJr   SSKJrJr  S	rSSKJr  SSKJrJrJr  SSKJrJ r   SSK!J"r"J#r#J$r$  \RJ                  " \&5      r'S\RP                  S\RP                  4S jr)\" SS5      r* " S S5      r+\+" 5       r,/ 4S jr-S\R\                  \/   S\R`                  \/   4S jr1S r2S r3 " S S\5      r4S\/S \/4S! jr5g! \ a    SSKJrJr  S
r Nf = f)"zz
This module provides support for Hydra, in particular the `main` wrapper between
the end user `main` function and Hydra.
    N)
namedtupleOrderedDict)	find_spec)Path)mock)GlobalHydra)composeinitialize_config_dirFT)
DictConfig   )
DoraConfigSlurmConfigupdate_from_hydra)DecoratedMainMainFun)XPget_xpis_xpselfmemoc                     U $ N )r   r   s     G/mnt/rpi/tmp/demucs-venv-sys/lib/python3.13/site-packages/dora/hydra.py_no_copyr   (   s	     K    _Differencez(path key ref other ref_value other_valuec                       \ rS rSrSrg)	_NotThere1   r   N)__name__
__module____qualname____firstlineno____static_attributes__r   r   r   r   r   1   s    r   r   c           	   #     #    [        U R                  5       5      n[        [        UR                  5       5      [        U R                  5       5      -
  5      n/ nUR                  S5        U H  nXbS'   X   nXa;   d
   SU 35       eX   n[	        U[
        5      (       aB  [	        U[
        5      (       d   SU S[        U5       S35       e[        XxU5       Sh  vN   Mu  X:w  d  M|  [        [        U5      X`XU5      v   M     U H)  nXbS'   X   n[        [        U5      X`U[        U5      v   M+     UR                  S5        U$  Nl7f)z~
Given two configs, gives an iterator over all the differences. For each difference,
this will give a _Difference namedtuple.
Nz4XP config shouldn't be missing any key. Missing key zDStructure of config should be identical between XPs. Wrong type for z, expected DictConfig, got .)sortedkeyssetappend
isinstancer   type_compare_configr   listNotTherepop)	refotherpathr*   	remainingdeltakey	ref_valueother_values	            r   r/   r/   8   sC    
 #((*Ds5::<(3sxxz?:;IEKKRH	|YSTWSXYY|ji,,k:66 W""%&A${BSATTUWW6 'ytDDD%d4j#EkRR  Rj$t*cxMM  	HHRLL Es   CE
E	E
)A E
argvreturnc                    / n[        5       n[        U 5      S S S2    Ha  nSU;   d   SU S35       eUR                  SS5      u  pEUR                  5       nXB;   a  M?  UR	                  U5        UR                  U5        Mc     US S S2   $ )Nr'   =z	Argument z does not contain =r   )r+   r0   splitstripaddr,   )r;   
simplifiedseenargr8   values         r   _simplify_argvrF   W   s    J5DDz$B$cz?Yse+>??zYYsA&
iik;HHSMc"   ddr   c                     U c  g[        U [        [        [        45      (       a  [	        U 5      $ [        U [        5      (       a
  SU ;  d   eU $ [        S[        U 5       SU  35      e)Nnull:zUnsupported dict key type z	 for key )r-   boolintfloatstr	TypeErrorr.   )r8   s    r   	_dump_keyrO   f   sb    
{	C$U+	,	,3x	C		#~~
4T#YKyNOOr   c                    U c  g[        U [        [        [        [        45      (       a  [
        R                  " U 5      $ [        U [        5      (       a,  SSR                  S U R                  5        5       5      -   S-   $ [        U [        [        45      (       a  SSR                  S U  5       5      -   S-   $ [        S	[        U 5       S
U  35      e)NrH   {z, c              3   X   #    U  H   u  p[        U5       S [        U5       3v   M"     g7f)z: N)rO   _hydra_value_as_override).0r8   vals      r   	<genexpr>+_hydra_value_as_override.<locals>.<genexpr>z   s0      
) ~b!9#!> ?@)s   (*}[c              3   8   #    U  H  n[        U5      v   M     g 7fr   )rS   )rT   rU   s     r   rV   rW      s     N7<<s   ]zUnsupported value type z for value )r-   rJ   rK   rL   rM   jsondumpsdictjoinitemsr0   tuplerN   r.   )rE   s    r   rS   rS   r   s     }	ED#uc2	3	3zz%  	E4	 	 TYY 
!KKM
 
 
  	 
ED%=	)	)TYYNNNNQTTT1$u+k%QRRr   c            
       *  ^  \ rS rSrSrS\S\S\4U 4S jjrS\4S jr	S\
4S	 jrS
\R                  \   4S jrS\R                  S\R                   \   4S jrS\S\4S jrS rS\R                   \   4S jrS
\R                   \   S\4S jr/ 4S\R                   \   S\R2                  \\R                   \R2                  \\4      4   4S jjr/ 4S\R                   \   S\4S jjr/ 4S\R                   \   S\4S jjrS\S\4S jrSrU =r $ )	HydraMain   Tmainconfig_nameconfig_pathc                    > X l         X0l        X@l        UR                  nUS:X  a  [        R
                  U   R                  nUc.  [        R                  S   nUR                  SS5      S   U l	        OUR                  c   eUR                  nUR                  nUR                  SS5      S   U l	        OC[        U5      nUb  UR                  c   eUR                  nUR                  SS5      S   U l	        [        U5      R                  R                  5       U l        Ub  U R                   U-  U l        SU l        U R%                  5       U l        U R)                  5       U l        U R-                  5       n[.        T	U ]a  X5        SUl        g )N__main__r   r(      r   F)rf   rg   hydra_kwargsr"   sysmodules__spec__r;   rsplit	_job_nameoriginnamer   r   parentresolvefull_config_path_initialized_get_config	_base_cfg_get_config_groups_config_groups	_get_dorasuper__init__)
r   re   rf   rg   kwargsmodulespecmodule_pathdora	__class__s
            r   r}   HydraMain.__init__   s]   &&"Z;;v&//D|!hhqk!,!3!3C!;A!>{{..."kk!'sA!6q!9V$D#(???++K#]]3215DN $[ 1 8 8 @ @ B"$($9$9K$GD!!))+"557~~$ %r   r<   c                     [        5       n[        U R                  S5      (       a  [        XR                  R                  5        U=R
                  SS/-  sl        [        UR                  5      Ul        U$ )Nr   zdora.*zslurm.*)r   hasattrrx   r   r   excluder   dir)r   r   s     r   r{   HydraMain._get_dora   sS    |4>>6**dNN$7$789-->r   c                     [        5       n[        U R                  S5      (       a  [        XR                  R                  5        U$ )zEReturn default Slurm config for the launch and grid actions.
        slurm)r   r   rx   r   r   )r   r   s     r   get_slurm_configHydraMain.get_slurm_config   s3     4>>7++e^^%9%9:r   r;   c                     [        U5      nU R                  U5      nU R                  U5      u  p4X@R                  X25      -  n[	        U R
                  X!US9nU$ )N)r   cfgr;   r7   )rF   rw   _get_base_config
_get_deltar   r   )r   r;   r   baser7   xps         r   r   HydraMain.get_xp   sV    d#t$++D1++TYYC%@	r   rD   c                    / n[        U[        5      (       a  UR                  U5        U$ [        U[        5      (       aK  UR	                  5        H5  u  p4X0R
                  ;  a  [        U5      nUR                  U SU 35        M7     U$ [        U[        [        45      (       a  U H  nX R                  U5      -  nM     U$ [        SU 35      e)Nr>   z5Can only process dict, tuple, lists and str, but got )r-   rM   r,   r^   r`   rz   rS   r0   ra   value_to_argv
ValueError)r   rD   r;   r8   rE   parts         r   r   HydraMain.value_to_argv   s    
 c3KK  T""!iik
111 5U;Ese1UG,- *  dE]++**400   TUXTYZ[[r   r   c                 j    [        5       nUR                  c   eUR                   H	  u  p4XBU'   M     U$ r   )r   r7   )r   r   partsrr   rE   s        r   get_name_partsHydraMain.get_name_parts   s5    xx###88KD$K $r   c                    [        5       (       a6  S[        5       R                   3n[        R                  R                  U5         [        R                  " SU R                  U R                  S.U R                  D6" U R                  5      " 5       [        5       (       a   [        R                  R                  W5        $ $ ! [        5       (       a   [        R                  R                  W5        f f = f)Nzhydra.run.dir=rf   rg   r   )r   r   folderrl   r;   r,   hydrare   rf   rg   rk   remove)r   run_dirs     r   _mainHydraMain._main   s    77&vx&78GHHOOG$	):: % ,, ,,% ##% &*YY0 2
 ww( uww( s   AC 1C3c                    [        [        U R                  5      4SU R                  0U R                  D6   [
        R                  " 5       R                  nUc   e[        UR                  5       5      sS S S 5        $ ! , (       d  f       g = f)Njob_name)
r
   rM   ru   rp   rk   r   instancer   r0   list_all_config_groups)r   ghs     r   ry   HydraMain._get_config_groups   so    "3t'<'<#= 8 8%)%6%68%%'--B>!>1134	8 8 8s   =A==
Bc                     SU;   d  SU;   a  gg)Nz-mz
--multirunFTr   )r   r;   s     r   
_is_activeHydraMain._is_active   s    4<<4/r   	overridesc           	      z   [        [        U R                  5      4SU R                  0U R                  D6   [
        R                  " 5       R                  nUc   e/ n/ nU H  nU R                   Hs  nUR                  U S35      (       d  M  UR                  U5        UR                  SS5      u  pxU V	V
s/ s H  u  pX:w  d  M  X4PM     nn	n
UR                  Xh45        Mu     M     U(       d  U R                  / 4sSSS5        $ U R                  U5      nX4sSSS5        $ s  sn
n	f ! , (       d  f       g= f)zZ
Return base config based on composition, along with delta for the
composition overrides.
r   Nr>   r   )r
   rM   ru   rp   rk   r   r   r   rz   
startswithr,   r?   rx   _get_config_noinit)r   r   r   to_keepr7   rD   group_rE   gvr   s               r   r   HydraMain._get_base_config   s     #3t'<'<#= 8 8%)%6%68%%'--B>!>G13E !00E~~qk22s+#&99S!#449 HEDAQZ!E He^4 1 ! ~~r)8 8 ))'2C:!8 8 !I8 8s0   AD,*D,8D&D&1D,	D,&D,,
D:c                     [        [        U R                  5      4SU R                  0U R                  D6   U R                  U5      sSSS5        $ ! , (       d  f       g= f)zd
Internal method, returns the config for the given override,
but without the dora.sig field filled.
r   N)r
   rM   ru   rp   rk   r   )r   r   s     r   rw   HydraMain._get_config  sP     #3t'<'<#= 8 8%)%6%68**958 8 8s   A
Ac                 *   [         (       a`  [        R                  R                  [        S[
        5         [        U R                  U5      nS S S 5        [        R                  " W5      nU$ [        U R                  U5      nU$ ! , (       d  f       N>= f)N__deepcopy__)
	old_hydrar   patchobjectr   r   r	   rf   copydeepcopy)r   r   r   s      r   r   HydraMain._get_config_noinit  sm    9"":~xHd..	: I--$C 
 $**I6C
 IHs   B
Binitr4   c                     / n[        X5       H:  nSR                  UR                  5      nUR                  XTR                  45        M<     U$ )zQ
Returns an iterator over all the differences between the init and other config.
r(   )r/   r_   r5   r,   r:   )r   r   r4   r7   diffrr   s         r   r   HydraMain._get_delta$  sF     #D0D88DII&DLL$ 0 012 1 r   )rx   rz   rv   rp   rf   rg   ru   rk   )!r!   r"   r#   r$   _slowr   rM   r}   r   r{   r   r   tpSequencer   AnyListr   r   r   r   r   ry   rJ   r   Tupler   r   rw   r   r   r%   __classcell__)r   s   @r   rc   rc      sV   E!%W !%3 !%S !%F: + 2;;s+  BGGCL ,  )5BGGCL 5rwws|   -/WWS\*bggbhhsCx.@&AAB4 /16!wws|65?6 <> BGGCL * z *  r   rc   rf   rg   c                 ,   ^ ^^ S[         4U UU4S jjnU$ )zeWrap your main function with this.
You can pass extra kwargs, e.g. `version_base` introduced in 1.2.
re   c                 "   > [        U 4TTS.TD6$ )Nr   )rc   )re   rf   rg   r~   s    r   
_decoratorhydra_main.<locals>._decorator3  s#     #;K #!# 	#r   )r   )rf   rg   r~   r   s   ``` r   
hydra_mainr   /  s    # # # r   )6__doc__r   collectionsr   r   importlib.utilr   r\   loggingpathlibr   rl   typingr   unittestr   r   hydra.core.global_hydrar   r	   r
   r   ImportErrorhydra.experimentalomegaconf.dictconfigr   confr   r   r   re   r   r   r   r   r   r   	getLoggerr!   loggerr   r   r   r   r1   r/   r   rM   r   rF   rO   rS   rc   r   r   r   r   <module>r      s    / $    
    /4
 I + < < ( ! !			8	$266   (RS	 	 ; &( >S) bggcl 	PS$h hVC c m  AIs   C5 5DD