
    /jg                     H   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j1        z  f         fdZ2de/dz  de/dz  de/dz  fdZ3d ej4        d!ej4        dej4        fd"Z5 G d# d$ej6                  Z7 G d% d&ej6                  Z8 G d' d(ej6                  Z9 G d) d*ej6                  Z: G d+ d,ej6                  Z; G d- d.e7          Z< G d/ d0ej6                  Z= G d1 d2ej6                  Z> G d3 d4ej6                  Z? G d5 d6ej6                  Z@ G d7 d8ej6                  ZA G d9 d:ee          ZB G d; d<eBe          ZC G d= d>eBe          ZDd? ZEd@ ZF G dA dBej6                  ZG G dC dDej6                  ZH G dE dFej6                  ZI G dG dHej6                  ZJ G dI dJej6                  ZK G dK dLej6                  ZL G dM dNej6                  ZM G dO dPej6                  ZN G dQ dRej6                  ZO G dS dTej6                  ZP G dU dVej6                  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          ZddS )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                     t          | t          j                  o\| j        oUt	          | j                  dk    o=| j        d         j        o+| j        d         j        o| j        d         | j        d         uS )N   r   r   )
isinstancesympyr   is_Addlen_args	is_symbol)r6   s    a/home/longshao/multi-rider-rag/.venv/lib/python3.11/site-packages/torch/utils/_sympy/functions.py_is_symbols_binary_summationrA   \   sx     	4$$ 	/K	/
OOq 	/ JqM#	/ JqM#		/
 JqMA.    fc                      t          j                   dt          t                   dt          t
          j        z  f fd            }|S )Nargsr7   c                       |  }t          d | D                       r;t          |t          j                  s!t          j        t	          |                    }|S )Nc              3   J   K   | ]}t          |t          j                  V  d S N)r:   r;   Float.0as     r@   	<genexpr>z-_keep_float.<locals>.inner.<locals>.<genexpr>n   s.      88az!U[))888888rB   )anyr:   r;   rI   float)rE   rrC   s     r@   innerz_keep_float.<locals>.innerk   sc    ah88488888 	&u{B
 B
 	& E!HH%%ArB   )	functoolswrapsr   r   r   r;   rI   )rC   rQ   s   ` r@   _keep_floatrT   h   sX     _QVC[ R%+%5       LrB   xyc                     d | |fv rd S | |k    S rH    )rU   rV   s     r@   fuzzy_eqrY   x   s    1v~~t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	                            |                               }t           j                            |          }|D ]"t          fd|D                       r|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.
    rU   r7   c                 |    d t           j                            |           D             }t          j        |          S )Nc                     g | ]?}t          |t          t          j        f          #t	          t          |                    @S rX   )r:   intr;   IntegerabsrK   args     r@   
<listcomp>zDsimple_floordiv_gcd.<locals>.integer_coefficient.<locals>.<listcomp>   sK     +
 +
 +
#U]344+
CMM+
 +
 +
rB   )r;   Mul	make_argsmathprod)rU   integer_coefficientss     r@   integer_coefficientz0simple_floordiv_gcd.<locals>.integer_coefficient   sD    +
 +
y**1--+
 +
 +

 y-...rB   r6   c                     t          t          j                            |                     }t	          j        t          j        |          S rH   )mapr;   Addrf   rR   reducerg   gcd)r6   integer_factorsrj   s     r@   integer_factorz+simple_floordiv_gcd.<locals>.integer_factor   s>    ),!4!4T!:!:*
 *
 /:::rB   c              3       K   | ]}|v V  	d S rH   rX   )rK   
base_splitrU   s     r@   rM   z&simple_floordiv_gcd.<locals>.<genexpr>   s'      ==:qJ======rB   )r;   Basicr_   rg   ro   listrl   re   rf   rm   all)rZ   r[   rq   ro   base_splitsdivisor_splitrj   rU   s         @@r@   simple_floordiv_gcdry   ~   s   "/u{ /s / / / /;U[ ;S ; ; ; ; ; ; xq))>>!+<+<==Cs7AGqA15EI!4!4Q!7!7882 2K .3Y-@-@-C-CM  ========= 	'CJrB   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        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dS )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        y|rB   c                     | j         d         S Nr   r   r   s    r@   divisorzFloorDiv.divisor   r   rB   printerc                     |                     | j        t          d         dz
            }|                     | j        t          d         dz
            }d| d| dS )NAtom      ?(z//))parenthesizer   r   r   r   r   r   r   s       r@   	_sympystrzFloorDiv._sympystr   s]    ##DIz&/AC/GHH&&t|Z5G#5MNN%4%%7%%%%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                  rKt          |t          j                  r1t          j        t)          |          t)          |          z            S t          |t*                    r)t+          |j        d         |j        d         |z            S t          |t          j                  rd}g }t          j                            |          D ]}||z  }d }t          |t          j	                  rlt3          t          j                  t3          d          k     rB|                    t          j                  }	t;          d |	D                       }
|j        o|
}n|j        }|r|                    |           ||z  }t?          |          dk    r%t+          |t          j        |ddiz
  |          |z   S 	 tA          ||          }t          |d          r/t          |t          j                  rt          j!        ||          }t          |d          s:t+          t          j"        ||z            t          j"        ||z                      S n# t          j#        $ r Y nw xY wd S )	Ndivision by zeror   r   z1.15.0c              3   ,   K   | ]}|j         d k    V  dS )r   N)r[   )rK   rP   s     r@   rM   z FloorDiv.eval.<locals>.<genexpr>  s(      ,I,I!QSAX,I,I,I,I,I,IrB   evaluateF)$is_zeroZeroDivisionErrorr   r;   nanr	   Zeror   r   re   Oner:   NumberrO   rg   infr   isnanr`   floorr_   r    rE   rm   rf   r   __version__atomsRationalrv   appendr=   ry   ro   simplifyPolynomialError)clsr   r   rP   	quotientstermstermquotientquotient_is_integer	rationalsall_rationals_intsro   s               r@   evalzFloorDiv.eval   s    ? 	8#$6777t 	W!5!5 	95959 4 49< 	 7<? 	|GQ77 	K? 	'|GR88 	'9T2&&&7??7; tU\**	47EL11	4 T""	4 '2'&:&:	4
 deGnn,ADH}}txiwA 4y }TZ]]333dEM** 	<z'5=/Q/Q 	<=Tc'll!:;;;dH%% 	BDIaL$)A,*@AAA gu}-- 	IE	++D11 * *'>
 '+#h	22 >|%8 8 **8+ 8+ !)u~ > >I),,I,Iy,I,I,I)I)I&*2*=*TBT''*2*='& *LL&&&)I5zzQ TEIu$Eu$E$EEwOO 
		%dG44CC## /
