U
    ZÊ¹j
]  ã                   @   sÖ  d Z ddlmZmZ ddlmZmZmZmZm	Z	m
Z
 ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZ ddlm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z, ddlm-Z- ddl.m/Z/ dd	l0m1Z1 dd
l2m3Z3m4Z4m5Z5 ddl6m7Z7 ddl8m9Z9 ddl:m;Z; ddl<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZF dd„ ZGe= HeIe¡dd„ ƒZJe= Heeeeeeee¡dd„ ƒZJe= Ke¡dd„ ƒZJe= Hee	¡dd„ ƒZJe= Ke¡dd„ ƒZJe= Ke ¡dd„ ƒZJe= He3e7e5¡dd„ ƒZJe> Ke¡dd„ ƒZJe> Ke¡dd„ ƒZJe> Heeeeeee¡dd„ ƒZJe> Ke¡dd„ ƒZJe> Hee¡dd„ ƒZJe> Ke	¡d d„ ƒZJe> He#e$e%e+e,¡d!d„ ƒZJe> Ke'¡d"d„ ƒZJe> He"e&¡d#d„ ƒZJe> He!e)¡d$d„ ƒZJe? Ke¡d%d„ ƒZJe? Ke¡d&d„ ƒZJd'd(„ ZLe@ He eeee(eee*e¡	d)d„ ƒZJe@ Heee¡d*d„ ƒZJe@ Ke¡d+d„ ƒZJe@ Ke¡d,d„ ƒZJe@ Ke¡d-d„ ƒZJe@ Ke	¡d.d„ ƒZJe@ He%e+¡d/d„ ƒZJe@ Ke'¡d0d„ ƒZJe@ Ke)¡d1d„ ƒZJe@ He3e7e5¡d2d„ ƒZJeA KeM¡d3d„ ƒZJeA Hee¡d4d„ ƒZJeA Heee	¡d5d„ ƒZJeB KeM¡d6d„ ƒZJeB Ke¡d7d„ ƒZJeB Ke¡d8d„ ƒZJeB Ke	¡d9d„ ƒZJeB He%e+¡d:d„ ƒZJeB Ke'¡d;d„ ƒZJeB Ke4¡d<d„ ƒZJeC He e%e'e(ee)eee*e+¡
d=d„ ƒZJeC Hee¡d>d„ ƒZJeC Ke¡d?d„ ƒZJeC Hee¡d@d„ ƒZJeC Ke	¡dAd„ ƒZJeC He3e7e5¡dBd„ ƒZJeC Ke¡dCd„ ƒZJdDdE„ ZNeD Ke¡dFd„ ƒZJeD Ke¡dGd„ ƒZJeD Ke¡dHd„ ƒZJeD Ke¡dId„ ƒZJeD Ke	¡dJd„ ƒZJeD Ke)¡dKd„ ƒZJeD Ke'¡dLd„ ƒZJeD Hee¡dMd„ ƒZJeD Ke¡dNd„ ƒZJeE KeM¡dOd„ ƒZJeE Ke¡dPd„ ƒZJeE Ke¡dQd„ ƒZJeE Ke	¡dRd„ ƒZJeE Ke4¡dSd„ ƒZJeF Heeeee¡dTd„ ƒZJeF Heeeee¡dUd„ ƒZJeF Hee¡dVd„ ƒZJeF Ke	¡dWd„ ƒZJeF Ke¡dXd„ ƒZJeF He#e$e%e+e,¡dYd„ ƒZJeF Ke'¡dZd„ ƒZJeF He"e&¡d[d„ ƒZJeF He!e)¡d\d„ ƒZJd]S )^zL
Handlers for predicates related to set membership: integer, rational, etc.
é    )ÚQÚask)ÚAddÚBasicÚExprÚMulÚPowÚS)ÚAlgebraicNumberÚComplexInfinityÚExp1ÚFloatÚGoldenRatioÚImaginaryUnitÚInfinityÚIntegerÚNaNÚNegativeInfinityÚNumberÚNumberSymbolÚPiÚpiÚRationalÚTribonacciConstantÚE)Ú
fuzzy_bool)ÚAbsÚacosÚacotÚasinÚatanÚcosÚcotÚexpÚimÚlogÚreÚsinÚtan)ÚI)ÚEq)Ú	conjugate)ÚDeterminantÚ
MatrixBaseÚTrace)ÚMatrixElement)ÚMDNotImplementedErroré   )Útest_closed_groupé   )
ÚIntegerPredicateÚRationalPredicateÚIrrationalPredicateÚRealPredicateÚExtendedRealPredicateÚHermitianPredicateÚComplexPredicateÚImaginaryPredicateÚAntihermitianPredicateÚAlgebraicPredicatec                 C   s@   z$t |  ¡ ƒ}| |  d¡s t‚W dS  tk
r:   Y dS X d S )Nr   TF)ÚintÚroundÚequalsÚ	TypeError©ÚexprÚassumptionsÚi© rF   ú^/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/assumptions/handlers/sets.pyÚ_IntegerPredicate_number   s    rH   c                 C   s   dS ©NTrF   ©rC   rD   rF   rF   rG   Ú_(   s    rK   c                 C   s   dS ©NFrF   rJ   rF   rF   rG   rK   ,   s    c                 C   s   | j }|d krt‚|S ©N)Ú
is_integerr0   ©rC   rD   ÚretrF   rF   rG   rK   1   s    c                 C   s   | j rt| |ƒS t| |tjƒS )zw
    * Integer + Integer       -> Integer
    * Integer + !Integer      -> !Integer
    * !Integer + !Integer -> ?
    )Ú	is_numberrH   r2   r   ÚintegerrJ   rF   rF   rG   rK   8   s    
