o
    =n0jGD                     @   sH  d dl Z d dlZd dlZd dl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 d dlmZmZmZmZmZmZ d dlmZmZmZmZ d dlmZmZmZ G d	d
 d
eZG dd deZ G dd deZ!G dd deZ"G dd deZ#G dd deZ$G dd deZ%G dd deZ&G dd deZ'G dd deZ(dS )    N)abstractmethod)Enum)Path)AnyDictOptionalTypeUnion)	ValueKind_is_interpolationget_type_ofget_value_kindis_primitive_containertype_str)BoxDictKeyTypeMetadataNode)ReadonlyConfigErrorUnsupportedValueTypeValidationErrorc                       sJ  e Zd ZU eed< dee dedef fddZdefdd	Z	d*dedee
eef  dd
fddZdedd
fddZdedefddZededefddZdefddZdefddZdedefddZdedefddZdefddZded e
eef dd
fd!d"Zdefd#d$Zdefd%d&Zd'eeeef  defd(d)Z  ZS )+	ValueNode_valparentvaluemetadatac                    sT   ddl m} t j||d ||  | | W d    d S 1 s#w   Y  d S )Nr   )
read_write)r   r   )	omegaconfr   super__init__
_set_value)selfr   r   r   r   	__class__ V/home/wildlama/miniconda3/envs/lam_a2e/lib/python3.10/site-packages/omegaconf/nodes.pyr      s
   
"zValueNode.__init__returnc                 C   s   | j S N)r   r!   r$   r$   r%   _value   s   zValueNode._valueNflagsc                 C   sN   |  dr	tdt|trt|ddtjtjfv r|| _d S | 	|| _d S )Nreadonly)Cannot set value of read-only config nodeT)Zstrict_interpolation_validation)
	_get_flagr   
isinstancestrr   r
   ZINTERPOLATIONZMANDATORY_MISSINGr   validate_and_convertr!   r   r*   r$   r$   r%   r    "   s   

zValueNode._set_valuec                 C   sB   | j j}t|trt||urt| j j}td| dd S d S NzEValue '$VALUE' of type '$VALUE_TYPE' is incompatible with type hint '')	_metadataref_typer.   typer   	type_hintr   r!   r   r5   r7   r$   r$   r%   _strict_validate_type0   s   
zValueNode._strict_validate_typec                 C   s\   |du r|   r
dS t| jj}td| d| d| ddu r)| | |S | |S )z
        Validates input and converts to canonical form
        :param value: input value
        :return: converted value ("100" may be converted to 100 for example)
        NzIncompatible value 'z' for field of type 'r3   convertF)_is_optionalr   r4   r5   r   r-   r9   _validate_and_convert_impl)r!   r   Zref_type_strr$   r$   r%   r0   8   s   

zValueNode.validate_and_convertc                 C   s   d S r'   r$   r!   r   r$   r$   r%   r<   N      z$ValueNode._validate_and_convert_implc                 C   
   t | jS r'   )r/   r   r(   r$   r$   r%   __str__R      
zValueNode.__str__c                 C   s   t | dr
t| jS dS )Nr   Z__INVALID__)hasattrreprr   r(   r$   r$   r%   __repr__U   s   zValueNode.__repr__otherc                 C   s    t |tr| j|jkS | j|kS r'   )r.   AnyNoder   )r!   rE   r$   r$   r%   __eq__X   s   

zValueNode.__eq__c                 C   s   |  |}|tusJ | S r'   )rG   NotImplemented)r!   rE   xr$   r$   r%   __ne__^   s   
zValueNode.__ne__c                 C   r?   r'   hashr   r(   r$   r$   r%   __hash__c   rA   zValueNode.__hash__resmemoc                 C   s2   t j| j|d|jd< | j|jd< | j|jd< d S )N)rO   r4   r   _parent)copydeepcopyr4   __dict__r   rP   )r!   rN   rO   r$   r$   r%   _deepcopy_implf   s   zValueNode._deepcopy_implc                 C   s   | j jS r'   )r4   optionalr(   r$   r$   r%   r;   n   s   zValueNode._is_optionalc                 C   s   t |  S r'   )r   r)   r(   r$   r$   r%   r   q   s   zValueNode._is_interpolationkeyc                 C   s:   |   }|d u r| jjd u rdS t| jjS || jjS )N )Z_get_parentr4   rV   r/   _get_full_key)r!   rV   r   r$   r$   r%   rX   t   s   zValueNode._get_full_keyr'   )__name__
__module____qualname__r   __annotations__r   r   r   r   r)   r   r/   boolr    r9   r0   r   r<   r@   rD   rG   rJ   intrM   rT   r;   r   r	   r   rX   __classcell__r$   r$   r"   r%   r      s$   
 $&r   c                       st   e Zd Z				ddededee deeeef  f fddZ	dedefd	d
