
    9j                     *   d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZm	Z	 d dl
mZmZ d dlZd dlmZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZ d d
lmZ d dlmZmZ d dlmZ d dl m!Z! d dl"m#Z# d dl$m%Z% d dl&m'Z' ddl(m)Z)m*Z* erd dlm+Z+  e	de      Z, ed      Z-g dZ.dej$                  de/fdZ0deee-   ge,f   deee-   ge,ejb                  z  f   fdZ2de/dz  de/dz  de/dz  fdZ3d ejh                  d!ejh                  dejh                  fd"Z5 G d# d$ejl                        Z7 G d% d&ejl                        Z8 G d' d(ejl                        Z9 G d) d*ejl                        Z: G d+ d,ejl                        Z; G d- d.e7      Z< G d/ d0ejl                        Z= G d1 d2ejl                        Z> G d3 d4ejl                        Z? G d5 d6ejl                        Z@ G d7 d8ejl                        ZA G d9 d:ee      ZB G d; d<eBe      ZC G d= d>eBe      ZDd? ZEd@ ZF G dA dBejl                        ZG G dC dDejl                        ZH G dE dFejl                        ZI G dG dHejl                        ZJ G dI dJejl                        ZK G dK dLejl                        ZL G dM dNejl                        ZM G dO dPejl                        ZN G dQ dRejl                        ZO G dS dTejl                        ZP G dU dVejl                        ZQdW ZR eRdX      ZS eRdY      ZT eRdZ      ZU eRd[      ZV eRd\      ZW eRd]      ZX eRd^      ZY eRd_      ZZ eRd`      Z[ eRda      Z\ eRdb      Z] eRdc      Z^ eRdd      Z_ eRde      Z`df Za eadgdh      Zb eadidj      Zc eadkdl      Zdy)m    N)Callable)SupportsFloatTYPE_CHECKINGTypeVar)TypeVarTupleUnpack)Ssympify)Expr)Application)_torf	fuzzy_andfuzzy_or)equal_valued)	LatticeOpShortCircuit)ordered)walk)
PRECEDENCE)sift)TorchVersion   )int_oois_infinite)Iterable_T)bound_Ts)FloorDivModularIndexingWhere	PythonModModCleanDiv	CeilToInt
FloorToIntCeilDiv
IntTrueDivFloatTrueDivLShiftRShift!IsNonOverlappingAndDenseIndicatorTruncToFloat
TruncToInt
RoundToIntRoundDecimalToFloatFloatPowPowByNaturalIdentityexprreturnc                 2   t        | t        j                        xr| | j                  xrn t	        | j
                        dk(  xrT | j
                  d   j                  xr9 | j
                  d   j                  xr | j
                  d   | j
                  d   uS )N   r   r   )
isinstancesympyr   is_Addlen_args	is_symbol)r6   s    \/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/utils/_sympy/functions.py_is_symbols_binary_summationrA   \   s     	4$ 	/KK	/

Oq 	/ JJqM##	/ JJqM##		/
 JJqMA.    fc                      t        j                         dt        t           dt        t
        j                  z  f fd       }|S )Nargsr7   c                       |  }t        d | D              r8t        |t        j                        st        j                  t	        |            }|S )Nc              3   P   K   | ]  }t        |t        j                           y wN)r:   r;   Float.0as     r@   	<genexpr>z-_keep_float.<locals>.inner.<locals>.<genexpr>n   s     8az!U[[)8   $&)anyr:   r;   rI   float)rE   rrC   s     r@   innerz_keep_float.<locals>.innerk   sD    h8488u{{B
 E!H%ArB   )	functoolswrapsr   r   r   r;   rI   )rC   rR   s   ` r@   _keep_floatrU   h   sB     __QVC[ R%++%5   LrB   xyc                     d | |fv ry | |k(  S rH    )rV   rW   s     r@   fuzzy_eqrZ   x   s    1v~6MrB   pqc                    dt         j                  dt        fddt         j                  dt        ffd}t        j                   ||        ||            }| |z  ||z  }} t        t        t         j                  j                  t         j                  j                  |                   }t         j                  j                  |      }|D ]  t        fd|D              s|z  } |S )a  
    Fast path for sympy.gcd, using a simple factoring strategy.

    We try to rewrite p and q in the form n*e*p1 + n*e*p2 and n*e*q0,
    where n is the greatest common integer factor and e is the largest
    syntactic common factor (i.e., common sub-expression) in p and q.
    Then the gcd returned is n*e, cancelling which we would be left with
    p1 + p2 and q0.

    Note that further factoring of p1 + p2 and q0 might be possible with
    sympy.factor (which uses domain-specific theories). E.g., we are unable
    to find that x*y + x + y + 1 is divisible by x + 1. More generally,
    when q is of the form q1 + q2 (instead of being already factored) it
    might be necessary to fall back on sympy.gcd.
    rV   r7   c                     t         j                  j                  |       D cg c]6  }t        |t        t         j
                  f      rt        t	        |            8 }}t        j                  |      S c c}w rH   )	r;   Mul	make_argsr:   intIntegerabsmathprod)rV   arginteger_coefficientss      r@   integer_coefficientz0simple_floordiv_gcd.<locals>.integer_coefficient   sc     yy**1-+
#U]]34 CM+
 +

 yy-..+
s   ;A4r6   c                     t        t        j                  j                  |             }t	        j
                  t        j                  |      S rH   )mapr;   Addr`   rS   reducerd   gcd)r6   integer_factorsrh   s     r@   integer_factorz+simple_floordiv_gcd.<locals>.integer_factor   s:    ),!4!4T!:*
 /::rB   c              3   &   K   | ]  }|v  
 y wrH   rY   )rK   
