o
    I&id                     @  s"  d dl m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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!y}   dZ Y nw 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/m0Z0m1Z1m2Z2 d d	l3m4Z4m5Z5 d d
l6m7Z7 ddl8m9Z9m:Z:m;Z;m<Z< ddl=m>Z> ddl?m@Z@mAZAmBZB ddlmCZCmDZDmEZE ddlFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZO ePeQZRe"jSTeQdZUe"jSTeQdZVe"jSTeQdZWe"jSTeQdZXe"jYjZj[j\Z\e"jYjZj[j]Z]e"jYjZj[j^Z^e"jYjZj[j_Z_e`ddd Zai de^de]ddd ddd ddd d d!d d"d#d d$ejbjcd%eId&eGd'e_d(d)d d*eOd+eNd,ejdd-eed-d.ejfe"jFjge"jhd/d e"d0Ziejjdd1 d2krzd dlkZkdkd7d8Zld9ZmW n eny   d:ZmY nw d9Zmdkd;d8Zld<d= Zod>d? ZpejqG d@dA dAZrG dBdC dCe+ZsG dDdE dEZtdFdG ZuG dHdI dIZvdldKdLZwdMdN ZxdOdP ZydmdWdXZzdnd\d]Z{dodbdcZ|e>e| ddde Z}dfdg Z~d dhdidjZdS )p    )annotationsN)currentframegetframeinfo)AnyCallableDictListOptionalTupleTypeUnion)ReferenceType)is_from_local_sourceTensorPropertyTensorPropertySource)DuplicateInputsGuardGuardBuilderBaseGuardEnvExprGuardSourceSource)EqualityConstraintis_symbolicSYMPY_INTERP)format_framereport_compile_source_on_error)TensorWeakRef   )configconvert_frameexcmutation_guard)set_guard_error_hook)DefaultsSourceLocalSource
TypeSource)GuardedCode	GuardFailGuardFn)	dict_const_keysdict_const_keys_reprdict_param_key_idsguard_failuresistypeorig_code_maptensor_always_has_static_shapetuple_iterator_getitemtuple_iterator_lenguards
recompilesrecompiles_verboseZ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mr5   r5   ?C:\wamp64\www\opt\env\Lib\site-packages\torch/_dynamo/guards.py	<setcomp>]   s    z&uninteresting_files.<locals>.<setcomp>)Ztorch._dynamo.external_utils_dynamoZexternal_utils)torchmodsr5   r5   r:   uninteresting_filesV   s   r?   Z___check_type_idZ___check_obj_idZ___current_backendc                   C     t jjjjS N)r=   r<   
eval_frameguarded_backend_cachecurrent_backendr5   r5   r5   r:   <lambda>d       rE   Z___lookup_backendc                 C  s   t jjjj|  S rA   )r=   r<   rB   rC   Zcached_backends)Zbackend_obj_idr5   r5   r:   rE   g   s   
 Z___skip_backend_checkc                   C  r@   rA   )r=   r<   rB   rC   Z$skip_backend_check_for_run_only_moder5   r5   r5   r:   rE   l   rF   Z___compile_config_hashc                   C  s   t jj  S rA   )r=   r<   rB   "get_saved_else_current_config_hashhexr5   r5   r5   r:   rE   o   s    Z___needs_nopythonc                   C  r@   rA   )r=   r<   rB   Zconfig_cacheZnopythonr5   r5   r5   r:   rE   q   rF   Z___odict_getitemZ___dict_param_key_idsZ___dict_const_keysZ___dict_versionZ___dict_containsc                 C  s   | |v S rA   r5   )abr5   r5   r:   rE   v   s    Z___tuple_iterator_lenZ___tuple_iterator_getitemZ__math_isnaninfZ__load_modulec                 C  s    t | tjtjfrt| S | S rA   )
isinstancenpZgenericZndarrayr=   Z	as_tensor)rI   r5   r5   r:   rE      s     )Zutils_devicedeviceZ___from_numpyr=      )      nodeast.ASTreturnstrc                 C     t | ddS N
 )
astunparseunparsereplacerR   r5   r5   r:   _ast_unparse      r^   TFc                 C  rV   rW   )astr[   r\   r]   r5   r5   r:   r^      r_   c                 C  sb   t d}d}| D ]#}|dv rd}q	|dv r(|r'|dkr'||r't|  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_].*rY   z (z),[]None)recompilematchstrip_function_callstrip_getattr_getitem)nameZ
valid_namecurrcharr5   r5   r:   re      s   
	
re   c                 C  s   t d| d S )z*
    "a[1]" => "a"
    "a.foo" => "a"
    z[.\[]r   )rb   split)rg   r5   r5   r:   rf      s   rf   c                   @     e Zd ZU ded< ded< dS )GuardCodeList	List[str]	code_listr   guardN__name__
__module____qualname____annotations__r5   r5   r5   r:   rl         
 rl   c                   @  sj  e Zd ZdaddZdbddZdcddZddddZdeddZdfd!d"Zded#d$Z	ded%d&Z
ded'd(Zded)d*Zded+d,Zded-d.Zded/d0Zded1d2Zded3d4Zded5d6Zded7d8Zded9d:Zd;d< Zd=d> Zd?d@ ZdAdB ZdCdD ZdEdF ZdGdH ZdedIdJZdedKdLZdedMdNZdedOdPZdedQdRZ dedSdTZ!dedUdVZ"dedWdXZ#dedYdZZ$dgded\d]Z%	^dhd_d`Z&d[S )iGuardBuilderid_refCallable[[Any], str]
source_refCallable[[Source], str]lookup_weakrefs)Callable[[object], ReferenceType[object]]local_scopeDict[str, object]global_scopecheck_fn_managerCheckFunctionManagerc           	      C  s   || _ || _|| _||d| _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 | _|| _i | _d | _d S )NLG__builtins__>_<.Z_dot_)rw   ry   r{   scopebuiltins__dict__copyr=   packageZpackage_importerZ_package_imported_modulesitemsr\   argnamescodeshape_env_codetensor_check_namestensor_check_examplestensor_check_guardsr   id_matched_objsconfig_hash)	selfrw   ry   r{   r}   r   r   rg   Zpackage_moduler5   r5   r:   __init__   s*   	
zGuardBuilder.__init__rg   rU   rT   r   c                 C  s   t || jtS rA   )evalr   CLOSURE_VARS)r   rg   r5   r5   r:   get  s   zGuardBuilder.getro   Union[str, Guard]c                 C  s`   t |tr|}n|j}tt|}|| jvr.td|r.td|r(t	d| | j
| |S )Nz[a-zA-Z0-9_]+z^\d+$zinvalid var name: %s)rL   rU   rg   rf   re   r   rb   rd   logwarningappend)r   ro   rg   baser5   r5   r:   arg_ref	  s   

zGuardBuilder.arg_refr   ra   c                 C  sD   t | |j}| |}d| | d| d}| ||g d S )N___check_type_id(, ))typer   rg   rw   r   _produce_guard_code)r   ro   tobj_idr   r5   r5   r:   
TYPE_MATCH  s   
zGuardBuilder.TYPE_MATCHc                 C  s<   |  |}t| |j}d| d| }| ||g d S )Nz___dict_version() == )r   dict_versionr   rg   r   )r   ro   refversionr   r5   r5   r:   DICT_VERSION  s   
zGuardBuilder.DICT_VERSIONkeyinvertboolc                 C  s:   |  |}|r	dnd}| d|d| d}| ||gS )Nnot rY   z___dict_contains(r   r   r   r   )r   ro   r   r   Zdict_refZ	maybe_notr   r5   r5   r:   DICT_CONTAINS&  s   
zGuardBuilder.DICT_CONTAINSc                 C  s&   |  |}d| }| ||g d S )Nr   r   )r   ro   r   r   r5   r5   r:   
BOOL_FALSE-  s   

zGuardBuilder.BOOL_FALSEc                 C  s   t |jtr| t|jjtjS | |}| |j	}d| d| 
| d}| ||g t |jtrPt |tjjrR|jj}| |}|d urT|| j|< d S d S d S d S )Nz___check_obj_id(r   r   )rL   originating_sourcer%   r   r   r   rv   r   r   rg   rw   r   r$   r=   nnModule
local_namer{   r   )r   ro   r   valr   r   Zweak_idr5   r5   r:   ID_MATCH=  s"   

zGuardBuilder.ID_MATCHc                 C  s6   |  |j}| | d|j d}| ||g d S )Nz.__name__ == '')r   rg   r   rq   r   r   ro   objr   r5   r5   r:   
NAME_MATCHV     zGuardBuilder.NAME_MATCHc                 C  s6   |  |j}| | d|  }| ||g d S )Nz.data_ptr() == )r   rg   r   Zdata_ptrr   r   r5   r5   r:   DATA_PTR_MATCH[  r   zGuardBuilder.DATA_PTR_MATCHc                 C  s   t d|j}|sJ d|j |dd\}}| |}t| ||}d }|r4d| d|d}n	d| d|d}| j||g| |d	 d S )
Nz^(.*)[.]([a-zA-Z0-9_]+)$zinvalid hasattr check r   rO   hasattr(r   r   znot hasattr()provided_guarded_object)rb   rd   rg   groupr   hasattrr   r   )r   ro   r9   r   attrr   r   r   r5   r5   r:   HASATTR`  s   
zGuardBuilder.HASATTRc           	        s  |  |}| |j}t|}tr*t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g|R  t|tr`t  fddt!"|# |$ D s_J n
t| sjJ |j%t|trt&'|rt }|(d| d| )| d |(d| d | *|| d S t }t|ttfr| +| t,|D ]\}}|(d| d| d	| )t| d qn|(d| d| )| d t|tjrt|}|(| d
| | *|| d S )Nr5   c                 3  s    | ]}t | V  qd S rA   )r-   )r8   xZok_typesr5   r:   	<genexpr>  s    

z,GuardBuilder.EQUALS_MATCH.<locals>.<genexpr>r   r   r   z__math_isnan([z],  == )-r   r   rg   r   rM   Zint8Zint16Zint32Zint64Zuint8Zuint16Zuint32Zuint64Zfloat16Zfloat32Zfloat64intfloatr   rU   listtuplesetslice	frozensetranger=   SizerN   dtyper-   dictall	itertoolschainkeysvaluesrq   mathisnanr   rw   r   LIST_LENGTH	enumerate)	r   ro   r   r   r   Znp_typesr   idxelemr5   r   r:   EQUALS_MATCHn  s   


 zGuardBuilder.EQUALS_MATCHc                 C  s:   |  |j}t|ttd fr| | d S | | d S rA   )r   rg   r-   r   r   r   r   )r   ro   r   r5   r5   r:   CONSTANT_MATCH  s   zGuardBuilder.CONSTANT_MATCHc                   s^        j fdd}tdr#|  d S tdt  d S )Nc                     s4   t jtsJ jt dj g  d S )Nz.training == )r-   trainingr   r   r   rl   r5   ro   r   r   r   r5   r:   setup_guard  s   z+GuardBuilder.NN_MODULE.<locals>.setup_guardr   z$Guard setup for uninitialized class )r   r   r   rg   r   r    Zunimplementedr   )r   ro   r   r5   r   r:   	NN_MODULE  s   



zGuardBuilder.NN_MODULEc                 C  s   |  r	| |S dS )z0things like torch.add and user defined functionsN)is_localr   r   ro   r5   r5   r:   FUNCTION_MATCH  s   
zGuardBuilder.FUNCTION_MATCHc                 C  st   |  r8| |j}t|tjkr1t|dr1| |}d| d| |j	 dg}| 
|| dS | | dS dS )z!matches a closure by __code__ id.__code__z___check_obj_id(getattr(z, '__code__', None), r   N)r   r   rg   r   typesFunctionTyper   r   rw   r   r   r   )r   ro   r   r   r   r5   r5   r:   CLOSURE_MATCH  s   
zGuardBuilder.CLOSURE_MATCHc                 C  
   |  |S rA   r   r   r5   r5   r:   BUILTIN_MATCH     
zGuardBuilder.BUILTIN_MATCHc                 C  r   rA   r   r   r5   r5   r:   PYMODULE_MATCH  r   zGuardBuilder.PYMODULE_MATCHc                 C  l   |  |}| |j}t|}t }|d| d| | d |d| dt|  | || d S )Nr   r   r   zlen(r   )	r   r   rg   r   r   r   rw   lenr   r   ro   r   valuer   r   r5   r5   r:   r        
zGuardBuilder.LIST_LENGTHc                 C  r   )Nr   r   r   z___tuple_iterator_len(r   )	r   r   rg   r   r   r   rw   r1   r   r   r5   r5   r:   TUPLE_ITERATOR_LEN  r   zGuardBuilder.TUPLE_ITERATOR_LENc                 C  s8   |  |}|  | }| d| g}| || d S )N is )r   rg   r   )r   ro   source_bZref_aZref_br   r5   r5   r:   DUPLICATE_INPUT  s   
zGuardBuilder.DUPLICATE_INPUTc           	      C  s   |  |}| |j}t|}t }|d| d| | d tt|}tt	|}t
|t|jd}|rO|d| d| |d| d|  n|d| d	|  | || d S )
Nr   r   r   )localz___dict_param_key_ids(r   z___dict_const_keys(zset(.keys()) == )r   r   rg   r   r   r   rw   r   r+   r)   r*   r   r   r   )	r   ro   r   r   r   r   Zparam_key_idsZ
const_keysZconst_keys_reprr5   r5   r:   	DICT_KEYS  s   

zGuardBuilder.DICT_KEYSc                 C  s   |  || | dg d S )Nz is not None)r   r   r   r5   r5   r:   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 r5   r5   )r8   kvr5   r5   r:   r;   *  s    z5GuardBuilder.NN_MODULE_PARAM_NAMES.<locals>.<setcomp>r   r   r   z{k for k, v in z.named_parameters()} == )	r   r   rg   r   Znamed_parametersr   r   rw   r   )r   ro   r   r   r   r   r   r5   r5   r:   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   str(r   N)
r   r   rg   r   r   r   rw   rU   r   r   r   r5   r5   r:   
ODICT_KEYS2  s   
zGuardBuilder.ODICT_KEYSc                 C  s   t | |j| j d S rA   )r!   watchr   rg   r   r   r5   r5   r:   OBJECT_MUTATION>  s   zGuardBuilder.OBJECT_MUTATIONc                 C     d S rA   r5   r   r5   r5   r:   	GRAD_MODEA     zGuardBuilder.GRAD_MODEc                 C  r
  rA   r5   r   r5   r5   r:   DETERMINISTIC_ALGORITHMSD  r  z%GuardBuilder.DETERMINISTIC_ALGORITHMSc                 C  r
  rA   r5   r   r5   r5   r:   TORCH_FUNCTION_STATEG  r  z!GuardBuilder.TORCH_FUNCTION_STATEc                 C  s<   |j tju sJ ddlm  m} | |d|jg dS )z/Guard on CURRENT_DEVICE per torch.utils._devicer   Nzutils_device.CURRENT_DEVICE == )sourcer   GLOBALtorch.utils._deviceutils_devicer   ZCURRENT_DEVICE)r   ro   r9   r5   r5   r:   DEFAULT_DEVICEJ  s
   zGuardBuilder.DEFAULT_DEVICEc                 C  s@   |j tju sJ ttjjjj }d| dg}| 	|| dS )z8Guard on backend matching based on id of current_backendzF(___skip_backend_check() or ___current_backend() == ___lookup_backend(z))N)
r  r   r  idr=   r<   rB   rC   rD   r   )r   ro   Z
backend_idr   r5   r5   r:   BACKEND_MATCHS  s   
zGuardBuilder.BACKEND_MATCHc                 C  sD   t jj }|jtju sJ d|  dg}|| _| 	|| dS )z:Guard on the hash of the compiled function's dynamo configz___compile_config_hash() == 'r   N)
r=   r<   rB   rG   r  r   r  rH   r   r   )r   ro   r   r   r5   r5   r:   CONFIG_HASH_MATCH^  s
   zGuardBuilder.CONFIG_HASH_MATCHc                 C  s   dg}|  || d S )Nznot ___needs_nopython())r   )r   ro   r   r5   r5   r:   HAS_GRAPH_BREAKg  s   zGuardBuilder.HAS_GRAPH_BREAKc                   s4  |j dksJ | jj  j}dd |D } fdd} jrhg } jD ]=}|j jv r[||j|j^}|fdd|D  |j	d urZ||j	j|j	j}|fdd|D  q#t
d	 q#t|d
d}nd } jjdd |D dd |D ||| j| jjj d}	 j  |	D ]}
| j||
gdd qd S )NrY   c                 S     g | ]}|j qS r5   )Zconstraint_dimsr8   rI   r5   r5   r:   
<listcomp>v      z*GuardBuilder.SHAPE_ENV.<locals>.<listcomp>c                   s    fddj |  D S )Nc                   s   g | ]	}t |tj qS r5   )r   r   SIZE)r8   r  dimr5   r:   r  {  s    z?GuardBuilder.SHAPE_ENV.<locals>.get_sources.<locals>.<listcomp>)tracked_fakes_id_to_source)t_idr  )output_graphr  r:   get_sourcesx  s   
z+GuardBuilder.SHAPE_ENV.<locals>.get_sourcesc                 3      | ]} |fV  qd S rA   r5   r8   Zother_sourcer  r5   r:   r         
z)GuardBuilder.SHAPE_ENV.<locals>.<genexpr>c                 3  r$  rA   r5   r%  r&  r5   r:   r     r'  z+Untracked tensor used in export constraintsF)source_pairsZ	warn_onlyc                 S  r  r5   )Zfaker  r5   r5   r:   r    r  c                 S  r  r5   r&  r  r5   r5   r:   r    r  )constraint_inputsequalities_inputsry   Zignore_staticT)	shape_env)rg   r   r"  Ztracked_fakesZexport_constraintsr!  r   r  extendZsharedr   r   r   r+  Zproduce_guardsry   exportfreezer   )r   ro   fsr)  r#  r(  
constraintZother_sourcesr*  r2   Zshape_guardr5   )r"  r  r:   	SHAPE_ENVn  sR   



	zGuardBuilder.SHAPE_ENVNc           
   
   C  s  |  r| | d S t|tr| }|d ur|n| |j}t|tjs'J | |}t	 }| j
jjrs| | g d}|D ]2}| |d | }t|tjtjfrd|d| d| dt| q?|| d| d|  q?n| j| | j| | j| |jd usJ t|d|jd\}}	|st|dr|d	| d
|j d| d n	|d| d t|dkr| || d S d S )N)r   rN   requires_gradzndimension()r   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   rL   r   r   rg   r=   ZTensorr   r   r   r"  r-  r   r-   rN   r   r   rU   r   r   r   r  r/   r   r4  r   r   )
r   ro   r   Ztensor_namer   Ztermsterm
real_valueZstaticreasonr5   r5   r:   TENSOR_MATCH  sF   



"


zGuardBuilder.TENSOR_MATCHFc                 C  s  t  }|d us	J |j}~|d usJ t|d }~|t| jv s(J d| |r4| jt|| n	| jt|| |d u rV|j	d uoJ|j	dk}|rS| 
|j	nd }	n|}	|	d urctt|	nd }
d }t|	jdrxt|	tjsxt|	}|||
|| d S )NrO   zH_produce_guard_code must be called from inside GuardedCode. Called from rY   __weakref__)r   f_backr   dir	__class__r   r   rl   r   rg   r   weakrefr   r   r   rL   enumEnumZset_export_info)r   ro   rn   r   r+  Z	cur_frameZcaller	func_nameZ
name_validZguarded_objectZguarded_object_typeZobj_refr5   r5   r:   r     s@   
z GuardBuilder._produce_guard_code)rw   rx   ry   rz   r{   r|   r}   r~   r   r~   r   r   )rg   rU   rT   r   )ro   r   rT   rU   )ro   r   rT   ra   )ro   r   )ro   r   r   rU   r   r   rA   NF)'rq   rr   rs   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  r1  r9  r   r5   r5   r5   r:   rv      sL    

?










Q










	

	
=erv   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ZddddZdddZdddZdS )PyExprCSEPassr   c                   @  rk   )PyExprCSEPass.ConfigzDict[str, int]
expr_countzDict[str, str]expr_to_nameNrp   r5   r5   r5   r:   ConfigZ  ru   rG  c                      s(   e Zd ZdddZd fd
dZ  ZS )zPyExprCSEPass.ExprCounterr   rD  rT   ra   c                 C  s
   || _ d S rA   )_config)r   r   r5   r5   r:   r   `  r   z"PyExprCSEPass.ExprCounter.__init__rR   rS   r   c                   s4   t |tjr| jjt|  d7  < t | d S Nr   )rL   rC  ALLOWED_NODE_TYPESrH  rE  r^   supervisit)r   rR   r=  r5   r:   rL  c  s   zPyExprCSEPass.ExprCounter.visit)r   rD  rT   ra   rR   rS   rT   r   rq   rr   rs   r   rL  __classcell__r5   r5   rM  r:   ExprCounter_  s    