7EI(F(F /ig..Q'' N4#:..w}0M0M   $ 	 	 	D	 ts   BP+ +P=<P=c                 |    | j         d d         \  }}t          |j        |j        |j        |j        g          rdS d S )Nr9   T)rE   rv   r   is_nonnegativer   rZ   r[   s      r@   _eval_is_nonnegativezFloorDiv._eval_is_nonnegative3  sB    y!}1alA,<a>NOPP 	4trB   )__name__
__module____qualname____doc__r|   tupler_   __annotations__r~   r   boolpropertyr;   rt   r   r   printing
StrPrinterstrr   classmethodr`   r   r   rX   rB   r@   r    r       s9          "E5c?!!!JJek    X     X&!: &s & & & & V V V%+PTBT V V 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dS )r!   zK
    ModularIndexing(a, b, c) => (a // b) % c where % is the C modulus
       .r|   Tr   r}   r~   r   r   modulusr7   Nc                 z   |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k    rVt          j        ||          }|dk    r;t          t          j        ||z            t          j        ||z            |          S n# t           j        $ r Y nw xY wt          |t           j	                  rg }d}|j
        D ]}t          j        |||z            ||z  k    rt          |t           j                  r|dk     sPt          |t           j                  r:t          |j
        d         t           j                  r|j
        d         dk     rd} n|                    |           t          |          t          |j
                  k    r |rt          t          |          ||          S t          |t                    r*t          |j
        d         |j
        d         |z  |          S d S )Nr   r   TF)r;   r	   r   r:   r`   ro   r!   r   r   rm   rE   re   r   r=   sumr    )r   r   r   r   ro   	new_termsall_positiver   s           r@   r   zModularIndexing.evalD  s7    19917<tU]++	/7EM22	/ 7EM22	/
 GOw..
	!||ig..!88*tcz22w}55  
 $ 	 	 	D	 dEI&& 	I-/I!%L	 / /9T7W#45579JJJ"477 /D1HH"433 =E&ty|U]CC =E !IaL1,, (-!((...9~~TY//L/&s9~~wHHHdH%% 	R"49Q<11GQQQts   5AC C$#C$c                 Z    | j         d d         \  }}t          |j        |j                  S )Nr9   )rE   rY   r   r   s      r@   r   z$ModularIndexing._eval_is_nonnegativex  s+    y!}1(!*:;;;rB   )r   r   r   r   r|   r   r_   r   r   r   r~   r   r;   r`   rt   r   r   rX   rB   r@   r!   r!   ;  s           "E5c?!!!JJ1=1+0=1CH=1	t	1 1 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dS )r"   z#
    Good ol' ternary operator
    r   .r|   r}   r~   r7   Nc                 R    | j         d         j        r| j         d         j        rdnd S Nr   r9   TrE   r   r   s    r@   _eval_is_integerzWhere._eval_is_integer  s)    y|.T49Q<3JTttPTTrB   c                 R    | j         d         j        r| j         d         j        rdnd S r   )rE   r   r   s    r@   r   zWhere._eval_is_nonnegative  s2     y|*/3y|/JDD	
rB   c                 R    | j         d         j        r| j         d         j        rdnd S r   rE   is_positiver   s    r@   _eval_is_positivezWhere._eval_is_positive  s)    y|/VDIaL4LVttRVVrB   crZ   r[   c                 N    |t           j        k    r|S |t           j        k    r|S d S rH   )r;   truefalse)r   r   rZ   r[   s       r@   r   z
Where.eval  s)    
??H%+HtrB   )r   r   r   r   r|   r   r_   r   r~   r   r   r   r   r   r;   rt   r   rX   rB   r@   r"   r"   ~  s           "E5c?!!!JU$+ U U U U
dTk 
 
 
 
W4$; W W W 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dS )r#   r{   .r|   r}   r~   Tr   rZ   r[   r7   Nc                    |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    r&|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 d S )NModulo by zeror   r9   r   )r   r   r	   r   	is_Numberis_evenis_oddr   r   
is_Booleanr   r   r;   r$   r   rZ   r[   rP   lesss        r@   r   zPythonMod.eval  s    9 	6#$4555 ;;!A2w,,!q&&6M ; 	1; 	q5L ; 	166y vx u E< 	6M
 1u? 	tDzz 	am 	H9Q??a6MtrB   c                 .    | j         d         j        rdnd S Nr   Tr   r   s    r@   r   zPythonMod._eval_is_nonnegative      y|/9ttT9rB   c                 .    | j         d         j        rdnd S r   )rE   is_negativer   s    r@   _eval_is_nonpositivezPythonMod._eval_is_nonpositive  r   rB   c                 :   |                     | j        d         t          d         dz
            }|                     | 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   rZ   r[   abs_qs        r@   _ccodezPythonMod._ccode  s      1z&/AC/GHH  1z&/AC/GHH)A,2CAqC1CCCCACC!CCCC!CCCCCrB   )r   r   r   r|   r   r_   r   r~   r   r   r   r;   r   r   r   r   r   r   rX   rB   r@   r#   r#     s         !E5c?!!!JJ+UZ +EJ +5:3D + + + [+\:dTk : : : ::dTk : : : :D D D D D D DrB   r#   c                   @    e Zd ZU dZdZeed<   dZdZe	d             Z
