
    3j                        S r SSKrSSKrSSKrSSKrSSKrSSKJrJr  SSK	J
r
JrJr  SSKJrJr  SSKrSSKJs  Jr  SSKJr  SSKJrJrJrJrJr  SSKJrJr  SS	K J!r!J"r"J#r#J$r$  SS
K%J&r&J'r'  SSK(J)r)J*r*J+r+J,r,  SSK-J.r.J/r/  SSK0J1r1  SSK2J3r3  SSK4J5r5  SSK6J7r7  SSK8J9r9  SSK:J;r;J<r<J=r=J>r>J?r?J@r@JArA  SSKBJCrCJDrD  SSKEJFrFJGrG  SSKHJIrIJJrJ  SSKKJLrL  SSKMJNrN  \(       a  SSKOJPrP  SrQ\." \RS5      rS\." \RS5      rTS\U4S jrVS\U4S jrWS\R                  S-  S\R                  S-  4S  jrYS!\S\
S"\4   4S# jrZ " S$ S%5      r[ " S& S'5      r\ " S( S)5      r]\\" 5       r^/ S*Qr_\L" \\\R                  \/5      ra\R                  " 5       qcS+\dS\4S, jre " S- S.5      rfS/qgS/qhS/qiS/qjSqk\R                    SDS0\
S"\4   S1\US2\US\S3   4S4 jj5       rm\R                  S\S3   4S5 j5       rnSES6 jroS7\\R                     S8\\J   S9\\J   S:\JS;\\J   S<\\J   S=\JS\p\R                     4S> jrqS?\\U   S@\R                  SA\\R                  S-     SB\R                  S\p\R                  S-     4
SC jrrg)Fa  
Provides functionality for compiling PyTorch's autograd (automatic differentiation) system.

This module implements compiled autograd, which traces and optimizes backward pass
computations at runtime. The key components are:

- AutogradCompilerInstance: Traces and compiles autograd graphs using FX
- Context managers (_enable/_disable): Control when compiled autograd is active
- Utility functions: Support graph manipulation, tensor operations, and hooks

Compiled autograd can significantly improve backward pass performance by removing
Python overhead and enabling additional optimizations. It works by capturing
backward computations into an FX graph that can be compiled and optimized,
while maintaining the same semantics as eager mode autograd.
    N)Counterdefaultdict)Callable	GeneratorSequence)AnyTYPE_CHECKING)enable_python_dispatcher)call_accumulate_gradcall_backward	call_hookFakeCompiledAutogradEngineunwrap_maybe_dynamic_intGetItemSourceLocalSource)countersget_chromium_event_loggerlazy_format_graph_codeset_locals_to_steal)AutogradLazyBackwardCompileInfo%CachedAutogradLazyBackwardCompileInfo)compile_contextCompileContext	CompileIdSource)getArtifactLoggertrace_structuredclone_preserve_strides)FakeTensorMode)
FakeTensor)GraphModule)BackwardState)	decomposedisable_autocast_cachedisable_proxy_modes_tracingfetch_object_proxyProxyTorchDispatchModePythonKeyTracertrack_tensor_tree)
DimDynamicShapeEnv)preserve_node_metaset_stack_trace)FloatLikeTypeIntLikeType)
OrderedSet)CapturedTraceback)Proxya  You can turn off compiled autograd by either:
1. Moving the unsupported autograd call outside of the torch.compile'd region.
2. Wrapping the unsupported autograd call in the torch._dynamo.compiled_autograd._disable() context manager.
3. Setting torch._dynamo.config.compiled_autograd=False for the torch.compile call containing the unsupported autograd call.
4. Setting torch._dynamo.config.compiled_autograd=False at the start of the program.compiled_autogradcompiled_autograd_verbosereturnc                  h    [         R                  R                  R                  R	                  S5      $ )Nr6   )torch_logging	_internal	log_stateis_artifact_enabled     Y/home/wildlama/miniconda3/lib/python3.13/site-packages/torch/_dynamo/compiled_autograd.py snapshot_verbose_logging_enabledrA   T   s(    >>##--AA# r?   c                  ^    [         R                  R                  R                  R                  $ N)r9   	_inductorconfigtriton
cudagraphsr>   r?   r@   snapshot_cudagraph_enabledrH   Z   s    ??!!((333r?   xc                 "    U b  [        U 5      $ U $ rC   r   )rI   s    r@   maybe_clonerK   ^   s    }%a((Hr?   CompiledFunction.c                 z   [        U R                  [        5      (       a  U R                  R                  $ [        U R                  [        5      (       aL  [
        R                  R                  R                  5          U R                  R                  5       sS S S 5        $ [        S5      e! , (       d  f       g = f)NzEUnexpected Lazy Backward Compilation Info Type. Please file an issue.)
isinstance_lazy_backward_infor   	bw_moduler   r9   _subclassesfake_tensorunset_fake_temporarilybw_module_fnAssertionError)rL   s    r@   extract_bw_modulerV   d   s    ,,.M   33===	,,.S
 
 **AAC#77DDF DC S
 	
 DCs   =B,,
B:c                       \ rS rSrS\SS4S jrS\R                  R                  SS4S jr	S\
\R                  S	4   SS4S
 jrS\
\R                  S	4   SS4S jrSrg)
NaNChecker   accumulate_gradr7   Nc                 :    Xl         / U l        0 U l        / U l        g rC   )rZ   params_indicesparams_to_checkoutput_names)selfrZ   s     r@   __init__NaNChecker.__init__   s     .)+8:')r?   graphc                 x   [        [        UR                  5      5      nUR                  S[        S9nUR                  SS9S   R
                  S   nU R                  [        U5      :X  a  U R                  U(       + :X  d   eU H  nUR
                  S   nUR                  [        R                  L a4  UR
                  S   UL a"  [        UR
                  S   [        5      (       d   eU R                  R                  UR
                  S   5        M     U Vs/ s H  oUR                  PM     snU l        g s  snf )Ncall_functionoptargetoutputrf   r      )nextiternodes
find_nodesr   argsrZ   boolrg   operatorgetitemrN   intr\   appendnamer^   )r_   rb   inputs_nodeacc_grad_nodesoutput_nodesnode
param_nodes          r@   prep_with_graphNaNChecker.prep_with_graph   s&   4,-))'; * 
 ''8'4Q7<<Q?##t(
 
""<'78	9 9 #D1J
 !!X%5%55OOA&+5zq13778 &&zq'9: # 4@@<4YY<@@s   D7inputs.c                    U R                   (       d  g U R                   Hc  nX   R                  nUb:  [        R                  " U5      R                  5       (       a   SU S[         35       eX   U R                  SU S3'   Me     g )Nz9Compiled autograd running under anomaly mode with inputs[z6] already having NaN gradient. This is not supported. zinputs[])rZ   r\   gradr9   isnananyTURN_OFF_MSGr]   )r_   r}   idxr   s       r@   prep_with_inputsNaNChecker.prep_with_inputs   s    ## &&C;##D ;;t,0022 OPSu UCCO.R2
 6<[D  73%q!12 'r?   outc                    U R                   (       a  U(       a   e/ nU R                  R                  5        HZ  u  p4UR                  c   e[        R
                  " UR                  5      R                  5       (       d  MI  UR                  U5        M\     U(       a  [        SSR                  U5       S35      eg / n[        U5       HN  u  pg[        R
                  " U5      R                  5       (       d  M0  UR                  U R                  U   5        MP     U(       a  [        SSR                  U5       S35      eg )Nz9Compiled Autograd returned NaN gradients for parameters: ,.z;Compiled Autograd returned NaN gradients for output nodes: )rZ   r]   itemsr   r9   r   r   rt   RuntimeErrorjoin	enumerater^   )r_   r   
nan_params
inputs_strparam	nan_gradsir   s           r@   checkNaNChecker.check   s   N7$&J%)%9%9%?%?%A!
zz---;;uzz*..00%%j1 &B
 "OPSPXPXYcPdOeefg   $&I$S>;;t$((**$$T%6%6q%9: * "QRURZRZ[dReQffgh  r?   )rZ   r^   r\   r]   )__name__
