o
    =n0j&                     @   s  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mZ d dl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%m&Z& ddl'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z. ddl/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7 erdd	l8m9Z9 G d
d de)eZ:	dde;dee; ddfddZ<de,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	de	ddfddZ?de,de	ddfddZ@dS )    N)ABCabstractmethod)Enum)TYPE_CHECKINGAnyClassVarDictListOptionalTupleUnion   )_DEFAULT_MARKER_	ValueKind_ensure_container
_get_value_is_interpolation_is_missing_value_is_none_is_special_resolve_optionalget_structured_config_dataget_type_hintget_value_kindget_yaml_loaderis_container_annotationis_dict_annotationis_list_annotationis_primitive_dictis_primitive_type_annotationis_structured_configis_tuple_annotationis_union_annotation)Box	ContainerContainerMetadataDictKeyTypeNodeSCMode	UnionNode)ConfigCycleDetectedExceptionConfigTypeErrorInterpolationResolutionErrorKeyValidationErrorMissingMandatoryValueOmegaConfBaseExceptionReadonlyConfigErrorValidationError
DictConfigc                       s   e Zd ZU i Zeeeef  ed< de	e
 def fddZ				dTded	ed
edededee	e ee	e  f fddZefdeeef dededefddZdefddZdefddZdeeef fddZdeeef ddfddZededdfddZdefd d!ZdUd"d#Zd$ee ddfd%d&Zdefd'd(Ze de!j"fd)e#d*ed+ed,ed-e!dedeeeeef ee f fd.d/Z$e dVd2d3Z%e d0ed1eddfd4d5Z&d6ed eeef ee e'ed7f ef ddfd8d9Z(d6ed eeef ee e'ed7f ef ddfd:d;Z)dededdfd<d=Z*ded>ed?eddfd@dAZ+e dBe#dCeeef dDe#dEeeef def
dFdGZ,defdHdIZ-defdJdKZ.edWdededdfdLdMZ/edededdfdNdOZ0defdPdQZ1deeee2df defdRdSZ3  Z4S )XBaseContainer
_resolversparentmetadatac                    s.   |d u st |tstdt j||d d S )Nz Parent type is not omegaconf.Box)r6   r7   )
isinstancer#   r+   super__init__)selfr6   r7   	__class__ ^/home/wildlama/miniconda3/envs/lam_a2e/lib/python3.10/site-packages/omegaconf/basecontainer.pyr:   ;   s   zBaseContainer.__init__TFkeyvalidate_accessvalidate_keythrow_on_missing_valuethrow_on_missing_keyreturnc                 C   sN   | j |||||d}t|tr%t|s%| }t|tr!t|tr#J |}|S )z=Like _get_node, passing through to the nearest concrete Node.)r@   rA   rB   rC   rD   )	_get_noder8   r)   r   _valuer'   )r;   r@   rA   rB   rC   rD   childvaluer>   r>   r?   
_get_child@   s   	zBaseContainer._get_childrI   default_valuec                 C   s6   t |r|tur
|S td| j| ||dd}t|S )zEreturns the value with the specified key, like obj.key and obj['key']z"Missing mandatory value: $FULL_KEYT)r6   r@   rI   Zthrow_on_resolution_failure)r   r   r.   Z_maybe_resolve_interpolationr   )r;   r@   rI   rK   Zresolved_noder>   r>   r?   _resolve_with_defaultV   s   z#BaseContainer._resolve_with_defaultc                 C   s   |   S N)__repr__r;   r>   r>   r?   __str__k      zBaseContainer.__str__c                 C   sF   | j d d u r	dS |  s|  r| j d }d| dS | j d  S )N_contentNone')__dict__r   _is_missingrN   )r;   vr>   r>   r?   rN   n   s   
zBaseContainer.__repr__c                 C   s   t  | j}|dd  t  |d |d< | jj}t|r3t|r't|d _nt|r1t	|d _nJ t
jdk rD| jj}t|rDtd|S )N_flags_cache	_metadataF)      zOSerializing structured configs with `Union` element type requires python >= 3.7)copyrU   poprY   ref_typer   r   r   r   r	   sysversion_infoelement_typer"   r/   )r;   Z	dict_copyr^   ra   r>   r>   r?   __getstate__x   s"   
zBaseContainer.__getstate__dNc                 C   s   ddl m} ddlm}m} t| |r#|d j}|d u r#t}||d _|d j}|d u r3t}||d _|d j	}t
|rX||rJt||f |d _	n||rVt| |d _	nJ d |d< | j| d S )Nr   r2   )is_generic_dictis_generic_listrY   FrX   )	omegaconfr3   Zomegaconf._utilsrd   re   r8   key_typer   ra   r^   r   r   r	   rU   update)r;   rc   r3   rd   re   rg   ra   r^   r>   r>   r?   __setstate__   s(   





zBaseContainer.__setstate__c                 C      d S rM   r>   )r;   r@   r>   r>   r?   __delitem__      zBaseContainer.__delitem__c                 C   s.   |   s|  s|  rdS | jd }t|S )Nr   rR   )r   rV   r   rU   len)r;   contentr>   r>   r?   __len__   s   
zBaseContainer.__len__c                 C   s   t jdd  }| | d S )Nr   )r_   argvmerge_with_dotlist)r;   Z	args_listr>   r>   r?   merge_with_cli   s   zBaseContainer.merge_with_clidotlistc                 C   s   ddl m} d
dd}t|ttfs|  |D ]5}t|ts!|  |d}|dkr/|}d }n|d| }||d d  }tj|t	 d	}|
| || qd S )Nr   )	OmegaConfrE   c                   S   s   t d)Nz/Input list must be a list or a tuple of strings)
ValueErrorr>   r>   r>   r?   fail   rQ   z.BaseContainer.merge_with_dotlist.<locals>.fail=r   )LoaderrE   N)rf   rt   r8   listtuplestrfindyamlloadr   rh   )r;   rs   rt   rv   argidxr@   rI   r>   r>   r?   rq      s    


