
    [i                     D   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) erd dlm*Z*  e	de          Z+ ed          Z,g dZ-dej        de.fdZ/deee,         ge+f         deee,         ge+ej0        z  f         fdZ1de.dz  de.dz  de.dz  fdZ2d ej3        d!ej3        dej3        fd"Z4 G d# d$ej5                  Z6 G d% d&ej5                  Z7 G d' d(ej5                  Z8 G d) d*ej5                  Z9 G d+ d,ej5                  Z: G d- d.e6          Z; G d/ d0ej5                  Z< G d1 d2ej5                  Z= G d3 d4ej5                  Z> G d5 d6ej5                  Z? G d7 d8ej5                  Z@ G d9 d:ee          ZA G d; d<eAe          ZB G d= d>eAe          ZCd? ZDd@ ZE G dA dBej5                  ZF G dC dDej5                  ZG G dE dFej5                  ZH G dG dHej5                  ZI G dI dJej5                  ZJ G dK dLej5                  ZK G dM dNej5                  ZL G dO dPej5                  ZM G dQ dRej5                  ZN G dS dTej5                  ZO G dU dVej5                  ZPdW ZQ eQdX          ZR eQdY          ZS eQdZ          ZT eQd[          ZU eQd\          ZV eQd]          ZW eQd^          ZX eQd_          ZY eQd`          ZZ eQda          Z[ eQdb          Z\ eQdc          Z] eQdd          Z^ eQde          Z_df Z` e`dgdh          Za e`didj          Zb e`dkdl          Zcd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)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                     | j         oUt          | j                  dk    o=| j        d         j        o+| j        d         j        o| j        d         | j        d         uS )N   r   r   )is_Addlen_args	is_symbol)r5   s    O/var/www/icac/venv/lib/python3.11/site-packages/torch/utils/_sympy/functions.py_is_symbols_binary_summationr>   \   sb     	 	/
OOq 	/JqM#	/ JqM#	/ JqMA.    fc                      t          j                   dt          t                   dt          t
          j        z  f fd            }|S )Nargsr6   c                       |  }t          d | D                       r;t          |t          j                  s!t          j        t	          |                    }|S )Nc              3   J   K   | ]}t          |t          j                  V  d S N)
