
    ΅i{                       S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SKJ	r	  S SK
JrJrJrJrJrJr  S SKJr  S SKrS SKJrJr  S SKrS SKJr  S SKJr  S	S
KJrJrJ r J!r!J"r"J#r#J$r$J%r%J&r&J'r'J(r(J)r)J*r*J+r+J,r,  S	SK-J.r.  S	SK/J0r0J1r1J2r2  \Rf                  " \45      r5SS/r6\" S\Rn                  \5      r8 " S S\95      r:S r;S r<SS jr=SS jr>SS jr?\@\A-  \Rn                  -  rB\C\-  rD\B\D-  rE\	\Rn                  /\Rn                  4   rF\	\Rn                  \Rn                  /\Rn                  4   rG\	\/\4   rH\	\\/\4   rI\F\H-  rJ\G\I-  rK\R                  " SS9 " S S\\8   5      5       rM " S S5      rN S      S!S jjrOg)"    )annotationsN)Callable)GenericoverloadSupportsFloatTYPE_CHECKING	TypeGuardTypeVar)TypeIs)BooleanBooleanAtom)
LazyString)dtype_to_type   )_keep_floatFloatTrueDivFloorDiv
IntTrueDivOpaqueUnaryFn_expOpaqueUnaryFn_logOpaqueUnaryFn_log2OpaqueUnaryFn_sqrtPowByNaturalRoundDecimal
RoundToIntsafe_powToFloatTruncToFloat
TruncToInt)sympy_interp)int_ooIntInfinityNegativeIntInfinityValueRangesbound_sympy_Tc                      \ rS rSrSrg)ValueRangeError1    N)__name__
__module____qualname____firstlineno____static_attributes__r*       Y/home/james-whalen/.local/lib/python3.13/site-packages/torch/utils/_sympy/value_ranges.pyr(   r(   1   s    r0   r(   c                   [        U [        5      (       a'  U (       a  [        R                  $ [        R                  $ [        U [
        5      (       a  [        R                  " U 5      $ [        U [        5      (       aX  [        R                  " U 5      (       a'  U S:  a  [        R                  $ [        R                  * $ [        R                  " U 5      $ [        U [        R                  5      (       a>  [        U SS5      (       d  [        U 5      eU [        R                  :X  a  [        S5      eU $ [        U [         5      (       a  U $ [        S[#        U 5       SU  35      e)Nr   	is_numberFzsympy expression is NaNznot simple sympy type : )
isinstanceboolsympytruefalseintIntegerfloatmathisinfooFloatExprgetattrAssertionErrornanr   type)es    r1   simple_sympifyrG   7   s    !Tuzz/EKK/	As		}}Q	Au		::a== 1u5883588)3{{1~	Auzz	"	"q+u-- ##
 		> !:;;	A{	#	#5d1gYbDEEr0   c                2   [        U [        R                  5      (       a.  [        U[        R                  5      (       d  [        S5      eX:  $ [        U [        5      (       a  [        U[        5      (       d  [        X45      eU =(       a    U(       + (       + $ )Nz5upper must be a sympy.Expr when lower is a sympy.Expr)r5   r7   rA   rC   SympyBooleanloweruppers     r1   sympy_generic_lerM   R   sv    %$$%,, G 
 ~ %..j6U6U %00'%i((r0   c                    U R                   $ Nis_boolvrs    r1   
vr_is_boolrT   b   s    ::r0   c                $    U R                   (       + $ rO   rP   rR   s    r1   
vr_is_exprrV   f   s    zz>r0   c                6    [        U [        R                  5      $ rO   )r5   r7   r;   )values    r1   is_sympy_integerrY   j   s    eU]]++r0   T)frozenc                     \ rS rSr% \(       a  \\R                     r\\	   r
\\
-  rS\S'   S\S'   S\S'   S\S'   S\S'   S*S	 jr\        S+S
 j5       r\        S,S j5       rS-S jrS.S jrS/S jrS rS0S jr\      S1S j5       r\      S2S j5       rS3S jr\      S1S j5       r\      S2S j5       rS3S jrS4S jr\\R2                  S5S j5       5       r\\R2                  S5S j5       5       r\\R2                  S.S j5       5       r\\S6S j5       5       r\\S7S j5       5       r\S8S j5       r\S9S j5       r\\S9S j5       5       r\\S:S  j5       5       r\S;S! j5       r\S9S" j5       r \S9S# j5       r!\\        S<S$ j5       5       r"\\        S=S% j5       5       r"\        S>S& j5       r"\#S' 5       r$S(r%g))?r$   y   r&   rK   rL   r6   rQ   is_intis_floatc                <    SU R                    SU R                   S3$ )NzVR[z, ]rJ   selfs    r1   __repr__ValueRanges.__repr__   s    TZZL4::,a00r0   c                    g rO   r*   rb   rK   rL   s      r1   __init__ValueRanges.__init__       
 r0   c                    g rO   r*   rf   s      r1   rg   rh      ri   r0   c                f   [        U5      n[        U5      n [        X5      (       d  [        SU SU S35      e [	        U[
        5      n[	        U[
        5      nXE:w  a  [        X45      e[	        U[        R                  5      (       a  U[        R                  :X  a  [        n[	        U[        R                  5      (       a  U[        R                  * :X  a  [        * n[        R                  [        [        4n[	        X5      n[	        X&5      n[        R                  U SU5        [        R                  U SU5        [        R                  U SU5        [        R                  U S	U R                  (       + =(       a    U=(       a    U5         [        R                  U S
U R                  (       + =(       a    U R                   (       + 5        U R                  (       d0  U R                   (       d  U R"                  (       d  [        X45      eg g g ! [         a  n[        SU SU 35      UeS nAff = f)NzInvalid ranges [:r`   zCould not compare z <= rK   rL   rQ   r]   r^   )rG   rM   r(   	TypeErrorr5   rI   rC   r7   r;   r?   r!   r#   r"   object__setattr__rQ   r]   r^   )	rb   rK   rL   rF   is_bool_loweris_bool_upperinteger_typesis_int_loweris_int_uppers	            r1   rg   rh      s   u%u%	L#E11%(8qq&IJJ 2
 #5,7"5,7) %00 eU]]++0AEeU]]++%((0BGE(;[I!%7!%7 	4%04%0 	4M:>>,	

	 	4-=-Qdkk/R||DKK %00 9FK|c  	L0tE7CD!K	Ls   "H 
H0H++H0c                    [        U 5      (       a  U $ U [        R                  5       :X  a  [        R                  5       $ [	        SU  35      e)Nznot bool like )rT   r$   unknownunknown_boolrC   ra   s    r1   boolifyValueRanges.boolify   sD    dK[((**++-- >$!899r0   c                J    [         R                  U5      R                  U 5      $ rO   )r$   wrapissubset)rb   xs     r1   __contains__ValueRanges.__contains__   s    "++D11r0   c                    XR                  5       L a  g[        UR                  U R                  5      =(       a     [        U R                  UR                  5      $ )NT)unknown_intrM   rK   rL   rb   others     r1   r|   ValueRanges.issubset   sE    $$&&TZZ8 
=MJJ>
 	
r0   c                
    X-  $ )z1Given two ValueRanges, returns their intersectionr*   r   s     r1   tightenValueRanges.tighten   s
    |r0   c                    g rO   r*   r   s     r1   __and__ValueRanges.__and__        #&r0   c                    g rO   r*   r   s     r1   r   r           %(r0   c                8   U[         R                  5       [         R                  5       4;   a  U $ U [         R                  5       [         R                  5       4;   a  U$ U R                  UR                  :w  a  [	        X45      eU R
                  UR
                  :w  a  [	        X45      eU R                  UR                  :w  a  [	        X45      eU R                  (       a^  [        [        R                  " U R                  UR                  5      [        R                  " U R                  UR                  5      5      $ [        [        R                  " U R                  UR                  5      [        R                  " U R                  UR                  5      5      $ rO   )r$   rv   r   rQ   rC   r]   r^   r7   OrrK   AndrL   MaxMinr   s     r1   r   r      s   [((*K,C,C,EFFKK'');+B+B+DEEL<<5==( $//;;%,,& $//==ENN* $//<<U[[1599TZZ3U  		$**ekk2EIIdjj%++4V r0   c                    g rO   r*   r   s     r1   __or__ValueRanges.__or__  r   r0   c                    g rO   r*   r   s     r1   r   r     r   r0   c                   [         R                  5       X4;   a  [         R                  5       $ U R                  UR                  :w  a  [        X45      eU R                  UR                  :w  a  [        X45      eU R
                  UR
                  :w  a  [        X45      eU R                  (       a^  [        [        R                  " U R                  UR                  5      [        R                  " U R                  UR                  5      5      $ [        [        R                  " U R                  UR                  5      [        R                  " U R                  UR                  5      5      $ rO   )r$   rv   rQ   rC   r]   r^   r7   r   rK   r   rL   r   r   r   s     r1   r   r     s     TM1&&((<<5==( $//;;%,,& $//==ENN* $//<<		$**ekk2EHHTZZ4U  		$**ekk2EIIdjj%++4V r0   c                4    U R                   U R                  :H  $ rO   rJ   ra   s    r1   is_singletonValueRanges.is_singleton/  s    zzTZZ''r0   c                 T    [        [        R                  * [        R                  5      $ rO   r$   r7   r?   r*   r0   r1   rv   ValueRanges.unknown2       EHH9ehh//r0   c                 ,    [        [        * [        5      $ rO   )r$   r!   r*   r0   r1   r   ValueRanges.unknown_int7  s     F7F++r0   c                 R    [        [        R                  [        R                  5      $ rO   )r$   r7   r9   r8   r*   r0   r1   rw   ValueRanges.unknown_bool<  s     5;;

33r0   c                    g rO   r*   args    r1   r{   ValueRanges.wrapA  s     	r0   c                    g rO   r*   r   s    r1   r{   r   G       	r0   c                    [        U [        5      (       a  U $ [        U [        5      (       a/  [        R                  " U 5      (       a  [        R                  5       $ [        X 5      $ rO   )r5   r$   r<   r=   isnanrv   r   s    r1   r{   r   L  sG    c;''Jc5!!djjoo&&((3$$r0   c                    [         R                  U 5      n [        U" U R                  5      U" U R                  5      5      $ )z#Increasing: x <= y => f(x) <= f(y).r$   r{   rK   rL   r}   fns     r1   increasing_mapValueRanges.increasing_mapU  s1     Q2agg;17744r0   c                    g rO   r*   r   s     r1   decreasing_mapValueRanges.decreasing_map[  s    BEr0   c                    g rO   r*   r   s     r1   r   r   _  r   r0   c                    [         R                  U 5      n [        U" U R                  5      U" U R                  5      5      $ )z#Decreasing: x <= y => f(x) >= f(y).)r$   r{   rL   rK   r   s     r1   r   r   d  s1     Q2agg;17744r0   c                    [         R                  U 5      n U" U R                  5      nU" U R                  5      n[        [	        X#5      [        X#5      5      $ )zIt's increasing or decreasing.)r$   r{   rK   rL   minmax)r}   r   lus       r1   monotone_mapValueRanges.monotone_mapk  sC     QqwwKqwwK3q9c!i00r0   c                f   [         R                  U 5      n SU ;   a  [        U" U R                  5      U" U R                  5      5      n[        U5      n[        U[        R                  5      (       d  U[        R                  :X  a  [        SU5      $ [        SU5      $ [         R                  X5      $ )z$Fn is convex and has a minimum at 0.r           )r$   r{   r   rK   rL   rG   r5   r7   r@   r?   r   )r}   r   rL   s      r1   convex_min_zero_mapValueRanges.convex_min_zero_maps  s     Q6177R[1E"5)E%--%((1B"3..q%((''..r0   c                    g rO   r*   r}   yr   s      r1   coordinatewise_increasing_map)ValueRanges.coordinatewise_increasing_map       r0   c                    g rO   r*   r   s      r1   r   r     r   r0   c                    [         R                  U 5      [         R                  U5      p[        U" U R                  UR                  5      U" U R                  UR                  5      5      $ )z
It's increasing on each coordinate.

Mathematically:
For every 1 <= i <= n and x_i <= y_i we have that
f(x1, .., xn) <= f(x1, , yi, ..., xn)
r   r   s      r1   r   r     sR     "K$4$4Q$71qww qww 
 	
r0   c                F   U R                  U5      U R                  U5      p![        R                  " UR                  UR                  /UR                  UR                  /5       VVs/ s H  u  pEU" XE5      PM     nnn[        [        U5      [        U5      5      $ s  snnf )z1It's increasing or decreasing on each coordinate.)r{   	itertoolsproductrK   rL   r$   r   r   )clsr}   r   r   abproductss          r1   coordinatewise_monotone_map'ValueRanges.coordinatewise_monotone_map  s     xx{CHHQK1 "))177AGG*<qww>PQ
Q qHQ 	 
 3x=#h-88	
s   (Br*   N)returnstr)rb   ValueRanges[sympy.Expr]rK   ExprInrL   r   r   None)rb   ValueRanges[SympyBoolean]rK   BoolInrL   r   r   r   )rK   AllInrL   r   r   r   )r   r   )r}   r   r   r6   )r   r$   )rb   r   r   r   r   r   )rb   r   r   r   r   r   )rb   AllVRr   r   r   r   )r   r6   )r   r   )r   ExprIn | ExprVRr   ExprVR)r   BoolIn | BoolVRr   BoolVR)r   AllIn | AllVRr   r   )r}   r   r   ExprFnr   r   )r}   r   r   BoolFnr   r   )r}   r   r   AllFnr   r   )r}   r   r   r   r   ExprFn2r   r   )r}   r   r   r   r   BoolFn2r   r   )r}   r   r   r   r   AllFn2r   r   )&r+   r,   r-   r.   r   r$   r7   rA   r   rI   r   r   __annotations__rc   r   rg   rx   r~   r|   r   r   r   r   staticmethod	functoolscacherv   r   rw   r{   r   r   r   r   r   classmethodr   r/   r*   r0   r1   r$   r$   y   s    UZZ(\*
 IIMLN1 %  
	  '  
	 :1x:2

 &%&&& 
!& &
 ('((( 
#( (
* &%&&& 
!& &
 ('((( 
#( (
$( __0  0 __,  , __4  4       % % 5 5
 E  E   5 5 1 1 	/ 	/   
	     
	   


 
 
	
 
$ 9 9r0   c                     \ rS rSrSr\S 5       r\S=S j5       r\S 5       r\S 5       r	\S 5       r
\S	 5       r\S
 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r \S 5       r!\S 5       r"\S  5       r#\S! 5       r$\S" 5       r%\S# 5       r&\S$ 5       r'\S% 5       r(\S& 5       r)\S' 5       r*\S( 5       r+\S) 5       r,\S* 5       r-\S+ 5       r.\S, 5       r/\S- 5       r0\S. 5       r1\S/ 5       r2\S0 5       r3\S1 5       r4\S2 5       r5\S3 5       r6\S4 5       r7\S5 5       r8\S6 5       r9\S7 5       r:\S8 5       r;\S9 5       r<\S: 5       r=\S; 5       r>S<r?g)>SymPyValueRangeAnalysisi  z
It gives bounds on a SymPy operator given bounds on its arguments
See the function `bound_sympy` for a function that applies this logic to a full SymPy expression
c                   [        U [        5      (       a,  U R                  5       (       d  [        S5      eU R                  n [        U [
        [        [        45      nU(       dK  [        U [        [        R                  [        R                  45      (       d  [        S[        U 5       35      e[        U [        5      (       a|  [        R                  " U 5      (       aa  U[         R                  :X  a  [        R#                  5       $ UR$                  (       a  [        R'                  5       $ [        R)                  5       $ U(       a  [+        U5      nU" U 5      n OU[         R                  :X  a!  [        U [        5      (       d  [        S5      eO\UR$                  (       a.  U R,                  (       a  U R.                  (       d  [        S5      eO[1        U SS5      (       d  [        S5      e[        R3                  U 5      nU$ )Nz.ValueRanges must be a singleton for constant()znot a supported constant type: z#expected BooleanAtom for bool dtypez/expected float-like sympy value for float dtype
is_integerFz*expected integer sympy value for int dtype)r5   r$   r   rC   rK   r:   r<   r6   r   r7   r;   NumberrE   r   r=   r   torchrw   is_floating_pointrv   r   r   	is_finiteis_realrB   r{   )rX   dtype	is_pythontype_rs        r1   constant SymPyValueRangeAnalysis.constant  s|   e[))%%''$%UVVKKEusE4&89	K="
 "
 !#B4;-!PQQ e]++

50A0A

""//11(("**,,"..00!%(E%LE 

"!%55()NOO 6((??5==(I 
 ulE::()UVVU#r0   Nc                    U[         R                  :X  a  [        R                  U [        5      $ U[         R
                  :X  a  [        R                  5       $ UR                  (       d  [        R                  5       $ [        R                  5       $ rO   )
r   float64r$   r   r   r6   rw   r   r   rv   )r   r   	src_dtypes      r1   to_dtype SymPyValueRangeAnalysis.to_dtype  sc    EMM!--a99ejj ++--((**,,""$$r0   c                6    [         R                  U [        5      $ rO   )r$   r   r   )r   r   s     r1   trunc_to_int$SymPyValueRangeAnalysis.trunc_to_int  s     ))!Z88r0   c                    [         R                  U 5      n U R                  5       n U R                  (       d  [	        S5      e[         R                  U [        R                  5      $ )Nz"not_ expects a boolean ValueRanges)r$   r{   rx   rQ   rC   r   r7   Not)r   s    r1   not_SymPyValueRangeAnalysis.not_  sG    QIIKyy !EFF))!UYY77r0   c                J    [         R                  X[        R                  5      $ rO   )r$   r   r7   r   r   r   s     r1   or_SymPyValueRangeAnalysis.or_  s    88uxxHHr0   c                J    [         R                  X[        R                  5      $ rO   )r$   r   r7   r   r  s     r1   and_SymPyValueRangeAnalysis.and_  s    88uyyIIr0   c                   U R                  5       (       aD  [        R                  [        R                  " U R
                  (       a
  S5      5      $ S5      5      $ [        [        R                  " S5      [        R                  " S5      5      $ Nr   r   )r   r$   r{   r7   r;   rK   r}   s    r1   _bool_to_int$SymPyValueRangeAnalysis._bool_to_int  sY    >>##EMMqww!$FGGA$FGGu}}Q/q1ABBr0   c                   [         R                  U5      [         R                  U5      p!UR                  (       a"  UR                  (       a  U R                  X5      $ UR                  (       a  U R	                  U5      nUR                  (       a  U R	                  U5      n[        UR                  UR                  5      nUS:  aC  U[        R                  * :w  a.  U[        * :w  a#   S[        U* S-
  5      R                  5       -  * nOSn[        U[        UR                  UR                  5      5      $ ! [         a
    [        * n N=f = f)Nr   r   )r$   r{   rQ   r  r  r   rK   r7   r?   r!   r:   
bit_length	Exceptionr   rL   )r   r   r   rK   s       r1   bitwise_and#SymPyValueRangeAnalysis.bitwise_and  s    "K$4$4Q$719988A>!99  #A99  #AAGGQWW%19588)+&0@ sE6A:99;;< E5#aggqww"788	    s   (!D6 6E
	E
c                   [         R                  U5      [         R                  U5      p!UR                  (       a"  UR                  (       a  U R                  X5      $ UR                  (       a  U R	                  U5      nUR                  (       a  U R	                  U5      n[        UR                  UR                  5      nUS:X  a  SnOMUS:  a?  U[        R                  :w  a+  U[        :w  a!   S[        U5      R                  5       -  S-
  nOUS:  a  Sn[        [        UR                  UR                  5      U5      $ ! [         a	    [        n N<f = f)Nr   r   )r$   r{   rQ   r  r  r   rL   r7   r?   r!   r:   r  r  r   rK   )r   r   r   rL   s       r1   
bitwise_or"SymPyValueRangeAnalysis.bitwise_or  s   "K$4$4Q$7199771= 99  #A99  #AAGGQWW%A:EQY5EHH,&c%j3355: QYE3qww0%88	  s   /E EEc                b   [         R                  U5      [         R                  U5      p!UR                  (       Ga  UR                  (       a  UR                  UR                  -  UR                  UR                  -  UR                  UR                  -  UR                  UR                  -  1n[        S U 5       5      n[        S U 5       5      nU(       a'  U(       a   [        R                  [        R                  pvO@U(       a  [        R                  =pgO'U(       a  [        R                  =pgO[        SU 35      e[        Xg5      $ UR                  (       a  U R                  U5      nUR                  (       a  U R                  U5      nUR                  UR                  :X  ar  UR                  UR                  :X  aX  [        UR                  5      (       a>  [        UR                  5      (       a$  UR                  UR                  -  n[        X5      $ [        [        * [        5      $ )Nc              3  F   #    U  H  o[         R                  :H  v   M     g 7frO   )r7   r9   .0bounds     r1   	<genexpr>6SymPyValueRangeAnalysis.bitwise_xor.<locals>.<genexpr>A  s     EfUU[[0f   !c              3  F   #    U  H  o[         R                  :H  v   M     g 7frO   r7   r8   r  s     r1   r   r!  B  s     CF5EJJ.Fr"  zNon-boolean xor result: )r$   r{   rQ   rK   rL   anyr7   r9   r8   rC   r  rY   r!   )	r   r   r   bounds	has_falsehas_truerK   rL   value_ranges	            r1   bitwise_xor#SymPyValueRangeAnalysis.bitwise_xor6  s   "K$4$4Q$71999!''!!''!!''!!''!	F EfEEICFCCHX${{EJJu %

* %+$'?x%HIIu,,99  #A99  #AGGqww177" )) ))''AGG+K{88F7F++r0   c                "   [         R                  U 5      n [         R                  U5      nU R                  5       (       aR  UR                  5       (       a=  U R                  UR                  :X  a#  [         R                  [        R
                  5      $ U R                  UR                  :  d  UR                  U R                  :  a#  [         R                  [        R                  5      $ [        [        R                  [        R
                  5      $ rO   )r$   r{   r   rK   r7   r8   rL   r9   r  s     r1   eqSymPyValueRangeAnalysis.eq\  s    QQ>> 0 0QWW5G##EJJ//WWqww!''AGG"3##EKK005;;

33r0   c                B    U R                  U R                  X5      5      $ rO   )r  r-  r   r   r   s      r1   neSymPyValueRangeAnalysis.nef      xxq%%r0   c                ,    [         R                  U5      $ rO   )r$   r{   )r   r   s     r1   identity SymPyValueRangeAnalysis.identityj  s    ""r0   c                H   [         R                  U5      n[         R                  U5      nUR                  UR                  :w  a  [        S5      eUR                  (       a!  U R	                  U R                  U5      U5      $ UR                  UR                  :  a#  [         R                  [        R                  5      $ UR                  UR                  :  a#  [         R                  [        R                  5      $ [        [        R                  [        R                  5      $ )N=operands must both be boolean ValueRanges or both non-boolean)r$   r{   rQ   rC   r  r  rL   rK   r7   r8   r9   r0  s      r1   ltSymPyValueRangeAnalysis.ltn  s    QQ99		! O  9988CHHQK++ww "''

33AGG#"''44u{{EJJ77r0   c                $    U R                  X!5      $ rO   )r9  r0  s      r1   gtSymPyValueRangeAnalysis.gt  s    vva|r0   c                B    U R                  U R                  X5      5      $ rO   )r  r<  r0  s      r1   leSymPyValueRangeAnalysis.le  r3  r0   c                B    U R                  U R                  X5      5      $ rO   )r  r9  r0  s      r1   geSymPyValueRangeAnalysis.ge  r3  r0   c                \    [         R                  X[        [        R                  5      5      $ rO   )r$   r   r   operatoraddr  s     r1   rF  SymPyValueRangeAnalysis.add  s#    88+hll+
 	
r0   c                (   [         R                  U5      n[         R                  U5      nUR                  UR                  :w  a  [        S5      eUR                  (       a  U R	                  X5      $ S n[         R                  X[        U5      5      $ )Nr8  c                B    U S:X  d  U S:X  a  U $ US:X  d  US:X  a  U$ X-  $ )Nr   r   r*   r  s     r1   safe_mul-SymPyValueRangeAnalysis.mul.<locals>.safe_mul  s-    Cx16cQ!Vur0   )r$   r{   rQ   rC   r  r   r   )r   r   r   rJ  s       r1   mulSymPyValueRangeAnalysis.mul  sx    QQ99		! O  9988A>!	 66q[=RSSr0   c                &   [         R                  U 5      n [         R                  U5      nSU;   d*  [        * U ;   d
  [        U ;   a)  [        * U;   d
  [        U;   a  [         R                  5       $ [         R	                  U U[        [        5      5      $ Nr   )r$   r{   r!   rv   r   r   r   r  s     r1   int_truediv#SymPyValueRangeAnalysis.int_truediv  sv    QQ6w!|v{&AST&&((::J' r0   c                v   [         R                  U 5      n [         R                  U5      nSU;   dR  [        R                  * U ;   d  [        R                  U ;   a=  [        R                  * U;   d  [        R                  U;   a  [         R	                  5       $ [         R                  U U[        [        5      5      $ rO  )r$   r{   r7   r?   rv   r   r   r   r  s     r1   truedivSymPyValueRangeAnalysis.truediv  s    QQ6hhY!^uxx1}EHH9>UXXQR]&&((::L) r0   c                   [         R                  U 5      n [         R                  U5      nSU;   a  UR                  S:  a   U R                  S:  a  [        S[        5      $ UR                  S::  a   U R                  S::  a  [        S[        5      $ UR                  S::  a!  U R                  S:  a  [        [        * S5      $ UR                  S:  a!  U R                  S::  a  [        [        * S5      $ [         R                  5       $ / n[        R                  " U R                  U R                  /UR                  UR                  /5       Hy  u  p4[        X45      nU[        R                  L aE  UR                  [        R                  " U5      [        R                  " U5      -  [        -  5        Mh  UR                  U5        M{     [        [        U5      [        U5      5      $ rO  )r$   r{   rK   r!   rL   r   r   r   r   r7   rD   appendsignr   r   )r   r   r   r}   r   r   s         r1   floordiv SymPyValueRangeAnalysis.floordiv  s\   QQ 6ww!|1"1f--ww!|1"1f--ww!|1"F7A..ww!|1"F7A..**,,%%qww&8177AGG:LMDAAEII~AA!>& HI" N 3x=#h-88r0   c                  ^^ [         R                  U5      n[         R                  U5      nS mS nSU;   a  [         R                  5       $ UR                  5       (       a  [	        UR
                  5      mU" UR
                  T5      U" UR                  T5      :X  a  [         R                  UUU4S j5      $ UR                  S:  a  [        T* S-   S5      $ UR
                  S:  a  [        STS-
  5      $ [        T* S-   UR
                  5      n[        TS-
  UR                  5      n[        XE5      $ U R	                  U5      R                  S-
  n[        U* U5      $ )Nc                J    [        U 5      [        U5      -  nU S:  a  US-  nU$ )Nr   r  )abs)r   r   rets      r1   c_mod*SymPyValueRangeAnalysis.mod.<locals>.c_mod  s(    a&3q6/C1ur	Jr0   c                ~    X-  nUR                   (       a'  U[        [        * 4;  a  [        R                  " U5      $ U$ rO   )r   r!   r7   r;   )r   r   r}   s      r1   c_div*SymPyValueRangeAnalysis.mod.<locals>.c_div  s2    A'({{q&@Q7Q5==#XWXXr0   r   c                   > T" U T5      $ rO   r*   )r   r^  y_vals    r1   <lambda>-SymPyValueRangeAnalysis.mod.<locals>.<lambda>  s    uQr0   r   )
r$   r{   r   r   r\  rK   rL   r   r   r   )r   r}   r   ra  rK   rL   r^  rd  s         @@r1   modSymPyValueRangeAnalysis.mod  s.   QQ		Y 6**,,^^LE QWWe$aggu(=="11!5NOOww{"E6A:q111"1eai00 UFQJ0EAIqww/"500 GGAJ$$q(Evu--r0   c                Z   [         R                  U5      n[         R                  U5      nUR                  S:  a%  UR                  S:  a  [        R	                  X5      $ UR                  S:  a  UR                  S-   OSnUR
                  S:  a  UR
                  S-
  OSn[        X45      $ )zPython-style modulo: result has same sign as divisor.

Assumes valid input where y is never 0.
- When y > 0: result is in [0, y - 1]
- When y < 0: result is in [y + 1, 0]
r   r   )r$   r{   rK   r   rg  rL   )r   r}   r   rK   rL   s        r1   
python_mod"SymPyValueRangeAnalysis.python_mod  s     QQ77a<AGGqL*..q44 ww{! ww{!5((r0   c                D    U R                  U R                  X5      U5      $ rO   )rg  rX  )r   r   r   cs       r1   modular_indexing(SymPyValueRangeAnalysis.modular_indexing  s    wws||A)1--r0   c                *    [         R                  5       $ rO   )r$   r   )r   argss     r1   &is_non_overlapping_and_dense_indicator>SymPyValueRangeAnalysis.is_non_overlapping_and_dense_indicator  s    &&((r0   c                  ^ [         R                  U5      n[         R                  T5      mUR                  5       (       aH  TR                  5       (       a3  [         R                  [        UR                  TR                  5      5      $ UR                  S:  a,  [         R                  UT[        S[        5      -  [        5      $ TR                  5       (       aG  TR                  S-  S:X  a  [         R                  UU4S j5      $ [         R                  UU4S j5      $ [        UR                  UR                  * 5      n[        [        UTR                  5      * [        UTR                  5      5      $ )Nr   r      c                0   > [        U TR                  5      $ rO   r   rK   r}   r   s    r1   re  8SymPyValueRangeAnalysis.pow_by_natural.<locals>.<lambda>3  s    !QWW!5r0   c                0   > [        U TR                  5      $ rO   rw  rx  s    r1   re  ry  7  s    x177?Sr0   )r$   r{   r   r   rK   r   r!   r   r   r   r   rL   )r   r   r   max_bases     ` r1   pow_by_natural&SymPyValueRangeAnalysis.pow_by_natural   s    QQ>> 0 0##HQWWagg$>??WW\
 <<1{1f--|  ^^ww{a"665 
 #11!5STT 177QWWH-H8QWW-.1770K r0   c                *    [         R                  5       $ rO   )r$   rv   r0  s      r1   powSymPyValueRangeAnalysis.powB  s    ""$$r0   c                    [         R                  U 5      n SU ;   a  [         R                  5       $ [         R                  U S 5      $ )zENeeded as it's used in pow, but it won't appear on a SymPy expressionr   c                    [        SU 5      $ )N      ?)r   )r   s    r1   re  4SymPyValueRangeAnalysis.reciprocal.<locals>.<lambda>v  s    <Q;Or0   )r$   r{   rv   r   r  s    r1   
reciprocal"SymPyValueRangeAnalysis.reciprocalo  s>     Q6&&((--a1OPPr0   c                6    [         R                  U [        5      $ rO   )r$   r   r\  r  s    r1   r\  SymPyValueRangeAnalysis.absx  s    ..q#66r0   c                6    [         R                  U [        5      $ rO   )r$   r   r   r  s    r1   expSymPyValueRangeAnalysis.exp|  s    ))!->??r0   c                    [         R                  U 5      n U R                  S::  a  [         R                  5       $ [         R	                  U [
        5      $ rO  )r$   r{   rK   rv   r   r   r  s    r1   logSymPyValueRangeAnalysis.log  s@    Q77a<&&(())!->??r0   c                    [         R                  U 5      n U R                  S::  a  [         R                  5       $ [         R	                  U [
        5      $ rO  )r$   r{   rK   rv   r   r   r  s    r1   log2SymPyValueRangeAnalysis.log2  s@    Q77a<&&(())!-?@@r0   c                B    U R                  X[        R                  5      $ rO   )
min_or_maxr7   r   r0  s      r1   minimumSymPyValueRangeAnalysis.minimum      ~~aEII..r0   c                B    U R                  X[        R                  5      $ rO   )r  r7   r   r0  s      r1   maximumSymPyValueRangeAnalysis.maximum  r  r0   c                    [         R                  U 5      n [         R                  U5      n[         R                  XU5      $ rO   )r$   r{   r   )r   r   r   s      r1   r  "SymPyValueRangeAnalysis.min_or_max  s5    QQ88rBBr0   c                    [         R                  U[        R                  R                  R
                  R                  5      $ rO   )r$   r   r7   	functions
elementaryintegersfloorr   r}   r   s      r1   floor_to_int$SymPyValueRangeAnalysis.floor_to_int  s+    ))!U__-G-G-P-P-V-VWWr0   c                    [         R                  U[        R                  R                  R
                  R                  5      $ rO   )r$   r   r7   r  r  r  ceilingr  s      r1   ceil_to_int#SymPyValueRangeAnalysis.ceil_to_int  s0    ))u))22::
 	
r0   c                    [         R                  U[        [        R                  R
                  R                  R                  5      5      $ rO   )r$   r   r   r7   r  r  r  r  r   r}   s     r1   r  SymPyValueRangeAnalysis.floor  s5    )){5??55>>DDE
 	
r0   c                    [         R                  U[        [        R                  R
                  R                  R                  5      5      $ rO   )r$   r   r   r7   r  r  r  r  r  s     r1   ceilSymPyValueRangeAnalysis.ceil  s5    )){5??55>>FFG
 	
r0   c                   ^ TR                  5       (       d  [        R                  5       $ TR                  mU4S jn[        R	                  X5      $ )Nc                   > [        U T5      $ rO   )r   )numberndigitss    r1   re  7SymPyValueRangeAnalysis.round_decimal.<locals>.<lambda>  s    L9r0   )r   r$   rv   rK   r   )r   r  r  r   s     ` r1   round_decimal%SymPyValueRangeAnalysis.round_decimal  sB    ##%%&&((-- :))&55r0   c                6    [         R                  U[        5      $ rO   )r$   r   r   )r   r  r   s      r1   round_to_int$SymPyValueRangeAnalysis.round_to_int  s     ))&*==r0   c                    [         R                  U 5      n U R                  S:  a  [         R                  5       $ [         R	                  U [
        5      $ rO  )r$   r{   rK   rv   r   r   r  s    r1   sqrtSymPyValueRangeAnalysis.sqrt  s@    Q77Q;&&(())!-?@@r0   c                   [         R                  U5      n[         R                  U5      nU R                  5       n UR                  UR                  :w  a$  [         R	                  5       X4;  a  [        S5      eUR                  (       a^  [        [        R                  " UR                  UR                  5      [        R                  " UR                  UR                  5      5      $ [        [        R                  " UR                  UR                  5      [        R                  " UR                  UR                  5      5      $ )NzIwhere() requires b and c to have the same boolean-ness or allow unknown())r$   r{   rx   rQ   rv   rC   r7   r   rK   r   rL   r   r   )r   r   rm  s      r1   whereSymPyValueRangeAnalysis.where  s    QQIIK 99		!k&9&9&;A6&I [  99uyy!'':EHHQWWagg<VWWuyy!'':EIIaggqww<WXXr0   c                (    UR                  5       nX4$ rO   )rx   r  s     r1   expr_cond_pair&SymPyValueRangeAnalysis.expr_cond_pair  s    IIKvr0   c                 b    S nU  H&  u  p#[         R                  U;   d  M  Uc  UnM"  X-  nM(     U$ rO   r$  )ranges
init_range
expr_range
cond_ranges       r1   	piecewise!SymPyValueRangeAnalysis.piecewise  s;    
&,"JzzZ'%!+J!+!8J '- r0   c                    [        SS5      $ Ng      r  r$   r  s    r1   cosSymPyValueRangeAnalysis.cos  s    
 4%%r0   c                6    [        S[        R                  5      $ )Nr   r   r  s    r1   coshSymPyValueRangeAnalysis.cosh  s    3))r0   c                    [        SS5      $ r  r  r  s    r1   sinSymPyValueRangeAnalysis.sin  s     4%%r0   c                T    [        [        R                  * [        R                  5      $ rO   r   r  s    r1   sinhSymPyValueRangeAnalysis.sinh  r   r0   c                T    [        [        R                  * [        R                  5      $ rO   r   r  s    r1   tanSymPyValueRangeAnalysis.tan#      EHH9ehh//r0   c                T    [        [        R                  * [        R                  5      $ rO   r   r  s    r1   tanhSymPyValueRangeAnalysis.tanh'  r   r0   c                T    [        [        R                  * [        R                  5      $ rO   r   r  s    r1   asinSymPyValueRangeAnalysis.asin,  r  r0   c                T    [        [        R                  * [        R                  5      $ rO   r   r  s    r1   acosSymPyValueRangeAnalysis.acos6  r  r0   c                T    [        [        R                  * [        R                  5      $ rO   r   r  s    r1   atanSymPyValueRangeAnalysis.atan@  r  r0   c                6    [         R                  U [        5      $ rO   )r$   r   r   r  s    r1   truncSymPyValueRangeAnalysis.truncE  s     ))!\::r0   r*   rO   )@r+   r,   r-   r.   __doc__r   r   r   r   r  r  r  r  r   r  r  r*  r-  r1  r5  r9  r<  r?  rB  rF  rL  rP  rS  rX  rg  rj  rn  rr  r|  r  r  r\  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r/   r*   r0   r1   r   r     s   
 + +Z % % 9 9 8 8 I I J J C C 9 9* 9 9. #, #,J 4 4 & & # # 8 8    & & & & 
 

 T T, 
 
   9 92 &. &.P ) )  . . ) )  B * *X Q Q 7 7 @ @ @ @ A A / / / / C C
 X X 
 
. 
 

 
 

 	6 	6 > >
 A A Y Y$     & & 	 	 & &
 0 0 0 0 0 0     0 0 ; ;r0   r   c                B  ^ ^ [         R                  ST [        U U4S j5      5        [        T [        R
                  5      (       a  [        R                  T 5      $ T=(       d    0 m[        R                  R                  R                  5       nU(       ax  UR                  (       ag  UR                  R                  (       aL  T(       a%  0 UR                  R                  R                  ETEmO UR                  R                  R                  mS n[        [         TT US9$ )Nzbound_sympy(%s)%sc                 n   > T(       a,  SSR                  U 4S jTR                  5        5       5      -   $ S$ )N
c              3  \   >#    U  H!  u  pUTR                   ;   d  M  S U SU 3v   M#     g7f)z  r4   N)free_symbols)r  kr   exprs      r1   r   0bound_sympy.<locals>.<lambda>.<locals>.<genexpr>T  s1      .<daTEVEV@VMb2aSMns   ,, )joinitems)r  r  s   r1   re  bound_sympy.<locals>.<lambda>R  s@    
 	 )) .4lln  
 r0   c                
   U R                   (       a]  U R                  (       a  [        S[        5      nU$ U R                  (       a  [        S[        5      nU$ [        R                  5       n U$ [        R                  5       nU$ r  )r   is_positiver$   r!   is_nonnegativer   rv   )srS   s     r1   missing_handler$bound_sympy.<locals>.missing_handleri  sm    <<}} F+ 	 !! F+ 		 !,,. 	 $$&B	r0   )r  )r  debugr   r5   r7   r   r$   r{   r   _guardsTracingContexttry_get	fake_mode	shape_envvar_to_ranger    r   )r  r  contextr  s   ``  r1   r%   r%   K  s     II		
 $%%%%\rF mm**224G7$$):):)D)DK))33@@KFKF&&00==F  r0   )rS   ValueRanges[_T]r   z$TypeGuard[ValueRanges[SympyBoolean]])rS   r  r   z"TypeGuard[ValueRanges[sympy.Expr]])r   zTypeIs[sympy.Integer]rO   )r  z
sympy.Exprr  z&dict[sympy.Symbol, ValueRanges] | Noner   r$   )P
__future__r   dataclassesr   r   loggingr=   rE  collections.abcr   typingr   r   r   r   r	   r
   typing_extensionsr   r7   sympy.logic.boolalgr   rI   r   r   torch._loggingr   torch._prims_commonr   r  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   interpr    numbersr!   r"   r#   	getLoggerr+   r  __all__rA   r&   RuntimeErrorr(   rG   rM   rT   rV   rY   r:   r<   r   r6   r   r   r   r   r   r   r   r   	dataclassr$   r   r%   r*   r0   r1   <module>r     s   "       $ V V $  D  % -    " ! = = !-
(T5::|,	l 	F6) , 
uuzz	!			5::,

*	+
EJJ

+UZZ7
8	<.,.	/
L,/=
>	7	 d#p9'"+ p9 $p9f	[
; [
;~ HL-
-D--r0   