o
    @a6                     @   s   d Z ddlmZmZ ddlZddlZG dd deZG dd deZee	d e	dZ
ee
gZd	d
 Zdd Zdd Zdd Zdd Zdd Zdd ZdS )z3 Module with facilities to represent range values.     )isinfisnanNc                   @   s   e Zd ZdZdd Zed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eZdd Ze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d0d1 Zd2d3 Zd4d5 Z d6d7 Z!e Z"d8S )9Intervalz' Representation for a range of values. c                 C   s4   t |r	td }t |rtd
 }|| _|| _dS )z( Set initial bound of the range object. infN)r   float_low_high)selflowhigh r   2/usr/lib/python3/dist-packages/pythran/interval.py__init__   s   


zInterval.__init__c                 C      | j S N)r   r	   r   r   r   r
         zInterval.lowc                 C   r   r   )r   r   r   r   r   r      r   zInterval.highc                 C   s   dj | j| jdS )z2 Return a nicely formatted representation string. z Interval(low={low}, high={high})r
   r   )formatr
   r   r   r   r   r   __repr__   s   zInterval.__repr__c                 C   s   | j | jfS r   r   r   r   r   r   bounds#   s   zInterval.boundsc                 C   s   | j |  ko| jkS   S r   r   )r	   valuer   r   r   __contains__&   s   zInterval.__contains__c                 C      t t| j|jt| j|jS )z$ Intersect current range with other.)r   minr
   maxr   r	   otherr   r   r   union)   s   zInterval.unionc                 C   r   r   )r   r   r
   r   r   r   r   r   r   	intersect-   s   zInterval.intersectc                 C   s   t | j| jS r   )r   r
   r   r   r   r   r   copy0      zInterval.copyc                 C   sD   | j |j k rtd }n| j }| j|jkrtd}n| j}t||S )z Widen current range. r   )r
   r   r   r   )r	   r   r
   r   r   r   r   widen3   s   

zInterval.widenc                    sf    fdd}t tt| rt dd | D rtS dd t   D }tt|t	|S )a(  
        Combiner for Multiplication operation.

        >>> Interval(1, 5) * Interval(-5, -4)
        Interval(low=-25, high=-4)
        >>> Interval(-1, 5) * Interval(-5, 3)
        Interval(low=-25, high=15)
        >>> Interval(1, 5) * Interval(3, 8)
        Interval(low=3, high=40)
        c                         t    S r   	itertoolschainr   r   r   r	   r   r   
all_boundsK      z$Interval.__mul__.<locals>.all_boundsc                 s   s    | ]}|d kV  qdS )r   Nr   .0xr   r   r   	<genexpr>N       z#Interval.__mul__.<locals>.<genexpr>c                 S   s   g | ]\}}|| qS r   r   r+   Zv1Zv2r   r   r   
<listcomp>Q       z$Interval.__mul__.<locals>.<listcomp>)
anymapr   UNKNOWN_RANGEr%   productr   r   r   r   r	   r   r(   resr   r'   r   __mul__?   s   $zInterval.__mul__c                    s|    j dkr jdkrtS  j dkrtS  fdd}tdd | D r&tS dd t   D }tt|t	|S )a"  
        Combiner for Divide operation.

        >>> Interval(-1, 5) / Interval(3, 8)
        Interval(low=-1, high=1)
        >>> Interval(-1, 5) / Interval(-5, -4)
        Interval(low=-2, high=0)
        >>> Interval(-1, 5) / Interval(-5, 3)
        Interval(low=-inf, high=inf)
        r   c                      r#   r   r$   r   r'   r   r   r(   h   r)   z$Interval.__div__.<locals>.all_boundsc                 s   s    | ]}t |V  qd S r   r   r*   r   r   r   r-   k   r.   z#Interval.__div__.<locals>.<genexpr>c                 S   s   g | ]\}}|| qS r   r   r/   r   r   r   r0   n   r1   z$Interval.__div__.<locals>.<listcomp>)
r
   r   r4   r2   r%   r5   r   r   r   r   r6   r   r'   r   __div__W   s   
zInterval.__div__c                 C   s|   t |trtS | j| j|j|jf\}}}}t|r%t|r%|| dk r%tS t|r5t|r5|| dk r5tS t|| || S )z
        Combiner for Addition operation.

        >>> Interval(-12, 5) + Interval(-5, -3)
        Interval(low=-17, high=2)
        r   )