c                 C   s˜   | j rt| |ƒS d}| jD ]x}tt |¡|ƒs|jrj|jdkrVtt d|  ¡|ƒ  S |jd@  r’ dS qtt 	|¡|ƒrŒ|r„d}q’ dS q dS q|S )z™
    * Integer*Integer      -> Integer
    * Integer*Irrational   -> !Integer
    * Odd/Even             -> !Integer
    * Integer*Rational     -> ?
    Tr3   r1   NF)
rQ   rH   Úargsr   r   rR   Úis_RationalÚqÚevenZ
irrational)rC   rD   Ú_outputÚargrF   rF   rG   rK   C   s     


c                 C   s   t t | jd ¡|ƒS ©Nr   )r   r   rR   rS   rJ   rF   rF   rG   rK   _   s    c                 C   s   t t | jd ¡|ƒS rY   )r   r   Zinteger_elementsrS   rJ   rF   rF   rG   rK   c   s    c                 C   s   dS rI   rF   rJ   rF   rF   rG   rK   j   s    c                 C   s   d S rM   rF   rJ   rF   rF   rG   rK   n   s    c                 C   s   dS rL   rF   rJ   rF   rF   rG   rK   r   s    c                 C   s   | j }|d krt‚|S rM   )Zis_rationalr0   rO   rF   rF   rG   rK   w   s    c                 C   s$   | j r|  ¡ d rdS t| |tjƒS )z}
    * Rational + Rational     -> Rational
    * Rational + !Rational    -> !Rational
    * !Rational + !Rational   -> ?
    r1   F)rQ   Úas_real_imagr2   r   ÚrationalrJ   rF   rF   rG   rK   ~   s    c                 C   s†   | j tkr6| j}tt |¡|ƒr2tt |¡ |ƒS dS tt | j¡|ƒrZtt | j ¡|ƒS tt | j¡|ƒr‚tt | j ¡|ƒr‚dS dS )z�
    * Rational ** Integer      -> Rational
    * Irrational ** Rational   -> Irrational
    * Rational ** Irrational   -> ?
    NF)	Úbaser   r#   r   r   r[   ÚnonzerorR   Úprime©rC   rD   ÚxrF   rF   rG   rK   Š   s    
