
    rh	                       d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlmZmZ ddlmZmZmZmZmZmZ ddlZddlZddlZddlmZ ddlZddl m!c m"Z# ddlm$Z$m%Z% ddl&m'Z' ddl(m)Z)m*Z* ddlm+Z+m,Z,m-Z-m.Z.m/Z/m0Z0 dd	l1m2Z2 dd
l3m4Z4 ddl5m6Z6 ddl7m8Z8 ddl9m:Z:m;Z;m<Z<m=Z=m>Z> ddl?m@Z@ ddlAmBZB ddlCmDZD ddlEmFZF ddlGmHZHmIZImZJmKZK ddlLmMZMmNZN ddlOmPZPmQZQmRZRmSZSmTZT ddlUmUZU ddlVmWZW ddlXmYZY ddlZm[Z[ ddlIm\Z\m]Z]m^Z^m_Z_m`Z` ddlambZb ddlcmdZd ddl'meZemfZf ddlgmhZh ddlimjZjmkZk dd llmmZmmnZnmoZompZpmqZqmrZrmsZsmtZtmuZumvZvmwZwmxZxmyZymzZz dd!l!m{Z{m|Z|m}Z}m~Z~mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ dd"lmZ dd#lmZmZmZmZ dd$lmZ dd%lmZ dd&lmZmZ dd'lmZ dd(lmZmZmZmZ dd)lmZ erdd*lmZ  ejN                  e      ZejT                  jW                  ed+      ZejT                  jW                  ed,      ZejT                  jW                  ed-      ZejT                  jW                  ed.      Ze'j`                  Z ed/0       G d1 d2             Z ed/0       G d3 d4             Z ed/0       G d5 d6             Z G d7 d8      Zejj                  d9        Ze G d: d;             Zd< Z G d= d>ejr                  jt                        Z G d? d@      Zeeef   Ze G dA dB             Ze G dC dD             Z G dE dFe      ZdGZdH Z ej                         Z G dI dJ      Z G dK dLe$j                        Zy)Ma  
Core graph building functionality for PyTorch's Dynamo system. This module contains
the essential components for constructing and managing FX graphs during compilation:

- OutputGraph: Manages the overall graph construction and compilation process. It owns
  a SubgraphTracer and handles graph compilation, execution, and state management.
  OutputGraph also manages features like graph deduplication, symbolic shape handling,
  and tracking of side effects.

- SubgraphTracer: Handles the actual FX graph construction by tracing Python code.
  It supports advanced features like higher-order operators through nested tracers,
  lifting of free variables, and handling of symbolic shapes.

The module supports key Dynamo features including:
- Higher-order operators through nested SubgraphTracers
- Graph deduplication for optimization
- Symbolic shape handling and propagation
- Side effect tracking and management
- Guard insertion and management
    N)	dataclassfield)AnyCallablecastOptionalTYPE_CHECKINGUnion)fxTensor)guards)ShortenTracebackTensorifyScalarRestartAnalysis)CompileContext	CompileIdGlobalContextCheckpointStateSourcetracingTracingContext)
FakeTensor)signpost_event)_make_graph_module)BackwardState)free_symbolsguard_scalaris_symbolicShapeEnvSpecialization)insert_deferred_runtime_asserts)StorageWeakRef)
OrderedSet)is_traceable_wrapper_subclass   )configexclogging	variables)
CompiledFn
CompilerFn)create_call_functioncreate_instructioncreate_load_constInstruction	unique_id)code_context)	PyCodegen)enter_new_scope)get_interface_for_device)BackendCompilerFailed!exceptions_allowed_to_be_fallback	SkipFrameunimplemented_v2unimplemented_v2_with_warning)apply_graph_deduplication)GraphRegionTracker)GuardBuilderinstall_guard)is_dynamic_nn_module)AttributeMutationExistingSideEffects)
AttrSourceBackwardStateSourceConstantSourceGetItemSourceGlobalStateSourceis_constant_sourceis_from_local_sourceLocalSourceNumpyTensorSourceParamBufferSourceShapeEnvSourceSyntheticLocalSourceTensorPropertyTensorPropertySource)_extract_tensor_dictcheckpoint_paramsCleanupHookclone_inputscount_callscountersdynamo_timedget_instruction_source_311get_locals_to_stealget_static_address_typeget_unique_name_wrtgraph_break_reasonsincrement_op_countistypelazy_format_graph_code
LazyStringnn_module_proxysameset_example_value)VariableTracker)BackwardStateGraphArgGraphArgTrackedFakewrap_fx_proxy)ContextWrappingVariable)BaseListVariable)CellVariableNullVariable)NNModuleVariable)NumpyNdarrayVariableSymNodeVariableTensorVariableUnspecializedPythonVariable)TensorWithTFOverrideVariable)InstructionTranslatorBasegraph
graph_codegraph_sizes
trace_callT)frozenc                   "    e Zd ZU eed<   eed<   y)VariableTrackerCacheKeyvt_idsourceN)__name__
__module____qualname__int__annotations__r        m/var/www/html/ai-insurance-compliance-backend/venv/lib/python3.12/site-packages/torch/_dynamo/output_graph.pyrv   rv      s    J Nr   rv   c                   "    e Zd ZU eed<   eed<   y)AliasingInfohas_aliasingmsgNry   rz   r{   boolr}   strr~   r   r   r   r          	Hr   r   c                   "    e Zd ZU eed<   eed<   y)MutationInfohas_mutationr   Nr   r~   r   r   r   r      r   r   r   c                   *    e Zd Zd Zd Zd Zd Zd Zy)VariableTrackerCachec                     i | _         y N)cacheselfs    r   __init__zVariableTrackerCache.__init__   s	    
r   c                 h    t        t        |      |      }|| j                  vry | j                  |   S r   rv   idr   )r   valuerx   keys       r   lookupzVariableTrackerCache.lookup   s/    %bi8djj zz#r   c                 L    t        t        |      |      }|| j                  |<   y r   r   )r   r   rx   vtr   s        r   addzVariableTrackerCache.add   s    %bi8

3r   c                 d    t               }|j                  j                  | j                         |S r   )r   r   update)r   	new_caches     r   clonezVariableTrackerCache.clone   s&    (*	tzz*r   c                 8    | j                   j                          y r   )r   clearr   s    r   r   zVariableTrackerCache.clear   s    

r   N)ry   rz   r{   r   r   r   r   r   r~   r   r   r   r      s    r   r   c                  4    t        j                  t              S r   )torchdynamo_loggingget_step_loggerlogr~   r   r   _step_loggerr      s    ..s33r   c                   T    e Zd ZU dZeed<   eej                     ed<   dZ	e
ed<   d Zy)GraphCompileReasonzOStores why a given output graph was compiled; i.e. what caused the graph break.reason
user_stackTgraph_breakc                 H    | j                   rt        j                  |        y y r   )r   rX   appendr   s    r   __post_init__z GraphCompileReason.__post_init__   s    &&t, r   N)ry   rz   r{   __doc__r   r}   list	tracebackFrameSummaryr   r   r   r~   r   r   r   r      s,    YKY++,, K-r   r   c                       fd}|S )Nc            
      N    D  cg c]  \  } }} | |i | c}}} S c c}}} w r   r~   )fnargskwargsrandom_callss      r   _gen_rand_valuesz1_get_gen_rand_values_fn.<locals>._gen_rand_values   s+    <HII(8D&D#F#IIIs    r~   )r   r   s   ` r   _get_gen_rand_values_fnr      s    J r   c                        e Zd ZdZdeeej                  j                  f   f fdZ	defdZ
deeej                  j                  f   fdZ xZS )FakeRootModulez'Trick the constructor of fx.GraphModule
nn_modulesc                 l    t         |           |j                         D ]  \  }}t        | ||        y r   )superr   itemssetattr)r   r   kv	__class__s       r   r   zFakeRootModule.__init__   s6    $$& 	 DAqD!Q	 r   returnc                      y)NzFakeRootModule(...)r~   r   s    r   __repr__zFakeRootModule.__repr__   s    $r   c                 N    |j                         D ]  \  }}t        | ||        y r   )r   r   )r   r   r   r   s       r   add_nn_moduleszFakeRootModule.add_nn_modules   s*    $$& 	 DAqD!Q	 r   )ry   rz   r{   r   dictr   torchnnModuler   r   r   __classcell__r   s   @r   r   r      sN    1 4UXX__(<#=  
%# % c588??.B)C  r   r   c                   j    e Zd ZdefdZdej                  j                  deej                     fdZ
y)WrapperBackendbackendc                     || _         y r   )r   )r   r   s     r   r   zWrapperBackend.__init__  s	    #*r   gmexample_inputsc                    t        |      | _        || _        t        j                  | j                        }| j                  ||      | _        | j                  "| j                  | j                  j                  u r| j                  j                  S t        j                  s| j                  S 	  | j                  j                  t        |       } | j                  t        |       }t        ||      r| j                  | j                          S t        d|        # t        $ r t        j                  d        w xY w# | j                          w xY w)Nzincorrect results of backend zerror in verify_correctness)rN   restorer   copydeepcopyr   	candidateforwardr$   verify_correctnessrP   r^   RuntimeError	Exceptionr   	exception)r   r   r   copy_gmcorrectresults         r   __call__zWrapperBackend.__call__  s   (,--(g~>>>!T^^tww%F77??"((>>!	%dggoo|N'CDG#T^^\.%ABF GV$~~ LLN !>tfEFF 	MM78	 LLNs   /AD D  D??E EN)ry   rz   r{   r)   r   r   r   GraphModuler   r   r   r~   r   r   r   r      s4    +
 +588// ellAS r   r   c                      e Zd ZU dZeed<   eed<   eej                  j                     ed<   e
e   ed<   eeeeef   f   ed<   eed<   eej                   j"                  j$                     ed<   eej(                     ed	<   d
Zeed<   d
Zeed<   dZeej0                  j2                     ed<   dZeeej0                  j6                        ed<   ed        Zed        Zed        Zy)OutputGraphGuardsStatear  
    A base class containing fields that are considered "persistent" when we
    want to save all the important state for reconstrucing guards in a different
    process. Normally we don't need to add states here, but we may have to when
    the information is needed to serialize the guards, so the fields here are
    supposed to be serializable as a requirement.
    local_scopeglobal_scopetorch_function_mode_stackguard_on_key_orderinput_source_to_sizes_strides
dual_levelfunctorch_layerscurrent_deviceFexportexport_constraintsN_guards_aotautograd_guardsc                 0    t        dt        |              )Nz%shape_env shouldn't be accessed from )AssertionErrortyper   s    r   	shape_envz OutputGraphGuardsState.shape_env@  s    DT$ZLQRRr   c                     | j                   S r   )r   r   s    r   r   zOutputGraphGuardsState.guardsD  s    ||r   c                     | j                   S r   )r   r   s    r   aotautograd_guardsz)OutputGraphGuardsState.aotautograd_guardsH  s    '''r   ) ry   rz   r{   r   Scoper}   r   r   	overridesTorchFunctionModesetr   r   r   r   r|   
_functorchpyfunctorchFuncTorchInterpreterr   devicer   r   r   r   	GuardsSetr   GuardEnvExprpropertyr   r   r   r~   r   r   r   r   %  s    #EOO$E$EFFF##'S#X(>#??O5++77LLMMU\\**FD$$15GXemm--.5FJ$u}}'A'A"BCJS S   ( (r   r   c                       e Zd ZU dZ ee      Zee   ed<    ee      Z	ee
   ed<    ee      Zeeeeedf   f      ed<    ee      Zee   ed<    ee      Zeee
