o
    ٷil                     @   s*  d dl Z d dlmZ d dlmZmZmZmZmZm	Z	m
Z
mZmZmZmZmZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z 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- ddl.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7 dd	l8m9Z9m:Z: G d
d de-eeef Z;dS )    N)Enum)AnyDict	ItemsViewIterableIteratorKeysViewListMutableMappingOptionalSequenceTupleTypeUnion   )_DEFAULT_MARKER_	ValueKind
_get_value_is_interpolation_is_missing_literal_is_missing_value_is_none_resolve_optional_valid_dict_key_annotation_typeformat_and_raiseget_structured_config_data&get_structured_config_init_field_namesget_type_ofget_value_kindis_container_annotationis_dictis_primitive_dictis_structured_configis_structured_config_frozentype_str)Box	ContainerContainerMetadataDictKeyTypeNode)BaseContainer)	ConfigAttributeErrorConfigKeyErrorConfigTypeErrorInterpolationResolutionErrorKeyValidationErrorMissingMandatoryValueOmegaConfBaseExceptionReadonlyConfigErrorValidationError)EnumNode	ValueNodec                       s  e Zd ZU eed< eeeef de	f ed< dde
e
e
ddfdeeee
f d e
f de
dee dee
ee
 f d	ee
ee
 f d
ee
ee
 f dedeee	ef  ddf fddZdeee
f dd fddZdiddZdefddZdjde
de
ddfddZde
de
ddfddZde
ddfddZdee de
ddfddZde
d e
d!e
ddfd"d#Zde
defd$d%Zd	e
de
defd&d'Zdede
ddfd(d)Zdede
ddfd*d+Zdee	 fd,d-Zde	de
ddfd.d/Zde	de
fd0d1Z dede
fd2d3Z!de	ddfd4d5Z"deddfd6d7Z#djded8e
de
fd9d:Z$	dkded8e
d;ede
fd<d=Z%			>	>dlded?ed;ed@edAedee fdBdCZ&e'fdedDe
de
fdEdFZ(de)e fdGdHZ*de+defdIdJZ,de-e fdKdLZ.de/ee
f fdMdNZ0djdedDe
de
fdOdPZ1	dmdQedRee2e  de3e4ee
f  fdSdTZ5dUe
defdVdWZ6dUe
defdXdYZ7defdZd[Z8d\eee
  ddfd]d^Z9djde
