
    i                     &   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j`                  z  f   fdZ1de.dz  de.dz  de.dz  fdZ2d ejf                  d!ejf                  dejf                  fd"Z4 G d# d$ejj                        Z6 G d% d&ejj                        Z7 G d' d(ejj                        Z8 G d) d*ejj                        Z9 G d+ d,ejj                        Z: G d- d.e6      Z; G d/ d0ejj                        Z< G d1 d2ejj                        Z= G d3 d4ejj                        Z> G d5 d6ejj                        Z? G d7 d8ejj                        Z@ G d9 d:ee      ZA G d; d<eAe      ZB G d= d>eAe      ZCd? ZDd@ ZE G dA dBejj                        ZF G dC dDejj                        ZG G dE dFejj                        ZH G dG dHejj                        ZI G dI dJejj                        ZJ G dK dLejj                        ZK G dM dNejj                        ZL G dO dPejj                        ZM G dQ dRejj                        ZN G dS dTejj                        ZO G dU dVejj                        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      Zcy)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                   xrn t        | j                        dk(  xrT | j                  d   j                  xr9 | j                  d   j                  xr | j                  d   | j                  d   uS )N   r   r   )is_Addlen_args	is_symbol)r5   s    V/var/www/html/engine/venv/lib/python3.12/site-packages/torch/utils/_sympy/functions.py_is_symbols_binary_summationr>   \   sr     	 	/

Oq 	/JJqM##	/ JJqM##	/ JJqMA.    fc                      t        j                         dt        t           dt        t
        j                  z  f fd       }|S )Nargsr6   c                       |  }t        d | D              r8t        |t        j                        st        j                  t	        |            }|S )Nc              3   P   K   | ]  }t        |t        j                           y wN)
isinstancesympyFloat.0as     r=   	<genexpr>z-_keep_float.<locals>.inner.<locals>.<genexpr>n   s     8az!U[[)8   $&)anyrF   rG   rH   float)rB   rr@   s     r=   innerz_keep_float.<locals>.innerj   sF      h8488u{{B
 E!H%Ar?   )	functoolswrapsr   r   r   rG   rH   )r@   rQ   s   ` r=   _keep_floatrT   g   sB     __QVC[ R%++%5   Lr?   xyc                     d | |fv ry | |k(  S rE    )rU   rV   s     r=   fuzzy_eqrY   x   s    1v~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                  j                  |                   }t         j                  j                  |      }|D ]  t        fd|D              s|z  } |S )a  
    Fast path for sympy.gcd, using a simple factoring strategy.

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

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

 yy-..+
s   ;A4r5   c                     t        t        j                  j                  |             }t	        j
                  t        j                  |      S rE   )maprG   Addr_   rR   reducerc   gcd)r5   integer_factorsrg   s     r=   integer_factorz+simple_floordiv_gcd.<locals>.integer_factor   s:    ),!4!4T!:*
 /::r?   c              3   &   K   | ]  }|v  
 y wrE   rX   )rJ   
