
    Vh<#              	          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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eeej8                  j:                  j<                     edef   f   dej>                  j@                  jB                  de"e#ej8                  j:                  j<                  f   de$fdZ% G d d      Z&dejN                  de(fdZ)dej>                  jB                  dee(   fdZ*d Z+dej>                  jB                  dee$ee   e"e#ef   f   fdZ,dej>                  jB                  de$fdZ-y)    N)defaultdict)AnyCallableOptional)enable_python_dispatcher)compute_unbacked_bindingsrebind_unbackedstatically_known_truesym_eq)_pytree)
OrderedSet)tree_map   )Vpattern.nodemodulesreturnc                    t        |j                        dk(  ryt        |j                  d   t        j                  j
                        r$t        |t        j                  j
                        sy|j                  d   j                  dk7  ryt        |j                  d   j                  t              sy|j                  d   j                  |vryt        ||j                  d   j                           | d   ury|j                  dk7  r|j                  dk7  ry|j                  | d   k7  ryt        |j                  d   j                        dkD  ryy)Nr   Fcall_modulecall_functioncall_methodr   T)lenargs
isinstancetorchfxNodeoptargetstrtypeusers)r   r   r   s      H/home/dcms/DCMS/lib/python3.12/site-packages/torch/_inductor/fx_utils.pymatches_module_function_patternr%      s
   
 499~diilEHHMM2*ehhmm; yy|-'diil))3/yy|')GDIIaL''();ww/!dgg&>{{gaj 
499Q<"    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
y)	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                  j                  | j                  |             . y N)r   r   processed_hashesr)   nodesadd	hash_node)selfr)   r   s      r$   __init__zFakeTensorUpdater.__init__M   sN     *3 1
JJ$$ 	<D!!%%dnnT&:;	<r&   r   c                 n    ||j                   t        |j                        t        |j                        fS r+   )r    idr   kwargs)r0   r   s     r$   r/   zFakeTensorUpdater.hash_nodeT   s%    dkk2dii="T[[/BBr&   c           	      R    t        t               j                  j                  D ]  }t	        |      xx   dz  cc<    d  fdd }t        t                  } j                  j                  D ]  } j                  |       j                  v rt        |      |vr/ ||      s8t        |      \  }}}|sJt        j                  5  t               5   |j                  |i |}d d d        d d d        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<   |j%                  |j&                  D 
cg c]  }
t        |
       c}
        j                  j)                   j                  |              y # 1 sw Y   xY w# 1 sw Y   xY wc c}