isinstanceIntervalTupler4   r
   r   r   r   r	   r   slshZolZohr   r   r   __add__t   s   
zInterval.__add__c                 C   sV   | j | j|j |jf\}}}}t|rt|rtS t|r"t|r"tS t|| || S )z
        Combiner for Subtraction operation.

        >>> Interval(1, 5) - Interval(-5, -4)
        Interval(low=5, high=10)
        )r
   r   r   r4   r   r=   r   r   r   __sub__   s   zInterval.__sub__c                 C   s~   | j dkrt| j r| j }n| j |j ? }nt|jrd}n| j |j? }t| jr,| j}nt|j r4d}n| j|j ? }t||S )a  
        Combiner for Right shift operation.

        >>> Interval(10, 100) >> Interval(3, 8)
        Interval(low=0, high=12)
        >>> Interval(10, float("inf")) >> Interval(3, 8)
        Interval(low=0, high=inf)
        >>> Interval(-float("inf"), 0) >> Interval(3, 8)
        Interval(low=-inf, high=0)
        >>> Interval(-30, 10) >> Interval(3, float('inf'))
        Interval(low=-4, high=1)
        r   )r
   r   r   r   )range1range2min_max_r   r   r   
__rshift__   s   





zInterval.__rshift__c                 C   s$   t dt|jtt| jt| jS )z Combiner for Modulo operation.

        >>> Interval(-1, 5) % Interval(1, 13)
        Interval(low=0, high=5)
        >>> Interval(-21, 5) % Interval(1, 13)
        Interval(low=0, high=13)
        r   )r   r   r   r   absr
   )rB   rC   r   r   r   __mod__   s   
zInterval.__mod__c                 C   s<   dd t |  | D }ttt|tt|S )a/  
        Combiner for Power operation.

        >>> Interval(1, 5) ** Interval(-5, -4)
        Interval(low=1.0, high=1.0)
        >>> Interval(-1, 5) ** Interval(-5, 3)
        Interval(low=-1.0, high=125.0)
        >>> Interval(1, 5) ** Interval(3, 8)
        Interval(low=1.0, high=390625.0)
        c                 S   s   g | ]\}}|| qS r   r   r/   r   r   r   r0      r1   z$Interval.__pow__.<locals>.<listcomp>)	r%   r5   r   r   numpyZceilr   Zfloorr   rB   rC   r7   r   r   r   __pow__   s   zInterval.__pow__c                 C   sd   t | jp	t |j}t | jpt |j}|rtd n| j|j> }|r'tdn| j|j> }t||S )a  
        Combiner for Left shift operation.

        >>> Interval(1, 5) << Interval(3, 8)
        Interval(low=8, high=1280)
        >>> Interval(1, float("inf")) << Interval(3, 8)
        Interval(low=8, high=inf)
        >>> Interval(-float("inf"), 0) << Interval(3, 8)
        Interval(low=-inf, high=0)
        >>> Interval(-3, 1) << Interval(3, float('inf'))
        Interval(low=-24, high=inf)
        r   )r   r
   r   r   r   )rB   rC   Zmin_infZmax_infrD   rE   r   r   r   
__lshift__   s
   
zInterval.__lshift__c                 C   sV   |j dkr|jdkrtS |j dkrtS dd t|  | D }tt|t|S )a+  
        Combiner for Floor divide operation.

        >>> Interval(-1, 5) // Interval(3, 8)
        Interval(low=-1, high=1)
        >>> Interval(-1, 5) // Interval(-5, -4)
        Interval(low=-2, high=0)
        >>> Interval(-1, 5) // Interval(-5, 3)
        Interval(low=-inf, high=inf)
        r   c                 S   s$   g | ]\}}t |r|n|| qS r   r9   r/   r   r   r   r0      s   $ z)Interval.__floordiv__.<locals>.<listcomp>)	r
   r   r4   r%   r5   r   r   r   r   rJ   r   r   r   __floordiv__   s   
