
    קg                         d dl Z d dlZd dlmZ d dlmZmZmZ d dlm	Z	 d dl
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dS )    N)partial)AnyCallableDict)Expr)bound_sympyValueRangeAnalysisValueRanges   )InterpreterShimLoopBodyLoopBodyBlock)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 || _         fd|j                                        D             | _        t	          d | j                                         D                       | _        i | _        d S )Nc                 X    t          | t                    rt          |           j        n| S N)
isinstancer   r   upper)vs    R/var/www/html/ai-engine/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   
var_rangesitemsreplacement_valsr   	get_nodesunbounded_vars_bounds)selfr   r   s     @r   __init__zBoundVars.__init__   s    	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   r/   r1   r2   )r3   s    r   __repr__zBoundVars.__repr__1   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   
submodulesr1   r   r'   strr
   r   unknownr2   r   set_ops_handlerr	   r   
root_blockgraphlogdebugrunget_ops_handler)r3   r?   r+   interpreters       r   
get_boundszBoundVars.get_bounds:   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)r?   .c                     i |                                 D ]}|dk    r j        |<   d|v r' j        j        |         } fd} ||          |<   >d|v rQt	          |t          d          d                    } j        j        |         }t           j        |          }||<   d|v sJ ||         |<   S )N	get_indexr&   c                       fdS )Nc                 @                         j        | |          S r   )r&   r2   )maskvalueresultr3   subblocks     r   <lambda>z<BoundVars.swap_submodules.<locals>.make_fn.<locals>.<lambda>^   s$    t/C/C $,eV0 0 r    )rR   rQ   r3   s   `r   make_fnz*BoundVars.swap_submodules.<locals>.make_fn]   s'          r   r;   scan)	keysrL   r   	subblocksintlenindirect_varsr   r;   )	r3   r?   keyrR   rU   idxvarindirectrQ   s	   `       @r   r>   zBoundVars.swap_submodulesM   s    ?A??$$ 	. 	.Ck!!"ns"c))>3C8     
 &gh//s3&&#c.1133455n237"4#4c::&s}}}}(osr   rR   envrO   rP   c                     t          |j        |          }|                    t          j                    |           d |j        j        D             }t          |          dk    sJ |j        |d                  S )Nr<   c                 (    g | ]}|j         d k    |S )output)r'   r*   s     r   
<listcomp>z-BoundVars.masked_subblock.<locals>.<listcomp>x   s$    SSS44;(;R;R$;R;R;Rr   r   r   )r   rD   rG   r   rH   nodesrZ   r`   )r3   rR   r`   rO   rP   r?   interprc   s           r   r&   zBoundVars.masked_subblockn   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
   r/   )r3   rg   rh   s      r   r;   zBoundVars.set_indirect~   s*    #{+++++%(c"
r   namec                     | j         j        |         }| j                            |          }|t	          || j                  }|| j        |<   |S r   )r   indexing_exprsr/   getr   )r3   rj   exprbounds       r   rL   zBoundVars.get_index   sR    ~,T2%))$//=d&;<<E ',d#r   )r8   
__module____qualname____doc__r   r4   r@   r9   r   r   torchfxNoder
   r   rJ   r   r   r>   r   r&   r;   rL   rT   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   B%% %(-T!223% 	%
 % hsCx001% 
T	% % % %  ;t+< TAR    
	d 	{4'8 	 	 	 	 	 	r   r   )loggingr(   	functoolsr   typingr   r   r   sympyr   rs   torch.utils._sympy.value_rangesr   r	   r
   r   r   r   r   utilsr   r   virtualizedr   	getLoggerr8   rE   r   rT   r   r   <module>r~      s           & & & & & & & & & &        X X X X X X X X X X ? ? ? ? ? ? ? ? ? ? 1 1 1 1 1 1 1 1       g!!x x x x x x x x x xr   