U
    •Ê¹j)  ã                   @   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/bwave/python/venv/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	ƒr„tˆtj	ƒr„ˆ ˆ S tˆ tj	tj
fƒr¶tˆtj	tj
fƒr¶t ˆ ˆ ¡S tˆ tƒrÚtˆ 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�r„t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r†t  ||¡}|dkr†tt  || ¡t  || ¡|ƒS t|t jƒ�rHg }d}|jD ]z}t  ||| ¡|| kr¢t|t jƒrÔ|dk �st|t jƒ�rt|jd t jƒ�r|jd dk �rd} �qq¢| 	|¡ q¢t
|ƒ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r–tjS |j	r¢tj
S || }|jr¶tjS ||k }|jrÖt|ƒ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:	