
    wg.              	          U 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
mZ d dlmZ d dlmZ d dlmZmZ ddZd Zd	 Zd
 Zd Zd Zd Zd Zd Zd ZeeeeeeeedZded<   y)    )annotations)Callable)SAddExprBasicMulPowRational)	fuzzy_not)Boolean)askQc                   t        | t              s| S | j                  s2| j                  D cg c]  }t	        ||       }} | j
                  | } t        | d      r| j                  |      }||S | j                  j                  }t        j                  |d      }|| S  || |      }|| |k(  r| S t        |t              s|S t	        ||      S c c}w )a#  
    Simplify an expression using assumptions.

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

    Unlike :func:`~.simplify()` which performs structural simplification
    without any assumption, this function transforms the expression into
    the form which is only valid under certain assumptions. Note that
    ``simplify()`` is generally not done in refining process.

    Refining boolean expression involves reducing it to ``S.true`` or
    ``S.false``. Unlike :func:`~.ask()`, the expression will not be reduced
    if the truth value cannot be determined.

    Examples
    ========

    >>> from sympy import refine, sqrt, Q
    >>> from sympy.abc import x
    >>> refine(sqrt(x**2), Q.real(x))
    Abs(x)
    >>> refine(sqrt(x**2), Q.positive(x))
    x

    >>> refine(Q.real(x), Q.positive(x))
    True
    >>> refine(Q.positive(x), Q.real(x))
    Q.positive(x)

    See Also
    ========

    sympy.simplify.simplify.simplify : Structural simplification without assumptions.
    sympy.assumptions.ask.ask : Query for boolean expressions using assumptions.
    _eval_refineN)
isinstancer   is_Atomargsrefinefunchasattrr   	__class____name__handlers_dictgetr   )exprassumptionsargr   ref_exprnamehandlernew_exprs           ]/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/sympy/assumptions/refine.pyr   r      s    J dE"<<48II>SsK(>>tyy$t^$$$[1O>>""Dd+Gt[)Hdh.h%(K((! ?s   Cc                B   ddl m} | j                  d   }t        t	        j
                  |      |      r*t        t        t	        j                  |      |            r|S t        t	        j                  |      |      r| S t        |t              r|j                  D cg c]  }t        t        |      |       }}g }g }|D ]>  }t        ||      r|j                  |j                  d          .|j                  |       @ t        |  |t        |       z  S yc c}w )aF  
    Handler for the absolute value.

    Examples
    ========

    >>> from sympy import Q, Abs
    >>> from sympy.assumptions.refine import refine_abs
    >>> from sympy.abc import x
    >>> refine_abs(Abs(x), Q.real(x))
    >>> refine_abs(Abs(x), Q.positive(x))
    x
    >>> refine_abs(Abs(x), Q.negative(x))
    -x

    r   AbsN)$sympy.functions.elementary.complexesr&   r   r   r   realr   negativer   r	   r   absappend)	r   r   r&   r   arnon_absin_absis	            r#   
refine_absr1   G   s    " 9
))A,C
166#;$c!**S/;78

1::c?K(t#s25((;QVCFK(;; 	"A!S!affQi(q!		"
 G}s3<000 ;s   Dc                ~	   ddl m} ddlm} t	        | j
                  |      rt        t        j                  | j
                  j                  d         |      rOt        t        j                  | j                        |      r&| j
                  j                  d   | j                  z  S t        t        j                  | j
                        |      r| j
                  j                  rt        t        j                  | j                        |      r"t        | j
                        | j                  z  S t        t        j                  | j                        |      r5 || j
                        t        | j
                        | j                  z  z  S t	        | j                  t              r]t	        | j
                  t               rCt        | j
                  j
                        | j
                  j                  | j                  z  z  S | j
                  t"        j$                  u r| j                  j&                  r| }| j                  j)                         \  }}t+        |      }t+               }t+               }t-        |      }	|D ]d  }
t        t        j                  |
      |      r|j/                  |
       4t        t        j                  |
      |      sT|j/                  |
       f ||z  }t-        |      dz  r||z  }|t"        j0                  z   dz  }n
