
    sgɍ                       d dl mZ d dlZ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mZmZmZ d dlmZ d dl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mZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ dd
l,m-Z- ddl.m/Z/m0Z0m1Z1  ejd                  e3      Z4g dZ5 edejl                  e      Z7 G d de8      Z9d Z:d Z;ddZ<ddZ=ee>e?ejl                  f   Z@eeAef   ZBee@eBf   ZCeejl                  gejl                  f   ZDeejl                  ejl                  gejl                  f   ZEeegef   ZFeeegef   ZGeeDeFf   ZHeeEeGf   ZI ej                  d       G d de
e7                ZK G d d      ZL G d deL      ZM	 d	 	 	 	 	 d dZNy)!    )annotationsN)	CallableDictGenericOptionaloverloadSupportsFloatTYPE_CHECKINGTypeVarUnion)	TypeGuard)BooleanBooleanAtom)
LazyString)dtype_to_type   )_keep_floatFloatTrueDivFloorDiv
IntTrueDivOpaqueUnaryFn_expOpaqueUnaryFn_logOpaqueUnaryFn_sqrtPowByNaturalRoundDecimal
RoundToIntsafe_powToFloatTruncToFloat
TruncToInt)sympy_interp)int_ooIntInfinityNegativeIntInfinity)ValueRangesValueRangeAnalysisbound_sympy_Tc                      e Zd Zy)ValueRangeErrorN)__name__
__module____qualname__     R/var/www/html/venv/lib/python3.12/site-packages/torch/utils/_sympy/value_ranges.pyr*   r*   8   s    r/   r*   c                P   t        | t              r"| rt        j                  S t        j                  S t        | t
              rt        j                  |       S t        | t              rPt        j                  |       r&| dkD  rt        j                  S t        j                   S t        j                  |       S t        | t        j                        r*| j                  sJ |        | t        j                  k7  sJ | S t        | t              r| S t!        dt#        |        d|        )Nr   znot simple sympy type : )
isinstanceboolsympytruefalseintIntegerfloatmathisinfooFloatExpr	is_numbernanr   AssertionErrortype)es    r0   simple_sympifyrE   >   s    !Tuzz/EKK/	As	}}Q	Au	::a= 1u5883588)3{{1~	Auzz	"{{A{
 EII~~	A{	#5d1gYbDEEr/   c                    t        | t        j                        r!t        |t        j                        sJ | |k  S t        | t              rt        |t              s	J | |f       | xr |  S N)r3   r5   r?   SympyBooleanloweruppers     r0   sympy_generic_lerL   W   sn    %$%,,,~ %.:e\3R 	
U
 	
R '%i((r/   c                    | j                   S rG   is_boolvrs    r0   
vr_is_boolrR   d   s    ::r/   c                    | j                    S rG   rN   rP   s    r0   
vr_is_exprrT   h   s    zz>r/   T)frozenc                     e Zd ZU ereej                     Zee   Z	e
ee	f   Zded<   ded<   ded<   ded<   ded<   d(dZe	 	 	 	 	 	 	 	 d)d	       Ze	 	 	 	 	 	 	 	 d*d
       Zd+dZd,dZd-dZd Zd.dZe	 	 	 	 	 	 d/d       Ze	 	 	 	 	 	 d0d       Zd1dZe	 	 	 	 	 	 d/d       Ze	 	 	 	 	 	 d0d       Zd1dZd2dZed3d       Zed3d       Zed,d       Zeed4d              Zeed5d              Zed6d       Zed7d       Zeed7d              Zeed8d              Zed9d        Zed7d!       Zed7d"       Zee	 	 	 	 	 	 	 	 d:d#              Z ee	 	 	 	 	 	 	 	 d;d$              Z e	 	 	 	 	 	 	 	 d<d%       Z e!d&        Z"y')=r%   r(   rJ   rK   r4   rO   is_intis_floatc                <    d| j                    d| j                   dS )NzVR[z, ]rI   selfs    r0   __repr__zValueRanges.__repr__   s    TZZL4::,a00r/   c                     y rG   r.   r\   rJ   rK   s      r0   __init__zValueRanges.__init__        	r/   c                     y rG   r.   r_   s      r0   r`   zValueRanges.__init__   ra   r/   c                   t        |      }t        |      }	 t        ||      st        d| d| d      	 t	        |t
              }t	        |t
              }||k(  s	J ||f       t	        |t        j                        r|t        j                  k(  rt        }t	        |t        j                        r|t        j                   k(  rt         }t        j                  t        t        f}t	        ||      }t	        ||      }t        j                  | d|       t        j                  | d|       t        j                  | d|       t        j                  | d	| j                   xr |xr |       	 t        j                  | d