dS )r$   r{   r}   r~   Tc                    |j         rt          d          |t          j        u s||| fv s|dk    rt          j        S |j        r6|j        r/|dk     rt          |          |dk     rt          |          ||z  S |j        r,|dk    r&|j        rt          j        S |j        rt          j        S ||z  }|j	        rt          j        S ||k     }|j
        rt          |          r|j        r|S d S d S d S )Nr   r   r   r9   )r   r   r	   r   r   AssertionErrorr   r   r   r   r   r   r   r   s        r@   r   zMod.eval  s3    9 	6#$4555 ;;!A2w,,!q&&6M ; 	1; 	1uu$Q'''1uu$Q'''q5L ; 	166y vx u E< 	6M
 1u? 	tDzz 	am 	H	 	 	 	 	 	rB   N)r   r   r   r|   r~   r_   r   r   r   r   r   rX   rB   r@   r$   r$     sN         EJJN+ + [+ + +rB   r$   c                       e Zd ZdZdS )r%   zZ
    Div where we can assume no rounding.
    This is to enable future optimizations.
    N)r   r   r   r   rX   rB   r@   r%   r%     s           rB   r%   c                   4    e Zd ZdZed             ZdefdZdS )r&   Tc                    |t           j        t          fv rt          S |t           j         t           fv rt           S t          |t           j                  r3t          j        t          j        t          |                              S d S rH   )	r;   oor   r:   r   r`   rg   ceilrO   r   numbers     r@   r   zCeilToInt.eval%  sv     eh'''Muxi&)))7Nfel++ 	;=5==!9!9:::	; 	;rB   r7   c                 v    |                     | 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<    %%dilDIaL4Kc4QRR v    rB   N)r   r   r   r   r   r   r   r   rX   rB   r@   r&   r&   "  sM        J; ; [;! ! ! ! ! ! !rB   r&   c                   (    e Zd ZdZed             ZdS )r'   Tc                 L   |t           j        t          fv rt          S |t           j         t          fv rt           S t          |t           j                  r|S t          |t           j                  r3t          j        t          j        t          |                              S d S rH   )	r;   r   r   r:   r`   r   rg   r   rO   r   s     r@   r   zFloorToInt.eval8  s    eh'''Muxi(((7Nfem,, 	Mfel++ 	<=E&MM!:!:;;;	< 	<rB   Nr   r   r   r   r   r   rX   rB   r@   r'   r'   5  s2        J< < [< < <rB   r'   c                       e Zd ZdZdZd ZdS )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   ro   r%   r    r   r   r   s      r@   __new__zCeilDiv.__new__K  s`    }T""-((9T7##w..D'***DGaK0':::rB   N)r   r   r   r   r   r   rX   rB   r@   r(   r(   D  s4          J; ; ; ; ;rB   r(   c                   (    e Zd ZdZed             ZdS )r+   Tc                 <    |dk     rt          d          |d|z  z  S Nr   znegative shift countr9   )
ValueErrorr   r   shifts      r@   r   zLShift.evalW  s(    1993444ahrB   Nr   rX   rB   r@   r+   r+   T  s2        J  [  rB   r+   c                   (    e Zd ZdZed             ZdS )r,   Tc                 R    |dk     rt          d          t          |d|z            S r   )r   r    r   s      r@   r   zRShift.evala  s.    1993444ah'''rB   Nr   rX   rB   r@   r,   r,   ^  s2        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(dS )%
MinMaxBasec                 @   ddl m} |                    d|j                  }d |D             }|sd n|                     |          }|rY	 t          |                     |                    }n# t          $ r
 | j        cY S w xY w| | j	        |fi |} | j
        |fi |}t          |          }|s| j        S t          |          dk    r!t          |                                          S t          j        | gt!          |          R i |}||_        ||_        |S )Nr   )global_parametersr   c              3   4   K   | ]}t          |          V  d S rH   r
   rb   s     r@   rM   z%MinMaxBase.__new__.<locals>.<genexpr>m  s(      66666666rB   r   )sympy.core.parametersr  popr   "_satisfy_unique_summations_symbols	frozenset_new_args_filterr   zero_collapse_arguments_find_localzerosidentityr=   ru   r   r   r   _argsetunique_summations_symbols)r   original_argsassumptionsr  r   rE   r  objs           r@   r   zMinMaxBase.__new__i  sq   ;;;;;;??:/@/IJJ66666
 GDD77FF 	"  	A  !!5!5d!;!;<<      x 
 )0.s.tCC{CC ,s+D@@K@@ 	 <t99>>::>>### l3>>>>+>>(A%
s   
"A- -B Br7   Nc                    t          |          dk    rdS t          |d         t                    r|d         |d         fn|d         |d         f\  }}t          |          sdS t          |          r|                     |          S t          |t                    r*t          |dd          }||                     |g|          S dS )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    < t99>>4 $q':..$T!Wd1gq'47# 	c ,C00 	4 (,, 	-&&t,,, c:&& 	Q,30$- -) -8**C52OPPPtrB   initial_setc                     |t                      n|}|D ]^}|                                D ]G}t          |t          j        j        j                  s  dS ||v r  dS |                    |           H_|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)setr   r:   r;   coresymbolSymboladd)r   rE   r  seen_symbolsrc   elements         r@   r  zMinMaxBase._unique_symbols  s     !, 3suuu 	. 	.C99;; . .!'5:+<+CDD .444,,444 $$W----. rB   c                     |s|S t          t          |                    } t          u rt          nt          |d         j        rg g fx}\  }}|D ]`}t          |t          t                    D ]B}|j        d         j        r.|t          |t                             	                    |           Cat          j
        }|D ]"}|j        d         }|j        r||k     dk    r|}#t          j
        }	|D ]"}|j        d         }|j        r||	k    dk    r|}	# t          u r|D ]}