deee	ef  ddfd_d`Z:	djde
deee	ef  ddfdadbZ;e<dcd ddd defdedfZ=de
fdgdhZ>  Z?S )n
DictConfig	_metadataN_contentTcontentkeyparentref_typekey_typeelement_typeis_optionalflagsreturnc	                    s(  zut |tr|d u r|jj}t j|t|||t|||dd t|s*t	d| t
|s2t
|rM| j||d t|sAt|rJ| dd W d S W d S t |trlt|j}	||	_||	_||	_||	_||	_|	| jd< | j||d W d S  ty }
 ztd |d |
t|
d W Y d }
~
d S d }
~
ww )	N)r:   optionalr<   object_typer=   r>   r@   )r;   metadataUnsupported key type r@   readonlyTr7   )noder:   valuecausemsg)
isinstancer6   r7   r@   super__init__r'   dictr   r/   r"   
_set_valuer#   	_set_flagcopydeepcopyr:   r<   rB   r>   r=   __dict__	Exceptionr   str)selfr9   r:   r;   r<   r=   r>   r?   r@   rD   ex	__class__ H/home/ubuntu/.local/lib/python3.10/site-packages/omegaconf/dictconfig.pyrN   >   sL   



$zDictConfig.__init__memoc           	   
   C   s   t d }tj| jd |d|jd< tj| jd |d|jd< | jd }t|tr[i }| D ]+\}}|jd }zd |jd< tj||d}||jd< |||< W ||jd< q.||jd< w n|}||jd< | jd |jd< |S )Nr7   )r]   _flags_cacher8   _parent)r6   rR   rS   rT   rL   rO   items)	rW   r]   ressrc_contentcontent_copykv
old_parentvcr[   r[   r\   __deepcopy__q   s*   







zDictConfig.__deepcopy__c                 C   s
   t  | S N)rR   rW   r[   r[   r\   rR      s   
zDictConfig.copyc                 C   s   | j jtd fvot| j j S ri   )r7   rC   r   r    rj   r[   r[   r\   	_is_typed   s   zDictConfig._is_typedrI   c                 C   s   |   }| ddu }|| jd vrL|r| ddu rd S |s!|rN|r:| jjtd fvs-J d| d| jjj d}nd| d}| j||t	|d	 d S d S d S )
NstructTr8   FzKey 'z
' not in ''z' is not in structr:   rI   rJ   )
rk   	_get_flagrT   _get_node_flagr7   rC   rO   __name___format_and_raiser+   )rW   r:   rI   is_typed	is_structrK   r[   r[   r\   _validate_get   s    

zDictConfig._validate_getc                 C   s:  ddl m} t|}|tjkrd S t|r| || d S |tjks&|d u r(d S |d ur1| |n| }t	|t
o?|jjttfv}|d u pF| }|rKd S t	|tsRJ |jj}||}	t|	ret|red S t|r{t|	s{tdt|	 dt| |d ur|	d urt|d|}
t|	|
s| ||	| d S d S d S d S )Nr   	OmegaConfzCannot assign z to 
__origin__)	omegaconfrw   r   r   INTERPOLATIONr   _validate_non_optionalMANDATORY_MISSING	_get_noderL   r6   r7   r<   r   rO   r)   get_typer    r   r3   r$   getattr
issubclass_raise_invalid_value)rW   r:   rI   rw   vktargettarget_has_ref_typeis_valid_targettarget_type
value_typeoriginr[   r[   r\   _validate_set   sF   



zDictConfig._validate_setc           	      C   s   ddl m} | }|}| d | ||}||}| r/|jjtd fvr/| jd t	|d | r5d S |d uoP|d uoPt
|oP|  oPt| oPt|| }|rfdt| dt| d| }t|d S )Nr   rv   r:   rI   zMerge error:  is not a subclass of 	. value: )ry   rw   r{   r~   _is_missingr7   rC   rO   r   r   r"   r   r    r   r$   r3   )	rW   rI   rw   destsrcdest_obj_typesrc_obj_typevalidation_errorrK   r[   r[   r\   _validate_merge   s<   


zDictConfig._validate_mergec                 C   s~   t |dddr;|d ur)| |}|d ur t|tsJ | }nt| jj\}}n|  }|s=| j||t	dd d S d S d S )NTF)resolvethrow_on_resolution_failurez!field '$FULL_KEY' is not Optionalrn   )
r   r}   rL   r)   _is_optionalr   r7   r>   rr   r3   )rW   r:   rI   childfield_is_optional_r[   r[   r\   r{      s$   



z!DictConfig._validate_non_optionalr   r   c                 C   s>   |d usJ |d usJ dt | dt | d| }t|)NzInvalid type assigned: r   r   )r$   r3   )rW   rI   r   r   rK   r[   r[   r\   r     s   zDictConfig._raise_invalid_valuec                 C   s   |  | jj|S ri   )_s_validate_and_normalize_keyr7   r=   )rW   r:   r[   r[   r\   _validate_and_normalize_key  s   z&DictConfig._validate_and_normalize_keyc              	   C   s   |t u rtjD ]}t||r|  S qtd|tu r#|dv r#t|S |tttt	tfv r<t||s:td|j
 d|S t|trizt||W S  tyh   ddd |j D }td|j
 d	| d
w J d| )Nz!Incompatible key type '$KEY_TYPE')r   r   z+Key $KEY ($KEY_TYPE) is incompatible with ()z, c                 S   s   g | ]}|qS r[   r[   ).0xr[   r[   r\   
<listcomp>+  s    z<DictConfig._s_validate_and_normalize_key.<locals>.<listcomp>z/Key '$KEY' is incompatible with the enum type 'z', valid: []FrE   )r   r(   __args__rL   r/   boolrV   bytesintfloatrq   r   r   r4   validate_and_convert_to_enumr3   join__members__keys)rW   r=   r:   tvalidr[   r[   r\   r     s0   



z(DictConfig._s_validate_and_normalize_keyc              
   C   s   z
| j ||d W d S  ty& } z| j||t|d W Y d }~d S d }~w ty@ } z| j|||d W Y d }~d S d }~ww )Nr   )r:   rI   type_overriderJ   rn   )_DictConfig__set_implAttributeErrorrr   r,   rU   rW   r:   rI   er[   r[   r\   __setitem__2  s   zDictConfig.__setitem__c                 C   s   |  |}| || d S ri   )r   _set_item_impl)rW   r:   rI   r[   r[   r\   
__set_impl<  s   
zDictConfig.__set_implc                 C   s"   |   s|  r
g S | jd  S Nr8   )r   r   rT   r   rj   r[   r[   r\   __dir__A  s   zDictConfig.__dir__c              
   C   sT   z	|  || W dS  ty) } zt|tr|jr|| j|||d J d}~ww )zu
        Allow assigning attributes to DictConfig
        :param key:
        :param value:
        :return:
        rn   FN)r   rU   rL   r1   _initializedrr   r   r[   r[   r\   __setattr__F  s   zDictConfig.__setattr__c              
   C   s   |dkrt  z	| j|tddW S  ty, } z| j|d|td W Y d}~dS d}~w tyF } z| j|d|d W Y d}~dS d}~ww )zf
        Allow accessing dictionary values as attributes
        :param key:
        :return:
        rq   F)r:   default_valuevalidate_keyNr:   rI   rJ   r   rn   )r   	_get_implr   r,   rr   r+   rU   rW   r:   r   r[   r[   r\   __getattr__U  s   zDictConfig.__getattr__c              
   C   s~   z| j |tdW S  ty$ } z| j|d|td W Y d}~dS d}~w ty> } z| j|d|d W Y d}~dS d}~ww )zM
        Allow map style access
        :param key:
        :return:
        r:   r   Nr   rn   )r   r   r   rr   r,   rU   r   r[   r[   r\   __getitem__i  s   zDictConfig.__getitem__c                 C   s^   |  dr| j|dtdd z	| jd |= W dS  ty.   d}| j|dt|d Y dS w )ze
        Allow deleting dictionary values as attributes
        :param key:
        :return:
        rG   N6DictConfig in read-only mode does not support deletionrn   r8   zAttribute not found: '$KEY')ro   rr   r2   rT   KeyErrorr+   rW   r:   rK   r[   r[   r\   __delattr__y  s   
zDictConfig.__delattr__c                 C   s   |  |}| dr| j|d tdd | dr#| j|d tdd |  r?| ddur?| j|d tt| jj	 dd z	| j
d |= W d S  ty^   d	}| j|d t|d Y d S w )
NrG   r   rn   rl   z3DictConfig in struct mode does not support deletionFz' (DictConfig) does not support deletionr8   zKey not found: '$KEY')r   ro   rr   r2   r-   rk   rp   r$   r7   rC   rT   r   r,   r   r[   r[   r\   __delitem__  s>   


zDictConfig.__delitem__r   c              
   C   sH   z| j ||dW S  ty# } z| j|d|d W Y d}~dS d}~ww )znReturn the value for `key` if `key` is in the dictionary, else
        `default_value` (defaulting to `None`).r   Nrn   )r   r/   rr   )rW   r:   r   r   r[   r[   r\   get  s   zDictConfig.getr   c              	   C   sX   z
| j |d|d}W n ttfy   |tur| Y S  w t|ts$J | j|||dS )NT)r:   throw_on_missing_keyr   r:   rI   r   )
_get_childr+   r,   r   rL   r)   _resolve_with_default)rW   r:   r   r   rH   r[   r[   r\   r     s   
zDictConfig._get_implFvalidate_accessthrow_on_missing_valuer   c                 C   s   z|  |}W n ty   |r|r |rtY d S w |r"| | | jd |}|d u r9|r7td||S |rC| rCtd|S )Nr8   zMissing key zMissing mandatory value: $KEY)	r   r/   r+   ru   rT   r   r,   r   r0   )rW   r:   r   r   r   r   rI   r[   r[   r\   r}     s&   	
zDictConfig._get_nodedefaultc              
   C   s  zq|  dr
td|  drtd|  r)| ddur)tt| jj d| |}| j	|dd}|d urNt
|ts@J | j|||d}| |= |W S |turU|W S | j|d	}||krjtd
|d| dtd
|d ty } z| j|d |d W Y d }~d S d }~ww )NrG   zCannot pop from read-only noderl   z.DictConfig in struct mode does not support popFz" (DictConfig) does not support pop)r:   r   r   )r:   zKey not found: 'z
' (path: 'z')rm   rn   )ro   r2   r-   rk   rp   r$   r7   rC   r   r   rL   r)   r   r   _get_full_keyr,   rU   rr   )rW   r:   r   rH   rI   fullr   r[   r[   r\   pop  s<   


zDictConfig.popc                 C   s@   |   s|  s|  ri  S | jd  }t|tsJ |S r   )r   r   r   r   rT   rL   r   )rW   retr[   r[   r\   r     s
   zDictConfig.keysc              	   C   s   z|  |}W n
 ty   Y dS w z| |}|du s#t|ts#J W n ttfy1   d}Y nw |du r8dS z
| j||d W dS  tyL   Y dS  t	yU   Y dS w )z
        A key is contained in a DictConfig if there is an associated value and
        it is not a mandatory missing value ('???').
        :param key:
        :return:
        FNr   T)
r   r/   r   rL   r)   r   r   r   r.   r0   )rW   r:   rH   r[   r[   r\   __contains__  s,   
zDictConfig.__contains__c                 C   s   t |  S ri   )iterr   rj   r[   r[   r\   __iter__.     zDictConfig.__iter__c                 C   s   t | jdd d S )NT)r   r   )rO   items_exr`   rj   r[   r[   r\   r`   1  s   zDictConfig.itemsc                 C   s*   || v r|  |}|S |}| || |S ri   )r   r   )rW   r:   r   r   r[   r[   r\   
setdefault4  s   
zDictConfig.setdefaultr   r   c                 C   s   g }|   r| jd d tdd |  rtd|  D ](}|r%| | }n| jd | }t|tr5|	 }|d u s=||v rD|
||f q|S )Nz4Cannot iterate a DictConfig object representing Nonern   z#Cannot iterate a missing DictConfigr8   )r   rr   	TypeErrorr   r0   r   rT   rL   r5   _valueappend)rW   r   r   r`   r:   rI   r[   r[   r\   r   <  s&   

zDictConfig.items_exotherc                 C   sl   |d u r| j d d u S t|st|r!t|ddid}t| |S t|tr,t| |S |  r4t|S tS )Nr8   allow_objectsTrF   )	rT   r!   r"   r6   _dict_conf_eqrL   r   r   NotImplemented)rW   r   r[   r[   r\   __eq__V  s   
zDictConfig.__eq__c                 C   s   |  |}|tur| S tS ri   )r   r   )rW   r   r   r[   r[   r\   __ne__b  s   
zDictConfig.__ne__c                 C   s   t t| S ri   )hashrV   rj   r[   r[   r\   __hash__h  r   zDictConfig.__hash__type_or_prototypec                 C   s^   |du rdS t |std| ddlm} ||}|jj}d|j_| | || j_dS )a  
        Retypes a node.
        This should only be used in rare circumstances, where you want to dynamically change
        the runtime structured-type of a DictConfig.
        It will change the type and add the additional fields based on the input class or object
        Nz"Expected structured config class: r   rv   )r"   
