o
    =n0jl                     @   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#   Z	_set_flagcopydeepcopyr:   r<   rB   r>   r=   __dict__	Exceptionr   str)selfr9   r:   r;   r<   r=   r>   r?   r@   rD   ex	__class__ [/home/wildlama/miniconda3/envs/lam_a2e/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\   Z_flags_cacher8   Z_parent)r6   rQ   rR   rS   rL   rO   items)	rV   r\   resZsrc_contentZcontent_copykvZ
old_parentvcrZ   rZ   r[   __deepcopy__q   s*   







zDictConfig.__deepcopy__c                 C   s
   t  | S N)rQ   rV   rZ   rZ   r[   rQ      s   
zDictConfig.copyc                 C   s   | j jtd fvot| j j S rc   )r7   rC   r   r    rd   rZ   rZ   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   )
re   	_get_flagrS   _get_node_flagr7   rC   rO   __name___format_and_raiser+   )rV   r:   rI   Zis_typedZ	is_structrK   rZ   rZ   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__)	omegaconfro   r   r   ZINTERPOLATIONr   _validate_non_optionalZMANDATORY_MISSING	_get_noderL   r6   r7   r<   r   rO   r)   get_typer    r   r3   r$   getattr
issubclass_raise_invalid_value)rV   r:   rI   ro   ZvktargetZtarget_has_ref_typeZis_valid_targettarget_type
value_typeoriginrZ   rZ   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   rn   r:   rI   zMerge error:  is not a subclass of 	. value: )rq   ro   rr   rt   _is_missingr7   rC   rO   r|   r   r"   r   r    rv   r$   r3   )	rV   rI   ro   destsrcZdest_obj_typeZsrc_obj_typeZvalidation_errorrK   rZ   rZ   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)resolveZthrow_on_resolution_failurez!field '$FULL_KEY' is not Optionalrh   )
r   rs   rL   r)   Z_is_optionalr   r7   r>   rl   r3   )rV   r:   rI   childZfield_is_optional_rZ   rZ   r[   rr      s$   



z!DictConfig._validate_non_optionalrz   ry   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   )rV   rI   rz   ry   rK   rZ   rZ   r[   rw     s   zDictConfig._raise_invalid_valuec                 C   s   |  | jj|S rc   )_s_validate_and_normalize_keyr7   r=   )rV   r:   rZ   rZ   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 rZ   rZ   ).0xrZ   rZ   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/   boolrU   bytesintfloatrk   rv   r   r4   Zvalidate_and_convert_to_enumr3   join__members__keys)rV   r=   r:   tvalidrZ   rZ   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   rh   )_DictConfig__set_implAttributeErrorrl   r,   rT   rV   r:   rI   erZ   rZ   r[   __setitem__2  s   zDictConfig.__setitem__c                 C   s   |  |}| || d S rc   )r   Z_set_item_impl)rV   r:   rI   rZ   rZ   r[   Z
__set_impl<  s   
zDictConfig.__set_implc                 C   s"   |   s|  r
g S | jd  S Nr8   )r   r   rS   r   rd   rZ   rZ   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:
        rh   FN)r   rT   rL   r1   _initializedrl   r   rZ   rZ   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:
        rk   F)r:   default_valuevalidate_keyNr:   rI   rJ   r   rh   )r   	_get_implr   r,   rl   r+   rT   rV   r:   r   rZ   rZ   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   rh   )r   r   r   rl   r,   rT   r   rZ   rZ   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 deletionrh   r8   zAttribute not found: '$KEY')ri   rl   r2   rS   KeyErrorr+   rV   r:   rK   rZ   rZ   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   rh   rf   z3DictConfig in struct mode does not support deletionFz' (DictConfig) does not support deletionr8   zKey not found: '$KEY')r   ri   rl   r2   r-   re   rj   r$   r7   rC   rS   r   r,   r   rZ   rZ   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   Nrh   )r   r/   rl   )rV   r:   r   r   rZ   rZ   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)rV   r:   r   r   rH   rZ   rZ   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+   rm   rS   r   r,   r   r0   )rV   r:   r   r   r   r   rI   rZ   rZ   r[   rs     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 noderf   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')rg   rh   )ri   r2   r-   re   rj   r$   r7   rC   r   r   rL   r)   r   r   Z_get_full_keyr,   rT   rl   )rV   r:   r   rH   rI   fullr   rZ   rZ   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   rS   rL   r   )rV   retrZ   rZ   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   )rV   r:   rH   rZ   rZ   r[   __contains__  s,   
zDictConfig.__contains__c                 C   s   t |  S rc   )iterr   rd   rZ   rZ   r[   __iter__.     zDictConfig.__iter__c                 C   s   t | jdd d S )NT)r   r   )rO   items_exr]   rd   rZ   rZ   r[   r]   1  s   zDictConfig.itemsc                 C   s*   || v r|  |}|S |}| || |S rc   )r   r   )rV   r:   r   r   rZ   rZ   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 Nonerh   z#Cannot iterate a missing DictConfigr8   )r   rl   	TypeErrorr   r0   r   rS   rL   r5   _valueappend)rV   r   r   r]   r:   rI   rZ   rZ   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   )	rS   r!   r"   r6   _dict_conf_eqrL   r   r   NotImplemented)rV   r   rZ   rZ   r[   __eq__V  s   
zDictConfig.__eq__c                 C   s   |  |}|tur| S tS rc   )r   r   )rV   r   r   rZ   rZ   r[   __ne__b  s   
zDictConfig.__ne__c                 C   s   t t| S rc   )hashrU   rd   rZ   rZ   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   rn   )r"   
ValueErrorrq   ro   Z
structuredr7   rC   Z
merge_with)rV   r   ro   protorC   rZ   rZ   r[   _promotek  s   

zDictConfig._promotec              
   C   sD   z| j d }| || W d S  ty! } z|| j d< |d }~ww r   )rS   _set_value_implrT   )rV   rI   r@   Zprevious_contentr   rZ   rZ   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   )Zstrict_interpolation_validationr   )r   rf   rG   FzUnsupported value type: )rq   r   r   rL   r5   r|   r   rS   r7   rC   r   r   r"   ri   r   r]   r   r   r6   rQ   rR   r@   rO   r3   )
