
    sg^                     T	   d Z ddlZddlZddlZddlZddlZddlZddlmZm	Z	 ddl
mZmZmZmZ ddlZddlmZmZmZmZmZmZmZmZ erddlmZ  ej4                  e      Zej:                  j=                  ed      Zg dZ dd	l!m"Z# d
 Z$ G d d      Z%i dejL                  dejN                  dejP                  dejR                  dejT                  dejV                  dejX                  dejZ                  dej\                  dej^                  dej`                  dd dejb                  dejd                  dejf                  dejh                  dejj                  ejl                  ejn                  ejp                  ejr                  ejr                  ejt                  ejv                  ejx                  eeeeeejz                  ejz                  dZ>h d Z?d! Z@d"ZAeAD ]J  ZBd#eB ZCd$eC ZD eEe%eC e@eB              eFeeD      e>eC<   e?jQ                  eC       e j                  eC       L dhZHe?eHz  ZIh d%ZJh d&ZKdhZLeJeLz  ZMh d'ZNdd(hZOh d)ZPeAD ]  ZBd#eB ZCePjQ                  eC        h d*ZQh d+ZRd, ZSd- ZTd. ZUd/ ZVd0 ZWd1 ZXd2 ZYd3 ZZd4 Z[d5 Z\ejP                  ejx                  ejj                  eVeWeXeYeZeSeTeUe[e\d6Z]d7 Z^d8 Z_d9 Z`d: Zad; Zbd< Zcd= Zdd> Zed? Zfd@ ZgdA ZhdB ZidC Zjej                  e   ZldD ZmeAD ]'  ZBdEeB Zn emeB      Zoenxeo_p        eo_         eEeleneo       ) [o[B[ndF ZqdbdGZrdH ZsdI Zti e]i dJej                  dejL                  debdKecdeddeedefdegde_de`dLesdeadMejn                  dNehdOeidPejdeqeretdQZveAD ]  ZBd#eB ZC eFeldEeB       eveC<    [B[C[A[ldR ZwdS ZxdT ZydU ZzdV Z{dW Z|dX Z}dY Z~eweyeze|e}e~dZZej                   ej                  d[Zd\ Zd] Zd^ Zd_ Zd` Zevj                         D ]  \  ZZ eee        ej                         D ]  \  ZZ eee        da Zevj                         D ]D  \  ZZeeJv r
 eee       eeNv r
 eee       "eeLv seeKv r	 eee        eee        eee       F [[y)cae  
This file does three things:
- Contains the definition of SymNode
- Installs all the magic methods into SymBool, SymFloat, SymFloat at import time
- Does not depend on sympy at import time

As this file is imported from within torch/__init__.py we do not want it to depend on SymPy
to avoid having to load SymPy at import time, as doing so is *very* slow.
    N)	lru_cacheupdate_wrapper)OptionalTypeTYPE_CHECKINGUnion)	sym_floatsym_itesym_maxsym_minsym_notSymBoolSymFloatSymInt)ShapeEnvsym_node)SymNodemethod_to_operatormagic_methods)py_sym_typesc                 Z    | t         u rt        S | t        u rt        S | t        u rt
        S | S N)boolr   intr   floatr   )ts    Q/var/www/html/venv/lib/python3.12/site-packages/torch/fx/experimental/sym_node.py_to_symtyper   1   s+    DyCxEzH    c                      e Zd ZdZ	 	 dUdeeeeef      fdZ	dVdZ
dd defdZdefd	Zed
        Zed        Zd ZdWdZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zde j:                  fdZ!dXdZ"dXdZ#dWdXdZ$dXd Z%dXd!Z&dXd"Z'dXd#Z(dXd$Z)dXd%Z*dXd&Z+dXd'Z,dXd(Z-dXd)Z.dXd*Z/dXd+Z0dXd,Z1dXd-Z2dXd.Z3dXd/Z4dXd0Z5dXd1Z6dXd2Z7dXd3Z8dXd4Z9dXd5Z:dXd6Z;dXd7Z<dXd8Z=dXd9Z>dXd:Z?dXd;Z@dXd<ZAdXd=ZBdXd>ZCdXd?ZDdXd@ZEdXdAZFdXdBZGdXdCZHdD ZIdE ZJdF ZKdXdGZLdH ZMdI ZNdJ ZOdK ZPdL ZQdM ZRdN ZSdO ZTdP ZUdQ ZVdR ZWdS ZXdT ZYy)Yr   z
    This is a type erased SymInt/SymFloat which we use to do actual operations.
    End users don't touch this.  Magic methods are NOT defined on this object.
    Nhintc                     | _         | _        | _         fd}|t        |      |u s,t        |      t	        |      u sJ d| dt        |               j                  rC j                  j
                  r- |       }||k(  s!J | d| d j                   d        |       }| _        | _         j                  xr  j                  j
                  }	|	xr | _	        y )Nc                      ddl m}   | j                        ry j                  j	                  j                  d      }|#t        |t              sj                  |      n|}|S )Nr   free_unbacked_symbolsT)compute_hint)%torch.fx.experimental.symbolic_shapesr%   expr	shape_env_maybe_evaluate_static
