
    Ph^&                        d dl mZmZmZmZmZmZmZ d dlZd dl	m
Z
 d dlZd dlZd dlmZ d dlmZ g dZeeej$                     eej$                     f   Zeej$                  ef   Zeej*                  j,                     Zeej*                  j,                     Zee   Zh dZ ed	      d
        Z ed	      deeej:                  j<                  f   dej*                  j,                  defd       Z ed	      dej*                  j,                  de fd       Z! ed	       G d d             Z" ed	      dej*                  jF                  dej*                  jF                  fd       Z$y)    )ListTupleUnionDictAnySetMappingN)	dataclass)_get_qualified_name)compatibility)get_acc_ops_nameget_node_targetis_node_output_tensorFxNetAccFusionsFinderlegalize_graph>   call_methodcall_modulecall_functionF)is_backward_compatiblec                     t        | t              r| S | j                  rd| j                  v rd| j                   S | j                  j	                  dd      }|r|nd d| j                   S )Nacc_opsacc_ops.z
torch._opsz	torch.ops .)
isinstancestr
__module____name__replace)kmodules     gC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/fx/passes/tools_common.pyr   r      sd    !S	
)q||3!**&&%%lK@"&+1QZZL99    
submodulesnodereturnc                 $   |j                   t        v s-J ddj                  t              z   d|j                    z          |j                   dk(  rLt        |j                  t
              sJ | |j                     }t        |dt        |            }t        |      S |j                   dk(  r@|j                  }|j                  d|j                  v rd|j                   S t        |      S t        |j                  t
              sJ |j                  S )	a,  
    Given a `node` returns its target typename.

    For "call_method" node, return node.target which is the name of that method being called.
    This could potential lead to conflict but should be okay because normally it's on a tensor.

    For "call_function" node, return typename of node.target.

    For "call_module" node, return typename of the module that node.target point to.

    If seeing "_VariableFunctionsClass" in the target name string, it will be replaced by
    "torch". e.g. _VariableFunctionsClass.relu would become torch.relu.
    zExpect op types of z, z, but found r   _base_class_originr   r   r   )opCALLABLE_NODE_OPSjoinr   targetr   getattrtyper   r   r   r   )r$   r%   submodsubmod_typer,   s        r"   r   r      s     77'' 		*; <<dggY?WW' ww-$++s+++DKK(f&:DLI,,	O	#kk   ,f>O>O1O v'(	
 %V,	
 $++s+++{{r#   c                 z    | j                   j                  dd      }|duxr t        |t        j                        S )a  Checks if the node output produces a Tensor or not.

    NOTE: This requires to run `ShapeProp` on the containing fx graph before
    calling this function. This is because it works by checking the `type`
    metadata on the node. This metadata is produced by the `ShapeProp`.
    r.   N)metaget
issubclasstorchTensor)r%   type_s     r"   r   r   C   s3     IIMM&$'E@E5<<!@@r#   c                       e Zd ZdZdej
                  j                  defdZe	 G d d             Z
ddd	eeef   fd
Zdeej
                  j                  ef   fdZy)r   z
    Finds groups of connected ACC nodes that pass non-tensor data between each other.
    Such groups are called fusion groups.
    r!   	acc_nodesc                 h    || _         t        |j                  j                        | _        || _        y N)r!   listgraphnodesr9   )selfr!   r9   s      r"   __init__zFxNetAccFusionsFinder.__init__U   s&    &,,,,-
