o
    qoii                     @   sJ  d dl Z d dlZd dlZd dlmZmZ d dlmZ d dlm	Z	m
Z
mZmZmZmZmZ d dl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mZmZmZmZm Z  d d
l!m"Z" d dl#m$Z$ d dl%m&Z& ddl'm'Z' e( Z)e)j*di dd eG dd dZ+eG dd dZ,eG dd dZ-eG dd dZ.dedee de/de/fddZ0d ed!eddfd"d#Z1d ed$ed%e-d&e/def
d'd(Z2d ed)ed&e/de/fd*d+Z3d%e-d,ee d-e/defd.d/Z4d ed$ed0e/d&e/d1e/d%e-defd2d3Z5d,ee d%e-d4ed1e/ddf
d5d6Z6d7ede/fd8d9Z7d ed$ed0e/d&e/d1e/d%e-defd:d;Z8d<ee d!edee fd=d>Z9d<ed?e	ee egdf ddfd@dAZ:d<edee fdBdCZ;dDee< dEe/defdFdGZ=dHee ddfdIdJZ>d edDee< d%e-dKe/d&e/deee ef fdLdMZ?d edDee< dNee$ dKe/d&e/de.fdOdPZ@d ed<eddfdQdRZAdS )S    N)	dataclassfield)dedent)CallableDictListOptionalSetTupleUnion)
DictConfig	OmegaConf)MissingConfigExceptionversion)IConfigRepository)ConfigStore)ConfigDefaultDefaultsTreeNodeGroupDefaultInputDefaultResultDefaultVirtualRoot)
ObjectType)Override)ConfigCompositionException   )deprecation_warning_dummy_empty_config_hydra)namenodeproviderc                   @   s.   e Zd ZU ee ed< edddZeed< dS )Deletionr   F)defaultcompareusedN)	__name__
__module____qualname__r   str__annotations__r   r%   bool r,   r,   Q/home/ubuntu/.local/lib/python3.10/site-packages/hydra/_internal/defaults_list.pyr"   "   s   
 r"   c                   @   sB   e Zd ZU eed< dZee ed< dZeed< dZ	ee ed< dS )OverrideMetadataexternal_overrideNcontaining_config_pathFr%   relative_key)
r&   r'   r(   r+   r*   r0   r   r)   r%   r1   r,   r,   r,   r-   r.   (   s
   
 r.   c                   @   s,  e Zd ZU eeeeeee f  f ed< eee	f ed< ee
 ed< ee ed< eeee f ed< eeee f ed< eeef ed< ded	ee d
dfddZdede
d
dfddZded
efddZde
d
dfddZd ddZd ddZded
dfddZded
efddZded
dfddZdS )!	Overridesoverride_choicesoverride_metadataappend_group_defaultsconfig_overridesknown_choicesknown_choices_per_group	deletionsrepooverrides_listreturnNc              	   C   sP  i | _ i | _g | _g | _i | _i | _i | _|D ]}| rq||j	}|
 }t|
 t}|s3|s:| j| q| rGtd|j d| rp| dd  }|
 }|d urgt|tsgtd| t|d| j|< qt|ttfstdt|j | r| jt|j	|j|dd q| }|| j |< tdd	| j|< qd S )
Nz.force-add of config groups is not supported: ''r   z8Config group override deletion value must be a string : )r   z6Config group override must be a string or a list. Got T)grouppackagevalueexternal_append)r/   )r3   r4   r5   r6   r9   r7   r8   is_sweep_overridegroup_existskey_or_groupr@   
isinstancedictappendis_force_addr   
input_line	is_deleteget_key_elementr)   
ValueErrorr"   listtyper&   is_addr   r?   r.   )selfr:   r;   overrideis_groupr@   is_dictkeyr,   r,   r-   __init__=   sX   	
zOverrides.__init__parent_config_pathr#   c                 C   sH   |j sJ | }|| jvr"|j| j|< td|| d| j|< d S d S )NF)r/   r0   r1   )rQ   get_override_keyr3   r@   r.   get_relative_override_keyr4   )rP   rV   r#   rT   r,   r,   r-   add_overridep   s   

zOverrides.add_overridec                 C   s   t |tr| | jv S dS )NF)rE   r   rW   r3   )rP   r#   r,   r,   r-   is_overridden{   s   
zOverrides.is_overriddenc                 C   sB   |  }|| jv rt|tr| j| |_d|_d| j| _d S d S NT)rW   r3   rE   r   r@   config_name_overriddenr4   r%   rP   r#   rT   r,   r,   r-   override_default_option   s   