zInterval.__floordiv__c                 C   s6   | j |jk rtddS | j|j krtddS tddS )an  
        Combiner for lower than operation.

        >>> Interval(-1, 5) < Interval(6, 7)
        Interval(low=1, high=1)
        >>> Interval(-1, 5) < Interval(5, 7)
        Interval(low=0, high=1)

        >>> Interval(-1, 5) < Interval(-16, -7)
        Interval(low=0, high=0)

        >>> Interval(1, 5) < Interval(3, 7)
        Interval(low=0, high=1)

           r   r   r
   r   r   r   r   r   __lt__   
   


zInterval.__lt__c                 C   s6   | j |jkrtddS | j|j krtddS tddS )a{  
        Combiner for lower than or equal operation.

        >>> Interval(-1, 5) <= Interval(6, 7)
        Interval(low=1, high=1)
        >>> Interval(-1, 5) <= Interval(5, 7)
        Interval(low=1, high=1)

        >>> Interval(-1, 5) <= Interval(-16, -7)
        Interval(low=0, high=0)

        >>> Interval(1, 5) <= Interval(3, 7)
        Interval(low=0, high=1)

        rN   r   rO   r   r   r   r   __le__  rQ   zInterval.__le__c                 C   s6   | j |jkrtddS | j|j krtddS tddS )aq  
        Combiner for greater than operation.

        >>> Interval(-5, 1) > Interval(-7, -6)
        Interval(low=1, high=1)
        >>> Interval(-5, 1) > Interval(-7, -5)
        Interval(low=0, high=1)

        >>> Interval(-1, 5) > Interval(6, 7)
        Interval(low=0, high=0)

        >>> Interval(1, 5) > Interval(3, 7)
        Interval(low=0, high=1)

        rN   r   r
   r   r   r   r   r   r   __gt__!  rQ   zInterval.__gt__c                 C   s6   | j |jkrtddS | j|j k rtddS tddS )a~  
        Combiner for greater than or equal operation.

        >>> Interval(-5, 1) >= Interval(-7, -6)
        Interval(low=1, high=1)
        >>> Interval(-5, 1) >= Interval(-7, -5)
        Interval(low=1, high=1)

        >>> Interval(-1, 5) >= Interval(6, 7)
        Interval(low=0, high=0)

        >>> Interval(1, 5) >= Interval(3, 7)
        Interval(low=0, high=1)

        rN   r   rS   r   r   r   r   __ge__7  rQ   zInterval.__ge__c                 C   sl   t | jr
tddS | j| j  kr|j  kr|jkr$n ntddS | |k s,| |kr1tddS tddS )a  
        Combiner for equal operation.

        >>> Interval(-5, 1) == Interval(-7, -6)
        Interval(low=0, high=0)
        >>> Interval(-5, 1) == Interval(-7, -5)
        Interval(low=0, high=1)
        >>> Interval(-1, 5) == Interval(6, 7)
        Interval(low=0, high=0)
        r   rN   r   r
   r   r   r   r   r   r   __eq__M     

*


zInterval.__eq__c                 C   sl   t | jr
tddS | j| j  kr|j  kr|jkr$n ntddS | |k s,| |kr1tddS tddS )a"  
        Combiner for not equal operation.

        >>> Interval(-5, 1) != Interval(-7, -6)
        Interval(low=1, high=1)
        >>> Interval(-5, 1) != Interval(-7, -5)
        Interval(low=0, high=1)
        >>> Interval(-1, 5) != Interval(6, 7)
        Interval(low=1, high=1)
        r   rN   rV   r   r   r   r   __ne__a  rX   zInterval.__ne__c                 C   s"   t | j o| j| jko| jdkS )Nr   )r   r   r
   r   r   r   r   __nonzero__u  s   "zInterval.__nonzero__c                 C   s   t S r   )r4   )r	   indexr   r   r   __getitem__x  s   zInterval.__getitem__N)#__name__