|
j        s n|
|k     dk    r|
}n% t          k    r|D ]}
|
j        s n|
|	k    dk    r|
}	d} t          u r|t          j
        k    r	t          |}n|	t          j
        k    r	t          |	}|it          t          |                    D ]L}||         t                    r2j        d         }t          k    r||k    n||k     dk    r
 j
        ||<   M fdt          |          D ]'\  }fd||dz   d         D             ||dz   d<   ( fd}t          |          dk    r ||          }|S )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          f          s| S | j        v }|s | j        fd| j        D             ddiS t          |           r | j        fd| j        D             ddiS S )Nc                 (    g | ]} |          S rX   rX   rK   irL   dos     r@   rd   z>MinMaxBase._collapse_arguments.<locals>.do.<locals>.<listcomp>=  s#     ; ; ;aAq ; ; ;rB   r   Fc                 4    g | ]}|k     |          S rX   rX   r(  s     r@   rd   z>MinMaxBase._collapse_arguments.<locals>.do.<locals>.<listcomp>@  s(     E E Eaa1ffAqfffrB   )r:   MinMaxrE   func)airL   condr   r*  s    ` r@   r*  z*MinMaxBase._collapse_arguments.<locals>.do8  s    b3*-- 	<D Mrw ; ; ; ; ;27 ; ; ;LeLLL"c"" Wrw E E E E E27 E E EVPUVVVHrB   c                 (    g | ]} |          S rX   rX   )rK   r/  rL   r*  s     r@   rd   z2MinMaxBase._collapse_arguments.<locals>.<listcomp>D  s#    ???2RRAYY???rB   r   c                 D  	 fd}t          | |d          \  }}|s| S d |D             }t          j        | 		s| S t          	          }	fd|D             }t	          |          r)fd|D             }|                     
|ddi            |ddi}||gz   S )	Nc                 $    t          |           S rH   )r:   )rc   others    r@   <lambda>zGMinMaxBase._collapse_arguments.<locals>.factor_minmax.<locals>.<lambda>N  s    :c5#9#9 rB   T)binaryc                 6    g | ]}t          |j                  S rX   )r  rE   rb   s     r@   rd   zIMinMaxBase._collapse_arguments.<locals>.factor_minmax.<locals>.<listcomp>T  s     <<<#CH<<<rB   c                     g | ]}|z
  S rX   rX   )rK   arg_setcommons     r@   rd   zIMinMaxBase._collapse_arguments.<locals>.factor_minmax.<locals>.<listcomp>Z  s    FFF'Wv-FFFrB   c                      g | ]
} |d diS )r   FrX   )rK   sr4  s     r@   rd   zIMinMaxBase._collapse_arguments.<locals>.factor_minmax.<locals>.<listcomp>_  s(    "T"T"T55!#<e#<#<"T"T"TrB   r   F)r   r  intersectionru   rv   r   )rE   is_other
other_argsremaining_argsarg_setsnew_other_argsarg_sets_diffother_args_diffother_args_factoredr:  r   r4  s            @r@   factor_minmaxz5MinMaxBase._collapse_arguments.<locals>.factor_minmaxM  s    9999H)-dHT)J)J)J&J  =<<<<H%x0F !&\\NFFFFXFFFM =!! M"T"T"T"Tm"T"T"T%%cc?&KU&K&KLLL"'%"H%"H"H!%8$999rB   )ru   r   r,  r-  	is_numberr   rE   is_comparabler:   r   r  ranger=   	enumerate)r   rE   r  siftedminsmaxsr)  vsmallbigrc   Ta0rF  rL   r*  r4  s   `             @@@r@   r  zMinMaxBase._collapse_arguments  s*   0  	KGDMM""#::EEE
 7 1	3"$b&(FZT4 = =ac** = =Avay. =z!S11299!<<<= LE  F1I; AI$#6#6E,C  F1I; AG#4#4C
 czz $ $C= e,, # " "C= c	d**!AczzCL((EA$$}s4yy)) 3 3AQA!!U++ 3VAY(-R!VV26!" " '*lDG		 		 		 		 		 		 dOO 	@ 	@DAq?????a!egg???DQMM	: 	: 	: 	: 	: 	:0 t99q== =&&DrB   c              #     K   |D ]}t          |t                    r|j        du s|j        r|j        st          d| d          || j        k    rt          |          || j        k    rg|j	        | k    r|j
        E d{V  |V  dS )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_realrG  rH  r   r  r   r  r.  rE   )r   arg_sequencerc   s      r@   r  zMinMaxBase._new_args_filterj  s         	 	C sD))M'500M 1*-*; 1 !!K#!K!K!KLLLch"3'''$$S8########				!	 	rB   c                 "   t                      }d}|D ]i}|j        rK||}| t          u rt          ||          }(| t          u rt          ||          }Bt          d|            |                    |           j||S t          |          dk    r|hS t          |          dk    rPt          t          |                    }|dv r|j        r| t          u r|n|hS |dk    r|j        r| t          u r|n|hS |                    |           |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_valuerc   other_values          r@   r  zMinMaxBase._find_localzeros  sP    uu	 	& 	&C} &$ #IIczz$'	3$7$7		$'	3$7$7		,-@3-@-@AAA  %%%% |!!;|!!tL1122KH$$)C$'*czz||	{BA~~+"9~'*czz||	{B###rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   )is_algebraicrK   r)  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  $      (H(HA(H(H(H(H(H(HrB   r   rE   r<  s    r@   r5  zMinMaxBase.<lambda>      5(H(H(H(H(H#H#H rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   )is_antihermitianrc  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  9       - - 	
