
    [Th             	      p   % S SK Jr   S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
r
S SKrS SKrS SKrS SKrS SKrS SKrS SKJrJr  S SKJrJrJr  S SKJrJr  S SKJrJrJr  S SKJr  S SK J!r!J"r"J#r#J$r$J%r%J&r&J'r'J(r(J)r)  S S	K*J+r+J,r,J-r-  S SK.r.S SK/r.S SK0J1s  Jr2  S SK3J4s  J5r6  S S
K.J7r7J8r8J9r9  S SK:J;r;J<r<J=r=J>r>  S SK?J@r@JArAJBrBJCrC  S SKDJErE  S SKFJGrG  S SKHJIrJ  S SKKJLrLJMrMJNrNJOrOJPrP  S SKQJRrRJSrS  S SKTJUrU  S SKVJWrW  S SKXJYrYJZrZJ[r[J\r\J]r]J^r^J_r_J`r`Jara  S SKbJcrc  S SKdJereJfrf  S SKgJhrh  S SKiJjrj  S SKkJlrlJmrmJnrn  S SKoJprpJqrqJrrrJsrs  S SKtJuruJvrv  \'(       a  S SKwrwS SK.Jxrx  S SKyJzrz  S SK{J|r|  \}r~\}r\	GR                   " \5      rS SKrS SKJrJr   " S  S!\5      r " S" S#\5      r\.GR                  GR                  GR                  r/ S$QrS%rS&rSS' jrS(rS)\S*'   \(" S+5      r\(" S,\GR&                  \\GR(                  5      r " S- S.5      r    SS/ jr    SS0 jr\" S5      SS1 j5       r " S2 S3\5      rSS4 jr\)\.Rr                  \4   rS)\S5'   SS6 jrSSS7 jjr\)\.Rr                  \.Rp                  \.Rn                  \\\4   rS)\S8'   SS9 jrSS: jrSS; jrSS< jr      SS= jrSS> jr      SS? jr\)\.R                  \\.R                  S@4   4   rS)\SA'           SSB jrSSC jrSSD jr  S         SSF jjrSSG jrSSH jrSSI jrSSJ jr\)\9\8\7\\\\GR(                  \.R                  4   rS)\SK'   \)\\\   4   rS)\SL'   SSM jrSSN jrSSO jrSSP jrSSQ jrSSR jr    SSS jr\" SEST9 " SU SV5      5       r\" SEST9 " SW SX5      5       r\" SEST9 " SY SZ5      5       r\" SEST9 " S[ S\5      5       r    S             SS] jjr  S         SS^ jjrSS_ jrSS` jrSSa jrSSb jr    SSc jr          SSe jrSSf jrSSg jr S       SSh jjrSSi.       SSj jjrSSk jrSSSl jjrSSm jrSSn jrSSo jrSSp jrSSq jrSESr.       SSs jjrSSt jr " Su Sv\5      r\" SEST9 " Sw Sx5      5       r\" SEST9 " Sy Sz\5      5       r\" SEST9 " S{ S|\5      5       r\)\\S4   r\" SEST9 " S} S~\5      5       rSS jrSS jrSS jr\" SEST9 " S S5      5       r\" SEST9 " S S\5      5       r\" SEST9 " S S\5      5       r\" SEST9 " S S\5      5       r    SS jr\^4rSS jrSS jr\" S5      SS j5       r " S S\$5      r\" S5                GS S j5       rGSS jr      GSS jr      GSS jrGSS jr    GSS jr\\\
\.S.r S     GSS jjr\" SEST9 " S S5      5       r " S S\f5      r " S S\GR                  5      r " S S\\f5      r\+" S\S9 " S S\5      5       r " S S\\e5      r\" SEST9 " S S5      5       r\" SEST9 " S S\5      5       r " S S\5      r " S S\f5      r " S S5      r\GR                  " 5       r\" SEST9 " S S5      5       Gr \ " S S5      5       Gr\GSS j5       Gr\ " S S5      5       Gr " S Sd5      GrGSS jGrGS	S jGr " S S\.Rb                  GR                  5      GrGS
S jGr	GSS jGr
 " S S\f5      Gr      GSS jGr    GSS jGrg(      )annotationsN)Counterdefaultdict)IteratorMappingSequence)_GeneratorContextManagercontextmanager)asdict	dataclassfield)Enum)	AnyCallablecast
NamedTupleNoReturnOptionalTYPE_CHECKINGTypeVarUnion)
deprecated	TypeAlias	TypeGuard)SymBoolSymFloatSymInt)
ShapeGuardSLocSourceTracingContext)dtrace_structured
LazyString
structuredtrace_structured)is_sparse_any)signpost_event)_config)FakeTensorMetarecord_shapeenv_eventreplay_shape_env_eventsshape_env_check_state_equalShapeEnvEvent)SymNodeSymTypes)
OrderedSet)is_traceable_wrapper_subclass)	Application	CeilToIntCleanDivFloorDiv
FloorToInt!IsNonOverlappingAndDenseIndicatorMaxMod	PythonMod)int_oo)
CppPrinterPythonPrinterSingletonInt)	try_solve)make_symbolsymbol_is_typeSymT)bound_sympySymPyValueRangeAnalysisValueRangeErrorValueRanges)CapturedTracebackformat_frame)Tensor
FakeTensor)BoolLikeType)AddSc                  8   ^  \ rS rSr% S\S'   SU 4S jjrSrU =r$ )GuardOnDataDependentSymNodem   sympy.Basiccondc                ,   > [         TU ]  " U6   Xl        g N)super__init__rT   )selfrT   args	__class__s      ]/var/www/auris/envauris/lib/python3.13/site-packages/torch/fx/experimental/symbolic_shapes.pyrX   $GuardOnDataDependentSymNode.__init__p   s    $	    )rT   )rT   rS   rZ   r   returnNone)__name__
__module____qualname____firstlineno____annotations__rX   __static_attributes____classcell__r[   s   @r\   rQ   rQ   m   s    
 r^   rQ   c                      \ rS rSrSrg)PendingUnbackedSymbolNotFoundu    Nra   rb   rc   rd   rf   rl   r^   r\   rj   rj   u       r^   rj   )"has_symbolic_sizes_stridescreate_contiguousShapeEnvis_concrete_intis_concrete_float	guard_intguard_floatguard_scalarcanonicalize_bool_exprhint_intSYMPY_INTERPfree_symbolsis_symbol_binding_fx_nodeis_concrete_boolis_nested_intSHAPEENV_EVENT_KEYCURRENT_NODE_KEYhas_free_symbolshas_free_unbacked_symbolssym_eqSymbolicContextStatelessSymbolicContextStatefulSymbolicContextSubclassSymbolicContextstatically_known_trueguard_size_obliviouscheck_consistentcompute_unbacked_bindingsConvertIntKeyrebind_unbackedresolve_unbacked_bindingsis_accessor_nodeValueRangesSLocSymIntEqByExprshapeenv_eventcurrent_nodec                b    [         R                  SU R                  U R                  5       5        g )Nzlru_cache_stats %s: %s)logdebugra   cumulative_cache_info)	wrapped_fs    r\   log_lru_cache_statsr      s$    II )"4"4i6U6U6Wr^   zsympy.logic.boolalg.Booleanr   SympyBoolean_T_SympyTc                  V    \ rS rSr% SrS\S'   SS jrSS jrSS jrSS jr	SS	 jr
S
rg)r      a  
This is a wrapper around SymInt which has alternative semantics for
equality.  Specifically, instead of erroring or guarding, we
instead will hash/compare equality based on the underlying sympy
expression; e.g., s0 and s1 will always compare as False.

NB: This does NOT do fancy analysis that maybe_evaluate_static does;
we can only reason through equalities that occur because to expressions
canonicalize to the same expression via regular simplification.
Union[torch.SymInt, int]valc                    Xl         g rV   r   )rY   r   s     r\   rX   SymIntEqByExpr.__init__   s    r^   c                ,    [        U R                  5      $ rV   )reprr   rY   s    r\   __repr__SymIntEqByExpr.__repr__   s    DHH~r^   c                    [        U R                  [        R                  5      (       a   U R                  R                  R
                  $ [        R                  " U R                  5      $ rV   )
isinstancer   torchr   nodeexprsympyIntegerr   s    r\   _extractSymIntEqByExpr._extract   s>    dhh--88==%%%==**r^   c                   [        U[        5      (       d   e[        U R                  5      [        L a5  [        UR                  5      [        L a  U R                  UR                  :H  $ U R                  5       UR                  5       :H  $ rV   )r   r   typer   intr   )rY   others     r\   __eq__SymIntEqByExpr.__eq__   sa    %0000 >S T%))_%;88uyy((}}%.."222r^   c                4    [        U R                  5       5      $ rV   )hashr   r   s    r\   __hash__SymIntEqByExpr.__hash__   s    DMMO$$r^   r   N)r   r   r_   r`   r_   str)r_   
sympy.Expr)r   objectr_   boolr_   r   )ra   rb   rc   rd   __doc__re   rX   r   r   r   r   rf   rl   r^   r\   r   r      s(    	 
"!+3%r^   r   c                z    [        U S   5      (       a#  SU S   R                  R                  5       U S   4$ S/U Q7$ Nr      )r}   r   nested_int_coeff)tups    r\   _nested_int_aware_sortr      sI     Q   
CFKK((*CF3
 Y#Yr^   c                   ^  SU 4S jjnU$ )Nc                4  >^^^^ [         R                  " T5      " U 5      mTR                  mSmSmSUUU4S jjnSUUUU4S jjnUTl        UTl        [        R                  [        R                  5      (       a  [        R                  " [        T5        T$ )Nr   c                    > TR                  5       n [        R                  " TU R                  -   TU R                  -   U R
                  U R                  5      $ rV   )
cache_info	functools
_CacheInfohitsmissesmaxsizecurrsize)cur	prev_hitsprev_missesr   s    r\   r   7lru_cache.<locals>.inner.<locals>.cumulative_cache_info  sJ    &&(C''CHH$cjj(	 r^   c                 p   > TR                  5       n TU R                  -  mTU R                  -  mT" 5         g rV   )r   r   r   )r   old_cache_clearr   r   r   s    r\   new_cache_clear1lru_cache.<locals>.inner.<locals>.new_cache_clear
  s3    &&(C!I3::%Kr^   )r_   zfunctools._CacheInfor_   r`   )r   	lru_cachecache_clearr   r   isEnabledForloggingDEBUGatexitregisterr   )fr   r   r   r   r   r   r   s      @@@@r\   innerlru_cache.<locals>.inner   s}    ''03	#//		 		 	 !0	*?	'GMM**OO/;r^   )r   Callable[..., _T]r_    functools._lru_cache_wrapper[_T]rl   )r   r   s   ` r\   r   r      s    @ Lr^   c                 2   SS K n SS Kn SS Kn SS Kn SS Kn SS Kn SS Kn SS Kn [        R                  [           U R                  R                  R                  U R                  R                  R                  U R                  R                  U U R                   U R"                  R$                  U R&                  R(                  U R*                  R,                  U R*                  R.                  U R0                  R2                  U R0                  R4                  U R6                  R8                  U R6                  R:                  /nSS Kn U Vs1 s H  n[>        R@                  " U5      iM     snU R"                  RB                  RE                  5       -  S1-  $ s  snf )Nr   <string>)#torch._compiletorch._dynamo.eval_frametorch._inductor.sizevarstorch._library.custom_opstorch._library.fake_impltorch._loggingtorch._subclasses.fake_tensortorch._subclasses.meta_utilssysmodulesra   fxexperimental	recordingsym_nodeinterpreter_compile_dynamo
eval_frame	_inductorsizevars_library
custom_ops	fake_impl_subclasses
meta_utilsfake_tensor_logging	_internalr$   torch._dynamo.guardsinspectgetfileguardsuninteresting_files)r   modsms      r\   r	  r	    s'   ##$#(' 	H''&&    !!  $$%%  !!D    &**T	T*
--


2
2
4	5,	*s    Fc                      \ rS rSrSrg)ConstraintViolationErrori@  rl   Nrm   rl   r^   r\   r  r  @  rn   r^   r  c                    U R                   $ rV   )_has_symbolic_sizes_strides)elems    r\   ro   ro   D  s    +++r^   Intc                    S/n[        U S S 5       H  nUR                  X!S   -  5        M     [        [        U5      5      $ )Nr   )reversedappendlist)shapestridesdims      r\   rp   rp   K  sA    Gcr
#sR[() $!""r^   c                    [        U [        R                  5      (       a  U R                  R	                  U5      $ [        U 5      [        L d   U 5       eU $ )z
Retrieve the hint for an int (based on the underlying real values as observed
at runtime).  If no hint is available (e.g., because data dependent shapes),
if fallback is not None, use that instead (otherwise raise an error).
)r   r   r   r   require_hintr   r   )afallbacks     r\   rx   rx   R  sD     !U\\""vv""8,,7c>1>Hr^   Scalarc                b    [        U [        5      (       a  U R                  R                  5       $ g)NT)r   r/   r   has_hintr  s    r\   r   r   a  s#    !Xvv  r^   c                    [        U [        [        45      (       d   e[        U [        5      (       a  g[        U R                  R                  [
        R                  R                  R                  5      (       a  gg)z
Utility to check if underlying object
in SymInt is concrete value. Also returns
true if integer is passed in.

Args:
    a (SymInt or int): Object to test if it int
TF)	r   r   r   r   r   r   corenumbersr   r!  s    r\   rr   rr   g  sV     a&#''''!S!&&++uzz1199::r^   c                    [        U [        [        45      (       d   e[        U [        5      (       a  g[        U R                  R                  [
        R                  R                  R                  5      (       a  gg)zUtility to check if underlying object
in SymInt is concrete value. Also returns
true if integer is passed in.

Args:
    a (SymInt or float): Object to test if it float
TF)	r   r   floatr   r   r   r#  r$  Floatr!  s    r\   rs   rs   {  sW     a(E*++++!U!&&++uzz117788r^   c                    [        U [        R                  5      (       a  U R                  R	                  SS5      $ [        U [
        5      (       d   U 5       eU $ )a  