isinstanceSymTypespytype)r%   r!   selfs     r   r&   z&SymNode.__init__.<locals>.compute_hintl   sZ    S %TYY/>>88QU8VD0:40Jt{{4(PTKr   zCannot create SymNode of type z  with incompatible hint of type z != z (for ))
_exprr)   r-   typer   _translation_validation_enabledr(   _hintconstantfx_node)
r.   r(   r)   r-   r!   r4   r5   r&   computed_hinttx_validation_ens
   `         r   __init__zSymNode.__init__D   s     
":	 :'4:V9L+L 0(:4:,HL ~~$.."P"P !-M)BV4fTYYKqAB)  >D
;C NNMt~~MM 	 (3Gr   returnc                     t        | j                  || j                  | j                  | j                  | j
                        S r   )r   r0   r-   r3   r4   r5   )r.   r)   s     r   with_shape_envzSymNode.with_shape_env   s0    JJ	4;;

DMM4<<
 	
r   otherc                    | j                   |j                   k(  xrj | j                  |j                  k(  xrO | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S r   )r0   r-   r3   r4   r5   r.   r<   s     r   	_value_eqzSymNode._value_eq   sq     JJ%++% .u||+.

ekk). /. -	
r   c                     t        | j                  | j                  | j                  | j                  | j
                  f      S r   )hashr0   r-   r3   r4   r5   r.   s    r   _value_hashzSymNode._value_hash   s,    TZZdjj$--VWWr   c                 L    | j                   j                  | j                        S r   )r)   replacer0   rB   s    r   r(   zSymNode.expr   s    ~~%%djj11r   c                     | j                   S r   r3   rB   s    r   r!   zSymNode.hint   s    zzr   c                     | j                   d uS r   rG   rB   s    r   has_hintzSymNode.has_hint   s    zz%%r   c                     | j                   )||S | j                  j                  | j                        S | j                   S r   )r3   r)   	size_hintr(   )r.   fallbacks     r   require_hintzSymNode.require_hint   s:    ::#>>++DII66zzr   c                 Z    | j                   j                  rt        | j                         S y r   )r(   	is_numberr   rB   s    r   maybe_as_intzSymNode.maybe_as_int   s     99tyy>!r   c                 v    dd l }t        | j                  |j                        rt	        | j                        S y Nr   )sympyr+   r(   Floatr   r.   rS   s     r   maybe_as_floatzSymNode.maybe_as_float   s)    dii-##r   c                 p    dd l }| j                  |j                  u ry| j                  |j                  u ryy )Nr   TF)rS   r(   truefalserU   s     r   maybe_as_boolzSymNode.maybe_as_bool   s.    99

"YY%++%r   c                 &    | j                   t        u S r   )r-   r   rB   s    r   is_intzSymNode.is_int   s    {{c!!r   c                 &    | j                   t        u S r   )r-   r   rB   s    r   is_floatzSymNode.is_float   s    {{e##r   c                 &    | j                   t        u S r   )r-   r   rB   s    r   is_boolzSymNode.is_bool   s    {{d""r   c                     | j                   d uxr@ t        | j                   t              xr$ | j                   j                  j	                         S r   )r3   r+   r   nodeis_nested_intrB   s    r   rc   zSymNode.is_nested_int   sA     JJd" 04::v.0

--/	
r   c                     t        |      t        u sJ dd l}t        |j	                  |      | j
                  t        |||      S Nr   )r4   r5   )r1   r   rS   r   Integerr)   r.   numrS   s      r   wrap_intzSymNode.wrap_int   s?    CyCMM#S3PS
 	
r   c                     t        |      t        u sJ dd l}t        |j	                  |      | j
                  t        |||      S re   )r1   r   rS   r   rT   r)   rg   s      r   
wrap_floatzSymNode.wrap_float   s?    CyE!!!KKdnneS3PS
 	
r   c                     t        |      t        u sJ dd l}t        |r|j                  n|j
                  | j                  t        |||      S re   )r1   r   rS   r   rX   rY   r)   rg   s      r   	wrap_boolzSymNode.wrap_bool   sF    CyD   EJJ5;;NN
 	
r   c                     | S r    rB   s    r   clonezSymNode.clone  s    r   c                     | j                    S r   )r(   rB   s    r   strzSymNode.str  s    ))r   c                 "    | j                         S r   rr   rB   s    r   __str__zSymNode.__str__  s    xxzr   c                 z   d| j                    d| j                   d| j                   g}| j                  |j	                  d| j                          | j
                  |j	                  d| j
                          | j                  |j	                  d| j                          dj                  |      dz   S )	NzSymNode(z, shape_env=z	, pytype=zhint=z	constant=zfx_node=z, r/   )r0   r)   r-   r3   appendr4   r5   join)r.   reps     r   __repr__zSymNode.__repr__
  s    tzzl,t~~.>i}U
 ::!JJtzzl+,==$JJ4==/23<<#JJ$,,01yy~##r   c                 "    | j                         S r   rt   rB   s    r   _graph_reprzSymNode._graph_repr  s    xxzr   c                 "    | j                         S r   )_absrB   s    r   abszSymNode.abs      yy{r   c                 "    | j                         S r   )_posrB   s    r   poszSymNode.pos  r   r   c                 $    | j                  |      S r   )_round)r.   ndigitss     r   roundzSymNode.round"  s    {{7##r   c                 "    | j                         S r   )_truncrB   s    r   trunczSymNode.trunc%      {{}r   c                 $    | j                  |      S r   )_addr>   s     r   addzSymNode.add(      yyr   c                 $    | j                  |      S r   )_subr>   s     r   subzSymNode.sub+  r   r   c                 $    | j                  |      S r   )_mulr>   s     r   mulzSymNode.mul.  r   r   c                 $    | j                  |      S r   )_modr>   s     r   modzSymNode.mod1  r   r   c                 $    | j                  |      S r   )
_float_powr>   s     r   	float_powzSymNode.float_pow4  s    u%%r   c                 $    | j                  |      S r   )_pow_by_naturalr>   s     r   pow_by_naturalzSymNode.pow_by_natural7  s    ##E**r   c                 $    | j                  |      S r   )_and_r>   s     r   and_zSymNode.and_:  s    zz%  r   c                 $    | j                  |      S r   )_or_r>   s     r   or_zSymNode.or_=  r   r   c                 $    | j                  |      S r   )_float_truedivr>   s     r   float_truedivzSymNode.float_truediv@  s    ""5))r   c                 $    | j                  |      S r   )_int_truedivr>   s     r   int_truedivzSymNode.int_truedivC        ''r   c                 $    | j                  |      S r   )_int_floordivr>   s     r   int_floordivzSymNode.int_floordivF      !!%((r   c                 $    | j                  |      S r   )_lshiftr>   s     r   lshiftzSymNode.lshiftI      ||E""r   c                 $    | j                  |      S r   )_rshiftr>   s     r   rshiftzSymNode.rshiftL  r   r   c                 "    | j                         S r   )_sym_notrB   s    r   r   zSymNode.sym_notO      }}r   c                 $    | j                  |      S r   )_eqr>   s     r   eqz
SymNode.eqR      xxr   c                 $    | j                  |      S r   )_ner>   s     r   nez
SymNode.neU  r   r   c                 $    | j                  |      S r   )_gtr>   s     r   gtz
SymNode.gtX  r   r   c                 $    | j                  |      S r   )_ltr>   s     r   ltz
SymNode.lt[  r   r   c                 $    | j                  |      S r   )_ler>   s     r   lez
SymNode.le^  r   r   c                 $    | j                  |      S r   )_ger>   s     r   gez
SymNode.gea  r   r   c                 "    | j                         S r   )_floorrB   s    r   floorzSymNode.floord  r   r   c                 "    | j                         S r   )_is_integerrB   s    r   
is_integerzSymNode.is_integerg  s    !!r   c                 "    | j                         S r   )
_sym_floatrB   s    r   r	   zSymNode.sym_floatj  s      r   c                 "    | j                         S r   )_sym_intrB   s    r   sym_intzSymNode.sym_intm  r   r   c                 "    | j                         S r   )_ceilrB   s    r   ceilzSymNode.ceilp  s    zz|r   c                 "    | j                         S r   )_negrB   s    r   negzSymNode.negs  r   r   c                 $    | j                  |      S r   )_sym_minr>   s     r   r   zSymNode.sym_minv      }}U##r   c                 $    | j                  |      S r   )_sym_maxr>   s     r   r   zSymNode.sym_maxy  r   r   c                 &    | j                  ||      S r   )_sym_ite)r.   then_valelse_vals      r   r
   zSymNode.sym_ite|  s    }}Xx00r   c                 &    | j                  ||      S r   )_is_contiguousr.   sizesstridess      r   is_contiguouszSymNode.is_contiguous  s    ""5'22r   c                 &    | j                  ||      S r   )_is_channels_last_contiguous_2dr   s      r   is_channels_last_contiguous_2dz&SymNode.is_channels_last_contiguous_2d      33E7CCr   c                 &    | j                  ||      S r   )_is_channels_last_contiguous_3dr   s      r   is_channels_last_contiguous_3dz&SymNode.is_channels_last_contiguous_3d  r   r   c                 &    | j                  ||      S r   )_is_channels_last_strides_2dr   s      r   is_channels_last_strides_2dz#SymNode.is_channels_last_strides_2d      00@@r   c                 &    | j                  ||      S r   )_is_channels_last_strides_3dr   s      r   is_channels_last_strides_3dz#SymNode.is_channels_last_strides_3d  r   r   c                 &    | j                  ||      S r   )'_is_non_overlapping_and_dense_indicatorr   s      r   &is_non_overlapping_and_dense_indicatorz.SymNode.is_non_overlapping_and_dense_indicator  s    ;;E7KKr   c                 $    | j                  |      S r   )r   r>   s     r   sym_orzSymNode.sym_or  r   r   c                 $    | j                  |      S r   )r   r>   s     r   sym_andzSymNode.sym_and  r   r   c                 $    | j                  |      S r   )r   r>   s     r   truedivzSymNode.truediv  r   r   c                 $    | j                  |      S r   )r   r>   s     r   floordivzSymNode.floordiv  r   r   c                 $    | j                  |      S r   )r   r>   s     r   powzSymNode.pow  s    ~~e$$r   c                 X    | j                  ||      j                  t        | d            S )N   )r   r   to_noder   s      r   is_non_overlapping_and_densez$SymNode.is_non_overlapping_and_dense  s)    ::5'JMMgVZ\]N^__r   c                 &    | j                  dd      S N r   )	guard_intrB   s    r   int_zSymNode.int_  s    ~~b!$$r   c                     | j                   j                  | j                  | j                  | j                        }	 t        |      S # t        $ r t        j                  d|        w xY w)Nr5   zFailed to convert to int: %s)	r)   evaluate_exprr(   r!   r5   r   	Exceptionlogwarningr.   fileliners       r   r  zSymNode.guard_int  sZ     NN((DIIt||(T	q6M 	KK6:	   
A	 	!A*c                     | j                   j                  | j                  | j                  | j                        }	 t        |      S # t        $ r t        j                  d|        w xY w)Nr  zFailed to convert to float: %s)	r)   r  r(   r!   r5   r   r  r  r  r  s       r   guard_floatzSymNode.guard_float  sZ     NN((DIIt||(T	8O 	KK8!<	r  c                     | j                   j                  | j                  | j                  | j                        }	 t        |      S # t        $ r t        j                  d|        w xY w)Nr  Failed to convert to bool: %s	r)   r  r(   r!   r5   r   r  r  r  r  s       r   
guard_boolzSymNode.guard_bool  sZ     NN((DIIt||(T	7N 	KK7;	r  c                    ddl m} | j                         r: || j                        s(| j                  j
                  s| j                  ||      S | j                  j                  | j                  | d| | j                        S )Nr   r$   :r  )	r'   r%   rI   r(   r)   +prefer_deferred_runtime_asserts_over_guardsr!  defer_runtime_assertr5   )r.   r  r  r%   s       r   expect_truezSymNode.expect_true  st    O MMO)$))4NNNN ??4..
 ~~22II$q' 3 
 	
r   c                     ddl m} | j                  | j                  d            }|j	                  ||      }|r!| j                         s |t        |              |S )Nr   )_advise_is_size)r'   r(  r   ri   r&  rI   r   )r.   r  r  r(  br  s         r   expect_sizezSymNode.expect_size  sJ    IGGDMM!$%MM$%
 T]]_F4L)r   c                     | j                   j                  | j                  | j                  | j                  d      }	 t        |      S # t        $ r t        j                  d|        w xY w)aN  
        Like guard_bool, but if we encounter unbacked symbols, if those symbols
        are size-like, we will treat them as >= 2 for the purposes of the analysis.

        This CHANGES the runtime semantics, but all size-oblivious sites have been
        audited to ensure that the runtime semantics don't change in a material way.
        Acceptable runtime semantic changes are, e.g., squeeze() no longer dropping
        an unbacked one size, or a tensor reporting as non-contiguous even if it's
        contiguous if it would have been reported contiguous due to being empty.
        T)r5   size_obliviousr  r   r  s       r   guard_size_obliviouszSymNode.guard_size_oblivious  sa     NN((IItyy$,,t ) 
	7N 	KK7;	s   
A
 
!A+c                 &    | j                  dd      S r  )r!  rB   s    r   bool_zSymNode.bool_  s    r1%%r   c                      y)NTro   rB   s    r   is_symboliczSymNode.is_symbolic      r   c                      y r   ro   rB   s    r   
nested_intzSymNode.nested_int  r2  r   c                      y)NFro   rB   s    r   is_constantzSymNode.is_constant  s    r   )NN)r)   r   r9   r   r   )r9   r   )Z__name__
__module____qualname____doc__r   r   r   r   r   r8   r;   r?   rC   propertyr(   r!   rI   rM   rP   rV   rZ   r\   r^   r`   rc   ri   rk   rm   rp   rr   ru   rz   builtinsr|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	   r   r   r   r   r   r
   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r!  r&  r*  r-  r/  r1  r4  r6  ro   r   r   r   r   >   s    N4
 uS%-./N4`


y 
T 
XS X 2 2  &"$#




$X\\ $    &+! *()##"!$$13DDAAL )(%`%
$,&r   r   r   r   r   andr   r   r   r   r   r   r   r   c                 "    | j                         S r   )r   xs    r   <lambda>rA    s    ALLN r   r   r   r   r   r   )r   r   orr   r   r   r   r   r	   r
   r   r   r   r   r   >	   r   r   r   r   r   r   r   r   r	   c                       fd}|S )Nc                 ,     t        | d              S )N_sym_)getattr)r.   names    r   fnz_get_sym_node_fn.<locals>.fn>  s    ,wtuTF^,..r   ro   rG  rH  s   ` r   _get_sym_node_fnrJ  =  s    / Ir   )
sqrtcoscoshsinsinhtantanhasinacosatansym__>   rB  r=  r
   r   >   r   r   r   >   r   r   r   rB  >   r   r	   r   r   >   r   r   r   r   >   r   r   r   r   r   r   rB  r=  r   r   r  c                      ddl m}  || |      S )Nr   )FloatTrueDiv)torch.utils._sympy.functionsrX  )ar)  rX  s      r   _sympy_float_truedivr[        91r   c                      ddl m}  || |      S )Nr   )
IntTrueDiv)rY  r^  )rZ  r)  r^  s      r   _sympy_int_truedivr_    s    7ar   c                      ddl m}  || |      S )Nr   )FloorDiv)rY  ra  )rZ  r)  ra  s      r   _sympy_floordivrb        5Aq>r   c                 f    ddl m}m} | j                  r|j                  r	 || |      S  || |      S )Nr   Mod	PythonMod)rY  rf  rg  is_nonnegative)rZ  r)  rf  rg  s       r   
_sympy_modri    s.    ;A,,1ayAr   c                      ddl m}  || |      S )Nr   )PowByNatural)rY  rk  )rZ  r)  rk  s      r   _sympy_pow_by_naturalrl    r\  r   c                      ddl m}  || |      S )Nr   )FloatPow)rY  rn  )rZ  r)  rn  s      r   _sympy_float_powro    rc  r   c                 .    dd l }|j                  | |      S rR   )rS   AndrZ  r)  rS   s      r   
_sympy_andrs    s    99Q?r   c                 .    dd l }|j                  | |      S rR   )rS   Orrr  s      r   	_sympy_orrv        88Aq>r   c                      ddl m}  || |      S )Nr   )LShift)rY  ry  )rZ  r)  ry  s      r   _sympy_lshiftrz        3!Q<r   c                      ddl m}  || |      S )Nr   )RShift)rY  r}  )rZ  r)  r}  s      r   _sympy_rshiftr~    r{  r   )r   r   r   r   r   r   r=  rB  r   r   r   r   r   c                    dd l }t        | |j                        rf| j                  }t	        |      dk(  rLt        |d   |j
                        r3|d   j                  r$|j                  |d         }|d   |k(  r||d   z  S t        | |j
                        r| |j                  |       k(  st        | |j                        r|j                  |       S  ||       S )Nr      r	  )rS   r+   MulargslenrT   r   rf   )rZ  rH  rS   aacoefs        r   _floor_ceil_helperr    s    !UYYVVr7a<Jr!uekk:r!u?O?O==A'D!u}be|#1ekk"q!!a'}}Qa5Lr   c                     ddl m}  ||       S )Nr   )
FloorToInt)rY  r  )rZ  r  s     r   _sympy_floorr        7a=r   c                     ddl m}  ||       S )Nr   )
TruncToInt)rY  r  )rZ  r  s     r   _sympy_truncr    r  r   c                     ddl m}  ||       S )Nr   )	CeilToInt)rY  r  )rZ  r  s     r   _sympy_ceilr    s    6Q<r   c                 .    dd l }|j                  | |      S rR   )rS   Eqrr  s      r   	_sympy_eqr    rw  r   c                 .    dd l }|j                  | |      S rR   )rS   Nerr  s      r   	_sympy_ner    rw  r   c                 .    dd l }|j                  | |      S rR   )rS   Gtrr  s      r   	_sympy_gtr    rw  r   c                 .    dd l }|j                  | |      S rR   )rS   Ltrr  s      r   	_sympy_ltr    rw  r   c                 .    dd l }|j                  | |      S rR   )rS   Lerr  s      r   	_sympy_ler    rw  r   c                 .    dd l }|j                  | |      S rR   )rS   Gerr  s      r   	_sympy_ger    rw  r   c                      ddl m}  || |      S )Nr   )Min)rY  r  )rZ  r)  r  s      r   
_sympy_minr  #      0q!9r   c                      ddl m}  || |      S )Nr   Max)rY  r  )rZ  r)  r  s      r   
_sympy_maxr  )  r  r   c                 6    dd l }|j                  || f|df      S )Nr   T)rS   	Piecewise)rZ  r   frS   s       r   
_sympy_iter  /  s    ??Aq6At9--r   c                       fd}|S )Nc                 r    dd l } t        |j                  j                  j                  d       |       S )Nr   OpaqueUnaryFn_)rY  rF  utils_sympy	functions)rZ  torchrG  s     r   rH  z_get_sym_math_fn.<locals>.fn9  s1    +Mwu{{))33~dV5LMaPPr   ro   rI  s   ` r   _get_sym_math_fnr  8  s    Q
 Ir   _sympy_c                 ,    dd l }|j                  |       S rR   )rS   Abs)rZ  rS   s     r   