eedf   f      ed<   y	)
StackLocalsMetadatazf
    Stores metadata for a frame's stack and locals for the purposes of building resume functions
    )default_factorystack_null_idxeslocals_null_keys.stack_ctx_argsstack_ctx_idxes_origlocals_ctx_argsN)ry   rz   r{   r   dc_fieldr   r	  r|   r}   r
  r   r  tupler   r  r  r~   r   r   r  r  M  s     #+4"@d3i@"*4"@d3i@8@QU8VNDsE#s(O345V&.t&D$s)D9ARV9WOT%U38_ 456Wr   r  c            
           e Zd ZU dZeed<   deeef   de	e
   dededef
 fdZd	 Zd
 Zd Zd]defdZd Zd Zde	ee      fdZd Zd Zdeg ef   fdZd Zed        Zed        Zd Zed        Z e jB                  d        Z ed        Z"ed        Z#ed        Z$d Z%d  Z&d! Z'e(jR                  d"        Z*ed#        Z+ed$        Z,ed%        Z-ede.j^                  j`                  fd&       Z1edeeef   fd'       Z2ed(        Z3d^d*Z4d+ Z5d, Z6ed-        Z7d. Z8d/ Z9d0 Z:d_d1Z;d2 Z<e=d3        Z>d4ed5ede?j                  fd6ZAd7eBe.j                  j                  e.j                  ef   fd8ZFd9 ZGd: ZH	 	 d`d;d<d=eIfd>ZJd? ZKd@ ZLdA ZMdBefdCZNe(jR                  dD        ZOdE ZPdF ZQedee?j                     fdG       ZSedeeT   fdH       ZUdIe?j                  dJeeE   deWfdKZXdIe?j                  dJeeE   deWfdLZYdM ZZdN Z[dee.j                     fdOZ\dadPZ]dadQZ^dadRZ_dSee`   dd)fdTZadadUZbdefdVZcdefdWZddadXZedYee?j                  gd)f   dd)fdZZfd[e.j~                  j                  fd\Zg xZhS )bOutputGrapha  
    Wrapper class to hold outputs of InstructionTranslator.  Mainly the
    generated fx.Graph.

    OutputGraph is 1:1 with a frame being processed. Each frame is associated
    with some root InstructionTranslator. When user code calls a function,
    we construct a InliningInstructionTranslator that continues to write into
    the root InstructionTranslator's OutputGraph.
    side_effectscode_optionscompiler_fnr   r   r   c           
         t         |   |||
t               i t        j                  j
                  j                  t        j                  j                  j                         t        j                  j                  j                         t        | |      g| _        i | _        || _        || _        || _        g | _        t)        t*              | _        t               | _        |	j0                  |	j2                  |	j4                  d| _        t9               | _        g | _        t?        | j<                  t@        jB                  t@        jD                  t@        jF                  t@        jH                  | j6                        }dd l%mc m } |jM                  d      5  t        jN                  jQ                  || j                   rdnd| j                   	      }d d d        tS              | _*        | jT                  jV                  jY                  |	       t[        j\                         | _/        | ja                          tc        jd                  tf              | _4        i | _5        tm        |       | _7        tq               | _9        tu        jv                         | _<        t{        |      | _>        g | _?        d| _@        g | _A        || _B        || _C        || _D        i | _E        g | _F        g | _G        d| _H        i | _I        t        j                  j                         | _L        d| _M        t        i       | _N        t        i       | _O        | j                          i | _Q        g | _R        d | _S        g | _T        i | _U        d | _V        d | _W        | j                         | _Y        t        j                         | _\        | j                         | _^        y # 1 sw Y   xY w)
N)r   r   r   r   r   )	is_export)co_nameco_filenameco_firstlineno)tracked_fakesallow_scalar_outputsallow_dynamic_output_shape_ops+prefer_deferred_runtime_asserts_over_guards'allow_complex_guards_as_runtime_asserts	co_fieldsr   F(fake_tensor_allow_unsafe_data_ptr_accessT)r   allow_non_fake_inputsr   )_r   r   r   r   autograd
forward_ad_current_levelr   r   #retrieve_all_functorch_interpretersutils_deviceCURRENT_DEVICESubgraphTracertracersinput_source_to_varr   r   frame_statecleanup_hooksnext_compile_id_counter
compile_idinstalled_globalsr  r  r  r  r9   region_trackerr  r   r$   capture_scalar_outputs capture_dynamic_output_shape_opsr  r  torch._functorch.configpatch_subclassesFakeTensorModer   tracing_contexttraced_coder   r   current_compile_iddynamo_compile_idinit_ambient_guardscollectionsdefaultdictr   tracked_fakes_id_to_sourceparam_name_to_sourcer>   r  r   variable_tracker_cache	itertoolscountunique_var_idr   r  output_instructions	timestampregister_finalizer_fnsr  root_txpackagesource_to_user_stacks_current_txcleanupsshould_exitunspec_variable_map_C_is_torch_function_mode_enabledtorch_function_mode_enabled!has_user_defined_allowed_in_graphnon_compliant_opscompliant_custom_opssave_global_state dynamo_flat_name_to_original_fqnr   random_values_varpregraph_bytecodebackward_statebackward_state_proxybackward_state_var!install_builtins_dict_in_fglobals%name_of_builtins_dict_key_in_fglobals
contextlib	ExitStackcompiler_trace_stack+maybe_install_saved_tensors_hooks_subgraphs"saved_tensors_hooks_subgraph_names)r   r  r  rJ  r   r   r-  r   r   f_coder   rK  r   _config	fake_moder   s                  r   r   zOutputGraph.__init__g  sk    	%"u*,~~00??"--99]]_ ;;..== 	 		
 'tv>? CE "4&68#$78+.5
 ~~!--$33
 12 13 ,,!'!>!>+1+R+R8>8j8j4:4b4bnn
	$ 	21]]E]J 	))88#.2kkdu{{	 9 I	 0>i/H((//7--/ 	 	  " ##D) 	' BD!'- ';&<#&__.,0,>68   OQ# 2= RT"<>+- KM  ,188+S+S+U( 27. >AW ADB! 	  AC-  	 '+ 57 ;=>B!15 224 	2 %/$8$8$:! <<> 	/i	 	s   ;OOc                 P    | j                   j                  t        dd             y )Nbytecode_tracingTlog_pt2_compile_event)rb  enter_contextrS   r   s    r   mark_bytecode_tracing_startz'OutputGraph.mark_bytecode_tracing_start)  s$    !!//"&*	
r   c                 8    | j                   j                          y r   )rb  closer   s    r   mark_bytecode_tracing_stopz&OutputGraph.mark_bytecode_tracing_stop1  s    !!'')r   c                 |    | j                   d   }t        |t              s|j                  }| j	                  d|      S )N__builtins____builtins_dict__)r   
isinstancer   __dict__install_global)r   
f_builtinss     r   r^  z-OutputGraph.install_builtins_dict_in_fglobals4  s=     &&~6
*d+#,,J""#6
CCr   hookc                     | t        | j                         }|| j                  vsJ || j                  |<   || j                         fS r   )lenr[  get_backward_state_proxy)r   rx  prefixnames       r   add_backward_state_hookz#OutputGraph.add_backward_state_hookG  sT    #d112344.....$(D!T22444r   c                 f   | j                   | j                  rt        dddg        t               }| j                  j                  dt        |      |t                     | _         t               | j                   j                  j                  d<   | j                         | _        | j                   S )Nz&backward_state does not support export z3Compiled autograd doesn't work with `torch.export`.gb_typecontextexplanationhintsdynamo_backward_staterx   grapharg)r\  r   r6   r   root_tracercreate_graph_inputr   r@   ra   nodemetanew_varr]  )r   example_values     r   r{  z$OutputGraph.get_backward_state_proxyM  s    $$,{{ D U	 *OM(,(8(8(K(K']#*,	 )L )D% ?T>UD%%**//
;&*llnD#(((r   c                 "   | j                   j                  t               j                  t        j
                               | j                   j                  t               j                  t        j                               | j                   j                  t               j                  t        j                               | j                   j                  t               j                  t        j                               | j                   j                  t               j                  t        j                               t        j                  j                  j                         }|@| j                   j                  t               j                  t        j                               t        j                   j"                  j$                  sA| j                   j                  t               j                  t        j&                               y y r   )r   r   rI   
make_guardr:   	SHAPE_ENVrC   DETERMINISTIC_ALGORITHMS	GRAD_MODEDEFAULT_DEVICETORCH_FUNCTION_STATEr   rQ  r   peek_interpreter_stackFUNCTORCH_STACK_MATCH_dynamocompiled_autogradin_compiled_autograd_regionAUTOGRAD_SAVED_TENSORS_HOOKS)r   cis     r   r>  zOutputGraph.init_ambient_guardsb  sM    	(33L4J4JKL**<+P+PQ	
 	)+66|7M7MNO)+66|7R7RST**<+L+LM	
 XX  779>KKOO!#..|/Q/QR }}..JJKKOO!#.. == Kr   r   c                 b   t         j                  j                  j                  ry t         j                  j
                  j                  j                  }t         j                  j
                  j                  j                  } |       } ||      sy |\  }}| j                  dt         j                  j                  | j                  |j                              }| j                  dt         j                  j                  | j                  |j                              }|dk(  sJ |dk(  sJ ||gS )Nsaved_tensors_hooks_packsaved_tensors_hooks_unpacksaved_tensors_hooks_pack_0saved_tensors_hooks_unpack_0)r   r  r  r  r   _aot_autogradr'  top_saved_tensors_hooks"saved_tensors_hooks_are_inlineableinstall_subgraphr   r   r   rp   )r   	get_hooksare_inline_hookshookspack_gm	unpack_gmpack_subgraph_nameunpack_subgraph_names           r   rc  z7OutputGraph.maybe_install_saved_tensors_hooks_subgraphs  s   ==**FF$$2288PP	**00SS 	 & #!22&HH  '--@
  $44(HH  )//B 
 "%AAAA#'EEEE"$899r   c                     t        | j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  | j                  | j                  | j                  | j                        S )N)r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   s    r   dump_guards_statezOutputGraph.dump_guards_state  su    %((**&*&D&D#66*.*L*L!22..;;#66KK $ 7 7
 	
r   c                 ~    | }| j                         }t        | j                        j                  fd       j	                  t        t        j                  j                  |             j                  t        |      d       j                  |       | j                  j                  j                                t        |      }t!        j"                  | j                  ||      }|j%                         }t'        j(                         j*                  j,                  j/                  |       |S )z]
        call fn(*args) before the graph runs and turn the result into a fake input.
        c                  P     j                  j                  j                        S r   )load_import_fromrz   ry   )cgr   s   r   <lambda>z3OutputGraph.synthetic_graph_input.<locals>.<lambda>  s     B'' r   F)r  r0   rJ  add_push_nullforeachmapr'   ConstantVariablecreatecall_functionrz  storerZ  extendget_instructionsrJ   r`   buildrealizer   getguards_contextdynamo_guardsremove_guards_with_source)r   r   r   r  varnamerx   r   r  s    `     @r   synthetic_graph_inputz!OutputGraph.synthetic_graph_input  s     D	,,.t||$
	
 	

3y1188$?@
TE*
%%b&9&9&;<%g. &&t||]FK!++99SS	
 r   r   c                 :    | j                   j                  |       y r   )r.  r   )r   r   s     r   add_cleanup_hookzOutputGraph.add_cleanup_hook  s    !!"%r   c                 z    t        | j                        D ]	  } |         | j                  j                          y r   )reversedr.  r   )r   rx  s     r   call_cleanup_hookszOutputGraph.call_cleanup_hooks  s3    T//0 	DF	  "r   c                      | j                   d   S Nr   r+  r   s    r   r  zOutputGraph.root_tracer  s    ||Ar   c                      | j                   d   S Nr  r   s    r   current_tracerzOutputGraph.current_tracer  s    ||Br   c                 2    t        | j                        dk(  S )Nr#   )rz  r+  r   s    r   is_root_tracerzOutputGraph.is_root_tracer  s    4<< A%%r   c                 .    | j                   j                  S r   r  rp   r   s    r   rp   zOutputGraph.graph  s    ""(((r   c                 &    || j                   _        y r   r  )r   r   s     r   rp   zOutputGraph.graph  s    $)!r   c                 .    | j                   j                  S r   )r  input_name_to_proxyr   s    r   r  zOutputGraph.input_name_to_proxy  s    ""666r   c                 .    | j                   j                  S r   )r  real_value_cacher   s    r   r  zOutputGraph.real_value_cache  s    ""333r   c                 .    | j                   j                  S r   )r  bound_symbolsr   s    r   r  zOutputGraph.bound_symbols  s    ""000r   c                 :     | j                   j                  |i |S r   )r  create_proxyr   r   r   s      r   r  zOutputGraph.create_proxy  s     /t""//@@@r   c                 :     | j                   j                  |i |S r   )r  create_noder  s      r   r  zOutputGraph.create_node       .t""..???r   c                 :     | j                   j                  |i |S r   )r  remove_noder  s      r   r  zOutputGraph.remove_node  r  r   c              #     K   t               }	 |r|j                  | j                  u sJ |j                          |r|n,t	        | | j                  || j                  j
                        }| j                  j                  |       | |j                  d d d        | j                  j                          y # |j                  d d d        | j                  j                          w xY ww)N)parentsource_targetr  )