c                 C   s0   | j d }tt |¡|ƒr,tt |¡ |ƒS d S rY   ©rS   r   r   r[   r]   r_   rF   rF   rG   rK   �   s    
c                 C   s,   | j }tt |¡|ƒr(tt |¡ |ƒS d S rM   )r#   r   r   r[   r]   r_   rF   rF   rG   rK   £   s    c                 C   s"   | j d }tt |¡|ƒrdS d S ©Nr   F)rS   r   r   r[   r_   rF   rF   rG   rK   ©   s    
c                 C   s4   | j d }tt |¡|ƒr0tt |d ¡ |ƒS d S ©Nr   r1   ra   r_   rF   rF   rG   rK   ¯   s    
c                 C   s   | j }|d krt‚|S rM   )Zis_irrationalr0   rO   rF   rF   rG   rK   ¸   s    c                 C   s>   t t | ¡|ƒ}|r6t t | ¡|ƒ}|d kr0d S | S |S d S rM   )r   r   Úrealr[   )rC   rD   Z_realZ	_rationalrF   rF   rG   rK   ¿   s    c                 C   s&   |   ¡ d  d¡}|jdkr"| S d S )Nr1   r3   ©rZ   ZevalfZ_precrB   rF   rF   rG   Ú_RealPredicate_numberÍ   s    
rf   c                 C   s   dS rI   rF   rJ   rF   rF   rG   rK   Ö   s    c                 C   s   dS rL   rF   rJ   rF   rF   rG   rK   Û   s    c                 C   s   | j }|d krt‚|S rM   )Zis_realr0   rO   rF   rF   rG   rK   ß   s    c                 C   s   | j rt| |ƒS t| |tjƒS )zT
    * Real + Real              -> Real
    * Real + (Complex & !Real) -> !Real
    )rQ   rf   r2   r   rd   rJ   rF   rF   rG   rK   æ   s    
c                 C   sX   | j rt| |ƒS d}| jD ]4}tt |¡|ƒr0qtt |¡|ƒrJ|dA }q qTq|S dS )zx
    * Real*Real               -> Real
    * Real*Imaginary          -> !Real
    * Imaginary*Imaginary     -> Real
    TN)rQ   rf   rS   r   r   rd   Ú	imaginary)rC   rD   ÚresultrX   rF   rF   rG   rK   ð   s    


