
    '}h'                    :   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 	 d dlZ 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/m0Z0 d d	l1m2Z2m3Z3m4Z4 d d
l5m6Z6m7Z7 d dl8m9Z9 ddl:m;Z;m<Z<m=Z=m>Z> ddl?m@Z@ ddlAmBZBmCZCmDZDmEZE ddlmFZFmGZGmHZHmIZImJZJ ddlKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZU  ej                  eW      ZXe"j                  j                  eWd      Z[e"j                  j                  eWd      Z\e"j                  j                  eWd      Z]e"j                  j                  eWd      Z^e"j                  j                  j                  j                  Zbe"j                  j                  j                  j                  Zce"j                  j                  j                  j                  Zde"j                  j                  j                  j                  Ze ej                  d      d        Zgi deddecdej                  j                  deQdeedd deUdeTd ej                  d!e dne j                  d" ekd"      d#ej                  d$e"j                  j                  d%e"j                  d&d' d(e"d)e	Zoej                  dd* d+k  r	 d dlqZqdJd,Zrd-Zsnd-ZsdJd/Zrd0 Zud1 Zvd2 Zwd3 Zxd4 Zyej                   G d5 d6             Z{ G d7 d8e+      Z| G d9 d:      Z}d; Z~ G d< d=      Z G d> d?      ZdKd@ZdA ZdB Z	 	 	 	 	 	 	 	 dLdCZ	 	 	 	 dMdDZ	 	 	 	 	 	 	 	 	 	 dNdEZ e@e       dF ZdG Zd dHdIZy# e!$ r dZ Y w xY w# et$ r d.ZsY w xY w)O    )annotationsN)currentframegetframeinfo)AnyCallableDictListOptionalTupleTypeUnion)ReferenceType)is_from_local_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DefaultsSourceLocalSource
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guards
recompilesrecompiles_verboseverbose_guardsc                     dd l } | j                  j                  g}|D ch c]  }t        j                  |       c}S c c}w Nr   )torch._dynamo.external_utils_dynamoexternal_utilsinspectgetfile)torchmodsms      S/var/www/html/test/engine/venv/lib/python3.12/site-packages/torch/_dynamo/guards.pyuninteresting_filesrG   X   s:    ' 	$$D )--1GOOA---s   ?___check_type_id___check_obj_id___odict_getitem___key_to_id___dict_version___dict_containsc                
    | |v S N )abs     rF   <lambda>rS   h   s
    Q!V     ___tuple_iterator_len___tuple_iterator_getitem__math_isnan__numpy_isnaninf__load_moduleutils_devicedevice___from_numpyc                    t        | t        j                  t        j                  f      rt	        j
                  |       S | S rO   )
isinstancenpgenericndarrayrC   	as_tensor)rQ   s    rF   rS   rS   s   s*    ZBJJ

3K%Luq! RS rT   rC   rA      )      c                L    t        j                  |       j                  dd      S N
 )
astunparseunparsereplacenodes    rF   _ast_unparserp      s     %%d+33D"==rT   TFc                L    t        j                  |       j                  dd      S rh   )astrl   rm   rn   s    rF   rp   rp      s    {{4 ((r22rT   c                    t        j                  d      }d}| D ]:  }|dv rd}
|dv r(|s|dk7  s|j                  |      s)t        |      c S ||z  }< 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_].*rj   z (z),[]None)recompilematchstrip_function_callstrip_getattr_getitem)name
valid_namecurrchars       rF   rx   rx      sp     M*JD 4<DV^:+;+;D+A*400DLD !&&rT   c                4    t        j                  d|       d   S )z*
    "a[1]" => "a"
    "a.foo" => "a"
    z[.\[]r   )ru   split)rz   s    rF   ry   ry      s    
 88Hd#A&&rT   c                   d}|j                   rCt        |j                         D ]*  }|j                  t               vsdt	        |d       } n7 n5|j
                  r)dt	        |j
                  j                         d          }| d| S )Nrj   z  # T)linez<60)
user_stackreversedfilenamerG   r   stacksummary)	code_partguardextrafss       rF   get_verbose_code_partr      s    E5++, 	B{{"5"77|BT:;<	 
|EKK$7$7$9"$=>?@_UG$$rT   c                    g }| D ]d  }t        |      s|j                  |        t        |t        j                        sJ |j                  |j
                  j                                f |S rO   )r   appendr_   rC   SymIntro   maybe_as_int)size_or_stride	converteddims      rF   convert_to_concrete_valuesr      sc    %'I 63S!c5<<000SXX22456 rT   c                |   t        |       }t        j                  j                  |       t        j                  j	                         z  t        j                  j                         z
  }| j                  }| j                  j                  }| j                  }d| d|j                   d| d| d| d| d| d| d}	|	S )Nzcheck_tensor(, z	, device=z, requires_grad=z, size=z	, stride=))typerC   _C_dispatch_keys_dispatch_tls_local_include_set_dispatch_tls_local_exclude_setdtyper\   indexrequires_grad__qualname__)
valuerz   sizesstridespytypedispatch_keyr   device_indexr   	guard_strs
             rF   get_tensor_guard_code_partr      s    %[F&)Q)Q)SS0023L KKE<<%%L''M
vR 3 34B|nBug N/geWIV]U^^_	a  rT   c                  "    e Zd ZU ded<   ded<   y)GuardCodeList	List[str]	code_listr   r   N__name__
__module__r   __annotations__rP   rT   rF   r   r      s    LrT   r   c                  @   e Z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
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d,dZd,dZd,dZd Zd Zd Zd Zd Zd Zd Z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,d%Z&	 d/d&Z'y$)0GuardBuilderc                "   || _         || _        || _        ||d| _        t        j
                  j                         | j                  d<   t        j                  j                  j                  j                         D ]X  \  }}|j                  dd      j                  dd      j                  dd      }|| j                  d   |<   || j                  |<   Z g | _        g | _        g | _        g | _        g | _        g | _        || _        i | _        y )NLG__builtins__>_<._dot_)id_ref