r1   r  r  	__enter__r*  r  r+  r   __exit__pop)r   r  prior_tracernew_scope_ctxtracers        r   	subtracerzOutputGraph.subtracer  s     ')	#**d.A.AAAA##%   #.."/"11;;	  LL'L""4t4LL ""4t4LLs   C*A<B8 
.C*8/C''C*c                     | S r   r~   r   s    r   outputzOutputGraph.output  s    r   c                 .    | j                   j                  S r   )r:  rg  r   s    r   rg  zOutputGraph.fake_mode  s    ##---r   c                 B    | j                   j                  j                  S r   )r:  rg  r   r   s    r   r   zOutputGraph.shape_env  s    ##--777r   c                 B    | j                   j                  j                  S r   )r:  r  r  r   s    r   r   zOutputGraph.guards"  s    ##22@@@r   c                 B    | j                   j                  j                  S r   )r:  module_contextr   r   s    r   r   zOutputGraph.nn_modules&  s    ##22===r   c                 B    | j                   j                  j                  S r   )r:  r  r   r   s    r   r   zOutputGraph.aotautograd_guards*  s    ##22EEEr   Nc                 *   t        t        t        t        t        dt
        f   t        f   f   ||n| j                  j                  j                        }t        j                  t        j                         f|d<   t        j                  t        j                  d      t        j                   d      f|d<   t        j                  t        j                  d      t        j                   d      f|d<   t        j                  t        j"                  d      t        j$                  d      f|d<   t        j                  t        j"                  d      t        j$                  d      f|d	<   t        j&                  t        j(                         f|d
<   y)zc
        Saves to out if it is provided. Else saves to the tracing context's global_state.
        .Ngrad_enabledcudaautocast_enabledcpuautocast_cpu_enabledautocast_gpu_dtypeautocast_cpu_dtypeautocast_cache_enabled)r   r   r   r  r   r   r   r:  global_contextglobal_stater   set_grad_enabledis_grad_enabled	functoolspartialset_autocast_enabledis_autocast_enabledset_autocast_dtypeget_autocast_dtypeset_autocast_cache_enabledis_autocast_cache_enabled)r   outr   s      r   rW  zOutputGraph.save_global_state.  s_    eHS#X.4556 ? ))88EE
 ).(>(>@U@U@W'X^$ e88&A%%f-,
'(
 e88%@%%e,0
+,
 e66?$$V,.
)*
 e66>$$U+.
)*
 ,,++-2
-.r   c                 :    | j                   j                  |       y r   )rM  r   )r   txs     r   push_txzOutputGraph.push_txR  s    #r   c                 6    | j                   j                         S r   )rM  r  r   s    r   pop_txzOutputGraph.pop_txU  s    ##%%r   c                 P    | j                   s| j                  S | j                   d   S r  )rM  rJ  r   s    r   
current_txzOutputGraph.current_txX  s$    #'#3#3t||M9I9I"9MMr   c                 ,    t        | j                        S r   )rQ   rp   r   s    r   rQ   zOutputGraph.count_calls\  s    4::&&r   c                 X    t        t        | j                  j                              dk(  S r  )rz  r   rp   nodesr   s    r   is_empty_graphzOutputGraph.is_empty_graph_  s!    4

(()*a//r   c                     |sJ | j                   }|j                  d      D ]$  }t        |t              r||   }t	        ||      }& |S N.)r   splitrt  r   getattr)r   keysobjr   s       r   get_submodulezOutputGraph.get_submoduleb  sN    tBF//C 	&A#t$!fc1o		&
 
r   c                     t        | j                  d         }	 | dt        | j                         }||vr| j                  dxx   |fz  cc<   |S 9)Nco_varnames_)r   r  r/  rF  )r   r}  existingvars       r   r  zOutputGraph.new_varl  s`    t((78F!D!3!3456C("!!-0SF:0
	 r   c                 X    || j                   d   vr| j                   dxx   |fz  cc<   yy)z/Ensure self.code_options.co_names contains nameco_namesN)r  )r   r}  s     r   update_co_nameszOutputGraph.update_co_namesu  s2    t((44j)dW4) 5r   c                     dj                  t        t        |             }t        j                  dd|      }t        j                  dd|      }t        j                  dd|      }|r|d   j                         sd|z   }|S )	Nr!  z^[GL]\['?(.*?)'?\]$z\1z	\[(\d+)\]z_\g<1>z[^a-zA-Z0-9]r   sub)joinr  r   rer(  isalpha)namesr}  s     r   module_key_namezOutputGraph.module_key_namez  sm     xxC(vv,eT:vvlIt4vvosD147??,4<Dr   attr_prefix
attr_valuec                     t        || j                        }|| j                  |<   | j                  d|di       }t        |j                  |       |S )Nget_attrr~   )rW   r   r  r_   r  )r   r.  r/  	attr_nameproxys        r   %register_static_attr_and_return_proxyz1OutputGraph.register_static_attr_and_return_proxy  sM     (T__E	 &0	"!!*iR@%**j1r   targetc                    
 t         j                        r!t        j                   j                  fi S t              dv sJ d   t        t              rJ t        t        j                        r2 j                   j                         s j                   fd}nt        t        j                  j                        r^t        t        j                  j                        sJ r/t        j!                  t"        j$                               fd}n?fd}n8t        t        j&                  t        j(                  f      r fd}n fd} j*                  j-                         D ]  \  }}|u s ||      c S  t/        j0                  | 
t3        
 j*                   j4                        
 j*                  
<   t        t        j                  j                        r_
 fd}t7        d      r j9                         D ]  \  }}	 ||        t7        d	      r j;                         D ]  \  }}	 ||         |
      S )
Nrx   c           	         j                   J j                   | <   j                  j                  j                  v r#j                  j                  j                     S t	              dk(  r9t        t              s)t        j                  t        j                               n3t              s(t        j                  t        j                               t        j                  j                  d| di       fdi}j                  j                  j                  j                  |      }d|j                   j"                  j$                  vsJ t'              |j                   j"                  j$                  d<   |S )Nguardedr1  r~   r  tensor_dict)rB  rJ  r  r  rV   rt  rG   r;   r  r:   ID_MATCHrD   TENSOR_MATCHrd   r  track_object_existingr3  r  r  rM   )
module_keyr   optionsr   rx   r5  r  s     r   	wrap_namez6OutputGraph.register_attr_or_module.<locals>.wrap_name  sM   00<<<8>))*5 T\\00===<<..;;FCC*62i?
-I "&"3"3L4I4I"JK+F3!&"3"3L4M4M"NO"LL''
JBG #) 	 \\((55KKFTVW$BHHMM,>,>>>>4H4P""=1	r   c                 2    t        t              | fi S r   )ri   r   r=  r>  r5  s    r   r?  z6OutputGraph.register_attr_or_module.<locals>.wrap_name  s    +DL*fXPWXXr   c                 0    t        j                  fi S r   )r'   UnspecializedNNModuleVariablerA  s    r   r?  z6OutputGraph.register_attr_or_module.<locals>.wrap_name  s    $BB6UWUUr   c           	      Z    t        j                  j                  d| di       fdiS )Nr1  r~   sym_num)rk   r  r  )r=  r>  r   r5  s    r   r?  z6OutputGraph.register_attr_or_module.<locals>.wrap_name  sA    &--%%j*b"E # 	 r   c                     j                   j                  |        j                  | <   t        j                  t        |             S )N)source_name)r  r&  r   r`   r  rA   )r=  r   r5  s    r   r?  z6OutputGraph.register_attr_or_module.<locals>.wrap_name  sF    ++J706!!*-&,,"z: r   c                     j                   J t        |       } d|  }|j                   |<   t        t              r1| j                  t
        j                  |j                               <   y y r  )rB  rH   rt  rF   rX  r  r-  r}  )	leaf_name
