o
    wZh                     @  s&  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	m
Z
mZmZmZmZmZmZ d dlmZ d dlZd dlmZmZ d dlZ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$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z, dd
l-m.Z. ddl/m0Z0m1Z1m2Z2 e3e4Z5ddgZ6edej7eZ8G dd de9Z:dd Z;dd Z<d(ddZ=d)ddZ>ee?e@ej7f ZAeeBef ZCeeAeCf ZDe	ej7gej7f ZEe	ej7ej7gej7f ZFe	egef ZGe	eegef ZHeeEeGf ZIeeFeHf ZJejKddG d d de
e8 ZLG d!d" d"ZM	d*d+d'dZNdS ),    )annotationsN)CallableGenericOptionaloverloadSupportsFloatTYPE_CHECKINGTypeVarUnion)	TypeGuard)BooleanBooleanAtom)
LazyString)dtype_to_type   )_keep_floatFloatTrueDivFloorDiv
IntTrueDivOpaqueUnaryFn_expOpaqueUnaryFn_logOpaqueUnaryFn_log2OpaqueUnaryFn_sqrtPowByNaturalRoundDecimal
RoundToIntsafe_powToFloatTruncToFloat
TruncToInt)sympy_interp)int_ooIntInfinityNegativeIntInfinityValueRangesbound_sympy_Tc                   @  s   e Zd ZdS )ValueRangeErrorN)__name__
__module____qualname__ r+   r+   N/var/www/auris/lib/python3.10/site-packages/torch/utils/_sympy/value_ranges.pyr'   9   s    r'   c                 C  s   t | tr| r
tjS tjS t | trt| S t | tr1t	| r,| dkr(tj
S tj
 S t| S t | tjrG| js>J | | tjksEJ | S t | trN| S tdt|  d|  )Nr   znot simple sympy type : )
isinstanceboolsympytruefalseintIntegerfloatmathisinfooFloatExprZ	is_numbernanr   AssertionErrortype)er+   r+   r,   simple_sympify?   s   






r?   c                 C  sP   t | tjrt |tjsJ || kS t | trt |ts"J | |f| o&|  S N)r.   r0   r:   SympyBooleanlowerupperr+   r+   r,   sympy_generic_leX   s   rE   vrValueRanges[_T]return$TypeGuard[ValueRanges[SympyBoolean]]c                 C  s   | j S r@   is_boolrF   r+   r+   r,   
vr_is_boolg   s   rM   "TypeGuard[ValueRanges[sympy.Expr]]c                 C  s   | j  S r@   rJ   rL   r+   r+   r,   
vr_is_exprk   s   rO   T)frozenc                   @  s  e Zd ZU ereej Zee Z	e
ee	f Zded< ded< ded< ded< ded< dUd
dZedVddZedWddZdXddZdYddZdZddZdd Zd[ddZed\d!d"Zed]d#d"Zd^d%d"Zed\d&d'Zed]d(d'Zd^d)d'Zd_d*d+Zeejd`d,d-Zeejd`d.d/ZeejdYd0d1Zeedad5d6Zeedbd9d6Zedcd;d6Zeddd>d?Zeeddd@dAZeededCdAZedfdEdAZedddFdGZ edddHdIZ!eedgdLdMZ"eedhdOdMZ"edidQdMZ"e#dRdS Z$dTS )jr$   r&   rC   rD   r/   rK   is_intis_floatrH   strc                 C  s   d| j  d| j dS )NzVR[z, ]rB   selfr+   r+   r,   __repr__   s   zValueRanges.__repr__rV   ValueRanges[sympy.Expr]ExprInNonec                 C     d S r@   r+   rV   rC   rD   r+   r+   r,   __init__      zValueRanges.__init__ValueRanges[SympyBoolean]BoolInc                 C  r[   r@   r+   r\   r+   r+   r,   r]      r^   AllInc           	   
   C  sn  t |}t |}zt||std| d| dW n ty1 } ztd| d| |d }~ww t|t}t|t}||ksFJ ||ft|tjrS|tjkrSt	}t|tjrb|tj krbt	 }tjt