base_splitrU   s     r=   rL   z&simple_floordiv_gcd.<locals>.<genexpr>   s     =:qJ=s   )rG   Basicr`   rc   rl   listri   r^   r_   rj   all)rZ   r[   rn   rl   base_splitsdivisor_splitrg   rU   s         @@r=   simple_floordiv_gcdrv   ~   s    "/u{{ /s /;U[[ ;S ; xxq)>!+<=Cs7AGqA15EII!4!4Q!782K .3YY-@-@-CM ==='C Jr?   c                   2   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y)r   a  
    We maintain this so that:
    1. We can use divisibility guards to simplify FloorDiv(a, b) to a / b.
    2. Printing out the expression is nicer (compared to say, representing a//b as (a - a % b) / b)

    NB: This is Python-style floor division, round to -Inf
    r8   .nargs#   
precedenceT
is_integerr6   c                      | j                   d   S Nr   rB   selfs    r=   basezFloorDiv.base        yy|r?   c                      | j                   d   S Nr   r   r   s    r=   divisorzFloorDiv.divisor   r   r?   printerc                     |j                  | j                  t        d   dz
        }|j                  | j                  t        d   dz
        }d| d| dS )NAtom      ?(z//))parenthesizer   r   r   r   r   r   r   s       r=   	_sympystrzFloorDiv._sympystr   sW    ##DIIz&/AC/GH&&t||Z5G#5MN4&7)1%%r?   r   r   Nc                 b	   |j                   rt        d      |t        t         t        j                  t        j                   fv r>|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                        rt        |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"                        rDt        |t        j"                        r*t        j"                  t'        |      t'        |      z        S t        |t(              r)t)        |j*                  d   |j*                  d   |z        S t        |t        j"                        rd}g }t        j,                  j/                  |      D ]  }||z  }d }t        |t        j                        rgt1        t        j2                        t1        d      k  rB|j5                  t        j6                        }	t9        d |	D              }
|j                  xr |
}n|j                  }|s|j;                  |       ||z  } t=        |      dk7  r%t)        |t        j,                  |ddiz
  |      |z   S 	 t?        ||      }t        |d      r0t        |t        j,                        rt        j@                  ||      }t        |d      s8t)        t        jB                  ||z        t        jB                  ||z              S 	 y # t        jD                  $ r Y y w xY w)	Ndivision by zeror   r   z1.15.0c              3   :   K   | ]  }|j                   d k(    yw)r   N)r[   )rJ   rP   s     r=   rL   z FloorDiv.eval.<locals>.<genexpr>  s     ,I!QSSAX,Is   evaluateF)#is_zeroZeroDivisionErrorr   rG   oonanr	   Zeror|   r   r^   rF   NumberrO   rc   infisnanra   floorr`   r   rB   rj   r_   r   __version__atomsRationalrs   appendr:   rv   rl   simplifyPolynomialError)clsr   r   rP   	quotientstermstermquotientquotient_is_integer	rationalsall_rationals_intsrl   s               r=   evalzFloorDiv.eval   s    ??#$677FVGUXXy99gGHHXXI	J
 ?
 99599599 499<<77<<??|GQ7K??|GR899T2&&tU\\*7ELL1&%((UXXI>>vw588)DD deGn,ADHH}txxiwAyy }}TZZ]33dEMM*z'5==/Q==Tc'l!:;;dH%DIIaL$))A,*@AA gu}}-IE		++D1 *'>
 '+#h		2|%%8 *8+ !)u~~ >I),,Iy,I)I&*2*=*=*TBT'*2*=*='&LL&)I%*( 5zQ TEIIu$Eu$EEwO 
		%dG4CC#
7EII(Fiig.Q'NN4#:.w}0M  (  $$ 		s   
BR R.-R.)__name__
__module____qualname____doc__ry   tupler`   __annotations__r{   r|   boolpropertyrG   rq   r   r   printing
StrPrinterstrr   classmethodra   r   rX   r?   r=   r   r      s     "E5c?!JJekk     &!:!: &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y)r    zK
    ModularIndexing(a, b, c) => (a // b) % c where % is the C modulus
       .ry   Tr|   rz   r{   r   r   modulusr6   Nc                 r   |dk(  s|dk(  rt         j                  j                  S t        |t         j                        r<t        |t         j                        r"t        |t         j                        r||z  |z  S 	 |dk7  rTt        j
                  ||      }|dk7  r9t        t        j                  ||z        t        j                  ||z        |      S t        |t         j                        rg }d}|j                  D ]  }t        j
                  |||z        ||z  k7  s#t        |t         j                        r|dk  sSt        |t         j                        r=t        |j                  d   t         j                        r|j                  d   dk  rd} n|j                  |        t        |      t        |j                        k7  r|rt        t        |      ||      S t        |t              r*t        |j                  d   |j                  d   |z  |      S y # t         j                  $ r Y `w xY w)Nr   r   TF)rG   r	   r   rF   ra   rl   r    r   r   rj   rB   r^   r   r:   sumr   )r   r   r   r   rl   	new_termsall_positiver   s           r=   r   zModularIndexing.evalB  s    19177<<tU]]+7EMM27EMM2GOw..
	!|iig.!8*tcz2w}5  dEII&-/I!%L		 /99T7W#4579JJ"47D1H"43&tyy|U]]C IIaL1, (-!((./  9~TYY/L&s9~wHHdH%"499Q<11GQQ9 $$ 		s   <AH H65H6c                 f    | j                   d d \  }}t        |j                  |j                        S )Nr8   )rB   rY   is_nonnegative)r   rZ   r[   s      r=   _eval_is_nonnegativez$ModularIndexing._eval_is_nonnegativev  s.    yy!}1((!*:*:;;r?   )r   r   r   r   ry   r   r`   r   r|   r   r{   r   rG   ra   rq   r   r   rX   r?   r=   r    r    9  s     "E5c?!JJ1==1+0==1CH==1	t	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y)r!   z#
    Good ol' ternary operator
    r   .ry   rz   r{   r6   Nc                 n    | j                   d   j                  r| j                   d   j                  rdS d S Nr   r8   TrB   r|   r   s    r=   _eval_is_integerzWhere._eval_is_integer  s.    yy|..499Q<3J3JtTPTTr?   c                 n    | j                   d   j                  r| j                   d   j                  rdS d S r   )rB   r   r   s    r=   r   zWhere._eval_is_nonnegative  s9     yy|**tyy|/J/J 	
 	
