
    PhS                        d dl Z d dlZd dlZd dlmZm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 d dlmZ ddlmZ  e	j(                  e      Zg dZ G d d	e      Zd
 Zd Z e j8                  d       G d d             Z G d d      Z G d de      Zddej@                  deeejB                  ef      defdZ"y)    N)BooleanAtomBoolean)UnionDictOptionalSupportsFloat)dtype_to_type   )sympy_interp)ValueRangesValueRangeAnalysisbound_sympyc                       e Zd Zy)ValueRangeErrorN)__name__
__module____qualname__     jC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/utils/_sympy/value_ranges.pyr   r      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 z: )
isinstanceboolsympytruefalseintIntegerfloatmathisinfooFloatExpr	is_numbernanr   AssertionErrortype)es    r   simple_sympifyr*      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 | xr |  S N)r   r   r$   SympyBooleanloweruppers     r   sympy_generic_ler1   1   sY    %$%,,,~ %.:e\3RRR'%i((r   T)frozenc                      e Zd ZU eej
                  ef   ed<   eej
                  ef   ed<   eed<   d Z	d Z
ddZddZdd	Zdef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y)r   r/   r0   is_boolc                 P   t        |      }t        |      }t        ||      st        d| d| d      t        j	                  | d|       t        j	                  | d|       t        j	                  | dt        |t                     t        |t              | j                  k(  sJ y )NzInvalid ranges [:]r/   r0   r4   )r*   r1   r   object__setattr__r   r-   r4   )selfr/   r0   s      r   __init__zValueRanges.__init__D   s    u%u%  u-!$4UG1UG1"EFF4%04%04Jul,KL%.$,,>>>r   c                 t    t        |      }t        | j                  |      xr t        || j                        S r,   )r*   r1   r/   r0   )r:   xs     r   __contains__zValueRanges.__contains__Q   s.    1