base_splitrV   s     r@   rM   z&simple_floordiv_gcd.<locals>.<genexpr>   s     =:qJ=s   )r;   Basicra   rd   rm   listrj   r_   r`   rk   all)r[   r\   ro   rm   base_splitsdivisor_splitrh   rV   s         @@r@   simple_floordiv_gcdrw   ~   s    "/u{{ /s /;U[[ ;S ; xxq)>!+<=Cs7AGqA15EII!4!4Q!782K .3YY-@-@-CM ==='C JrB   c                   D   e Zd ZU dZdZeedf   ed<   dZeed<   dZ	e
ed<   ed	ej                  fd
       Zed	ej                  fd       Zdej                   j"                  d	efdZedej*                  dej*                  d	ej                  dz  fd       Zd	e
dz  fdZy)r    a  
    We maintain this so that:
    1. We can use divisibility guards to simplify FloorDiv(a, b) to a / b.
    2. Printing out the expression is nicer (compared to say, representing a//b as (a - a % b) / b)

    NB: This is Python-style floor division, round to -Inf
    r9   .nargs#   
precedenceT
is_integerr7   c                      | j                   d   S Nr   rE   selfs    r@   basezFloorDiv.base       yy|rB   c                      | j                   d   S Nr   r   r   s    r@   divisorzFloorDiv.divisor   r   rB   printerc                     |j                  | j                  t        d   dz
        }|j                  | j                  t        d   dz
        }d| d| dS )NAtom      ?(z//))parenthesizer   r   r   r   r   r   r   s       r@   	_sympystrzFloorDiv._sympystr   sW    ##DIIz&/AC/GH&&t||Z5G#5MN4&7)1%%rB   r   r   Nc                    |j                   rt        d      t        |      rt        |      rt        j                  S |t        j                  u s|t        j                  u rt        j                  S |j                   rt        j
                  j                  S |j                  rt        |d      r|S |j                  r"t        |d      rt        j                  |d      S ||k(  rt        j
                  j                  S t        |t        j                        rt        |t        j                        rt        |      st        |      rt        |      t        |      z  }|t        j                  k(  rt         S |t        j                   k(  rt          S t        j"                  |      rt        j                  S t        j$                  t        j&                  |            S t        |t        j$                        rDt        |t        j$                        r*t        j$                  t)        |      t)        |      z        S t        |t*              r)t+        |j,                  d   |j,                  d   |z        S t        |t        j$                        rd}g }t        j.                  j1                  |      D ]  }||z  }d }t        |t        j                        rgt3        t        j4                        t3        d      k  rB|j7                  t        j8                        }	t;        d |	D              }
|j                  xr |
}n|j                  }|s|j=                  |       ||z  } t?        |      dk7  r%t+        |t        j.                  |ddiz
  |      |z   S 	 tA        ||      }t        |d      r0t        |t        j.                        rt        jB                  ||      }t        |d      s8t+        t        jD                  ||z        t        jD                  ||z              S 	 y # t        jF                  $ r Y y w xY w)	Ndivision by zeror   r   z1.15.0c              3   :   K   | ]  }|j                   d k(    yw)r   N)r\   )rK   rQ   s     r@   rM   z FloorDiv.eval.<locals>.<genexpr>  s     ,I!QSSAX,Is   evaluateF)$is_zeroZeroDivisionErrorr   r;   nanr	   Zeror}   r   r_   Oner:   NumberrP   rd   infr   isnanrb   floorra   r    rE   rk   r`   r   __version__atomsRationalrt   appendr=   rw   rm   simplifyPolynomialError)clsr   r   rQ   	quotientstermstermquotientquotient_is_integer	rationalsall_rationals_intsrm   s               r@   evalzFloorDiv.eval   sA    ??#$677tW!599599599 499<<77<<??|GQ7K??|GR899T2&&7?77;; tU\\*7ELL1T"k'&:deGn,ADHH}txxiwAyy }}TZZ]33dEMM*z'5==/Q==Tc'l!:;;dH%DIIaL$))A,*@AA gu}}-IE		++D1 *'>
 '+#h		2|%%8 *8+ !)u~~ >I),,Iy,I)I&*2*=*=*TBT'*2*=*='&LL&)I%*( 5zQ TEIIu$Eu$EEwO 
		%dG4CC#
7EII(Fiig.Q'NN4#:.w}0M  (  $$ 		s   BP* *Q ?Q c                     | j                   d d \  }}t        |j                  |j                  |j                  |j                  g      ryy )Nr9   T)rE   rt   r}   is_nonnegativer   r[   r\   s      r@   _eval_is_nonnegativezFloorDiv._eval_is_nonnegative1  s@    yy!}1allA,<,<a>N>NOPrB   )__name__
__module____qualname____doc__rz   tuplera   __annotations__r|   r}   boolpropertyr;   rr   r   r   printing
StrPrinterstrr   classmethodrb   r   r   rY   rB   r@   r    r       s     "E5c?!JJekk     &!:!: &s & V V V%++PTBT V VpdTk rB   r    c            
           e Zd ZU dZdZeedf   ed<   dZe	ed<   dZ
eed<   ed	ej                  d
ej                  dej                  dej                  dz  fd       Zde	dz  fdZy)r!   zK
    ModularIndexing(a, b, c) => (a // b) % c where % is the C modulus
       .rz   Tr}   r{   r|   r   r   modulusr7   Nc                 r   |dk(  s|dk(  rt         j                  j                  S t        |t         j                        r<t        |t         j                        r"t        |t         j                        r||z  |z  S 	 |dk7  rTt        j
                  ||      }|dk7  r9t        t        j                  ||z        t        j                  ||z        |      S t        |t         j                        rg }d}|j                  D ]  }t        j
                  |||z        ||z  k7  s#t        |t         j                        r|dk  sSt        |t         j                        r=t        |j                  d   t         j                        r|j                  d   dk  rd} n|j                  |        t        |      t        |j                        k7  r|rt        t        |      ||      S t        |t              r*t        |j                  d   |j                  d   |z  |      S y # t         j                  $ r Y `w xY w)Nr   r   TF)r;   r	   r   r:   rb   rm   r!   r   r   rk   rE   r_   r   r=   sumr    )r   r   r   r   rm   	new_termsall_positiver   s           r@   r   zModularIndexing.evalA  s    19177<<tU]]+7EMM27EMM2GOw..
	!|iig.!8*tcz2w}5  dEII&-/I!%L		 /99T7W#4579JJ"47D1H"43&tyy|U]]C IIaL1, (-!((./  9~TYY/L&s9~wHHdH%"499Q<11GQQ9 $$ 		s   <AH H65H6c                 f    | j                   d d \  }}t        |j                  |j                        S )Nr9   )rE   rZ   r   r   s      r@   r   z$ModularIndexing._eval_is_nonnegativeu  s.    yy!}1((!*:*:;;rB   )r   r   r   r   rz   r   ra   r   r}   r   r|   r   r;   rb   rr   r   r   rY   rB   r@   r!   r!   8  s     "E5c?!JJ1==1+0==1CH==1	t	1 1f<dTk <rB   r!   c            
           e Zd ZU dZdZeedf   ed<   dZeed<   de	dz  fd	Z
de	dz  fd
Zde	dz  fdZedej                  dej                  dej                  dej                  dz  fd       Zy)r"   z#
    Good ol' ternary operator
    r   .rz   r{   r|   r7   Nc                 n    | j                   d   j                  r| j                   d   j                  rdS d S Nr   r9   TrE   r}   r   s    r@   _eval_is_integerzWhere._eval_is_integer  s.    yy|..499Q<3J3JtTPTTrB   c                 n    | j                   d   j                  r| j                   d   j                  rdS d S r   )rE   r   r   s    r@   r   zWhere._eval_is_nonnegative  s9     yy|**tyy|/J/J 	
 	
