
    wg$                        d dl mZ d dlmZ d dlmZmZmZmZm	Z	m
Z
 d dlmZ d dlmZ d dlmZmZmZmZ d dlmZ d Zd	 Zd
 Z G d d      Z e       Z e
d      Zej9                  e      d        Zej9                  e      d        Zej=                  e      d        Zej9                  e      d        Zej=                  e      d        Zej=                  e      d        Zej=                  e      d        Zej=                  e      d        Zej=                  e      d        Zej9                  e      d        Zej>                  d ej@                  d ejB                  d ejD                  d ejF                  d ejH                  d ejJ                  d ejL                  d ejN                  d  ejP                  d! i
Z)ej9                  ee	e      d"        Zy#)$    )defaultdict)Q)AddMulPowNumberNumberSymbolSymbol)ImaginaryUnit)Abs)
EquivalentAndOrImplies)MatMulc           	      l    t        |j                  D cg c]  }|j                  | |       c} S c c}w )a  
    Apply all arguments of the expression to the fact structure.

    Parameters
    ==========

    symbol : Symbol
        A placeholder symbol.

    fact : Boolean
        Resulting ``Boolean`` expression.

    expr : Expr

    Examples
    ========

    >>> from sympy import Q
    >>> from sympy.assumptions.sathandlers import allargs
    >>> from sympy.abc import x, y
    >>> allargs(x, Q.negative(x) | Q.positive(x), x*y)
    (Q.negative(x) | Q.positive(x)) & (Q.negative(y) | Q.positive(y))

    )r   argssubssymbolfactexprargs       b/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/sympy/assumptions/sathandlers.pyallargsr      s,    2 499=C63'=>>=   1c           	      l    t        |j                  D cg c]  }|j                  | |       c} S c c}w )a  
    Apply any argument of the expression to the fact structure.

    Parameters
    ==========

    symbol : Symbol
        A placeholder symbol.

    fact : Boolean
        Resulting ``Boolean`` expression.

    expr : Expr

    Examples
    ========

    >>> from sympy import Q
    >>> from sympy.assumptions.sathandlers import anyarg
    >>> from sympy.abc import x, y
    >>> anyarg(x, Q.negative(x) & Q.positive(x), x*y)
    (Q.negative(x) & Q.positive(x)) | (Q.negative(y) & Q.positive(y))

    )r   r   r   r   s       r   anyargr   +   s,    2 $))<3		&#&<==<r   c                    |j                   D cg c]  }|j                  | |       }}t        t        t	        |            D cg c],  }t        ||   g|d| ||dz   d z   D cg c]  }|  c} . c}} }|S c c}w c c}w c c}}w )a  
    Apply exactly one argument of the expression to the fact structure.

    Parameters
    ==========

    symbol : Symbol
        A placeholder symbol.

    fact : Boolean
        Resulting ``Boolean`` expression.

    expr : Expr

    Examples
    ========

    >>> from sympy import Q
    >>> from sympy.assumptions.sathandlers import exactlyonearg
    >>> from sympy.abc import x, y
    >>> exactlyonearg(x, Q.positive(x), x*y)
    (Q.positive(x) & ~Q.positive(y)) | (Q.positive(y) & ~Q.positive(x))

    N   )r   r   r   rangelenr   )r   r   r   r   	pred_argsilitress           r   exactlyoneargr'   G   s    2 4899=C63'=I=
#(Y#8: 9Q< 9Ra=!A#$4 #CC4 #  : ;CJ ># :s   A>B
%
B/B
B
c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)ClassFactRegistrya  
    Register handlers against classes.

    Explanation
    ===========

    ``register`` method registers the handler function for a class. Here,
    handler function should return a single fact. ``multiregister`` method
    registers the handler function for multiple classes. Here, handler function
    should return a container of multiple facts.

    ``registry(expr)`` returns a set of facts for *expr*.

    Examples
    ========

    Here, we register the facts for ``Abs``.

    >>> from sympy import Abs, Equivalent, Q
    >>> from sympy.assumptions.sathandlers import ClassFactRegistry
    >>> reg = ClassFactRegistry()
    >>> @reg.register(Abs)
    ... def f1(expr):
    ...     return Q.nonnegative(expr)
    >>> @reg.register(Abs)
    ... def f2(expr):
    ...     arg = expr.args[0]
    ...     return Equivalent(~Q.zero(arg), ~Q.zero(expr))

    Calling the registry with expression returns the defined facts for the
    expression.

    >>> from sympy.abc import x
    >>> reg(Abs(x))
    {Q.nonnegative(Abs(x)), Equivalent(~Q.zero(x), ~Q.zero(Abs(x)))}

    Multiple facts can be registered at once by ``multiregister`` method.

    >>> reg2 = ClassFactRegistry()
    >>> @reg2.multiregister(Abs)
    ... def _(expr):
    ...     arg = expr.args[0]
    ...     return [Q.even(arg) >> Q.even(expr), Q.odd(arg) >> Q.odd(expr)]
    >>> reg2(Abs(x))
    {Implies(Q.even(x), Q.even(Abs(x))), Implies(Q.odd(x), Q.odd(Abs(x)))}

    c                 T    t        t              | _        t        t              | _        y N)r   	frozensetsinglefacts