r?   c                 n    | j                   d   j                  r| j                   d   j                  rdS d S r   rB   is_positiver   s    r=   _eval_is_positivezWhere._eval_is_positive  s.    yy|//DIIaL4L4LtVRVVr?   crZ   r[   c                 X    |t         j                  k(  r|S |t         j                  k(  r|S y rE   )rG   truefalse)r   r   rZ   r[   s       r=   r   z
Where.eval  s&    

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

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

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

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

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

        Examples
        ========

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

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

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

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

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

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

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

        Unlike the sympy implementation, we only look for zero and one, we don't
        do generic is connected test pairwise which is slow
        Nzimpossible r   r   )g        r   )r  r   r#  maxr"  minr   r  r:   nextiterr   r   )r   valuesoptionsother_values	num_valuere   other_values          r=   r
  zMinMaxBase._find_localzeros  s    u	 	&C}}$ #Icz$'	3$7	$'	3$7	,{3%-@AA  %	& |!;|!tL12KH$)C)C'*cz|B	{BA~+"9"9'*cz|B	{B#r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   )is_algebraicrJ   r'  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>       (HA(H   r   rB   r7  s    r=   r,  zMinMaxBase.<lambda>      5(H(H#H r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   )is_antihermitianrW  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>        - 	
-rY  rZ  r[  s    r=   r,  zMinMaxBase.<lambda>      u -- ( r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   )is_commutativerW  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>        + 	
+rY  rZ  r[  s    r=   r,  zMinMaxBase.<lambda>      U ++ & r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   )
is_complexrW  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>       &Dq||&DrY  rZ  r[  s    r=   r,  zMinMaxBase.<lambda>      &DQVV&D!D r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   )is_compositerW  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rX  rY  rZ  r[  s    r=   r,  zMinMaxBase.<lambda>  r\  r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   )r   rW  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>       #>!AII#>rY  rZ  r[  s    r=   r,  zMinMaxBase.<lambda>      e#>qvv#>> r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   )	is_finiterW  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  s     %Baakk%BrY  rZ  r[  s    r=   r,  zMinMaxBase.<lambda>  s    %B166%B B r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   )is_hermitianrW  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rX  rY  rZ  r[  s    r=   r,  zMinMaxBase.<lambda>  r\  r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   )is_imaginaryrW  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rX  rY  rZ  r[  s    r=   r,  zMinMaxBase.<lambda>  r\  r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   )is_infiniterW  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>       'F!'FrY  rZ  r[  s    r=   r,  zMinMaxBase.<lambda>      %'Fqvv'F"F r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   )r|   rW  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rj  rY  rZ  r[  s    r=   r,  zMinMaxBase.<lambda>  rk  r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   )is_irrationalrW  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>       )Ja!//)JrY  rZ  r[  s    r=   r,  zMinMaxBase.<lambda>      E)J166)J$J r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   r   rW  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r  rY  rZ  r[  s    r=   r,  zMinMaxBase.<lambda>  r  r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   )is_nonintegerrW  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r  rY  rZ  r[  s    r=   r,  zMinMaxBase.<lambda>  r  r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   r   rW  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  re  rY  rZ  r[  s    r=   r,  zMinMaxBase.<lambda>  rf  r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   )is_nonpositiverW  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  re  rY  rZ  r[  s    r=   r,  zMinMaxBase.<lambda>  rf  r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   )
is_nonzerorW  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rj  rY  rZ  r[  s    r=   r,  zMinMaxBase.<lambda>  rk  r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   )r   rW  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  s     "<188"<rY  rZ  r[  s    r=   r,  zMinMaxBase.<lambda>  s    U"<QVV"<< r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   )is_polarrW  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>       $@AQZZ$@rY  rZ  r[  s    r=   r,  zMinMaxBase.<lambda>      u$@$@@ r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   r   rW  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r  rY  rZ  r[  s    r=   r,  zMinMaxBase.<lambda>  r  r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   )is_primerW  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r  rY  rZ  r[  s    r=   r,  zMinMaxBase.<lambda>  r  r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   )is_rationalrW  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r  rY  rZ  r[  s    r=   r,  zMinMaxBase.<lambda>  r  r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   )is_realrW  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rq  rY  rZ  r[  s    r=   r,  zMinMaxBase.<lambda>  rr  r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   )rH  rW  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r`  rY  rZ  r[  s    r=   r,  zMinMaxBase.<lambda>  ra  r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   )is_transcendentalrW  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  s      . 	
.rY  rZ  r[  s    r=   r,  zMinMaxBase.<lambda>  s     .. ) r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   )r   rW  s     r=   rL   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rq  rY  rZ  r[  s    r=   r,  zMinMaxBase.<lambda>  rr  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_zerorX   r?   r=   r   r   f  s   +Z 5	UZZ%%	&	-5 5n GK #EJJ$5$5$<$< = D	UZZ%%	&	- $ F FP  4 , ,\ I EH>MBOHHFDJFJ E<L@NF@NF>M ?Mr?   r   c                   R    e Zd ZdZej
                  Zej                  Zd Z	d Z
d Zy)r#  z=
    Return, if possible, the maximum value of the list.
    c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   r  rI   s     r=   rL   z(Max._eval_is_positive.<locals>.<genexpr>       9!9rY  r   rB   r   s    r=   r   zMax._eval_is_positive  s    9tyy999r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   r  rI   s     r=   rL   z+Max._eval_is_nonnegative.<locals>.<genexpr>  s     <Q((<rY  r  r   s    r=   r   zMax._eval_is_nonnegative  s    <$))<<<r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   r  rI   s     r=   rL   z(Max._eval_is_negative.<locals>.<genexpr>       :1:rY  r   rB   r   s    r=   r  zMax._eval_is_negative  s    :		:::r?   N)r   r   r   r   r	   Infinityr  NegativeInfinityr  r   r   r  rX   r?   r=   r#  r#    s,     ::D!!H:=;r?   r#  c                   R    e Zd ZdZej
                  Zej                  Zd Z	d Z
d Zy)r"  z=
    Return, if possible, the minimum value of the list.
    c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   r  rI   s     r=   rL   z(Min._eval_is_positive.<locals>.<genexpr>  r  rY  r  r   s    r=   r   zMin._eval_is_positive  s    :		:::r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   r  rI   s     r=   rL   z+Min._eval_is_nonnegative.<locals>.<genexpr>  s     =a))=rY  r  r   s    r=   r   zMin._eval_is_nonnegative  s    =499===r?   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrE   r  rI   s     r=   rL   z(Min._eval_is_negative.<locals>.<genexpr>  r  rY  r  r   s    r=   r  zMin._eval_is_negative  s    9tyy999r?   N)r   r   r   r   r	   r  r  r  r  r   r   r  rX   r?   r=   r"  r"    s,     DzzH;>:r?   r"  c                 L    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    s8    Daxu!GqLqb)D#&&&r?   c                     |dk  rt        d      |dk(  ryt        | |dz        }|t        u rt        S ||z  }|t        j                  kD  rt        S |dz  dk(  r|| z  }|t        j                  kD  rt        S |S )Nr   zExponent must be non-negative.r   r8   )r   r  r   sysmaxsize)r   exponenthalf_expresults       r=   r  r    s    !|9::1}h!m,H6
  F!|q$CKKMMr?   c                   0    e Zd ZU dZdZeed<   ed        Zy)r3   T2   r{   c                    t        |t        j                        rLt        |t        j                        r2t        ||      }|t         t        fv r|S t        j                  |      S t        |t        j                        rt        j
                  ||      S |t        t        j                  fv r/|j                  rt        S |j                  rt        j                  S y y rE   )
rF   rG   ra   r  r   Powr   r   r   zoo)r   r   r  rP   s       r=   r   zPowByNatural.eval.  s    dEMM*z#u}}/Ms#AfWf%%==##c5==) 99T3''6588$$""!!yy  " %r?   N)	r   r   r   r|   r{   r`   r   r   r   rX   r?   r=   r3   r3   )  s#    JJ! !r?   r3   c                   0    e Zd ZU dZdZeed<   ed        Zy)r2   T<   r{   c                     t        |t        j                        rEt        |t        j                        r*t        j                  t	        |      t	        |      z        S y y rE   )rF   rG   r   rH   rO   )r   r   r  s      r=   r   zFloatPow.evalI  sD     dELL)jell.K;;uT{eCj899 /L)r?   N	r   r   r   r  r{   r`   r   r   r   rX   r?   r=   r2   r2   D  s#    GJ: :r?   r2   c                   0    e Zd ZU dZdZeed<   ed        Zy)r)   Trz   r{   c                     |j                   rt        d      t        |t        j                        rEt        |t        j                        r*t        j
                  t        |      t        |      z        S y y Nr   )r   r   rF   rG   r   rH   rO   r   s      r=   r   zFloatTrueDiv.eval_  sW    
 ??#$677dELL)j%,,.O;;uT{U7^;<< /P)r?   Nr  rX   r?   r=   r)   r)   Z  s#    GJ= =r?   r)   c                   <    e Zd ZU dZdZeed<   ed        Zde	fdZ