source_reflookup_weakrefsscopebuiltins__dict__copyrC   packagepackage_importer_package_imported_modulesitemsrm   argnamescodeshape_env_codetensor_check_namestensor_check_examplestensor_check_guardscheck_fn_managerid_matched_objs)	selfr   r   r   local_scopeglobal_scoper   rz   package_modules	            rF   __init__zGuardBuilder.__init__   s	    $.9D<3X
%-%6%6%;%;%=

>" ]]++EEKKM	. 
<<S)11#s;CCCQD/=DJJ~&t,-DJJt	. $&)+	
 46 .09;"02 6F BDrT   c                8    t        || j                  t              S rO   )evalr   CLOSURE_VARS)r   rz   s     rF   getzGuardBuilder.get  s    D$**l33rT   c                B   t        |t              r|}n|j                  }t        t	        |            }|| j
                  vr]t        j                  d|      rGt        j                  d|      rt        j                  d|       | j
                  j                  |       |S )Nz[a-zA-Z0-9_]+z^\d+$zinvalid var name: %s)r_   strrz   ry   rx   r   ru   rw   logwarningr   )r   r   rz   bases       rF   arg_refzGuardBuilder.arg_ref#  sy    eS!D::D$%8%>?t}}$xx($/88Hd+KK 6>$$T*rT   c                    t        |j                  |      }t        |||j                  |j                        }|j                  |        y )N)r   r   )r%   originating_sourcer   r   r   create)r   r   	attr_nameguard_fnattr_source	new_guards         rF   _guard_on_attributez GuardBuilder._guard_on_attribute2  sA     !9!99EAQAQ
	 	rT   c                    t        | j                  |j                              }| j                  |      }d| j	                  |       d| d}| j                  ||g       y )N___check_type_id(r   r   )r   r   rz   r   r   _produce_guard_code)r   r   tobj_idr   s        rF   
TYPE_MATCHzGuardBuilder.TYPE_MATCH:  sV    %**%&Q"4<<#6"7r&C  /rT   c                    | j                  |      }t        | j                  |j                              }d| d| }| j	                  ||g       y )Nz___dict_version() == )r   dict_versionr   rz   r   )r   r   refversionr   s        rF   DICT_VERSIONzGuardBuilder.DICT_VERSIONA  sK    ll5!txx

34!#eG95  /rT   c                l    | j                  |      }|rdnd}| d|d| d}| j                  ||g      S )Nnot rj   z___dict_contains(r   r   r   r   )r   r   keyinvertdict_ref	maybe_notr   s          rF   DICT_CONTAINSzGuardBuilder.DICT_CONTAINSH  sG    <<&$F"	-cWBxjB''v66rT   c                V    | j                  |      }d| }| j                  ||g       y )Nr   r   )r   r   r   r   s       rF   
BOOL_FALSEzGuardBuilder.BOOL_FALSEO  s/     ll5!cU|  /rT   c                R   t        |j                  t              r=| j                  t	        |j                  j
                  t        j                              S | j                  |      }| j                  |j                        }d| d| j                  |       d}| j                  ||g       t        |j                  t              r_t        |t        j                  j                        r:|j                  j                   }| j#                  |      }||| j$                  |<   y y y y )Nz___check_obj_id(r   r   )r_   r   r(   r   r   r   r   r   r   rz   r   r   r'   rC   nnModule
local_namer   r   )r   r   r   valr   r   weak_ids          rF   ID_MATCHzGuardBuilder.ID_MATCH_  s    e..
;??e..33\5L5LM  ll5!hhuzz"!#bS)9(:!<  / e..< #uxx/"55@@
..s3&7>D((4 ' 0	 =rT   c                |    | j                  |j                        }| j                  |dt        j                         y )Nr   )r   rz   r   r   EQUALS_MATCH)r   r   objs      rF   
NAME_MATCHzGuardBuilder.NAME_MATCHx  s,    hhuzz"  
L4M4MNrT   c                    | j                  |j                        }| j                  |       d|j                          }| j	                  ||g       y )Nz.data_ptr() == )r   rz   r   data_ptrr   )r   r   r  r   s       rF   DATA_PTR_MATCHzGuardBuilder.DATA_PTR_MATCH|  sG    hhuzz",,u%&oclln5EF  /rT   c                   t        |j                  t              sJ d|j                          |j                  j                  }|j                         }|j                  j
                  }| j                  |      }t        | j                  |      |      }d }|r
d| d|d}n	d| d|d}| j                  ||g| j                  |             y )Nzinvalid source hasattr(r   r   znot hasattr()provided_guarded_object)
r_   r   r%   rz   r   memberr   hasattrr   r   )r   r   base_sourcer   attrr   r  r   s           rF   HASATTRzGuardBuilder.HASATTR  s    $$j
 	*UZZL)	* 
 ..33!''..ll4 dhhtnd+cU"THA.D!#b2D  QU WrT   c                    t         j                  j                  j                         }|D cg c]  }|j	                          }}d| dg}| j                  ||       y c c}w )Nz5torch._functorch.pyfunctorch.compare_functorch_state(r   )rC   