Z
deeef dd fddZ  ZS )rF   Nr   rV   r   r*   c              
      s$   t  j||ttd |d|dd d S )NTr5   object_typerV   rU   r*   r   r   r   )r   r   r   r   r!   r   rV   r   r*   r"   r$   r%   r      s   

zAnyNode.__init__r&   c                 C   s@   ddl m} | ddur||st|}td|j d|S )N   )is_primitive_type_annotationZallow_objectsTzValue 'z#' is not a supported primitive type)Z_utilsre   r-   r   r   rY   )r!   r   re   tr$   r$   r%   r<      s   z"AnyNode._validate_and_convert_implrO   c                 C      t  }| || |S r'   )rF   rT   r!   rO   rN   r$   r$   r%   __deepcopy__      zAnyNode.__deepcopy__)NNNN)rY   rZ   r[   r   r   r   r   r/   r]   r   r<   r^   ri   r_   r$   r$   r"   r%   rF      s     "rF   c                       sz   e Zd Z					ddededee dedeeeef  f
 fdd	Z	ded
efddZ
deeef d
d fddZ  ZS )
StringNodeNTr   rV   r   is_optionalr*   c              
      $   t  j||t||tt|dd d S NrV   rU   r5   ra   r*   rb   )r   r   r   r/   r!   r   rV   r   rl   r*   r"   r$   r%   r         
zStringNode.__init__r&   c                 C   s8   ddl m} ||st|st|trtdt|S )Nr   )	OmegaConfz0Cannot convert '$VALUE_TYPE' to string: '$VALUE')r   rr   Z	is_configr   r.   bytesr   r/   )r!   r   rr   r$   r$   r%   r<      s   z%StringNode._validate_and_convert_implrO   c                 C   rg   r'   )rk   rT   rh   r$   r$   r%   ri      rj   zStringNode.__deepcopy__NNNTNrY   rZ   r[   r   r   r   r]   r   r/   r   r<   r^   ri   r_   r$   r$   r"   r%   rk      s&    "rk   c                       s   e Zd Z					ddededee dedeeeef  f
 fdd	Z	ded
dfddZ
ded
efddZdeeef d
d fddZ  ZS )PathNodeNTr   rV   r   rl   r*   c              
      rm   rn   )r   r   r   r   rp   r"   r$   r%   r      rq   zPathNode.__init__r&   c                 C   s   t |ts	tdd S )NzIValue '$VALUE' of type '$VALUE_TYPE' is not an instance of 'pathlib.Path')r.   r   r   r=   r$   r$   r%   r9      s
   
zPathNode._strict_validate_typec                 C   s   t |ttfstdt|S )NzCValue '$VALUE' of type '$VALUE_TYPE' could not be converted to Path)r.   r/   r   r   r=   r$   r$   r%   r<      s
   z#PathNode._validate_and_convert_implrO   c                 C   rg   r'   )rv   rT   rh   r$   r$   r%   ri      rj   zPathNode.__deepcopy__rt   )rY   rZ   r[   r   r   r   r]   r   r/   r   r9   r   r<   r^   ri   r_   r$   r$   r"   r%   rv      s(    "rv   c                       sz   e Zd Z					ddededee dedeeeef  f
 fdd	Z	ded
e
fddZdee
ef d
d fddZ  ZS )IntegerNodeNTr   rV   r   rl   r*   c              
      rm   rn   )r   r   r   r^   rp   r"   r$   r%   r      rq   zIntegerNode.__init__r&   c                 C   s<   zt |ttfv rt|}W |S t  ty   tdw )NzFValue '$VALUE' of type '$VALUE_TYPE' could not be converted to Integer)r6   r/   r^   
