
    mi+                        d Z ddlZddlmZmZ ddl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mZ ddlZddlmZ 	 ddlmZmZ d	ZddlmZ ddlmZmZmZ ddlmZm Z  ddl!m"Z"m#Z#m$Z$  ejJ                  e&      Z'dejP                  dejP                  fdZ) edd      Z* G d d      Z+ e+       Z,g fdZ-dej\                  e/   dej`                  e/   fdZ1d Z2d Z3 G d de      Z4de/d e/fd!Z5y# e$ r ddlmZmZ d
ZY w xY w)"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                     | S N )r   r   s     D/var/www/stems/demucs_env/lib/python3.12/site-packages/dora/hydra.py_no_copyr   (   s	     K    _Differencez(path key ref other ref_value other_valuec                       e Zd Zy)	_NotThereN)__name__
__module____qualname__r   r   r   r   r   1   s    r   r   c           	   #     K   t        | j                               }t        t        |j                               t        | j                               z
        }g }|j                  d       |D ]  }||d<   | |   }||v s
J d|        ||   }t	        |t
              r=t	        |t
              sJ d| dt        |       d       t        |||      E d{    m||k7  sst        t        |      || |||        |D ]+  }||d<   ||   }t        t        |      || |t        |       - |j                  d       |S 7 kw)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   sb    
 #((*Ds5::<(3sxxz?:;IEKK SRH	e|YSTWSXYY|Cji,k:6 W""%&A${BSATTUWW6 'y+tDDDI%d4j#sE9kRRS  NRCj$t*c3xMMN 	HHRLL Es   CEE 
E A!Eargvreturnc                    g }t               }t        |       d d d   D ]]  }d|v sJ d| d       |j                  dd      \  }}|j                         }||v r<|j	                  |       |j                  |       _ |d d d   S )Nr$   =z	Argument z does not contain =r   )r(   r-   splitstripaddr)   )r8   
simplifiedseenargr5   values         r   _simplify_argvrC   W   s    J5DDz$B$ #cz?Yse+>??zYYsA&
Uiik$;HHSMc"# ddr   c                     | yt        | t        t        t        f      rt	        |       S t        | t              rd| vsJ | S t        dt        |        d|        )Nnull:zUnsupported dict key type z	 for key )r*   boolintfloatstr	TypeErrorr+   )r5   s    r   	_dump_keyrL   f   s\    
{	C$U+	,3x	C	#~~
4T#YKyNOOr   c                    | yt        | t        t        t        t        f      rt        j                  |       S t        | t              r,ddj                  d | j                         D              z   dz   S t        | t        t        f      rddj                  d | D              z   dz   S t        d	t        |        d
|        )NrE   {z, c              3   T   K   | ]   \  }}t        |       d t        |        " yw)z: N)rL   _hydra_value_as_override).0r5   vals      r   	<genexpr>z+_hydra_value_as_override.<locals>.<genexpr>z   s3      
S ~b!9#!> ?@
s   &(}[c              3   2   K   | ]  }t        |        y wr   )rP   )rQ   rR   s     r   rS   z+_hydra_value_as_override.<locals>.<genexpr>   s     N7<Ns   ]zUnsupported value type z for value )r*   rG   rH   rI   rJ   jsondumpsdictjoinitemsr-   tuplerK   r+   )rB   s    r   rP   rP   r   s     }	ED#uc2	3zz%  	E4	 TYY 
!KKM
 
 
  	 
ED%=	)TYYNNNNQTTT1$u+k%QRRr   c            
           e Zd ZdZdededef fdZdefdZde	fdZ