_functorchpyfunctorch#retrieve_all_functorch_interpreters	get_stater   )r   r   ciscistatesr   s         rF   FUNCTORCH_STACK_MATCHz"GuardBuilder.FUNCTORCH_STACK_MATCH  s]     **NNP+./R",,.//GxqQR  - 0s   A c                  	 | j                  |      }| j                  |j                        }t        |      }t        rt        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.        j0                  h|z        	t3        |t4              rFt7        	fdt9        j:                  |j=                         |j?                               D              s$J t3        |	      sJ dt        |       d	        t3        |t@              rXtC        jD                  |      rC| jG                  |       t%               }|jI                  d| d       | jK                  ||       y t3        |tL              rXt	        jD                  |      rC| jG                  |       t%               }|jI                  d| d       | jK                  ||       y t%               }t3        |t$        t         f      rX| jO                  |       tQ        |      D ]8  \  }}|jI                  d| d	| d
| jS                  t        |             d       : n| jG                  |       t3        |t.        j0                        rt!        |      }t3        |tT        jV                        rJ |jI                  | d|       | jK                  ||       y )NrP   c              3  6   K   | ]  }t        |        y wrO   )r1   ).0xok_typess     rF   	<genexpr>z,GuardBuilder.EQUALS_MATCH.<locals>.<genexpr>  s      ()q(#s   zUnexpected type z	, not in z__math_isnan(r   z__numpy_isnan(r   [z],  == ),r   r   rz   r   r`   int8int16int32int64uint8uint16uint32uint64float16float32float64tupler.   listset	frozensetslicerangerC   Sizer1   dictall	itertoolschainkeysvaluesfloatmathisnanr   r   r   complexSEQUENCE_LENGTH	enumerater   typesCodeType)
r   r   r   r  r   np_typesr   idxelemr   s
            @rF   r  zGuardBuilder.EQUALS_MATCH  s   ll5!hhuzz"I						





/H H!


 

 #t -6__SXXZ-V     A "$s)IhZ@A  #u$**S/OOE"6DKK-uA./$$UD1C!bhhsmOOE"6DKK.Q/0$$UD1v #e}%  '&s^ 	T'uAcU#dkk$t*6M5NaP OOE"#uzz"*C #u~~...
 	se4w'(  -rT   c                    | j                  |j                        }t        |t        t	        d       t
        j                  f      r| j                  |       y | j                  |       y rO   )	r   rz   r1   boolr   rB  rC  r  r  r   r   r  s      rF   CONSTANT_MATCHzGuardBuilder.CONSTANT_MATCH  sG    hhuzz"#d4j%..9:MM% e$rT   c                      j                          j                        } j                  j                         fd}t	        d      r |        y t        j                  dt                      y )Nc                     t        j                  t              sJ j                   dt        j
                         y )Ntraining)r1   rM  rH  r   r   rJ  )r   r   r  s   rF   setup_guardz+GuardBuilder.NN_MODULE.<locals>.setup_guard   s/    #,,---$$UJ8S8STrT   rM  z$Guard setup for uninitialized class )r  r   r   rz   r  r"   unimplementedr   )r   r   r   rN  r  s   ``  @rF   	NN_MODULEzGuardBuilder.NN_MODULE  s`    ell5!hhuzz"	U 3
#M DT#YKPQrT   c                F    |j                         r| j                  |      S y)z0things like torch.add and user defined functionsN)is_localr  r   r   s     rF   FUNCTION_MATCHzGuardBuilder.FUNCTION_MATCH
  s     >>=='' rT   c                T   |j                         r| j                  |j                        }t        |      t        j
                  k(  rOt        |d      rC| j                  |dt        j                         | j                  |dt        j                         y| j                  |       yy)z!matches a closure by __code__ id.__code__N)rR  r   rz   r   rB  FunctionTyper  r   r   r  rT  rI  s      rF   CLOSURE_MATCHzGuardBuilder.CLOSURE_MATCH  s|    >>((5::&CCyE...73
3K((
L<P<PQ((
L<W<WX##E* rT   c                $    | j                  |      S rO   rT  rS  s     rF   BUILTIN_MATCHzGuardBuilder.BUILTIN_MATCH      ""5))rT   c                $    | j                  |      S rO   rZ  rS  s     rF   PYMODULE_MATCHzGuardBuilder.PYMODULE_MATCH  r\  rT   c                R   | j                  |      }| j                  |j                        }t        |      }| j	                  |       t               }t        |      dk(  r|j                  d|        n |j                  d| dt        |              | j                  ||       y )Nr   r   zlen(r   )	r   r   rz   r   r   r0  lenr   r   r   r   r   r   r   r   s         rF   r@  zGuardBuilder.SEQUENCE_LENGTH   s     ll5!$Kvu:?KK$se%KK$se5U56  -rT   c                &    | j                  |       y rO   )r@  rS  s     rF   DICT_LENGTHzGuardBuilder.DICT_LENGTH0  s    U#rT   c                   | j                  |      }| j                  |j                        }t        |      }| j	                  |       t               }|j                  d| dt        |              | j                  ||       y )Nz___tuple_iterator_len(r   )	r   r   rz   r   r   r0  r   r7   r   ra  s         rF   TUPLE_ITERATOR_LENzGuardBuilder.TUPLE_ITERATOR_LEN3  so    ll5!$Kv,SE7I%7P6QRS  -rT   c                    | j                  |      }| j                  |j                               }| d| g}| j                  ||       y )N is )r   rz   r   )r   r   source_bref_aref_br   s         rF   DUPLICATE_INPUTzGuardBuilder.DUPLICATE_INPUT?  sG    U#X]]_-'eW%&  -rT   c                   | j                  |      }| j                  |j                        }t        |      }| j	                  |       t               }t        d |j                         D              }t        t        |      t        |j                              }|r|j                  d| d|        n|j                  d| d|        | j                  ||       y )Nc              3  2   K   | ]  }t        |        y wrO   )r2   )r  ks     rF   r!  z)GuardBuilder.DICT_KEYS.<locals>.<genexpr>N  s     ?QIaL?s   )localz___key_to_id(r   list(.keys()) == )r   r   rz   r   r   r0  anyr:  r/   r3   r   r   r   r   )r   r   r   r   r   r   any_key_is_idconst_keys_reprs           rF   	DICT_KEYSzGuardBuilder.DICT_KEYSF  s    ll5!$Kv?%**,??(e&u'?'?@
 KK-uE/1BCDKK%uL0ABC  -rT   c                N    | j                  || j                  |       dg       y )Nz is not None)r   r   rS  s     rF   WEAKREF_ALIVEzGuardBuilder.WEAKREF_ALIVEZ  s&      DLL,?+@)M(NOrT   c                J   | j                  |      }| j                  |j                        }t        |      }|j	                         D ch c]  \  }}|	 }}}| j                  |       t               }|j                  d| d|       | j                  ||       y c c}}w )Nz{k for k, v in z.named_parameters()} == )	r   r   rz   r   named_parametersr   r0  r   r   )	r   r   r   r   r   rn  vr:  r   s	            rF   NN_MODULE_PARAM_NAMESz"GuardBuilder.NN_MODULE_PARAM_NAMES]  s    ll5!$K#4467da77v&se+DTHMN  - 8s   Bc           	     (   | j                  |      }| j                  |j                        }t        |      }| j	                  |       t               }|j                  d| dt        |j                                      | j                  ||       y)zConstant keys matchrp  rq  N)	r   r   rz   r   r   r0  r   r:  r   ra  s         rF   DICT_CONST_KEYSzGuardBuilder.DICT_CONST_KEYSi  ss    ll5!$KveC5T%**,-?,BCD  -rT   c                v    t        j                  | j                  |j                        | j                         y rO   )r#   watchr   rz   r   rS  s     rF   OBJECT_MUTATIONzGuardBuilder.OBJECT_MUTATIONu  s%    TXXejj143H3HIrT   c                     y rO   rP   rS  s     rF   	GRAD_MODEzGuardBuilder.GRAD_MODEx      rT   c                     y rO   rP   rS  s     rF   DETERMINISTIC_ALGORITHMSz%GuardBuilder.DETERMINISTIC_ALGORITHMS{  r  rT   c                     y rO   rP   rS  s     rF   TORCH_FUNCTION_STATEz!GuardBuilder.TORCH_FUNCTION_STATE~  r  rT   c                    |j                   t        j                  u sJ ddlmc m} | j                  |d|j                  g       y)z/Guard on CURRENT_DEVICE per torch.utils._devicer   Nzutils_device.CURRENT_DEVICE == )sourcer   GLOBALtorch.utils._deviceutils_devicer   CURRENT_DEVICE)r   r   rE   s      rF   DEFAULT_DEVICEzGuardBuilder.DEFAULT_DEVICE  sE    ||{11111''  5a6F6F5IJK	
