
    VhT                        d dl Z d dlZd dlZd dlZd dlmZmZmZ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( 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+ej`                  f   f   fdZ1dee.   dee.   dee.   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- d.ejj                        Z< G d/ d0ejj                        Z= G d1 d2ejj                        Z> G d3 d4ejj                        Z? G d5 d6ejj                        Z@ G d7 d8ee      ZA G d9 d:eAe      ZB G d; d<eAe      ZCd= ZDd> ZE G d? d@ejj                        ZF G dA dBejj                        ZG G dC dDejj                        ZH G dE dFejj                        ZI G dG dHejj                        ZJ G dI dJejj                        ZK G dK dLejj                        ZL G dM dNejj                        ZM G dO dPejj                        ZN G dQ dRejj                        ZO G dS dTejj                        ZPdU ZQ eQdV      ZR eQdW      ZS eQdX      ZT eQdY      ZU eQdZ      ZV eQd[      ZW eQd\      ZX eQd]      ZY eQd^      ZZ eQd_      Z[ eQd`      Z\ eQda      Z] eQdb      Z^ eQdc      Z_dd Z` e`dedf      Za e`dgdh      Zby)i    N)CallableOptionalSupportsFloatTYPE_CHECKINGTypeVarUnion)TypeVarTupleUnpack)Ssympify)Expr)Application)_torf	fuzzy_andfuzzy_or)equal_valued)	LatticeOpShortCircuit)ordered)walk)
PRECEDENCE)sift   )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)r6   s    L/home/dcms/DCMS/lib/python3.12/site-packages/torch/utils/_sympy/functions.py_is_symbols_binary_summationr?   Y   sr     	 	/

Oq 	/JJqM##	/ JJqM##	/ JJqMA.    fc                      t        j                         dt        t           dt        t
        t        j                  f   f fd       }|S )Nargsr7   c                       |  }t        d | D              r8t        |t        j                        st        j                  t	        |            }|S )Nc              3   P   K   | ]  }t        |t        j                           y wN)
isinstancesympyFloat.0as     r>   	<genexpr>z-_keep_float.<locals>.inner.<locals>.<genexpr>j   s     8az!U[[)8   $&)anyrG   rH   rI   float)rC   rrA   s     r>   innerz_keep_float.<locals>.innerg   sD    $%tH8488u{{B
 E!H%Ar@   )	functoolswrapsr
   r   r   r   rH   rI   )rA   rR   s   ` r>   _keep_floatrU   d   sF     __QVC[ U2u{{?%;   Lr@   xyc                     d | |fv ry | |k(  S rF    )rV   rW   s     r>   fuzzy_eqrZ   s   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.
    rV   r7   c                     t         j                  j                  |       D cg c]6  }t        |t        t         j
                  f      rt        t	        |            8 }}t        j                  |      S c c}w rF   )	rH   Mul	make_argsrG   intIntegerabsmathprod)rV   arginteger_coefficientss      r>   integer_coefficientz0simple_floordiv_gcd.<locals>.integer_coefficient   sc     yy**1-+
#U]]34 CM+
 +

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

    NB: This is Python-style floor division, round to -Inf
    r9   .nargs#   
precedenceT
is_integerr7   c                      | j                   d   S Nr   rC   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                 V   |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"                        rd}g }t        j,                  j/                  |      D ]*  }||z  }|j                  s|j1                  |       ||z  }, t3        |      dk7  r%t)        |t        j,                  |ddiz
  |      |z   S 	 t5        ||      }t        |d      r0t        |t        j,                        rt        j6                  ||      }t        |d      s8t)        t        j8                  ||z        t        j8                  ||z              S 	 y # t        j:                  $ r Y y w xY w)Ndivision by zeror   r   evaluateF)is_zeroZeroDivisionErrorr   rH   oonanr   Zeror}   r   r_   rG   NumberrP   rd   infisnanrb   floorra   r    rC   rk   r`   appendr;   rw   rm   simplifyPolynomialError)	clsr   r   rQ   	quotientstermstermquotientrm   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 *'>&&LL&)I* 5zQ TEIIu$Eu$EEwO 
		%dG4CC#