w )Nr   c                 ,    t        t        | |            S r+   )r
   r   )newolds     r$   is_intlist_samez=FakeTensorUpdater.incremental_update.<locals>.is_intlist_same]   s    (S)9::r&   c                    t        |       t        |      k7  ryt        | t        t        f      r6t	        |       t	        |      k7  ry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                  j                  t!        j"                  | j                  j$                  |j                  j$                              t         j&                  k(  S  | j(                  |j(                        r| j*                  |j*                  k7  ry| j*                  t        j,                  k(  rP | j/                         |j/                               r*t1        | j3                         |j3                         k(        sy| j4                  |j4                  k7  ryt7        |       t7        |      k(  ryt7        |         dk(  rt7        |       vryy)NFc              3   6   K   | ]  \  }} ||        y wr+    ).0new_iold_iis_fake_tensor_sames      r$   	<genexpr>zTFakeTensorUpdater.incremental_update.<locals>.is_fake_tensor_same.<locals>.<genexpr>f   s"      :F%'u5s   zUnknown type z in Tr   )r"   r   listtupler   allzipr   TensorSymIntSymBoolSymFloatr)   r   	shape_env_maybe_evaluate_staticsympyEqexprtrueshapelayoutstridedstrider
   storage_offsetdeviceget_storage)r7   r8   existing_storagesr@   r9   r0   s     r$   r@   zAFakeTensorUpdater.incremental_update.<locals>.is_fake_tensor_same`   s   CyDI%#e}-s8s3x'  JMcSV-   {d{"c5<<0!#emmU^^'TU #DI;d4::,?U HH&&==> zz" #399cii8CJJ#**<TzzU]]*#CJJL#**,?,&&(C,>,>,@@ zzSZZ'3;s#33 "+c"23q8$,==r&   c                     | j                   dk(  xrM t        | j                  t        j                  j
                        xs | j                  t        j                  k(  S )Nr   )r   r   r    r   _ops
OpOverloadoperatorgetitemr   s    r$   should_process_nodezAFakeTensorUpdater.incremental_update.<locals>.should_process_node   sI     77o- 4;;

(=(=> 3;;("2"22r&   valunbacked_bindings)r   intr)   r-   get_node_storager   r/   r,   r3   get_fake_args_kwargsr   	fake_moder   r    metar	   rJ   r   updater#   r.   )r0   r   r^   
to_processis_validr   r4   new_fake_tensorrJ   symbol_to_pathuserrW   r@   r9   s   `          @@@r$   incremental_updatez$FakeTensorUpdater.incremental_updateX   s   =H=MJJ$$ 	;D.t45:5	;	;+	Z		  _&
JJ$$ !	<Dt$(=(==tHJ.&t,%9$%?"HdF ?68 ?"-$++t">v">? ?		!&95!1' AKK114I.DIIe[[222	2";I"WWW 2@		-..t45:5DJJ?Dr$x?@!!%%dnnT&:;C!	<? ? ? ?$ @s*   HH
2HH$

HHH!	)__name__
__module____qualname____doc__r   r   Graphr1   r   r/   rl   r<   r&   r$   r(   r(   9   s>    &<ehhnn < <Cehhmm Cb<r&   r(   tc                 6    | j                         j                  S r+   )untyped_storage_cdata)rr   s    r$   rV   rV      s    %%%r&   c                     d| j                   vry t        | j                   d   t        j                        sy t        j                  j                  | j                   d         sy t        | j                   d         S Nr_   )re   r   r   rF   _C_has_storagerV   r]   s    r$   rb   rb      s]    DIIdii&588  5!12tyy'((r&   c                     t        | t        j                  j                        rd| j                  vr| S | j                  d   S | S rw   )r   r   r   r   re   )xs    r$   get_faker|      s8    !UXX]]#Hvve}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   d   K   | ](  }t        |t        j                  j                         * y wr+   )r   r   r   r   )r=   as     r$   rA   z'get_fake_args_kwargs.<locals>.<genexpr>   s$      )*
1ehhmm$s   .0FT)r   r|   r   r4   anypytreearg_tree_leaves)r{   r   r4   s      r$   rc   rc      sb     Hqvvqxx&89LD&
 .4.D.Dd.Uf.U  dF""vr&   c                    ddl mm dt        j                  j
                  dt        ffd |       rydt        j                  j
                  dt        ffdt        fd| j                  D              ryy	)
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(  r1| j                  t        j                  u r | j                  d         S | j                   dv xs | j                  v S )Nr   r   )placeholderoutput)r   r    r[   r\   r   )r   r   	is_buffers    r$   r   z#is_node_realized.<locals>.is_buffer   sS    77o%$++9I9I*I TYYq\**ww33Ot{{i7OOr&   Tc                 B    | j                   dk(  xs | j                  v S )Nr   )r   r    )r   r   s    r$   realizes_inputsz)is_node_realized.<locals>.realizes_inputs   s!    ww("Jdkk5J&JJr&   c              3   .   K   | ]  } |        y wr+   r<   )r=   rk   r   s     r$   rA   z#is_node_realized.<locals>.<genexpr>   s     
8T?4 
8s   F)	torch._inductor.loweringr   r   r   r   r   boolr   r#   )r   r   r   r   r   s    @@@@r$   is_node_realizedr      sm     JP P$ P Kehhmm K K 
8TZZ
88 r&   ).r[   collectionsr   typingr   r   r   rL   r   torch.fxtorch._dispatch.pythonr   %torch.fx.experimental.symbolic_shapesr   r	   r
   r   torch.utilsr   r   torch.utils._ordered_setr   torch.utils._pytreer   virtualizedr   rC   r"   nnr   Moduler   r   r   dictr!   r   r%   r(   rF   ra   rV   rb   r|   rc   r   r<   r&   r$   <module>r      sE    # * *    ;  * / ( 
4((//0(382DDE
((--

 #uxx''.../ 
	>A< A<H&5<< &C &)588== )Xc] )	EHHMM 	eD%*d3PS8n4T.U 	588== T r&   