U
    ªÊ¹jßÌ  ã                   @   sþ  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
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 d dlmZmZmZmZmZmZmZmZ d dlmZ zd dlZW n ek
rè   dZY nX d dlZd dl Zd dl!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. d dl/m0Z0m1Z1 d d	l2m3Z3m4Z4 d
dl5m6Z6m7Z7m8Z8 d
dl9m:Z:m;Z; d
dl<m=Z= d
dl>m?Z? d
dlm@Z@mAZAmBZB d
dlCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZM e	 NeO¡ZPejQ ReOd¡ZSejQ ReOd¡ZTejUjVjWjXZXejUjVjWjYZYejUjVjWjZZZe [d¡dd„ ƒZ\e ]deZfdeYfdej^fdej_fdejUj`fdej]jafdeFfdeDfddd„ fd eMfd!eLfd"e
jbfd#ecd#ƒfd$d%d„ fd&ejCjdfd'ejefd(ejffg¡Zgejhdd)… d*k�r z"d dliZie jjekd+œd,d-„Zld.ZmW n enk
�r   d/ZmY nX nd.Zme jjekd+œd0d-„Zld1d2„ Zod3d4„ ZpejqG d5d6„ d6ƒƒZrG d7d8„ d8e(ƒZsG d9d:„ d:ƒZtG d;d<„ d<ƒZueekekf d=œd>d?„ZvdaweBejxeekeyf eze{dd@œdAdB„Z|eBejxeekeyf eze{dCœdDdE„Z}e:e}ƒ dFdG„ Z~dHdI„ ZdS )Jé    N)ÚcurrentframeÚgetframeinfo)ÚAnyÚCallableÚDictÚListÚOptionalÚTupleÚTypeÚUnion)ÚReferenceType)Úis_from_local_sourceÚTensorPropertyÚTensorPropertySource)ÚDuplicateInputsÚGuardÚGuardBuilderBaseÚGuardEnvExprÚGuardSourceÚSource)ÚEqualityConstraintÚSYMPY_INTERP)Úformat_frameÚreport_compile_source_on_error)ÚTensorWeakRefÚ	WeakIdRefé   )ÚconfigÚconvert_frameÚmutation_guard)Úset_guard_error_hookÚset_guard_fail_hook)Úunimplemented)Ú
TypeSource)ÚGuardedCodeÚ	GuardFailÚGuardFn)
Údict_const_keysÚdict_const_keys_reprÚdict_param_key_idsÚguard_failuresÚ"is_guard_failure_reporting_enabledÚistypeÚorig_code_mapÚtensor_always_has_static_shapeÚtuple_iterator_getitemÚtuple_iterator_lenÚguardsZverbose_guardsc                  C   s    dd l } | jjg}dd„ |D ƒS )Nr   c                 S   s   h | ]}t  |¡’qS © )ÚinspectÚgetfile)Ú.0Úmr2   r2   úS/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/_dynamo/guards.pyÚ	<setcomp>R   s     z&uninteresting_files.<locals>.<setcomp>)Ztorch._dynamo.external_utilsÚ_dynamoZexternal_utils)ÚtorchZmodsr2   r2   r7   Úuninteresting_filesK   s    ÿr;   Z___check_type_idZ___check_obj_idZ___is_grad_enabledZ'___are_deterministic_algorithms_enabledZ___is_torch_function_enabledZ___odict_getitemZ___dict_param_key_idsZ___dict_const_keysZ___dict_containsc                 C   s   | |kS ©Nr2   )ÚaÚbr2   r2   r7   Ú<lambda>b   ó    r?   Z___tuple_iterator_lenZ___tuple_iterator_getitemZ__math_isnanÚinfZ__load_modulec                 C   s
   t  | ¡S r<   )Ú	importlibÚimport_module©Únamer2   r2   r7   r?   g   r@   Zutils_deviceÚdeviceZ__as_tensoré   )é   é   ©ÚnodeÚreturnc                 C   s   t  | ¡ dd¡S ©NÚ
Ú )Ú
astunparseÚunparseÚreplace©rK   r2   r2   r7   Ú_ast_unparsev   s    rT   TFc                 C   s   t  | ¡ dd¡S rM   )ÚastrQ   rR   rS   r2   r2   r7   rT   €   s    c                 C   sb   t  d¡}d}| D ]F}|dkr$d}q|dkrP|rX|dkrX| |¡rXt|ƒ  S q||7 }qt| ƒS )zð
    "___odict_getitem(a, 1)" => "a"
    "a.layers[slice(2)][0]._xyz" ==> "a"
    "getattr(a.layers[slice(2)][0]._abc, '0')" ==> "a"
    "getattr(getattr(a.x[3], '0'), '3')" ==> "a"
    "a.layers[slice(None, -1, None)][0]._xyz" ==> "a"
    z[A-Za-z_].*rO   z (z),[]ÚNone)ÚreÚcompileÚmatchÚstrip_function_callÚstrip_getattr_getitem)rE   Z
valid_nameÚcurrÚcharr2   r2   r7   rZ   „   s    	

rZ   c                 C   s   t  d| ¡d S )z*
    "a[1]" => "a"
    "a.foo" => "a"
    z[.\[]r   )rW   ÚsplitrD   r2   r2   r7   r[   ›   s    r[   c                   @   s"   e Zd ZU ee ed< eed< dS )ÚGuardCodeListÚ	code_listÚguardN)Ú__name__Ú
__module__Ú__qualname__r   ÚstrÚ__annotations__r   r2   r2   r2   r7   r_   ¥   s   
r_   c                   @   sÎ  e Zd Zeee gef eegef ee	eef  de
dœdd„Zeedœdd„Zeeef edœd	d
„Zedœdd„Zeee
dœdd„Zedœdd„Zedœdd„Zedœdd„Zedœdd„Zedœdd„Zedœdd„Zedœdd„Zedœdd „Zedœd!d"„Zedœd#d$„Zedœd%d&„Zd'd(„ Zd)d*„ Zd+d,„ Z d-d.„ Z!d/d0„ Z"d1d2„ Z#d3d4„ Z$edœd5d6„Z%edœd7d8„Z&edœd9d:„Z'edœd;d<„Z(edœd=d>„Z)edœd?d@„Z*dGedœdBdC„Z+dHdEdF„Z,dAS )IÚGuardBuilderÚCheckFunctionManager)Úid_refÚ
source_refÚ
user_scopeÚcheck_fn_managerÚlocalc          	      C   sÊ   || _ || _|| _|r(|rdnd|i}n|r0dndtƒ i}|| _tj ¡ | jd< tj	j
j ¡ D ]<\}}| dd¡ dd¡ dd¡}|| jd |< || j|< q^g | _g | _g | _g | _g | _g | _|| _d S )	NÚLÚGÚ__builtins__ú>Ú_ú<Ú.Z_dot_)rm   ri   rj   ÚdictÚscopeÚbuiltinsÚ__dict__Úcopyr:   ÚpackageZpackage_importerZ_package_imported_modulesÚitemsrR   ÚargnamesÚcodeÚshape_env_codeÚtensor_check_namesÚtensor_check_examplesÚtensor_check_guardsrl   )	Úselfri   rj   rk   rl   rm   rv   rE   Zpackage_moduler2   r2   r7   Ú__init__¬   s,    	ýzGuardBuilder.__init__)rE   rL   c                 C   s   t || jtƒS r<   )Úevalrv   ÚCLOSURE_VARS)r‚   rE   r2   r2   r7   Úgetê   s    zGuardBuilder.get)ra   rL   c                 C   s`   t |tƒr|}n|j}tt|ƒƒ}|| jkr\t d|¡r\t d|¡rPt 	d|¡ | j 
|¡ |S )Nz[a-zA-Z0-9_]+z^\d+$zinvalid var name: %s)Ú
isinstancere   rE   r[   rZ   r|   rW   rY   ÚlogÚwarningÚappend)r‚   ra   rE   Úbaser2   r2   r7   Úarg_refò   s    