c                 C   sú  | j rt| |ƒS | jtkr@tt | jt t	 ¡t 
| j¡B |ƒS | jjtks`| jjrÎ| jjtkrÎtt | jj¡|ƒrŠtt | j¡|ƒrŠdS | jjt t	 }tt d| ¡|ƒrÊtt 
tj| | j ¡|ƒS dS tt | j¡|ƒ�rtt | j¡|ƒ�rtt | j¡|ƒ}|dk	�r| S dS tt | j¡|ƒ�rTtt t| jƒ¡|ƒ}|dk	�rT|S tt 
| j¡|ƒ�rött 
| j¡|ƒ�rö| jj�r®tt | jj¡|ƒ�r®tt | j¡|ƒS tt | j¡|ƒ�rÆdS tt | j¡|ƒ�rÞdS tt | j¡|ƒ�rödS dS )a×  
    * Real**Integer              -> Real
    * Positive**Real             -> Real
    * Real**(Integer/Even)       -> Real if base is nonnegative
    * Real**(Integer/Odd)        -> Real
    * Imaginary**(Integer/Even)  -> Real
    * Imaginary**(Integer/Odd)   -> not Real
    * Imaginary**Real            -> ? since Real could be 0 (giving real)
                                    or 1 (giving imaginary)
    * b**Imaginary               -> Real if log(b) is imaginary and b != 0
                                    and exponent != integer multiple of
                                    I*pi/log(b)
    * Real**Real                 -> ? e.g. sqrt(-1) is imaginary and
                                    sqrt(2) is not
    Tr3   NF)rQ   rf   r\   r   r   r   rR   r#   r)   r   rd   ÚfuncÚis_Powrg   r	   ÚNegativeOneÚoddr%   rT   rV   rU   ÚpositiveÚnegative)rC   rD   rE   rl   ÚimlogrF   rF   rG   rK     sJ    

 ÿ 


ÿc                 C   s   t t | jd ¡|ƒrdS d S ©Nr   T)r   r   rd   rS   rJ   rF   rF   rG   rK   D  s    c                 C   s&   t t | jt t ¡t | j¡B |ƒS rM   )r   r   rR   r#   r)   r   rd   rJ   rF   rF   rG   rK   I  s     ÿc                 C   s   t t | jd ¡|ƒS rY   )r   r   rm   rS   rJ   rF   rF   rG   rK   O  s    c                 C   s   t t | jd ¡|ƒS rY   )r   r   Zreal_elementsrS   rJ   rF   rF   rG   rK   S  s    c                 C   s8   t t | ¡t | ¡B t | ¡B t | ¡B t | ¡B |ƒS rM   )r   r   Znegative_infinitern   Úzerorm   Zpositive_infiniterJ   rF   rF   rG   rK   Z  s    
ÿþýüûc                 C   s   dS rI   rF   rJ   rF   rF   rG   rK   c  s    c                 C   s   t | |tjƒS rM   )r2   r   Zextended_realrJ   rF   rF   rG   rK   g  s    c                 C   s   t | tƒrd S tt | ¡|ƒS rM   )Ú
isinstancer-   r   r   rd   rJ   rF   rF   rG   rK   n  s    
c                 C   s   | j r
t‚t| |tjƒS )zZ
    * Hermitian + Hermitian  -> Hermitian
    * Hermitian + !Hermitian -> !Hermitian
    )rQ   r0   r2   r   Ú	hermitianrJ   rF   rF   rG   rK   t  s    c                 C   sz   | j r
t‚d}d}| jD ]X}tt |¡|ƒr6|dA }ntt |¡|ƒsJ qvtt |¡ |ƒr|d7 }|dkr qvq|S dS )zÒ
    As long as there is at most only one noncommutative term:

    * Hermitian*Hermitian         -> Hermitian
    * Hermitian*Antihermitian     -> !Hermitian
    * Antihermitian*Antihermitian -> Hermitian
    r   Tr1   N©rQ   r0   rS   r   r   Úantihermitianrs   Zcommutative©rC   rD   Znccountrh   rX   rF   rF   rG   rK   ~  s    	

c                 C   s^   | j r
t‚| jtkr.tt | j¡|ƒr*dS t‚tt | j¡|ƒrVtt | j¡|ƒrVdS t‚dS )z+
    * Hermitian**Integer -> Hermitian
    TN)	rQ   r0   r\   r   r   r   rs   r#   rR   rJ   rF   rF   rG   rK   —  s    
c                 C   s"   t t | jd ¡|ƒrdS t‚d S rp   )r   r   rs   rS   r0   rJ   rF   rF   rG   rK   §  s    c                 C   s   t t | j¡|ƒrdS t‚d S rI   )r   r   rs   r#   r0   rJ   rF   rF   rG   rK   ­  s    c              	   C   sz   | j \}}d}t|ƒD ]R}t||ƒD ]B}tt| ||f t| ||f ƒƒƒ}|d krVd }|dkr$  dS q$q|d krvt‚|S ©NTF©ÚshapeÚranger   r*   r+   r0   ©ZmatrD   ÚrowsÚcolsZret_valrE   ÚjZcondrF   rF   rG   rK   ³  s    
"c                 C   s   dS rI   rF   rJ   rF   rF   rG   rK   Å  s    c                 C   s   dS rL   rF   rJ   rF   rF   rG   rK   Ê  s    c                 C   s   | j }|d krt‚|S rM   )Z
is_complexr0   rO   rF   rF   rG   rK   Î  s    c                 C   s   t | |tjƒS rM   )r2   r   ÚcomplexrJ   rF   rF   rG   rK   Õ  s    c                 C   s   | j tkrdS t| |tjƒS rI   )r\   r   r2   r   r   rJ   rF   rF   rG   rK   Ù  s    
c                 C   s   t t | jd ¡|ƒS rY   )r   r   Zcomplex_elementsrS   rJ   rF   rF   rG   rK   ß  s    c                 C   s   d S rM   rF   rJ   rF   rF   rG   rK   ã  s    c                 C   s&   |   ¡ d  d¡}|jdkr"| S d S )Nr   r3   r1   re   )rC   rD   ÚrrF   rF   rG   Ú_Imaginary_numberê  s    
r�   c                 C   s   dS rI   rF   rJ   rF   rF   rG   rK   ó  s    c                 C   s   | j }|d krt‚|S rM   )Zis_imaginaryr0   rO   rF   rF   rG   rK   ÷  s    c                 C   sv   | j rt| |ƒS d}| jD ]4}tt |¡|ƒr0qtt |¡|ƒrJ|d7 }q qrq|dkr\dS |dt| jƒfkrrdS dS )zy
    * Imaginary + Imaginary -> Imaginary
    * Imaginary + Complex   -> ?
    * Imaginary + Real      -> !Imaginary
    r   r1   TFN©rQ   r�   rS   r   r   rg   rd   Úlen)rC   rD   ÚrealsrX   rF   rF   rG   rK   þ  s    


c                 C   sl   | j rt| |ƒS d}d}| jD ]2}tt |¡|ƒr<|dA }qtt |¡|ƒs qhq|t| jƒkrddS |S dS )zN
    * Real*Imaginary      -> Imaginary
    * Imaginary*Imaginary -> Real
    Fr   TNr‚   )rC   rD   rh   r„   rX   rF   rF   rG   rK     s    


c                 C   sø  | j rt| |ƒS | jtkrH| jt t }tt 	d| ¡t 	|¡ @ |ƒS | jj
tksh| jjrÒ| jjtkrÒtt | jj¡|ƒrÒtt | j¡|ƒr’dS | jjt t }tt 	d| ¡|ƒrÒtt tj| | j ¡|ƒS tt | j¡|ƒ�rtt 	| j¡|ƒ�rtt | j¡|ƒ}|dk	�r|S dS tt | j¡|ƒ�rVtt t| jƒ¡|ƒ}|dk	�rVdS tt | j¡t | j¡@ |ƒ�rôtt | j¡|ƒ�rŽdS tt | j¡|ƒ}|�sª|S tt 	| j¡|ƒ�rÂdS tt 	d| j ¡|ƒ}|�rðtt | j¡|ƒS |S dS )a¨  
    * Imaginary**Odd        -> Imaginary
    * Imaginary**Even       -> Real
    * b**Imaginary          -> !Imaginary if exponent is an integer
                               multiple of I*pi/log(b)
    * Imaginary**Real       -> ?
    * Positive**Real        -> Real
    * Negative**Integer     -> Real
    * Negative**(Integer/2) -> Imaginary
    * Negative**Real        -> not Imaginary if exponent is not Rational
    r3   FN)rQ   r�   r\   r   r#   r)   r   r   r   rR   ri   rj   rg   r	   rk   rl   r%   rd   rm   r[   rn   )rC   rD   ÚarE   rl   ro   ÚratZhalfrF   rF   rG   rK   +  sD    

  

 c                 C   s    t t | jd ¡|ƒr4t t | jd ¡|ƒr0dS d S | jd jtks`| jd jrz| jd jt	krz| jd jt
