o
    ohM                     @   s.  d dl mZ d dlmZ d dlmZ d dlmZm	Z	 d dl
mZmZ d dlmZ d dlm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 d dlmZmZ d dl m!Z! G dd deZ"G dd de"Z#e!e#edd Z$G dd de"Z%e!e%edd Z$G dd deZ&e!e&edd Z$dS )    )Tuple)Basic)Expr)AddS)get_integer_partPrecisionExhausted)Function)fuzzy_or)Integer
int_valued)GtLtGeLe
Relationalis_eq)_sympify)imre)dispatchc                   @   sN   e Zd ZU dZee ed< edd Zedd Z	dd Z
d	d
 Zdd ZdS )RoundFunctionz+Abstract base class for rounding functions.argsc           
   	   C   s  |  |}|d ur|S |js|jdu r|S |jstj| jr5t|}|tjs/| |tj S | |ddS tj	 } }}dd }t
|D ]0}|jr\|t| }d ur\||tj 7 }qE|| }d uri||7 }qE|jrq||7 }qE||7 }qE|s||s||S |r|r|jr|jstj| js|jr|jrzt|| ji dd\}	}|t|	t|tj  7 }tj	}W n ttfy   Y nw ||7 }|s|S |jstj| jr|| t|ddtj  S t|ttfr|| S || |dd S )NFevaluatec                 S   s   t | rt| S | jr| S d S N)r   int
is_integer)x r   w/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/sympy/functions/elementary/integers.py<lambda>,   s    z$RoundFunction.eval.<locals>.<lambda>T)return_ints)_eval_numberr   	is_finiteis_imaginaryr   ImaginaryUnitis_realr   hasZeror   	make_args	is_numberr   _dirr   r   NotImplementedError
isinstancefloorceiling)
clsargviipartnpartspartintoftrr   r   r    eval   sh   







zRoundFunction.evalc                 C   s   t  r   )r-   r1   r2   r   r   r    r#   R   s   zRoundFunction._eval_numberc                 C      | j d jS Nr   )r   r$   selfr   r   r    _eval_is_finiteV      zRoundFunction._eval_is_finitec                 C   r=   r>   r   r'   r?   r   r   r    _eval_is_realY   rB   zRoundFunction._eval_is_realc                 C   r=   r>   rC   r?   r   r   r    _eval_is_integer\   rB   zRoundFunction._eval_is_integerN)__name__
__module____qualname____doc__tTupler   __annotations__classmethodr;   r#   rA   rD   rE   r   r   r   r    r      s   
 
7
r   c                   @   t   e Zd ZdZdZedd ZdddZdd	d
Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd ZdS )r/   a  
    Floor is a univariate function which returns the largest integer
    value not greater than its argument. This implementation
    generalizes floor to complex numbers by taking the floor of the
    real and imaginary parts separately.

    Examples
    ========

    >>> from sympy import floor, E, I, S, Float, Rational
    >>> floor(17)
    17
    >>> floor(Rational(23, 10))
    2
    >>> floor(2*E)
    5
    >>> floor(-Float(0.567))
    -1
    >>> floor(-I/2)
    -I
    >>> floor(S(5)/2 + 5*I/2)
    2 + 2*I

    See Also
    ========

    sympy.functions.elementary.integers.ceiling

    References
    ==========

    .. [1] "Concrete mathematics" by Graham, pp. 87
    .. [2] https://mathworld.wolfram.com/FloorFunction.html

    c                 C   B   |j r| S tdd || fD r|S |jr|td S d S )Nc                 s   (    | ]}t tfD ]}t||V  qqd S r   r/   r0   r.   .0r4   jr   r   r    	<genexpr>       z%floor._eval_number.<locals>.<genexpr>r   )	is_Numberr/   anyis_NumberSymbolapproximation_intervalr   r<   r   r   r    r#         zfloor._eval_numberNr   c           	      C   s   ddl m} | jd }||d}| |d}|tju s!t||r4|j|dt|j	r,dndd}t