rT   c                    |j                   t        j                  u sJ t        t        j
                  j                  j                  j                         }d| dg}| j                  ||       y)z8Guard on backend matching based on id of current_backendz___check_current_backend(r   N)
r  r   r  idrC   r?   
eval_frameguarded_backend_cachecurrent_backendr   )r   r   
backend_idr   s       rF   BACKEND_MATCHzGuardBuilder.BACKEND_MATCH  sc    ||{11111%--**@@PPQR 	 ,J<q9:  -rT   c           	        |j                   dk(  sJ | j                  j                  j                  }|D cg c]  }|j                   }}fd}j
                  rddlm} g }g }i }	j
                  D ]h  }
|
j                  j                  v r9t        j                  j                  j                  |
|j                  |||	       Tt        j!                  d       j t#        ||t%        |	j'                               d      }nd }j                  j)                  |D cg c]  }|j*                   c}|D cg c]  }|j,                   c}||| j.                  | j                  j                  j                         }| j                  j                  j                  sj                  j1                          |D ]  }| j3                  ||gd	
        y c c}w c c}w c c}w )Nrj   c                z    j                   |    D cg c]  }t        |t        j                  |       c}S c c}w rO   )tracked_fakes_id_to_sourcer   r   SIZE)t_idr   r  output_graphs      rF   get_sourcesz+GuardBuilder.SHAPE_ENV.<locals>.get_sources  s?    
 +EEdK %V^-@-@#F  s   "8r   )Symbolz+Untracked tensor used in export constraintsF)source_pairsderived_equalitiesphantom_symbols	warn_only)input_contextsequalities_inputsr   ignore_staticT)	shape_env)rz   r   r  tracked_fakessymbolic_contextexport_constraintssympyr  r  r  rC   exportdynamic_shapes_process_equalitiesr  r   r   r   r0  r;  produce_guardsfaker  r   freezer   )r   r   r   rQ   r  r  r  r  r  r  
constraintr  r8   shape_guardr  s                 @rF   	SHAPE_ENVzGuardBuilder.SHAPE_ENV  s    zzR,,99''689!,,99	 **$8:L   24O*== O
??l&M&MMLL//CC"#$..$*' KK MNO !3)#5 $_%;%;%= >	! !%''66 QVV !"!QXX")/#44AAHHH 7 
 $$1188""))+! 	KK$$U[MT$J	Kg :N !"s   G$G!=G&
Nc                   |j                         s|j                  j                         r| j                  |       y t	        |t
              r |       }||n| j                  |j                        }t	        |t        j                        sJ | j                  |      }t               }| j                  j                  j                  r| j                  |       g d}|D ]  }| j                  |dz   |z         }t!        |t        j"                  t        j$                  f      r$|j'                  d| d| dt)        |             h|j'                  | d| d|         nQ| j*                  j'                  |       | j,                  j'                  |       | j.                  j'                  |       |j0                  J t3        |d|j0                        \  }}	|sGt5        |d      r&|j'                  d	| d
|j6                   d| d       n|j'                  d| d       t9        |      dkD  r| j;                  ||       y y )N)r   r\   r   zndimension()r   zstr(r   r#  T)	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   is_dict_keyr  r_   r   r   rz   rC   Tensorr   r0  r   r  r  r   r1   r\   r   r   r   r   r   r   r  r5   r  r  r`  r   )
r   r   r   tensor_namer   termsterm
real_valuestaticreasons
             rF   TENSOR_MATCHzGuardBuilder.TENSOR_MATCH  s    5#;#;#G#G#IMM% %/".EDHHUZZ4HEeU\\222,,u-K, #fD$$1188& " MD!%+*;d*B!CJj5<<*EFd;-qeC
