U
    9%e*F                     @   s^  d dl Z d dlZd dlZd dlZd dlmZmZmZm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 ddlmZ ddlmZ dd	lmZmZ dd
lmZmZ ddlmZm Z  ddl!m"Z" ddl#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(e%eee ej)f dddZ*ee ej)e%dddZ+dd Z,dS )    N)AnyDictListTuple)_pytree   )	variables)create_call_functioncreate_instruction)	skip_code)unimplemented)
AttrSourceGlobalWeakRefSource)global_key_nameistensor   )MutableLocalVariableTrackerConstantVariable)TensorVariablec                       s   e Zd Zd fdd	Zdd Zdd Zdd	 Zd
d ZedddZ	dddd fddZ
dd Zdd ZeedddZedd Zedd Z  ZS ) ConstDictVariableNc                    s@   t  jf d|i| | jt| d  || _|| _d S )Nrecursively_containsguards)	super__init__r   updater   	propagatevaluesitemsuser_cls)selfr   r    r   kwargs	__class__ \/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/torch/_dynamo/variables/dicts.pyr      s    zConstDictVariable.__init__c                 C   s   dd | j   D S )Nc                 S   s   i | ]\}}||  qS r%   )as_proxy.0kvr%   r%   r&   
<dictcomp>!   s      z.ConstDictVariable.as_proxy.<locals>.<dictcomp>r   r!   r%   r%   r&   r'       s    zConstDictVariable.as_proxyc                 C   s   dd | j   D S )Nc                 S   s   i | ]\}}||  qS r%   )as_python_constantr(   r%   r%   r&   r,   $   s      z8ConstDictVariable.as_python_constant.<locals>.<dictcomp>r-   r.   r%   r%   r&   r/   #   s    z$ConstDictVariable.as_python_constantc                 C   s   | j S N)r    r.   r%   r%   r&   python_type&   s    zConstDictVariable.python_typec                 C   s   | j tjkr(||td|dg | j D ]V}t|rj|	|j
t|ddd |tdd n|	|| || j|  q2| j tjkrtdt| jdftddS tdt| jdgS d S )	NTOrderedDict)addr   F	BUILD_MAPargr   )r    collectionsr2   extend_outputZcreate_load_python_moduleZcreate_load_attrr   keysr   Zappend_outputZcreate_load_globalr   r	   Zcreate_load_constr
   len)r!   codegenkeyr%   r%   r&   reconstruct)   s(    
zConstDictVariable.reconstructr5   c                 C   s   | j t| | |S r0   )r   r   get_keyadd_options)r!   r6   r%   r%   r&   getitem_constF   s    zConstDictVariable.getitem_constList[VariableTracker]Dict[str, VariableTracker]r   argsr"   returnc                    s  ddl m}m}m  t| || | j}|dkrB| |d S |dkrx|sR|rVt	  fdd| D fS |dkr|s|rt	|f fd	d|
 D t d
S |dkr|s|rt	 t| fS |dkr| s| rt	|t| jfS |dkr|rt|d r| jr|sHt|dksLt	t|d }t|rtt|| t|}	|d |	|< | j|d j}
|d jd k	r|
|d j | | j|	|
fS |dkr&|r&t|d r&t|d | jkr&t|dkr&|d S |dkr|rt|d r| jrt|}	|	t|d }| | j|	d f |S |dkr|rt|d tr| jrt|}	|	|d j | j|d j}
| j|	fd|
i}| |S |dkrX|rXt|d rXt|d | jkrX| jt|d  }|S |dkr|rt|d r|t|d | jkfS t  !|||S d S )Nr   )r   SetVariableTupleVariable__getitem__r   r   c                    s2   g | ]*\}} f d t j|f|giqS r-   r   _key_to_varr(   rG   optionstxr%   r&   
<listcomp>[   s   	z1ConstDictVariable.call_method.<locals>.<listcomp>r9   c                    s   g | ]}t j|f qS r%   rI   r)   r*   rL   rM   r%   r&   rN   o   s   )rM   r   mutable_localr   __len____setitem__r   )popgetrT   r   r   )rU   __getattr____contains__)" r   rF   rG   r   r   r   r   r@   AssertionErrorr9   r   listr:   r   is_valid_keyrQ   r>   r   store_dict_keyr   r7   r2   r   unionr3   replace_allmodifedr?   rT   
isinstancer   r   call_method)r!   rM   namerD   r"   r   rF   valr*   Znewvalnew_rec_containsresultr#   rK   r&   ra   I   s    