tf}t||}t||}t| d| t| d| t| d| t| d	| j o|o| 	 t| d
| j o| j  | js| js| jsJ ||fd S d S d S )NzInvalid ranges [:rT   zCould not compare z <= rC   rD   rK   rQ   rR   )r?   rE   r'   	TypeErrorr.   rA   r0   r4   r8   r!   r#   r"   object__setattr__rK   rQ   rR   )	rV   rC   rD   r>   Zis_bool_lowerZis_bool_upperinteger_typesZis_int_lowerZis_int_upperr+   r+   r,   r]      s>   




*c                 C  s.   t | r| S | t krt S td|  )Nznot bool like )rM   r$   unknownunknown_boolr<   rU   r+   r+   r,   boolify   s
   zValueRanges.boolifyxc                 C  s   t || S r@   )r$   wrapissubset)rV   rj   r+   r+   r,   __contains__   s   zValueRanges.__contains__c                 C  s,   ||   u rdS t|j| jot| j|jS )NT)unknown_intrE   rC   rD   rV   otherr+   r+   r,   rl      s
   zValueRanges.issubsetc                 C  s   | |@ S )z1Given two ValueRanges, returns their intersectionr+   ro   r+   r+   r,   tighten      zValueRanges.tightenrp   c                 C  r[   r@   r+   ro   r+   r+   r,   __and__      zValueRanges.__and__c                 C  r[   r@   r+   ro   r+   r+   r,   rs      rt   AllVRc                 C  s   |t  t  fv r| S | t  t  fv r|S | j|jks$J | |f| j|jks0J | |f| j|jks<J | |f| jrPt t| j|jt	| j
|j
S t t| j|jt| j
|j
S r@   )r$   rg   rn   rK   rQ   rR   r0   OrrC   AndrD   MaxMinro   r+   r+   r,   rs      s   c                 C  r[   r@   r+   ro   r+   r+   r,   __or__  rt   zValueRanges.__or__c                 C  r[   r@   r+   ro   r+   r+   r,   rz     rt   c                 C  s   t  | |fv rt  S | j|jksJ | |f| j|jks$J | |f| j|jks0J | |f| jrDt t| j|jt| j	|j	S t t
| j|jt| j	|j	S r@   )r$   rg   rK   rQ   rR   r0   rw   rC   rv   rD   ry   rx   ro   r+   r+   r,   rz     s   c                 C  s   | j | jkS r@   rB   rU   r+   r+   r,   is_singleton,  s   zValueRanges.is_singletonc                   C     t tj tjS r@   r$   r0   r8   r+   r+   r+   r,   rg   /     zValueRanges.unknownc                   C  s   t t tS r@   )r$   r!   r+   r+   r+   r,   rn   4  s   zValueRanges.unknown_intc                   C  s   t tjtjS r@   )r$   r0   r2   r1   r+   r+   r+   r,   rh   9  s   zValueRanges.unknown_boolargUnion[ExprIn, ExprVR]ExprVRc                 C  r[   r@   r+   r   r+   r+   r,   rk   >  s   zValueRanges.wrapUnion[BoolIn, BoolVR]BoolVRc                 C  r[   r@   r+   r   r+   r+   r,   rk   D     Union[AllIn, AllVR]c                 C  s4   t | tr| S t | trt| rt S t| | S r@   )r.   r$   r5   r6   isnanrg   r   r+   r+   r,   rk   I  s
   

fnExprFnc                 C      t | } t || j|| jS )z#Increasing: x <= y => f(x) <= f(y).r$   rk   rC   rD   rj   r   r+   r+   r,   increasing_mapR  s   
zValueRanges.increasing_mapc                 C  r[   r@   r+   r   r+   r+   r,   decreasing_mapX  r   zValueRanges.decreasing_mapBoolFnc                 C  r[   r@   r+   r   r+   r+   r,   r   ]  r   AllFnc                 C  r   )z#Decreasing: x <= y => f(x) >= f(y).)r$   rk   rD   rC   r   r+   r+   r,   r   b  s   
c                 C  s4   t | } || j}|| j}t t||t||S )zIt's increasing or decreasing.)r$   rk   rC   rD   minmax)rj   r   lur+   r+   r,   monotone_mapi  s   


