
    `i%                        d dl Z d dlZd dlmZ d dlmZmZmZmZ d dl	Z	d dl	m
Z
 d dlZd dlmZmZmZ ddlmZ ddlmZ d	d
lmZmZmZ d	dlmZmZmZ d	dlmZmZ d	dlm Z   e j!        e"          Z# G d d          Z$ G d dee          Z%dS )    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                      e Zd ZdZdeddfdZdefdZede	e
j        j        ee         f         fd            Zde	eed	ef         f         de	eed	ee         f         f         fd
Zdede	e
j        j        ee         f         dedede	eed	ef         f         dee         fdZdedee         dee         fdZdedee         fdZdS )	BoundVarsa  
    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t           t          t          f         dt          fd|| _        fd|j                                        D             | _        t          d | j                                        D                       | _	        i | _
        d S )Nvr   c                 X    t          | t                    rt          |           j        n| S N)
isinstancer   r	   upper)r   s    j/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/torch/_inductor/bounds.pyupper_boundz'BoundVars.__init__.<locals>.upper_bound&   s%    +5a+>+>E;q>>''AE    c           	      f    i | ]-\  }}|t          t                   d  |          dz
            .S )r   r   )r   r   ).0kr   r%   s      r$   
<dictcomp>z&BoundVars.__init__.<locals>.<dictcomp>*   sK     !
 !
 !
1 {4 KKNNQ$677!
 !
 !
r&   c              3   X   K   | ]%}|j         d dt          j        fv s	d|j         v !|V  &dS )load	reductionmasked_subblockN)targetoperatorgetitemr(   nodes     r$   	<genexpr>z%BoundVars.__init__.<locals>.<genexpr>/   sT       .
 .
{v{H4DEEE DK//  0///	.
 .
r&   )r   r   intr   
var_rangesitemsreplacement_valsr   	get_nodesunbounded_vars_bounds)selfr   r%   s     @r$   __init__zBoundVars.__init__%   s    	F5s+ 	F 	F 	F 	F 	F #!
 !
 !
 !
!,2244!
 !
 !

 . .
 .
0022.
 .
 .
 
 
 @Br&   c           
      `    | j         j         d| j         d| j         d| j         d| j         d
S )Nz(loop_body=z,
 replacement_vals=z, 
unbounded_vars=z, 
_bounds=))	__class____name__r   r8   r:   r;   )r<   s    r$   __repr__zBoundVars.__repr__8   s`    ~& ' '' ' $ 5' ' #1' ' |	' ' '	
r&   c                 n   |                      | j        j                  }| j        D ]Z}t	          |j        t                    rd|j        vr5d|j        vr,t          t                   	                                | j
        |<   [t          j        t                                5  t          | j        j        j        |          }t"                              d| j        j        j                   |                    t          j                    | j
                   d d d            n# 1 swxY w Y   | j
        S )Nr.   set_indirectzget_bounds:
%sinitial_env)swap_submodulesr   
submodulesr:   r"   r/   strr   r   unknownr;   r   set_ops_handlerValueRangeAnalysisr   
root_blockgraphlogdebugrunget_ops_handler)r<   rH   r3   interpreters       r$   
get_boundszBoundVars.get_boundsA   sZ   ))$.*CDD
 ' 	A 	ADdk3// A!44"$+55%0%6%>%>%@%@T"13344 	K 	K)$.*C*I:VVKII')B)HIIIOOA-//T\OJJJ	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K |s   "A7D%%D),D)rH   .c                     i |                                 D ]}|dk    r j        |<   d|v rZ j        j        |         }dt          dt
          t          t          gt          t                   f         f fd} ||          |<   qd|v rQt          |t          d          d                    } j        j        |         }t           j        |          }||<   d|v sJ ||         |<   ؉S )N	get_indexr.   subblockr   c                       fdS )Nc                 @                         j        | |          S r!   )r.   r;   )maskvalueresultr<   rW   s     r$   <lambda>z<BoundVars.swap_submodules.<locals>.make_fn.<locals>.<lambda>g   s$    t/C/C $,eV0 0 r&    )rW   r\   r<   s   `r$   make_fnz*BoundVars.swap_submodules.<locals>.make_fnd   s'          r&   rD   scan)keysrV   r   	subblocksr   r   r   r   r   r5   lenindirect_varsr   rD   )	r<   rH   keyrW   r_   idxvarindirectr\   s	   `       @r$   rG   zBoundVars.swap_submodulesT   s,    ?A??$$ 	. 	.Ck!!"ns"c))>3C8+sCj+d*;;<       &gh//s3&&#c.1133455n237"4#4c::&s}}}}(osr&   rW   envrZ   r[   c                     t          |j        |          }|                    t          j                    |           d |j        j        D             }t          |          dk    sJ |j        |d                  S )NrE   c                 (    g | ]}|j         d k    |S )output)r/   r2   s     r$   