zConstDictVariable.call_methodc                 K   s   | j f ||d|S )z#a copy of self with different items)r   r   )clone)r!   r   r   rL   r%   r%   r&   r_      s     zConstDictVariable.modifedc                    s.   t | g | j} fdd| D }|S )Nc                    s   g | ]}t j|f qS r%   rI   rO   rP   r%   r&   rN      s     z9ConstDictVariable.unpack_var_sequence.<locals>.<listcomp>)r   r   r   r9   )r!   rM   rc   re   r%   rP   r&   unpack_var_sequence   s    z%ConstDictVariable.unpack_var_sequencec                 C   s&   t |tr|jd k	r|jS | S d S r0   )r`   r   specialized_valuer/   )clsr6   r%   r%   r&   r>      s    zConstDictVariable.get_keyc                 C   s4   |  p2t|tr|jd k	p2t|to2| tjkS r0   )is_python_constantr`   r   rh   r   r1   torchZdtype)ri   r<   r%   r%   r&   r[      s    

zConstDictVariable.is_valid_keyc                 K   sH   ddl m} t|r*||tt||S t|s8tt|f|S d S )Nr   )VariableBuilder)builderrl   r   r   r   r   
is_literalrY   )ri   rM   r<   rL   rl   r%   r%   r&   rJ      s
    zConstDictVariable._key_to_var)N)__name__
__module____qualname__r   r'   r/   r1   r=   r   r@   ra   r_   rg   classmethodr>   r[   rJ   __classcell__r%   r%   r#   r&   r      s&    
	r   c                       sL   e Zd Zd fdd	Z fddZedd Zdd	d
d fddZ  ZS )DefaultDictVariableNc                    s*   t  j||f| |tjks t|| _d S r0   )r   r   r7   defaultdictrY   default_factory)r!   r   r    rv   r"   r#   r%   r&   r      s    zDefaultDictVariable.__init__c                    s$   | j tttfkr| jsdS t  S )NF)rv   rZ   tupledictr   r   rj   r.   r#   r%   r&   rj      s    z&DefaultDictVariable.is_python_constantc                 C   s.   t | tjr| jtttfkS t | tjjS d S r0   )	r`   r   ZBuiltinVariablefnrZ   rw   rx   Z	functionsZBaseUserFunctionVariabler5   r%   r%   r&   is_supported_arg  s    z$DefaultDictVariable.is_supported_argrA   rB   r   rC   c           
         s   t | || }|dkrt|d }|| jkr@| |d S | jd krVt| qt	|rn|
t|| t| j}| j|g i }|||< | j|j}	|jd k	r|	|j || | j||	f| |S nt ||||S d S )NrH   r   )r   r   r   r   r>   r   r@   rv   KeyErrorr   r\   r   r7   r2   Zcall_functionr   r]   rQ   r3   r^   r_   r   ra   )
r!   rM   rb   rD   r"   rL   r*   new_valZdefault_varrd   r#   r%   r&   ra     s.    


 zDefaultDictVariable.call_method)N)	ro   rp   rq   r   rj   staticmethodrz   ra   rs   r%   r%   r#   r&   rt      s   

rt   c                       s   e Zd ZdZdZeeddd Zedd Z	e
dd	 Ze
d
d Ze
dd Z fddZdd Zdd Zdddd fddZedd fddZ  ZS )DataClassVariablez
    This is a bit of a hack to deal with
    transformers.file_utils.ModelOutput() from huggingface.

    ModelOutput causes trouble because it a a mix of a dataclass and a
    OrderedDict and it calls super() methods implemented in C.
    FNc                  C   s2   ddl m}  | j D ]}t|rt|j qd S )Nr   ModelOutput)transformers.file_utilsr   __dict__r   callabler   __code__)r   objr%   r%   r&   _patch_once8  s    zDataClassVariable._patch_oncec                 C   s4   zddl m} t| |W S  tk