zValueRanges.monotone_mapc                 C  sf   t | } d| v r-t|| j|| j}t|}t|tjs#|tj	kr(t d|S t d|S t 
| |S )z$Fn is convex and has a minimum at 0.r           )r$   rk   r   rC   rD   r?   r.   r0   r9   r8   r   )rj   r   rD   r+   r+   r,   convex_min_zero_mapq  s   


zValueRanges.convex_min_zero_mapyExprFn2c                 C  r[   r@   r+   rj   r   r   r+   r+   r,   coordinatewise_increasing_map}     z)ValueRanges.coordinatewise_increasing_mapBoolFn2c                 C  r[   r@   r+   r   r+   r+   r,   r     r   AllFn2c                 C  s4   t | t |} }t || j|j|| j|jS )z
        It's increasing on each coordinate.

        Mathematically:
        For every 1 <= i <= n and x_i <= y_i we have that
        f(x1, .., xn) <= f(x1, , yi, ..., xn)
        r   r   r+   r+   r,   r     s
   c                   sR   |  ||  |}} fddt|j|jg|j|jgD }tt|t|S )z1It's increasing or decreasing on each coordinate.c                   s   g | ]	\}} ||qS r+   r+   ).0abr   r+   r,   
<listcomp>  s    z;ValueRanges.coordinatewise_monotone_map.<locals>.<listcomp>)rk   	itertoolsproductrC   rD   r$   r   r   )clsrj   r   r   productsr+   r   r,   coordinatewise_monotone_map  s
   
z'ValueRanges.coordinatewise_monotone_mapN)rH   rS   )rV   rX   rC   rY   rD   rY   rH   rZ   )rV   r_   rC   r`   rD   r`   rH   rZ   )rC   ra   rD   ra   rH   rZ   )rH   r_   )rj   ra   rH   r/   )rH   r$   )rV   rX   rp   rX   rH   rX   )rV   r_   rp   r_   rH   r_   )rV   ru   rp   ru   rH   ru   )rH   r/   )rH   rX   )r   r   rH   r   )r   r   rH   r   )r   r   rH   ru   )rj   r   r   r   rH   r   )rj   r   r   r   rH   r   )rj   r   r   r   rH   ru   )rj   r   r   r   r   r   rH   r   )rj   r   r   r   r   r   rH   r   )rj   r   r   r   r   r   rH   ru   )%r(   r)   r*   r   r$   r0   r:   r   rA   r   r
   ru   __annotations__rW   r   r]   ri   rm   rl   rq   rs   rz   r{   staticmethod	functoolscacherg   rn   rh   rk   r   r   r   r   r   classmethodr   r+   r+   r+   r,   r$   z   s   
 



:




c                   @  s  e Zd ZdZedd ZedoddZedd Zed	d
 Zedd Z	edd Z
edd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zedd  Zed!d" Zed#d$ Zed%d& Zed'd( Zed)d* Zed+d, Zed-d. Zed/d0 Zed1d2 Zed3d4 Zed5d6 Zed7d8 Z ed9d: Z!ed;d< Z"ed=d> Z#ed?d@ Z$edAdB Z%edCdD Z&edEdF Z'edGdH Z(edIdJ Z)edKdL Z*edMdN Z+edOdP Z,edQdR Z-edSdT Z.edUdV Z/edWdX Z0edYdZ Z1ed[d\ Z2ed]d^ Z3ed_d` Z4edadb Z5edcdd Z6ededf Z7edgdh Z8edidj Z9edkdl Z:edmdn Z;dS )pSymPyValueRangeAnalysisz
    It gives bounds on a SymPy operator given bounds on its arguments
    See the function `bound_sympy` for a function that applies this logic to a full SymPy expression
    c                 C  s   t | tr|  sJ | j} t | tttf}|s$t | ttj	tj