Perform a guard on a symbolic boolean expression in a size oblivious way.
This is typically used when a non-oblivious test would result in a guard
on a data dependent value of which we don't know the value of at compile time.
When a guard is tested this way, we may diverge in behavior from how regular
PyTorch semantics would treat it.  For more information, see
https://github.com/pytorch/pytorch/pull/118579
 r   )r   r   r   r   r   r   r   s    r\   r   r     sI     $&&yy--b!44$%%+t+%r^   c                t    [        U 5      [        U5      :H  =(       a    [        S [        X5       5       5      $ )zv
Leverage guard_size_oblivious to compare if two lists of int/symint are equal.
Useful to compare sizes, strides etc.
c              3  @   #    U  H  u  p[        X:H  5      v   M     g 7frV   )r   ).0lhs_itemrhs_items      r\   	<genexpr>)_guard_sizes_oblivious.<locals>.<genexpr>  s%      4";H 	X122";   )lenallzip)	lhs_sizes	rhs_sizess     r\   _guard_sizes_obliviousr8    s7     y>S^+  4"%i";4 1 r^   c                  ^ ^ [         R                  [         R                  [        [        4n[        T [         R                  5      (       a  [        T[         R                  5      (       d   e[         R                  " TR                  5       T R                  5       :H  U U4S j5        [        TR                  T R                  5       H#  u  p4[         R                  " X4:H  U U4S j5        M%     g[        T U5      (       ah  [        T [        5      (       dR  [        TU5      (       a  [        T[        5      (       a   T ST  35       e[         R                  " TT :H  U U4S j5        ggg)z
Test that two "meta" values (typically either Tensor or SymInt) have
the same values, e.g., after retracing.  If we don't understand the
quantities in question, we'll just skip the consistency check.
c                 <   > TR                    ST R                    S3$ N != z (old != new)r  newolds   r\   <lambda>"check_consistent.<locals>.<lambda>  s    syykcii[,Vr^   c                 <   > TR                    ST R                    S3$ r;  r=  r>  s   r\   rA  rB    s    CII;d399+])Sr^   r<  c                    > T ST  S3$ r;  rl   r>  s   r\   rA  rB    s    C5SE)Gr^   N)r   r   r   r   r&  r   rJ   _checkr  r5  r  r   )r?  r@  scalar_typesijs   ``   r\   r   r     s    LL%..#u=L#u||$$#u||,,,,GGI"$V	
 		399-DALL!ST . 
C	&	&z#t/D/D#|,,Z6
 6
 	U$se	 
 	SCZ!GH	 0E	&r^   c                    Uc  g U c   eUR                  5        VVs0 s H!  u  p#U R                  R                  X"5      U_M#     snn$ s  snnf rV   )itemsunbacked_renamingsget)	shape_envbindingskvs       r\   r   r     sR        BJ..BRSBR$!I((,,Q2A5BRSSSs   (A	.Resultc                   UR                   S:X  a  g[        XR                  R                  S5      5      =n(       Ga  U c   eUR	                  5        GHm  u  pE[
        R                  " X%5      n[        U[        5      (       a%  [        R                  SUR                  UUU5        MV  UR                  R                  b  Mo  UR                  R                  n[        U[        R                   5      (       Gak  [#        UR$                  5      S:X  GaQ  ['        [(        [        R*                  [        R*                  4   UR$                  S   5      =n(       Ga  US   S:X  Ga  [        US   =n	[        R,                  5      (       a  [        U	R.                  =n
[        R0                  5      (       a  U R2                  U
   R5                  [7        SS5      5      (       a  U	R8                  S:X  au  ['        [(        [        R*                  [        R*                  4   UR$                  S   5      S:X  a3  [;        [        R,                  " U
S5      5      nX:X  d   U S	U 35       eU
n[        U[        R0                  5      (       d  UR<                  (       a
   S
U 35       eGMM  XG:w  d
   U S35       eU R?                  Xt5        GMp     gg)a  
Suppose we are retracing a pre-existing FX graph that previously had
fake tensor propagation (and therefore unbacked SymInts).  When we retrace,
we re-propagate fake tensors, which results in new unbacked SymInts.
When this happens, we need to tell the shape environment about the equivalence
of the old and new unbacked SymInts.  Pass us the old torch.fx.Node (which
has the old binding information) and the new result (which we can extract the
new unbacked SymInts out from).
placeholderNunbacked_bindingsz'rebind_unbacked: discard %s %s %s -> %s   r   r   r   Tr<  z#should have been constant, but got z possible memo disaster) opr   metarL  rJ  pytreekey_getr   r   r   infotargetr   hintr   r   	Piecewiser3  rZ   r   tupleBasicEqlhsSymbolvar_to_rangeissubsetrG   rhs'_sympy_cast_symbool_to_symint_guardlessrz   _rename_unbacked_to)rM  nresultrN  raw_u0pathu1raw_u1raw_u1_args0eq
new_raw_u1repackeds               r\   r   r     sP    	tt},66::12 x  $$$$NN,LF-BT "c""=HH  ww||'WW\\F 65??33$)$(ekk5;;67Q% L  !Oq(\!_4rehh??RVV3zU\\BB**:6??Aq@QRRFFaKu{{EKK78&++a.IYV CHHZ+  )DhZtF8+DD) $fell33++B8AB+ #Gx/F%GG#))&9{ -	r^   c           
     n   U R                   S:X  a  [        U R                  S   [        R                  R
                  5      (       aV  [        U R                  S   R                  R                  S5      [        R                  5      (       a  U R                  S;   a  gU R                   S:X  Ga  U R                  [        R                  R                  R                  [        R                  R                  R                  R                  [        R                  R                  R                  R                  [        R                  R                  R                  [        R                  R                  R                  R                  [        R                  R                  R                  R                  [        R                  R                  R                   [        R                  R                  R                   R                  [        R                  R                  R"                  R                  4	;   a  gg)Ncall_methodr   example_value)sizestridestorage_offsetitemTcall_functionF)rW  r   rZ   r   r   NoderX  rL  rJ   r\  opsatensym_sizedefaultr   
sym_stridesym_storage_offset	sym_numelr   s    r\   r   r   P  sH    	= tyy|UXX]]33tyy|((,,_=u||LLKKGGww/!dkk				''		##		!!		!!))		!!%%		))		))11		  ((
6 
' r^   c           	        [        U [        R                  [        R                  [        R                  [        R
                  [        R                  [        R                  45      (       d  U $ [        U [        R                  [        R                  [        R
                  45      (       a)  [        R                  R                  R                  U 5      n [        U 5      $ )aj  
Canonicalize a boolean expression by transforming it into a lt / le
inequality and moving all the non-constant terms to the rhs.
We canonicalize And / Ors / Not via cnf and then canonicalize their subexpr
recursively
nb. sympy.Rel.canonical is not good enough https://github.com/sympy/sympy/issues/25924

Args:
    expr (sympy.Expr): Expression to canonicalize
)r   r   RelAndOrNotra  Nelogicboolalgto_cnf_canonicalize_bool_expr_implr*  s    r\   rw   rw   h  s    " uyy%))UXXuyy%((EHHM  $EHHeii899{{""))$/'--r^   Tc                   U(       d  U R                   $ U(       a  U [        R                  L a%  [        R                  R                  R
                  nOFU [        R                  L a%  [        R                  R                  R                  nO[        SU  35      eUSL d   eUS   R                  (       a$  USS  nU" U5        U R                  US   /U-   US9$ UR                  5       nU" U5        U R                  XS9$ U R                  XS9$ )NzUnknown cls: Tr   r   is_commutative)identityr   rN   r#  add_addsortMulmul_mulsort
ValueError	is_Number
_from_argscopy)clsrZ   sortr  sort_fnrests         r\   _sympy_from_argsr    s     || %))jjnn--GEIIjjnn--G}SE233 %%%78DDM>>47)d"2>>RR99;DDM>>$>FF ~~d~BBr^   c                t   [        U [        R                  [        R                  45      (       a&  [	        U 5      " [        [        U R                  5      6 $ [        R                  [        R                  [        R                  [        R                  0n[        U [        UR                  5       5      5      (       a(  U R                  U R                  -
  nU[	        U 5         nOs[        U [        R                  [        R                  [        R                   [        R"                  45      (       d   eU R                  U R                  -
  n[	        U 5      nSS jn[$        R&                  n[)        U5      n[        U[        R*                  5      (       a~  / n/ nUR                   H5  nU" U5      (       a  UR-                  U* 5        M$  UR-                  U5        M7     [/        [        R*                  USSS9n[/        [        R*                  USSS9nOU" U5      (       a  U* [$        R&                  p%U" XRSS9$ )zw
After canonicalization, we are guaranteed to have eliminated Ge/Gt relations
(rewriting them to Le/Lt, respectively).
c                   U R                   =(       a    U R                  =(       dZ    [        U [        R                  5      =(       a9    U R
                  S   R                   =(       a    U R
                  S   R                  $ Nr   )r  is_negativer   r   r  rZ   ts    r\   is_neg,_canonicalize_bool_expr_impl.<locals>.is_neg  sP    - 
q%))$V)<)<VAVAV	
r^   FTr  r  evaluate)r  r   r_   r   )r   r   r  r  r   maprw   rZ   GtLtGeLer_  keysrb  rf  ra  r  rO   Zero_reduce_to_lowest_termsrN   r  r  )	r   oppositerf  r  r  rb  posnegterms	            r\   r  r    s   
 $EHH-..Dz35tyyABB%((EHHehh7H$hmmo.//hh!T$Z $588UXXuxx HIIIIhh!J

 &&C
!#
&C#uyy!!HHDd||

D5!

4 	  uyy#E$Ouyy#DN	4S S&&r^   c                   SS jnSS jnU R                   (       a  [        [        [        R                     U R
                  5      n[        R                  " [        R                  [        X5      5      nUS:X  a  U $ U Vs/ s H
  oR" XT5      PM     nn[        [        R                  USU R                  S9$ U R                  (       a  [        R                   $ U R"                  (       a  U" X" U 5      5      $ U $ s  snf )z
Eliminates any integer factor from a given expression.
E.g., 6x + 4y reduces to 3x + 2y.

Useful when an expression is == or != to 0.
c                    U R                   (       a  [        [        U 5      5      $ U R                  (       aA  U R                  S   R                   (       a!  [        [        U R                  S   5      5      $ S$ gr   )
is_Integerabsr   is_MulrZ   xs    r\   integer_coefficient4_reduce_to_lowest_terms.<locals>.integer_coefficient  sO    <<s1v;XX +,&&)*>*>3s166!9~&EAEr^   c                r   U R                   (       a  X-  $ U R                  (       a  U R                  S   U:w  a7  U R                  S   [        R                  " U5      -  /U R                  SS  QnO[        U R                  SS  5      n[        [        R                  X R                  S9$ [        SU  35      e)Nr   r   r  zillegal arg to div_by_factor: )
r  r  rZ   r   r   r  r  r  r  AssertionError)r  factorrZ   s      r\   div_by_factor._reduce_to_lowest_terms.<locals>.div_by_factor  s    <<:XXvvayF"q	EMM&$99GAFF12JG AFF12J'#EIItDTDTUU #A!!EFFr^   r   Tr  )r  r   r_   r   )r  r   r  r   r_   r   )is_Addr   r   r   ExprrZ   r   reducemathgcdr  r  rN   r  r  rO   Oner  )r   r  r  atomsr  r  s         r\   r  r    s    G {{Xejj)4995!!$((C0C,KLQ;K3895aq)59IIu48K8K
 	
 
uu	T#6t#<==K :s   C:c                B   [        U [        [        45      (       d   e[        U [        5      (       a  g[        U R                  R                  [
        R                  R                  R                  [
        R                  R                  R                  45      (       a  gg)z
Utility to check if underlying object
in SymBool is concrete value. Also returns
true if integer is passed in.

Args:
    a (SymBool or bool): Object to test if it bool
TF)
r   r   r   r   r   r   r  r  BooleanTrueBooleanFalser!  s    r\   r|   r|     sr     a'4))))!T	ekk))55u{{7J7J7W7WX  r^   c                x    [        U [        R                  5      =(       a    U R                  R	                  5       $ rV   )r   r   r   r   r}   ss    r\   r}   r}     s%    a&A166+?+?+AAr^   IterateExprsAtomIterateExprsc              #  |  #    [        U [        5      (       a*  [        U 5      (       a  U R                  R                  v   g g [        U [
        R                  5      (       a  U v   g [        U [        [        [        45      (       a  g [        U [        [        45      (       a  U  H  n[        U5       S h  vN   M     g [        U 5      (       a"  [        U R                  5       5       S h  vN   g [        U [        R                   5      (       ad  [        U R                  5       5       S h  vN   [        U R#                  5       5       S h  vN   [        U R%                  5       5       S h  vN   g U c  g [        U [        R&                  5      (       a  g [)        SU  S[+        U 5       35      e N N N Nj NK7f)Nz&cannot extract sympy expressions from  )r   r/   is_symbolicr   r   r   r`  r   r&  r   r_  r  _iterate_exprsr&   rv  r   rJ   rw  rx  	Generatorr  r   )r   r  s     r\   r  r  !  sB    #x   s((-- 	C	%	%		C#ud+	,	,	C%	'	'A%a((( 	s		!#((*---	C	&	&!#((*---!#**,///!#"4"4"6777		C	)	)EcU!DQTI;WXX )--/7s\   B3F<5F265F<+F4,A F<,F6- F<F8 F<.F:/AF<4F<6F<8F<:F<c                    U c
  [        5       $ [        U 5      n [        U5      nUR                  R
                  " S U 5       6 $ ! [         a    [        5       s $ f = f)Nc              3  8   #    U  H  oR                   v   M     g 7frV   )rz   r-  es     r\   r0  free_symbols.<locals>.<genexpr>I  s     *G3a>>3   )r0   r  nextStopIterationrz   union)r   itr
first_exprs      r\   rz   rz   =  s_    
{|

C#Y
 ""((*G3*GHH  |s   A AAc                B    [        S [        U 5       5       5      (       + $ )z)Faster version of bool(free_symbols(val))c              3  8   #    U  H  oR                   v   M     g 7frV   )	is_numberr  s     r\   r0  #has_free_symbols.<locals>.<genexpr>N  s     <(;1;;(;r  )r4  r  r   s    r\   r   r   L  s    <s(;<<<<r^   c                    SSK Jn  [        U 5       HW  nU" U5       HH  nUR                  (       d  M  [	        U[
        R                  [
        R                  45      (       d  MG      g   MY     g)z2Faster version of bool(free_unbacked_symbols(val))r   )iterargsTF)sympy.core.traversalr  r  	is_SymbolrB   rC   UNBACKED_INTUNBACKED_FLOAT)r  r  r  args       r\   r   r   Q  sW    -AA;C}}}d'')<)<=" " 	   r^   c                8    [        S [        U 5       5       5      $ )Nc              3     #    U  H8  n[        U[        R                  [        R                  45      (       d  M4  Uv   M:     g 7frV   )rB   rC   r  r  r-  r  s     r\   r0  (free_unbacked_symbols.<locals>.<genexpr>a  s4       A!d//1D1DEF 	
 s
   3A	A)r0   rz   r  s    r\   free_unbacked_symbolsr  _  s      a  r^   c                   SU R                   ;   a  [        U R                   S   [        R                  5      (       a  [        U R                   S   R                  R
                  [        R                  5      (       ad  U R                  S:X  d1  [        U R                   S   R                  R
                  5      (       a#  U R                   S   R                  R
                  $ g )Nr   rS  )
rX  r   r   r   r   r   r   rc  rW  r  r  s    r\   r{   r{   j  s    tyy'66tyy',,115<<@@GG}$$TYYu%5%:%:%?%?@@ yy$$)))r^   c                f    0 nU R                    H  n[        U5      =nc  M  X1;  d  M  X!U'   M      U$ rV   )nodesr{   )graphrr   r  s       r\   find_symbol_binding_fx_nodesr  x  s9     	A*400A=!*aD  Hr^   frozenc                  (    \ rS rSrSS jrSS jrSrg)r   i  c                    g)Nz#.cast_symbool_to_symint_guardless()rl   r   s    r\   __str__ConvertIntKey.__str__  s    4r^   c                    [        U5      $ )zGet the int value from bool) cast_symbool_to_symint_guardless)rY   bs     r\   rL  ConvertIntKey.get  s    /22r^   rl   Nr   )r  r   r_   Union[int, SymInt])ra   rb   rc   rd   r  rL  rf   rl   r^   r\   r   r     s    53r^   r   c                  4    \ rS rSr% S\S'   SS jrS	S jrSrg)
CallMethodKeyi  r   namec                "    SU R                    S3$ )N.z()r  r   s    r\   r  CallMethodKey.__str__  s    499+R  r^   c                6    [        XR                  5      " 5       $ )zCall the method on object)getattrr  rY   os     r\   rL  CallMethodKey.get  s    q))$&&r^   rl   Nr   r  r   r_   r   ra   rb   rc   rd   re   r  rL  rf   rl   r^   r\   r  r    s    
I!'r^   r  c                  4    \ rS rSr% S\S'   SS jrS	S jrSrg)
InnerTensorKeyi  r   
inner_namec                     SU R                    3$ Nr	  )r  r   s    r\   r  InnerTensorKey.__str__  s    4??#$$r^   c                ,    [        XR                  5      $ )zGet the inner tensor attribute)r  r  r  s     r\   rL  InnerTensorKey.get  s    q//**r^   rl   Nr   r  r  rl   r^   r\   r  r    s    O%+r^   r  c                  4    \ rS rSr% S\S'   SS jrS	S jrSrg)
DivideByKeyi  r  divisorc                "    SU R                    S3$ )Nz.__floordiv__()r  r   s    r\   r  DivideByKey.__str__  s    ~Q//r^   c                    XR                   -  $ )zDivide object by divisorr   r  s     r\   rL  DivideByKey.get  s    LL  r^   rl   Nr   )r  r   r_   r   r  rl   r^   r\   r  r    s    0!r^   r  c           
     p  ^^ [         R                  " [        TUTS9nSU4S jjnUc
  [        5       n0 n[	        U [
        [        45      (       aU  [        [        U 5      5       H;  n	UR                  U" X	   U[        R                  " U	5      4-   Ub  X)   OS S95        M=     U$ [        U 5      (       aL  U R                  5       u  pU
 H2  n[        X5      nUR                  U" X[        U5      4-   5      5        M4     U$ [	        U [         R"                  5      (       Gaq  SSKJn  [	        X5      (       d   eUR                  U" U R)                  5       U[+        S5      4-   U R,                  b  U R,                  R)                  5       OS S95        U R.                  [         R0                  [         R2                  [         R4                  [         R6                  4;  aY  UR                  U" U R9                  5       U[+        S5      4-   U R,                  b  U R,                  R9                  5       OS S95        UR                  U" U R;                  5       U[+        S5      4-   U R,                  b  U R,                  R;                  5       OS S95        U$ [	        U [         R<                  [         R>                  45      (       a{  [	        U" U 5      =n[@        RB                  5      (       aT  X;   aO  XU'   T(       a1  Ub.  [	        U[D        [F        45      (       d   eTRI                  X5        URK                  U5        U$ [	        U [         R<                  5      (       Ga  [	        U" U 5      =n[@        RL                  5      (       Ga  [        URN                  5      S	:X  Ga  [	        URN                  S   =n[@        RP                  [@        RB                  45      (       Ga\  [	        URN                  S
   =n[@        RB                  5      (       Ga-  UU;   UU;   -  (       Ga  [	        UU;  a  UOU=n[@        RP                  5      (       d  T(       a  UTRR                  ;   a  SU4S jjnUU;   a  UOUnT(       a*  [	        U[@        RP                  5      (       a  [E        U5      OU" U5      nU[U        U5      4-   UU'   Ubi  [	        U[D        5      (       d   e[	        U[@        RP                  5      (       a  U[E        U5      -  O[W        UU5      nT(       a  TRI                  UU5        URK                  U5        U$ [	        U [         RX                  5      (       a  [	        U" U 5      =n[@        RZ                  5      (       a  [	        UR\                  [@        RB                  5      (       a  UR^                  S
:X  a~  UR\                  U;   an  U[a        5       4-   XR\                  '   Ub6  [c        U5      [d        L d   eT(       a  TRI                  U[E        U5      5        URK                  UR\                  5        U$ )NrM  pendingsimplifyc                j   > T(       a  U R                   R                  $ U R                   R                  $ rV   )r   r   _expr)r  r'  s    r\   r   ._free_unbacked_symbols_with_path.<locals>.expr  s$    66;; vv||r^   )realr   rK   rv  rw  rx  rU  r   c                   > TR                  U [        TR                  U    5      TR                  R	                  U S /5      S   S9$ )Nr   r]  source)create_symintnoder   
var_to_valvar_to_sourcesrL  )r  rM  s    r\   _symint_wrap6_free_unbacked_symbols_with_path.<locals>._symint_wrap   sN    ..--a01 //33Av>qA /  r^   )r   Union[SymInt, SymFloat, SymBool]r_   r   )r  sympy.Symbolr_   r   )3r   partial _free_unbacked_symbols_with_pathsetr   r_  r  ranger3  updaterY  SequenceKeyr1   __tensor_flatten__r  r  r   rJ   r   rL   rv  r  real_tensorlayout
sparse_csr
sparse_csc
sparse_bsr
sparse_bscrw  rx  r   r   r   rc  r   r&  set_unbacked_var_to_valremover  rZ   r   r0  r  r4   r   ra  rb  rf  r   r   r   )r  rl  r+  rM  r&  r'  gor   r  rG  attrs_attrsubrL   r  rb  rf  coeffr2  unbackedr  r   s      ` `                 r\   r7  r7    s
    
		(	
B %
A!eT]## s1vAHHDF..q133$($4$ x Hi 
'q	)	)'')D!"CHHR^D%9$;;<= b H] 
Au||	$	$<!((((	f-//-.]]-FQ]]'')D	
 88	
 
 HHHHJM(35534==3L--/RV 	
  "&6799 }}0 MM002
	
l HS 	1u||U^^455DG|qU\\22L!)dS%L1111--a6qB Hu 	1ell##DG|qUYY//K1affQi's%--)FGGaffQi's66Wn00 s''9sBuEMMRR---	 .3c Zu}}== Je$ 	 k'244(dC(((( eU]]33 E
"dE* 
 11(C@x & H 	1emm$$DG|qUXX..quuell++EEQJEEW=?,,%%:%%%11!SY?quuHr^   c           	     ,   U c  gU R                   n[        U5      nU(       d  gU(       d&  [        R                  SU5        UR	                  5         [        USXSS9nU(       df  U(       a_  [        U[        R                  5      (       a)  [        UR                  5       UR                  5       45      OSn[        SU SU S	U S
35      eUGbF  UR                  5        GH1  n[        R                  " X(5      n	[        R                  " X5      n
[        U
[         5      (       d  MG  [        U
R"                  R$                  =n[&        R(                  5      (       d  M~  [        U	[         5      (       a`  U	R"                  R$                  =o:w  aE  [        U[&        R(                  5      (       a  U R+                  X5        M  U R-                  X5        M  [        U	[         5      (       a  GM  U R-                  U[&        R.                  " U	5      5        GM4     U$ )ab  
After having run fake tensor propagation and producing example_value
result, traverse example_value looking for freshly bound unbacked
symbols and record their paths for later.  It is an error if
we have allocated an unbacked SymInt but it cannot be found in
example_value.  (NB: this means if you have a multi-output
function, you must call this on the tuple of tensor output, you
cannot wait!)

The peek parameter lets you check out what the bindings are without
changing the affected list.  This is primarily useful for ensuring
unbacked_var_to_val is promptly populated when propagate_real_tensors is on.
Nzcompute_unbacked_bindings %srl   Fr%  r)  zPending unbacked symbols z not in returned outputs r  z.
Did you accidentally call new_dynamic_size() or item() more times than you needed to in your fake implementation?
For more help, see https://docs.google.com/document/d/1RWrH-3wLEpzR9kCS6gGBNen_-Fs-8PVbWWFE5AcgeWE/edit)pending_fresh_unbacked_symbolsr8  r   r[  clearr7  r   r   rJ   r   rw  rx  rj   valuesrY  rZ  r/   r   r   r   rc  rh  _eliminate_unbackedsympify)rM  ru  old_example_valuepeekfsr&  symbol_to_pathextrakeypathold_symnew_symnew_sold_ss                r\   r   r   N  s   & 		1	1B"gG/4

5rY%N G -66 -&&(-*F*F*HIJ 	
 ,'y0I-XYZ_Y` av v
 	
( $%,,.Gnn%6@Gnn]<G'8,, ***ELL2 2 w11"),,"3"33=!%66!55eC!55eC#GX6611%w9OP /" r^   c                    [        U [        5      (       a+  U R                  R                  5       (       a  [	        U 5      $ g[        U 5      $ )az  
Returns True only if we can tell that a is True, possibly introducing
a guard in the process.  If a depends on some unbacked SymInt, we may
return False even though there may exist a possible value of the SymInt
that would cause the expression to return True.

When is it appropriate to use definitely_true?  First, if you can use
a higher level combinator prefer using those instead, they are definitely
safe (modulo short-circuiting).
Second, it can be used if the program would behave equivalently if
definitely_true always returned False. Finally, it even
be OK if the program wouldn't behave equivalently, so long as the
change is semantics preserving.  It can be semantics preserving if
the program errors in more cases than it did previously (but otherwise
behaves identically), or if it changes some quantity in a way that
doesn't matter (e.g., strides often fall in this bucket.)
Fr   r   r   r   
guard_boolr   r!  s    r\   definitely_truer_    s8    $ !W66??a= 7Nr^   c                    [        U [        5      (       a0  U R                  R                  5       (       a  [	        U 5      (       + $ g[        U 5      (       + $ )a3  
Returns True only if we can tell that a is False, possibly introducing
a guard in the process.  If a depends on some unbacked SymInt, we may
return False even though there may exist a possible value of the SymInt
that would cause the expression a to be False.  See definitely_true
for more usage guidance.
Fr]  r!  s    r\   definitely_falsera    s>     !W66??!!}$$Aw;r^   c                F   [        U [        5      (       aN  U R                  R                  nU R                  R                  n UR                  U5      nUb  [        U5      $  g[        U [        5      (       d   eU $ ! [         a    [        R                  SU5         gf = f)a)  
Returns True if x can be simplified to a constant and is true.

.. note::
    This function doesn't introduce new guards, so the expression may end
    up evaluating to true at runtime even if this function returns False.

Args:
    x (bool, SymBool): The expression to try statically evaluating
zCould not simplify %sF)
r   r   r   r   rM  _maybe_evaluate_staticr   	Exceptionr   r   )r  r   rM  
simplifieds       r\   r   r     s     !Wvv{{FF$$		5"99$?J%J'' & aH	  	5II-t4	5s   A= = B B c                &   [        U [        5      (       a  [        U[        5      (       d*  [        U [        5      (       ab  [        U[        5      (       aM  [        U 5      [        U5      :w  a  g[        R
                  " [        R                  [        [        X5      S5      $ [        U [        [        R                  45      (       a)  [        U[        [        R                  45      (       a  X:H  $ [        S[        U 5       S[        U5       35      e)z
Like ==, but when run on list/tuple, it will recursively test equality
and use sym_and to join the results together, without guarding.
FTzunexpected sym_eq between r  )r   r_  r  r3  r   r  operatorand_r  r   r   r   r   r  r   )r  ys     r\   r   r     s    
 	1eAu!5!51d
1d 3 3q6SVs61/@$GG	AU\\*	+	+
1sELL>Q0R0Rv9$q'!DG9MNNr^   c                   [        U [        [        45      (       a  [        U 5      $ [        U [        [
        45      (       a  [        U 5      $ [        U [        [        45      (       a  [        U 5      $ [        SU  35      e)Nzunrecognized scalar )r   r   r   r^  r   r   rt   r   r&  ru   r  r!  s    r\   rv   rv     si     !gt_%%!}	A}	%	%|	A%(	)	)1~3A3788r^   rq   c                (    U R                  XU5        g rV   )constrain_symbol_range)rM  r  compiler_mincompiler_maxs       r\   _constrain_symbol_rangero     s     $$QlCr^   c                l   [        U [        5      (       a  [        U R                  [        5      (       a  [        U R                  R                  [
        R                  5      (       aK  U R                  R                  R                  U R                  R                  5      (       a  [        U 5        ggggg)a4  
Don't use this directly; use torch._check_is_size instead.

This is a softer version of _constrain_range_for_size (with min=0,
max=Inf).  Instead of forcibly constraining a variable (and erroring if we
failed to constrain it), it will simply advise us that a size is
constrained in some way.  We will always defer a runtime assert for this
constraint if we cannot prove it at compile-time, but we we only
*sometimes* learn useful extra information at compile-time with this
information.  This is in contrast to constrain_range_for_size, where if
you don't call that on a fresh unbacked symint, chances are we will choke.

TODO: Make Dynamo handle this appropriately if this is seen in Dynamo-ed
code.  Right now this is only really used in code with AOTAutograd trace
through, so it is not a big problem that this isn't supported, but in
principle all of this code should be Dynamo'able too.

TODO: I didn't support min/max because I didn't have a use case where this
actually helped.  In principle we can support it, it just makes the
implementation below more complicated.
N)
r   r   r   r.   r   r   rc  rM  is_unbacked_symint_constrain_range_for_sizer!  s    r\   _advise_is_sizers    s{    D 	1fqvvw''qvv{{ELL11FF//<<!!$ = 2 ( 	r^   c                   [        U [        5      (       a  [        U R                  [        5      (       a  [        U R                  R                  [
        R                  5      (       a  U R                  R                  R                  U R                  R                  5      (       aQ  [        U[        5      (       a;  U R                  R                  R                  U R                  R                  U5        g g g g g g rV   )r   r   r   r.   r   r   rc  rM  rq  r   _constrain_is_bounded)r  upper_bounds     r\   _advise_is_boundedrw  0  s    1fqvvw''qvv{{ELL11FF//<<{C((	..qvv{{KH ) = 2 ( 	r^   c                v   [        U [        [        45      (       a  [        S5      e[        U [        5      (       d   S5       e[        U R
                  R                  [        R                  5      (       d
   SU  35       eU R
                  R                  R                  U R
                  R                  X5        g)z5
This function is NOT INTENDED to be used by itself.
z$Constraining SymFloat/SymBool is nyiz#can only constrain range for SymIntzconstraining non-Symbols NYI: N)r   r   r   r  r   r   r   r   rc  rM  rr  r  minmaxs      r\   rr  rr  ;  s     !h())?@@a  G"GG affkk5<<00V4RSTRU2VV0FF..qvv{{CEr^   )r{  c          	     0   Uc  [         * nUc  [         nX!:  a  [        S5      e[        U [        5      (       a$  Xs=::  a  U::  d  O  [        SU  SU SU S35      egU R                  R
                  R                  U R                  R                  X5        g)a  
Applies a constraint that the passed in SymInt must lie between min-max
inclusive-inclusive, WITHOUT introducing a guard on the SymInt (meaning
that it can be used on unbacked SymInts).  If min/max are None, we assume
that the dimension is unbounded in that direction.  Repeated application
of constrain_range intersects the ranges.  This is a fairly low level API
that doesn't have a lot of safety guarantees (TODO: provide higher level
APIs).

Currently, we use this API in the following circumstance: when we allocate
an unbacked SymInt, denoting an integer quantity which is data dependent,
we ordinarily do not know anything about what values it may take.  This
means that any sort of guard on it will immediately fail.  However, in
many cases, we know something about the unbacked SymInt: for example, we
know that nonzero(x).size(0) must be >= 0.  We use constrain_range to
narrow the possible range, declaring that negative symbols are impossible.
This permits to definitely answer True to queries like 'nnz >= 0', even if
we don't know what the actual (hinted) value of 'nnz' is.  In fact, we
actually use constrain_range to unsoundly discharge common guards: for an
unbacked SymInt produced by nonzero, we will also assume that it is not
equal to 0/1 (even though these are perfectly possible values at runtime),
because we generally expect graphs that are valid for N=2 to also be valid
for N=1.
NoMaximum value to constrain_as_size can't be less than the specified min value, received min={min} and max={max}Invalid value  for range [:])r;   r  r   r   r   rM  _constrain_ranger   ry  s      r\   constrain_ranger  L  s    6 {g
{
y/
 	

 !SC~aSSE3%qIJJFF%%affkk3<r^   c                    [        U [        5      (       d4  [        U[        5      (       d  X:X  d   egUR                  R                  nOU R                  R                  nUR	                  X5        g)
Given two SymInts, constrain them so that they must be equal.  NB:
this will not work with SymInts that represent nontrivial expressions
(yet!)
N)r   r   r   rM  _constrain_unify)r  r  rM  s      r\   constrain_unifyr  z  sV     a  !V$$6M6((IFF$$	q$r^   c                x   [        U [        5      (       a  [        R                  " 5       n[	        US-   5       H  nUc    OUR
                  nM     U R                  R                  U(       a  UR                  R                  OSU(       a  UR                  5      $ S5      $ [        U 5      [        L d   U 5       eU $ )Nr   r)  r   )r   r   r  currentframer9  f_backr   expect_truef_codeco_filenamef_linenor   r   )r  skipframerG  s       r\   r  r    s    !W$$&taxA}LLE ! vv!!(-ELL$$2u~~
 	
TU
 	
 7d?A?Hr^   c                    [        U [        5      (       a  U R                  R                  SS5      $ [	        U 5      [
        L d   U 5       eU $ Nr)  r   )r   r   r   r^  r   r   r!  s    r\   r^  r^    s@    !Wvv  Q''7d?A?Hr^   c                    [        U [        5      (       a  U R                  R                  SS5      $ [	        U 5      [
        L d   U 5       eU $ r  )r   r   r   rt   r   r   r!  s    r\   rt   rt     s@    !VvvA&&7c>1>Hr^   c                    [        U [        5      (       a  U R                  R                  SS5      $ [        U [        5      (       d   U 5       eU $ r  )r   r   r   ru   r&  r!  s    r\   ru   ru     sC    !Xvv!!"a((a""Hr^   c                    U R                   R                   Vs/ s H#  oR                  S:X  d  M  UR                  S   PM%     sn$ s  snf )NrS  r   )r  r  rW  rX  gmri  s     r\   fx_placeholder_valsr    s5    #%88>>K>aTT]5JMAFF5M>KKKs
   AAc                    U R                   R                   Vs/ s H   oR                  S:X  d  M  UR                  PM"     sn$ s  snf )NrS  )r  r  rW  r\  r  s     r\   fx_placeholder_targetsr    s1     hhnnFn0EHAHHnFFFs
   AAignore_staticc               H    U R                   R                  [        U 5      X!S9$ )Nr  )rM  evaluate_guards_for_argsr  )r  r  rZ   s      r\   eval_guardsr    s*     <<00B 1  r^   c                L    U R                   R                  [        U 5      U5      $ rV   )rM  bind_symbolsr  )r  rZ   s     r\   r  r    s    <<$$%8%<dCCr^   c                  0    \ rS rSrSrSrSrSrSrSr	Sr
S	rg
)
DimDynamici  a-  
Controls how to perform symbol allocation for a dimension.  It is always
sound to default this to DYNAMIC, but the policies DUCK and STATIC can
result in better trace-time and compile-time performance, as they reduce
the number of allocated symbols and generally make your graph more static.

NB: If we notice you've applied a constraint to the dimension, we will
force it to DYNAMIC for simplicity.

DimDynamic is controlled by a variety of higher level UX features.
Currently:

- In eager mode, the default policy is DUCK.
    - The default is changed to STATIC with assume_static_by_default.
    - An individual dim is marked DYNAMIC if you mark_dynamic_dim.
- In export mode, the default policy is STATIC.
    - An individual dim is marked DYNAMIC if you specify it in
      dynamic_shapes passed to export.
r   r   rU           rl   N)ra   rb   rc   rd   r   DYNAMICDUCKSTATICSIZE_LIKE_UNBACKEDINFER_STRIDEOBLIVIOUS_SIZErf   rl   r^   r\   r  r    s*    * G DFLNr^   r  c                       \ rS rSr% S\S'   Srg)
Constrainti  r   	warn_onlyrl   Nra   rb   rc   rd   re   rf   rl   r^   r\   r  r    s    Or^   r  c                  .    \ rS rSr% SrS\S'   SS jrSrg)	StrictMinMaxConstrainti"  a  
For clients: the size at this dimension must be within 'vr' (which
specifies a lower and upper bound, inclusive-inclusive) AND it
must be non-negative and should not be 0 or 1 (but see NB below).

For backends: there must not be any guards on this dimension which
are not implied by the given lower and upper bound.  Regardless of
the lower bound, the backend can assume the size is non-negative
and that it is not 0 or 1.

An unbounded StrictMinMaxConstraint can be thought of as a strict version
of "RelaxedUnspecConstraint".

NB: Export will often unsoundly assume that a graph works for 0/1, even
though at trace time we assumed size is not 0 or 1.  The idea is that
if we produce a graph that works for a range of values, it will be OK
for N=0/1 too.
rG   vrc                    U R                   R                   SUR                  5        SU R                   R                   3$ )zFormat the constrain equation <= )r  lowerr  upperrY   r.  s     r\   renderStrictMinMaxConstraint.render9  s1     ''--V[[]O4GGr^   rl   Nr.  r    r_   r   )ra   rb   rc   rd   r   re   r  rf   rl   r^   r\   r  r  "  s    & 	OHr^   r  c                  "    \ rS rSrSrSS jrSrg)RelaxedUnspecConstrainti?  a  
For clients: no explicit constraint; constraint is whatever is implicitly
inferred by guards from tracing.

For backends: there must exist at least TWO possible values for the
size at this dimension which satisfy the guards for this dimension.

In other words, this constraint helps us distinguish between "we don't
care if this dimension specializes or not" versus "this dimension must be
unspecialized."  However, this constraint doesn't say very much about what
specialization is permitted; for example, if we guard on a size being
even, this would still be acceptable under an unspec constraint.  This
makes RelaxedUnspecConstraint useful for eager mode, where your backend compiler
may add constraints to otherwise dynamic dimensions; we can't assert that
there are NO guards as this is brittle because compilers should be able to
add extra constraints.  If you want to assert that there are no guards,
use StrictMinMaxConstraint with an unbounded ValueRanges.
c                *    SUR                  5        S3$ )NzRelaxedUnspecConstraint(r  r
  r  s     r\   r  RelaxedUnspecConstraint.renderT  s    )&++-::r^   rl   Nr  )ra   rb   rc   rd   r   r  rf   rl   r^   r\   r  r  ?  s    &;r^   r  c                      \ rS rSr% SrS\S'   S\S'   S\S'   S	\S
'   \" SS9rS\S'   \" SS9rS\S'   SS jr	SS jr
SS jrSS jrSS jr        SS jrSrg)EqualityConstrainti^  a  
Represent and decide various kinds of equality constraints between input sources.

A "source pair" is a pair of input sources for dynamic dimensions that
are specified equal. We represent `source_pairs` in a union-find forest
so that we can efficiently check whether two such sources are transitively equal.

A "derived equality" relates an input source to an expression over a root.
The root can be another input source, corresponding to some dynamic dimension,
or a phantom symbol that does not directly represent any dynamic dimension. We
represent `derived_equalities` involving input sources in a transitively-closed map
so that we can efficiently check whether an input source is transitively equal to
a given expression over another input source.
(NOTE: In contrast, it is easy to decide whether an input source is transitively equal
to a given expression over a phantom symbol; such expressions are already in canonical
form and so the problem reduces to symbolic expression equality.)
zlist[tuple[Source, Source]]source_pairszTlist[tuple[Source, Union[Source, sympy.Symbol], Callable[[sympy.Expr], sympy.Expr]]]derived_equalitieszlist[sympy.Symbol]phantom_symbolszset[Source]relaxed_sourcesF)initzdict[Source, Source]_parentszdict[Source, sympy.Expr]_defsc                   0 n[         R                  U SU5        0 n[         R                  U SU5        U R                   H5  u  p4U R                  U R	                  U5      U R	                  U5      5        M7     U R
                   H~  u  pVn[        U[        R                  5      (       a&  U" U5      U R                  U R	                  U5      '   MK  U" U R                  U5      5      U R                  U R	                  U5      '   M     g)a  
Pre-processing to answer queries `is_equal` and `is_derived` below.

Example: Suppose we are given:
  source_pairs [a = b, b = c]
  derived_equalities [d = c + 1, e = d - 1]
We first construct a union find with source_pairs:
  _parents = {a: a, b: a, c: a}
Then we compute canonical symbolic expressions, recursively applying derived_equalities
until we bottom out:
  _defs = {d: c + 1, e: (c + 1) - 1 aka c}
r  r  N)r   __setattr__r  _union_findr  r   r   rc  r  _rewrite)rY   r  r  source1source2r.  rootfns           r\   __post_init__ EqualityConstraint.__post_init__|  s      *,4X6 +-4%0 $ 1 1GKK

7+TZZ-@A !2 !% 7 7F" $--13D

4::f-.13DMM$4G1H

4::f-. !8r^   c                `    XR                   ;   a  U R                  U R                   U   5      $ U$ rV   )r  r  r  s     r\   r  EqualityConstraint._find  s)    ]]"::dmmF344Mr^   c                ,    X:w  a  X R                   U'   g g rV   )r  )rY   root1root2s      r\   r  EqualityConstraint._union  s    >#(MM%  r^   c                    U R                  U5      nXR                  ;   a  U R                  U   $ [        R                  " UR	                  5       5      $ rV   )r  r  r   rc  r  )rY   srcs     r\   r  EqualityConstraint._rewrite  s@    jjo** ::c?" <<
++r^   c                    U R                  U5      =o0R                  ;   =(       dD    U R                  U5      =o@R                  ;   =(       d    X4:H  =(       d    U R                  XS 5      $ )Nc                    U $ rV   rl   r  s    r\   rA  -EqualityConstraint.is_equal.<locals>.<lambda>  s    1r^   )r  r  
is_derived)rY   r  r  src1src2s        r\   is_equalEqualityConstraint.is_equal  sa     ZZ((T-A-AA >

7++0D0DD>|> w=	
r^   c                T    U R                  U5      U" U R                  U5      5      :H  $ rV   )r  )rY   r  
symbol_srcr  s       r\   r  EqualityConstraint.is_derived  s&     }}S!Rj(A%BBBr^   rl   Nr   )r.  r    r_   r    )r  r    r  r    r_   r`   )r  r    r_   r   )r  r    r  r    r_   r   )r  r    r  r    r  z"Callable[[sympy.Expr], sympy.Expr]r_   r   )ra   rb   rc   rd   r   re   r   r  r  r  r  r  r  r  r  rf   rl   r^   r\   r  r  ^  s    $ .-  ('  %*%6H"6&+&7E#7!IF)

,	
CC'-C3UC	Cr^   r  c                n    [        U [        5      (       d   S5       e[        U 5      [        Ld   S5       eg)NzInvalid symbolic_context objectz%Illegal usage of symbolic_context ABCT)r   r   r   symbolic_contexts    r\   _assert_symbol_contextr    sI    /  )()  	o5/./5r^   c                   [        U [        R                  [        R                  45      (       a  [	        U R
                  5      S:  a  gU R
                  u  p[        U5      =(       a    [        U[        R                  5      =(       d,    [        U[        R                  5      =(       a    [        U5      $ [        U [        R                  5      $ )NrU  F)	r   r   rN   r  r3  rZ   _is_supported_equivalencer   rc  )r   rb  rf  s      r\   r  r    s     $EII.//tyy>A99)#.Q:c5==3Q 
sEMM*M/H/M	
 dELL))r^   c                0   U R                  [        R                  R                  R                  R
                  [        R                  R                  R                  R                  [        R                  R                  R                  R                  5      $ )zD
Add functions that our sympy interpreter can't reify into FX nodes
)hasr   utils_sympy	functionsToFloat
TruncToIntr3   r*  s    r\   #_has_uninterpretable_sympy_functionr    s`     88$$,,$$//$$.. r^   c                      \ rS rSrSrSrg)r   i  a7  
Data structure specifying how we should create symbols in
``create_symbolic_sizes_strides_storage_offset``; e.g., should
they be static or dynamic.

This is an abstract base class because we are probably going to add
another version of this that says "use exactly these SymInts, don't
allocate fresh symbols."
rl   N)ra   rb   rc   rd   r   rf   rl   r^   r\   r   r     s    r^   r   c                  f    \ rS rSr% SrS\S'   SrS\S'   SrS\S'   SrS\S	'   Sr	S
\S'   SS jr
Srg)r   i  z
Create symbols in ``create_symbolic_sizes_strides_storage_offset`` via
a symbolic_context determination as given by ``DimDynamic`` and ``DimConstraint``.
This will cause fresh symbols to be allocated
zDimList[DimDynamic]dynamic_sizesNdynamic_strideszDimList[DimConstraint]constraint_sizesconstraint_stridesOptional[SymbolicContext]view_base_contextc                   U R                   c<  [        R                  U S[        R                  /[        U R                  5      -  5        U R                  c.  [        R                  U SS /[        U R                  5      -  5        U R                  c.  [        R                  U SS /[        U R                  5      -  5        [        S U R                    5       5      (       d   eg )Nr  r  r  c              3     #    U  H7  nU[         R                  [         R                  [         R                  4;   v   M9     g 7frV   )r  r  r  r  )r-  rw  s     r\   r0  9StatelessSymbolicContext.__post_init__.<locals>.<genexpr>  s3      
. z..
0B0BJOOTT.s   ?A)
r  r   r  r  r  r3  r  r  r  r4  r   s    r\   r  &StatelessSymbolicContext.__post_init__  s    '!(()C0B0B,CC
   ((4&3t7I7I3J*J ""**TFS9K9K5L,L  
..
 
 
 	
 
r^   rl   r   )ra   rb   rc   rd   r   re   r  r  r  r  r  rf   rl   r^   r\   r   r     sE     '&+/O(//3,315.5 4807
r^   r   c                  N   ^  \ rS rSr% SrSrS\S'   SrS\S'   S
U 4S jjrS	r	U =r
$ )r   i6  a  
Create symbols in ``create_symbolic_sizes_strides_storage_offset`` via
a symbolic_context determination as given by a cache of Source:Symbol. A cache hit
will reuse a stored symbol, and a cache miss will write to this cache.

This behaves like StatelessSymbolicContext, except the cache supersedes the
other values - dynamic_sizes and constraint_sizes will not be read if we cache
hit.

It is the cache owners responsibility to maintain the lifecycle of the cache
w/r/t different shape_envs, clearing, etc.
Nr    tensor_sourcez dict[int, dict[str, sympy.Expr]]#shape_env_to_source_to_symbol_cachec                   > [         TU ]  5         U R                  c   eU R                  (       d  [        R                  U S0 5        g g )Nr  )rW   r  r  r  r   r  rY   r[   s    r\   r  %StatefulSymbolicContext.__post_init__Q  sA    !!---77t%JBO 8r^   rl   r   )ra   rb   rc   rd   r   r  re   r  r  rf   rg   rh   s   @r\   r   r   6  s0     !M6  MQ')IPP Pr^   r   c                  @   ^  \ rS rSr% SrSrS\S'   SU 4S jjrSrU =r	$ )	r   iY  z
The correct symbolic context for a given inner tensor of a traceable tensor subclass
may differ from that of the outer symbolic context. This structure allows for this
flexibility, with inner symbolic contexts mapped via attr -> symbolic context.
Nzdict[str, SymbolicContext]inner_contextsc                L   > [         TU ]  5         U R                  c  0 U l        g g rV   )rW   r  r	  r  s    r\   r  %SubclassSymbolicContext.__post_init__c  s'    &"$D 'r^   )r	  r   )
ra   rb   rc   rd   r   r	  re   r  rf   rg   rh   s   @r\   r   r   Y  s     26N.5% %r^   r   c                x    [        U [        [        [        45      (       a  gU R                  R                  5       $ NF)r   r   r&  r   r   r  r   s    r\   r  r  i  s.     #UD)**88!!r^   c                   / / p!U  H8  nUR                   (       a  UR                  U5        M'  UR                  U5        M:     [        R                  " U6 /nU H9  n[        R
                  " XER                  5       VVs/ s H	  u  pgXg-  PM     nnnM;     [        R                  " U6 nU[        U5      S:  =(       d#    [        U5      S:  =(       a    [        U5      S:  4$ s  snnf )Nr   r   )	r  r  r   r  	itertoolsproductrZ   rN   r3  )rZ   addsr   r  rj  r  r  r  s           r\   _expandsumsr  t  s    b%::KKLL	  ii F$-$5$5fhh$GH$GDA!%$GH  YYF3t9q=FSY]%Es5zA~FF Is   >C"c                p   U R                    Vs/ s H  n[        U5      PM     nn[        S [        U R                   U5       5       5      (       a  [        U R                  " U6 5      $ U R
                  (       a  U R                   u  p4UR                  (       ai  UR                  (       aX  US:  a  [        R                  " U SS9$ US:  a7  [        R                  [        R                  " [        R                  U -  SS9-  $ U $ U R                  (       a  / n/ nU R                    H\  nUR
                  (       a7  UR                   S   S:X  a$  UR                  [        R                  U-  5        MK  UR                  U5        M^     [        U5      u  pW[        U5      u  phU(       d  U(       a  XV-  $ U $ s  snf )Nc              3  ,   #    U  H
  u  pXLv   M     g 7frV   rl   )r-  r  new_args      r\   r0  _fast_expand.<locals>.<genexpr>  s     
K2J,#32Js   r   F)deepr   r  )rZ   _fast_expandanyr5  funcis_Powr  r  r   expand_multinomialrO   r  r  r  r  )	r   r  new_argsbaseexpnumdennum_changedden_changeds	            r\   r  r    sG    .2YY7YcS!YH7

K#dii2J
KKKDIIx011{{ II	>>dkkQw//5AAquuu775QQQ K 
 " "99CzzchhqkR/

1553;'

3	  's+&s++9K7 8s   F3   c                    [        U S5      (       a   [        U 5      $ U $ ! [         a    [        R	                  SU 5        U s $ f = f)a  
Expand the given symbolic expression by recursively rewriting product of
sums into sum of products (with the product being either a multiplication or
exponentiation).

NOTE: using this on an intermediate expression may prevent simplification
down the line, e.g., if we eagerly expand `(a + b)^2` into `a^2 + 2ab + b^2`,
we won't be able to simplify `(a^2 + 2ab + b^2) / (a + b)` as easily.
expandz"RecursionError in _fast_expand(%s))hasattrr  RecursionErrorr   warning)r  s    r\   safe_expandr*    sL     q(	?"
 	  	KK<a@H	s   
  "AAc                  >    \ rS rSr% S\S'   S\S'   S\S'   S\S	'   S
rg)_SymbolInfoi  r5  rO  zOptional[ValueRanges]r  zOptional[sympy.Integer]r   r   is_size_likerl   Nr  rl   r^   r\   r,  r,    s    O	  r^   r,  c                F   0 n0 n[        U5       H  u  pgUu  pp[        U
[        5      (       a  M!  U	c   eU(       aN  U(       aG  [        SU	R                  5      n[        SU	R                  5      nX:  a  US-
  nX::  a  [        X5      n	OU	R                  nU[        * L d  U(       a  U
c  U	R                  (       d  XU'   M  [        R                  " SU 3SSS9n[        US-
  5      nX-   XH'   [        R                  " X* 5      X^'   M      U R                  U5      n['        [)        U5      5      nUR*                  (       a  U$ [-        UU5      nUR/                  5       (       a  UR                  $ U(       a  U$ S$ ! [          a    ["        R%                  SX5         gf = f)	a	  
This variant of ShapeEnv._maybe_evaluate_static has no dependence on
ShapeEnv and thus can be cached indefinitely.  It does the "heavy" lifting
for static evaluation, including nontrivial reliance on Sympy simplification
that occurs when we reallocate the symbols
NrU  l          r   evaluate_static_shape_Tpositiveintegerz(RecursionError in sympy.xreplace(%s, %s))	enumerater   r?   r{  r  rz  r  rG   r;   is_intr   rc  r   rE   r  xreplacer(  r   r)  rw   r*  r  rD   is_singleton)r   symbol_infounbacked_onlysize_obliviousnew_shape_envnew_range_envidxsinforO  r  r   r-  r  r  r  offsetnew_exprouts                     r\   _maybe_evaluate_static_workerrA    s     MM,
#( sc<(( ~~l288$E rxx(E}	 ~ .HHE VG#/"))!! LL1#7$PTU UQY:266r7Cs -x==/ &k(&;<H h
.C
yy$8.$.!  >Ts   E= = F F c                     [        S5      e)Nzshouldn't be hit)r  rl   r^   r\   errorrC  (  s    
+
,,r^   c                <    [        [        [        X5      5      5      $ rV   )r   r^  "_eval_is_non_overlapping_and_dense)sizesr  s     r\   !eval_is_non_overlapping_and_denserG  -  s     z<ULMNNr^   c                    [        U 5      nUS:X  a  US   S:H  =(       d    U S   S:  $ [        [        X5      [        R                  " S5      S9nSnU H  u  pVUS:X  a  M  Xd:w  a    gXE-  nM     g)Nr   r   rU  keyFT)r3  sortedr5  rg  
itemgetter)rF  r  r  lengths_and_stridesexpected_stridelengthrw  s          r\   rE  rE  3  s     e*C
 axqzQ.%(Q,. !U!4(:M:Ma:PQ O-Q;$! . r^   c                4    [         R                  " SU 4S5      $ )Nr   rV  )r   r^  r  s    r\   rg  rg  Q  s    ??Aq69--r^   c                2   [        U [        5      (       a  U (       a  S$ S$ [        U R                  R                  5      nU R                  R
                  R                  U[        U 5      (       a%  [        U R                  R                  5       5      S9$ S S9$ )Nr   r   r]  )
r   r   rg  r   r   rM  r/  r   r   r  )symboolint_syms     r\   r  r  U  s     '4  q""5gll6G6GHG<<!!33(7:K:Kc',,3356 4  QU 4  r^   )r7   r  r  r   c                0  ^^^ [        U5      " U 5      mSm[        R                  (       a&  Sm[        R                  " U 5      SUUU4S jj5       nO"[        R                  " U 5      SUU4S jj5       nTR
                  Ul        TR                  Ul        U$ )a  
Wrapper around lru_cache that clears when new info about shapes has been
updated.

Use lru_cache if the output is always the same, regardless of the
constraints we know now (i.e. evaluate_expr)

Use _lru_cache otherwise.

Also note that this depends on _update_version_counter being called on the
shape environment whenever the constraints are updated, otherwise the cache
will not be cleared.
r   Nc                   > Tc  U R                  5       mTU R                  :w  a-  TR                  5         U R                  mU R                  5       mOTU R                  5       :X  d   S5       eT" U /UQ70 UD6$ )Nz9ShapeEnv cache key changed without version being updated!)_get_key_version_counterr   )rY   rZ   kwargsfn_cache	prior_keyprior_versions      r\   wrapper_lru_cache.<locals>.wrapper~  s       MMO	 5 55$$& $ 5 5 MMO	 0ONO0 D242622r^   c                t   > TU R                   :w  a  TR                  5         U R                   mT" U /UQ70 UD6$ rV   )rX  r   )rY   rZ   rY  rZ  r\  s      r\   r]  r^    s?      5 55$$& $ 5 5D242622r^   )rY   rq   rZ   r   rY  r   r_   r   )r   configvalidate_shape_env_version_keyr   wrapsr   r   )r  r   r]  rZ  r[  r\  s      @@@r\   
_lru_cacherc  h  s      !"%HM,,				3 	3 
	3$ 
		3 
	3 #..G!,,GNr^   c                  L    \ rS rSr% S\S'   \" SS9rS\S'   \" SS9rS\S	'   S
rg)RuntimeAsserti  r   r   F)r   r   msgrH   stackrl   N)	ra   rb   rc   rd   re   r   rf  rg  rf   rl   r^   r\   re  re    s'    
% C $%0E0r^   re  c                      \ rS rSrSS jrSrg)SymExprPrinteri  c                *    [        [        U5      5      $ rV   r   r&  rY   r   s     r\   _print_FloatSymExprPrinter._print_Float      5;r^   rl   Nr   zsympy.Floatr_   r   )ra   rb   rc   rd   rm  rf   rl   r^   r\   ri  ri    s     r^   ri  c                     ^  \ rS rSr        SU 4S jjrS	S jrS
S jr\R                  SS j5       r	\R                  SS j5       r
SrU =r$ )_ShapeGuardPrinteri  c                F   > Xl         X l        X0l        [        TU ]  5         g rV   )symbol_to_source
source_refr1  rW   rX   )rY   rt  ru  r1  r[   s       r\   rX   _ShapeGuardPrinter.__init__  s!     !1$,r^   c                *    [        [        U5      5      $ rV   rk  rl  s     r\   rm  _ShapeGuardPrinter._print_Float  ro  r^   c                  ^  [        U[        R                  5      (       d   [        [	        U5      5      5       eSU 4S jjnT R
                  R                  U5      (       d@   U ST R                  U    Vs/ s H  o3R                  5       PM     sn SU" 5        S35       eT R                  T R
                  U   S   5      $ s  snf )Nc                    > [        TR                  R                  5        V VVs0 s H%  u  pX Vs/ s H  o"R                  5       PM     sn_M'     snnn 5      $ s  snf s  snnn f rV   )r   rt  rJ  r  )symbolsourcesr  rY   s      r\   repr_symbol_to_source?_ShapeGuardPrinter._print_Symbol.<locals>.repr_symbol_to_source  s^     ,0+@+@+F+F+H+H w7w!VVXw77+H 7s   AA
AAz (could be from z	) not in zu.  If this assert is failing, it could be due to the issue described in https://github.com/pytorch/pytorch/pull/90665r   r   )
r   r   rc  r   r   rt  rL  r1  r  print_source)rY   r   r}  r  s   `   r\   _print_Symbol _ShapeGuardPrinter._print_Symbol  s    $-->s4:>-	 $$((.. 	
f$8K8KD8Q%R8Q1ffh8Q%R$S T+-. /ZZ	
.
   !6!6t!<Q!?@@	 &Ss   7C
c                    g rV   rl   r  s     r\   r  _ShapeGuardPrinter.print_source      r^   c                    g rV   rl   rl  s     r\   doprint_ShapeGuardPrinter.doprint  r  r^   )ru  rt  r1  )rt  #Mapping[sympy.Symbol, list[Source]]ru  Callable[[Source], str]r1  r  r_   r`   rp  r   r5  r_   r   r  r   r   r_   r   )ra   rb   rc   rd   rX   rm  r  abcabstractmethodr  r  rf   rg   rh   s   @r\   rr  rr    sm    	=	 ,	 <		
 
	 A$ 	  	 r^   rr  c                  @   ^  \ rS rSrSU 4S jjrSS jrSS jrSrU =r$ )	ShapeGuardPythonPrinteri  c                .   > [         TU ]  " U6   0 U l        g rV   )rW   rX   _print_cacherY   rZ   r[   s     r\   rX    ShapeGuardPythonPrinter.__init__  s    $35r^   c                $    U R                  U5      $ rV   )ru  r  s     r\   r  $ShapeGuardPythonPrinter.print_source  s    v&&r^   c                    U R                   R                  US 5      nUb  U$ [        R                  " X5      nX0R                   U'   U$ rV   )r  rL  r=   r  )rY   r   r   ress       r\   r  ShapeGuardPythonPrinter.doprint  sG    ##D$/?J''3C&)d#Jr^   )r  rZ   r   r_   r`   r  r  	ra   rb   rc   rd   rX   r  r  rf   rg   rh   s   @r\   r  r    s    6' r^   r  z`torch.fx.experimental.symbolic_shapes.ShapeGuardPrinter` is deprecated, please use `torch.fx.experimental.symbolic_shapes.ShapeGuardPythonPrinter` instead.)categoryc                      \ rS rSrSrg)ShapeGuardPrinteri  rl   Nrm   rl   r^   r\   r  r    s     	r^   r  c                  @   ^  \ rS rSrSU 4S jjrSS jrSS jrSrU =r$ )	_ShapeGuardCppPrinteri  c                L   > [        5       U l        0 U l        [        TU ]  " U6   g rV   )r8  all_symbolssource_to_symbolrW   rX   r  s     r\   rX   _ShapeGuardCppPrinter.__init__  s"    %(U<>$r^   c                   XR                   ;   a  U R                   U   R                  $ UR                  5       n[        R                  " SSU5      nUnSnX0R                  ;   a  U SU 3nUS-  nX0R                  ;   a  M  [
        R                  " U5      U R                   U'   U R                  R                  U5        U$ )Nz[^0-9a-zA-Z_]+rG  r   r   )r  r  rerI  r  r   rc  r  )rY   r.  source_namemangled_nameold_mangled_namecounts         r\   r  "_ShapeGuardCppPrinter.print_source  s    ***((0555kkmvv.[A'..../q8LQJE ... ).\(Bf%\*r^   c                .    [         R                  " X5      $ rV   )r<   r  rl  s     r\   r  _ShapeGuardCppPrinter.doprint
	  s    !!$--r^   )r  r  r  r  r  r  rh   s   @r\   r  r    s     
. .r^   r  c                       \ rS rSr% S\S'   Srg)_ShapeGuardsHelperi	  	list[str]exprsrl   Nr  rl   r^   r\   r  r  	  s    r^   r  c                       \ rS rSr% S\S'   Srg)_CppShapeGuardsHelperi	  zdict[Source, sympy.Symbol]r  rl   Nr  rl   r^   r\   r  r  	  s    00r^   r  c                  ,   ^  \ rS rSrSU 4S jjrSrU =r$ )LoggingShapeGuardPrinteri	  c                *   > [         TU ]  US U5        g )Nc                "    U R                  5       $ rV   r
  ri  s    r\   rA  3LoggingShapeGuardPrinter.__init__.<locals>.<lambda>	  s
    1668r^   )rW   rX   )rY   r1  r[   s     r\   rX   !LoggingShapeGuardPrinter.__init__	  s    );^Lr^   rl   )r1  r  )ra   rb   rc   rd   rX   rf   rg   rh   s   @r\   r  r  	  s    M Mr^   r  c                  B   ^  \ rS rSrSr    SU 4S jjrSS jrSrU =r$ )DynamicDimConstraintPrinteri	  z
Printer for dynamic dim constraints.
- Instead of symbol s_k it prints its source t.size()[i]
- Instead of Eq(_, _), Mod(_, _), etc. it prints _ == _, _ % _, etc.

We use this to suggest code for specifying dynamic dim constraints.
c                :   > [         TU ]  5         Xl        X l        g rV   )rW   rX   rt  source_name_to_debug_name)rY   rt  r  r[   s      r\   rX   $DynamicDimConstraintPrinter.__init__(	  s    
 	 0)B&r^   c                   [        U[        R                  5      (       d   [        [	        U5      5      5       eU R
                  R                  U5      (       d   SU S35       eU R
                  U   S   R                  5       $ )NzUnknown symbol z created by constraints solverr   )r   r   rc  r   r   rt  rL  r  rl  s     r\   r  )DynamicDimConstraintPrinter._print_Symbol1	  s    $-->s4:>-$$((
 
 	BTF"@A	B 
 $$T*1-2244r^   )r  rt  )rt   dict[sympy.Symbol, list[Source]]r  Mapping[str, str]r  	ra   rb   rc   rd   r   rX   r  rf   rg   rh   s   @r\   r  r  	  s,    C:C $5C5 5r^   r  c                      \ rS rSrSr          SS jrSS jrSS jrSS jrSS jr	SS jr
SS	 jrSS
 jrSS jr\SS j5       rSS jr    SS jrSS jr      SS jr          S S jrSrg)!DimConstraintsi9	  z
Custom solver for a system of constraints on symbolic dimensions.
Solutions are "static" values or simplified "dynamic" constraints.
c                   [        [        5      U l        [        5       U l        0 U l        X l        [        [        5      U l        [        5       U l        / U l        [        5       U l	        [        5       U l
        [        X5      U l        / U l        X0l        [        [         ["        [$        1U l        U R)                  5         g rV   )r   r8  _univariate_inequalities_symbols_with_equalities_substitutions_var_to_val_congruences_multivariate_inequalities_symbolic_equivalences_static_results_dynamic_resultsr  _dcp_inconsistencies_marked_dynamicr2   r9   r:   r5   _supported_sympy_functions_enumerate_sympy_functions)rY   rt  r0  marked_dynamicr  s        r\   rX   DimConstraints.__init__?	  s      	% <?5% BD BLHSTWHX >AU' HJ#
 *-*-% 0
	
 ,.  . 	@
' 	'')r^   c                N  ^ ^ SUU 4S jjnSUU 4S jjnUR                  [        5      (       a  UR                  [        U5      nUR                  [        5      (       a  UR                  [        U5      nUR                  [        5      (       a  UR                  [        U5      nU$ )a!  
Eliminate expressions of the form b // d and b % d while adding congruences of the form b % d == k.
This leaves rational operators (in particular of the form b / d) that our inequality solver can handle.
We solve the added congruences separately (using our congruence solver, see below).
c                   > U u  pTR                  TU5      TR                  TU5      p!UR                  TR                  5      UR                  TR                  5      -  nX-
  U-  nUS:w  a  TR                  T   R	                  U5        U$ r  rewrite_with_congruencesr5  r  r  r  rZ   r  r  mod_reduced
congruencer  rY   s        r\   mod_handler<DimConstraints.rewrite_with_congruences.<locals>.mod_handler	  s    0 !MD 994,,Q8  --(8(89G<L<L  = K ,7JQ!!!$((4r^   c                 $  > U u  pTR                  TU5      TR                  TU5      p!UR                  TR                  5      UR                  TR                  5      -  nX-
  U-  nUS:w  a  TR                  T   R	                  U5        X-
  U-  $ r  r  r  s        r\   floor_div_handlerBDimConstraints.rewrite_with_congruences.<locals>.floor_div_handler	  s     !MD 994,,Q8  --(8(89G<L<L  = K ,7JQ!!!$((4 &'11r^   )rZ   r   r_   r   )r  r9   replacer:   r5   )rY   r  r   r  r  s   ``   r\   r  'DimConstraints.rewrite_with_congruences|	  s}    "	 "	H	2 	2, 88C==<<[1D 88I<<	;7D88H<<*;<Dr^   c                >   [         R                  R                  R                  n[	        5       n[        U5       H@  n[        [        X5      =n[        R                  5      (       d  M/  UR                  U5        MB     UR                  U R                  5      U l        g rV   )r   r  r  r  r8  dirr   r  r   FunctionClassr  
differencer  _unsupported_sympy_functions)rY   moduleall_functionsrH  r  s        r\   r  )DimConstraints._enumerate_sympy_functions	  su    ##--KD'&"77$9L9LMM!!$'   -:,D,D++-
)r^   c                4    UR                   " U R                  6 $ )zN
Tracks list of sympy.Functions the export solver doesn't know how to handle.
)r  r  rl  s     r\   _has_unsupported_sympy_function.DimConstraints._has_unsupported_sympy_function	  s     xx::;;r^   c                   U[         R                  :X  a  gUnUR                  U R                  5      nU[         R                  :X  a  U R
                  R                  U S35        [        U[         R                  5      (       d  U R                  U5      (       a  gUR                  nU(       d
   SU 35       e[        U5      S:  a  U R                  R                  U5        g[        [        U5      5      n[        U R                   U   5      nU R#                  XQ5      n[        U R                   U   5      nU[         R                  :X  a  Xg:H  $ UR                  U R                  5      nU[         R                  :X  a!  U R
                  R                  U SU S35        [        U[         R$                  5      (       a  U R&                  R                  U5        U R(                  U   R                  U5        g)zAdd an expression to the set of constraints.

Return whether the expression is a trivial constraint (i.e., an obvious tautology).
Tz is inconsistent!Fz2Did not expect constraint with no free variables: r   z, obtained by rewriting z# with congruences, is inconsistent!)r   truer5  r  falser  r  r   r  r  rz   r3  r  r  r  iterr  r  ra  r  r  )	rY   r   	orig_exprorig_reducedrz   r  old_n_congruencesnew_n_congruencesreduceds	            r\   r  DimConstraints.add	  s   
 5::	 ))$*:*:; 5;;&!!((I;6G)HIdEHH%%)M)Md)S)S((XQRVQWXX||q ++//5( # T,'(A #D$5$5a$8 9009D #D$5$5a$8 9uzz!(==mmD$4$45G%++%%%,,f4YK @' ' $))--11!4))!,006r^   c                    UR                   (       a/  U R                  R                  UR                  5        SU 35        gU R                  R                  X45        g)zAdd an equality constraint == N)r  r  r  r  r  r  )rY   r.  r   s      r\   add_equalityDimConstraints.add_equality
  sF    >>  $$d4&%AB ''..~>r^   c                "  ^ 0 nU R                   R                  5        GHl  u  p#/ n[        5       nU H  nUR                  u  px[        R
                  " SSS9n	[        R                  " XxU	-  -
  U/S9u  pX*:X  a  [        R                  R                  R                  X5      u  p[        U[        R                  5      (       a7  [        U[        R                  5      (       a  X-  nUR                  X45        M  UR                  U5        M     U(       ao  [        R                  R                  R                   " U6 u  pX--
  U-  1X'   X,[        R
                  " SSS9-  U-   0mX   R#                  U4S jU 5       5        GMh  XQU'   GMo     U$ )Nreduce_congruences_tmpTr2  )symbolstmpc              3  d   >#    U  H%  n[         R                  " UT5      (       a  M!  Uv   M'     g 7frV   )r   checksol)r-  r  substitutions     r\   r0  5DimConstraints._reduce_congruences.<locals>.<genexpr>3
  s(      .&:
 >>*lC J&:s    0	0)r  rJ  r8  rZ   r   rc  solve_linearpolys	polytoolsdivr   r   r  r  ntheorymodularsolve_congruencer:  )rY   reduced_congruencesr  congruencesremainder_modulus_pairscongruences_to_checkr  r  r  r  r{  solutionmodulus	remainderr  s                 @r\   _reduce_congruences"DimConstraints._reduce_congruences
  s   CE"//557NA&(##&5 )
 * ll#;TJ#(#5#5ds]6JUVTW#X  ;).)>)>)B)B8)Q&G!'5==99j!5==? ? %.$7	/66	7KL  %((4+ *2 '%*]]%:%:%K%K,&"	 ,-=G*C)D#&eT!BBYN  $&-- .&:.  *>A&U 8X #"r^   c                    U R                   (       aC  SR                  U R                   5      nU R                   R                  5         [        SU 35      eg )N
z*The following inconsistencies were found:
)r  joinrN  r  )rY   rf  s     r\   _raise_inconsistencies%DimConstraints._raise_inconsistencies=
  sI      ))D112C!!'')J3%PQQ !r^   c                  ^  T R                  5         T R                  (       Ga  T R                  R                  5       nT R                  R                  U5      n[        R
                  R                  R                  X!5      n[        U[        R                  5      (       a  [        S UR                   5       U5      n[        U[        R                  5      (       d   SU SU 35       eUR                  u  pEXA:X  d   SU SU 35       eT R                  R                  T R                  R                   U   S   R#                  5        SU 35        UT R$                  U'   T R&                  n[)        5       T l        U H2  nT R                  UR+                  UT R$                  U   05      5        M4     T R                  5         T R                  (       a  GM  T R-                  5       nUR/                  5        GH  u  pU	 GH  n
UT R$                  ;  d,  [        R0                  " XT R$                  U   05      (       a  M@  T R3                  U
5      (       d  MX  U
R                  u  pS[5        T R                  R6                  R9                  T R                  R                   U   S   R#                  5       T R                  R                   U   S   R#                  5       5      5      -   n[        R:                  " US	S
9nSSKJn  U" U5      /T R                  R                   U'   [A        [        R                  " XU-  5      U5      nUc   eT RB                  R                  T R                  RE                  [        R                  " UUS   5      5      5        GM     GM     T R                  R/                  5        GH  u  p [        R
                  R                  R                  X!5      n[        U[        RF                  5      (       a(  [        [I        U 4S jUR                   5       5      5      n[        U[        R                  5      (       aI  UR                   H7  nT RB                  R                  T R                  RE                  U5      5        M9     M  T RB                  R                  T R                  RE                  U5      5        GM     T RR                  n/ T l)        U H1  u  nnT RU                  UUR+                  T R$                  5      5        M3     T RR                   HM  u  nnT RB                  R                  UR#                  5        ST R                  RE                  U5       35        MO     g! [J        [L        4 a_  n[N        RQ                  SU5        U H7  nT RB                  R                  T R                  RE                  U5      5        M9      SnAGM*  SnAff = f)zGSolve the system of constraint equations to find simplified constraintsc              3  h   #    U  H(  n[        U[        R                  5      (       d  M$  Uv   M*     g 7frV   )r   r   ra  )r-  r  s     r\   r0  'DimConstraints.solve.<locals>.<genexpr>N
  s     OMSZUXX5NSSM   #2	2z$Expected an equality constraint for z, got zExpected a constraint on z instead of on r   r  rG  Tr   )ConstantSourceNr   c              3  l   >#    U  H)  nUR                  TR                  5      (       d  M%  Uv   M+     g 7frV   )r5  r  )r-  r  rY   s     r\   r0  r  
  s,      '4"||D,<,<=  C'4s   $4	4z!Failed to reduce inequalities: %s)+r  r  popr  r   solversinequalitiesreduce_inequalitiesr   r  r  rZ   ra  r  r  r  rt  r  r  r  r8  r5  r  rJ  r  _is_supported_congruencer   r  rL  rc  torch._dynamo.sourcer   r@   r  r  r  r  NotImplementedErrorr  r   r)  r  r  )rY   r  r  r  r{  r   multivariate_inequalitiesr   r  r  r  r  r  tmp_namer  r   r  r  r  expr2symbolic_equivalencesr.  expr3s   `                      r\   solveDimConstraints.solveC
  s   ##% +++--113A1155a8E}}11EEeOH(EII..OHMMO %((  J5aSxjIJ  #--KF;V";A3ofX VV;  $$99--a0388:;4uE &)D" )-(G(G%.1eD+14+>+>q+A'BCD 2'')5 +++< #6681779NA)
D///u~~D$7$7$: ;8 8 44Z@@(2#& II??CC $		 : :1 =a @ E E G $		 : :1 =a @ E E G* $ $ll8TBG;I(;S:T		2237%ehhts]&CQG },}--11$))2C2CEHHQPQRSPTDU2VW' * :. 55;;=HAH ==55II%Sh11# '/}}  H h		22'}}--11$))2C2CC2HI  - ))--dii.?.?.IJ! >. !% ; ;&(#2MFEfennT5H5H&IJ 3 "88MFE!!%%tDII<M<Me<T;U&VW 9 (8 H?C"E))--dii.?.?.FG #UHs    CU;4U;;W*AW%%W*c                   UR                   u  p#[        U[        R                  5      (       a  UR                   u  pE[        U[        R                  5      =(       a    [        U[        R
                  5      =(       d;    [        U[        R
                  5      =(       a    [        U[        R                  5      nO[        U[        R                  5      nU=(       a    [        U[        R
                  5      nU$ rV   )rZ   r   r   rN   rc  r   )r  r  r  r  rb  rf  rT   s          r\   r&  'DimConstraints._is_supported_congruence
  s    "
 dEII&&yyHC3-P*S%--2PTS%--0RZU\\5R  dELL1D:
7EMM:r^   c                   ^  SU 4S jjnT R                   R                  5        VVs0 s H:  u  p#UT R                  ;   d  M  U" T R                  R                  U   S   5      U_M<     snn$ s  snnf )zGReturns a dictionary of the names of symbols to their specialized valuec                   > U R                  5       nTR                  R                  (       a  TR                  R                  U    SU 3$ U$ )N = )r  r  r  )r  r  rY   s     r\   
debug_name9DimConstraints.forced_specializations.<locals>.debug_name
  sA    88:Dyy22))==dCDCvNNr^   r   )r  r    r_   r   )r  rJ  r  r  rt  )rY   r5  r  r   s   `   r\   forced_specializations%DimConstraints.forced_specializations
  sn    	 --335
5D((( >Jtyy11!4Q78#=5
 	
 
s   A,'A,c                ^    [        U[        R                  R                  R                  5      $ rV   )r   r   exportdynamic_shapes_DerivedDimrY   r  s     r\   _is_derived_dimDimConstraints._is_derived_dim
  s!     #u||::FFGGr^   c                    [        U[        R                  R                  R                  5      =(       a3    [        U[        R                  R                  R
                  5      (       + $ rV   )r   r   r:  r;  _Dimr<  r=  s     r\   _is_dimDimConstraints._is_dim
  sI    #u||::??@ 
,,88J
 F
 	
r^   c           
     	  ^  SSK Jn  SU 4S jjn0 n[        UR                  5       5       GHN  u  pgSU;   d  M  [	        US   [
        R                  5      (       d  M2  [        [        US   R                  5      5      n[        U5      U;  d  Md  Xe[        U5      '   [
        R                  R                  R                  US   U5      u  pUR                  SS5      n[        R                   " X-
  U	-  5      nUR                  S["        5      n[        R$                  " X-
  U	-  5      nXS.U[        U5      '   U" [        U5      XS9U[        U5      '   UR'                  SS	5        UR'                  SS	5        GMQ     UR)                  5        H  n[        UR                  5       5       H  u  pgSU;   d  M  [	        US   [
        R                  5      (       d  M1  [        [        [        US   R                  5      5      =n5      U:X  d  Mc  U[        U5         S   nUS   R+                  UU05      nUUS'   M     M     [-        5       nUR                  5        H  u  pgXb;  a  M  T R/                  X&   5      (       a  SU;   d  SU;   a  UR1                  U5        MC  SU;   d  MK  [	        US   [
        R                  5      (       d  Mo  [        [        US   R                  5      5      nUc   eUR1                  [        U5      5        M     UR3                  U5      n0 nU GH\  nS
nUU;   a@  UU   nSU;   d  SU;   d  [	        US   [4        5      (       a  U" XrU   5      (       d  UUU'   SnU(       d  MU  UR                  5        H  u  pgXb;  a  M  X&   nUR6                  R8                  S:X  d  M,  UR:                  R8                  U:X  d  MH  SU;   d  SU;   d  MV  [
        R<                  " U5      n[        [        UR                  5      5      n[?        [
        R@                  " UUS   5      U5      S   [?        [
        R@                  " UUS   5      U5      S   S.nU" UUU   5      (       a  M  UUU'     GMZ     GM_     [        URC                  5       5       H,  nXb;  a  M
  T RE                  X&   5      (       d  UU;   d  M*  X	 M.     URG                  U5        g	)as	  
Here we resolve 2 concerns with derived dims suggested fixes: 1) newly introduced roots,
and 2) root swapping.

1) Newly introduced roots appear with modulo guards, e.g. Mod(dx, 2) = 0 suggests
dx is a derived dim equal to 2 * _dx, introducing a new root _dx. Currently the final
suggested fixes handle this correctly, but we can get intermediate results that look like
{"dy": {"eq": "dx + 1"}, "dx": {"eq": "2 * _dx + 1, "min": 3, "max": 15}}
and this routine prettifies this by unifying to a single root, and making each suggestion
either a derived dim or min/max range, not both.

2) With suggested fixes for derived dims, roots can be swapped,
e.g. dx, dx - 1 -> dy + 1, dy. Here we don't want to print out the attached name,
since this leads to messages like "dx - 1 = Dim("dx - 1", ...)".
Instead we evaluate the new root value, and remove results for its derivations.

First we find all the original roots (specified in dynamic_shapes), that are found in the
values of results (i.e. used for computing suggesting fix values). These original roots
(suppose `dx`) are either specialized, unchanged, refined, or swapped
(expressed as a derived dim). If any of the first 3 cases happen, we suggest `dx`'s value
in results, and remove suggestions for derivations of `dx`, assuming the derived relation
is valid. If swapped, we find the new root, and use the fix to evaluate `dx`'s new value,
and then do the same with `dx`'s derivations.

Assuming the originally specified derived relations are correct is valid, because:
    1) if the relations are plain wrong (e.g. input shape = (6, 4) with spec (dx, dx - 1))
       produce_guards() will catch this and crash before hand.
    2) if the relations are numerically correct but do not match the emitted guard,
       for example:

            def forward(self, x, y):
                return x.reshape([-1]) + y  # guard: s0 * 2 = s1
            inputs = (torch.randn(6, 2), torch.randn(12))
            dx = Dim("dx", min=2, max=32)
            dynamic_shapes={"x": (dx, 2), "y": (dx + 6, )}  # this matches values but not op

       then this leads to 2 linear equations, and a) produce_guards() is able to solve for
       the unique solution of dx = 6 and specialize, and b) the export constraint solver will
       raise an issue due to range constraints (a unique solution means not all values in a
       range satisfy a guard) and also force specializations.
r   )Dimc                Z  > TR                  U5      =(       a    SU ;   =(       d    SU ;   =(       a{    UR                  S:  =(       a    U R                  SS5      S:H  =(       d    UR                  U R                  SS5      :H  =(       a#    UR                  U R                  S[        5      :H  $ )Nrz  r{  rU  )rB  rz  rL  r{  r;   )cr  rY   s     r\   _check_same_rangeDDimConstraints._process_derived_dim_roots.<locals>._check_same_range
  s     S! 4aZ-5A:4 WWq[9QUU5!_%9XcgguVW>X4
 GGquuUF33r^   rp  rz  rU  r{  )rz  r{  NTFr<  r   )rG  zMapping[str, int]r  r   r_   r   )$torch.export.dynamic_shapesrE  r  rJ  r   r   r  r  r  rz   r   r  r	  r
  rL  r  ceilr;   floorr"  rO  subsr8  rB  r  r  r   r[   ra   r  rQ  r@   ra  r  r>  r:  )rY   resultsname_to_dimrE  rH  introduced_rootsrO  rG  r  r  r  c_minmin_c_maxmax_old_rootr{  new_root_exprr?  modified_rootsmodified_root_valuesmrootswapped_rootr  r   r  rj  s   `                          r\   _process_derived_dim_roots)DimConstraints._process_derived_dim_roots
  s0   \ 	4		* ,.)DAqyZ$<<D4!5!567t9K/23SY/).)>)>)B)B1T7D)Q&GEE%OE99e&77%BCDEE%0E::u'8G&CDD15)CGCI&-0T-OKD	*EE%&EE%&! *( )//1HW]]_-AI"1T7EJJ77d4$0D0D+E&FFFG8S$+CM$:4$@M w||V],CDH&AdG . 2  $'5MMODA#||KN++!uz""1%z!D'5::>>D4!5!567'''""3t9- $ (223CD
 ;=#ELENQJ%1*dGS2 2
 -u-  78,U3#(L| $MMODA+ %.C..-?HH--6 !A:!#(==#3D $T$*;*;%< =A'0$%1I1'Ma'P'0$%1I1'Ma'P&F $5 &E(:$ $ ?E 4U ; %) ,' $Z glln%A###KN33qN7JJ	 & 	+,r^   c                  ^ ^^ SSK Jn  T R                  R                  (       d  gS S!U 4S jjjm[	        [
        5      mUc  0 nS"S jnS#U4S jjnU" U5      nT R                  R                  T R                  5       H  n	T" U	5      n
X:X  a  M  [        R                  " SU
5      u  pnUR                  5       nUS	:X  a  X:X  a  MI  UR                  5       (       a  U" X[        U5      5        Mr  UR                  5       (       a  U" X" U5      [        U5      5        M  US	:X  d   U
5       e [        R                  " U5      TU   S
'   M     [#        UR%                  5       S S9 Vs0 s H  nXU   _M
     nnSnU(       a  ['        5       nU Hq  nXR                  S5      S      nT R)                  U5      (       a'  UR+                  UR,                  R.                  5        MV  UR+                  UR.                  5        Ms     USSR1                  [#        U5      5       S3-  nUR3                  5        H  u  n	nUSU	 SU S3-  nM     T R5                  TU5        / n/ n[#        TR%                  5       U4S jS9 Vs0 s H	  nUTU   _M     nnUR3                  5        GH  u  nnS
U;   a\  US
   n[7        U[        5      (       a  UR9                  U SU 35        M?  [;        U5      (       a  UR9                  U SU 35        Mg  Mi  UR=                  SS5      nUS:X  a  SnUR=                  SS5      nUb"  Ub  UR9                  U SU SU SU S35        M  Ub  UR9                  U SU SU S35        M  Ub  UR9                  U SU SU S35        M  UR9                  U SU S35        GM     U(       d  U(       a  US-  nUSR1                  UU-   5      -  nU$ ! [          a     GMp  f = fs  snf s  snf )$z/Format a message for constraint violation errosr   )_get_dim_name_mappingr)  c                   > TR                   R                  R                  5        H.  u  p#U(       d  U R                  X#5      OU R                  X25      n M0     U $ rV   )r  r  rJ  r  )r  inverserO  rP  rY   s       r\   	transform2DimConstraints.prettify_results.<locals>.transform  sA    		;;AAC+2AIIaO		! DHr^   Nc                N    U S:X  a  gU S:X  a  gU S:X  a  gU S:X  a  gU S:X  d   eU $ )N<=>=<>==rl   )rW  s    r\   flip-DimConstraints.prettify_results.<locals>.flip  s;    TzTzSySy::Ir^   c                   > US:X  a	  UTU    S'   g US:X  a  US-
  TU    S'   g US:X  a	  UTU    S'   g US:X  a  US-   TU    S'   g US:X  d   eUTU    S	'   g )
Nrd  r{  rf  r   re  rz  rg  rh  rp  rl   )r   rW  digitrN  s      r\   relation_with_digit<DimConstraints.prettify_results.<locals>.relation_with_digit  sy    Tz',e$s',qye$t',e$s',qye$Tz!z&+d#r^   z( == | <= | >= | < | > )rh  rp  c                *    U R                  S5      S   $ )Nr4  r   )splitr  s    r\   rA  1DimConstraints.prettify_results.<locals>.<lambda>  s    aggenQ/r^   rI  r4  z'Specializations unexpectedly required (, 9)! For more information, run with TORCH_LOGS="+dynamic".
z%  - solving the guards generated for z$ resulted in a specialized value of z.
c                   > T" U SS9$ )NT)r`  rl   )r  ra  s    r\   rA  rq    s    i48r^   rz  rU  r{  z = Dim('z', min=z, max=r  z', max=z')z
Suggested fixes:
  
  F)r  r   r`  r   r_   r   )rW  r   r_   r   )r   r   rW  r   rl  r   r_   r`   )rJ  r^  r  r  r   dictr  r  r  r  rp  stripisdigitr   r   rQ  	TypeErrorrK  r  r8  r>  r  r  ra   r  rJ  r[  r   r  r  rL  )rY   original_signaturer;  constraint_violation_errorr7  r^  ri  rm  rO  r  r  leftrW  rightrO  bufdebug_namesr  r   dimsothersresults2rG  r   rR  rT  rN  ra  s   `                         @@r\   prettify_resultsDimConstraints.prettify_results~  s     	Fyy22	 	
 5@4E!N
		, ,N;%%++D,A,ABA!Av hh'BAFODeBTzdm}}#Dc%j9#E48SY?Tz$1$z*/--*>GDM$' C, &++-/"
 a(( 	 "
 !%K+!''%."34'',,OOCHH$5$56OOCLL1 , 9$))F;DW:X9Y ZJ JC 16683>qcAefiejjmnn 9 	''=
 8
 wqzM 	 
 NN$DAqqy$eS))MMQCs5'"23.u55MMQCs5'"23 6 uuUD)19DuuUD)#(8KK1#XaSvVD6 KL%KK1#XaSvQ ?@%KK1#XaSvQ ?@KK1#XaS 34' %0 6++C6;;tf}--C
M ! "
>
s   -O (O2>O7 
O/.O/)r  r  r  r  r  r  r  r  r  r  r  r  r  r  N)
rt  r  r0  z$Mapping[sympy.Symbol, sympy.Integer]r  zset[sympy.Symbol]r  r  r_   r`   )r  r5  r   r   r_   r   r   r   rS   r_   r   )r   r   r_   r   )r.  r    r   r   r_   r`   )r_   z#dict[sympy.Symbol, set[sympy.Expr]])r  r   r_   r   )r_   zdict[str, sympy.Expr])r  r   r_   z2TypeGuard[torch.export.dynamic_shapes._DerivedDim])r  r   r_   z+TypeGuard[torch.export.dynamic_shapes._Dim])rN  zdict[str, dict[str, Any]]rO  dict[str, Any]r_   r`   )
r{  zinspect.Signaturer;  z,Union[dict[str, Any], tuple[Any], list[Any]]r|  r   r7  dict[str, str]r_   r   )ra   rb   rc   rd   r   rX   r  r  r  r  r  r  r  r.  classmethodr&  r7  r>  rB  r[  r  rf   rl   r^   r\   r  r  9	  s   
;*:;* 9;* *	;*
 $5;* 
;*zIV
<+Z?.#`RYXv   
 HH	;H


s-*s- $s- 
	s-jI-I EI %+	I
 !/I 
Ir^   r  c                  `    \ rS rSr% SrS\S'   S\S'   S\S'   S\S'   S\S'   S\S	'   S\S
'   Srg)ShapeEnvSettingsi  z
Encapsulates all shape env settings that could potentially affect
FakeTensor dispatch. Used when creating dispatch cache keys.
r   allow_scalar_outputsallow_dynamic_output_shape_opsassume_static_by_defaultspecialize_zero_one
duck_shape+prefer_deferred_runtime_asserts_over_guards'allow_complex_guards_as_runtime_assertsrl   Nra   rb   rc   rd   r   re   rf   rl   r^   r\   r  r    s3    
 $((""155-11r^   r  c                  .    \ rS rSr% SrS\S'   S\S'   Srg)r   i  z?
Locations of the guards that triggered lower and upper bound.
r   r  r  rl   Nr  rl   r^   r\   r   r     s     KKr^   r   c              #     #    U R                  5          S v   U R                  5         g ! U R                  5         f = f7frV   )_suppress_guards_enter_suppress_guards_exit)rM  s    r\   _suppress_guardsr  '  s1     $$&*'')	'')s   >) >;>c                  P    \ rS rSr% SrS\S'   \" \S9rS\S'   \" \S9r	S\S	'   S
r
g)_FrameLocalResulti0  NOptional[str]loc)default_factoryr  localsr  r  rl   )ra   rb   rc   rd   r  re   r   rw  r  r  rf   rl   r^   r\   r  r  0  s*    C"48FN8#D9G^9r^   r  c            	      
   \ rS rSr% SSS.       S~S jjrSSSSSSSSS.                 SS jjr\SS	 j5       r\SS
 j5       r\SS j5       r	\SS j5       r
\SS j5       r\SS j5       r\SS j5       rSS jrSS jrSS jr\SS j5       r\" 5       SS j5       r\" 5       SS j5       r\" 5       SS j5       r\" 5       SS j5       r\" 5        S       SS jj5       r\" 5       SS j5       r\" 5       SS j5       rSS jr\" 5       SS j5       r\SS j5       r\" 5       SS j5       r\" 5       SS  j5       rSS! jr SS" jr!SS# jr"SS$ jr#SS% jr$\" 5             SS& j5       r%      SS' jr&SS( jr'SS) jr(SS* jr)\" 5       SS+ j5       r*\" 5       SS, j5       r+SS- jr,SS. jr-SS/ jr.        SS0 jr/        SS1 jr0SS2.       SS3 jjr1    SS4 jr2\" 5       SS2.             SS5 jj5       r3                  SS6 jr4\" 5       SS7.       SS8 jj5       r5\" 5       SS7.       SS9 jj5       r6\" 5               SS: j5       r7SS; jr8  S           SS< jjr9\" 5       SS= j5       r:\" 5       SSS> jj5       r;SS? jr<\" 5       SS@ j5       r=\" 5       \>R~                  SS4           SSA jj5       r@\" 5       \>R~                  SSSS4               SSB jj5       rASSC jrBSSD jrC      SSE jrDSSF jrESG 4SSSSSSHSI.                   SSJ jjjrFSSSK.       SSL jjrGSSM jrHSSN jrISSO jrJSSP.       SSQ jjrKSSR jrL      SSS jrMSST jrNSSSU jjrO S     SSV jjrP\Q  S     SSW jj5       rR\S" S5          SSX j5       rT\QSSSSSSY.             SSZ jj5       rU\QSS[ j5       rV\QSS\ j5       rW\QSSS] jj5       rX\S" S^5      SS_.     SS` jj5       rY\S" S^5      SSa j5       rZSSSb.         SSc jjr[ SSSd.         SSe jjjr\SSf jr]SSg jr^\Q\" 5       SSh j5       5       r_\S" S^5      SSi j5       r` S   SSj jjraSSk jrb\QSSl j5       rcSSm jrd S     SSn jjreSSSo jjrfSSp jrgSSq jrhSriS\jSr'    S     SSs jjrk\S" S^5      \" SSt9   SSSu.           SSv jjj5       5       rl   SSSu.           SSw jjjrmSSx jrn\S" S^5      \" SSt9 S       SSy jj5       5       roSSz jrp\S" SS{9\" 5               SS| j5       5       rqS}rrg)rq   i7  N)should_record_eventstracked_fakesc                  U R                   " S0 UD6  SUS'   SSKJn  U" 5       U l        Ub  UO'U R                  =(       a    [        R
                  (       + U l        U R                  =(       a    [        R                  U l        SU l	        X l
        U R                  (       a  [        [        US9/O/ U l        0 U l        g )NFr  r   translation_validation_enabled)rY  rl   )_inittorch.fx.experimental.validatorr  _translation_validation_enabledr`   translation_validation_no_bisectr  check_shape_env_recorded_eventscheck_recorded_eventsis_recordingr  r-   rq   eventsfake_tensor_cache)rY   r  r  rY  r  s        r\   rX   ShapeEnv.__init__B  s     	

V */%&R/M/O, $/ ! 44 @??? 	! %%P&*P*P 	"
 "* (( 8F34 	   	r^   TF)r  r  r  r  r  	co_fieldsr  r  c          
     
   Uc  [         R                  n[        UUUUUUUS9U l        / U l        0 U l        0 U l        0 U l        0 U l        0 U l	        0 U l
        0 U l        0 U l        0 U l        0 U l        0 U l        0 U l        0 U l        [%        5       U l        [%        5       U l        0 U l        U(       a:  [,        R.                  R0                  [,        R.                  R2                  S.U l        [4        R6                  " 5       U l        [4        R6                  " 5       U l        0 U l        SU l        [@        U l         U R@                  RC                  S5        SU l"        SU l#        S U l$        [J        RL                  " 5       U l'        [J        RL                  " 5       U l(        U(       a  UO0 U l)        / U l*        U RW                  5       U l,        SU l-        SU l.        0 U l/        0 U l0        0 U l1        SSK2J3n	  U	" 5       U l4        U Rh                  (       aq  SSK2J5n
  U
" 5       U l6        [n        Rp                  Rs                  5       U l:        U Rt                  Rw                  U Rt                  Ry                  S 5      5        0 U l=        g g )	N)r  r  r  r  r  r  r  r   r   r   
create_envFTr  )TranslationValidator)>r`  use_duck_shaper  settingsr  axiomsr0  unbacked_var_to_valoblivious_var_to_valrd  var_to_range_slocr  r1  var_to_stacksource_to_varreplacementsreplacements_slocsrK  r8  	divisible	size_like
val_to_varr   rO   r  r  r  r  unbacked_symfloat_counterunbacked_symint_counterdeferred_runtime_assertsnum_deferred_runtime_assertsr   r[  r  runtime_asserts_frozendim_constraintscollectionsr   countersymbol_guard_counterr  rM  rW  _prev_cache_keyrX  _resimplify_floor_div_axiomsfx_node_cacher  unbacked_alloc_orderr  r  r  r  	validatorr   r   Graphr  inserting_beforeoutputname_to_node)rY   r  r  r  r  r  r  r  r  r  r  s              r\   r  ShapeEnv._init  s;   R ..J(!5+I%= 3!8c4[

 )+46 >@ GI  HJ!
 >@FH9;&@BCE68 =?<>DF*-% -0E 46"''',,577;;?DO)2):&'0'8$>  	% -.)l#&+#9=%0%8%8%: <G;N;N;P! '0R( CE+  $}} ! -1) UW9;6 >@!R/M/O,//L13DN)DJ JJ''

(9(9$(?@ ;=D# 0r^   c                .    U R                   R                  $ rV   )r  r  r   s    r\   r  ShapeEnv.allow_scalar_outputsh  s    }}111r^   c                .    U R                   R                  $ rV   )r  r  r   s    r\   r  'ShapeEnv.allow_dynamic_output_shape_opsl  s    }};;;r^   c                .    U R                   R                  $ rV   )r  r  r   s    r\   r  !ShapeEnv.assume_static_by_defaultp  s    }}555r^   c                .    U R                   R                  $ rV   )r  r  r   s    r\   r  ShapeEnv.specialize_zero_onet  s    }}000r^   c                .    U R                   R                  $ rV   )r  r  r   s    r\   r  ShapeEnv.duck_shapex  s    }}'''r^   c                .    U R                   R                  $ rV   )r  r  r   s    r\   r  4ShapeEnv.prefer_deferred_runtime_asserts_over_guards|  s    }}HHHr^   c                .    U R                   R                  $ rV   )r  r  r   s    r\   r  0ShapeEnv.allow_complex_guards_as_runtime_asserts  s    }}DDDr^   c                *    SnSS jn[        XX#5        g)z(Compare another ShapeEnv for equivalence)r  r   r  r  r  r  r  r  r  r  r  r  r  rX  r  r  r  r  _expr_sym_node_idc           
        U S;   a  SSK J n  [        U" U5      5      $ U S:X  a  U Vs/ s H  o3R                  PM     sn$ U S:X  aA  UR                  5        VVVs0 s H!  u  pEXE Vs/ s H  ofR                  PM     sn_M#     snnn$ U S:X  a  [	        UR                  5       5      $ U S;   a  g U$ s  snf s  snf s  snnnf )N)r  r  r   )r  r  r  r  )r  rM  r  )r  r  r   rJ  r8  r  )rJ  valuer  gr  rasras          r\   	map_value'ShapeEnv.check_equal.<locals>.map_value  s    NN%
 DK(((-.1..22AFOvqc2cGGc22OO&5::<((   L / 3Os   B/B9&B4;B94B9N)rJ  r   r  r   r_   r   )r,   )rY   r   non_state_variable_namesr  s       r\   check_equalShapeEnv.check_equal  s    $
 <	4 	$D1IUr^   c                   ^ U R                   c  g SSKJm  SU4S jjnU R                    Vs/ s H
  o!" U5      PM     sn$ s  snf )Nr   )TrackedFakec                  > [        U R                  [        R                  [        R                  45      (       a  U R                  O[
        R                  " U R                  5      nT" XR                  U R                  5      $ rV   )	r   faker   r   r   r)   	from_faker.  r  )r  
inner_faker  s     r\   maybe_transform_fake>ShapeEnv._snapshot_tracked_fakes.<locals>.maybe_transform_fake  s\     dii%,,)GHH 		#--dii8  z;;8M8MNNr^   )r  r  r_   r  )r  torch._dynamo.variables.builderr  )rY   r  r  r  s      @r\   _snapshot_tracked_fakes ShapeEnv._snapshot_tracked_fakes  sC    %?
	O 8<7I7IJ7It$T*7IJJJs   A c                2    [        U R                  5      S-
  $ Nr   )r3  r  r   s    r\   _last_event_indexShapeEnv._last_event_index  s    4;;!##r^   c              #  J   #    SU l          S v   SU l         g ! SU l         f = f7fNTF)r  r   s    r\   
_recordingShapeEnv._recording  s%      	& %DDs   # #	 #c                (    U R                  XS5        g )Neliminate_unbacked)_set_replacement)rY   orig_srZ  s      r\   rP  ShapeEnv._eliminate_unbacked  s    f-ABr^   c                v    [         R                  SX5        [        R                  " U5      U R                  U'   g)zUsed only when propagate_real_tensors; registers a value for an
unbacked symbol, which can be used last resort to resolve hints.zset_unbacked_var_to_val %s = %sN)r   r[  r   rQ  r  )rY   rO  rP  s      r\   rC   ShapeEnv.set_unbacked_var_to_val  s,     	2A9&+mmA&6  #r^   c                   [        U[        R                  5      (       d   U5       e[        U[        R                  5      (       d   U5       e[        U5      (       d   U5       e[        U5      (       d   U5       eU R                  R                  U5      nUb  [        U5      (       a   U SU 35       eU R                  XS5        X R                  U'   Ub  U R                  X#S5        g g )Nz -> rename_unbacked_torename_unbacked_to_dest)r   r   rc  r  r  rL  r  rK  )rY   r  rZ  dests       r\   rh  ShapeEnv._rename_unbacked_to  s    &%,,//77/%..55.$U++2U2+$V,,4f4,  $$V,,T22Ivhd4&4II2f-AB*/'!!%/HI r^   c                    g rV   rl   )rY   r  rv  s      r\   ru  ShapeEnv._constrain_is_bounded  s     	r^   Optional[int]c                    Uc  SnUc  [         nX2:  a  [        S5      eU R                  UUUS9  U R                  R	                  U5        g )Nr   r}  rm  rn  )r;   r  rl  r  r  rY   r  rz  r{  s       r\   rr  "ShapeEnv._constrain_range_for_size  sa     ;C;C93 
 	## 	$ 	

 	1r^   c           	        [        U[        R                  5      (       a7  U[        U5      s=::  a  U::  d   O  [	        S[        U5       SU SU S35      eg [        U[        R
                  5      (       a  U R                  UUUS9  g g )Nr~  r  r  r  r  )r   r   r   r   rF   rc  rl  r  s       r\   r  ShapeEnv._constrain_range  s    a''3q6(S(%s1vhl3%qQTPUUV&WXX a&&''   (  'r^   c                &   [        U[        5      (       d  [        U[        5      (       d  X:X  d   eg[        UR                  R                  [        R
                  5      (       d   S5       eUR                  R                  U L d   e[        R                  " U5      U R                  UR                  R                  '   g[        UR                  R                  [        R
                  5      (       d   S5       eUR                  R                  U L d   e[        U[        5      (       d8  [        R                  " U5      U R                  UR                  R                  '   gUR                  R                  UR                  R                  L d   e[        UR                  R                  [        R
                  5      (       d   S5       eU R                  UR                  R                  5      nX0R                  UR                  R                  '   g)r  zconstraining non-Symbols NYIN)
r   r   r   r   r   rc  rM  r   r  r  )rY   r  r  new_vars       r\   r  ShapeEnv._constrain_unify+  s    !V$$a((vv!FFKK  212  vv''4///16q1A!!!&&++.
 affkk5<<88X:XX866##t+++a((16q1A!!!&&++.vv''166+;+;;;;!FFKK  212  **QVV[[118!!!&&++.r^   c                $    [        [        SS5      $ )Nignore_fresh_unbacked_symbolsFr  TLSr   s    r\   "_ignore_fresh_unbacked_symbols_tls+ShapeEnv._ignore_fresh_unbacked_symbols_tlsQ  s    s;UCCr^   c                <    U R                  5       nU[        l        U$ rV   )r  r  r  )rY   r  prevs      r\   "_ignore_fresh_unbacked_symbols_set+ShapeEnv._ignore_fresh_unbacked_symbols_setT  s    668,-)r^   c              #     #    U R                  S5      n Sv   U R                  U5        g! U R                  U5        f = f7f)zI
Indicates that the newly allocated unbacked SymInts are being
discarded
TN)r!  )rY   r   s     r\   r  &ShapeEnv.ignore_fresh_unbacked_symbolsZ  s;      66t<	:33D9D33D9s   A+ A>Ac                    SU l         g)zFreeze this ShapeEnv to stop accumulating guards

A frozen ShapeEnv will ignore any further guards generated on it and
only emit a warning which may lead to accuracy problems.
TNr  r   s    r\   freezeShapeEnv.freezef  s     r^   c                    SU l         g)a7  Freeze this ShapeEnv to stop adding deferred runtime asserts.

We will error if you try to install a new runtime assert when it is
frozen.  This would indicate a lowering violation, or perhaps something
we know statically is already True but we are checking it again in a way
that is not clearly dischargeable.
TN)r  r   s    r\   freeze_runtime_assertsShapeEnv.freeze_runtime_assertso  s     '+#r^   c                    U R                   (       d  g UR                  5       nXR                  ;  a"  [        R                  " USS9U R                  U'   U R                  U   $ )NTr   )r  r  r  r   rc  )rY   r.  srcnames      r\   _create_symbol_for_source"ShapeEnv._create_symbol_for_source{  sQ    33++-...-2\\'4-PD!!'*$$W--r^   c                ^    U R                   (       a  U R                  R                  X5        g g rV   )r  r  add_var)rY   r{  r   s      r\   
_add_z3varShapeEnv._add_z3var  s"    //NN""60 0r^   c                ^    U R                   (       a  U R                  R                  U5        g g rV   )r  r  add_target_exprrl  s     r\   _add_target_exprShapeEnv._add_target_expr  s"    //NN**40 0r^   c                ^    U R                   (       a  U R                  R                  U5        g g rV   )r  r  add_assertionrl  s     r\   _add_assertionShapeEnv._add_assertion  s"    //NN((. 0r^   c                \    U R                   (       a  U R                  R                  5         g g rV   )r  r  validater   s    r\   _check_translation_validate$ShapeEnv._check_translation_validate  s     //NN##% 0r^   c                   X4nSnU R                   (       a  X0R                  ;  a  [        S U 5       5      (       a  [        S U 5       5      (       d   eS U4$ Sn[        S U 5       5      (       d   SUR                   SU 35       eU R
                  R                  X5      =oPR                  U'   XPR                  UR                  '   U R                  R                  US 5      U4$ )NFc              3  (   #    U  H  oS L v   M
     g 7frV   rl   r-  r  s     r\   r0  4ShapeEnv._create_fx_call_function.<locals>.<genexpr>  s     +d9d   c              3  t   #    U  H.  n[        U[        R                  R                  5      (       + v   M0     g 7frV   )r   r   r   r{  rA  s     r\   r0  rB    s%     JTz!UXX]];;;Ts   68Tc              3  (   #    U  H  oS Lv   M
     g 7frV   rl   rA  s     r\   r0  rB    s      '+!trC  zmissing arg in FX graph (z): )
r  r  r  r4  ra   r  rz  r  r  rL  )rY   rW  rZ   node_keyfreshr   s         r\   _create_fx_call_function!ShapeEnv._create_fx_call_function  s     ://HDVDV4V+d+++ JTJJJJJU{"E  '+   B*2;;-s4&AB  37**2J2J22TTD%%h/+/dii(!!%%h5u<<r^   c           	        U R                   (       d  g U R                  R                  U44nX0R                  ;  a  U R	                  X5        [
        R                  " SS[
        R                  " SSUR                  5      5      nU R                  R                  U5      =oPR                  U'   XPR                  UR                  '   XR                  S'   U R                  U   $ )Nz[^a-zA-Z0-9]rG  z[()]r)  r{  )
r  r  rS  r  r1  r  rI  r  r  rX  )rY   r{  r   rF  r  r   s         r\    _create_fx_placeholder_and_z3var)ShapeEnv._create_fx_placeholder_and_z3var  s    
 33JJ**VI6
 ---OOF)66bffWb&++&FL 37**2H2H2VVD%%h/+/dii( #)IIh!!(++r^   c                    U R                   (       aE  UbA  U R                  R                  UR                  5        U R                  R                  U5        g g g rV   )r  r  r"  r  r  
erase_node)rY   r   s     r\   _remove_fx_nodeShapeEnv._remove_fx_node  sC    //D4D!!$)),JJ!!$' 5E/r^   c                    SSK Jn  U R                  (       a:  U R                  5       UR                  [
        '   U" 5       UR                  [        '   g g )Nr   )get_current_node)torch._dynamo.utilsrR  r  r  rX  r~   r   )rY   r   rR  s      r\   _add_fx_node_metadataShapeEnv._add_fx_node_metadata  s=    8$$,0,B,B,DDII()*:*<DII&' %r^   c                $    [        [        SS5      $ )Nsuppress_guardsFr  r   s    r\   _suppress_guards_tlsShapeEnv._suppress_guards_tls  s    s-u55r^   c                    [        [        S5      (       d  / [        l        U R                  5       n[        R                  R	                  U5        S[        l        g )Nsuppress_guards_stackT)r'  r  r[  rX  r  rW  rY   r@  s     r\   r  ShapeEnv._suppress_guards_enter  sB    s344(*C%'')!!((-"r^   c                    [        [        R                  5      S:  a  [        R                  R                  5       OSnU[        l        g )Nr   F)r3  r  r[  r"  rW  r\  s     r\   r  ShapeEnv._suppress_guards_exit  s=     3,,-1 %%))+ 	
 "r^   c                    [        U 5      $ )z5Context manager to ignore all guards generated inside)r  r   s    r\   rW  ShapeEnv.suppress_guards  s    %%r^   c                    [        U R                  5      [        U R                  5      U R                  [        U R                  5      4$ )z
Defines the current "state" of the guards we've accumulated in this ShapeEnv.
Determines when we need to invalidate our cache
)r3  r  r  r  r  r   s    r\   rW  ShapeEnv._get_key  s?     !!"--(()	
 	
r^   c                    [        U R                  5      U R                  S   :w  a  SU l        U R	                  5       nU R                  U:w  a  Xl        U =R
                  S-  sl        g g )Nr   T)r3  r  r  r  rW  rX  )rY   cur_keys     r\   _update_version_counter ShapeEnv._update_version_counter  s_    
 t~~$"6"6q"9904D- --/7*#* !!Q&! +r^   c                8    U R                  [        U5      X#5      $ rV   )!_produce_dyn_sizes_from_int_tupler_  )rY   ex_sizer.  r  s       r\   _produce_dyn_sizesShapeEnv._produce_dyn_sizes  s      55'NF
 	
r^   c           
     6   [        S U 5       5      (       d
   SU 35       eSSKJnJn  [	        U5        UR
                  nUR                  n/ n[        U5       H  u  pU R                  U
U" X$R                  U	5      Xi   Xy   [        R                  US9n[        R                  (       aY  [        U[        R                  5      (       a:  [        U[         R                  5      (       a  U R"                  R%                  U5        UR'                  U5        M     U$ )Nc              3  B   #    U  H  n[        U5      (       + v   M     g 7frV   )r  )r-  r   s     r\   r0  =ShapeEnv._produce_dyn_sizes_from_int_tuple.<locals>.<genexpr>!  s      
,7SC   Ks   z0Expect size to be a plain tuple of ints but got r   TensorPropertyTensorPropertySource)do_not_specialize_zero_oner  )r4  r'  rq  rr  r  r  r  r3  create_symbolSIZEr`  backed_size_obliviousr   r   rc  rB   rC   r  r  r  )rY   tensor_sizer.  r  rq  rr  dynamic_dimsconstraint_dimsrv  rG  r   syms               r\   ri  *ShapeEnv._produce_dyn_sizes_from_int_tuple  s     
,7
 
 
 	L=k]K	L 
 	N/0'55*;;,FA$$$V-@-@!D"+1+G+G!1 % C ,,sELL11"3		22""3'KK -  r^   r  c               b  ^  [        U 4S jUR                  5        5       5      n[        U 4S jUR                  5        5       5      nT R                  UR	                  5       5      nT R                  UUU[        UR                  5       5       Vs/ s H  n[        X5      PM     snUUS9$ s  snf )z
Returns a list of symbolic sizes and strides for the given tensor.
We try our best to express stride in terms of the sizes, so as to not
introduce new symbolic variables.
c              3  F   >#    U  H  nTR                  U5      v   M     g 7frV   #_maybe_specialize_sym_int_with_hint)r-  szrY   s     r\   r0  HShapeEnv.create_symbolic_sizes_strides_storage_offset.<locals>.<genexpr>M  s"      
CLRD44R889   !c              3  F   >#    U  H  nTR                  U5      v   M     g 7frV   r~  )r-  sdrY   s     r\   r0  r  P  s"      
CNRD44R88;r  r  )	r_  rv  rw  r  rx  -_create_symbolic_sizes_strides_storage_offsetr9  r  _is_dim_dynamic)rY   exr.  r  rj  	ex_strideex_storage_offsetrG  s   `       r\   ,create_symbolic_sizes_strides_storage_offset5ShapeEnv.create_symbolic_sizes_strides_storage_offset<  s    "  
CE779
 
  
CE99;
 
	 !DD
 AA-22668_=__R#_=- B 
 	
 >s   B,c                    [        U[        [        R                  45      (       d   e[	        U5      (       a:  UR
                  R                  U Ld   S5       eUR
                  R                  5       $ U$ )NzFexpect the symbol is created from an shape env other than current one.)r   r   r   r   r  r   rM  r  )rY   	maybe_syms     r\   r  ,ShapeEnv._maybe_specialize_sym_int_with_hint  sh     )c5<<%89999y!!((4XWX4>>..00r^   c                  [        U5      nUc  S /U-  nS /U-  n	/ n
/ n[        U5       Hq  nXL   (       a  [        R                  nO2U R                  (       a  [        R
                  nO[        R                  nU
R                  U5        UR                  U5        Ms     [        R                  /U-  n
[        R                  /U-  n[        U
UUU	S9n[        U5        UR                  nUR                  n	UR                  nUR                  n[        S U 5       5      (       a  [        R
                  O[        R                  n[        S U 5       5      n[        U5      U:X  d   [        U5       SU 35       e[        U5      U:X  d   [        U5       SU 35       e[        U5      U:X  d   e[        U	5      U:X  d   eSSKJnJn  U R'                  XU5      nU R)                  UUUUUU	UU5      n[+        [-        UU5      5       VVVs/ s H,  u  nu  nnU R/                  UUU" UUR0                  U5      S9PM.     nnnn/ n[+        U5       H?  u  nnUc   eUR                  U R/                  UX,   U" UUR2                  U5      S95        MA     U R/                  U R5                  UU" UUR6                  5      US US9UU" UUR6                  5      S9n[9        U5      [9        U5      U4$ s  snnnf )	Nr  r  r  r  c              3  F   #    U  H  o[         R                  :H  v   M     g 7frV   r  r  r-  r  s     r\   r0  IShapeEnv._create_symbolic_sizes_strides_storage_offset.<locals>.<genexpr>  s     A=a
)))=   !c              3  F   #    U  H  o[         R                  :H  v   M     g 7frV   r  r  s     r\   r0  r    s     M}!J$5$55}r  r<  r   rp  r-  dynamic_dimconstraint_dimr  )r3  r9  r  r  r  r  r  r  r  r   r  r  r  r  r  r4  r'  rq  rr  ri  _compute_symbolic_strider3  r5  r/  ru  STRIDErt  STORAGE_OFFSETr_  )rY   rj  r  r  is_dim_dynamicr.  r  r  r  r  rx  r  rG  r  r  dynamic_offsetare_sizes_staticrq  rr  rv  rw  rz  r]  	sym_sizesr  stride_exprr  s                              r\   r  6ShapeEnv._create_symbolic_sizes_strides_storage_offset  sC   " 'l #59FSL7;fslL O3Z "$"**A22"))A"A##A&&&q)   'OO,s2L)667#=O7* /!1#5	  	/0+<<-@@(66*:: A=AAA  	
 M}MM=!S(JS-?,@SE*JJ(?#s*Ls=/A.B$se,LL*#$+++%&#---M!%!G!G-"
 ..	
" #,Cg,>"?
 #@;C ""+FN4G4GK # 
 #@ 	 
 
'/NA{ ***&&"/8M8MqQ ' 	 0 "33!$V^-J-JK*#!1   #'0M0MN 4 

 Yz!24FFF?
s   3K.c	           	        SSK Jn	Jn
  S /[        U5      -  n0 n[	        U5       VVs/ s H	  u  pX* 4PM     nnnUR                  [        S9  U H  u  nnU* nU[        U5      S-
  :g  =(       a    XM   X=S-      XMS-      -  :H  nUS;   a  U(       d  [        R                  " U5      nOX]   nU[        R                  :X  a
  X;   a  X   nOcUnU[        R                  :X  a'  U(       a  [        R                  O[        R                  nU R                  UU
" XR                  U5      UXm   US9nUX'   X-   U-  XU   U-  '   M     [        S U 5       5      (       d   eU$ s  snnf )Nr   rp  rI  r   r  r  c              3  (   #    U  H  oS Lv   M
     g 7frV   rl   )r-  r  s     r\   r0  4ShapeEnv._compute_symbolic_stride.<locals>.<genexpr>;  s     1&QD=&rC  )r'  rq  rr  r3  r3  r  r   r   r   r  r  r  r  rt  r  r4  )rY   r.  rv  rj  r  r  r  r  r  rq  rr  rw  
candidatesrG  r   val_listneg_icontiguous_stride
out_stridedynamic_stride
dyn_strides                        r\   r  !ShapeEnv._compute_symbolic_stride  s    	N.2Vc$i-?;=
 -6i,@A,@&!S"I,@A01"JCAS^a'' FLGENY1u5E$EE  f}%6"]]3/
!0!3!Z%<%<<AR!+J "0J%)@)@@1AJ--z # "&!3!3,V5J5JAN$.'9'<)9 "4 "J #FI+/7Z+?JqzC'(9 #< 1&11111E Bs   E )r.  c          
        U R                   (       aU  UbR  U R                  U5      nUc   eU R                  U[        5      nU R	                  [
        R                  " XA5      5        OSn[        U[
        R                  5      (       a!  Ub  [        U5      U:X  d   e[        U5      nU$ [        U5      (       a  Sn[        [        X[        X%S95      nU$ )zCreate a SymInt value from a symbolic expression

If you know what the current hint value of the SymInt to be created
is, pass it into hint.  Otherwise, pass None and we will make our best
guess

Nfx_node)r  r-  rK  r   r9  r   ra  r   r   r  r   r.   rY   rz  r]  r.  r{  r  r@  s          r\   r/  ShapeEnv.create_symintnode>  s     //F4F33F;F%%% ;;FCHG  56G c5==))3x4'''c(C 
 %S))CGHC
r^   c          
        U R                   (       aU  UbR  U R                  U5      nUc   eU R                  U[        5      nU R	                  [
        R                  " XA5      5        OSn[        U[
        R                  5      (       a!  Ub  [        U5      U:X  d   e[        U5      nU$ [        U5      (       a
  Ub   U5       e[        [        X[        X%S95      nU$ )z2Create a SymFloat value from a symbolic expressionNr  )r  r-  rK  r&  r9  r   ra  r   r'  r  r   r.   r  s          r\   create_symfloatnodeShapeEnv.create_symfloatnodej  s     //F4F33F;F%%% ;;FEJG  56G c5;;''SzT)))*C 
 %S))|(S(|73eTKLC
r^   c                B    U R                  U R                  UUUS9UUS9$ )z1Create a SymInt wrapping a new unspecified symbol)r.  r  r-  )r/  create_unspecified_symbol)rY   r  r.  r  s       r\   $create_unspecified_symint_and_symbol-ShapeEnv.create_unspecified_symint_and_symbol  s@    
 %%**' + 
  & 
 	
r^   c                6    [        [        X[        S5      5      $ )z7Create a SymBool object from a sympy boolean expressionN)r   r.   r   rY   rz  s     r\   create_symboolnodeShapeEnv.create_symboolnode  s     ws$566r^   c                ^  ^^^ [         R                  S L=(       a+    [        T5      [         R                  R                  S5      ;   nUc  U R	                  U5      u  pxOUR                  5       Sp[        R                  SUTTR                  TR                  UUUS9  [        SUUU4S jS9  g )N,r)  z%s %s [%s, %s] %s%s
stack_infocreate_unbacked_symbolc                    > [        T5      [        T 5      STR                   STR                   S3[        R
                  " S5      [        R                  " 5       S.$ )N[rr  r  r  )r{  node_idr  
user_stackrg  )r   idr  r  r$   get_user_stackget_framework_stack)r   r{  r  s   r\   rA  6ShapeEnv._log_create_unbacked_symbol.<locals>.<lambda>  sJ    f+h<"((2bhhZq1(77:#779!r^   metadata_fn)r`  extended_debug_create_symbolr   rp  _get_stack_summaryr  r   r[  r  r  r%   )	rY   prefixr{  r  r.  r   is_debugslocmaybe_extra_debugs	     `` `   r\   _log_create_unbacked_symbol$ShapeEnv._log_create_unbacked_symbol  s     66dB <sH
0066s;H< >&*&=&=h&G#D#&,kkmR#!HHHH 	 		
 	$		
r^   c                l   [        [        R                  [        U R                  5      5      nU R
                  S==   S-  ss'   U R                  5       (       d  U R                  R                  U5        [        R                  " SS9U R                  U'   [        R                  " 5       =o R                  U'   UR                  (       d   eU R!                  5       n[#        X35      U R$                  U'   U R'                  U[(        5      n[+        X[(        SUS9nU R-                  SXUS9  [/        U5      $ )z,Create a symbolic float without a hint valuer  r   r  Nr  create_unbacked_symfloatr   )rA   rC   r  r  r  r  r  rM  r  rH   extractr  rG   unknownrd  is_float	_get_slocr   r  rK  r&  r.   r  r   rY   r{  r  r  r  r   s         r\   r  !ShapeEnv.create_unbacked_symfloat  s     +d&D&D!E 
 	-.!3.6688//66v>$5$=$=1$E&!)4)<)<)>>v&{{{~~)8)Dv& 77F6gF((&X 	) 	
 !!r^   c                `   [        [        R                  [        U R                  5      SS9nU R                  5       (       d  U R                  R                  U5        U R                  S==   S-  ss'   [        R                  " SS9U R                  U'   U R                  5       =o0R                  U'   UR                  (       d   eU R                  5       n[!        XD5      U R"                  U'   U R%                  U[&        5      n[)        X [&        SUS9nU R+                  SX#XS	9  [-        U5      $ )
z.Create a symbolic integer without a hint valueTr   r  r   r  Nr  create_unbacked_symintr  )rA   rC   r  r  r  r  rM  r  r  rH   r  r   _default_unspecified_value_rangerd  r4  r  r   r  rK  r   r.   r  r   )rY   r.  r{  r  r  r  r   s          r\   r  ShapeEnv.create_unbacked_symint  s     +tD$@$@A4 
 6688//66v>-.!3.$5$=$=1$E&!)-)N)N)PPv&yyy~~)8)Dv& 77D6dGD(($f& 	) 	
 hr^   c                6    [        U[        R                  5      $ )zJCheck if a sympy symbol matches the naming convention for unbacked symbolsrB   rC   r  )rY   r{  s     r\   rq  ShapeEnv.is_unbacked_symint  s    fd&7&788r^   c                   [        [        R                  [        U R                  5      SS9nU R                  5       (       d  U R                  R                  U5        U R                  S==   S-  ss'   [        R                  " SS9U R                  U'   [        SS5      =o R                  U'   UR                  (       d   eU R                  S5      n[!        X35      U R"                  U'   U R%                  U[&        5      n[)        [*        R,                  " US5      U [&        SUS	9nU R/                  S
XUS9  [1        U5      $ )z.Create a symbolic boolean without a hint valueTr   r  r   r  r   z(default value range for unbacked SymBoolNr  create_unbacked_symboolr  )rA   rC   r  r  r  r  rM  r  r  rH   r  r  rG   rd  r4  r  r   r  rK  r   r.   r   ra  r  r   r  s         r\   r   ShapeEnv.create_unbacked_symbool  s     +tD$@$@A4 
 6688//66v>-.!3.$5$=$=1$E&!)4Q)::v&yyy~~HI)8)Dv& 77E588FA.dD'R((%vH 	) 	
 x  r^   c           
     ,    U R                  UUUUSSUS9$ )z
Create a symbol with an unspecified value

Compared to standard symbols we do not assume the value is positive,
nor do we specialze on zero or one values.
NT)r1  rs  r  )rt  )rY   r   r.  r  r  r  s         r\   r  "ShapeEnv.create_unspecified_symbol  s1    ( !!'+- " 
 	
r^   c                L  ^^^^ [        U[        5      (       a  UR                  R                  UR                  R                  :X  a  [
        R                  nUR                  R                  T:w  a6  [        SUR                  R                   ST STR                  5        35      eU(       aY  SSK	J
n  [        TU5      (       d   eTR                  c   eX7R                  TR                  '   SUR                  TR                  '   SnTR                  5       n	[        U[        5      (       a1  [        U 5      UR                   ;  a  0 UR                   [        U 5      '   [        U[        5      (       a>  U	(       a7  U	UR                   [        U 5         ;   a  UR                   [        U 5         U	   $ U[
        R"                  [
        R$                  4;   a  U R'                  T5      R(                  R*                  n
U R-                  U
5        [        U[        5      (       a"  U	(       a  U
UR                   [        U 5         U	'   U[
        R$                  L a  TU R.                  U
'   U
$ U(       a  SnOU R0                  n[        T[2        5      (       d   [5        T5       ST 35       eU(       a  TS:  a
   S	T 35       eUb  [
        R6                  nU[
        R                  L aO  [8        R:                  " T5      n
[        U[        5      (       a"  U	(       a  U
UR                   [        U 5         U	'   U
$ U[
        R<                  L a  U R>                  nO$U[
        R6                  L a  SnO[A        S
U 35      eU RC                  5       nTS;   a  U(       a  U RD                  T   nGOU(       a  TU RD                  ;  Ga[  [5        T5      [F        L d  [I        T5      (       a.  [K        [L        RN                  [Q        U RR                  5      USS9mO-[K        [L        RT                  [Q        U RR                  5      USS9mTU RV                  U	'   [        T[F        5      (       a$  [8        R:                  " T5      U RR                  T'   O[        T[X        5      (       a$  [8        RZ                  " T5      U RR                  T'   OG[]        TR(                  R_                  5       TR(                  Ra                  5       S9U RR                  T'   / U Rb                  T'   U Re                  T[F        5        U(       a  TU RD                  T'   [        T[F        5      (       GaQ  U(       an  U Rg                  TS:  5        U Ri                  U5      U Rj                  T'   [m        U RC                  U R0                  (       a  SOS5      U5      U Rn                  T'   O5U Rq                  5       U Rj                  T'   [m        X5      U Rn                  T'   [        U[        5      (       a$  U(       a   eU Rs                  TUR                  SS9  U Rj                  T   nURt                  (       d   eTU;  a(  [        T SUR                   SUR                   S35      eSUR                   SUR                   S3mO[        T[X        5      (       a  [w        [8        Rx                  * [8        Rx                  5      =U Rj                  T'   n[m        X5      U Rn                  T'   SUR                   SUR                   S3mURz                  (       d   eOSmTn[|        R~                  SL=(       a+    [        T5      [|        R~                  R                  S5      ;   nSnU(       d!  [        R                  " SS5      S;  a  ST S3nU R                  U5      u  nnU R                  R                  STTTR                  5       TUUUUS9	  [        S UUUU4S! jS"9  U R                  S ==   S-  ss'   OHU RD                  T   nXRV                  U	'   U R                  R                  S#UTR                  5       5        [        U[8        R                  5      (       am  U Rb                  U   nUR                  T5        TR                  5       (       d)  US   R                  5       (       a  US$   US   sUS'   US$'   SU R                  U'   [        U[        5      (       a"  U	(       a  UUR                   [        U 5         U	'   U$ )%z5Create a new symbol which is tracked by this ShapeEnvzStatic shape constraint of z does not match input size of z, for r   )rr  NFr  z!positive set for negative value: zunhandled dynamic_dim r  Tr0  )r1  r+  )rJ  r   zuser code shown is first use of this value--the guard itself is not due user code but due to 0/1 specialization in the framework; to avoid specialization try torch._dynamo.mark_unbacked(tensor, dim)is_constraintz not in range [rr  r  r  r)  r  TORCHDYNAMO_EXTENDED_ADVICE1)0r)  zC, for more info run with TORCHDYNAMO_EXTENDED_DEBUG_CREATE_SYMBOL="zF" or to suppress this message run with TORCHDYNAMO_EXTENDED_ADVICE="0"z&create_symbol %s = %s for %s %s %s%s%sr  rt  c                   > [        T5      [        T5      T TR                  5       [        R                  " [
        R                  " 5       5      [        R                  " [        R                  " SS9R                  5       5      S.$ )Nr   r  )r{  r   r  r.  r  rg  )
r   r   r  r$   from_tracebackr!   extract_stackrH   r  summary)	range_strr.  
sympy_exprr   s   r\   rA  (ShapeEnv.create_symbol.<locals>.<lambda>  sc    !*o9#$kkm",";";&446# (66)11q9AAC%r^   r  zcreate_symbol %s duck sized %sr  )Nr   r  r  r  r  r  r  r  r  r'  rr  r<  r  r  r   r  r  r  r  r  r   r   rr  r  r  r    r   r  r   r   r  r  r  r  r  r   r}   rA   rC   ru  r3  r0  FLOATr  r&  r'  r?   
nested_intr   r1  r1  r9  _default_value_rangerd  r   r  r  _update_var_to_ranger4  rG   oor  r`  r  r   rp  osgetenvr  r   r[  r%   r  r   rc  r  is_ephemeralr  )rY   r   r.  r  r  r1  rs  r  rr  r  r@  r  duckr  r  r  r  maybe_more_infor  	r_sourcesr  r  s    ``                 @@r\   rt  ShapeEnv.create_symbol6  s    ~'=>>!!''>+<+<+B+BB$++K  &&#-.1.2C2C2I2I1JJhilhm n!;;=/+   E!&*>????zz---=H..vzz:@D 11&**=!N kkm')@AA4 0 T TTMO@@DJ ')@AA#GG4QR $GG4Q  :88*:S:STT--f5::??C**3/*,CDD  !DDRXN j77714))#.J%"'"&":":&&))Ed6l^1VH+EE)qT-Nse+TT) %$,,K*+++--$C*,CDD  !DDRXN JJOO+ ??DJ...D #9+!GHH~~&=0$ADOO3 CyC=#5#5(IIs4??3hPT
 )JJDOO 4xd
 /9D{+#s##.3mmC.@
+C''.3kk#.>
+ /;HH'')1J1J1L/
+
 /1D
+OOJ,'1$#s##''
Q7 594M4M25D%%j1 :I  $77` "& 	:D**:6 ==? %%" :I9TD**:6 n.DEE#O8--"N$5$5T .  &&z2yy yb=2%rxxj288*AF   zBHH:Q7	C''5@%((EHH5UU!!*-5DT5P&&z2zBHH:Q7	{{"{ 	A::$F @3L44::3?L@H !O		*G M V !
AAK M66   '+&=&=h&G#D#HHMM8!#  
   LL)Q.) $A./{+HHNN;QNa&&++A.IV$&&((Yq\-F-F-H-H.7mYq\+	!im
 ,-D%%a(&(?@@[  @@DJ r^   c                    [         R                  SXSS9  XR                  ;  d
   U S35       e[        R                  " U5      U R                  U'   g)z.Adds a new symbol to the symbolic environment.zadd_var_to_val %s %sTr  z already existsN)r   r   r0  r   r   )rY   r   r   s      r\   add_var_to_valShapeEnv.add_var_to_val3  sH    		($	E??*DtfO,DD* %c 2r^   c                X    UR                  5       nU R                  R                  X"5      $ rV   )r  r  rL  )rY   r.  src_names      r\   _debug_nameShapeEnv._debug_name9  s$    ;;=--11(EEr^   c                $   [        U[        5      (       a  UR                  R                  UR                  R                  pCU R                  5       nX5R                  ::  a  S nXER                  :  a  S nU R                  U5       SUR                  5        S3nUb"  Ub  USU SU R                  U5       SU 3-  nU$ Uc  Ub  USU R                  U5       SU 3-  nU$ Ub  Uc  USU SU R                  U5       3-  nU$ UR                  U5      $ )Nr4  z in the specified ranger  r  )	r   r  r  r  r  r  r	  r  r  )rY   r.  rG  r  r  r  c_renders          r\   &_render_range_for_constraint_violation/ShapeEnv._render_range_for_constraint_violation=  s3    a/0044::qttzz5//1G%%##F+,C>UV   U%6awd4+;+;F+C*DDPP
 O	 5#4a 0 0 89eWEE O "u}awd4+;+;F+C*DEEOxxr^   c                H    U R                   " U0 UDSS0D6S   R                  $ )zv
Like produce_guards_verbose, but only returns the non-verbose python guard expressions
(no verbose guards produced.)
langs)pythonr   )produce_guards_verboser  )rY   rZ   rY  s      r\   produce_guardsShapeEnv.produce_guardsS  s*    
 **DNFN+NqQWWWr^   c                "    U R                  5       $ rV   r
  r  s    r\   rA  ShapeEnv.<lambda>^  s
    r^   r  verbose_python)r  input_contextsequalities_inputs_simplifiedr  r  c               *  ^ ^^	^O^P^Q^R^S^T^U^V^W^X^Y^Z^[^\^] T R                   R                  S5        T R                  (       a&  [        T R                  5      n
T R                  U
5        [        T5      [        U5      :X  d   ST SU S35       e[        R                  [        4nSJS jnUc+  T Vs/ s H  n[        X5      (       a  U" U5      OSPM     nnO[        U5      [        T5      :X  d   e[        [        TU5      5       Hg  u  nu  p[        X5      (       a  Uc  U" U5      X^'   M'  M)  [        U[        [        [        [         45      (       d   e[        U["        5      (       d  Mg   e   SSKJmOJmP  / mT[*        R,                  " ["        5      m][*        R,                  " [.        5      m\/ mR/ mW[1        T]UT R2                  5      mXT	 HV  nUS	;   a  TWR5                  TX5        M  US
:X  a(  TWR5                  [7        T]UT R2                  5      5        MJ  [9        SU 35      e    SK         SLUR4S jjjmYSMUOUP4S jjmUU(       Gax  0 mZ[        U5       H  u  nnUTZUR;                  5       '   M     SNUUZ4S jjnUR<                   H  u  nnU" U5      U" U5      nnT R?                  [@        RB                  " UU5      5      nU(       a  ME  [E        UR;                  5        S[        U[        5      (       a  UOURG                  T RH                  5       SUR;                  5        S[        U[        5      (       a  U 35      eURG                  T RH                  5       35      e   URJ                   GH  u  nnnU" U5      n[        U[@        RL                  5      (       a"  UT R2                  U   S   R;                  5       4OU" U5      T RO                  U5      4u  nnU" U5      nT R?                  [@        RB                  " UU5      5      nU(       a  M  [E        SUR;                  5        SU" [@        RL                  " U5      5       SU SURG                  T RH                  5       SURG                  T RH                  5       3
5      e   URP                   H$  nT]U   RS                  T R2                  U   5        M&      SK       SOUTUXUYU U\U]4S jjjnSPUTU]4S jjn[        TX%5       GH  u  nn n[        U [T        5      (       a  SSKJ+n!  U!" U 5      n [        U [X        5      (       d   eUc  MG  [        U[        [        45      (       a  U" U U5        Mm  [        U[        [         45      (       a  U" U U5        M  [        X5      (       d   e[[        U5      (       a  SSKJ.n"  [        U[^        5      (       d   eU XR`                  URb                  4/n#URe                  5       u  n$n%U$ HN  n&[g        UU&5      n'URh                  U&   n(U#R5                  U"" U U&5      U'U(R`                  U(Rb                  45        MP     OU XR`                  URb                  4/n#U# GH  u  nn)n*n+[k        U)5      (       aF  [        U)Rm                  5       5       H'  u  nn,TP" UTORn                  U5      n-U" U-U,U*U   5        M)     M_  [        U)Rm                  5       5       H'  u  nn,TP" UTORn                  U5      n-U" U-U,U*U   5        M)     [        U)Rq                  5       5       H'  u  nn,TP" UTORr                  U5      n-U" U-U,U+U   5        M)     U" TP" UTORt                  5      U)Rw                  5       5        GM     GM     T	 V%s/ s H  n%/ PM     sn%mQ[y        T]T RH                  [/        T\R{                  5       5      T R|                  5      T l?        U(       GdB  TT GH;  u  n mSU R;                  5       n.T R                  (       aC  U.T R                  ;   a3  T R                  [@        RB                  " T R                  U.   TS5      5        [        TS[@        RL                  5      (       a$  T]R                  TS5      (       a  U T]TS   S   :X  a  M  U(       aL  [        U TP5      (       a;  TSR                  (       a*  T R                   R                  SU" U 5       STS 35        GM  TU" U 5      (       a  T R~                  R                  U TS5        [        TQTWT	5       H  u  n/n0nU0R                  U 5       SU0R                  TS5       3n1US:X  a  T R                  R                  U.5      =n2b[  U T R2                  U2   S   :w  a  U1 ST RH                  U2    S3n1O7T R                  R                  U25      =n3b  U1 SU3 3n1OU1 SU2 S 3n1OU1 S!U. S 3n1U/R5                  U15        M     [        U TP5      (       d  GM  U R                  TORn                  L d  GM/  U(       d  GM9  [        TSR                  5      S":X  d  GMU  [        [        TSR                  5      5      m[[        TS[@        RL                  5      (       a  TST\;   a  UR                  U T]TS   S   5      (       dx  S#T RO                  U 5       SU R;                  5        S$T RO                  T]TS   S   5       ST]TS   S   R;                  5        S%3	n4TY" UR                  T RO                  U 5      U45        [        TS[@        RL                  5      (       a  GMO  T[T\;   d  GMX  UR                  U T]T[   S   USU[4S& j5      (       a  GM~  T]T[   S   nS#T RO                  U 5       SU R;                  5        S'T RO                  U5       SUR;                  5        S(T RO                  U 5       STSRG                  T[[@        R                  " T RO                  U5      5      05       S)3n4TY" UR                  T RO                  U 5      U45        GM>     [/        5       mVSQUQUUUVU	UWUXUYU U\U]4
S* jjn5Ub  UOT R                   H4  n6T R                  U6R                  S+U6R                  S,9 b  M,  U5" U65        M6     T R                  R                  S/ 5       HV  n7T R                  U7R                  S+S-9b  M   T R                  U7R                  5      mST R~                  R                  TS5        MX     T]R                  5        GHz  u  m[nT R                  R                  T[5      n8U8c  M'  T R                  T[   n9U(       d   e/ n:U" US   5      n;S.n<U8R                  [@        R                  * [        * 4;  a  [        UU4S/ jU 5       5      (       a:  T R~                  R                  [@        R                  " T[U8R                  5      5        U(       a(  U8R                  T R                  5       R                  :w  a/  U:R5                  [@        R                  " U8R                  T[S0S195        U8R                   S2U; SU9R                   3n<U8R                  [@        R                  [        4;  a  [        UU4S3 jU 5       5      (       a:  T R~                  R                  [@        R                  " T[U8R                  5      5        U:R5                  [@        R                  " T[U8R                  S0S195        U<(       a9  U8R                   S2U; S2U8R                   SU9R                   S$U9R                   3	n<OU; S2U8R                   SU9R                   3n<U:(       Gag  [@        R                  " U:S4S006n=[        TQTWT	5       H@  u  n/n0nUS:X  a  U/R5                  U<5        M   U/R5                  U0R                  U=5      5        MB     T\T[   n>U> H  n?[        U?[        5      (       d  M  U?R                  T R                  5       -  R                  U85      (       a  MM  US   n [@        R                  " [@        R                  " U8R                  T[5      [@        R                  " T[U8R                  5      5      mSTXR                  TS5      n@T R                  U U?5      nAS5UA S6U@ 3n4TY" U?R                  T RO                  U 5      U45        M     [        T[[        R                  5      (       d  GM  S7TXR                  US   5       S3n1[        TQTWT	5       Hw  u  n/n0nUS:X  a  U/R5                  U1 S835        M#  US9:X  a  U/R5                  U15        M<  US
:X  a)  U/R5                  S:U0R                  US   5       S35        Mk  [9        S;U 35      e   GM}     TR(       a  / nB/ nC[/        5       nDTR Hf  u  nEnnFUE(       a,  S<[        WB5      S"-    S=WF" 5        3nGUBR5                  UG5        M:  S>WF" 5        3nGWCR5                  UG5        WDR                  U5        Mh     [        WC5      S:  a<  S?R                  [        WD5      5      nHS@R                  WC5      nI[E        SAUH SBUI 35      e[        WB5      S:  a  [         R                  SC[        WB5      5        [        SDS0 T R                  ET R                  E[        TQS   5      [        SE T]R                  5        5       5      [        T R                  R                  5       SFSG9SH.E5        T R                  (       Gad  SSIKuJvnJ  T R                  R                  5        H'  nKUK H  n7T R                  U7R                  5        M      M)     T R                  R                  5        H  u  nLnMUMR                  [@        R                  * [        * 4;  a0  T R                  [@        R                  " WMR                  WL5      5        WMR                  [@        R                  [        4;  d  M  T R                  [@        R                  " WLWMR                  5      5        M     [        R                  " 5          WJ" T R                  T R                  5      R                  5         SSS5        Uc  T R                  5         / nN[        TQTWT	5       He  u  n/n0nUS
:X  a>  [        U0[6        5      (       d   eWNR5                  [        U/U0R                  5      5        MK  WNR5                  [        U/5      5        Mg     WN$ s  snf s  sn%f ! , (       d  f       N= f)Ra^  
Generates a list of guards strings which, when evaluated in a context that
defines tensors for all the sources, returns True or False depending
on if the guards in the list evaluated to True or not.  Primarily used by Dynamo,
but this is also helpful for manual testing of guards (see
evaluate_guards_for_args)

For convenience in testing, a source is allowed to be a str,
in which case we will assume it is a LocalSource

simplified lets you omit duck sizing, equality and 0/1 guards.
This is useful for testing when you don't care about the boilerplate
guards, and it may be helpful for user output too (be careful though;
some equality guards are nontrivial!  It would be nice to get simplified
output to print them too).  It's private because it's not
intended for normal use

Returns guards in python and python with verbose comments (verbose) by
default.
r  zlen(z	) != len(r  c                    [        [        R                  /U R                  5       -  [        R                  /U R                  5       -  S /U R                  5       -  S /U R                  5       -  S9$ )Nr  )r   r  r  r  r  r  s    r\   _create_no_constraints_contextGShapeEnv.produce_guards_verbose.<locals>._create_no_constraints_context  s]    +)112QUUW<!+!8!8 9AEEG C"&!%%'!1$(6AEEG#3 r^   Nr   rp  r  cppzUnknown lang: c                :   >^^ TR                  XUU4S j45        g )Nc                 ,   > T (       a  T T " 5        3$ T$ rV   rl   )r]  rf  s   r\   rA  VShapeEnv.produce_guards_verbose.<locals>.record_constraint_violation.<locals>.<lambda>  s    D3%x0@0Qc0Qr^   )r  )r  r5  rf  r]  constraint_violationss     ``r\   record_constraint_violationDShapeEnv.produce_guards_verbose.<locals>.record_constraint_violation  s     "(((QRr^   c                Z   > [        U T5      =(       a    U R                  TR                  L $ rV   )r   propru  )r  rq  rr  s    r\   is_dim/ShapeEnv.produce_guards_verbose.<locals>.is_dim  s*    3 45 4HH 3 33r^   c                t  > TTU R                   R                  5             nU R                  c   eUR                  U R                     n[	        U[
        R                  5      (       a  UR                  R                  $ [        U5      [        L d   S[        U5       35       e[        R                  " U5      $ )NzExpected int, got )r  r  r<  r  r   r   r   r   r   r   r   r   r   )tensor_dim_srcr  symintplaceholderssource_indexs      r\   get_expression7ShapeEnv.produce_guards_verbose.<locals>.get_expression  s    #L1D1D1I1I1K$LM%))555N$6$67fell33!;;+++<3.S2DT&\N0SS. ==00r^   r4  z is not equal to zExpected input z to be equal to z, where z
, but got c           	       > [         R                  S[        U R                  5      X5        [	        U[
        5      (       a  [        U5      (       d   e[	        U[
        5      (       a5  UR                  R                  5       b  UR                  R                  5       n[	        U[
        5      (       Ga  UR                  R                  n[	        U[        R                  5      (       aB  TU   R                  U 5        Ub)  [	        U[        5      (       d  TU   R                  U5        GO!Sn[	        U[        5      (       a^  UR                    Vs0 s H  oUTR"                  R%                  US 5      _M!     nn['        S UR)                  5        5       5      (       a  SnO9[	        U[        5      (       a$  UR*                  (       a  [-        U5      nUS;  a  SnU(       al  Uc   eSU4S jjnTR/                  X5      n	SU	 STR1                  U 5       S	3n
T" UR2                  TR1                  U 5      U
[4        R6                  " X5      S
9  TR                  X45        g [        R8                  " U5      nTR                  X45        Sn[	        U[        5      (       a9  X2R:                  R<                  s=:X  a  UR:                  R>                  :X  d  O  SnO[	        U[        5      (       a  US;  a  SnU(       aU  Uc   eTR/                  X5      n	SU	 STR1                  U 5       SU S3n
T" UR2                  TR1                  U 5      U
5        g g s  snf )Nztrack_symint %s %s %sFc              3  (   #    U  H  oS L v   M
     g 7frV   rl   )r-  r  s     r\   r0  HShapeEnv.produce_guards_verbose.<locals>.track_symint.<locals>.<genexpr>o  s     E4DbTz4DrC  Tr  c                0   > TR                  U 5      nU S3$ r  )r  )r  sexpr
py_printers     r\   r]  CShapeEnv.produce_guards_verbose.<locals>.track_symint.<locals>.hint|  s    $.$6$6q$9E&+WA;.r^   Not all values of z are valid because z was inferred to be equal to rR  z  was inferred to be a constant (z).)r  r   r_   r   ) r   r   r#   r  r   r   r  r   maybe_as_intr   r   rc  r  r  r  r  rz   rd  rL  r  rO  r  r   r  r	  r  r   r6  r   r  r  r  )r.  r   
constraintr  constraint_violatedr  sym_vrsrG  r]  var_with_rangerf  input_guardsr7  r%  rY   symbol_to_constraintsrt  s              r\   track_symint5ShapeEnv.produce_guards_verbose.<locals>.track_symintW  s    II-z&++/FX!#v..+c2B2BBB#v&&388+@+@+B+Nhh++-#v&&HHMMa..$Q'..v6!-j"$;7 7 .a044Z@*/'!*.DEE HI~~#GU!t0044Q==~   # EGNN4DEEE26/#J0GHH;; #AA  !6: 3*)555/ *.)T)T"* 10@@S#//788UW  4&00 ,,V4!*!2!24!;	 ##VK0MM#&##VK0&+#j*@AA]]00GJMM4G4GG.2+
,CDD &(.2+&%111%)%P%P&N -^,<<O++F344TUXTYY[]  0",,d.>.>v.F 'c#s   &Mc                n  > [         R                  S[        U R                  5      U5        [	        U[
        5      (       a  [        U5      (       d   e[	        U[
        5      (       a5  UR                  R                  5       b  UR                  R                  5       n[	        U[
        5      (       a\  UR                  R                  n[	        U[        R                  5      (       a  TU   R                  U 5        TR                  X45        g [        R                  " U5      nTR                  X45        g )Nztrack_symfloat %s %s)r   r   r#   r  r   r   r  r   maybe_as_floatr   r   rc  r  r'  )r.  r   r  r?  rt  s      r\   track_symfloat7ShapeEnv.produce_guards_verbose.<locals>.track_symfloat  s    II,j.EsK!#x00K4D4DDD#x((SXX-D-D-F-Rhh--/#x((HHMMa..$Q'..v6##VK0KK$##VK0r^   LocalSource)
AttrSourcezSkipping guard %sr  r  zN  # duck sizing added this equality because these variables had the same size zY (to avoid this specialization, set torch.fx.experimental._config.use_duck_shape = False)  # z  # (unknown var z, please file a bug)z  # (unknown source r   zThe values of  and z must always be equal.c                *   > TR                  TU 05      $ rV   )r5  )r  r   r{  s    r\   rA  1ShapeEnv.produce_guards_verbose.<locals>.<lambda>\  s    dmmVQK&@r^   z) must always be related to the values of z by r	  c                  >
 TR                  U R                  5      nUT;   a  g TR                  U5         Sn[        UU4S jUR                   5       5      (       a*  TR
                  c   eTR
                  R                  U5      n[        TTT5       H?  u  p4nUR                  U5      nUS:X  a  U SU R                   3nUR                  U5        MA     TR                  U5        U(       d  [        UR                  5      S:X  a  [        [        UR                  5      5      nTU   S   nTU   n	U	 H  n
[        U
[        5      (       aN  TR!                  X5      nSU STR                  U5       S	3nT" U
R"                  TR%                  U5      U5        Mf  [        U
[&        5      (       a  M}  [)        S
U
 35      e   g g g ! [*         a(    TR,                  R/                  SU R                  5        e f = f)NFc              3  N   >#    U  H  nTU     H  nT" U5      v   M     M     g 7frV   rl   )r-  r  r.  r)  rt  s      r\   r0  GShapeEnv.produce_guards_verbose.<locals>.issue_guard.<locals>.<genexpr>~  s0      ."21"5 6NN"5 #.s   "%r  rJ  r   r   r9   satisfy the generated guard r	  zunrecognized constraint zFailing guard allocated at %s)r'  r   r  r  rz   r  r5  r  r  r  r5  r3  r  r  r   r  r  r  r	  r  r  rd  r   r)  )guardr   
is_trivialr  printerlang
guard_exprr{  r.  constraintsrG  r>  rf  	all_exprsr)  issuedr  printersr7  r%  rY   r@  rt  s                r\   issue_guard4ShapeEnv.produce_guards_verbose.<locals>.issue_guards  s   ==,D v~JJt-"
 !..  
  //;;;!%!5!5!9!9$!?J,/	8U,K(ED!(!6J//(2|4

|%D
LL,	 -L %%d+ "c$*;*;&<&A!$t'8'8"9:F-f5a8F"7"?K(%a)?@@ $ K KF V + #5^4D E??I?Q?QRV?W>XXY![   8 !T-=-=f-Es (+BCC
 !"03KA31O"PP' )	 'Bz0    !@%**Ms   FG 2G7rl   r  r9  )r  r)  c              3  4   >#    U  H  nT" U5      v   M     g 7frV   rl   r-  r.  r)  s     r\   r0  2ShapeEnv.produce_guards_verbose.<locals>.<genexpr>       <G&vf~~G   Fr  r  c              3  4   >#    U  H  nT" U5      v   M     g 7frV   rl   r_  s     r\   r0  r`    ra  rb  r  r9  rQ  znot math.isnan(zM  # implicit guard for float input due to NaN specialization in the frameworkr  z~std::isnan(zUnimplemented for lang: z  . z  - rr  r  zConstraints violated (rs  z$%s Warning only constraints violateddynamicc              3  6   #    U  H  o(       d  M  S v   M     g7fr   Nrl   )r-  rP  s     r\   r0  r`  0  s     #N/H!AAA/Hs   
	T)reverse)
num_guardsrz   symbol_guard_counts)PopulateValidator)r  rJ   r_   r   rV   )
r  r   r5  r   rf  r   r]  zOptional[Callable[[], str]]r_   r`   )r  r   r_   zTypeGuard[TensorPropertySource])r,  r    r_   r   )r.  r    r   Union[SymInt, int]r;  DimConstraintr_   r`   )r.  r    r   Union[float, SymFloat]r_   r`   )rR  r   r_   r`   )r   r[  r  r+   r  r  r3  r   rJ   r)   r   r3  r5  r   r   r   r&  r  r'  rq  rr  r  r   r8  r  r1  r  r  r(  r  r  evaluate_exprr   ra  r  r5  r0  r  rc  r	  r  extendr   rH  r    r1   rI  r   r  r  r<  r  r	  r&   rv  ru  rw  r  r  rx  r  r  r  r  r  r  r5  rL  r  r   r  r  r  r  r  r(  rz   r  r  r  r  r  rQ  r  rc  r   r9  r  r'  r  rJ  rd  r  r  r  r;   r  r  r  r  r  r  r  r  re  r  rB   rC   r  r  rK  r'   r  r  sumrO  r  r  rk  fx_tracebackpreserve_node_metar  r  runr=  r  r  )^rY   r.  r|  ru  r  r  r  r  r  r  rM  
Tensorliker  r  rG  contextrU  r  r0  r  r  expr1r+  concrete_valsrcEqr  r  r5  expr2_phantom_symbolrA  rE  r.  rH  rI  sources_tensors_constraintsrF  rG  rH  inner_tinner_contextcurr_tconstraint_sizeconstraint_stridessproperty_sourcer,  r  rT  r  s0r  rf  r[  rR  r  r  vr_slocboundsrfverbose_exprboundrW  rG  rV  r>  	warn_msgs
error_msgsr  r  msg_cbstr_msgdebug_names_strerrrk  r  rz  r  helpersrq  rr  rX  r$  r   r?  r)  rY  rZ  r7  r%  r/  r{  r@  rt  s^   ``       `                                                                     @@@@@@@@@@@@@@@r\   r  ShapeEnv.produce_guards_verboseZ  s   H 	&' %%/<IY'< C%
 
 	4,y	3	4 
 llN3
	 ! &%A 6@5N5N.q1TXX%  N
 ~&#l*;;;;#,S~-N#O<Aa,,,J1,M) ' &a&#x)GHHHH)'48888 $PF 	N =H=T=T>

 ##C( 	 LN-/,j$*=*=

 D33
+)(*d6I6I *N4&*ABB   15				 	 .		
 	 		 	 L#G,3+,SXXZ( -1 1 0<<
d-d3^D5Iu  $11%((5%2HI#|299;-sJuc4J4J5PUP^P^_c_n_nPo*p+99;-sJuc4J4J5*pr  QVP^P^_c_n_nPo*pr  = $5#G#GtR&u- "$55 4..t4Q7<<>?(.0@0@0FG "z
 E  $11%((5&2IJ#|2)%**,7Gell:678 9!!+Ct0O/P Q##(>>$//#B"CE  $H* #4"C"C 077''7 #D$ RVQ	Q	!3Q	ANQ	Q	 Q	f	1 	1  #&lG"LAvw&#&&<$V,ff----y!fc]++VQ'A%011vq)a,,,,,Q//;!'+BCCCC Q 8 8':T:TUS+ //1q!D%a.G$+$:$:4$@M/66&vt4#)::)<<	 " Q 8 8':T:TU/+ -! ((!*6;;=!92*>!4!4a+ %_b/!:LM	 ": "+6;;=!92*>!4!4a+ %_b/!:LM	 ":
 "+6==?!;2*>!6!6+ %_b:KA:NO	 "<
 !,S.2O2OP--/% -a #MV 38%8%Qb%%8	-OO%**,-**	 
  , ++-77$"7"77--!HHT%:%:7%CTJ tU\\22(,,T22"24"8";;
 !Z8L%M%M~~/Jv4F3GtD61R !&>>((55fdC,/	8U,K(E7D$11&9:$wt?T>UVC//"&"4"4"8"8"AABN%)<)<R)@)CC'*e ,CCG??SUCVBW X% !$
 +/*A*A*E*Eb*I"I$!V),T$&8),->rdBV&W%(E)=gYFZ"[CLL%# -L( v';<<~':'::))D--.!3!$t'8'8"9:F"466 $99 1 : :"$4T$:1$=! !
 -T-=-=f-E,Fc&++-X]#//0@0Fq0IJK3O_`dOefgOhOmOmOoNp q44 
 4-779I9I&9QSV
 'tU\\::"&;; 1 < <",V4Q7@! ! /v6q9,T-=-=f-E,Fc&++- Y--1-=-=c-B,C3sxxzlRV#//78DMM6SXS`S`aeaqaqruavSwJx<y;zz{} 
 4-779I9I&9QSVo !-F 6	 6	 6	v  &1Vt{{BE++JJr%:N:N ,  
  C //33D"=B**2772*>J==)D  $$T*	 >  0557OFG!!%%f-Ay,,V4GN7FGAJ'BLwwy6'22<G<<<((,,UXXfagg-FG #agg1J1J1L1R1R&RMM%((177FU"KL"#''$rd$w}}oFwwuxx00<G<<<((,,UXXfagg-FGehhvqwwGH&'ggYd2$d177)4V[\c\i\i[j#kL&(TaggYd7==/#JL		6:E:,/	8U,K(E7D//\2W__U%;<	 -L 4F;$A!!%;<< !"t'@'@'B BLLQOO%,QZF#(99 %& 9588FAGG;T$D *4););D)AJ $ K KFTU V + %7~6FFcdnco"pC7 ! $ 0 0 8 # %0 fdjj11'
(?(?
(K'LAN,/	8U,K(E7D//"e#pq )S)|G4H4HQR4T3UUV%WX14LTF2STT -LC  8Z !#%I$&J%K1F-	:v "3y>A#5"6b
CG$$W- $VXJ/G%%g.OOJ/ 2G :""&))F;,?"@ii
+.,_,= >Ne 
 Y!#		@#i.Q
..
,,
 ")A,/ ##N/?/F/F/H#N N (.--446(
	
  ///I
 44;;=B))"''2  >  ,,224R88UXXIw#77))%((288S*AB88EHHf#55))%((3*AB	 5 002!$**dnn=AAC 3 >,,.,.$'	8U$C E7Du}!'+@AAAA4UG<T<TUV1%89 %D }N &9R
 32s   -$AS+9AS0P*,AS5S5
ATr  r  c          	         SSK Jn  [        [        U5      5       Vs/ s H  nSU 3PM
     nnU R	                  UU Vs/ s H
  ot" U5      PM     snUUS9nU(       a  SR                  U5      $ gs  snf s  snf )z
Expected to be used with evaluate_guards_expression(). Produces the guards
for the given placeholders and returns a string expression to be evaluated
by evaluate_guards_expression given concrete values for the placeholders.
r   rG  r  r  rK  N)r'  rH  r9  r3  r  r  )	rY   r.  r  r  rH  rG  	arg_namesr  produced_guardss	            r\   produce_guards_expression"ShapeEnv.produce_guards_expression^  s     	5&+C,=&>?&>qW&>	?--%./Y[^Y/'	 . 
 <<00 @ 0s
   A/A4
c                    U R                   R                  5        VVs0 s H  u  p#[        U5      U_M     nnn[        U[        U5      $ s  snnf )z/
To be used by compile_fx to evaluate symexprs
)r0  rJ  r   evalry   rY   coder  r   rZ   s        r\   evaluate_symexprShapeEnv.evaluate_symexprw  sF     +///*?*?*AB*AA*ABD,-- Cs   A
c                    U R                   R                  5        VVs0 s H1  u  p#[        U5      [        [	        X [
        [        U5      SS95      _M3     nnn[        U[        U5      $ s  snnf )z2
To be used by compile_fx to deserialize symexprs
Nr  )r0  rJ  r   r   r.   r   r  ry   r  s        r\   deserialize_symexprShapeEnv.deserialize_symexpr~  sf     ////1
1 FF71CS4HII1 	 
 D,--	
s   8A*c                    [        [        U5      5       Vs/ s H  nSU 3PM
     nn[        U[        S[	        [        XB5      5      05      $ s  snf )z
Expected to be used with produce_guards_expression(). Evaluates an expression
generated by produce_guards_expression for the given concrete args.
r  L)r9  r3  r  ry   rw  r5  )rY   r  rZ   rG  r  s        r\   evaluate_guards_expression#ShapeEnv.evaluate_guards_expression  sL    
 ',CI&67&6qW&6	7D,d3y3G.H(IJJ 8s   Ar  c               R    U R                  XS9nU(       a  U R                  XB5      $ g)zRGenerate guards for a graph's placeholder values and evaluate the guards with argsr  T)r  r  )rY   r.  rZ   r  r  s        r\   r  !ShapeEnv.evaluate_guards_for_args  s.     --l-X224>>r^   c                l  ^ T Vs1 s HN  n[        UR                  R                  [        R                  5      (       d  M8  UR                  R                  iMP     snmU R
                   Vs/ s H5  n[        U4S jUR                  R                   5       5      (       d  M3  UPM7     nnU$ s  snf s  snf )zm
Get a list of guards, but pruned so it only provides guards that
reference symints from the passed in input
c              3  ,   >#    U  H	  oT;   v   M     g 7frV   rl   )r-  r  symintss     r\   r0  -ShapeEnv.get_pruned_guards.<locals>.<genexpr>  s     )T@S1w,@Ss   )r   r   r   r   rc  r  r4  rz   )rY   r  r  r  r  s    `   r\   get_pruned_guardsShapeEnv.get_pruned_guards  s     ")
!(AJqvv{{ELL,QKAFFKK
 {{
"!c)T@S@S)T&TA{ 	 
 

s   7B,B,,2B1"B1c                   ^ 0 mSU4S jjn[        X5       H  u  pEUc  M
  [        U[        5      (       a
  U" XT5        M)  [        U[        R                  5      (       d   e[        UR                  5       5       H  u  pgU" UR                  U5      U5        M     [        UR                  5       5       H  u  pgU" UR                  U5      U5        M     U" UR                  5       UR                  5       5        M     T$ )a  
Given a paired list of placeholders (fake tensors with
symbolic sizes) and concrete arguments (regular tensors
with real sizes), returns a dictionary mapping each
symbol to its real value.  So for example, if you
have a placeholder with size (s0, s1), binding
(2, 4) to it will give you {s0: 2, s1: 4}.  This is
not guaranteed to bind ALL symbols in the ShapeEnv;
we can't bind a symbol if it doesn't occur in any placeholder,
and symbols that already have replacements won't get bindings.

This is a little duplicative with evaluate_guards but
it's different enough that it seemed cleanest to make
another copy.  This assumes the guards are already checked,
though if it's cheap we'll check for shenanigans
c                  > [        U[        5      (       a  [        U [        5      (       d   eUR                  R                  n[        U[
        R                  5      (       a%  UT;   a  TU   U :X  d   TU    SU  35       eg U TU'   g [        U* [
        R                  5      (       a,  U* T;   a  TU*    U * :X  d   TU*     SU *  35       eg U * TU* '   g g g )Nr<  )r   r   r   r   r   r   rc  )r  r   r  rN  s      r\   bind_symint*ShapeEnv.bind_symbols.<locals>.bind_symint  s    #v&&!#s++++HHMMa..H}'{c1Lhqk]$se3LL1&)ELL11rX~'|t3P!~T3$5PP3(+t!	 2 'r^   )r  r   r   r   r_   r`   )	r5  r   r   r   rJ   r3  rv  rw  rx  )	rY   r.  rZ   r  r  r  rG  r  rN  s	           @r\   r  ShapeEnv.bind_symbols  s    & -/	,  ,-FAy!V$$C#a....!!&&(+CHHQK+ ,!!((*-CJJqM1- .**,a.>.>.@A . r^   c           	         U R                    Vs/ s HH  nU R                  UR                  SUR                  S9  b  M-  U R	                  UR                  5      PMJ     sn$ s  snf )zSReturns a list of guard expressions that aren't statically known (i.e. not trivial)rl   r]  )r  rc  r   r9  r'  )rY   rR  s     r\   get_nontrivial_guardsShapeEnv.get_nontrivial_guards  sj     
$**

2e6J6J +   &DMM%**%$
 	
 
s
   ,A!A!c                N   ^ SR                  U4S jU R                   5       5      $ )zQFormat this shape env's guard expressions with optional traceback info if verboser  c              3     >#    U  H5  nS UR                    T(       a  S[        UR                  5      -   OS 3v   M7     g7f)z - r  r)  N)r   r   r  )r-  rR  verboses     r\   r0  )ShapeEnv.format_guards.<locals>.<genexpr>  s9      
$ %**wcC

O3BGH$s   =A )r  r  )rY   r  s    `r\   format_guardsShapeEnv.format_guards  s'     yy 

 
 	
r^   c                   UR                    Vs0 s H  o3U R                  R                  US5      _M!     nnU(       a=  U R                  UR	                  5       -   H  nXC   c  M
  [        S[        5      XC'   M     [        X5      $ s  snf )zPGiven a sympy expression, computes a ValueRanges bound for what values it can beNrU  )rz   rd  rL  r  r  rG   r;   rD   )rY   r   r9  r  rd  s        r\   rD   ShapeEnv.bound_sympy  s    
 DHCTCTUCTa4,,00D99CTU ^^l&7&7&99?. '2!V&<LO : 4.. Vs   &Bc                6  ^  Uc"  S T R                   R                  5        5       nOU 4S jU 5       nS T R                   5       n[        R                  " XC5      nU(       a  U 4S jU 5       n[        [        R                  U5      R                  5       5      $ )z
Given the symbols in an expression, it returns all the runtime asserts that have those symbols
concatenated with all the guards.
If symbols is None, it returns all the runtime asserts (and all the guards)
c              3  J   #    U  H  o  H  o"R                   v   M     M     g 7frV   r*  )r-  rsr  s      r\   r0  &ShapeEnv.get_axioms.<locals>.<genexpr>  s       !G2QSAQS!Gs   !#c              3     >#    U  HG  nUTR                   ;  d  M  TR                  R                  US 5        H  nUR                  v   M     MI     g7f)rl   N)r0  r  rL  r   )r-  r  r  rY   s      r\   r0  r    sR       ADOO+  66::1bAA  B  s
   A7Ac              3  8   #    U  H  oR                   v   M     g 7frV   r*  )r-  r  s     r\   r0  r    s     )F+Q&&+r  c              3  l   >#    U  H)  n[        UR                  TR                  5      5      v   M+     g 7frV   )rw   r5  r0  )r-  r  rY   s     r\   r0  r    s*      MS&qzz$//'BCCVs   14)	r  rO  r  r  chainr_  rw  fromkeysr  )rY   r  compute_hintruntime_assertsr  r  s   `     r\   
get_axiomsShapeEnv.get_axioms  s     ?!%!>!>!E!E!GO O *G$++)F)2)QMSF T]]6*//122r^   c                  ^ 0 mSU4S jjnU" U5        [        U[        R                  5      (       ab  U" [        R                  " UR                  UR
                  SS95        U" [        R                  " UR                  UR
                  SS95        GO;[        U[        R                  5      (       a  U" [        R                  " UR                  UR
                  SS95        U" [        R                  " UR                  UR
                  SS95        UR                  R                  (       aN  UR
                  R                  (       a3  U" [        R                  " UR                  UR
                  S-
  SS95        OR[        U[        R                  5      (       a3  U" [        R                  " UR                  UR
                  S-   SS95        [        TR                  5       5      $ )zGGiven a expression, it returns a list of predicates that follow from itc                  > [        U 5      n [        U [        R                  [        R                  45      (       Ga  [        U [        R                  5      (       a  [        R                  O[        R                  n[        R
                  T[        U 5      " U R                  U R                  SS9'   [        R
                  T[        U 5      " U R                  U R                  SS9'   [        R                  TU" U R                  U R                  SS9'   [        R                  TU" U R                  U R                  SS9'   g [        R
                  TU '   [        R                  T[        [        R                  " U 5      5      '   g )NFr  )rw   r   r   ra  r  r  r   rb  rf  r  r  )r   r  equivs     r\   add_expr+ShapeEnv.get_implications.<locals>.add_expr(  s    )$/D$588 455 (2$'A'A588uxxHM

d4j488eDEHM

d4j488eDEFKkkhtxxEBCFKkkhtxxEBC $jjd BG,UYYt_=>r^   Fr  r   r   r   r_   r`   )r   r   ra  r  rb  rf  r  r  r  
is_integerr_  rJ  )rY   r  r  r  s      @r\   get_implicationsShapeEnv.get_implications!  s/   
 FH	M& 	a""UXXaeeQUUU;<UXXaeeQUUU;<588$$UXXaeeQUUU;<UXXaeeQUUU;<uuAEE$4$4!%%UCD588$$UXXaeeQUUQY?@U[[]##r^   )r8  r  r9  r  rd  c          
     <  ^ ^ U(       a	  U(       a   eT R                  X5      nU(       a4  UR                  T R                  5      R                  T R                  5      n[	        U5      nSU 4S jjnUc  U" T R
                  5        T R
                  nOw0 nU Hg  n	U	R                  R                  UR                  5      (       d  M/  UR                  [        T R                  T R                  U	5      5      5      5        Mi     U" U5        UR                  U5      nUR                  n
U
(       d$  UR                  (       d  UR                  (       a  U$ Uc  T R                  mO[        U5      m[        U U4S j[        U
[         S9 5       5      n[#        XX$5      nU$ )a  
Tries to evaluate expr without introducing guards

If unbacked_only == True, then we only do substitutions on
unbacked SymInts (leaving regular hinted integers alone).  This could
result in an expression that still contains backed SymInts, which you
could then potentially guard on.

Use compute_hint == True if you are trying to compute a non-binding
hint for the particular hint values of backed and unbacked SymInts,
e.g., if s0 happens to be 3 this run, compute_hint will subsitute s0 with 3.
c                  > TR                   (       d  g STl         0 nU R                  5        HC  u  p#UR                  [        5      (       d  M!  UR	                  TR                  U5      U05        ME     U R	                  U5        g r  )r  rJ  r  r5   r:  r'  )r  	new_itemsrO  rP  rY   s       r\   resimplify_floor_div=ShapeEnv._maybe_evaluate_static.<locals>.resimplify_floor_divk  sg    4405D-I 55??$$dmmA&6%:; ' MM)$r^   c              3     >#    U  HH  n[        UTR                  U5      TR                  R                  U5      UTR                  ;   5      v   MJ     g 7frV   )r,  rL  r0  r  )r-  r  rY   
var_rangess     r\   r0  2ShapeEnv._maybe_evaluate_static.<locals>.<genexpr>  sS      
 ) q!##A&T^^#	  )s   AArI  )r  zdict[sympy.Expr, sympy.Expr]r_   r`   )r'  r5  r0  r  rw   r  rz   re  r:  rw  r  r  
is_Booleanrd  r_  rK  r   rA  )rY   r   r8  r  r9  r  rd  r  substr  rT  r7  r  r  s   `            @r\   rc  ShapeEnv._maybe_evaluate_staticJ  sJ   2  v--}}T2==1::4;S;STD%d+	%  > -KKEE>>**4+<+<==LLd&;&;DMM!<L&M!NO  !'}}U# t~~K**Jl+J 
 BC(
 
 *}
 r^   c                    0 nUR                    H0  nU R                  U5      nUR                  (       a  XC:w  d  M,  XBU'   M2     U(       a  [        UR	                  U5      5      $ U$ )z@Apply symbol replacements to any symbols in the given expression)rz   r  r  r*  r5  )rY   r   r  r  r  s        r\   r  ShapeEnv.replace  sX     ""A

1A ;;!&"#Q # t}}\:;;Kr^   c                    [        5       nU R                   H8  nU R                  U5      nUR                  (       a  M'  UR	                  U5        M:     Xl        U R                  5         g rV   )r8  r  r  r  r  rf  )rY   new_divisiblerO  r  s       r\   _update_divisibleShapeEnv._update_divisible  sN    A,,q/C===!!!$  
 '$$&r^   c                  ^  [        U5      nT R                  U5      nU(       Ga
  UR                  [        5      (       a  0 nUR	                  [        5       H  nUR
                  u  pVUS:X  d  US:X  a  XepeUS:X  d  US:X  d  M-  [        U[        5      (       d  MD  [        UR                  5      S:X  d  M_  UR                  [        UR	                  5       5      :X  d  M  [        U 4S jUR                   5       5      (       d  M  XcU'   M     U(       a  UR                  U5      n[        U5      nUR                  [        5      (       a  T R                  5         0 nUR	                  [        5       H  nUR
                  u  p[        U	[        5      (       d  M(  U	R
                  u  pT R                  [        X5      5      T R                   ;   d  M`  X:X  d  Mg  T R                  [        X5      5      T R                   ;   d  M  XU'   M     U(       a  UR                  U5      n[        U5      nUR                  [        5      (       Ga  0 nUR	                  ["        R$                  5      nUR	                  ["        R&                  5      R)                  UR	                  ["        R*                  5      5      nUR	                  [        5       HH  nUR
                  u  pT R                  [        X5      5      T R                   ;   d  M;  [-        X5      X~'   MJ     U(       a  UR                  U5      n[        U5      nUR	                  ["        R$                  5      nUR	                  ["        R&                  5      R)                  UR	                  ["        R*                  5      5      nUR/                  U5      (       a  UR/                  U5      (       a  UnU$ )zAUse known constraints and replacements to simplify the given exprr   r   rU  c              3  @   >#    U  H  oTR                   ;   v   M     g 7frV   )r  )r-  r  rY   s     r\   r0  $ShapeEnv.simplify.<locals>.<genexpr>  s     L^T^^ 3^s   )r*  r  r  r8   r  rZ   r   rN   r3  rz   r8  r4  r5  r5   r  r9   r  r   PowRationalr  r   r4   re  )rY   r   r9  max_replacementsatomr  r  div_replacementsr  r  base1divisor1pows	rationalsfdr?  new_powsnew_rationalss   `                 r\   r'  ShapeEnv.simplify  s    4 ||D!dhhsmm!

3yy6Q!Vq6Q!V"1c**/14NNc!'')n<LQ^^LLL12. (  }}%56"4( 88H""$!

8, $		gx00&-llOES%78DNNJ M LLU)=>$..P19. -  }}%56"4(88H!::eii(D

5>>2==djj>WXIjj* "<<D 23t~~E+3D+B$( +  ==)9:&x0#>>%))4 (u~~ > I INN5==1! $$T**}/E/Ei/P/P#Dr^   r$  
allow_nonec                 ^^
 [        T5      R                  U R                  5      nUR                  (       Gd  SSKJn  [        X45      (       a  gU R                  USS9nUb  U$ U(       a  gU R                  (       a  UR                  U R                  5      nUR                  U R                  R                  5        VVs0 s H  u  pxU[        US5      _M     snn5      n	UR                  (       dH  U	R                  (       d7  Xi:X  a  [        R                  STU5        U$ [        R                  STUU	5        O[        R                  S	TUU	5        U R                  (       a  UR                  U R                  5      m
T
R                  (       dU  [        R                  S
TT
5        [!        SUU
4S jS9  U R#                  [$        R&                  " UT
5      SU ST
 35        T
$ U R)                  UT5      eU$ s  snnf )z
Gets a size hint for a given expression from the underlying shapes we had.
Does not introduce a guard, so only use this when you can guarantee that
your code is still valid for arbitrary shapes (such as optimization decisions)
r   r>   NT)r  rU  zoblivious_size hit %s -> %sz3oblivious_size counterfactual failed %s -> %s != %sz1oblivious_size miss %s -> %s (counterfactual: %s)z*propagate_real_tensors size_hint(%s) -> %spropagate_real_tensorsc                    > [        T 5      [        T5      [        R                  " [        R                  " SS9R                  5       5      S.$ Nr   r  )r   rj  rg  r   r$   r  rH   r  r  )r   unsound_exprs   r\   rA  $ShapeEnv.size_hint.<locals>.<lambda>9  s<    $(J&*<&8%/%>%> 1 9 9q A I I K&-r^   r  propagate_real_tensors: r  )r*  r5  r0  r   torch.utils._sympy.singleton_intr?   r   rc  r  rJ  r{  rz   r   r[  r  r)  r%   defer_runtime_assertr   ra  _make_data_dependent_error)rY   r   r  result_exprr?   r  correct_hintrO  rP  counterfactual_hintr  s    `        @r\   	size_hintShapeEnv.size_hint   s    "$'00A$$$E+44++Kd+KA}((*33D4M4MN&1&:&:.2.G.G.M.M.OP.OdaQAq	\.OP'# %11/<<#:!>lS++Q (/	 HHK$+	 ''*33D4L4LM#00KKDdL %0%	 --l;2;-tL>R ('11+tDD_ Qs   G9
c                    [        U5      R                  U R                  5      nUR                  =(       d    U R	                  U5      S L$ rV   )r*  r5  r0  r  rc  )rY   r   r  s      r\   r   ShapeEnv.has_hintK  sB    !$'00A!! D**;7tC	
r^   size_oblivious_resultexpr_sym_node_idc               v  ^ ^^ / nTR                    Hn  nSR                  T R                  U   R                  5       5      nT R                  R                  SXg5        UT R                  ;   d  M]  UR                  U5        Mp     SnUb  SU S3nT R                  S5      u  pTR                  (       a  SnOSnU ST S	T S
SR                  [        [        U5      5      =(       d    S SU SU	 SSR                  [        [        TR                   5      5       S3U
-   n[        SUU U4S jS9  [        TU5      $ )Nr)  z-Data dependent variable '%s' allocated at:
%szNATTENTION: guard_size_oblivious would fix the error, evaluating expression to zb.
Maybe you need to add guard_size_oblivious to framework code, see doc below for more guidance.

TzDCould not extract specialized integer from data-dependent expressionz,Could not guard on data-dependent expressionr  z (unhinted: z).  (Size-like symbols: rr  nonez)

zCaused by: z
For more information, run with TORCH_LOGS="dynamic"
For extended logs when we create symbols, also add TORCHDYNAMO_EXTENDED_DEBUG_CREATE_SYMBOL="r  z"
If you suspect the guard was triggered from C++, add TORCHDYNAMO_EXTENDED_DEBUG_CPP=1
For more debugging help, see https://docs.google.com/document/d/1HSuTTVvYH1pTew89Rtpeu84Ht3nQEFTYhAX3Ypa_xJs/edit?usp=sharing
guard_on_data_dependent_errorc            	        > [        T 5      [        T5      TR                  [        R                  " [        R
                  " SS9R                  5       5      S.$ )Nr   r  )r   unhinted_exprexpr_idrg  )r   r  r$   r  rH   r  r  )r   rY   r  s   r\   rA  5ShapeEnv._make_data_dependent_error.<locals>.<lambda>  sE    T
!%m!411#22%--15==?	!r^   r  )rz   r  r  formatr   r   r  r  r  r  r  r   r"   rQ   )rY   r   r  r	  r
  size_like_symbolsr  
stacktracesize_oblivious_result_msgr  r  descrf  s   ```          r\   r   #ShapeEnv._make_data_dependent_errorS  se    ""A!2!21!5!<!<!>?JHHNN@! DNN"!((+ # %'! ,`av`w xu u & #'"9"9$"???V  BDfAdV< 7##'99S6G-H#I#SV"TTY()$  : ;>((3sDL]L]C^:_9` aq	q  
  	  	+
	
 +455r^   r  c               z   UR                   UR                  peUS:  a  XR                  ;   a  [        US5      nXR                  ;  aW  U R
                  R                  SX5        X R                  U'   Uc  U R                  5       n[        Xw5      nX0R                  U'   OU R                  U   nX-  n	X:w  a  Uc  U R                  5       n[        Xw5      nU	R                   UR                   :w  a  UR                   U R                  U   l         U	R                  UR                  :w  a  UR                  U R                  U   l        XR                  U'   U R
                  R                  SX5        U R                  R                  U5      =n
b/  U R                  U   nX;  a  U(       d  X;   d   U
 SU 35       eg g g g )NrU  z"_update_var_to_range %s = %s (new)z%_update_var_to_range %s = %s (update)z not in )r  r  r  rG   rd  r   r   r  r   r  r0  rL  )rY   r{  r  r  r  r  r  r  r@  r?  rP  r  s               r\   r  ShapeEnv._update_var_to_range  s    xxu 19>>1UA&B ***HHNN?L(*f%~~')$5-4""6*##F+C(Cz?>>+D-d9G99		);B==D**62899		);B==D**628,/!!&)FT$$V,,A9!!&)Az %64aS#446 %	  :r^   c                  ^ ^^^^ TT R                   R                  TS5      :X  a  gTTR                  ;   a  g[        T[        R
                  5      (       d   eT R                  (       a  [        T5      (       d  gSnTT R                  ;   Ga  T R                  T   nT R                  T5      nT R                  TU5        UR                  U5      (       Gd  [        TR                  5      S:X  a  [        [        TR                  5      5      n[        [        R                   " TT5      USS9nUb  T R"                  R%                  SUTTU5        T R                  US   5      n['        [)        UR*                  5      [-        UR.                  5      5      n	T R                  XiT R0                  T   5        T R                  T5      nUR                  U5      (       d   SU< SU< 35       eTT R2                  ;   a;  [        T[        R
                  5      (       a  T R2                  R5                  T5        OJ[        T[        R
                  5      (       a+  TT R2                  ;   a  T R2                  R5                  T5        UR                  U5      (       d!  T R"                  R%                  STTTUU5        gTT R2                  ;   aW  T R                  TS	S
9n
T R                  TS	S
9nU
R                  U5      (       d!  T R"                  R%                  STTTU
U5        g[        T[        R6                  [        R8                  45      (       a  [:        R<                  " 5       m[?        SUUU UU4S jS9  [@        RB                  (       aU  T R"                  RE                  ST RF                  T   S   RI                  5       T5        T R"                  R%                  SS	S9  ["        RK                  STTTU5        TT R                   T'   TT RL                  ;  a  T RO                  5       T RL                  T'   T RQ                  5         T RS                  [        R                   " TTSS95        g)z_
Adds or updates a replacement for a symbol.
Use this instead of `self.replacements[a] = tgt`.
Nr   Ffloordiv_inequalityz2set_replacement: solve for %s in %s == %s gives %sz
tgt_bound=z not a subset of src_bound=z:skipped set_replacement %s = %s (%s) [%s not subset of %s]Tr9  zVskipped set_replacement %s = %s (%s) [%s not subset of %s (size-oblivious conditions)]symbolic_shape_specializationc            
     Z  > [        T5      TR                  R                  T/ 5       V s/ s H  o R                  5       PM     sn [        T5      T[        R
                  " [        R                  " SS9R                  5       5      T(       a  [        R
                  " T5      S.$ S S.$ s  sn f )Nr   r  )r{  r|  r  reasonrg  r  )	r   r1  rL  r  r$   r  rH   r  r  )r  r  rf  rY   tgtuser_tbs    r\   rA  +ShapeEnv._set_replacement.<locals>.<lambda>G  s    "1g262E2E2I2I!R2PQ2PQ2PQ!#Y!'66)11q9AAC ?F
11':% LP%Qs   B(r  zSpecializing %s to %sr   SPECIALIZATIONr  zset_replacement %s = %s (%s) %sr  )*r  rL  rz   r   r   rc  r  r  rd  rD   r  re  r3  r  r  r@   ra  r   r   rG   r3   r  r6   r  r  r  r  r   r'  r!   r  r%   r`  print_specializationsr)  r1  r  r[  r  r  rf  r5  )rY   r  r!  rf  	tgt_bound	src_boundr  r  rat_b_boundb_boundtgt_bound_sosrc_bound_sor"  s   ````        @r\   r  ShapeEnv._set_replacement  s   
 $##''400    !U\\**** 88-c22 	!!!))!,I ((-I%%a3 %%i00S9I9I5Ja5Oc../0ehhq#.uM=HHNNL #'"2"21Q4"8K)!+"3"34jARAR6SG --a$:P:PQR:ST $ 0 0 5I$--!  D$)%AylCD , DNN"z#u||'D'D""3'C..3$..3H""1% %%i00P dnn$#//D/I#//$/G#,,\::HHNNL$$ cEMM5;;788 %224G/   ++  +T-@-@-CA-F-K-K-Ms /DA2AsCK"! D+++)-)9D##A&$$& 	ehhq#>?r^   c                Z    U R                   R                  U5        U R                  5         g rV   )r  r  rf  rl  s     r\   _add_divisibleShapeEnv._add_divisibleg  s     4 $$&r^   c                2   XR                   ;  a  U$ U R                   U   nUR                   Vs0 s H  o3U R                  U5      _M     nnU R                   U   R                  U5      u  pVU(       a  U R	                  XS5        U R                   U   $ s  snf )z
Implements a DSU-like algorithm to find the variable that represents a
Also handles transitive non-identity replacements.

a: b + c
c: d
find)r  rz   r  	_xreplacer  )rY   r  r  r  cur_replacereplacedchangeds          r\   r  ShapeEnv._findk  s     %%%H"141A1AB1AA$**Q-'1AB --a0::;G!!!v6  ##	 Cs   Bc           	     2	  ^  [        U[        R                  5      (       d   e[        U[        R                  5      (       a  g[	        UR
                  5      n[        U5      S:  d
   SU 35       e[        U5      S:  a  gSU 4S jjn[        X#SS9nUR                  nUR                  nT R                  U5        [        U[        R                  5      (       d  gUR                  [        5      (       GdO   UR                  [        5      R!                  UR                  [        5      5      n[        U5      S:  a  [#        S U 5       5      (       a  [$        eSS	 jnU" XE5      (       a#  T R'                  UT R)                  U5      S
5        OU" XT5      (       a#  T R'                  UT R)                  U5      S5        O[+        XS   SS9nUbv  [-        S [        R.                  " US   5       5       5      (       aH  T R)                  US   5      n	[        [1        U	5      5      S:H  n
U
(       a  T R'                  US   U	S5        UR                  [        5      (       Ga  [3        [5        UR                  [        5      5      5      n [+        XSS9nUGb  US   S:X  Ga  T R7                  U5        UR8                  u  p[        U[        R:                  5      (       Ga  [        U[        R<                  5      (       Gav  [        UR8                  5      S:X  Ga\  UR8                  u  p[        U[        R:                  5      (       Ga.  [        U[        R>                  5      (       Ga  T RA                  U5      (       a  U[        RB                  " X5      -  nT RE                  5       RF                  RH                  nT RK                  U[L        RN                  " T RP                  U   [R        RT                  " U5      5      5        UT RV                  ;   a"  T RY                  UT RV                  U   U-  5        UT RZ                  ;   a  T RZ                  R]                  U5        T R'                  UUU-  S5        gg! [$         a     GN?f = f! [$         a     gf = f)zr
The relational guard is guarded to be true.  Use this information to
simplify shapes (i.e. a == b or a % 5 == 0)
Nr   z3The expression should not be static by this point: r  c                  > U TR                   ;   =(       a    [        S TR                   U     5       5      nTR                  U SS9nUc  [        R                  nO\[        U [        R                  5      (       a-  [        U[        R                  5      (       d   e[        U5      nO[        R                  nU R                  nU(       a  SX44$ SX44$ )Nc              3  @   #    U  H  oR                  5       v   M     g 7frV   )r  r  s     r\   r0  HShapeEnv._maybe_guard_rel.<locals>._smart_symbol_sort.<locals>.<genexpr>  s      J*@Q  *@r2  Tr  r   r   )r1  r4  r  r   r   rB   rC   ru  r   r   r  r   r  )r  has_only_ephemeral_sources	hint_sizerv  r  rY   s        r\   _smart_symbol_sort5ShapeEnv._maybe_guard_rel.<locals>._smart_symbol_sort  s    )*d.A.A)A *c J*.*=*=a*@J G& qT:I {{499--!)UZZ88889~{{66D3ADGGDGGr^   T)rJ  rh  c              3  >   #    U  H  oR                   S :g  v   M     g7frg  r   rA  s     r\   r0  ,ShapeEnv._maybe_guard_rel.<locals>.<genexpr>  s      4,;qIINOs   c                    [        U [        R                  5      (       aA  [        U 5      (       a  [        U5      (       d  g[	        U [
        R                  5      (       a  ggr  )r   r   rc  r  rB   rC   r  )rb  rf  s     r\   trivial_solve0ShapeEnv._maybe_guard_rel.<locals>.trivial_solve  sL    !#u||44055>S? ? $()#tzz::#' !r^   trivial_lhstrivial_rhsFr  c              3  8   #    U  H  oR                   v   M     g 7frV   )r  )r-  r  s     r\   r0  r@    s      -.L.Lr  r   r.  rU  divisibility)r  r5  r_   ztuple[int, int, str])rb  r   rf  r   r_   r   )/r   r   r  r  r  rz   r3  rK  rb  rf  _refine_rangesra  r  r9   r  r5   r  r  r(  r  r  r@   r4  preorder_traversalr  r  r  r.  rZ   Numberr  rc  rq  r  r  r   r   r  rE   floordivrd  rG   wrapr  rC  r  r  )rY   r   freer=  rb  rf  floor_div_atomsrB  r  r  okmod_exprpqrG  i0di1s   `                 r\   _maybe_guard_relShapeEnv._maybe_guard_rel~  s    $		****
 dEHH%%D%%& IM	H@G	H t9q=	H" dDAhhhhD! $))xx}}0"%))H"5";";CIIh<O"P'!+ 4,;4 1 1 .- 
! !**))#tzz#N"3,,))#tzz#N!$QUKA} -.3.F.Fqt.L- * * #'**QqT"2 !6w!?@AE 11$q'7GL 88C==DC12H+d%H=QqTQY''1 $==DA"1ell33&q%))44K1, ! 'q%,,77 *2u|| < < $ 7 7 ; ; !"EIIaO 3A!%!<!<!>!C!C!H!HB !55 " 7 @ @$($5$5b$9;;K;KA;N!"  "T%=%== $ < <$&(@(@(D(I!"  "T^^3 $ 2 22 6 11"a"fnM 	a ' \ ' s3   8BQ8 /Q8  BQ8 	G-R	 8
RR	
RRc                Z    U(       d  U R                   (       d  SOSn[        U[        5      $ )Nr   rU  )r  rG   r;   )rY   rs  r  s      r\   r  ShapeEnv._default_value_range  s#     18P8PWX5&))r^   c                ,    [         R                  " 5       $ rV   )rG   unknown_intr   s    r\   r  )ShapeEnv._default_unspecified_value_range  s    &&((r^   c                   [        UR                  [        5      5      n[        U5       HD  nUR                  u  pE[        XE5      n[        R                  " US5      nU R                  U5        MF     U R                  U5      $ r  )
r_  r  r5   r  rZ   r9   r   ra  ro  r'  )rY   r   
floor_divsr  r  r  rP  eq_exprs           r\   _simplify_floor_divShapeEnv._simplify_floor_div   sj    4::h/0
 :&BGGMD4)Hhhx+Gw' ' }}T""r^   c                   U R                   (       ay  U R                  S==   S-  ss'   [        SS0 U R                  EU SU 3SS.E5        [        R                  SUU[        R                  5       [        R                  :  a  S	OS
S9  g g )Nignored_backward_guardr   re  evaluate_expr_frozenr  rU  )ignored_guardversionz>Ignored guard %s == %s, this could result in accuracy problemsTFr  )	r  r  r'   r  r   r[  getEffectiveLevelr   WARNING)rY   r   rx  s      r\   _check_frozenShapeEnv._check_frozen0  s    ;;LL12a72&nn(,vT,%@  !
 HHP#&#8#8#:W__#L4RW   r^   c                   UnUc  [         R                  " 5       n Ub~  UR                  R                  [	        5       ;  aK  [
        R                  " UR                  R                  UR                  UR                  R                  5      nOUR                  nUb  M~  AS n[        R                  " 5       nU(       aa  [        U5      S-
  nUS:  aA  Xg   R                  [	        5       ;   a'  US-  nUS:  a  Xg   R                  [	        5       ;   a  M'  [        Xg   SS9nSnU(       a/  U(       a(  SSR                  [
        R                   " U5      5      -   nU(       aO  ["        R$                  (       a:  [&        R(                  " SS9n	USSR                  U	R+                  5       5      -   -  nOU(       a  US	-  n[-        X55      U4$ ! Af = f)
Nr   r   T)liner)  zM
User Stack (most recent call last):
  (snipped, see stack below for prefix)
)r   z
C++ stack trace:
z?
For C++ stack trace, run with TORCHDYNAMO_EXTENDED_DEBUG_CPP=1)r  r  r  r  r	  	tracebackFrameSummaryr  co_namer  r!   r  r3  filenamerI   r  format_listr`  extended_debug_cpprH   r  r  r   )
rY   r  framework_locflocr  maybe_user_locr"  r<  r  	cpp_stacks
             r\   r  ShapeEnv._get_stack_summaryF  s    >K<((*E'||//7J7LL(55!LL44!NN!LL00 
 !LLE '   ..0g,"C'gl337J7LLq 'gl337J7LL)',TBN>'')//89: 
 11)11d;I!7"'')BRBRBT:U!UUR D)+<<<7 s   A?G Gc                (    U R                  US9u  p#U$ )N)rs  )r  )rY   rs  r  rG  s       r\   r  ShapeEnv._get_slocu  s    )))Fr^   c                6  ^ ^^ 0 n0 m[        5       =n b  UR                  R                  S:X  a
  [        5       $ [	        [
        R                  " UR                  5      5      n[        R                  " UR                  5      u  pESu  pgn[        U5       H9  u  pU
R                  b  U
R                  nXR                  :w  a  M/  Uc  U	=pgM7  U	nM;     Ub  Uc
  [        5       $ S	UUU 4S jjmUR                  nX6US-     H  n
U
R                  =nb  [        X5      n[        U
R                  [        5      (       d  M>  U
R                  UR                   ;   d  MZ  ["        R$                  " TUR                   U
R                     5      XR                  '   M     XBR                  U-
  US-   U-
   n['        US   5      ['        US   R)                  5       5      -
  nSR+                  U Vs/ s H  oUS PM	     sn5      R-                  5       n[        UUTS9$ s  snf )
z|
Given the current user code frame, finds the relevant lines of code,
values of symbolic locals, and free symbols involved.
Nr   )NNNc                  > [        U [        R                  5      (       a  U R                  5        H  nT" U5        M     U R	                  5        H  nT" U5        M     T" U R                  5       5        SU R                  5        SU R	                  5        SU R                  5        S3$ [        U [        [        [        45      (       a  U R                  R                  R                   HR  n[        U5      T;   a  M  UTR                  ;   d  M&  TR                  U   S   R                  5       T[        U5      '   MT     [        U 5      $ g )NzTensor(shape: z
, stride: z, storage_offset: r  r   )r   r   rJ   rv  rw  rx  r   r   r   r   r   rz   r   r1  r  )r  ri  r  frame_symbolsrE  rY   s      r\   rE  'ShapeEnv._find_frame_locals.<locals>.go  s   !U\\**AqE "AqE $1##%&$QVVXJ / xxzl +''('7'7'9&:!=
 A:;;11A1v. D///040C0CA0Fq0I0N0N0Pc!f-	 2
 1vr^   r   r   r)  )r  r  r  )r  r   r_   r  )_find_user_code_framer  r  r  r  disBytecoder  getsourcelinesr3  starts_liner  r{  r   argvalr   f_localsrY  tree_mapr3  lstripr  rx  )rY   frame_localsr  instructionsco_linesr>  startendr   rG  instrlast_linenolinenolocsindentr  	frame_locr|  rE  s   `                @@r\   _find_frame_localsShapeEnv._find_frame_localsy  s   
 (*(* +,,E\\--;$&& CLL67"11%,,?*C!,/HA  ,''nn$} 0 =CK$&&	 	, nn!#'2E+++8!+6%,,,,1O-3__u||4.\\*	 3 /+/F2JKT!WDGNN$4 55GGT:Tc\T:;AAC	 ,
 	
 ;s   (Hc           
       ^ ^ [        SUU 4S jS9  [        SU4S jS9  T R                  R                  [        R
                  5      (       a  [        T5      n[        R                  S L=(       a    U[        R                  :H  nT R                  U5      u  pgSnU(       d  SU S3nT R                  R                  S	U(       d  UOU S
3UUUUUS9  g g )Nguard_addedc            	     X  > [        T5      [        R                  " [        R                  " SS9R                  5       5      TR                  R                  5        V Vs0 s H#  u  pUTR                  ;   d  M  [        U5      U _M%     snn [        TR                  5       5      S.$ s  snn f )Nr   r  )r   rg  symbol_to_sourcesr  )r   r$   r  rH   r  r  r  rJ  rz   r   r  )rO  rP  r  rY   s     r\   rA  %ShapeEnv._log_guard.<locals>.<lambda>  s    A#22%--15==?
 !% 2 2 8 8 :& :ANN* CFAI :&
 !'t'>'>'@ A!
&s   B&
8B&
r  guard_added_fastc                    > [        T 5      [        R                  " [        R                  " 5       5      [        R                  " [
        R                  " SS9R                  5       5      S.$ )Nr   r  )r   r  rg  )r   r$   r  r!   r  rH   r  r  )r  s   r\   rA  r    sK    A(778T8T8VW#22%--15==?!r^   r)  zA, for more info run with TORCHDYNAMO_EXTENDED_DEBUG_GUARD_ADDED=""z%s %s [guard added] %s%s%sz (forcing_spec)r  )r"   r%   r   r   r   INFOr   r`  extended_debug_guard_addedr  r[  )	rY   r  r  forcing_specstr_gr  r  r  r  s	   ` `      r\   
_log_guardShapeEnv._log_guard  s    	
 			
 88  ..FE11= ?V>>>  '+&=&=h&G#D O??DgQH   HHMM,*6(/0J!#   /r^   r  c                    [        U5      U l        U R                  UR                  UR                  UR
                  U5      $ )zI
Given a a SymNode, evaluates sym_node.expr, adding guards if necessary.
)r  r  ro  r   r]  r  )rY   r   r9  s      r\   evaluate_sym_nodeShapeEnv.evaluate_sym_node  s:     "$H!!MM8==(*:*:N
 	
r^   )save_tracked_fakesr  c                    U R                  UUUUUS9$ ! [         a!    U R                  R                  SUUUU5        e f = f)Nr  zKfailed during evaluate_expr(%s, hint=%s, size_oblivious=%s, forcing_spec=%s)_evaluate_exprrd  r   r)  )rY   r  r]  r  r9  r  s         r\   ro  ShapeEnv.evaluate_expr  se    	&&) '    	HH] 	s	    +A c                 ^ ^^^ [        T[        R                  R                  R                  [        R                  R                  R
                  45      (       a  T$ [        R                  " S5      SUUU 4S jj5       nSnSnT R                  (       Ga>  UGb:  T R                  5       (       Gd$  U(       Gd  [        S TR                   5       5      (       d  U" 5       n	U	[        R                  L a$  T R                  [        R                  U45      u  pxOU	[        R                   L aG  T R                  ["        R$                  U45      u  pT R                  [        R                  U
45      u  pxOFT R                  ["        R&                  X945      u  pT R                  [        R                  U45      u  pxUc   eU(       a  T R)                  U5        Sn TR*                  (       as  T R,                  R/                  ST5        TbR  [        T[0        5      (       a  TT:X  d   T ST 35       e T$ [        R2                  " TT5      (       d   T ST 35       eT$ TnT R5                  XS9nUb]  T R,                  R/                  SU(       a  S	T S
3OUU5        U(       d*  [6        R8                  (       a  Tb  UT:X  d   U ST 35       eU$ SnSn	UR                  T R:                  R=                  5       ::  Gd  T R5                  USS9nUc   eUR                  T R:                  R=                  5       ::  Gd  SnU(       d  T R5                  USS9nSnT R>                  (       a  TRA                  T R>                  5      =nR                  (       d|  TRA                  T R>                  RC                  5        VVs0 s H  u  nnU[E        SU5      _M     snn5      =nR                  (       d!  UU:X  a  [,        RG                  STU5        Un	SnU(       d  T RH                  (       a  TRA                  T RH                  5      RA                  T R:                  5      =mR                  (       d<  [,        RK                  STT5        [M        SUU4S jS9  [O        SUU U4S jS9  SnTn	SnU(       d5  T RQ                  URA                  T R:                  5      UUT RR                  S9eOUnU	c  U" 5       n	T RU                  X5        [6        RV                  (       aZ  [        T[0        5      (       aE  [        U[        R2                  [        RX                  45      (       a  [        RZ                  " U5      nU	[        R                  L a  []        [^        U5      nO@U	[        R                   L a  [        RZ                  " U5      nO[        R2                  " X5      nU(       a  T Ra                  UST SU	 35        U	$ T R                  5       (       d  T Rc                  SUUS9  [        U[        Rd                  5      (       a  T Rg                  U5        T Rh                  (       dw  [k        UT Rm                  5       US9nT Rn                  Rq                  U5        T Rr                  Ru                  [w        T Ry                  T R{                  U5      5      5      5        O'T Ra                  UST 35        OT Rc                  SUUS9  T R                  5       (       d  Ub  UR                   H  nT R|                  U==   S-  ss'   U(       a  M#  [6        R~                  c  M6  T R|                  U   [6        R~                  :  d  MY  T R,                  RG                  S[6        R~                  U5        T R                  USS9  M     U	$ s  snnf ! [         a    U(       a  T R                  U5        e f = f)z?
Given an expression, evaluates it, adding guards if necessary
Nc                 f   > Tc  TR                  T5      n U c   eU $ [        R                  " T5      $ rV   )r  r   rQ  )r  r]  r  rY   s    r\   compute_concrete_val5ShapeEnv._evaluate_expr.<locals>.compute_concrete_val6  s6    | NN9-}$}}}T**r^   Fc              3  V   #    U  H  n[        U[        R                  5      v   M!     g 7frV   )rB   rC   r  r  s     r\   r0  *ShapeEnv._evaluate_expr.<locals>.<genexpr>S  s      V?U!q$**55?Us   ')zeval %s [trivial]r<  r  z eval %s == %s [statically known]zsize_oblivious(r  Tr8  rU  z/oblivious_size %s -> %s (passed counterfactual)z.propagate_real_tensors evaluate_expr(%s) -> %sr  c                    > [        T 5      [        T5      [        R                  " [        R                  " SS9R                  5       5      S.$ r  r  )r  unsound_results   r\   rA  )ShapeEnv._evaluate_expr.<locals>.<lambda>  s<    (,Y*.~*>)3)B)B$5$=$=1$E$M$M$O*"1r^   r  !propagate_real_tensors_provenancec                 l  > [        T5      [        T5      TR                  [        R                  " S5      [        R                  " S5      TR
                  R                  5        V Vs0 s H#  u  pUTR                  ;   d  M  [        U5      U _M%     snn [        TR                  5       5      S.$ s  snn f )Nr  )r   rj  expr_node_idr  rg  r  r  )r   r  r$   r  r  r  rJ  rz   r   r   r  )rO  rP  r  rY   r  s     r\   rA  r    s    (,Y*.~*>040F0F.8.G.G.J)3)G)G)J 150B0B0H0H0J6"0J'(I,B,B'B %.CFAI0J6"
 17t7N7N7P0Q16"s   (B0B0r  r  r  r  r  zevaluate_expr: zeval [guard suppressed]r   z6symbol_guard_limit_before_specialize=%s exceeded on %s)r_   rS   )Cr   r   r  r  r  r  r   r   r  rX  r  rz   r  rH  r   _assertr  rg  not_rp  rT  r  r   r   r   ra  rc  r`  rv  r0  r  r  r5  rJ  r{  r[  r  r)  r%   r"   r   r  ri  /inject_EVALUATE_EXPR_flip_equality_TESTING_ONLYr  r  r   r   r  r  r  rV  r  r   r  r  r  r  r:  rw  r  r'  r  $symbol_guard_limit_before_specializero  rd  rO  )rY   r  r]  r  r9  r  r  r   rG  rx  r  rG  eqlrR  r   static_exprtransmute_into_runtime_assertr?  r	  rO  r  rO  rP  r  r  r  r  s   ```                       @r\   r  ShapeEnv._evaluate_expr   s0    [[  ,,ekk.A.A.N.NO
 
  
		T	"	+ 	+ 
#	+* 000#--//"Vy?U?UVVV 01Luzz)";;EMMG:Ve,66x}}wjQ";;EMMC6Re66KK'!8 #;;EMMC6R###
 **40 R	E""2I>#!$--(D0JYKtD62JJ0 !   %xx	488RYKtD6:RR8  D55 6 K &6% &i[2' '44( '$.J;-tD60JJ."",1)L%%)=)=)??  66t46P+++ --1E1E1GG,0))040K0K  1L 1- B 11,5,>,> $ 9 9- L ',	!' 4=3E3E 150I0I0O0O0Q!"0Q1 %&s1ayL0Q!"4 / ',!' ),?? M%(
 (4!  44.7.@.@ $ 8 8/&ht78N ',	!' L%*
 )4)	 *?)  9=5'5!"== MM$//: 2G-1-C-C	 >    $D#35t2 FFtT**tehh%9::yy uzz)t,,IIdOHHT0,))1)DO $#,,..Ea++ ))!,CC '4>>+NE KK&&u-KK&&tD,A,A$--PQBR,S'TU
 --a?9+1NO 91<X ,,..$^^11!494 !- & K K W $ 9 9! <$II!J !HHMM X & K K !
 !..qt.D ," q!"@  	$$T*	s;   A^< 2)^< A0^< C+^< 8^6
H ^< 3D^< 6^< <$_ c                    U R                   R                  5        H  nUR                  5         M     U R                  R                  5        H&  nU H  nUR                  R                  5         M     M(     g)z
Break reference cycles.

This destroys the stacks. If you really want to keep them, we
just need some way to break references on code objects.
N)r  rO  cleanupr  rg  )rY   r  r  r  s       r\   r  ShapeEnv.cleanupI  sY     ""))+AIIK ,00779C  "  :r^   c           	     <   UnU R                  U5      nUb'  U R                  R                  SX5        [        U5      $ U R                  USS9nUc   eU R                  (       d7  UR
                  U R                  R                  5       ::  a  U R                  XcS9$ U R                  (       aX  UbU  U R                  5       (       d@  U R                  [        R                  U45      u  pxUc   eU(       a  U R                  U5        U R                  5       (       Gdr  U R                  SUSS9  U R                   (       a  [        R#                  S	U5        U R%                  U[&        R(                  5        [+        U[&        R,                  5      (       a  U R/                  U5        Un[1        U5      n[2        R4                  " S
S9n	[7        XBU	5      n
[9        S UR
                   5       S S9nU(       a  US   OSnU R:                  R=                  U/ 5      R?                  U
5        U R@                  RC                  [E        U RG                  U RI                  U5      5      5      5        U =RJ                  S
-  sl%        U RM                  5         gU R                  SUSS9  g)a!  Create an assert that is checked at runtime

Args:
    orig_expr (sympy.Expr): Boolean expression to assert is true
    msg (str): Message to display on assertion failure
    fx_node (Optional, torch.fx.Node): node in ``self.graph`` corresponding
        to the expression, if applicable

Nz*runtime_assert %s == %s [statically known]Tr  r  runtime_assertFr  z&runtime_asserts_frozen but then got %sr   r  c              3  h   #    U  H(  n[        U[        R                  5      (       d  M$  Uv   M*     g 7frV   r  r  s     r\   r0  0ShapeEnv.defer_runtime_assert.<locals>.<genexpr>  s#     V-q4CTCT1U-r  c                2    [        U R                  SS  5      $ r  )r   r  r  s    r\   rA  /ShapeEnv.defer_runtime_assert.<locals>.<lambda>  s    c!&&*or^   rI  r  z!runtime_assert [guard suppressed])'rc  r   r   r   r  rz   r0  r  ro  r  rX  rH  r   r  rT  r  r  r)  ri  r   r  r   r  rV  rw   rH   r  re  rK  r  
setdefaultr  r  r:  rw  r  r'  r  rf  )rY   r  rf  r  r   r  r?  r   rG  rg  r  candsixs                r\   r  ShapeEnv.defer_runtime_assertV  sJ     11$7"HHNN<i $$ ..t4.H###@@%%)=)=)?? %%h%@@
 00#--//77zRKD###**40((**OO,ieOL **DdKtUZZ0$		**%%d+ I)$/D%--15Et%0BVD--V-E $rB))44R<CCBGKKtD$9$9$--:M$NOP--2-((* 	 OO3YU   r^   c                   U R                  U5      nUR                   GHW  n[        U[        R                  5      (       d   e[        U R
                  R                  US 5      [        5      (       a  MV  [        X5      nUb%  UR                  (       a  US   R                  (       d  M  Uu  pEU R                  U   nUR                  UR                  p[        XPR                  5      n	XyR                  :  an  [        U[        R                  [        R                  [        R                   45      (       a0  U	R                  [#        [        U[        R                   5      5      -   nXR                  :  an  [        U[        R                  [        R$                  [        R&                  45      (       a0  U	R                  [#        [        U[        R&                  5      5      -
  nU[)        Xx5      :X  a  GM  U R+                  U[)        Xx5      5        U R                  U   R-                  5       (       a*  U R/                  UU R                  U   R                  S5        U R0                  R3                  5         GMZ     g )Nr   range_refined_to_singleton)r'  rz   r   r   rc  r0  rL  r?   r@   r  rd  r  r  rD   ra  r  r  r   r  r  rG   r  r6  r  rc  r   )
rY   r   r{  r  r_exprrf  r  r  r  rhs_vrs
             r\   rH  ShapeEnv._refine_ranges  s   }}T"''Ffell3333$//--fd;\JJ $'Ay!2!2qt KF""6*B88RXX5 &7&78F ||#
588UXX6) )
 s:fehh+G'HH||#
588UXX6) ) s:fehh+G'HH [.. %%fk%.GH  (5577%%%%f-330 ''335s (r^   )r   c                   [        X#5      nU R                  R                  U[         R                  " 5       5      nU R	                  X5        U R                  U   =oe:w  a,  [
        R                  SXR                  UR                  5        g g )Nz"constrain_symbol_range %s [%s, %s])	rG   rd  rL  r  r  r   r[  r  r  )rY   r  rm  rn  upd_vrold_vrnew_vrs          r\   rl  ShapeEnv.constrain_symbol_range  ss    
 \8""&&q+*=*=*?@!!!,''**F5HH4av|| 6r^   )/r  r  r  r  rX  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  rM  r  r  r  r  r  r  r  r  r  r  r  r  rK  r  r  r  r  r  rd  r  r1  r  r0  )r  Optional[bool]r  Optional[list[Any]]rY  r   r_   r`   )r  r   r  r   r  r   r  r   r  r  r  zOptional[dict[str, str]]r  r   r  r   r_   r`   )r_   r   )r   rq   r_   r`   )r_   r  r   )r_   Iterator[None])r  r5  rZ  r   r_   r`   )rO  r5  rP  r   r_   r`   )r  r5  rZ  r5  r_   r`   )r  r5  rv  r   r_   r`   NN)r  r5  rz  r  r{  r  r_   r`   )r  r   rz  r   r{  r   r_   r`   )r  r   r  r   r_   r`   )r  r   r_   r   r   )r.  r    r_   Optional[sympy.Symbol])r{  r5  r   r   r_   r`   r  )rW  r   rZ   r_  r_   z$tuple[Optional[torch.fx.Node], bool])r{  r5  r   r   r_   Optional[torch.fx.Node])r   r  r_   r`   )r   torch.fx.Noder_   r`   )r_   z_GeneratorContextManager[None])r_   ztuple[int, int, int, int])rj  Sequence[Union[int, SymInt]]r.  r    r  r   r_   list[sympy.Expr])rw  r  r.  r    r  r   r_   r  )r  torch.Tensorr.  r    r  r  r_   Ytuple[tuple[Union[int, SymInt], ...], tuple[Union[int, SymInt], ...], Union[int, SymInt]])r  r  r_   r  )rj  r  r  r  r  r  r  zSequence[bool]r.  r    r  r  r_   r  )r.  r    rv  zSequence[sympy.Expr]rj  r  r  r  r  zSequence[DimDynamic]r  zJSequence[Optional[Union[StrictMinMaxConstraint, RelaxedUnspecConstraint]]]r  r   r  r   r_   r  )rz  r   r]  r  r.  Optional[Source]r_   r  )rz  r   r]  r  r.  r  r_   rn  )r  r   r.  r    r  r  r_   r  )rz  r   r_   r   )r  r   r{  r5  r  rG   r.  r  r   zOptional[SymNode]r_   r`   )r_   r   rV   )r.  r  r_   r   )r{  r5  r_   r   )r_   r   )r   z#Union[int, SymInt, float, SymFloat]r.  r    r  r  r  rm  r  "Optional[StatelessSymbolicContext]r_   r   )r   r   r.  r    r  r  r  rm  r1  r  rs  r   r  r  r_   r   )r   r5  r   r   r_   r`   r  )r.  r    rG  z6Union[StrictMinMaxConstraint, RelaxedUnspecConstraint]r_   r   )rZ   r   rY  r   r_   r  )r.  Sequence[FakeTensor]r|  zSequence[Source]ru  r  r  Optional[list[ShapeGuard]]r  z"Optional[DimList[SymbolicContext]]r  zOptional[EqualityConstraint]r  r   r  r   r  ztuple[str, ...]r_   zlist[_ShapeGuardsHelper])r.  z#Sequence[Union[SymInt, FakeTensor]]r  r  r  r   r_   r  )r  r   r_   zUnion[int, float, bool])r  r   r_   r4  )r  r   rZ   zSequence[object]r_   r   )r.  r  rZ   Sequence[Tensor]r  r   r_   r   )r  zSequence[torch.SymInt]r_   zlist[ShapeGuard])r.  r  rZ   r  r_   dict[sympy.Symbol, int])r_   zlist[SympyBoolean]rv  )r  r   r_   r   )r   r   r9  r   r_   rG   r  )r  zOptional[tuple[sympy.Symbol]]r  r   r_   ztuple[SympyBoolean, ...])r  r   r_   z@tuple[tuple[SympyBoolean, sympy.logic.boolalg.BooleanAtom], ...])r   rS   r8  r   r  r   r9  r   r  zOptional[tuple[SympyBoolean]]rd  z1Optional[tuple[tuple[sympy.Symbol, ValueRanges]]]r_   Optional[sympy.Basic]r   r   r_   r   )r   r   r9  r   r_   r   )r   rS   r  r   r_   r  r   r   r_   r   )
r   rS   r  rS   r	  r  r
  r  r_   rQ   )
r{  r5  r  rG   r  zOptional[ValueRangesSLoc]r  r   r_   r`   )r  r5  r!  r   rf  r   r_   r`   )r   r   r_   r`   )r  r5  r_   r   )r   z	sympy.Relr_   r`   )rs  r   r_   rG   )r_   rG   r   r   r_   r   )r   rS   rx  rS   r_   r`   )FN)r  r   rs  r  r_   ztuple[SLoc, str])rs  r  r_   r   )r_   r  )r  r   r  r   r  r   r_   r`   )r   r.   r9  r   r_   rS   )NNF)r  rS   r]  z!Optional[Union[int, bool, float]]r  r  r9  r   r  r   r_   rS   )r  rS   r]  z!Optional[Union[bool, int, float]]r  r  r9  r   r  r   r_   rS   )r  r   rf  r   r  r  r_   r   )r  r5  rm  r   rn  r   r_   r`   )sra   rb   rc   rd   rX   r  propertyr  r  r  r  r  r  r  r  r  r  r
   r  r*   rP  rC  rh  ru  rr  r  r  r  r!  r  r&  r)  r-  r1  r5  r9  r=  rH  rK  rO  rT  rX  r  r  rW  rW  rf  rk  ri  r  r  r  r  r/  r  r  r  r  r  r  rq  r  r  r  r  rt  r  r	  r  r  r  r  r  r  r  r  r  r  r  r  rD   rc  r  r   r  rc  r  r  r'  r  r   r   r  r  r.  r  rV  r  r  r`  ri  r  r  r  r  r  re   r  ro  r  r  r  rH  rl  rf   rl   r^   r\   rq   rq   7  s    04-1	8 -8 +	8
 8 
8D &*/3
 */ %) &*.2 =B 9>Ke= #e= )-	e= #'e=( ")e=. #/e=2 ,3e=B 6:Ce=J 26Ke=P 
Qe=N 2 2 < < 6 6 1 1 ( ( I I E E?VBK($ & & C C 7 7 J J   OS$1?L	 *  " #9 #9JD  
 	: 	:   	+ 	+.11/& == = 
.	= =<,, , 
!	,8(
=6 # # " "&

'&
-
 
 *	

 

1  *	
 
L 7;"
"
 "

 4"

"
L	+			  7;tG .	tG
 0tG .tG 'tG tG 4tG
tG tGl88 #8 .	8
 08 .8
8 8 *8 
8t  $()) 	)
 !) 
) )V  $("" 	"
 !" 
 " "H 

"(
7A
	
 
7 $(&*#
#
 #
 	#

 !#
 $#
 
#
J " "0    09 ! !0 
 #-//(,?C
0
 
  	

 &
 =
 

 
: 
 #-//(,#'+0?Czz z  	z
 &z !z %)z =z 
z zx3F  !W 	 ,X /A	B .2=A ;?!"!=B*B "B ,	B +B ;B 8B B B B 
"BP .2"9 +	
  
2..K #* 
  
2028H2	 2h	

 8=//04/	/$  26"3.3 3 
"	3 3: t_&$&$	I&$ &$P 
 $"$04JNUU 	U
 U U .U HU 
U Un   ' ' ? ?D s^7<GG04G	G GT s^
 
 8<*.:6:6 #:6
  5:6 (:6 
%:6@ .2	15 $1515 15 +	15 15 
15fc@J' $  $" s^U Ur 27**.*	*) # #. FJ,=,=5B,=	,=^D
L/h (,}+
  %

 
 
	
 s^d3 37+/$ # 0 )	
   
 4 < 37+/$g #gg 0g )	g
 g g 
gR	# s^d3TXO%O,/O:QO	O 4 Ov<6| t		-0	@C			  	r^   c                p    [        U [        5      =(       a     U R                  R                  R                  $ rV   )r   r   r   r   r  r*  s    r\   _is_intr    s"    dF#@		(@(@@r^   c                D    [        U S5      =(       a    XR                  ;   $ )N_dynamo_dynamic_indices)r'  r  )r  rT  s     r\   r  r    s    1/0SQ:S:S5SSr^   c                  ,   ^  \ rS rSrSU 4S jjrSrU =r$ )PropagateUnbackedSymIntsi  c                h   > SSK Jn  [        TU ]  U5      n[	        U" 5       R
                  X5        U$ )zM
Run an FX node, propagating unbacked Symbol bindings to the new fake tensor
r   )detect_fake_mode)torch._guardsr  rW   run_noder   rM  )rY   ri  r  rj  r[   s       r\   r  !PropagateUnbackedSymInts.run_node	  s0     	3!!$(*44a@r^   rl   )ri  r  r_   rQ  )ra   rb   rc   rd   r  rf   rg   rh   s   @r\   r  r    s     r^   r  c                 R   [         R                  " 5       n U b  U R                  R                  R	                  [
        R                  R                  [         R                  " [        5      5      [
        R                  R                  -   5      (       d   U $ U R                  n U b  M  U $ rV   )r  r  r  r  
startswithr  rl  dirnamer  r   sepr  )r  s    r\   r~  r~    s}      "E

||''22GGOOGOOE23bggkkA
 
 L  
 Lr^   c                L   [         R                  " UR                  R                  UR                  UR                  R
                  5      nU R                  S   nUSSR                  [         R                  R                  U/5      R                  5       5      -   -  nU4U l        g )Nr   z(

The following call raised this error:
r)  )rm  rn  r  r  r  ro  rZ   r  StackSummary	from_listr  )r  r  frame_summaryrf  s       r\   _blame_user_coder    s    **  M
 &&)C8277((-9@@B<  C VAFr^   c                  :   ^  \ rS rSrSrSU 4S jjrSS jrSrU =r$ )_PythonMsgPrinteri,  z
Util printer that replaces sympy symbols with their source-level names
and renders sympy relational operators (e.g., Eq, Ne, Ge, Le) inline
(i.e., as ==, !=, >, <).
c                .   > [         TU ]  5         Xl        g rV   )rW   rX   src_map)rY   r  r[   s     r\   rX   _PythonMsgPrinter.__init__3  s    r^   c                :    U R                   UR                     S   $ r  )r  r  r  s     r\   r  _PythonMsgPrinter._print_Symbol7  s    ||CHH%a((r^   )r  )r  zdict[str, list[str]]r_   r`   )rz  r5  r_   r   r  rh   s   @r\   r  r  ,  s    ) )r^   r  c                4  ^ U R                   nSR                  U4S jUR                   5       5      nU(       a  [        R	                  SU5        g [        T5      nU R                  S   nUS-  nSUR                  U5       S3SUR                  [        R                  " U5      5       S3/n[        U5       H  u  pxUSUS	-    S
U 3-  nM     SR                  U4S j[        S UR                   5       5       5       5      n	USU	 SU S3-  nU4U l        g )Nrr  c              3  ^   >#    U  H"  oR                   T;  d  M  UR                   v   M$     g 7frV   r
  r-  r  r  s     r\   r0  (_suggest_torch_checks.<locals>.<genexpr>@  s"     P%6&&:OVQVV%6s   --z.Unable to find user code corresponding to {%s}r   zG
To fix the error, insert one of the following checks before this call:ztorch._check(r  ru  r   rd  c              3  X   >#    U  H  nS U SSR                  TU   5       3v   M!     g7f)`z` with z or N)r  r	  s     r\   r0  r
  O  s3      :A A3gfkk'!*-./:s   '*c              3  8   #    U  H  oR                   v   M     g 7frV   r
  r  s     r\   r0  r
  Q  s     :(91(9r  z3

(These suggested fixes were derived by replacing z in z and its negation.))rT   r  rz   r   r)  r  rZ   r  r   r  r3  rK  )
r  r  rT   diffrT  rf  suggested_fixesrG  fix
src_mappeds
    `        r\   _suggest_torch_checksr  ;  s    66D99PT%6%6PPDDdK(G
&&)CUUC -.a0
		$89;O O,a!eWBse$$ - :(9(9:: J B:,dSWRXXkllCVAFr^   c           	     f   [        5       nUGbq  [        X5        [        [        5      nUR                  R                  5        GH,  u  p4 [        R                  " U5      nU GH  u  pgU[        R                  " U5      -   n[        U[        R                  5      (       a3  U[!        UR"                  R$                  5         R'                  U5        Mq  [        U[        R(                  5      (       d  M  [+        UR,                  5       H]  u  p[        U
[        R                  5      (       d  M&  U[!        U
R"                  R$                  5         R'                  U SU	 S35        M_     GM     GM/     [/        X5        gg! [         a%    [        R                  S[        U5      U5         GMl  f = f)z
Given a raised data-dependent error, add the following to the error message:
1. the closest user code location that raised the error;
2. suggested fixes for the error in terms of live variables at that location.
NzQpytree.tree_leaves_with_path failed for value of type {%s} in local variable {%s}z.shape[r  )r~  r  r   r  r  rJ  rY  tree_leaves_with_pathr  r   r)  r   keystrr   r   r   r   r   r   r  rJ   r3  r  r  )r  r  r  varr   r  rl  leafr  rG  r  s              r\   2_suggest_fixes_for_data_dependent_error_non_strictr  W  sJ    "#E" d#,,.HC(.(D(DS(I% 4
V]]400dELL11C		/077=ell33"+DJJ"7%c5<<88#C$67>>$wqcQR?ST #8 4 /, 	a)9   gI
 s   
F*F0/F0)r   z$functools._lru_cache_wrapper[object]r_   r`   )r   ztuple[Union[SymInt, int], int]r_   z#tuple[int, Union[SymInt, int], int])r   r  r_   z?Callable[[Callable[..., _T]], functools._lru_cache_wrapper[_T]])r_   zset[str])r  r  r_   r   )r  zSequence[Int]r_   z	list[Int]rV   )r  r   r  r  r_   r   )r  r  r_   r   )r  r  r_   r   )r  rn  r_   r   )r   zUnion[torch.SymBool, bool]r_   r   )r6  #Sequence[Union[torch.SymInt, bool]]r7  r  r_   r   )r?  r   r@  r   r_   r`   )rM  Optional[ShapeEnv]rN  ,Optional[dict[sympy.Symbol, pytree.KeyPath]]r_   r  )rM  r  ri  r  rj  rQ  r_   r`   )r   r  r_   r   )r   r   r_   r   )TN)
r  z!type[Union[sympy.Add, sympy.Mul]]rZ   r  r  r   r  r  r_   r   )r   r   r_   r   r  )r  Union[bool, SymBool]r_   r   )r  r  r_   zTypeGuard[SymInt])r   r  r_   zIterator[sympy.Basic])r   r  r_   OrderedSet[sympy.Symbol])r   r  r_   r   )r  r  r_   r   )r  r  r_   r  )r   r  r_   r  )r  ztorch.fx.Graphr_   z!dict[sympy.Symbol, torch.fx.Node])NNNF)r  r   rl  zpytree.KeyPathr+  Optional[object]rM  r  r&  zOptional[set[sympy.Symbol]]r'  r   r_   z"dict[sympy.Symbol, pytree.KeyPath]r  )
rM  r  ru  r   rR  r  rS  r   r_   r  )r  rM   r_   r   )r  r  r_   r   )r  r   ri  r   r_   r  )r  z2Union[SymBool, SymInt, SymFloat, int, bool, float]r_   zUnion[bool, int, float])
rM  rq   r  r5  rm  r   rn  r   r_   r`   )r  r   r_   r`   )r  r   rv  r  r_   r`   r  )r  r   rz  r  r{  r  r_   r`   )r  torch.SymIntr  r  r_   r`   )r   )r  Union[SymBool, bool]r  r   r_   r   )r  r   r_   r   )r  rl  r_   r   )r  zUnion[SymFloat, float]r_   r&  )r  torch.fx.GraphModuler_   zlist[object])r  r!  r_   r  )r  r!  rZ   rJ   r  r   r_   r   )r  r!  rZ   rJ   r_   r  )r  r   r_   zTypeGuard[SymbolicContext]r  r  )r   z2Union[int, SymInt, float, SymFloat, bool, SymBool]r_   z+TypeGuard[Union[SymInt, SymFloat, SymBool]])rZ   r  r_   ztuple[sympy.Expr, bool]r  )r  r   r_   r   )
r   r   r7  ztuple[_SymbolInfo, ...]r8  r   r9  r   r_   zOptional[_SympyT])r_   r   )rF  Sequence[int]r  r"  r_   r   )rF  r"  r  r"  r_   r   )r  r   r_   r   )rS  zUnion[bool, torch.SymBool]r_   zUnion[int, torch.SymInt])r  r   r   r  r_   r   )rM  rq   r_   r  )r   r   r_   r   )r  r  rT  r   r_   r   )r_   zOptional[types.FrameType])r  rd  r  ztypes.FrameTyper_   r`   )r  rQ   r  zdefaultdict[str, list[str]]r_   r`   )r  rQ   r_   r`   (  
__future__r   r  r   r  r  r   r  r  r   r  rg  r  r  r   	threadingrm  r   r   collections.abcr   r   r   
contextlibr	   r
   dataclassesr   r   r   enumr   typingr   r   r   r   r   r   r   r   r   typing_extensionsr   r   r   r   torch.fxtorch.fx.tracebackr   rr  torch.utils._pytreer  _pytreerY  r   r   r   r  r   r   r    r!   r   r"   r#   r$   r%   r   r&   torch._utils_internalr'   torch.fx.experimentalr(   r`  torch.fx.experimental.recordingr)   r*   r+   r,   r-   torch.fx.experimental.sym_noder.   r/   torch.utils._ordered_setr0   torch.utils._python_dispatchr1   torch.utils._sympy.functionsr2   r3   r4   r5   r6   r7   r8   r9   r:   torch.utils._sympy.numbersr;   torch.utils._sympy.printersr<   r=   r  r?   torch.utils._sympy.solver@   torch.utils._sympy.symbolrA   rB   rC   torch.utils._sympy.value_rangesrD   rE   rF   rG   torch.utils._tracebackrH   rI   typesrJ   r   rL   torch.typesrM   r  	InputListDimList	getLoggerra   r   r   rN   rO   RuntimeErrorrQ   rj   _opsr|  r}  __all__r~   r   r   r   re   r   r  r`  r   r   r   r   r	  r  ro   r   r  rp   rx   r&  r   r  r   rr   rs   r   r8  r   r   r_  rQ  r   r   rw   r  r  r  r|   r}   r  r  r  rz   r   r   r  r{   r  r   r  r  r  r7  r   r_  ra  r   r   rv   ro  rs  rw  rr  r  r  r  r^  rt   ru   r  r  r  r  r  r  r  r  rm  r  r  r  r  r   r   r   r   r  IndicatorTypesr  r  r*  r,  rA  rC  rG  rE  rg  r  ry   rc  re  ri  ABCrr  r  FutureWarningr  r  r  r  r  r  r  localr  r  r   r  r  rq   r  r  Interpreterr  r~  r  r  r  r  rl   r^   r\   <module>rI     sI
   "    
       	 	 
   , 7 7 ? 0 0 
 
 
 ? >   ) ) $ $ , + B B V V 6 0 3  = / F
 
 
 . A 9 . G G  C 8( 	
!  , 	L 	 zz~~#L & ! ( 8i 7 T]
)UZZu{{
C$% $%N		'	(	##D#P 4   F	| 	, u||S()Y )#	 %,,sESWWX	 X(& 22 
I:T!T:T 2T %,,ellC.?(@@A	 Ar:!r:&3r:=Cr:	r:r0.< %)	C	*C
C C #	C
 CB*'Z-`,B $
HgsE4ellJ )    0(;K2L LMi MY8I=

& $3 3 3 $' ' ' $+ + + $! ! ! "$(+/YY
Y Y "	Y
 )Y Y (Y~ +/	N!NN (N 	N
 2Nb4 2O"
99
9
9DD(D8;DKND	D'%TI @DFF!F/<F	F$ <@+=+=$+=+8+=	+=\%dLG DH%+<@	D! !j $   $HZ H H8 $;j ; ;6 ,.EtKL $gC gC gCT* $	 	 	 $#
 #
 #
x $P6 P PD $%5 % %"	;"0" 45G "J 3 (*  4_/
_/ )_/ 	_/
 _/ _/ _/D-
OO#0OO#0	<.' *K(H	 5944$14%4v $1 1 1 ]  
' 'T0- $ Z
	/ 	
	..
 .4 $  
 $1. 1 1M6 M
5- 54N Nb oo $2 2 2    * * : : :E? E?P~A
T	uxx33 	
) )"-H	8'*"'*	'*r^   