o
    qoi8                     @   s  d dl Z d dlZd dlmZ d dlmZ d dlmZmZm	Z	m
Z
mZmZmZ d dlmZmZ d dlmZ d dlmZ d dlmZ d d	lmZmZ G d
d deeZdedefddZdededeeef fddZdedef dedeedf de	eef dedefddZdedefddZ dee	eef e
e f defdd Z!d!eee"edef f dedee"edef f fd"d#Z#d$edededefd%d&Z$d'ed(eeef defd)d*Z%ej&d+d,d-d'eded(eeef d.ed/edefd0d1Z'dS )2    N)Enum)dedent)AnyCallableDictListSequenceTupleUnion)	OmegaConfSCMode)is_structured_config)_locate)InstantiationException)ConvertMode
TargetConfc                   @   s$   e Zd ZdZdZdZdZdZdZdS )_Keysz,Special keys in configs used by instantiate._target_	_convert__recursive__args_	_partial_N)	__name__
__module____qualname____doc__TARGETCONVERT	RECURSIVEARGSPARTIAL r!   r!   ]/home/ubuntu/.local/lib/python3.10/site-packages/hydra/_internal/instantiate/_instantiate2.pyr      s    r   xreturnc                 C   s(   t | tr	d| v S t| rd| v S dS )Nr   F)
isinstancedictr   is_dict)r#   r!   r!   r"   
_is_target   s
   

r(   
input_argskwargsc                 C   sP   | tjd}|}t|trt| dkr| }||fS tdt|j d| d)Nr!   r   zUnsupported _args_ type: 'z'. value: '')	popr   r   r%   r   lenr   typer   )r)   r*   config_argsoutput_argsr!   r!   r"   _extract_pos_args#   s   
r1   r   .r   argsfull_keyc           	   
   C   sv  z)t ||\}}|D ]}t|r|d q
| D ]}t|r'|d qW n) tyR } zdt|  ddt|  }|rI|d| 7 }t||d}~ww |rzt	j
| g|R i |W S  ty } zdt|  ddt|  }|r|d| 7 }t||d}~ww z| |i |W S  ty } zdt|  d	t| }|r|d| 7 }t||d}~ww )
z(Call target (type) with args and kwargs.Nz)Error in collecting args and kwargs for 'z':

full_key: zError in creating partial(z, ...) object:zError in call to target 'z':
)r1   r   	is_config_set_parentvalues	Exception_convert_target_to_stringreprr   	functoolspartial)	r   r   r2   r*   r3   argvemsgr!   r!   r"   _call_target2   sV   






	
rB   tc                 C   s   t | r| j d| j S | S )N.)callabler   r   )rC   r!   r!   r"   r:   d   s   r:   dc                 C   s   t | tr,i }|  D ]\}}|dkrt| d }nt |ttfr%t|}|||< q|S t | trJg }| D ]}t |ttfrBt|}|| q5|S J )Nr   )r%   r&   itemsr:   list_prepare_input_dict_or_listappend)rF   reskr?   r!   r!   r"   rI   k   s"   

	
rI   targetc              
   C   s   t | tr,zt| } W n  ty+ } zd|  d}|r"|d| 7 }t||d}~ww t| sId|  dt| j d}|rE|d| 7 }t|| S )z>Resolve target string, type or callable into type or callable.zError locating target 'z;', set env var HYDRA_FULL_ERROR=1 to see chained exception.r5   Nz!Expected a callable target, got 'z' of type 'r+   )r%   strr   r9   r   rE   r.   r   )rM   r3   r@   rA   r!   r!   r"   _resolve_target   s    

