
    sh<#              	          S SK r S SKJr  S SKJrJrJr  S SKrS SKrS SK	rS SK
Jr  S SKJrJrJrJr  S SKJr  S SKJr  S SKJr  S	S
KJr  S\\\R8                  R:                  R<                     \S\4   4   S\R>                  R@                  RB                  S\"\#\R8                  R:                  R<                  4   S\$4S jr% " S S5      r&S\RN                  S\(4S jr)S\R>                  RB                  S\\(   4S jr*S r+S\R>                  RB                  S\\$\\   \"\#\4   4   4S jr,S\R>                  RB                  S\$4S jr-g)    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                    [        UR                  5      S:X  a  g[        UR                  S   [        R                  R
                  5      (       a)  [        U[        R                  R
                  5      (       d  gUR                  S   R                  S:w  a  g[        UR                  S   R                  [        5      (       d  gUR                  S   R                  U;  a  g[        X!R                  S   R                     5      U S   La  gUR                  S:w  a  UR                  S:w  a  gUR                  U S   :w  a  g[        UR                  S   R                  5      S:  a  gg)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/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/torch/_inductor/fx_utils.pymatches_module_function_patternr%      s   
 499~diilEHHMM22*ehhmm; ; yy|-'diil))3//yy|')GIIaL''();ww/!dgg&>{{gaj 
499Q<"    c                       \ rS rSrSrS\R                  R                  SS4S jrS\R                  R                  4S jr
S	 rS
rg)FakeTensorUpdater9   a  
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                     [         [           " 5       U l        Xl        U R                  R                   H-  nU R                  R                  U R                  U5      5        M/     g N)r   r   processed_hashesr*   nodesadd	hash_node)selfr*   r   s      r$   __init__FakeTensorUpdater.__init__M   sG     *3 1
JJ$$D!!%%dnnT&:; %r&   r   c                 l    XR                   [        UR                  5      [        UR                  5      4$ r,   )r    idr   kwargs)r1   r   s     r$   r0   FakeTensorUpdater.hash_nodeT   s#    kk2dii="T[[/BBr&   c           	        ^ ^^^ [        [        5      mT R                  R                   H  nT[	        U5      ==   S-  ss'   M     S mUUUU 4S jmS n[
        [           " 5       nT R                  R                   GH  nT R                  U5      T R                  ;   a  [        U5      U;  a  M4  U" U5      (       d  MC  [        U5      u  pEnU(       d  MZ  [        R                     [        5          UR                  " U0 UD6nS S S 5        S S S 5        SUR                  ;   a  T" WUR                  S   5      (       a  M  [        [        R                  R                   UW5        XqR                  S'   [        R                  R                   =n(       a   [#        X5      =n	(       a  XR                  S'   T[	        U5      ==   S-  ss'   UR%                  UR&                   V
s/ s H  n
[        U
5      PM     sn
5        T R                  R)                  T R                  U5      5        GM     g ! , (       d  f       GN3= f! , (       d  f       GN== fs  sn
f )Nr   c                 *    [        [        X5      5      $ r,   )r
   r   )newolds     r$   is_intlist_same=FakeTensorUpdater.incremental_update.<locals>.is_intlist_same]   s    ()9::r&   c                   > [        U 5      [        U5      :w  a  g[        U [        [        45      (       a7  [	        U 5      [	        U5      :w  a  g[        U4S j[        X5       5       5      $ U c  US L $ [        U [        R                  5      (       d  [        U [        R                  [        R                  [        R                  45      (       d    S[        U 5       STR                   35       eU R                  R                  R                  [         R"                  " U R                  R$                  UR                  R$                  5      5      [         R&                  :H  $ T" U R(                  UR(                  5      (       a  U R*                  UR*                  :w  a  gU R*                  [        R,                  :X  aZ  T" U R/                  5       UR/                  5       5      (       a/  [1        U R3                  5       UR3                  5       :H  5      (       d  gU R4                  UR4                  :w  a  g[7        U 5      [7        U5      :X  a  gT[7        U5         S:X  a  [7        U 5      T;  a  gg)NFc              3   8   >#    U  H  u  pT" X5      v   M     g 7fr,    ).0new_iold_iis_fake_tensor_sames      r$   	<genexpr>TFakeTensorUpdater.incremental_update.<locals>.is_fake_tensor_same.<locals>.<genexpr>f   s      JW,%'5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_storagesrD   r<   r1   s     r$   rD   AFakeTensorUpdater.incremental_update.<locals>.is_fake_tensor_same`   s   CyDI%#e}--s8s3x'  JMc-   {d{"c5<<00!#emmU^^'TUU #DI;d4::,?U HH&&==> zz" #399cii88CJJ#**<TzzU]]*#CJJL#**,??,&&(C,>,>,@@  zzSZZ'3;s#33 "+c"23q8$,==r&   c                     U R                   S:H  =(       aR    [        U R                  [        R                  R
                  5      =(       d    U R                  [        R                  :H  $ )Nr   )r   r   r    r   _ops
OpOverloadoperatorgetitemr   s    r$   should_process_nodeAFakeTensorUpdater.incremental_update.<locals>.should_process_node   sI     77o- 4;;

(=(=> 3;;("2"22r&   valunbacked_bindings)r   intr*   r.   get_node_storager   r0   r-   r5   get_fake_args_kwargsr   	fake_moder   r    metar	   rO   r   updater#   r/   )r1   r   rd   
to_processis_validr   r6   new_fake_tensorrO   symbol_to_pathuserr\   rD   r<   s   `          @@@r$   incremental_update$FakeTensorUpdater.incremental_updateX   s   =H=MJJ$$D.t45:5 %	;+	 +	Z		  _&
JJ$$Dt$(=(==tHJ.&t,,%9$%?"HF68"&++t">v"> 9		!&95!1' ' AKK114I.IIe[[222	2";I"WWW 2@		-..t45:5DJJ?JDr$xJ?@!!%%dnnT&:;C % 98$ @s*   (I3H2I&I
2
I<I
I	)r*   r-   )__name__
__module____qualname____firstlineno____doc__r   r   Graphr2   r   r0   rs   __static_attributes__r@   r&   r$   r(   r(   9   s>    &<ehhnn < <Cehhmm Cb<r&   r(   tc                 6    U R                  5       R                  $ r,   )untyped_storage_cdata)r|   s    r$   r[   r[      s    %%%r&   c                    SU R                   ;  a  g [        U R                   S   [        R                  5      (       d  g [        R                  R                  U R                   S   5      (       d  g [        U R                   S   5      $ Nrf   )rl   r   r   rK   _C_has_storager[   rc   s    r$   ri   ri      sc    DIIdii&5588  5!122tyy'((r&   c                     [        U [        R                  R                  5      (       a!  SU R                  ;  a  U $ U R                  S   $ U $ r   )r   r   r   r   rl   )xs    r$   get_faker      s;    !UXX]]##Hvve}Hr&   r   c                     [        [        U R                  U R                  45      u  p[	        S [
        R                  " U0 UD6 5       5      (       a  SX4$ SX4$ )zR
First value returns a boolean if any of the input nodes don't have a faketensor.
c              3   j   #    U  H)  n[        U[        R                  R                  5      v   M+     g 7fr,   )r   r   r   r   )rA   as     r$   rE   'get_fake_args_kwargs.<locals>.<genexpr>   s&      .U
1ehhmm$$.Us   13FT)r   r   r   r6   anypytreearg_tree_leaves)r   r   r6   s      r$   rj   rj      sa     Hqvvqxx&89LD
 .4.D.Dd.Uf.U   d""r&   c                 $  ^^^^ SSK JmJm  S[        R                  R
                  S[        4UU4S jjmT" U 5      (       a  gS[        R                  R
                  S[        4U4S jjm[        U4S jU R                   5       5      (       a  gg	)
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                    > U R                   S:X  a2  U R                  [        R                  L a  T" U R                  S   5      $ U R                   S;   =(       d    U R                  T;   $ )Nr   r   )placeholderoutput)r   r    ra   rb   r   )r   r   	is_buffers    r$   r   #is_node_realized.<locals>.is_buffer   sS    77o%$++9I9I*I TYYq\**ww33Ot{{i7OOr&   Tc                 N   > U R                   S:H  =(       d    U R                  T;   $ )Nr   )r   r    )r   r   s    r$   realizes_inputs)is_node_realized.<locals>.realizes_inputs   s!    ww("Jdkk5J&JJr&   c              3   4   >#    U  H  nT" U5      v   M     g 7fr,   r@   )rA   rr   r   s     r$   rE   #is_node_realized.<locals>.<genexpr>   s     
8ZT?4  Zs   F)	torch._inductor.loweringr   r   r   r   r   boolr   r#   )r   r   r   r   r   s    @@@@r$   is_node_realizedr      sx     JP P$ P P Kehhmm K K 
8TZZ
888 r&   ).ra   collectionsr   typingr   r   r   rQ   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   rH   r"   nnr   Moduler   r   r   dictr!   r   r%   r(   rK   rh   r[   ri   r   rj   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&   