o
    qoiu]                  
   @   s~  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mZ d dlmZmZmZmZmZ d dlmZmZmZ d dlmZ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# d dl$m%Z% d dl&m'Z' d dl(m)Z) d dl*m+Z+m,Z, d dl-m.Z. d dl/m0Z0m1Z1 d dl2m3Z3m4Z4m5Z5 d dl6m7Z7 ddl8m8Z8 G dd de!Z9de	e+ de	e: de:de:de:f
ddZ;dS )    N)dedent)AnyListMutableSequenceOptionalTuple)	Container
DictConfig	OmegaConfflag_override	open_dict)ConfigAttributeErrorConfigKeyErrorOmegaConfBaseException)CachingConfigRepositoryConfigRepositoryIConfigRepository)DefaultsListcreate_defaults_list)ConfigSourceInfo)ConfigLoader)ConfigSearchPath)ResultDefault)
ObjectType)OverridesParser)Override	ValueType)
JobRuntime)ConfigCompositionExceptionMissingConfigException)ConfigLoadErrorConfigResultConfigSource)RunMode   )deprecation_warningc                   @   s2  e Zd ZdZdeddfddZedee de	d	e
ddfd
dZdee dede
ddfddZd=ddZ		d>dee dee de	d	e
de
defddZdee dee deddfddZdee dee deee ef fddZ		d>dee dee de	d	e
de
defddZded ee defd!d"Zdefd#d$Zedee d%eddfd&d'Zd(ededefd)d*Zed+ed,ee defd-d.Zd/edee fd0d1Ze j!ddfd2ed3ee  dee deee  dee f
d4d5Z"d6ee dedefd7d8Z#dee$ fd9d:Z%dee dee de	de&fd;d<Z'dS )?ConfigLoaderImplz
    Configuration loader
    config_search_pathreturnNc                 C   s   || _ t|d| _d S )Nr'   )r'   r   
repository)selfr'    r,   V/home/ubuntu/.local/lib/python3.10/site-packages/hydra/_internal/config_loader_impl.py__init__+   s   zConfigLoaderImpl.__init__	overridesrun_mode
from_shellc                 C   s   | D ]P}|  rR|tjkr| rtd|j dq|tjkrP|jtj	krGd}|r1d| d}nd| d}t
d|j d| d	}t|td
|j dJ qd S )Nz8Sweeping over Hydra's configuration is not supported : ''zvalue1,value2zkey=\'z\'zkey='z:                            Ambiguous value for argument 'z'
                            1. To use it as a list, use key=[value1,value2]
                            2. To use it as string, quote the value: zU
                            3. To sweep over it, add --multirun to your command linezSweep parameters 'z' requires --multirun)is_sweep_overrider#   MULTIRUNis_hydra_overrider   
input_lineRUN
value_typer   SIMPLE_CHOICE_SWEEPr   )r/   r0   r1   xvalsexample_overridemsgr,   r,   r-   validate_sweep_overrides_legal2   s<   

z/ConfigLoaderImpl.validate_sweep_overrides_legalconfig_namer=   with_search_pathc                    s$   dt f fdd}t|| d)Nr(   c                     sV   g } j  D ]}|jdkr| dt|  qd| }r) d d|  S  S )Nschema	
z
Search path:)r*   get_sourcesproviderappendreprjoin)descssrclinesr=   r+   r@   r,   r-   add_search_pathZ   s   

z?ConfigLoaderImpl._missing_config_error.<locals>.add_search_path)missing_cfg_filemessage)strr   )r+   r?   r=   r@   rM   r,   rL   r-   _missing_config_errorW   s   z&ConfigLoaderImpl._missing_config_errorc                 C   sn   |   D ]0}|jdkr4| s4| dkr%|jdkrd}nd|j d}nd|j d}| jd |d	d
 qd S )Nmainpkg zdPrimary config module is empty.