__module____qualname____doc__r   propertyr
   r   r   r   r   r   r   r    r"   r8   Z__mult__r:   __truediv__r@   rA   rF   rH   rK   rL   rM   rP   rR   rT   rU   rW   rY   rZ   r\   __bool__r   r   r   r   r   	   sD    	

r   c                   @   sT   e Zd Zdd Zdd Zdd Zedd Zed	d
 Zdd Z	dd Z
dd ZdS )r<   c                 C   s   t || _d S r   )tuplevalues)r	   re   r   r   r   r     r!   zIntervalTuple.__init__c                 C   *   t |trtS tdd t| j|jD S )Nc                 s       | ]
\}}| |V  qd S r   )r   r+   r,   yr   r   r   r-         z&IntervalTuple.union.<locals>.<genexpr>r;   r   UNKNOWN_TUPLE_RANGEr<   zipre   r   r   r   r   r     
   

zIntervalTuple.unionc                 C   rf   )Nc                 s   rg   r   )r   rh   r   r   r   r-     rj   z*IntervalTuple.intersect.<locals>.<genexpr>rk   r   r   r   r   r     rn   zIntervalTuple.intersectc                 C      t jS r   )r4   r   r   r   r   r   r     r   zIntervalTuple.highc                 C   ro   r   )r4   r
   r   r   r   r   r
     r   zIntervalTuple.lowc                 C   sf   d }t d|j}tt| jd |j}t||d D ]}|d u r&| j| }q|| j| }q|p2tS )Nr   rN   )	r   r
   r   lenre   r   ranger   r4   )r	   r[   outr
   r   ir   r   r   r\     s   zIntervalTuple.__getitem__c                 C   rf   )Nc                 s   rg   r   )r"   )r+   sor   r   r   r-     rj   z&IntervalTuple.widen.<locals>.<genexpr>rk   r   r   r   r   r"     rn   zIntervalTuple.widenc                 C   s   t |trtS t| j|j S r   )r;   r   rl   r<   re   r   r   r   r   r@     s   
zIntervalTuple.__add__N)r]   r^   r_   r   r   r   ra   r   r
   r\   r"   r@   r   r   r   r   r<   ~  s    

r<   r   c                 C   s   t | dkrtd| d jS t | dkrt| d j| d jS t | dkrU| d jdk }| d jdk}|r9|r9tS |rHt| d j| d jd S t| d j| d jd S dS )zE Function used to compute returned range value of [x]range function. rN   r         N)rp   r   r   r
   r4   )argsZis_negZis_posr   r   r   range_values  s   ry   c                 C   
   t ddS )z3 Return the range of a boolean value, i.e. [0, 1]. r   rN   r   _r   r   r   bool_values     
r~   c                 C   rz   )z7 Return the range of a comparison value, i.e. [-1, 1]. rN   r{   r|   r   r   r   
cmp_values  r   r   c                 C   s   t dtdS )z. Return a positive range without upper bound. r   r   )r   r   r|   r   r   r   positive_values  s   r   c                 C   &   t tdd | D tdd | D S )z) Return possible range for max function. c                 s       | ]}|j V  qd S r   r
   r*   r   r   r   r-         zmax_values.<locals>.<genexpr>c                 s   r   r   r   r*   r   r   r   r-     r   )r   r   rx   r   r   r   
max_values     &r   c                 C   r   )z) Return possible range for min function. c                 s   r   r   r   r*   r   r   r   r-     r   zmin_values.<locals>.<genexpr>c                 s   r   r   r   r*   r   r   r   r-     r   )r   r   r   r   r   r   
min_values  r   r   c                 C   rz   )z) Return possible range for ord function. r      r{   r|   r   r   r   
ord_values  r   r   )r`   Zmathr   r   r%   rI   objectr   r<   r   r4   rl   ry   r~   r   r   r   r   r   r   r   r   r   <module>   s"      w0