rQ  c                      s,   e Zd Zd fddZd fddZ  ZS )zPyExprCSEPass.Replacerr   rD  gen_nameCallable[[], str]rT   ra   c                   s    t    || _|| _g | _d S rA   )rK  r   rH  	_gen_namepreface)r   r   rR  rM  r5   r:   r   i  s   

zPyExprCSEPass.Replacer.__init__rR   rS   r   c                   s   t |tjrGt|}| jj| tjkrG|| jjvr9t 	|}t|}| 
 }| j| d|  || jj|< n| jj| }t|t S t 	|S )Nz = )rL   rC  rJ  r^   rH  rE  USE_THRESHOLDrF  rK  rL  rT  rU  r   r`   NameLoad)r   rR   exprZnode_Zexpr_var_namerM  r5   r:   rL  s  s   zPyExprCSEPass.Replacer.visit)r   rD  rR  rS  rT   ra   rN  rO  r5   r5   rM  r:   Replacerh  s    
r[  rT   ra   c                 C  s$   d| _ | jtdd i d| _d S )Nr   c                   S  s   dS )Nr   r5   r5   r5   r5   r:   rE     s    z(PyExprCSEPass.__init__.<locals>.<lambda>)rE  rF  )_counterrG  collectionsdefaultdictrH  r   r5   r5   r:   r     s   zPyExprCSEPass.__init___varprefixrU   c                 C  s    | | j  }|  j d7  _ |S rI  )r\  )r   ra  rg   r5   r5   r:   _new_var  s   zPyExprCSEPass._new_varexprsrm   c                 C  s*   |  | j}|D ]
}|t| qd S rA   )rQ  rH  rL  r`   parse)r   rc  counterer5   r5   r:   count  s   zPyExprCSEPass.countrY  Tuple[List[str], str]c                 C  s.   |  | j| j}|t|}|jt|fS rA   )r[  rH  rb  rL  r`   rd  rU  r^   )r   rY  replacernew_noder5   r5   r:   r\     s   zPyExprCSEPass.replaceN)rT   ra   )r`  )ra  rU   rT   rU   )rc  rm   rT   ra   rY  rU   rT   rh  )rq   rr   rs   rV  r`   	AttributeCall	SubscriptrJ  dataclasses	dataclassrG  NodeVisitorrQ  NodeTransformerr[  r   rb  rg  r\   r5   r5   r5   r:   rC  R  s    	
%
rC  c                 C  s   t | jtptjo| jtju S rA   )rL   r   r#   r   Z guard_nn_modules_using_dict_tagsZ	create_fnrv   r   )ro   r5   r5   r:   must_add_nn_module_guards  s   
rs  c                   @  s<   e Zd Z		ddddZdd Zdd	 Zd
d Zdd ZdS )r   Nguard_fail_fn%Optional[Callable[[GuardFail], None]]c                   s   |r|j nd }d| _i | _|| _dd }d   fdd}t| j|| j|j|j| }t	
| t|p2g tjdD ]!}tjsS| rSd|jvrSd|jvrStjsRd	|jvrSq7|| q7| |||| _| j  |j| j_|j| j_d S )
NTc                 S  s$   | d u r|S |d u r| S i | |S rA   r5   )leftrightr5   r5   r:   combine_scopes  s
   z5CheckFunctionManager.__init__.<locals>.combine_scopesc                   sB   |   }|tju r|  S  sJ   }|d usJ ||  S rA   )r3  r   ZCONSTANTrg   r   )r  r3  Z	r_builderZ	w_builderr5   r:   ry     s   
z1CheckFunctionManager.__init__.<locals>.source_ref)r   __defaults____kwdefaults__hooks)r2   valid	_weakrefsr"  rv   rw   r{   r}   r   r>  r   sortedr   sort_keyr   Zguard_nn_modulesr5  rg   Zskip_nnmodule_hook_guardscreatecompile_check_fncheck_fnclearr   r   )r   r"  rt  r2   rx  ry   builderro   r5   ry  r:   r     s@   	

	




	zCheckFunctionManager.__init__c           (        s,  |j }|dg7 }td ddg  d d  d" fdd	}t }|jD ]}|jD ]}||vr;|||j || q*q%|j}	d }
d }|	rj	j
rNJ d|j}d	d
 fdd|D }fdd|D }t|||d}|j}
|j}d|	dg } d| d d| d |j}t|	D ]Q\}}|| }t|}tj|tj B tj  }|j}|jj}|j}|| }|| }|d| d|j d| d| d| d| d| d| d|| dd qj	rj	jjj ng }|D ]#}t!|t"r|j#}|j$}||%  d|%  d  qt&d| |j'D ]}|jD ]	}|||j q#qt(j)} | d u r;t(* } |
|| j|	dt+t,}!t-t. }"d|!/ }#t0|"|#\}$}%t1j23dd dkrkt4d|$ t5 }&t6|%|j7|& |&d  |!8  }'|!|'_9||'_: |'_;|'_<d!|j7d! i|'_=||'_>|'S )#Nz**___kwargs_ignoredzGUARDS:z___guarded_code.validz___check_global_state()Fc                   s   d}|j rt|j D ]}|jt vrdt|dd } nq
n|jr.dt|j d  }td| d|  t	
tjrkd}d}|d urc|jrUdd|j  }|j rcd	d|j   }t	d
| || |s~ |  | d|  d S d S )NrY   z  # T)linez%sz<60z
Stack:
z
User stack:
zGuard: %s%s%s)Z
user_stackreversedfilenamer?   r   stacksummary
guards_logdebugverbose_guards_logisEnabledForloggingDEBUGjoinformatr   )r   ro   log_onlyextrar/  Zmaybe_stackZmaybe_user_stack)
code_partsverbose_code_partsr5   r:   add_code_part  s<   
z<CheckFunctionManager.compile_check_fn.<locals>.add_code_partz,Illegal to set tensor_check_names in export.c                 S  sF   g }| D ]}t |s|| qt|tjsJ ||j  q|S rA   )r   r   rL   r=   ZSymIntrR   Zmaybe_as_int)Zsize_or_strideZ	convertedr  r5   r5   r:   convert=  s   z6CheckFunctionManager.compile_check_fn.<locals>.convertc                       g | ]} j j| d  qS )sizer"  Ztensor_weakref_to_sizes_stridesr8   r   r  r   r5   r:   r  G      z9CheckFunctionManager.compile_check_fn.<locals>.<listcomp>c                   r  )Zstrider  r  r  r5   r:   r  L  r  )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)r  r   zUnknown GuardEnvExpr: )Z___guarded_code___check_tensors___check_tensors_verboseZ___check_global_stater   ZTORCHDYNAMO_PRINT_GUARDS1zGUARDS
Z___make_guard_fnr   )F)?r   r  r  r   r   rn   ro   addr   r"  r-  r   TensorGuardscheckZcheck_verboser  r   r   r   r   r=   _CZ_dispatch_keysZ_dispatch_tls_local_include_setZ_dispatch_tls_local_exclude_setr   rN   indexr2  rs   Ztracing_contextguards_contextaotautograd_guardsrL   r   Zinput_source_aZinput_source_brg   RuntimeErrorr   r   Zinitial_global_stateZGlobalStateGuardr   r   r   uniquer   build_guard_functionosenvironr   printr   execr   r   closure_varsargsr  r  r   rt  )(r   r  Z
guards_outrt  largsr  seenZgclr   r   Zcheck_tensors_fnZcheck_tensors_verbose_fnr   r  r  Ztensor_guardsZtensor_check_argsr   irg   r   ZpytypeZdispatch_keyr   Zdevice_indexr2  sizesstridesr  ro   Zsource_ar   Zglobal_stater  Zunique_code_partsZmake_guard_fn_args
guard_bodyZpycodeoutguard_fnr5   )r  r  r   r  r:   r    s   

!




	





z%CheckFunctionManager.compile_check_fnc                 C  s
   d| _ d S rB  )r}  r_  r5   r5   r:   
invalidate  s   
zCheckFunctionManager.invalidatec                 C  s^   z"t || jvrt|| jt |< t|| j W t |S W t |S  ty.   Y t |S w )zadd a weakref, return the id)r  r~  r>  r   finalizer  	TypeErrorr   r   r5   r5   r:   rw     s   zCheckFunctionManager.id_refc                 C  s    t || jv r| jt | S dS )zFLookup the _weakrefs created in id_ref function for ID_MATCH'd objectsN)r  r~  r  r5   r5   r:   r{     s   z$CheckFunctionManager.lookup_weakrefs)NN)rt  ru  )rq   rr   rs   r   r  r  rw   r{   r5   r5   r5   r:   r     s    E ,r   Tuple[str, str]c           	   	     sT  ddl m} trt   |  d fdd}ndd	d}| }| D ]/}||\}}|| |d
| d |  |d W d    n1 sLw   Y  q"| }|d |  || |d W d    n1 ssw   Y  | }|d| d |  || |d W d    n1 sw   Y  |	 |	 fS )Nr   )IndentedBufferrY  rU   rT   rh  c                   s
     | S rA   )r\   rY  Zcsepassr5   r:   r\     r   z%build_guard_function.<locals>.replacec                 S  s   g | fS rA   r5   r  r5   r5   r:   r\     s   zif not (z):zreturn Falsezdef guard(L):zreturn Truezdef ___make_guard_fn(zreturn guardrk  )
Ztorch._inductor.utilsr  HAS_UNPARSE_FUNCTIONSrC  rg  
writelinesZ	writelineindentZsplicegetvalue)	r  Zclosure_argsr  r\   r  rY  rU  ro   Zmake_guard_fnr5   r  r:   r    s8   








r  c                   C     t jjjdS )Nr3   r=   _logging	_internalZ	log_stateZis_artifact_enabledr5   r5   r5   r:   is_recompiles_enabled     r  c                   C  r  )Nr4   r  r5   r5   r5   r:   is_recompiles_verbose_enabled  r  r  r  r(   r   types.CodeTypef_localsr~   c           
      C  sf  || j d d}|| j |d |d< g }| jD ][}t| j }||d< t - zt|||}W n tyL } zt rGW Y d}~W d   q d}~ww W d   n1 sWw   Y  t	|t
re|se|}t	|trt|| t st nqd|}	tt|  |	 z| jdur| t|	pdt|  W |	S W |	S  ty } ztd	 W Y d}~|	S d}~ww )
z
    Return the reason why `guard_fn` failed.
    Updates `guard_failures` with the generated reason.
    Only the first failed check of guard_fn is reported.
    r   r   r  r  Z__compile_source__NrX   zunknown reasonzVFailure in guard_fail_fn callback - raising here will cause a NULL Error on guard eval)r   updater  r  r   r   r   	Exceptionr  rL   r   rU   r   r  r,   r.   rt  r'   r   	exception)
r  r   r  r   reasonspartr   Zfail_reasonrf  Z
reason_strr5   r5   r:   get_guard_fail_reason  sV   







	r  frametypes.FrameTyperm   c           	      C  s   g }| durt | j| j|j}|r|| | j} | dus|j}t p%t }|s+t	j
rvt r;ddd t|D }n	td|d}d| }d|j d	|j d
|j dt|d }|rnt rit| nt| t	j
rvt||S )z
    Return the list of guard failure reasons using cache_entry.
    Logs the recompilation reason if `recompiles` logging is enabled.
    Raises a RecompileError if `config.error_on_recompile` is enabled.
    Nz

c                 s  s,    | ]\}}d | dt |d V  qdS )zguard z failures:
- N)textwrapr  )r8   r  r8  r5   r5   r:   r   E  s
    
z9get_and_maybe_log_recompilation_reason.<locals>.<genexpr>rX   r  z-triggered by the following guard failure(s):
zRecompiling function z in :z    )r  r  r   r  r   nextf_coder  r  r   Zerror_on_recompiler  r   r  r  co_nameco_filenameco_firstlinenorecompiles_verbose_logr  recompiles_logr    ZRecompileError)	cache_entryr  r  r8  r   Zdo_recompiles_logZfailuresZguard_failure_detailsmessager5   r5   r:   &get_and_maybe_log_recompilation_reason-  s<   






r  r  r   lastr   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  r  zlambda r   z and
  )r  r  r  r  r  r  r  )r  r   r  r  r  r5   r5   r:   guard_error_hook]  s
   r  c                 c  s.    t  }| D ]}||vr|V  || qd S rA   )r   r  )seqr  r   r5   r5   r:   r  r  s   
r  c                 C  s8   |r|| krt |}t | }||krtjtj|dS d S )N)r   )r   	functoolspartialrv   r   )Z
obj_sourceZdupe_sourceZser_source_is_localZsource_is_localr5   r5   r:   make_dupe_guardz  s   r  skipc                 G  sF   ddl m} | jjj}|D ]}t|tsJ ||| d d qdS )z
    Add dynamo guards to the current tracing context.

    Args:
        guards: guard(s) to add
        skip: number of stack frames to ignore for debug stack trace
    r   )TracingContextr   r  N)torch._guardsr  r   r  Zdynamo_guardsr  rL   r   )r  r2   r  r  ro   r5   r5   r:   install_guard  s   r  )rR   rS   rT   rU   )rT   r  )r  r(   r   r  r  r~   rT   rU   )r  r  rT   rm   )
r  r(   r   r  r  r~   r  r   r  r   )
__future__r   r`   r   r]  ro  r?  r  	importlibr6   r   r  r   r  rb   sysr  r   r>  r   r   typingr   r   r   r   r	   r
   r   r   r   numpyrM   ModuleNotFoundErrorr=   r  Ztorch._dynamo.sourcer   r   r   r  r   r   r   r   r   r   Z%torch.fx.experimental.symbolic_shapesr   r   r   Ztorch.utils._tracebackr   r   Ztorch.utils.weakr   rY   r   r   r    r!   rB   r"   r  r#   r$   r%   r&   r'   r(   r  r)   r*   r+   r,   r-   r.   r/   r0   r1   	getLoggerrq   r   r  ZgetArtifactLoggerr  r  r  r  r  r<   r2   r  Zcheck_obj_idZcheck_type_idr   	lru_cacher?   OrderedDict__getitem__r   r   import_moduler  rN   r   version_inforZ   r^   r  ImportErrorre   rf   rp  rl   rv   rC  rs  r   r  r  r  r  r  r  r  r  r  r5   r5   r5   r:   <module>   s   ( ,

	$


     Q  
+

3
0