rB   c                 n    | j                   d   j                  r| j                   d   j                  rdS d S r   rE   is_positiver   s    r@   _eval_is_positivezWhere._eval_is_positive  s.    yy|//DIIaL4L4LtVRVVrB   cr[   r\   c                 X    |t         j                  k(  r|S |t         j                  k(  r|S y rH   )r;   truefalse)r   r   r[   r\   s       r@   r   z
Where.eval  s&    

?H%++HrB   )r   r   r   r   rz   r   ra   r   r|   r   r   r   r   r   r;   rr   r   rY   rB   r@   r"   r"   z  s     "E5c?!JU$+ U
dTk 
W4$; W U[[ U[[ U[[ U[[SWEW  rB   r"   c                       e Zd ZU dZeedf   ed<   dZeed<   dZe	ed<   e
dej                  d	ej                  d
ej                  dz  fd       Zd
e	dz  fdZd
e	dz  fdZd
efdZy)r#   ry   .rz   r{   r|   Tr}   r[   r\   r7   Nc                 B   |j                   rt        d      |t        j                  u s||| fv s|dk(  rt        j                  S |j                  r|j                  r||z  S |j                  r=|dk(  r8|j
                  rt        j                  S |j                  rt        j                  S ||z  }|j                  rt        j                  S ||k  }|j                  rt        |      r|j                  r|S t        j                  ||      dk(  rt        j                  S y )NModulo by zeror   r9   r   )r   r   r	   r   	is_Numberis_evenis_oddr   r}   
is_Booleanr   r   r;   r$   r   r[   r\   rQ   lesss        r@   r   zPythonMod.eval  s     99#$455 ;!A2w,!q&66M ;;1;;q5L ;;16yyvvxxuu E<<66M
 1u??tDzammH99Q?a66MrB   c                 <    | j                   d   j                  rdS d S Nr   Tr   r   s    r@   r   zPythonMod._eval_is_nonnegative      yy|//t9T9rB   c                 <    | j                   d   j                  rdS d S r   )rE   is_negativer   s    r@   _eval_is_nonpositivezPythonMod._eval_is_nonpositive  r   rB   c                 (   |j                  | j                  d   t        d   dz
        }|j                  | j                  d   t        d   dz
        }| j                  d   j                  rt	        |      nd| d}d| d| d	| d| d
| d| d| S )Nr   r   r   r   zabs(r   r   z % z) < 0 ? z + z : )r   rE   r   r   r   )r   r   r[   r\   abs_qs        r@   _ccodezPythonMod._ccode  s      1z&/AC/GH  1z&/AC/GH))A,22A$qc1#S8A3c!Cwc!CsCCrB   )r   r   r   rz   r   ra   r   r|   r}   r   r   r;   r   r   r   r   r   r   rY   rB   r@   r#   r#     s    !E5c?!JJ+UZZ +EJJ +5::3D + +\:dTk ::dTk :D DrB   r#   c                   8    e Zd ZU dZdZeed<   dZdZe	d        Z
y)r$   ry   r{   r|   Tc                 4   |j                   rt        d      |t        j                  u s||| fv s|dk(  rt        j                  S |j                  r1|j                  r%|dk  rt        |      |dk  rt        |      ||z  S |j                  r=|dk(  r8|j                  rt        j                  S |j                  rt        j                  S ||z  }|j                  rt        j                  S ||k  }|j                  rt        |      r|j                  r|S y y y )Nr   r   r   r9   )r   r   r	   r   r   AssertionErrorr   r   r   r}   r   r   r   r   s        r@   r   zMod.eval  s     99#$455 ;!A2w,!q&66M ;;1;;1u$Q''1u$Q''q5L ;;16yyvvxxuu E<<66M
 1u??tDzammH /<z?rB   N)r   r   r   rz   r|   ra   r   r}   r   r   r   rY   rB   r@   r$   r$     s-    EJJN+ +rB   r$   c                       e Zd ZdZy)r%   zZ
    Div where we can assume no rounding.
    This is to enable future optimizations.
    N)r   r   r   r   rY   rB   r@   r%   r%     s    rB   r%   c                   ,    e Zd ZdZed        ZdefdZy)r&   Tc                    |t         j                  t        fv rt        S |t         j                   t         fv rt         S t        |t         j                        r1t        j
                  t        j                  t        |                  S y rH   )	r;   oor   r:   r   rb   rd   ceilrP   r   numbers     r@   r   zCeilToInt.eval  se     ehh''Muxxi&))7Nfell+==5=!9:: ,rB   r7   c                     |j                  | j                  d   | j                  d   j                  dz
        }d| dS )Nr   r   zceil(r   )r   rE   r|   )r   r   r   s      r@   r   zCeilToInt._ccode(  s>    %%diilDIIaL4K4Kc4QRvha  rB   N)r   r   r   r}   r   r   r   r   rY   rB   r@   r&   r&     s%    J; ;! !rB   r&   c                        e Zd ZdZed        Zy)r'   Tc                 N   |t         j                  t        fv rt        S |t         j                   t        fv rt         S t        |t         j                        r|S t        |t         j
                        r1t        j                  t        j                  t        |                  S y rH   )	r;   r   r   r:   rb   r   rd   r   rP   r   s     r@   r   zFloorToInt.eval0  st    ehh''Muxxi((7Nfemm,Mfell+==E&M!:;; ,rB   Nr   r   r   r}   r   r   rY   rB   r@   r'   r'   -  s    J< <rB   r'   c                       e Zd ZdZdZd Zy)r(   z.
    Div used in indexing that rounds up.
    Tc                     t        j                  |      }t        j                  |      }t        j                  ||      |k(  rt        ||      S t	        ||dz
  z   |      S r   )r;   r   rm   r%   r    r   r   r   s      r@   __new__zCeilDiv.__new__C  sT    }}T"--(99T7#w.D'**DGaK0'::rB   N)r   r   r   r   r}   r   rY   rB   r@   r(   r(   <  s     J;rB   r(   c                        e Zd ZdZed        Zy)r+   Tc                 2    |dk  rt        d      |d|z  z  S Nr   znegative shift countr9   )
