
    [Th%                        S SK r S SKrS SKJr  S SKJrJrJrJr  S SK	r	S SK	J
r
  S SKrS SKJrJrJr  SSKJr  SSKJr  S	S
KJrJrJr  S	SKJrJrJr  S	SKJrJr  S	SKJ r   \ RB                  " \"5      r# " S S5      r$ " S S\\5      r%g)    N)partial)AnyCallableOptionalUnion)Expr)bound_sympySymPyValueRangeAnalysisValueRanges   PowByNatural)int_oo   )InterpreterShimLoopBodyLoopBodyBlock)DefaultHandlerReductionType	StoreMode)cache_on_selfdominated_nodes)Vc                   v   \ rS rSrSrS\SS4S jrS\4S jr\	S\
\R                  R                  \\   4   4S j5       rS	\
\\S
\4   4   S\
\\S
\\   4   4   4S jrS\S\
\R                  R                  \\   4   S\S\S	\
\\S
\4   4   S\\   4S jrS\S\\   S\\   4S jrS\S\\   4S jrSrg)	BoundVars   a  
Performs Value Range Analysis on LoopBody's fx graph by calling BoundVars.run()
It exposes the ranges of the nodes in the `bounds` variable

Note. A current limitation of this analysis is that it just works on a per-loop basis.
We should be able to propagate the bounds between across the whole graph. This may benefit
the case a bounded variable is returned by a kernel and fed into another.
	loop_bodyreturnNc                 d   S[         [        [        4   S[        4S jnXl        UR                  R                  5        VVs0 s H#  u  p4U[        [           " SU" U5      S-
  5      _M%     snnU l        [        S U R                  R                  5        5       5      U l
        0 U l        g s  snnf )Nvr   c                 Z    [        U [        5      (       a  [        U 5      R                  $ U $ N)
isinstancer   r	   upper)r    s    N/var/www/auris/envauris/lib/python3.13/site-packages/torch/_inductor/bounds.pyupper_bound'BoundVars.__init__.<locals>.upper_bound&   s#    +5a+>+>;q>''EAE    r   r   c              3      #    U  H:  nUR                   S S[        R                  4;   d  SUR                   ;   d  M6  Uv   M<     g7f)load	reductionmasked_subblockN)targetoperatorgetitem).0nodes     r%   	<genexpr>%BoundVars.__init__.<locals>.<genexpr>/   s>      .
2{{v{H4D4DEE DKK/ D2s
   5A	A)r   r   intr   
var_rangesitemsr   replacement_valsr   	get_nodesunbounded_vars_bounds)selfr   r&   kr    s        r%   __init__BoundVars.__init__%   s    	F5s+ 	F 	F # ",,224!
4 {4 KNQ$6774!

 . .
002.
 
 @B!
s   *B,c           
          U R                   R                   SU R                   SU R                   SU R                   SU R
                   S3
$ )Nz(loop_body=z,
 replacement_vals=z, 
unbounded_vars=z, 
_bounds=))	__class____name__r   r7   r9   r:   )r;   s    r%   __repr__BoundVars.__repr__8   s]    ~~&&' (( )  $ 5 56 7"112 3||nA	'	
r(   c                    U R                  U R                  R                  5      nU R                   Hn  n[	        UR
                  [        5      (       a$  SUR
                  ;  d  M4  SUR
                  ;  d  MF  [        [           R                  5       U R                  U'   Mp     [        R                  " [        5       5         [        U R                  R                  R                   U5      n["        R%                  SU R                  R                  R                   5        UR'                  [        R(                  " 5       U R                  S9  S S S 5        U R                  $ ! , (       d  f       U R                  $ = f)Nr,   set_indirectzget_bounds:
%sinitial_env)swap_submodulesr   
submodulesr9   r#   r-   strr   r   unknownr:   r   set_ops_handlerValueRangeAnalysisr   
root_blockgraphlogdebugrunget_ops_handler)r;   rJ   r1   interpreters       r%   
get_boundsBoundVars.get_boundsA   s   ))$..*C*CD
 ''Ddkk3//!4"$++5%0%6%>%>%@T" ( 134)$..*C*C*I*I:VKII')B)B)H)HIOOA--/T\\OJ 5 ||	 54 ||s   BE""
E;rJ   .c                   ^ ^ 0 mUR                  5        H  nUS:X  a  T R                  TU'   M  SU;   aU  T R                  R                  U   nS[        S[
        [        [        /[        [           4   4UU 4S jjnU" U5      TU'   Mu  SU;   aM  [        U[        S5      S  5      nT R                  R                  U   n[        T R                  U5      nUTU'   M  SU;   d   eX   TU'   M     T$ )N	get_indexr,   subblockr   c                    >^  UUU 4S j$ )Nc                 @   > TR                  TTR                  XT5      $ r"   )r,   r:   )maskvalueresultr;   rZ   s     r%   <lambda><BoundVars.swap_submodules.<locals>.make_fn.<locals>.<lambda>g   s    t/C/C $,,V0r(    )rZ   r_   r;   s   `r%   make_fn*BoundVars.swap_submodules.<locals>.make_fnd   s     r(   rF   scan)keysrY   r   	subblocksr   r   r   r   r   r4   lenindirect_varsr   rF   )	r;   rJ   keyrZ   rc   idxvarindirectr_   s	   `       @r%   rI   BoundVars.swap_submodulesT   s     ?A??$Ck!"nns"c)>>33C8+sCj+d*;;<  &h/s3&#c.1345nn2237"4#4#4c:&s}$}(os7 %: r(   rZ   envr]   r^   c                 2   [        UR                  U5      nUR                  [        R                  " 5       US9  UR                  R
                   Vs/ s H  owR                  S:X  d  M  UPM     nn[        U5      S:X  d   eUR                  US      $ s  snf )NrG   outputr   r   )	r   rP   rS   r   rT   nodesr-   rh   ro   )	r;   rZ   ro   r]   r^   rJ   interpr1   rq   s	            r%   r,   BoundVars.masked_subblockw   s     !<

1$$&C
8#+>>#7#7S#74;;(;R$#7S6{a zz&)$$	 Ts   B)Boldnewc                 P    [        U[        5      (       d   eX R                  U'   U$ r"   )r#   r   r7   )r;   ru   rv   s      r%   rF   BoundVars.set_indirect   s(    #{++++%(c"
r(   namec                     U R                   R                  U   nU R                  R                  U5      nUc  [	        X R                  5      nX0R                  U'   U$ r"   )r   indexing_exprsr7   getr	   )r;   ry   exprbounds       r%   rY   BoundVars.get_index   sV    ~~,,T2%%))$/=&;&;<E ',d#r(   )r:   r   r7   r9   )rB   
__module____qualname____firstlineno____doc__r   r=   rK   rC   r   dicttorchfxNoder   r   rV   r   r   rI   r   r,   rF   rY   __static_attributes__rb   r(   r%   r   r      sG   B( Bt B&
# 
 DD0A!AB  $!sHS#X$667!	c8CT!2233	4!F%% %((--T!223% 	%
 % hsCx001% 
T	%  ;t+< TAR 
	c 	k$&7 	r(   r   c                   T   \ rS rSrSS jr\S\S\S\\   4S j5       rS\	S\
\S	4   S\\	\4   S\4S
 jrS\	S\R                  S\\   4S jr S S\	S\R                  S\S\SS4
S jjrS\R&                  S\R&                  S\S\S\\   4
S jr\S\S\R&                  S\\   4S j5       r\  S!S\S\R&                  S\\R&                     S\S\\   4
S jj5       r\S\S\\   4S j5       r\S\S\\   4S j5       r\S\S\S\\   4S j5       r\S\S\S\\   4S j5       rSrg)"rN      r   Nc                 T    SU l         SnU H  n[        XU R                  5        M     g )NrN   )xorlogical_and
logical_orlogical_not)ry   setattrbool_handler)r;   boolean_operatorsops      r%   r=   ValueRangeAnalysis.__init__   s-    (	
 $BDd//0 $r(   argskwargsc                  R    [        [        R                  [        R                  5      $ r"   )r   sympyfalsetrue)r   r   s     r%   r   ValueRangeAnalysis.bool_handler   s     5;;

33r(   ry   .c                 ,    [         R                  " 5       $ r"   r   rL   )r;   ry   r   r   s       r%   _defaultValueRangeAnalysis._default   s     ""$$r(   indexc                 ,    [         R                  " 5       $ r"   r   )r;   ry   r   s      r%   r*   ValueRangeAnalysis.load   s    ""$$r(   r^   modec                     g r"   rb   )r;   ry   r   r^   r   s        r%   storeValueRangeAnalysis.store   s     	r(   dtype	src_dtypereduction_typec                 ,    [         R                  " 5       $ r"   r   )r;   r   r   r   r^   s        r%   r+   ValueRangeAnalysis.reduction   s     ""$$r(   c                 R    [        U[        5      (       d   eU R                  X5      $ r"   )r#   r   to_dtype)clsr   r   s      r%   
index_exprValueRangeAnalysis.index_expr   s$    %----||E))r(   xuse_compute_typesc                 $   [         R                  " U 5      n U[        R                  :X  a  U R	                  5       (       a#  [         R                  " U R
                  S:g  5      $ U R                  (       a  U $ SU ;  a$  [         R                  " [        R                  5      $ [        [        R                  [        R                  5      $ S[        S[        R                  S[        R                  4S jnU R                  (       a`  U R	                  5       (       a1  U R
                  (       a  SOSn[         R                  " U" XQ5      5      $ [        U" SU5      U" SU5      5      $ [        U" U R
                  U5      U" U R                  U5      5      $ )Nr   r   r   r   c                     UR                   (       a  [        R                  " U 5      $ U [        [        * 4;   a  U $  [        R                  " U 5      $ ! [
         a    U s $ f = fr"   )is_floating_pointr   Floatr   Integer	TypeError)r   r   s     r%   cast)ValueRangeAnalysis.to_dtype.<locals>.cast   sU    &&{{1~%&))H ==++  Hs   A A! A!r   )r   wrapr   boolis_singletonloweris_boolr   r   r   r   r   r   r$   )r   r   r   r   r   vals         r%   r   ValueRangeAnalysis.to_dtype   s    QEJJ~~"''155!"''

33"5;;

;;	C 	 	

 	 99~~77a"''S(899"45>45>BB tAGGU3T!''55IJJr(   c                 2    [         R                  " U S 5      $ )Nc                     [        U S5      $ )Nr   r   )ys    r%   r`   +ValueRangeAnalysis.square.<locals>.<lambda>   s    LA<Nr(   )r   convex_min_zero_mapr   s    r%   squareValueRangeAnalysis.square   s    ..q2NOOr(   c                 L    [         R                  " U [        R                  5      $ r"   )r   decreasing_mapr.   negr   s    r%   r   ValueRangeAnalysis.neg   s    ))!X\\::r(   abc                 |    U R                  X5      nU[        R                  " 5       :X  a  U$ U R                  U5      $ r"   )truedivr   rL   trunc)r   r   r   r   s       r%   truncdivValueRangeAnalysis.truncdiv   s4    KK##%%Hyy|r(   c                 B    U R                  XR                  U5      5      $ r"   )addr   )r   r   r   s      r%   subValueRangeAnalysis.sub  s    wwq''!*%%r(   )ry   )r   Nr"   )NT) rB   r   r   r   r=   staticmethodr   r   r   rK   tupler   r   r   r   r*   r   r   r   r   r   r+   classmethodr   r   r   r   r   r   r   r   r   rb   r(   r%   rN   rN      sH   	1 4C 43 4;s3C 4 4%S %c3h %c3h %TW %
% %UZZ %K4D % KO %

36>G	
%{{% ;;% &	%
 % 
S	% *s *5;; *;s;K * *  ,0"&	'K'K{{'K EKK('K  	'K
 
S	'K 'KR P# P+c* P P ;s ;{3' ; ;   S)9   &C &C &K$4 & &r(   rN   )&loggingr.   	functoolsr   typingr   r   r   r   r   r   r   torch.utils._sympy.value_rangesr	   r
   r   utils._sympy.functionsr   utils._sympy.numbersr   r   r   r   r   ops_handlerr   r   r   utilsr   r   virtualizedr   	getLoggerrB   rQ   r   rN   rb   r(   r%   <module>r      sq       1 1     2 ) ? ? A A 1  !z zzk&0. k&r(   