o
    h*F                     @   sd  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(de%deee ej)f fddZ*dee dej)de%f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defddZ							d" fddZ
dd Zdd ZedefddZedd Zedd  Z  ZS )#ConstDictVariableNc                    s@   t  jd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__r   S/var/www/html/ai/venv/lib/python3.10/site-packages/torch/_dynamo/variables/dicts.pyr      s   
zConstDictVariable.__init__c                 C      dd | j   D S )Nc                 S      i | ]	\}}||  qS r   )as_proxy.0kvr   r   r&   
<dictcomp>!       z.ConstDictVariable.as_proxy.<locals>.<dictcomp>r    r"   r   r   r&   r)          zConstDictVariable.as_proxyc                 C   r'   )Nc                 S   r(   r   )as_python_constantr*   r   r   r&   r.   $   r/   z8ConstDictVariable.as_python_constant.<locals>.<dictcomp>r0   r1   r   r   r&   r3   #   r2   z$ConstDictVariable.as_python_constantc                 C   s   | j S N)r!   r1   r   r   r&   python_type&      zConstDictVariable.python_typec                 C   s   | j tju r||td|dg | j D ]+}t|r5|	|j
t|ddd |tdd n|	|| || j|  q| j tju rZtdt| jdgtddS tdt| jdgS )	NTOrderedDict)addr   F	BUILD_MAPargr   )r!   collectionsr7   extend_outputcreate_load_python_modulecreate_load_attrr    keysr   append_outputcreate_load_globalr   r	   create_load_constr
   len)r"   codegenkeyr   r   r&   reconstruct)   s(   
zConstDictVariable.reconstructr;   c                 C   s   | j t| | |S r4   )r    r   get_keyadd_options)r"   r;   r   r   r&   getitem_constF      zConstDictVariable.getitem_constargsList[VariableTracker]r#   Dict[str, VariableTracker]returnr   c                    s  ddl m}m}m  t| || | j}|dkr!| |d S |dkr>|s)|r+J   fdd| D fi S |dkr^|sF|rHJ |dfd	d|	 D t
 d
