o
    "i@                    @  sd  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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)m*Z*m+Z+ d dl,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2 d dl3m4Z4 d d	l5m6Z6m7Z7m8Z8 d d
l9m:Z:m;Z; d dl<m=Z= ddl>m?Z?m@Z@mAZAmBZB ddlCmDZD ddlEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZ ddlm[Z[m\Z\m]Z]m^Z^m_Z_ ddl`maZambZbmcZcmdZdmeZemfZfmgZgmhZhmiZimjZj er5d dlkmlZl emenZoe$jpqendZre$jpqendZse$jpqendZte$jpqendZue$jvjwjxjyZye$jvjwjxjzZze$jvjwjxj{Z{e$jvjwjxj|Z|e$jvjwjxj}Z}e$jvjwjxj~Z~e$jvjwjxjZe$jvjwjxjZG dd dZdd Zeddd Zi de{dezdejjd efd!e|d"d#d$ d%ejd&eid'ejd(e"du rdne"jd)ed)d*ejd+e$j`jd,e$jd-ed.e$jd/e$d0e	iZejdd1 d2krzd dlZdd7d8Zd9ZW n ey
   d:ZY nw d9Zdd;d8Zd<d= Zd>d? ZddCdDZddHdIZdJdK ZdLdM ZdNdO ZdPdQ Zejd9dRG dSdT dTZdUdV ZdWdX ZejG dYdZ dZZG d[d\ d\ejZG d]d^ d^e/ZG d_d` d`Zdadb ZG dcdd ddZG dedf dfZddhdiZdjdk Zdldm Zdndo ZddvdwZddzd{ZdddZeDe dd Zdd Zd dddZdS )    )annotationsN)currentframegetframeinfo)
AnyCallableDictListOptionalSetTupleTypeTYPE_CHECKINGUnion)ReferenceType)$is_from_flatten_script_object_sourceis_from_local_sourceis_from_optimizer_sourceTensorPropertyTensorPropertySource)DuplicateInputsGuardGuardBuilderBaseGuardEnvExprGuardSourceSource)
structured)EqualityConstraintis_symbolicSYMPY_INTERP)format_framereport_compile_source_on_error)TensorWeakRef   )configconvert_frameexcmutation_guard)set_guard_error_hook)
AttrSourceChainedSourceConstDictKeySourceDefaultsSourceFlattenScriptObjectSourceFSDPNNModuleSourceGetItemSourceGlobalSourceGlobalStateSourceGlobalWeakRefSource
GradSourceLocalSourceNNModuleSourceNotNNModuleSourceNumpyTensorSourceODictGetItemSourceOptimizerSourceScriptObjectQualifiedNameSourceShapeEnvSourceTupleIteratorGetItemSource
TypeSource)
CacheEntry
ExtraStateGuardedCode	GuardFailGuardFn)
common_constant_typesdict_keys_reprguard_failuresistype	key_is_id	key_to_idorig_code_maptensor_always_has_static_shapetuple_iterator_getitemtuple_iterator_len)Symbolguards
recompilesrecompiles_verboseverbose_guardsc                   @  sR   e Zd ZdZdd Zdd ZdddZd	d
 Zdd Zdd Z	dd Z
dd ZdS )GuardManagera  
    A helper class that contains the root guard manager. An instance of this
    class is stored in the Dynamo cache entry, so that the cache entry can
    access the RootGuardManager stored in the "root" attribute and directly call
    the check_nopybind from C++.
    c                 C  sH   t  | _d | _d | _d | _d | _d | _d | _d | _d | _	d | _
g | _d S N)RootGuardManagerrootclosure_varsargs
code_partsverbose_code_partsglobal_scopeguard_fail_fncache_entryextra_stateid_matched_objsno_tensor_aliasing_sourcesself ra   R/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torch/_dynamo/guards.py__init__   s   
zGuardManager.__init__c                   s&   |j j | } fdd|D }|S )Nc                   s   g | ]} d  | qS )z: ra   ).0part
guard_namera   rb   
<listcomp>   s    z0GuardManager.get_guard_lines.<locals>.<listcomp>)	__class____name__rX   )r`   guardpartsra   rf   rb   get_guard_lines   s   zGuardManager.get_guard_linesNc                 C  s0   |  }|jj}|d | }|r|d| 7 }|S )Nz	: source=, )
get_sourceri   rj   )r`   guard_manageraccessor_strsourcetsra   ra   rb   get_manager_line   s   zGuardManager.get_manager_linec              	   C  s   t |  D ]H\}\}}|d|  | . |r.|d| |  | || |rA|d| |  | || W d    n1 sKw   Y  qd S )NzKeyValueManager pair at index=zKeyManager: zValueManager: )sortedget_key_value_managersitems	writelineindentru   construct_manager_string)r`   mgrbodyidxkey_mgrval_mgrra   ra   rb   construct_dict_manager_string   s   
z*GuardManager.construct_dict_manager_stringc              
   C  s   |  E | D ]
}|| | q	t|tr| || t| |	 D ]\}}|
| |d|   | || q(W d    d S 1 sLw   Y  d S )Nzaccessed_by=)rz   get_leaf_guards
writelinesrm   
isinstanceDictGuardManagerr   zipget_accessorsget_child_managersry   ru   reprr{   )r`   r|   r}   rk   accessor	child_mgrra   ra   rb   r{      s   

"z%GuardManager.construct_manager_stringc                 C  s   ddl m} G dd d|}| }d|_|jddd |jd	dd |d
 | | j| | j D ]
}|| | q3|	 S )Nr   IndentedBufferc                      s&   e Zd Zdd Zd fdd	Z  ZS )z6GuardManager.__str__.<locals>.IndentedBufferWithPrefixc                 S  s   d| j | j  S )Nz| )_indenttabwidthr_   ra   ra   rb   prefix      z=GuardManager.__str__.<locals>.IndentedBufferWithPrefix.prefixFc                   s(   |r
t  | d S t  d|  d S )Nz+- )superry   )r`   lineskip_prefixri   ra   rb   ry      s   z@GuardManager.__str__.<locals>.IndentedBufferWithPrefix.writelineF)rj   
__module____qualname__r   ry   __classcell__ra   ra   r   rb   IndentedBufferWithPrefix   s    r   r"    T)r   zTREE_GUARD_MANAGER:rS   )
torch._inductor.utilsr   r   ry   r{   rT   get_epilogue_lambda_guardsr   rm   getvalue)r`   r   r   r}   rk   ra   ra   rb   __str__   s   