OCV$WX{m1TF$zl$KLM ''..{;**11%8((//6< <<+++;ELLNFF 5";<KK[M)KELiLiKjjx  zE  yF  Fm  n KK";-/TU 4y1}((5 rT   c                   t               }|J |j                  }~|J t        |      d   }~|t        | j                        v s
J d|        |r&| j
                  j                  t        ||             n%| j                  j                  t        ||             |?|j                  d uxr |j                  dk7  }|r| j                  |j                        nd }	n|}	|	t        j                  t        |	            nd }
d }t        |	j                  d      r/t        |	t         j"                        st        j                  |	      }|j%                  ||
||       y )Nrd   zH_produce_guard_code must be called from inside GuardedCode. Called from rj   __weakref__)r   f_backr   dir	__class__r   r   r   r   rz   r   weakrefr   r   r  r_   enumEnumset_export_info)r   r   r   r  r  	cur_framecaller	func_name
name_validguarded_objectguarded_object_typeobj_refs               rF   r   z GuardBuilder._produce_guard_code6  sc    !N	$$$!!!!! (+	CNN
 
 	bUV_U`a	b 
 &&}Y'FGII]9e<= #*4/DEJJ"4DJ5?TXXejj1TN4N 2@1KGKK^,-QU 	  >++];JDIIE
 kk.1G		
rT   )r   zCallable[[Any], str]r   zCallable[[Source], str]r   z)Callable[[object], ReferenceType[object]]r   Dict[str, object]r   r  r   CheckFunctionManager)rz   r   returnr   )r   zUnion[str, Guard]r  r   )r   r   r   r   )r   r   r  rt   )r   r   )r   r   r   r   r   rH  rO   )NF)(r   r   r   r   r   r   r   r   r   r   r   r  r  r
  r  r  r  rJ  rP  rT  rX  r[  r^  r@  rc  re  rk  ru  rw  r{  r}  r  r  r  r  r  r  r  r  r   rP   rT   rF   r   r      s   6D$6D ,6D C	6D
 '6D (6D /6D|40070 ?2O0
X$.V.p%R(
	+**. $	...(P
.
.J
.<K|b6L IN/
rT   r   c                      e Zd ZdZej
                  ej                  ej                  fZe	j                   G d d             Z G d dej                        Z G d dej                        ZddZddd	Zdd
ZddZy)PyExprCSEPassr   c                  "    e Zd ZU ded<   ded<   y)PyExprCSEPass.ConfigzDict[str, int]
expr_countzDict[str, str]expr_to_nameNr   rP   rT   rF   Configr    s    ""$$rT   r  c                  (     e Zd ZddZd fdZ xZS )PyExprCSEPass.ExprCounterc                    || _         y rO   )_config)r   r    s     rF   r   z"PyExprCSEPass.ExprCounter.__init__  s	    !DLrT   c                    t        |t        j                        r*| j                  j                  t        |      xx   dz  cc<   t        |   |       y Nr   )r_   r  ALLOWED_NODE_TYPESr  r  rp   supervisit)r   ro   r  s     rF   r  zPyExprCSEPass.ExprCounter.visit  s>    $ @ @A''T(:;q@;GM$rT   )r    r  r  rt   ro   ast.ASTr  r   r   r   r   r   r  __classcell__r  s   @rF   ExprCounterr    s    	"	  	 rT   r  c                  8     e Zd Z	 	 	 	 	 	 d fdZd fdZ xZS )PyExprCSEPass.Replacerc                L    t         |           || _        || _        g | _        y rO   )r  r   r  	_gen_namepreface)r   r    gen_namer  s      rF   r   zPyExprCSEPass.Replacer.__init__  s%    
 G!DL%DN&(DLrT   c                :   t        |t        j                        rt        |      }| j                  j
                  |   t        j                  kD  r|| j                  j                  vrdt        | %  |      }t        |      }| j                         }| j                  j                  | d|        || j                  j                  |<   n| j                  j                  |   }t        j                  |t        j                               S t        | %  |      S )Nz = )r_   r  r  rp   r  r  USE_THRESHOLDr  r  r  r  r  r   rr   NameLoad)r   ro   exprnode_expr_var_namer  s         rF   r  zPyExprCSEPass.Replacer.visit  s    $ @ @A#D) <<**40=3N3NN4<<#<#<< !&d 3 ,U 3#'>>#3++xjE7,CD:B11$7#'<<#<#<T#B88Hchhj997=&&rT   )r    r  r  zCallable[[], str]r  rt   r  r  r  s   @rF   Replacerr    s.    	)(	) (	) 		)	' 	'rT   r  c                j    d| _         | j                  t        j                  d       i       | _        y )Nr   c                      yr=   rP   rP   rT   rF   rS   z(PyExprCSEPass.__init__.<locals>.<lambda>  s    rT   )r  r  )_counterr  collectionsdefaultdictr  )r   s    rF   r   zPyExprCSEPass.__init__  s.    {{"..y9 # 
rT   c                P    | | j                    }| xj                   dz  c_         |S r  )r  )r   prefixrz   s      rF   _new_varzPyExprCSEPass._new_var  s'    $--)rT   c                    | j                  | j                        }|D ]'  }	 |j                  t        j                  |             ) y # t
        $ r'}t        j                  d|j                  |        d }~ww xY w)Nz#Failed to visit expr at line %s.
%s)	r  r  r  rr   parseSyntaxErrorr   	exceptionlineno)r   exprscountereexs        rF   countzPyExprCSEPass.count  si    ""4<<0 	Aciil+	  DbiiQRSs   $A			A9"A44A9c                    | j                  | j                  | j                        }|j                  t	        j
                  |            }|j                  t        |      fS rO   )r  r  r  r  rr   r  r  rp   )r   r  replacernew_nodes       rF   rm   zPyExprCSEPass.replace  sF    ==t}}=>>#))D/2h!777rT   N)r  rt   )_var)r   r   r  r   )r  r   r  rt   r  r   r  zTuple[List[str], str])r   r   r   r  rr   	AttributeCall	Subscriptr  dataclasses	dataclassr  NodeVisitorr  NodeTransformerr  r   r  r  rm   rP   rT   rF   r  r  y  sx     M --3==A% % % coo  #'3&& #'J

8rT   r  c                    t        | j                  t              xs. t        j                  xr | j
                  t        j                  u S rO   )r_   r   r&   r     guard_nn_modules_using_dict_tags	create_fnr   rP  )r   s    rF   must_add_nn_module_guardsr    s@    
 	5++^< 	
 33 :<#9#99rT   c                      e Zd Zy)DeletedGuardFnN)r   r   r   rP   rT   rF   r  r    s    rT   r  c                  4    e Zd Z	 	 d	 ddZd Zd Zd Zd Zy)	r  Nc                   |r|j                   nd }i | _        || _        d fd}t        | j                  || j
                  |j                  |j                  |       }d }t        j                  ||      t        |xs g t        j                        D ]n  }t        j                  sK|j                         r;d|j                   vr-d|j                   vrt        j"                  sd|j                   vr^|j%                  |       p | j'                  |||      | _        |j*                  | j(                  _        | j                  j-                          d | _        y )Nc                    | j                         }|t        j                  u r| j                         S sJ         }|J |j	                  | j                               S rO   )r  r   CONSTANTrz   r   )r  r  	r_builder	w_builders      rF   r   z1CheckFunctionManager.__init__.<locals>.source_ref  s]    !..0L{333{{}$9!I((($$V[[]33rT   c                &     |        }|rd |_         y y rO   )r   )weak_brR   s     rF   cleanup_builderz6CheckFunctionManager.__init__.<locals>.cleanup_builder  s    A rT   )r   __defaults____kwdefaults__hooks)r8   	_weakrefsr  r   r   r   r   r   r  r   sortedr   sort_keyr    guard_nn_modulesr  rz   skip_nnmodule_hook_guardsr   compile_check_fncheck_fnr   clear)	r   r  guard_fail_fnr8   r   builderr&  r   r#  s	           @rF   r   zCheckFunctionManager.__init__  s.   
 )5$$$;=(		4 KK  $$%%
	 KK9	FLbenn= 	"E++&&( #%**4$EJJ655

9RLL!	" --gv}M )0(?(?% 	 rT   c                  &'( |j                   }|dgz  }t        j                  d       dg&&d d  (g 'd&'(fd	}t               }|j                  D ]<  }|j
                  D ]+  }||vs |||j                         |j                  |       - > |j                  }	d }
d }|	r:| j                  j                  rJ d       |j                  }|D cg c]'  }t        | j                  j                  |   d         ) }}|D cg c]'  }t        | j                  j                  |   d         ) }}t        |||d}|j                  }
|j                   }d	j#                  |	d
gz         }&j%                  d| d       (j%                  d| d       |j&                  }t)        |	      D ]0  \  }}||   }||   }||   }t+        ||||      } ||||   d       2 | j                  r*| j                  j,                  j.                  j0                  ng }|D ]b  }t3        |t4              rC|j6                  }|j8                  } ||j;                          d|j;                          d        Vt=        d|        |j>                  D ]&  }|j
                  D ]  } |||j                          ( t@        jB                  jE                  d'fd       tF        jH                  }|tG        jJ                         }|
||j                  t@        jL                  jN                  jP                  |	dtR        tT        }tW        tY        &            }d	j#                  |j[                               }t]        ||      \  } }!t^        j`                  jc                  dd       dk(  rte        d|        tg               }"d|jh                  d   i}#	 tk        |!|#|"        |"d   |ju                          }%||%_;        ||%_<        &|%_=        (|%_>        |#|%_?        ||%_@        d |%_A        d |%_B        |%S c c}w c c}w # tl        $ r'}$tn        jq                  d|$jr                  |!        d }$~$ww xY w)Nz**___kwargs_ignoredzGUARDS:z___check_global_state()c                $    t               }t        j                  d|       j                   fd       t        j                  t        j                        rd}d}pj                  r,ddj                  j                  j                                }j                  r,ddj                  j                  j                                }t        j                  d ||       |s#j                          j                  |       y y )Nz%sc                      j                   r-t        j                  j                   j                               nd j                  r!t        j                  j                        dS d dS )N)r   r   r   )r   r   from_tracebackr   r   )r   r   s   rF   rS   zNCheckFunctionManager.compile_check_fn.<locals>.add_code_part.<locals>.<lambda>@  s_    %{{ (66u{{7J7J7LM'' #-";";E<L<L"M   rT   rj   z
Stack:
z
User stack:
zGuard: %s%s%s)r   
guards_logdebugr   verbose_guards_logisEnabledForloggingDEBUGr   joinformatr   )	r   r   log_onlyverbose_code_partmaybe_stackmaybe_user_stack
code_partsstructured_guard_fnsverbose_code_partss	   ``    rF   add_code_partz<CheckFunctionManager.compile_check_fn.<locals>.add_code_part;  s     5i GT#45 ''
 "..w}}= #% ${{(22775;;;M;M;O3P2Q&R''-bgge6F6F6M6M6O.P-QR ) #((#$	 !!),"))*;< rT   z,Illegal to set tensor_check_names in export.sizestride)dynamic_dims_sizesdynamic_dims_stridesr   z%tensor_check_names=tensor_check_namesz___check_tensors(r   T)r@  rg  zUnknown GuardEnvExpr: dynamo_guardsc                 8    D  cg c]	  }  |         c} S c c} w rO   rP   )frE  s    rF   rS   z7CheckFunctionManager.compile_check_fn.<locals>.<lambda>  s    >R0S0S 0Ss   )