new_sourcenew_namer}  r   rx   s      r   register_leaf_namez?OutputGraph.register_attr_or_module.<locals>.register_leaf_name  sz    00<<<.vyA
"V1YK06@))(3fk2 " 99#33JOO4EF 3r   _parameters_buffers)r<   r   r`   r  r  r   rt  rH   r   r   r  r  r  r   r   r;   r  r:   	NN_MODULESymIntSymFloatr   r   r  r-  rW   r   hasattrnamed_parametersnamed_buffers)r   r5  r,  r>  r?  r   r   rL  rI  r!  r}  rx   r  s   `` `      @@@r   register_attr_or_modulez#OutputGraph.register_attr_or_module  s     4 #((&LGLLw-7""""f&7888fell+((F&&( )) @ 0fehhoo666f//0F0FGHYV u~~ >? OO))+ 	$DAqF{ |#	$
 **E2"4$:K:KL &fehhoo." v}-$*$;$;$= 2LIq&y12vz*$*$8$8$: 2LIq&y12 r   c                    | j                   j                  d      }t        |      }|sg i fS g }i }g |j                  |j                  j                         | j                  j                  j                         }|r |j                         }t        |t              r,t        |j                  t              sJ ||j                  z  }O|| j                  j                  vst        |j                  t              r`t        |j                   t"              rFt        |j                   j$                  t&              r"|j                   j$                  j(                  |v s|j                   j$                  j(                  }||vrg ||<   ||   j+                  |       |r i }	i }
| j,                  D ]  }t        |j.                  t              r2t        |j                   t&              r|j                   j(                  |v sQ|j                   j(                  }|| j0                  d   v sJ ||   D ]  }|j                   |
v r|j                   j2                  }||	vrV| j5                  | d      }||	|<   |j7                  t9        d|      t;        |      t9        d      t9        d|      g       |j                   }t'        |	|         |
|<    " ||
fS )Nr   r   _ref	LOAD_FASTargvalBINARY_SUBSCR
STORE_FAST)r   r  rU   stacksymbolic_localsvaluesr  store_attr_mutationsr  r  rt  rf   r   r   mutation_typer=   rx   rB   baserF   
local_namer   	graphargs_exampler  indexr  r  r+   r,   )r   r  maybe_gmstolen_list_namesalias_instsneeds_aliasqueuexstolen_namevisitedoverridden_sourcesarg	list_namelist_idx
alias_name
old_sources                   r   handle_aliases_for_stolen_listsz+OutputGraph.handle_aliases_for_stolen_lists!  s   ##''//9 r6M8:
XX
&&(
 3388:
 		A!-.!!''4000  T..CCC!!//3LMqxx7qxx}}k:HHMM,,0AA((--22K+-+-K($++A.+ . 35>> %	PC3<<.szz;7JJ))[8 

--I 1 1- @@@@ + P8811 88>>7*!%$+T*"J )3GH%&&.{9M-h7.?.|JO	 XX
1<WX=N1O":.5P%	PV ...r   c                    |j                          g }t               }t        |j                        D ]  \  }}t        j
                  j                  |       t        |j                        |z
  |k  r|j                  |       St        |t              r|j                  j                  |       n|j                  |       t        |t              s|j                  dnt        |j                        }|j                  j                  t        |      dz
  |f       |j                   j                  |       
 g }i }	|j"                  j%                         D ],  \  }
}t        |j&                  t(              r|j&                  j*                  |
k(  r;t        |t,              r|j*                  |
k(  r[t.        j0                  dk\  r6t2        j5                  t        |      r8|j6                  j                  |
       t2        j5                  t        |      rJ t        |t              r@|j                  dnt        |j                        }|j8                  j                  |
|f       ||	vrg |	|<   |	|   j                  |
       / |	j;                         D ]7  }|j=                  |	|          |j=                  |gt        |	|         z         9 |||fS )a
  
        Gets the stack + locals values belonging to tx that need to be restored.

        Also prunes dead tx locals and realizes all VTs in the tx's stack.

        NullVariables in stack/locals will NOT be restored, unless they are the top `stack_pops`
        elements of the stack - it is expected that the next instruction to run will pop the top
        `stack_pops` elements of the stack, so we should codegen NULLs.

        Returns:
            - stack_values: stack and locals values that need to be restored
            - restore_vars: names of locals corresponding to the locals part of `stack_values`
            - meta: locations of NULLs and ContextWrappingVariables in the stack/locals
                (ignores the top `stack_pops` values on the stack)
        r~   r#   )      )prune_dead_localsr  	enumerater]  r'   LazyVariableTrackerrealize_allrz  r   rt  rh   r	  re   target_valuesr  r  r  r^  r   rx   rF   rc  rg   sysversion_infor   __instancecheck__r
  r  r  r  )r   r  
stack_popsstack_valuesr  ir   r}  restore_varsval_to_namesr   r   s               r   _get_stack_values_to_restorez(OutputGraph._get_stack_values_to_restorew  s|     	"$ ""((+ 	4HAu))55e<288}q J.##E*%.%%,,Q/##E*%!89--5B5ATAT;U  ##**C,=,A=+QR))003!	4& #%9; &&,,. 	&DAq !((K0QXX5H5HA5M!\*q||q/@7*)),:))003  11,BBB!45//1BuQ__7M  $$++Q,>?$"$QO""1%5	&6 ""$ 	<AQ0c,q/&: :;	< \4//r   r  ro   r   c           
         | j                   J | j                   |u sJ | j                          || _        || _        d| _        t
        j                  d|       g }t        j                  dk\  r|j                  D ]  }|j                  dk(  r'|j                  t        d|j                               9|j                  dk(  r3|j                  t        dt        |j                  d         	             {|j                  t!        j                   |              | j#                  |       | j$                  r| j&                  rJ d
       | j#                  | j$                         | j)                  | j                         \  }}| j#                  |       t+        | j                   j,                        D ])  }	|	j/                  | j                   |j0                         + | j3                          g }
g }g }|}	 |J t5        d |j,                  D              sJ | j7                  ||      \  }}}|
j                  |       |j                  |       |j                  |       || j                   u rn|j8                  }| j:                  j=                         D ci c]  \  }}|t?        |       }}}tA        |      }ddl!m"} t        | jF                        dkD  rg }| jI                  d      | _%         |tM        | jF                        d      }| jO                  d|      }tQ        | j                   ||      }|jS                  |jU                  |d             |jS                  tW        dd             |j                  |jY                  | jJ                               | j#                  |       d}d}|
d   }| j                   |u r|rt5        d |D              rt5        d |D              rt        t[        |            t        |      k(  r| j\                  j_                         r|j`                  sx| jb                  sl|d   jd                  s]|d   jf                  sN| j#                  | ji                  |tk        t+        |            |      t        dt        |      	      gz          n| jI                  d      }t+        |
      D cg c]  }|D ]  }|  }}}tQ        | j                   |||      } | jm                  |||        i }!| jn                  j=                         D ]'  \  }}"|"dkD  stq        |tr        tt        f      r#d|!|<   ) tQ        | j                   |||!|      }#| jm                  |||#       g }$tw        | jx                        dk7  st        |#jz                        dk7  r|$jS                  | ji                  ||#j}                         |             t        |#jz                        dk7  r#|$j                  |#jY                  |             d}n+|$j                  t        d             n| j                          | j#                  |$|#j                         z          tQ        | j                   |      }%| j#                  t+        |d         D &cg c]  }&|%jY                  |&       c}&       |r#|r!| j#                  |%j                  |      g       |S c c}}w c c}}w c c}&w )a  
        Compiles the current subgraph, with inputs w.r.t. self.root_tx, and codegens:
            - Call the compiled subgraph
            - Apply side effects
            - Codegen stack and locals
            - Store the locals

        Python does not allow NULL to be an arg to a function, so we do not codegen NULLs on the stack,
        unless the value is one of the top `stack_pops` values on the stack (these values are expected to be
        popped immediately after this generated code. The prologue of the resume function is expected to restore
        any dropped NULLs.

        Returns stack indices and locals keys where we dropped NULLs, and where we found inactive context manager objects.
        NTzCOMPILING GRAPH due to %srw     	MAKE_CELLrY  COPY_FREE_VARSco_freevars)rp  z)export does not support pregraph_bytecode)is_graph_breakc              3   <   K   | ]  }|j                           y wr   )can_restore).0blocks     r   	<genexpr>z/OutputGraph.compile_subgraph.<locals>.<genexpr>  s     Kuu((*K   r#   disabler   random_valuesz.do not trace into Dynamo rng recovery functionr   __gen_rand_values)ro  Fr  c              3      K   | ]K  }t        |t        t        t        f       xr) t        |t              xr |j                         t        u   M y wr   )rt  rm   rj   rn   rk   python_typefloat)r  r   s     r   r  z/OutputGraph.compile_subgraph.<locals>.<genexpr>P  s`        3,4  V $A7TAMMOu<TUVs   AAc              3   <   K   | ]  }t        |t                y wr   )rt  rl   r  rl  s     r   r  z/OutputGraph.compile_subgraph.<locals>.<genexpr>\  s     MaJq.1Mr  UNPACK_SEQUENCE	graph_out)tempvarsro  POP_TOP)BrJ  rp  partial_convertcompile_subgraph_reasonrO  r   debugr~  r  prefix_instsopnamer   r+   rZ  rz  r  r   add_output_instructionsrZ  r   ru  r  block_stackexitr   cleanup_graphallr  r  r   r   r]   r   
decoratorsr  r   r  rY  r   rv  r0   r  load_function_namer*   create_storer   r  is_emptydebug_localsr[  r	  r
  compile_and_call_fx_graphr   codegen_suffixusesrZ   rJ   rF   rQ   rp   graph_outputsgraph_output_varsrun_compiler_collectiver  create_delete)'r   r  r   r  r  r  instri  ro  r  all_stack_valuesall_restore_varsall_stack_locals_metascur_txr  r  r  r}  modnn_modules_proxiesrootr  random_calls_instructionsrand_fnrand_fn_namecodegengraph_output_varstored_graph_output_varroot_stack_valuesvalsvalstack_values_flatpass1r  rE  pass2r  local_restore_cgr#  s'                                          r   compile_subgraphzOutputGraph.compile_subgraph  s   , ||''' ||r!!! 	'').'-$		-v6 +-w& 9;;+- ''*;t{{K [[$44 ''*,#boom6T2U !''		$89 	$$\2**t{{ 	
7	
; 	$$T%;%;<*.*N*NLL+
'' 	$$[1 dll667 	HEJJt||F4F4FJG	H 	 !#68%%%K8J8JKKKK/3/P/P
0,L, ##L1##L1"))$/%YYF * 9=8M8M8O
+44D/#&&
 
 01' t  !A%(*%%)\\/%BD"'(9(9:GG  ../BGLLd7IG &,,**<> &,,-A!U-KL%,,$$T%;%;< (()BC  "',R0LLB!  +  M;LMMC)*+s3D/EE!!**,OO''*2.??*2.?? ((..X&7894 &&7SAR=STUV  $||K8 !))9 :!d!?B!! !  #5	E $5u= H#jj..0 )
U19VC2F1T%U$(HSM)  !#5E $5u=F4::&!+s53F3F/G1/L222u7N7N7PRVW u**+q0MM%"4"45E"FG.2+MM"4Y"?@ ,,.((%2H2H2J)JK %LL-?
 	$$ $$4R$89 !--c2	
  7((!//0@AB &%A
B!hs   [$[*[0c                    | j                   j                         | j                  rs| j                  rJ | j                  j	                         D ]H  \  }} |       j                  j                  | j                               j                  |       J | j                   j                         |j                  D ]h  \  }j                  fd       |D ]
  } |        j                  t        t        |      d             j                  t        d      g       j j!                  ||j                          | j                   j#                         y )Nc                              S r   r~   )r  	debug_vars   r   r  z,OutputGraph.codegen_suffix.<locals>.<lambda>  s    R	] r   Fr  )value_from_source)r  codegen_save_tempvarsr[  r   r   append_outputcreate_loadr]  
store_attrcodegen_hooksr  r  extend_outputr*   rz  r+   restore_stackcodegen_update_mutated)	r   r  r  r  r}  r  r   rp  r  s	      `    @r   r  zOutputGraph.codegen_suffix  s4    	//3{{"?!00668 $	c3  0G0G!HId#$ 	''+  " 	>OIt23 31#d)UCD0;<=	> 	RYYG004r   c                    | j                   sJ t        | j                  j                        }|D ]  }|j                  j                  dd         t        j                         }t        ||dd       D ]  \  }}|j                  t        j                  j                  u s-t        |j                        | fk(  sH|j                  rU|j                  d   }|j                  t        j                  j                  u st        |j                        | fk(  s|j                  r|j                  d   }| j                  j                  |       | j                  j                  |        y)z
        Remove "creation_timestamp" from node meta

        Remove this pattern from the graph:
            torch._C._set_grad_enabled(False)
            torch._C._set_grad_enabled(True)
        creation_timestampNr#   r   )rO  r   rp   r  r  r  r   r  zipr5  rQ  _set_grad_enabledr  r   _erased
erase_node)r   r  r  r  node1node2s         r   r  zOutputGraph.cleanup_graph  s    TZZ%%& 	6DIIMM.5	6 ,,.uQRy1 	1LE5 : ::%**%l*:)<<$zz!}LLEHH$>$>>ejj),.>-@@!MM#(::a=LJJ))%0JJ))%0	1r   c                 \   i }| j                   j                  D ]  }|j                  j                  dd       }t	        |t
        j                  j                        sD|j                         }|D cg c]  }t	        |t              r|n
t        |      ! c}||j                  <    |S c c}w )Nr  )rp   r  r  r  rt  r   r8  r   sizer|   reprr}  )r   retr  r  r  ss         r   get_graph_sizes_structuredz&OutputGraph.get_graph_sizes_structured  s    JJ$$ 	VD IIMM/4@M-):):)E)EF$))+PT!U1z!S'9!tAw"F!UDII		V
 
 "Vs   1$B)r}  c                 V   d}|d| dz  }| j                   j                  D ]  }|j                  j                  dd       }t	        |t
        j                  j                        sE|j                         }||j                   dt        |       dz  }g }d}|D ]g  }t	        |t              r|j                  |       %t	        |t
        j                        r(d}|j                  |j                  j                         g  |s||j                   d	t        |       dz  } |S )
NzTRACED GRAPH TENSOR SIZES
z===== z =====
r  z: 
FTz (concrete): )rp   r  r  r  rt  r   r8  r   r  r}  r  r|   r   rP  r  hint)	r   r}  graph_sizes_strr  r  r  concrete_size
has_symintszs	            r   get_graph_sizeszOutputGraph.get_graph_sizes  s   7VD622JJ$$ 	D IIMM/4@M-):):)E)EF$))+dii[5;-r#BB ""
 B!"c*%,,R0#B5%)
%,,RWW\\: "'#yyku]7K6LBO#	( r   c              #     K   | j                   j                  j                         }i }| j                  |       	 | j                   j                  j	                  |       d | j                   j                  j	                  t        |             y# | j                   j                  j	                  t        |             w xY ww)zj
        Momentarily restores the global state to what it was prior to tracing the current output
        )r  N)r:  r  copy_graphstaterW  restore_graphstater   )r   prior_global_statecurrent_global_states      r   restore_global_statez OutputGraph.restore_global_state  s     
 "11@@PPR<>#78	  //BBCUV   //BB,-ABD  //BB,-ABs   9C)B %/C0CCc                 h   | j                   }|J |j                  xzj                  lj                  }t        j                  dj                         t        j                  j                  dd fd       |j                  }t        |      dk(  s%J dj                  dj                  |                   t        |j                               j!                  |j#                         t        j$                  j'                         z        5  t)        d	d
      5  d g|j+                         z  }t-        j.                  |j                  |       |_        d d d        d d d        |j0                  j3                          t4        j6                  y y # 1 sw Y   =xY w# 1 sw Y   AxY w)Nzcompiler_collective %sartifactc                      dddS )Ncompiler_collectivestring)r}  encodingr~   r~   r   r   r  z5OutputGraph.run_compiler_collective.<locals>.<lambda>!  s    1 (% r   c                  8     j                   j                         S r   )local_staterender)dss   r   r  z5OutputGraph.run_compiler_collective.<locals>.<lambda>%  s    2>>#8#8#: r   )metadata_fn
payload_fnr#   z&Expect only one device type but got {}+r  Trj  )group)rJ  distributed_state
all_states
compile_pgr   infor  r   _loggingtrace_structured_device_typesrz  formatr)  r2   r  r  rankacceleratordevice_countrS   r  distall_gather_objectspeculation_logr   r%    CompileCollectiveRestartAnalysis)r   r  r  device_typesr  r  s        @r   r  z#OutputGraph.run_compiler_collective  s|   \\~~&&&B38MJHH-r~~>NN++ ; ,  &33L|$) 8??@VW) ))9)9);<CCOO%(9(9(F(F(HH+ 2$O	+ #Vjoo&77
&&z2>>T *+ + $$&6667 9N3+ + + +s$   F(">F F(F%	!F((F1c                     t         j                  j                  j                         5  ddlm}  j                  sJ  j                          t        dd      }t        |t              sJ t        |t              sJ  j                  dd j                  j                  t        d |D                    fi       } j!                         }|j#                  |        j                  j%                  ||       t&        j(                  sQ j+                          t-        t/        j0                  | j2                         j4                  | j6                          j9                          t;         j2                        }t<        d	   d
xx   |z  cc<    j?                           j@                  jC                          tE        | j2                         jF                  r( jF                  D ]  }	tI        |	tK        ||	               jL                  D ]
  }
 |
        |_'         jP                  _(         jR                  jU                         jV                  d<    jX                  jV                  d<   tZ        j]                  dt_        |ddd             t         j`                  jc                  d fdfd        je                           jf                  jh                  } j6                  s_ddl5m6c m} |jo                  d      5  t         jp                  js                  |j4                        }ddd        jf                  _4         ju                         5   jw                   jy                               ddd       ddl=m>} t        |      s&t        tK        dd      |      rRj~                  dk(  rCt        |      rnj                  }|j                  |       t        |      s|j                   j                   j                  j                  |        |d      t<        d	   dxx   dz  cc<   |j4                  j                  x}rg i  j                  D cg c]  }|j                   }}|D ]  }|j                  |j                        }t        j                  |j                        j                         }t        j                  |j                  |g      }t        j]                  d|       j                  t        j                  |fd|      |f        t         j                  j                  d       fd        } j                  ||       n j                  |        j                  J t         j                        }|j                  |       |j                         cddd       S # 1 sw Y   xY w# 1 sw Y   fxY wc c}w # 1 sw Y   yxY w)!z
        Generate code from self.graph and return the Instruction()s to
        call that generated code.

        Code is generated w.r.t. self.root_tx.
        tx is only used for preserving GraphModule metadata
        r#   r  __compiled_fnT)	with_uuidr  c              3   <   K   | ]  }|j                           y wr   )as_proxyr  s     r   r  z8OutputGraph.compile_and_call_fx_graph.<locals>.<genexpr>P  s     5Oqajjl5Or  )r   statscalls_capturedrX  r=  %s)include_strideinclude_devicecoloreddynamo_output_graphc                  (    d j                         iS )Nsizes)r  r   s   r   r  z7OutputGraph.compile_and_call_fx_graph.<locals>.<lambda>  s    $"A"A"CD r   c                  ,     j                  ddd      S )NFT)print_outputr  r  )print_readable)r   s   r   r  z7OutputGraph.compile_and_call_fx_graph.<locals>.<lambda>  s    2#4#4!&tD $5 $ r   )r  r   NFr   )r   )_LazyGraphModule__self___lazy_forwardz"do not trace Dynamo-compiled graphr  unique_graphsz:Compiling backend specialized graph with specialization=%sc                      |||          S r   r~   )idxr   check_fns      r   r  z7OutputGraph.compile_and_call_fx_graph.<locals>.<lambda>  s    X$(IF" r   c                     	D ]  \  }} ||       s|v r |   | i |c S j                   j                  |j                  |j                        5  |j                  d<   t        |       }t        j                        5  j                  |      |<   d d d        d d d         |   | i |c S   | i |S # 1 sw Y   'xY w# 1 sw Y   +xY w)Nspecialization)	r   patch_source_specializationrx   r+  r  r   r   r:  call_user_compiler)
r   r   r+  r-  r   compiled_fnr   r   specialization_cachespecialization_guardss
        r   specialized_dispatchzCOutputGraph.compile_and_call_fx_graph.<locals>.specialized_dispatch  s	   4I Y0.#D>-1EE'K';N'K%)("-3(" !" "&!K!K . 5 5~7N7N" 	& =K(8 9?CDz%,T-A-A%B !&(,(?(?N(S %9$H!&	& $H#7#G#XQW#XX%Y& '777!& !&	& 	&s$   0CC C C	CC	)Yr   r   r   clear_framer  r  rO  r  r.   rt  r   r   r  r  
create_argr  
dedup_passr   _maybe_preserve_original_metar$   do_not_emit_runtime_assertsremove_unused_get_attr_nodesr   r   r   rp   r   r   remove_unused_graphargsrQ   rR   &remove_tensorify_specialized_graphargsr  r   r   rd  r   r  rI  _backend_idr  rX  r   r  r=  graph_code_logr  r[   r  r	  r  r:  rg  r6  r   r7  r8  r9  r  r/  r   torch.fx._lazy_graph_moduler%  ry   r&  force_recompiler   rK  add_backend_idspecializationsrd  rx   rf  inspect	getsourcer+  stripr   LAMBDA_GUARDr   r   r  r  r  install_global_unsaferJ  r0   make_call_generated_coder  )r   r  rvr  r  r}  output_nodesub_gmsncallssubgraph_nameregister_finalizerold_fake_moderf  backend_fake_moder%  lazy_gmrA  asourcesr-  source_indexcheck_fn_sourcer+  r3  r  r0  r   r1  r2  s   `                        @@@@r   r  z%OutputGraph.compile_and_call_fx_graph9  sy    ]]))557 }	)+####((*_=Db$'''dN333**$$//5OB5O0OPR	K oo'G(==b+N55 113/NN44NN;;	 ((* ,FW./69/779 !!'')#D$**5B
 66%)%L%L MMBwt]/KLM '+&A&A '""2&' "BN)-)E)EB&55::< GG67 ,0+A+ABGG'(  &"T$PT NN++%D ,  ##% 00::M;;99]]E]R (-(9(9(H(H"/"9"9 )I )% 2C$$.**, Q"55b$:M:M:OPQ E+'787;