multifacts)selfs    r   __init__zClassFactRegistry.__init__   s    &y1%i0    c                       fd}|S )Nc                 8    j                   xx   | hz  cc<   | S r+   )r-   )funcclsr/   s    r   _z%ClassFactRegistry.register.<locals>._   s     S!dV+!Kr1    )r/   r5   r6   s   `` r   registerzClassFactRegistry.register   s    	 r1   c                       fd}|S )Nc                 F    D ]  }j                   |xx   | hz  cc<    | S r+   )r.   )r4   r5   classesr/   s     r   r6   z*ClassFactRegistry.multiregister.<locals>._   s-     /$.$/Kr1   r7   )r/   r;   r6   s   `` r   multiregisterzClassFactRegistry.multiregister   s    	 r1   c                    | j                   |   }| j                   D ]!  }t        ||      s|| j                   |   z  }# | j                  |   }| j                  D ]!  }t        ||      s|| j                  |   z  }# ||fS r+   )r-   
issubclassr.   )r/   keyret1kret2s        r   __getitem__zClassFactRegistry.__getitem__   s    $!! 	,A#q!((++	, s# 	+A#q!**	+ Tzr1   c                     t               }| t                 \  }}|j                  fd|D               |D ]  }|j                   |              |S )Nc              3   .   K   | ]  } |        y wr+   r7   ).0hr   s     r   	<genexpr>z-ClassFactRegistry.__call__.<locals>.<genexpr>   s     .q1T7.s   )settypeupdate)r/   r   ret	handlers1	handlers2rG   s    `    r   __call__zClassFactRegistry.__call__   sS    e#DJ/	9

.I.. 	 AJJqw	 
r1   N)	__name__
__module____qualname____doc__r0   r8   r<   rC   rO   r7   r1   r   r)   r)   h   s!    .^1r1   r)   xc                    | j                   d   }t        j                  |       t        t        j                  |       t        j                  |              t        j
                  |      t        j
                  |       z	  t        j                  |      t        j                  |       z	  t        j                  |      t        j                  |       z	  gS )Nr   )r   r   nonnegativer   zeroevenoddinteger)r   r   s     r   r6   r6      s    
))A,CMM$s|affTl]3FF3K166$<'EE#J!%%+%IIcNaiio-	 r1   c                    t        t        t        j                  t              |       t        j                  |       z	  t        t        t        j                  t              |       t        j                  |       z	  t        t        t        j
                  t              |       t        j
                  |       z	  t        t        t        j                  t              |       t        j                  |       z	  t        t        t        j                  t              |       t        j                  |       z	  t        t        t        j                  t               |       t        j                  |        z	  gS r+   )	r   rT   r   positivenegativerealrationalrZ   r'   r   s    r   r6   r6      s    Aqzz!}d+qzz$/??Aqzz!}d+qzz$/??Aqvvay$'166$<7Aqzz!}d+qzz$/??Aqyy|T*aiio=!aiil]D1aiio5EE r1   c           	          t        t        t        j                  t              |       }t	        t        t        j
                  t              |       }t        |t        |t        j
                  |                   S r+   r   rT   r   r^   r'   
