o
    2wi+                     @   s  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 z
ddlmZmZ W n eyW   ddlmZmZ d	ZY nw 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%e&Z'dej(dej(fddZ)eddZ*G dd dZ+e+ Z,g fddZ-dej.e/ dej0e/ fddZ1dd Z2d d! Z3G d"d# d#eZ4d$e/d%e/fd&d'Z5dS )(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_dirTF)
DictConfig   )
DoraConfigSlurmConfigupdate_from_hydra)DecoratedMainMainFun)XPget_xpis_xpselfmemoc                 C   s   | S N )r   r   r   r   G/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/dora/hydra.py_no_copy(   s   r   _Differencez(path key ref other ref_value other_valuec                   @   s   e Zd ZdS )	_NotThereN)__name__
__module____qualname__r   r   r   r   r   1   s    r   c           	      c   s   t |  }t t| t|   }g }|d |D ]J}||d< | | }||v s3J d| || }t|trXt|tsNJ d| dt| dt|||E dH  q||krhtt	||| |||V  q|D ]}||d< || }tt	||| |t
|V  qk|d |S )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_valuer   r   r   r'   8   s8   


r'   argvreturnc                 C   s~   g }t  }t| d d d D ])}d|v sJ d| d|dd\}}| }||v r-q|| || q|d d d S )Nr   =z	Argument z does not contain =r   )r#   r(   splitstripaddr$   )r3   
simplifiedseenargr0   valuer   r   r   _simplify_argvW   s   
r=   c                 C   sV   | d u rdS 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&   )r0   r   r   r   	_dump_keyf   s   
rE   c                 C   s   | d u rdS t | ttttfrt| S t | tr)dddd | 	 D  d S t | t
tfr>dddd | D  d	 S td
t|  d|  )Nr>   {z, c                 s   s*    | ]\}}t | d t| V  qdS )z: N)rE   _hydra_value_as_override).0r0   valr   r   r   	<genexpr>z   s
    
z+_hydra_value_as_override.<locals>.<genexpr>}[c                 s   s    | ]}t |V  qd S r   )rG   )rH   rI   r   r   r   rJ      s    ]zUnsupported value type z for value )r%   r@   rA   rB   rC   jsondumpsdictjoinitemsr(   tuplerD   r&   )r<   r   r   r   rG   r   s   

rG   c                
       s>  e Zd ZdZdededef fddZdefdd	Zde	fd
dZ
deje fddZdejdeje fddZdedefddZdd Zdeje fddZdeje defddZg fdeje dejeejejeef  f fddZg fdeje defddZg fdeje defd d!Zd"ed#efd$d%Z  ZS )&	HydraMainTmainconfig_nameconfig_pathc           	         s  || _ || _|| _|j}|dkr@tj| j}|d u r)tjd }|ddd | _	n2|j
d us0J |j
}|j}|ddd | _	nt|}|d urM|j
d usOJ |j
}|ddd | _	t|j | _|d urm| j| | _d| _|  | _|  | _|  }t || d|_d S )N__main__r   r       r   F)rV   rW   hydra_kwargsr   sysmodules__spec__r3   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   rU   rV   rW   kwargsmodulespecmodule_pathdora	__class__r   r   rl      s4   



zHydraMain.__init__r4   c                 C   sB   t  }t| jdrt|| jj | jddg7  _t|j|_|S )Nrq   zdora.*zslurm.*)r   hasattrrg   r   rq   excluder   dir)r   rq   r   r   r   rj      s   zHydraMain._get_dorac                 C   s$   t  }t| jdrt|| jj |S )zEReturn default Slurm config for the launch and grid actions.
        slurm)r   rt   rg   r   rw   )r   rw   r   r   r   get_slurm_config   s   zHydraMain.get_slurm_configr3   c                 C   sF   t |}| |}| |\}}|| ||7 }t| j|||d}|S )N)rq   cfgr3   r/   )r=   rf   _get_base_config