d	ej                  e   fd
Zdej                  dej                  e   fdZdedefdZd Zdej                  e   fdZd	ej                  e   defdZg fdej                  e   dej0                  eej                  ej0                  eef      f   fdZg fdej                  e   defdZg fdej                  e   defdZdedefdZ xZS )	HydraMainTmainconfig_nameconfig_pathc                    || _         || _        || _        |j                  }|dk(  rt        j
                  |   j                  }|.t        j                  d   }|j                  dd      d   | _	        n|j                  J |j                  }|j                  }|j                  dd      d   | _	        nAt        |      }||j                  J |j                  }|j                  dd      d   | _	        t        |      j                  j                         | _        || j                   |z  | _        d| _        | j%                         | _        | j)                         | _        | j-                         }t.        	| a  ||       d|_        y )N__main__r   r%      r   F)ra   rb   hydra_kwargsr!   sysmodules__spec__r8   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   r`   ra   rb   kwargsmodulespecmodule_pathdora	__class__s
            r   rx   zHydraMain.__init__   se   &&"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~~t$ %r   r9   c                     t               }t        | j                  d      r t        || j                  j                         |xj
                  ddgz  c_        t        |j                        |_        |S )Nr}   zdora.*zslurm.*)r   hasattrrs   r   r}   excluder   dir)r   r}   s     r   rv   zHydraMain._get_dora   sR    |4>>6*dDNN$7$789-->r   c                     t               }t        | j                  d      r t        || j                  j                         |S )zEReturn default Slurm config for the launch and grid actions.
        slurm)r   r   rs   r   r   )r   r   s     r   get_slurm_configzHydraMain.get_slurm_config   s2     4>>7+eT^^%9%9:r   r8   c                     t        |      }| j                  |      }| j                  |      \  }}|| j                  ||      z  }t	        | j
                  |||      }|S )N)r}   cfgr8   r4   )rC   rr   _get_base_config
_get_deltar   r}   )r   r8   r   baser4   xps         r   r   zHydraMain.get_xp   s^    d#t$++D1es++TYYCd%@	r   rA   c                    g }t        |t              r|j                  |       |S t        |t              rI|j	                         D ]4  \  }}|| j
                  vrt        |      }|j                  | d|        6 |S t        |t        t        f      r|D ]  }|| j                  |      z  } |S t        d|       )Nr;   z5Can only process dict, tuple, lists and str, but got )r*   rJ   r)   rZ   r\   ru   rP   r-   r]   value_to_argv
ValueError)r   rA   r8   r5   rB   parts         r   r   zHydraMain.value_to_argv   s    
 c3KK  T"!iik .
Ud111 5U;Ese1UG,-.  dE]+ 1**4001  TUXTYZ[[r   r   c                 h    t               }|j                  J |j                  D ]
  \  }}|||<    |S r   )r   r4   )r   r   partsrm   rB   s        r   get_name_partszHydraMain.get_name_parts   s>    xx###88 	 KD%E$K	 r   c                    t               r6dt               j                   }t        j                  j                  |       	   t        j                  d| j                  | j                  d| j                  | j                               t               r t        j                  j                         S S # t               r t        j                  j                         w w xY w)Nzhydra.run.dir=ra   rb   r   )r   r   folderrg   r8   r)   hydrar`   ra   rb   rf   remove)r   run_dirs     r   _mainzHydraMain._main   s    7&vx&78GHHOOG$	)0 %5:: % ,, ,,% ##% &*YY0 2
 w( uw( s   A
B7 7,C#c                    t        t        | j                        fd| j                  i| j                  5  t        j                         j                  }|J t        |j                               cd d d        S # 1 sw Y   y xY w)Njob_name)
r
   rJ   rp   rk   rf   r   instancer   r-   list_all_config_groups)r   ghs     r   rt   zHydraMain._get_config_groups   st    "3t'<'<#= 8 8%)%6%68 	5%%'--B>!>1134		5 	5 	5s   ;A;;Bc                     d|v sd|v ryy)Nz-mz
--multirunFTr   )r   r8   s     r   
_is_activezHydraMain._is_active   s    4<<4/r   	overridesc           	      P   t        t        | j                        fd| j                  i| j                  5  t        j                         j                  }|J g }g }|D ]}  }| j                  D ]l  }|j                  | d      s|j                  |       |j                  dd      \  }}|D 	
cg c]  \  }	}
|	|k7  s|	|
f }}	}
|j                  ||f       n  |s| j                  g fcddd       S | j                  |      }||fcddd       S c c}
}	w # 1 sw Y   yxY w)zr
        Return base config based on composition, along with delta for the
        composition overrides.
        r   Nr;   r   )r
   rJ   rp   rk   rf   r   r   r   ru   
startswithr)   r<   rs   _get_config_noinit)r   r   r   to_keepr4   rA   group_rB   gvr   s               r   r   zHydraMain._get_base_config   s5    #3t'<'<#= 8 8%)%6%68 	%%'--B>!>G13E  5!00 5E~~qk2s+#&99S!#4549 HDAqQ%Z!Q H HeU^455 ~~r)	 	 ))'2C:!	 	 !I	 	s0   AD+D1D?D)D8DDD%c                     t        t        | j                        fd| j                  i| j                  5  | j                  |      cddd       S # 1 sw Y   yxY w)z|
        Internal method, returns the config for the given override,
        but without the dora.sig field filled.
        r   N)r
   rJ   rp   rk   rf   r   )r   r   s     r   rr   zHydraMain._get_config  sU     #3t'<'<#= 8 8%)%6%68 	6**95	6 	6 	6s   AAc                    t         r_t        j                  j                  t        dt
              5  t        | j                  |      }d d d        t        j                        }|S t        | j                  |      }|S # 1 sw Y   8xY w)N__deepcopy__)
	old_hydrar   patchobjectr   r   r	   ra   copydeepcopy)r   r   r   s      r   r   zHydraMain._get_config_noinit  sp    "":~xH ;d..	:;--$C 
 $**I6C
; ;s   A>>Binitr1   c                     g }t        ||      D ]:  }dj                  |j                        }|j                  ||j                  f       < |S )za
        Returns an iterator over all the differences between the init and other config.
        r%   )r,   r[   r2   r)   r7   )r   r   r1   r4   diffrm   s         r   r   zHydraMain._get_delta$  sO     #D%0 	3D88DII&DLL$ 0 012	3 r   )r    r!   r"   _slowr   rJ   rx   r   rv   r   r   tpSequencer   AnyListr   r   r   r   r   rt   rG   r   Tupler   r   rr   r   r   __classcell__)r~   s   @r   r_   r_      sQ   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   r_   ra   rb   c                 (     dt         f fd}|S )zmWrap your main function with this.
    You can pass extra kwargs, e.g. `version_base` introduced in 1.2.
    r`   c                 "    t        | fdS )Nr   )r_   )r`   ra   rb   ry   s    r   
_decoratorzhydra_main.<locals>._decorator3  s#     #;K #!# 	#r   )r   )ra   rb   ry   r   s   ``` r   
hydra_mainr   /  s    # # r   )6__doc__r   collectionsr   r   importlib.utilr   rX   loggingpathlibr   rg   typingr   unittestr   r   hydra.core.global_hydrar   r	   r
   r   ImportErrorhydra.experimentalomegaconf.dictconfigr   confr   r   r   r`   r   r   r   r   r   r   	getLoggerr    loggerr   r   r   r   r.   r,   r   rJ   r   rC   rL   rP   r_   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   C1 1DD