
    ɯwg"              	          d dl Z d dlmZ d dlmZmZmZmZmZm	Z	m
Z
 d dlZd dlZd dl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	e	e
ej4                  j6                  j8                     ed
ef   f   dej:                  j<                  j>                  dee ej4                  j6                  j8                  f   de!fdZ" G d d      Z#dejH                  de%fdZ&dej:                  j>                  dee%   fdZ'd Z(dej:                  j>                  de	e!e	e   ee ef   f   fdZ)dej:                  j>                  de!fdZ*y)    N)defaultdict)AnyCallableDefaultDictDictOptionalTupleType)compute_unbacked_bindingsrebind_unbackedstatically_known_truesym_eq)_pytree)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      ]/home/mcse/projects/flask/flask-venv/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               | _        || _        | j                  j                  D ],  }| j                  j	                  | j                  |             . y N)setprocessed_hashesr+   nodesadd	hash_node)selfr+   r   s      r&   __init__zFakeTensorUpdater.__init__K   sI     #
JJ$$ 	<D!!%%dnnT&:;	<r(   r   c                 n    ||j                   t        |j                        t        |j                        fS r-   )r"   idr   kwargs)r3   r   s     r&   r2   zFakeTensorUpdater.hash_nodeR   s%    dkk2dii="T[[/BBr(   c           	          t               }t        t               j                  j                  D ]  }t        |      xx   dz  cc<    d  fdd }t               } j                  j                  D ]x  } j                  |       j                  v rt        |      |vr/ ||      s8t        |      \  }}}|sJt        j                  5   |j                  |i |}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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>e   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)r:   r;   existing_storagesrC   r<   r3   s     r&   rC   zAFakeTensorUpdater.incremental_update.<locals>.is_fake_tensor_same_   s   CyDI%#e}-s8s3x'  JMcSV-   {d{"c5<<0!%,,u~~F ?"49+T$**>?  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.   r   intr+   r0   get_node_storager2   r/   r6   get_fake_args_kwargsr   	fake_moder"   metar   rM   r   updater%   r1   )r3   	processedr   ra   
to_processis_validr   r7   new_fake_tensorrM   symbol_to_pathuserrZ   rC   r<   s   `           @@@r&   incremental_updatez$FakeTensorUpdater.incremental_updateV   s   E	=H=MJJ$$ 	;D.t45:5	;	;+	Z		 U
JJ$$ !	<Dt$(=(==tHJ.&t,%9$%?"HdF ?"-$++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   G:3H
:H	)__name__
__module____qualname____doc__r   r   Graphr4   r    r2   rp   r?   r(   r&   r*   r*   7   s>    &<ehhnn < <Cehhmm Cc<r(   r*   tc                 6    | j                         j                  S r-   )untyped_storage_cdata)rv   s    r&   rY   rY      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 Nrb   )rh   r   r   rI   _C_has_storagerY   r`   s    r&   re   re      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 r{   )r   r   r   r    rh   )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&   rD   z'get_fake_args_kwargs.<locals>.<genexpr>   s$      )*
1ehhmm$s   .0FT)r   r   r   r7   anypytreearg_tree_leaves)r   r   r7   s      r&   rf   rf      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@   ro   r   s     r&   rD   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   r   r   r	   r
   rO   r   torch.fx%torch.fx.experimental.symbolic_shapesr   r   r   r   torch.utilsr   r   torch.utils._pytreer   virtualizedr   nnr   Moduler   r   r    r#   r   r'   r*   rI   rd   rY   re   r   rf   r   r?   r(   r&   <module>r      sB    # J J J     * ( 
4((//0(382DDE
((--

 #uxx''.../ 
	>B< B<J&5<< &C &)588== )Xc] )	EHHMM 	eD%*d3PS8n4T.U 	588== T r(   