_get_deltar   rq   )r   r3   ry   baser/   xpr   r   r   r      s   
zHydraMain.get_xpr;   c                 C   s   g }t |tr|| |S t |tr1| D ]\}}|| jvr$t|}|| d|  q|S t |ttfrF|D ]	}|| 	|7 }q:|S t
d| )Nr5   z5Can only process dict, tuple, lists and str, but got )r%   rC   r$   rP   rR   ri   rG   r(   rS   value_to_argv
ValueError)r   r;   r3   r0   r<   partr   r   r   r~      s   



zHydraMain.value_to_argvr}   c                 C   s0   t  }|jd us
J |jD ]\}}|||< q|S r   )r   r/   )r   r}   partsra   r<   r   r   r   get_name_parts   s
   
zHydraMain.get_name_partsc              	   C   sr   t  rdt j }tj| ztjd| j| j	d| j
| j W t  r-tj| S S t  r8tj| w w )Nzhydra.run.dir=rV   rW   r   )r   r   folderr[   r3   r$   hydrarU   rV   rW   rZ   remove)r   run_dirr   r   r   _main   s"   zHydraMain._mainc                 C   sd   t t| jfd| ji| j t j}|d usJ t|	 W  d    S 1 s+w   Y  d S )Njob_name)
r	   rC   rd   r_   rZ   r   instancer   r(   list_all_config_groups)r   ghr   r   r   rh      s   

$zHydraMain._get_config_groupsc                 C   s   d|v sd|v r
dS dS )Nz-mz
--multirunFTr   )r   r3   r   r   r   
_is_active   s   zHydraMain._is_active	overridesc           	         s   t t| jfd| ji| j^ t j}|dusJ g }g }|D ]-}| jD ]' |	  drM|
| |dd\}} fdd|D }|
 |f q&q!|s]| jg fW  d   S | |}||fW  d   S 1 spw   Y  dS )zr
        Return base config based on composition, along with delta for the
        composition overrides.
        r   Nr5   r   c                    s    g | ]\}}| kr||fqS r   r   )rH   gvgroupr   r   
<listcomp>
  s     z.HydraMain._get_base_config.<locals>.<listcomp>)r	   rC   rd   r_   rZ   r   r   r   ri   
startswithr$   r6   rg   _get_config_noinit)	r   r   r   to_keepr/   r;   _r<   ry   r   r   r   rz      s,   



$zHydraMain._get_base_configc                 C   sL   t t| jfd| ji| j | |W  d   S 1 sw   Y  dS )z|
        Internal method, returns the config for the given override,
        but without the dora.sig field filled.
        r   N)r	   rC   rd   r_   rZ   r   )r   r   r   r   r   rf     s
   $zHydraMain._get_configc                 C   s^   t r'tjtdt t| j|}W d    n1 sw   Y  t	|}|S t| j|}|S )N__deepcopy__)
	old_hydrar   patchobjectr
   r   r   rV   copydeepcopy)r   r   ry   r   r   r   r     s   
zHydraMain._get_config_noinitinitr,   c                 C   s4   g }t ||D ]}d|j}|||jf q|S )za
        Returns an iterator over all the differences between the init and other config.
        r    )r'   rQ   r-   r$   r2   )r   r   r,   r/   diffra   r   r   r   r{   $  s
   zHydraMain._get_delta)r   r   r   _slowr   rC   rl   r   rj   r   rx   tpSequencer   AnyListr~   r   r   r   r   rh   r@   r   Tupler
   rz   rf   r   r{   __classcell__r   r   rr   r   rT      s2    #


	rT   rV   rW   c                    s   dt f fdd}|S )zmWrap your main function with this.
    You can pass extra kwargs, e.g. `version_base` introduced in 1.2.
    rU   c                    s   t | f dS )Nr   )rT   )rU   rV   rW   rm   r   r   
_decorator3  s   zhydra_main.<locals>._decorator)r   )rV   rW   rm   r   r   r   r   
hydra_main/  s   r   )6__doc__r   collectionsr   r   importlib.utilr   rN   loggingpathlibr   r[   typingr   unittestr   r   hydra.core.global_hydrar   r   r	   ImportErrorhydra.experimentalr   omegaconf.dictconfigr
   confr   r   r   rU   r   r   r}   r   r   r   	getLoggerr   loggerr   r   r   r   r)   r'   r   rC   r   r=   rE   rG   rT   r   r   r   r   r   <module>   sF   

 ,