zGuardManager.__str__c                 C     | j |S rR   )rT   checkr`   xra   ra   rb   r         zGuardManager.checkc                 C  r   rR   )rT   check_verboser   ra   ra   rb   r      r   zGuardManager.check_verboserR   )rj   r   r   __doc__rc   rm   ru   r   r{   r   r   r   ra   ra   ra   rb   rQ      s    
rQ   c                 C  s    t | tjtjfrt| S | S rR   )r   npgenericndarraytorch	as_tensor)ara   ra   rb   
from_numpy   s    r   c                  C  s    dd l } | jjg}dd |D S )Nr   c                 S  s   h | ]}t |qS ra   )inspectgetfile)rd   mra   ra   rb   	<setcomp>       z&uninteresting_files.<locals>.<setcomp>)torch._dynamo.external_utils_dynamoexternal_utils)r   modsra   ra   rb   uninteresting_files   s   r   ___check_type_id___check_obj_id___odict_getitem___key_to_id___dict_version___dict_containsc                 C  s   | |v S rR   ra   )r   bra   ra   rb   <lambda>       r   ___tuple_iterator_len___tuple_iterator_getitem__math_isnan__numpy_isnaninf__load_moduleutils_devicedevice___from_numpy___as_tensorr   r      )      nodeast.ASTreturnstrc                 C     t | ddS N
r   )
astunparseunparsereplacer   ra   ra   rb   _ast_unparse     r   TFc                 C  r   r   )astr   r   r   ra   ra   rb   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_].*r   z (z),[]None)recompilematchstrip_function_callstrip_getattr_getitem)name
valid_namecurrcharra   ra   rb   r   "  s   
	
r   c                 C  s   t d| d S )z*
    "a[1]" => "a"
    "a.foo" => "a"
    z[.\[]r   )r   split)r   ra   ra   rb   r   9  s   r   	code_partrk   r   c                 C  sj   d}|j rt|j D ]}|jt vrdt|dd } nq
n|jr.dt|j d  }| d| S )Nr   z  # T)r   z<60)
user_stackreversedfilenamer   r   stacksummary)r   rk   extrafsra   ra   rb   get_verbose_code_partA  s   r   rW   Union[str | List[str]]	List[str]c                   s"   t | ts| g}  fdd| D S )Nc                   s   g | ]}t | qS ra   )r   )rd   r   rk   ra   rb   rh   S  r   z*get_verbose_code_parts.<locals>.<listcomp>)r   list)rW   rk   ra   r   rb   get_verbose_code_partsN  s   
r   c                 C  sF   g }| D ]}t |s|| qt|tjsJ ||j  q|S rR   )r   appendr   r   SymIntr   maybe_as_int)size_or_stride	converteddimra   ra   rb   convert_to_concrete_valuesV  s   r   c           
      C  sx   t | }tj| tj B tj  }| j}| jj}| j	}d| d|j
 d| d| d| d| d| d| d}	|	S )Nzcheck_tensor(rn   z	, device=z, requires_grad=z, size=z	, stride=))typer   _C_dispatch_keys_dispatch_tls_local_include_set_dispatch_tls_local_exclude_setdtyper   indexrequires_gradr   )
valuer   sizesstridespytypedispatch_keyr  device_indexr  	guard_strra   ra   rb   get_tensor_guard_code_parta  s$   r  c                 C  s   t |  |S rR   )r   keysr  )dctkeyra   ra   rb   get_key_indexp  r   r  c                 C  s   d|  d| dS )Nlist(	.keys())[]ra   )rr   r  ra   ra   rb   get_key_index_sourcet  r   r  )frozenc                   @  s2   e Zd ZU dZded< dZded< dZded< dS )NNModuleAttrAccessorInfoFboolpresent_in_generic_dictNzOptional[str]l1_keyl2_key)rj   r   r   r  __annotations__r  r  ra   ra   ra   rb   r  x  s   
 r  c                 C  s   | j  }|  }t| jtr| jj}nt|tsJ t|| j}t||}t|	 | }	t|	t
tfr>| d|	d}
n| d| d}
t| jtsb|j||| jtjd| j| d|	g |j||
||dS )N[r  r  rr   example_valueguard_manager_enum == )baser   r   r  r*   dictr  r  r   r  intr   get_key_managerGuardManagerTypeGUARD_MANAGERadd_equals_match_guardget_value_manager)rr   base_guard_managerbase_example_valuer  r   base_source_namesource_namer  
key_sourcekey_example_valuevalue_sourcera   ra   rb   getitem_on_dict_manager  s6   


r1  c                 C  s   | j }| ot|t S rR   )originating_sourceis_dict_keyr   r2   )rk   rr   ra   ra   rb   match_on_id_for_tensor  s   r4  c                   @     e Zd ZU ded< ded< dS )GuardCodeListr   	code_listr   rk   Nrj   r   r   r  ra   ra   ra   rb   r6       
 r6  c                   @  s   e Zd ZdZdZdZdS )r&  r"   r   r   N)rj   r   r   r'  DICT_GUARD_MANAGERDICT_SUBCLASS_GUARD_MANAGERra   ra   ra   rb   r&    s    r&  c                   @  s  e Zd ZdddZdd Zdd Zdd Zdd Zdd Zdd Z	dd Z
dd Zdd"d#Zed$fd%d&Zdd+d,Zdd.d/Zdd1d2Zdd3d4Zddd7d8Zdd9d:Zdd;d<Zdd@dAZddBdCZddDdEZdddFdGZddHdIZddJdKZddLdMZddNdOZddPdQZddRdSZddTdUZ ddVdWZ!ddXdYZ"ddZd[Z#dd\d]Z$d^d_ Z%d`da Z&dbdc Z'ddde Z(dfdg Z)dhdi Z*djdk Z+ddldmZ,ddndoZ-ddpdqZ.ddrdsZ/ddtduZ0ddvdwZ1dddxdyZ2dd{d|Z3dd}d~Z4d5S )GuardBuilderid_refCallable[[Any], str]
source_refCallable[[Source], str]lookup_weakrefs)Callable[[object], ReferenceType[object]]local_scopeDict[str, object]rY   rp   Optional[GuardManager]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 | _g | _|| _t | _| jjjD ]}
| jt| |
 qai | _i | _d S )NLG__builtins__>_<._dot_)r=  r?  rA  scopebuiltins__dict__copyr   packagepackage_importer_package_imported_modulesrx   r   rp   argnamescodeshape_env_codetensor_check_namestensor_check_examplestensor_check_guardstensor_check_guard_managersrF  setkey_order_guarded_dict_idsoutput_graphguard_on_key_orderaddidgetr]   _cached_guard_managers)r`   r=  r?  rA  rC  rY   rp   rF  r   package_moduler-  ra   ra   rb   rc     s6   
zGuardBuilder.__init__c           	      C  s   |  |}t|trtd|j |j }| D ]"}|| }t|j|d}| ||}|j	|| d|d||d qd S )NzsNot expecting a DictGuardManager. Seems like Dynamo incorrectly added the dict to tx.output.guard_on_key_order for )r  r  r  r  rr   r  r   )
get_guard_managerr   r   NotImplementedErrorr   r2  r  r.   get_guard_manager_typedict_getitem_manager)	r`   r  rk   dict_mgrdict_sourcer  r  r0  r   ra   ra   rb   #guard_on_dict_keys_and_ignore_order	  s*   


z0GuardBuilder.guard_on_dict_keys_and_ignore_orderc           	   
   C  s   |  |}t|tstd|j t|tsJ t| D ]<\}}t|j|}|j|||t	j