DACST((O; "+/?@  $--  !009!+/?@")//K||'++D+>!$HK Wo.!3."/"9"9"I"III(*%SU$-1^^<188<<&5 N#*==1F1F#GL&-&7&78O8O&P&V&V&XO%22&//() H
 IIT'
 *00%--;C !" !-	 +
2 &&.R&S8 T8. **41EF **4=<<+++4<<(B''-&&({}	) }	)h Q QJ =G}	) }	)sJ   K)X+W#)X+!W0C4X W=EX#W-	(X0W:	5XXc                 :    | j                   j                  d      S )Nplaceholderop)rp   
find_nodesr   s    r   placeholderszOutputGraph.placeholders   s    zz$$$66r   c                 Z    | j                   D cg c]  }|j                  d    c}S c c}w Nr  )rZ  r  r   r  s     r   rd  zOutputGraph.graphargs  s%    262C2CD$		*%DDDs   (r   r   c                 t    t        dddddd      5  | j                  ||      cd d d        S # 1 sw Y   y xY w)NOutputGraph.call_user_compilerbackend_compileTcompile_aot_autograd'aot_autograd_cumulative_compile_time_us)
phase_namerk  log_waitcounterwaitcounter_name_overridedynamo_compile_column_us)rS   _call_user_compiler)r   r   r   s      r   r/  zOutputGraph.call_user_compiler  sI     ,("& &<%N
 	@ ++B?	@ 	@ 	@s   .7c                    | j                   J d}g }|j                  j                  D ]6  }|j                  dv r|dz  }|j                  dk(  s&|j	                  |       8 t        |       |D ]/  }t        |d      r|j                  d   }|j                  |_	        1 | j                  |_        | j                  |_        t        | j                   d      r| j                   j                  nd}	  t               t         j"                  d	|        | j                   }	t$        j&                  rt)        |	      }	 |	||      }
 t               t         j"                  d
|        t+        |
      sJ d       	 tM        ddi | jN                  |tQ        |j                  j                        tQ        |      d       
S # t,        t.        f$ r  t0        $ r}| j2                  rCt5        | j                   |t7        j8                               j;                  |j<                        d t?        || j@                  jB                  dd| dtE        |       d| j@                  jG                          d| dtE        |       ddg       Y d }~d }~wtH        $ r}|d }~wtJ        $ rH}t5        | j                   |t7        j8                               j;                  |j<                        d d }~ww xY w)Nr   r  call_methodcall_moduler#   rV  _dynamo_sourcer  ry   z<unknown compiler_fn>zcalling compiler function zdone compiler function z#compiler_fn did not return callablezBackend compiler exceptionz	Backend: z
Exception:z
Traceback:
zBackend compiler `z` failed with z. Adding a graph break.z-Report an issue to the backend compiler repo.r  dynamor_  )op_count
node_countinput_count))r  rp   r  rX  r   rY   rR  r  rx   rl  rB  _param_name_to_sourcerL  _source_to_user_stacksry   r   r&   INFOr$   r   r   callabler   r   r4   rT  r3   rB  currentframewith_traceback__traceback__r7   rJ  re  r   format_frame_summaryr5   r   r   r  rz  )r   r   r   totrZ  r  plrp  r}  r  r0  es               r   rg  zOutputGraph._call_user_compiler  s    +++HHNN 	*DwwIIqww-'##D)		*
 	3 	/B2/0ggj) %(JJ!	/ $(#<#< $($>$>! t''4 %%( 	
 	8LN7<<+EdV)LM**K((,[9%b.9KLN7<<+B4&)IJK(O*OO(6 	,..!"((..1"<0			
 K /0@A 	0 	55+$$a)=)=)? .1t< *##4#D6c!fX^DLLLmLmLoKpq0nSVHLcdC	 	  	 G 	8'  !W%9%9%;nQ__-48	8s3   2BG   K/B/JK/JK/'AK**K/c                 d    t         j                  j                  j                  rt	        |       S i S r   )r   r  r$   use_graph_deduplicationr8   r   s    r   r6  zOutputGraph.dedup_pass`  s%    ==77,T22Ir   c                 z    t        || j                  d      }||_        d|_        | j	                  ||d        |S )NT)requires_suffixFr  )rW   r   ry   torchdynamo_force_dynamicrU  )r   r}  sub_gm	next_names       r   r  zOutputGraph.install_subgraphf  s@    'dootT	#+0( 	$$VYt$Dr   c                 V    | j                   D cg c]  }|j                   }}|S c c}w r   )rd  example)r   rp  r   s      r   r   zOutputGraph.example_inputso  s'    )-8##++88 9s   &c                     t        | j                  j                  d      d      D ]5  }t        t	        |j
                              dk(  s%| j                  |       7 y )Nr1  rW  T)reverser   )sortedrp   rY  rz  r   usersr  r]  s     r   r9  z(OutputGraph.remove_unused_get_attr_nodess  sN    4::00J0?N 	'D4

#$)  &	'r   c                      j                   sJ dt        j                  j                  fd}dt        j                  j                  fdfd}ddlm} t        t         j                  j                              D ]  }t        t        |j                              dk(  s%|j                  dk(  s||j                  d	k(  r|j                  t        j                  u sQ|j                  d	k(  r1|j                  t         j"                  u r ||j$                  d         s ||      s	 ||      s j'                  |        d
 } fd}t)               dt*        t         j,                  t         j.                  f   fdg } j0                  D ]  } ||      d u}|r|j                  r|j3                  |       /|j                  s&t5        |j6                  d   t8              s	 ||       a|j6                  d   }	t5        |	t8              rt5        |j6                  d   j:                  t         j<                        r|j6                  d   j:                  }
|j6                  d   j>                  }t         j@                  jB                  jE                  |
      s}tG        |
jI                               }|jK                         D ]Q  }tM        |jN                  |      }tQ        jR                  t         j,                  t         j.                  ffd|       S |	jT                  |	jT                  n|	j:                  } |        |D ]+  } ||      }||vr	 ||       jW                  |       - y )Nb_nodec                     | du ryt        | t        j                        sy| j                  j	                  d      }|y|du ryt        |t
        j                        r|j                  j                         x}|S y)NTFr  )	rt  r   Noder  r  r   SymBoolr  maybe_as_bool)r  brs      r   is_static_truez;OutputGraph.remove_unused_graphargs.<locals>.is_static_true  sq    ~fbgg.0AyDy1emm,&&..00Q= r   rQ  c                     ddl m} t        | t        t        t
        f      ryt        | t        j                        r%t        | j                  j                  d      |      S y)Nr   SymTypesTr  F)
