
    7h                        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rSSKJs  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&  SS
K'J(r(J)r)  SSK*J+r+  SSK,J-r-  SSK.J/r/  SSK0J1r1  SSK2J3r3J4r4J5r5J6r6J7r7J8r8J9r9  SSK:J;r;J<r<  SSK=J>r>J?r?  SSK@JArA  SSKBJCrC  \(       a  SSKDJErE  SrF\(" \GS5      rH\(" \GS5      rIS rJS rKS rLS rM " S S5      rN " S S5      rO " S  S!5      rP\O" 5       rQ/ S"QrR\A" \\\R                  \/5      rT\R                  " 5       qVS# rW " S$ S%5      rXS&qYS&qZS&q[S&q\Sq]\R                  S-S'\_4S( jj5       r`\R                  S) 5       raS.S* jrbS+ rcS, rdg)/a  
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)OptionalTYPE_CHECKINGUnion)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)getArtifactLoggertrace_structuredclone_preserve_strides)FakeTensorMode)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)
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_verbosec                  h    [         R                  R                  R                  R	                  S5      $ )Nr0   )torch_logging	_internal	log_stateis_artifact_enabled     Y/var/www/fran/franai/venv/lib/python3.13/site-packages/torch/_dynamo/compiled_autograd.py snapshot_verbose_logging_enabledr:   R   s(    >>##--AA# r8   c                  ^    [         R                  R                  R                  R                  $ N)r2   	_inductorconfigtriton
cudagraphsr7   r8   r9   snapshot_cudagraph_enabledrA   X   s    ??!!((333r8   c                 "    U b  [        U 5      $ U $ r<   r   )xs    r9   maybe_clonerD   \   s    }%a((Hr8   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   r2   _subclassesfake_tensorunset_fake_temporarilybw_module_fnAssertionError)CompiledFunctions    r9   extract_bw_modulerO   b   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\4S jrS\R                  R                  4S jr	S\
\R                     4S jrS\
\R                     4S	 jrS
rg)
NaNChecker}   accumulate_gradc                 :    Xl         / U l        0 U l        / U l        g r<   )rS   params_indicesparams_to_checkoutput_names)selfrS   s     r9   __init__NaNChecker.__init__~   s     .)+8:')r8   graphc                 z   [        [        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                  :X  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r_   r      )nextiternodes
find_nodesr   argsrS   boolr`   operatorgetitemrF   intrU   appendnamerW   )rX   r[   inputs_nodeacc_grad_nodesoutput_nodesnode
param_nodes          r9   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   D8inputsc                    U R                   (       d  g U R                   H]  nX   R                  nUb4  [        R                  " U5      R                  5       (       a   SU S35       eX   U R                  SU S3'   M_     g )Nz9Compiled autograd running under anomaly mode with inputs[zD] already having NaN gradient. This is not supported. {TURN_OFF_MSG}zinputs[])rS   rU   gradr2   isnananyrV   )rX   rv   idxry   s       r9   prep_with_inputsNaNChecker.prep_with_inputs   s    ## &&C;##D ;;t,0022 OPSu UQ Q2
 6<[D  73%q!12 'r8   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: )rS   rV   itemsry   r2   rz   r{   rm   RuntimeErrorjoin	enumeraterW   )rX   r   
nan_params
inputs_strparam	nan_gradsiry   s           r9   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  r8   )rS   rW   rU   rV   N)__name__
__module____qualname____firstlineno__ri   rY   r2   fxGraphrt   tupleTensorr}   r   __static_attributes__r7   r8   r9   rQ   rQ   }   sP    * *AUXX^^ A0AuU\\': A u||, r8   rQ   c                   &    \ rS rSrS rS rS rSrg)OpNamespace   c                 "    [        5       U l        g r<   )r   custom_function_name_counterrX   s    r9   rY   OpNamespace.__init__   s    :A))r8   c                 v  ^ 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                  U4S j5       n[        XU5        U$ )NCppNoderc   c                     > T" U 0 UD6$ r<   r7   )rh   kwargsresults     r9   run_non_traceable_cpp_in_eager7OpNamespace.add.<locals>.run_non_traceable_cpp_in_eager   s    t.v..r8   )r   hasattrOpsetattrr2   _dynamoallow_in_graphdisable)rX   rn   fnis_custom_functionis_traceablecountr   r   s          @r9   addOpNamespace.add   s    t#D55d;E--d3q83VE7#D4&&&&D01D < <V DE  ]]""/ #/ D >?r8   c                     [        X5      $ r<   )getattr)rX   rn   s     r9   getOpNamespace.get   s    t""r8   )r   N)r   r   r   r   rY   r   r   r   r7   r8   r9   r   r      s    D*#r8   r   c                   &    \ rS rSrS rS rS rSrg)r      c                 6    X l         X0l        Xl        SU l        g )Nz#torch._dynamo.compiled_autograd.ops)r   r   r   r   )rX   rn   r   r   s       r9   rY   Op.__init__   s    "4?r8   c                 &    U R                   " U0 UD6$ r<   )r   )rX   rh   r   s      r9   __call__Op.__call__   s    ww'''r8   c                 :    U R                   S-   U R                  -   $ )Nr   )r   r   r   s    r9   __repr__Op.__repr__   s    $t}}44r8   )r   r   r   r   N)r   r   r   r   rY   r   r   r   r7   r8   r9   r   r      s    @(5r8   r   )rv   sizesscalarshookspacked_datac           
      <    [        [        [        U S S S95      5      $ )N)compiled_autograd_idframe_idframe_compile_idr   )r   s    r9   make_compile_contextr     s(    %9!%	
 r8   c                      \ rS rSrS?S jrS r\S\4S j5       rS\	\
R                     S\	\   S	\	\\\4      S
\	\	\\\4         S\S\4S jrS\	\   4S jrS rS\S\
R*                  R,                  R.                  S\\   4S jrS rS rS rS rS rS rS r S r!S r"S r#S r$S \4S! jr%S\	\
R                     S"\S \4S# jr&S$ r'S% r(S& r)S\	\   4S' jr*S( r+S) r,S* r-S+ r.S, r/\S- 5       r0\S. 5       r1S/ r2S0 r3S1 r4S2 r5S3 r6S4 r7S5 r8S6 r9 S@S
\\	\\\4         4S7 jjr:S8\4S9 jr;S:\S;\S<\\
R*                  Rx                     4S= jr=S>r>g)AAutogradCompilerInstancei  returnNc                 .   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)compiler_fn
contextlib	ExitStackstackcloser)   r   r   fake_tensor_moder&   	fx_tracerr%   
proxy_modehooks_proxy)rX   r   s     r9   rY   !AutogradCompilerInstance.__init__  sr    &))+
ZZ%%
! .#'"&nn!

 )*0L,0r8   c                 v    [        U[        R                  5      (       d   eU R                  R	                  XS9$ )N)source)rF   r2   r   r   from_tensor)rX   rC   r   s      r9   	wrap_fake"AutogradCompilerInstance.wrap_fake"  s3    !U\\****$$000BBr8   c                 ,    [        [        U 5      U5      $ r<   r   )rn   r|   s     r9   r   AutogradCompilerInstance.source&  s    [.44r8   rv   r   r   originsrS   
check_nansc                 
  ^  [         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
US	   n [I        U5       H)  u  pT RK                  UT RM                  S
U5      5      X'   M+     T RW                  XU5        [I        U5       VVs/ s H@  u  pT RX                  R[                  UT RM                  SU5      [\        R^                  5      PMB     nnn[a        [c        U5      5       Vs/ s H  nT R:                  U   PM     nn[I        U5       HK  u  nnT R(                  Re                  S[f        UU   40 5      UU'   UU   T R6                  URh                  '   MM     T RW                  UUU	5      n[I        U5       H  u  pT RM                  SU5      n[k        U[
        5      (       a/  T RX                  R[                  UU[\        R^                  5      X<'   M[  [k        U[l        5      (       aF  T RX                  Ro                  T RX                  Rq                  UU[\        R^                  S9UUS9X<'   M  [s        S[S        U5      5      e   T RW                  UT R<                  U
5        [I        U5       H,  u  nnT R<                  U   T R6                  URh                  '   M.     T RB                  RE                  [u        0 5      5        T RB                  RE                  T Rv                  5        T RB                  RE                  T Rx                  5        T RB                  RE                  [{        5       5        T Rv                  RX                  c   eT Rv                  RX                  nT RB                  RE                  ["        R,                  R|                  R~                  R                  U5      5        [        [        R                  " 5       5      UUU4$ ! [N         a$  n[Q        S[S        U5       S[T         35      UeS nAff = fs  snnf s  snf )Nr/   capturesrc   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)placeholderr7   N)r   create_proxy).0rn   rX   s     r9   	<genexpr>9AutogradCompilerInstance.begin_capture.<locals>.<genexpr>J  s0      
+ NN''tRDD+s   +.r   rv   zFound tensor of type z,, which is not supported by FakeTensorMode. r   r]   r   )r   dynamic_dim)hintr   zUnexpected scalar type: )Dr   rd   COMPILE_COUNTERidr   rl   aot_id_counterr   r   	__enter__rQ   nan_checkertimetime_nsstart_time_nsr   log_event_startr2   nnModuler   rootr   r   r&   r[   tensor_attrssymnode_proxy_lookup_graph_placeholderssizes_proxyscalars_proxyr   packed_data_proxyr   enter_contextr*   r   r   r   	ExceptionNotImplementedErrortypeTURN_OFF_MSGbind_objects_to_proxiesr   $create_unspecified_symint_and_symbolr(   DYNAMICrangelenr   r   rr   rF   floatcreate_symfloatnodecreate_unspecified_symbolrM   r!   r   r   r"   experimentalsymbolic_shapes_suppress_guardsstrr   current_compile_id)rX   rv   r   r   r   rS   r   
args_proxyinputs_originssizes_originsscalars_originsrC   r|   evalr   proxiessymintr   symvalenvs   `                    r9   begin_capture&AutogradCompilerInstance.begin_capture*  s    	$%j1Q61'.9#.>3DGG<&&(:D:o6$!\\^!#33!"&	 	4 	
 $hhoo/$xx~~~I&(#$&!
+
	
" 	

  !3!569@6 1I	#F+"nnQHc0JK , 	$$VH &e,
 - NN??GS)""
 - 	 
 16c%j0AB0A14##A&0AB"5)IAv44(	GAJ 6=QZD%%fkk2 * ..ug}M!'*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	
 	
C  	%'Qy0\]i\jk	
 Cs%   "8U  :AU1U7 
U.
U))U.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rn   encodingr7   r7   r8   r9   <lambda>>AutogradCompilerInstance.log_compile_reasons.<locals>.<lambda>  s    ;"!r8   c                     > T $ r<   r7   )r!  s   r9   r)  r*    s    r8   metadata_fn
payload_fn)r   )rX   r!  s    `r9   log_compile_reasons,AutogradCompilerInstance.log_compile_reasons  s"      /	
r8   c                   ^ ^^^^^^^ TR                  5        Vs/ s H  nT R                  U5      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                  UU4S j5       nT R                  R                  SUUU/UQ70 S9mS mUb  T R                   U   mUUUUUU 4S jnU" 5       nU 4S jn[        R"                  R$                  R&                  R)                  TTUUS9n[*        R,                  " T R                  U5      nU$ s  snf )Nz@torch.compile does not currently support higher order gradients.c                 x   > [         R                  R                  R                  R                  " U UTT/UQ76 nU$ r<   )r2   
_functorch_aot_autogradruntime_wrappers_backward_prologue_functional)ctx_saved_tensorsctx_symints	flat_argsr   maybe_subclass_metadatametadatas       r9   call_aot_bwd_prologueOAutogradCompilerInstance.proxy_call_aot_backward.<locals>.call_aot_bwd_prologue  sB    ""00AA__!'	
 C Jr8   r]   kindr`   rh   r   c            	      	  >^^ S 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'   U4S 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[/        TR(                  R0                  U[3        TU5      5        TR(                  R5                  SUS	0 5      nU	" U
R                  5      Ul        UTU
'   GM  U
R                  S
:X  a  U
R*                  [         R6                  R8                  R:                  R<                  :X  a3  [         R6                  R8                  R>                  R<                  U
l        TR(                  R                   RA                  U
U4S j5      nU	" U
R                  5      Ul        UTU
'   GMN  U
R                  S:X  a  U
R*                  nTR(                  R-                  U5      n[/        TR(                  R0                  U[3        TU5      5        TR(                  R                   RA                  U
U4S j5      nXl        UTU
'   GM  [C        S5      e   Uc   eS nU Vs/ s H5  n[        U[         R"                  R&                  5      (       a  U" 5       OUPM7     nnTRE                  UU5        U$ s  snf s  snf s  snf s  snf )Nc                 `    SnU R                    H  nUR                  S:X  a  US-  nM    U$    U$ )Nr   r   rc   )rf   r_   )r[   num_argsrr   s      r9   
num_inputskAutogradCompilerInstance.proxy_call_aot_backward.<locals>.copy_paste_aot_backward_graph.<locals>.num_inputs  s<    !KKDww-/ A  (  r8   r   _rc   c                    > ST SU  3$ )NaotrE  r7   )	node_namededuped_aot_ids    r9   make_uniquelAutogradCompilerInstance.proxy_call_aot_backward.<locals>.copy_paste_aot_backward_graph.<locals>.make_unique  s    ^,Ai[99r8   r   ra   get_attrr7   r]   c                    > TU    $ r<   r7   nvalue_remaps    r9   r)  iAutogradCompilerInstance.proxy_call_aot_backward.<locals>.copy_paste_aot_backward_graph.<locals>.<lambda>4  	    Ar8   call_modulec                    > TU    $ r<   r7   rN  s    r9   r)  rQ  =  rR  r8   zshouldn't get herec                      [        5          [        R                  " SSSSS5      sS S S 5        $ ! , (       d  f       g = f)Nr   {   r#   r2   zerosr7   r8   r9   dummyfAutogradCompilerInstance.proxy_call_aot_backward.<locals>.copy_paste_aot_backward_graph.<locals>.dummyH  s(    02 ;;q!Q37 322s   /
=)#r[   r  rl   _get_compiled_autograd_symintsr  symintsto_proxyrm   r  r   rf   r_   rr   rn   rh   rF   r2   r   Noder.   r   r`   get_fresh_qualnamer   r   r   create_nodeopsatenviewdefaultreshape	node_copyrM   r  )rC  rB  r   	pall_argsr\  r  psymintsargs_idxpoutputsrJ  rr   phrO  rn   qualnamer   rY  ooutputsrI  rP  aot_idrH   ctxpbackward_statepgradsrX   s                      @@r9   copy_paste_aot_backward_graphWAutogradCompilerInstance.proxy_call_aot_backward.<locals>.copy_paste_aot_backward_graph  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K7;H ![N""6*Ad&9&9&&A%B"CC'1,': "--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 '''8
 JRIQA:a88a?   (((;Nk ;> Xs   Q;=R )A"R)<R
c                 (  >^ ^ [         R                  R                  UU 4S 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$ )Nc                  $   > TR                  U TS9$ )N)
is_runtime)creation_fn)unwrapped_argsrw  subclass_metas    r9   make_subclasskAutogradCompilerInstance.proxy_call_aot_backward.<locals>.proxy_subclass_constructor.<locals>.make_subclassU  s    $00J0WWr8   r]   r>  )r2   r   r   pytreetree_mapr]  r   r   r   allocate_dummyr  )rz  rw  ry  r{  punwrapped_argspoutputra   rX   s   ``     r9   proxy_subclass_constructorTAutogradCompilerInstance.proxy_call_aot_backward.<locals>.proxy_subclass_constructorT  s    ]]))X *X %oodmm^LOnn11$$?+	 2 G ((*F((&G9=Mr8   )make_subclass_override)r[  r]  _forward_clsrO   r;  r:  _aot_idr2   is_grad_enabledoutput_inforequires_gradr   r   r   r   r   r   r3  r4  r5  _backward_epilogue_functionalr}  r~  )rX   pinputspsaved_tensorssaved_tensorspctxrp  maybe_backward_state_idxr  rh  rN   output_alias_infor<  rs  rn  r  resultspresultsro  rH   r:  r;  rq  rr  s   `    `           @@@@@@r9   proxy_call_aot_backward0AutogradCompilerInstance.proxy_call_aot_backward  s   ( /2.P.P.RS.RDMM!$.RS ++%&67	#,,"2"J"J!))  ""%-%9%9!$222&Z  &: 
	%	%	 
&	 ,, ( 
  - 	
 #/"../GHOc	 c	J 01	$ ""00AA__##=	 ` 
 ??4==':Y Ts   Fbackward_idxrp  r  c                 r   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5      n
O%U R
                  R                  S[        UU	/UQ70 S9n
U
c   e[        5          / n[        U5       HK  u  pUb  X   c  UR                  S 5        M   Uu  pnnUR                  [        R                  " UUXS95        MM     U R                  X5        S S S 5        [        W5      $ ! , (       d  f       N= f)Nr  r]   r>  )sizedtypelayoutdevice)r   r]  r   r  r  r   r   r	   r#   r   rm   r2   emptyr  r   )rX   rv   output_metadatasr  r  rp  r  r  r  r  r  grad_insr|   output_metadatar  r  r  r  s                     r9   proxy_call_backward,AutogradCompilerInstance.proxy_call_backwardo  sM    +++---'}53##Y//22(G nn11$$" 
  2 	G """(*57H(12B(C$"*gl.BOOD).=+tKKTvU )D ((; + X +*s   'A.D((
D6c           	          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   )r]  
proxy_callcopy_slices_prologue)	rX   rv   
base_sizesbase_stridesbase_storage_offset
view_sizesview_stridesview_storage_offsetrh   s	            r9   call_copy_slices_prologue2AutogradCompilerInstance.call_copy_slices_prologue  st     MM*%MM,'MM-.MM*%MM,'MM-.
 3TD6A:FFr8   c                 N    U R                  [        XX44S /[        U5      -  5      $ r<   )r  copy_slices_epiloguer  )rX   needs_input_gradr   res
grad_slices        r9   call_copy_slices_epilogue2AutogradCompilerInstance.call_copy_slices_epilogue  s.     s7FS)**
 	
r8   c                 |    [        5          [        R                  " SS/5      sS S S 5        $ ! , (       d  f       g = f)Nr   i[rW  r   s    r9   r  'AutogradCompilerInstance.allocate_dummy  s$    (*;;9~. +**s   -
;c                 .    [         R                  XX45      $ )zBinds ops.fn_name = fn)ra  r   )rX   fn_namer   r   r   s        r9   bind_function&AutogradCompilerInstance.bind_function  s    www$6EEr8   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)ra  r   r  )rX   r  gradsrh   r  r_   s         r9   apply_functional)AutogradCompilerInstance.apply_functional  s'    WWWr>D>?CCr8   c                 f  ^  [         R                  " U5      u  pE[         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      $ r<   r]  )r  rX   s    r9   r)  5AutogradCompilerInstance.proxy_call.<locals>.<lambda>  s    t}}Q/?r8   r]   rh   r   )	r}  tree_flattenr~  r   r   r  r  r  r  )
rX   r   rh   r  r9  rE  
proxy_args	proxy_outr   r   s
   `         r9   r  #AutogradCompilerInstance.proxy_call  s    **40	__%?F
NN//R 0 
	 2AAA$%%'A$$VE#f+DV-WDVqlDV-WX B-Ws   B)B.
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_outputsr]   r  )	ra  r   r}  r~  r]  r   r   r  r  )rX   rE  rn  rh   r  r_   r  new_proxy_outputss           r9   r  )AutogradCompilerInstance.validate_outputs  sz    WW'(__T]]W4Dt4DE
 NN77R 8 
 ?#s7|333$$W@r8   c                     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$ Nr]   r  )r]  r   r   r2   r   r  r  )rX   old_varnew_varold_var_proxynew_var_proxyr  r   s          r9   
accumulate#AutogradCompilerInstance.accumulate  sq    g.g.NN//UYYm-KTV 0 
	 $$&$$fX	{;r8   c                     U R                   R                  S[        U R                  U5      U R                  U5      U40 S9  g r  )r   r   r   r]  )rX   variablery   has_post_hookss       r9   rS   (AutogradCompilerInstance.accumulate_grad  sD    ## h'd#
  	$ 		
r8   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 Nr]   )r   r   r
   r]  )rX   hookrh   r   rC   s        r9   proxy_call_hook(AutogradCompilerInstance.proxy_call_hook  sO    ~~**,01Dq--"D1 
 	

 2s   Ac                     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  )rX   hook_iddata_idr  dataproxyr   s          r9   r  $AutogradCompilerInstance.unpack_hook  s{    +++(%%g.$$# % 

 !!#$$cUUG4
r8   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#   rD   r  )rX   rv   r  r   r  r  s         r9   r  (AutogradCompilerInstance.tensor_pre_hook  s    +++($$I' % 

 )*#FI.FI((&)ug> +  +* s   &A,,
A;r  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   r2   _Cr   r/   call_cpp_tensor_pre_hooksr]  r#   rD   r  )rX   rv   r  r   r  s        r9   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  )rX   rv   r  r  r  rC   s         r9   r  !AutogradCompilerInstance.pre_hook)  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  )rX   rn  rv   r  r  r  rC   s          r9   r  "AutogradCompilerInstance.post_hook6  s    +++(&&!	 ' 
 )*/67w!{1~wG7((: +  8 +* s   A7 A2A72A77
Bc                 ,   [        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                  X/5        S S S 5        U$ ! , (       d  f       U$ = f)Npost_acc_grad_hookr  )rF   r2   r   r   r  r#   rD   r  )rX   inputr  r  r  s        r9   r  +AutogradCompilerInstance.post_acc_grad_hookD  s    %....+++($$* % 

 )* '(E((8 +  +* s   B
B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   rv   rc   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))primsrb  N)rF   r`   r2   _ops
OpOverload	namespacer   r   r   users     r9   r   DAutogradCompilerInstance.move_graph_nodes_to_cuda.<locals>.<genexpr>n  sx      
 !+ #4;;

0E0EF G KK115FF
 #4;;3 ? $ > >> !+s   BB zMoving node %s from cpu to cuda)listrf   r`   userskeysr  r   r   metar  r  r  allvaluesverbose_logdebugr  )rX   r[   to_movehas_cuda_inputsrf   rv   inputs_usersfirst_getitem_idxlast_getitem_idxr   rr   is_cpu	is_scalar
node_userss                 r9   move_graph_nodes_to_cuda1AutogradCompilerInstance.move_graph_nodes_to_cudaW  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#:		%  )
 ''	r8   c                 V   [        U[        R                  R                  5      =(       a    UR                  S:H  =(       ai    UR
                  [        R                  R                  R                  R                  [        R                  R                  R                  R                  4;   $ r  )rF   r2   r   r^  r_   r`   ra  rb  sym_sizerl   	sym_numelrd  )rX   rr   s     r9   is_sym_node$AutogradCompilerInstance.is_sym_node  sn    tUXX]]+ O?*O		''++UYY^^-E-E-M-MNO	
r8   c                 0  ^ [        5       m[        U R                  R                  R	                  SS95       H.  u  pTR                  UR                  R                  5       5        M0     W[        [        5      S-
  :X  d   eU4S 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   rb   rc   c                 z   > U T;   d$  U R                   S:X  a  U R                  [        ;   a  gU R                  5       $ )Nr]   T)r_   r`   _impure_targets	is_impure)rr   unpack_nodess    r9   r  /AutogradCompilerInstance.dce.<locals>.is_impure  s2    |#?*t{{o/M>>##r8   zDCE removed %d nodes)r,   r   r   r[   rg   updater  r  r  r   rf   eliminate_dead_coder
  r  )rX   r   rr   r  beforeafterr  s         @r9   dceAutogradCompilerInstance.dce  s    
 3=, !5!5!@!@M!@!RSGA

 12 TC+,q0000	$ T^^))//000;DNN((../0&.Ar8   c                 P   / n/ n[        U R                  R                  R                  5      n[	        U5        [	        U5      nUR
                  S:X  d   eUR                  R                  5        HX  nUR                  [        R                  :X  d   eUR                  (       a  UR                  U5        MG  UR                  U5        MZ     [        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   rc   )re   r   r[   rf   rd   rn   r  r  r`   rj   rk   rm   setrF   rh   r   rl   r  r   
erase_node)
rX   
used_sizesunused_sizesit
sizes_nodegetitem_nodeused_sizes_idxusednext_size_idxunuseds
             r9   remove_unused_sizes,AutogradCompilerInstance.remove_unused_sizes  s_   
 $..&&,,-R"X
')))&,,113L&&(*:*::::!!!!,/ ##L1 4 $'5Ddii////99Q<:---diilC0000/Mtyy|,1}5DI  #FNN  ++F3 # r8   c                 l    [        U R                  R                  U R                  R                  U5      $ r<   )r   r   r   r[   )rX   r   s     r9   create_graph_module,AutogradCompilerInstance.create_graph_module  s%    4>>..0D0DbIIr8   c           	        ^ ^^^ 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  UU U4S jn[E        5       RG                  S[H        RJ                  " 5       ST R6                  0T RL                  SS9  T RN                  RQ                  S S S 5        UT RS                  T5      4$ )Nr]   r7   ra   )tensor_metaexample_valuer  r#  c                      SSS.$ )N&compiled_autograd_graph_pre_reorderingstringr'  r7   r7   r8   r9   r)  6AutogradCompilerInstance.end_capture.<locals>.<lambda>  s    @$!r8   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   r[   r   print_readabler   s   r9   r)  r>    sG    {##$$"477)=9  n%n0	 1r8   r,  r@  rv   zCompiled autograd graphT)include_deviceinclude_stridecoloredz%scompiled_autograd_graphc                  "   > T R                  SS9$ )NFrB  )rD  )r[   s   r9   r)  r>    s    u333Gr8   )r.  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  rc   )non_blockingF)in_compiled_autograd_regionr   r}   r   rm   r2   r  r   maybe_mark_dynamic
pin_memoryr  _disabler   r   r   )compiled_fnrv   r   r   r   packed_inputsfiltered_sizesr|   integerr   r   runtime_inputs_to_moverX   r/  s              r9   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:r/   r   r   )*r   r   r   _exec_final_callbacks_stubr   r   r`  
create_argr]  rA   r  r[   rf   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   rt   r3  r6  r   r   r   compiled_autograd_loginfor
  r  r   log_event_endr   r   r   r   __exit__r   )	rX   rn  rr   fieldlazy_graph_coderU  r[   rT  r/  s	   `     @@@r9   end_capture$AutogradCompilerInstance.end_capture  sl   ##&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> 	"#11LLN!"& 	2 	
 	%%dD$7 0 0 777r8   c                     U  Vs/ s H-  n[        U5      [        R                  R                  L d  M+  UPM/     nnU$ s  snf r<   )r  r2   r   r^  )rh   rO  rf   s      r9   get_all_nodes&AutogradCompilerInstance.get_all_nodesB  s5     !=DqDGuxx}}$<D= >s   *==c                     U R                   S:X  dK  U R                   S:X  a<  U R                  [        R                  :X  a  U R                  S   R                   S:X  a  gg)Nr   r]   r   TF)r_   r`   rj   rk   rh   )rr   s    r9   is_placeholder'AutogradCompilerInstance.is_placeholderH  sF    77m#GG&x///		!=0r8   c                    U R                   R                  R                  S[        S9 H  nUR                  S   UR                  S   p2SnUR
                  [        R                  :X  a  UnUR                  S   n[        X#/5      nXQR                  Ld  Mm  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.
r]   r^   r   rc   N)r   r[   rg   r   rh   r`   rj   rk   maxprevrl  rm   )rX   rr   rs   	grad_noder.  args         r9   r\  6AutogradCompilerInstance.reorder_accumulate_grad_nodesR  s     NN((33'; 4 
D %)IIaL$))A,	L8#3#33((--a0	z-.C))#D,?,?,D,D

4 +JJ|,
r8   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.
r]   r^   r  Nr  )	r   r[   rg   r
   r   r   minr  prepend)rX   rr   
first_users      r9   rY  0AutogradCompilerInstance.delay_unpack_hook_nodesg  sd     NN((33y 4 
D {{{D1]BTZZJt$
r8   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.
r]   r^   r  Nr  r   rc   )
r   r[   rg   r
   r   r   rh   rp  rl  rm   )rX   rr   r.  
input_nodes       r9   rZ  6AutogradCompilerInstance.reorder_tensor_pre_hook_nodest  s     NN((33y 4 
D {{{D15FF99Q<L1J*43F3Fz3R3R!!,/##D)
r8   c                 4   U R                   R                  R                  S[        S9 GHk  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 Hu  nUR                  S:X  d  M  UR                  [        R                  :X  d  M5  UR                  UR                  S   5        UR                  U5        UR                  U5        Mw     [        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Mn     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.
r]   r^   r  Nr  r   rc   )r   r[   rg   r
   r   r   rh   ri  r_   r`   rj   rk   rm   zipremovero  rp  rl  )rX   rr   r.  input_nodes	to_remove	to_append
hook_blockrO  abrr  s              r9   r[  @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
r8   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.
r]   r^   r  Nr  r   c              3      #    U  H8  nUR                   S :H  =(       a    UR                  [        R                  :H  v   M:     g7f)r]   N)r_   r`   rj   rk   r  s     r9   r   QAutogradCompilerInstance.reorder_pre_hook_nodes_to_mimic_eager.<locals>.<genexpr>  s7      !D ?*Nt{{h>N>N/NN!s   A A)r   r[   rg   r
   r   r   rm   reversedrh   r  r  r  r  r  rd   re   rv  )rX   	pre_hooksrr   hook_getitem_noder  registered_noderk   s          r9   r]  >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  %# (r8   c                 0   / 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                  [        :X  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.
r]   r^   r  Nr  r   rc   z8post_acc_grad_hook must have corresponding acc grad node)r   r[   rg   r
   r   r   rm   r  rh   r  r  r  r_   r`   r   )rX   post_acc_grad_hooksrr   r.  rs   acc_grad_noderO  s          r9   r^  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,
   .%# 2r8   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                   ["        :X  a  UR                  S   nSn	[        UR                  R                  5       5       HO  n
U
R                  S:X  d  M  U
R                   [        :X  d  M+  U
R                  R                  SS5      S
:X  d  MM  U
n	MQ     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.
r]   r^   r  Nr  r   rc      c              3      >#    U  HM  nUR                   S :X  a6  UR                  [        :X  a"  TR                  R	                  SS5      S:X  a  MI  Uv   MO     g7f)r]   r  Nr  )r_   r`   r
   r   r   )r   r  rr   s     r9   r   CAutogradCompilerInstance.reorder_post_hook_nodes.<locals>.<genexpr>  sI      - =?2 KK94 KKOOK>+M D =s   AA	Ar  )r   r[   rg   r
   r   r   rm   r  rh   r  extendr  r  r  ro  r_   r`   r   rp  rl  )rX   
post_hooksr.  rq   r  input_nodes_and_usersrz  rr  rs   post_acc_grad_hook_noderO  rr   s              @r9   r_  0AutogradCompilerInstance.reorder_post_hook_nodes  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)Q )r8   c                 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r<   r  )r   rC   rX   s     r9   r   4AutogradCompilerInstance.to_proxy.<locals>.<genexpr>2  s     51aq))1s   !)rF   r  r]  r   r2   SymIntSymFloatr   rr   r   r$   r   r   r  proxy_tensor_ProxyTensorr  )rX   trC   r  s   `   r9   r]  !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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)
rF   r2   r   r.   r  r  set_node_originrm   r'   r   )rX   objectsr  r   bound_proxiesr   nodecall_indexrH  s           r9   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   )rX   r  r  bw_states       r9   bind_backward_state,AutogradCompilerInstance.bind_backward_stateO  s@    +++  ' ?(DPr8   rH  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   rG   r   r  r-   extractformatreplacer+   )	rX   rH  r  r  maybe_aot_idforward_clsnew_coderaw_stack_tracenew_stack_traces	            r9   r  (AutogradCompilerInstance.set_node_originV  s     ,,K{I..22:&s   +22[k.9IK+335<<>rB)11H(
 	(r8   )r   r   r   r   r   r   r   r   r   r  r   r  r   r   r   r   r   r   Nr<   )?r   r   r   r   rY   r   staticmethodr   r   r  r2   r   rl   r   r  r   r  ri   r  r/  r  autogradfunctionBackwardCFunctionr   r  r  r  r  r  r  r  r  r  rS   r  r  r  r  r  r  r  r  r  r%  r3  r6  rf  ri  rl  r\  rY  rZ  r[  r]  r^  r_  r]  r  r  Functionr  r   r7   r8   r9   r   r     sI   1C 5] 5 5s
U\\"s
 Cys
 eCJ'(	s

 d5c?+,s
 s
 s
j
c
@D1
 1 ^^$$661 #+3-1fG*
/
FD
		

	
# 
$u||*< 
s 
s 
&/c /b
B, DJu8n  
  -*%*("+H!5F"&H7*r"" LP)1$uS#X2G)H& )) ) //0	)r8   r   Fdynamicc              #     #    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 SS KnUR                  R                  R                  R                  [        R                  " [        U 5      U5      u  nn[!        5       (       a3  UR                  R                  R                  R#                  [$        5        Sq[(        n[(        S-  q UR*                  R-                  S5         S v   S S S 5        U(       d  SqUR                  R                  R                  R                  XV5        [(        S-  q[(        U:X  d   S5       eg ! Sqf = f! , (       d  f       Nh= f! U(       d  SqUR                  R                  R                  R                  XV5        [(        S-  q[(        U:X  d   S5       ef = f7f)Nr   )
eval_frameforce_eagerTFrc   zINested Compiled Autograd Contexts must return before their parent context)active_disable_ctxr  ri   torch._dynamor  _stancestance%compiled_autograd_enabled_force_eagertorch._inductor.cudagraph_treesr  r   r/   set_autograd_compiler	functoolspartialr   r:   set_verbose_loggerr
  compiled_autograd_enableddepthr  set_multithreading_enabled)r   r  ignore_active_disable_ctxr  r2   prior_compilerprior_dynamicprior_depths           r9   _enabler  }  s    , %););=D(((,$$5 591>8=5 3
   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G-E> B&G-F F#F +AG->FG-
FF AG**G-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)r2   r  r   r/   r  r  r  )r  r  s     r9   rO  rO    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  rL  r2   r  r   r/   r  r  clear_cache	itertoolsr   r   r7   r8   r9   resetr    sz     %****	HH&&<<T5I	HH&&99$?	HH&&224oo'Or8   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cloner2   contiguous_format)rv   r  r  r  r  r  r  ry   r   offsetr  s              r9   r  r    sn     !9D##J=F
LL 6F"":VDJ
 0 0u?V?V 0 WXXr8   c                     S /[        U 5      -  n[        [        U 5      5       H:  nX   (       d  M  X%   c  M  US:X  a  UR                  X%   5        XU'   M4  X%   XE'   M<     U$ )Nr   )r  r  r  )r  r   r  r  grad_inputsr   s         r9   r  r    sk    &3/00K3'()v~Av  (!'A!$ * r8   )TTr  )e__doc__r   r  r  rj   r   collectionsr   r   typingr   r   r   r2   torch.utils._pytreeutils_pytreer}  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   torch._loggingr   r   torch._prims_commonr   torch._subclassesr   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.utils._ordered_setr,   torch.utils._tracebackr-   torch.fx.proxyr.   r  r   r`  r
  r:   rA   rD   rO   rQ   r   r   ra  r   rW  r  r   r   r   r   r  r  rL  r  r  contextmanagerri   r  rO  r  r  r  r7   r8   r9   <module>r     s         , 1 1  $ $  <  E D > 6 ,   ?   G B / 4 $X *(4GH *EF4
6G G^# #:5 5 m M "==	 //#	Y) Y)z" "  ). % $  	 D$ D DN 
 
,(Y(r8   