
    PhX*                        d dl Z d dl mZ d dlmZmZmZ g dZ G d de j                        Z G d de j                        Z	 G d	 d
e j                        Z
 G d de j                        Z G d de      Z G d de j                        Z G d de j                        Z G d de j                        Z G d de j                        Z G d de j                        Z G d de j                        Zy)    N)S)	fuzzy_and	fuzzy_notfuzzy_or)	FloorDivModularIndexingCleanDivCeilDivPowTrueDivLShiftRShift!IsNonOverlappingAndDenseIndicatorc                   ^    e Zd ZdZdZdZdZed        Zed        Z	d Z
d Zd	 Zed
        Zy)r   z
    We maintain this so that:
    1. We can use divisibility guards to simplify FloorDiv(a, b) to a / b.
    2. Printing out the expression is nicer (compared to say, representing a//b as (a - a % b) / b)
       2   Tc                      | j                   d   S )Nr   argsselfs    gC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/utils/_sympy/functions.pybasezFloorDiv.base       yy|    c                      | j                   d   S N   r   r   s    r   divisorzFloorDiv.divisor   r   r   c                     |j                  | j                  | j                        }|j                  | j                  | j                        }d| d| dS )N(z//))parenthesizer   
precedencer    )r   printerr   r    s       r   	_sympystrzFloorDiv._sympystr    sK    ##DIIt?&&t||T__E4&7)1%%r   c                 l    t        | j                  j                  | j                  j                  g      S N)r   r   is_realr    r   s    r   _eval_is_realzFloorDiv._eval_is_real&   s&    **DLL,@,@ABBr   c                 l    t        | j                  j                  | j                  j                  g      S r)   )r   r   
is_integerr    r   s    r   _eval_is_integerzFloorDiv._eval_is_integer)   s&    $))..0G0GHIIr   c                 T   fd} |        |       j                   rt        d      j                   rt        j                  j                  S j
                  rdk(  rS j                  rdk(  rt        j                        S j
                  rdk(  rt        j                  d      S t        t        j                        rt        t        j                        rz  S t        t        j                  t        j                  f      rBt        t        j                  t        j                  f      rt        j                  z        S t        t              r)t        j                  d   j                  d   z        S t        t        j                        r1j                  dk(  r"t        j                  j                   z        S t        t        j"                        rCj                  D ]4  }t        j$                  |      }|k(  st        |z
        ||z  z   c S  	 t        j$                        }|dk7  r8t        t        j&                  |z        t        j&                  |z              S y # t        j(                  $ r Y y w xY w)Nc                     | j                   du r| j                  du r| j                  s| j                  r8t	        dt              j                   dt              j                   d      y )NFz%unsupported operand type(s) for //: 'z' and 'z', expected integer or real)r-   r*   
is_complex
is_Boolean	TypeErrortype__name__)xr   r    s    r   check_supported_typez+FloorDiv.eval.<locals>.check_supported_type0   sn    %!))u*<RSR^R^T
++,GDM4J4J3K L123 3 S_r   division by zeror   r   )is_zeroZeroDivisionErrorsympyr   Zeror-   r*   floorMul
isinstanceIntegerFloatr   r   RationalpqAddgcdsimplifyPolynomialError)clsr   r    r7   arG   s    ``   r   evalzFloorDiv.eval.   s   	3 	T"W% ??#$677<<77<<??w!|K<<GqL;;t$$??w"}99T2&&dEMM*z'5==/Q7?"dU]]EKK89jSXS`S`bgbmbmRn>o;;tg~..dH%DIIaL$))A,*@AAgu~~.799>;;tgii/00dEII&YYii7+'>#D1Hg6S@@ 
	))D'*CaxNN4#:.w}0M   $$ 		s   =AJ J'&J'N)r5   
__module____qualname____doc__nargsr%   r*   propertyr   r    r'   r+   r.   classmethodrL    r   r   r   r      se    
 EJ G   &CJ
 . .r   r   c                   (    e Zd ZdZdZdZed        Zy)r   z2
    ModularIndexing(a, b, c) => (a // b) % c
       Tc                 h   |dk(  s|dk(  rt        j                  d      S t        |t         j                        r<t        |t         j                        r"t        |t         j                        r||z  |z  S 	 |dk7  rTt        j                  ||      }|dk7  r9t	        t        j
                  ||z        t        j
                  ||z        |      S t        |t         j                        rg }d}|j                  D ]  }t        j                  |||z        ||z  k7  s#t        |t         j                        r|dk  sSt        |t         j                        r=t        |j                  d   t         j                        r|j                  d   dk  rd} n|j                  |        t        |      t        |j                        k7  r|rt	        t        |      ||      S t        |t              r*t	        |j                  d   |j                  d   |z  |      S y # t         j                  $ r Y `w xY w)Nr   r   TF)r<   rA   r@   rG   r   rH   rI   rF   r   r?   appendlensumr   )rJ   r   r    modulusrG   	new_termsall_positiveterms           r   rL   zModularIndexing.evalh   s   191==## tU]]+7EMM27EMM2GOw..	!|iig.!8*tcz2ENN7S=4QSZ  dEII&IL		99T7W#4579JJ"47D1H"43&tyy|U]]C IIaL1, (-!((. "  9~TYY/L&s9~wHHdH%"499Q<11GQQ &3 $$ 		s   7AH H10H1N)r5   rM   rN   rO   rP   r-   rR   rL   rS   r   r   r   r   `   s'     EJ,R ,Rr   r   c                   $    e Zd ZdZdZed        Zy)Wherez#
    Good ol' ternary operator
    rU   c                 X    |t         j                  k(  r|S |t         j                  k(  r|S y r)   )r<   truefalse)rJ   crD   rE   s       r   rL   z