torch.fx.experimental.sym_noder  rt  r|   r  r   r   r  r  r  )rQ  r  s     r   is_symnode_argz;OutputGraph.remove_unused_graphargs.<locals>.is_symnode_arg  sD    ?!c5$/0!RWW%!!&&**_"=xHHr   c                    ddl m} | j                  dk7  ryt        | j                  j                  d      |      syt        fd| j                  D              syt        fd| j                  j                         D              syy)	Nr   r  r  Fr  c              3   .   K   | ]  } |        y wr   r~   r  rQ  r  s     r   r  zWOutputGraph.remove_unused_graphargs.<locals>.is_symnode_compute_node.<locals>.<genexpr>  s     <Q~a(<   c              3   .   K   | ]  } |        y wr   r~   r  s     r   r  zWOutputGraph.remove_unused_graphargs.<locals>.is_symnode_compute_node.<locals>.<genexpr>  s     GQ~a(Gr  T)
r  r  rX  rt  r  r  r  r   r   r_  )r  r  r  s     r   is_symnode_compute_nodezDOutputGraph.remove_unused_graphargs.<locals>.is_symnode_compute_node  sg    ?ww/)diimmO<hG <$))<<G$++2D2D2FGGr   r   )is_accessor_noder1  r  c                     | j                   d   }|j                  }t        |t        j                        rDt        |j
                  j                  t        j                        r|j
                  j                  S y r\  )	r  r  rt  r   rP  r  exprsympySymbol)r  rp  r  s      r   placeholder_binds_symbolzEOutputGraph.remove_unused_graphargs.<locals>.placeholder_binds_symbol  sV    ))J'CkkG'5<<0Z!!5<<6 ||(((r   c                     t         j                  d| j                  d   j                  j	                                | j                  d= j                  |        j                  j                  | d        y )NzREMOVE UNUSED GRAPHARG %sr  )r   r  r  rx   r}  r  r  r  )r  r   s    r   remove_unusedz:OutputGraph.remove_unused_graphargs.<locals>.remove_unused  s\    II1499Z3H3O3O3T3T3VW 		*%T"!!%%dD1r   fakec                      | t        |      z  } y r   )r   )used_symbolsr  s     r   update_used_symbolsz@OutputGraph.remove_unused_graphargs.<locals>.update_used_symbols  s    L..Lr   r  c                      |       S r   r~   )tr  r  s    r   r  z5OutputGraph.remove_unused_graphargs.<locals>.<lambda>  s    .A,PQ.R r   ),rO  r   r  Argument%torch.fx.experimental.symbolic_shapesr  r  r   rp   r  rz  r  rX  r5  operatorgetitemr   _checkr   r  r   r
   rP  r   rZ  r   rt  r  ra   r  ScriptObjectexample_strong_ref_libraryfake_class_registrytracing_with_realr   __obj_flatten__r  r  wrapped_objpytreetree_map_onlyfake_tensorremove)r   r  r  r  r  r  r  recheck_placeholdersbinds_symbolrp  real_script_objfake_script_obj	flat_dictattrfake_attr_valr  symbolr  r  r  s   `                @@@r   r:  z#OutputGraph.remove_unused_graphargsx  s    	277#3#3 	&	bgg.. 		" 	KT$**"2"234 	+D4

#$)GGz)?2t{{hFVFV7V?2 KK5<<7*499Q<8.t4'-$$T*	+		2 +.%	/E%,,:T4U 	/  "%% $	<D3D9ELzz(//5zz*IIj)+@+ "$' ))J/C!#'<= !$))J"7"?"?ASAST*.))J*?*G*G*.))J*?*R*R$~~AASS+  )-_-L-L-N(OI(1(8 "07$3$?$?1" !' 4 4%*\\5<<$@$R$1!"	" !+.??+FCKK  (d;I$	<N ) 	0D-d3F!-!$' !''/	0r   c                    ddl m} | j                  j                  D ]  }|j                  j                  d      }t        |t              s0|j                  =t        |j                  j                  j                  d      sht        d |j                  D              s|j                  |j                  j                  j                  j                        st!        |j                        D ]7  }|j#                  t%        |j                               | j'                  |       9 | j'                  |       ! y )Nr   )TensorifyStater  r}  c              3   :   K   | ]  }|j                   d k(    yw)itemN)r5  )r  us     r   r  zEOutputGraph.remove_tensorify_specialized_graphargs.<locals>.<genexpr>%  s     ?qF*?s   )torch._dynamo.symbolic_convertr  rp   r  r  r  rt  r   	item_memorR  r  _exprr  r  should_specializer}  r   replace_all_uses_withr   r  )r   r  r  r  r  s        r   r;  z2OutputGraph.remove_tensorify_specialized_graphargs  s     	BJJ$$ 	'D IIMM/:M=*5!++7M3388>>G?DJJ??"44!++0066;;
 djj) (A++L9P9P,QR$$Q'(   &	'r   r|  c                 H    | j                   j                  |       d| _        y)zt
        We call this on the creation of a new compiled subgraph that is inserted
        before user code.
        TN)rG  r  rO  )r   r|  s     r   r  z#OutputGraph.add_output_instructions0  s     
 	  ''/r   c                     || j                   vsJ | j                   j                  |       | j                  j                  t	        j
                  | j                  ||             y)a`  
        WARNING: prefer the safer `install_global_by_id/install_global`.
        torch.compile instances should be independent of each other;
        one footgun is to have one instance depend on the existence of
        a global installed by another instance. This can happen if we mangle
        a global the same way across both instances.
        N)r2  r   rN  r   rO   r  r   )r   r}  r   s      r   rF  z!OutputGraph.install_global_unsafe8  sS     411111""4([//0A0A4OPr   c                     | dt        |       d| j                   }|| j                  v r|S | j                  ||       |S )z
        Installs a global if it hasn't been installed already.
        This is determined by (prefix, id(value)) pair.

        Returns the name of the newly installed global.
        r!  _c)r   r1  r2  rF  r   r|  r   r}  s       r   install_global_by_idz OutputGraph.install_global_by_idD  sK     2e9+R'894)))K""4/r   c                 @    t        |      }| j                  ||       |S )z~
        Installs a global, generating a unique name for it.

        Returns the name of the newly installed global.
        )r.   rF  r  s       r   rv  zOutputGraph.install_globalS  s#      ""4/r   c                    d | _         | j                  j                          d | _        | j                  j
                  D ]  }d|j                  v s|j                  d=   | j                  j                          | j                  j                          | j                  j                          | j                  j                          | j                  j                          | j                  j                          | j                  j                          | j                  j                          | j                  j                          | j                   j                          y r\  )rJ  r   r   rB  rp   r  r  r  r  r  rC  rI  rX  r:  r,  rP  r[  r]  s     r   cleanupzOutputGraph.cleanup^  s
    $(!JJ$$ 	*DTYY&IIj)	* 	##%  &&(!##))+##))+--335""$  &&(  &&(!!#r   rM  c                 :    | j                   j                  |       y r   )rI  r   )r   rM  s     r   add_graph_finalizerzOutputGraph.add_graph_finalizers  s     	##**+=>r   r  c                     |j                   dk(  r|j                  d   j                  S |j                   dk(  sJ | j                  |j                     S )z#Extract the non-fake example tensorrV  r  r1  )rX  r  r  r   r5  r]  s     r   example_value_from_input_nodez)OutputGraph.example_value_from_input_nodex  sH    77m#99Z(000ww*$$$t{{++r   )rx  r   )tmp)Fr   )r   N)iry   rz   r{   r   r>   r}   r   r   r   r   r)   r   r   r   rm  rp  r^  r`   r~  r{  r>  r   rc  r  r  r   r  r  r  r  r  r  rp   setterr  r  r  r  r  r  r`  contextmanagerr  r  rg  r   r   r   r  r   r   r   rW  r  r  r  rQ   r  r  r  r&  staticmethodr-  r   Proxyr4  r
   r   r   r   rU  ru  r  r   r  r  r  r  r  r  r  r  r  rZ  rb   rd  r   r(   r/  rg  r6  r  r   r9  r:  r;  r-   r  rF  r  rv  r  r  r  r   r   s   @r   r  r  Z  sc    @
38n@
 j)@

 @
 @
 @
D
*D&5O 5)*::Xd3i=P ::
 4&8BG#4 &#
      & ) ) \\* * 7 7 4 4 1 1A@@  .   . . 8 8 A// A A >DcN > > F F"
H$& N N'05
  		,/			Jehhoou||S89JXT/lS0r a&'a& #a&F501<C 2  "7@E)N 7d277m 7 7 E4> E E@..@26v,@	@I..I26v,I	IVU\\ 2 '
T0l 'D d;.?  D  
QS 	s 	$*?"*BNN+;T+A"B?	?
,%((-- ,r   r  a  With the current config, we will graph break (and fall back to eager-mode PyTorch) on all ops that have do not have the 'pt2_compliant_tag'. Please see the following doc for how to mark this op as PT2 compliant https://pytorch.org/tutorials/advanced/custom_ops_landing_page.htmlc                     |dk7  ry  fd} fd}t        |t        j                  j                        r=t        j                  j
                  |j                  v r	 ||       y  ||d| d       y t        |t        j                  j                        r't        |j                               }t        |      dk(  rLt        ||d         }t        j                  j
                  |j                  v r	 ||       y  ||d| d	       y t        j                  j                  j                   j                  ||fd
      \  }}	 t        j                   j"                  |j$                  g|i |}	t        |	      }t        j                  j
                  |j                  v r	 ||       y  ||d| d|	 d       y y # t&        $ r"}
t)        ddt+        |
      g        Y d }
~
sd }
~
ww xY w)Nr  c                 Z    | j                   dv ry j                  j                  |        y )N>   atenprimprims)	namespacerV  r   )r5  output_graphs    r   encountered_compliant_opz8check_pt2_compliant_op.<locals>.encountered_compliant_op  s)    88))--f5r   c                     j                   j                  |        t        j                  rt	        dd|dz   t
        z   g        y y )Nz Encountered non-PT2-compliant opr   r  )rU  r   r$   only_allow_pt2_compliant_opsr6   err_epilogue)r5  r   r  s     r   encountered_non_compliant_opz<check_pt2_compliant_op.<locals>.encountered_non_compliant_op  sB    &&**62..:#I4	 /r   z%Encountered the torch.ops.OpOverload z that is not PT2 compliant.r#   r   z:Encountered the non-overloaded torch.ops.OpOverloadPacket z that is not PT2 compliant. Fz*Error when attempting to resolve op packetr  r  z+Encountered the torch.ops.OpOverloadPacket z! which resolves to the overload (z) that is not PT2 compliant.)rt  r   _ops
OpOverloadTagpt2_compliant_tagtagsOpOverloadPacketr  	overloadsrz  r  r  r'  get_fake_values_from_nodesr  rQ  _jit_resolve_packet_qualified_op_namer   r6   r   )r  kindr5  r   r   r  r  r  rX  overloadr{  s   `          r   check_pt2_compliant_opr    s   6
 &%**//099&&&++5$V,$3F8;VW	
 	&%**556&**,-	 y>Q1.Byy**bgg5(,(..4X 6./ }}**EE##dF^U
f
	xx33)),04:H VX&99&&"''1$R((=fX F33;* =%&I 70  	DF	 	s   -G   	G+	G&&G+c                       e Zd Zd Zd Zy)	LazyProxyc                 <    || _         || _        || _        || _        y r   )r  r   r   r   )r   r  r   r   r   s        r   r   zLazyProxy.__init__  s    	r   c                 N     | j                   | j                  i | j                  S r   )r   r   r   r   s    r   r   zLazyProxy.__call__  s     tww		1T[[11r   N)ry   rz   r{   r   r   r~   r   r   r  r    s    2r   r  c                   6    e Zd ZdZd fd	Zd Z	 	 	 d fd	Z	 d fd	Zd Z	 ddZ	d Z