zGuardBuilder.arg_ref)ra   c                 C   sD   t |  |j¡ƒ}|  |¡}d|  |¡› d|› d�}|  ||g¡ d S )Nú___check_type_id(ú, ú))Útyper†   rE   ri   rŒ   Ú_produce_guard_code)r‚   ra   ÚtÚobj_idr}   r2   r2   r7   Ú
TYPE_MATCH  s    
zGuardBuilder.TYPE_MATCH)ra   ÚkeyÚinvertc                 C   s:   |   |¡}|rdnd}|› d|›d|› d�}|  ||g¡S )Núnot rO   z___dict_contains(rŽ   r�   ©rŒ   r‘   )r‚   ra   r•   r–   Zdict_refZ	maybe_notr}   r2   r2   r7   ÚDICT_CONTAINS  s    
zGuardBuilder.DICT_CONTAINSc                 C   s&   |   |¡}d|› �}|  ||g¡ d S )Nr—   r˜   )r‚   ra   Úrefr}   r2   r2   r7   Ú
BOOL_FALSE  s    

zGuardBuilder.BOOL_FALSEc                 C   s^   t |jtƒr&|  t|jj|jtjƒ¡S d|  |¡› d|  	|  
|j¡¡› d�}|  ||g¡ d S )Nz___check_obj_id(rŽ   r�   )r‡   Zoriginating_sourcer#   r”   r   r‹   Úsourcerg   rŒ   ri   r†   rE   r‘   ©r‚   ra   r}   r2   r2   r7   ÚID_MATCH  s      ÿÿ&zGuardBuilder.ID_MATCHc                 C   s6   |   |j¡}|  |¡› d|j› d�}|  ||g¡ d S )Nz.__name__ == 'ú')r†   rE   rŒ   rb   r‘   ©r‚   ra   Úobjr}   r2   r2   r7   Ú
NAME_MATCH,  s    zGuardBuilder.NAME_MATCHc                 C   s6   |   |j¡}|  |¡› d| ¡ › �}|  ||g¡ d S )Nz.data_ptr() == )r†   rE   rŒ   Zdata_ptrr‘   r    r2   r2   r7   ÚDATA_PTR_MATCH1  s    zGuardBuilder.DATA_PTR_MATCHc                 C   s–   t  d|j¡}|s"td|j› �ƒ‚| dd¡\}}|  |¡}t|  |¡|ƒ}d }|rhd|› d|›d�}nd|› d|›d�}| j||g|  |¡d	� d S )
Nz^(.*)[.]([a-zA-Z0-9_]+)$zinvalid hasattr check r   rG   úhasattr(rŽ   r�   znot hasattr()Úprovided_guarded_object)	rW   rY   rE   ÚAssertionErrorÚgrouprŒ   Úhasattrr†   r‘   )r‚   ra   r6   r‹   Úattrrš   Úvalr}   r2   r2   r7   ÚHASATTR6  s    
zGuardBuilder.HASATTRc           	         s   |   |¡}|  |j¡}t|ƒ}trTtjtjtjtjtj	tj
tjtjtjtjtjf}nd}ttttd ƒtttttttttjtjtjf|˜‰ t|tƒr¾t ‡ fdd„t! "| #¡ | $¡ ¡D ƒƒsÒt%‚nt|ˆ ƒsÒt%|j&ƒ‚t|tjtjfƒ�rd|› dt|ƒ›�g}|  '||¡ d S t|tƒ�rjt( )|¡�rjtƒ }| *d|› d|  +|¡› d�¡ | *d	|› d�¡ |  '||¡ d S tƒ }t|ttfƒ�rÈ|  ,|¡ t-|ƒD ]2\}}| *d|› d
|› d|  +t|ƒ¡› d�¡ �q’n| *d|› d|  +|¡› d�¡ t|tjƒ�rüt|ƒ}| *|› d|›�¡ |  '||¡ d S )Nr2   c                 3   s   | ]}t |ˆ ƒV  qd S r<   )r,   )r5   Úx©Zok_typesr2   r7   Ú	<genexpr>k  s    z,GuardBuilder.EQUALS_MATCH.<locals>.<genexpr>ústr(ú) == r�   rŽ   r�   z__math_isnan(ú[z], ú == ).rŒ   r†   rE   r�   ÚnpZint8Zint16Zint32Zint64Zuint8Zuint16Zuint32Zuint64Zfloat16Zfloat32Zfloat64ÚintÚfloatÚboolre   ÚlistÚtupleÚsetÚsliceÚ	frozensetÚranger:   ÚSizerF   Údtyper,   ru   ÚallÚ	itertoolsÚchainÚkeysÚvaluesr¦   rb   r‘   ÚmathÚisnanrŠ   ri   ÚLIST_LENGTHÚ	enumerate)	r‚   ra   rš   rª   r’   Znp_typesr}   ÚidxÚelemr2   r­   r7   ÚEQUALS_MATCHD  s†    
õñð
ÿþý
 ÿ
