
    Ph'                        U d dl Z d dlZd dlmZmZmZmZmZ d dlm	Z	 d dl
Z
d dlmZ d dlmZ dZ e j                   e      Ze j&                  ed<   dee
j*                  j,                     d	ee
j*                  j,                     d
ee
j*                  j,                     de
j*                  j.                  fdZde
j*                  j,                  defdZde
j*                  j.                  dedee
j*                  j,                     deegef   ddf
dZ G d de
j:                  j<                        Zde
j*                  j,                  deeef   fdZ dee
j*                  j,                     defdZ!d d d fde
j*                  j.                  dee
j*                  j,                  gef   deee
j*                  j,                     gef   deegef   de
j*                  j.                  f
dZ"y)    N)CallableListOptionalSetTuple)make_fx)compile_fx_inner)select_decomp_table
   loggerinputsbodyoutputsreturnc                   	 t         j                  j                         }i 	t        |       D ]0  \  }}|j	                  d|       }|j
                  |_        |	|<   2 |D ]  }|j                  |	fd      }|	|<    |j                  t        	fd|D                     |j                          |j                          t         j                  j                  i |      S )Narg_)namec                     |    S N )xnode_to_subgraph_nodes    pC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/distributed/_spmd/partial_lower.py<lambda>z)_create_subgraph_module.<locals>.<lambda>!   s    *?*B    )arg_transformc              3   (   K   | ]	  }|     y wr   r   ).0r   r   s     r   	<genexpr>z*_create_subgraph_module.<locals>.<genexpr>%   s      K7a!6q!97s   )result)rootgraph)torchfxGraph	enumerateplaceholdermeta	node_copyoutputtupleeliminate_dead_codelintGraphModule)
r   r   r   subgraphidxinpsubgraph_inpnodesubgraph_noder   s
            @r   _create_subgraph_moduler5      s      %xx~~/Hf%S++4u+>HH%1c" &
  ** B + 
 '4d#	  OO5 K7 KKOL  "MMO88Rx88r   r3   c                    t        d | j                  D              rct        d | j                  D              sFJ dj                  | j	                         dj                  d | j                  D                           yy)	Nc              3   V   K   | ]!  }|j                   t        j                  k(   # y wr   targetoperatorgetitemr   users     r   r   z%_is_container_node.<locals>.<genexpr>,   s      
Bzt4;;(***z   ')c              3   V   K   | ]!  }|j                   t        j                  k(   # y wr   r8   r<   s     r   r   z%_is_container_node.<locals>.<genexpr>-   s      Jzt4;;("2"22zr>   zmMalformed graph: a container node is used as input for non-getitem nodes.
Node: {fmt_node}
Users: {fmt_users}
c              3   <   K   | ]  }|j                           y wr   )format_node)r   us     r   r   z%_is_container_node.<locals>.<genexpr>1   s     #HZAMMOZs   )fmt_node	fmt_usersTF)anyusersallformatrB   joinr3   s    r   _is_container_noderL   +   sq    

Btzz
BBJtzzJJ 	
55;V))+))#HTZZ#HH 6< 6	
J r   gmsubgraph_namesubgraph_nodesdumperc                 z   g g g t               dt        j                  j                  dd ffd}D ]y  }|j                  dk(  r#j                  |       j                  |       5|j                  D ]  }|vs ||        |vsXj                  |       j                  |       { g dt        j                  j                  dd ffd}D ])  }t        fd|j                  D              r" ||       + t              t        t                    k(  sJ t              t        t                    k(  sJ t              } |t        |j                              }	t        | |t        |             d   j                   }
D ]  }|
j#                  |        | j                  j%                  |
      5  | j                  j'                  d	|t)              d