ValueErrorr   )r!   r   valr$   r$   r%   r<   	  s   
z&IntegerNode._validate_and_convert_implrO   c                 C   rg   r'   )rw   rT   rh   r$   r$   r%   ri     rj   zIntegerNode.__deepcopy__rt   )rY   rZ   r[   r   r   r   r]   r   r/   r   r^   r<   ri   r_   r$   r$   r"   r%   rw      s&    "rw   c                       sz   e Zd Z					ddededee dedeeeef  f
 fdd	Z	ded
e
fddZdeeef d
d fddZ  ZS )	BytesNodeNTr   rV   r   rl   r*   c              
      rm   rn   )r   r   r   rs   rp   r"   r$   r%   r     rq   zBytesNode.__init__r&   c                 C   s   t |ts	td|S )Nz;Value '$VALUE' of type '$VALUE_TYPE' is not of type 'bytes')r.   rs   r   r=   r$   r$   r%   r<   0  s
   
z$BytesNode._validate_and_convert_implrO   c                 C   rg   r'   )rz   rT   rh   r$   r$   r%   ri   7  rj   zBytesNode.__deepcopy__rt   )rY   rZ   r[   r   r   r   r]   r   r/   r   rs   r<   r^   ri   r_   r$   r$   r"   r%   rz     s&    "rz   c                       s   e Zd Z					ddededee dedeeeef  f
 fdd	Z	ded
e
fddZded
efddZd
efddZdeeef d
d fddZ  ZS )	FloatNodeNTr   rV   r   rl   r*   c              
      rm   rn   )r   r   r   floatrp   r"   r$   r%   r   >  rq   zFloatNode.__init__r&   c                 C   s:   zt |tttfv rt|W S t  ty   tdw )NzDValue '$VALUE' of type '$VALUE_TYPE' could not be converted to Float)r6   r|   r/   r^   rx   r   r=   r$   r$   r%   r<   R  s   
z$FloatNode._validate_and_convert_implrE   c                 C   s   t |tr	|j}n|}| jd u r|d u rdS | jd u r!|d ur!dS | jd ur,|d u r,dS t | jtr8t| jnd}t |trDt|nd}| j|kpN|oN|S )NTF)r.   r   r   r|   mathisnan)r!   rE   Z	other_valZnan1Znan2r$   r$   r%   rG   ]  s   
zFloatNode.__eq__c                 C   r?   r'   rK   r(   r$   r$   r%   rM   l  rA   zFloatNode.__hash__rO   c                 C   rg   r'   )r{   rT   rh   r$   r$   r%   ri   o  rj   zFloatNode.__deepcopy__rt   )rY   rZ   r[   r   r   r   r]   r   r/   r   r|   r<   rG   r^   rM   ri   r_   r$   r$   r"   r%   r{   =  s*    "r{   c                       sz   e Zd Z					ddededee dedeeeef  f
 fdd	Z	ded
efddZ
deeef d
d fddZ  ZS )BooleanNodeNTr   rV   r   rl   r*   c              
      rm   rn   )r   r   r   r]   rp   r"   r$   r%   r   v  rq   zBooleanNode.__init__r&   c              
   C   s   t |tr|S t |tr|dkS t |trPz| t|W S  tyO } z&| dv r2W Y d }~dS | dv r?W Y d }~dS tdt	
 d |d }~ww td)Nr   )yesyontrueT)nonofffalseFz5Value '$VALUE' is not a valid bool (type $VALUE_TYPE)   )r.   r]   r^   r/   r<   rx   lowerr   with_tracebacksysexc_info)r!   r   er$   r$   r%   r<     s,   



z&BooleanNode._validate_and_convert_implrO   c                 C   rg   r'   )r   rT   rh   r$   r$   r%   ri     rj   zBooleanNode.__deepcopy__rt   ru   r$   r$   r"   r%   r   u  s&    "r   c                       s   e Zd ZdZ					ddee deeeef  de	dee
 ded	eeeef  f fd