z!Overrides.override_default_optionc              	   C   s   | j  D ]x\}}|js}|dd }|| jv r| j| nt }t|dkr7d| ddtt	| d}n$t|dkrLd| dt

|  d}nt|dkrYd| d	}nJ |jd urid|j d| }|jry|d| d| j|  7 }t|qd S )N@r   r   zCould not override 'z#'.
Did you mean to override one of z, ?z'.
Did you mean to override z!'. No match in the defaults list.FIn '': z%
To append to your default list use +=)r4   itemsr%   splitr8   setlenjoinsortedrM   copypopr0   r/   r3   r   )rP   rT   metar>   choicesmsgr,   r,   r-   ensure_overrides_used   s6   


zOverrides.ensure_overrides_usedc                 C   sP   | j  D ] \}}|js%|jd ur| d|j n|}d| d}t|qd S )Nrc   zCould not delete 'z '. No match in the defaults list)r9   rd   r%   r   r   )rP   rT   deletiondescrn   r,   r,   r-   ensure_deletions_used   s   zOverrides.ensure_deletions_usedc                 C   s   t |trH| }|| jvr| | j|< n| j| }| |kr/td| d| d| d| }|| jvr>t | j|< | j| 	| d S d S )NzMultiple values for z$. To override a value use 'override : r=   )
rE   r   rW   r7   get_namer   get_group_pathr8   rf   add)rP   r#   rT   prevr>   r,   r,   r-   set_known_choice   s$   



zOverrides.set_known_choicec                 C   sJ   t |tsdS | }|| jv r#| j| }|jd u rdS |j| kS dS )NFT)rE   r   rW   r9   r   rt   )rP   r#   rT   rp   r,   r,   r-   
is_deleted   s   



zOverrides.is_deletedc                 C   s,   t |tsJ d|_| }d| j| _d S r[   )rE   r   deletedrW   r9   r%   r]   r,   r,   r-   delete   s   zOverrides.deleter<   N)r&   r'   r(   r   r)   r   r   r   r*   r.   r   r   r	   r"   r   rU   rY   r   r+   rZ   r^   ro   rr   rx   ry   r{   r,   r,   r,   r-   r2   0   s"   
  3

!r2   c                   @   s6   e Zd ZU ee ed< eed< ee ed< eed< dS )DefaultsListdefaultsdefaults_treer6   	overridesN)	r&   r'   r(   r   r   r*   r   r   r2   r,   r,   r,   r-   r}      s
   
 r}   containing_noder~   has_config_contentr<   c                 C   s   d}d}|D ]}|  sd}| r|rtd|   d}q|s$|s*t|dkrS| jrK|rK|rKd|   d}tjddkrEt|t	
|t |td	d
 | S )NFTzDuplicate _self_ defined in r   ra   z': Defaults list is missing `_self_`. See https://hydra.cc/docs/1.2/upgrades/1.0_to_1.1/default_composition_order for more informationSELF_WARNING_AS_ERROR1_self_path)is_overrideis_selfr   get_config_pathrg   primaryosenvirongetwarningswarnUserWarningrG   r   )r   r~   r   has_selfhas_non_overridedrn   r,   r,   r-   _validate_self   s*   r   r:   r    c                 C   s<   |  rd S | j| d}|d ur||jd  d S d S )Nconfig_pathr?   )
is_missingload_configr   set_package_headerheader)r:   r    loadedr,   r,   r-   update_package_header  s   r   rootr   skip_missingc              	   C   s   g }|j d us	J t|j D ]0}t|tsJ t||d}|dd t| ||j|d|d}|j d u r9|| q|| qt	|dkrLt
t||_ |S )Nr    parent Fr:   r   is_root_configr   interpolated_subtreer   r   )childrenreversedrE   r   r   update_parent_create_defaults_tree_implr   rG   rg   rM   )r:   r   r   r   r   r   new_rootsubtreer,   r,   r-   _expand_virtual_root  s(   
r   r#   c           	      C   s   |  }|drK|rdS t|tr=| }| }| j|tjd}d	dd |D }t
d| d| d	}t|| t|trItd
| J dS )Nz???T)results_filter
c                 S      g | ]}d | qS 	r,   .0xr,   r,   r-   
<listcomp>;      z&_check_not_missing.<locals>.<listcomp>z"                You must specify 'z', e.g, z==<OPTION>
                Available options:
                z)Missing ConfigDefault is not supported : F)r   endswithrE   r   ru   rW   get_group_optionsr   CONFIGrh   r   r   r   rL   )	r:   r#   r   r   
