a
    <b                     @   s  d Z ddlmZmZ ddl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 ddl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! e"ed	d
 Z#e"edd
 Z#e"edd
 Z#e"edd
 Z#e"edd
 Z#e"edd
 Z#e$eeeeeeeee	dd
 Z#e$eee
dd
 Z#e"edd
 Z#e$eee
dd
 Z#e "edd
 Z#e $e
edd
 Z#e!"e
dd
 Z#e!$eedd
 Z#dS )zc
This module contains query handlers responsible for calculus queries:
infinitesimal, finite, etc.
    )Qask)AddMulPowSymbol)NegativeInfinityGoldenRatioInfinityExp1ComplexInfinityImaginaryUnitNaNNumberPiETribonacciConstant)cosexplogsignsin)	conjuncts   )FinitePredicateInfinitePredicatePositiveInfinitePredicateNegativeInfinitePredicatec                 C   s*   | j dur| j S t| t|v r&dS dS )z
    Handles Symbol.
    NT)	is_finiter   finiter   exprassumptions r#   s/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/sympy/assumptions/handlers/calculus.py_   s
    
r%   c                 C   sx   d}d}| j D ]d}tt||}|r(qtt||}|dkrH||ks\|du rbd||fv rb dS |}|dur|}q|S )ab  
    Return True if expr is bounded, False if not and None if unknown.

    Truth Table:

    +-------+-----+-----------+-----------+
    |       |     |           |           |
    |       |  B  |     U     |     ?     |
    |       |     |           |           |
    +-------+-----+---+---+---+---+---+---+
    |       |     |   |   |   |   |   |   |
    |       |     |'+'|'-'|'x'|'+'|'-'|'x'|
    |       |     |   |   |   |   |   |   |
    +-------+-----+---+---+---+---+---+---+
    |       |     |           |           |
    |   B   |  B  |     U     |     ?     |
    |       |     |           |           |
    +---+---+-----+---+---+---+---+---+---+
    |   |   |     |   |   |   |   |   |   |
    |   |'+'|     | U | ? | ? | U | ? | ? |
    |   |   |     |   |   |   |   |   |   |
    |   +---+-----+---+---+---+---+---+---+
    |   |   |     |   |   |   |   |   |   |
    | U |'-'|     | ? | U | ? | ? | U | ? |
    |   |   |     |   |   |   |   |   |   |
    |   +---+-----+---+---+---+---+---+---+
    |   |   |     |           |           |
    |   |'x'|     |     ?     |     ?     |
    |   |   |     |           |           |
    +---+---+-----+---+---+---+---+---+---+
    |       |     |           |           |
    |   ?   |     |           |     ?     |
    |       |     |           |           |
    +-------+-----+-----------+---+---+---+

        * 'B' = Bounded

        * 'U' = Unbounded

        * '?' = unknown boundedness

        * '+' = positive sign

        * '-' = negative sign

        * 'x' = sign unknown

        * All Bounded -> True

        * 1 Unbounded and the rest Bounded -> False

        * >1 Unbounded, all with same known sign -> False

        * Any Unknown and unknown sign -> None

        * Else -> None

    When the signs are not the same you can have an undefined
    result as in oo - oo, hence 'bounded' is also undefined.
    TNF)argsr   r   r   extended_positive)r!   r"   r   resultarg_boundedsr#   r#   r$   r%       s"    >

c                 C   sn   d}| j D ]^}tt||}|r&q
q
|du rd|du r< dS tt||du rV dS |durhd}q
d}q
|S )a)  
    Return True if expr is bounded, False if not and None if unknown.

    Truth Table:

    +---+---+---+--------+
    |   |   |   |        |
    |   | B | U |   ?    |
    |   |   |   |        |
    +---+---+---+---+----+
    |   |   |   |   |    |
    |   |   |   | s | /s |
    |   |   |   |   |    |
    +---+---+---+---+----+
    |   |   |   |        |
    | B | B | U |   ?    |
    |   |   |   |        |
    +---+---+---+---+----+
    |   |   |   |   |    |
    | U |   | U | U | ?  |
    |   |   |   |   |    |
    +---+---+---+---+----+
    |   |   |   |        |
    | ? |   |   |   ?    |
    |   |   |   |        |
    +---+---+---+---+----+

        * B = Bounded

        * U = Unbounded

        * ? = unknown boundedness

        * s = signed (hence nonzero)

        * /s = not signed
    TNF)r'   r   r   r   extended_nonzero)r!   r"   r)   r*   r+   r#   r#   r$   r%   r   s    '
c                 C   s   | j tkrtt| j|S tt| j |}tt| j|}|du rT|du rTdS |du rrtt| j|rrdS |r~|r~dS t| j dkdkrtt| j|rdS t| j dkdkrtt	| j|rdS t| j dkdkr|du rdS dS )z
    * Unbounded ** NonZero -> Unbounded

    * Bounded ** Bounded -> Bounded

    * Abs()<=1 ** Positive -> Bounded

    * Abs()>=1 ** Negative -> Bounded

    * Otherwise unknown
    NFT   )
baser   r   r   r   r   r-   absr(   Zextended_negative)r!   r"   Zbase_boundedZexp_boundedr#   r#   r$   r%      s"    
$$c                 C   s   t t| j|S N)r   r   r   r   r    r#   r#   r$   r%      s    c                 C   s2   t t| jd |rdS t t| jd  |S )Nr   F)r   r   Zinfiniter'   Zzeror    r#   r#   r$   r%      s    c                 C   s   dS NTr#   r    r#   r#   r$   r%      s    c                 C   s   dS NFr#   r    r#   r#   r$   r%      s    c                 C   s   d S r1   r#   r    r#   r#   r$   r%      s    c                 C   s   dS r2   r#   r    r#   r#   r$   r%      s    c                 C   s   dS r2   r#   r    r#   r#   r$   r%      s    c                 C   s   dS r3   r#   r    r#   r#   r$   r%      s    c                 C   s   dS r2   r#   r    r#   r#   r$   r%      s    c                 C   s   dS r3   r#   r    r#   r#   r$   r%      s    N)%__doc__Zsympy.assumptionsr   r   Z
sympy.corer   r   r   r   Zsympy.core.numbersr   r	   r
   r   r   r   r   r   r   r   r   Zsympy.functionsr   r   r   r   r   Zsympy.logic.boolalgr   Zpredicates.calculusr   r   r   r   registerr%   Zregister_manyr#   r#   r#   r$   <module>   sH   4


Q
6