A.R3CAtzz3RRr   returnc                     | |z  S )z1Given two ValueRanges, returns their intersectionr   )r:   others     r   tightenzValueRanges.tightenU   s    e|r   c                 :   |t         j                         k(  r| S | t         j                         k(  r|S | 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 r,   )
r   unknownr4   r   Orr/   Andr0   MaxMinr:   rA   ranges      r   __and__zValueRanges.__and__Z   s    K''))K;&&((L||u}},;tUm;,<<U[[ A599TZZY^YdYdCefE   		$**ekk BEIIdjjZ_ZeZeDfgEr   c                 .   t         j                         | |fv rt         j                         S | 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 r,   )
r   rD   r4   r   rF   r/   rE   r0   rH   rG   rI   s      r   __or__zValueRanges.__or__g   s     T5M1&&((||u}},;tUm;,<<		$**ekk BEHHTZZY^YdYdDefE   		$**ekk BEIIdjjZ_ZeZeDfgEr   c                 4    | j                   | j                  k(  S r,   r.   )r:   s    r   is_singletonzValueRanges.is_singletonq   s    zzTZZ''r   c                 N     | t         j                   t         j                        S r,   )r   r"   )clss    r   rD   zValueRanges.unknownu   s    EHH9ehh''r   c                 >    t        |t              r|S t        ||      S r,   r   r   )rQ   args     r   wrapzValueRanges.wrapy   s    c;'J3$$r   c                 |    | j                  |      }t         ||j                         ||j                              S )z#Increasing: x <= y => f(x) <= f(y).rU   r   r/   r0   rQ   r=   fns      r   increasing_mapzValueRanges.increasing_map   .     HHQK2agg;17744r   c                 |    | j                  |      }t         ||j                         ||j                              S )z#Decreasing: x <= y => f(x) >= f(y).)rU   r   r0   r/   rX   s      r   decreasing_mapzValueRanges.decreasing_map   r[   r   c                     | j                  |      } ||j                        } ||j                        }t        t	        ||      t        ||            S )zIt's increasing or decreasing.)rU   r/   r0   r   minmax)rQ   r=   rY   lus        r   monotone_mapzValueRanges.monotone_map   sD     HHQKqwwKqwwK3q!9c!Qi00r   c           	          t         j                  |      }d|v r6t        dt         ||j                         ||j                                    S | j                  ||      S )z$Fn is convex and has a minimum at 0.r   )r   rU   r`   r/   r0   rc   rX   s      r   convex_min_zero_mapzValueRanges.convex_min_zero_map   sR     Q6q#bk2agg;"?@@##Ar**r   c                     | j                  |      | 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)
        rW   )rQ   r=   yrY   s       r   coordinatewise_increasing_mapz)ValueRanges.coordinatewise_increasing_map   sN     xx{CHHQK1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.)rU   	itertoolsproductr/   r0   r   r_   r`   )rQ   r=   rg   rY   abproductss          r   coordinatewise_monotone_mapz'ValueRanges.coordinatewise_monotone_map   s     xx{CHHQK1 "))177AGG*<qww>PQ
Q1 q!HQ 	 
 3x=#h-88	
s   (BN)r?   r   )r   r   r   r   r   r$   r-   __annotations__r   r;   r>   rB   rK   rM   rO   classmethodrD   rU   rZ   r]   rc   re   rh   ro   r   r   r   r   r   ;   s    
 \)**\)**M?S

(d ( ( ( % %
 5 5
 5 5
 1 1 + + 
 
 9 9r   r   c                      e Zd Z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%y")#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        t        t        f      }|s1t        | t        t
        j                  t
        j                  f      sJ t        | t              r)t        j                  |       rt        j                         S |rt        |      } ||       } nY|t        j                  k(  rt        | t              s6J |j                  r| j                   r| j"                  sJ | j$                  sJ t        j'                  |       S r,   )r   r   r   r   r   r   r   Numberr   r    isnanr   rD   r	   torchis_floating_point	is_finiteis_real
is_integerrU   )valuedtype	is_pythontype_s       r   constantz SymPyValueRangeAnalysis.constant   s     usE4&89	Ju{EMM5<<.XYYY e]+

50A&&((!%(E%LE 

"!%555(( ??emm;; ''''&&r   c                     t         j                  |       } | j                  sJ t         j                  | t        j
                        S r,   )r   rU   r4   r]   r   Not)rl   s    r   not_zSymPyValueRangeAnalysis.not_   s5    Qyyy))!UYY77r   c                 L    t         j                  | |t        j                        S r,   )r   rh   r   rE   rl   rm   s     r   or_zSymPyValueRangeAnalysis.or_   s    88AuxxHHr   c                 L    t         j                  | |t        j                        S r,   )r   rh   r   rF   r   s     r   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 r,   )r   rU   rO   r/   r   r   r0   r   r   s     r   eqzSymPyValueRangeAnalysis.eq   s    QQ>> 0QWW5G##EJJ//WWqww!''AGG"3##EKK005;;

33r   c                 D    | j                  | j                  ||            S r,   )r   r   rQ   rl   rm   s      r   nezSymPyValueRangeAnalysis.ne       xxq!%%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 r,   )
r   rU   r4   r   r   r0   r/   r   r   r   r   s      r   ltzSymPyValueRangeAnalysis.lt   s    QQyyAII%%%9988CHHQK++ww "''

33AGG#"''44u{{EJJ77r   c                 &    | j                  ||      S r,   )r   r   s      r   gtzSymPyValueRangeAnalysis.gt   s    vva|r   c                 D    | j                  | j                  ||            S r,   )r   r   r   s      r   lezSymPyValueRangeAnalysis.le  r   r   c                 D    | j                  | j                  ||            S r,   )r   r   r   s      r   gezSymPyValueRangeAnalysis.ge  r   r   c                 L    t         j                  | |t        j                        S r,   )r   rh   operatoraddr   s     r   r   zSymPyValueRangeAnalysis.add  s    88Ax||LLr   c                     t         j                  |      }t         j                  |      }|j                  |j                  k(  sJ |j                  r| j                  ||      S d }t         j	                  |||      S )Nc                 (    | dk(  r| S |dk(  r|S | |z  S Nr   r   r   s     r   safe_mulz-SymPyValueRangeAnalysis.mul.<locals>.safe_mul  s#    Ava1ur   )r   rU   r4   r   ro   )rQ   rl   rm   r   s       r   mulzSymPyValueRangeAnalysis.mul  sk    QQyyAII%%%9988Aq>!	 66q!XFFr   c                 &    | j                  ||      S r,   )truedivr   s      r   divzSymPyValueRangeAnalysis.div$  s    {{1a  r   c                 d   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        j                        S r   )r   rU   r   r"   rD   ro   r   r   r   s     r   r   zSymPyValueRangeAnalysis.truediv(  s    QQ6yA~QehhY!^uxx[\}&&((::1aAQAQRRr   c                 d   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        j                        S r   )r   rU   r   r"   rD   ro   r   floordivr   s     r   r   z SymPyValueRangeAnalysis.floordiv1  s    QQ6yA~QehhY!^uxx[\}&&((::1aARARSSr   c                 ~   t         j                  |       } t         j                  |      }| j                         rK|j                         r;|j                  dk7  r,t         j                  | j                  |j                  z        S |j                  dk  rt         j	                         S t        d|j
                        S r   )r   rU   rO   r/   rD   r0   )r=   rg   s     r   modzSymPyValueRangeAnalysis.mod:  s    QQ>> 0QWW\##AGGagg$56677a<&&((1agg&&r   c                 F    | j                  | j                  ||      |      S r,   )r   r   )rQ   rl   rm   cs       r   modular_indexingz(SymPyValueRangeAnalysis.modular_indexingD  s    wws||Aq)1--r   c                 *    t         j                         S r,   r   rD   )rQ   argss     r   &is_non_overlapping_and_dense_indicatorz>SymPyValueRangeAnalysis.is_non_overlapping_and_dense_indicatorH  s    ""$$r   c                    d }t         j                  |      }t         j                        j                         st         j                         S j                  |j                         rF|j                  }|z  }|j
                  st         j                         S t         j                  |      S dk(  r{|j                  j
                  st         j                         S |j                  j                  rt        j                  nt        j                  }t         j                   |d            S dk  r| j                  |      } |t         j                         k(  rt         j                         S  |      s<|j                  dk\  rt         j                  |fd      S t         j                         S dz  dk(  rt         j                  |fd      S t         j                  |fd      S )Nc                 Z    t        | t              xs t        | d      xr | j                  S )Nr{   )r   r   hasattrr{   )vals    r   r{   z/SymPyValueRangeAnalysis.pow.<locals>.is_integerN  s)    c3' \*=s~~r   r   r
   c                     | z  S r,   r   r=   rm   s    r   <lambda>z-SymPyValueRangeAnalysis.pow.<locals>.<lambda>v  	    qAvr      c                     | z  S r,   r   r   s    r   r   z-SymPyValueRangeAnalysis.pow.<locals>.<lambda>}  s	    AFr   c                     | z  S r,   r   r   s    r   r   z-SymPyValueRangeAnalysis.pow.<locals>.<lambda>  r   r   )r   rU   rO   rD   r/   ry   rz   r   r#   r   
reciprocalrZ   re   )rQ   rl   rm   r{   rr   s     `   r   powzSymPyValueRangeAnalysis.powL  s   	
 QQ ~~&&((GG>>AQA;;"**,,##A&&677$$"**,,#$77??EKKE##E!H--q5q!AA##%%&&(( !}ww!|"11!5EFF"**,, 1uz"66q:JKK #11!5EFFr   c                     t         j                  |       } d| v rt         j                         S t         j                  | d       S )zG Needed as it's used in pow, but it won't appear on a SymPy expression r   c                     d| z  S )Nr
   r   rg   s    r   r   z4SymPyValueRangeAnalysis.reciprocal.<locals>.<lambda>  s    1q5r   )r   rU   rD   r]   r=   s    r   r   z"SymPyValueRangeAnalysis.reciprocal  s=     Q6&&((--aAAr   c                 6    t         j                  | t              S r,   )r   re   absr   s    r   r   zSymPyValueRangeAnalysis.abs  s    ..q#66r   c                     t         j                  | t        j                  j                  j
                  j                        S r,   )r   rZ   r   	functions