7EII(Fiig.Q'NN4#:.w}0M  (  $$ 		s   BP P('P(c                     |j                  | j                  t        d   dz
        }|j                  | j                  t        d   dz
        }d| d| dS )Nr   r   zfloor(/r   r   r   s       r>   _ccodezFloorDiv._ccode&  sW    ##DIIz&/AC/GH&&t||Z5G#5MNvQwiq))r@   )__name__
__module____qualname____doc__rz   tuplera   __annotations__r|   r}   boolpropertyrH   rr   r   r   printing
StrPrinterstrr   classmethodrb   r   r   r   rY   r@   r>   r    r       s     "E5c?!JJekk     &!:!: &s & P==P+0==P	u{{D 	!P Pd*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ej                     fd       Zdee	   fdZdee	   fdZy)r!   zK
    ModularIndexing(a, b, c) => (a // b) % c where % is the C modulus
       .rz   Tr}   r{   r|   r   r   modulusr7   c                 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)rH   r   r   rG   rb   rm   r!   r   r   rk   rC   r_   r   r;   sumr    )r   r   r   r   rm   	new_termsall_positiver   s           r>   r   zModularIndexing.eval5  s    19177<< tU]]+7EMM27EMM2GOw..
	!|iig.!8*tcz2w}5  dEII&-/I!%L		 /99T7W#4579JJ"47D1H"43&tyy|U]]C IIaL1, (-!((./  9~TYY/L&s9~wHHdH%"499Q<11GQQ9 $$ 		s   <AH H65H6c                 f    | j                   d d \  }}t        |j                  |j                        S Nr9   )rC   rZ   is_nonnegativer   r[   r\   s      r>   _eval_is_nonnegativez$ModularIndexing._eval_is_nonnegativej  s.    yy!}1((!*:*:;;r@   c                 f    | j                   d d \  }}t        |j                  |j                        S r   )rC   rZ   is_positiver   s      r>   _eval_is_positivez!ModularIndexing._eval_is_positiven  s*    yy!}1q}}55r@   N)r   r   r   r   rz   r   ra   r   r}   r   r|   r   rH   rb   r   rr   r   r   r   rY   r@   r>   r!   r!   ,  s     "E5c?!JJ2==2+0==2CH==2	%++	2 2h<htn <68D> 6r@   r!   c            
           e Zd ZU dZdZeedf   ed<   dZeed<   de	e
   fdZde	e
   fd	Zde	e
   fd
Zedej                   dej                   dej                   de	ej                      fd       Zy)r"   z#
    Good ol' ternary operator
    r   .rz   r{   r|   r7   c                 n    | j                   d   j                  r| j                   d   j                  rdS d S Nr   r9   TrC   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   )rC   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   rC   r   r   s    r>   r   zWhere._eval_is_positive  s.    yy|//DIIaL4L4LtVRVVr@   cr[   r\   c                 X    |t         j                  k(  r|S |t         j                  k(  r|S y rF   )rH   truefalse)r   r   r[   r\   s       r>   r   z
Where.eval  s(     

?H%++Hr@   N)r   r   r   r   rz   r   ra   r   r|   r   r   r   r   r   r   rH   rr   r   rY   r@   r>   r"   r"   s  s     "E5c?!JU(4. U
htn 
W8D> W  %05	%++	 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ej                     fd       Zd
ee	   fdZd
ee	   fdZy)r#   ry   .rz   r{   r|   Tr}   r[   r\   r7   c                 B   |j                   rt        d      |t        j                  u s||| fv s|dk(  rt        j                  S |j                  r|j                  r||z  S |j                  r=|dk(  r8|j
                  rt        j                  S |j                  rt        j                  S ||z  }|j                  rt        j                  S ||k  }|j                  rt        |      r|j                  r|S t        j                  ||      dk(  rt        j                  S y )NModulo by zeror   r9   r   )r   r   r   r   	is_Numberis_evenis_oddOner}   