payload_fn)___check_tensors___check_tensors_verbose___check_global_state___check_current_backendr   TORCHDYNAMO_PRINT_GUARDS1zGUARDS
r   z#Failed to exec guard at line %s.
%s___make_guard_fn)F)Cr   r8  r9  r1  r   r   r   addr   r  r  r   r   tensor_weakref_to_sizes_stridesTensorGuardscheckcheck_verboser>  r   r   rA  r   tracing_contextguards_contextaotautograd_guardsr_   r   input_source_ainput_source_brz   RuntimeErrorr   rC   _loggingtrace_structuredr!   initial_global_stateGlobalStateGuardr?   r  check_current_backendr   r   r0  uniquer:  build_guard_functionosenvironr   printr6  r   execr  r   r  r  r;  closure_varsargsrD  rF  r   r2  cache_entryextra_state))r   r3  
guards_outr2  largsrG  seengclr   r   check_tensors_fncheck_tensors_verbose_fnr   r   rJ  rK  tensor_guardstensor_check_argsr   irz   r   r   r   r^  r   source_arh  global_staterm  unique_code_partsmake_guard_fn_args
guard_bodypycodeoutglobals_for_guard_fnr
  r   rD  rE  rF  s)                                         @@@rF   r/  z%CheckFunctionManager.compile_check_fn/  s     '((# 00