y)r(   Trz   r{   c                 d   |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 r*t        j                  t        |      t        |      z        S t        |t        j                        rEt        |t        j                        r*t        j                  t        |      t        |      z        S y y r  )r   r   rF   rG   r   r   r   rH   rO   ra   r`   r   s      r=   r   zIntTrueDiv.evalx  s    ??#$677 tU\\*7ELL1&%((UXXI>>vw588)DD
 ;;uT{U7^;<<dEMM*z'5==/Q;;s4y3w<788 0R*r?   r6   c                     |j                  | j                  d   t        d   dz
        }|j                  | j                  d   t        d   dz
        }d| d| dS )Nr   r   r   r   z((int)z/(int)r   )r   rB   r   r   s       r=   r   zIntTrueDiv._ccode  s_    ##DIIaL*V2Ds2JK&&tyy|Z5G#5MNvVG9A..r?   N)r   r   r   r  r{   r`   r   r   r   r   r   rX   r?   r=   r(   r(   s  s/    GJ9 9$/ /r?   r(   c                        e Zd ZdZed        Zy)r,   Tc           	         t        |      dz  dk7  rt        dt        |             t        |      dz  }|d| }||d  }ddlm} t	        d |D              r7 ||D cg c]  }t        |       c}|D cg c]  }t        |       c}      S |dk(  r0|d   j                  r	|d   dk(  ry|d   j                  r	|d   dk  ryt	        d |D              r|dk(  rt        d      t        t        t        ||d	
      t        j                  d            dd	i\  }}t	        d |d d D              r?|d d dz   } ||D cg c]  }t        |       c}|D cg c]  }t        |       c}      S y c c}w c c}w c c}w c c}w )Nr8   r   z*expected an even number of arguments, got )!eval_is_non_overlapping_and_densec              3   P   K   | ]  }t        |t        j                           y wrE   rF   rG   ra   rI   s     r=   rL   z9IsNonOverlappingAndDenseIndicator.eval.<locals>.<genexpr>  s     :z!U]]+:rM   r   c              3   P   K   | ]  }t        |t        j                           y wrE   r  rI   s     r=   rL   z9IsNonOverlappingAndDenseIndicator.eval.<locals>.<genexpr>  s     =z!U]]+=rM   zdim must not be zeroT)strict)keyr  c              3   P   K   | ]  }t        |t        j                           y wrE   r  rI   s     r=   rL   z9IsNonOverlappingAndDenseIndicator.eval.<locals>.<genexpr>  s     FA:a/FrM   r   )*   )r:   r   %torch.fx.experimental.symbolic_shapesr  rs   r`   r   zipsortedoperator
itemgetter)	r   rB   dimsizesstridesr  rK   s_sizes	s_stridess	            r=   r   z&IsNonOverlappingAndDenseIndicator.eval  s   t9q=A <SYKH  $i1nQsst*	
 :T::4!&'AQ'')BQ#a&)B  !8qz##
aQx!!eAhl =W==ax$%;<< "%E748h>Q>QRS>TU""GY
 F"FF!#2,. 9%,-SV-	/J1A/J  K ()BD ./Js   E47E9
E>F
Nr   rX   r?   r=   r,   r,     s    J5 5r?   r,   c                        e Zd ZdZed        Zy)r-   Tc                     t        |t        j                        r1t        j                  t	        j
                  t        |                  S y rE   )rF   rG   r   rH   rc   truncrO   r   s     r=   r   zTruncToFloat.eval  s5     fell+ ;;tzz%-899	 ,r?   Nr   r   r   r  r   r   rX   r?   r=   r-   r-     s    G: :r?   r-   c                        e Zd ZdZed        Zy)r.   Tc                    |t         j                  t        fv rt        S |t         j                   t         fv rt         S t        |t         j                        r1t        j
                  t        j                  t        |                  S y rE   )	rG   r   r   rF   r   ra   rc   r  rO   r   s     r=   r   zTruncToInt.eval  se     ehh''Muxxi&))7Nfell+==E&M!:;; ,r?   Nr   rX   r?   r=   r.   r.     s    J< <r?   r.   c                        e Zd ZdZed        Zy)r/   Tc                     |t         j                  u rt        S |t         j                   u rt         S t        |t         j                        r(t        j
                  t        t        |      d            S y r~   )rG   r   r   rF   r   ra   roundrO   r   s     r=   r   zRoundToInt.eval  sW     UXXMehhY7Nfell+==uV}a!899 ,r?   Nr   rX   r?   r=   r/   r/     s    J: :r?   r/   c                        e Zd ZdZed        Zy)r0   Tc                     t        |t        j                        rLt        |t        j                        r1t        j                  t        t        |      t        |                  S y y rE   )rF   rG   r   ra   rH   r  rO   r`   )r   r   ndigitss      r=   r   zRoundDecimal.eval  sF     fell+