is_Booleanr   r   rH   r$   r   r[   r\   rQ   lesss        r>   r   zPythonMod.eval  s     99#$455 ;!A2w,!q&66M ;;1;;q5L ;;16yyvvxxuu E<<66M
 1u??tDzammH99Q?a66M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   )rC   is_negativer   s    r>   _eval_is_nonpositivezPythonMod._eval_is_nonpositive  r   r@   N)r   r   r   rz   r   ra   r   r|   r}   r   r   rH   r   r   r   r   r   rY   r@   r>   r#   r#     s    !E5c?!JJ*UZZ *EJJ *8EJJ3G * *Z:htn ::htn :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$   ry   r{   r|   Tc                 $   |j                   rt        d      |t        j                  u s||| fv s|dk(  rt        j                  S |j                  r)|j                  r|dk\  sJ |       |dk\  sJ |       ||z  S |j                  r=|dk(  r8|j
                  rt        j                  S |j                  rt        j                  S ||z  }|j                  rt        j                  S ||k  }|j                  rt        |      r|j                  r|S y y y )Nr   r   r   r9   )r   r   r   r   r   r   r   r   r}   r   r   r   r   s        r>   r   zMod.eval  s     99#$455 ;!A2w,!q&66M ;;1;;616616q5L ;;16yyvvxxuu E<<66M
 1u??tDzammH /<z?r@   N)r   r   r   rz   r|   ra   r   r}   r   r   r   rY   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   rY   r@   r>   r%   r%     s    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 rF   )	rH   r   r   rG   r   rb   rd   ceilrP   r   numbers     r>   r   zCeilToInt.eval  se     ehh''Muxxi&))7Nfell+==5=!9:: ,r@   Nr   r   r   r}   r   r   rY   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 rF   )	rH   r   r   rG   rb   r   rd   r   rP   r   s     r>   r   zFloorToInt.eval  st    ehh''Muxxi((7Nfemm,Mfell+==E&M!:;; ,r@   Nr   rY   r@   r>   r'   r'     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   )rH   r   rm   r%   r    r   r   r   s      r>   __new__zCeilDiv.__new__1  sT    }}T"--(99T7#w.D'**DGaK0'::r@   N)r   r   r   r   r}   r   rY   r@   r>   r(   r(   *  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 countr9   )
ValueErrorr   r   shifts      r>   r   zLShift.eval=  s#    19344ahr@   Nr   rY   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.evalG  s&    19344ah''r@   Nr   rY   r@   r>   r,   r,   D  s    J( (r@   r,   c                      e Zd Zd Zedeeej                  j                  j                        fd       Ze	 d$deeej                  j                  j                        deeej                  j                  j                        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rF   r   )rK   rf   s     r>   rM   z%MinMaxBase.__new__.<locals>.<genexpr>S  s     66s   r   )sympy.core.parametersr   popr   "_satisfy_unique_summations_symbols	frozenset_new_args_filterr   zero_collapse_arguments_find_localzerosidentityr;   rs   r   r   r   _argsetunique_summations_symbols)r   original_argsassumptionsr   r   rC   r	  objs           r>   r   zMinMaxBase.__new__O  s   ;??:/@/I/IJ66
  77F 	"   !!5!5d!;< )0.s..tC{C ,s++D@K@<<t9>:>>## ll3>>+>(A%
3    xx s   C8 8DDr7   c                 *   t        |      dk7  ryt        |d   t              r
|d   |d   fn	|d   |d   f\  }}t        |      syt        |      r| j	                  |      S t        |t              r"t        |dd      }|| j	                  |g|      S y)a  
        One common case in some models is building expressions of the form
        max(max(max(a+b...), c+d), e+f) which is simplified to max(a+b, c+d, e+f, ...).
        For such expressions, we call the Max constructor X times (once for each nested
        max) and the expression gets flattened.

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

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

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

        The function returns None if the new expression does not satisfy the unique_summations_symbols
        property. Otherwise, it returns a new set of unique symbols.
        r9   Nr   r   r	  )r;   rG   r   r?   _unique_symbolsgetattr)r   rC   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@   N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)setatomsrG   rH   coresymbolSymboladd)r   rC   r  seen_symbolsrf   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)rG   MinMaxrC   func)airL   condir   dos       r>   r%  z*MinMaxBase._collapse_arguments.<locals>.do  s    b3*-	<Drww277 ;aAq ;LeLL"c"rww277 Eaa1fAq EVPUVVH !< Es   B 
B%B%r   c                    fd}t        | |d      \  }}|s| S |D cg c]  }t        |j                         }}t        j                  | }|s| S t	        |      }|D cg c]  }||z
  	 }	}t        |	      r,|	D 
cg c]
  }
 |
