
    a,jJ&                        d dl Z d dlZd dlmZ d dlmZ d dl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)Callable)partial)Any)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          z  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    V/var/www/html/banglarbhumi/venv/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>0   sT       .
 .
{v{H4DEEE DK//  0///	.
 .
r$   )
r   intr   
var_rangesitemsreplacement_valsr   	get_nodesunbounded_vars_bounds)selfr   r#   s     @r"   __init__zBoundVars.__init__&   s    	F4#: 	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   r6   r8   r9   )r:   s    r"   __repr__zBoundVars.__repr__9   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   
submodulesr8   r    r-   strr	   r   unknownr9   r   set_ops_handlerValueRangeAnalysisr   
root_blockgraphlogdebugrunget_ops_handler)r:   rF   r1   interpreters       r"   
get_boundszBoundVars.get_boundsB   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)rF   .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,   r9   )maskvalueresultr:   rU   s     r"   <lambda>z<BoundVars.swap_submodules.<locals>.make_fn.<locals>.<lambda>h   s$    t/C/C $,eV0 0 r$    )rU   rZ   r:   s   `r"   make_fnz*BoundVars.swap_submodules.<locals>.make_fne   s'          r$   rB   scan)rT   r   	subblocksr   r   r   r	   r   r3   lenindirect_varsr   rB   )	r:   rF   keyrU   r]   idxvarindirectrZ   s	   `       @r"   rE   zBoundVars.swap_submodulesU   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$   rU   envrX   rY   c                     t          |j        |          }|                    t          j                    |           d |j        j        D             }t          |          dk    sJ |j        |d                  S )NrC   c                 (    g | ]}|j         d k    |S )output)r-   r0   s     r"   
<listcomp>z-BoundVars.masked_subblock.<locals>.<listcomp>   s$    SSS44;(;R;R$;R;R;Rr$   r   r   )r   rL   rO   r   rP   nodesr`   rf   )r:   rU   rf   rX   rY   rF   interpri   s           r"   r,   zBoundVars.masked_subblockx   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	   r6   )r:   rm   rn   s      r"   rB   zBoundVars.set_indirect   s*    #{+++++%(c"
r$   namec                     | j         j        |         }| j                            |          }|t	          || j                  }|| j        |<   |S r   )r   indexing_exprsr6   getr   )r:   rp   exprbounds       r"   rT   zBoundVars.get_index   sR    ~,T2%))$//=d&;<<E ',d#r$   )r?   
__module____qualname____doc__r   r;   rG   r@   r   dicttorchfxNoder	   r   rR   r   r   rE   r   r,   rB   rT   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                   X   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j        dz  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 )!rJ   r   Nc                 N    d| _         d}|D ]}t          | || j                   d S )NrJ   )xorlogical_and
logical_orlogical_not)rp   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$   rp   .c                 (    t          j                    S r   r	   rH   )r:   rp   r   r   s       r"   _defaultzValueRangeAnalysis._default   s     "$$$r$   indexc                 (    t          j                    S r   r   )r:   rp   r   s      r"   r*   zValueRangeAnalysis.load   s    "$$$r$   rY   modec                     d S r   r\   )r:   rp   r   rY   r   s        r"   storezValueRangeAnalysis.store   s	     	r$   dtype	src_dtypereduction_typec                 (    t          j                    S r   r   )r:   r   r   r   rY   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	   wraprz   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_mapr.   negr   s    r"   r   zValueRangeAnalysis.neg   s     )!X\:::r$   abc                     |                      ||          }|t          j                    k    r|S |                     |          S r   )truedivr	   rH   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)r?   rv   rw   r;   staticmethodr   r	   r   rG   tuplery   r   r   r   r*   r   r   rz   r   r   r+   classmethodr   r   r   r   r   r   r   r\   r$   r"   rJ   rJ      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 * * * [* 
 )-"&	'K 'K'K{'K ;%'K  	'K
 
S	'K 'K 'K \'KR P# P+c* P P P \P ;s ;{3' ; ; ; \;   S)9    [ &C &C &K$4 & & & [& & &r$   rJ   )%loggingr.   collections.abcr   	functoolsr   typingr   r   r   rz   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?   rM   r   rJ   r\   r$   r"   <module>r      s     $ $ $ $ $ $                              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n& n& n& n& n&0. n& n& n& n& n&r$   