elementaryexponentialexpr   s    r   r   zSymPyValueRangeAnalysis.exp  s+    ))!U__-G-G-S-S-W-WXXr   c                     t         j                  |       } | j                  dk  rt         j                         S t         j	                  | t
        j                        S r   )r   rU   r/   rD   rZ   r   logr   s    r   r   zSymPyValueRangeAnalysis.log  sC    Q77a<&&(())!UYY77r   c                 D    | j                  ||t        j                        S r,   )
min_or_maxr   rH   r   s      r   minimumzSymPyValueRangeAnalysis.minimum      ~~aEII..r   c                 D    | j                  ||t        j                        S r,   )r   r   rG   r   s      r   maximumzSymPyValueRangeAnalysis.maximum  r   r   c                     t         j                  |       } t         j                  |      }fd}t         j                  | ||      S )Nc                 V   | j                   r|j                   rt        j                  }nk| j                  r|j                  rt        j                  }nB| j
                  s&| j                  r|j
                  s|j                  rJ t        j                  }  ||        ||            S r,   )
is_Integerr   r   is_rationalRationalrz   ry   r#   )r=   rg   result_typerY   s      r   fn_z/SymPyValueRangeAnalysis.min_or_max.<locals>.fn_  sn     ||#mm1==#nnyyqyySS#kkk!nk!n55r   )r   rU   rh   )rl   rm   rY   r   s     ` r   r   z"SymPyValueRangeAnalysis.min_or_max  s?    QQ
	6 88AsCCr   c                     t         j                  |t        j                  j                  j
                  j                        S r,   )r   rZ   r   r   r   integersfloorrQ   r=   s     r   r   zSymPyValueRangeAnalysis.floor  s+    ))!U__-G-G-P-P-V-VWWr   c                     t         j                  |t        j                  j                  j
                  j                        S r,   )r   rZ   r   r   r   r   ceilingr   s     r   ceilzSymPyValueRangeAnalysis.ceil  s+    ))!U__-G-G-P-P-X-XYYr   c                     t         j                  |       } | j                  dk  rt         j                         S t         j	                  | t
        j                        S r   )r   rU   r/   rD   rZ   r   sqrtr   s    r   r   zSymPyValueRangeAnalysis.sqrt  sC    Q77Q;&&(())!UZZ88r   c                 0   t         j                  |      }t         j                  |      }| j                  sJ |j                  |j                  k(  sJ |j                  r\t        t        j                  |j
                  |j
                        t        j                  |j                  |j                              S t        t        j                  |j
                  |j
                        t        j                  |j                  |j                              S r,   )