d}t|rM| |}||td| d| d| q||t| d|| qd S )Nz_Expecting a DictGuardManager. Seems like Dynamo forgot to set the right guard manager enum for r  z__check_obj_id(rn   r   r!  )ri  r   r   rj  r   	enumerater  r  r%  r&  r'  rF   r=  add_id_match_guardr   r(  )	r`   r  rk   rm  r~   r  r.  key_managerid_valra   ra   rb   guard_on_dict_keys_and_order   s8   


z)GuardBuilder.guard_on_dict_keys_and_orderc                   s   fdd}|j }	|j}
t }t|jD ]
}||j  qtddd}|	|
v r1td|	d}n6d|
v rB|	|
d v rBtdd|	}n%d|
v rS|	|
d v rStdd|	}n|	|vrgd|
v rg|	|
d v rgtdd|	}|j	st|j
|j |||d	S |jsyJ |j}|j | d
}d }}d }}d }} rt|j|}| }|
| }| ||}|}|}| ||}n
|}|}| ||}|j||
tjd}|||||
||d} r|| ||||dS |S )a(  
        This tries to avoid calling the expensive nn module custom getattr method by
        checking if the attribute is accessible via __dict__. For attributes that
        are not accessible via __dict__ (like descriptors), we fallback to
        PyObject_GetAttr.

        There are two cases that we optimize for
        1) attributes present directly in __dict__, e.g training.
        2) parameters/buffers/modules - they can be accessed via _parameters,
        _buffers, _modules keys in __dict__. For example, mod.linear can be
        accessed as mod.__dict__["_parameters"]["linear"]

        The most common and expensive case for nn module guards is of type
        mod.submod1.submod2.submod3.training. We avoid the python getattr of nn
        modules by going through the __dict__.
        c                   sr   t | tr0t||}d| d|d}| j|||tjd | d g | j||||dS | j||||dS )Nr  r  r  r  r!  rh  )	r   r   r  r%  r&  r'  r(  r)  rl  )r|   r  r-  r+  r  r   r  r.  r  ra   rb   getitem_on_dict_mgr]  s,   

z>GuardBuilder.getattr_on_nn_module.<locals>.getitem_on_dict_mgrFNT_parameters_buffers_modulesattrrr   r  r   	.__dict__rr   r  r   )r|   r  r-  r+  r  r   )memberrS  r_  r   getmrori   updater  r  r  getattr_managerr  r  r(   r"  r   rk  get_generic_dict_managerr&  r'  )r`   rr   r*  r+  r  r,  r-  r   rv  	attr_namemod_dictall_class_attribute_namesr   accessor_infor  mod_dict_sourcel1_source_namel2_source_namel1_valuel2_valuel1_guard_manager_enuml2_guard_manager_enum	l1_sourcemod_generic_dict_managerl1_mgrra   ru  rb   getattr_on_nn_moduleB  s    

	z!GuardBuilder.getattr_on_nn_modulec                 C  s,   |  }|dkr
dS t| |}|| jv S )Nr   F)r   rd  re  r`  )r`   rr   r-  obj_idra   ra   rb   requires_key_order_guarding  s
   
z(GuardBuilder.requires_key_order_guardingc                 C  sF   t j}| |r!t|tsJ t|jti ju rt j}|S t j}|S rR   )	r&  r'  r  r   r#  r   r  r:  r;  )r`   rr   r  r   ra   ra   rb   rk    s   
z#GuardBuilder.get_guard_manager_typec                 C  s   |t jkp	|t jkS rR   )r&  r:  r;  )r`   mgr_enumra   ra   rb   manager_guards_on_keys  s   
z#GuardBuilder.manager_guards_on_keysc                 C  s.   | j sJ | j jj| jd d| jd tjdS )NrJ  )	f_globalsrr   r  r   )rp   rT   globals_dict_managerrQ  r&  r'  r_   ra   ra   rb   get_global_guard_manager  s   
z%GuardBuilder.get_global_guard_managerc              	   C  s  | j sJ | j j}d }| }|dkr|| jv r| j| S |dkr&| |}| ||}d }d }d }tj}	t|t	rQ|j
 }| |}| |j
}| |j
|}	t|trb|j|j|||d}
nt|tru|  j|j|||d}
nt|tr|  j|j|||d}
nt|tr|S t|tr|S t|tr|sJ |j|||d}
nt|ttttfr|sJ |}
nt|tr|sJ |j|||d}
nt|tr|sJ t|t j!j"r| #|||||||}
n|j$|j%|||d}
nt|t&r{|sJ t|t't(j)fr9t|t*r"| +|	sJ t,|||||}
nYt|j-t.r-t/d|j|j-|||d}
nBt|t0rO|j1sO|j2|j-|||d}
n,t|t3re|j1se|j4|j-|||d}
n|j-}|j1rp|5 }|j6||||d}
n t|t7rt|t*r| +|	sJ t,|||||}
n|sJ |j|j-|||d}
nt|t8r|sJ t9|sJ |j:s|j;||j<tjdj6|j=|||d}
n|j>}|d usJ |d }|j?||tjd}t|t*rJ |j|j=|||d}
nt|t@r|sJ |jAtB|||d}
nkt|tCr'|sJ |jAd	d
 |||d}
nTt|tDr>|s2J |jAdd
 |||d}
n=t|tErT|sIJ |jF|j-|||d}
n't|t.rot|t*sdtGd|jH|j-|||d}
ntGd| d|  |
| j| < |
S )Nr   rh  )global_namerr   r  r   r}  rz  zUExpecting clean index here. Likely Dynamo forgot to mark a dict as guard_on_key_orderz.__kwdefaults__)python_lambdarr   r  r   c                 S  s   |   S rR   )__obj_flatten__r   ra   ra   rb   r     r   z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>c                 S  s   |    S rR   )_typequalified_namer  ra   ra   rb   r     s    r  z4ConstDictKeySource can only work on DictGuardManagerzmissing guard manager builder z - )Irp   rT   r   rf  re  rk  r&  r'  r   r)   r"  get_guard_manager_from_sourcerE   r3   rl  
local_namer/   r  r  r1   global_weakref_managerr0   r:   r<   type_managerr8   r4   r5   r-   r2   grad_managerr(   r   nnModuler  r  r~  r.   r#  collectionsOrderedDictr   r  r1  r  r*   RuntimeErrorr   index_is_slicelist_getitem_managertupletuple_getitem_managerunpack_slicegetitem_managerr7   r+   callableis_kwfunc_defaults_manager__defaults__idx_key__kwdefaults__func_kwdefaults_managerr6   lambda_managerr   r,   r9   r;   tuple_iterator_getitem_managerAssertionErrorr%  )r`   rr   root_guard_managerr  r-  r   r,  r+  r*  base_guard_manager_enumoutr  
kwdefaults	kw_sourcerm  ra   ra   rb   r    s  
































z*GuardBuilder.get_guard_manager_from_sourcerk   r   c                 C  s   |  |jS rR   )r  r2  r`   rk   ra   ra   rb   ri    s   zGuardBuilder.get_guard_managerTc                 C  s   d | }t||\}}t }d| jd i}	t||	| |d |  }
| js+J |r7| jj	|
| d S | jj
|
| d S )Nrn   rJ  ___make_guard_fn)joinr  build_guard_functionr#  rQ  execvaluesrp   rT   add_epilogue_lambda_guardadd_lambda_guard)r`   rW   rX   rU   is_epiloguemake_guard_fn_args
guard_bodypycoder  globals_for_guard_fnguard_fnra   ra   rb   $add_python_lambda_leaf_guard_to_root  s   