_sympy_absr  J  s    99Q<r   c                 8    ddl m}m} | ||       S  || |      S )Nr   )RoundDecimal
RoundToInt)rY  r  r  )numberr   r  r  s       r   _sympy_roundr  P  s"    E&!!FG,,r   c                     ddl m}  ||       S Nr   )ToFloat)rY  r  )rZ  r  s     r   _sympy_sym_floatr  Y  s    4 1:r   c                 d    dd l }ddlm} |j                   ||j	                  |             |       S r  )rS   rY  r  r  r   )rZ  rS   r  s      r   _sympy_is_integerr  a  s&    488GEKKN+Q//r   r   r   r	   r   r   r   r
   )r   r   c                 `    t        |       }t        | |t        t        |dz
  dd                  S )Nr	  )r  sympy_is_contiguous_genericlistrange)r   r   dims      r   sympy_is_contiguousr    s,    
e*C&ugtE#'2r<R7STTr   c                    dd l }t        |       }t        |      |k7  r|j                  S |j                  }|j	                  d      }|D ]G  }||j                  | |   |j	                  d            |j                  ||   |      z  z  }|| |   z  }I t        |      D ])  }||j                  | |   |j	                  d            z  }+ |S )Nr   r	  )rS   r  rY   rX   rf   r  r  )r   r   	dim_orderrS   r  r   zds           r   r  r    s    
e*C
9~{{JJMaA %(EMM!,<=QRUV@WWW	U1X 3Z >%(EMM!,<==>r   c                      t        | |g d      S N)r	     r  r   r  r   r   s     r   $sympy_is_channels_last_contiguous_2dr    s    &ug|DDr   c                      t        | |g d      S N)r	     r  r  r   r  r  s     r   $sympy_is_channels_last_contiguous_3dr    s    &ugGGr   c                 |   dd l }ddlm} t        |       }|t        |      k7  r|j                  S |j                  d      }|j                  }||j                  |d   d      z  }|D ]R  }||j                  | |   d      ||   |k\  z  z  }|dk(  r||j                  ||d         z  }||    || |   d      z  }T |S )Nr   r  r	  )rS   rY  r  r  rY   rf   rX   r  )	r   r   r  rS   r  r  mr  r  s	            r   &sympy_is_channels_last_strides_genericr    s    0
e*C
c)n{{aA

A '!*a	  A *	UXXeAh"gajAo66 6!WQZ((A AJU1Xq))'** Hr   c                      t        | |g d      S r  r  r  s     r   !sympy_is_channels_last_strides_2dr    s    1%,OOr   c                      t        | |g d      S r  r  r  s     r   !sympy_is_channels_last_strides_3dr    s    1%/RRr   c                 "    ddl m}  |g | | S )Nr   )!IsNonOverlappingAndDenseIndicator)rY  r  )r   r   r  s      r   -_sympy_is_non_overlapping_and_dense_indicatorr    s    N,>e>g>>r   )r   r   r   r   r   r   )r   r   c                    t        |t              r|j                  S t        |      t        u r| j                  |      S t        |      t        u r| j                  |      S t        |      t        u r| j                  |      S t        S r   )r+   r,   rb   r1   r   rm   r   ri   r   rk   NotImplemented)r.   rh   s     r   r
  r
    sn    #x xx	cd	~~c""	cc	}}S!!	ce	s## r   c                    t        | t              r| j                  | j                  S | j                         rt	        |       S | j                         rt        |       S | j                         rt        |       S t        d|        )Nzunrecognized return type )
r+   r   r4   r\   r   r^   r   r`   r   AssertionErrorr?  s    r   	wrap_noder    sk    !W!**"8zzxxzay	
{	
qz8<==r   c                     t         |    S r   )METHOD_TO_OPERATOR)methods    r   r   r     s    f%%r   c                 F     t        d             t        v r  d}n } fd} fd} t        v rt        t        d| |       y  dk(  r fd}t        t        d| |       y  dk(  rd	 fd	}t        t        d| |       y t        t        d| |       y )
N   rV  c           
         ddl m}m} ddlm} t              }d }| j                  )|j                   || j                  |j                        }t        j                        }|r'|%t        |  |t        |       t        |                  S  |       r(t        |  ||t        |       t        |      fi             S t        |t              sJ 	 dk(  rddlm}m}	 | j                   }