ddi }}
|j                   |ddi        |ddi}||gz   S c c}w c c}w c c}
w )Nc                     t        |       S rF   )rG   )rf   others    r>   <lambda>zGMinMaxBase._collapse_arguments.<locals>.factor_minmax.<locals>.<lambda>3  s    :c5#9 r@   T)binaryr   F)r   r  rC   intersectionrs   rt   r   )rC   is_other
other_argsremaining_argsrf   arg_setscommonnew_other_argsarg_setarg_sets_diffsother_args_diffother_args_factoredr   r(  s                r>   factor_minmaxz5MinMaxBase._collapse_arguments.<locals>.factor_minmax2  s    9H)-dHT)J&J 2<<#CHH<H<%%x0F!&\N=EF'Wv-FMF =!FS"T5!#<e#<"T"T%%c?&KU&KL"'"H%"H!%8$999 = G
 #Us   B6#B; C )rs   r   r  r   	is_numberr   rC   is_comparablerG   r   r  ranger;   	enumerate)r   rC   r  siftedminsmaxsr$  vsmallbigrf   TrL   a0r"  r7  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)rG   r   is_extended_realr8  r9  r   r  r   r  r!  rC   )r   arg_sequencerf   s      r>   r  zMinMaxBase._new_args_filterO  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  minAssertionErrorr  r;   nextiterr   r   )r   valuesoptionsother_values	num_valuerf   other_values          r>   r  zMinMaxBase._find_localzerosj  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rF   )is_algebraicrK   r$  s     r>   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>       (HA(H   r   rC   r4  s    r>   r)  zMinMaxBase.<lambda>      5(H(H#H r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   )is_antihermitianrU  s     r>   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>        - -rW  rX  rY  s    r>   r)  zMinMaxBase.<lambda>      u -$%FF- ( r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   )is_commutativerU  s     r>   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>        ++rW  rX  rY  s    r>   r)  zMinMaxBase.<lambda>      U +"#&&+ & r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   )
