
    3jJ&                        S SK r S SKrS SKJr  S SKJr  S SK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  \ R@                  " \!5      r" " S S5      r# " S S\\5      r$g)    N)Callable)partial)Any)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                 X   S[         [        -  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    P/home/wildlama/miniconda3/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>0   s>      .
2{{v{H4D4DEE DKK/ D2s
   5A	A)r   intr   
var_rangesitemsr	   replacement_valsr   	get_nodesunbounded_vars_bounds)selfr   r$   kr   s        r#   __init__BoundVars.__init__&   s    	F4#: 	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   r5   r7   r8   )r9   s    r#   __repr__BoundVars.__repr__9   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   
submodulesr7   r!   r+   strr	   r   unknownr8   r   set_ops_handlerValueRangeAnalysisr   
root_blockgraphlogdebugrunget_ops_handler)r9   rH   r/   interpreters       r#   
get_boundsBoundVars.get_boundsB   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;rH   .c                   ^ ^ 0 mU 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*   r8   )maskvalueresultr9   rX   s     r#   <lambda><BoundVars.swap_submodules.<locals>.make_fn.<locals>.<lambda>h   s    t/C/C $,,V0r&    )rX   r]   r9   s   `r#   make_fn*BoundVars.swap_submodules.<locals>.make_fne   s     r&   rD   scan)rW   r   	subblocksr   r   r   r	   r   r2   lenindirect_varsr   rD   )	r9   rH   keyrX   ra   idxvarindirectr]   s	   `       @r#   rG   BoundVars.swap_submodulesU   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&   rX   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 )NrE   outputr   r   )	r   rN   rQ   r   rR   nodesr+   re   rl   )	r9   rX   rl   r[   r\   rH   interpr/   rn   s	            r#   r*   BoundVars.masked_subblockx   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	   r5   )r9   rr   rs   s      r#   rD   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_exprsr5   getr   )r9   rv   exprbounds       r#   rW   BoundVars.get_index   sV    ~~,,T2%%))$/=&;&;<E ',d#r&   )r8   r   r5   r7   )r@   
__module____qualname____firstlineno____doc__r   r;   rI   rA   r   dicttorchfxNoder	   r   rT   r   r   rG   r   r*   rD   rW   __static_attributes__r`   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\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)"rL      r   Nc                 T    SU l         SnU H  n[        XU R                  5        M     g )NrL   )xorlogical_and
logical_orlogical_not)rv   setattrbool_handler)r9   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&   rv   .c                 ,    [         R                  " 5       $ r    r	   rJ   )r9   rv   r   r   s       r#   _defaultValueRangeAnalysis._default   s     ""$$r&   indexc                 ,    [         R                  " 5       $ r    r   )r9   rv   r   s      r#   r(   ValueRangeAnalysis.load   s    ""$$r&   r\   modec                     g r    r`   )r9   rv   r   r\   r   s        r#   storeValueRangeAnalysis.store   s     	r&   dtype	src_dtypereduction_typec                 ,    [         R                  " 5       $ r    r   )r9   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	   rJ   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&   )rv   )r   Nr    )NT)r@   r}   r~   r   r;   staticmethodr   r	   r   rI   tupler   r   r   r   r(   r   r   r   r   r   r)   classmethodr   r   r   r   r   r   r   r   r`   r&   r#   rL   rL      sH   	1 4C 43 4;s3C 4 4%S %c3h %c3h %TW %
% %UZZ %K4D % KO %

36>G	
%{{% ;;% &	%
 % 
S	% *s *5;; *;s;K * * 
 )-"&	'K'K{{'K ;;%'K  	'K
 
S	'K 'KR P# P+c* P P ;s ;{3' ; ;   S)9   &C &C &K$4 & &r&   rL   )%loggingr,   collections.abcr   	functoolsr   typingr   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   	getLoggerr@   rO   r   rL   r`   r&   r#   <module>r      sq      $       2 ) ? ? A A 1  !z zzn&0. n&r&   