|}|jr\||krZ|j||dkrD|ndd}|j	rO|d S |jrT|S td| |S |j|||d	S 
Nr   AccumBounds-+dir   cdirNot sure of sign of %slogxre   )!sympy.calculus.accumulationboundsr^   r   subsr   NaNr.   limitr   is_negativer/   r$   rb   is_positiver-   as_leading_term	r@   r   rh   re   r^   r2   arg0r:   ndirr   r   r    _eval_as_leading_term   s"   
zfloor._eval_as_leading_termc                 C   s   | j d }||d}| |d}|tju r)|j|dt|jr!dndd}t|}|jrTddl	m
} ddlm}	 |||||}
|dkrK|	d|dfn|dd}|
| S ||krw|j||dkra|ndd	}|jrl|d S |jrq|S td
| |S )Nr   r_   r`   ra   r]   Orderrc   rN   rd   rf   )r   rj   r   rk   rl   r   rm   r/   is_infiniteri   r^   sympy.series.orderru   _eval_nseriesrb   rn   r-   r@   r   nrh   re   r2   rq   r:   r^   ru   sorr   r   r   r    rx      s(   

 zfloor._eval_nseriesc                 C   r=   r>   )r   rm   r?   r   r   r    _eval_is_negative   rB   zfloor._eval_is_negativec                 C   r=   r>   )r   is_nonnegativer?   r   r   r    _eval_is_nonnegative   rB   zfloor._eval_is_nonnegativec                 K      t |  S r   r0   r@   r2   kwargsr   r   r    _eval_rewrite_as_ceiling   rB   zfloor._eval_rewrite_as_ceilingc                 K      |t | S r   fracr   r   r   r    _eval_rewrite_as_frac   rB   zfloor._eval_rewrite_as_fracc                 C   s   t |}| jd jr%|jr| jd |d k S |jr%|jr%| jd t|k S | jd |kr2|jr2t jS |t ju r=| jr=t jS t	| |ddS Nr   rc   Fr   )
r   r   r'   r   r+   r0   trueInfinityr$   r   r@   otherr   r   r    __le__      zfloor.__le__c                 C   s   t |}| jd jr#|jr| jd |kS |jr#|jr#| jd t|kS | jd |kr0|jr0t jS |t ju r;| jr;t j	S t
| |ddS Nr   Fr   )r   r   r'   r   r+   r0   falseNegativeInfinityr$   r   r   r   r   r   r    __ge__      zfloor.__ge__c                 C   s   t |}| jd jr%|jr| jd |d kS |jr%|jr%| jd t|kS | jd |kr2|jr2t jS |t ju r=| jr=t j	S t
| |ddS r   )r   r   r'   r   r+   r0   r   r   r$   r   r   r   r   r   r    __gt__   r   zfloor.__gt__c                 C   s   t |}| jd jr#|jr| jd |k S |jr#|jr#| jd t|k S | jd |kr0|jr0t jS |t ju r;| jr;t j	S t
| |ddS r   )r   r   r'   r   r+   r0   r   r   r$   r   r   r   r   r   r    __lt__   r   zfloor.__lt__r>   r   )rF   rG   rH   rI   r,   rL   r#   rs   rx   r}   r   r   r   r   r   r   r   r   r   r   r    r/   `       #

	
r/   c                 C       t | t|pt | t|S r   )r   rewriter0   r   lhsrhsr   r   r    _eval_is_eq  s   r   c                   @   rM   )r0   a  
    Ceiling is a univariate function which returns the smallest integer
    value not less than its argument. This implementation
    generalizes ceiling to complex numbers by taking the ceiling of the
    real and imaginary parts separately.

    Examples
    ========

    >>> from sympy import ceiling, E, I, S, Float, Rational
    >>> ceiling(17)
    17
    >>> ceiling(Rational(23, 10))
    3
    >>> ceiling(2*E)
    6
    >>> ceiling(-Float(0.567))
    0
    >>> ceiling(I/2)
    I
    >>> ceiling(S(5)/2 + 5*I/2)
    3 + 3*I

    See Also
    ========

    sympy.functions.elementary.integers.floor

    References
    ==========

    .. [1] "Concrete mathematics" by Graham, pp. 87
    .. [2] https://mathworld.wolfram.com/CeilingFunction.html

    rc   c                 C   rO   )Nc                 s   rP   r   rQ   rR   r   r   r    rU   2  rV   z'ceiling._eval_number.<locals>.<genexpr>rc   )rW   r0   rX   rY   rZ   r   r<   r   r   r    r#   .  r[   zceiling._eval_numberNr   c           	      C   s   ddl m} | jd }||d}| |d}|tju s!t||r4|j|dt|j	r,dndd}t