| j"                  j$                  s(|
j'                  | j"                        j(                  dk\  r\|j"                  j$                  s(|
j'                  |j"                        j(                  dk\  r || j"                  |j"                        }n; |	| j"                  |j"                        }n | j"                  |j"                        } ||      }t0        j3                  d| j"                  |j"                  |       t4        v rt6        }nFt8        v rt:        }n7| j<                  t6        u s|j<                  t6        u rt6        }n| j<                  }||t        |t>              s ||      }| j                   jA                  || jB                  |jB                  f      \  }}t        || j                   |||      S # t*        $ r. t,        j/                  d| j"                  |j"                          w xY w)	Nr   get_proxy_modehandle_sym_dispatchsafe_expandr   re  failed to eval %s(%s, %s)z%s %s %s -> %sr  )""torch.fx.experimental.proxy_tensorr  r  r'   r  r   r!    alternate_impl_if_hinted_methodsgetr
  r  r+   r   rY  rf  rg  r)   r(   rh  bound_sympylowerr  r  r  sym_node_logdebugalways_float_magic_methodsr   always_bool_magic_methodsr   r-   r,   _create_fx_call_functionr5   )r.   r<   r  r  r  opout_hintalternate_implrf  rg  r)   outr-   r5   rV  funcr  s                  r   binary_magic_implz+_make_node_magic.<locals>.binary_magic_impl  sm   	
 	F'99 UZZ%;$))UZZ0H9==fEh24	$5AQ!RSS)"y	%@P.QSUV  %)))	G !NN	II,, ,,TYY7==BJJ-- ,,UZZ8>>!Cdii4C#DIIuzz:C 499ejj1 #+VTYY