| j                   xr | j                          | j                  s#| j                  s| j                   s	J ||f       y y y # t        $ r}t        d| d|       |d }~ww xY w)NzInvalid ranges [:rZ   zCould not compare z <= rJ   rK   rO   rW   rX   )rE   rL   r*   	TypeErrorr3   rH   r5   r9   r=   r"   r$   r#   object__setattr__rO   rW   rX   )	r\   rJ   rK   rD   is_bool_loweris_bool_upperinteger_typesis_int_loweris_int_uppers	            r0   r`   zValueRanges.__init__   s   u%u%	L#E51%(8qq&IJJ 2
 #5,7"5,7-=u~=- eU]]+0AEeU]]+%((0BGE(;[I!%7!%7 	4%04%0 	4M:>>,	

	 	4-=-Qdkk/R||t{{dmmKeU^K;m{|a  	L0tE7CD!K	Ls   G 	G1G,,G1c                    t        |       r| S | t        j                         k(  rt        j                         S t	        d|        )Nznot bool like )rR   r%   unknownunknown_boolrB   r[   s    r0   boolifyzValueRanges.boolify   sA    dK[((**++-- >$!899r/   c                J    t         j                  |      j                  |       S rG   )r%   wrapissubset)r\   xs     r0   __contains__zValueRanges.__contains__   s    "++D11r/   c                    t        |j                  | j                        xr  t        | j                  |j                        S rG   )rL   rJ   rK   r\   others     r0   rs   zValueRanges.issubset   s3    TZZ8 
=MJJ>
 	
r/   c                    | |z  S )z1Given two ValueRanges, returns their intersectionr.   rw   s     r0   tightenzValueRanges.tighten   s    e|r/   c                     y rG   r.   rw   s     r0   __and__zValueRanges.__and__       
 	r/   c                     y rG   r.   rw   s     r0   r|   zValueRanges.__and__   r}   r/   c                   |t         j                         k(  r| S | t         j                         k(  r|S | j                  |j                  k(  s	J | |f       | j                  |j                  k(  s	J | |f       | j                  |j                  k(  s	J | |f       | j                  r\t        t        j                  | j                  |j                        t        j                  | j                  |j                              S t        t        j                  | j                  |j                        t        j                  | j                  |j                              S rG   )r%   rn   rO   rW   rX   r5   OrrJ   AndrK   MaxMinrw   s     r0   r|   zValueRanges.__and__   s   K''))K;&&((L||u}},;tUm;,{{ell*9T5M9*}}.=u=.<<U[[1599TZZ3U  		$**ekk2EIIdjj%++4V r/   c                     y rG   r.   rw   s     r0   __or__zValueRanges.__or__
  r}   r/   c                     y rG   r.   rw   s     r0   r   zValueRanges.__or__  r}   r/   c                   t         j                         | |fv rt         j                         S | j                  |j                  k(  s	J | |f       | j                  |j                  k(  s	J | |f       | j                  |j                  k(  s	J | |f       | j                  r\t        t        j                  | j                  |j                        t        j                  | j                  |j                              S t        t        j                  | j                  |j                        t        j                  | j                  |j                              S rG   )r%   rn   rO   rW   rX   r5   r   rJ   r   rK   r   r   rw   s     r0   r   zValueRanges.__or__  s     T5M1&&((||u}},;tUm;,{{ell*9T5M9*}}.=u=.<<		$**ekk2EHHTZZ4U  		$**ekk2EIIdjj%++4V r/   c                4    | j                   | j                  k(  S rG   rI   r[   s    r0   is_singletonzValueRanges.is_singleton'  s    zzTZZ''r/   c                 T    t        t        j                   t        j                        S rG   r%   r5   r=   r.   r/   r0   rn   zValueRanges.unknown*      EHH9ehh//r/   c                 ,    t        t         t              S rG   )r%   r"   r.   r/   r0   unknown_intzValueRanges.unknown_int.  s    F7F++r/   c                 R    t        t        j                  t        j                        S rG   r%   r5   r7   r6   r.   r/   r0   ro   zValueRanges.unknown_bool2  s    5;;

33r/   c                     y rG   r.   args    r0   rr   zValueRanges.wrap6  s     	r/   c                     y rG   r.   r   s    r0   rr   zValueRanges.wrap<       	r/   c                    t        | t              r| S t        | t              r)t        j                  |       rt        j                         S t        | |       S rG   )r3   r%   r:   r;   isnanrn   r   s    r0   rr   zValueRanges.wrapA  sA    c;'Jc5!djjo&&((3$$r/   c                    t         j                  |       } t         || j                         || j                              S )z#Increasing: x <= y => f(x) <= f(y).r%   rr   rJ   rK   rt   fns     r0   increasing_mapzValueRanges.increasing_mapJ  s1     Q2agg;17744r/   c                     y rG   r.   r   s     r0   decreasing_mapzValueRanges.decreasing_mapP  r   r/   c                     y rG   r.   r   s     r0   r   zValueRanges.decreasing_mapU  r   r/   c                    t         j                  |       } t         || j                         || j                              S )z#Decreasing: x <= y => f(x) >= f(y).)r%   rr   rK   rJ   r   s     r0   r   zValueRanges.decreasing_mapZ  s1     Q2agg;17744r/   c                    t         j                  |       }  || j                        } || j                        }t        t	        ||      t        ||            S )zIt's increasing or decreasing.)r%   rr   rJ   rK   minmax)rt   r   lus       r0   monotone_mapzValueRanges.monotone_mapa  sG     QqwwKqwwK3q!9c!Qi00r/   c                X   t         j                  |       } d| v r|t         || j                         || j                              }t        |      }t        |t        j                        s|t        j                  k(  rt        d|      S t        d|      S t         j                  | |      S )z$Fn is convex and has a minimum at 0.r           )r%   rr   r   rJ   rK   rE   r3   r5   r>   r=   r   )rt   r   rK   s      r0   convex_min_zero_mapzValueRanges.convex_min_zero_mapi  s     Q6177R[1E"5)E%-%((1B"3..q%((''2..r/   c                     y rG   r.   rt   yr   s      r0   coordinatewise_increasing_mapz)ValueRanges.coordinatewise_increasing_mapu       	r/   c                     y rG   r.   r   s      r0   r   z)ValueRanges.coordinatewise_increasing_map~  r   r/   c                    t         j                  |       t         j                  |      }} t         || j                  |j                         || j                  |j                              S )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      r0   r   z)ValueRanges.coordinatewise_increasing_map  sT     "K$4$4Q$71qww qww 
 	