is_complexrU  s     r>   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>       &Dq||&DrW  rX  rY  s    r>   r)  zMinMaxBase.<lambda>      &DQVV&D!D r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   )is_compositerU  s     r>   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rV  rW  rX  rY  s    r>   r)  zMinMaxBase.<lambda>  rZ  r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   )r   rU  s     r>   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>       #>!AII#>rW  rX  rY  s    r>   r)  zMinMaxBase.<lambda>      e#>qvv#>> r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   )	is_finiterU  s     r>   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  s     %Baakk%BrW  rX  rY  s    r>   r)  zMinMaxBase.<lambda>  s    %B166%B B r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   )is_hermitianrU  s     r>   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rV  rW  rX  rY  s    r>   r)  zMinMaxBase.<lambda>  rZ  r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   )is_imaginaryrU  s     r>   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rV  rW  rX  rY  s    r>   r)  zMinMaxBase.<lambda>  rZ  r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   )is_infiniterU  s     r>   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>       'F!'FrW  rX  rY  s    r>   r)  zMinMaxBase.<lambda>      %'Fqvv'F"F r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   )r}   rU  s     r>   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rh  rW  rX  rY  s    r>   r)  zMinMaxBase.<lambda>  ri  r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   )is_irrationalrU  s     r>   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>       )Ja!//)JrW  rX  rY  s    r>   r)  zMinMaxBase.<lambda>      E)J166)J$J r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   r   rU  s     r>   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r}  rW  rX  rY  s    r>   r)  zMinMaxBase.<lambda>  r~  r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   )is_nonintegerrU  s     r>   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r  rW  rX  rY  s    r>   r)  zMinMaxBase.<lambda>  r  r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   r   rU  s     r>   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rc  rW  rX  rY  s    r>   r)  zMinMaxBase.<lambda>  rd  r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   )is_nonpositiverU  s     r>   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rc  rW  rX  rY  s    r>   r)  zMinMaxBase.<lambda>  rd  r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   )
is_nonzerorU  s     r>   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  rh  rW  rX  rY  s    r>   r)  zMinMaxBase.<lambda>  ri  r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   )r   rU  s     r>   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  s     "<188"<rW  rX  rY  s    r>   r)  zMinMaxBase.<lambda>  s    U"<QVV"<< r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   )is_polarrU  s     r>   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>       $@AQZZ$@rW  rX  rY  s    r>   r)  zMinMaxBase.<lambda>      u$@$@@ r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   r   rU  s     r>   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r}  rW  rX  rY  s    r>   r)  zMinMaxBase.<lambda>  r~  r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   )is_primerU  s     r>   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r  rW  rX  rY  s    r>   r)  zMinMaxBase.<lambda>  r  r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   )is_rationalrU  s     r>   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r}  rW  rX  rY  s    r>   r)  zMinMaxBase.<lambda>  r~  r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   )is_realrU  s     r>   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  ro  rW  rX  rY  s    r>   r)  zMinMaxBase.<lambda>  rp  r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   )rE  rU  s     r>   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  r^  rW  rX  rY  s    r>   r)  zMinMaxBase.<lambda>  r_  r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   )is_transcendentalrU  s     r>   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  s      . !.rW  rX  rY  s    r>   r)  zMinMaxBase.<lambda>  s     .%&VV. ) r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   )r   rU  s     r>   rM   z&MinMaxBase.<lambda>.<locals>.<genexpr>  ro  rW  rX  rY  s    r>   r)  zMinMaxBase.<lambda>  rp  r@   rF   )*r   r   r   r   r   r   r  rH   r  r  r  r  r  r  r  r  _eval_is_algebraic_eval_is_antihermitian_eval_is_commutative_eval_is_complex_eval_is_composite_eval_is_even_eval_is_finite_eval_is_hermitian_eval_is_imaginary_eval_is_infiniter   _eval_is_irrational_eval_is_negative_eval_is_nonintegerr   r   _eval_is_nonzero_eval_is_odd_eval_is_polarr   _eval_is_prime_eval_is_rational_eval_is_real_eval_is_extended_real_eval_is_transcendental_eval_is_zerorY   r@   r>   r   r   N  s   +Z 5	#ejj''../	05 5n JN (UZZ->->-E-E)F G	#ejj''../	0 $ E EN  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rF   r  rJ   s     r>   rM   z(Max._eval_is_positive.<locals>.<genexpr>       9!9rW  r   rC   r   s    r>   r   zMax._eval_is_positive      9tyy999r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   r  rJ   s     r>   rM   z+Max._eval_is_nonnegative.<locals>.<genexpr>  s     <Q((<rW  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rF   r  rJ   s     r>   rM   z(Max._eval_is_negative.<locals>.<genexpr>       :1:rW  r   rC   r   s    r>   r  zMax._eval_is_negative      :		:::r@   N)r   r   r   r   r   Infinityr  NegativeInfinityr  r   r   r  rY   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rF   r  rJ   s     r>   rM   z(Min._eval_is_positive.<locals>.<genexpr>  r  rW  r  r   s    r>   r   zMin._eval_is_positive  r  r@   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrF   r  rJ   s     r>   rM   z+Min._eval_is_nonnegative.<locals>.<genexpr>  s     =a))=rW  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rF   r  rJ   s     r>   rM   z(Min._eval_is_negative.<locals>.<genexpr>  r  rW  r  r   s    r>   r  zMin._eval_is_negative  r  r@   N)r   r   r   r   r   r  r  r  r  r   r   r  rY   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   r9   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   r9   )r   r  r   sysmaxsize)r   exponenthalf_expresults       r>   r  r    s    !|9::1}h!m,H6
  F!|q$CKKMMr@   c                   0    e Zd ZU dZdZeed<   ed        Zy)r4   T2   r|   c                    t        |t        j                        rLt        |t        j                        r2t        ||      }|t         t        fv r|S t        j                  |      S t        |t        j                        rt        j
                  ||      S |t        t        j                  fv r/|j                  rt        S |j                  rt        j                  S y y rF   )