']!#	=J u<< 	#C #t#!$		2HHTN#	# %77#' %%,,>=>,$+$A$A! /	"  +%%EEaHP" " /	$  +%%EEaHR$  $ )&#5%9M
  -22'4'B'B$ $		"&M%NN!  12C1DAFG%%(9:K9LA&NO")"="=$%78 P4 *!,*1-.q16q$wO	i)<Q)?$OP    --<<OO 	
 ( 	EE%1 // // 1hmmo5FGN"%;E7#CDD	E )) 	/C /dCII./	/
 	''(S 	( 	
 %99(99;L 0(@%1%7%7(-(@(@(V(V"4
 
 
 !
!34!YY|'8'8':;12CEWX
F::>>4d;sB*j)"f
 !$W]]3%78	-s3 +3)*L,?,?,AB ,(&8# 4!.  $#W"$h  	MM@"))VT	s$   ,P',P,
P1 1	Q!:"QQ!c                l   t        | d      r| j                  t        ur| j                  j                  x}|| j                  j                  x}ct        |t              sJ t        |t              sJ |j                  |       d | j                  _        d | j                  _        t        | _        y y y y y )Nr0  )	r  r0  r  ro  rp  r_   r)   r*   
invalidate)r   ro  rp  s      rF   r  zCheckFunctionManager.invalidate  s    
 D*%^3 $ 9 99F $ 9 99Fk:666k:666"";/(,DMM%(,DMM%*DM G G 4 &rT   c                   	 t        |      | j                  vrKt        j                  |      | j                  t        |      <   t        j                  || j
                         t        |      S # t        $ r Y t        |      S w xY w)zadd a weakref, return the id)r  r*  r  r   finalizer  	TypeErrorr   r  s     rF   r   zCheckFunctionManager.id_ref  sp    	#wdnn, +2++c*:r#w'  doo6 #w  	#w	s   A"A/ /	BBc                b    t        |      | j                  v r| j                  t        |         S y)zFLookup the _weakrefs created in id_ref function for ID_MATCH'd objectsN)r  r*  r  s     rF   r   z$CheckFunctionManager.lookup_weakrefs  s(    c7dnn$>>"S'**rT   )NN)r2  z%Optional[Callable[[GuardFail], None]])r   r   r   r   r/  r  r   r   rP   rT   rF   r  r    s2     ?CG! =G!Rl\+"rT   r  c                  	 ddl m} t        r"t               		j	                  |        d	fd}ndd} |       }| D ]]  } ||      \  }}|j                  |       |j                  d| d       |j                         5  |j                  d       d d d        _  |       }|j                  d       |j                         5  |j                  |       |j                  d	       d d d         |       }|j                  d
| d       |j                         5  |j                  |       |j                  d       d d d        |j                         |j                         fS # 1 sw Y   4xY w# 1 sw Y   xY w# 1 sw Y   BxY w)Nr   )IndentedBufferc                &    j                  |       S rO   )rm   )r  csepasss    rF   rm   z%build_guard_function.<locals>.replace	  s    ??4((rT   c                
    g | fS rO   rP   )r  s    rF   rm   z%build_guard_function.<locals>.replace  s    t8OrT   zif not (z):zreturn Falsezdef guard(L):zreturn Truezdef ___make_guard_fn(zreturn guardr  )
torch._inductor.utilsr  HAS_UNPARSE_FUNCTIONSr  r  
writelines	writelineindentsplicegetvalue)
rD  closure_argsr  rm   r~  r  r  r   make_guard_fnr  s
            @rF   rh  rh    so   4/j!	)
	
  !J 1g&xvR01  	1  0	1 	1	1 E	OOO$	 'Z &' #$M3L>DE				 0U#/0  -"8"8":::%	1 	1' '0 0s$   E'#E4#F 'E1	4E= F	c                 h    t         j                  j                  j                  j	                  d      S )Nr9   rC   rb  	_internal	log_stateis_artifact_enabledrP   rT   rF   is_recompiles_enabledr  -  s#    >>##--AA,OOrT   c                 h    t         j                  j                  j                  j	                  d      S )Nr:   r  rP   rT   rF   is_recompiles_verbose_enabledr  1  s$    >>##--AABVWWrT   c                   || j                   d   d}|j                  | j                         |d   |d<   g }| j                  D ]  }t	        | j                         }||d<   t               5  	 t        |||      }	 ddd       t        t              r|s|}t        |t              sd|j                  |       t               r n dj                  |      }	t        t        |      j                  |	       	 | j                   &| j!                  t#        |	xs dt        |                |	S # t        $ r}t               rY d}~ddd       	 d}~ww xY w# 1 sw Y   xY w# t        $ r }t$        j'                  d	       Y d}~|	S d}~ww xY 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   rQ  rP  __compile_source__Nri   zunknown reasonzVFailure in guard_fail_fn callback - raising here will cause a NULL Error on guard eval)r   updaterm  rF  r6  r   r   	Exceptionr  r_   rH  r   r   r>  r0   r4   r2  r,   r   r  )
r   r   f_localsr   reasonspartr   fail_reasonr	  
reason_strs
             rF   get_guard_fail_reasonr  5  s    !6!6s!;<E	LL&&' %&@ AE
G++ H112-1)*+- 	"4u=	 k4(Kk3'NN;'02'* 7#J=&'..z:
!!-""*8(8-:MN 9  02	 	 		 	4  
d	
 	
 
sN   +E-D,82E" ,	E5
E?EEEEE	"	F+FFc                   g }| Mt        | j                  | j                  |j                        }|r|j	                  |       | j
                  } | M|j                  }t               xs
 t               }|st        j                  rt               r"dj                  d t        |      D              }n%t        j                  dj                  |      d      }d| }d|j                   d|j                    d|j"                   dt        j                  |d	       }|r5t               rt$        j'                  |       nt(        j'                  |       t        j                  rt+        j,                  |      |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.
    z

c              3  \   K   | ]$  \  }}d | dt        j                  |d      z    & yw)zguard z failures:
- N)textwrapr  )r  ry  r  s      rF   r!  z9get_and_maybe_log_recompilation_reason.<locals>.<genexpr>  s5      #Av <(8??64+HH#s   *,ri   r  z-triggered by the following guard failure(s):
zRecompiling function z in :z    )r  r0  r   r  r   nextf_coder  r  r    error_on_recompiler>  rA  r  r  co_nameco_filenameco_firstlinenorecompiles_verbose_logr9  recompiles_logr"   RecompileError)	ro  framer  r  r   do_recompiles_logfailuresguard_failure_detailsmessages	            rF   &get_and_maybe_log_recompilation_reasonr  h  s[    G