r/   c                D   | j                  |      | j                  |      }}t        j                  |j                  |j                  g|j                  |j                  g      D cg c]  \  }} |||       }}}t        t        |      t        |            S c c}}w )z1It's increasing or decreasing on each coordinate.)rr   	itertoolsproductrJ   rK   r%   r   r   )clsrt   r   r   abproductss          r0   coordinatewise_monotone_mapz'ValueRanges.coordinatewise_monotone_map  s     xx{CHHQK1 "))177AGG*<qww>PQ
1 q!H
 
 3x=#h-88	
s   (BN)returnstr)r\   ValueRanges[sympy.Expr]rJ   ExprInrK   r   r   None)r\   ValueRanges[SympyBoolean]rJ   BoolInrK   r   r   r   )rJ   AllInrK   r   r   r   )r   r   )rt   r   r   r4   )r   r%   )r\   r   rx   r   r   r   )r\   r   rx   r   r   r   )r\   AllVRrx   r   r   r   )r   r4   )r   r   )r   Union[ExprIn, ExprVR]r   ExprVR)r   Union[BoolIn, BoolVR]r   BoolVR)r   Union[AllIn, AllVR]r   r   )rt   r   r   ExprFnr   r   )rt   r   r   BoolFnr   r   )rt   r   r   AllFnr   r   )rt   r   r   r   r   ExprFn2r   r   )rt   r   r   r   r   BoolFn2r   r   )rt   r   r   r   r   AllFn2r   r   )#r+   r,   r-   r
   r%   r5   r?   r   rH   r   r   r   __annotations__r]   r   r`   rp   ru   rs   rz   r|   r   r   staticmethodrn   r   ro   rr   r   r   r   r   r   classmethodr   r.   r/   r0   r%   r%   w   sy   UZZ(\*ffn%
 IIMLN1 %  
	  '  
	 8Lt:2


 %& 
!  '( 
# $ %& 
!  '( 
# ( 0 0 , , 4 4       % % 5 5
       5 5 1 1 	/ 	/     
	       
	   


 
 
	
 
$ 9 9r/   r%   c                  2   e Zd ZdZed        Zed5d       Zed        Zed        Zed        Z	ed        Z
ed	        Zed
        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Z ed        Z!ed        Z"ed         Z#ed!        Z$ed"        Z%ed#        Z&ed$        Z'ed%        Z(ed&        Z)ed'        Z*ed(        Z+ed)        Z,ed*        Z-ed+        Z.ed,        Z/ed-        Z0ed.        Z1ed/        Z2ed0        Z3ed1        Z4ed2        Z5ed3        Z6ed4        Z7y)6SymPyValueRangeAnalysisz
    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                   t        | t              r| j                         sJ | j                  } t        | t        t
        t        f      }|s1t        | t        t        j                  t        j                  f      sJ t        | t              rqt        j                  |       r\|t        j                  k(  rt        j                         S |j                   rt        j#                         S t        t$         t$              S |rt'        |      } ||       } nY|t        j                  k(  rt        | t              s6J |j                   r| j(                  r| j*                  sJ | j,                  sJ t        j/                  |       }|S rG   )r3   r%   r   rJ   r8   r:   r4   r   r5   r9   Numberr	   r;   r   torchro   is_floating_pointrn   r"   r   	is_finiteis_real
is_integerrr   )valuedtype	is_pythontype_rs        r0   constantz SymPyValueRangeAnalysis.constant  s1   e[)%%'''KKEusE4&89	JK=
 	
 
 e]+

50A

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

"!%555(( ??emm;; ''''U#r/   Nc                   |t         j                  k(  rt        j                  | t              S |t         j
                  k(  rt        j                         S |j                  st        j                         S t        j                         S rG   )
r   float64r%   r   r   r4   ro   r   r   rn   )r   r   	src_dtypes      r0   to_dtypez SymPyValueRangeAnalysis.to_dtype  sc    EMM!--a99ejj ++--((**,,""$$r/   c                6    t         j                  | t              S rG   )r%   r   r    )r   r   s     r0   trunc_to_intz$SymPyValueRangeAnalysis.trunc_to_int  s    ))!Z88r/   c                    t         j                  |       } | j                         } | j                  sJ t         j	                  | t
        j                        S rG   )r%   rr   rp   rO   r   r5   Not)r   s    r0   not_zSymPyValueRangeAnalysis.not_  s@    QIIKyyy))!UYY77r/   c                L    t         j                  | |t        j                        S rG   )r%   r   r5   r   r   r   s     r0   or_zSymPyValueRangeAnalysis.or_  s    88AuxxHHr/   c                L    t         j                  | |t        j                        S rG   )r%   r   r5   r   r   s     r0   and_zSymPyValueRangeAnalysis.and_  s    88AuyyIIr/   c                   t         j                  |       } t         j                  |      }| j                         rL|j                         r<| j                  |j                  k(  r#t         j                  t        j
                        S | j                  |j                  kD  s|j                  | j                  kD  r#t         j                  t        j                        S t        t        j                  t        j
                        S rG   )r%   rr   r   rJ   r5   r6   rK   r7   r   s     r0   eqzSymPyValueRangeAnalysis.eq  s    QQ>> 0QWW5G##EJJ//WWqww!''AGG"3##EKK005;;

33r/   c                D    | j                  | j                  ||            S rG   )r   r   r   r   r   s      r0   nezSymPyValueRangeAnalysis.ne      xxq!%%r/   c                ,    t         j                  |      S rG   )r%   rr   )r   r   s     r0   identityz SymPyValueRangeAnalysis.identity  s    ""r/   c                &   t         j                  |      }t         j                  |      }|j                  |j                  k(  sJ |j                  r!| j                  | j	                  |      |      S |j
                  |j                  k  r#t         j                  t        j                        S |j                  |j
                  k\  r#t         j                  t        j                        S t        t        j                  t        j                        S rG   )
r%   rr   rO   r   r   rK   rJ   r5   r6   r7   r   s      r0   ltzSymPyValueRangeAnalysis.lt   s    QQyyAII%%%9988CHHQK++ww "''

33AGG#"''44u{{EJJ77r/   c                &    | j                  ||      S rG   )r   r   s      r0   gtzSymPyValueRangeAnalysis.gt  s    vva|r/   c                D    | j                  | j                  ||            S rG   )r   r   r   s      r0   lezSymPyValueRangeAnalysis.le  r   r/   c                D    | j                  | j                  ||            S rG   )r   r   r   s      r0   gezSymPyValueRangeAnalysis.ge  r   r/   c                ^    t         j                  | |t        t        j                              S rG   )r%   r   r   operatoraddr   s     r0   r   zSymPyValueRangeAnalysis.add  s%    88q+hll+
 	
r/   c                   t         j                  |      }t         j                  |      }|j                  |j                  k(  sJ |j                  r| j                  ||      S d }t         j	                  ||t        |            S )Nc                <    | dk(  s| dk(  r| S |dk(  s|dk(  r|S | |z  S )Nr   r   r.   r   s     r0   safe_mulz-SymPyValueRangeAnalysis.mul.<locals>.safe_mul)  s/    Cx16cQ!V1ur/   )r%   rr   rO   r   r   r   )r   r   r   r  s       r0   mulzSymPyValueRangeAnalysis.mul   sp    QQyyAII%%%9988Aq>!	 66q![=RSSr/   c                   t         j                  |       } t         j                  |      }d|v s"t         | v st        | v r%t         |v st        |v rt         j                         S t         j	                  | |t        t                    S Nr   )r%   rr   r"   rn   r   r   r   r   s     r0   int_truedivz#SymPyValueRangeAnalysis.int_truediv4  st    QQ6w!|v{&AST&&((::1k*- r/   c                b   t         j                  |       } t         j                  |      }d|v sJt        j                   | v st        j                  | v r9t        j                   |v st        j                  |v rt         j	                         S t         j                  | |t        t                    S r  )r%   rr   r5   r=   rn   r   r   r   r   s     r0   truedivzSymPyValueRangeAnalysis.truediv?  s    QQ6hhY!^uxx1}EHH9>UXXQR]&&((::1k,/ r/   c                <   t         j                  |       } t         j                  |      }d|v rt         j                         S g }t        j                  | j
                  | j                  g|j
                  |j                  g      D ]v  \  }}t        ||      }|t        j                  u rB|j                  t        j                  |      t        j                  |      z  t        z         f|j                  |       x t        t        |      t        |            S r  )r%   rr   r   r   r   rJ   rK   r   r5   rA   appendsignr"   r   r   )r   r   r   rt   r   r   s         r0   floordivz SymPyValueRangeAnalysis.floordivL  s    QQ6**,,%%qww&8177AGG:LM 	#DAqAAEII~AA!>& HI"	# 3x=#h-88r/   c                   t         j                  |      }t         j                  |      }d d }d|v rt         j                         S |j                         rt	        |j
                         ||j
                         ||j                        k(  rt         j                  |fd      S |j                  dk  rt         dz   d      S |j
                  dkD  rt        ddz
        S t         dz   |j
                        }t        dz
  |j                        }t        ||      S | j	                  |      j                  dz
  }t        | |      S )Nc                H    t        |       t        |      z  }| dk  r|dz  }|S )Nr   )abs)r   r   rets      r0   c_modz*SymPyValueRangeAnalysis.mod.<locals>.c_modb  s(    a&3q6/C1ur	Jr/   c                p    | |z  }|j                   r$|t        t         fvrt        j                  |      S |S rG   )r   r"   r5   r9   )r   r   rt   s      r0   c_divz*SymPyValueRangeAnalysis.mod.<locals>.c_divh  s4    AA'({{q&@Q7Q5==#XWXXr/   r   c                     |       S rG   r.   )r   r  y_vals    r0   <lambda>z-SymPyValueRangeAnalysis.mod.<locals>.<lambda>t  s    uQ r/   r   )
r%   rr   r   r   r  rJ   rK   r   r   r   )r   rt   r   r  rJ   rK   r  r  s         @@r0   modz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--r/   c                F    | j                  | j                  ||      |      S rG   )r  r  )r   r   r   cs       r0   modular_indexingz(SymPyValueRangeAnalysis.modular_indexing  s    wws||Aq)1--r/   c                *    t         j                         S rG   )r%   r   )r   argss     r0   &is_non_overlapping_and_dense_indicatorz>SymPyValueRangeAnalysis.is_non_overlapping_and_dense_indicator  s    &&((r/   c                   t         j                  |      }t         j                        |j                         rCj                         r3t         j                  t        |j                  j                              S |j                  dk\  r,t         j                  |t        dt              z  t              S j                         rDj                  dz  dk(  rt         j                  |fd      S t         j                  |fd      S t        |j                  |j                         }t        t        |j                         t        |j                              S )Nr   r      c                0    t        | j                        S rG   r   rJ   rt   r   s    r0   r  z8SymPyValueRangeAnalysis.pow_by_natural.<locals>.<lambda>  s    !QWW!5 r/   c                0    t        | j                        S rG   r"  r#  s    r0   r  z8SymPyValueRangeAnalysis.pow_by_natural.<locals>.<lambda>  s    x177?S r/   )r%   rr   r   r   rJ   r   r"   r   r   r   r   rK   )r   r   r   max_bases     ` r0   pow_by_naturalz&SymPyValueRangeAnalysis.pow_by_natural  s   QQ>> 0##HQWWagg$>??WW\ <<1{1f--|  ^^ww{a"665 
 #11!5STT 177QWWH-H8QWW-.1770K r/   c                *    t         j                         S rG   r%   rn   r   s      r0   powzSymPyValueRangeAnalysis.pow  s    ""$$r/   c                    t         j                  |       } d| v rt         j                         S t         j                  | d       S )zENeeded as it's used in pow, but it won't appear on a SymPy expressionr   c                    t        d|       S )N      ?)r   r   s    r0   r  z4SymPyValueRangeAnalysis.reciprocal.<locals>.<lambda>  s    <Q;O r/   )r%   rr   rn   r   rt   s    r0   