CP //F00F[[E!U\\U%:F[[F $x2h'H ^^<<u}}-

 sDNNFHgNNE  	KK3VTYY

S	s   C.J5 57K,c           	         ddl m}m} ddlm} t              } |       rt        |  ||t        |       fi             S | j                  }dk(  sdk(  r| j                  j                  |      }	  |      }t        j                  d||       d }| j                    || j                         } ||      }t"        v rt$        }n*t&        v rt(        }nt*        v rt,        }n| j.                  }| j                  j1                  || j2                  f      \  }	}
t5        || j                  |||	      S # t        $ r t        j                  d|        w xY w)	Nr   r  r  r   ceilingzfailed to eval %s(%s)z%s %s -> %sr  )r  r  r  r'   r  r   r
  r  r(   r)   _simplify_floor_divr  r  r  r  r  r!   always_int_magic_methodsr   r  r   r  r   r-   r   r5   r   )r.   r  r  r  r  r(   r  r  r-   r5   rV  r  r  s              r   unary_magic_implz*_make_node_magic.<locals>.unary_magic_implk  sA   	
 	F'4!4R)D/9KR!PQQyyW) 3>>55d;D	t*C 	=$c:99 $))}H#--F00F11F[[F^^<<R$,,Q
sDNNFHgNN'  	KK/>	s   2D7 7"Er
   c                    ddl m}m} ddlm} | j
                  r|j
                  n|j
                  } |       r6t        |  |t        t        |       t        |      t        |      fi             S 	  