isinstancesympyFloat.0as     r=   	<genexpr>z-_keep_float.<locals>.inner.<locals>.<genexpr>n   s.      88az!U[))888888r?   )anyrF   rG   rH   float)rB   rr@   s     r=   innerz_keep_float.<locals>.innerj   se      ah88488888 	&u{B
 B
 	& E!HH%%Ar?   )	functoolswrapsr   r   r   rG   rH   )r@   rP   s   ` r=   _keep_floatrS   g   sX     _QVC[ R%+%5       Lr?   xyc                     d | |fv rd S | |k    S rE    )rT   rU   s     r=   fuzzy_eqrX   x   s    1v~~t6Mr?   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.
    rT   r6   c                 |    d t           j                            |           D             }t          j        |          S )Nc                     g | ]?}t          |t          t          j        f          #t	          t          |                    @S rW   )rF   intrG   IntegerabsrJ   args     r=   
<listcomp>zDsimple_floordiv_gcd.<locals>.integer_coefficient.<locals>.<listcomp>   sK     +
 +
 +
#U]344+
CMM+
 +
 +
r?   )rG   Mul	make_argsmathprod)rT   integer_coefficientss     r=   integer_coefficientz0simple_floordiv_gcd.<locals>.integer_coefficient   sD    +
 +
y**1--+
 +
 +

 y-...r?   r5   c                     t          t          j                            |                     }t	          j        t          j        |          S rE   )maprG   Addre   rQ   reducerf   gcd)r5   integer_factorsri   s     r=   integer_factorz+simple_floordiv_gcd.<locals>.integer_factor   s>    ),!4!4T!:!:*
 *
 /:::r?   c              3       K   | ]}|v V  	d S rE   rW   )rJ   
base_splitrT   s     r=   rL   z&simple_floordiv_gcd.<locals>.<genexpr>   s'      ==:qJ======r?   )rG   Basicr^   rf   rn   listrk   rd   re   rl   all)rY   rZ   rp   rn   base_splitsdivisor_splitri   rT   s         @@r=   simple_floordiv_gcdrx   ~   s   "/u{ /s / / / /;U[ ;S ; ; ; ; ; ; xq))>>!+<+<==Cs7AGqA15EI!4!4Q!7!7882 2K .3Y-@-@-C-CM  ========= 	'CJr?   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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
    r8   .nargs#   
precedenceT
is_integerr6   c                     | j         d         S Nr   rB   selfs    r=   basezFloorDiv.base        y|r?   c                     | j         d         S Nr   r   r   s    r=   divisorzFloorDiv.divisor   r   r?   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%%%%r?   r   r   Nc                 	   |j         rt          d          |t          t           t          j        t          j         fv r4|t          t           t          j        t          j         fv 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 t          |t          j                  rt          |t          j                  r|t          t           t          j        t          j         fv s(|t          t           t          j        t          j         fv 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
                  rlt1          t          j                  t1          d          k     rB|                    t          j                  }	t9          d |	D                       }
|j        o|
}n|j        }|r|                    |           ||z  }t=          |          dk    r%t)          |t          j        |ddiz
  |          |z   S 	 t?          ||          }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)rZ   )rJ   rO   s     r=   rL   z FloorDiv.eval.<locals>.<genexpr>  s(      ,I,I!QSAX,I,I,I,I,I,Ir?   evaluateF)#is_zeroZeroDivisionErrorr   rG   oonanr	   Zeror~   r   rd   rF   NumberrN   rf   infisnanr_   floorr^   r   rB   rl   re   r   __version__atomsRationalru   appendr:   rx   rn   simplifyPolynomialError)clsr   r   rO   	quotientstermstermquotientquotient_is_integer	rationalsall_rationals_intsrn   s               r=   evalzFloorDiv.eval   s1    ? 	8#$6777FVGUXy999gGHXI	J
 ?
 ?
 95959 4 49< 	 7<? 	|GQ77 	K? 	'|GR88 	'9T2&&&tU\**	47EL11	4 &%(UXI>>>vw58)DDD 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Q8 8R
	R
)__name__
__module____qualname____doc__r{   tupler^   __annotations__r}   r~   boolpropertyrG   rs   r   r   printing
StrPrinterstrr   classmethodr_   r   rW   r?   r=   r   r      s          "E5c?!!!JJek    X     X&!: &s & & & & [ [ [%+PTBT [ [ [ [[ [ [r?   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   modulusr6   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)rG   r	   r   rF   r_   rn   r    r   r   rl   rB   rd   r   r:   sumr   )r   r   r   r   rn   	new_termsall_positiver   s           r=   r   zModularIndexing.evalB  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 )Nr8   )rB   rX   is_nonnegative)r   rY   rZ   s      r=   _eval_is_nonnegativez$ModularIndexing._eval_is_nonnegativev  s+    y!}1(!*:;;;r?   )r   r   r   r   r{   r   r^   r   r~   r   r}   r   rG   r_   rs   r   r   rW   r?   r=   r    r    9  s           "E5c?!!!JJ1=1+0=1CH=1	t	1 1 1 [1f<dTk < < < < < <r?   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}   r6   Nc                 R    | j         d         j        r| j         d         j        rdnd S Nr   r8   TrB   r~   r   s    r=   _eval_is_integerzWhere._eval_is_integer  s)    y|.T49Q<3JTttPTTr?   c                 R    | j         d         j        r| j         d         j        rdnd S r   )rB   r   r   s    r=   r   zWhere._eval_is_nonnegative  s2     y|*/3y|/JDD	
r?   c                 R    | j         d         j        r| j         d         j        rdnd S r   rB   is_positiver   s    r=   _eval_is_positivezWhere._eval_is_positive  s)    y|/VDIaL4LVttRVVr?   crY   rZ   c                 N    |t           j        k    r|S |t           j        k    r|S d S rE   )rG   truefalse)r   r   rY   rZ   s       r=   r   z
Where.eval  s)    
??H%+Htr?   )r   r   r   r   r{   r   r^   r   r}   r   r   r   r   r   rG   rs   r   rW   r?   r=   r!   r!   |  s           "E5c?!!!JU$+ U U U U
dTk 
 
 
 
W4$; W W W W U[ U[ U[ U[SWEW    [  r?   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"   rz   .r{   r|   r}   Tr~   rY   rZ   r6   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   r8   r   )r   r   r	   r   	is_Numberis_evenis_oddOner~   
is_Booleanr   r   rG   r#   r   rY   rZ   rO   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tr?   c                 .    | j         d         j        rdnd S Nr   Tr   r   s    r=   r   zPythonMod._eval_is_nonnegative      y|/9ttT9r?   c                 .    | j         d         j        rdnd S r   )rB   is_negativer   s    r=   _eval_is_nonpositivezPythonMod._eval_is_nonpositive  r   r?   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   rB   r   r   r   )r   r   rY   rZ   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Cr?   )r   r   r   r{   r   r^   r   r}   r~   r   r   rG   r   r   r   r   r   r   rW   r?   r=   r"   r"     s         !E5c?!!!JJ+UZ +EJ +5:3D + + + [+\:dTk : : : ::dTk : : : :D D D D D D Dr?   r"   c                   @    e Zd ZU dZdZeed<   dZdZe	d             Z
dS )r#   rz   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   r8   )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	 	 	 	 	 	r?   N)r   r   r   r{   r}   r^   r   r~   r   r   r   rW   r?   r=   r#   r#     sN         EJJN+ + [+ + +r?   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   rW   r?   r=   r$   r$     s           r?   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 rE   )	rG   r   r   rF   r   r_   rf   ceilrN   r   numbers     r=   r   zCeilToInt.eval#  sv     eh'''Muxi&)))7Nfel++ 	;=5==!9!9:::	; 	;r?   r6   c                 v    |                     | j        d         | j        d         j        dz
            }d| dS )Nr   r   zceil(r   )r   rB   r}   )r   r   r   s      r=   r   zCeilToInt._ccode-  s<    %%dilDIaL4Kc4QRR v    r?   N)r   r   r   r~   r   r   r   r   rW   r?   r=   r%   r%      sM        J; ; [;! ! ! ! ! ! !r?   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 rE   )	rG   r   r   rF   r_   r   rf   r   rN   r   s     r=   r   zFloorToInt.eval6  s    eh'''Muxi(((7Nfem,, 	Mfel++ 	<=E&MM!:!:;;;	< 	<r?   Nr   r   r   r~   r   r   rW   r?   r=   r&   r&   3  s2        J< < [< < <r?   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   )rG   r   rn   r$   r   r   r   r   s      r=   __new__zCeilDiv.__new__I  s`    }T""-((9T7##w..D'***DGaK0':::r?   N)r   r   r   r   r~   r   rW   r?   r=   r'   r'   B  s4          J; ; ; ; ;r?   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 countr8   )
ValueErrorr   r   shifts      r=   r   zLShift.evalU  s(    1993444ahr?   Nr   rW   r?   r=   r*   r*   R  s2        J  [  r?   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.eval_  s.    1993444ah'''r?   Nr   rW   r?   r=   r+   r+   \  s2        J( ( [( ( (r?   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 rE   r
   ra   s     r=   rL   z%MinMaxBase.__new__.<locals>.<genexpr>k  s(      66666666r?   r   )sympy.core.parametersr  popr   "_satisfy_unique_summations_symbols	frozenset_new_args_filterr   zero_collapse_arguments_find_localzerosidentityr:   rt   r   r   r   _argsetunique_summations_symbols)r   original_argsassumptionsr  r   rB   r  objs           r=   r   zMinMaxBase.__new__g  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r6   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.
        r8   Nr   r   r  )r:   rF   r  r>   _unique_symbolsgetattr)r   rB   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tr?   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   rF   rG   coresymbolSymboladd)r   rB   r  seen_symbolsrb   elements         r=   r  zMinMaxBase._unique_symbols  s     !, 3suuu 	. 	.C99;; . .!'5:+<+CDD .444,,444 $$W----. r?   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 rW   rW   rJ   irK   dos     r=   rc   z>MinMaxBase._collapse_arguments.<locals>.do.<locals>.<listcomp>;  s#     ; ; ;aAq ; ; ;r?   r   Fc                 4    g | ]}|k     |          S rW   rW   r%  s     r=   rc   z>MinMaxBase._collapse_arguments.<locals>.do.<locals>.<listcomp>>  s(     E E Eaa1ffAqfffr?   )rF   MinMaxrB   func)airK   condr   r'  s    ` r=   r'  z*MinMaxBase._collapse_arguments.<locals>.do6  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Hr?   c                 (    g | ]} |          S rW   rW   )rJ   r,  rK   r'  s     r=   rc   z2MinMaxBase._collapse_arguments.<locals>.<listcomp>B  s#    ???2RRAYY???r?   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 rE   )rF   )rb   others    r=   <lambda>zGMinMaxBase._collapse_arguments.<locals>.factor_minmax.<locals>.<lambda>L  s    :c5#9#9 r?   T)binaryc                 6    g | ]}t          |j                  S rW   )r  rB   ra   s     r=   rc   zIMinMaxBase._collapse_arguments.<locals>.factor_minmax.<locals>.<listcomp>R  s     <<<#CH<<<r?   c                     g | ]}|z
  S rW   rW   )rJ   arg_setcommons     r=   rc   zIMinMaxBase._collapse_arguments.<locals>.factor_minmax.<locals>.<listcomp>X  s    FFF'Wv-FFFr?   c                      g | ]
} |d diS )r   FrW   )rJ   sr1  s     r=   rc   zIMinMaxBase._collapse_arguments.<locals>.factor_minmax.<locals>.<listcomp>]  s(    "T"T"T55!#<e#<#<"T"T"Tr?   r   F)r   r  intersectionrt   ru   r   )rB   is_other
other_argsremaining_argsarg_setsnew_other_argsarg_sets_diffother_args_diffother_args_factoredr7  r   r1  s            @r=   factor_minmaxz5MinMaxBase._collapse_arguments.<locals>.factor_minmaxK  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9r?   )rt   r   r)  r*  	is_numberr   rB   is_comparablerF   r   r  ranger:   	enumerate)r   rB   r  siftedminsmaxsr&  vsmallbigrb   Ta0rC  rK   r'  r1  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r?   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)rF   r   is_extended_realrD  rE  r   r
  r   r  r+  rB   )r   arg_sequencerb   s      r=   r	  zMinMaxBase._new_args_filterh  s         	 	C sD))M'500M 1*-*; 1 !!K#!K!K!KLLLch"3'''$$S8########				!	 	r?   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_valuerb   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###r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   )is_algebraicrJ   r&  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  $      (H(HA(H(H(H(H(H(Hr?   r   rB   r9  s    r=   r2  zMinMaxBase.<lambda>      5(H(H(H(H(H#H#H r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   )is_antihermitianr`  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  9       - - 	
- - - - - -r?   rb  rc  s    r=   r2  zMinMaxBase.<lambda>  .    u - -- - - ( ( r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   )is_commutativer`  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  9       + + 	
+ + + + + +r?   rb  rc  s    r=   r2  zMinMaxBase.<lambda>  .    U + ++ + + & & r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   )
is_complexr`  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  $      &D&Dq|&D&D&D&D&D&Dr?   rb  rc  s    r=   r2  zMinMaxBase.<lambda>      &D&DQV&D&D&D!D!D r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   )is_compositer`  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  ra  r?   rb  rc  s    r=   r2  zMinMaxBase.<lambda>  rd  r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   )r   r`  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  $      #>#>!AI#>#>#>#>#>#>r?   rb  rc  s    r=   r2  zMinMaxBase.<lambda>      e#>#>qv#>#>#>>> r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   )	is_finiter`  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  s$      %B%Baak%B%B%B%B%B%Br?   rb  rc  s    r=   r2  zMinMaxBase.<lambda>  s    %B%B16%B%B%B B B r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   )is_hermitianr`  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  ra  r?   rb  rc  s    r=   r2  zMinMaxBase.<lambda>  rd  r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   )is_imaginaryr`  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  ra  r?   rb  rc  s    r=   r2  zMinMaxBase.<lambda>  rd  r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   )is_infiniter`  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  $      'F'F!'F'F'F'F'F'Fr?   rb  rc  s    r=   r2  zMinMaxBase.<lambda>      %'F'Fqv'F'F'F"F"F r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   )r~   r`  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rr  r?   rb  rc  s    r=   r2  zMinMaxBase.<lambda>  rs  r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   )is_irrationalr`  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  $      )J)Ja!/)J)J)J)J)J)Jr?   rb  rc  s    r=   r2  zMinMaxBase.<lambda>      E)J)J16)J)J)J$J$J r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   r   r`  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r  r?   rb  rc  s    r=   r2  zMinMaxBase.<lambda>  r  r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   )is_nonintegerr`  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r  r?   rb  rc  s    r=   r2  zMinMaxBase.<lambda>  r  r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   r   r`  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rm  r?   rb  rc  s    r=   r2  zMinMaxBase.<lambda>  rn  r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   )is_nonpositiver`  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rm  r?   rb  rc  s    r=   r2  zMinMaxBase.<lambda>  rn  r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   )
is_nonzeror`  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rr  r?   rb  rc  s    r=   r2  zMinMaxBase.<lambda>  rs  r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   )r   r`  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  s$      "<"<18"<"<"<"<"<"<r?   rb  rc  s    r=   r2  zMinMaxBase.<lambda>  s    U"<"<QV"<"<"<<< r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   )is_polarr`  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  $      $@$@AQZ$@$@$@$@$@$@r?   rb  rc  s    r=   r2  zMinMaxBase.<lambda>      u$@$@$@$@$@@@ r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   r   r`  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r  r?   rb  rc  s    r=   r2  zMinMaxBase.<lambda>  r  r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   )is_primer`  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r  r?   rb  rc  s    r=   r2  zMinMaxBase.<lambda>  r  r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   )is_rationalr`  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r  r?   rb  rc  s    r=   r2  zMinMaxBase.<lambda>  r  r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   )is_realr`  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  ry  r?   rb  rc  s    r=   r2  zMinMaxBase.<lambda>  rz  r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   )rQ  r`  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rh  r?   rb  rc  s    r=   r2  zMinMaxBase.<lambda>  ri  r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   )is_transcendentalr`  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  s9       . . 	
. . . . . .r?   rb  rc  s    r=   r2  zMinMaxBase.<lambda>  s.     . .. . . ) ) r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   )r   r`  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  ry  r?   rb  rc  s    r=   r2  zMinMaxBase.<lambda>  rz  r?   rE   ))r   r   r   r   r   r  rG   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_zerorW   r?   r=   r  r  f  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   ?>MMMr?   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 rE   r  rI   s     r=   rL   z(Max._eval_is_positive.<locals>.<genexpr>  $      99!999999r?   r   rB   r   s    r=   r   zMax._eval_is_positive  s!    99ty999999r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   r  rI   s     r=   rL   z+Max._eval_is_nonnegative.<locals>.<genexpr>  s%      <<Q(<<<<<<r?   r  r   s    r=   r   zMax._eval_is_nonnegative  s!    <<$)<<<<<<r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   r  rI   s     r=   rL   z(Max._eval_is_negative.<locals>.<genexpr>  $      ::1::::::r?   r   rB   r   s    r=   r  zMax._eval_is_negative  s!    ::	::::::r?   N)r   r   r   r   r	   Infinityr
  NegativeInfinityr  r   r   r  rW   r?   r=   r*  r*    s\          :D!H: : := = =; ; ; ; ;r?   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 rE   r  rI   s     r=   rL   z(Min._eval_is_positive.<locals>.<genexpr>  r  r?   r  r   s    r=   r   zMin._eval_is_positive  s!    ::	::::::r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   r  rI   s     r=   rL   z+Min._eval_is_nonnegative.<locals>.<genexpr>  s%      ==a)======r?   r  r   s    r=   r   zMin._eval_is_nonnegative  s!    ==49======r?   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rE   r  rI   s     r=   rL   z(Min._eval_is_negative.<locals>.<genexpr>  r  r?   r  r   s    r=   r  zMin._eval_is_negative  s!    99ty999999r?   N)r   r   r   r   r	   r  r
  r  r  r   r   r  rW   r?   r=   r)  r)    s\          DzH; ; ;> > >: : : : :r?   r)  c                 X    d}| dk     r|  } |dz  dk    rdnd}|t          | |          z  S )Nr   r   r8   r   )	_safe_pow)r   expsigns      r=   safe_powr    sA    Daxxu!GqLLqqb)D#&&&&r?   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   r8   )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Mr?   c                   8    e Zd ZU dZdZeed<   ed             ZdS )r3   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 rE   )
rF   rG   r_   r  r   Powr   r   r   zoo)r   r   r  rO   s       r=   r   zPowByNatural.eval.  s    dEM** 	$z#u}/M/M 	$s##AfWf%%%=###c5=)) 	( 9T3'''658$$$" !! !y 	 %$! !r?   N)	r   r   r   r~   r}   r^   r   r   r   rW   r?   r=   r3   r3   )  sD         JJ! ! [! ! !r?   r3   c                   8    e Zd ZU dZdZeed<   ed             ZdS )r2   T<   r}   c                     t          |t          j                  rKt          |t          j                  r3t          j        t	          |          t	          |          z            S d S d S rE   )rF   rG   r   rH   rN   )r   r   r  s      r=   r   zFloatPow.evalI  s`     dEL)) 	:jel.K.K 	:;uT{{eCjj8999	: 	: 	: 	:r?   N	r   r   r   r  r}   r^   r   r   r   rW   r?   r=   r2   r2   D  sD         GJ: : [: : :r?   r2   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   rF   rG   r   rH   rN   r   s      r=   r   zFloatTrueDiv.eval_  sy    
 ? 	8#$6777dEL)) 	=j%,.O.O 	=;uT{{U7^^;<<<	= 	= 	= 	=r?   Nr  rW   r?   r=   r)   r)   Z  sD         GJ= = [= = =r?   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   |j         rt          d          t          |t          j                  rt          |t          j                  r|t
          t
           t          j        t          j         fv s(|t
          t
           t          j        t          j         fv 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   rF   rG   r   r   r   rH   rN   r_   r^   r   s      r=   r   zIntTrueDiv.evalx  s    ? 	8#$6777 tU\**
	=7EL11
	= &%(UXI>>>vw58)DDD
 ;uT{{U7^^;<<<dEM** 	9z'5=/Q/Q 	9;s4yy3w<<7888	9 	9 	9 	9r?   r6   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   rB   r   r   s       r=   r   zIntTrueDiv._ccode  se    ##DIaL*V2Ds2JKK&&ty|Z5G#5MNN...G....r?   N)r   r   r   r  r}   r^   r   r   r   r   r   rW   r?   r=   r(   r(   s  s_         GJ9 9 [9$/ / / / / / /r?   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 )Nr8   r   z*expected an even number of arguments, got )!eval_is_non_overlapping_and_densec              3   J   K   | ]}t          |t          j                  V  d S rE   rF   rG   r_   rI   s     r=   rL   z9IsNonOverlappingAndDenseIndicator.eval.<locals>.<genexpr>  s.      ::z!U]++::::::r?   c                 ,    g | ]}t          |          S rW   r^   rI   s     r=   rc   z:IsNonOverlappingAndDenseIndicator.eval.<locals>.<listcomp>  s    '''AQ'''r?   c                 ,    g | ]}t          |          S rW   r  rI   s     r=   rc   z:IsNonOverlappingAndDenseIndicator.eval.<locals>.<listcomp>  s    )B)B)BQ#a&&)B)B)Br?   r   c              3   J   K   | ]}t          |t          j                  V  d S rE   r  rI   s     r=   rL   z9IsNonOverlappingAndDenseIndicator.eval.<locals>.<genexpr>  s.      ==z!U]++======r?   zdim must not be zeroT)strict)keyr  c              3   J   K   | ]}t          |t          j                  V  d S rE   r  rI   s     r=   rL   z9IsNonOverlappingAndDenseIndicator.eval.<locals>.<genexpr>  s.      FFA:a//FFFFFFr?   r   )*   c                 ,    g | ]}t          |          S rW   r  rI   s     r=   rc   z:IsNonOverlappingAndDenseIndicator.eval.<locals>.<listcomp>  s    ---SVV---r?   c                 ,    g | ]}t          |          S rW   r  rI   s     r=   rc   z:IsNonOverlappingAndDenseIndicator.eval.<locals>.<listcomp>  s    /J/J/J1A/J/J/Jr?   )
r:   r   %torch.fx.experimental.symbolic_shapesr  ru   r   zipsortedoperator
itemgetter)r   rB   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   tr?   Nr   rW   r?   r=   r,   r,     s2        J5 5 [5 5 5r?   r,   c                   (    e Zd ZdZed             ZdS )r-   Tc                     t          |t          j                  r3t          j        t	          j        t          |                              S d S rE   )rF   rG   r   rH   rf   truncrN   r   s     r=   r   zTruncToFloat.eval  sD     fel++ 	: ;tz%--88999		: 	:r?   Nr   r   r   r  r   r   rW   r?   r=   r-   r-     s2        G: : [: : :r?   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 rE   )	rG   r   r   rF   r   r_   rf   r  rN   r   s     r=   r   zTruncToInt.eval  sv     eh'''Muxi&)))7Nfel++ 	<=E&MM!:!:;;;	< 	<r?   Nr   rW   r?   r=   r.   r.     s2        J< < [< < <r?   r.   c                   (    e Zd ZdZed             ZdS )r/   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   )rG   r   r   rF   r   r_   roundrN   r   s     r=   r   zRoundToInt.eval  sj     UXMehY7Nfel++ 	:=uV}}a!8!8999	: 	:r?   Nr   rW   r?   r=   r/   r/     s2        J: : [: : :r?   r/   c                   (    e Zd ZdZed             ZdS )r0   Tc                     t          |t          j                  rVt          |t          j                  r>t          j        t          t          |          t          |                              S d S d S rE   )rF   rG   r   r_   rH   r  rN   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r?   Nr  rW   r?   r=   r0   r0     s7        GC C [C C Cr?   r0   c                   (    e Zd ZdZed             ZdS )r1   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 rE   )rG   r   rF   r_   rH   r^   r   r   s     r=   r   zToFloat.eval  sx    eh	***Mfem,, 	,;s6{{+++V8OfWH9 r?   Nr  rW   r?   r=   r1   r1     s2        G	 	 [	 	 	r?   r1   c                   X    e Zd ZdZdZdefdZdefdZd Zd Z	d Z
defd	Zdefd
ZdS )r4   z4
    Prevents expansion and other optimizations
    
   r6   c                 $    d| j         d          dS )Nz	Identity(r   r   r   r   s    r=   __repr__zIdentity.__repr__2  s    *49Q<****r?   c                 J    d|                     | j        d                    dS )z+Controls how sympy's StrPrinter prints thisr   r   r   )doprintrB   )r   r   s     r=   r   zIdentity._sympystr6  s'     47??49Q<003333r?   c                 &    | j         d         j        S r   )rB   r  r   s    r=   r  zIdentity._eval_is_real;  s    y|##r?   c                 &    | j         d         j        S r   r   r   s    r=   r   zIdentity._eval_is_integer?  s    y|&&r?   c                     | j         d         S r   r   )r   hintss     r=   _eval_expand_identityzIdentity._eval_expand_identityB  r   r?   c                 6    t          | j        d                   S r   )r^   rB   r   s    r=   __int__zIdentity.__int__G  s    49Q<   r?   c                 6    t          | j        d                   S r   )rN   rB   r   s    r=   	__float__zIdentity.__float__K  s    TYq\"""r?   N)r   r   r   r   r}   r   r'  r   r  r   r.  r^   r0  rN   r2  rW   r?   r=   r4   r4   +  s          J+# + + + +4C 4 4 4 4