z1GuardBuilder.add_python_lambda_leaf_guard_to_rootr   r   r   r   c                 C  s   t || jtS rR   )evalrQ  CLOSURE_VARS)r`   r   ra   ra   rb   re    s   zGuardBuilder.get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)r   r   r   r   r   rX  r   r   logwarningr   )r`   rk   r   r"  ra   ra   rb   arg_ref%  s   

zGuardBuilder.arg_refr  c                 C  s.   t |j|}t|||j|jd}||  d S )N)r   r   )r(   r2  r   r   r   create)r`   rk   r  r  attr_source	new_guardra   ra   rb   _guard_on_attribute4  s
   z GuardBuilder._guard_on_attributec              	   C  sD  |j }t|tr|j}t|tsJ d|j |j}| }|j}| |}t| 	||}d }|r=d| d|d}n	d| d|d}| j
||g| 	|d tjr| |}	|r| 	| }
| 	|}| ||
}t|tjjr| ||	||
|| |S |	j||j|
|d d S |	|t|| d S | ||g d S )Nzinvalid source hasattr(rn   r   znot hasattr()provided_guarded_objectrz  )r2  r   r4   r"  r(   r   r~  r  hasattrre  _set_guard_export_infor#   enable_cpp_guard_managerr  rk  r   r  r  r  r  add_no_hasattr_guardr   _produce_guard_code)r`   rk   rr   base_sourcer"  r{  refvalrY  base_managerr  r+  r   ra   ra   rb   HASATTR=  sT   






zGuardBuilder.HASATTRNr   c           	      C  s   |d usJ |  |}| |j}t|tjjsJ | |}|j d}|j||j	t
jd}d|d| d}|d|t|| d S )Nr|  r}  znot ___dict_contains(rn   z
.__dict__)F)r  re  r   r   r   r  r  ri  r  rS  r&  r'  add_dict_contains_guardr   )	r`   rk   r{  r  r  r  r  r  rY  ra   ra   rb   NOT_PRESENT_IN_GENERIC_DICTt  s   

z(GuardBuilder.NOT_PRESENT_IN_GENERIC_DICTc                 C  st   t | |j}| |}d| | d| d}| ||g tjr1| |	|t
|| d S | ||g d S )N___check_type_id(rn   r   )r   re  r   r=  r  r  r#   r  ri  add_type_match_guardr   r  )r`   rk   rs   r  rY  ra   ra   rb   
TYPE_MATCH  s   


zGuardBuilder.TYPE_MATCHc                 C  sx   |  |}| |j}t| |j}d| d| }| ||g tjr3| ||t	|| d S | 
||g d S )Nz___dict_version() == )r  re  r   dict_versionr  r#   r  ri  add_dict_version_guardr   r  )r`   rk   r  r  versionrY  ra   ra   rb   DICT_VERSION  s   


zGuardBuilder.DICT_VERSIONr  invertr  c                 C  sr   |  |}|r	dnd}| d|d| d}| ||g tjr0| || |t|| d S | ||g d S )Nnot r   z___dict_contains(rn   r   )r  r  r#   r  ri  r  r   r  )r`   rk   r  r  dict_ref	maybe_notrY  ra   ra   rb   DICT_CONTAINS  s   

zGuardBuilder.DICT_CONTAINSc                 C  sH   |  |}d| }| ||g tjr| | d S | ||g d S )Nr  )r  r  r#   r  ri  r  )r`   rk   r  rY  ra   ra   rb   
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rA| ||t|| n| ||g t |jtrit |tjjrk|jj}| |}|d urm|| j|< d S d S d S d S )Nz___check_obj_id(rn   r   )r   r2  r<   r  r   r"  r<  r  re  r   r=  r  r#   r  ri  rq  r   r  r3   r   r  r  r  rA  r]   )r`   rk   r  r  rs  rY  r  weak_idra   ra   rb   ID_MATCH  s.   




zGuardBuilder.ID_MATCHc                 C  sp   |  |}| |j}t|tjsJ | d}| ||g tjr/| 	|
t|| d S | ||g d S Nz is not None)r  re  r   r   r   Tensorr  r#   r  ri  add_not_none_guardr   r  )r`   rk   r  r  r  rY  ra   ra   rb   NOT_NONE_MATCH  s   


zGuardBuilder.NOT_NONE_MATCHc                 C  s   |  |dtj d S )Nrj   )r  r<  EQUALS_MATCHr  ra   ra   rb   
NAME_MATCH  s   zGuardBuilder.NAME_MATCHc                 C  sv   t js| | | |j}| | d|  }| ||g t jr2| |	|t
|| d S | ||g d S )Nz.data_ptr() == )r#   r  r  re  r   r  data_ptrr  ri  add_data_ptr_guardr   r  )r`   rk   objrY  ra   ra   rb   DATA_PTR_MATCH  s   


zGuardBuilder.DATA_PTR_MATCHc                   st   t jjj d  g}| ||g tjr2t jj fdd}| js%J | jj	|t
|| d S | || d S )Nz,torch.autograd.forward_ad._current_level == c                   s
   j  kS rR   )_current_levelr  
dual_level
forward_adra   rb   fn     
z#GuardBuilder.DUAL_LEVEL.<locals>.fn)r   autogradr  r  r  r#   r  rp   rT   r  r   r  )r`   rk   rY  r  ra   r   rb   
DUAL_LEVEL  s   


zGuardBuilder.DUAL_LEVELc                   s   t jj }dd |D d dg}| || tjr;t jjj  fdd}| js.J | jj	
|t|| d S | || d S )Nc                 S  s   g | ]}|  qS ra   )	get_state)rd   cira   ra   rb   rh   +      z6GuardBuilder.FUNCTORCH_STACK_MATCH.<locals>.<listcomp>z5torch._functorch.pyfunctorch.compare_functorch_state(r   c                   s    S rR   ra   r  
compare_fnstatesra   rb   r  3     z.GuardBuilder.FUNCTORCH_STACK_MATCH.<locals>.fn)r   
_functorchpyfunctorch#retrieve_all_functorch_interpretersr  r#   r  compare_functorch_staterp   rT   r  r   r  )r`   rk   cisrY  r  ra   r
  rb   FUNCTORCH_STACK_MATCH'  s   