Where.eval   s(    

?H%++H r   N)r5   rM   rN   rO   rP   rR   rL   rS   r   r   r`   r`      s      E r   r`   c                   6    e Zd ZdZdZed        Zd Zd Zd Z	y)Modz~
    We maintain this so that we avoid SymPy correctness issues, such as:
    https://github.com/sympy/sympy/issues/25146
    r   c                    |j                   rt        d      |t        j                  u s.|t        j                  u s|j                  du s|j                  du rt        j                  S |t        j
                  u s||| fv s|j                  r|dk(  rt        j
                  S |j                  r|j                  r||z  S |j                  r=|dk(  r8|j                  rt        j
                  S |j                  rt        j                  S ||z  }|j                  rt        j
                  S ||k  }|j                  rt        |      r|j                  r|S y y y )NzModulo by zeroFr   r   )r:   r;   r   NaN	is_finiter=   r-   	is_Numberis_evenis_oddOner2   boolis_positive)rJ   rD   rE   rlesss        r   rL   zMod.eval   s    99#$455:aeeq{{e';q{{e?S55L
 ;!A2w,1<<AF66M ;;1;;q5L ;;16yyvvxxuu E<<66M
 1u??tDzammH /<z?r   c                     | j                   \  }}t        |j                  |j                  t        |j                        g      S r)   )r   r   r-   r   r:   )r   rD   rE   s      r   r.   zMod._eval_is_integer   s2    yy1!,,i		6JKLLr   c                 <    | j                   d   j                  rdS d S Nr   T)r   ro   r   s    r   _eval_is_nonnegativezMod._eval_is_nonnegative       yy|//t9T9r   c                 <    | j                   d   j                  rdS d S rt   )r   is_negativer   s    r   _eval_is_nonpositivezMod._eval_is_nonpositive   rv   r   N)
r5   rM   rN   rO   rP   rR   rL   r.   ru   ry   rS   r   r   rf   rf      s1    
 E$ $LM::r   rf   c                       e Zd ZdZy)r	   zZ
    Div where we can assume no rounding.
    This is to enable future optimizations.
    N)r5   rM   rN   rO   rS   r   r   r	   r	      s    
 	r   r	   c                       e Zd ZdZdZd Zy)r
   z.
    Div used in indexing that rounds up.
    Tc                 p    t        j                  ||      |k(  rt        ||      S t        ||dz
  z   |      S r   )r<   rG   r	   r   rJ   r   r    s      r   __new__zCeilDiv.__new__   s8    99T7#w.D'**DGaK0'::r   N)r5   rM   rN   rO   r-   r~   rS   r   r   r
   r
      s     J;r   r
   c                       e Zd Zed        Zy)r   c                 2    |dk  rt        d      |d|z  z  S Nr   znegative shift countr   
ValueErrorrJ   r   shifts      r   rL   zLShift.eval   s$    19344a5j  r   Nr5   rM   rN   rR   rL   rS   r   r   r   r      s    ! !r   r   c                       e Zd Zed        Zy)r   c                 2    |dk  rt        d      |d|z  z  S r   r   r   s      r   rL   zRShift.eval   s$    19344qEz!!r   Nr   rS   r   r   r   r      s    " "r   r   c                       e Zd Zed        Zy)r   c                     |j                   rt        j                  d      S |j                   r|dk  rt        | d      ||z  S )Nr   r   z% cannot be raised to a negative power)r:   r<   rA   r;   )rJ   r   exps      r   rL   zPow.eval  sB    ;;==##\\cAg#tf,Q$RSS3;r   Nr   rS   r   r   r   r     s     r   r   c                       e Zd Zed        Zy)r   c                 :    |j                   rt        d      ||z  S )Nr8   )r:   r;   r}   s      r   rL   zTrueDiv.eval  s    ??#$677'>!r   Nr   rS   r   r   r   r     s    " "r   r   c                        e Zd ZdZed        Zy)r   Tc           	         t        |      dz  dk(  sJ t        |      dz  }t        d |D              rGddlm} |d| }||d  } ||D cg c]  }t	        |       c}|D cg c]  }t	        |       c}      S y c c}w c c}w )Nr   r   c              3   P   K   | ]  }t        |t        j                           y wr)   )r@   r<   rA   ).0rK   s     r   	<genexpr>z9IsNonOverlappingAndDenseIndicator.eval.<locals>.<genexpr>.  s     :Tz!U]]+Ts   $&)!eval_is_non_overlapping_and_dense)rY   all%torch.fx.experimental.symbolic_shapesr   int)rJ   r   dimr   	size_argsstride_argsrK   s          r   rL   z&IsNonOverlappingAndDenseIndicator.eval%  s    4y1}!!!$i1n :T::_QsIst*K4!*+AQ+!,-AQ-   ,-s   
A<"B
N)r5   rM   rN   r-   rR   rL   rS   r   r   r   r   "  s    J r   r   )r<   r   sympy.core.logicr   r   r   __all__Functionr   r   r`   rf   r	   r
   r   r   r   r   r   rS   r   r   <module>r      s      ; ;Ru~~ Rj5Renn 5RnENN 7:%.. 7:t	x 	;enn ;!U^^ !"U^^ "%.. "enn " r   