ValueErrorr   r   shifts      r@   r   zLShift.evalO  s#    19344ahrB   Nr   rY   rB   r@   r+   r+   L  s    J rB   r+   c                        e Zd ZdZed        Zy)r,   Tc                 @    |dk  rt        d      t        |d|z        S r   )r   r    r   s      r@   r   zRShift.evalY  s&    19344ah''rB   Nr   rY   rB   r@   r,   r,   V  s    J( (rB   r,   c                      e Zd Zd Zedeej                  j                  j                     dz  fd       Z
e	 d$deej                  j                  j                     dz  deej                  j                  j                     dz  fd       Zed        Zed        Ze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 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(y)%
MinMaxBasec                 &   ddl m} |j                  d|j                        }d |D        }|sd n| j	                  |      }|rC	 t        | j                  |            }|& | j                  |fi |} | j                  |fi |}t        |      }|s| j                  S t        |      dk(  rt        |      j                         S t        j                  | gt!        |      i |}||_        ||_        |S # t        $ r | j                  cY S w xY w)Nr   )global_parametersr   c              3   2   K   | ]  }t        |        y wrH   r
   )rK   rf   s     r@   rM   z%MinMaxBase.__new__.<locals>.<genexpr>e  s     66s   r   )sympy.core.parametersr  popr   "_satisfy_unique_summations_symbols	frozenset_new_args_filterr   zero_collapse_arguments_find_localzerosidentityr=   rs   r   r   r   _argsetunique_summations_symbols)r   original_argsassumptionsr  r   rE   r  objs           r@   r   zMinMaxBase.__new__a  s   ;??:/@/I/IJ66
  77F 	"   !!5!5d!;< )0.s..tC{C ,s++D@K@<<t9>:>>## ll3>>+>(A%
3    xx s   C8 8DDr7   Nc                 *   t        |      dk7  ryt        |d   t              r
|d   |d   fn	|d   |d   f\  }}t        |      syt        |      r| j	                  |      S t        |t              r"t        |dd      }|| j	                  |g|      S y)a  
        One common case in some models is building expressions of the form
        max(max(max(a+b...), c+d), e+f) which is simplified to max(a+b, c+d, e+f, ...).
        For such expressions, we call the Max constructor X times (once for each nested
        max) and the expression gets flattened.

        An expensive cost in constructing those expressions is running _collapse_arguments
        and _find_localzeros. However, those two optimizations are unnecessary when the args
        to max are all of the form a+b, c+d, ..etc where each term uses a unique set of symbols.

        This function is used to detect such properties of the expressions we are building
        and if so inform that we do not need to run those optimizations. To detect those,
        we store a property in the expression that tells that this expression is a min/max
        operation over terms that use unique symbols "unique_summations_symbols". This property
        also memoize the set of symbols used in all the terms to make it faster to detect this
        property inductively.

        When we apply max to add a new term, all we need to do is check if the new term uses
        unique symbols (with respect to existing terms and itself).
        Example:
        t = Max(a+b, c+d) ==> satisfies the property
        Max(t, h+j)       ==> h,j not in [a,b,c,d] => satisfy the property.

        The function returns None if the new expression does not satisfy the unique_summations_symbols
        property. Otherwise, it returns a new set of unique symbols.
        r9   Nr   r   r  )r=   r:   r  rA   _unique_symbolsgetattr)r   rE   lhsrhslhs_unique_summations_symbolss        r@   r  z-MinMaxBase._satisfy_unique_summations_symbols  s    < t9> $q':. !Wd1gq'47# 	c ,C0 (,&&t,, c:&,30$-) -8**C52OPPrB   initial_setc                    |
t               n|j                         }|D ]`  }|j                         D ]K  }t        |t        j
                  j                  j                        s  y||v r  y|j                  |       M b |S )z
        Return seen_symbols if all atoms in all args are all unique symbols,
        else returns None. initial_set can be used to represent initial value for seen_symbols
        N)	setcopyr   r:   r;   coresymbolSymboladd)r   rE   r  seen_symbolsrf   elements         r@   r  zMinMaxBase._unique_symbols  s}     !, 3su9I9I9K 	.C99; .!'5::+<+<+C+CD, $$W-.	. rB   c                     |s|S t        t        |            } t        u rt        nt        |d   j                  rg g fx}\  }}|D ]X  }t        |t        t              D ]>  }|j                  d   j                  s|t        |t                 j                  |       @ Z t        j                  }|D ])  }|j                  d   }|j                  s||k  dk(  s(|}+ t        j                  }	|D ])  }|j                  d   }|j                  s||	kD  dk(  s(|}	+  t        u r!|D ]  }
|
j                  s n7|
|k  dk(  s|
} n) t        k(  r |D ]  }
|
j                  s n|
|	kD  dk(  s|
}	 d} t        u r|t        j                  k7  r$t        |}n|	t        j                  k7  rt        |	}|`t        t        |            D ]I  }||   }t        |      s|j                  d   }t        k(  r||kD  n||k  dk(  s; j                  ||<   K  fdt        |      D ](  \  }}||dz   d D cg c]  } ||       c}||dz   d *  fd}t        |      dkD  r ||      }|S c c}w )a}  Remove redundant args.

        Examples
        ========

        >>> from sympy import Min, Max
        >>> from sympy.abc import a, b, c, d, e

        Any arg in parent that appears in any
        parent-like function in any of the flat args
        of parent can be removed from that sub-arg:

        >>> Min(a, Max(b, Min(a, c, d)))
        Min(a, Max(b, Min(c, d)))

        If the arg of parent appears in an opposite-than parent
        function in any of the flat args of parent that function
        can be replaced with the arg:

        >>> Min(a, Max(b, Min(c, d, Max(a, e))))
        Min(a, Max(b, Min(a, c, d)))
        r   TNc           	      T   t        | t        t        f      s| S || j                  v }|s1 | j                  | j                  D cg c]  } ||       c}ddiS t        |       r7 | j                  | j                  D cg c]  }||k7  s	 ||       c}ddiS |S c c}w c c}w )Nr   F)r:   MinMaxrE   func)airL   condir   dos       r@   r,  z*MinMaxBase._collapse_arguments.<locals>.do0  s    b3*-	<Drww277 ;aAq ;LeLL"c"rww277 Eaa1fAq EVPUVVH !< Es   B 
B%B%r   c                    fd}t        | |d      \  }}|s| S |D cg c]  }t        |j                         }}t        j                  | }|s| S t	        |      }|D cg c]  }||z
  	 }	}t        |	      r,|	D 
cg c]
  }
 |