d	 Zd
eeej                  j                   f   fdZdeej$                  ej&                  f   dee   fdZdej$                  deej2                     fdZd Zd Z xZS )r*  a  
    Holds an FX graph that is being traced. OutputGraph owns a SubgraphTracer
    and the separation of responsibilities is that SubgraphTracer is
    responsible for building the graph while OutputGraph is responsible for
    compiling and executing the graph.
    c                    t         |           t        j                  |      | _        t
        j                  j                         | _        || _	        i | _
        i | _        || _        || _        i | _        i | _        d | _        d| _        d| _        d| _        d| _        ||j*                  dz   nd| _        d | _        d | _        d | _        d | _        | j                  g | _        n:| j                  j4                  | j                  j7                  |      |fgz   | _        t9               | _        g | _        t        j>                         rtA        d      y )NFr#   r   zSInference mode is supposed to be disabled during compilation. Please open an issue.)!r   r   weakrefr3  r  r   r   Graphrp   r  r  r  r  r  lifted_freevarsr  	prev_instunder_activation_checkpoint#allow_side_effects_under_checkpoint,unsafe_allow_externally_visible_side_effectsis_reconstructing_generatordebug_level	_cur_code_orig_gm_meta_orig_gm_lineno_map_orig_gm_firstlinenosource_fn_stack_target_to_strr!   _used_names_input_versions_at_beginningis_inference_mode_enabledr   )r   r  r  r  r  r   s        r   r   zSubgraphTracer.__init__  s\   #MM,7XX^^%
 # 9; =? *  " TV ,1(
 490
 =B9 ,1(:@:L 2 2Q 6RS!#' $(!
 ;;#%D #';;#>#>**=9=IB $D 
 -7L 8:)**,e  -r   c                    | j                   r| j                  r| j                  r|j                  j                  }d }|)| j                  j                  || j                  z
  d       }|]| j                   |   }t        j                  j                  D ]  }||v s||   |j                  |<    d|v r|d   |j                  d<   y y y y y y )Nstack_trace)
r	  r
  r  current_instructionstarts_liner  r   r3  _COPY_META_FIELDSr  )r   r  r  linenonode_idxr  r   s          r   r7  z,SubgraphTracer._maybe_preserve_original_meta<	  s    (())++77FH!3377T666 #))(3XX77 7E}+/;		%(7 !D(/3M/BDIIm, ) $ * ) r   c           	         | j                   ^t        j                  ||f      \  }}	g }
|D ]$  }| j                  |      }|
j	                  |       & t        j
                  |
|	      \  }}t        |   ||||||      | j                  j                  }t        j                  dk\  r|dv r|j                  | j                  urj                  vj                  j                  `|j                   |j#                  j                  j                        fd}t$        j'                  dt)        |             | _        d}|j                   | j*                  ur t-        j.                  |j                         j1                  dd              }t3        |t4        j6                  j8                        rld	}|j:                  j<                  D cg c]  }|j>                   c}| _         |jB                  | _"        |jF                  jH                  jJ                  | _&        nd | _         d | _"        d | _&        |jN                  }|r'|jQ                         jR                  j>                  d
<   |dv r>| jT                  jR                  jV                  fgz   jR                  j>                  d<   n|dk(  r| j                   tY        dd| jZ                   dg        | jT                  jR                  jV                  t]        fdjR                  j>                  d
   j_                         D              fgz   jR                  j>                  d<   | ja                  |jR                         |s!d
jR                  j>                  vr5|jN                  }|r'|jQ                         jR                  j>                  d
<   djR                  j>                  vr|dv r>| jT                  jR                  jV                  fgz   jR                  j>                  d<   nz|dk(  ru| j                   tY        dddg        | jT                  jR                  jV                  jR                  j>                  d
      d   fgz   jR                  j>                  d<   djR                  j>                  vrg }|r?|jc                         s|j	                  |je                                tg        |dd       }|r?|ji                          tj        jl                  jo                  |      jq                         }djs                  |      jR                  _:        t4        jv                  jx                  jz                  s$t4        jv                  jx                  j|                  rD| j                  j~                  j                  | j                  j                  jR                         S c c}w )Nr  ri  )r  c                  v    t              j                         } dj                  j                   d d|  S )NzTRACE FX call z from r  )rT   rstripr  r}  )linecur_instheaderrH  tx_codes    r   get_trace_call_log_strz;SubgraphTracer.create_proxy.<locals>.get_trace_call_log_str	  s9    5gxHOOQD+BGGLL>xr$PPr   r  Forig_graphmodulec                       y r   r~   r~   r   r   r  z-SubgraphTracer.create_proxy.<locals>.<lambda>	  s    r   Tnn_module_stack>   rj  r  r  rk  z4Invoking an nn.Module inside a higher order operatorzHigher order op name: zThis is not supported.r  c              3   \   K   | ]#  \  }\  }}|j                  d       d   k(  r| % yw)@r   N)r  )r  r   r!  tyr5  s       r   r  z.SubgraphTracer.create_proxy.<locals>.<genexpr>	  s5      &Aw2773<?f4 s   ),z2Invoking an nn.Module inside a HigherOrderOperatorr  r#   r  r  )Ar  r  tree_flatten#maybe_lift_tracked_freevar_to_inputr   tree_unflattenr   r  r  r  r~  r  r  r  	positionsr  re  get_line_of_code_headertrace_call_logr  r\   r  r/   get_contextr  rt  r   r   r   rp   r  r  r	  _lineno_mapr
  r   __code__r  r  r"  r   r  r  r}  r6   r  r/  r   r7  is_co_filename_from_nn_modulesframe_summaryr  r  r   StackSummary	from_listr  r)  r  r  r$   r}  track_nodes_for_deduplicationr3  
track_node)r   r  r5  r   r   r}  	type_exprproxy_factory_fn	flat_args	tree_specnew_flat_argsrp  maybe_new_argr  r  is_retracingorig_graphmodule_maybendr"  frame_summariesmsgsr  r  rH  r  r   s     `                  @@@@r   r  zSubgraphTracer.create_proxyP	  s'   V ;;"#)#6#6f~#F IyM  4 $ H H M$$]34 "00	JLD&W!&$i9I

 )) w&4 4
 ,

 --H.&&2&&--9))338;M;M;T;T3UQ $$T:6L+MN!) 99DNN*&\%=%=bii%H%L%L"L& &" 0%((2F2FG#&<&B&B&H&H& "BGG&" ,B+M+M(*22;;JJ ) &*"+/(,0),,.=.B.B.DBGGLL*+33.2.B.Bv&F /BGGLL*+ ]"{{& R4T5G5G4HI 8	 /3.B.BGGLL *,'',,7H*I*O*O*Q 	F 	/BGGLL*+ 	**2rww7 4"$"4"4"6E6J6J6LBGGLL!23 4;;6:6J6Jv.N 7BGGLL!23 ]*{{.($X$&(@"$	 7;6J6JGGLLGGLL):;FCAFN 7BGGLL!23 ,<>O 88:#**2+;+;+=>R40  ##% ))33ODKKMD"$''$-BGG MM  88}}##AA,,77!!,,bgg 	y&s   W!c                    t        | j                  ||||       | j                  at        j                  |i |}|D ]G  }t        |t        j                  j                        s(|j                  | j                  k(  rBJ d        t        
| -  ||||||      }	| j                  j                  |	j                  d<   | j                  j                  |	j                          |	S )Nz2create_node using arg not from this SubgraphTracerr  )r  r  r  r  arg_tree_leavesrt  r   r   r  rp   r   r  rH  r  r  r   r}  )r   rX  r5  r   r   r}  r5  r7  rp  r  r   s             r   r  zSubgraphTracer.create_node
  s     	t00"fdFK;;"..??I  !#uxx}}5yyDJJ. H. w"2vtVT9M*.*;*;*E*E		&'TYY'r   c                    t        |j                        dkD  rg }|j                  j                         D ]S  }|j                  | j                  k7  s|j	                  t        t        |j                  j                                     U |D ]  }|j                  j                  |        | j                  j                  |       | j                  j                  |j                  d        y r  )rz  r  r  rp   r  r  r   r  r  r  r  r}  )r   r  user_graph_nodesuserother_graph_nodes        r   r  zSubgraphTracer.remove_node
  s    tzz?Q46

) N ::+ %++HT$**:J:J5K,LMN %5 D  &&112BCD

d#  $$TYY5r   c                 (   t        |t        j                        r%| j                  j	                  |j
                         t        j                  d|||j                         nd|| j                  |       || j                  J d| d| d       | j                  r`| j                  Tt        |d      sG| j                  j                  j                  |g       j	                  t!        j"                                t%        || j&                        }| j(                  rqt+        t-        | j(                              }| j(                  |   j.                  }|r| j0                  j3                  |      }n7| j0                  j5                  |      }n| j0                  j3                  d       }|5  | j7                  d|d	i |
      }	t9        |	j.                  |       | j(                  r>|r<| j(                  j;                         \  }
}|	| j(                  |<   || j(                  |
<   n|	| j(                  |<   | j&                  j=                  |       | j                  }t        j>                  jA                         }|s|st        |t        j                        r| jC                  ||       nht        |tD        tF        f      rRtI        |      D ]D  \  }}t        |t        j                        s!d }|rtK        ||d      }| jC                  ||       F t        |t        jL                        rQt        |j.                  jN                  tP        jR                        r#|	| jT                  |j.                  jN                  <   |	cd d d        S # 1 sw Y   y xY w)Nz7create_graph_input %s %s %s at debug_level %s before=%sz(none)z0you are required to provide a source for inputs z example_val z on the root tracerT)only_allow_inputrV  r~   r5  F)rb  rf  index_is_slice)+rt  r   r   r  r   _versionr   r  r}  r  r  r  rE   r  rL  
setdefaultr   extract_stackrW   r  r  r/  r  r  rp   inserting_beforeinserting_afterr  r_   popitemr   compileris_compiling_lift_basic_symbolsr   r  rz  rB   rP  r  r  r  r  )r   r}  r5  r  beforerx   	prev_namer  ctxr3  r   r   is_strict_exportis_non_strict_exportr  r{  e_sources                    r   r  z!SubgraphTracer.create_graph_input1
  s    mU\\2--44]5K5KL		E#/FKKMX	
 >;;* B4&VcUddwx* >>dkk1'F!!77BB62NUU"002 #4)9)9:##Xd&>&>?@I++I6;;Djj11$7jj006**--d3C =	%%mT2rY%WEejj-8''F//779116((../((+16((.
   &2  $~~#(>>#>#>#@ #,@mU\\:,,]FCe}= )- 8 
>1)!U\\:$#'!'4%+1U(H 00H=
> -6:""''< ?D""=#5#5#:#:;{=	 =	 =	s   .GNNc                 n   | j                   J d       |j                  j                  d   }t        |t        j
                        rE|j                  j                  | j                  v r#| j                  |j                  j                     S || j                  v r| j                  |   S |j                  | j                   k7  r| j                   j                  |       |j                  j                  d   }| j                  |j                  j                  t        |      |      }|| j                  |<   |S )NzIlift_tracked_freevar_to_input should not be called on root SubgraphTracerr  )r  r  r  rt  r   rP  r  r  r  r  lift_tracked_freevar_to_inputr  r}  r   )r   r3  r  	new_proxys       r   rZ  z,SubgraphTracer.lift_tracked_freevar_to_input
  s    {{& 	
W	
& 

8 }ell3""''4+=+==%%m&8&8&=&=>>
 D(((''..
 <<4;;&KK55e<

8++JJOOT-0-
	 '0U#r   c                     t        |t        j                  j                        sDt        |t              r2t	         fd|j
                  |j                  |j                  fD         S |S |j                   k(  r|S  j                  |      S )z
        If arg is a free variable, then lift it to be an input.
        Returns the new lifted arg (if arg was a freevar), else the
        original arg.
        c              3   @   K   | ]  }j                  |        y wr   )r'  )r  sub_argr   s     r   r  zESubgraphTracer.maybe_lift_tracked_freevar_to_input.<locals>.<genexpr>
  s$      # @@Is   )
rt  r   r   r  slicestartstopstepr  rZ  )r   rp  s   ` r   r'  z2SubgraphTracer.maybe_lift_tracked_freevar_to_input
  sy     #uxx~~.
 #u%(+		388SXX'F  
