o
    h)                     @   s   d dl Z d dl mZ d dlmZmZmZ g dZG dd de jZG dd de jZ	G d	d
 d
e jZ
G dd de jZG dd deZG dd de jZG dd de jZG dd de jZdS )    N)S)	fuzzy_and	fuzzy_notfuzzy_or)FloorDivModularIndexingCleanDivCeilDivLShiftRShiftc                   @   sX   e Zd ZdZdZdZdZedd Zedd Z	d	d
 Z
dd Zdd Zedd ZdS )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                 C   
   | j d S )Nr   argsself r   R/var/www/html/ai/venv/lib/python3.10/site-packages/torch/utils/_sympy/functions.pybase      
zFloorDiv.basec                 C   r   N   r   r   r   r   r   divisor   r   zFloorDiv.divisorc                 C   s2   | | j| j}| | j| j}d| d| dS )N(z//))parenthesizer   
precedencer   )r   printerr   r   r   r   r   	_sympystr   s   zFloorDiv._sympystrc                 C      t | jj| jjgS N)r   r   is_realr   r   r   r   r   _eval_is_real#      zFloorDiv._eval_is_realc                 C   r!   r"   )r   r   
is_integerr   r   r   r   r   _eval_is_integer&   r%   zFloorDiv._eval_is_integerc                    s|   fdd}|  | j rtd j rtjjS  jr&dkr& S  jr2dkr2t S t tj	rBttj	rB  S t tj	tj
fr[ttj	tj
fr[t  S t trmt jd  jd  S ttjrjdkrt j S t tjr jD ]}t|}|krt | ||    S qt }|dkrtt | t| S d S )Nc                    sF   | j du r| jdu r| js| jr!tdt j dtj dd S )NFz%unsupported operand type(s) for //: 'z' and 'z', expected integer or real)r&   r#   
is_complex
is_Boolean	TypeErrortype__name__)xr   r   r   r   check_supported_type-   s    z+FloorDiv.eval.<locals>.check_supported_typezdivision by zeror   r   )is_zeroZeroDivisionErrorsympyr   Zeror&   r#   floor
isinstanceIntegerFloatr   r   RationalpqAddgcdsimplify)clsr   r   r/   ar<   r   r.   r   eval+   s>   
$

zFloorDiv.evalN)r,   
__module____qualname____doc__nargsr   r#   propertyr   r   r    r$   r'   classmethodr@   r   r   r   r   r      s    

r   c                   @   s$   e Zd ZdZdZdZedd ZdS )r   z2
    ModularIndexing(a, b, c) => (a // b) % c
       Tc                 C   s`  |dks|dkrt dS t|t jr%t|t jr%t|t jr%|| | S |dkrCt ||}|dkrCtt || t || |S t|t jrg }d}|jD ]7}t ||| || krt|t jrh|dk s~t|t jrt|jd t jr|jd dk rd} n|	| qPt
|t
|jkr|rtt|||S t|trt|jd |jd | |S d S )Nr   r   TF)r2   r6   r5   r<   r   r=   r;   r   Mulappendlensumr   )r>   r   r   modulusr<   	new_termsall_positivetermr   r   r   r@   `   sF   







zModularIndexing.evalN)r,   rA   rB   rC   rD   r&   rF   r@   r   r   r   r   r   X   s    r   c                   @   s    e Zd ZdZdZedd ZdS )Wherez#
    Good ol' ternary operator
    rG   c                 C   s    |t jkr|S |t jkr|S d S r"   )r2   truefalse)r>   cr9   r:   r   r   r   r@      s
   

z
Where.evalN)r,   rA   rB   rC   rD   rF   r@   r   r   r   r   rQ      s
    rQ   c                   @   s8   e Zd ZdZdZedd Zdd Zdd Zd	d
 Z	dS )Modz~
    We maintain this so that we avoid SymPy correctness issues, such as:
    https://github.com/sympy/sympy/issues/25146
    r   c                 C   s   |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 s1||| fv s1|jr4|dkr4tjS |jr>|jr>|| S |jrQ|dkrQ|jrKtjS |j	rQtj
S || }|jr[tjS ||k }|jrkt|rm|jro|S d S d S d S )NzModulo by zeroFr   r   )r0   r1   r   NaN	is_finiter3   r&   	is_Numberis_evenis_oddOner)   boolis_positive)r>   r9   r:   rlessr   r   r   r@      s(   (&zMod.evalc                 C   s"   | j \}}t|j|jt|jgS r"   )r   r   r&   r   r0   )r   r9   r:   r   r   r   r'      s   
zMod._eval_is_integerc                 C      | j d jrdS d S Nr   T)r   r]   r   r   r   r   _eval_is_nonnegative   r%   zMod._eval_is_nonnegativec                 C   r`   ra   )r   is_negativer   r   r   r   _eval_is_nonpositive   r%   zMod._eval_is_nonpositiveN)
r,   rA   rB   rC   rD   rF   r@   r'   rb   rd   r   r   r   r   rU      s    
&rU   c                   @   s   e Zd ZdZdS )r   zZ
    Div where we can assume no rounding.
    This is to enable future optimizations.
    N)r,   rA   rB   rC   r   r   r   r   r      s    r   c                   @   s   e Zd ZdZdZdd ZdS )r	   z.
    Div used in indexing that rounds up.
    Tc                 C   s,   t |||krt||S t||d  |S r   )r2   r<   r   r   )r>   r   r   r   r   r   __new__   s   
zCeilDiv.__new__N)r,   rA   rB   rC   r&   re   r   r   r   r   r	      s    r	   c                   @      e Zd Zedd ZdS )r
   c                 C   s   |dk rt d|d|  S Nr   znegative shift countr   
ValueErrorr>   r   shiftr   r   r   r@         zLShift.evalNr,   rA   rB   rF   r@   r   r   r   r   r
          r
   c                   @   rf   )r   c                 C   s   |dk rt d|d|  S rg   rh   rj   r   r   r   r@      rl   zRShift.evalNrm   r   r   r   r   r      rn   r   )r2   r   sympy.core.logicr   r   r   __all__Functionr   r   rQ   rU   r   r	   r
   r   r   r   r   r   <module>   s    P4:	