z BaseContainer.merge_with_dotlistc                 C   s   t | jd dkS )zreturn true if config is emptyrR   r   )rm   rU   rO   r>   r>   r?   is_empty   s   zBaseContainer.is_emptyconfresolvethrow_on_missingenum_to_strstructured_config_modec                    s  ddl m}m}m} dtdtffdddtttf dtf fdd	} 	 r/d S  
 rBr@ jd d td
d n|S sU  rU  }	t|	tsSJ |	S rd  }
t|
tsbJ |
 t |r jjtd fvrxtjkrx S tjkrt jjr  S i }  D ]}||}rt|tr|j }|||< q|S t |rg }tt D ]}||}| | q|S J )Nr   )MISSINGr3   
ListConfigvalrE   c                    s"   |   } rt|tr|j }|S rM   )rG   r8   r   name)r   rI   )r   r>   r?   convert   s   z*BaseContainer._to_content.<locals>.convertr@   c              
      s   z	 j | d}W n ty# } z j| d |d W Y d }~nd }~ww t|ts+J rNz| }W n tyM } z j| d |d W Y d }~nd }~ww t|tr_tj	|d}|S |}|S )N)rC   r@   rI   cause)r   r   r   r   )
rJ   r.   _format_and_raiser8   r'   _dereference_noder,   r$   r4   _to_content)r@   nodeerI   r   r   r   r   r   r   r>   r?   get_node_value   s2   
	z1BaseContainer._to_content.<locals>.get_node_valuezMissing mandatory valuer   )!rf   r   r3   r   r'   r   r   r&   intr   rV   r   r.   r   rG   r8   r}   r   r$   rY   object_typedictr(   ZDICT_CONFIGZINSTANTIATEr    Z
_to_objectkeysr   r   rangerm   append)r   r   r   r   r   r   r3   r   r   interZ_confZretdictr@   rI   Zretlistindexitemr>   r   r?   r      sV   (



zBaseContainer._to_contentdestsrcc                    s  ddl m}m m} t|  sJ t| sJ |jj}t|}|dus&J | s.|	 r>| 
|  t| ||d dS | j|d dtddf fdd	}| ri|  sit|ri|du saJ |}t||d
}| 	 sq|  ry| sy||  | st|ng }|D ]E}|j|dd}	| j|dd}
t|	tsJ |
du st|
tsJ t|	}t|	}|tju }t|
 r|