"r#   c                   <    e Zd ZU eed<   eed<   eed<   eed<   d Zy)!FxNetAccFusionsFinder.FusionGrouptop_node_idxr>   inputsnodes_need_processc                 t   || j                   v ry| j                  j                  |       | j                   j                  |       | j                  j	                  |       | j                  j                  |j                  D ch c]$  }|j                  t        v r|| j                   vr|& c}       yc c}w )z5
            Add a node to fusion group.
            N)	r>   rE   addrD   discardupdateall_input_nodesr)   r*   )r?   r%   ns      r"   add_nodez*FxNetAccFusionsFinder.FusionGroup.add_nodeh   s     tzz!##''-JJNN4 KK%KK "111tt00Qdjj5H 1s   )B5N)r   r   __qualname__int__annotations__NodeSetrL    r#   r"   FusionGrouprB   Z   s%        $#	r#   rR   fusion_grouprB   rD   c                    |D ]}  }|j                   t        vr| j                  j                  |      |j                  k  r?||j                  v r y| j                  ||j                        sl|j                  |        y y)z
        Start from inputs and going reverse topological order. If any upstream node
        is in the fusion group, add all the nodes in this path to fusion group.
        TF)r)   r*   r>   indexrC   recursive_add_noderJ   rL   )r?   rS   rD   args       r"   rV   z(FxNetAccFusionsFinder.recursive_add_nodez   s     Cvv.. zz$|'@'@@ l((( &&|S5H5HI%%c*% ( r#   r&   c                    i }t        | j                        }|D ]A  }||v r	|j                  t        vrd|j                  v r+|| j                  vr:| j                  | j                  j                  |      |ht        |j                        |h      }|j                  rU|j                  j                         }| j                  ||j                         d|j                  vr`|j                  D ]Q  }|j                  t        vr||j                  v r%|j                  |       | j                  ||j                         S |j                  D ]  }|j                  t        vrd|j                  v r%||j                  v r4|j                  |       t!        |j"                  | j                  j                  |            |_        | j                  ||j                          |j                  rUt        |j                        | j                  k  s!| xj                  |j                  z  c_        "|j                  D ]  }|j                  ||<    D |S )Ntensor_meta)rC   r>   rD   rE   )r<   r9   r)   r*   r2   rR   r>   rU   setrJ   rE   poprV   rD   usersrL   minrC   )r?   resultr9   r%   rS   userrW   rK   s           r"   __call__zFxNetAccFusionsFinder.__call__   s   /1(	Dv~ww//		)4>>)>B>N>N!ZZ--d3f4//0$(6	 ?O ?L 11#66::<''l6I6IJ !		1 $

77*;;$<#5#55$$--d3//l>Q>QR !+  //Cvv%66 $0 l000  ))#.03$114::3C3CC3H1L- ++L,:M:MN 0! 11< **+t~~=,"4"44%++A , 2 2F1I ,c h r#   N)r   r   rM   __doc__r5   fxGraphModulerP   r@   r
   rR   r   NodeListrV   r   Noder`   rQ   r#   r"   r   r   N   s|    
#uxx33 # #
   >9 gx'(>8$uxx}}g56 8r#   r   gmc                    | j                   j                  D ci c]  }|d }}t        j                  j	                         }| j                   j                  D ]   }|j
                  D ]  }||xx   dz  cc<    " t        j                         }| j                   j                  D ]  }||   dk(  s|j                  |        i t        |      dkD  ro|j                         }|j                  |fd      |<   |j
                  D ])  }||xx   dz  cc<   ||   dk(  s|j                  |       + t        |      dkD  rot        |j                        t        | j                   j                        k  r%t        d|D cg c]  }||   dk7  s| c}       | j                   j                  |_        || _         | S c c}w c c}w )a  
    Replace the graph of the given GraphModule with one that contains the same nodes as the
    original, but in topologically sorted order.

    This is used by the merge_matmul transformation below, which disturbs the topologically sorted
    order of its input GraphModule, so that this order is restored before further transformation.

    Arguments:
        gm: The graph module to topologically sort. It is modified in-place.

    Returns:
        The graph module in-place sorted
    r      c                     |    S r;   rQ   )xenvs    r"   <lambda>z legalize_graph.<locals>.<lambda>   s	    c!fr#   z&Input graph has cycles, unable to add )r=   r>   r5   rb   Graphr\   collectionsdequeappendlenpopleft	node_copyRuntimeError_codegen)rf   r%   indeg	new_graphr_   queuecurrk   s          @r"   r   r      s    "$0T1WE0 IJJD$K1K    +002E;!LL  /1C e*q.mmo&&s,<=CIID$K1KT{aT"  e*q. 9??c"((..11CV[DpV[d_dei_jno_oTV[DpCqrss**IBHI7 10 Eqs   
GG
G
)%typingr   r   r   r   r   r   r	   rn   dataclassesr
   r5   torch.fxtorch.fx.noder   torch.fx._compatibilityr   __all__r6   TensorsTensorOrTensorsrb   re   rd   rP   r   Namesr*   r   nnModuler   boolr   r   rc   r   rQ   r#   r"   <module>r      s   > > >  !   - 1
u
ell#T%,,%77
8g-.
ehhmm
S	C  e,: -: e,!UXX__(< = !UXX]] !WZ ! -!F e,A A$ A -A e,B B -BJ e,)uxx++ )0D0D ) -)r#   