|	i      }t+              D ]U  \  }}| j                  j'                  dt,        j.                  ||f      }|j0                  |_        |j3                  |       W 	 d d d        t5        z         D ]6  }t        |j                        dk(  s| j                  j7                  |       8 y # 1 sw Y   QxY w)Nargr   c                 J   | g}t        |      dk7  r|j                         }t        |      r@j                  fd|j                  D               |j                  |j                         n&|vr"j                  |       j                  |       t        |      dk7  ry y )Nr   c              3   ,   K   | ]  }|v s|  y wr   r   )r   r=   rO   s     r   r   z;_lower_subgraph_nodes.<locals>.add_input.<locals>.<genexpr>L   s     Vt~?Us   	)lenpoprL   extendrG   appendadd)rR   stackr3   r   prologuerO   visibles      r   	add_inputz(_lower_subgraph_nodes.<locals>.add_inputF   s{    %jAo99;D!$'VVVTZZ(w&MM$'KK% %jAor   get_attrr*   c                 R   | g}t        |      dk7  r|j                         }t        |      r7j                  |j                         |j                  |j                         n3t        fd|j                  D              s|vrj                  |       t        |      dk7  ry y )Nr   c              3   &   K   | ]  }|v  
 y wr   r   r   r=   r\   s     r   r   z<_lower_subgraph_nodes.<locals>.add_output.<locals>.<genexpr>o   s     @ZTZ   )rU   rV   rL   rW   rG   rH   rX   )r*   rZ   r3   r   r   r\   s      r   
add_outputz)_lower_subgraph_nodes.<locals>.add_outputh   s{    %jAo99;D!$'DJJ'TZZ(@TZZ@@w&NN4( %jAor   c              3   &   K   | ]  }|v  
 y wr   r   ra   s     r   r   z(_lower_subgraph_nodes.<locals>.<genexpr>t   s     :zt47?zrb   call_moduletag)opr9   argskwargscall_function)rh   r9   ri   r   )setr#   r$   Noderh   rX   rY   all_input_nodesrH   rG   rU   r5   strr"   setattr_InductorModulenextprependinserting_beforecreate_noder+   r&   r:   r;   r(   replace_all_uses_withreversed