irrationalr   r   allargs_realonearg_irrationals      r   r6   r6      M    1affQi.L%aa$?<):ALL<N!OPPr1   c                 n   t        t        j                  |       t        t        t        j                  t              |             t        t        t        j                  t              |       t        j                  |       z	  t        t        t        j                  t              |       t        j                  |       z	  t        t        t        j                  t              |       t        j                  |       z	  t        t        t        j                  t              |       t        j                  |       z	  t        t        t        j                  t               |       t        j                  |        z	  t        t        t        j                  t              |       t        j                  |       z	  gS r+   )r   r   rW   r   rT   r   r\   r^   r_   rZ   r'   commutativer`   s    r   r6   r6      s    qvvd|VAqvvay$%?@Aqzz!}d+qzz$/??Aqvvay$'166$<7Aqzz!}d+qzz$/??Aqyy|T*aiio=!ajjm^T2qyy6FFAq}}Q'.!--2EE r1   c                     t        t        t        j                  t              |       }t	        |t        j                  |              S r+   )r   rT   r   primer   )r   allargs_primes     r   r6   r6      s1     Aqwwqz40M=1774=.11r1   c           	      (   t        t        t        j                  t              t        j                  t              z  |       }t        t        t        j                  t              |       }t        |t        |t        j                  |                   S r+   )r   rT   r   	imaginaryr^   r'   r   )r   allargs_imag_or_realonearg_imaginarys      r   r6   r6      s^     #1akk!nqvvay&@$G$QA='1A1;;tCT)UVVr1   c           	          t        t        t        j                  t              |       }t	        t        t        j
                  t              |       }t        |t        |t        j
                  |                   S r+   rb   rd   s      r   r6   r6     rg   r1   c           	          t        t        t        j                  t              |       }t	        t        t        j
                  t              |       }t        |t        |t        j
                  |                   S r+   )r   rT   r   rZ   r   rX   r   r   )r   allargs_integeranyarg_evens      r   r6   r6     sL    
 a1t4OAFF1It,K?J{AFF4L$IJJr1   c                     t        t        t        j                  t              |       }t        t        t        j                  t              |       }t        |t        t        j                  |       |            S r+   )r   rT   r   square
invertibler   r   )r   allargs_squareallargs_invertibles      r   r6   r6     sM    QT2N ALLOT:>:all4.@BT#UVVr1   c           
         | j                   | j                  }}t        j                  |      t        j                  |      z  t        j
                  |      z  t        j
                  |       z	  t        j
                  |      t        j                  |      z  t        j
                  |      z  t        j
                  |       z	  t        j                  |      t        j                  |      z  t        j
                  |      z  t        j                  |       z	  t        t        j                  |       t        j                  |      t        j                  |      z        gS r+   )baseexpr   r^   rX   rV   rY   nonpositiver   rW   r\   )r   r{   r|   s      r   r6   r6      s    		488#D	
s	#ammC&8	8Q]]4=PP	
t	quuSz	)AMM#,>	>1==QUCVV	
t	quuSz	)AMM#,>	>1==QUCVV166$<

3!?@	 r1   c                     | j                   S r+   )is_positiveos    r   <lambda>r   .  
    !-- r1   c                     | j                   S r+   )is_zeror   s    r   r   r   /  
    aii r1   c                     | j                   S r+   )is_negativer   s    r   r   r   0  r   r1   c                     | j                   S r+   )is_rationalr   s    r   r   r   1  r   r1   c                     | j                   S r+   )is_irrationalr   s    r   r   r   2  s
    AOO r1   c                     | j                   S r+   )is_evenr   s    r   r   r   3  r   r1   c                     | j                   S r+   )is_oddr   s    r   r   r   4  s
    QXX r1   c                     | j                   S r+   )is_imaginaryr   s    r   r   r   5  
    1>> r1   c                     | j                   S r+   )is_primer   s    r   r   r   6  s
    qzz r1   c                     | j                   S r+   )is_compositer   s    r   r   r   7  r   r1   c                     g }t         j                         D ]3  \  }} ||       } ||       }||j                  t        ||             5 |S r+   )_old_assump_gettersitemsappendr   )r   rL   pgetterpredprops         r   r6   r6   :  sU    
C(..0 /	6wd|JJz$-.	/
 Jr1   N)*collectionsr   sympy.assumptions.askr   
sympy.corer   r   r   r   r	   r
   sympy.core.numbersr   $sympy.functions.elementary.complexesr   sympy.logic.boolalgr   r   r   r   sympy.matrices.expressionsr   r   r   r'   r)   class_fact_registryrT   r<   r6   r8   r\   rW   r]   r_   rc   rX   rY   rn   rk   	compositer   r7   r1   r   <module>r      s%   # # D D , 4 > > -?8>8BV Vp ()  3K ""3' ( ""3' ( c"Q #Q ""3' ( c"2 #2 c"W #W c"Q #Q
 c"K #K f%W &W ""3' ( JJ'FFJJ'JJ'LL+FFEEKK)GG!KK)  ""6<G Hr1   