
    `i3              	          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Zd dl	Z	d dl
Z	d dlmZ d dlmZ d dlmZmZmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZ ddlmZ dee e	j!        j"        j#                 edef         f         de	j$        j%        j&        de'e(e	j!        j"        j#        f         de)fdZ* G d d          Z+de	j,        de-fdZ.de	j$        j&        dee-         fdZ/d Z0de	j$        j&        dee)ee         e'e(ef         f         fdZ1de	j$        j&        de)fdZ2de	j$        j&        dee-         fdZ3de	j$        j&        de)fdZ4dS )    N)defaultdict)AnyCallableOptional)enable_python_dispatcher)FakeTensorMode)compute_unbacked_bindingsrebind_unbackedstatically_known_truesym_eq)_pytree)
OrderedSet)tree_map)flop_registry   )Vpattern.nodemodulesreturnc                 x   t          |j                  dk    rdS t          |j        d         t          j        j                  rt          |t          j        j                  sdS |j        d         j        dk    rdS t          |j        d         j        t                    sdS |j        d         j        |vrdS t          ||j        d         j                           | d         urdS |j        dk    r|j        dk    rdS |j        | d         k    rdS t          |j        d         j
                  dk    rdS dS )Nr   Fcall_modulecall_functioncall_methodr   T)lenargs
isinstancetorchfxNodeoptargetstrtypeusers)r   r   r   s      l/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/torch/_inductor/fx_utils.pymatches_module_function_patternr'      s.   
 49~~udilEHM22 *ehm; ;  uy|-''udil)3// uy|'))uGDIaL'());;uw/!!dg&>&>u{gaj  u
49Q<""u4    c                   \    e Zd ZdZdej        j        ddfdZdej        j        fdZ	d Z
dS )	FakeTensorUpdatera:  
    The main idea here is that it's difficult to maintain accurate fake
    tensors (our primary form of metadata) for each node in our graph as we
    transform it.

    The most reliable way to obtain this information is by rerunning
    faketensor propagation. However, in general, faketensor propagation is
    fairly expensive. So, instead we'd like to only rerun faketensor
    propagation on nodes that have changed.

    In order to detect which nodes have changed, we first hash its node,
    target, and argument lists (which are immutable in FX).

    Then, whenever we call incremental_update, we check which FX nodes have a
    new hash, and recompute the faketensor metadata for that node. Then, we
    continue to recursively compute the faketensors for all users until the
    fake tensors stop changing.
    graphr   Nc                     t          t                               | _        || _        | j        j        D ]/}| j                            |                     |                     0d S N)r   r   processed_hashesr+   nodesadd	hash_node)selfr+   r   s      r&   __init__zFakeTensorUpdater.__init__P   s_     *3 1 1
J$ 	< 	<D!%%dnnT&:&:;;;;	< 	<r(   r   c                 `    ||j         t          |j                  t          |j                  fS r-   )r"   idr   kwargs)r2   r   s     r&   r1   zFakeTensorUpdater.hash_nodeW   s#    dk2di=="T[//BBr(   c                     
 t          t                    
 j        j        D ]}
t	          |          xx         dz  cc<    d 
 fdd }t          t                               } j        j        D ]}                     |           j        v rt          |          |vr1 ||          s=t          |          \  }}}|sSt          j        5  t                      5   |j        |i |}ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   d|j        v r ||j        d         |          rt          t          j        j        ||           ||j        d<   t          j        j        x}rt#          ||          x}	r
|	|j        d<   
t	          |          xx         dz  cc<   |                    d	 |j        D                         j                                                 |                     dS )
zOUpdate FakeTensors on self.graph. We will try to do the minimum amount of work.r   c                 <    t          t          | |                    S r-   )r   r   )newolds     r&   is_intlist_samez=FakeTensorUpdater.incremental_update.<locals>.is_intlist_samea   s    (S)9)9:::r(   c                   t          |           t          |          k    rdS t          | t          t          f          rLt	          |           t	          |          k    rdS t          fdt          | |          D                       S | |d u S t          | t          j                  st          | t          j	        t          j
        t          j        f          s"J dt          |            dj                     | j        j                            t!          j        | j        j        |j        j                            t           j        k    S  | j        |j                  r| j        |j        k    rdS | j        t          j        k    ri |                                 |                                          r7t1          |                                 |                                k              sdS | j        |j        k    rdS t7          |           t7          |          k    rdS d }t7          |                   dk    rt7          |           vr |          sdS dS )NFc              3   :   K   | ]\  }} ||           V  dS )r   N ).0new_iold_iis_fake_tensor_samer   s      r&   	<genexpr>zTFakeTensorUpdater.incremental_update.<locals>.is_fake_tensor_same.<locals>.<genexpr>j   sM        $u ('u4@@@     r(   zUnknown type z in Tc           	         t          | j        d         t          j                  sdS | j        D ]}t          |j        t          j        j        t          j        j        f          s'|j        t          j	        j
        j        j        k    s dS t          |j        t          j        j                  rt          |          \  }}}|s dS t          j        5  t!                      5  t#          j                    5 }t          j        j        }|'|                    |                                            |j        |i |}d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   t          |t          j                  s dS t-          |          t-          | j        d                   k    r dS dS )NvalTF)r   metar   Tensorr%   r"   _ops