rG   rH   rb   r  r   Powr   r   r   zoo)r   r   r  rQ   s       r>   r   zPowByNatural.eval  s    dEMM*z#u}}/Ms#AfWf%%==##c5==) 99T3''6588$$""!!yy  " %r@   N)	r   r   r   r}   r|   ra   r   r   r   rY   r@   r>   r4   r4     s#    JJ! !r@   r4   c                   0    e Zd ZU dZdZeed<   ed        Zy)r3   T<   r|   c                     t        |t        j                        rEt        |t        j                        r*t        j                  t	        |      t	        |      z        S y y rF   )rG   rH   r   rI   rP   )r   r   r  s      r>   r   zFloatPow.eval(  sD     dELL)jell.K;;uT{eCj899 /L)r@   N	r   r   r   r  r|   ra   r   r   r   rY   r@   r>   r3   r3   #  s#    GJ: :r@   r3   c                   0    e Zd ZU dZdZeed<   ed        Zy)r*   Tr{   r|   c                     |j                   rt        d      t        |t        j                        rEt        |t        j                        r*t        j
                  t        |      t        |      z        S y y Nr   )r   r   rG   rH   r   rI   rP   r   s      r>   r   zFloatTrueDiv.eval>  sW    
 ??#$677dELL)j%,,.O;;uT{U7^;<< /P)r@   Nr  rY   r@   r>   r*   r*   9  s#    GJ= =r@   r*   c                   0    e Zd ZU dZdZeed<   ed        Zy)r)   Tr{   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   rG   rH   r   r   r   rI   rP   rb   ra   r   s      r>   r   zIntTrueDiv.evalW  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@   Nr  rY   r@   r>   r)   r)   R  s#    GJ9 9r@   r)   c                        e Zd ZdZed        Zy)r-   Tc           	         t        |      dz  dk(  sJ 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k7  sJ t        t        t        ||      t        j                  d             \  }}t        d |d d	 D              r?|d d	 d
z   } ||D cg c]  }t	        |       c}|D cg c]  }t	        |       c}      S y c c}w c c}w c c}w c c}w )Nr9   r   )!eval_is_non_overlapping_and_densec              3   P   K   | ]  }t        |t        j                           y wrF   rG   rH   rb   rJ   s     r>   rM   z9IsNonOverlappingAndDenseIndicator.eval.<locals>.<genexpr>  s     :z!U]]+:rN   r   c              3   P   K   | ]  }t        |t        j                           y wrF   r  rJ   s     r>   rM   z9IsNonOverlappingAndDenseIndicator.eval.<locals>.<genexpr>  s     =z!U]]+=rN   )keyc              3   P   K   | ]  }t        |t        j                           y wrF   r  rJ   s     r>   rM   z9IsNonOverlappingAndDenseIndicator.eval.<locals>.<genexpr>  s     FA:a/FrN   r   )*   )
r;   %torch.fx.experimental.symbolic_shapesr  rt   ra   r   zipsortedoperator
itemgetter)	r   rC   dimsizesstridesr  rL   s_sizes	s_stridess	            r>   r   z&IsNonOverlappingAndDenseIndicator.evalt  st   4y1}!!!$i1nQsst*	
 :T::4!&'AQ'')BQ#a&)B  !8qz##
aQx!!eAhl =W==!8O8 "%E7+1D1DQ1GH"GY F"FF!#2,. 9%,-SV-	/J1A/J  G ()B@ ./Js   
E"E
E7E 
Nr   rY   r@   r>   r-   r-   q  s    J0 0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 rF   )rG   rH   r   rI   rd   truncrP   r   s     r>   r   zTruncToFloat.eval  s5     fell+ ;;tzz%-899	 ,r@   Nr   r   r   r  r   r   rY   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 rF   )	rH   r   r   rG   r   rb   rd   r	  rP   r   s     r>   r   zTruncToInt.eval  se     ehh''Muxxi&))7Nfell+==E&M!:;; ,r@   Nr   rY   r@   r>   r/   r/     s    J< <r@   r/   c                        e Zd ZdZed        Zy)r0   Tc                     |t         j                  u rt        S |t         j                   u rt         S t        |t         j                        r(t        j
                  t        t        |      d            S y r   )rH   r   r   rG   r   rb   roundrP   r   s     r>   r   zRoundToInt.eval  sW     UXXMehhY7Nfell+==uV}a!899 ,r@   Nr   rY   r@   r>   r0   r0     s    J: :r@   r0   c                        e Zd ZdZed        Zy)r1   Tc                     t        |t        j                        rLt        |t        j                        r1t        j                  t        t        |      t        |                  S y y rF   )rG   rH   r   rb   rI   r  rP   ra   )r   r   ndigitss      r>   r   zRoundDecimal.eval  sF     fell+