zGuardBuilder.EQUALS_MATCHc                 C   s8   |   |j¡}t|ttd ƒfƒr*|  |¡ n
|  |¡ d S r<   )r†   rE   r,   r¶   r�   rž   rÊ   )r‚   ra   rª   r2   r2   r7   ÚCONSTANT_MATCH›  s    zGuardBuilder.CONSTANT_MATCHc                    sZ   ˆ  ˆ ¡ ˆ ˆ ¡‰ˆ ˆ j¡‰‡ ‡‡‡fdd„}tˆdƒrD|ƒ  ntdtˆƒ› �ƒ d S )Nc                      s4   t ˆjtƒst‚ˆj tˆ› dˆj› �gˆ ƒ¡ d S )Nz.training == )r,   Útrainingr¶   r¦   r}   rŠ   r_   r2   ©ra   rš   r‚   rª   r2   r7   Úsetup_guard§  s    ÿz+GuardBuilder.NN_MODULE.<locals>.setup_guardrÌ   z$Guard setup for uninitialized class )rž   rŒ   r†   rE   r¨   r"   r�   )r‚   ra   rÎ   r2   rÍ   r7   Ú	NN_MODULE¢  s    


zGuardBuilder.NN_MODULEc                 C   s   |  ¡ r|  |¡S dS )z0things like torch.add and user defined functionsN)Úis_localrž   ©r‚   ra   r2   r2   r7   ÚFUNCTION_MATCH´  s    zGuardBuilder.FUNCTION_MATCHc                 C   s
   |   |¡S r<   ©rÒ   rÑ   r2   r2   r7   ÚBUILTIN_MATCH¹  s    zGuardBuilder.BUILTIN_MATCHc                 C   s
   |   |¡S r<   rÓ   rÑ   r2   r2   r7   ÚPYMODULE_MATCH¼  s    zGuardBuilder.PYMODULE_MATCHc                 C   sl   |   |¡}|  |j¡}t|ƒ}tƒ }| d|› d|  |¡› d�¡ | d|› dt|ƒ› �¡ |  ||¡ d S )Nr�   rŽ   r�   zlen(r°   )	rŒ   r†   rE   r�   r·   rŠ   ri   Úlenr‘   ©r‚   ra   rš   Úvaluer’   r}   r2   r2   r7   rÆ   ¿  s    