OpOverloadHigherOrderOperator	_inductor	fx_passes	reinplace_generalized_scatterget_fake_args_kwargsr   	fake_moder   
contextlib	ExitStack	shape_enventer_contextignore_fresh_unbacked_symbolsget_storage)r   useris_validr   r6   stackrT   new_fake_tensors           r&   any_user_may_aliasz]FakeTensorUpdater.incremental_update.<locals>.is_fake_tensor_same.<locals>.any_user_may_alias   s   !$)E"2ELAA  4 J &$ &$D" K"Z2EJ4RS $
  ; ?4>ST T  $tt!$+uz/MNN ! !
 .B$-G-G*HdF# $#ttG G022G G #,..G 38 %&K$9	$0!// ) G G I I   +6$+t*Fv*F*FG G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G &ou|DD $#tt"?33{49UCS7T7TTT#tt Uus[   E<&E%:AE	E%EE%EE%E<%E))E<,E)-E<<F 	F 	r   )r$   r   listtupler   allzipr   rH   SymIntSymBoolSymFloatr+   r   rT   _maybe_evaluate_staticsympyEqexprtrueshapelayoutstridedstrider   storage_offsetdevicerW   )r9   r:   r   r\   existing_storagesrC   r;   r2   s     ` r&   rC   zAFakeTensorUpdater.incremental_update.<locals>.is_fake_tensor_samed   st   CyyDII%%u#e}-- s88s3xx'' 5     (+C      {d{"c5<00 	!#emU^'TUU  ?DII??4:?? U H&==>>  z" #?39ci88 CJ#*<T<TuzU]**#OCJJLL#**,,?? +,&&((C,>,>,@,@@  + uzSZ''u3;s#3#333t+ + +b "+c"2"23q88$$,===**400 > t5r(   c                     | j         dk    o\t          | j        t          j        j                  p8| j        t          j        k    p#| j        t          j        j	        j
        j        k    S )Nr   )r!   r   r"   r   rI   rJ   operatorgetitemrL   rM   rN   rO   r>   s    r&   should_process_nodezAFakeTensorUpdater.incremental_update.<locals>.should_process_node   s^     7o- 4;