| j                  |j                  |j                        } ||      }| j                  j                  t        | j                  |j                  |j                  f      \  }}	t!        || j                  |j"                  ||      S # t        $ r9 t        j                  d| j                  |j                  |j                          w xY w)Nr   r  r  zfailed to eval %s(%s, %s, %s)r  )r  r  r  r'   r  r!   r
  r
   r  r(   r  r  r  r)   r   r5   r   r-   )	pred_node	then_node	else_noder  r  r  r  r  r5   rV  r  r  s             r   sym_ite_implz&_make_node_magic.<locals>.sym_ite_impl  s,    J)2y~~Y^^H'%i0%i0%i0
  
9>>9>>9>>J c"C",,EE)++Y->->	@Q@QRJGQ Y(()*:*:Hg   3NNNNNN s   2(D
 
AEr   c           	      D   ddl m}m} ddlm} t
        j                  } |       rt        |  ||t        |       |fi             S | j                  }	  ||      } ||      }|t        }n| j                  }d }	| j                   || j                  |      }	| j                   g}
||
j#                  |       | j$                  j'                  |t)        |
            \  }}t+        || j$                  ||	|      S # t        $ r t        j                  d||        w xY w)Nr   r  r  z!failed to eval %s(%s, ndigits=%s)r  )r  r  r  r'   r  r<  r   r
  r  r(   r  r  r  r   r-   r!   r5   rw   r)   r   tupler   )r.   r   r  r  r  r  r(   r  r-   r  r  r5   rV  r  r  s                r   
round_implz$_make_node_magic.<locals>.round_impl  s    JB-b9T?G2LbQ  99D4)
 c"CHyy$dii1 LL>D"G$@@U4[QJGQ3'RR5  ?wWs   	C< <#Dr   )r   2magic_methods_on_operator_with_trailing_underscoreunary_methodssetattrr   )r  r  method_attrr  r  r  r  s   ``     r   _make_node_magicr    s    9S>$DCClLO\$OL 1[M*,<=	9	(	T 	1[M*L9	7	*	SX 	1[M*J71[M*,=>r   c                       fd}t        t        d  |        fd}t        t        j                  t
                  s#t        t        j                  t
            |       y y )Nc                 "   ddl m}m} t        t        j
                  t                 } |       rDt        |  |||D cg c]  }t        |       c}|D cg c]  }t        |       c}fi             S |D cg c]  }|j                   }}|D cg c]  }|j                   }}	  ||      }	g }