Python requires resources to be in a module with an __init__.py filezPrimary config module 'zE' not found.
Check that it's correct and contains an __init__.py filezEPrimary config directory not found.
Check that the config directory 'z' exists and readableF)r?   r=   r@   )rD   rE   	availableschemepathrQ   )r+   sourcer=   r,   r,   r-   #ensure_main_config_source_availablej   s$   

z4ConfigLoaderImpl.ensure_main_config_source_availableTvalidate_sweep_overridesc              
   C   sF   z| j |||||dW S  ty" } zt t d |d }~ww )N)r?   r/   r0   r1   rZ      )_load_configuration_implr   r   with_tracebacksysexc_info)r+   r?   r/   r0   r1   rZ   er,   r,   r-   load_configuration   s   z#ConfigLoaderImpl.load_configurationparsed_overridesrepoc                    s  |d ur|j |d}|d u rt }n|j}nt }t|s-td| dt|j dtdt	fdd}d }|D ]}||rF|
 } nq:t|d |d urVd	}	| nd
}	d fdd}
 d u red S t tsm|
   D ]
}t|tsy|
  qot| j}| d}|jdksJ  D ]	}|j|	|d q|dd || | D ]}| stjtd|j d|j dd qd S )Nconfig_pathzprimary config 'z' must be a DictConfig, got vr(   c                 S   s   |   dkS )Nhydra.searchpath)get_key_element)rf   r,   r,   r-   is_searchpath_override   s   zKConfigLoaderImpl._process_config_searchpath.<locals>.is_searchpath_overriderg   z hydra.searchpath in command-linezhydra.searchpath in mainc                      s   t d  )Nz1hydra.searchpath must be a list of strings. Got: )r   r,   
searchpathr,   r-   _err   s   z9ConfigLoaderImpl._process_config_searchpath.<locals>._errrA   )rE   rW   zstructured://z	provider=z, path=z is not available.)categoryrO   r(   N)load_configr
   createconfigis_dictr   type__name__r   boolvalueselect
isinstancer   rP   copydeepcopyr'   get_pathpoprE   rF   initialize_sourcesrD   rU   warningswarnUserWarningrW   )r+   r?   rb   rc   loadedprimary_configri   overriderf   rE   rl   new_csprA   sprX   r,   rj   r-   _process_config_searchpath   s`   




z+ConfigLoaderImpl._process_config_searchpathc                 C   s4   t  }|j|d}t| j}| ||| ||fS )N)r/   )r   rq   parse_overridesr   r*   r   )r+   r?   r/   parserrb   caching_repor,   r,   r-   (_parse_overrides_and_create_caching_repo   s
   
z9ConfigLoaderImpl._parse_overrides_and_create_caching_repoc                 C   s  ddl m}m} |   | ||\}}	|r| j|||d t|	||d|tjkd}
|
j	}| j
|
j|	d}t|d t|j d t|| g }|D ]}| r\|j jj |j qL|j jj|j || qLt|j $ |j jj|
jj |j jjD ]}tj| |j jj|< qW d    n1 sw   Y  ||j j_|  |j j_!t" |j j_#dd	 |	$ D |j j_%d
|j jvrt& 'd
|j j_(t)||j jj*j+j,|j jj*j+j-|j jj*j+j.d|j j_+||j j_/|S )Nr   )__version__version)r/   r0   r1   Trc   r?   overrides_listprepend_hydraskip_missing)defaultsrc   Fc                 S   s"   g | ]}t |j| |jd qS ))rW   rA   rE   )r   rW   rV   rE   ).0r:   r,   r,   r-   
<listcomp>&  s    z=ConfigLoaderImpl._load_configuration_impl.<locals>.<listcomp>name)r/   kv_sepitem_sepexclude_keys)0hydrar   r   rY   r   r>   r   r#   r4   config_overrides"_compose_config_from_defaults_listr   r
   