fs$J t | trBt| rB|tjkr7t S |jr>t S t S |rMt|}|| } n|tjkrZt | tsYJ n|jrf| jre| jseJ n| jskJ t| }|S r@   )r.   r$   r{   rC   r3   r5   r/   r   r0   r4   Numberr   r6   r   torchrh   is_floating_pointrg   rn   r   	is_finiteZis_real
is_integerrk   )valuedtypeZ	is_pythontype_rr+   r+   r,   constant  s0   





z SymPyValueRangeAnalysis.constantNc                 C  s>   |t jkrt| tS |t jkrt S |jst S t	 S r@   )
r   Zfloat64r$   r   r   r/   rh   r   rn   rg   )r   r   Z	src_dtyper+   r+   r,   to_dtype  s   

z SymPyValueRangeAnalysis.to_dtypec                 C     t | tS r@   )r$   r   r   )r   r   r+   r+   r,   trunc_to_int     z$SymPyValueRangeAnalysis.trunc_to_intc                 C  s*   t | } |  } | jsJ t | tjS r@   )r$   rk   ri   rK   r   r0   Not)r   r+   r+   r,   not_  s   

zSymPyValueRangeAnalysis.not_c                 C     t | |tjS r@   )r$   r   r0   rv   r   r   r+   r+   r,   or_     zSymPyValueRangeAnalysis.or_c                 C  r   r@   )r$   r   r0   rw   r   r+   r+   r,   and_  r   zSymPyValueRangeAnalysis.and_c                 C  s<   |   rtt| jrdS dS ttdtdS Nr   r   )r{   r$   rk   r0   r4   rC   rj   r+   r+   r,   _bool_to_int  s   z$SymPyValueRangeAnalysis._bool_to_intc                 C  s   t |t |}}|jr|jr| ||S |jr| |}|jr'| |}t|j|j}|dk rX|tj krX|t	 krXzdt
| d  >  }W n tyW   t	 }Y nw d}t |t|j|jS )Nr   r   )r$   rk   rK   r   r   r   rC   r0   r8   r!   r3   
bit_length	Exceptionr   rD   )r   r   r   rC   r+   r+   r,   bitwise_and  s    