reciprocalz"SymPyValueRangeAnalysis.reciprocal  s>     Q6&&((--a1OPPr/   c                6    t         j                  | t              S rG   )r%   r   r  r.  s    r0   r  zSymPyValueRangeAnalysis.abs  s    ..q#66r/   c                6    t         j                  | t              S rG   )r%   r   r   r.  s    r0   expzSymPyValueRangeAnalysis.exp  s    ))!->??r/   c                    t         j                  |       } | j                  dk  rt         j                         S t         j	                  | t
              S r  )r%   rr   rJ   rn   r   r   r.  s    r0   logzSymPyValueRangeAnalysis.log  s@    Q77a<&&(())!->??r/   c                D    | j                  ||t        j                        S rG   )
min_or_maxr5   r   r   s      r0   minimumzSymPyValueRangeAnalysis.minimum      ~~aEII..r/   c                D    | j                  ||t        j                        S rG   )r6  r5   r   r   s      r0   maximumzSymPyValueRangeAnalysis.maximum  r8  r/   c                    t         j                  |       } t         j                  |      }t         j                  | ||      S rG   )r%   rr   r   )r   r   r   s      r0   r6  z"SymPyValueRangeAnalysis.min_or_max  s7    QQ88ArBBr/   c                    t         j                  |t        j                  j                  j
                  j                        S rG   )r%   r   r5   	functions