r   rU   r4   r   rF   r/   rE   r0   rH   rG   )rl   rm   r   s      r   wherezSymPyValueRangeAnalysis.where  s    QQyyyyyAII%%%99uyy!'':EHHQWWagg<VWWuyy!'':EIIaggqww<WXXr   c                 6    |j                   s
J d|        | |fS )Nz<expect cond_expr's ValueRange to be a boolean range but got )r4   r   s     r   expr_cond_pairz&SymPyValueRangeAnalysis.expr_cond_pair  s&    yy\XYZX[\\y1vr   c                  X    d }| D ]"  \  }}t         j                  |v s||}||z  }$ |S r,   )r   r   )ranges
init_range
expr_range
cond_ranges       r   	piecewisez!SymPyValueRangeAnalysis.piecewise  s?    
&,"J
zzZ'%!+J!+j!8J '- r   N)&r   r   r   __doc__staticmethodr   r   r   r   r   rq   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   rs   rs      s   
 ' '4 8 8
 I I J J 4 4 & & 8 8   & & & & M M G G& ! ! S S T T ' ' . . % % 3G 3Gj B B 7 7 Y Y 8 8 / / / / D D& X X Z Z 9 9 Y Y    r   rs   c                       e Zd Zd Zed        Zed        Zdedej                  fdZ
