U
    ªÊ¹j P  ã                   @   sŠ  d dl Z 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	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 dd
lmZ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„Z0dd„ Z1G d d!„ d!e%ƒZ2dS )"é    N)ÚAnyÚDictÚListÚOptionalÚTuple)Ú_pytreeé   )Ú	variables)Úcreate_call_functionÚcreate_instruction)Ú	skip_code)Úunimplemented)ÚGuardBuilder)Ú
AttrSourceÚGetItemSourceÚ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/bwave/python/venv/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>r0   r1   r(   r(   r)   r2   %   s    z$ConstDictVariable.as_python_constantc                 C   s   | j S ©N)r#   r1   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r´t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#   Úcollectionsr5   Úextend_outputÚcreate_load_python_moduleÚ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.reconstructr8   c                 C   s   | j t |¡  | |¡S r3   )r"   r   Úget_keyÚadd_options)r$   r9   r(   r(   r)   Úgetitem_constH   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ˆ|rŒt	‚|f ˆ‡‡fd	d„| 
¡ D ƒtƒ d
œˆ—ŽS |dkrà|sÈ|rÌt	‚ˆ t| ¡ ƒfˆŽS |dk�r|� sö|� rút	‚|t| jƒfˆŽS |dk�rÔ|�rÔt |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Ž|�rŽt |d ¡�rŽ| j�rŽt |¡}	|	 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”|�r”t |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 r0   ©r   Ú_key_to_varr+   ©rL   ÚoptionsÚtxr(   r)   Ú
<listcomp>]   s   õþýúÿ	÷z1ConstDictVariable.call_method.<locals>.<listcomp>r>   c                    s   g | ]}t jˆ|fˆ Ž‘qS r(   rN   ©r,   r-   ©rQ   rR   r(   r)   rS   q   s   ûþý)rR   r"   Úmutable_localr!   Ú__len__Ú__setitem__r   )ÚpopÚgetrY   r   r   )rZ   Ú__getattr__Ú__contains__)"Ú r   rK   rL   r   r    r!   r"   rE   ÚAssertionErrorr>   r   Úlistr?   r   Úis_valid_keyrV   rC   r   Ústore_dict_keyr   r:   r5   r   Úunionr6   Úreplace_allÚmodifedrD   rY   Ú
isinstancer   r   Úcall_method)r$   rR   ÚnamerI   r%   r   rK   Úvalr-   ZnewvalÚnew_rec_containsÚresultr&   rP   r)   rf   K   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   rQ   r(   r(   r)   rd   Î   s     ÿÿzConstDictVariable.modifedc                    s.   t  | g¡‰ | j}‡ ‡fdd„| ¡ D ƒ}|S )Nc                    s   g | ]}t jˆ|fˆ Ž‘qS r(   rN   rT   rU   r(   r)   rS   ×   s     z9ConstDictVariable.unpack_var_sequence.<locals>.<listcomp>)r   r    r"   r>   )r$   rR   rh   rj   r(   rU   r)   Úunpack_var_sequenceÔ   s    z%ConstDictVariable.unpack_var_sequencec                 C   s&   t |tƒr|jd k	r|jS | ¡ S d S r3   )re   r   Úspecialized_valuer2   )Úclsr9   r(   r(   r)   rC   Ú   s    zConstDictVariable.get_keyc                 C   s4   |  ¡ p2t|tƒr|jd k	p2t|tƒo2| ¡ tjkS r3   )Úis_python_constantre   r   rm   r   r4   ÚtorchZdtype)rn   rA   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)Úbuilderrs   r   r   r   r   Ú
is_literalr^   )rn   rR   rA   rQ   rs   r(   r(   r)   rO   ë   s
    zConstDictVariable._key_to_var)N)Ú__name__Ú
