a
    <b
]                     @   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 ZJeAKeMd3d ZJeAHeed4d ZJeAHeee	d5d ZJeBKeMd6d ZJeBKed7d ZJeBKed8d ZJeBKe	d9d ZJeBHe%e+d:d ZJeBKe'd;d ZJeBKe4d<d ZJeCHe e%e'e(ee)eee*e+
d=d ZJeCHeed>d ZJeCKed?d ZJeCHeed@d ZJeCKe	dAd ZJeCHe3e7e5dBd ZJeCKedCd ZJdDdE ZNeDKedFd ZJeDKedGd ZJeDKedHd ZJeDKedId ZJeDKe	dJd ZJeDKe)dKd ZJeDKe'dLd ZJeDHeedMd ZJeDKedNd ZJeEKeMdOd ZJeEKedPd ZJeEKedQd ZJeEKe	dRd ZJeEKe4dSd ZJeFHeeeeedTd ZJeFHeeeeedUd ZJeFHeedVd ZJeFKe	dWd ZJeFKedXd ZJeFHe#e$e%e+e,dYd ZJeFKe'dZd ZJeFHe"e&d[d ZJeFHe!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y8   Y dS 0 d S )Nr   TF)introundequals	TypeErrorexprassumptionsi rF   o/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/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 u 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|rd}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 u 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|rtt| j |rd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 u rt|S rM   )Zis_irrationalr0   rO   rF   rF   rG   rK      s    c                 C   s>   t t| |}|r6t t| |}|d u 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 u 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rtt| jj|rtt| j|rdS | jjt t	 }ttd| |rtt
tj| | j |S dS tt| j|rtt| j|rtt| j|}|dur| S dS tt| j|rTttt| j|}|durT|S tt
| j|rtt
| j|r| jjrtt| jj|rtt| j|S tt| j|rdS tt| j|rdS tt| j|rd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     sH    

  


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 u rVd }|dkr$  dS q$q|d u rvt|S NTFshaperanger   r*   r+   r0   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 u 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 u 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v 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rtt| jj|rtt| j|rdS | jjt t }tt	d| |rtttj| | j |S tt| j|rtt	| j|rtt| j|}|dur|S dS tt| j|rVttt| j|}|durVdS tt| jt| j@ |rtt| j|rdS tt| j|}|s|S tt	| j|rdS tt	d| j |}|rt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   Z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v rzdS t t| jd |}|du rd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 u rXd }|dkr$  dS q$q|d u 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>   sL   L<0







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