t
 fkrzdS t t | jd ¡|ƒ}|dkrœdS d S )Nr   FT)r   r   rd   rS   rm   ri   r#   rj   r\   r   r)   rg   )rC   rD   r$   rF   rF   rG   rK   c  s    ,c                 C   s.   | j t t }tt d| ¡t |¡ @ |ƒS )Nr3   )r#   r)   r   r   r   rR   )rC   rD   r…   rF   rF   rG   rK   t  s    c                 C   s   |   ¡ d dk S )Nr1   r   )rZ   rJ   rF   rF   rG   rK   y  s    c                 C   s   d S rM   rF   rJ   rF   rF   rG   rK   }  s    c                 C   s2   t | tƒrd S tt | ¡|ƒr"dS tt | ¡|ƒS rI   )rr   r-   r   r   rq   rg   rJ   rF   rF   rG   rK   „  s
    
c                 C   s   | j r
t‚t| |tjƒS )zr
    * Antihermitian + Antihermitian  -> Antihermitian
    * Antihermitian + !Antihermitian -> !Antihermitian
    )rQ   r0   r2   r   ru   rJ   rF   rF   rG   rK   Œ  s    c                 C   sz   | j r
t‚d}d}| jD ]X}tt |¡|ƒr6|dA }ntt |¡|ƒsJ qvtt |¡ |ƒr|d7 }|dkr qvq|S dS )zß
    As long as there is at most only one noncommutative term:

    * Hermitian*Hermitian         -> !Antihermitian
    * Hermitian*Antihermitian     -> Antihermitian
    * Antihermitian*Antihermitian -> !Antihermitian
    r   FTr1   Nrt   rv   rF   rF   rG   rK   –  s    	