__module____qualname____firstlineno__rp   r`   r9   fxGraphr{   tupleTensorr   r   __static_attributes__r>   r?   r@   rX   rX      sx    * * *AUXX^^ A A0AuU\\3->'? AD A u||S01 d r?   rX   c            
       X    \ rS rSrSS jrS\S\S\4   S\S	\S\4
S
 jr	S\S\4S jr
Srg)OpNamespace   r7   Nc                 "    [        5       U l        g rC   )r   custom_function_name_counterr_   s    r@   r`   OpNamespace.__init__   s    :A))r?   ru   fn.is_custom_functionis_traceablec                   ^ U(       a1  SU-   nU R                   U   nU R                   U==   S-  ss'   U U 3n[        X5      (       a   e[        XU5      mU(       a+  [        X[        R
                  R                  T5      5        U$ [        R
                  R                  S[        S[        S[        4U4S jj5       n[        XU5        U$ )NCppNoderj   ro   kwargsr7   c                     > T" U 0 UD6$ rC   r>   )ro   r   results     r@   run_non_traceable_cpp_in_eager7OpNamespace.add.<locals>.run_non_traceable_cpp_in_eager   s    t.v..r?   )	r   hasattrOpsetattrr9   _dynamoallow_in_graphdisabler   )r_   ru   r   r   r   countr   r   s          @r@   addOpNamespace.add   s     t#D55d;E--d3q83VE7#D4&&&&D01D < <V DE  ]]""/c /S /S / #/ D >?r?   c                     [        X5      $ rC   )getattr)r_   ru   s     r@   getOpNamespace.get   s    t""r?   )r   r7   N)r   r   r   r   r`   strr   r   rp   r   r   r   r>   r?   r@   r   r      sY    D S#X !	
  
8# # #r?   r   c                   \    \ rS rSrS\S\S\4   S\SS4S jrS	\S
\S\4S jr	S\4S jr
Srg)r      ru   r   .r   r7   Nc                 6    X l         X0l        Xl        SU l        g )Nz#torch._dynamo.compiled_autograd.ops)r   r   r   r   )r_   ru   r   r   s       r@   r`   Op.__init__   s     "4?r?   ro   r   c                 &    U R                   " U0 UD6$ rC   )r   )r_   ro   r   s      r@   __call__Op.__call__   s    ww'''r?   c                 :    U R                   S-   U R                  -   $ )Nr   )r   r   r   s    r@   __repr__Op.__repr__   s    $t}}44r?   )r   r   r   r   )r   r   r   r   r   r   r   rp   r`   r   r   r   r>   r?   r@   r   r      s[    @@%c3h/@EI@	@(c (S (S (5# 5r?   r   )r}   sizesscalarshookspacked_datacompiled_autograd_idc           
      <    [        [        [        U S S S95      5      $ )N)r   frame_idframe_compile_id)r   r   r   )r   s    r@   make_compile_contextr     s(    %9!%	
 r?   c                      \ rS rSrS\S\4   SS4S jrS\R                  S\	S-  S\
4S	 jr\S
\S\S\4S j5       rS\\R                     S\\   S\\\-     S\\\\\4         S\S\S\\\\R                     \\   \\   4   4S jrS\\   SS4S jrS\\   S\\R                     S\\R                     S\S\S\S-  S\\   S\\   4S jrS\\   S\\   S\\R                     S\S\R4                  R6                  R8                  S\S-  S\\   S\\R                  S-  S4   4S  jrS\\   S!\\   S"\\   S#\S$\\   S%\\   S&\S\\R                     4S' jrS(\\   S)\R                  S*\\   S+\R                  S\\R                     4
S, jrS\R                  4S- jr S.\S/\S\4   S0\S1\S\4
S2 jr!S.\S3\\   S4\S5\\   S\\R                     4
S6 jr"S/\S\4   S4\S5\\   S\\R                     4S7 jr#S8\S9\\   S4\S5\\   S\\R                     4
S: jr$S;\S<\S\R                  4S= jr%S>\R                  S?\R                  S@\SS4SA jr&SB\S\4   S4\SC\S\RN                  RP                  4SD jr)SE\SF\S\R                  4SG jr*S\\R                     SE\SH\S\\R                     4SI jr+S\\R                     SE\SH\S\\R                     4SJ jr,S\\   SE\S\\R                     4SK jr-S9\\R                     S\\R                     SE\S\\R                     4SL jr.SM\R                  SE\S\\R                     4SN jr/SO\RN                  R`                  S\\   4SP jr1SQ\S\4SR jr2SmSS jr3S\4\   4ST jr5SU\S\64SV jr7S9\S\\S\4   \4   4SW jr8\S4\\   S\\RN                  Rr                     4SX j5       r:\SQ\RN                  Rr                  S\4SY j5       r;SmSZ jr<SmS[ jr=SmS\ jr>SmS] jr?SmS^ jr@SmS_ jrASmS` jrBSa\S\4Sb jrC SnSc\\   Sd\S\\\\4      S-  S\\   4Se jjrDSf\S\E4Sg jrFSh\Si\Sj\R4                  R                  S-  SS4Sk jrHSlrIg)oAutogradCompilerInstancei  compiler_fn.r7   Nc                 .   Xl         [        R                  " 5       U l        U R                  R                  U l        [        5       U l        [        SSU R                  S9U l        [        5       U l
        [        U R                  S5      U l        S U l        g )NT)allow_fallback_kernelsallow_non_fake_inputs	shape_envsymbolic)r   