set_structset_readonlyr&   _apply_overrides_to_configr5   r/   rF   r6   taskr   runtimechoicesupdateknown_choicesjobenv_copyosenvironenv_setgetbaseversion_basegetcwdcwdrD   config_sourcesr   getr   get_overrides_dirnamerr   override_dirnamer   r   r   r?   )r+   r?   r/   r0   r1   rZ   r   r   rb   r   defaults_listr   cfgapp_overridesr   keyr,   r,   r-   r\      sf   

z)ConfigLoaderImpl._load_configuration_implmaster_configsweep_overridesc                 C   sP   t |jjj}t|tsJ || }| j|jjj|t	j
d}t j||d |S )N)r?   r/   r0   )from_config	to_config)r
   to_containerr   r/   ry   listra   r   r?   r#   r7   
copy_cache)r+   r   r   r/   sweep_configr,   r,   r-   load_sweep_config8  s   	z"ConfigLoaderImpl.load_sweep_configc                 C   s   | j S Nr)   r+   r,   r,   r-   get_search_pathL  s   z ConfigLoaderImpl.get_search_pathr   c           	      C   s:  | D ]}|j d urtd|j d|j d|j}| }z| rtj||dd}|d u r8td|j d|d urO||krOtd|j d| d	| d
|d
}t	|# |dkra||= nt||d| }|||d d  = W d    n1 s~w   Y  nx|
 rtj||ddd u st|ttfrtj|||ddd nX|jd usJ ttd|j d|jdd   d|j d|j d	| rtj|||ddd n'ztj|||dd W n ttfy } ztd|j d|j |d }~ww W q ty } ztd|j t d |d }~ww d S )Nz	Override z7 looks like a config group override, but config group 'z' does not exist.F)throw_on_missingzCould not delete from config. 'z,Could not delete from config. The value of 'z' is z	 and not .rm   r   r$   T)merge	force_addzK                        Could not append to config. An item is already at 'z4'.
                        Either remove + prefix: 'z@'
                        Or add a second + to add or override 'z': '+z'
                        r   zCould not override 'z!'.
To append to your config use +zError merging override r[   )packager   r6   key_or_grouprw   	is_deleter
   rx   rfindr   is_addry   dictr   r   r   is_force_addr   r   r   r]   r^   r_   )	r/   r   r   r   rw   
config_vallast_dotnodeexr,   r,   r-   r   O  s   




	

z+ConfigLoaderImpl._apply_overrides_to_configdefaultc              
   C   s  |j }|d us	J |j|d}|d usJ t|js)td| dt|jj |jsd }z|	 }t
j|d}||}W n	 tyH   Y nw |d urztd}d|jv rbttd| d| d	ttd
| d| d	dd d }	|j d uo}|j d}
|j}|jrt|trd|v r|
s|d}	t|j|}t|tsJ |	d urt| |	|_W d    n1 sw   Y  ||_W n ty } z	td| d|d }~ww t|tsJ | ||j}|js|dkrt|jtrt|jdd urtd| d|S )Nrd   zConfig z" must be an OmegaConf config, got )filenamezGhttps://hydra.cc/docs/1.2/upgrades/1.0_to_1.1/automatic_schema_matchingr   z                            'an  ' is validated against ConfigStore schema with the same name.
                            This behavior is deprecated in Hydra 1.1 and will be removed in Hydra 1.2.
                            In addition, the automatically matched schema contains a defaults list.
                            This combination is no longer supported.
                            See z for migration instructions.z"
                                'z' is validated against ConfigStore schema with the same name.
                                This behavior is deprecated in Hydra 1.1 and will be removed in Hydra 1.2.
                                See    )
stacklevelzhydra/r   zError merging 'z' with schemazhydra/configrg   In 'zH': Overriding hydra.searchpath is only supported from the primary config)re   rp   r
   	is_configrr   