7EMM0R;;uU6]CLABB 1S+r@   Nr
  rY   r@   r>   r1   r1     s    GC Cr@   r1   c                        e Zd ZdZed        Zy)r2   Tc                 "   |t         j                  t         j                   fv r|S t        |t         j                        rt        j                  t        |            S |t        u rt         j                  S |t         u rt         j                   S y rF   )rH   r   rG   rb   rI   ra   r   r   s     r>   r   zToFloat.eval  sk    ehh	**Mfemm,;;s6{++V88OfWHH9 r@   Nr
  rY   r@   r>   r2   r2     s    G	 	r@   r2   c                   ,    e Zd ZdZdZd Zd Zd Zd Zy)r5   z4
    Prevents expansion and other optimizations
    
   c                 (    d| j                   d    dS )Nz	Identity(r   r   r   r   s    r>   __repr__zIdentity.__repr__  s    499Q<.**r@   c                 4    | j                   d   j                  S r   )rC   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_identity  r   r@   N)	r   r   r   r   r|   r  r  r   r  rY   r@   r>   r5   r5     s"     J+$'r@   r5   c                 d      G  fddt         j                        }d z   }||_        ||_        |S )Nc                   ,    e Zd ZdZW  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 optimziations
        that change numerics for size compute.
        c                 j   t        |t        j                  t        j                  f      r3	 t        j                   t	        t
              t        |                  S |t        j                  t        j                   t        j                  t        j                   t        t         fv rc|t        u rt        j                  }|t         u rt        j                   }dk(  rt        j                  |d      S  t	        t              |      S y # t        $ r  t	        t              |      cY S w xY w)Nlog2r9   )rG   rH   rb   rI   r  rd   rP   OverflowErrorr   r  r   log)r   rL   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_namer   r   )r%  s   r>   OpaqueUnaryFnr     s"    	 #		 
	r@   r'  OpaqueUnaryFn_)rH   Functionr   r   )r%  r'  nms   `  r>   make_opaque_unary_fnr+    s6    # #J 
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t        d         G  fddt        j                        }d z   |_        |S )	Nbitwise_and
BitwiseAnd
bitwise_or	BitwiseOrzunrecognized c                   :    e Zd ZU W  ZW Zeed<   efd       Zy))make_opaque_bitwise_fn.<locals>.BitwiseFnr|   c                    |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   rH   rb   rG   ra   )r   rL   breal_op_names      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|   ra   r   r   r   )r%  precr@  s   r>   	BitwiseFnr=  Y  s%    "
C		 
	r@   rB  
BitwiseFn_)r   rJ  rH   r)  r   )r%  r@  rB  rA  s   `` @r>   make_opaque_bitwise_fnrD  Q  sc    },'		+&}TF344 ENN $ &,Ir@   r8  and_r:  or_)crS   rd   r   r  typingr   r   r   r   r   r   typing_extensionsr	   r
   rH   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   numbersr   collections.abcr   r   r   __all__r   r?   rI   rU   rZ   rr   rw   r)  r    r!   r"   r#   r$   r%   r&   r'   r(   r+   r,   r   r   r  r  r  r4   r3   r*   r)   r-   r.   r/   r0   r1   r2   r5   r+  OpaqueUnaryFn_sqrtOpaqueUnaryFn_cosOpaqueUnaryFn_coshOpaqueUnaryFn_sinOpaqueUnaryFn_sinhOpaqueUnaryFn_tanOpaqueUnaryFn_tanhOpaqueUnaryFn_asinOpaqueUnaryFn_acosOpaqueUnaryFn_atanOpaqueUnaryFn_expOpaqueUnaryFn_logOpaqueUnaryFn_asinhOpaqueUnaryFn_log2rD  BitwiseFn_bitwise_andBitwiseFn_bitwise_orrY   r@   r>   <module>rf     st      
 S S 2      + 7 7 + 9 & % 0 *  ( T'5B4uzz d r!"vc{mU2u{{?334 8D> htn )5;; )5;; )5;; )|r*u~~ r*jD6enn D6NENN B8: 8:x1%.. 1hx ; ;< <;enn ; U^^ (U^^ (p?y p?f;*k ;$:*k :$'4!5>> !6:u~~ :,=5>> =29 9>4 4p
:5>> 
:< <: :<C5>> Cenn  u~~ **\ *&1 (/ )&1 (/ )&1 (/ )&1 )&1 )&1 )&1 (/ (/ *73 )&1 < /}fE -lEB r@   