||z  }|dz  }||k7  st-        |      |	k  r&|j/                  |       | j
                  t3        | z  } d| j                  z  }t        t        j                  |      |      r|j5                         r|| j
                  z  }|j&                  r|j7                         \  }}|j8                  r|j
                  t"        j$                  u rt        t        j:                  |j                        |      r|dz   dz  }t        t        j                  |      |      r| j
                  |j                  z  S t        t        j                  |      |      r| j
                  |j                  dz   z  S | j
                  |j                  |z   z  S || k7  r| S yyyy)as  
    Handler for instances of Pow.

    Examples
    ========

    >>> from sympy import Q
    >>> from sympy.assumptions.refine import refine_Pow
    >>> from sympy.abc import x,y,z
    >>> refine_Pow((-1)**x, Q.real(x))
    >>> refine_Pow((-1)**x, Q.even(x))
    1
    >>> refine_Pow((-1)**x, Q.odd(x))
    -1

    For powers of -1, even parts of the exponent can be simplified:

    >>> refine_Pow((-1)**(x+y), Q.even(x))
    (-1)**y
    >>> refine_Pow((-1)**(x+y+z), Q.odd(x) & Q.odd(z))
    (-1)**y
    >>> refine_Pow((-1)**(x+y+2), Q.odd(x))
    (-1)**(y + 1)
    >>> refine_Pow((-1)**(x+3), True)
    (-1)**(x + 1)

    r   r%   )sign      N)r'   r&   sympy.functionsr3   r   baser   r   r(   r   evenexp	is_numberr*   oddr   r
   r   NegativeOneis_Addas_coeff_addsetlenaddOner   could_extract_minus_signas_two_termsis_Powinteger)r   r   r&   r3   oldcoeffterms
even_terms	odd_termsinitial_number_of_termst	new_coeffe2r0   ps                  r#   
refine_PowrQ   m   sj   8 9$$))S!qvvdiinnQ'(+6AFF488$k299>>!$00
166$))k*99166$((#[1499~11155?K0DIITYY488)CCCdhh)$))S)499>>*tyy}}txx/GHH99%xx  $xx446uE
 U
E	*-e*' )A166!9k2"q)QUU1X{3!a(	) #y>A%Y&E!&! 3IY&E %	I%U6M)MIIi(99sE{3D txxZqvvbz;/224dii99??,DAqxxAFFamm$;qyy/=!"Q	A"166!9k:'+yy!%%'7 7!$QUU1X{!;'+yy15519'= ='+yy15519'= =$;K g  & +    c                *   ddl m} | j                  \  }}t        t	        j
                  |      t	        j                  |      z  |      r |||z        S t        t	        j                  |      t	        j                  |      z  |      r |||z        t        j                  z
  S t        t	        j                  |      t	        j                  |      z  |      r |||z        t        j                  z   S t        t	        j                  |      t	        j                  |      z  |      rt        j                  S t        t	        j                  |      t	        j                  |      z  |      rt        j                  dz  S t        t	        j                  |      t	        j                  |      z  |      rt        j                   dz  S t        t	        j                  |      t	        j                  |      z  |      rt        j                  S | S )a  
    Handler for the atan2 function.

    Examples
    ========

    >>> from sympy import Q, atan2
    >>> from sympy.assumptions.refine import refine_atan2
    >>> from sympy.abc import x, y
    >>> refine_atan2(atan2(y,x), Q.real(y) & Q.positive(x))
    atan(y/x)
    >>> refine_atan2(atan2(y,x), Q.negative(y) & Q.negative(x))
    atan(y/x) - pi
    >>> refine_atan2(atan2(y,x), Q.positive(y) & Q.negative(x))
    atan(y/x) + pi
    >>> refine_atan2(atan2(y,x), Q.zero(y) & Q.negative(x))
    pi
    >>> refine_atan2(atan2(y,x), Q.positive(y) & Q.zero(x))
    pi/2
    >>> refine_atan2(atan2(y,x), Q.negative(y) & Q.zero(x))
    -pi/2
    >>> refine_atan2(atan2(y,x), Q.zero(y) & Q.zero(x))
    nan
    r   )atanr4   )(sympy.functions.elementary.trigonometricrT   r   r   r   r(   positiver)   r   PizeroNaN)r   r   rT   yxs        r#   refine_atan2r\      s\   2 >99DAq