elementaryintegersfloorr   rt   r   s      r0   floor_to_intz$SymPyValueRangeAnalysis.floor_to_int  s+    ))!U__-G-G-P-P-V-VWWr/   c                    t         j                  |t        j                  j                  j
                  j                        S rG   )r%   r   r5   r=  r>  r?  ceilingrA  s      r0   ceil_to_intz#SymPyValueRangeAnalysis.ceil_to_int  s0    ))u))22::
 	
r/   c                    t         j                  |t        t        j                  j
                  j                  j                              S rG   )r%   r   r   r5   r=  r>  r?  r@  r   rt   s     r0   r@  zSymPyValueRangeAnalysis.floor  s5    )){5??55>>DDE
 	
r/   c                    t         j                  |t        t        j                  j
                  j                  j                              S rG   )r%   r   r   r5   r=  r>  r?  rD  rG  s     r0   ceilzSymPyValueRangeAnalysis.ceil#  s5    )){5??55>>FFG
 	
r/   c                    j                         st        j                         S j                  fd}t        j	                  ||      S )Nc                    t        |       S rG   )r   )numberndigitss    r0   r  z7SymPyValueRangeAnalysis.round_decimal.<locals>.<lambda>1  s    L9 r/   )r   r%   rn   rJ   r   )r   rL  rM  r   s     ` r0   round_decimalz%SymPyValueRangeAnalysis.round_decimal)  sA    ##%&&((-- :))&"55r/   c                6    t         j                  |t              S rG   )r%   r   r   )r   rL  r   s      r0   round_to_intz$SymPyValueRangeAnalysis.round_to_int5  s    ))&*==r/   c                    t         j                  |       } | j                  dk  rt         j                         S t         j	                  | t
              S r  )r%   rr   rJ   rn   r   r   r.  s    r0   sqrtzSymPyValueRangeAnalysis.sqrt:  s@    Q77Q;&&(())!-?@@r/   c                d   t         j                  |      }t         j                  |      }| j                         } |j                  |j                  k(  st         j	                         ||fv sJ |j                  r\t        t        j                  |j                  |j                        t        j                  |j                  |j                              S t        t        j                  |j                  |j                        t        j                  |j                  |j                              S rG   )r%   rr   rp   rO   rn   r5   r   rJ   r   rK   r   r   )r   r   r  s      r0   wherezSymPyValueRangeAnalysis.whereA  s    QQIIK yyAII%)<)<)>1a&)HHH99uyy!'':EHHQWWagg<VWWuyy!'':EIIaggqww<WXXr/   c                *    |j                         }| |fS rG   )rp   r   s     r0   expr_cond_pairz&SymPyValueRangeAnalysis.expr_cond_pairQ  s    IIK1vr/   c                 X    d }| D ]"  \  }}t         j                  |v s||}||z  }$ |S rG   )r5   r6   )ranges
init_range
expr_range
cond_ranges       r0   	piecewisez!SymPyValueRangeAnalysis.piecewise[  sD    
&, 	9"J
zzZ'%!+J!+j!8J	9 r/   c                    t        dd      S Ng      r,  r%   r.  s    r0   coszSymPyValueRangeAnalysis.cosf  s    
 4%%r/   c                6    t        dt        j                        S )Nr   r   r.  s    r0   coshzSymPyValueRangeAnalysis.coshm  s    3))r/   c                    t        dd      S r^  r_  r.  s    r0   sinzSymPyValueRangeAnalysis.siny  s     4%%r/   c                T    t        t        j                   t        j                        S rG   r   r.  s    r0   sinhzSymPyValueRangeAnalysis.sinh       EHH9ehh//r/   c                T    t        t        j                   t        j                        S rG   r   r.  s    r0   tanzSymPyValueRangeAnalysis.tan  r   r/   c                T    t        t        j                   t        j                        S rG   r   r.  s    r0   tanhzSymPyValueRangeAnalysis.tanh  rg  r/   c                T    t        t        j                   t        j                        S rG   r   r.  s    r0   asinzSymPyValueRangeAnalysis.asin  r   r/   c                T    t        t        j                   t        j                        S rG   r   r.  s    r0   acoszSymPyValueRangeAnalysis.acos  r   r/   c                T    t        t        j                   t        j                        S rG   r   r.  s    r0   atanzSymPyValueRangeAnalysis.atan  r   r/   c                6    t         j                  | t              S rG   )r%   r   r   r.  s    r0   trunczSymPyValueRangeAnalysis.trunc  s    ))!\::r/   rG   )8r+   r,   r-   __doc__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  r2  r4  r7  r:  r6  rB  rE  r@  rI  rN  rP  rR  rT  rV  r\  r`  rb  rd  rf  ri  rk  rm  ro  rq  rs  r.   r/   r0   r   r     s   
 # #J % % 9 9 8 8 I I J J 4 4 & & # # 8 8   & & & & 
 

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

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

 	6 	6 > > A A 