group_pathoverride_keyoptionsopt_listrn   r,   r,   r-   _check_not_missing+  s0   


r   defaults_list
self_addedc                 C   sj   t | j}g |_|D ]'}|r| rqt|tr"|j|  qt|t	r2|j|
 |ji q|S N)r   creater7   r~   r   rE   r   rG   r   r   rW   r@   )r   r   r   r7   r   r,   r,   r-   _create_interpolation_mapK  s   

r   r   r   c                 C   s   t | |||||d}|S )Nr   )r   )r:   r   r   r   r   r   retr,   r,   r-   _create_defaults_tree\  s   	r   r   c                 C   sv  d}d }| D ]}|  rq|| |  d}t|tr5|jd us%J tds5|	  o4|j
d}|rn|	 sn| sn|snt|tsHJ | }| }	| }
ttd| d|	 d|
 d|  d|  d	t|tr|rd
|_d}td|  d|j d| d}t| |jr|sd
}|}|rttd|  d|  d|  d|| | qd S )NFz1.2zhydra/z                    In z: Override 'z : z' is defined before 'rs   zH'.
                    Overrides must be at the end of the defaults listTzDhttps://hydra.cc/docs/1.2/upgrades/1.0_to_1.1/defaults_list_overridez: Invalid overriding of zb:
                    Default list overrides requires 'override' keyword.
                    See z+ for more information.
                    z                            z: Default List Overrides are not allowed in the subtree
                            of an in interpolated config group (override rc   z).
                            )r   r   ru   get_final_packagerE   r   r>   r   base_at_leastr   
startswithis_external_appendr   rW   rt   r   r   rQ   r   rY   )r   r   r   r   seen_overridelast_override_seenr   legacy_hydra_overridepcpokeyovalurlrn   r,   r,   r-   _update_overridesp  s   


r   cfgc                 C   s@   |   s|  r
dS |  D ]}t| |s|dkr dS qdS )NFr~   T)_is_none_is_missingkeysr   r   )r   rT   r,   r,   r-   _has_config_content  s   r   c              	      s  |j }g }| r|rt|S |S |r+|j dd |j  s+t|d t|d |r=	| |S 
| | d u rJ|S t|drS|S | }j|d}	|	d u ry| rst|ttfsnJ d|_|S t|d |	d usJ t|	j}
|
d u rg }
d}t|
dks|rtjdkrt|	jtot|	j}t||
|d	}|r|
j t|
|  d
ttt t!f  dt!dd f fdd}t"|
D ]}|# r||j j$|j %  |&| q|' rq||( |)  *|rt|tsJ +| t|tr_|, r_t"|- D ]<}d|v r0t.d| d|j/d us8J t|j/d | |j0| d}||( |)  t!||d}||| q!q|1 rj|&| qt!||d}||| qt2|
|}t3|D ]9\}}t|t r|1 r|4| t!||d}||( |)  t5|ddd}|j6d ur|||< qt|dkrt7t"||_6|S )Nr   )r:   tree)r:   r    )r:   r#   r   r   TFr   )r   r~   r   
child_list	new_root_r<   c                    s<   t |d d}|jd u r| |j d S | | d S )NF)r:   r   r   r   r   r   )r   r   rG   r    )r   r   subtree_r   r   r:   r   r,   r-   	add_child  s   
z-_create_defaults_tree_impl.<locals>.add_childz${ra   zE': Defaults List interpolation is not supported in options list items/)r   r?   optionalr   r   )8r    
is_virtualr   r   config_existsr   config_not_found_errorr   ry   r{   rx   rt   r   r   is_optionalrE   r   r   rz   rj   deepcopyr   rg   r5   configr   r   r   extendr   r   r   r   r   r   r   parent_base_dirget_packagerG   r   ru   r   rZ   r^   
is_optionsget_optionsr   r>   r?   is_interpolationr   	enumerateresolve_interpolationr   r   rM   )r:   r   r   r   r   r   r   r   r   r   r   r   r   r   r   itemr    r   r7   idxddr   r,   r   r-   r     s   








r   r   c                 C   s   |  rd S | d u rd S t }| rA| d usJ | j |_d|_|  }|d ur2| |_nd |_| j	 |_
| jj|_n"| |_| d urP| j |_|	 |_
t|tr_| |_|j|_|jdkrjd S |S )NTr   )r   rt   r   r   r    r   r   parent_noder   r   r?   r   rE   r   rW   r   )r   r    respnr,   r,   r-   _create_result_defaultX  s2   