z"GuardBuilder.FUNCTORCH_STACK_MATCHc           	        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ttttttjh|B  t|trXt fddt| | D sWJ nt| siJ dt| d  t|t rt!"|r| #| t }|$d| d | %|| t&j'r| (|)t*d t+|| d S | ,|| d S t|t-rt"|r| #| t }|$d	| d | %|| t&j'r| (|)t*d
 t+|| d S | ,|| d S t&j'r| d|g}| (|.|t+|| | %|| d S t }t|ttfr0| /| t0|D ]\}}|$d| d| d| 1t| d qn| #| t|tjr@t|}t|t2j3rIJ |$| d| | ,|| | %|| d S )Nra   c                 3  s    | ]}t | V  qd S rR   )rE   )rd   r   ok_typesra   rb   	<genexpr>`  s    

z,GuardBuilder.EQUALS_MATCH.<locals>.<genexpr>zUnexpected type z	, not in z__math_isnan(r   r   z__numpy_isnan(r   r!  r  r  z], )4r  re  r   r   r   int8int16int32int64uint8uint16uint32uint64float16float32float64r  rB   r   r_  	frozensetsliceranger   SizerE   r#  all	itertoolschainr  r  floatmathisnanr  r   r  r#   r  ri  r  r  r   r  complexr(  SEQUENCE_LENGTHrp  r=  typesCodeType)	r`   rk   r  r  rs   np_typesrY  r~   elemra   r  rb   r  =  s   
	







 
zGuardBuilder.EQUALS_MATCHc                 C  s>   |  |j}t|ttd tjfr| | d S | | d S rR   )	re  r   rE   r  r   r.  r/  r  r  r`   rk   r  ra   ra   rb   CONSTANT_MATCH  s   zGuardBuilder.CONSTANT_MATCHc                 C  s\   |  | | |j}t|dr"t|jtsJ | |dtj	 d S t
dt|  d S )Ntrainingz$Guard setup for uninitialized class )r  re  r   r  rE   r4  r  r  r<  r3  r%   unimplementedr   r2  ra   ra   rb   	NN_MODULE  s   

zGuardBuilder.NN_MODULEc                 C  
   |  |S )z0things like torch.add and user defined functions)r  r  ra   ra   rb   FUNCTION_MATCH  s   
zGuardBuilder.FUNCTION_MATCHc                 C  sV   |  |j}t|tjkr$t|dr$| |dtj | |dtj	 dS | 	| dS )z!matches a closure by __code__ id.__code__N)
re  r   r   r.  FunctionTyper  r  r<  r  r8  r2  ra   ra   rb   CLOSURE_MATCH  s
   zGuardBuilder.CLOSURE_MATCHc                 C  r7  rR   r8  r  ra   ra   rb   BUILTIN_MATCH  r  zGuardBuilder.BUILTIN_MATCHc                 C  r7  rR   r<  r  ra   ra   rb   PYMODULE_MATCH  r  zGuardBuilder.PYMODULE_MATCHc                 C  s   |  |}| |j}t|}| | t }t|dkr&|d|  n|d| dt|  | || t	j
rat|trQ| |t|t|| d S | |t|t|| d S | || d S )Nr   r  zlen(r  )r  re  r   r   r  r   lenr   r  r#   r  r   r#  ri  add_dict_length_check_guardr   add_length_check_guardr  r`   rk   r  r  rs   rY  ra   ra   rb   r-    s$   




zGuardBuilder.SEQUENCE_LENGTHc                 C  s   |  |}| |j}t|}tjs| | t }|d| dt	|  | 
|| tjrJt|}| |}| |t	||t|| d S | || d S )Nz___tuple_iterator_len(r  )r  re  r   r   r#   r  r  r   r   rK   r  r=  ri  add_tuple_iterator_length_guardr   r  )r`   rk   r  r  rs   rY  r  ra   ra   rb   TUPLE_ITERATOR_LEN  s   



zGuardBuilder.TUPLE_ITERATOR_LENc                 C  s   |  |}|  | }t|jst|rd S | d| g}| || tjr9t| || 	|t
|| d S | || d S )N is )r  r   r   r2  r  r#   r  install_tensor_aliasing_guardri  r  r   r  )r`   rk   source_bref_aref_brY  ra   ra   rb   DUPLICATE_INPUT  s"   
zGuardBuilder.DUPLICATE_INPUTc                 C  s   |  |}| |j}t|}| | t }tdd | D }tt	|t
|jd}|r;|d| d|  n|d| d|  | || tjre| |jr]| || d S | || d S | || d S )Nc                 s  s    | ]}t |V  qd S rR   )rF   )rd   kra   ra   rb   r  "  s    z)GuardBuilder.DICT_KEYS.<locals>.<genexpr>)localz___key_to_id(r  r  .keys()) == )r  re  r   r   r  r   anyr  rC   rG   r   r2  r   r  r#   r  r  rt  ro  r  )r`   rk   r  r  rs   rY  any_key_is_idconst_keys_reprra   ra   rb   	DICT_KEYS  s&   

zGuardBuilder.DICT_KEYSc                 C  sN   |  | dg}| || tjr| |t|| d S | || d S r  )r  r  r#   r  ri  r  r   r  )r`   rk   rY  ra   ra   rb   WEAKREF_ALIVE5  s   
zGuardBuilder.WEAKREF_ALIVEc                   s   |  |}| |j}t|}dd | D  | | t }|d| d  | || t	j
rH fdd}| ||t|| d S | || d S )Nc                 S     h | ]\}}|qS ra   ra   rd   rK  vra   ra   rb   r   D  r	  z5GuardBuilder.NN_MODULE_PARAM_NAMES.<locals>.<setcomp>z{k for k, v in z.named_parameters()} == c                   s   dd |   D  kS )Nc                 S  rS  ra   ra   rT  ra   ra   rb   r   P  r	  zAGuardBuilder.NN_MODULE_PARAM_NAMES.<locals>.fn.<locals>.<setcomp>)named_parametersr  r  ra   rb   r  O  s   z.GuardBuilder.NN_MODULE_PARAM_NAMES.<locals>.fn)r  re  r   r   rV  r  r   r   r  r#   r  ri  r  r   r  )r`   rk   r  r  rs   rY  r  ra   rW  rb   NN_MODULE_PARAM_NAMES@  s   



z"GuardBuilder.NN_MODULE_PARAM_NAMESc                 C  s   |  |}| |j}t|}tjs| | t }|d| dt|	  | 
|| tjrH| |jr@| || dS | || dS | || dS )zConstant keys matchr  rM  N)r  re  r   r   r#   r  r  r   r   r  r  r  r2  rt  ro  r  rB  ra   ra   rb   DICT_CONST_KEYSX  s   