Y 
Y     & & 	 	 & &
 0 0 0 0 0 0     0 0 ; ;r/   r   c                      e Zd ZddZed        Zed        ZddZddZd Z	e
d        Zeddd	       Zed
        Zed        Ze
d        Ze
d        Zd Zy)r&   c                R    d| _         d}|D ]  }t        | || j                          y )Nr&   )xorlogical_and
logical_orlogical_not)namesetattrbool_handler)r\   boolean_operatorsops      r0   r`   zValueRangeAnalysis.__init__  s4    (	
 $ 	1BD"d//0	1r/   c                 R    t        t        j                  t        j                        S rG   r   r  kwargss     r0   r}  zValueRangeAnalysis.bool_handler  s     5;;

33r/   c                 *    t         j                         S rG   r(  r  s     r0   default_handlerz"ValueRangeAnalysis.default_handler  s     ""$$r/   c                *    t         j                         S rG   r(  )r\   r{  indexs      r0   loadzValueRangeAnalysis.load      ""$$r/   Nc                     y rG   r.   )r\   r{  r  r   modes        r0   storezValueRangeAnalysis.store  s    r/   c                *    t         j                         S rG   r(  )r\   r{  r   r   reduction_typer  r   s          r0   	reductionzValueRangeAnalysis.reduction  r  r/   c                J    t        |t              sJ | j                  ||      S rG   )r3   r%   r   )r   r  r   s      r0   
index_exprzValueRangeAnalysis.index_expr  s#    %---||E5))r/   c                   t         j                  |       } |t        j                  k(  r| j	                         r"t         j                  | j
                  dk7        S | j                  r| S d| vr#t         j                  t        j                        S t        t        j                  t        j                        S d }| j                  rV| j	                         r,| j
                  rdnd}t         j                   |||            S t         |d|       |d|            S t         || j
                  |       || j                  |            S )Nr   c                    |j                   rt        j                  |       S | t        t         fv r| S 	 t        j                  |       S # t
        $ r | cY S w xY wrG   )r   r5   r>   r"   r9   re   )rt   r   s     r0   castz)ValueRangeAnalysis.to_dtype.<locals>.cast  sU    &&{{1~%&))H ==++  Hs   A	 	AAr   )r%   rr   r   r4   r   rJ   rO   r5   r6   r7   rK   )rt   r   r   r  vals        r0   r   zValueRangeAnalysis.to_dtype  s    QEJJ~~"''155!"''

33"5;;

;;	 99~~77a"''S%(899"45>45>BB tAGGU3T!''55IJJr/   c                0    t         j                  | d       S )Nc                    t        | d      S )Nr   )r   r-  s    r0   r  z+ValueRangeAnalysis.square.<locals>.<lambda>  s    LA<N r/   )r%   r   r.  s    r0   squarezValueRangeAnalysis.square  s    ..q2NOOr/   c                J    t         j                  | t        j                        S rG   )r%   r   r   negr.  s    r0   r  zValueRangeAnalysis.neg  s    ))!X\\::r/   c                z    | j                  ||      }|t        j                         k(  r|S | j                  |      S rG   )r  r%   rn   rs  )r   r   r   rt   s       r0   truncdivzValueRangeAnalysis.truncdiv   s6    KK1##%%Hyy|r/   c                D    | j                  || j                  |            S rG   )r   r  r   s      r0   subzValueRangeAnalysis.sub  s    wwq#''!*%%r/   c                F    t         j                  d|       | j                  S )Nzunhandled ValueRange op %s)r4  debugr  )r\   r{  s     r0   __getattr__zValueRangeAnalysis.__getattr__  s    		.5###r/   )r   r   )r{  r   r  
sympy.ExprrG   )r   ztorch.dtyper   zOptional[torch.dtype])r+   r,   r-   r`   r   r}  r  r  r  r  r   r  r   r  r  r  r  r  r.   r/   r0   r&   r&     s    	1 4 4 % %
%% * * "K "KH P P ; ;   & &$r/   r&   c                    t         j                  d t         fd             t         t        j
                        rt        j                         S xs i t        j                  j                  j                         }|r:|j                  j                  r$i |j                  j                  j                   j                  j!                         z
  }|ri }|D ]v  }|j"                  rO|j$                  rt        dt&              }nF|j(                  rt        dt&              }n)t        j+                         }nt        j-                         }|||<   x i |t/        t0               S )Nzbound_sympy(%s)%sc                 b    r+ddj                   fdj                         D              z   S dS )N
