
    Ph              	       (   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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.                  j0                  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,                  j0                  dee   fdZ d Z!de
j,                  j0                  deeee   eeef   f   fdZ"y)    )defaultdict)AnyCallableDefaultDictDictOptionalTupleTypeN)_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      cC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\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                  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.
    graphc                     t               | _        || _        | j                  j                  D ],  }| j                  j	                  | j                  |             . y N)setprocessed_hashesr'   nodesadd	hash_node)selfr'   r   s      r"   __init__zFakeTensorUpdater.__init__@   sD     #
JJ$$D!!%%dnnT&:; %r$   r   c                 n    ||j                   t        |j                        t        |j                        fS r)   )r   idr   kwargs)r/   r   s     r"   r.   zFakeTensorUpdater.hash_nodeG   s%    dkk2dii="T[[/BBr$   c                    t               }t        t              | j                  j                  D ]  }t        |      xx   dz  cc<    fd| j                  j                  D ]Q  }| j                  |      | j                  v r"d } ||      s.|g}t        |      dkD  s@|j                         }||v r$ ||      r-t        |      \  }}}|s?t        j                  5   |j                  |i |}	d d d        d|j                  v r 	|j                  d         r	|j                  d<   t        |	      xx   dz  cc<   |j                  |       |j                   D ]  }
|j#                  |
        | j                  j                  | j                  |             t        |      dkD  rT y # 1 sw Y   xY w)Nr   c                 X   t        |       t        |      k7  ryt        | t        t        f      r6t	        |       t	        |      k7  ryt        fdt        | |      D              S t        | t        j                        sJ | j                  |j                  k7  s| j                  |j                  k7  ry| j                  t        j                  k(  r"| j                         |j                         k7  ryt        |       t        |      k(  ryt        |         dk(  rt        |       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>W   s!      JW,%'u5-s   Tr   )r    r   listtupler   allzipr   Tensorshapelayoutstridedstrideget_storage)newoldexisting_storagesr;   s     r"   r;   zAFakeTensorUpdater.incremental_update.<locals>.is_fake_tensor_sameQ   s    CyDI%#e}-s8s3x'  JMcSV-   c5<<000yyCII%szz)AzzU]]*szz|szz|/K3;s#33 "+c"23q8$,==r$   c                     | j                   dk(  xr. t        | j                  t        j                  j
                        S )Nr   )r   r   r   r   _ops
OpOverloadr   s    r"   is_aten_nodez:FakeTensorUpdater.incremental_update.<locals>.is_aten_noden   s2    ww/1 jKK!6!67 r$   r   val)r*   r   intr'   r,   get_node_storager.   r+   r   popget_fake_args_kwargsr   	fake_moder   metar-   r!   append)r/   	processedr   rN   
processingupdating_nodeis_validr   r3   new_fake_tensoruserrI   r;   s              @@r"   incremental_updatez$FakeTensorUpdater.incremental_updateK   s   E	=H=MJJ$$D.t45:5 %	2 JJ$$D~~d#t'<'<<
  %Jj/A% * 0 I-.)=m)L&$[[&:m&:&:D&KF&KO !M...3F#]%7%7%>4 ,;""5) ""2?"CDIDm,)//D%%d+ 0 %%))$..*GH3 j/A% %. ![s   )F??G	N)__name__
__module____qualname____doc__r   r   Graphr0   r   r.   r]   r7   r$   r"   r&   r&   ,   s8    &<ehhnn <Cehhmm CEIr$   r&   tc                 6    | j                         j                  S r)   )untyped_storage_cdata)rc   s    r"   rF   rF      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 NrO   )rU   r   r   rA   _C_has_storagerF   rM   s    r"   rQ   rQ      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 rh   )r   r   r   r   rU   )xs    r"   get_fakerm      s8    !UXX]]#Hvve}Hr$   rl   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   )r8   as     r"   r<   z'get_fake_args_kwargs.<locals>.<genexpr>   s$      .U
1ehhmm$.Us   .0FT)r   rm   r   r3   anypytreearg_tree_leaves)rl   r   r3   s      r"   rS   rS      sb     Hqvvqxx&89LD&
 .4.D.Dd.Uf.U  dF""vr$   )#collectionsr   typingr   r   r   r   r   r	   r
   r   torch.fxtorch.utilsr   rr   torch.utils._pytreer   virtualizedr   nnr   Moduler   r   r   r   boolr#   r&   rA   rP   rF   rQ   rm   rS   r7   r$   r"   <module>r}      s   # J J J   ) ( 
4((//0(382DDE
((--

 #uxx''.../ 
	>dI dIN&5<< &C &)588== )Xc] )	EHHMM 	eD%*d3PS8n4T.U 	r$   