!&  +"2"2ENN
 NN6"!&& 
! <<D ./R3P3RF55(*{{ #!*7!3# H
  tyy'94@H<XJG 	 $DLL>d6F6F5GqI\I\H]]_4f=>@ 	 ,.&,,W5$$W-$$$$W--NrT   c                   t        d|j                   d|j                   d|j                          t        ddj	                  | j
                        z   dz          t        ddj	                  | j                               d|i| j                  }| j                  D ]  }	 t        || j                  |        y #  t        d|        Y 0xY w)	NzERROR RUNNING GUARDS  r  zlambda r   z and
  r   zMalformed guard:
)
rk  r  r  r  r>  rn  rD  rm  r   r   )r   r   r  r   lastr   r   s          rF   guard_error_hookr    s     

~Qt/?/?.@$BUBUAVW 
)dii.
.
45	#zx2234:H$9$9:K$$ 0	0--{;0	0&ug./s   "B<<Cc              #  b   K   t               }| D ]  }||vs| |j                  |        y wrO   )r1  rW  )seqrs  r  s      rF   rg  rg    s3     5D D=GHHQKs   //c                    |rE|| k7  r@t        |      }t        |       }||k(  r%t        j                  t        j                  |      S y )N)rh  )r   	functoolspartialr   rk  )
obj_sourcedupe_sourceser_source_is_localsource_is_locals       rF   make_dupe_guardr    sK     {j02;?.z:
 /1 $$\%A%AKXXrT   )skipc                J   ddl m} t        j                  t        j
                        xs# t        j                  t        j
                        }|j                         j                  j                  j                  }|D ]"  }t        |t              sJ  |||| dz          $ y)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_stackr  N)torch._guardsr  r8  r;  r<  r=  r:  r   r]  rL  rW  r_   r   )r  r8   r  r  rW  r   s         rF   install_guardr    s     -$11 8		(	(	7  



-
-
;
;
?
?C K%'''E':JKrT   )ro   r  r  r   )r  zTuple[str, str])r   r-   r   types.CodeTyper  r  r  r   )r  ztypes.FrameTyper  r   )
r   r-   r   r  r  r  r   intr  rH  )
__future__r   rr   r   r  r  r  r  	importlibrA   r8  r<  r=  ri  ru   sysr  rB  r  r   r   typingr   r   r   r	   r
   r   r   r   r   numpyr`   ModuleNotFoundErrorrC   r  torch._dynamo.sourcer   r   r   r  r   r   r   r   r   r   torch._loggingr   %torch.fx.experimental.symbolic_shapesr   r   r   torch.utils._tracebackr   r   torch.utils.weakr   rj   r    r!   r"   r#   r  r$   r  r%   r&   r'   r(   r)   r*   r+   r,   r-   r  r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   	getLoggerr   r   rb  getArtifactLoggerr8  r  r  r:  r   r?   r8   rY  check_obj_idcheck_type_idr   	lru_cacherG   OrderedDict__getitem__r>  r<  import_moduler  r\   r   version_infork   rp   r  ImportErrorrx   ry   r   r   r   r  r   r   r  r  r  r  rh  r  r  r  r  r  rg  r  r  rP   rT   rF   <module>r     s1   " 
           	 	 
    . J J J !     & 
 P * 8 8 , G G J J   g!^^--hA
11(LI99"  ^^55h@PQ xx&&33xx&&33  ''55xx&&33 T. .| //;; I	
 | + /  !7 DJJ RZTRXX 
5< Y,, EKK'' ell S#$ U%& w', BQ6!
		> !%
 !3'.'
%"   
I

# I

zR8 R8j	 	Z Zz(;VPX00
0  0 		0f-'--`00
0  0 	0
 0( % &4 !" Km-  	BR   %s$   .N 
N NNNN