ddi }}
|j                   |ddi        |ddi}||gz   S c c}w c c}w c c}
w )Nc                     t        |       S rH   )r:   )rf   others    r@   <lambda>zGMinMaxBase._collapse_arguments.<locals>.factor_minmax.<locals>.<lambda>E  s    :c5#9 rB   T)binaryr   F)r   r  rE   intersectionrs   rt   r   )rE   is_other
other_argsremaining_argsrf   arg_setscommonnew_other_argsarg_setarg_sets_diffsother_args_diffother_args_factoredr   r/  s                r@   factor_minmaxz5MinMaxBase._collapse_arguments.<locals>.factor_minmaxD  s    9H)-dHT)J&J 2<<#CHH<H<%%x0F!&\N=EF'Wv-FMF =!FS"T5!#<e#<"T"T%%c?&KU&KL"'"H%"H!%8$999 = G
 #Us   B6#B; C )rs   r   r&  r'  	is_numberr   rE   is_comparabler:   r   r  ranger=   	enumerate)r   rE   r  siftedminsmaxsr+  vsmallbigrf   TrL   a0r)  r>  r,  r/  s   `               @@r@   r  zMinMaxBase._collapse_arguments  s   0 KGDM"#:EE
 7"$b&(FZT4 =ac* =Avvay..z!S1299!<== LLE FF1I;;AI$#6E ,,C FF1I;;AG#4C cz $C==e, #	$
  "C==c	d*!	"
 AczCLL(EA$}s4y) 3AQA!!U+VVAY(-R!V26!" '*llDG3	 dO 	@DAq15a!eg?2RAY?DQM	@	:0 t9q= &DI @s   9I2c              #   L  K   |D ]  }t        |t              r&|j                  du s|j                  r|j                  st        d| d      || j                  k(  rt        |      || j                  k(  rr|j                  | k(  r|j                  E d{    |  y7 w)z
        Generator filtering args.

        first standard filter, for cls.zero and cls.identity.
        Also reshape ``Max(a, Max(b, c))`` to ``Max(a, b, c)``,
        and check arguments for comparability
        FzThe argument 'z' is not comparable.N)r:   r   is_extended_realr?  r@  r   r  r   r  r(  rE   )r   arg_sequencerf   s      r@   r
  zMinMaxBase._new_args_filtera  s        	C sD)''50MM#*;*; >#6J!KLLchh"3''$S88##	!	 $s   BB$B"B$c                    t               }d}|D ]\  }|j                  r=||}| t        u rt        ||      })| t        u rt        ||      }>t        d|        |j                  |       ^ ||S t        |      dk(  r|hS t        |      dk(  rOt        t        |            }|dv r|j                  r| t        u r|S |hS |dk(  r|j                  r| t        u r|S |hS |j                  |       |S )a  
        Sequentially allocate values to localzeros.

        When a value is identified as being more extreme than another member it
        replaces that member; if this is never true, then the value is simply
        appended to the localzeros.

        Unlike the sympy implementation, we only look for zero and one, we don't
        do generic is connected test pairwise which is slow
        Nzimpossible r   r   )g        r   )r  r   r'  maxr&  minr   r!  r=   nextiterr   r   )r   valuesoptionsother_values	num_valuerf   other_values          r@   r  zMinMaxBase._find_localzeros|  s    u	 	&C}}$ #Icz$'	3$7	$'	3$7	,{3%-@AA  %	& |!;|!tL12KH$)C)C'*cz|B	{BA~+"9"9'*cz|B	{B#rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   )is_algebraicrK   r+  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>       (HA(H   r   rE   r;  s    r@   r0  zMinMaxBase.<lambda>      5(H(H#H rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   )is_antihermitianr[  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>        - 	
-r]  r^  r_  s    r@   r0  zMinMaxBase.<lambda>      u -- ( rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   )is_commutativer[  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>        + 	
+r]  r^  r_  s    r@   r0  zMinMaxBase.<lambda>      U ++ & rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   )
is_complexr[  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>       &Dq||&Dr]  r^  r_  s    r@   r0  zMinMaxBase.<lambda>      &DQVV&D!D rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   )is_compositer[  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r\  r]  r^  r_  s    r@   r0  zMinMaxBase.<lambda>  r`  rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   )r   r[  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>       #>!AII#>r]  r^  r_  s    r@   r0  zMinMaxBase.<lambda>      e#>qvv#>> rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   )	is_finiter[  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  s     %Baakk%Br]  r^  r_  s    r@   r0  zMinMaxBase.<lambda>  s    %B166%B B rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   )is_hermitianr[  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r\  r]  r^  r_  s    r@   r0  zMinMaxBase.<lambda>  r`  rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   )is_imaginaryr[  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r\  r]  r^  r_  s    r@   r0  zMinMaxBase.<lambda>  r`  rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   )r   r[  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>       'F!'Fr]  r^  r_  s    r@   r0  zMinMaxBase.<lambda>      %'Fqvv'F"F rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   )r}   r[  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rn  r]  r^  r_  s    r@   r0  zMinMaxBase.<lambda>  ro  rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   )is_irrationalr[  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>       )Ja!//)Jr]  r^  r_  s    r@   r0  zMinMaxBase.<lambda>      E)J166)J$J rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   r   r[  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r  r]  r^  r_  s    r@   r0  zMinMaxBase.<lambda>  r  rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   )is_nonintegerr[  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r  r]  r^  r_  s    r@   r0  zMinMaxBase.<lambda>  r  rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   r   r[  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  ri  r]  r^  r_  s    r@   r0  zMinMaxBase.<lambda>  rj  rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   )is_nonpositiver[  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  ri  r]  r^  r_  s    r@   r0  zMinMaxBase.<lambda>  rj  rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   )
is_nonzeror[  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rn  r]  r^  r_  s    r@   r0  zMinMaxBase.<lambda>  ro  rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   )r   r[  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  s     "<188"<r]  r^  r_  s    r@   r0  zMinMaxBase.<lambda>  s    U"<QVV"<< rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   )is_polarr[  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>       $@AQZZ$@r]  r^  r_  s    r@   r0  zMinMaxBase.<lambda>      u$@$@@ rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   r   r[  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r  r]  r^  r_  s    r@   r0  zMinMaxBase.<lambda>  r  rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   )is_primer[  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r  r]  r^  r_  s    r@   r0  zMinMaxBase.<lambda>  r  rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   )is_rationalr[  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r  r]  r^  r_  s    r@   r0  zMinMaxBase.<lambda>  r  rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   )is_realr[  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  ru  r]  r^  r_  s    r@   r0  zMinMaxBase.<lambda>  rv  rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   )rL  r[  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rd  r]  r^  r_  s    r@   r0  zMinMaxBase.<lambda>  re  rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   )is_transcendentalr[  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  s      . 	
.r]  r^  r_  s    r@   r0  zMinMaxBase.<lambda>  s     .. ) rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   )r   r[  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  ru  r]  r^  r_  s    r@   r0  zMinMaxBase.<lambda>  rv  rB   rH   ))r   r   r   r   r   r  r;   r  r  r   r  r  r  r
  r  _eval_is_algebraic_eval_is_antihermitian_eval_is_commutative_eval_is_complex_eval_is_composite_eval_is_even_eval_is_finite_eval_is_hermitian_eval_is_imaginary_eval_is_infiniter   _eval_is_irrational_eval_is_negative_eval_is_nonintegerr   r   _eval_is_nonzero_eval_is_odd_eval_is_polarr   _eval_is_prime_eval_is_rational_eval_is_real_eval_is_extended_real_eval_is_transcendental_eval_is_zerorY   rB   r@   r  r  `  s   +Z 5	UZZ%%	&	-5 5n GK #EJJ$5$5$<$< = D	UZZ%%	&	- $ E EN  4 , ,\ I EH>MBOHHFDJFJ E<L@NF@NF>M ?MrB   r  c                   R    e Zd ZdZej
                  Zej                  Zd Z	d Z
