o
    wi&                     @   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__ T/home/ubuntu/sommelier/.venv/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   throw_on_resolution_failure)r   r   r.   _maybe_resolve_interpolationr   )r;   r@   rI   rK   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_missingrQ   )r;   vr>   r>   r?   rQ   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)copyrX   popr\   ref_typer   r   r   r   r	   sysversion_infoelement_typer"   r/   )r;   	dict_copyra   rd   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_listr\   Fr[   )	omegaconfr3   omegaconf._utilsrh   ri   r8   key_typer   rd   ra   r   r   r	   rX   update)r;   rg   r3   rh   ri   rl   rd   ra   r>   r>   r?   __setstate__   s(   





zBaseContainer.__setstate__c                 C      d S rP   r>   )r;   r@   r>   r>   r?   __delitem__      zBaseContainer.__delitem__c                 C   s.   |   s|  s|  rdS | jd }t|S )Nr   rU   )r   rY   r   rX   len)r;   contentr>   r>   r?   __len__   s   
zBaseContainer.__len__c                 C   s   t jdd  }| | d S )Nr   )rb   argvmerge_with_dotlist)r;   	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   rT   z.BaseContainer.merge_with_dotlist.<locals>.fail=r   )LoaderrE   N)rj   rz   r8   listtuplestrfindyamlloadr   rm   )r;   ry   rz   r|   argidxr@   rI   r>   r>   r?   rv      s    


z BaseContainer.merge_with_dotlistc                 C   s   t | jd dkS )zreturn true if config is emptyrU   r   )rr   rX   rR   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 rP   )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   )!rj   r   r3   r   r'   r   r   r&   intr   rY   r   r.   r   rG   r8   r   r   r$   r\   object_typedictr(   DICT_CONFIGINSTANTIATEr    
_to_objectkeysr   r   rangerr   append)r   r   r   r   r   r   r3   r   r   inter_confretdictr@   rI   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   ra   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 rP   )r\   ra   r   r   r   r!   r8   
_set_value)r   rtr   r2   r>   r?   expandG  s   
z(BaseContainer._map_merge.<locals>.expand)ra   r   F)rA   Tr   )r6   ra   is_optionalr   )	open_dict)(rj   r   r3   r   r8   r\   r   r   r   r   r   rG   _update_types_validate_merger$   rY   r    &_create_structured_with_missing_fieldsr   rF   r'   r   r   r   MANDATORY_MISSING_maybe_dereference_noder   rd   r4   _merge_with__setitem__r)   r_   r1   r0   r   r   flagsitems	_set_flag)r   r   r   r   src_typesrc_ref_typer   	src_itemsr@   src_node	dest_node	src_valuesrc_vksrc_node_missing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   rz   )rs   r6   r\   )ra   r   Fr   rU   )rj   r3   r   rz   r8   r   r   rY   r\   rd   r   r   rG   _get_parentr_   deepcopyrX   r   r    _iter_exmerger   r   r   r   )r   r   r3   r   rz   temp_targetr   r   	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 configallow_objectsT)r   z'Cannot merge DictConfig with ListConfig)
dictconfigr3   
listconfigr   r{   	_get_flagr   r8   r4   r   r   	TypeError
_re_parent)r;   r   r3   r   other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   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 rP   )r    r\   rd   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   rU   )r   _set_parent_set_key_deep_update_type_hintr\   rd   rX   )r   r   rZ   rR   r>   r?   assignA  s   

z,BaseContainer._set_item_impl.<locals>.assignrU   )nodesr   r   r8   r'   r   r#   	_get_rootr_   r   r   _keyr   _validate_setr0   rF   r   r   r"   r   _has_ref_typer   rG   rX   r   r   r    r   _wrap_value_and_set)r;   r@   rI   r   r   do_deepcopyoldinput_is_nodetarget_node_refinput_is_typed_vnoder   target_type_hint_target_ref_typer   special_value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)ra   r@   rI   r   r6   r   rU   )omegaconf.omegaconfr   r   r1   r   rX   )	r;   r@   r   r   r   r   ra   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   rY   r   r   r$   r   bool)r   r   r  r  v1v2v1_interv2_interdv1dv2retr>   r>   r?   _item_eq  sJ   

zBaseContainer._item_eqc                 C   s   | j d jdu S )Nr\   T)rX   optionalrR   r>   r>   r?   _is_optional  s   zBaseContainer._is_optionalc                 C   s   t | jd S NrU   )r   rX   rR   r>   r>   r?   r     s   zBaseContainer._is_interpolationc                 C   ro   rP   r>   r;   r@   rI   r>   r>   r?   _validate_get  rq   zBaseContainer._validate_getc                 C   ro   rP   r>   r  r>   r>   r?   r     rq   zBaseContainer._validate_setc                 C   s
   | j d S r  )rX   rR   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   throw_on_type_errorz*Cycle when iterating over parents of key ``)r   r   rj   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)TTFFr   )r   r4   r   r4   rE   NrP   )5__name__
__module____qualname__r5   r   r   r   r   __annotations__r
   r#   r%   r:   r  r   r'   r	   rJ   r   r&   r   rO   rS   rQ   rf   rn   r   rp   rt   rx   rv   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   ra   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   r\   r  ra   r   )ra   r   r   r3   cfg_datarZ   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 rP   )r   r\   r   ra   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 'rW   )rj   r3   r   _utilsr8  r9  r   _shallow_validate_type_hintr   r\   ra   r  r   r8   rd   r   r   rr   _deep_update_subnoder   rl   r-   r(  r.  )r   r   r3   r   r8  r9  new_is_optionalnew_ref_typenew_element_typei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@   rC  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 'rW   Nz' is incompatiblez with type hint ')rj   r3   r   r   r   r   r   r   r1   r(  r.  r   r   INTERPOLATIONVALUEr   r8   rG   r    r   r   )	r   r   r3   r   r   r   ra   vkrI   r>   r>   r?   r<  f  sV   




r<  rP   )Ar_   rb   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
$