contextlib	ExitStackstackcloser-   r   r!   fake_tensor_moder*   	fx_tracerr)   
proxy_modehooks_proxy)r_   r   s     r@   r`   !AutogradCompilerInstance.__init__  sr    &))+
ZZ%%
! .#'"&nn!

 )*0L)-r?   rI   sourcec                 v    [        U[        R                  5      (       d   eU R                  R	                  XS9$ )N)r   )rN   r9   r   r   from_tensor)r_   rI   r   s      r@   	wrap_fake"AutogradCompilerInstance.wrap_fake-  s3    !U\\****$$000BBr?   ru   r   c                 ,    [        [        U 5      U5      $ rC   r   )ru   r   s     r@   r   AutogradCompilerInstance.source1  s    [.44r?   r}   r   r   originsrZ   
check_nansc                 l  ^  [         S   S==   S-  ss'   [        [        5      T l        [	        [
        5      T l        [        T R                  5      T l        T R                  R                  5         U(       a  [        U5      OS T l        [        R                  " 5       T l        [        5       R!                  ST R                  ST R                  0SS9  ["        R$                  R'                  5       T R(                  l        ["        R,                  R/                  [0        S9T R(                  l        0 T R(                  l        0 T l        U 4S j[8         5       u  nT l        T l        T l        T l         T RB                  RE                  [G        5       5        Uu  pn
T RB                  RE                  [I        5       5        US	   n [K        U5       H)  u  pT RM                  UT RO                  S
U5      5      X'   M+     T RY                  XU5        [K        U5       VVs/ s H@  u  pT RZ                  R]                  UT RO                  SU5      [^        R`                  5      PMB     nnn[c        [e        U5      5       Vs/ s H  nT R:                  U   PM     nn[K        U5       Hb  u  nnT R(                  Rg                  S[h        UU   40 5      UU'   [k        U[
        5      (       a  MF  UU   T R6                  URl                  '   Md     T RY                  UUU	5      n[K        U5       H  u  pT RO                  SU5      n[k        U[
        5      (       a/  T RZ                  R]                  UU[^        R`                  5      X<'   M[  [k        U[n        5      (       aF  T RZ                  Rq                  T RZ                  Rs                  UU[^        R`                  S9UUS9X<'   M  [u        S[U        U5      5      e   T RY                  UT R<                  U
5        [K        U5       H,  u  nnT R<                  U   T R6                  URl                  '   M.     T RB                  RE                  [w        0 5      5        T RB                  RE                  T Rx                  5        T RB                  RE                  T Rz                  5        T RB                  RE                  [}        5       5        T Rx                  RZ                  c   eT Rx                  RZ                  nT RB                  RE                  ["        R,                  R~                  R                  R                  U5      5        [        [        R                  " 5       5      UUU4$ ! [P         a$  n[S        S[U        U5       S[V         35      UeS nAff = fs  snnf s  snf )Nr5   capturesrj   graph_idTlog_pt2_compile_event)
tracer_clsc              3   `   >#    U  H#  nTR                   R                  S US0 5      v   M%     g7f)placeholderr>   N)r   create_proxy).0ru   r_   s     r@   	<genexpr>9AutogradCompilerInstance.begin_capture.<locals>.<genexpr>U  s0      
+ NN''tRDD+s   +.r   r}   zFound tensor of type z,, which is not supported by FakeTensorMode. r   rd   r   )r   dynamic_dim)hintr   zUnexpected scalar type: )Er   rk   COMPILE_COUNTERidr   rs   aot_id_counterr   r   	__enter__rX   nan_checkertimetime_nsstart_time_nsr   log_event_startr9   nnModuler   rootr   r   r*   rb   tensor_attrssymnode_proxy_lookup_graph_placeholderssizes_proxyscalars_proxyr   packed_data_proxyr   enter_contextr.   r
   r   r   r   	ExceptionNotImplementedErrortyper   bind_objects_to_proxiesr   $create_unspecified_symint_and_symbolr,   DYNAMICrangelenr   r   rN   ry   floatcreate_symfloatnodecreate_unspecified_symbolrU   r%   r   r   r&   experimentalsymbolic_shapes_suppress_guardsr   r   current_compile_id)r_   r}   r   r   r   rZ   r   
args_proxyinputs_originssizes_originsscalars_originsrI   r   eval	sym_sizesr   proxiessymintr   symvalenvs   `                     r@   begin_capture&AutogradCompilerInstance.begin_capture5  s    	$%j1Q61'.9#.>3DGG<&&(:D:o6$!\\^!#33!"&	 	4 	
 $hhoo/$xx~~~I&(#$&!
+
	
" 	

  !3!569@6 	

  !9!;< 1I	#F+"nnQHc0JK , 	$$VH &e,
 - NN??GS)""
 - 	 
 16c)n0EF0E14##A&0EF"9-IAv44(	GAJ fc**9@))&++6 . ..y'=Q!'*HC[[C0F#s###~~RR&& 
 C''#~~AANN<<%$.$6$6 = 
 !  B   %%?cKK' +( 	$$Wd.@.@/R"7+IAv595G5G5JD%%fkk2 , 	

  2/

  !6!67

  1

  !7!9:$$..:::##--

  HH!!11BB3G	

 1134	
 	
G  	%'Qy0\]i\jk	
 Gs%   8U: AV+=V1:
V(V##V(compile_reasonsc                 8   ^ T(       d   e[        SS U4S jS9  g )Nartifactc                      SSS.$ )N!compiled_autograd_compile_reasonsjsonru   encodingr>   r>   r?   r@   <lambda>>AutogradCompilerInstance.log_compile_reasons.<locals>.<lambda>  s    ;"!r?   c                     > T $ rC   r>   )r)  s   r@   r1  r2    s    r?   metadata_fn
payload_fn)r   )r_   r)  s    `r@   log_compile_reasons,AutogradCompilerInstance.log_compile_reasons  s"      /	
r?   pinputspsaved_tensorssaved_tensorspctxctxmaybe_backward_state_idxopaque_object_indicesc                 r  ^ ^^^^^^^ TR                  5        Vs/ s H  nT R                  U5      PM     n	nU V
s/ s H  n
T R                  U
   PM     nn
TR                  n[	        U5      mUR
                  mUR                  mUR                  mA[        R                  " 5       (       a/  TR                   H  nUR                  (       d  M  [        S5      e   [        R                  R                  S[        [        R                      S[        ["           S[        [$           S[        [$           S[$        4
UU4S jj5       nT R&                  R)                  SUUU	U/UQ70 S	9mS mUb  T R                  U   mS[*        [        R                      4UUUUUU 4S
 jjnU" 5       nS[$        S[,        S[        [$           S[        R                   4U 4S jjn[        R.                  R0                  R2                  R5                  TTUUS9n[6        R8                  " T R                  U5      nU$ s  snf s  sn
f )Nz@torch.compile does not currently support higher order gradients.ctx_saved_tensorsctx_symintsctx_opaque_objs	flat_argsr7   c                 z   > [         R                  R                  R                  R                  " U UUTT/UQ76 nU$ rC   )r9   
_functorch_aot_autogradruntime_wrappers_backward_prologue_functional)rA  rB  rC  rD  r   maybe_subclass_metadatametadatas        r@   call_aot_bwd_prologueOAutogradCompilerInstance.proxy_call_aot_backward.<locals>.call_aot_bwd_prologue  sG     ""00AA__!' C Jr?   rd   kindrg   ro   r   c            	      	  >^^ S[         R                  R                  S[        4S jn U " TR                  5      n[        U[        TS L5      -
  5       Vs/ s H  nTU   PM
     nnTR                  5       n[        U5      [        TR                  5      :X  d   eU Vs/ s H  nTR                  U5      PM     nnXcS [        U5      & Tb  UR                  T5        Sn0 mS n[        T5      mTR                  T   (       a  TSTR                  T    3-  mTR                  T==   S-  ss'   S[        S[        4U4S jjn	TR                  R                   GH  n
U
R                  S	:X  a1  X7   R                  nU	" U
R                   5      Ul        UTU
'   US-  nME  U
R                  S
:X  a  [        U
R"                  5      S:X  d   eU
R"                  S    Vs/ s H[  n[%        U[         R                  R&                  5      (       a-  [         R                  R)                  TU   TR*                  5      OUPM]     nnM  U
R                  S:X  a  U
R,                  nTR*                  R/                  U5      n[1        TR*                  R2                  U[5        TU5      5        TR*                  R7                  SUS0 5      nU	" U
R                   5      Ul        UTU
'   GM  U
R                  S:X  a  U
R,                  [         R8                  R:                  R<                  R>                  L a3  [         R8                  R:                  R@                  R>                  U
l        TR*                  R                  RC                  U
U4S j5      nU	" U
R                   5      Ul        UTU
'   GMM  U
R                  S:X  a  U
R,                  nTR*                  R/                  U5      n[1        TR*                  R2                  U[5        TU5      5        TR*                  R                  RC                  U
U4S j5      nXl        UTU
'   GM  [E        S5      e   Uc   eS[         RF                  4S jnU Vs/ s H5  n[%        U[         R                  R(                  5      (       a  U" 5       OUPM7     nnTRI                  UU5        U$ s  snf s  snf s  snf s  snf )Nrb   r7   c                 `    SnU R                    H  nUR                  S:X  a  US-  nM    U$    U$ )Nr   r   rj   )rm   rf   )rb   num_argsry   s      r@   
num_inputskAutogradCompilerInstance.proxy_call_aot_backward.<locals>.copy_paste_aot_backward_graph.<locals>.num_inputs  s<    !KKDww-/ A  (  r?   r   _rj   	node_namec                    > ST SU  3$ )NaotrU  r>   )rV  deduped_aot_ids    r@   make_uniquelAutogradCompilerInstance.proxy_call_aot_backward.<locals>.copy_paste_aot_backward_graph.<locals>.make_unique4  s    ^,Ai[99r?   r   rh   get_attrr>   rd   c                    > TU    $ rC   r>   nvalue_remaps    r@   r1  iAutogradCompilerInstance.proxy_call_aot_backward.<locals>.copy_paste_aot_backward_graph.<locals>.<lambda>T  	    Ar?   call_modulec                    > TU    $ rC   r>   r^  s    r@   r1  ra  ]  rb  r?   zshouldn't get herec                      [        5          [        R                  " SSSSS5      sS S S 5        $ ! , (       d  f       g = f)Nr   {   r'   r9   zerosr>   r?   r@   dummyfAutogradCompilerInstance.proxy_call_aot_backward.<locals>.copy_paste_aot_backward_graph.<locals>.dummyh  s(    02 ;;q!Q37 322s   /
=)%r9   r   r   rs   rb   r  _get_compiled_autograd_symintsr  symintsto_proxyrt   r   r   rm   rf   ry   ru   ro   rN   Noder4   r   rg   get_fresh_qualnamer   r  r   create_nodeopsatenviewdefaultreshape	node_copyrU   r   r  )rS  rR  r   	pall_argsrl  r   psymintsargs_idxpoutputsrZ  ry   phr_  ru   qualnamer   ri  ooutputsrY  r`  aot_idrP   r=  pbackward_statepgradsr_   s                      @@r@   copy_paste_aot_backward_graphWAutogradCompilerInstance.proxy_call_aot_backward.<locals>.copy_paste_aot_backward_graph  s&    %((..  S   ")//2H#(Ct8S4T)T#U#Uaq	#U   88:Gw<3s{{#333329:'Qa('H:(0nG%*  1 HK48H ![N""6*Ad&9&9&&A%B"CC'1,':s :s : "--77m+",11B)$))4BG(*K%MHWW(tyy>Q...
 "&1	  ".A &a77 {1~t~~F ".	   H WW
*;;D#~~@@FHDNN//79d;ST!^^77
HbRTUF"-dii"8FK(.K%WW/{{eiinn&9&9&A&AA ',iinn&<&<&D&D!^^11;;6F #.dii"8FK(.K%WW-;;D#~~@@FHDNN//79d;ST!^^11;;6F %-M(.K%()=>>U .X '''85<< 8
 JRIQA:a88a?   (((;Nm ;@ Xs   R<SA"S*<Ssubclass_meta
is_runtimeunwrapped_argsc                 D  >^ ^ [         R                  R                  S[        S[        4UU 4S jj5       n[        R
                  " TR                  U5      nTR                  R                  SU[        U5      0 S9nTR                  5       nTR                  U/U/5        U$ )Nr  r7   c                  $   > TR                  U TS9$ )N)r  )creation_fn)r  r  r  s    r@   make_subclasskAutogradCompilerInstance.proxy_call_aot_backward.<locals>.proxy_subclass_constructor.<locals>.make_subclassw  s    $00J0WWr?   rd   rN  )r9   r   r   r   pytreetree_maprm  r   r   r   allocate_dummyr  )r  r  r  r  punwrapped_argspoutputrh   r_   s   ``     r@   proxy_subclass_constructorTAutogradCompilerInstance.proxy_call_aot_backward.<locals>.proxy_subclass_constructort  s     ]]))Xs Xs X *X %oodmm^LOnn11$$?+ 2 G ((*F((&G9=Mr?   )make_subclass_override)rk  rm  r   _forward_clsrV   rK  rJ  _aot_idr9   is_grad_enabledoutput_inforequires_gradr   r   r   r   r   r1   r   r   r   listrp   rF  rG  rH  _backward_epilogue_functionalr  r  )r_   r9  r:  r;  r<  r=  r>  r?  r   rx  r   popaque_objectsrL   output_alias_inforL  r  r~  r  resultspresultsr  rP   rJ  rK  r  r  s   `    `              @@@@@@r@   proxy_call_aot_backward0AutogradCompilerInstance.proxy_call_aot_backward  sD   * /2.P.P.RS.RDMM!$.RS -
, S!, 	 
 ++%&67	#,,"2"J"J!))  ""%-%9%9!$222&Z  &: 
	%	%	'5	!+.	 &c]	 !		
 	 
&	  ,, ( 	  - 
 #/"../GHOd	tELL/A d	 d	L 01		,0	BJ3-	\\	* ""00AA__##=	 ` 
 ??4==':{ T