ValueErrorrt   ru   is_schema_sourceget_schema_sourcer"   _normalize_file_namer    r   r   r%   
startswithprimaryry   r	   r}   r   r   r   r   _embed_result_configr   rx   )r+   r   rc   re   retrA   schema_sourcecnameurlr   hydra_config_grouprr   mergedr`   resr,   r,   r-   _load_single_config  s   










z$ConfigLoaderImpl._load_single_configr   package_overridec                 C   sV   | j d }|d ur|}|d ur)|dkr)t }tj||| jdd t| } || _| S )Nr   rT   Fr   )headerr
   rq   r   rr   rz   )r   r   r   r   r,   r,   r-   r     s   

z%ConfigLoaderImpl._embed_result_configparent_namec                 C   s   | j |tjdS )N)
group_nameresults_filter)get_group_optionsr   GROUP)r+   r   r,   r,   r-   list_groups  s   zConfigLoaderImpl.list_groupsr   r   c                 C   s(   |d u rg }|  ||\}}|||S r   )r   r   )r+   r   r   r?   r/   _r   r,   r,   r-   r     s   z"ConfigLoaderImpl.get_group_optionsr   c                    s   t  }t|dd@ |D ]5}| j||d}z||j W q tyB } ztd|j dt	|j
 d| t d d }~ww W d    n1 sMw   Y  dtd	d f fd
d  | |S )Nno_deepcopy_set_nodesT)r   rc   r   z': z  raised while composing config:
r[   r   r(   c                    s   t | trG|  s|  rd S t| ddgd | dr)| dd  | dd  W d    n1 s3w   Y  | jddD ]
\}} | q>d S d S )NreadonlystructFHYDRA_REMOVE_TOP_LEVEL_DEFAULTSr   )resolve)	ry   r	   _is_missing_is_noner   	_get_flag	_set_flagr}   items_ex)r   _keyrw   strip_defaultsr,   r-   r   &  s   


zKConfigLoaderImpl._compose_config_from_defaults_list.<locals>.strip_defaults)r
   rq   r   r   
merge_withrr   r   r   re   rt   ru   r]   r^   r_   r   )r+   r   rc   r   r   r   r`   r,   r   r-   r     s*   z3ConfigLoaderImpl._compose_config_from_defaults_listc                 C   s
   | j  S r   )r*   rD   r   r,   r,   r-   rD   6  s   
zConfigLoaderImpl.get_sourcesc                 C   s,   |  ||\}}t|||d|tjkd}|S )NTr   )r   r   r#   r4   )r+   r?   r/   r0   rb   r   r   r,   r,   r-   compute_defaults_list9  s   z&ConfigLoaderImpl.compute_defaults_listro   )TT)(ru   
__module____qualname____doc__r   r.   staticmethodr   r   r#   rv   r>   r   rP   rQ   rY   r	   ra   r   r   r   r   r\   r   r   r   r   r   r!   r   r   r   r   CONFIGr   r   r"   rD   r   r   r,   r,   r,   r-   r&   &   s   
$

 

H

O
A
`


"r&   r/   r   r   r   r(   c                 C   sV   g }| D ]}|j |vr|j}|d usJ || q|  tjd|||d}|S )Nz[=])patternreplstring)r   r6   rF   sortresubrH   )r/   r   r   r   rK   r   liner   r,   r,   r-   r   L  s   

r   )<rz   r   r  r^   r   textwrapr   typingr   r   r   r   r   	omegaconfr   r	   r
   r   r   omegaconf.errorsr   r   r   !hydra._internal.config_repositoryr   r   r   hydra._internal.defaults_listr   r   
hydra.confr   hydra.core.config_loaderr   hydra.core.config_search_pathr   hydra.core.default_elementr   hydra.core.object_typer   +hydra.core.override_parser.overrides_parserr    hydra.core.override_parser.typesr   r   hydra.core.utilsr   hydra.errorsr   r   hydra.plugins.config_sourcer    r!   r"   hydra.typesr#   r%   r&   rP   r   r,   r,   r,   r-   <module>   sN       *