S |dkrt|sf|rhJ  t| fi S |dkr|s||r~J |t| jfi S |dkr|rt|d r| jr|st|dksJ t|d }t|rt|| t|}	|d |	|< | j|d j}
|d jd ur|
|d j | | j|	|
fi S |dv r|rt|d rt|d | jvrt|dkr|d S |dkrF|rFt|d rF| jrFt|}	|	t|d }| | j|	d fi  |S |dkr|rt|d tr| jrt|}	|	|d j | j|d j}
| j|	fd|
i}| |S |dv r|rt|d rt|d | jv r| jt|d  }|S |dkr|rt|d r|t|d | jv fi S t  |||S )Nr   )r   SetVariableTupleVariable__getitem__r   r    c              	      s6   g | ]\}} dd t j|fi |giqS )r    r   r   _key_to_varr*   rQ   optionstxr   r&   
<listcomp>[   s    	z1ConstDictVariable.call_method.<locals>.<listcomp>r@   c                        g | ]}t j|fi  qS r   rS   r+   r,   rV   rW   r   r&   rX   o   s    )rW   r    mutable_localr   __len____setitem__r   )popgetr_   r   r   )r`   __getattr____contains__r   )! r   rP   rQ   r   r   r   r    rJ   r@   r   listrD   r   is_valid_keyr\   rH   r   store_dict_keyr   r<   r7   r   unionr8   replace_allmodifedrI   r_   
isinstancer   r   call_method)r"   rW   namerL   r#   r   rP   valr,   newvalnew_rec_containsresultr$   rU   r&   rk   I   s   








 zConstDictVariable.call_methodc                 K   s   | j d||d|S )z#a copy of self with different items)r    r   Nr   )clone)r"   r    r   rV   r   r   r&   ri      s
   zConstDictVariable.modifedc                    s.   t | g | j} fdd| D }|S )Nc                    rY   r   rS   rZ   r[   r   r&   rX      s     z9ConstDictVariable.unpack_var_sequence.<locals>.<listcomp>)r   r   r    r@   )r"   rW   rm   rp   r   r[   r&   unpack_var_sequence   s   z%ConstDictVariable.unpack_var_sequencec                 C   s"   t |tr|jd ur|jS | S r4   )rj   r   specialized_valuer3   )clsr;   r   r   r&   rH      s   zConstDictVariable.get_keyc                 C   s4   |  pt|to|jd upt|to| tju S r4   )is_python_constantrj   r   rs   r   r5   torchdtype)rt   rF   r   r   r&   re      s   

zConstDictVariable.is_valid_keyc                 K   sH   ddl m} t|r||tt||S t|sJ t|fi |S )Nr   )VariableBuilder)builderrx   r   r   r   r   
is_literal)rt   rW   rF   rV   rx   r   r   r&   rT      s
   zConstDictVariable._key_to_varr4   rL   rM   r#   rN   rO   r   )__name__
__module____qualname__r   r)   r3   r5   rG   r   rJ   rk   ri   rr   classmethodrH   re   rT   __classcell__r   r   r$   r&   r      s.     
	r   c                       sP   e Zd Zd fdd	Z fddZedd Z				
			d fddZ  ZS )DefaultDictVariableNc                    s.   t  j||fi | |tju sJ || _d S r4   )r   r   r<   defaultdictdefault_factory)r"   r    r!   r   r#   r$   r   r&   r      s   
zDefaultDictVariable.__init__c                    s$   | j tttfvr| jsdS t  S )NF)r   rd   tupledictr    r   ru   r1   r$   r   r&   ru      s   
z&DefaultDictVariable.is_python_constantc                 C   s*   t | tjr| jtttfv S t | tjjS r4   )	rj   r   BuiltinVariablefnrd   r   r   	functionsBaseUserFunctionVariabler:   r   r   r&   is_supported_arg  s   z$DefaultDictVariable.is_supported_argrL   rM   r#   rN   rO   r   c           
         s   t | || }|dkrjt|d }|| jv r | |d S | jd u r*t| t	|r6|
t|| t| j}| j|g i }|||< | j|j}	|jd urZ|	|j || | j||	fi | |S t ||||S )NrR   r   )r   r   r   r   rH   r    rJ   r   KeyErrorr   rf   r   r<   r7   call_functionr   rg   r\   r8   rh   ri   r   rk   )
r"   rW   rl   rL   r#   rV   r,   new_valdefault_varro   r$   r   r&   rk     s,   



zDefaultDictVariable.call_methodr4   r{   )	r|   r}   r~   r   ru   staticmethodr   rk   r   r   r   r$   r&   r      s    
r   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 fddZdeddf 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   .   zddl m} t| |W S  ty   Y dS w )Nr   r   F)r   r   
issubclassImportError)rt   r   r   r   r&   is_matching_clsA     z!DataClassVariable.is_matching_clsc                 C      |  t|S r4   r   typert   r   r   r   r&   is_matching_objectJ     z$DataClassVariable.is_matching_objectc           
      C   s  t   t|jj dd t|D }t|j	|i |}|
  t|j t|ks0J t }|D ]/}|j| }	t|	trG|	||< q6| jrZtj|	sRJ t|	||< q6|	d u seJ d|	 q6t|dkrzt||d  tjsztd | ||fi |S )Nc                 S      g | ]}|j qS r   rl   r+   fr   r   r&   rX   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	argumentsr@   r<   r7   rj   r   include_noner   r   rz   rD   r   r   )
rt   r!   rL   r#   rV   r@   boundr    rF   rm   r   r   r&   createN  s$   


 zDataClassVariable.createc           
      C   s   t |}dd t|D }g }t }|D ]+}t||rAt||}|j|jt	|j
|d|}	|d us7| jr<|	||< q||	 q| ||fi t|| S )Nc                 S   r   r   r   r   r   r   r&   rX   l  r   z*DataClassVariable.wrap.<locals>.<listcomp>)rW   source)r   r   r   r<   r7   hasattrgetattrr%   rW   r   r   r   appendr   r   r   )
rt   ry   r   r!   r@   excludedr    rF   rm   varr   r   r&   wrapi  s*   



zDataClassVariable.wrapc                    s(   t  j||fi | | |sJ d S r4   )r   r   r   )r"   r    r!   rV   r$   r   r&   r     s   zDataClassVariable.__init__c                 C   s   t  r4   )NotImplementedErrorr1   r   r   r&   r)     r6   zDataClassVariable.as_proxyc                 C   sL   | || jg t| j }|D ]	}|| j|  q|t||dS )NT)r=   _create_load_constr!   r   r    r@   create_call_function_kwrD   )r"   rE   r@   rF   r   r   r&   rG     s
   zDataClassVariable.reconstructrL   rM   r#   rN   rO   r   c                    s   t | || }|dkr;|st|dksJ |d  }t|tr*| j| |S | 	|dg i 	|d|||S |dkrS|sC|rEJ t
jt| j fi |S |dkrYd}t 	||||S )NrR   r   r   to_tuple__setattr__r^   )r   r   r   rD   r3   rj   strr    rI   rk   r   rQ   rd   r   )r"   rW   rl   rL   r#   rV   indexr$   r   r&   rk     s    
zDataClassVariable.call_methodrl   c                    s   || j v r| |dt|gi S | js7dd t| jD }||v r7tj|| s-J t|| 	| S t
 || d S )NrR   c                 S   s   i | ]}|j |jqS r   )rl   defaultr   r   r   r&   r.     s    z1DataClassVariable.var_getattr.<locals>.<dictcomp>)r    rk   r   r   r   r   r   r!   rz   rI   r   var_getattr)r"   rW   rl   defaultsr$   r   r&   r     s   
zDataClassVariable.var_getattrr{   )r|   r}   r~   __doc__r   r   	functools	lru_cacher   r   r   r   r   r   r   r)   rG   rk   r   r   r   r   r   r$   r&   r   ,  s2    	



r   c                       s\   e Zd ZdZedd Zedd Z fddZde	d	d
fddZ
de	d	d
fddZ  ZS )HFPretrainedConfigVariablez/
    Hack for HuggingFace PretrainedConfig
    c                 C   r   )Nr   )PretrainedConfigF) transformers.configuration_utilsr   r   r   )rt   r   r   r   r&   r     r   z*HFPretrainedConfigVariable.is_matching_clsc                 C   r   r4   r   r   r   r   r&   r     r   z-HFPretrainedConfigVariable.is_matching_objectc                    s.   t  jdi | || _| t|sJ d S )Nr   )r   r   r   r   r   )r"   r   r#   r$   r   r&   r     s   z#HFPretrainedConfigVariable.__init__rl   rO   r   c                 C   s   ddl m} |t| j|S )Nr   r   )rc   r   r   r   )r"   rW   rl   r   r   r   r&   r     s   z&HFPretrainedConfigVariable.var_getattrc                 C   s   t t| j|| S r4   )r   r   r   r   rI   )r"   rW   rl   r   r   r&   call_hasattr  rK   z'HFPretrainedConfigVariable.call_hasattr)r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r$   r&   r     s    

r   drO   c                 C   s:   |   turtd|     t| j t| j fS )NzUnsupported flattening of )r5   r   r   rd   r    r   r@   )r   r   r   r&   _dictvariable_flatten  s   r   r   contextc                 C   s0   t dd | D sJ ttt|| tt dS )Nc                 s   s    | ]}t |tV  qd S r4   )rj   r   )r+   xr   r   r&   	<genexpr>  s    z*_dictvariable_unflatten.<locals>.<genexpr>)r!   r\   )allr   r   zipr   )r   r   r   r   r&   _dictvariable_unflatten  s   r   c                   C   s   t ttt ttt d S r4   )pytree_register_pytree_noder   r   r   	fx_pytreeregister_pytree_flatten_specr   r   r   r&   "_register_dynamo_dict_to_tree_spec  s   r   )-r<   r   r   r   typingr   r   r   r   rv   torch.fxr   r   torch.utilsr   rc   r   bytecode_transformationr	   r
   
eval_framer   excr   r   r   r   utilsr   r   baser   r   constantr   tensorr   r   r   r   r   Contextr   r   r   r   r   r   r&   <module>   sB     ]8 	  