7EMM0R;;uU6]CLABB 1S+r?   Nr  rX   r?   r=   r0   r0     s    GC Cr?   r0   c                        e Zd ZdZed        Zy)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 y rE   )rG   r   rF   ra   rH   r`   r   r   s     r=   r   zToFloat.eval  sk    ehh	**Mfemm,;;s6{++V88OfWHH9 r?   Nr  rX   r?   r=   r1   r1     s    G	 	r?   r1   c                   V    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y)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    499Q<.**r?   c                 F    d|j                  | j                  d          dS )z+Controls how sympy's StrPrinter prints thisr   r   r   )doprintrB   )r   r   s     r=   r   zIdentity._sympystr6  s%     7??499Q<0133r?   c                 4    | j                   d   j                  S r~   )rB   r  r   s    r=   r  zIdentity._eval_is_real;  s    yy|###r?   c                 4    | j                   d   j                  S r~   r   r   s    r=   r   zIdentity._eval_is_integer?  s    yy|&&&r?   c                      | j                   d   S r~   r   )r   hintss     r=   _eval_expand_identityzIdentity._eval_expand_identityB  r   r?   c                 2    t        | j                  d         S r~   )r`   rB   r   s    r=   __int__zIdentity.__int__G  s    499Q<  r?   c                 2    t        | j                  d         S r~   )rO   rB   r   s    r=   	__float__zIdentity.__float__K  s    TYYq\""r?   N)r   r   r   r   r{   r   r  r   r  r   r!  r`   r#  rO   r%  rX   r?   r=   r4   r4   +  sM     J+# +4C 4
$'
! !#5 #r?   r4   c                 d      G  fddt         j                        }d z   }||_        ||_        |S )Nc                   0    e Zd ZdZW  ZeZe fd       Zy)+make_opaque_unary_fn.<locals>.OpaqueUnaryFna  
        Unlike the builtin sympy functions on real numbers like sympy.sqrt,
        these equivalents do not do any nontrivial reasoning besides
        constant propagation.  This helps avoid performing transformations
        that are valid for real numbers but are invalid for floating point;
        in particular, while we are willing to make optimizations that change
        numerics for Tensor compute, we are NOT willing to make optimizations
        that change numerics for size compute.
        c                 j   t        |t        j                  t        j                  f      r3	 t        j                   t	        t
              t        |                  S |t        j                  t        j                   t        j                  t        j                   t        t         fv rc|t        u rt        j                  }|t         u rt        j                   }dk(  rt        j                  |d      S  t	        t              |      S y # t        $ r  t	        t              |      cY S w xY w)Nlog2r8   )rF   rG   ra   rH   r  rc   rO   OverflowErrorr   r  r   log)r   rK   names     r=   r   z0make_opaque_unary_fn.<locals>.OpaqueUnaryFn.eval_  s    !emmU[[9:3 ;;':wtT':58'DEE
 uxx%((EII		z6F7SS;A<	A6> 99Q?*+wud+A.. % 3/75$/223s   1D D21D2N)	r   r   r   r   _torch_handler_namemake_opaque_unary_fn_torch_unpicklerr   r   )r-  s   r=   OpaqueUnaryFnr(  Q  s(    	 #/		 
	r?   r1  OpaqueUnaryFn_)rG   Functionr   r   )r-  r1  nms   `  r=   r/  r/  P  s6    $ $L 
D	 BM!#Mr?   sqrtcoscoshsinsinhtantanhasinacosatanr  r,  asinhr*  c                       dk(  r
t         d   n, dk(  r
t         d   n dk(  r
t         d   nt        d         G  fdd	t        j                        }d
 z   }||_        ||_        |S )Nbitwise_and