zGuardBuilder.DICT_CONST_KEYSc                 C  s   t | |j| j d S rR   )r&   watchre  r   rF  r  ra   ra   rb   OBJECT_MUTATIONn  s   zGuardBuilder.OBJECT_MUTATIONc                 C     d S rR   ra   r  ra   ra   rb   	GRAD_MODEq     zGuardBuilder.GRAD_MODEc                 C  r\  rR   ra   r  ra   ra   rb   DETERMINISTIC_ALGORITHMSt  r^  z%GuardBuilder.DETERMINISTIC_ALGORITHMSc                 C  r\  rR   ra   r  ra   ra   rb   TORCH_FUNCTION_STATEw  r^  z!GuardBuilder.TORCH_FUNCTION_STATEc                 C  sl   |j tju sJ ddlm  m} d|jg}| || tj	r.| 
|t|| dS | || dS )z/Guard on CURRENT_DEVICE per torch.utils._devicer   Nzutils_device.CURRENT_DEVICE == )rr   r   GLOBALtorch.utils._deviceutils_deviceCURRENT_DEVICEr  r#   r  ri  add_default_device_guardr   r  )r`   rk   r   rY  ra   ra   rb   DEFAULT_DEVICEz  s   
zGuardBuilder.DEFAULT_DEVICEc              	     sR  |j dksJ | jj  j}dd |D } fdd} jrPg }g }i } jD ]}|j jv r=tjj	
|| j||| q'td q't||t| dd}	nd }	 jjd	d |D d
d |D ||	| j| jjj d}
| jjjsw j  |
D ]	}| ||g qytjr|
}| j|t||i ttd d S |
D ]}| j||gdd qd S )Nr   c                 S     g | ]}|j qS ra   )symbolic_contextrd   r   ra   ra   rb   rh         z*GuardBuilder.SHAPE_ENV.<locals>.<listcomp>c                   s    fddj |  D S )Nc                   s   g | ]	}t |tj qS ra   )r   r   SIZE)rd   rr   r   ra   rb   rh     s    z?GuardBuilder.SHAPE_ENV.<locals>.get_sources.<locals>.<listcomp>)tracked_fakes_id_to_source)t_idr   ra  rm  rb   get_sources  s   
z+GuardBuilder.SHAPE_ENV.<locals>.get_sourcesz+Untracked tensor used in export constraintsF)source_pairsderived_equalitiesphantom_symbols	warn_onlyc                 S  rh  ra   )fakerj  ra   ra   rb   rh     rk  c                 S  rh  ra   )rr   rj  ra   ra   rb   rh     rk  )input_contextsequalities_inputsr?  ignore_static)rU   T)	shape_env)r   rF  ra  tracked_fakesexport_constraintsro  rn  r   exportdynamic_shapes_process_equalitiesrz  r  r  r   r   r  produce_guardsr?  freezer  r#   r  r  r   r   r  r  )r`   rk   r   rw  rq  rr  rs  rt  
constraintrx  rM   shape_guardrW   ra   rp  rb   	SHAPE_ENV  sd   
	





zGuardBuilder.SHAPE_ENVc              
   C  s  |  r| st|jtrt|r| | d S t|tr!| }|d ur'|n| |j	}t|t
js5J | |}t }| jjjr| | g d}|D ]2}| |d | }t|t
jt
jfrr|d| d| dt| qM|| d| d|  qMnI| j| | j| | j| tjr| |}| j| | jj}	|	j|j }
t|
d }t|
d }t t!|||||}|"||||| |j#d usJ t$|d|j#d	\}}|s$t%|d
r	|j&}d| d| d| d}|| tjr| |'|t || nd| d}|| tjr$| |(d
t || t)|dkr=| *|| tjs?| +|| d S d S d S )N)r  r   r  zndimension()rO  zstr(r  r!  sizestrideT)	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_moduleis_fsdp_moduler   r2  r6   r4  r  r!   re  r   r   r  r  r   rF  ra  r}  r  rE   r   r  r   r   r\  r[  r]  r#   r  ri  r^  input_source_to_sizes_stridesr   r   r  add_tensor_match_guardrr   rI   r  r  add_dynamic_indices_guardr  r?  r  r  )r`   rk   r  tensor_namerY  termsterm
real_valuerp   ra  metadatar  r  rX   staticreasondynamic_indicesr   ra   ra   rb   TENSOR_MATCH  s   





"
$






zGuardBuilder.TENSOR_MATCHFc                 C  s:   t jrJ |r| jt|| d S | jt|| d S rR   )r#   r  rZ  r   r6  rY  )r`   rk   r7  rz  ra   ra   rb   r  k  s   
z GuardBuilder._produce_guard_codec                 C  s   t  }|d us	J |j}~|d usJ t|d }~|t| jv s(J d| |d u rA|jd uo5|jdk}|r>| |jnd }n|}|d urNtt	|nd }	d }
t
|jdrct|tjsct|}
|||	||
 d S )Nr   zH_produce_guard_code must be called from inside GuardedCode. Called from r   __weakref__)r   f_backr   dirri   r   re  weakrefr  r   r  r   enumEnumset_export_info)r`   rk   r7  r  	cur_framecaller	func_name
name_validguarded_objectguarded_object_typeobj_refra   ra   rb   r  s  s:   
z#GuardBuilder._set_guard_export_info)r=  r>  r?  r@  rA  rB  rC  rD  rY   rD  rp   rE  rF  rG  )rk   r   )r   r   r   r   )rk   r  r   r   )rk   r   r  r   rR   )rk   r   r   r   )rk   r   r  r   r  r  r   )5rj   r   r   rc   ro  rt  r  r  rk  r  r  r  ri  r  r  re  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r3  r6  r8  r;  r=  r>  r-  rD  rJ  rQ  rR  rX  rY  r[  r]  r_  r`  rg  r  r  r  r  ra   ra   ra   rb   r<    sp    
I" 	  


!


	7




!





q

	









K 
r<  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                   @  r5  )PyExprCSEPass.ConfigzDict[str, int]
expr_countzDict[str, str]expr_to_nameNr8  ra   ra   ra   rb   Config  r9  r  c                      s(   e Zd ZdddZd fd
dZ  ZS )zPyExprCSEPass.ExprCounterr#   r  r   r   c                 C  s
   || _ d S rR   )_config)r`   r#   ra   ra   rb   rc     r  z"PyExprCSEPass.ExprCounter.__init__r   r   r   c                   s4   t |tjr| jjt|  d7  < t | d S Nr"   )r   r  ALLOWED_NODE_TYPESr  r  r   r   visit)r`   r   r   ra   rb   r    s   zPyExprCSEPass.ExprCounter.visit)r#   r  r   r   r   r   r   r   rj   r   r   rc   r  r   ra   ra   r   rb   ExprCounter  s    
r  c                      s,   e Zd Zd fddZd fddZ  ZS )zPyExprCSEPass.Replacerr#   r  gen_nameCallable[[], str]r   r   c                   s    t    || _|| _g | _d S rR   )r   rc   r  	_gen_namepreface)r`   r#   r  r   ra   rb   rc     s   