j|	d t|
tr|
 r|st|	dds||
 |
dur|
	 r|
 }t|tr|| |< | |}
t| jj\}}|
du rt|r|s || ||d| |< | |}
|
durt|
tr4t|	tr*|
|	 q|s3| ||	 qt|	trA| ||	 qt|
|tfsKJ t|	|tfsUJ z)t|
|ru|rlt  |	}|
|
  n|	}| || n|s}|

| W q t!t"fy } z| j#|||d W Y d}~qd}~ww ddl m$} t|r||  ||| |< W d   n	1 sw   Y  q||| |< qt| ||d |jj%}|dusJ |& D ]\}}|dur| '|| qdS )zBmerge src into dest and return a new copy, does not modified inputr   )AnyNoder3   	ValueNodeNr   r^   r   )rI   r   rE   c                    s\   | j j}|turt|ri }nt|st|rg }n|}n
t|  r%i }nJ | | d S rM   )rY   r^   r   r   r   r!   r8   
_set_value)r   rtr   r2   r>   r?   expandG  s   
z(BaseContainer._map_merge.<locals>.expand)r^   r   F)rA   Tr   )r6   r^   is_optionalr   )	open_dict)(rf   r   r3   r   r8   rY   r   r   r   r   r   rG   _update_typesZ_validate_merger$   rV   r    &_create_structured_with_missing_fieldsr{   rF   r'   r   r   r   MANDATORY_MISSING_maybe_dereference_noder   ra   r4   _merge_with__setitem__r)   r\   r1   r0   r   r   flagsitems	_set_flag)r   r   r   r   Zsrc_typeZsrc_ref_typer   Z	src_itemsr@   Zsrc_nodeZ	dest_nodeZ	src_valueZsrc_vkZsrc_node_missingZtarget_noder   etr   r   r   r   flagrI   r>   r2   r?   
_map_merge2  s   













zBaseContainer._map_mergec                 C   sh  ddl m}m}m} t| |sJ t||sJ | r"| d  ns| r3| jj	t
u r2|jj	| j_	nb| r?| |  nV|g |  d}t| jd |jd< t| jj	\}}t|r||||d}|jddD ]}	t|	|rx|||	}	||	 qkn|jddD ]}	||	 q|jd | jd< |jj}
|
d usJ |
 D ]\}}|d ur| || qd S )	Nr   )r3   r   rt   )rn   r6   rY   )r^   r   Fr   rR   )rf   r3   r   rt   r8   r   r   rV   rY   ra   r   r   rG   _get_parentr\   deepcopyrU   r   r    Z_iter_exmerger   r   r   r   )r   r   r3   r   rt   Ztemp_targetr   r   Z	prototyper   r   r   rI   r>   r>   r?   _list_merge  sB   

zBaseContainer._list_mergeothers.c              
   G   sH   z| j |  W d S  ty# } z| jd d |d W Y d }~d S d }~ww )Nr   )r   	Exceptionr   )r;   r   r   r>   r>   r?   
merge_with  s   zBaseContainer.merge_withc                 G   s   ddl m} ddlm} 	 |D ]B}|d u rtdi }| ddu r&ddi}t||d}t| |r=t||r=t	| | qt| |rNt||rNt
| | qtd|   d S )	Nr   r2   r   zCannot merge with a None configZallow_objectsT)r   z'Cannot merge DictConfig with ListConfig)
dictconfigr3   
listconfigr   ru   	_get_flagr   r8   r4   r   r   	TypeErrorZ
_re_parent)r;   r   r3   r   otherZmy_flagsr>   r>   r?   r     s    zBaseContainer._merge_withc              	      s  ddl m}m} t|trMd }|s$t|tr$ | u r$d}|r+t	|}|
d z| }|   | W || n|| w  | dr\tdt|t} }|du sqt|tsqJ t||o{t|| }	dtd	tf fd
d}
|
|}t|\}}dtdtd	dffdd}|	rt|s| | dS t|}|duo| pt||ot|}|r|rt|tr| }jd   | dS |r|rt|st|st|st|rt|} || dS | | dS  || dS )z
        Changes the value of the node key with the desired value. If the node key doesn't
        exist it creates a new one.
        r   )r   r   Zno_deepcopy_set_nodesTNreadonlyz(Cannot change read-only config containerr   rE   c                    sL   t | s
jj}|S  }|d u rjj}|S t|ts J |jj}|S rM   )r    rY   ra   rF   r8   r'   	type_hint)r   r   targetr@   r;   r>   r?   get_target_type_hint2  s   
z:BaseContainer._set_item_impl.<locals>.get_target_type_hint	value_keyc                    sJ   |  d u sJ |}|  ||  t| jjd | jd | < d S )N)r   r   rR   )r   _set_parent_set_key_deep_update_type_hintrY   ra   rU   )r   r   rW   rO   r>   r?   assignA  s   