rO   configc                 O   s  | du rdS t | tr| jdkrttdt| j dt | ttfr(t	| } t	|}t
| s7t | ttfr@tj| ddid} t| rt| }|jg dg d	d
 ||   |} |rft| |} t|  | tjd}| tjtj}| tjd}t| g|R |||dS t| rt| }|jg dg d	d
 ||   |} t|  |tjd}|tjtj}|tjd}|rtdt| g|R |||dS ttdt| j d)a4  
    :param config: An config object describing what to call and what params to use.
                   In addition to the parameters, the config must contain:
                   _target_ : target class or callable name (str)
                   And may contain:
                   _args_: List-like of positional arguments to pass to the target
                   _recursive_: Construct nested objects as well (bool).
                                True by default.
                                may be overridden via a _recursive_ key in
                                the kwargs
                   _convert_: Conversion strategy
                        none    : Passed objects are DictConfig and ListConfig, default
                        partial : Passed objects are converted to dict and list, with
                                  the exception of Structured Configs (and their fields).
                        object  : Passed objects are converted to dict and list.
                                  Structured Configs are converted to instances of the
                                  backing dataclass / attr class.
                        all     : Passed objects are dicts, lists and primitives without
                                  a trace of OmegaConf containers. Structured configs
                                  are converted to dicts / lists too.
                   _partial_: If True, return functools.partial wrapped method or object
                              False by default. Configure per target.
    :param args: Optional positional parameters pass-through
    :param kwargs: Optional named parameters to override
                   parameters in the config object. Parameters not present
                   in the config objects are being passed as is to the target.
                   IMPORTANT: dataclasses instances in kwargs are interpreted as config
                              and cannot be used as passthrough
    :return: if _target_ is a class name: the instantiated object
             if _target_ is a callable: the return value of the call
    Nz???zn                Config has missing value for key `_target_`, cannot instantiate.
                Config type: z
                Check that the `_target_` key in your dataclass is properly annotated and overridden.
                A common problem is forgetting to annotate _target_ as a string : '_target_: str = ...'allow_objectsTflags)rQ   structreadonly)TFF)rS   r8   F)	recursiveconvertr=   zIThe _partial_ keyword is not compatible with top-level list instantiationz2                Cannot instantiate config of type z.
                Top level config must be an OmegaConf DictConfig/ListConfig object,
                a plain dict/list, or a Structured Config class or instance.)r%   r   r   r   r   r.   r   r&   rH   rI   r   r   
structuredr'   copydeepcopy	_set_flagr7   _get_parentmergeresolver,   r   r   r   r   NONEr    instantiate_nodeis_list)rP   r2   r*   config_copyr   r   r   r!   r!   r"   instantiate   s   "





rc   noderW   c                 C   sf   t | r1|tjkrt j| dd} | S |tjkr#t j| dtjd} | S |tjkr1t j| dtj	d} | S )NTr^   )r^   structured_config_mode)
r   r6   r   ALLto_containerr    r   DICT_CONFIGOBJECTINSTANTIATE)rd   rW   r!   r!   r"   _convert_node  s   

	

rl   TF)rW   rV   r=   rV   r=   c                   s  | d u st | r|  rd S t | s| S t | r?tj| v r%| tj n  tj| v r1| tj ntj| v r=| tj n|}| d }t	t
s]dt }|rY|d| 7 }t|t	|t
sxdt| }| rt|rt|d| 7 }t|t | r fdd| jddD } tjtjtjfv r|S t j|ddid	}||  |S t | r]th d
}	t| rt| tj|}
i }| ddp|}|  D ]#}||	vrt | |r|rq| | }rt| d}t| ||< qt|
||||S  tjks tjtjfv r)| jjd t fv r)i }| ! D ]\}}t| d||< q|S t ji ddid	}| ! D ]\}}t| d||< q6||  | jj|j_ tjkr[t "|S |S J dt| j# )Nz4Instantiation: _recursive_ flag must be a bool, got r5   z2Instantiation: _partial_ flag must be a bool, got c                    s   g | ]	}t | d qS )rW   rV   )r`   ).0itemrm   r!   r"   
<listcomp><  s    z$instantiate_node.<locals>.<listcomp>Tre   rQ   rR   >   r   r   r   r   r   Frm   zUnexpected config type : )$r   r6   _is_noner'   r   r   r   r    _get_full_keyr%   boolr.   	TypeErrorra   _iter_exr   rg   rj   creater7   setr(   rO   getr   keys
is_missingr`   rl   rB   	_metadataobject_typer&   rG   	to_objectr   )rd   rW   rV   r=   r2   r3   rA   rG   lstexclude_keysr   r*   
is_partialkeyvalue
dict_itemscfgr!   rm   r"   r`     s   









r`   )(rY   r<   enumr   textwrapr   typingr   r   r   r   r   r	   r
   	omegaconfr   r   omegaconf._utilsr   hydra._internal.utilsr   hydra.errorsr   hydra.typesr   r   rN   r   rs   r(   r1   rB   r:   rI   r.   rO   rc   rl   r_   r`   r!   r!   r!   r"   <module>   sj   $




2&
s