zPyExprCSEPass.Replacer.__init__r   r   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 = )r   r  r  r   r  r  USE_THRESHOLDr  r   r  r  r  r   r   NameLoad)r`   r   exprnode_expr_var_namer   ra   rb   r    s   zPyExprCSEPass.Replacer.visit)r#   r  r  r  r   r   r  r  ra   ra   r   rb   Replacer  s    
r  r   r   c                 C  s$   d| _ | jtdd i d| _d S )Nr   c                   S  s   dS )Nr   ra   ra   ra   ra   rb   r     s    z(PyExprCSEPass.__init__.<locals>.<lambda>)r  r  )_counterr  r  defaultdictr  r_   ra   ra   rb   rc     s   zPyExprCSEPass.__init___varr   r   c                 C  s    | | j  }|  j d7  _ |S r  )r  )r`   r   r   ra   ra   rb   _new_var  s   zPyExprCSEPass._new_varexprsr   c                 C  sX   |  | j}|D ]!}z
|t| W q ty) } z	td|j|  d }~ww d S )Nz#Failed to visit expr at line %s.
%s)	r  r  r  r   parseSyntaxErrorr  	exceptionlineno)r`   r  countereexra   ra   rb   count  s   zPyExprCSEPass.countr  Tuple[List[str], str]c                 C  s.   |  | j| j}|t|}|jt|fS rR   )r  r  r  r  r   r  r  r   )r`   r  replacernew_nodera   ra   rb   r     s   zPyExprCSEPass.replaceN)r   r   )r  )r   r   r   r   )r  r   r   r   r  r   r   r  )rj   r   r   r  r   	AttributeCall	Subscriptr  dataclasses	dataclassr  NodeVisitorr  NodeTransformerr  rc   r  r  r   ra   ra   ra   rb   r    s    	
%
	r  c                 C  s   t | jtptjo| jtju S rR   )r   r2  r+   r#    guard_nn_modules_using_dict_tags	create_fnr<  r6  r   ra   ra   rb   must_add_nn_module_guards  s   
r  c                   @  s   e Zd ZdS )DeletedGuardFnN)rj   r   r   ra   ra   ra   rb   r    s    r  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 )rG  NrZ   %Optional[Callable[[GuardFail], None]]c                   s<  |r|j nd }i  _d  _tjrt  _| _d fdd}t j| j	|j
|j j }dd }t||t|p<g tjdD ]!}tjs]| r]d|jvr]d|jvr]tjs\d|jvr]qA|| qA ||| _|j j_tjrtjjd	 fd
dd td j  jsJ |j j_ j _ j  d  _d S )Nc                   sB   |   }|tju r|  S  sJ   }|d usJ ||  S rR   )r  r   CONSTANTr   r  )rr   r  	r_builder)	w_builderra   rb   r?  )  s   
z1CheckFunctionManager.__init__.<locals>.source_refc                 S  s   |  }|r
d |_ d S d S rR   )rQ  )weak_br   ra   ra   rb   cleanup_builder>  s   
z6CheckFunctionManager.__init__.<locals>.cleanup_builder)r  r  r  hooksdynamo_cpp_guards_strc                     s
   t  jS rR   )r   rp   ra   r_   ra   rb   r   b  s   
 z/CheckFunctionManager.__init__.<locals>.<lambda>
payload_fn%s)rM   	_weakrefsrp   r#   r  rQ   ra  r<  r=  rA  rC  rY   r  r  rv   r   sort_keyguard_nn_modulesr  r   skip_nnmodule_hook_guardsr  compile_check_fncheck_fnr]   r   _loggingtrace_structured
guards_logdebugclear)r`   ra  rZ   rM   r?  builderr  rk   ra   )r`   r  rb   rc     sV   




	




zCheckFunctionManager.__init__c           )   
     s  |j }|dg7 }td g  g g tjr$| jsJ | jjdg nd} | | d! fdd	}t	 }|j
D ]}|jD ]}	|	|vrW||	|jtj ||	 qDq?|j}
d }d }|
rtjs|j}| jjrpJ d|j}g }g }t||D ]\}}| jj|j }|t|d  |t|d	  q|t|||d
}|j}|j}d|
dg } d| d d| d t|
D ] \}}|| }|| }|| }t||||}|||| dd qt|
dkrtjrt|j|
dd|
 d g | jr	| jj j!j"ng }|D ]9}t#|t$r@|j%}|j&}|'  d|'  }tjr7t(|)||)||g ||d tj qt*d| |j+D ]}|jD ]}	||	|jtj qOqJt,j-j.dfddd t/j0}|d u rut/1 }|||j|
dt2t3} d|j4d i}!tjr| jsJ | j}"t dksJ nMt5t6 }#d| 7 }$t8|#|$\}%}&t9j:;dd dkrt<d|% t= }'zt>|&|!|' W n t?y }( z	t@Ad|(jB|&  d }(~(ww |'d  | C  }"| |"_D||"_E |"_F|"_G|!|"_H||"_Id |"_Jd |"_K|
|"_L|"S )"Nz**___kwargs_ignoredzGUARDS:z___check_global_state()Fc                   s   t  }td|  fdd ttjrGd}d}d ur?jr1dd	j
  }jr?dd	j
  }td || |sU  | d S d S )Nr  c                     s8    j rtj  nd jrtjdS d dS )N)rY  r   r   )r   r   from_tracebackr   r   ra   r   rk   ra   rb   r     s   zNCheckFunctionManager.compile_check_fn.<locals>.add_code_part.<locals>.<lambda>r   z
Stack:
z
User stack:
zGuard: %s%s%s)r   r  r  r   verbose_guards_logisEnabledForloggingDEBUGr   r  formatr   )r   rk   log_onlyverbose_code_partmaybe_stackmaybe_user_stackrW   structured_guard_fnsrX   r  rb   add_code_part  s0   

z<CheckFunctionManager.compile_check_fn.<locals>.add_code_partz,Illegal to set tensor_check_names in export.r  r  )dynamic_dims_sizesdynamic_dims_stridesrn   z%tensor_check_names=tensor_check_namesz___check_tensors(r   T)r  r"   zcheck_no_aliasing(rE  zUnknown GuardEnvExpr: dynamo_guardsc                     s   dd  D S )Nc                 S  s   g | ]}| qS ra   ra   )rd   fra   ra   rb   rh   	  rk  zKCheckFunctionManager.compile_check_fn.<locals>.<lambda>.<locals>.<listcomp>ra   ra   )r  ra   rb   r   	  s    z7CheckFunctionManager.compile_check_fn.<locals>.<lambda>r  )___check_tensors___check_tensors_verbose___check_global_stater[  rJ  r   TORCHDYNAMO_PRINT_GUARDS1zGUARDS
z#Failed to exec guard at line %s.
%sr  r   )MrX  r  r  r#   r  rp   rT   add_global_state_guardr   r_  rY  r7  rk   rc  r[  r]  ra  r}  r\  r   r  r2  r   TensorGuardsr   r   r  rp  r  r?   install_no_tensor_aliasing_guardr^  tracing_contextguards_contextaotautograd_guardsr   r   input_source_ainput_source_br   rF  r  r  rZ  r   r  r  r$   initial_global_stateGlobalStateGuardr   r  rQ  r   uniquer  r  osenvironre  printr#  r  r  r  r  r  r  rU   rV   rW   rX   rY   rZ   r[   r\   r^   ))r`   r  
guards_outrZ   largsglobal_guardr  seengclrY  r[  check_tensors_fncheck_tensors_verbose_fnr]  r\  r  r   rs   gr  tensor_guardstensor_check_argsir   r  r  r   r  rk   source_arG  global_staterU   r  r  unique_code_partsr  r  r  r  r  ra   r  rb   r  t  s  




