
    \h$                        S SK Jr  S SKJr  S SKJrJrJrJrJ	r	J
r
  S SKJr  S SKJr  S SKJrJrJrJr  S SKJr  S rS	 rS
 r " S S5      r\" 5       r\
" S5      r\R9                  \5      S 5       r\R9                  \5      S 5       r\R=                  \5      S 5       r\R9                  \5      S 5       r\R=                  \5      S 5       r\R=                  \5      S 5       r\R=                  \5      S 5       r\R=                  \5      S 5       r\R=                  \5      S 5       r\R9                  \5      S 5       r\R>                  S \R@                  S \RB                  S \RD                  S \RF                  S \RH                  S \RJ                  S \RL                  S \RN                  S  \RP                  S! 0
r)\R9                  \\	\5      S" 5       rg#)$    )defaultdict)Q)AddMulPowNumberNumberSymbolSymbol)ImaginaryUnit)Abs)
EquivalentAndOrImplies)MatMulc           	      n    [        UR                   Vs/ s H  o1R                  X5      PM     sn6 $ s  snf )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       U/var/www/auris/envauris/lib/python3.13/site-packages/sympy/assumptions/sathandlers.pyallargsr      s,    2 499=9C6'9=>>=   2c           	      n    [        UR                   Vs/ s H  o1R                  X5      PM     sn6 $ s  snf )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                 $   UR                    Vs/ s H  o1R                  X5      PM     nn[        [        [	        U5      5       VVs/ s H-  n[        XE   /USU XES-   S -    Vs/ s H  of) PM     snQ76 PM/     snn6 nU$ s  snf s  snf s  snnf )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=9C6'9I=
#(Y#8:#8a 9< 9Ra=A#$4 # 4C4 4 # #8: ;CJ ># :s   BB
%B1
B
B
c                   6    \ rS rSrSrS rS rS rS rS r	Sr
g	)
ClassFactRegistryh   a  
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    [        [        5      U l        [        [        5      U l        g N)r   	frozensetsinglefacts
multifacts)selfs    r   __init__ClassFactRegistry.__init__   s    &y1%i0    c                    ^ ^ UU 4S jnU$ )Nc                 8   > TR                   T==   U 1-  ss'   U $ r,   )r.   )funcclsr0   s    r   _%ClassFactRegistry.register.<locals>._   s     S!dV+!Kr3    )r0   r7   r8   s   `` r   registerClassFactRegistry.register   s    	 r3   c                    ^ ^ UU 4S jnU$ )Nc                 J   > T H  nTR                   U==   U 1-  ss'   M     U $ r,   )r/   )r6   r7   classesr0   s     r   r8   *ClassFactRegistry.multiregister.<locals>._   s(    $.$ Kr3   r:   )r0   r?   r8   s   `` r   multiregisterClassFactRegistry.multiregister   s    	 r3   c                    U R                   U   nU R                    H&  n[        X5      (       d  M  X R                   U   -  nM(     U R                  U   nU R                   H&  n[        X5      (       d  M  X@R                  U   -  nM(     X$4$ r,   )r.   
issubclassr/   )r0   keyret1kret2s        r   __getitem__ClassFactRegistry.__getitem__   s    $!!A#!!((++ " s#A#!!** ! zr3   c                    ^ [        5       nU [        T5         u  p4UR                  U4S jU 5       5        U H  nUR                  U" T5      5        M     U$ )Nc              3   2   >#    U  H  o" T5      v   M     g 7fr,   r:   ).0hr   s     r   	<genexpr>-ClassFactRegistry.__call__.<locals>.<genexpr>   s     .Iq1T77Is   )settypeupdate)r0   r   ret	handlers1	handlers2rN   s    `    r   __call__ClassFactRegistry.__call__   sL    e#DJ/	

.I..AJJqw 
r3   )r/   r.   N)__name__
__module____qualname____firstlineno____doc__r1   r;   rA   rI   rW   __static_attributes__r:   r3   r   r)   r)   h   s!    .^1r3   r)   xc                    U R                   S   n[        R                  " U 5      [        [        R                  " U5      ) [        R                  " U 5      ) 5      [        R
                  " U5      [        R
                  " U 5      -	  [        R                  " U5      [        R                  " U 5      -	  [        R                  " U5      [        R                  " U 5      -	  /$ )Nr   )r   r   nonnegativer   zeroevenoddinteger)r   r   s     r   r8   r8      s    
))A,CMM$s|affTl]3FF3K166$<'EE#J!%%+%IIcNaiio-	 r3   c                    [        [        [        R                  " [        5      U 5      [        R                  " U 5      -	  [        [        [        R                  " [        5      U 5      [        R                  " U 5      -	  [        [        [        R
                  " [        5      U 5      [        R
                  " U 5      -	  [        [        [        R                  " [        5      U 5      [        R                  " U 5      -	  [        [        [        R                  " [        5      U 5      [        R                  " U 5      -	  [        [        [        R                  " [        5      ) U 5      [        R                  " U 5      ) -	  /$ r,   )	r   r_   r   positivenegativerealrationalre   r'   r   s    r   r8   r8      s    Aqzz!}d+qzz$/??Aqzz!}d+qzz$/??Aqvvay$'166$<7Aqzz!}d+qzz$/??Aqyy|T*aiio=!aiil]D1aiio5EE r3   c           	          [        [        [        R                  " [        5      U 5      n[	        [        [        R
                  " [        5      U 5      n[        U[        U[        R
                  " U 5      5      5      $ r,   r   r_   r   ri   r'   
irrationalr   r   allargs_realonearg_irrationals      r   r8   r8      M    1affQi.L%aa$?<):ALL<N!OPPr3   c                    [        [        R                  " U 5      [        [        [        R                  " [        5      U 5      5      [        [        [        R                  " [        5      U 5      [        R                  " U 5      -	  [        [        [        R                  " [        5      U 5      [        R                  " U 5      -	  [        [        [        R                  " [        5      U 5      [        R                  " U 5      -	  [        [        [        R                  " [        5      U 5      [        R                  " U 5      -	  [        [        [        R                  " [        5      ) U 5      [        R                  " U 5      ) -	  [        [        [        R                  " [        5      U 5      [        R                  " U 5      -	  /$ r,   )r   r   rb   r   r_   r   rg   ri   rj   re   r'   commutativerk   s    r   r8   r8      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 r3   c                     [        [        [        R                  " [        5      U 5      n[	        U[        R                  " U 5      ) 5      $ r,   )r   r_   r   primer   )r   allargs_primes     r   r8   r8      s1     Aqwwqz40M=1774=.11r3   c           	      0   [        [        [        R                  " [        5      [        R                  " [        5      -  U 5      n[        [        [        R                  " [        5      U 5      n[        U[        U[        R                  " U 5      5      5      $ r,   )r   r_   r   	imaginaryri   r'   r   )r   allargs_imag_or_realonearg_imaginarys      r   r8   r8      s^     #1akk!nqvvay&@$G$QA='1A1;;tCT)UVVr3   c           	          [        [        [        R                  " [        5      U 5      n[	        [        [        R
                  " [        5      U 5      n[        U[        U[        R
                  " U 5      5      5      $ r,   rm   ro   s      r   r8   r8     rr   r3   c           	          [        [        [        R                  " [        5      U 5      n[	        [        [        R
                  " [        5      U 5      n[        U[        U[        R
                  " U 5      5      5      $ r,   )r   r_   r   re   r   rc   r   r   )r   allargs_integeranyarg_evens      r   r8   r8     sL    
 a1t4OAFF1It,K?J{AFF4L$IJJr3   c                     [        [        [        R                  " [        5      U 5      n[        [        [        R                  " [        5      U 5      n[        U[        [        R                  " U 5      U5      5      $ r,   )r   r_   r   square
invertibler   r   )r   allargs_squareallargs_invertibles      r   r8   r8     sM    QT2N ALLOT:>:all4.@BT#UVVr3   c           
         U R                   U R                  p![        R                  " U5      [        R                  " U5      -  [        R
                  " U5      -  [        R
                  " U 5      -	  [        R
                  " U5      [        R                  " U5      -  [        R
                  " U5      -  [        R
                  " U 5      -	  [        R                  " U5      [        R                  " U5      -  [        R
                  " U5      -  [        R                  " U 5      -	  [        [        R                  " U 5      [        R                  " U5      [        R                  " U5      -  5      /$ r,   )baseexpr   ri   rc   ra   rd   nonpositiver   rb   rg   )r   r   r   s      r   r8   r8      s    		488#	
s	#ammC&8	8Q]]4=PP	
t	quuSz	)AMM#,>	>1==QUCVV	
t	quuSz	)AMM#,>	>1==QUCVV166$<

3!?@	 r3   c                     U R                   $ r,   )is_positiveos    r   <lambda>r   .      !--r3   c                     U R                   $ r,   )is_zeror   s    r   r   r   /      aiir3   c                     U R                   $ r,   )is_negativer   s    r   r   r   0  r   r3   c                     U R                   $ r,   )is_rationalr   s    r   r   r   1  r   r3   c                     U R                   $ r,   )is_irrationalr   s    r   r   r   2  s    AOOr3   c                     U R                   $ r,   )is_evenr   s    r   r   r   3  r   r3   c                     U R                   $ r,   )is_oddr   s    r   r   r   4  s    QXXr3   c                     U R                   $ r,   )is_imaginaryr   s    r   r   r   5      1>>r3   c                     U R                   $ r,   )is_primer   s    r   r   r   6  s    qzzr3   c                     U R                   $ r,   )is_compositer   s    r   r   r   7  r   r3   c                     / n[         R                  5        H4  u  p#U" U 5      nU" U 5      nUc  M  UR                  [        XE5      5        M6     U$ r,   )_old_assump_gettersitemsappendr   )r   rT   pgetterpredprops         r   r8   r8   :  sL    
C(..0	wd|JJz$-.	 1
 Jr3   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_registryr_   rA   r8   r;   rg   rb   rh   rj   rn   rc   rd   ry   rv   	compositer   r:   r3   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r3   