<listcomp>z-BoundVars.masked_subblock.<locals>.<listcomp>   s$    SSS44;(;R;R$;R;R;Rr&   r   r   )r   rN   rQ   r   rR   nodesrc   ri   )r<   rW   ri   rZ   r[   rH   interprl   s           r$   r.   zBoundVars.masked_subblockw   sv     !<<

1$&&C
888SS8>#7SSS6{{a z&)$$r&   oldnewc                 H    t          |t                    sJ || j        |<   |S r!   )r"   r   r8   )r<   rp   rq   s      r$   rD   zBoundVars.set_indirect   s*    #{+++++%(c"
r&   namec                     | j         j        |         }| j                            |          }|t	          || j                  }|| j        |<   |S r!   )r   indexing_exprsr8   getr	   )r<   rs   exprbounds       r$   rV   zBoundVars.get_index   sR    ~,T2%))$//=d&;<<E ',d#r&   )rA   
__module____qualname____doc__r   r=   rI   rB   r   dicttorchfxNoder   r   rT   r   r   rG   r   r.   rD   rV   r^   r&   r$   r   r      s        B( Bt B B B 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                   ^   e Zd ZddZedededee         fd            Zdede	edf         de
eef         defd	Zded
ej        dee         fdZ	 dded
ej        dededdf
dZdej        dej        dededee         f
dZed
edej        dee         fd            Ze	 	 d dedej        deej                 dedee         f
d            Zededee         fd            Zededee         fd            Zedededee         fd            Zedededee         fd            ZdS )!rL   r   Nc                 N    d| _         d}|D ]}t          | || j                   d S )NrL   )xorlogical_and
logical_orlogical_not)rs   setattrbool_handler)r<   boolean_operatorsops      r$   r=   zValueRangeAnalysis.__init__   sD    (	
 $ 	1 	1BD"d/0000	1 	1r&   argskwargsc                  J    t          t          j        t          j                  S r!   )r   sympyfalsetrue)r   r   s     r$   r   zValueRangeAnalysis.bool_handler   s     5;
333r&   rs   .c                 (    t          j                    S r!   r   rJ   )r<   rs   r   r   s       r$   _defaultzValueRangeAnalysis._default   s     "$$$r&   indexc                 (    t          j                    S r!   r   )r<   rs   r   s      r$   r,   zValueRangeAnalysis.load   s    "$$$r&   r[   modec                     d S r!   r^   )r<   rs   r   r[   r   s        r$   storezValueRangeAnalysis.store   s	     	r&   dtype	src_dtypereduction_typec                 (    t          j                    S r!   r   )r<   r   r   r   r[   s        r$   r-   zValueRangeAnalysis.reduction   s     "$$$r&   c                 \    t          |t                    sJ |                     ||          S r!   )r"   r   to_dtype)clsr   r   s      r$   
index_exprzValueRangeAnalysis.index_expr   s,    %-----||E5)))r&   Txuse_compute_typesc                    t          j        |           } |t          j        k    r|                                 rt          j        | j        dk              S | j        r| S d| vrt          j        t          j                  S t          t          j	        t          j                  S dt          dt          j        dt          j        fd}| j        ra|                                 r)| j        rdnd}t          j         |||                    S t           |d|           |d|                    S t           || j        |           || j        |                    S )Nr   r   r   r   c                     |j         rt          j        |           S | t          t           fv r| S 	 t          j        |           S # t
          $ r | cY S w xY wr!   )is_floating_pointr   Floatr   Integer	TypeError)r   r   s     r$   castz)ValueRangeAnalysis.to_dtype.<locals>.cast   sk    & 	{1~~%&)))H =+++    HHH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   zValueRangeAnalysis.to_dtype   sU    QEJ~~ <"'1555 <!"'
333"5;
;;;	C 	 	
 	 	 	 	 9 	K~~ C7)aa"'S%(8(8999"445>>445>>BBB ttAGU33TT!'55I5IJJJr&   c                 .    t          j        | d           S )Nc                 "    t          | d          S )Nr   r   )ys    r$   r]   z+ValueRangeAnalysis.square.<locals>.<lambda>   s    LA<N<N r&   )r   convex_min_zero_mapr   s    r$   squarezValueRangeAnalysis.square   s    .q2N2NOOOr&   c                 @    t          j        | t          j                  S r!   )r   decreasing_mapr0   negr   s    r$   r   zValueRangeAnalysis.neg   s    )!X\:::r&   abc                     |                      ||          }|t          j                    k    r|S |                     |          S r!   )truedivr   rJ   trunc)r   r   r   r   s       r$   truncdivzValueRangeAnalysis.truncdiv   s>    KK1#%%%%Hyy||r&   c                 T    |                      ||                     |                    S r!   )addr   )r   r   r   s      r$   subzValueRangeAnalysis.sub  s     wwq#''!**%%%r&   )r   Nr!   )NT)rA   ry   rz   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      s       	1 	1 	1 	1 4C 43 4;s3C 4 4 4 \4%S %c3h %c3h %TW % % % %
% %UZ %K4D % % % % KO  %
36>G	   
%{% ;% &	%
 % 
S	% % % % *s *5; *;s;K * * * [*  ,0"&	'K 'K'K{'K EK('K  	'K
 
S	'K 'K 'K \'KR P# P+c* P P P \P ;s ;{3' ; ; ; \;   S)9    [ &C &C &K$4 & & & [& & &r&   rL   )&loggingr0   	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   	getLoggerrA   rO   r   rL   r^   r&   r$   <module>r      s           1 1 1 1 1 1 1 1 1 1 1 1                  2 1 1 1 1 1 ) ) ) ) ) ) ? ? ? ? ? ? ? ? ? ? A A A A A A A A A A 1 1 1 1 1 1 1 1       g!!z z z z z z z zzk& k& k& k& k&0. k& k& k& k& k&r&   