166!9qzz!}$k2AE{	QZZ]QZZ]*K	8AE{QTT!!	QZZ]QZZ]*K	8AE{QTT!!	QVVAYA&	4tt	QZZ]QVVAY&	4ttAv	QZZ]QVVAY&	4uQw	QVVAY"K	0uurR   c                    | j                   d   }t        t        j                  |      |      r|S t        t        j                  |      |      rt
        j                  S t        | |      S )a  
    Handler for real part.

    Examples
    ========

    >>> from sympy.assumptions.refine import refine_re
    >>> from sympy import Q, re
    >>> from sympy.abc import x
    >>> refine_re(re(x), Q.real(x))
    x
    >>> refine_re(re(x), Q.imaginary(x))
    0
    r   )r   r   r   r(   	imaginaryr   Zero_refine_reimr   r   r   s      r#   	refine_rerb      sQ     ))A,C
166#;$

1;;s[)vvk**rR   c                    | j                   d   }t        t        j                  |      |      rt        j
                  S t        t        j                  |      |      rt        j                   |z  S t        | |      S )a  
    Handler for imaginary part.

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

    >>> from sympy.assumptions.refine import refine_im
    >>> from sympy import Q, im
    >>> from sympy.abc import x
    >>> refine_im(im(x), Q.real(x))
    0
    >>> refine_im(im(x), Q.imaginary(x))
    -I*x
    r   )	r   r   r   r(   r   r_   r^   ImaginaryUnitr`   ra   s      r#   	refine_imre     s^     ))A,C
166#;$vv
1;;s[) 3&&k**rR   c                    | j                   d   }t        t        j                  |      |      rt        j
                  S t        t        j                  |      |      rt        j                  S y)a"  
    Handler for complex argument

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

    >>> from sympy.assumptions.refine import refine_arg
    >>> from sympy import Q, arg
    >>> from sympy.abc import x
    >>> refine_arg(arg(x), Q.positive(x))
    0
    >>> refine_arg(arg(x), Q.negative(x))
    pi
    r   N)r   r   r   rV   r   r_   r)   rW   )r   r   rgs      r#   
refine_argrh   +  sJ     
1B
1::b>;'vv
1::b>;'ttrR   c                X    | j                  d      }|| k7  rt        ||      }||k7  r|S y )NT)complex)expandr   )r   r   expandedrefineds       r#   r`   r`   B  s6    {{T{*H4;/hNrR   c                   | j                   d   }t        t        j                  |      |      rt        j
                  S t        t        j                  |            r^t        t        j                  |      |      rt        j                  S t        t        j                  |      |      rt        j                  S t        t        j                  |            rr|j                         \  }}t        t        j                  |      |      rt        j                  S t        t        j                  |      |      rt        j                   S | S )a*  
    Handler for sign.

    Examples
    ========

    >>> from sympy.assumptions.refine import refine_sign
    >>> from sympy import Symbol, Q, sign, im
    >>> x = Symbol('x', real = True)
    >>> expr = sign(x)
    >>> refine_sign(expr, Q.positive(x) & Q.nonzero(x))
    1
    >>> refine_sign(expr, Q.negative(x) & Q.nonzero(x))
    -1
    >>> refine_sign(expr, Q.zero(x))
    0
    >>> y = Symbol('y', imaginary = True)
    >>> expr = sign(y)
    >>> refine_sign(expr, Q.positive(im(y)))
    I
    >>> refine_sign(expr, Q.negative(im(y)))
    -I
    r   )r   r   r   rX   r   r_   r(   rV   rB   r)   r<   r^   as_real_imagrd   )r   r   r   arg_rearg_ims        r#   refine_signrr   M  s    0 ))A,C
166#;$vv
166#;qzz#,55Lqzz#,== 
1;;s))+qzz&!;/??"qzz&!;/OO##KrR   c                    ddl m} | j                  \  }}}t        t	        j
                  |      |      r||z
  j                         r| S  ||||      S y)aU  
    Handler for symmetric part.

    Examples
    ========

    >>> from sympy.assumptions.refine import refine_matrixelement
    >>> from sympy import MatrixSymbol, Q
    >>> X = MatrixSymbol('X', 3, 3)
    >>> refine_matrixelement(X[0, 1], Q.symmetric(X))
    X[0, 1]
    >>> refine_matrixelement(X[1, 0], Q.symmetric(X))
    X[0, 1]
    r   )MatrixElementN)"sympy.matrices.expressions.matexprrt   r   r   r   	symmetricrC   )r   r   rt   matrixr0   js         r#   refine_matrixelementry   v  sS     A99LFAq
1;;v,E++-KVQ** -rR   )r&   r
   atan2reimr   r3   rt   z*dict[str, Callable[[Expr, Boolean], Expr]]r   N)T)
__future__r   typingr   
sympy.corer   r   r   r   r	   r
   r   sympy.core.logicr   sympy.logic.boolalgr   sympy.assumptionsr   r   r   r1   rQ   r\   rb   re   rh   r`   rr   ry   r   __annotations__ rR   r#   <module>r      s~    "  > > > & ' $9)x#1La H*Z+.+,.&R+. 

)	=9 	rR   