c              3  R   K   | ]  \  }}|j                   v sd | d|    yw)z  r2   N)free_symbols).0kr   exprs      r0   	<genexpr>z0bound_sympy.<locals>.<lambda>.<locals>.<genexpr>  s3      "&!QAARAR<R"QCr!s   '' )joinitems)r  rX  s   r0   r  zbound_sympy.<locals>.<lambda>  s=     	 ii *0,,.  
  r/   r   r   )r4  r  r   r3   r5   r   r%   rr   r   _guardsTracingContexttry_get	fake_mode	shape_envvar_to_ranger  keysr   is_positiver"   is_nonnegativer   rn   r!   r   )r  rX  contextunbounded_varsunbounded_rangessrQ   s   ``     r0   r'   r'     sD    II	
 $%%%\rF mm**224G7$$..GG%%//<<GG&&6N =? 	%A||==$Q/B%%$Q/B$002B !((*"$Q	% 0F/.//>>r/   )rQ   ValueRanges[_T]r   z$TypeGuard[ValueRanges[SympyBoolean]])rQ   r  r   z"TypeGuard[ValueRanges[sympy.Expr]]rG   )r  r  rX  z)Optional[Dict[sympy.Symbol, ValueRanges]]r   r%   )O
__future__r   dataclassesr   loggingr;   r   typingr   r   r   r   r   r	   r
   r   r   typing_extensionsr   r5   sympy.logic.boolalgr   rH   r   r   torch._loggingr   torch._prims_commonr   r=  r   r   r   r   r   r   r   r   r   r   r   r   r   r    interpr!   numbersr"   r#   r$   	getLoggerr+   r4  __all__r?   r(   RuntimeErrorr*   rE   rL   rR   rT   r8   r:   r   r4   r   r   r   r   r   r   r   r   	dataclassr%   r   r&   r'   r.   r/   r0   <module>r     s   "     
 
 
 (  D  % -     ! = = g!
>T5::|,	l 	F2
) 
sE5::%	&	t\!	"ffn	5::,

*	+
EJJ

+UZZ7
8	<.,.	/
L,/=
>ffn	w	  d#j9'"+ j9 $j9Z	C; C;Lc$0 c$N KO-?
-?G-?-?r/   