rV   rI   r@   r   r   Zaodatar_   r`   rK   rZ   rZ   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   )rS   rL   r6   lenr   r   r*   Z_item_eq)r   r   Zd1_noneZd2_noner_   r`   rZ   rZ   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   rn   Nrh   zJStructured config of type `$OBJECT_TYPE` has missing mandatory value: $KEYz-Could not create instance of `$OBJECT_TYPE`: )r:   rI   rJ   rK   rZ   )rq   ro   r7   rC   r"   setr   r   rL   rU   r   r)   Z_dereference_noder.   rl   r   r0   r&   Z	to_objectr   r   r]   setattr)rV   ro   rC   Zinit_field_namesZinit_field_itemsZnon_init_field_itemsr_   rH   r   r`   resultexcrZ   rZ   r[   
_to_object  s\   




zDictConfig._to_object)rA   r6   rc   )T)TTFF)TN)@rk   
__module____qualname__r'   __annotations__r   r   r(   r)   rU   r   r   r%   r   r   rN   r   rb   rQ   re   rm   r|   r   rr   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   rs   r   r   r   r   objectr   r   r   r   r]   r   r   r	   r   r   r   r   r   r   rP   r   staticmethodr   r   __classcell__rZ   rZ   rX   r[   r6   9   s   
 	
3
) 

!	

" 	

$	
0r6   )<rQ   enumr   typingr   r   r   r   r   r   r	   r
   r   r   r   r   r   Z_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)   Zbasecontainerr*   errorsr+   r,   r-   r.   r/   r0   r1   r2   r3   nodesr4   r5   r6   rZ   rZ   rZ   r[   <module>   s    <X,