- - - - - -rB   re  rf  s    r@   r5  zMinMaxBase.<lambda>  .    u - -- - - ( ( rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   )is_commutativerc  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  9       + + 	
+ + + + + +rB   re  rf  s    r@   r5  zMinMaxBase.<lambda>  .    U + ++ + + & & rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   )
is_complexrc  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  $      &D&Dq|&D&D&D&D&D&DrB   re  rf  s    r@   r5  zMinMaxBase.<lambda>      &D&DQV&D&D&D!D!D rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   )is_compositerc  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rd  rB   re  rf  s    r@   r5  zMinMaxBase.<lambda>  rg  rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   )r   rc  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  $      #>#>!AI#>#>#>#>#>#>rB   re  rf  s    r@   r5  zMinMaxBase.<lambda>      e#>#>qv#>#>#>>> rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   )	is_finiterc  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  s$      %B%Baak%B%B%B%B%B%BrB   re  rf  s    r@   r5  zMinMaxBase.<lambda>  s    %B%B16%B%B%B B B rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   )is_hermitianrc  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rd  rB   re  rf  s    r@   r5  zMinMaxBase.<lambda>  rg  rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   )is_imaginaryrc  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rd  rB   re  rf  s    r@   r5  zMinMaxBase.<lambda>  rg  rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   )r   rc  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  $      'F'F!'F'F'F'F'F'FrB   re  rf  s    r@   r5  zMinMaxBase.<lambda>      %'F'Fqv'F'F'F"F"F rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   )r   rc  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  ru  rB   re  rf  s    r@   r5  zMinMaxBase.<lambda>  rv  rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   )is_irrationalrc  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  $      )J)Ja!/)J)J)J)J)J)JrB   re  rf  s    r@   r5  zMinMaxBase.<lambda>      E)J)J16)J)J)J$J$J rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   r   rc  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r  rB   re  rf  s    r@   r5  zMinMaxBase.<lambda>  r  rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   )is_nonintegerrc  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r  rB   re  rf  s    r@   r5  zMinMaxBase.<lambda>  r  rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   r   rc  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rp  rB   re  rf  s    r@   r5  zMinMaxBase.<lambda>  rq  rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   )is_nonpositiverc  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rp  rB   re  rf  s    r@   r5  zMinMaxBase.<lambda>  rq  rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   )
is_nonzerorc  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  ru  rB   re  rf  s    r@   r5  zMinMaxBase.<lambda>  rv  rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   )r   rc  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  s$      "<"<18"<"<"<"<"<"<rB   re  rf  s    r@   r5  zMinMaxBase.<lambda>  s    U"<"<QV"<"<"<<< rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   )is_polarrc  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  $      $@$@AQZ$@$@$@$@$@$@rB   re  rf  s    r@   r5  zMinMaxBase.<lambda>      u$@$@$@$@$@@@ rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   r   rc  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r  rB   re  rf  s    r@   r5  zMinMaxBase.<lambda>  r  rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   )is_primerc  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r  rB   re  rf  s    r@   r5  zMinMaxBase.<lambda>  r  rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   )is_rationalrc  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r  rB   re  rf  s    r@   r5  zMinMaxBase.<lambda>  r  rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   )is_realrc  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r|  rB   re  rf  s    r@   r5  zMinMaxBase.<lambda>  r}  rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   )rT  rc  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rk  rB   re  rf  s    r@   r5  zMinMaxBase.<lambda>  rl  rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   )is_transcendentalrc  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  s9       . . 	
. . . . . .rB   re  rf  s    r@   r5  zMinMaxBase.<lambda>  s.     . .. . . ) ) rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   )r   rc  s     r@   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r|  rB   re  rf  s    r@   r5  zMinMaxBase.<lambda>  r}  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_zerorX   rB   r@   r  r  h  s       + + +Z 5	UZ%	&	-5 5 5 [5n GK  #EJ$5$< = D	UZ%	&	-   [$ F F [FP   [4 , , [,\ IH   EDHH>>MBBOHHHHFFDDJJFFJJ   ED<<L@@NFF@@NFF>>M   ?>MMMrB   r  c                   @    e Zd ZdZej        Zej        Zd Z	d Z
d ZdS )r-  z=
    Return, if possible, the maximum value of the list.
    c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   r  rJ   s     r@   rM   z(Max._eval_is_positive.<locals>.<genexpr>  $      99!999999rB   r   rE   r   s    r@   r   zMax._eval_is_positive  s!    99ty999999rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   r  rJ   s     r@   rM   z+Max._eval_is_nonnegative.<locals>.<genexpr>  s%      <<Q(<<<<<<rB   r  r   s    r@   r   zMax._eval_is_nonnegative  s!    <<$)<<<<<<rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   r  rJ   s     r@   rM   z(Max._eval_is_negative.<locals>.<genexpr>  $      ::1::::::rB   r   rE   r   s    r@   r  zMax._eval_is_negative  s!    ::	::::::rB   N)r   r   r   r   r	   Infinityr  NegativeInfinityr  r   r   r  rX   rB   r@   r-  r-    s\          :D!H: : := = =; ; ; ; ;rB   r-  c                   @    e Zd ZdZej        Zej        Zd Z	d Z
d ZdS )r,  z=
    Return, if possible, the minimum value of the list.
    c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   r  rJ   s     r@   rM   z(Min._eval_is_positive.<locals>.<genexpr>  r  rB   r  r   s    r@   r   zMin._eval_is_positive  s!    ::	::::::rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   r  rJ   s     r@   rM   z+Min._eval_is_nonnegative.<locals>.<genexpr>  s%      ==a)======rB   r  r   s    r@   r   zMin._eval_is_nonnegative   s!    ==49======rB   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rH   r  rJ   s     r@   rM   z(Min._eval_is_negative.<locals>.<genexpr>  r  rB   r  r   s    r@   r  zMin._eval_is_negative  s!    99ty999999rB   N)r   r   r   r   r	   r  r  r  r  r   r   r  rX   rB   r@   r,  r,    s\          DzH; ; ;> > >: : : : :rB   r,  c                 X    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    sA    Daxxu!GqLLqqb)D#&&&&rB   c                    |dk     rt          d          |dk    rdS t          | |dz            }|t          u rt          S ||z  }|t          j        k    rt          S |dz  dk    r|| z  }|t          j        k    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}}qh!m,,H6
  F!|q$CKMMrB   c                   8    e Zd ZU dZdZeed<   ed             ZdS )r4   T2   r~   c                    t          |t          j                  rQt          |t          j                  r7t          ||          }|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 d S d S rH   )