$ $ $' ' '  
! ! ! ! !#5 # # # # # #r?   r4   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log2r8   )rF   rG   r_   rH   r  rf   rN   OverflowErrorr   r  r   log)r   rK   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   )r:  s   r=   OpaqueUnaryFnr5  Q  sP        	 	 #/		 	 	 	 
	 	 	r?   r>  OpaqueUnaryFn_)rG   Functionr   r   )r:  r>  nms   `  r=   r<  r<  P  s\    $ $ $ $ $ $ $ $ $ $L 
D	 BM!#Mr?   sqrtcoscoshsinsinhtantanhasinacosatanr  r9  asinhr7  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  rG   r_   rF   r^   )r   rK   brV  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4r?   N)r   r   r   r;  r}   r^   r   rQ   partialmake_opaque_bitwise_fnr=  r   r   )r:  precrV  s   r=   	BitwiseFnrU    sq         "
C,9,"
 
 
 
	 	 	 	 
	 	 	r?   r\  
BitwiseFn_)r   r   rG   r@  r   r   )r:  rV  r\  rA  r[  s   ``  @r=   rZ  rZ    s    },'			,'			+&3T33444        EN   * 
	BIIr?   rN  and_rR  or_rP  xor)drQ   rf   r  r  collections.abcr   typingr   r   r   typing_extensionsr   r   rG   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   __all__r   r>   rH   rS   rX   rs   rx   r@  r   r    r!   r"   r#   r$   r%   r&   r'   r*   r+   r  r*  r)  r  r  r3   r2   r)   r(   r,   r-   r.   r/   r0   r1   r4   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_log2rZ  BitwiseFn_bitwise_andBitwiseFn_bitwise_orBitwiseFn_bitwise_xorrW   r?   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; ) ) ) )|z z z z zu~ z z zz@< @< @< @< @<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/ / / / / / / /L9 9 9 9 9 9 9 9z
: 
: 
: 
: 
:5> 
: 
: 
:< < < < < < < <: : : : : : : :<C C C C C5> C C C    en    "# "# "# "# "#u~ "# "# "#J+ + +^ *)&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   r?   