__module__Ú__qualname__r   r*   r2   r4   rB   r   rE   rf   rd   rl   ÚclassmethodrC   r`   rO   Ú__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 r3   )r   r   r:   Údefaultdictr^   Údefault_factory)r$   r"   r#   r}   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)r}   r_   ÚtupleÚdictr"   r   ro   r1   r&   r(   r)   ro   ü   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 r3   )	re   r	   ZBuiltinVariableÚfnr_   r~   r   Z	functionsZBaseUserFunctionVariabler8   r(   r(   r)   Úis_supported_arg  s    z$DefaultDictVariable.is_supported_argrF   rG   r   rH   c           
         sê   t  | || ¡ ¡}|dkrÔt |d ¡}|| jkr@|  |d ¡S | jd krVt|› ƒ‚qæt	|ƒrn| 
t|ƒ|¡ t | j¡}| j |g i ¡}|||< | j |j¡}	|jd k	r¶|	 |j¡ | | | j||	f|Ž¡ |S ntƒ  ||||¡S d S )NrM   r   )r   r    r!   r   rC   r"   rE   r}   ÚKeyErrorr   ra   r   r:   r5   Zcall_functionr   rb   rV   r6   rc   rd   r   rf   )
r$   rR   rg   rI   r%   rQ   r-   Únew_valZdefault_varri   r&   r(   r)   rf   
  s.    

ÿ
 ÿzDefaultDictVariable.call_method)N)	rv   rw   rx   r   ro   Ústaticmethodr�   rf   rz   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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_once:  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)rn   r‡   r(   r(   r)   Úis_matching_clsC  s
    z!DataClassVariable.is_matching_clsc                 C   s   |   t|ƒ¡S r3   ©r�   Útype©rn   rŒ   r(   r(   r)   Úis_matching_objectL  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r°tj |	¡s t‚t |	¡||< qh|	d kshtd|	› �ƒ‚qht|ƒdkrðt||d  tjƒsðtdƒ | ||f|ŽS )Nc                 S   s   g | ]
}|j ‘qS r(   ©rg   ©r,   Úfr(   r(   r)   rS   U  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^   r:   r5   re   r   Úinclude_noner	   r   ru   r?   r   r   )
rn   r#   rI   r%   rQ   r>   Úboundr"   rA   rh   r(   r(   r)   ÚcreateP  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)   rS   n  s     z*DataClassVariable.wrap.<locals>.<listcomp>)rR   Úsource)r’   r˜   r™   r:   r5   ÚhasattrÚgetattrr'   rR   r   r£   r    Úappendr   r    r!   )
rn   rt   rŒ   r#   r>   Úexcludedr"   rA   rh   Úvarr(   r(   r)   Úwrapk  s,    

 
ÿþ
 ÿÿzDataClassVariable.wrapc                    s$   t ƒ j||f|Ž |  |¡s t‚d S r3   )r   r   r�   r^   )r$   r"   r#   rQ   r&   r(   r)   r   �  s    zDataClassVariable.__init__c                 C   s
   t ƒ ‚d S r3   )ÚNotImplementedErrorr1   r(   r(   r)   r*   …  s    zDataClassVariable.as_proxyc                 C   sL   |  | | j¡g¡ t| j ¡ ƒ}|D ]}|| j| ƒ q&| t|ƒ|d¡S )NT)r;   Z_create_load_constr#   r~   r"   r>   Zcreate_call_function_kwr?   )r$   r@   r>   rA   r(   r(   r)   rB   ˆ  s
    zDataClassVariable.reconstructrF   rG   r   rH   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ˆ|rŒt‚tjt| j ¡ ƒf|ŽS |dkr°d}tƒ  
||||¡S )NrM   r   r   Zto_tupleÚ__setattr__rX   )r   r    r!   r?   r^   r2   re   Ústrr"   rD   rf   r	   rL   r_   r   )r$   rR   rg   rI   r%   rQ   Úindexr&   r(   r)   rf   �  s*    
   ÿþÿzDataClassVariable.call_method©rg   rJ   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 )NrM   c                 S   s   i | ]}|j |j“qS r(   )rg   Údefaultr–   r(   r(   r)   r/   ¯  s      z1DataClassVariable.var_getattr.<locals>.<dictcomp>)r"   rf   r	   r   r    r˜   r™   r#   ru   r^   rD   r   Úvar_getattr)r$   rR   rg   Údefaultsr&   r(   r)   r°   ©  s    
  
 ÿzDataClassVariable.var_getattr)rv   rw   rx   Ú__doc__r    r„   Ú	functoolsÚ	lru_cacher�   r�   ry   r”   r¢   r©   r   r*   rB   rf   r¬   r°   rz   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�   )rn   r¶   r(   r(   r)   r�   »  s
    z*HFPretrainedConfigVariable.is_matching_clsc                 C   s   |   t|ƒ¡S r3   r‘   r“   r(   r(   r)   r”   Ä  s    z-HFPretrainedConfigVariable.is_matching_objectc                    s*   t ƒ jf |Ž || _|  t|ƒ¡s&t‚d S r3   )r   r   rŒ   r�   r’   r^   )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   )r]   r   r¥   rŒ   )r$   rR   rg   r   r(   r(   r)   r°   Í  s    z&HFPretrainedConfigVariable.var_getattrc                 C   s   t  t| j|ƒ¡ | ¡S r3   )r	   r   r¤   rŒ   rD   )r$   rR   rg   r(   r(   r)   Úcall_hasattrÒ  s    z'HFPretrainedConfigVariable.call_hasattr)rv   rw   rx   r²   r„   r�   ry   r”   r   r¬   r°   r·   rz   r(   r(   r&   r)   rµ   ¶  s   

rµ   )ÚdrJ   c                 C   s:   |   ¡ tk	rtd|   ¡ › �ƒ t| j ¡ ƒt| j ¡ ƒfS )NzUnsupported flattening of )r4   r   r   r_   r"   r!   r>   )r¸   r(   r(   r)   Ú_dictvariable_flattenÖ  s    r¹   )r!   ÚcontextrJ   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 r3   )re   r   )r,   Úxr(   r(   r)   Ú	<genexpr>æ  s     z*_dictvariable_unflatten.<locals>.<genexpr>)r#   rV   )Úallr^   r   r   Úzipr   )r!   rº   r(   r(   r)   Ú_dictvariable_unflattenã  s      ÿr¿   c                   C   s   t  ttt¡ t tt¡ d S r3   )ÚpytreeZ_register_pytree_noder   r¹   r¿   Ú	fx_pytreeZregister_pytree_flatten_specr(   r(   r(   r)   Ú"_register_dynamo_dict_to_tree_specî  s    ýþrÂ   c                   @   s€   e Zd ZdZdd„ Zedd„ ƒZee e	e
ef dœdd„Zed	œd
d„Zed	œdd„Zdeee dœdd„Zed	œdd„ZdS )ÚPythonSysModulesVariablez’Special case for sys.modules.

    Without this we will guard on the exact set of modules imported in the
    lifetime of the python program.
    c                 C   s   t S r3   )r   r1   r(   r(   r)   r4     s    z$PythonSysModulesVariable.python_typec                 C   s    |  | td¡| d¡g¡ d S )NTÚmodules)r;   r<   Úsysr=   )r$   r@   r(   r(   r)   rB     s
    
þÿz$PythonSysModulesVariable.reconstruct)rI   r%   c                 C   s’   ddl m} |dkr&| j|f|ž|ŽS |dkr@| j|f|ž|ŽS |dkrZ| j|f|ž|ŽS t | || ¡ ¡}||| jf|Žt	j
ƒ}| ||||¡S )Nr   rr   rM   rZ   r\   )rt   rs   Úcall_getitemÚcall_getÚcall_containsr   r    r!   r£   rÅ   rÄ   rf   )r$   rR   rg   rI   r%   rs   rQ   Z	real_dictr(   r(   r)   rf     s    z$PythonSysModulesVariable.call_method)rA   c                 C   sD   t  |¡}|tjk}|  tjtj|| d�¡}| j	|h™}|||fS )N)rA   Úinvert)
r   rC   rÅ   rÄ   Z
make_guardr³   Úpartialr   ZDICT_CONTAINSr   )r$   rR   rA   r-   Úhas_keyÚguardr   r(   r(   r)   Ú_contains_helper  s    

ÿz)PythonSysModulesVariable._contains_helperc                 C   s   |   ||¡\}}}t||d�S )N©Úvaluer   )rÍ   r   )r$   rR   rA   r-   rË   r   r(   r(   r)   rÈ   (  s
    þz&PythonSysModulesVariable.call_containsN)rA   r¯   c                 C   sb   ddl m} |  ||¡\}}}|rD||t| j|ƒƒtj| ƒ |¡S |d k	rV| |¡S td |d�S )Nr   rr   rÎ   )	rt   rs   rÍ   r   r£   rÅ   rÄ   Ú
add_guardsr   )r$   rR   rA   r¯   rs   r-   rË   r   r(   r(   r)   rÇ   /  s    
þüû
z!PythonSysModulesVariable.call_getc                 C   s@   ddl m} |  ||¡\}}}||t| j|ƒƒtj| ƒ |¡S rq   )rt   rs   rÍ   r   r£   rÅ   rÄ   rÐ   )r$   rR   rA   rs   r-   rË   r   r(   r(   r)   rÆ   C  s    
þüûz%PythonSysModulesVariable.call_getitem)N)rv   rw   rx   r²   r4   r„   rB   r   r   r   r¬   rf   rÍ   rÈ   r   rÇ   rÆ   r(   r(   r(   r)   rÃ   û  s   
	 
ÿ	 ÿ ÿrÃ   )3r:   r˜   r³   rš   rÅ   Útypingr   r   r   r   r   rp   Ztorch.fxr   rÁ   Ztorch.utilsrÀ   r]   r	   Zbytecode_transformationr
   r   Z
eval_framer   Úexcr   r   r   r£   r   r   r   Úutilsr   r   Úbaser   r   Zconstantr   Ztensorr   r   r{   r…   rµ   ÚContextr¹   r¿   rÂ   rÃ   r(   r(   r(   r)   Ú<module>   s@    ]8 	  þ