zGuardBuilder.LIST_LENGTHc                 C   sl   |   |¡}|  |j¡}t|ƒ}tƒ }| d|› d|  |¡› d�¡ | d|› dt|ƒ› �¡ |  ||¡ d S )Nr�   rŽ   r�   z___tuple_iterator_len(r°   )	rŒ   r†   rE   r�   r·   rŠ   ri   r0   r‘   r×   r2   r2   r7   ÚTUPLE_ITERATOR_LENÊ  s    
zGuardBuilder.TUPLE_ITERATOR_LENc                 C   s8   |   |¡}|   | ¡ ¡}|› d|› �g}|  ||¡ d S )Nú is )rŒ   rE   r‘   )r‚   ra   Úsource_bZref_aZref_br}   r2   r2   r7   ÚDUPLICATE_INPUTÖ  s    
zGuardBuilder.DUPLICATE_INPUTc           	      C   sÀ   |   |¡}|  |j¡}t|ƒ}tƒ }| d|› d|  |¡› d�¡ tt|ƒƒ}tt	|ƒƒ}t
|| jd�}|rš| d|› d|›�¡ | d|› d|› �¡ n| d|› d	|› �¡ |  ||¡ d S )
Nr�   rŽ   r�   ©rm   z___dict_param_key_ids(r°   z___dict_const_keys(zset(ú.keys()) == )rŒ   r†   rE   r�   r·   rŠ   ri   r¹   r)   r'   r(   rm   r‘   )	r‚   ra   rš   rØ   r’   r}   Zparam_key_idsZ
const_keysZconst_keys_reprr2   r2   r7   Ú	DICT_KEYSÝ  s    
zGuardBuilder.DICT_KEYSc                 C   s   |   ||  |¡› d�g¡ d S )Nz is not None)r‘   rŒ   rÑ   r2   r2   r7   ÚWEAKREF_ALIVEï  s    zGuardBuilder.WEAKREF_ALIVEc                 C   sz   |   |¡}|  |j¡}t|ƒ}dd„ | ¡ D ƒ}tƒ }| d|› d|  |¡› d�¡ | d|› d|›�¡ |  ||¡ d S )Nc                 S   s   h | ]\}}|’qS r2   r2   )r5   ÚkÚvr2   r2   r7   r8   ö  s     z5GuardBuilder.NN_MODULE_PARAM_NAMES.<locals>.<setcomp>r�   rŽ   r�   z{k for k, v in z.named_parameters()} == )	rŒ   r†   rE   r�   Znamed_parametersr·   rŠ   ri   r‘   )r‚   ra   rš   rØ   r’   rÂ   r}   r2   r2   r7   ÚNN_MODULE_PARAM_NAMESò  s    
z"GuardBuilder.NN_MODULE_PARAM_NAMESc                 C   sp   |   |¡}|  |j¡}t|ƒ}tƒ }| d|› d|  |¡› d�¡ | d|› dt| ¡ ƒ›�¡ |  	||¡ dS )zOrderedDict keys matchr�   rŽ   r�   r¯   rÞ   N)
rŒ   r†   rE   r�   r·   rŠ   ri   re   rÂ   r‘   r×   r2   r2   r7   Ú
ODICT_KEYSþ  s    
zGuardBuilder.ODICT_KEYSc                 C   s   t  |  |j¡| j¡ d S r<   )r   Úwatchr†   rE   rl   rÑ   r2   r2   r7   ÚOBJECT_MUTATION
  s    zGuardBuilder.OBJECT_MUTATIONc                 C   sD   |j dkst‚|jtjkst‚d}tjr.d}nd}|  ||g¡ dS )zGuard on the initial grad staterO   Nz___is_grad_enabled()znot ___is_grad_enabled())rE   r¦   rœ   r   ÚGLOBALr   Zinitial_grad_stater‘   r�   r2   r2   r7   Ú	GRAD_MODE  s    zGuardBuilder.GRAD_MODEc                 C   s6   |j tjkst‚d}tjr d}nd}|  ||g¡ dS )z1Guard on the initial determinism algorithms stateNz)___are_deterministic_algorithms_enabled()z-not ___are_deterministic_algorithms_enabled())rœ   r   rç   r¦   r   Z&initial_deterministic_algorithms_stater‘   r�   r2   r2   r7   ÚDETERMINISTIC_ALGORITHMS  s    z%GuardBuilder.DETERMINISTIC_ALGORITHMSc                 C   s6   |j tjkst‚d }tjr d}nd}|  ||g¡ d S )Nz___is_torch_function_enabled()z"not ___is_torch_function_enabled())rœ   r   rç   r¦   r   Zinitial_torch_function_stater‘   r�   r2   r2   r7   ÚTORCH_FUNCTION_STATE"  s    z!GuardBuilder.TORCH_FUNCTION_STATEc                 C   s<   |j tjkst‚ddlm  m} |  |d|j›�g¡ dS )z/Guard on CURRENT_DEVICE per torch.utils._devicer   Nzutils_device.CURRENT_DEVICE == )	rœ   r   rç   r¦   Útorch.utils._deviceÚutilsÚ_devicer‘   ZCURRENT_DEVICE)r‚   ra   r6   r2   r2   r7   ÚDEFAULT_DEVICE+  s     ÿzGuardBuilder.DEFAULT_DEVICEc                    s  |j dkst‚| jj‰ ˆ j}dd„ |D ƒ}‡ fdd„}ˆ jr¸g }ˆ jD ]b}||j|jƒ^‰}| ‡fdd„|D ƒ¡ |j	d k	rF||j	j|j	jƒ}| ‡fdd„|D ƒ¡ qFt