|}|jr\||krZ|j||dkrD|ndd}|j	rM|S |jrT|d S td| |S |j|||d	S r\   )ri   r^   r   rj   r   rk   r.   rl   r   rm   r0   r$   rb   rn   r-   ro   rp   r   r   r    rs   8  s"   
zceiling._eval_as_leading_termc                 C   s   | j d }||d}| |d}|tju r)|j|dt|jr!dndd}t|}|jrTddl	m
} ddlm}	 |||||}
|dkrK|	d|dfn|dd}|
| S ||krw|j||dkra|ndd}|jrj|S |jrq|d S td	| |S )
Nr   r_   r`   ra   r]   rt   rc   rd   rf   )r   rj   r   rk   rl   r   rm   r0   rv   ri   r^   rw   ru   rx   rb   rn   r-   ry   r   r   r    rx   M  s(   

 zceiling._eval_nseriesc                 K   r   r   r/   r   r   r   r    _eval_rewrite_as_floore  rB   zceiling._eval_rewrite_as_floorc                 K      |t |  S r   r   r   r   r   r    r   h     zceiling._eval_rewrite_as_fracc                 C   r=   r>   )r   rn   r?   r   r   r    _eval_is_positivek  rB   zceiling._eval_is_positivec                 C   r=   r>   )r   is_nonpositiver?   r   r   r    _eval_is_nonpositiven  rB   zceiling._eval_is_nonpositivec                 C   s   t |}| jd jr%|jr| jd |d kS |jr%|jr%| jd t|kS | jd |kr2|jr2t jS |t ju r=| jr=t j	S t
| |ddS r   )r   r   r'   r   r+   r/   r   r   r$   r   r   r   r   r   r    r   q  r   zceiling.__lt__c                 C   s   t |}| jd jr#|jr| jd |kS |jr#|jr#| jd t|kS | jd |kr0|jr0t jS |t ju r;| jr;t j	S t
| |ddS r   )r   r   r'   r   r+   r/   r   r   r$   r   r   r   r   r   r    r     r   zceiling.__gt__c                 C   s   t |}| jd jr%|jr| jd |d kS |jr%|jr%| jd t|kS | jd |kr2|jr2t jS |t ju r=| jr=t jS t	| |ddS r   )
r   r   r'   r   r+   r/   r   r   r$   r   r   r   r   r    r     r   zceiling.__ge__c                 C   s   t |}| jd jr#|jr| jd |kS |jr#|jr#| jd t|kS | jd |kr0|jr0t jS |t ju r;| jr;t j	S t
| |ddS r   )r   r   r'   r   r+   r/   r   r   r$   r   r   r   r   r   r    r     r   zceiling.__le__r>   r   )rF   rG   rH   rI   r,   rL   r#   rs   rx   r   r   r   r   r   r   r   r   r   r   r   r    r0     r   r0   c                 C   r   r   )r   r   r/   r   r   r   r   r    r     s    c                   @   s   e Zd ZdZedd Zdd Zdd Zdd	 Zd
d Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd$d d!Zd%d"d#ZdS )&r   a  Represents the fractional part of x

    For real numbers it is defined [1]_ as

    .. math::
        x - \left\lfloor{x}\right\rfloor

    Examples
    ========

    >>> from sympy import Symbol, frac, Rational, floor, I
    >>> frac(Rational(4, 3))
    1/3
    >>> frac(-Rational(4, 3))
    2/3

    returns zero for integer arguments

    >>> n = Symbol('n', integer=True)
    >>> frac(n)
    0

    rewrite as floor

    >>> x = Symbol('x')
    >>> frac(x).rewrite(floor)
    x - floor(x)

    for complex arguments

    >>> r = Symbol('r', real=True)
    >>> t = Symbol('t', real=True)
    >>> frac(t + I*r)
    I*frac(r) + frac(t)

    See Also
    ========

    sympy.functions.elementary.integers.floor
    sympy.functions.elementary.integers.ceiling

    References
    ===========

    .. [1] https://en.wikipedia.org/wiki/Fractional_part
    .. [2] https://mathworld.wolfram.com/FractionalPart.html

    c                    s   ddl m   fdd}tjtj}}t|D ]#}|js$tj| jr8t	|}|
tjs3||7 }q||7 }q||7 }q||}||}|tj|  S )Nr   r]   c                    sd   | t jt jfv r ddS | jrt jS | jr,| t ju rt jS | t ju r&t jS | t|  S | ddS r   )	r   r   r   r   r)   r+   rk   ComplexInfinityr/   )r2   r^   r1   r   r    _eval  s   


zfrac.eval.<locals>._eval)ri   r^   r   r)   r   r*   r%   r&   r'   r   r(   )r1   r2   r   realimagr9   r4   r   r   r    r;     s   


z	frac.evalc                 K   r   r   r   r   r   r   r    r     rB   zfrac._eval_rewrite_as_floorc                 K   r   r   r   r   r   r   r    r     r   zfrac._eval_rewrite_as_ceilingc                 C      dS )NTr   r?   r   r   r    rA   	     zfrac._eval_is_finitec                 C   r=   r>   )r   is_extended_realr?   r   r   r    rD     rB   zfrac._eval_is_realc                 C   r=   r>   )r   r%   r?   r   r   r    _eval_is_imaginary  rB   zfrac._eval_is_imaginaryc                 C   r=   r>   )r   r   r?   r   r   r    rE     rB   zfrac._eval_is_integerc                 C   s   t | jd j| jd jgS r>   )r
   r   is_zeror   r?   r   r   r    _eval_is_zero  s   zfrac._eval_is_zeroc                 C   r   )NFr   r?   r   r   r    r}     r   zfrac._eval_is_negativec                 C   s@   | j rt|}|jrtjS | |}|d ur| S t| |ddS NFr   )r   r   is_extended_nonpositiver   r   _value_one_or_morer   r@   r   resr   r   r    r     s   
zfrac.__ge__c                 C   s@   | j rt|}| |}|d ur| S |jrtjS t| |ddS r   )r   r   r   is_extended_negativer   r   r   r   r   r   r    r   '  s   
zfrac.__gt__c                 C   >   | j rt|}|jrtjS | |}|d ur|S t| |ddS r   )r   r   r   r   r   r   r   r   r   r   r    r   3     
zfrac.__le__c                 C   r   r   )r   r   r   r   r   r   r   r   r   r   r    r   ?  r   zfrac.__lt__c                 C   sF   |j r|jr|dk}|rt|tstjS |jr|jr!tjS d S d S d S )Nrc   )r   r+   r.   r   r   r   r   rn   r   r   r   r    r   K  s   zfrac._value_one_or_moreNr   c           	      C   s   ddl m} | jd }||d}| |d}|jr6|jr4|j||d}|jr*tj	S || j
|||dS |S |tjtjtjfv rE|ddS |j
|||dS )Nr   r]   rd   rg   rc   )ri   r^   r   rj   r$   r   rb   rm   r   Onero   r   r   r   rp   r   r   r    rs   T  s   

zfrac._eval_as_leading_termc                 C   s   ddl m} | jd }||d}| |d}|jr=ddlm}	 |dkr-|d|df}
|
S |	dd||| |df }
|
S || j||||d}|jrb|j	||d}||j
r\tj7 }|S tj7 }|S ||7 }|S )Nr   rt   r]   rc   rg   rd   )rw   ru   r   rj   rv   ri   r^   rx   r   rb   rm   r   r   r)   )r@   r   rz   rh   re   ru   r2   rq   r:   r^   r|   r   rr   r   r   r    rx   f  s&   
zfrac._eval_nseriesr>   r   )rF   rG   rH   rI   rL   r;   r   r   rA   rD   r   rE   r   r}   r   r   r   r   r   rs   rx   r   r   r   r    r     s&    0
"
	r   c                 C   sD   |  t|ks|  t|krdS |jrdS | |}|d ur dS d S )NTF)r   r/   r0   r   r   )r   r   r   r   r   r    r   z  s   
N)'typingr   rJ   sympy.core.basicr   sympy.core.exprr   
sympy.corer   r   sympy.core.evalfr   r   sympy.core.functionr	   sympy.core.logicr
   sympy.core.numbersr   r   sympy.core.relationalr   r   r   r   r   r   sympy.core.sympifyr   $sympy.functions.elementary.complexesr   r   sympy.multipledispatchr   r   r/   r   r0   r   r   r   r   r    <module>   s2     K #
 #
 L