d Zy)r'  z=
    Return, if possible, the maximum value of the list.
    c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   r  rJ   s     r@   rM   z(Max._eval_is_positive.<locals>.<genexpr>       9!9r]  r   rE   r   s    r@   r   zMax._eval_is_positive      9tyy999rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   r  rJ   s     r@   rM   z+Max._eval_is_nonnegative.<locals>.<genexpr>  s     <Q((<r]  r  r   s    r@   r   zMax._eval_is_nonnegative  s    <$))<<<rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   r  rJ   s     r@   rM   z(Max._eval_is_negative.<locals>.<genexpr>       :1:r]  r   rE   r   s    r@   r  zMax._eval_is_negative      :		:::rB   N)r   r   r   r   r	   Infinityr  NegativeInfinityr  r   r   r  rY   rB   r@   r'  r'    s,     ::D!!H:=;rB   r'  c                   R    e Zd ZdZej
                  Zej                  Zd Z	d Z
d Zy)r&  z=
    Return, if possible, the minimum value of the list.
    c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   r  rJ   s     r@   rM   z(Min._eval_is_positive.<locals>.<genexpr>  r  r]  r  r   s    r@   r   zMin._eval_is_positive  r  rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   r  rJ   s     r@   rM   z+Min._eval_is_nonnegative.<locals>.<genexpr>  s     =a))=r]  r  r   s    r@   r   zMin._eval_is_nonnegative  s    =499===rB   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrH   r  rJ   s     r@   rM   z(Min._eval_is_negative.<locals>.<genexpr>  r  r]  r  r   s    r@   r  zMin._eval_is_negative  r  rB   N)r   r   r   r   r	   r  r  r  r  r   r   r  rY   rB   r@   r&  r&    s,     DzzH;>:rB   r&  c                 L    d}| dk  r|  } |dz  dk(  rdnd}|t        | |      z  S )Nr   r   r9   r   )	_safe_pow)r   expsigns      r@   safe_powr    s8    Daxu!GqLqb)D#&&&rB   c                     |dk  rt        d      |dk(  ryt        | |dz        }|t        u rt        S ||z  }|t        j                  kD  rt        S |dz  dk(  r|| z  }|t        j                  kD  rt        S |S )Nr   zExponent must be non-negative.r   r9   )r   r  r   sysmaxsize)r   exponenthalf_expresults       r@   r  r    s    !|9::1}h!m,H6
  F!|q$CKKMMrB   c                   0    e Zd ZU dZdZeed<   ed        Zy)r4   T2   r|   c                    t        |t        j                        rLt        |t        j                        r2t        ||      }|t         t        fv r|S t        j                  |      S t        |t        j                        rt        j
                  ||      S |t        t        j                  fv r/|j                  rt        S |j                  rt        j                  S y y rH   )
r:   r;   rb   r  r   Powr   r   r   zoo)r   r   r  rQ   s       r@   r   zPowByNatural.eval%  s    dEMM*z#u}}/Ms#AfWf%%==##c5==) 99T3''6588$$""!!yy  " %rB   N)	r   r   r   r}   r|   ra   r   r   r   rY   rB   r@   r4   r4      s#    JJ! !rB   r4   c                   0    e Zd ZU dZdZeed<   ed        Zy)r3   T<   r|   c                     t        |t        j                        rEt        |t        j                        r*t        j                  t	        |      t	        |      z        S y y rH   )r:   r;   r   rI   rP   )r   r   r  s      r@   r   zFloatPow.eval@  sD     dELL)jell.K;;uT{eCj899 /L)rB   N	r   r   r   r  r|   ra   r   r   r   rY   rB   r@   r3   r3   ;  s#    GJ: :rB   r3   c                   0    e Zd ZU dZdZeed<   ed        Zy)r*   Tr{   r|   c                     |j                   rt        d      t        |t        j                        rEt        |t        j                        r*t        j
                  t        |      t        |      z        S y y Nr   )r   r   r:   r;   r   rI   rP   r   s      r@   r   zFloatTrueDiv.evalV  sW    
 ??#$677dELL)j%,,.O;;uT{U7^;<< /P)rB   Nr  rY   rB   r@   r*   r*   Q  s#    GJ= =rB   r*   c                   <    e Zd ZU dZdZeed<   ed        Zde	fdZ
y)r)   Tr{   r|   c                    |j                   rt        d      t        |t        j                        rZt        |t        j                        r@t        |      st        |      r*t        j                  t        |      t        |      z        S t        |t        j                        rEt        |t        j                        r*t        j                  t        |      t        |      z        S y y r  )
r   r   r:   r;   r   r   rI   rP   rb   ra   r   s      r@   r   zIntTrueDiv.evalo  s    ??#$677 tU\\*7ELL1T"k'&: ;;uT{U7^;<<dEMM*z'5==/Q;;s4y3w<788 0R*rB   r7   c                     |j                  | j                  d   t        d   dz
        }|j                  | j                  d   t        d   dz
        }d| d| dS )Nr   r   r   r   z((int)z/(int)r   )r   rE   r   r   s       r@   r   zIntTrueDiv._ccode  s_    ##DIIaL*V2Ds2JK&&tyy|Z5G#5MNvVG9A..rB   N)r   r   r   r  r|   ra   r   r   r   r   r   rY   rB   r@   r)   r)   j  s/    GJ9 9/ /rB   r)   c                        e Zd ZdZed        Zy)r-   Tc           	         t        |      dz  dk7  rt        dt        |             t        |      dz  }|d| }||d  }ddlm} t	        d |D              r7 ||D cg c]  }t        |       c}|D cg c]  }t        |       c}      S |dk(  r0|d   j                  r	|d   dk(  ry|d   j                  r	|d   dk  ryt	        d |D              r|dk(  rt        d      t        t        t        ||d	
      t        j                  d            dd	i\  }}t	        d |d d D              r?|d d dz   } ||D cg c]  }t        |       c}|D cg c]  }t        |       c}      S y c c}w c c}w c c}w c c}w )Nr9   r   z*expected an even number of arguments, got )!eval_is_non_overlapping_and_densec              3   P   K   | ]  }t        |t        j                           y wrH   r:   r;   rb   rJ   s     r@   rM   z9IsNonOverlappingAndDenseIndicator.eval.<locals>.<genexpr>  s     :z!U]]+:rN   r   c              3   P   K   | ]  }t        |t        j                           y wrH   r  rJ   s     r@   rM   z9IsNonOverlappingAndDenseIndicator.eval.<locals>.<genexpr>  s     =z!U]]+=rN   zdim must not be zeroT)strict)keyr   c              3   P   K   | ]  }t        |t        j                           y wrH   r  rJ   s     r@   rM   z9IsNonOverlappingAndDenseIndicator.eval.<locals>.<genexpr>  s     FA:a/FrN   r   )*   )r=   r   %torch.fx.experimental.symbolic_shapesr  rt   ra   r   zipsortedoperator