ValueErrorry   rw   
structuredr7   rC   
merge_with)rW   r   rw   protorC   r[   r[   r\   _promotek  s   

zDictConfig._promotec              
   C   sD   z| j d }| || W d S  ty! } z|| j d< |d }~ww r   )rT   _set_value_implrU   )rW   rI   r@   previous_contentr   r[   r[   r\   rP     s   

zDictConfig._set_valuec           
      C   s  ddl m}m} |d u ri }t|trJ | jd |d t|ddr-d | jd< d | j_	d S t
|ddr>|| jd< d | j_	d S t|rM|| jd< d | j_	d S i | jd< t|rd | j_	| d}t||d	}|| d
dgd | D ]
\}}| || qrW d    n1 sw   Y  t|| j_	d S t|trt|| j_|| d
dgd |jd  D ]
\}}| || qW d    n1 sw   Y  |jj	| j_	d S t|tr|| d
dgd | D ]
\}}| || qW d    n1 sw   Y  t| j_	d S d| }	t|	)Nr   )MISSINGflag_overrider   Tr   r8   )strict_interpolation_validationr   )r   rl   rG   FzUnsupported value type: )ry   r   r   rL   r5   r   r   rT   r7   rC   r   r   r"   ro   r   r`   r   r   r6   rR   rS   r@   rO   r3   )
rW   rI   r@   r   r   aodatard   re   rK   r[   r[   r\   r     sT   






zDictConfig._set_value_impld1d2c                 C   s   | j d d u }|j d d u }|r|rdS ||krdS t| ts!J t|ts(J t| t|kr2dS |  s:| rB|  | u S | jddD ]\}}||j d vrV dS t| |||sa dS qHdS )Nr8   TFr   )rT   rL   r6   lenr   r   r*   _item_eq)r   r   d1_noned2_nonerd   re   r[   r[   r\   r     s&   zDictConfig._dict_conf_eqc                 C   s|  ddl m} | jj}t|sJ tt|}i }i }|  D ]e}t|t	s'J | 
|}t|ts3J z| }W n tyS } z| j|d|d W Y d}~nd}~ww | rg||vr]q| j|dtdd t|trr||}	n| }	||v r|	||< q|	||< qz	|di |}
W n ty } z| jdd|dt	| d W Y d}~nd}~ww | D ]
\}}	t|
||	 q|
S )	z
        Instantiate an instance of `self._metadata.object_type`.
        This requires `self` to be a structured config.
        Nested subconfigs are converted by calling `OmegaConf.to_object`.
        r   rv   Nrn   zJStructured config of type `$OBJECT_TYPE` has missing mandatory value: $KEYz-Could not create instance of `$OBJECT_TYPE`: )r:   rI   rJ   rK   r[   )ry   rw   r7   rC   r"   setr   r   rL   rV   r   r)   _dereference_noder.   rr   r   r0   r&   	to_objectr   r   r`   setattr)rW   rw   rC   init_field_namesinit_field_itemsnon_init_field_itemsrd   rH   r   re   resultexcr[   r[   r\   
_to_object  s\   




zDictConfig._to_object)rA   r6   ri   )T)TTFF)TN)@rq   
__module____qualname__r'   __annotations__r   r   r(   r)   rV   r   r   r%   r   r   rN   r   rh   rR   rk   ru   r   r   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r}   r   r   r   r   objectr   r   r   r   r`   r   r   r	   r   r   r   r   r   r   rP   r   staticmethodr   r   __classcell__r[   r[   rY   r\   r6   9   s   
 	
3
) 

!	

" 	

$	
0r6   )<rR   enumr   typingr   r   r   r   r   r   r	   r
   r   r   r   r   r   _utilsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   baser%   r&   r'   r(   r)   basecontainerr*   errorsr+   r,   r-   r.   r/   r0   r1   r2   r3   nodesr4   r5   r6   r[   r[   r[   r\   <module>   s    <X,