|d	d
�}nd }ˆ jjdd„ |D ƒdd„ |D ƒ||| j| jjj d�}	ˆ j ¡  |	D ]}
| j||
gdd� �q d S )NrO   c                 S   s   g | ]
}|j ‘qS r2   )Zconstraint_dims©r5   r=   r2   r2   r7   Ú
<listcomp><  s     z*GuardBuilder.SHAPE_ENV.<locals>.<listcomp>c                    s   ‡ fdd„ˆj |  D ƒS )Nc                    s   g | ]}t |tjˆ ƒ‘qS r2   )r   r   ZSIZE)r5   rœ   ©Údimr2   r7   rð   A  s   ÿz?GuardBuilder.SHAPE_ENV.<locals>.get_sources.<locals>.<listcomp>)Ztracked_fakes_id_to_source)Út_idrò   )Úoutput_graphrñ   r7   Úget_sources>  s    
þz+GuardBuilder.SHAPE_ENV.<locals>.get_sourcesc                 3   s   | ]}ˆ |fV  qd S r<   r2   ©r5   Zother_source©rœ   r2   r7   r®   L  s    z)GuardBuilder.SHAPE_ENV.<locals>.<genexpr>c                 3   s   | ]}ˆ |fV  qd S r<   r2   rö   r÷   r2   r7   r®   V  s    F)Úsource_pairsZ	warn_onlyc                 S   s   g | ]
}|j ‘qS r2   )Zfakerï   r2   r2   r7   rð   `  s     c                 S   s   g | ]
}|j ‘qS r2   r÷   rï   r2   r2   r7   rð   a  s     )Úconstraint_inputsÚequalities_inputsrj   Zignore_staticT)Ú	shape_env)rE   r¦   rl   rô   Ztracked_fakesZexport_constraintsró   rò   ÚextendZsharedr   rû   Zproduce_guardsrj   ÚexportÚfreezer‘   )r‚   ra   Úfsrù   rõ   rø   Ú
constraintZother_sourcesrú   r1   Zshape_guardr2   )rô   rœ   r7   Ú	SHAPE_ENV4  sH    
ÿ
 ÿÿ
þ
ù	
zGuardBuilder.SHAPE_ENVNc           
   
   C   s–  |  ¡ r|  |¡ �n|t|tƒr&|ƒ }|d k	r2|n
|  |j¡}t|tjƒsNt‚|  	|¡}t
ƒ }| jjjrê|  |¡ ddddg}|D ]d}|  |d | ¡}t|tjtjfƒrÌ| d|› d|› dt|ƒ›�¡ q‚| |› d|› d|› �¡ q‚n$| j |¡ | j |¡ | j |¡ |jd k	�st‚t|d	|jd
�\}}	|�sxt|dƒ�rf| d|› d|j› d|› d�¡ n| d|› d�¡ t|ƒdk�r’|  ||¡ d S )Nr¾   rF   Úrequires_gradzndimension()rt   r¯   r°   r²   T)Z	is_tensorÚguard_sourceÚ_dynamo_dynamic_indicesz((z"._dynamo_dynamic_indices.issubset(z)) if hasattr(z', '_dynamo_dynamic_indices') else True)r¤   z%, '_dynamo_dynamic_indices') == Falser   )Úis_nn_modulerž   r‡   r   r†   rE   r:   ZTensorr¦   rŒ   r·   rl   rô   rý   r”   r,   rF   r¾   rŠ   re   r   r€   r�   rœ   r.   r¨   r  rÖ   r‘   )
r‚   ra   rØ   Ztensor_namer}   ZtermsÚtermÚ
real_valueZstaticÚreasonr2   r2   r7   ÚTENSOR_MATCHl  sN    



ü"  ÿ
ÿ
ÿzGuardBuilder.TENSOR_MATCHFc                 C   s  t ƒ }|d k	st‚|j}~|d k	s&t‚t|ƒd }~|t| jƒksPtd|› �ƒ‚|rh| j t||ƒ¡ n| j	 t||ƒ¡ |d kr¬|j
d k	o”|j
dk}|r¦|  |j
¡nd }	n|}	|	d k	rÆt t|	ƒ¡nd }
d }t|	jdƒrðt|	tjƒsðt |	¡}| ||
||¡ d S )NrG   zH_produce_guard_code must be called from inside GuardedCode. Called from rO   Ú__weakref__)r   r¦   Úf_backr   ÚdirÚ	__class__r~   rŠ   r_   r}   rE   r†   Úweakrefrš   r�   r¨   r‡   ÚenumÚEnumZset_export_info)r‚   ra   r`   r¥   rû   Z	cur_frameZcallerÚ	func_nameZ
name_validZguarded_objectZguarded_object_typeZobj_refr2   r2   r7   r‘   Ð  sB    ÿþÿ ÿ
üz GuardBuilder._produce_guard_code)N)NF)-rb   rc   rd   r   r
   Úobjectre   r   r   r   r¶   rƒ   r   r†   r   r   rŒ   r”   r™   r›   rž   r¢   r£   r«   rÊ   rË   rÏ   rÒ   rÔ   rÕ   rÆ   rÙ   rÜ   rß   rà   rã   rä   ræ   rè   ré   rê   rî   r  r	  r‘   r2   r2   r2   r7   rg   «   sL   ù>W
		8e   ÿrg   c                   @   s¨   e Zd ZdZejejejfZe	j
G dd„ dƒƒZG dd„ dejƒZG dd„ dejƒZdd	œd
d„Zdeedœdd„Zee ddœdd„Zeeee ef dœdd„ZdS )ÚPyExprCSEPassr   c                   @   s.   e Zd ZU eeef ed< eeef ed< dS )úPyExprCSEPass.ConfigÚ
expr_countÚexpr_to_nameN)rb   rc   rd   r   re   r´   rf   r2   r2   r2   r7   ÚConfig  s   
r  c                       s6   e Zd Zdddœdd„Zejedœ‡ fdd„Z‡  ZS )	zPyExprCSEPass.ExprCounterr  N)r   rL   c                 C   s
   || _ d S r<   )Ú_config)r‚   r   r2   r2   r7   rƒ   !  s    z"PyExprCSEPass.ExprCounter.__init__rJ   c                    s4   t |tjƒr$| jjt|ƒ  d7  < tƒ  |¡ d S ©Nr   )r‡   r  ÚALLOWED_NODE_TYPESr  r  rT   ÚsuperÚvisit)r‚   rK   ©r  r2   r7   r  $  s    zPyExprCSEPass.ExprCounter.visit)	rb   rc   rd   rƒ   rU   ÚASTr   r  Ú__classcell__r2   r2   r  r7   ÚExprCounter   s   r   c                       sD   e Zd Zdeg ef ddœ‡ fdd„Zejedœ‡ fdd„Z	‡  Z
