U
    9%e)                     @   s   d dl Z d dl mZ d dlmZmZmZ dddddd	g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   s
   | j d S )Nr   argsself r   [/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/torch/utils/_sympy/functions.pybase   s    zFloorDiv.basec                 C   s
   | j d S N   r   r   r   r   r   divisor   s    zFloorDiv.divisorc                 C   s2   | | j| j}| | j| j}d| d| dS )N(z//))Zparenthesizer   
precedencer   )r   printerr   r   r   r   r   	_sympystr   s    zFloorDiv._sympystrc                 C   s   t | jj| jjgS N)r   r   is_realr   r   r   r   r   _eval_is_real#   s    zFloorDiv._eval_is_realc                 C   s   t | jj| jjgS r   )r   r   
is_integerr   r   r   r   r   _eval_is_integer&   s    zFloorDiv._eval_is_integerc                    s   fdd}|  | j r,td j r:tjjS  jrLdkrL S  jrddkrdt S t tj	rttj	r  S t tj	tj
frttj	tj
frt  S t trt jd  jd  S ttjrjdkrt j S t tjrP jD ]6}t|}|krt | ||    S qt }|dkrtt | t| S d S )Nc                    sF   | j dkr| jdkr| js | jrBtdt j dtj dd S )NFz%unsupported operand type(s) for //: 'z' and 'z', expected integer or real)r!   r   Z
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)   ar6   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   

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   st  |dks|dkrt dS t|t jrJt|t jrJt|t jrJ|| | S |dkrt ||}|dkrtt || t || |S t|t jrHg }d}|jD ]z}t ||| || krt|t jr|dk st|t jrt|jd t jr|jd dk rd} qq|	| qt
|t
|jkrH|rHtt|||S t|trpt|jd |jd | |S d S )Nr   r   TF)r,   r0   r/   r6   r   r7   r5   r   ZMulappendlensumr   )r8   r   r   modulusr6   Z	new_termsZall_positivetermr   r   r   r:   `   sH    



  

	zModularIndexing.evalN)r&   r;   r<   r=   r>   r!   r@   r:   r   r   r   r   r   X   s
   c                   @   s    e Zd ZdZdZedd ZdS )Wherez#
    Good ol' ternary operator
    rA   c                 C   s    |t jkr|S |t jkr|S d S r   )r,   truefalse)r8   cr3   r4   r   r   r   r:      s    

z
Where.evalN)r&   r;   r<   r=   r>   r@   r:   r   r   r   r   rH      s   rH   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ks6|tjks6|jdks6|jdkr<tjS |tjksb||| fksb|jrh|dkrhtjS |jr||jr||| S |jr|dkr|jrtjS |j	rtj
S || }|jrtjS ||k }|jrt|r|jr|S d S )NzModulo by zeroFr   r   )r*   r+   r   NaN	is_finiter-   r!   Z	is_NumberZis_evenZis_oddZOner#   boolis_positive)r8   r3   r4   rlessr   r   r   r:      s&    (&zMod.evalc                 C   s"   | j \}}t|j|jt|jgS r   )r   r   r!   r   r*   )r   r3   r4   r   r   r   r"      s    
zMod._eval_is_integerc                 C   s   | j d jrdS d S Nr   T)r   rP   r   r   r   r   _eval_is_nonnegative   s    zMod._eval_is_nonnegativec                 C   s   | j d jrdS d S rS   )r   Zis_negativer   r   r   r   _eval_is_nonpositive   s    zMod._eval_is_nonpositiveN)
r&   r;   r<   r=   r>   r@   r:   r"   rT   rU   r   r   r   r   rL      s   
&rL   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&   r;   r<   r=   r   r   r   r   r      s   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   s0   t |||krt||S t||d  |S d S r   )r,   r6   r   r   )r8   r   r   r   r   r   __new__   s    
zCeilDiv.__new__N)r&   r;   r<   r=   r!   rV   r   r   r   r   r	      s   c                   @   s   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r8   r   shiftr   r   r   r:      s    zLShift.evalNr&   r;   r<   r@   r:   r   r   r   r   r
      s   c                   @   s   e Zd Zedd ZdS )r   c                 C   s   |dk rt d|d|  S rW   rX   rZ   r   r   r   r:      s    zRShift.evalNr\   r   r   r   r   r      s   )r,   r   Zsympy.core.logicr   r   r   __all__Functionr   r   rH   rL   r   r	   r
   r   r   r   r   r   <module>   s   P4:	