(=>> L;("22L;?,6KLr(   NrF   r>   unbacked_bindingsc                 ,    g | ]}t          |          S r?   )r5   )r@   rX   s     r&   
<listcomp>z8FakeTensorUpdater.incremental_update.<locals>.<listcomp>   s    ???Dr$xx???r(   )r   intr+   r/   get_node_storager   r1   r.   r5   rP   r   rQ   r   r"   rG   r
   rT   r	   updater%   r0   )r2   r   rs   
to_processrY   r   r6   r[   rT   symbol_to_pathro   rC   r;   s   `         @@@r&   incremental_updatez$FakeTensorUpdater.incremental_update[   s   =H=M=MJ$ 	; 	;D.t44555:5555	; 	; 	;]	 ]	 ]	 ]	 ]	 ]	 ]	 ]	~	 	 	  _&&
J$ &	< &	<D t$$(===tHHJ..&&t,, %9$%?%?"HdF  ? ?688 ? ?"-$+t">v">">? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 	!!&9&95!1' ' '! AK14III.DIe[22	 @";I"W"WW@ 2@	-..t44555:555??DJ???@@@!%%dnnT&:&:;;;;M&	< &	<s6   D&D 4D DDDDD	D	)__name__
__module____qualname____doc__r   r   Graphr3   r    r1   r|   r?   r(   r&   r*   r*   <   s|         &<ehn < < < < <Cehm C C C C\< \< \< \< \<r(   r*   tc                 4    |                                  j        S r-   )untyped_storage_cdata)r   s    r&   rW   rW      s    %%r(   c                     d| j         vrd S t          | j         d         t          j                  sd S t          j                            | j         d                   sd S t          | j         d                   S NrF   )rG   r   r   rH   _C_has_storagerW   r>   s    r&   rx   rx      sm    DItdi&55 t8  5!122 tty'(((r(   c                 t    t          | t          j        j                  rd| j        vr| S | j        d         S | S r   )r   r   r   r    rG   )xs    r&   get_faker     s;    !UX]## Hve}Hr(   r   c                     t          t          | j        | j        f          \  }}t	          d t          j        |i |D                       rd||fS d||fS )zZ
    First value returns a boolean if any of the input nodes don't have a faketensor.
    c              3   T   K   | ]#}t          |t          j        j                  V  $d S r-   )r   r   r   r    )r@   as     r&   rD   z'get_fake_args_kwargs.<locals>.<genexpr>  sA        )*
1ehm$$     r(   FT)r   r   r   r6   anypytreearg_tree_leaves)r   r   r6   s      r&   rP   rP     sz     Hqvqx&899LD&
  .4.Dd.Uf.U.U     # dF""vr(   c                     ddl mm dt          j        j        dt          ffd |           rdS dt          j        j        dt          ffdt          fd| j        D                       rdS d	S )
zReturns true if a node is always realized when lowered to inductor IR.

    NOTE: This may return some false negatives. e.g. it doesn't
    handle buffers realized heuristically during lowering, or
    buffers realized indirectly through view ops.
    r   )	fallbacksneeds_realized_inputsr   r   c                     | j         dk    r)| j        t          j        u r | j        d                   S | j         dv p| j        v S )Nr   r   )placeholderoutput)r!   r"   rq   rr   r   )r   r   	is_buffers    r&   r   z#is_node_realized.<locals>.is_buffer%  sQ    7o%%$+9I*I*I 9TYq\***w33Ot{i7OOr(   Tc                 ,    | j         dk    p| j        v S )Nr   )r!   r"   )r   r   s    r&   realizes_inputsz)is_node_realized.<locals>.realizes_inputs2  s    w("Jdk5J&JJr(   c              3   .   K   | ]} |          V  d S r-   r?   )r@   rX   r   s     r&   rD   z#is_node_realized.<locals>.<genexpr>5  s-      
8
8T??4  
8
8
8
8
8
8r(   F)	torch._inductor.loweringr   r   r   r   r    boolr   r%   )r   r   r   r   r   s    @@@@r&   is_node_realizedr     s     JIIIIIIIP P$ P P P P P P P y tKehm K K K K K K K 
8
8
8
8TZ
8
8
888 t 5r(   c                    t          |           rt          | j        t                    rd S t	          d          5  t          |           \  }}}|rlt          j        j        	                    d          5 } | j        |i | d d d            n# 1 swxY w Y   |
                                }|cd d d            S 	 d d d            n# 1 swxY w Y   d S )NT)allow_non_fake_inputsF)display)countable_fxr   r"   r#   r   rP   r   utilsflop_counterFlopCounterModeget_total_flops)r   successr   r6   flop_counter_modecounted_flopss         r&   count_flops_fxr   <  s    DK!=!= t	d	3	3	3 
! 
! 4T : :v 	!)99 :   -"T,V,,,- - - - - - - - - - - - - - -
 .==??M 
! 
! 
! 
! 
! 
! 
! 
!	!
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 4s5   ;C7BCB	CB	CCCc                     t          | t          j        j                  sJ t	          | d          sdS | j        }t	          |d          s	|t          v S |j        }|t          v S )z>
    Whether or not we can count the flops of an FX node.
    r"   Foverloadpacket)r   r   r   r    hasattrr"   r   r   )r   r"   packets      r&   r   r   M  sm     dEHM*****4"" u[F6+,, '&&"F]""r(   )5rR   rq   collectionsr   typingr   r   r   re   r   torch.fxtorch._dispatch.pythonr   torch._subclasses.fake_tensorr   %torch.fx.experimental.symbolic_shapesr	   r
   r   r   torch.utilsr   r   torch.utils._ordered_setr   torch.utils._pytreer   torch.utils.flop_counterr   virtualizedr   r^   r$   nnr   Moduler   r   r    dictr#   r   r'   r*   rH   rw   rW   rx   r   rP   r   r   r   r?   r(   r&   <module>r      s        # # # # # # * * * * * * * * * *    ; ; ; ; ; ; 8 8 8 8 8 8            * ) ) ) ) ) / / / / / / ( ( ( ( ( ( 2 2 2 2 2 2      
4(/0(382DDE
(-
 #ux'../ 
	   >{< {< {< {< {< {< {< {<|&5< &C & & & &)58= )Xc] ) ) ) )  	EHM 	eD%*d3PS8n4T.U 	 	 	 	58= T    @ 8C=    "#ux} # # # # # # #r(   