c                 C   sz   | j r
t‚tt | j¡|ƒr4tt | j¡|ƒrrdS n>tt | j¡|ƒrrtt 	| j¡|ƒr\dS tt 
| j¡|ƒrrdS t‚dS )zˆ
    * Hermitian**Integer  -> !Antihermitian
    * Antihermitian**Even -> !Antihermitian
    * Antihermitian**Odd  -> Antihermitian
    FTN)rQ   r0   r   r   rs   r\   rR   r#   ru   rV   rl   rJ   rF   rF   rG   rK   ¯  s    c              	   C   s|   | j \}}d}t|ƒD ]T}t||ƒD ]D}tt| ||f t| ||f ƒ ƒƒ}|d krXd }|dkr$  dS q$q|d krxt‚|S rw   rx   r{   rF   rF   rG   rK   Â  s    
$c                 C   s   dS rI   rF   rJ   rF   rF   rG   rK   Ô  s    c                 C   s   dS rL   rF   rJ   rF   rF   rG   rK   Ù  s    c                 C   s   t | |tjƒS rM   )r2   r   Ú	algebraicrJ   rF   rF   rG   rK   Þ  s    c                 C   sN   | j tkr4tt | j¡|ƒr0tt | j¡ |ƒS d S | jjoLtt | j ¡|ƒS rM   )r\   r   r   r   r‡   r#   r]   rT   rJ   rF   rF   rG   rK   â  s
    
c                 C   s
   | j dkS rY   )rU   rJ   rF   rF   rG   rK   ê  s    c                 C   s0   | j d }tt |¡|ƒr,tt |¡ |ƒS d S rY   ©rS   r   r   r‡   r]   r_   rF   rF   rG   rK   î  s    
c                 C   s,   | j }tt |¡|ƒr(tt |¡ |ƒS d S rM   )r#   r   r   r‡   r]   r_   rF   rF   rG   rK   ô  s    c                 C   s"   | j d }tt |¡|ƒrdS d S rb   )rS   r   r   r‡   r_   rF   rF   rG   rK   ú  s    
c                 C   s4   | j d }tt |¡|ƒr0tt |d ¡ |ƒS d S rc   rˆ   r_   rF   rF   rG   rK      s    
N)OÚ__doc__Zsympy.assumptionsr   r   Z
sympy.corer   r   r   r   r   r	   Zsympy.core.numbersr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zsympy.core.logicr   Zsympy.functionsr   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   Zsympy.core.relationalr*   Z$sympy.functions.elementary.complexesr+   Zsympy.matricesr,   r-   r.   Z"sympy.matrices.expressions.matexprr/   Zsympy.multipledispatchr0   Úcommonr2   Zpredicates.setsr4   r5   r6   r7   r8   r9   r:   r;   r<   r=   rH   Zregister_manyr>   rK   Úregisterrf   Úobjectr�   rF   rF   rF   rG   Ú<module>   s`   L<0


   ÿ









  ÿ












	 ÿ



	

?










	





  ÿ








	




7






	



 ÿ

 ÿ