S )	zPyExprCSEPass.Replacerr  N)r   Úgen_namerL   c                    s    t ƒ  ¡  || _|| _g | _d S r<   )r  rƒ   r  Ú	_gen_nameÚpreface)r‚   r   r!  r  r2   r7   rƒ   *  s    
zPyExprCSEPass.Replacer.__init__rJ   c                    sš   t |tjƒrŽt|ƒ}| jj| tjkrŽ|| jjkrrtƒ  	|¡}t|ƒ}|  
¡ }| j |› d|› �¡ || jj|< n| jj| }t |t ¡ ¡S tƒ  	|¡S )Nz = )r‡   r  r  rT   r  r  ÚUSE_THRESHOLDr  r  r  r"  r#  rŠ   rU   ÚNameÚLoad)r‚   rK   ÚexprZnode_Zexpr_Úvar_namer  r2   r7   r  4  s    zPyExprCSEPass.Replacer.visit)rb   rc   rd   r   re   rƒ   rU   r  r   r  r  r2   r2   r  r7   ÚReplacer)  s
   
ü
r)  N©rL   c                 C   s$   d| _ | jt dd„ ¡i d�| _d S )Nr   c                   S   s   dS )Nr   r2   r2   r2   r2   r7   r?   Q  r@   z(PyExprCSEPass.__init__.<locals>.<lambda>)r  r  )Ú_counterr  ÚcollectionsÚdefaultdictr  ©r‚   r2   r2   r7   rƒ   N  s
     ÿzPyExprCSEPass.__init__Ú_var)ÚprefixrL   c                 C   s    |› | j › �}|  j d7  _ |S r  )r+  )r‚   r0  rE   r2   r2   r7   Ú_new_varT  s    zPyExprCSEPass._new_var)ÚexprsrL   c                 C   s*   |   | j¡}|D ]}| t |¡¡ qd S r<   )r   r  r  rU   Úparse)r‚   r2  ÚcounterÚer2   r2   r7   ÚcountY  s    zPyExprCSEPass.count©r'  rL   c                 C   s.   |   | j| j¡}| t |¡¡}|jt|ƒfS r<   )r)  r  r1  r  rU   r3  r#  rT   )r‚   r'  ÚreplacerÚnew_noder2   r2   r7   rR   ^  s    zPyExprCSEPass.replace)r/  )rb   rc   rd   r$  rU   Ú	AttributeÚCallÚ	Subscriptr  ÚdataclassesÚ	dataclassr  ÚNodeVisitorr   ÚNodeTransformerr)  rƒ   re   r1  r   r6  r	   rR   r2   r2   r2   r7   r    s   	%r  c                   @   sJ   e Zd Zdeeeeef gdf  dœdd„Zdd„ Zdd„ Z	d	d
„ Z
dS )rh   N)Úguard_fail_fnc           	         s  |r
|j nd }d| _i | _|| _dd„ }‡ ‡fdd„}t| j|||j|jƒ| dd�}t| j||j| dd�}d|jkr„|jd |jd< t	 
|¡‰t	 
|¡‰ t|p g tjd	�D ]D}tjsâ| ¡ râd
|jkrâd|jkrâtjsªd|jkrâqª| ||¡ qª|  ||||¡| _| j ¡  d S )NTc                 S   s    | d kr|S |d kr| S | |–S r<   r2   )ÚleftÚrightr2   r2   r7   Úcombine_scopesz  s
    z5CheckFunctionManager.__init__.<locals>.combine_scopesc                    sD   |   ¡ }|tjkr|  ¡ S | ˆƒ ˆ ƒ ¡}|d k	s6t‚| |  ¡ ¡S r<   )r  r   ZCONSTANTrE   Úselectr¦   rŒ   )rœ   r  Zbuilder©Zw_globalZw_localr2   r7   rj   ƒ  s    
z1CheckFunctionManager.__init__.<locals>.source_refrÝ   Fro   )r•   Ú__defaults__Ú__kwdefaults__Úhooks)r1   ÚvalidÚ	_weakrefsrô   rg   ri   Úglobal_scopeZlocal_scoperv   r  rš   Úsortedr   Úsort_keyr   Zguard_nn_modulesr  rE   Zskip_nnmodule_hook_guardsÚcreateÚcompile_check_fnZcheck_fnÚclear)	r‚   rô   rA  r1   rD  rj   Úlocal_builderÚglobal_builderra   r2   rF  r7   rƒ   o  s\    		û    ÿ