r   operatorc                 C   sj   | j d u st| j dkr|| j| j d S | j D ]}t|tr%|| | qt|ts,J t||d qd S )Nr   )r   r   )r   rg   r   r    rE   r   r   	_dfs_walk)r   r   childr,   r,   r-   r   |  s   

r   c                 C   s$   G dd d}| }t | | |jS )Nc                   @   s0   e Zd Zd	ddZdee deddfddZdS )
z _tree_to_list.<locals>.Collectorr<   Nc                 S   s
   g | _ d S r   )output)rP   r,   r,   r-   rU     s   
z)_tree_to_list.<locals>.Collector.__init__	tree_noder    c                 S   s@   |  rd S | rd S t||d}|d ur| j| d S d S )N)r   r    )ry   r   r   r   rG   )rP   r   r    rdr,   r,   r-   __call__  s   z)_tree_to_list.<locals>.Collector.__call__r|   )r&   r'   r(   rU   r   r   r   r   r,   r,   r,   r-   	Collector  s    
r   )r   r   )r   r   visitorr,   r,   r-   _tree_to_list  s   
r   config_name
with_hydrac                 C   sP   | d u rt ddd}nt | dd}|r!tt t dd|gd}|S t|d}|S )Nr   T)r   r   zhydra/configr   )r    r   )r    )r   r   r   )r   r   r   r   r,   r,   r-   _create_root  s   
r   resultc                 C   sH   t  }| D ]}|js!|j}|d ur!||v rt| d|| qd S )Nz2 appears more than once in the final defaults list)rf   r   r   r   rv   )r  r   r   rT   r,   r,   r-   ensure_no_duplicates_in_list  s   
r  prepend_hydrac                 C   s:   t ||d}t| ||dd|d}t|d}t| ||fS )N)r   r   TF)r:   r   r   r   r   r   )r   )r   r   r   r  )r:   r   r   r  r   r   r   r   r,   r,   r-   _create_defaults_list  s   
	r  r;   c                 C   sD   t | |d}t| ||||d\}}|  |  t||j||dS )z
    :param repo:
    :param config_name:
    :param overrides_list:
    :param prepend_hydra:
    :param skip_missing: True to skip config group with the value '???' and not fail on them. Useful when sweeping.
    :return:
    )r:   r;   )r  r   )r~   r6   r   r   )r2   r  ro   rr   r}   r6   )r:   r   r;   r  r   r   r~   r   r,   r,   r-   create_defaults_list  s    
r  c                 C   s<  |j }d }d }t|tr| }| |tj}|jr%td|	  d}nO|j
d ur.|j
j nd }t|tr\d|	  d}|d ur[t|dkr[ddd |D }| d	| d
| }n
td|	  d}|d urtd|	  d| }g }|  D ]}	|dt|	  qzd|}
|dd|
  7 }t|	 ||d)Nz$        Cannot find primary config 'z7'. Check that it's in your config search path.
        zCould not find 'z'
r   r   c                 S   r   r   r,   r   r,   r,   r-   r     r   z*config_not_found_error.<locals>.<listcomp>z
Available options in 'z':
z            Could not load 'z'.
            ra   rb   r   z
Config search path:)missing_cfg_filemessager   )r    rE   r   ru   r   r   r   r   r   r   r   rg   rh   get_sourcesrG   reprr   )r:   r   elementr   r>   rn   r   r   descssrclinesr,   r,   r-   r     sH   


r   )Brj   r   r   dataclassesr   r   textwrapr   typingr   r   r   r   r	   r
   r   	omegaconfr   r   r   r   r   !hydra._internal.config_repositoryr   hydra.core.config_storer   hydra.core.default_elementr   r   r   r   r   r   hydra.core.object_typer    hydra.core.override_parser.typesr   hydra.errorsr   r   instancecsstorer"   r.   r2   r}   r+   r   r   r   r   r   r   r   r   r   r   r   r   r)   r   r  r  r  r   r,   r,   r,   r-   <module>   s8  $  '
"

 
 


C

 
$



!