r:   r;   r`   r  r   Powr   r   r   zoo)r   r   r  rP   s       r@   r   zPowByNatural.eval0  s    dEM** 	$z#u}/M/M 	$s##AfWf%%%=###c5=)) 	( 9T3'''658$$$" !! !y 	 %$! !rB   N)	r   r   r   r   r~   r_   r   r   r   rX   rB   r@   r4   r4   +  sD         JJ! ! [! ! !rB   r4   c                   8    e Zd ZU dZdZeed<   ed             ZdS )r3   T<   r~   c                     t          |t          j                  rKt          |t          j                  r3t          j        t	          |          t	          |          z            S d S d S rH   )r:   r;   r   rI   rO   )r   r   r  s      r@   r   zFloatPow.evalK  s`     dEL)) 	:jel.K.K 	:;uT{{eCjj8999	: 	: 	: 	:rB   N	r   r   r   r  r~   r_   r   r   r   rX   rB   r@   r3   r3   F  sD         GJ: : [: : :rB   r3   c                   8    e Zd ZU dZdZeed<   ed             ZdS )r*   Tr}   r~   c                     |j         rt          d          t          |t          j                  rKt          |t          j                  r3t          j        t          |          t          |          z            S d S d S Nr   )r   r   r:   r;   r   rI   rO   r   s      r@   r   zFloatTrueDiv.evala  sy    
 ? 	8#$6777dEL)) 	=j%,.O.O 	=;uT{{U7^^;<<<	= 	= 	= 	=rB   Nr  rX   rB   r@   r*   r*   \  sD         GJ= = [= = =rB   r*   c                   D    e Zd ZU dZdZeed<   ed             Zde	fdZ
dS )r)   Tr}   r~   c                    |j         rt          d          t          |t          j                  rit          |t          j                  rOt          |          st          |          r1t          j        t          |          t          |          z            S t          |t          j                  rKt          |t          j                  r3t          j        t          |          t          |          z            S d S d S r  )
r   r   r:   r;   r   r   rI   rO   r`   r_   r   s      r@   r   zIntTrueDiv.evalz  s    ? 	8#$6777 tU\**	=7EL11	= T""	= '2'&:&:	= ;uT{{U7^^;<<<dEM** 	9z'5=/Q/Q 	9;s4yy3w<<7888	9 	9 	9 	9rB   r7   c                     |                     | j        d         t          d         dz
            }|                     | 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  se    ##DIaL*V2Ds2JKK&&ty|Z5G#5MNN...G....rB   N)r   r   r   r  r~   r_   r   r   r   r   r   rX   rB   r@   r)   r)   u  s_         GJ9 9 [9/ / / / / / /rB   r)   c                   (    e Zd ZdZed             ZdS )r-   Tc           	      *   t          |          dz  dk    rt          dt          |                     t          |          dz  }|d|         }||d          }ddlm} t	          d |D                       r  |d |D             d |D                       S |dk    r6|d         j        r|d         dk    rdS |d         j        r|d         dk     rdS 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 |D             d |D                       S d S )Nr9   r   z*expected an even number of arguments, got )!eval_is_non_overlapping_and_densec              3   J   K   | ]}t          |t          j                  V  d S rH   r:   r;   r`   rJ   s     r@   rM   z9IsNonOverlappingAndDenseIndicator.eval.<locals>.<genexpr>  s.      ::z!U]++::::::rB   c                 ,    g | ]}t          |          S rX   r_   rJ   s     r@   rd   z:IsNonOverlappingAndDenseIndicator.eval.<locals>.<listcomp>  s    '''AQ'''rB   c                 ,    g | ]}t          |          S rX   r  rJ   s     r@   rd   z:IsNonOverlappingAndDenseIndicator.eval.<locals>.<listcomp>  s    )B)B)BQ#a&&)B)B)BrB   r   c              3   J   K   | ]}t          |t          j                  V  d S rH   r  rJ   s     r@   rM   z9IsNonOverlappingAndDenseIndicator.eval.<locals>.<genexpr>  s.      ==z!U]++======rB   zdim must not be zeroT)strict)keyr  c              3   J   K   | ]}t          |t          j                  V  d S rH   r  rJ   s     r@   rM   z9IsNonOverlappingAndDenseIndicator.eval.<locals>.<genexpr>  s.      FFA:a//FFFFFFrB   r   )*   c                 ,    g | ]}t          |          S rX   r  rJ   s     r@   rd   z:IsNonOverlappingAndDenseIndicator.eval.<locals>.<listcomp>  s    ---SVV---rB   c                 ,    g | ]}t          |          S rX   r  rJ   s     r@   rd   z:IsNonOverlappingAndDenseIndicator.eval.<locals>.<listcomp>  s    /J/J/J1A/J/J/JrB   )