d }|D ]+  }|j                   nX|
j                  |j                         - g }|D ]+  }|j                   n&|j                  |j                         -  ||
|      }j                  d      rt         }nt"        }t%        |	| j&                  ||      S c c}w c c}w c c}w c c}w # t        $ r t        j                  d||        w xY w)Nr   r  r  
_indicator)r  r  r  rF  sysmodulesr7  r
  r  r(   r  r  r  r!   rw   endswithr   r   r   r)   )r.   r   r   r  r  r  s
size_exprsstride_exprsr  
size_hintsr  stride_hintsr-   r  r  s                 r   sizes_strides_implz4_make_node_sizes_strides.<locals>.sizes_strides_impl  s   	

 S[[*F3#,12qil274SaYq\4ST  ',,aff,
,(/0100	z<0C 
 	8Avv~aff%	8
 L 866>##AFF+8
 j,7 ??<(FFsDNNFH==E 34S -0  	KK3VZV	s#   EE:E!E&)	E+ +#FrV  c                 "   dd l }ddlm} t        j                  | |      D ]~  }t        |t              st         t        |j                        | D cg c]  }t        |j                  |       c}|D cg c]  }t        |j                  |       c}            c S  dk(  r	 || |      S t         | D cg c]  }|j                  |       c}|D cg c]  }|j                  |       c}            S c c}w c c}w c c}w c c}w )Nr   )!eval_is_non_overlapping_and_denser   )rS   r'   r&  	itertoolschainr+   r   r  rF  rb   r
  r   sympify)r   r   rS   r&  rZ  r)  r  r  s         r   sizes_strides_userz4_make_node_sizes_strides.<locals>.sizes_strides_user+  s    	
 0 	A!V$ +GAFFF+5:;+;5<=+= 	 ==4UGDD /45!U]]1%5/67!U]]1%7  <= 67s   C=8D<DD)r  r   hasattrr  r  r7  )r  r  r$  r*  s   ``  r   _make_node_sizes_stridesr,    sS    .>` Gq\#56
6 3;;x(&1H%v/AB 2r   c                 H   	
  t         v rd  
n 
dt        t        t        t        t
        t        t        f   fdd 	 t        v rd nd  fd	 
fd}	 
fd	}	 
fd
} t        v rt        |d  d|       y  t        v r$t        |       }t        | t        ||             y  dk(  r
fd}t        |d  d|       y  dk(  rd	 fd	}t        |d  d|       y t        |d  d|        t        v rt        |d  d|       y y )NrU  r@  c                     t        | t        t        t        f      r| S t        | t              r| j
                  j                  dd      S t        d      )Nr  r   z*expect to be called with constant SymBools)r+   r   r   r   r   rb   r!  r  r?  s    r   get_constantz&_make_user_magic.<locals>.get_constantZ  sE    a#ud+,Ha!66$$R++IJJr   c                     t        | t        t        t        f      ryt        | t        t
        t        f      r| j                  j                         S y)NTF)	r+   r   r   r   r   r   r   rb   r6  r?  s    r   r6  z%_make_user_magic.<locals>.is_constanta  s=    a#ud+,a&(G4566%%''r   c                     t        | t              r-t        | j                  j	                  t        |                   S | S )z;Implements True+True=2, which works in python but not sympy)r+   r   r   rb   ri   r   r?  s    r   promotez!_make_user_magic.<locals>.promote  s-    !W%affooc!f566Hr   c                     | S r   ro   r?  s    r   r2  z!_make_user_magic.<locals>.promote  s    Hr   c                     dvr| |fS t        | t        t        j                  f      }t        |t        t        j                  f      }|s|r.|st        j                  |       } |st        j                  |      }| |fS )N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r+   r   r  r   r	   )r.   r<   f_selff_otherr  s       r   promote2z"_make_user_magic.<locals>.promote2  sy      
 
$ ;D5%.."9:UUENN$;<Wt,.U{r   c                      |       }  |       r t               |             S t         t        | j                                     S r   )r   r  rF  rb   )r.   r/  r6  r  r  r2  s    r   r  z*_make_user_magic.<locals>.unary_magic_impl  sH    t}t.&v.T0BCC8K8:;;r   c           	         t        |t        t        t        t        t
        t        f      st        S t        j                  d| |        |       }  |      } 	| |      \  } } |       r t               |       |      S  |      r |      }t        | j                  |      }|t        u rt        S t         t        | j                        |            } |      r |      S |S )NzMAGIC %s %s %s)r+   r   r   r   r   r   r   r  r  r  r   r
  rb   r  rF  
r.   r<   
other_noderetr/  r6  r  r  r2  r7  s
       r   r  z+_make_user_magic.<locals>.binary_magic_impl  s    %#udFHg!NO!!+VT5At}tU+et.&v.T0BEJJu 'ETYY.
'!!7		;7
CD$/$4|C =#=r   c           	         t        |t        t        t        t        t
        t        f      st        S  |       }  |      } 	| |      \  } } |       r t               |       |      S  |      r |      }t        | j                  |      }|t        u rt        S t         t        |      | j                              } |      r |      S |S r   )r+   r   r   r   r   r   r   r  r   r
  rb   r  rF  r:  s
       r   rbinary_magic_implz,_make_user_magic.<locals>.rbinary_magic_impl  s    %#udFHg!NO!!t}tU+et.&v.T0BEJJu 'ETYY.
'!!8
K8CD$/$4|C =#=r   __r
   c                    | j                   }t        ||      }t        ||      }|t        u s|t        u rt        S t        |t              r)t        |t              r|j
                  |j
                  k(  sJ t         t        | j                         ||            }|j                   j                         r |      S |S r   )	rb   r
  r  r+   r   r-   r  rF  r6  )	predr   r   r  r  r  r<  r/  r  s	          r   sym_ite_magic_implz,_make_user_magic.<locals>.sym_ite_magic_impl  s    		I	84I	84IN*i>.I%%9g.y'2$$	(8(889 ;GDII{;IyQRC(+(<(<(><$GCGr   r   c                      |       rt        j                   |       |      S t         t        | j                        |            S r   )r<  r   r  rF  rb   )r.   r   r/  r6  r  s     r   round_magic_implz*_make_user_magic.<locals>.round_magic_impl  s?    4 ~~l4&8'BB7WTYY7@AAr   __rr   )r  r   r   r   r   r   r   r   bool_becomes_int_magic_methodsunary_magic_methodsr  unary_nonmagic_methodsrF  r   reflectable_magic_methods)r  	user_typer  r  r>  origrB  rD  r/  r6  r  r2  r7  s   `       @@@@@r   _make_user_magicrL  Q  sI    CCVHoKfc8UGTIJ KB //		!T< <> >"> >  $$	Rxr?,<=	)	)y&)	6>2BD#IJ	9		H 		Rxr?,>?	7		B 		Rxr?,<=	Rxr?,=>..IVHB/1CD /r   r   )r:  r<  r'  loggingmathoperatorr  	functoolsr   r   typingr   r   r   r   r  r	   r
   r   r   r   r   r   r   r'   r   	getLoggerr7  r  _logginggetArtifactLoggerr  __all__torch.typesr   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  rG  rJ  math_op_namesrG  sym_namepriv_sym_namer  rF  rw   rH  r  only_bool_magic_methodsrF  also_bool_magic_methodsbool_magic_methodsonly_float_magic_methodsr  r  r
  r  r[  r_  rb  ri  rl  ro  rs  rv  rz  r~  rI  r  r  r  r  r  r  r  r  r  r  r  r  r  r  current_moduler  priv_sympy_namerH  r9  r  r  r  r  invertr   r  r  r  r  r  r  r  r  sizes_strides_methodsminmaxr  r
  r  r   r  r,  itemsr  r  rL  ro   r   r   <module>re     s        
 / 7 7 	 	 	 >g!~~//*E = 1J J\!	8<<!	8<<! 
8<<! 
8==	!
 DII! 	(++! TZZ! TZZ! H%%! 	(++! 	(++! *! 	(++! hoo! 	(++!  
8<<!!" 
8<<#!$ ++<<
,,ll^^oo<<%%##A! F
   DdV}HzNMGX/56#*5-#@x H%NN8   $&<< > !6 & ,/FF  >  7<T] 2 X  -DdV}H""8,-
 H  " <<<<<<+!
)%# "$. X&  1Dv&O	$	B$33BObkNOR0	1 o-0x 
8<< 	)	
 	) 	) 	) 	) 	) \ \ ! K 
8<< z  z!" z#$ 
:%& #)0  HDdV}H%nv6FGM(H 	(M>U
0EH%PPS? )&J&J#D#D.[	  ||||$  >&[?|TCn "'') #LFDVT"# *//1 +LFDVT*+qEh "'') 
'LFD(()))*((F6T,T)VV$VX&
' r   