ZZ4J11#66r   e_proxyc                     |j                   t        t              sJ dt        f fd}fd}t        |t        j
                        rt        |j                               D ]  \  }} ||      st        j                  d|||j                         t        ||dt        j                  j                  j                  j                  ||fi t!        |            } j#                  ||        |j$                  t        j&                  u rt        |j)                               D ]  \  }} ||      st        j                  d|||j                         t        ||dt        j                  j                  j*                  j                  ||fi t!        |            } j#                  ||        n6|j$                  t        j,                  u rA j#                  |j/                         |        j#                  |j1                         |       n|j$                  t        j2                  t        j4                  hv rA j#                  |j7                         |        j#                  |j9                         |       nl|j$                  t        j:                  t        j<                  hv r@ j#                  |j?                         |        j#                  |jA                         |       tC        |      rC|jE                         \  }}	|D ]*  }
tG        ||
      } j#                  |tG        ||
             , y y t        |t        jH                        r/ ||      r&|jJ                  jL                  }|jN                  |<   y y y )Nr   c                 >   ddl m}  ||       xr t        | j                  j                  t
        j                        xr] | j                  j                  j                  | j                  j                        xr" | j                  j                  j                  vS )Nr   )r   )
r  r   rt  r  r  r  r  r   is_unbacked_symintr  )r  r   r   s     r   	need_bindz8SubgraphTracer.track_unbacked_symbols.<locals>.need_bind
  sq    I A :qvv{{ELL9:FF$$77D: FFKKt'9'99	r   c                 X     j                   |i |}t        |j                  |        |S r   )r  r_   r  )r  r   r   r3  r  s       r   _proxy_with_example_valuezHSubgraphTracer.track_unbacked_symbols.<locals>._proxy_with_example_value  s-    'F''88Eejj-8Lr   z>_track_unbacked_symbols %s for %s.size()[%s] at debug_level %sr  rH  z@_track_unbacked_symbols %s for %s.stride()[%s] at debug_level %s)(r  rt  r*  r   r   r   rz  r  r   r  r  r  opsr  sym_sizer|   r   track_unbacked_symbolslayoutstridedstride
sym_stride
sparse_coo_indices_values
sparse_csr
sparse_bsrcrow_indicescol_indices
sparse_csc
sparse_bscccol_indicesrow_indicesr"   __tensor_flatten__r  rP  r  r  r  )r   r  rc  rg  ri  r  r  
lazy_proxyattrsrU  r  inner_tr  r  s   `            @r   rl  z%SubgraphTracer.track_unbacked_symbols
  s     &.111	D 		
 mU\\2!-"4"4"67 ?1Q<IIX** "+1'		//33 !"&q'	"J //:>'?* ##u}}4%m&:&:&<= CDAq |		^#".. &/"5+!IINN5599$aL&*1g	&
 33AzB'C* %%)9)99++M,B,B,DgN++M,A,A,CWM%%%*:*:E<L<L)MM++M,F,F,H'R++M,E,E,GQ%%%*:*:E<L<L)MM++M,F,F,H'R++M,E,E,GQ,];*==?
s! QD%mT:G//$9OPQ <
 u||4'$))..-4$$T* ( 5r   r  srcc           	          	 ddt         t        t        j                  f   dt        t
           dt        dd f fd}t        |t        j                        rnt        |j                               D ]-  \  }} |||t        |t        j                  |      nd d       / |j                  t        j                  u rt        |j!                               D ]-  \  }} |||t        |t        j"                  |      nd d       /  ||j%                         |t        |t        j&                        nd d       n6|j                  t        j(                  u rA j+                  |j-                         |        j+                  |j/                         |       n|j                  t        j0                  t        j2                  hv rA j+                  |j5                         |        j+                  |j7                         |       nl|j                  t        j8                  t        j:                  hv r@ j+                  |j=                         |        j+                  |j?                         |       tA        |      rG|jC                         \  }}|D ].  }tE        ||      }	 j+                  |	|tG        ||      nd        0 y y t        |t        j                        r
 |||       y y )	Nr  rx   rS  r   c                    t        |       sy t        | t        j                        sJ j	                  |       }t        |      dk(  ry j                  ݉j                  j                  | |       |D ]  }j                  j                  |   }|j                  j                  d   }t        |t        j                        sJ j                  t        |      t        |      |||      }t        j                  d|||j!                         ndj"                         |j$                  |<    y t        |      dk(  sJ d| d|         |J d	|  d
|  d       t'        t)        |            }j                  t        |      t        |       | ||      }t        j                  d| ||j!                         ndj"                         t+        || dd d      |j                  j                  d<   y )Nr   r  )rS  rx   z4_lift_symbols_in_symint %s from %s at debug_level %szsubgraph inputsr#   zyFor root tracer, we only expect to bind basic symbols (compound symbols should be cached before) but got unbound symbols z in zSource of 'z' is None when lifting it to input of top-level. If it's an unbacked symbol, this could be because it's not tracked with lazy_bind_unbacked_symbols. Otherwise, should provide a source when create_graph_input for `z` at root tracer.F)pass_arg_as_tensorr  	is_tensorr  )r   rt  r   rP  lookup_unbound_symbolsrz  r  rR  r  r  r  r  r   r   r   r  r}  r  r  r/  iterrb   )	r  rx   rS  self_to_be_bounds0parent_proxyexample_valphr   s	           r   _lift_symbols_in_symintzCSubgraphTracer._lift_basic_symbols.<locals>._lift_symbols_in_symintP  s   
 q>a...#::1=#$) {{&//6:* <B#';;#<#<R#@L"."3"3"8"8"IK%k5<<@@@00B[)#%% 1 B IIN)/);AR((	 :<D((6#<( +,1 HHXGYY]^_]`b1 ) !! %WWXVYYjl)
 $/01,,GG!! -  		J%+%7FKKM=N$$	 ,4', $#,Z(r   T)rS  )F)$r
   r|   r   rP  r   r   r   rt  r   rz  r  rL   rK   SIZErm  rn  ro  STRIDEstorage_offsetSTORAGE_OFFSETrq  rR  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r"   r|  r  r?   )
r   r  r  r  r  r  r~  rU  r  r  s
   `         r   rR  z"SubgraphTracer._lift_basic_symbolsI  s    !B	S%,,&'B	V$B	 B	 	B	H mU\\2!-"4"4"67 	1' ? -S.2E2EqI!	 ##u}}4%m&:&:&<= 	DAq+  # 1n6K6KQO!%#	 (!002 ? -S.2O2OP! %%)9)99(()?)?)A3G(()>)>)@#F%%%*:*:E<L<L)MM(()C)C)EsK(()B)B)DcJ%%%*:*:E<L<L)MM(()C)C)EsK(()B)B)DcJ,];*==?
s! D%mT:G,,#/C!6t < u||4# 5r   r  r   c                    |j                   j                  j                  }t        |      dk(  rg S g }|D ]  }|| j                  vr|j                  |       #| j                  |   }t        |t              r |       }|| j                  |<   t        |t        j                  j                        r|j                  | u rJ d| d        t        |d       S )Nr   zThe proxy of symbol z" doesn't belong to current tracer.c                     | j                   S r   )r}  )r  s    r   r  z7SubgraphTracer.lookup_unbound_symbols.<locals>.<lambda>  s
     r   )r   )r  r  r   rz  r  r   rt  r  r   r   r  r  r  )r   r  r   to_be_boundr  r3  s         r   r  z%SubgraphTracer.lookup_unbound_symbols  s    vv{{//|!I 	B+++""2&&&r*E%+).""2&eUXX^^49M &rd*LMM	 k'788r   c                    | j                   }g }g }| j                  j                  D ]i  }|j                  dk(  rW|j                  d   }t        |t        j                        s<|j                  |j                         |j                  |       i n t        t        ||            D cg c]  \  }\  }}||k7  r| }	}}}t        |	      r#|	D cg c]  }||   	 }
}d|
 }t        d|      S t        dd      S c c}}}w c c}w )NrV  r  zInput mutation detected at TFr  )r  rp   r  rX  r  rt  r   r   r   rJ  rz  r  rz  r   )r   input_versions_at_beginninginput_nodesinput_versions_at_endr  r  r  v1v2mutated_inputsmutated_nodesr   s               r   has_input_mutationz!SubgraphTracer.has_input_mutation  s   &*&G&G# "JJ$$ 	Dww-' $		/ :mU\\:)001G1GH&&t,	  )/1FG 
 
8B Rx	 
 
 ~5CD[^DMD/?Cc**E2&&
 Es   ,C>Dc           	         ddl m} t               }| j                  j                  D ]u  }|j
                  dk(  rc ||g      d   }t        |t        j                        s9t        |j                               }||v rd||    d| }t        d|      c S |||<   u n t               }| j                  j                  d      d   }t        j                  |j                  d         D ]y  }	|	s ||	g      d   }t        |t               rJ t        |t        j                        s?t        |j                               }||v rd	||    d|	 }t        d|      c S |	||<   { |j#                         |j#                         z  }
t%        |
      dkD  rQ|
D cg c]  }||   ||   f }}d
j'                  |D cg c]  \  }}| d|  c}}      }d| }t        d|      S t        dd      S c c}w c c}}w )Nr   )_collect_fake_inputsrV  z*Input-to-input aliasing detected at nodes z and Tr  rW  z,Output-to-output aliasing detected at nodes z, z+Input-to-output aliasing detected at nodes Fr  )torch._higher_order_ops.utilsr  r   rp   r  rX  rt  r   r   r    _typed_storager   rY  r  tree_leavesr   r   r  rz  r)  )r   r  input_storagesr  r  storager   output_storages	out_nodesout_nodeintersected_storagesr  aliasedr  os                  r   r   zSubgraphTracer.has_aliasing  s   F>BfJJ$$ 	Dww-' 4dV <Q ?mU\\:,]-I-I-KLG.0 J>ZaKbJcchimhno+D#66.2N7+	 @DvJJ))X)6q9	**9>>!+<= 
	8H 4hZ @ C%mT:::mU\\:,]-I-I-KLG/1 L_]dMeLffkltkuv+D#66/7OG,
	8  .2247K7K7MM#$q( BV<="OA$67G  iiG DDAqA3eA3 DEG?yICc**E2&& !Es   G2<G7
)NFN)NNN)NNNN)FN)ry   rz   r{   r   r   r7  r  r  r  r  rZ  r'  r
   r  r   r   r  rl  rP  r   r   r   rR  r   r  r  r  r  r   r   r   s   @r   r*  r*    s    QhC4 up HL(6. DHk\&P7>`5&+Iuxx~~,E&F`5F~"5<<#=>~EMfEU~D9 9ell9K 9*':*'r   r*  )r   r?  r`  r   r  rB  rD  r&   r  r*  r~  r   r  dataclassesr   r   r  typingr   r   r   r   r	   r
   r  torch._guardsr   torch._loggingtorch.distributeddistributedr  torch.nntorch.utils._pytreer'  _pytreer  r   r   torch._C._dynamor   torch._dynamo.excr   r   r   r   r   r   r   r   torch._subclasses.fake_tensorr   torch._utils_internalr   r>  r   %torch.fx.experimental._backward_stater   r  r   r   r   r   r   torch.fx.passes.runtime_assertr    torch.multiprocessing.reductionsr    torch.utils._ordered_setr!   torch.utils._python_dispatchr"   r  r$   r%   r   r'   backends.registryr(   r)   bytecode_transformationr*   r+   r,   r-   r.   r/   r  r0   current_scope_idr1   device_interfacer2   r3   r4   r5   r6   r7   graph_deduplicationr8   graph_region_trackerr9   r:   r;   mutation_guardr<   r  r=   r>   rx   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   variables.baser`   variables.builderra   rb   rc   rd   variables.ctx_managerre   variables.listsrf   variables.miscrg   rh   variables.nn_moduleri   variables.tensorrj   rk   rl   rm   variables.torch_functionrn   r  ro   	getLoggerry   r   r  getArtifactLoggergraph_tabular_logr=  graph_sizes_logr+  RootGuardManagerrv   r   r   r   r   r   r   r   r   r   r   r   r   r   objectr   r   r  r  r  r  rE  r0  r  Tracerr*  r~   r   r   <module>r     s  *         	 
   4 F F       $ $  # N  5 0 : ?  K ; / F D D 5  '  - 6  ; 4 / 0 @         * ,  ; - 6 1  C H g!NN44XwG 11(LI..228]K11(LI**  $   $  
 $  
 0 4 4 - - - UXX__    D 	S&[ $( $( $(N 	X 	X 	Xc,( c,N9J FR &ioo' 2 2G'RYY G'r   