r=   r   %torch.fx.experimental.symbolic_shapesr  rv   r   zipsortedoperator
itemgetter)r   rE   dimsizesstridesr  s_sizes	s_stridess           r@   r   z&IsNonOverlappingAndDenseIndicator.eval  s#   t99q=A HSYYHH   $ii1nQsUstt*	
 	
 	
 	
 	
 	
 ::T::::: 	44''''')B)B')B)B)B   !88qz# 
aqQx! eAhllq ==W===== 	axx$%;<<< "%E74888h>QRS>T>TUUU"" "GY
 FF"FFFFF !#2#,. 98--W---/J/J	/J/J/J   trB   Nr   rX   rB   r@   r-   r-     s2        J5 5 [5 5 5rB   r-   c                   (    e Zd ZdZed             ZdS )r.   Tc                     |t           j        t           j         fv r|S t          |t           j                  r3t          j        t          j        t          |                              S d S rH   )r;   r   r:   r   rI   rg   truncrO   r   s     r@   r   zTruncToFloat.eval  s]    eh	***Mfel++ 	: ;tz%--88999		: 	:rB   Nr   r   r   r  r   r   rX   rB   r@   r.   r.     s2        G: : [: : :rB   r.   c                   (    e Zd ZdZed             ZdS )r/   Tc                    |t           j        t          fv rt          S |t           j         t           fv rt           S t          |t           j                  r3t          j        t          j        t          |                              S d S rH   )	r;   r   r   r:   r   r`   rg   r  rO   r   s     r@   r   zTruncToInt.eval  sv     eh'''Muxi&)))7Nfel++ 	<=E&MM!:!:;;;	< 	<rB   Nr   rX   rB   r@   r/   r/     s2        J< < [< < <rB   r/   c                   (    e Zd ZdZed             ZdS )r0   Tc                     |t           j        u rt          S |t           j         u rt           S t          |t           j                  r/t          j        t          t          |          d                    S d S r   )r;   r   r   r:   r   r`   roundrO   r   s     r@   r   zRoundToInt.eval  sj     UXMehY7Nfel++ 	:=uV}}a!8!8999	: 	:rB   Nr   rX   rB   r@   r0   r0     s2        J: : [: : :rB   r0   c                   (    e Zd ZdZed             ZdS )r1   Tc                     t          |t          j                  rVt          |t          j                  r>t          j        t          t          |          t          |                              S d S d S rH   )r:   r;   r   r`   rI   r   rO   r_   )r   r   ndigitss      r@   r   zRoundDecimal.eval  sk     fel++ 	C