%




	


	
z%CheckFunctionManager.compile_check_fnc                 C  s   t | dr:| jtur<| jj }d ur>| jj }d ur@t|ts!J t|ts(J || d | j_d | j_t| _d S d S d S d S d S )Nr  )	r  r  r  r[   r\   r   r=   r>   
invalidate)r`   r[   r\   ra   ra   rb   r$  M	  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)rd  r  r  r  finalizer$  	TypeErrorr`   r  ra   ra   rb   r=  ^	  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)rd  r  r'  ra   ra   rb   rA  k	  s   z$CheckFunctionManager.lookup_weakrefs)NN)rZ   r  )rj   r   r   rc   r  r$  r=  rA  ra   ra   ra   rb   rG    s    X ZrG  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   r   r  r   r   r  c                   s
     | S rR   )r   r  csepassra   rb   r   y	  r  z%build_guard_function.<locals>.replacec                 S  s   g | fS rR   ra   r)  ra   ra   rb   r   ~	  r  zif not (z):zreturn Falsezdef guard(L):zreturn Truezdef ___make_guard_fn(zreturn guardr  )
r   r   HAS_UNPARSE_FUNCTIONSr  r  r   ry   rz   splicer   )	rW   closure_argsr   r   r  r  r  rk   make_guard_fnra   r*  rb   r  r	  s8   








r  c                   C     t jjjdS )NrN   r   r  	_internal	log_stateis_artifact_enabledra   ra   ra   rb   is_recompiles_enabled	  r   r5  c                   C  r0  )NrO   r1  ra   ra   ra   rb   is_recompiles_verbose_enabled	  r   r6  c           	      C  s   g }t | j}tt}| jD ]}||d< tt|||}|| | q|D ]}t	|| dkr9|||   q'd
|}d| gS )N__compile_source__r"   rn   zDuplicate tensors found: )r#  rY   r  r  r   r^   rd  r  r   r?  r  )	rp   rQ  duplicate_tensorsrY   ids_to_sourcetensor_source	tensor_idr  r  ra   ra   rb   1recompilation_reason_for_no_tensor_aliasing_guard	  s   



r<  r  rA   rY  types.CodeTypef_localsrD  c                 C  s  || j d d}|| j g }d}g }tjr8| }||}|js7|j}t|dkr7d|d v r3d}n|}g }n	| j}|d |d	< |rIt	| |}n^|D ][}	t
| j }
|	|
d
< t - zt|	|
|}W n ty~ } zt ryW Y d}~W d   qK d}~ww W d   n1 sw   Y  t|tr|s|	}t|tr|| t s nqKd|}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.
    rJ  rH  Fr"   zDuplicate tensor foundr   Tr  r  r7  Nr   zunknown reasonzVFailure in guard_fail_fn callback - raising here will cause a NULL Error on guard eval)rY   r  rU   r#   r  r   resultrX   r?  r<  r#  r    r  	Exceptionr6  r   r  r   r   r  rD   rH   rZ   r@   r  r  )r  rY  r>  rQ  reasonsno_tensor_aliasing_check_failedrX   rp   guard_debug_infore   rY   fail_reasonr  
reason_strra   ra   rb   get_guard_fail_reason	  sv   







	rF  frametypes.FrameTypec           	      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)textwraprz   )rd   r   r  ra   ra   rb   r  "
  s
    
z9get_and_maybe_log_recompilation_reason.<locals>.<genexpr>r   rI  z-triggered by the following guard failure(s):
zRecompiling function z in :z    )rF  r  rY  r>  r   nextf_coder5  r6  r#   error_on_recompiler  rp  rJ  rz   co_nameco_filenameco_firstlinenorecompiles_verbose_logr  recompiles_logr%   RecompileError)	r[   rG  rA  r  rY  do_recompiles_logfailuresguard_failure_detailsmessagera   ra   rb   &get_and_maybe_log_recompilation_reason

  s<   






rY  r  r$  lastr  c                 C  s   t d|j d|j d|j  t dd| j d  t dd| j tjr,t |  d|i| j	}| jD ]}z	t
|| j| W q6   t d|  Y q6d S )	NzERROR RUNNING GUARDS  rK  zlambda rn   z and
  rI  zMalformed guard:
)r  rO  rP  rQ  r  rV   rW   r#   r  rU   r  rY   )r  rY  r>  r  rZ  rC  rk   ra   ra   rb   guard_error_hook:
  s   
r\  c                 c  s.    t  }| D ]}||vr|V  || qd S rR   )r_  rc  )seqr  r   ra   ra   rb   r  U
  s   
r  c                 C  sf   |r1|| kr1t |}t | }t|st| r%t|   d|  d||kr1tjtj|dS d S )Nz is alising zC. This is not supported. Please do a clone for corresponding input.)rG  )	r   r   r%   UnsafeScriptObjectErrorr   	functoolspartialr<  rJ  )
obj_sourcedupe_sourceser_source_is_localsource_is_localra   ra   rb   make_dupe_guard]
  s   	re  )skipc                 G  s`   ddl m} ttjpttj}| 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"   )collect_debug_stackrf  N)torch._guardsrg  r  r  r  r  r  re  r  r  rc  r   r   )rf  rM   rg  rh  rc  rk   ra   ra   rb   install_guard
  s   
rj  )r   r   r   r   )r   r   rk   r   r   r   )rW   r   rk   r   r   r   )r   r(  )r  rA   rY  r=  r>  rD  r   r   )rG  rH  r   r   )
r  rA   rY  r=  r>  rD  r  r$  rZ  r  )
__future__r   r   rR  r  r  r  r_  	importlibr   r'  r  r*  r  r   sysrJ  r.  r  r   r   typingr   r   r   r   r	   r
   r   r   r   r   r   numpyr   ModuleNotFoundErrorr   rb  torch._dynamo.sourcer   r   r   r   r   ri  r   r   r   r   r   r   torch._loggingr   %torch.fx.experimental.symbolic_shapesr   r   r   torch.utils._tracebackr   r    torch.utils.weakr!   r   r#   r$   r%   r&   
eval_framer'   rr   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rc  rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   sympyrL   	getLoggerrj   r  r  getArtifactLoggerr  rS  rR  r  r   r   rM   r	  check_obj_idcheck_type_idr  rS   r   rF  r
  rQ   r   	lru_cacher   r  __getitem__r+  r)  import_modulerd  r   r   r  version_infor   r   r,  ImportErrorr   r   r   r   r   r  r  r  r  r  r1  r4  r6  r  r&  r<  r  r  r  rG  r  r5  r6  r<  rF  rY  r\  r  re  rj  ra   ra   ra   rb   <module>   s2  0 	\0

b
		





%           {U	  
Y+

T
0"