itemgetter)	r   rE   dimsizesstridesr  rL   s_sizes	s_stridess	            r@   r   z&IsNonOverlappingAndDenseIndicator.eval  s   t9q=A <SYKH  $i1nQsst*	
 :T::4!&'AQ'')BQ#a&)B  !8qz##
aQx!!eAhl =W==ax$%;<< "%E748h>Q>QRS>TU""GY
 F"FF!#2,. 9%,-SV-	/J1A/J  K ()BD ./Js   E47E9
E>F
Nr   rY   rB   r@   r-   r-     s    J5 5rB   r-   c                        e Zd ZdZed        Zy)r.   Tc                     |t         j                  t         j                   fv r|S t        |t         j                        r1t        j                  t        j                  t        |                  S y rH   )r;   r   r:   r   rI   rd   truncrP   r   s     r@   r   zTruncToFloat.eval  sO    ehh	**Mfell+ ;;tzz%-899	 ,rB   Nr   r   r   r  r   r   rY   rB   r@   r.   r.     s    G: :rB   r.   c                        e Zd ZdZed        Zy)r/   Tc                    |t         j                  t        fv rt        S |t         j                   t         fv rt         S t        |t         j                        r1t        j
                  t        j                  t        |                  S y rH   )	r;   r   r   r:   r   rb   rd   r  rP   r   s     r@   r   zTruncToInt.eval  se     ehh''Muxxi&))7Nfell+==E&M!:;; ,rB   Nr   rY   rB   r@   r/   r/     s    J< <rB   r/   c                        e Zd ZdZed        Zy)r0   Tc                     |t         j                  u rt        S |t         j                   u rt         S t        |t         j                        r(t        j
                  t        t        |      d            S y r   )r;   r   r   r:   r   rb   roundrP   r   s     r@   r   zRoundToInt.eval  sW     UXXMehhY7Nfell+==uV}a!899 ,rB   Nr   rY   rB   r@   r0   r0     s    J: :rB   r0   c                        e Zd ZdZed        Zy)r1   Tc                     t        |t        j                        rLt        |t        j                        r1t        j                  t        t        |      t        |                  S y y rH   )r:   r;   r   rb   rI   r  rP   ra   )r   r   ndigitss      r@   r   zRoundDecimal.eval  sF     fell+