7EM0R0R 	C;uU6]]CLLAABBB	C 	C 	C 	CrB   Nr  rX   rB   r@   r1   r1     s7        GC C [C C CrB   r1   c                   (    e Zd ZdZed             ZdS )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 d S rH   )r;   r   r:   r`   rI   r_   r   r   s     r@   r   zToFloat.eval  sx    eh	***Mfem,, 	,;s6{{+++V8OfWH9 rB   Nr  rX   rB   r@   r2   r2     s2        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__3  s    *49Q<****rB   c                 J    d|                     | j        d                    dS )z+Controls how sympy's StrPrinter prints thisr   r   r   )doprintrE   )r   r   s     r@   r   zIdentity._sympystr7  s'     47??49Q<003333rB   c                 &    | j         d         j        S r   )rE   r  r   s    r@   r  zIdentity._eval_is_real<  s    y|##rB   c                 &    | j         d         j        S r   r   r   s    r@   r   zIdentity._eval_is_integer@  s    y|&&rB   c                 d    t          | j        d         j        o| j        d         j                  S r   )r   rE   rG  rH  r   s    r@   rG  zIdentity.is_numberC  s)    
 DIaL*Ity|/IJJJrB   c                 @    t          | j        d         j                  S r   )r   rE   rH  r   s    r@   rH  zIdentity.is_comparableJ  s     DIaL.///rB   c                     | j         d         S r   r   )r   hintss     r@   _eval_expand_identityzIdentity._eval_expand_identityP  r   rB   c                 6    t          | j        d                   S r   )r_   rE   r   s    r@   __int__zIdentity.__int__U  s    49Q<   rB   c                 ^   | j         d         }t          |t                    rt          j        |          }t          |t          j                  sdS |j        r|j        r|j        sdS |j        r|j        r|j        sdS  |||          rt          j	        j
        n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:   r_   r;   r`   r   is_AtomrG  rH  r	   r   r   )r   r4  oprc   s       r@   _identity_atom_comparezIdentity._identity_atom_compareY  s    
 ileS!! 	)M%((E%,, 	4 	 	#2C 	4 	%/ 	e6I 	4!r#u~~@uw||57=@rB   c                 |    |                      |d           }||n t                                          |          S )Nc                     | |k    S rH   rX   rL   bs     r@   r5  z!Identity.__ge__.<locals>.<lambda>j  
    a1f rB   )r8  super__ge__r   r4  out	__class__s      r@   r?  zIdentity.__ge__i  :    ))%1D1DEEoss577>>%+@+@@rB   c                 |    |                      |d           }||n t                                          |          S )Nc                     | |k    S rH   rX   r;  s     r@   r5  z!Identity.__gt__.<locals>.<lambda>n  
    a!e rB   )r8  r>  __gt__r@  s      r@   rG  zIdentity.__gt__m  :    ))%1C1CDDoss577>>%+@+@@rB   c                 |    |                      |d           }||n t                                          |          S )Nc                     | |k    S rH   rX   r;  s     r@   r5  z!Identity.__le__.<locals>.<lambda>r  r=  rB   )r8  r>  __le__r@  s      r@   rK  zIdentity.__le__q  rC  rB   c                 |    |                      |d           }||n t                                          |          S )Nc                     | |k     S rH   rX   r;  s     r@   r5  z!Identity.__lt__.<locals>.<lambda>v  rF  rB   )r8  r>  __lt__r@  s      r@   rN  zIdentity.__lt__u  rH  rB   c                 6    t          | j        d                   S r   )rO   rE   r   s    r@   	__float__zIdentity.__float__y  s    TYq\"""rB   )r   r   r   r   r~   r   r)  r   r  r   r   rG  rH  r2  r_   r4  r8  r?  rG  rK  rN  rO   rP  __classcell__)rB  s   @r@   r5   r5   ,  s         J+# + + + +4C 4 4 4 4
$ $ $' ' ' K K XK 0 0 X0
  
! ! ! ! !A A A A A A A AA A A A AA A A A AA A A A A#5 # # # # # # # #rB   r5   c                 b      G  fddt           j                  }d z   }||_        ||_        |S )Nc                   6    e Zd ZdZ ZeZe fd            ZdS )+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                 t   t          |t          j        t          j        f          rl	 t          j         t	          t
                    t          |                              S # t          $ r!  t	          t                    |          cY S w xY w|t          j        t          j         t          j	        t          j	         t          t           fv re|t          u rt          j        }|t           u rt          j         }dk    rt          j        |d          S  t	          t                    |          S d S )Nlog2r9   )r:   r;   r`   rI   r  rg   rO   OverflowErrorr   r  r   log)r   rL   names     r@   r   z0make_opaque_unary_fn.<locals>.OpaqueUnaryFn.eval  s   !emU[9:: /3 ;':wtT':':588'D'DEEE % 3 3 3/75$//222223ux%(EI	z6F7SSS;;A<<	A6>> 9Q??*+wud++A...4s   <A& &(BBN)	r   r   r   r   _torch_handler_namemake_opaque_unary_fn_torch_unpicklerr   r   )rY  s   r@   OpaqueUnaryFnrT    sP        	 	 #/		 	 	 	 
	 	 	rB   r]  OpaqueUnaryFn_)r;   Functionr   r   )rY  r]  nms   `  r@   r[  r[  ~  s\    $ $ $ $ $ $ $ $ $ $L 
D	 BM!#MrB   sqrtcoscoshsinsinhtantanhasinacosatanr  rX  asinhrV  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                   b    e Zd ZU  ZZeed<    ej        e	          Z
efd            ZdS ))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          rlt          |t          j        t          f          rKt          j         t          t                    t          |          t          |                              S d S )Nr   r   )r   r  r  r;   r`   r:   r_   )r   rL   r<  ru  s      r@   r   z.make_opaque_bitwise_fn.<locals>.BitwiseFn.eval  s    | = =6wx66q!<<<| 1Mq-!!a00| 1Mq-!!a00!emS122 VzEM3'8 8 V }%DWX|%D%DSVVSQRVV%T%TUUU4rB   N)r   r   r   rZ  r~   r_   r   rR   partialmake_opaque_bitwise_fnr\  r   r   )rY  precru  s   r@   	BitwiseFnrt    sq         "
C,9,"
 
 
 
	 	 	 	 
	 	 	rB   rz  
BitwiseFn_)r   r   r;   r_  r   r   )rY  ru  rz  r`  ry  s   ``  @r@   rx  rx    s    },'			,'			+&3T33444        EN   * 
	BIIrB   rm  and_rq  or_ro  xor)erR   rg   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   rT   rY   rt   ry   r_  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   r[  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_log2rx  BitwiseFn_bitwise_andBitwiseFn_bitwise_orBitwiseFn_bitwise_xorrX   rB   r@   <module>r     s         



 $ $ $ $ $ $ 8 8 8 8 8 8 8 8 8 8 2 2 2 2 2 2 2 2                          + + + + + + 7 7 7 7 7 7 7 7 7 7 + + + + + + 9 9 9 9 9 9 9 9 & & & & & & % % % % % % 0 0 0 0 0 0 * * * * * * , , , , , , ( ( ( ( ( ( ( (  )(((((( WT'''l5B  4	uz 	d 	 	 	 	r!"vc{mR%+--.    t t t    )5; )5; )5; ) ) ) )|| | | | |u~ | | |~@< @< @< @< @<en @< @< @<F    EN   >BD BD BD BD BD BD BD BDL3 3 3 3 3%. 3 3 3l    x   ! ! ! ! ! ! ! !&< < < < < < < <; ; ; ; ;en ; ; ;     U^   ( ( ( ( (U^ ( ( (w? w? w? w? w?y w? w? w?t; ; ; ; ;*k ; ; ;&: : : : :*k : : :&' ' '  4! ! ! ! !5> ! ! !6: : : : :u~ : : :,= = = = =5> = = =2/ / / / / / / /F9 9 9 9 9 9 9 9z: : : : :5> : : :< < < < < < < <: : : : : : : :<C C C C C5> C C C    en    O# O# O# O# O#u~ O# O# O#d+ + +^ *)&11 ((// ))&11 ((// ))&11 ((// ))&11 ))&11 ))&11 ))&11 ((// ((// **733 ))&11 # # #L /.}fEE --lEBB ..}eDD   rB   