ddZd	 Zd
 Zeddej                  deej                     f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      r   r;   zValueRangeAnalysis.__init__  s/    (	
 $BD"d//0 $r   c                  R    t        t        j                  t        j                        S r,   )r   r   r   r   r   kwargss     r   r   zValueRangeAnalysis.bool_handler  s     5;;

33r   c                  *    t         j                         S r,   r   r   s     r   default_handlerz"ValueRangeAnalysis.default_handler  s     ""$$r   r   indexc                 *    t         j                         S r,   r   )r:   r   r   s      r   loadzValueRangeAnalysis.load      ""$$r   Nc                      y r,   r   )r:   r   r   r|   modes        r   storezValueRangeAnalysis.store  s    r   c                 *    t         j                         S r,   r   )r:   r   r}   	src_dtypereduction_typer   r|   s          r   	reductionzValueRangeAnalysis.reduction  r   r   c                 *    t        |t              sJ |S r,   rS   )r:   r   r}   s      r   
index_exprzValueRangeAnalysis.index_expr
  s    %---r   r}   r  c                 z   t         j                  |       } |t        j                  k(  r| j	                         r"t         j                  | j
                  dk7        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        j                  |       S # t        $ r | cY S w xY wr,   )rx   r   r#   r   	TypeError)r=   r}   s     r   castz)ValueRangeAnalysis.to_dtype.<locals>.cast  sA    &&{{1~% ==++  Hs   8 AAr
   )r   rU   rw   r   rO   r/   r   r   r   r4   r0   )r=   r}   r  r  r   s        r   to_dtypez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                     | | z  S r,   r   r   s    r   r   z+ValueRangeAnalysis.square.<locals>.<lambda>1  s    AEr   )r   re   r   s    r   squarezValueRangeAnalysis.square/  s    ..q/BBr   c                 J    t         j                  | t        j                        S r,   )r   r]   r   negr   s    r   r  zValueRangeAnalysis.neg3  s    ))!X\\::r   c                     | j                  ||      }|t        j                         k(  r|S d }t        j                  ||      S )Nc                 H    | j                   rt        j                  |       S | S r,   )ry   r   r   r   s    r   truncz*ValueRangeAnalysis.truncdiv.<locals>.trunc=  s    '({{5==#99r   )r   r   rD   rZ   )rQ   rl   rm   r=   r  s        r   truncdivzValueRangeAnalysis.truncdiv7  sB    KK1##%%H	: ))!U33r   c                 D    | j                  || j                  |            S r,   )r   r  r   s      r   subzValueRangeAnalysis.subB  s    wwq#''!*%%r   c                 F    t         j                  d|       | j                  S )Nzunhandled ValueRange op %s)r   debugr   )r:   r   s     r   __getattr__zValueRangeAnalysis.__getattr__F  s    		.5###r   r,   )r   r   r   r;   r   r   r   strr   r$   r   r  r  r  rw   r}   r   r  r  r  rq   r  r  r  r   r   r   r   r     s    	1 4 4 % %
% %UZZ %% K5;; K8EKK3H K K@ C C ; ; 4 4 & &$r   r   exprr   r?   c                 f   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
  }|rii }|D ]\  }|j                  sJ |j                  rd}n |j                   rd}nt"        j$                   }t        |t"        j$                        ||<   ^ i ||}t'        t(        ||       S )Nr
   r   )r   r   ru   r   rU   rw   _guardsTracingContexttry_get	fake_mode	shape_envvar_to_rangefree_symbolskeysr{   is_positiveis_nonnegativer    infr   rs   )r  r   contextunbounded_varsunbounded_rangessr/   s          r   r   r   K  s
   $%%%\rF mm**224G7$$..GFGg//99FFG&&6N =?A<<<}}!!	"-eTXX">Q   0F/.//>>r   r,   )#dataclassesrj   r   sympy.logic.boolalgr   r   r-   r   r    loggingrw   typingr   r   r   r   torch._prims_commonr	   interpr   	getLoggerr   r   __all__RuntimeErrorr   r*   r1   	dataclassr   rs   r   r$   Symbolr   r   r   r   <module>r8     s       D     7 7 -  g!
>	l 	F2) d#w9 w9 $w9rr rj	^$0 ^$B?ejj ?(4k8Q3R*S ?_j ?r   