BitwiseAndbitwise_xor
BitwiseXor
bitwise_or	BitwiseOrzunrecognized c                   d    e Zd ZU W  ZW Zeed<    ej                  e	W       Z
efd       Zy))make_opaque_bitwise_fn.<locals>.BitwiseFnr{   )real_op_namec                    |j                   r#|j                   r t        t              ||      S |j                   rt        j                  |rdnd      }|j                   rt        j                  |rdnd      }t        |t        j                  t        f      r\t        |t        j                  t        f      r<t        j                   t        t              t        |      t        |                  S y )Nr   r   )r   r  r  rG   ra   rF   r`   )r   rK   brI  s      r=   r   z.make_opaque_bitwise_fn.<locals>.BitwiseFn.eval  s    ||6wx6q!<<||MMq!a0||MMq!a0!emmS12zEMM3'8 }}%DWX|%DSVSQRV%TUUr?   N)r   r   r   r.  r{   r`   r   rR   partialmake_opaque_bitwise_fnr0  r   r   )r-  precrI  s   r=   	BitwiseFnrH    s?    "
C,9,,"
 
	 
	r?   rO  
BitwiseFn_)r   r   rG   r3  r   r   )r-  rI  rO  r4  rN  s   ``  @r=   rM  rM    s    },'		,'		+&}TF344 ENN * 
	BIIr?   rA  and_rE  or_rC  xor)drR   rc   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   rT   rY   rq   rv   r3  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_log2rM  BitwiseFn_bitwise_andBitwiseFn_bitwise_orBitwiseFn_bitwise_xorrX   r?   r=   <module>ru     s      
 $ 8 8 2      + 7 7 + 9 & % 0 * ,  ( T'5B4uzz d r!"vc{mR%++--."t t t )5;; )5;; )5;; )|zu~~ zz@<enn @<FENN >BD BDL3%.. 3lx ! !&< <;enn ; U^^ (U^^ (w?y w?t;*k ;&:*k :&'4!5>> !6:u~~ :,=5>> =2/ /L9 9z
:5>> 
:< <: :<C5>> Cenn  "#u~~ "#J+^ *&1 (/ )&1 (/ )&1 (/ )&1 )&1 )&1 )&1 (/ (/ *73 )&1 #L /}fE -lEB .}eD r?   