erase_node)rM   rN   rO   rP   r]   r3   rR   rc   subgraph_modulereadable_taginsertion_pointsubgraph_callr0   r*   
new_outputr   r   r   r[   r\   s     `            @@@@@r   _lower_subgraph_nodesr~   8   sq    %'H"$F "D"%%G
&uxx}} & & & 77j  MM$KK''C'!# ( xKKKK   $&G
	)588== 	)T 	) :tzz::t  v;#c&k****w<3s7|,,,,-fdGDO#o3345LB?@$R(--O%  
	"	"?	3,, v<(	 - 
 %W-KC--"''#S) . J
 %kkJO((4 . 
4& (tzz?aHH% )' 
4	3s   BJ11J:c                        e Zd Zdej                  j
                  ddf fdZdej                  dede	ej                     fdZ
 xZS )rq   rM   r   Nc                 >    t         |           || _        d | _        y r   )super__init__rM   compiled)selfrM   	__class__s     r   r   z_InductorModule.__init__   s!      	r   ri   rg   c                   | j                   lt               } t        | j                  |      | }t        j                  d|       t        |t        |      d      | _         t        j                  d|       t        j                  j                  |      5  | j                   J | j                  t        |            cd d d        S # 1 sw Y   y xY w)N)decomposition_tablez%Lowering subgraph (%s) to Inductor...F)
cudagraphsz,Completed lowering subgraph (%s) to Inductor)r   r
   r   rM   r   infor	   listr#   profilerrecord_function)r   rg   ri   inductor_decompositions	decomp_gms        r   forwardz_InductorModule.forward   s    == &9&;#U=TUI KK?E,T
 DM
 KKFL^^++C0==,,,==d, 100s   (C

C)__name__
__module____qualname__r#   r$   r.   r   Tensorro   r   r   __classcell__)r   s   @r   rq   rq      sG    588// D -U\\ - -U\\8J -r   rq   c                    | j                   t        j                  j                  j                  j
                  t        j                  j                  j                  j
                  t        j                  j                  j                  j                  t        j                  j                  j                  j                  fv ry| j                   t        j                  j                  j                  j                  k(  ryt        | j                   t        j                  j                        rN| j                   j                  t        j                   j"                  j$                        sd| j                    dfS y)N)Fzfused adam is not supported yetT Fz& doesn't have a meta kernel registered)r9   r#   opsaten_fused_adam_default_fused_adam_foreach_add_Scalar_foreach_addflatten
using_ints
isinstance_ops
OpOverloadhas_kernel_for_dispatch_key_CDispatchKeyMetarK   s    r   _is_inductor_compatibler      s     {{		##++		""**		$$++		##**	  8
 {{eiinn,,777$++uzz445{{66uxx7K7K7P7PQT[[M)OPPPr   nodesc                     t        | D cg c])  }t        |j                        j                  d      s(|+ c}      }|t        k\  S c c}w )Nzaten.)rU   ro   r9   
startswithMIN_ATEN_OPS_TO_LOWER)r   nnum_aten_opss      r   _subgraph_predicater      sB    5N5aCM,D,DW,M5NOL000 Os
   )AAc                      yNTr   r   s    r   r   r      s    r   c                      yr   r   r   s    r   r   r      s    $r   c                      y)Nr/   r   r   s    r   r   r      s    Zr   node_predicatesubgraph_predicatec                    g g}t        t        | j                  j                              }dt        j
                  j                  dt        t        t        f   ffd}|j                  dk7  r|j                  dk(  r|j                   }+ ||      \  }}|r|d   j                  |       nBt        |d         dkD  r t        j                  dt        |      |       |j                  g        |j                   }|j                  dk7  r|D 	cg c]  }	 ||	      rt        |	      r|	 }}	t!        |      D ]  \  }
}d	|
 }t#        | |||        | j                  j%                          | j'                          | S c c}	w )
a  
    Lower Inductor compatible portions of the graph module to Inductor.

    Args:
        node_predicate: user predicate for determining whether to consider a node for
            lowering.
        subgraph_predicate: user predicate for determining whether to consider a list of
            candidate nodes for lowering.
        dumper: a callback for dumping subgraphs for human digestion. For exmaple, it
            can be a function that writes to disk/blob storage and returns the
            path/handle. The returned path/handle for each subgraph will be made
            available in the subgraph call node in the parent graph, as well as the
            label of the profiler block for the subgraph.
    r3   r   c                 @    t        |       \  }}|s||fS  |       syy)N)Fzuser predicater   )r   )r3   should_lowerreasonr   s      r   _node_predicatez&partial_lower.<locals>._node_predicate   s.    6t<f''d#*r   r*   r'   re   r   z,partial_lower: graph break at %s. Reason: %s	subgraph_)rr   iterr"   r   r#   r$   rm   r   boolro   rh   rX   rU   r   warningr   r&   r~   r-   	recompile)rM   r   r   rP   nodes_per_subgraphptrr   r   r   r   r0   rO   rN   s    `           r   partial_lowerr      si   ( 68D
tBHHNN#
$Cehhmm dCi0@  &&H
66]"((C.s3fr"))#.%b)*Q.BCHf %%b)hh &&H
" ('Ee$)<U)C 	'    ));<^#C5)b-H  = HHMMOLLNIs   E?)#loggingr:   typingr   r   r   r   r   	functorchr   r#   torch._inductor.compile_fxr	   torch._inductor.decompositionr
   r   	getLoggerr   r   Logger__annotations__r$   rm   r.   r5   r   rL   ro   r~   nnModulerq   r   r   r   r   r   r   <module>r      s  
   7 7   7 = ***84 499'+EHHMM':9EI%((--EX9
XX9,
UXX]] 
t 
_&_&_& '_& cUCZ 	_&
 
_&D-ehhoo -6%((-- E$)4D 01tEHHMM2 1t 1 7E@N#7	::ehhmm_d23: !$uxx}}"5!6!<=: cUCZ 	:
 XX:r   