
    ɯwgn                     ^    d dl Z d dlZd dlZd dlmZ ddlmZ ddlmZ d Z	d Z
d Zd	efd
Zy)    N)ValueRanges   )LoopBody)dominated_nodesc                    t        | dd      ryt        | t        j                        r=| j                  sJ | j
                  s| j                  rt        |       } nt        |       } t        | t              r| dk  xr | dk\  S t        | t              rCt        j                  t        j                        }| |j                  k  xr | |j                  k\  S t        d|        )N
is_BooleanFTi   i   zUnexpected value )getattr
isinstancesympyExpr	is_number
is_Integerr   intfloattorchiinfoint32maxmin	TypeError)valr   s     f/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/torch/_inductor/optimize_indexing.pyval_expressable_in_32_bitsr      s    sL%(#uzz"}}}>>S^^c(C*C #uu~1#/1#sEKK(eii4C599$44
'u-
..    c                 Z    t        | j                        xr t        | j                        S )N)r   lowerupper)ranges    r   range_expressable_in_32_bitsr   #   s'    %ekk2 7Q8 r   c                    d }t        | g|      D ].  }|j                  dv rt        |j                  t              rd|j                  v rt	        |j                  t        d      d        }||   }|j                         D ]  \  }	}
||
j                  v s||	   }t        j                  |j                        st        j                  |j                        r  y t        t        j                     t	        |j                        t	        |j                              }t        |      r  y  t        ||         r/ y  t!        | j"                        }t$        j&                  |d<   t)        |      | _        y )Nc                     | j                   dk(  xr> | j                  d   t        j                  t        j                  t        j
                  fv S )Nto_dtype   )targetargsr   r   float32float64)nodes    r   skip_filterz,try_to_reduce_precision.<locals>.skip_filter-   sA    {{j( 
TYYq\KKMMMM>
 .
 	
r   )storeoutputset_indirectr#   )r   r$   r
   strr   lenitemsfree_symbolsmathisinfr   r   r   r   r   r   listr%   r   r   tuple)r(   boundsindirect_varsindicesreplacement_valsr)   	dominatedidxindirect_varindexexpr	index_valindex_val_intr%   s                 r   try_to_reduce_precisionr@   )   s>   
 %dV[9 	22i&&,9CSCS1Si&&s>':'<=>C(-L  '}} t4#4#44 0 7Izz)//2djj6Q %0

$;IOO,c)//.B%M 8F!$ ,F9,=>9< 		?DkkDGdDIr   	loop_bodyc                 p   | j                         }| j                         D cg c]A  }|j                  dk(  r0|j                  d   t        j
                  k(  r||j                  vr|C }}|sy|j                         }|D ]/  }t        ||| j                  | j                  |j                         1 yc c}w )z|
    Performs Value Range Analysis on LoopBody's fx graph to reduce precision of
    intermediaries from int64 to int32
    r"   r#   N)r5   	get_nodesr$   r%   r   int64unbounded_vars
get_boundsr@   r6   indexing_exprsr8   )rA   bvr(   int64_dtype_nodesr5   s        r   !indexing_dtype_strength_reductionrJ   Z   s    
 
			B '')KK:%		!+B--- 	  ]]_F " 
##$$	

!s   AB3)r1   r   r   torch.utils._sympy.value_rangesr   rA   r   utilsr   r   r   r@   rJ    r   r   <module>rN      s3       7  "/,.b
 
r   