ÿþûúùù	   ÿzCheckFunctionManager.__init__c           )         sŽ  t |jƒt |jƒ@ rt‚|j}|dg7 }d |¡}t d¡ dg‰ tj t	¡}d%‡ fdd„	}|j
D ]}	|	jD ]}
||
|	jƒ qlqb|j
D ]}	|	jD ]}
||
|	jƒ q�q†|j|j }d }d }|�r
ˆjjrÎtdƒ‚|j|j }d }d }d	d
„ ‰‡‡fdd„|D ƒ}‡‡fdd„|D ƒ}t|||dœŽ}|j}|j}d |dg ¡}ˆ  d|› d�¡ |j|j }t|ƒD ]¤\}}|| }t|ƒ}tj |¡tj ¡ B tj ¡  }|j}|jj}|j }|| }|| }|d|› d|j!› d|› d|› d|› d|› d|› d|› d�|| dd� �qdˆj�rˆjj"j#j$ng }|D ]J}t%|t&ƒ�r`|j'} |j(}!||  )¡ › d|! )¡ › �d ƒ nt*d|› �ƒ‚�q&|j+D ] }	|	jD ]}
||
|	jƒ �q‚�qx|j+�r¦t‚t, -dˆfd|fd|fd|fgt.t/ 0¡ ƒ ¡}"|" 1t2¡ t.t3ˆ ƒƒ}#d |" 4¡ ¡}$t5|#|$ƒ\}%}&tj6 7d d ¡d!k�r$t8d"|%ƒ t9ƒ �s6|d k	�r>t:t;ƒ t<ƒ }'t=|&|j>|'ƒ |'d# |" ?¡ Ž }(|"|(_@||(_Aˆ |(_Bd$|j>d$ i|(_C||(_D|(S )&Nz**___kwargs_ignoredú,zGUARDS:z___guarded_code.validFc                    s   t  tj¡r�d}|d k	rz|jr\t|jƒD ]}|jtƒ kr( qHq(|jd }dt|dd�› �}n|j	rzdt|j	 
¡ d ƒ› �}t  d| d›|› �¡ t tj¡rîd}d}|d k	rÞdd |j	 ¡ ¡› �}|jrÞd	d |j ¡ ¡› �}t d
| ||¡ |süˆ  | ¡ d S )NrO   éÿÿÿÿz  # T)Úlinez%sz<60z
Stack:
z
User stack:
zGuard: %s%s%s)Ú
guards_logÚisEnabledForÚloggingÚDEBUGZ
user_stackÚreversedÚfilenamer;   r   ÚstackÚsummaryÚdebugÚverbose_guards_logÚjoinÚformatrŠ   )r}   ra   Úlog_onlyÚextrarÿ   Zmaybe_stackZmaybe_user_stack)Ú
code_partsr2   r7   Úadd_code_part¾  s8    
ÿüz<CheckFunctionManager.compile_check_fn.<locals>.add_code_partz,Illegal to set tensor_check_names in export.c                 S   sH   g }| D ]:}t |tƒr"| |¡ qt |tjƒs2t‚| |j ¡ ¡ q|S r<   )r‡   r´   rŠ   r:   ZSymIntr¦   rK   Zmaybe_as_int)Zsize_or_strideZ	convertedrò   r2   r2   r7   Úconvertü  s    
z6CheckFunctionManager.compile_check_fn.<locals>.convertc                    s$   g | ]}ˆ ˆj jt|ƒ d  ƒ‘qS )Úsize©rô   Ztensor_weakref_to_sizes_stridesr   ©r5   r’   ©rg  r‚   r2   r7   rð     s   ûÿÿz9CheckFunctionManager.compile_check_fn.<locals>.<listcomp>c                    s$   g | ]}ˆ ˆj jt|ƒ d  ƒ‘qS )Zstrideri  rj  rk  r2   r7   rð     s   ûÿÿ)Údynamic_dims_sizesÚdynamic_dims_stridesrŽ   z%tensor_check_names=tensor_check_namesz___check_tensors(r�   zcheck_tensor(z	, device=z, requires_grad=z, size=z	, stride=T)rc  rÚ   zUnknown GuardEnvExpr: Z___guarded_codeÚ___check_tensorsÚ___check_tensors_verboser   ZTORCHDYNAMO_PRINT_GUARDSÚ1zGUARDS
Z___make_guard_fnro   )F)Er¹   r|   r¦   ra  rW  r_  ÚosÚpathÚdirnameÚ__file__r}   r`   ra   r   rô   rý   r€   ÚTensorGuardsÚcheckZcheck_verboserŠ   r�   rÇ   r�   r:   Ú_CZ_dispatch_keysZ_dispatch_tls_local_include_setZ_dispatch_tls_local_exclude_setr¾   rF   Úindexr  rd   Ztracing_contextZguards_contextÚaotautograd_guardsr‡   r   Zinput_source_aZinput_source_brE   ÚRuntimeErrorr~   r,  ÚOrderedDictr·   r   r{   Úupdater…   ÚuniquerÂ   Úbuild_guard_functionÚenvironr†   Úprintr+   r!   Úguard_fail_hookru   Úexecrv   rÃ   Úclosure_varsÚargsre  rL  rA  ))r‚   rR  rS  Z
guards_outrA  Úlargsr„  r‹   rf  Zgclr}   r   Zcheck_tensors_fnZcheck_tensors_verbose_fnr€   rl  rm  Ztensor_guardsZtensor_check_argsr�   ÚirE   r’   ZpytypeZdispatch_keyr¾   Zdevice_indexr  ÚsizesÚstridesry  ra   Zsource_arÛ   rƒ  Zunique_code_partsZmake_guard_fn_argsÚ
guard_bodyZpycodeÚoutÚguard_fnr2   )re  rg  r‚   r7   rP  ¯  sÚ    


%




ÿÿþÿÿ
ú	ú	ýÿ
ÿ
ÿý6ü
	ÿý

ü
úÿ	

 ÿz%CheckFunctionManager.compile_check_fnc                 C   s
   d| _ d S )NF)rJ  r.  r2   r2   r7   Ú
invalidatex  s    zCheckFunctionManager.invalidatec                 C   sR   z4t |ƒ| jkr2t |¡| jt |ƒ< t || j¡ W n tk
rH   Y nX t |ƒS )zadd a weakref, return the id)ÚidrK  r  rš   ÚfinalizerŒ  Ú	TypeError)r‚   r¡   r2   r2   r7   ri   |  s    zCheckFunctionManager.id_ref)NN)rb   rc   rd   r   r   r	   re   rƒ   rP  rŒ  ri   r2   r2   r2   r7   rh   n  s     ýý@ Jrh   r*  c           	   
      s<  ddl m} trBtƒ ‰ ˆ  | ¡ tttt tf dœ‡ fdd„}ntttt tf dœdd„}|ƒ }| D ]J}||ƒ\}}| |¡ | 	d|› d�¡ | 
¡ � | 	d	¡ W 5 Q R X qh|ƒ }| 	d
¡ | 
¡ � | |¡ | 	d¡ W 5 Q R X |ƒ }| 	d|› d�¡ | 
¡ � | |¡ | 	d¡ W 5 Q R X | ¡ | ¡ fS )Nr   )ÚIndentedBufferr7  c                    s
   ˆ   | ¡S r<   )rR   ©r'  ©Zcsepassr2   r7   rR   ‘  s    z%build_guard_function.<locals>.replacec                 S   s   g | fS r<   r2   r‘  r2   r2   r7   rR   –  s    zif not (z):zreturn Falsezdef guard(L):zreturn Truezdef ___make_guard_fn(zreturn guard)Ztorch._inductor.utilsr�  ÚHAS_UNPARSE_FUNCTIONSr  r6  re   r	   r   Ú
writelinesZ	writelineÚindentZspliceÚgetvalue)	re  Zclosure_argsr�  rR   r‰  r'  r#  ra   Zmake_guard_fnr2   r’  r7   r~  Š  s0    
"






r~  )r‹  r}   Úf_localsrx  ÚlastrL   c              
   C   s8  |dk}| j s|s|sdS || jd dœ}| | j¡ |d |d< d}| jD ]^}t| jƒ}	||	d< tƒ � t||	|ƒ}
W 5 Q R X t|
t	ƒr”|
} q¬qLt|
t
ƒrL|
sL|} q¬qL|r´|a|s¼dS tsÄt‚tt|   t¡ daz&| j dk	rþ|   t|pòdt| ƒ¡ W n2 tk
�r2 } ztjd	d
d� W 5 d}~X Y nX dS )z(
    called whenever a guard fails.
    r   Nro   )rn   ro   ro  rn  Z__compile_source__zunknown reasonzVFailure in guard_fail_fn callback - raising here will cause a NULL Error on guard evalT)Úexc_info)rA  rL  r|  rƒ  re  ru   r   r„   r‡   re   r¶   Ústashed_first_fail_reasonr¦   r*   r-   rŠ   r%   Ú	Exceptionrˆ   Úerror)r‹  r}   r—  rx  r˜  Úfirstrv   r  ÚpartrL  Zfail_reasonr5  r2   r2   r7   r�  ¸  sF    




ÿþr�  ©r‹  r}   r—  rx  r˜  c                 C   sN   t d|j› d|j› d|j› �ƒ t dd | j¡ d ƒ t dd | j¡ƒ d S )NzERROR RUNNING GUARDS ú ú:zlambda rŽ   z and
  )r€  Úco_nameÚco_filenameÚco_firstlinenora  r„  re  rŸ  r2   r2   r7   Úguard_error_hookô  s
    ÿr¥  c                 c   s,   t ƒ }| D ]}||kr
|V  | |¡ q
d S r<   )r¹   Úadd)ÚseqÚseenr¬   r2   r2   r7   r}  	  s
    r}  c                 C   s8   |r4|| kr4t |ƒ}t | ƒ}||kr4tjtj|d�S d S )N)rÛ   )r   Ú	functoolsÚpartialrg   rÜ   )Z
obj_sourceZdupe_sourceZser_source_is_localZsource_is_localr2   r2   r7   Úmake_dupe_guard  s    r«  )€rU   rw   r,  r=  r  r©  rB   r3   rÀ   rY  rÄ   rq  rW   ÚsysÚtypesr  r   r   Útypingr   r   r   r   r   r	   r
   r   r   Únumpyr³   ÚModuleNotFoundErrorr:   rë   Ztorch._dynamo.sourcer   r   r   Ztorch._guardsr   r   r   r   r   r   Z%torch.fx.experimental.symbolic_shapesr   r   Ztorch.utils._tracebackr   r   Ztorch.utils.weakr   r   rO   r   r   r   Z
eval_framer    r!   Úexcr"   rœ   r#   r$   r%   r&   rì   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   Ú	getLoggerrb   rˆ   Z_loggingZgetArtifactLoggerrW  r`  rw  r9   r1   ru  Zcheck_obj_idZcheck_type_idÚ	lru_cacher;   r{  Zis_grad_enabledZ$are_deterministic_algorithms_enabledZ_is_torch_function_enabledÚ__getitem__rÅ   rµ   rí   rF   Z	as_tensorr…   Úversion_inforP   r  re   rT   r“  ÚImportErrorrZ   r[   r>  r_   rg   r  rh   r~  rš  ÚCodeTyper  r´   r¶   r�  r¥  r}  r«  r2   r2   r2   r7   Ú<module>   sÔ   (
 0

	þ





ìÿ
    l[  +
ú=
û