dZde	ddfddZde	defddZedee de	defddZdeee	f dd fddZ  ZS )EnumNodeaQ  
    NOTE: EnumNode is serialized to yaml as a string ("Color.BLUE"), not as a fully qualified yaml type.
    this means serialization to YAML of a typed config (with EnumNode) will not retain the type of the Enum
    when loaded.
    This is intentional, Please open an issue against OmegaConf if you wish to discuss this decision.
    NT	enum_typer   rV   r   rl   r*   c           	   
      st   t |tr
t|tstd| di | _|| _|j D ]
\}}|j	| j|< qt
 j||t|||||dd d S )Nz.EnumNode can only operate on Enum subclasses ()ro   rb   )r.   r6   
issubclassr   r   fieldsr   __members__itemsr   r   r   r   )	r!   r   r   rV   r   rl   r*   nameZconstantr"   r$   r%   r     s&   	

zEnumNode.__init__r&   c                 C   s2   | j j}t||st| j j}td| dd S r2   )r4   r5   r.   r   r7   r   r8   r$   r$   r%   r9     s   

zEnumNode._strict_validate_typec                 C   s   | j | j|dS )N)r   r   )validate_and_convert_to_enumr   r=   r$   r$   r%   r<     s   z#EnumNode._validate_and_convert_implc              
   C   s   t |ttfst || std|  t || r|S z2t |ttfr$tt |tr.| |W S t |trK| j d}||rF|t	|d  }| | W S J  tt
fyw } zddd | j D }td| dt d	 |d }~ww )
Nz4Value $VALUE ($VALUE_TYPE) is not a valid input for .Fz, c                 S   s   g | ]}|qS r$   r$   ).0rI   r$   r$   r%   
<listcomp>  s    z9EnumNode.validate_and_convert_to_enum.<locals>.<listcomp>z)Invalid value '$VALUE', expected one of []r   )r.   r/   r^   r   r|   r]   rx   rY   
startswithlenKeyErrorjoinr   keysr   r   r   )r   r   prefixr   validr$   r$   r%   r     s4   






z%EnumNode.validate_and_convert_to_enumrO   c                 C   s   t | jd}| || |S )N)r   )r   r   rT   rh   r$   r$   r%   ri     s   zEnumNode.__deepcopy__rt   )rY   rZ   r[   __doc__r   r   r   r	   r/   r   r   r]   r   r   r9   r<   staticmethodr   r^   ri   r_   r$   r$   r"   r%   r     s2    
"r   c                       s   e Zd ZdZ			ddededee deeee	f  f fddZ
ddedeeee	f  d	dfd
dZded	efddZdeeef d	d fddZd	e	fddZ  ZS )InterpolationResultNodez@
    Special node type, used to wrap interpolation results.
    Nr   rV   r   r*   c              
      sD   t  j||ttd |d|dd |d u sd|vr | dd d S d S )NTr`   rb   r+   )r   r   r   r   Z	_set_flagrc   r"   r$   r%   r      s   
z InterpolationResultNode.__init__r&   c                 C   s"   |  dr	td| || _d S )Nr+   r,   )r-   r   r0   r   r1   r$   r$   r%   r      s   
z"InterpolationResultNode._set_valuec                 C   s   |S r'   r$   r=   r$   r$   r%   r<     r>   z2InterpolationResultNode._validate_and_convert_implrO   c                 C   s   t r'   )NotImplementedError)r!   rO   r$   r$   r%   ri     r>   z$InterpolationResultNode.__deepcopy__c                 C   s   dS )NFr$   r(   r$   r$   r%   r     r>   z)InterpolationResultNode._is_interpolation)NNNr'   )rY   rZ   r[   r   r   r   r   r   r/   r]   r   r    r<   r^   ri   r   r_   r$   r$   r"   r%   r     s$    $r   ))rQ   r}   r   abcr   enumr   pathlibr   typingr   r   r   r   r	   Zomegaconf._utilsr
   r   r   r   r   r   Zomegaconf.baser   r   r   r   Zomegaconf.errorsr   r   r   r   rF   rk   rv   rw   rz   r{   r   r   r   r$   r$   r$   r%   <module>   s(     j&&)'"81U