z,BaseContainer._set_item_impl.<locals>.assignrR   )nodesr   r   r8   r'   r   r#   Z	_get_rootr\   r   r   _keyr   _validate_setr0   rF   r   r   r"   r   Z_has_ref_typer   rG   rU   r   r   r    r   _wrap_value_and_set)r;   r@   rI   r   r   Zdo_deepcopyoldZinput_is_nodeZtarget_node_refZinput_is_typed_vnoder   Ztarget_type_hint_Ztarget_ref_typer   Zspecial_valueZshould_set_valuer>   r   r?   _set_item_impl  sl   







	zBaseContainer._set_item_implr   r   c           	   
   C   sv   ddl m} t|\}}z|||||| d}W n ty1 } z| j|||d W Y d }~nd }~ww || jd |< d S )Nr   )_maybe_wrap)r^   r@   rI   r   r6   r   rR   )Zomegaconf.omegaconfr   r   r1   r   rU   )	r;   r@   r   r   r   r   r^   wrappedr   r>   r>   r?   r   n  s   
z!BaseContainer._wrap_value_and_setc1k1c2k2c                 C   sP  |  |}| |}|d ur|d usJ t|tsJ t|ts"J | r,| r,dS | r6| r6dS | }| }|}|}	|rH| }|rN| }	|rz|rz|d u sZ|	d u r^||kS t|trnt|	trn||	krndS t|}t|	}	||	kS |s|st|}t|}||k}
t|
t	sJ |
S t|}t|	}	||	k}
t|
t	sJ |
S )NTF)
rJ   r8   r'   r   rV   r   r   r$   r   bool)r   r   r   r   Zv1Zv2Zv1_interZv2_interZdv1Zdv2retr>   r>   r?   _item_eq  sJ   

zBaseContainer._item_eqc                 C   s   | j d jdu S )NrY   T)rU   optionalrO   r>   r>   r?   _is_optional  s   zBaseContainer._is_optionalc                 C   s   t | jd S NrR   )r   rU   rO   r>   r>   r?   r     s   zBaseContainer._is_interpolationc                 C   rj   rM   r>   r;   r@   rI   r>   r>   r?   _validate_get  rl   zBaseContainer._validate_getc                 C   rj   rM   r>   r   r>   r>   r?   r     rl   zBaseContainer._validate_setc                 C   s
   | j d S r   )rU   rO   r>   r>   r?   rG     s   
zBaseContainer._valuec                    s  ddl m  ddlm} t|ttttt	t
ttd fsdS dt
dtfddd	td
tdtdttttt
f  dtf
 fdd}|d ur|dkrt| tsNJ || t|ddd\}}|d u r| }|dt|d |}| d ur~||t| t|| }n|dt| t|| }n| }| d u rdS |  }|d usJ t|h}| d ur| }t||v rtd|d|t| |d usJ | d ur||t| t|| }| d us|S )Nr   r   )_select_one xrE   c                 S   s6   | j d ur| j d| j d| j  S | j d| j S )N:)stepstartstop)r   r>   r>   r?   _slice_to_str  s   