7EMM0R;;uU6]CLABB 1S+rB   Nr  rY   rB   r@   r1   r1     s    GC CrB   r1   c                        e Zd ZdZed        Zy)r2   Tc                 "   |t         j                  t         j                   fv r|S t        |t         j                        rt        j                  t        |            S |t        u rt         j                  S |t         u rt         j                   S y rH   )r;   r   r:   rb   rI   ra   r   r   s     r@   r   zToFloat.eval  sk    ehh	**Mfemm,;;s6{++V88OfWHH9 rB   Nr  rY   rB   r@   r2   r2     s    G	 	rB   r2   c                        e Zd ZdZdZdefdZdefdZd Zd Z	e
d        Ze
d	        Zd
 ZdefdZd Z fdZ fdZ fdZ fdZdefdZ xZS )r5   z4
    Prevents expansion and other optimizations
    
   r7   c                 (    d| j                   d    dS )Nz	Identity(r   r   r   r   s    r@   __repr__zIdentity.__repr__&  s    499Q<.**rB   c                 F    d|j                  | j                  d          dS )z+Controls how sympy's StrPrinter prints thisr   r   r   )doprintrE   )r   r   s     r@   r   zIdentity._sympystr)  s#    7??499Q<0133rB   c                 4    | j                   d   j                  S r   )rE   r  r   s    r@   r  zIdentity._eval_is_real-  s    yy|###rB   c                 4    | j                   d   j                  S r   r   r   s    r@   r   zIdentity._eval_is_integer0  s    yy|&&&rB   c                 |    t        | j                  d   j                  xr | j                  d   j                        S r   )r   rE   r?  r@  r   s    r@   r?  zIdentity.is_number3  s0     DIIaL**Ityy|/I/IJJrB   c                 F    t        | j                  d   j                        S r   )r   rE   r@  r   s    r@   r@  zIdentity.is_comparable9  s     DIIaL..//rB   c                      | j                   d   S r   r   )r   hintss     r@   _eval_expand_identityzIdentity._eval_expand_identity>  r   rB   c                 2    t        | j                  d         S r   )ra   rE   r   s    r@   __int__zIdentity.__int__B  s    499Q<  rB   c                    | j                   d   }t        |t              rt        j                  |      }t        |t        j
                        sy|j                  r|j                  r|j                  sy|j                  r|j                  r|j                  sy |||      rt        j                  j                  S t        j                  j                  S )z
        Fast path for comparing wrapped numeric atomics against other numeric atomics.
        Keep compound expressions on SymPy's default symbolic path.
        r   N)rE   r:   ra   r;   rb   r   is_Atomr?  r@  r	   r   r   )r   r/  oprf   s       r@   _identity_atom_comparezIdentity._identity_atom_compareE  s    
 iileS!MM%(E%,#2C2C%//e6I6I!#u~uww||@577==@rB   c                 P    | j                  |d       }||S t        | 	  |      S )Nc                     | |k\  S rH   rY   rL   bs     r@   r0  z!Identity.__ge__.<locals>.<lambda>V  
    a1f rB   )r.  super__ge__r   r/  out	__class__s      r@   r5  zIdentity.__ge__U  .    ))%1DEos@57>%+@@rB   c                 P    | j                  |d       }||S t        | 	  |      S )Nc                     | |kD  S rH   rY   r1  s     r@   r0  z!Identity.__gt__.<locals>.<lambda>Z  
    a!e rB   )r.  r4  __gt__r6  s      r@   r=  zIdentity.__gt__Y  .    ))%1CDos@57>%+@@rB   c                 P    | j                  |d       }||S t        | 	  |      S )Nc                     | |k  S rH   rY   r1  s     r@   r0  z!Identity.__le__.<locals>.<lambda>^  r3  rB   )r.  r4  __le__r6  s      r@   rA  zIdentity.__le__]  r9  rB   c                 P    | j                  |d       }||S t        | 	  |      S )Nc                     | |k  S rH   rY   r1  s     r@   r0  z!Identity.__lt__.<locals>.<lambda>b  r<  rB   )r.  r4  __lt__r6  s      r@   rD  zIdentity.__lt__a  r>  rB   c                 2    t        | j                  d         S r   )rP   rE   r   s    r@   	__float__zIdentity.__float__e  s    TYYq\""rB   )r   r   r   r   r|   r   r  r   r  r   r   r?  r@  r(  ra   r*  r.  r5  r=  rA  rD  rP   rF  __classcell__)r8  s   @r@   r5   r5     s     J+# +4C 4$' K K
 0 0! !A AAAA#5 #rB   r5   c                 d      G  fddt         j                        }d z   }||_        ||_        |S )Nc                   0    e Zd ZdZW  ZeZe fd       Zy)+make_opaque_unary_fn.<locals>.OpaqueUnaryFna  
        Unlike the builtin sympy functions on real numbers like sympy.sqrt,
        these equivalents do not do any nontrivial reasoning besides
        constant propagation.  This helps avoid performing transformations
        that are valid for real numbers but are invalid for floating point;
        in particular, while we are willing to make optimizations that change
        numerics for Tensor compute, we are NOT willing to make optimizations
        that change numerics for size compute.
        c                 j   t        |t        j                  t        j                  f      r3	 t        j                   t	        t
              t        |                  S |t        j                  t        j                   t        j                  t        j                   t        t         fv rc|t        u rt        j                  }|t         u rt        j                   }dk(  rt        j                  |d      S  t	        t              |      S y # t        $ r  t	        t              |      cY S w xY w)Nlog2r9   )r:   r;   rb   rI   r  rd   rP   OverflowErrorr   r  r   log)r   rL   names     r@   r   z0make_opaque_unary_fn.<locals>.OpaqueUnaryFn.evalx  s    !emmU[[9:3 ;;':wtT':58'DEE
 uxx%((EII		z6F7SS;A<	A6> 99Q?*+wud+A.. % 3/75$/223s   1D D21D2N)	r   r   r   r   _torch_handler_namemake_opaque_unary_fn_torch_unpicklerr   r   )rO  s   r@   OpaqueUnaryFnrJ  j  s(    	 #/		 
	rB   rS  OpaqueUnaryFn_)r;   Functionr   r   )rO  rS  nms   `  r@   rQ  rQ  i  s6    $ $L 
D	 BM!#MrB   sqrtcoscoshsinsinhtantanhasinacosatanr  rN  asinhrL  c                       dk(  r
t         d   n, dk(  r
t         d   n dk(  r
t         d   nt        d         G  fdd	t        j                        }d
 z   }||_        ||_        |S )Nbitwise_and
BitwiseAndbitwise_xor
BitwiseXor
bitwise_or	BitwiseOrzunrecognized c                   d    e Zd ZU W  ZW Zeed<    ej                  e	W       Z
efd       Zy))make_opaque_bitwise_fn.<locals>.BitwiseFnr|   )real_op_namec                    |j                   r#|j                   r t        t              ||      S |j                   rt        j                  |rdnd      }|j                   rt        j                  |rdnd      }t        |t        j                  t        f      r\t        |t        j                  t        f      r<t        j                   t        t              t        |      t        |                  S y )Nr   r   )r   r  r  r;   rb   r:   ra   )r   rL   r2  rk  s      r@   r   z.make_opaque_bitwise_fn.<locals>.BitwiseFn.eval  s    ||6wx6q!<<||MMq!a0||MMq!a0!emmS12zEMM3'8 }}%DWX|%DSVSQRV%TUUrB   N)r   r   r   rP  r|   ra   r   rS   partialmake_opaque_bitwise_fnrR  r   r   )rO  precrk  s   r@   	BitwiseFnrj    s?    "
C,9,,"
 
	 
	rB   rp  
BitwiseFn_)r   r   r;   rU  r   r   )rO  rk  rp  rV  ro  s   ``  @r@   rn  rn    s    },'		,'		+&}TF344 ENN * 
	BIIrB   rc  and_rg  or_re  xor)erS   rd   r  r  collections.abcr   typingr   r   r   typing_extensionsr   r   r;   r	   
sympy.corer   sympy.core.exprr   sympy.core.functionr   sympy.core.logicr   r   r   sympy.core.numbersr   sympy.core.operationsr   r   sympy.core.sortingr   sympy.core.traversalr   sympy.printing.precedencer   sympy.utilities.iterablesr   torch.torch_versionr   numbersr   r   r   r   r   __all__r   rA   rI   rU   rZ   rr   rw   rU  r    r!   r"   r#   r$   r%   r&   r'   r(   r+   r,   r  r'  r&  r  r  r4   r3   r*   r)   r-   r.   r/   r0   r1   r2   r5   rQ  OpaqueUnaryFn_sqrtOpaqueUnaryFn_cosOpaqueUnaryFn_coshOpaqueUnaryFn_sinOpaqueUnaryFn_sinhOpaqueUnaryFn_tanOpaqueUnaryFn_tanhOpaqueUnaryFn_asinOpaqueUnaryFn_acosOpaqueUnaryFn_atanOpaqueUnaryFn_expOpaqueUnaryFn_logOpaqueUnaryFn_asinhOpaqueUnaryFn_log2rn  BitwiseFn_bitwise_andBitwiseFn_bitwise_orBitwiseFn_bitwise_xorrY   rB   r@   <module>r     s      
 $ 8 8 2      + 7 7 + 9 & % 0 * , ( ( T'5B4	uzz 	d 	r!"vc{mR%++--. t t t )5;; )5;; )5;; )|yu~~ yx?<enn ?<DENN >?D ?DF3%.. 3lx ! !$< <;enn ; U^^ (U^^ (v?y v?r;*k ;$:*k :$'4!5>> !6:u~~ :,=5>> =2/ /B9 9z:5>> :< <: :<C5>> Cenn  G#u~~ G#T+^ *&1 (/ )&1 (/ )&1 (/ )&1 )&1 )&1 )&1 (/ (/ *73 )&1 #L /}fE -lEB .}eD rB   