z#SymPyValueRangeAnalysis.bitwise_andc                 C  s   t |t |}}|jr|jr| ||S |jr| |}|jr'| |}t|j|j}|dkr5d}n+|dkrZ|tjkrZ|t	krZzdt
| > d }W n tyY   t	}Y nw |dk r`d}t t|j|j|S )Nr   r   )r$   rk   rK   r   r   r   rD   r0   r8   r!   r3   r   r   r   rC   )r   r   r   rD   r+   r+   r,   
bitwise_or  s&   

z"SymPyValueRangeAnalysis.bitwise_orc                 C  sn   t | } t |}|  r| r| j|jkrt tjS | j|jks*|j| jkr0t tjS t tjtjS r@   )r$   rk   r{   rC   r0   r1   rD   r2   r   r+   r+   r,   eq+  s   

zSymPyValueRangeAnalysis.eqc                 C     |  | ||S r@   )r   r   r   r   r   r+   r+   r,   ne5     zSymPyValueRangeAnalysis.nec                 C  s
   t |S r@   )r$   rk   )r   r   r+   r+   r,   identity9  s   
z SymPyValueRangeAnalysis.identityc                 C  sz   t |}t |}|j|jksJ |jr| | ||S |j|jk r*t tjS |j|jkr6t tj	S t tj	tjS r@   )
r$   rk   rK   r   r   rD   rC   r0   r1   r2   r   r+   r+   r,   lt=  s   

zSymPyValueRangeAnalysis.ltc                 C  s   |  ||S r@   )r   r   r+   r+   r,   gtK  r   zSymPyValueRangeAnalysis.gtc                 C  r   r@   )r   r   r   r+   r+   r,   leO  r   zSymPyValueRangeAnalysis.lec                 C  r   r@   )r   r   r   r+   r+   r,   geS  r   zSymPyValueRangeAnalysis.gec                 C  s   t | |ttjS r@   )r$   r   r   operatoraddr   r+   r+   r,   r   W     zSymPyValueRangeAnalysis.addc                 C  sP   t |}t |}|j|jksJ |jr| ||S dd }t ||t|S )Nc                 S  s0   | dks| dkr
| S |dks|dkr|S | | S )Nr   r   r+   r   r+   r+   r,   safe_mulf  s
   z-SymPyValueRangeAnalysis.mul.<locals>.safe_mul)r$   rk   rK   r   r   r   )r   r   r   r   r+   r+   r,   mul]  s   

	zSymPyValueRangeAnalysis.mulc                 C  sZ   t | } t |}d|v s t | v st| v r$t |v s t|v r$t  S t | |ttS Nr   )r$   rk   r!   rg   r   r   r   r   r+   r+   r,   int_truedivq  s   

,
z#SymPyValueRangeAnalysis.int_truedivc                 C  sb   t | } t |}d|v s$tj | v stj| v r(tj |v s$tj|v r(t  S t | |ttS r   )r$   rk   r0   r8   rg   r   r   r   r   r+   r+   r,   truediv|  s   

,
zSymPyValueRangeAnalysis.truedivc                 C  s   t | } t |}d|v rt  S g }t| j| jg|j|jgD ]#\}}t||}|tj	u r@|
t|t| t  q"|
| q"t t|t|S r   )r$   rk   rn   r   r   rC   rD   r   r0   r;   appendsignr!   r   r   )r   r   r   rj   r   r   r+   r+   r,   floordiv  s   

$

 z SymPyValueRangeAnalysis.floordivc                   s   t |}t |}dd  dd }d|v rt  S | rit|j||j||jkr:t | fddS |jdk rGt  d dS |jdkrSt dd S t d |j}t	d |j}t ||S | |jd }t | |S )	Nc                 S  s$   t | t | }| dk r|d9 }|S )Nr   r   )abs)r   r   retr+   r+   r,   c_mod  s   z*SymPyValueRangeAnalysis.mod.<locals>.c_modc                 S  s*   | | }|j r|tt fvrt|S |S r@   )r   r!   r0   r4   )r   r   rj   r+   r+   r,   c_div  s   "z*SymPyValueRangeAnalysis.mod.<locals>.c_divr   c                   s
    | S r@   r+   )r   r   Zy_valr+   r,   <lambda>     
 z-SymPyValueRangeAnalysis.mod.<locals>.<lambda>r   )
r$   rk   rn   r{   r   rC   rD   r   r   r   )r   rj   r   r   rC   rD   r+   r   r,   mod  s&   





zSymPyValueRangeAnalysis.modc                 C  s   |  | |||S r@   )r   r   )r   r   r   cr+   r+   r,   modular_indexing     z(SymPyValueRangeAnalysis.modular_indexingc                 G     t  S r@   )r$   rn   )r   argsr+   r+   r,   &is_non_overlapping_and_dense_indicator  rr   z>SymPyValueRangeAnalysis.is_non_overlapping_and_dense_indicatorc                   s   t |}t   | r  rt t|j jS |jdkr-t | t dt@ tS   rL jd dkrBt | fddS t 	| fddS t
|j|j }t t| j t| jS )Nr   r      c                      t |  jS r@   r   rC   r   r   r+   r,   r         z8SymPyValueRangeAnalysis.pow_by_natural.<locals>.<lambda>c                   r   r@   r   r   r   r+   r,   r     r   )r$   rk   r{   r   rC   r   r!   r   r   r   r   rD   )r   r   r   Zmax_baser+   r   r,   pow_by_natural  s$   


z&SymPyValueRangeAnalysis.pow_by_naturalc                 C  r   r@   )r$   rg   r   r+   r+   r,   pow  rr   zSymPyValueRangeAnalysis.powc                 C  s*   t | } d| v rt  S t | dd S )zENeeded as it's used in pow, but it won't appear on a SymPy expressionr   c                 S  s
   t d| S )N      ?)r   )r   r+   r+   r,   r     r   z4SymPyValueRangeAnalysis.reciprocal.<locals>.<lambda>)r$   rk   rg   r   r   r+   r+   r,   
reciprocal  s   
z"SymPyValueRangeAnalysis.reciprocalc                 C  r   r@   )r$   r   r   r   r+   r+   r,   r   !  r   zSymPyValueRangeAnalysis.absc                 C  r   r@   )r$   r   r   r   r+   r+   r,   exp%  r   zSymPyValueRangeAnalysis.expc                 C  (   t | } | jdkrt  S t | tS r   )r$   rk   rC   rg   r   r   r   r+   r+   r,   log)     

zSymPyValueRangeAnalysis.logc                 C  r   r   )r$   rk   rC   rg   r   r   r   r+   r+   r,   log20  r   zSymPyValueRangeAnalysis.log2c                 C     |  ||tjS r@   )
min_or_maxr0   ry   r   r+   r+   r,   minimum7  r   zSymPyValueRangeAnalysis.minimumc                 C  r   r@   )r   r0   rx   r   r+   r+   r,   maximum;  r   zSymPyValueRangeAnalysis.maximumc                 C  s"   t | } t |}t | ||S r@   )r$   rk   r   )r   r   r   r+   r+   r,   r   ?  s   

z"SymPyValueRangeAnalysis.min_or_maxc                 C     t |tjjjjS r@   )r$   r   r0   	functions
elementaryintegersfloorr   rj   r   r+   r+   r,   floor_to_intE  r   z$SymPyValueRangeAnalysis.floor_to_intc                 C  r  r@   )r$   r   r0   r  r  r  ceilingr  r+   r+   r,   ceil_to_intI  r   z#SymPyValueRangeAnalysis.ceil_to_intc                 C     t |ttjjjjS r@   )r$   r   r   r0   r  r  r  r  r   rj   r+   r+   r,   r  a     zSymPyValueRangeAnalysis.floorc                 C  r
  r@   )r$   r   r   r0   r  r  r  r  r  r+   r+   r,   ceilg  r  zSymPyValueRangeAnalysis.ceilc                   s.      st S  j  fdd}t||S )Nc                   s
   t |  S r@   )r   )numberndigitsr+   r,   r   u  r   z7SymPyValueRangeAnalysis.round_decimal.<locals>.<lambda>)r{   r$   rg   rC   r   )r   r  r  r   r+   r  r,   round_decimalm  s
   z%SymPyValueRangeAnalysis.round_decimalc                 C  s   t |tS r@   )r$   r   r   )r   r  r   r+   r+   r,   round_to_inty  r   z$SymPyValueRangeAnalysis.round_to_intc                 C  s(   t | } | jdk rt  S t | tS r   )r$   rk   rC   rg   r   r   r   r+   r+   r,   sqrt~  r   zSymPyValueRangeAnalysis.sqrtc                 C  s   t |}t |}|  } |j|jkst  ||fv sJ |jr2t t|j|jt|j	|j	S t t
|j|jt|j	|j	S r@   )r$   rk   ri   rK   rg   r0   rw   rC   rv   rD   ry   rx   )r   r   r   r+   r+   r,   where  s   

 ""zSymPyValueRangeAnalysis.wherec                 C  s   |  }| |fS r@   )ri   r   r+   r+   r,   expr_cond_pair  s   z&SymPyValueRangeAnalysis.expr_cond_pairc                  G  s6   d }| D ]\}}t j|v r|d u r|}q||B }q|S r@   )r0   r1   )rangesZ
init_rangeZ
expr_rangeZ
cond_ranger+   r+   r,   	piecewise  s   
z!SymPyValueRangeAnalysis.piecewisec                 C  
   t ddS Ng      r   r$   r   r+   r+   r,   cos  s   
zSymPyValueRangeAnalysis.cosc                 C  s   t dtjS )Nr   r}   r   r+   r+   r,   cosh  r   zSymPyValueRangeAnalysis.coshc                 C  r  r  r  r   r+   r+   r,   sin  s   
zSymPyValueRangeAnalysis.sinc                 C  r|   r@   r}   r   r+   r+   r,   sinh  r~   zSymPyValueRangeAnalysis.sinhc                 C  r|   r@   r}   r   r+   r+   r,   tan  r   zSymPyValueRangeAnalysis.tanc                 C  r|   r@   r}   r   r+   r+   r,   tanh  r~   zSymPyValueRangeAnalysis.tanhc                 C  r|   r@   r}   r   r+   r+   r,   asin  r   zSymPyValueRangeAnalysis.asinc                 C  r|   r@   r}   r   r+   r+   r,   acos  r   zSymPyValueRangeAnalysis.acosc                 C  r|   r@   r}   r   r+   r+   r,   atan  r   zSymPyValueRangeAnalysis.atanc                 C  r   r@   )r$   r   r   r   r+   r+   r,   trunc  r   zSymPyValueRangeAnalysis.truncr@   )<r(   r)   r*   __doc__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r	  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r!  r"  r#  r$  r+   r+   r+   r,   r     s    
%	







	












(


 
,
















	








	
	
r   expr
sympy.Exprr  )Optional[dict[sympy.Symbol, ValueRanges]]c                   s   t d t fdd t tjrt S pi tj	j
 }|r:|jjr:r5i |jjjn|jjjdd }tt |dS )Nzbound_sympy(%s)%sc                     s(   rdd  fdd D  S dS )N
c                 3  s.    | ]\}}| j v rd | d| V  qdS )z  r-   N)Zfree_symbols)r   kr   )r&  r+   r,   	<genexpr>  s    $z0bound_sympy.<locals>.<lambda>.<locals>.<genexpr> )joinitemsr+   r&  r  r+   r,   r     s   zbound_sympy.<locals>.<lambda>c                 S  sF   | j r| jrtdt}|S | jrtdt}|S t }|S t }|S r   )r   Zis_positiver$   r!   Zis_nonnegativern   rg   )srF   r+   r+   r,   missing_handler  s   

z$bound_sympy.<locals>.missing_handler)r1  )r   debugr   r.   r0   r   r$   rk   r   Z_guardsZTracingContextZtry_getZ	fake_modeZ	shape_envZvar_to_ranger    r   )r&  r  contextr1  r+   r/  r,   r%     s&   

)rF   rG   rH   rI   )rF   rG   rH   rN   r@   )r&  r'  r  r(  rH   r$   )O
__future__r   dataclassesr   r   loggingr6   r   typingr   r   r   r   r   r   r	   r
   Ztyping_extensionsr   r0   Zsympy.logic.boolalgr   rA   r   r   Ztorch._loggingr   Ztorch._prims_commonr   r  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zinterpr    numbersr!   r"   r#   	getLoggerr(   r   __all__r:   r&   RuntimeErrorr'   r?   rE   rM   rO   r3   r5   rY   r/   r`   ra   r   r   r   r   r   r   	dataclassr$   r   r%   r+   r+   r+   r,   <module>   sZ   (
D



  4    G