r.   Y dS X d S )Nr   r   F)r   r   
issubclassImportError)ri   r   r%   r%   r&   is_matching_clsA  s
    z!DataClassVariable.is_matching_clsc                 C   s   |  t|S r0   r   typeri   r   r%   r%   r&   is_matching_objectJ  s    z$DataClassVariable.is_matching_objectc           
      C   s   t   t|jj dd t|D }t|j	||}|
  t|j t|ks\tt }|D ]^}|j| }	t|	tr|	||< qh| jrtj|	stt|	||< qh|	d kshtd|	 qht|dkrt||d  tjstd | ||f|S )Nc                 S   s   g | ]
}|j qS r%   rb   r)   fr%   r%   r&   rN   S  s     z,DataClassVariable.create.<locals>.<listcomp>zunexpected r   r   z&DataClassVariable iterator constructor)r~   r   r   r   r   dataclassesfieldsinspect	signaturebindapply_defaultsset	argumentsr9   rY   r7   r2   r`   r   include_noner   r   rn   r:   r   r   )
ri   r    rD   r"   rL   r9   boundr   r<   rc   r%   r%   r&   createN  s$    


 zDataClassVariable.createc           
      C   s   t |}dd t|D }g }t }|D ]V}t||r,t||}|j|jt	|j
|d|}	|d k	sn| jrx|	||< q,||	 q,| ||ft|| S )Nc                 S   s   g | ]
}|j qS r%   r   r   r%   r%   r&   rN   l  s     z*DataClassVariable.wrap.<locals>.<listcomp>)rM   source)r   r   r   r7   r2   hasattrgetattrr$   rM   r   r   r   appendr   r   r   )
ri   rm   r   r    r9   excludedr   r<   rc   varr%   r%   r&   wrapi  s,    

 

 zDataClassVariable.wrapc                    s$   t  j||f| | |s td S r0   )r   r   r   rY   )r!   r   r    rL   r#   r%   r&   r     s    zDataClassVariable.__init__c                 C   s
   t  d S r0   )NotImplementedErrorr.   r%   r%   r&   r'     s    zDataClassVariable.as_proxyc                 C   sL   | || jg t| j }|D ]}|| j|  q&|t||dS )NT)r8   Z_create_load_constr    rw   r   r9   Zcreate_call_function_kwr:   )r!   r;   r9   r<   r%   r%   r&   r=     s
    zDataClassVariable.reconstructrA   rB   r   rC   c                    s   t | || }|dkrx|s*t|dks.t|d  }t|trT| j| 	|S | 
|dg i 
|d||	|S n8|dkr|s|rttjt| j f|S |dkrd}t 
||||S )NrH   r   r   Zto_tuple__setattr__rS   )r   r   r   r:   rY   r/   r`   strr   r?   ra   r   rG   rZ   r   )r!   rM   rb   rD   r"   rL   indexr#   r%   r&   ra     s*    
   zDataClassVariable.call_methodrb   rE   c                    s   || j kr"| |dt|gi S | jsndd t| jD }||krntj|| sZt	t|| 
| S t || d S )NrH   c                 S   s   i | ]}|j |jqS r%   )rb   defaultr   r%   r%   r&   r,     s      z1DataClassVariable.var_getattr.<locals>.<dictcomp>)r   ra   r   r   r   r   r   r    rn   rY   r?   r   var_getattr)r!   rM   rb   defaultsr#   r%   r&   r     s    
  
 zDataClassVariable.var_getattr)ro   rp   rq   __doc__r   r}   	functools	lru_cacher   r   rr   r   r   r   r   r'   r=   ra   r   r   rs   r%   r%   r#   r&   r~   ,  s*   	



r~   c                       sX   e Zd ZdZedd Zedd Z fddZe	dd	d
dZ
e	dd	ddZ  ZS )HFPretrainedConfigVariablez/
    Hack for HuggingFace PretrainedConfig
    c                 C   s4   zddl m} t| |W S  tk
r.   Y dS X d S )Nr   )PretrainedConfigF)Z transformers.configuration_utilsr   r   r   )ri   r   r%   r%   r&   r     s
    z*HFPretrainedConfigVariable.is_matching_clsc                 C   s   |  t|S r0   r   r   r%   r%   r&   r     s    z-HFPretrainedConfigVariable.is_matching_objectc                    s*   t  jf | || _| t|s&td S r0   )r   r   r   r   r   rY   )r!   r   r"   r#   r%   r&   r     s    z#HFPretrainedConfigVariable.__init__r   r   c                 C   s   ddl m} |t| j|S )Nr   r   )rX   r   r   r   )r!   rM   rb   r   r%   r%   r&   r     s    z&HFPretrainedConfigVariable.var_getattrc                 C   s   t t| j|| S r0   )r   r   r   r   r?   )r!   rM   rb   r%   r%   r&   call_hasattr  s    z'HFPretrainedConfigVariable.call_hasattr)ro   rp   rq   r   r}   r   rr   r   r   r   r   r   rs   r%   r%   r#   r&   r     s   

r   )drE   c                 C   s:   |   tk	rtd|     t| j t| j fS )NzUnsupported flattening of )r1   rx   r   rZ   r   r   r9   )r   r%   r%   r&   _dictvariable_flatten  s    r   )r   contextrE   c                 C   s0   t dd | D stttt|| tt dS )Nc                 s   s   | ]}t |tV  qd S r0   )r`   r   )r)   xr%   r%   r&   	<genexpr>  s     z*_dictvariable_unflatten.<locals>.<genexpr>)r    rQ   )allrY   r   rx   zipr   )r   r   r%   r%   r&   _dictvariable_unflatten  s      r   c                   C   s   t ttt ttt d S r0   )pytreeZ_register_pytree_noder   r   r   	fx_pytreeZregister_pytree_flatten_specr%   r%   r%   r&   "_register_dynamo_dict_to_tree_spec  s    r   )-r7   r   r   r   typingr   r   r   r   rk   Ztorch.fxr   r   Ztorch.utilsr   rX   r   Zbytecode_transformationr	   r
   Z
eval_framer   excr   r   r   r   utilsr   r   baser   r   Zconstantr   Ztensorr   r   rt   r~   r   Contextr   r   r   r%   r%   r%   r&   <module>   s:    ]8 	  