z2BaseContainer._get_full_key.<locals>._slice_to_strfull_keyparent_typecur_typer@   c                    s   |d u r| S t |tr|}nt |tr|j}nt|}t |ts$J t| rN| dkrFt| r<d| d|  } | S d| d|  } | S d| d} | S | dkrV|} | S t| rc| |  } | S | d|  } | S )Nr   []z]..)r8   slicer   r   r}   
issubclass)r   r   r   r@   r   r   r>   r?   prepand  s2   




	
z,BaseContainer._get_full_key.<locals>.prepandF)cr@   r   Zthrow_on_type_errorz*Cycle when iterating over parents of key ``)r   r   rf   r   r8   r   r}   r   floatr   r   bytestyper   r
   r   r&   r$   r   r   idr*   add)r;   r@   r   r   curr   r   memor>   r   r?   _get_full_key  sd   $
 

zBaseContainer._get_full_key)TTFFrz   )r   r4   r   r4   rE   NrM   )5__name__
__module____qualname__r5   r   r   r}   r   __annotations__r
   r#   r%   r:   r   r   r'   r	   rJ   r   r&   r   rL   rP   rN   rb   ri   r   rk   ro   rr   rq   r   staticmethodr(   DICTr$   r   r   r   r   r   r   r   r   r   r   r   r   r   rG   r   r   __classcell__r>   r>   r<   r?   r4   8   s   
 




X 	' 
 
b

5&r4   r^   r   rE   r3   c                 C   sX   ddl m}m} t| }| D ]}|| q||}t| \|j_|j_	||j_
|S )Nr   )r   r3   )r   r   r3   r   valuesr   r   rY   r   r^   r   )r^   r   r   r3   Zcfg_datarW   cfgr>   r>   r?   r     s   r   r   c                 C   s6   |d urt |s|| j_| jjtu rt| | d S d S rM   )r   rY   r   r^   r   r   r   r>   r>   r?   r   -  s
   r   r   c                 C   s2  ddl m}m} ddlm}m} |tu rdS t| | t|\}}|| j	_
|| j	_t|rMt| |rM||}|| j	_t| sMtt| D ]}	t| |	| qDt|rt| |r||\}
}|
| j	_|| j	_t| s| D ],}|
turt||
std|dt|j dd	|
j d
 t| || qjdS dS dS dS )z@Ensure node is compatible with type_hint, mutating if necessary.r   )r3   r   r   )get_dict_key_value_typesget_list_element_typeNzKey  (z) is incompatiblez with key type hint 'rT   )rf   r3   r   _utilsr  r	  r   _shallow_validate_type_hintr   rY   r^   r   r   r8   ra   r   r   rm   _deep_update_subnoder   rg   r-   r   r   )r   r   r3   r   r  r	  Znew_is_optionalZnew_ref_typeZnew_element_typeiZnew_key_typer@   r>   r>   r?   r   5  s<   
r   r@   value_type_hintc                 C   sX   |  |}t|tsJ t|r%| || | |  |}t|ts%J t|| dS )zVGet node[key] and ensure it is compatible with value_type_hint, mutating if necessary.N)rF   r8   r'   r   r   rG   r   )r   r@   r  Zsubnoder>   r>   r?   r  Y  s   

r  c           	      C   s|  ddl m}m}m} t|\}}t| }|  r5|s3t| }td|dt	|j
 dd|j
 d dS |tjtjfv r?dS |tjkrt|rmt| |rm|  }t||sktd|dt	|j
 dd|j
 d dS t|rxt| |rxdS t|rt| |rdS t|rt| |rdS t| |r|  }td|dt	|j
 dd| d tdt	| j
 d	d
| d J )zMError if node's type, content and metadata are not compatible with type_hint.r   )r3   r   r   zValue r
  )z! is incompatible with type hint 'rT   Nz' is incompatiblez with type hint ')rf   r3   r   r   r   r   r   r   r1   r   r   r   r   ZINTERPOLATIONZVALUEr   r8   rG   r    r   r   )	r   r   r3   r   r   r   r^   ZvkrI   r>   r>   r?   r  f  sV   




r  rM   )Ar\   r_   abcr   r   enumr   typingr   r   r   r   r	   r
   r   r   r   r  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   baser#   r$   r%   r&   r'   r(   r)   errorsr*   r+   r,   r-   r.   r/   r0   r1   r   r3   r4   r   r   r   r   r  r  r>   r>   r>   r?   <module>   s:    (\$(	     k
$