s
   H/H4output_metadatasbackward_idxc                 x   U R                   c   eU R                   U   nU R                  U5      n	U R                  U5      n
[        UR                  S5      (       a  U R	                  U	U
UUUUU5      nO%U R
                  R                  S[        UU
/U	Q70 S9nUc   e[        5          / n[        U5       HM  u  pUb  X   c  UR                  S 5        M   Uu  nnnnUR                  [        R                  " UUUUS95        MO     U R                  X5        S S S 5        [        W5      $ ! , (       d  f       N= f)Nr  rd   rN  )sizedtypelayoutdevice)r   rm  r   r  r  r   r   r   r'   r   rt   r9   emptyr  r   )r_   r}   r  r;  r  r=  r>  r?  r<  r9  r:  r#  grad_insr   output_metadatar  r  r  r  s                      r@   proxy_call_backward,AutogradCompilerInstance.proxy_call_backward  sT    +++---'}53##Y//22(%G nn11$$" 
  2 	G """(*24H(12B(C$"*gl.BOOD).=+tKKTvfU )D ((; + X +*s   (A0D++
D9
base_sizesbase_stridesbase_storage_offset
view_sizesview_stridesview_storage_offsetc           	          UU R                  U5      U R                  U5      U R                  U5      U R                  U5      U R                  U5      U R                  U5      4nU R                  [        US /S-  5      $ )N   )rm  
proxy_callcopy_slices_prologue)	r_   r}   r  r  r  r  r  r  ro   s	            r@   call_copy_slices_prologue2AutogradCompilerInstance.call_copy_slices_prologue  st     MM*%MM,'MM-.MM*%MM,'MM-.
 3TD6A:FFr?   needs_input_gradr   res
grad_slicec                 N    U R                  [        XX44S /[        U5      -  5      $ rC   )r  copy_slices_epiloguer  )r_   r  r   r  r  s        r@   call_copy_slices_epilogue2AutogradCompilerInstance.call_copy_slices_epilogue  s0      s7FS)**
 	
r?   c                 |    [        5          [        R                  " SS/5      sS S S 5        $ ! , (       d  f       g = f)Nr   i[rg  r   s    r@   r  'AutogradCompilerInstance.allocate_dummy  s$    (*;;9~. +**s   -
;fn_namer   r   r   c                 .    [         R                  XX45      $ )zBinds ops.fn_name = fn)rq  r   )r_   r  r   r   r   s        r@   bind_function&AutogradCompilerInstance.bind_function  s     www$6EEr?   gradsro   r  c                 X    [         R                  U5      nU R                  XR/UQ7U5      $ )z:Proxies a call to ops.fn_name(grads, *args) into the graph)rq  r   r  )r_   r  r  ro   r  rf   s         r@   apply_functional)AutogradCompilerInstance.apply_functional  s)     WWWr>D>?CCr?   c                 6  ^  [         R                  " U 4S jU5      nT R                  R                  SX0 S9nU Vs/ s H  nT R	                  5       PM     nnT R                  U[        [        U5      5       Vs/ s H  oU   PM	     sn5        U$ s  snf s  snf )z*Proxies a call to fn(*args) into the graphc                 &   > TR                  U 5      $ rC   rm  )r   r_   s    r@   r1  5AutogradCompilerInstance.proxy_call.<locals>.<lambda>  s    t}}Q/?r?   rd   ro   r   )r  r  r   r   r  r  r  r  )	r_   r   ro   r  
proxy_args	proxy_outrU  r   r   s	   `        r@   r  #AutogradCompilerInstance.proxy_call  s     __%?F
NN//R 0 
	 2AAA$%%'A$$VE#f+DV-WDVqlDV-WX B-Ws   B:B
rU  r~  c                    [         R                  S5      n[        R                  " U R                  U/UQ75      nU R
                  R                  SXV0 S9n[        U5      [        U5      :X  d   eU R                  X'5        U$ )zEProxies a call to ops.validate_outputs(outputs, *args) into the graphvalidate_outputsrd   r  )	rq  r   r  r  rm  r   r   r  r  )r_   rU  r~  ro   r  rf   r  new_proxy_outputss           r@   r  )AutogradCompilerInstance.validate_outputs  s|     WW'(__T]]W4Dt4DE
 NN77R 8 
 ?#s7|333$$W@r?   old_varnew_varc                     U R                  U5      nU R                  U5      nU R                  R                  S[        R                  X440 S9nU R                  5       nU R                  U/U/5        U$ Nrd   r  )rm  r   r   r9   r   r  r  )r_   r  r  old_var_proxynew_var_proxyr  r   s          r@   
accumulate#AutogradCompilerInstance.accumulate  sq    g.g.NN//UYYm-KTV 0 
	 $$&$$fX	{;r?   variabler   has_post_hooksc                     U R                   R                  S[        U R                  U5      U R                  U5      U40 S9  g r  )r   r   r   rm  )r_   r  r   r  s       r@   rZ   (AutogradCompilerInstance.accumulate_grad&  sF     	## h'd#
  	$ 		
r?   hookr   c                     U R                   R                  S[        U/U Vs/ s H  o@R                  U5      PM     snQ7U5      $ s  snf Nrd   )r   r   r   rm  )r_   r  ro   r   rI   s        r@   proxy_call_hook(AutogradCompilerInstance.proxy_call_hook4  sQ     ~~**,01Dq--"D1 
 	

 2s   Ahook_iddata_idc                     U R                   c   eU R                   U   nU R                  U   nU R                  UUSS9nU R                  5       nU R	                  U/U/5        U$ )Nunpack_hook	hook_type)r   r  r  r  r  )r_   r  r  r  dataproxyr   s          r@   r  $AutogradCompilerInstance.unpack_hookA  s{    +++(%%g.$$# % 

 !!#$$cUUG4
r?   r   c                     U R                   c   eU R                   U   nU R                  UX   SS9n[        5          [        X   5      X'   U R	                  X   /U/5        S S S 5        U$ ! , (       d  f       U$ = f)Ntensor_pre_hookr  r   r  r'   rK   r  )r_   r}   r  r   r  r  s         r@   r  (AutogradCompilerInstance.tensor_pre_hookN  s     +++($$I' % 

 )*#FI.FI((&)ug> +  +* s   &A,,
A;c           	      R   U R                   R                  S[        R                  R                  R
                  R                  X R                  X   5      40 5      n[        5          [        X   5      X'   U R                  X   /U/5        S S S 5        U$ ! , (       d  f       U$ = fr  )r   r   r9   _Cr   r5   call_cpp_tensor_pre_hooksrm  r'   rK   r  )r_   r}   r  r   r  s        r@   cpp_tensor_pre_hook,AutogradCompilerInstance.cpp_tensor_pre_hook]  s     ++HH..HHmmFI./	
 )*#FI.FI((&)ug> +  +* s   '&B
B&c                    U R                   c   eU R                   U   nU R                  UUSS9n[        5          U Vs/ s H  n[        U5      PM     nnU R	                  X5        S S S 5        U$ s  snf ! , (       d  f       U$ = f)Npre_hookr  r  )r_   r}   r  r  r#  rI   s         r@   r  !AutogradCompilerInstance.pre_hookk  s    +++(&&  ' 

 )*.45fk!nfF5((9 +  6 +* s   A6A1A61A66
Bc                    U R                   c   eU R                   U   nU R                  UUUSS9n[        5          U Vs/ s H  n[        U5      PM     nnU R	                  X5        S S S 5        U$ s  snf ! , (       d  f       U$ = f)N	post_hookr  r  )r_   r~  r}   r  r  r#  rI   s          r@   r  "AutogradCompilerInstance.post_hookx  s     +++(&&!	 ' 
 )*/67w!{1~wG7((: +  8 +* s   A7 A2A72A77
Binputc                 ,   [        U[        R                  5      (       d   eU R                  c   eU R                  U   nU R	                  UUSS9n[        5          [        U5      /nU R                  XT/5        S S S 5        U$ ! , (       d  f       W$ = f)Npost_acc_grad_hookr  )rN   r9   r   r   r  r'   rK   r  )r_   r  r  r  r  r  s         r@   r  +AutogradCompilerInstance.post_acc_grad_hook  s     %....+++($$* % 

 )*u%&C((g6 + 
 +* 
s   B
Brb   c                    0 nSn[        UR                  5      nUS   R                  S:X  d   eUS   n[        UR                  R	                  5       5      n[        [        5      nXG   US   :X  d   eU[        U5      -   S-
  nXH   US   :X  d   e[        U5       H  u  pU(       d+  U
R                  S   R                  R                  S:X  a  SnM7  U
R                  S   R                  R                  S	:H  n[        U
R                  S   R                  5       5      S:H  nU(       d  M  U(       d  M  [        U
R                  R	                  5       5      n[        S
 U 5       5      (       d  M  XU	'   M     U(       ap  UR                  5        HC  n
[        R                  SU
5        U
R                  S   R!                  5       U
R                  S'   ME     [        UR	                  5       5      $ / $ )NFr   r}   rj   r!  cudaTcpuc              3   D  #    U  H  n[        UR                  [        R                  R                  5      =(       a    UR                  R
                  S ;   =(       d<    [        UR                  [        5      =(       a    UR                  R                  (       + v   M     g7f))primsrr  N)rN   rg   r9   _ops
OpOverload	namespacer   r   r   users     r@   r   DAutogradCompilerInstance.move_graph_nodes_to_cuda.<locals>.<genexpr>  sx      
 !+ #4;;

0E0EF G KK115FF
 #4;;3 ? $ > >> !+s   BB zMoving node %s from cpu to cuda)r  rm   rg   userskeysr  r  r   metar  r  r  allvaluesverbose_logdebugr  )r_   rb   to_movehas_cuda_inputsrm   r}   inputs_usersfirst_getitem_idxlast_getitem_idxr   ry   is_cpu	is_scalar
node_userss                 r@   move_graph_nodes_to_cuda1AutogradCompilerInstance.move_graph_nodes_to_cuda  s   ,.U[[!Qx(***qFLL--/0 34'<?:::,s</@@1D&,r*:::: .GA"tyy'7'>'>'C'Cv'M"&YYu%,,11U:FDIIe,11349Iv))!$**//"34
 
 !+
 
 
 "&AJ- /4 (!!"CTJ#'99U#3#8#8#:		%  )
 ''	r?   ry   c                 V   [        U[        R                  R                  5      =(       a    UR                  S:H  =(       ai    UR
                  [        R                  R                  R                  R                  [        R                  R                  R                  R                  4;   $ r  )rN   r9   r   rn  rf   rg   rq  rr  sym_sizers   	sym_numelrt  )r_   ry   s     r@   is_sym_node$AutogradCompilerInstance.is_sym_node  sn    tUXX]]+ O?*O		''++UYY^^-E-E-M-MNO	
r?   c                 x  ^ [        5       mS n[        U R                  R                  R	                  SS95       H.  u  pTR                  UR                  R                  5       5        M0     U[        [        5      S-
  :X  d   eS[        R                  R                  S[        4U4S jjn[        U R                  R                  R                  5      nU R                  R                  R                  U5        [        U R                  R                  R                  5      n[         R#                  SXE-
  5        g )Nr   ri   rj   ry   r7   c                 z   > U T;   d$  U R                   S:X  a  U R                  [        ;   a  gU R                  5       $ )Nrd   T)rf   rg   _impure_targets	is_impure)ry   unpack_nodess    r@   r(  /AutogradCompilerInstance.dce.<locals>.is_impure  s2    |#?*t{{o/M>>##r?   zDCE removed %d nodes)r2   r   r   rb   rn   updater  r  r  r  r9   r   rn  rp   rm   eliminate_dead_coder  r  )r_   r   ry   r(  beforeafterr)  s         @r@   dceAutogradCompilerInstance.dce  s    
 3=, !5!5!@!@M!@!RSGA

 12 TC+,q0000	$EHHMM 	$d 	$ T^^))//000;DNN((../0&.Ar?   c                 2   / n/ n[        U R                  R                  R                  5      n[	        U5        [	        U5      nUR
                  S:X  d   eUR                   HW  nUR                  [        R                  L d   eUR                  (       a  UR                  U5        MF  UR                  U5        MY     [        5       nU H  n[        UR                  [        5      (       d   eUR                  S   U:X  d   e[        UR                  S   [        5      (       d   e[!        U5      nUR#                  UR                  S   5        UR                  S   U4Ul        M     U H(  n	U R                  R                  R%                  U	5        M*     U$ )Nr   r   rj   )rl   r   rb   rm   rk   ru   r  rg   rq   rr   rt   setrN   ro   r   rs   r  r   
erase_node)
r_   
used_sizesunused_sizesit
sizes_nodegetitem_nodeused_sizes_idxusednext_size_idxunuseds
             r@   remove_unused_sizes,AutogradCompilerInstance.remove_unused_sizes  sV   
 $..&&,,-R"X
')))&,,L&&(*:*::::!!!!,/ ##L1 - $'5Ddii////99Q<:---diilC0000/Mtyy|,1}5DI  #FNN  ++F3 # r?   r   c                 l    [        U R                  R                  U R                  R                  U5      $ rC   )r#   r   r  rb   )r_   r   s     r@   create_graph_module,AutogradCompilerInstance.create_graph_module  s%    4>>..0D0DbIIr?   c                 L  ^ ^^^ T R                   R                  S[        R                  S0 5        T R                  R                  5         T R                   R                  SST R                   R                  T R                  U5      5      40 5        / m[        5       (       a%  T R                  T R                   R                  5      mT R                   R                  R                   H*  nS H!  nX2R                  ;   d  M  UR                  U	 M#     M,     [        SS U 4S jS9  T R                  5         T R!                  5         T R#                  5         T R%                  5         T R'                  5         T R)                  5         T R+                  5         T R-                  5         T R.                  (       a/  T R.                  R1                  T R                   R                  5        T R3                  5       mT R5                  S	T R6                   35      m[9        TS
/5        [;        STSSSS9n[<        R?                  SU5        [@        RC                  SU5        [        SU4S jS9  S[D        S[F        4   S
[F        S[F        S[F        S[F        S[F        S[H        [F        [F        4   4UU U4S jjn[K        5       RM                  S[N        RP                  " 5       ST R6                  0T RR                  SS9  T RT                  RW                  S S S 5        UT RY                  T5      4$ )Nrd   r>   rh   )tensor_metaexample_valuer!  r+  c                      SSS.$ )N&compiled_autograd_graph_pre_reorderingstringr/  r>   r>   r?   r@   r1  6AutogradCompilerInstance.end_capture.<locals>.<lambda>.  s    @$!r?   c                     > [        T R                  R                  T R                  R                  ST R                   S35      R                  SS9$ )NCompiledAutogradPreReorderingFprint_output)r#   r   r  rb   r   print_readabler   s   r@   r1  rH  2  sG    {##$$"477)=9  n%n0	 1r?   r4  rJ  r}   zCompiled autograd graphT)include_deviceinclude_stridecoloredz%scompiled_autograd_graphc                  "   > T R                  SS9$ )NFrL  )rN  )rb   s   r@   r1  rH  ]  s    u333Gr?   )r6  compiled_fn.r   r   r   packed_inputsr7   c           	        >  Sq TR                  (       a  TR                  R                  U5        / n[        U5       Ho  u  pxUT;   d  M  US:  aK  UR	                  [
        R                  " SU5      5        [
        R                  R                  US   S5        M^  UR	                  U5        Mq     T H$  n	X   R                  5       R                  SS9X'   M&     [        5          [        TR                  5         U " XX4U5      n
TR                  (       a  TR                  R                  U
5        U
sS S S 5        sS S S 5        Sq $ ! , (       d  f       O= fS S S 5        O! , (       d  f       O= fSq g ! Sq f = f)NTr   r  rj   )non_blockingF)in_compiled_autograd_regionr   r   r   rt   r9   r  r   maybe_mark_dynamic
pin_memoryr  _disabler   r   r   )rT  r}   r   r   r   rU  filtered_sizesr   integerr   r   runtime_inputs_to_mover_   r9  s              r@   runtime_wrapper=AutogradCompilerInstance.end_capture.<locals>.runtime_wrapper`  s6   4.2+##$$55f=!#$-e$4LCn,"Q;*11%++a2IJ!MM<<^B=OQRS*11': %5 0A &	 4 4 6 ; ; ; NFI 0 Z!5dgg!>%C ''((..s3 "?!>ZZ /4+ "?!>ZZZ /4+e+sI   AE6 BE6 %E";8E3	E"<	E6 
E	E"	E6 "
E0,E6 6E:r5   r   r   )-r   r   r   _exec_final_callbacks_stubr   r   rp  
create_argrm  rH   r  rb   rm   r  r   delay_unpack_hook_nodesreorder_tensor_pre_hook_nodes'reorder_pre_hook_nodes_to_schedule_asapreorder_accumulate_grad_nodes%reorder_pre_hook_nodes_to_mimic_eager reorder_post_acc_grad_hook_nodesreorder_post_hook_nodesr/  r   r{   r=  r@  r   r   r   compiled_autograd_loginfor  r  r   r   r   r   log_event_endr   r   r  r   __exit__r   )	r_   r~  ry   fieldlazy_graph_coder_  rb   r^  r9  s	   `     @@@r@   end_capture$AutogradCompilerInstance.end_capture  s   ##&AA		
 	

""^^&&t}}W'=>@		
 -/%''%)%B%B4>>CWCW%X"
 NN((..D@II%		%( A /
 	1	
 	$$&**,446**,224--/$$& 	
,,T^^-A-AB 113((+;DGG9)EFEH:.0%
 	""49$0%G	

$	4!#s(+$	4$	4 $	4 	$	4
 $	4 $	4 38_$	4 $	4L 	"#11LLN!"& 	2 	
 	%%dD$7 0 0 777r?   c                     U  Vs/ s H-  n[        U5      [        R                  R                  L d  M+  UPM/     nnU$ s  snf rC   )r  r9   r   rn  )ro   r_  rm   s      r@   get_all_nodes&AutogradCompilerInstance.get_all_nodes  s5     !=DqDGuxx}}$<D= >s   *==c                     U R                   S:X  dJ  U R                   S:X  a;  U R                  [        R                  L a  U R                  S   R                   S:X  a  gg)Nr   rd   r   TF)rf   rg   rq   rr   ro   )ry   s    r@   is_placeholder'AutogradCompilerInstance.is_placeholder  sF    77m#GG&x///		!=0r?   c                    U R                   R                  R                  S[        S9 H  nUR                  S   UR                  S   p2SnUR
                  [        R                  L a  UnUR                  S   n[        X#/5      nXQR                  Ld  Ml  U R                  U5      (       a  M  UR                  U5        Uc  M  UR                  U5        M     g)z
Usage of AOTAutograd causes all the accumulate_grad_ nodes to get pushed to the end of
the graph.  This differs from eager mode, which schedules them as soon as possible. This
pass attempts to reorder the graph to mimic eager behavior.
rd   re   r   rj   N)r   rb   rn   r   ro   rg   rq   rr   maxprevrv  rt   )r_   ry   rz   	grad_noder8  args         r@   rf  6AutogradCompilerInstance.reorder_accumulate_grad_nodes  s     NN((33'; 4 
D %)IIaL$))A,	L8#3#33((--a0	z-.C))#D,?,?,D,D

4 +JJ|,
r?   c                     U R                   R                  R                  S[        S9 HK  nUR                  R                  SS5      S:w  a  M%  [        UR                  5      nUR                  U5        MM     g)z`
We can delay unpack hooks until they are needed, even later than in the eager autograd engine.
rd   re   r  Nr  )	r   rb   rn   r   r   r   minr  prepend)r_   ry   
first_users      r@   rc  0AutogradCompilerInstance.delay_unpack_hook_nodes  sd     NN((33y 4 
D {{{D1]BTZZJt$
r?   c                 v   U R                   R                  R                  S[        S9 H  nUR                  R                  SS5      S:w  a  M%  UR                  S   nUR                  S   nX1R                  Ld  MS  U R                  U5      (       a  Mk  UR                  U5        UR                  U5        M     g)z
Usage of AOTAutograd causes all the tensor_pre_hook nodes to get pushed
to the end of the graph. This differs from eager mode, which schedules
them as soon as possible. This pass attempts to reorder the graph to
mimic eager behavior.
rd   re   r  Nr  r   rj   )
r   rb   rn   r   r   r   ro   rz  rv  rt   )r_   ry   r8  
input_nodes       r@   rd  6AutogradCompilerInstance.reorder_tensor_pre_hook_nodes  s     NN((33y 4 
D {{{D15FF99Q<L1J*43F3Fz3R3R!!,/##D)
r?   c                 2   U R                   R                  R                  S[        S9 GHj  nUR                  R                  SS5      S:w  a  M&  UR                  S   nU R                  UR                  S   5      n/ n/ nU/nU Ht  nUR                  S:X  d  M  UR                  [        R                  L d  M4  UR                  UR                  S   5        UR                  U5        UR                  U5        Mv     [        XE5       H'  u  pUR                  U5        UR                  U	5        M)     [        U5      n
XR                   Ld  GM&  U R#                  U
5      (       a  GM?  U
R                  U5        U H  nUR                  U5        M     GMm     g)aR  
In this function, we schedule the pre hooks as soon as possible. This
does not match eager behavior (schedule pre hook right before its
registered node), but it can make acc grad be scheduled properly when
the pre hooks are registered to them. After reordering acc grad node, we
will reorder the pre hooks again to mimic eager behavior.
rd   re   r  Nr  r   rj   )r   rb   rn   r   r   r   ro   rs  rf   rg   rq   rr   rt   zipremovery  rz  rv  )r_   ry   r8  input_nodes	to_remove	to_append
hook_blockr_  abr|  s              r@   re  @AutogradCompilerInstance.reorder_pre_hook_nodes_to_schedule_asap  sQ    NN((33y 4 
D {{{D1Z?99Q<L,,TYYq\:KIIJ 44?*qxx8;K;K/K$$QVVAY/$$Q'%%a(	 !
 I1""1%""1% 2 k"C))#D,?,?,D,D

<(#A ''* $3
r?   c                    / nU R                   R                  R                  S[        S9 H6  nUR                  R                  SS5      S:w  a  M%  UR                  U5        M8     [        U5       H  nUR                  S   n[        UR                  R                  5       5      n[        U5      S:X  a  MF  [        S U 5       5      (       d   e[        [        US   R                  R                  5       5      5      nXRR                  Ld  M  UR!                  U5        UR!                  U5        U H  nUR!                  U5        M     M     g)z
Usage of AOTAutograd causes all the pre_hook nodes to get pushed to the
end of the graph. This differs from eager mode, which schedules them
right before their registered node execution. This pass attempts to
reorder the graph to mimic eager behavior.
rd   re   r  Nr  r   c              3      #    U  H7  nUR                   S :H  =(       a    UR                  [        R                  L v   M9     g7f)rd   N)rf   rg   rq   rr   r  s     r@   r   QAutogradCompilerInstance.reorder_pre_hook_nodes_to_mimic_eager.<locals>.<genexpr>  s7      !D ?*Nt{{h>N>N/NN!s   ?A)r   rb   rn   r   r   r   rt   reversedro   r  r  r  r  r  rk   rl   r  )r_   	pre_hooksry   hook_getitem_noder  registered_noderr   s          r@   rg  >AutogradCompilerInstance.reorder_pre_hook_nodes_to_mimic_eager  s%    	NN((33y 4 
D {{{D1Z?T"
 Y'D $		!*+E5zQ  !     #4a(;(;(=#>?Oii/''(9:''-$G#++G4  %# (r?   c                 .   / nU R                   R                  R                  S[        S9 H6  nUR                  R                  SS5      S:w  a  M%  UR                  U5        M8     [        U5       H  nUR                  S   nUR                  S   nSn[        UR                  R                  5       5       H,  nUR                  S:X  d  M  UR                  [        L d  M*  Un  O   Uc   S5       eUR                  U5        UR                  U5        M     g)	z
Usage of AOTAutograd causes all the post_acc_grad_hook nodes to get
pushed to the end of the graph. This differs from eager mode, which
schedules them as soon as possible. This pass attempts to reorder the
graph to mimic eager behavior.
rd   re   r  Nr  r   rj   z8post_acc_grad_hook must have corresponding acc grad node)r   rb   rn   r   r   r   rt   r  ro   r  r  r  rf   rg   r   )r_   post_acc_grad_hooksry   r8  rz   acc_grad_noder_  s          r@   rh  9AutogradCompilerInstance.reorder_post_acc_grad_hook_nodes  s    !NN((33y 4 
D {{{D15II&&t,
 01D99Q<L1J !M***//1244?*qxx;O/O$%M 3
 !, J,
   .%# 2r?   c           	        ^ / nU R                   R                  R                  S[        S9 H6  mTR                  R                  SS5      S:w  a  M%  UR                  T5        M8     [        U5       GH  mTR                  S   nTR                  S   nTR                  S   n[        U5      S:  a  MB  / nUR                  [        U5      5        U H?  nUR                  U4S	 j[        UR                  R                  5       5       5       5        MA     [        U5      nUR                  S:X  a  UR                   ["        L a  UR                  S   nSn	[        UR                  R                  5       5       HN  n
U
R                  S:X  d  M  U
R                   [        L d  M*  U
R                  R                  SS5      S
:X  d  ML  U
n	MP     U	b%  U	R                  U5        UR                  T5        GM  UTR$                  Ld  GM  U R'                  U5      (       a  GM  UR                  U5        UR                  T5        GM     g)z
Usage of AOTAutograd causes all the post_hook nodes to get pushed to the
end of the graph. This differs from eager mode, which schedules them as
soon as possible. This pass attempts to reorder the graph to mimic eager
behavior.
rd   re   r  Nr  r   rj      c              3      >#    U  HL  nUR                   S :X  a5  UR                  [        L a"  TR                  R	                  SS5      S:X  a  MH  Uv   MN     g7f)rd   r  Nr  )rf   rg   r   r   r   )r   r  ry   s     r@   r   CAutogradCompilerInstance.reorder_post_hook_nodes.<locals>.<genexpr>\  sI      - =?2 KK94 KKOOK>+M D =s   AA	Ar  )r   rb   rn   r   r   r   rt   r  ro   r  extendr  r  r  ry  rf   rg   r   rz  rv  )r_   
post_hooksr8  rx   r  input_nodes_and_usersr  r|  rz   post_acc_grad_hook_noder_  ry   s              @r@   ri  0AutogradCompilerInstance.reorder_post_hook_nodesA  s    
NN((33y 4 
D {{{D1[@d#
 Z(D99Q<L99Q<L))A,K< 1$ %'!!((k):;)
%,, - $Z%5%5%:%:%< =-  * +,Cvv(SZZ;O-O XXa[
*.'j..3356A/HH	1HHLLd;?SS23/ 7 +6+22<@ ''-$))#D,?,?,D,D

<(##D)S )r?   tc                 l  ^  Uc  g [        U[        5      (       a"  U Vs/ s H  nT R                  U5      PM     sn$ [        U[        5      (       a  [        U 4S jU 5       5      $ [        U[        R
                  [        R                  45      (       a  T R                  UR                     $ [        U[        R                  5      (       d  U$ [        T R                  U5      n[        U[        R                  R                  R                  R                  5      (       d   eUR                   $ s  snf )Nc              3   F   >#    U  H  nTR                  U5      v   M     g 7frC   r  )r   rI   r_   s     r@   r   4AutogradCompilerInstance.to_proxy.<locals>.<genexpr>  s     51aq))1s   !)rN   r  rm  r   r9   SymIntSymFloatr  ry   r   r(   r   r   r  proxy_tensor_ProxyTensorr  )r_   r  rI   r  s   `   r@   rm  !AutogradCompilerInstance.to_proxy{  s    9a./0aDMM!$a00a51555a%,,788,,QVV44!U\\**H)$..!<,(=(=(J(J(W(WXXXX!!! 1s   D1objectsr#  c                    [        U[        R                  R                  5      (       a  U(       ae  [	        U5      [	        U5      :X  d   e/ n[        [	        U5      5       H.  nX5   u  pgU R                  XvS 5        UR                  X%   5        M0     UnO&[        [	        U5      5       Vs/ s H  oRU   PM	     nn[	        U5      [	        U5      :X  d   e[        XS U R                  S9  U$ s  snf N)constanttracer)
rN   r9   r   r4   r  r  set_node_originrt   r+   r   )r_   r  r#  r   bound_proxiesr   nodecall_indexrV  s           r@   r  0AutogradCompilerInstance.bind_objects_to_proxies  s     guxx~~..7|s7|333 "s7|,A07
-N((DI!((4 - (/4S\/BC/B!1:/BC7|s7|+++'T$..Q	 Ds   ,C-indexc                     U R                   c   eU R                   U   n[        5       n[        X2S U R                  S9  U$ r  )r   r$   r+   r   )r_   r  r  bw_states       r@   bind_backward_state,AutogradCompilerInstance.bind_backward_state  s@    +++  ' ?(DPr?   rV  r  pyobjc                 *   SnUbA  UR                   n[        US5      (       a$  UR                  c  [        S5      eUR                  nU U SU S3n[
        R                  " 5       R                  5       S   nUR                  SU5      n[        U5        g )N r  zThis compiled backward function was saved by AOTAutogradCache, which does not support
                    compiled autograd. Please turn off AOTAutogradCache using `TORCHINDUCTOR_AUTOGRAD_CACHE=0`.z (NodeCall )r  z:raw_stack_trace = CapturedTraceback.extract().format()[-1])
r  r   rO   r   r  r3   extractformatreplacer/   )	r_   rV  r  r  maybe_aot_idforward_clsnew_coderaw_stack_tracenew_stack_traces	            r@   r  (AutogradCompilerInstance.set_node_origin  s     ,,K{I..22:&s   +22[k.9IK+335<<>rB)11H(
 	(r?   )r   r   r   r   r   r   r   r   r   r  r   r
  r   r	  r   r  r  r   rC   )Jr   r   r   r   r   r   r`   r9   r   r   r"   r   staticmethodr   r   r   r  rs   r1   r0   r   rp   r'  r7  r   r  autogradfunctionBackwardCFunctionr  r  r  r  r  r  r  r  r  rZ   r   r4   r  r  r  r  r  r  r  r   r  r#  r/  r2  r=  r#   r@  rp  rn  rs  rv  rf  rc  rd  re  rg  rh  ri  rm  r  r$   r  Functionr  r   r>   r?   r@   r   r     sj   .HS#X$6 .4 .C5<< C$ C: C 5S 5s 5} 5 5y
U\\"y
 Cyy
 kM12	y

 d5c?+,y
 y
 y
 
sD&[(94;NN	Oy
v
c
 

R#R !.R  -	R
 R R #&*R  $CyR 
#Rh33 #3-3  -	3
 3 ^^$$663 #&*3  $Cy3 
u||d"C'	(3jGG SMG sm	G
 !G SMG smG !G 
%,,	G*
"4.
 
 c]	

 LL
 
%,,	
/ /
FF S#XF !	F
 F 
F	D	D }	D 		D
 "#	D 
%,,		D
38$
,/
BJ3-
	%,,	
'}47JRSV-	%,,	#   

,1LL
JN
	

S#X&
/2
>A
	
3   5<<(36;>	ell	5<<(36;>	ell	x} s tELL?Q ELL)3;ELL3ITW	ell	 \\,/	ell	*/ehhnn /c /b
 
 
B. SX  DJc Jk J|83 |85#s(1CS1H+I |8| HSM d588==.A  
 UXX]] t  -*%*("+H!5F"&H8*t"# "# "( 15	#  eCHo&-	
 
#,  )) ) ~~&&-	)
 
)r?   r   Fr   dynamicignore_active_disable_ctx)NNNc              #   P  #    U(       d  [         (       a  S v   g U(       a  [        U5      [        L d   eSSKJn  UR
                  R                  S:X  a
  Sq S v   Sqg [        R                  R                  5       (       a  SSKJn  [        R                  R                  R                  R!                  ["        R$                  " [&        U 5      U5      u  nn[)        5       (       a7  [        R                  R                  R                  R+                  [,        5        Sq[0        n[0        S-  q [        R2                  R5                  S5         S v   S S S 5        U(       d  Sq[        R                  R                  R                  R!                  XV5        [0        S-  q[0        U:X  d   S5       eg ! Sqf = f! , (       d  f       Nl= f! U(       d  Sq[        R                  R                  R                  R!                  XV5        [0        S-  q[0        U:X  d   S5       ef = f7f)	Nr   )
eval_frameforce_eagerTF)cudagraph_treesrj   zINested Compiled Autograd Contexts must return before their parent context)active_disable_ctxr  rp   torch._dynamor  _stancestance%compiled_autograd_enabled_force_eagerr9   r  is_availabletorch._inductorr  r  r   r5   set_autograd_compiler	functoolspartialr   rA   set_verbose_loggerr  compiled_autograd_enableddepthr  set_multithreading_enabled)r   r  r  r  r  prior_compilerprior_dynamicprior_depths           r@   _enabler    s    4 %););=D(((,$$5 591>8=5 zz&&((;
   22HH!!":KH' 011  22EEkR(,%KQJE^^>>uE F &05-  22HH" 
+ _+= 9>5* FE &05-  22HH" 
+ _+sQ   AH&F3 CH&0G F:G AH&3F77H&:
GG AH##H&c               #     #    [         R                  R                  R                  R	                  S S5      u  n nSq[        (       d  Sq S v   U (       a  SqSq[         R                  R                  R                  R	                  X5        g ! U (       a  SqSq[         R                  R                  R                  R	                  X5        f = f7f)NFT)r9   r  r   r5   r  r  r  )r  r  s     r@   r[  r[    s     
 	**@@uM !&!
(,%"**@@	
 (,%"**@@	
s   AC
B ?CA CCc                  ~   Sq [        (       a   e[        R                  R                  R
                  R                  S S5        [        R                  R                  R
                  R                  S 5        [        R                  R                  R
                  R                  5         [        R                  " 5       qg )NF)r  rX  r9   r  r   r5   r  r  clear_cache	itertoolsr   r   r>   r?   r@   resetr  3  sz     %****	HH&&<<T5I	HH&&99$?	HH&&224oo'Or?   r}   r  r  r  r  r  r  c                     U S   nUR                  X5      nUc   eUR                  U5        Xc-
  n	UR                  XEU	5      n
XU
R                  [        R
                  S9/$ )Nr   )memory_format)new_empty_stridedcopy_
as_stridedcloner9   contiguous_format)r}   r  r  r  r  r  r  r   r   offsetr  s              r@   r  r  @  sn     !9D##J=F
LL 6F"":VDJ
 0 0u?V?V 0 WXXr?   r  r   r  r  c                     S /[        U 5      -  n[        [        U 5      5       HA  nX   (       d  M  X%   c  M  US:X  a   X%   nUc   eUR                  U5        XU'   M;  X%   XE'   MC     U$ )Nr   )r  r  r  )r  r   r  r  grad_inputsr   to_copys          r@   r  r  T  s~     /3Vc:J6K-KK3'()v~Av&***  )!'A!$ * r?   )TTr   )s__doc__r   r  r  rq   r   collectionsr   r   collections.abcr   r   r   typingr   r	   r9   torch.utils._pytreeutils_pytreer  torch._dispatch.pythonr
   torch._dynamo.external_utilsr   r   r   r   r   torch._dynamo.sourcer   r   torch._dynamo.utilsr   r   r   r   /torch._functorch._aot_autograd.runtime_wrappersr   r   torch._guardsr   r   r   r   torch._loggingr   r   torch._prims_commonr    torch._subclassesr!   torch._subclasses.fake_tensorr"   torch.fxr#   %torch.fx.experimental._backward_stater$   "torch.fx.experimental.proxy_tensorr%   r&   r'   r(   r)   r*   r+   %torch.fx.experimental.symbolic_shapesr,   r-   torch.fx.tracebackr.   r/   torch.typesr0   r1   torch.utils._ordered_setr2   torch.utils._tracebackr3   torch.fx.proxyr4   r   r   rj  r  rp   rA   rH   r   rK   rV   rX   r   r   rq  r  ra  r'  r   r   rs   r   r   r  r  rX  r  r  contextmanagerr  r[  r  r  r  r  r>   r?   r@   <module>r     s         , 9 9 %  $ $ ;  <  M L > 6 , 4   ?   G B 2 / 4 $X *(4GH *EF$ 4D 45<<$& 5<<$+> 
 
c0B 
6G G^!# !#H5 5  m M "==	 //#	s 	s 	`) `)H% "  ). % $  	  &*I#s(#II  $I  	I IX 
),- 
 
,(YU\\"Y%Y ;'Y %	Y
 %Y ;'Y %Y 
%,,Y(tnLL 
%,,%	& 	
 
%,,
r?   