
    %VjiqQ                    B   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ZddlmZmZ ddlmZmZ ddlmZ ddlmZmZmZmZmZmZ ddl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/m0Z0 dd
l1m2Z2m3Z3 ddl"m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z; ddl<m=Z= ddl>m?Z? ddl@mAZA ddlBmCZC ddlDmEZEmFZFmGZGmHZHmIZI ddlJmKZK ddlLmMZM ddlNmOZO ddlPmQZQ ddlRmSZS ddlTmUZUmVZVmZWmXZX ddlYmZZZm[Z[ ddl\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZe ddlfmfZf ddlgmhZh ddlimjZj ddlkmlZl ddlVmmZmmnZnmoZompZpmqZq dd lrmsZs dd!ltmuZu dd"l0mvZvmwZw dd#lxmyZy dd$lzm{Z{m|Z|m}Z} dd%l~mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ dd&l*mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ dd'lmZ dd(lmZmZmZmZ dd)lmZ dd*lmZ dd+lmZ dd,lmZ dd-lmZmZmZmZ dd.lmZ dd/lmZ erdd0lmZ dd1lmZ  ej        e          Ze#j                            ed2          Ze#j                            ed3          Ze#j                            ed4          Ze#j                            ed5          Ze0j        Z ed67           G d8 d9                      Z ed67           G d: d;                      Z ed67           G d< d=                      Z G d> d?          Zej        d@efdA            Ze G dB dC                      ZdDed@eg ee         f         fdEZ G dF dGe#j        j                  Z G dH dI          Zeeef         Ze G dJ dK                      Ze G dL dM                      Ze G dN dO                      ZdPed@eeef         fdQZ G dR dSeئ          Z G dT dU          ZdVZdWedXedYedZed[ed@dfd\Z ej                    Z ed]          Z e d^          Z G d_ d`          Z G da dbe-j                  ZdS )ca  
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)	GeneratorSequence)	dataclassfield)CodeType)AnyCallablecastOptionalTYPE_CHECKINGUnion)	ParamSpecTypeVar)fxTensor)guards)ShortenTracebackTensorifyScalarRestartAnalysis)CompileContext	CompileIdGlobalContextCheckpointStateSourcetracingTracingContext)
FakeTensor)signpost_event)_ConstraintTarget)_make_graph_module)BackwardState)free_symbolsguard_scalaris_symbolicShapeEnvSpecialization)Target)insert_deferred_runtime_asserts)StorageWeakRef)
OrderedSet)is_traceable_wrapper_subclass   )configexclogging	variables)
CompiledFn
CompilerFn)	create_binary_slicecreate_call_functioncreate_dup_topcreate_instructioncreate_load_constcreate_rot_ncreate_swap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ValueMutationExisting)_get_source_debug_name
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)NullVariable)NNModuleVariable)NumpyNdarrayVariableSymNodeVariableTensorVariableUnspecializedPythonVariable)TensorWithTFOverrideVariable)UserDefinedDictVariable)CompilePackage)InstructionTranslatorBasegraph
graph_codegraph_sizes
trace_callT)frozenc                   $    e Zd ZU eed<   eed<   dS )VariableTrackerCacheKeyvt_idsourceN)__name__
__module____qualname__int__annotations__r        T/root/voice-cloning/.venv/lib/python3.11/site-packages/torch/_dynamo/output_graph.pyr   r      s$         JJJ NNNNNr   r   c                   $    e Zd ZU eed<   eed<   dS )AliasingInfohas_aliasingmsgNr   r   r   boolr   strr   r   r   r   r      %         	HHHHHr   r   c                   $    e Zd ZU eed<   eed<   dS )MutationInfohas_mutationr   Nr   r   r   r   r   r      r   r   r   c                   ^    e Zd ZddZdededee         fdZdedededdfdZ	dd	Z
dd
ZdS )VariableTrackerCachereturnNc                     i | _         d S N)cacheselfs    r   __init__zVariableTrackerCache.__init__   s    EG


r   valuer   c                 l    t          t          |          |          }|| j        vrd S | j        |         S r   r   idr   )r   r   r   keys       r   lookupzVariableTrackerCache.lookup   s5    %bii88dj  4z#r   vtc                 T    t          t          |          |          }|| j        |<   d S r   r   )r   r   r   r   r   s        r   addzVariableTrackerCache.add   s&    %bii88
3r   c                 `    t                      }|j                            | j                   |S r   )r   r   update)r   	new_caches     r   clonezVariableTrackerCache.clone   s+    (**	tz***r   c                 8    | j                                          d S r   )r   clearr   s    r   r   zVariableTrackerCache.clear   s    
r   r   N)r   r   )r   r   r   r   r   r   r   rm   r   r   r   r   r   r   r   r   r      s        H H H HC  H_4M     f / d            r   r   r   c                  4    t          j        t                    S r   )torchdynamo_loggingget_step_loggerlogr   r   r   _step_loggerr      s    .s3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	dZdS )
GraphCompileReasonzOStores why a given output graph was compiled; i.e. what caused the graph break.reason
user_stackTgraph_breakr   Nc                 @    | j         rt          j        |            d S d S r   )r   re   appendr   s    r   __post_init__z GraphCompileReason.__post_init__   s.     	-&t,,,,,	- 	-r   r   )r   r   r   __doc__r   r   list	tracebackFrameSummaryr   r   r   r   r   r   r   r      s_         YYKKKY+,,,, K- - - - - -r   r   random_callsc                 8     dt           t                   f fd}|S )Nr   c                      d  D             S )Nc                 &    g | ]\  }}} ||i |S r   r   ).0fnargskwargss       r   
<listcomp>zE_get_gen_rand_values_fn.<locals>._gen_rand_values.<locals>.<listcomp>   s.    III(8D&D#F##IIIr   r   )r   s   r   _gen_rand_valuesz1_get_gen_rand_values_fn.<locals>._gen_rand_values   s    IILIIIIr   )r   r   )r   r   s   ` r   _get_gen_rand_values_fnr      s;    Jd3i J J J J J 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         ddfdZ xZS )FakeRootModulez'Trick the constructor of fx.GraphModule
nn_modulesc                     t                                                       |                                D ]\  }}t          | ||           d S r   )superr   itemssetattr)r   r   kv	__class__s       r   r   zFakeRootModule.__init__   sW    $$&& 	  	 DAqD!Q	  	 r   r   c                     dS )NzFakeRootModule(...)r   r   s    r   __repr__zFakeRootModule.__repr__  s    $$r   Nc                 \    |                                 D ]\  }}t          | ||           d S r   )r   r   )r   r   r   r   s       r   add_nn_moduleszFakeRootModule.add_nn_modules  s@    $$&& 	  	 DAqD!Q	  	 r   )r   r   r   r   dictr   torchnnModuler   r   r   __classcell__r   s   @r   r   r      s        11 4UX_(<#=            
%# % % % % c58?.B)C                  r   r   c                   \    e Zd ZdeddfdZdej        j        deej	                 de
fdZdS )WrapperBackendbackendr   Nc                     || _         d S r   )r   )r   r   s     r   r   zWrapperBackend.__init__  s    #*r   gmexample_inputsc                 x   t          |          | _        || _        t          j        | j                  }|                     ||          | _        | j        | j        | j        j        u r| j        j        S t          j	        s| j        S 	  | j        j        t          |           } | j        t          |           }t          ||          r| j        |                                  S t          d|            # t          $ r t                              d            w xY w# |                                  w xY w)Nzincorrect results of backend zerror in verify_correctness)r[   restorer   copydeepcopyr   	candidateforwardr+   verify_correctnessr]   rk   RuntimeError	Exceptionr   	exception)r   r   r   copy_gmcorrectresults         r   __call__zWrapperBackend.__call__  s1    ),,-((g~>>>!T^tw%F%F7?"( 	">!	%dgo|N'C'CDG#T^\.%A%ABF GV$$ &~ LLNNNN EtEEFFF 	 	 	MM7888	 LLNNNNs   
A	C: (C: :&D  D# #D9)r   r   r   r0   r   r   r   GraphModuler   r   r/   r   r   r   r   r   r   
  sn        +
 +t + + + +(&8<U\8J	     r   r   c                   6   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	<   ej        j        j        j        ed
<   ej        j        ed<   eej        j                 ed<   dZeed<   dZeed<   dZeed<   dZ ee         ed<   e!de"fd            Z#e!dej        j        fd            Ze!deej        j                 fd            Z$dS )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_deviceglobal_state_guard_guards_aotautograd_guardsFexportskip_guards_checkexport_constraintsN%name_of_builtins_dict_key_in_fglobalsr   c                 @    t          dt          |                      )Nz%shape_env shouldn't be accessed from )AssertionErrortyper   s    r   	shape_envz OutputGraphGuardsState.shape_envP  s    QT$ZZQQRRRr   c                     | j         S r   )r  r   s    r   r   zOutputGraphGuardsState.guardsT  s
    |r   c                     | j         S r   )r  r   s    r   aotautograd_guardsz)OutputGraphGuardsState.aotautograd_guardsX  s    ''r   )%r   r   r   r   Scoper   r   r   	overridesTorchFunctionModesetr   r   r   r   r   
_functorchpyfunctorchFuncTorchInterpreterr   device_C_dynamor   GlobalStateGuardr  	GuardsSetGuardEnvExprr  r   r  r  r  propertyr#   r  r  r   r   r   r   r   1  s          #EO$EFFFFF####'S#X(>#????OOO5+7LMMMMU\****(/@@@@]$$$$em89999 FD#t###$$$$;?)8C=???S8 S S S XS /    X (D)C$D ( ( ( X( ( (r   r   c                   z   e Zd ZU dZdZeed<    ee          Z	ee
ef         ed<    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<   dS )StackLocalsMetadatazf
    Stores metadata for a frame's stack and locals for the purposes of building resume functions
    r   	num_stackdefault_factorylocals_namesstack_null_idxeslocals_null_keys.stack_ctx_argsstack_ctx_idxes_origlocals_ctx_argsN)r   r   r   r   r   r   r   dc_fieldr   r#  r   r   r$  r%  r&  tupler   r'  r(  r   r   r   r  r  ]  s2          Is#+8$ $ $L$sCx.    #+(4"@"@"@d3i@@@"*(4"@"@"@d3i@@@8@QU8V8V8VNDsE#s(O345VVV&.ht&D&D&D$s)DDD9ARV9W9W9WOT%U38_ 456WWWWWr   r  c                       e Zd ZU  ee          Zeeef         ed<    ee          Z	eee
eef         f         ed<   ej        j        j        Zeej        j        j        ej        j        j        f         ed<   dS )ExportMetaDatar!  graph_input_idx_to_local_sourceoutput_return_typeout_specN)r   r   r   r)  r   r-  r   r   r   r.  r*  r   r   r   utils_pytree
_LEAF_SPECr/  r   TreeSpecLeafSpecr   r   r   r,  r,  o  s         
 :BRV9W9W9W#T#v+%6WWW
 6>Xd5S5S5SS%S/12SSS 	& eEK'0%+2E2NNO     r   r,  r   c                 N    | d         }t          |t                    s|j        }|S )N__builtins__)
isinstancer   __dict__)r   
f_builtinss     r   get_builtins_dictr:    s.     n-Jj$'' )(
r   c                   	    e Zd ZU dZeed<   deeef         de	e
         dddedee         d	ed
edededeej        j                 de	d         ddf fdZd}dZd}dZdefdZ	 d~dededeeej        j        f         fdZdej        j        fdZd}dZde	ee                  fdZde fdZ!de"def         deedf         defd Z#de"g ef         ddfd!Z$d}d"Z%e&dd$            Z'e&dd%            Z(defd&Z)e&dej        j*        fd'            Z+e+j,        d(ej        j*        ddfd)            Z+e&deeej        f         fd*            Z-e&deej.        ej/        f         fd+            Z0e&dee1j2        e3ej        j        d,f         f         fd-            Z4ded.edej        j        fd/Z5ded.edej        j.        fd0Z6ded.eddfd1Z7e8j9        d2e	e:         d3d#de;ej<        ddf         fd4            Z=e&dd5            Z>e&dej?        j@        fd6            ZAe&deBfd7            ZCe&dejD        jE        fd8            ZFe&deeef         fd9            ZGe&deejD        jH                 fd:            ZI	 dd;e	eeee"def         ef         f                  ddfd<ZJdd>ZKdd?ZLe&dd@            ZMdeNfdAZOdefdBZPdefdCZQdDede3ejR        jS        ef         fdEZTddGedefdHZUdGeddfdIZVeWdJedefdK            ZXdLedMedej        fdNZYdOe3ejR        jS        ej/        ef         dJedPedefdQZZd=ddeee[         ee\e\f         f         fdRZ]d=ddSeNdeee         e^f         fdTZ_	 	 dd=ddWe`dXedSeNdee^         f
dYZad=ddZee         d[ebddfd\Zcd}d]ZdddWed.eddfd_Zedeeee3eNef                  f         fd`ZfdGedefdaZge8j9        defdb            Zhd}dcZid=dddee         deejdee[         fdfZke&deej.                 fdg            Zle&deem         fdh            Zndiejo        djee/         depfdkZqdiejo        djee/         depfdlZrdeeej        jo        f         fdmZsdGednej        jo        defdoZtdeej/                 fdpZud}dqZvd}drZwd}dsZxdee[         ddfdtZydGed(eddfduZzded(edefdvZ{ded(edefdwZ|d}dxZ}dye"ejo        gdf         ddfdzZ~d{ej        j.        defd|Z xZS )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_fnroot_txr}   r  r  frame_stater   r   f_coder   packager|   r   Nc                 r   t                                          |||
t                      i t          j        j        j        t          j        j        	                                t          j
        j        j        t          j        j        j        p't          j        j        j                                        t          j                                        g            t+          | |          g| _        i | _        || _        || _        || _        g | _        t9          t:                    | _        t                      | _        |	j         |	j!        |	j"        d| _#        tI                      | _%        g | _&        tO          | j&        tP          j)        tP          j*        tP          j+        | j#                  }dd l,mc m(} |-                    d          5  t          j.        /                    || j        rdnd| j        	          }d d d            n# 1 swxY w Y   ta          |          | _1        | j1        j2        3                    |	           ti          j5                    | _6        | 7                                 tq          j9        tt                    | _;        i | _<        t{          |           | _>        t                      | _@        t          jB                    | _C        t          |          | _E        g | _F        d| _G        g | _H        || _I        || _J        || _K        i | _L        g | _M        g | _N        d| _O        i | _P        t          j        Q                                | _R        d| _S        t          i           | _T        t          i           | _U        | V                                 i | _W        g | _X        d | _Y        g | _Z        i | _[        d | _\        d | _]        | ^                                | __        t          ja                    | _b        | c                                | _d        i | _e        t                      | _g        d S )
N)r   r   r   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	co_fieldsr   F(fake_tensor_allow_unsafe_data_ptr_accessT)r  allow_non_fake_inputsr  )hr   r   r  r   autograd
forward_ad_current_levelr  r  #retrieve_all_functorch_interpretersr0  _deviceCURRENT_DEVICEr  convert_frameinitial_global_stater  r   r  r  r  SubgraphTracertracersinput_source_to_varr  r  rA  cleanup_hooksnext_compile_id_counter
compile_idinstalled_globalsrF  rG  rH  rM  rD   region_trackerrI  r#   r+   capture_scalar_outputs capture_dynamic_output_shape_opsrL  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_sourcerI   r=  r   variable_tracker_cache	itertoolscountunique_var_idr   r>  output_instructions	timestampregister_finalizer_fnsr?  r@  rC  source_to_user_stacks_current_txcleanupsshould_exitunspec_variable_map_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_fglobalsr  
contextlib	ExitStackcompiler_trace_stack+maybe_install_saved_tensors_hooks_subgraphs"saved_tensors_hooks_subgraph_namesimport_sourcesr,  export_metadata)r   r>  r?  r@  r  r  rA  r   r   rB  r   rC  r  _config	fake_moder   s                  r   r   zOutputGraph.__init__  sA    	%"uu*,~0?"-9]]__ ;.=$}:O  :x&7799M++-- " 	 	
 	
 	
  'tv>>>? CE "4&68#$788+.55
 ~!-$3
 
 122 13 ,!'!>+1+R8>8jn
 
 
	" 	211111111]]E]JJ 	 	)88#.2k&Dddu{	 9  I	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 0>i/H/H(//777-// 	 	  """ #D)) 	' BD!'-- ';&<&<#&_..,0,>,>68   OQ# 2= RT"<>+- KM  ,18+S+S+U+U( 27. >AWW ADB! 	    AC-  	 '+ 57 ;=>B!15 2244 	2 %/$8$:$:! <<>> 	/
 /1-//s   1HHHc                 X    | j                             t          dd                     d S )Nbytecode_tracingTlog_pt2_compile_event)r  enter_contextr`   r   s    r   mark_bytecode_tracing_startz'OutputGraph.mark_bytecode_tracing_startm  s?    !//"&*  	
 	
 	
 	
 	
r   c                 8    | j                                          d S r   )r  closer   s    r   mark_bytecode_tracing_stopz&OutputGraph.mark_bytecode_tracing_stopu  s    !'')))))r   c                 V    t          | j                  }|                     d|          S )N__builtins_dict__)r:  r   install_global)r   r9  s     r   r  z-OutputGraph.install_builtins_dict_in_fglobalsx  s)    &t'899
""#6
CCCr   hookprefixc                     | t          | j                   }|| j        vsJ || j        |<   ||                                 fS r   )lenr  get_backward_state_proxy)r   r  r  names       r   add_backward_state_hookz#OutputGraph.add_backward_state_hook|  sW     4#d122444.....$(D!T224444r   c                 X   | j         | j        rt          dddg            t                      }| j                            dt          |          |t                                | _         t                      | j         j	        j
        d<   |                                 | _        | 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r   grapharg)r  r  rA   r   root_tracercreate_graph_inputr  rM   rn   nodemetanew_varr  )r   example_values     r   r  z$OutputGraph.get_backward_state_proxy  s    $,{  D U	    *OOM(,(8(K(K']##*,,	 )L ) )D% ?T>U>UD%*/
;&*llnnD#((r   c                 *   | j                             t                                          t          j                             | j                             t                                          t          j                             | j                             t                                          t          j                             | j                             t                                          t          j	                             | j                             t                                          t          j
                             t          j        j                                        }|C| j                             t                                          t          j                             t          j        j        j        sE| j                             t                                          t          j                             d S d S r   )r   r   rV   
make_guardrE   	SHAPE_ENVrP   DETERMINISTIC_ALGORITHMS	GRAD_MODEDEFAULT_DEVICETORCH_FUNCTION_STATEr   r  r  peek_interpreter_stackFUNCTORCH_STACK_MATCHr  compiled_autogradin_compiled_autograd_regionAUTOGRAD_SAVED_TENSORS_HOOKS)r   cis     r   rl  zOutputGraph.init_ambient_guards  s    	((33L4JKKLLL**<+PQQ	
 	
 	
 	)++66|7MNNOOO)++66|7RSSTTT**<+LMM	
 	
 	
 X 7799>KOO!##..|/QRR   }.J 	KOO!##.. =     	 	r   c                    t           j        j        j        rd S t           j        j        j        j        }t           j        j        j        j        } |            } ||          sd S |\  }}| 	                    dt           j
                            | j        |j                            }| 	                    dt           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_autogradr0  top_saved_tensors_hooks"saved_tensors_hooks_are_inlineableinstall_subgraphr   r   r   r~   )r   	get_hooksare_inline_hookshookspack_gm	unpack_gmpack_subgraph_nameunpack_subgraph_names           r   r  z7OutputGraph.maybe_install_saved_tensors_hooks_subgraphs  s   =*F 	4$28P	*0S 	 	&& 	4 #!22&H  '-@@
 
  $44(H  )/BB 
  
 "%AAAAA#'EEEEE"$899r   c                     t          | j        | j        | j        | 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  r  r  r   r  r  r   s    r   dump_guards_statezOutputGraph.dump_guards_state  sp    %(*&*&D#6*.*L!2.#6262\;#6K $ 7"4
 
 
 	
r   r   .r   c                     | }|                                  }t          | j                                      fd                               t          t          j        j        |                     	                    t          |          d                               |           | j                                                                       t          |          }t!          j        | j        ||          }|                                }t'          j                    j        j                            |           |S )z]
        call fn(*args) before the graph runs and turn the result into a fake input.
        c                  D                          j        j                  S r   )load_import_fromr   r   )cgr   s   r   <lambda>z3OutputGraph.synthetic_graph_input.<locals>.<lambda>  s!    B''  r   F)r  r;   r@  add_push_nullforeachmapr.   ConstantVariablecreatecall_functionr  storer  extendget_instructionsrW   rm   buildrealizer   getguards_contextdynamo_guardsremove_guards_with_source)r   r   r   r  varnamer   r   r  s    `     @r   synthetic_graph_inputz!OutputGraph.synthetic_graph_input  s6    D	,,..t|$$
    	
 	
 	
 	

3y18$??@@@
TE***
%%b&9&9&;&;<<<%g.. &t|]FKK!!+9SS	
 	
 	
 r   c                 :    | j                             |           d S r   )r\  r   )r   r   s     r   add_cleanup_hookzOutputGraph.add_cleanup_hook  s    !!"%%%%%r   c                 z    t          | j                  D ]} |             | j                                         d S r   )reversedr\  r   )r   r  s     r   call_cleanup_hookszOutputGraph.call_cleanup_hooks  sD    T/00 	 	DDFFFF  """""r   rY  c                     | j         d         S Nr   rZ  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*   )r  rZ  r   s    r   is_root_tracerzOutputGraph.is_root_tracer  s    4<  A%%r   c                     | j         j        S r   r  r~   r   s    r   r~   zOutputGraph.graph  s    "((r   r   c                     || j         _        d S r   r  )r   r   s     r   r~   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6r   c                     | j         j        S r   )r  real_value_cacher   s    r   r  zOutputGraph.real_value_cache$  s    "33r   	LazyProxyc                     | j         j        S r   )r  bound_symbolsr   s    r   r  zOutputGraph.bound_symbols(  s    "00r   r   c                 &     | j         j        |i |S r   )r  create_proxyr   r   r   s      r   r  zOutputGraph.create_proxy2  s    /t"/@@@@r   c                 &     | j         j        |i |S r   )r  create_noder  s      r   r  zOutputGraph.create_node5      .t".????r   c                 &     | j         j        |i |S r   )r  remove_noder  s      r   r
  zOutputGraph.remove_node8  r  r   source_targetprior_tracerc              #     K   t                      }	 |r|j        | j        u sJ |                                 |r|n!t	          | | j        || j        j                  }| j                            |           |V  |                    d d d            | j        	                                 d S # |                    d d d            | j        	                                 w xY w)N)parentr  rE  )
r<   r  r  	__enter__rY  rE  rZ  r   __exit__pop)r   r  r  new_scope_ctxtracers        r   	subtracerzOutputGraph.subtracer;  s      ())	 B#*d.AAAAA##%%%  #."/"1;	    L'''LLL""4t444L ""4t444Ls   A*B. .2C c                     | S r   r   r   s    r   outputzOutputGraph.outputU  s    r   c                 6    | j         j        J | j         j        S r   )rh  r  r   s    r   r  zOutputGraph.fake_modeY  s     #-999#--r   c                 f    | j         j        J | j         j        j        J | j         j        j        S r   )rh  r  r  r   s    r   r  zOutputGraph.shape_env^  s8    #-999#-7CCC#-77r   c                 $    | j         j        j        S r   )rh  r  r  r   s    r   r   zOutputGraph.guardsd  s    #2@@r   c                 $    | j         j        j        S r   )rh  module_contextr   r   s    r   r   zOutputGraph.nn_modulesh  s    #2==r   c                 $    | j         j        j        S r   )rh  r  r  r   s    r   r  zOutputGraph.aotautograd_guardsl  s    #2EEr   outc                    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
<   dS )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   rh  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   r  r(  s      r   r  zOutputGraph.save_global_statep  sQ    eHS#X.4556 ? )8E
 
 ).(>@U@W@W'X^$ e8&AA%f--,
'(
 e8%@@%e,,0
+,
 e6??$V,,.
)*
 e6>>$U++.
)*
 ,+--2
-...r   txc                 :    | j                             |           d S r   )ry  r   )r   r3  s     r   push_txzOutputGraph.push_tx  s    #####r   c                 4    | j                                         S r   )ry  r  r   s    r   pop_txzOutputGraph.pop_tx  s    ##%%%r   c                 8    | j         s| j        n| j         d         S r  )ry  r@  r   s    r   
current_txzOutputGraph.current_tx  s    #'#3Mt||9I"9MMr   c                 *    t          | j                  S r   )r^   r~   r   s    r   r^   zOutputGraph.count_calls  s    4:&&&r   c                 V    t          t          | j        j                            dk    S r  )r  r   r~   nodesr   s    r   is_empty_graphzOutputGraph.is_empty_graph  s"    4
())**a//r   c                 P    t          d | j        j        D                       dk    S )Nc                 (    g | ]}|j         d k    |S )r  opr   xs     r   r   z+OutputGraph.has_outputs.<locals>.<listcomp>  s$    DDD!1483C3CA3C3C3Cr   r   )r  r~   r<  r   s    r   has_outputszOutputGraph.has_outputs  s)    DDtz/DDDEEIIr   keysc                     |sJ | j         }|                    d          D ]0}t          |t                    r	||         } t	          ||          }1|S N.)r   splitr7  r   getattr)r   rE  objr   s       r   get_submodulezOutputGraph.get_submodule  s\    tBF/C 	& 	&A#t$$ &!fc1oo
r   tmpr  c                     t          | j        d                   }	 | dt          | j                   }||vr| j        dxx         |fz  cc<   |S 6)Nco_varnamesT_)r  r>  r]  rt  )r   r  existingvars       r   r  zOutputGraph.new_var  sp    t(788	66D!34466C(""!-000SF:000
		r   c                 T    || j         d         vr| j         dxx         |fz  cc<   dS dS )z/Ensure self.code_options.co_names contains nameco_namesN)r>  )r   r  s     r   update_co_nameszOutputGraph.update_co_names  sD    t(444j)))dW4))))) 54r   namesc                     d                     t          t          |                     }t          j        dd|          }t          j        dd|          }t          j        dd|          }|r|d                                         sd|z   }|S )	NrP  z^[GL]\['?(.*?)'?\]$z\1z	\[(\d+)\]z_\g<1>z[^a-zA-Z0-9]r   sub)joinr  r   rerX  isalpha)rV  r  s     r   module_key_namezOutputGraph.module_key_name  s     xxC((v,eT::vlIt44vosD11 	 47??,, 	 4<Dr   attr_prefix
attr_valuec                     t          || j                  }|| j        |<   |                     d|di           }t          |j        |           |S )Nget_attrr   )rd   r   r  rl   r  )r   r]  r^  	attr_nameproxys        r   %register_static_attr_and_return_proxyz1OutputGraph.register_static_attr_and_return_proxy  sS     (T_EE	 &0	"!!*iR@@%*j111r   targetoptionsc                 b   
 t           j                  rt          j         j        fi S t                    dv sJ d         t          t                    rJ t          t          j	                  r; j
                                         s j        dt          dt          f fd}nt          t          j        j                  r{t          t          j        j                  sJ rBt!                              t$          j                             dt          dt          ffd}nhdt          dt          ffd}nRt          t          j        t          j        f          rdt          dt          f fd}ndt          dt          f fd} j                                        D ]\  }}|u r ||          c S t1          j        | 
t5          
 j         j                  
 j        
<   t          t          j        j                  r{d	t          dd f
 fd
}t9          d          r%                                D ]\  }}	 ||           t9          d          r%                                D ]\  }}	 ||            |
          S )Nr   
module_keyr   c           	         j         J j         | <   j        J j        j        j        v rj        j        j                 S t	                    dk    rBt          t                    s-t                              t          j
                             n;t                    s,t                              t          j                             t          j                            d| di           fdi}j        j        j                            |          }d|                                j        j        vsJ t'                    |                                j        j        d<   |S )Nguardedr`  r   r  tensor_dict)rp  r@  r  r=  rc   r7  rT   rF   r  rE   ID_MATCHrQ   TENSOR_MATCHrq   r  track_object_existingas_proxyr  r  rZ   )rg  r   re  r   r   rd  r  s     r   	wrap_namez6OutputGraph.register_attr_or_module.<locals>.wrap_name  s{   0<<<8>)*5 |///T\0===<.;FCC*622i??
-I I? "&"3"3L4I"J"JKKKK+F33 P!&"3"3L4M"N"NOOO"L''
JBGG  #) 	  \(5KKFTVWW$BKKMM,>,CCCCC9Mf9U9U"'6	r   c                 <    t          t                    | fi S r   )ru   r  rg  re  rd  s    r   ro  z6OutputGraph.register_attr_or_module.<locals>.wrap_name#  s$    +DLL*fXXPWXXXr   c                 (    t          j        fi S r   )r.   UnspecializedNNModuleVariablerq  s    r   ro  z6OutputGraph.register_attr_or_module.<locals>.wrap_name+  s    $B6UUWUUUr   c           	      Z    t          j                            d| di           fdiS )Nr`  r   sym_num)rw   r  r  )rg  re  r   rd  s    r   ro  z6OutputGraph.register_attr_or_module.<locals>.wrap_name6  sK    &-%%j*b"EE  # 	  r   c                     j                             |            j        | <   t          j        t          |                     S )N)source_name)r  rU  r   rm   r  rN   )rg  r   rd  s    r   ro  z6OutputGraph.register_attr_or_module.<locals>.wrap_nameA  sO    ++J77706!*-&,"z:::  r   	leaf_namec                     j         J t          |           } d|  }|j         |<   t          t                    r6| j        t
                              |                                          <   d S d S rG  )rp  rU   r7  rS   r  r<  r\  r  )rx  
new_sourcenew_namer  r   r   s      r   register_leaf_namez?OutputGraph.register_attr_or_module.<locals>.register_leaf_nameT  s    0<<<.vyAA
"00Y006@)(3fk22 " " 9#33JOO4E4EFF  " "r   _parameters_buffers)rG   r  rm   r  r9  r   r7  rU   r   r   r  r  r  r   r   r   rF   r  rE   	NN_MODULESymIntSymFloatr   r   r<  r\  rd   r   hasattrnamed_parametersnamed_buffers)r   rd  rV  re  ro  r   r   r|  rx  rP  r  r   r  s   `` `      @@@r   register_attr_or_modulez#OutputGraph.register_attr_or_module  s     44 	M #(&LLGLLLw--7"""""f&788888fel++ \	(F&&(( * )c o           B 00 +	feho66666 Vf//0FGGHHHY# Y/ Y Y Y Y Y Y Y YV# V/ V V V V V V V V u~ >?? 	c o         c o        O))++ 	$ 	$DAqF{{ y||###  *E2"4$:KLL &feho.. 	2"c "d " " " " " " " " v}-- 2$*$;$;$=$= 2 2LIq&&y1111vz** 2$*$8$8$:$: 2 2LIq&&y1111yr   c                 0   | j                             d          }t          |          }|sg i fS g }i }g |j        |j                                        | j        j                                        }|r|	                                }t          |t                    r't          |j        t                    sJ ||j        z  }R|| j        j        vst          |j        t                    rLt          |j        t"                    r2t          |j        j        t&                    r|j        j        j        |v s|j        j        j        }||vrg ||<   ||                             |           |i }	i }
| j        D ]}t          |j        t                    r(t          |j        t&                    r|j        j        |v sF|j        j        }|| j        d         v sJ ||         D ]}|j        |
v r|j        j        }||	vrn|                     | d          }||	|<   |                    t9          d|          t;          |          t9          d          t9          d|          g           |j        }t'          |	|                   |
|<   ||
fS )Nr   rO  _ref	LOAD_FASTargvalBINARY_SUBSCR
STORE_FAST)r   r  rb   stacksymbolic_localsvaluesr=  store_attr_mutationsrE  r  r7  rs   r   r   mutation_typerH   r   rO   baserS   
local_namer   	graphargs_exampler>  indexr  r  r4   r5   )r   r3  maybe_gmstolen_list_namesalias_instsneeds_aliasqueuerC  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_listsi  s    #''///99  	r6M8:
X
&&((
 388::
  	/		A!-.. !!'400000  T.CCC!!/3LMM D qx77 D qx}k::	 D
 HM,0AAA(-2K+--+-K($++A...+  	/. 35> %	P %	PC3<..sz;77 J)[88 
-I 1- @@@@@ + P P8111 8>7**!%$***" "J )3GH%&&.{9MMM-h77.??.|JOOO	   X
1<WX=N1O1O":..5P@ ...r   
stack_popsc                    |                                  g }t                      }t          |j                  D ]\  }}t          j                            |           t          |j                  |z
  |k    r|                    |           Vt          |t                    r|j                            |           n|                    |           t          |t                    rc|j        dnt          |j                  }|j                            t          |          dz
  |f           |j                            |           t          |          |_        t%          |                                |                                z             }|j                                        D ],\  }	}
t          |
j        t0                    r|
j        j        |	k    r
|| j        u r:|	|v r?t6          j        dk    r<t:                              t          |
          r|j                            |	           n"t:                              t          |
          rJ t          |j                   |j         |	<   t          |
t                    r9|
j        dnt          |
j                  }|j!                            |	|f           |                    |
           .||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
            - meta: locations of NULLs and ContextWrappingVariables in the stack/locals
                (ignores the top `stack_pops` values on the stack)
        Nr   r*   )      )"prune_dead_localsr  	enumerater  r.   LazyVariableTrackerrealize_allr  r   r7  rt   r$  rr   target_valuesr*  r&  r'  r   r  cellvarsfreevarsr  r   r   rS   r  r@  sysversion_infor  __instancecheck__r%  r#  r(  )r   r3  r  stack_valuesr  ir   r  cell_and_freevarsr   r   s              r   _get_stack_values_to_restorez(OutputGraph._get_stack_values_to_restore  s   " 	"$$ ""(++ 	4 	4HAu)55e<<<28}}q J..##E***%.. +%,,Q////##E***%!899 4-5BB5AT;U;U  #**C,=,=,A=+QRRR)00333\** =>> &,,.. !	# !	#DAq 18[11H'1,,$,&&%%%7** )),:: )00333
  11,BBBBB#&t'8#9#9Da !455 @/1BBuQ_7M7M  $++Q,>???""""T!!r   Fr   r   partial_convertc                    | j         J t          j        s| j         |u sJ |                                  || _        || _        d| _        t                              d|           g }t          j
        dk    r| j         j        D ]v}|j        dk    rB|                    t          dt          | j         j        d                                        O|                    t#          j        |                     wg }g }|}	|	t%          d |	j        D                       sJ |                     |	|	|u r|nd	          \  }
}|                    |
           |                    |           t+          |	j                  D ]}|                    |	|j        
           |	j        }	|	| j                            |           |                     |           | j        r| j        r
J d            |                     | j                   |                     | j                   \  }}|                     |           |                                  d | j         !                                D             }tE          |          }ddl#m$} t          | j%                  d	k    rg }| &                    d          | _'         |tQ          | j%                  d          }| )                    d|          }tU          | j         ||          }|+                    |,                    |d                     |+                    t[          d	d                     |                    |.                    | j'                             |                     |           d |D             }d}d}| j         |u r	|rt%          d |D                       rt%          d |D                       rt          t_          |                    t          |          k    r| j        0                                r|j1        s| j2        s|d         j3        ss|d         j4        sf|                     g | 5                    |tm          t+          |                    |          t          dt          |                               n| &                    d          }tU          | j         |||          }| 7                    |||           i }|j8        !                                D ],\  }}|dk    r!ts          |tt          tv          f          sd||<   -tU          | j         ||||          }| 7                    |||           tx          j=        j        j>        r|rt          |          dk    r|d	         }t          |tx          j=        j@        jA                  r|jB        tx          j=        jC        jD        u rx|j!        d	         }|j!        d         } t          |tx          j=        j@        jE                  sJ i }!|jF        G                                D ]9}"t          |"tx          j=        jH        jI                  sJ |"jJ        }#|"jK        |!|#<   :t          |j!                  D ]\  }$}||!v rd|!|         f| jM        jN        |$<   !|jO        6t          |jO        dd          x}%r|%jQ        rd|jO        f| jM        jN        |$<   ^t          |tx          j=        j@        jR                  r$d|S                                f| jM        jN        |$<   d| d |$ sJ | S                                | jM        _T        g }&t          | jV                  d	k    st          |jF                  d	k    r|&+                    | 5                    ||W                                |                     t          |jF                  d	k    r+|&                    |.                    |                     d}n7|&                    t          d!                     n| X                                 |                     |&|Y                                z              |                     t          d"t          |          |d	         jZ        z
            g           d	}'d	}(t          |          D ]\  })}t          |j[                  }*|)d	k    r
|*|jZ        z  }*|*d	k    r5|                     t          d"d	          gt          d#                     nK|(|*z  }(|                     t                      gt          |'|(          t          d#                     |'|*z  }'|)t          |          dz
  k    r$tU          | j                   }+i },| j         j_        !                                D ]~\  }-}.t          |.jO        tv                    r_|.jO        j`        |-k    rO|+a                    |+b                    |-                     t          |j[                  t          |,          z   |,|-<   |                     |+Y                                t          d"t          |,                    t          d$d#          gz              |j[        c                    |,           |                     t          d!          t          d"t          |                    gt          |d	         jZ        dz                        |r'|r%|                     t          d%|&          g           | j        rd	d'lemf}/ g }0| j        g                                D ]t}1t          |1d(          rb|1ji        }2t          |2t          t          f          r?t          |1t                    rt          |1jm        |/          s|0                    |1           ud) |0D             }3t          |3          rt          jo        d*|3            |S )+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r     COPY_FREE_VARSco_freevars)r  c              3   >   K   | ]}|                                 V  d S r   )can_restore)r   blocks     r   	<genexpr>z/OutputGraph.compile_subgraph.<locals>.<genexpr>W  s.      KKuu((**KKKKKKr   r   )is_graph_breakz)export does not support pregraph_bytecodec                 4    i | ]\  }}|t          |          S r   )rj   )r   r  mods      r   
<dictcomp>z0OutputGraph.compile_subgraph.<locals>.<dictcomp>|  s3     
 
 
+44D/#&&
 
 
r   r*   disablerandom_valuesz.do not trace into Dynamo rng recovery functionr   __gen_rand_values)r  Fc                     g | ]	}|D ]}|
S r   r   )r   valsvals      r   r   z0OutputGraph.compile_subgraph.<locals>.<listcomp>  s%    NNNTNN#SNNNNr   c              3      K   | ]X}t          |t          t          t          f           o0t          |t                    o|                                t          u  V  Yd S r   )r7  ry   rv   rz   rw   python_typefloat)r   r   s     r   r  z/OutputGraph.compile_subgraph.<locals>.<genexpr>  s          3,4   V $A77TAMMOOu<TU     r   c              3   @   K   | ]}t          |t                    V  d S r   )r7  rx   rB  s     r   r  z/OutputGraph.compile_subgraph.<locals>.<genexpr>  s,      MMaJq.11MMMMMMr   r  UNPACK_SEQUENCE	graph_out)tempvarsr  r  inputconstantzEncountered unrecognized type z at output POP_TOP
BUILD_LIST   LIST_EXTENDDELETE_FASTr  )_ExportModuleSpecTrackerDictr  c                 6    g | ]}t          |j                  S r   )rK   r   )r   rR  s     r   r   z0OutputGraph.compile_subgraph.<locals>.<listcomp>  s0          7:&sz22     r   zWhile exporting, we found certain side effects happened in the model.forward. Here are the list of potential sources you can double check: )pr@  r+   nested_graph_breaksr  r  compile_subgraph_reasonr{  r   debugr  r  prefix_instsopnamer   r4   r  r>  r   allblock_stackr  r  exitr   r  r=  prune_dead_object_newadd_output_instructionsr  r  r  cleanup_graphr   r   r   
decoratorsr  r   r  r  r   r  r;   r  load_function_namer2   create_storer  is_emptydebug_localsr  r$  r%  compile_and_call_fx_graphr   codegen_suffixusesrg   rW   rS   r   r  log_graph_in_out_metadatar7  r.   NamedTupleVariable	tuple_clsfunctional_exportExportTracerOutputListVariablegraph_outputsr  codegenGraphOutputEntryvariabler  r  r  r.  r   rJ  is_inputr  as_python_constantr/  r^   r~   graph_output_varsrun_compiler_collectiver  r   r#  r7   r3   r1   r  r  append_outputcreate_loadr   r6   torch.export._tracer  _get_modified_varsr  r  rH   rJ   r{   r   warningswarn)4r   r3  r   r  r  r  install_stack_valuesall_stack_locals_metascur_txr  r  r  r  r  nn_modules_proxiesrootr  random_calls_instructionsrand_fnrand_fn_namer  stack_values_flatstored_graph_output_vargraph_output_varpass1r  r  rs  pass2r   flat_returnsr/  vt_to_graph_out_idxr   r  idxr   r  	start_idxend_idxr  n_valsroot_cgunmodified_locals_namesr   r   r  potential_side_effectsrR  mut_typeside_effect_refss4                                                       r   compile_subgraphzOutputGraph.compile_subgraph  s   , |''') 	&<2%%%% 	''))).'-$		-v666 +-w&&1 	9 	9;"222 ''*, #DL$=m$L M M      !''	$8888
 !#68 KK8JKKKKKKKK!%!B!Bfll

" "L$ ##L111"))$/// "&"455 F F

6&2D
EEEE]F  " 	//333$$\222* 	
t{ 	
 	
7	
 	
; 	$$T%;<<<*.*N*NL+
 +
'' 	$$[111
 
8<8M8M8O8O
 
 
 011'''''' t !!A%%(*%%)\\/%B%BD"g'(9::G  G  ../BGLLLd7I  G &,,**<>>   &,,-A!U-K-KLLL%,,$$T%;<<   (()BCCC$ ON-=NNN"' LB!    +      MM;LMMMMM  C)**++s3D/E/EEE!**,, FO F ' F +2.?	 F
 +2.? F ((33D*;!<!<==t 
 ''8cBS>T>TUUU     $||K88  #5	  E $5u=== H#j..00 ) )
U199VC2F1T%U%U9$(HSM !#5  E $5u=== $>.R%.R )**a//&q)r5=#:#MNN(R}6IJ J $&8A;L!x{H%$em&=&J     GI'!&!4!;!;!=!= D D)%1F1WXXXXX49N8=+H55#,\-?#@#@ Y YR!444 + 3B 7LD0CCHH
 I1+229fd+K+K!K 2 & 2
 !( "	LD0CCHH (EM,C,TUU Y * " 5 5 7 7LD0CCHH
 $YB#X#XSV#X#XXX#XX4<4O4O4Q4QD(1F4:&&!++s53F/G/G1/L/L222u7N7N7P7PRVWW   u*++q00MM%"4"45E"F"FGGG.2++MM"4Y"?"?@@@@ ,,...((%2H2H2J2J)JKKK 	$$" -..1G1J1TT  	
 	
 	
$ 	 !788 -	B -	BGAt*++FAvv$.({{,,*<Q???$Q    6!,,&((,Y@@ %Q   V#	 C.//!333#DL11:<' L8>>@@  DAq!!(K88 QX=PTU=U=U--g.A.A!.D.DEEE589J5K5Kc3O O 6/2 ,,,,..*(c2I.J.J   +=a@@@	 	 	 !(()@AAA 	$$"9--"<S9O5P5PQQQ 4Q7AAEFF	
 	
 	
   	 7 	((#M:JKKKL   ; 	HHHHHH%'"(;;== ? ?300 ?"0H! #<>S"T  	? 's,CDD? *396R S S? 399#>>>   >T      #$$ gTdg g  
 &%r   r  r  c                    | j                                        | j        r~| j        rJ | j                                        D ][\  }} |           | j        J                                         | j                                                 |           \| j         	                               |j
        D ]\  }                    fd           |D ]} |                               t          t          |          d                                         t          d          g                               ||j                    | j                                        d S )Nc                                  S r   r   )r  	debug_vars   r   r  z,OutputGraph.codegen_suffix.<locals>.<lambda>  s    RR	]] r   Fr  )value_from_source)r=  codegen_save_tempvarsr  r  r   r  r  r  
store_attrcodegen_hooksr  r  extend_outputr2   r  r4   restore_stackcodegen_update_mutated)	r   r3  r  r  r  r  r   r  r   s	      `    @r   r  zOutputGraph.codegen_suffix  s    	//333 	${""?!06688 $ $	c3.:::  0G!H!HIIId####''+++  " 	> 	>OIt22222333  31#d))UCCDDD0;;<====
RYGGG0044444r   c                 l   | j         sJ t          | j        j                  }|D ]}|j                            dd           t          j                    }t          ||dd                   D ]\  }}|j	        t          j
        j        u rt          |j                  | fk    r|j        s|j        d         }|j	        t          j
        j        u rbt          |j                  | fk    rH|j        sA|j        d         }| j                            |           | j                            |           dS )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   )r{  r   r~   r<  r  r  r   r*  ziprd  r  _set_grad_enabledr*  r   _erased
erase_node)r   r<  r  r  node1node2s         r   r  zOutputGraph.cleanup_graph  sA    TZ%&& 	6 	6DIMM.5555,..uQRRy11 	1 	1LE5 :::%*%%l*:)<<< =  %z!}LEH$>>>ej)),.>-@@@!M A $):a=LJ))%000J))%000	1 	1r   r  c                 V   | j         sdS t          j        j        j        r%t          j        j                            d          t                              d           t          j	        
                    dd fd           | j                                          d| _         dS )zE
        Do not save this output graph to the CompilePackage
        NzDetected a package bypass: %sartifactc                      dddS )Nprecompile_cache_bypassjsonr  encodingr   r   r   r   r  z,OutputGraph.bypass_package.<locals>.<lambda>  s    1"! ! r   c                      di S )N_reasonr   )r   r   s   r   r  z,OutputGraph.bypass_package.<locals>.<lambda>  s    6    r   metadata_fn
payload_fn)rC  r   r  r+   strict_precompiler,   PackageErrorr   warning_loggingtrace_structuredbypass_current_entry)r   r   r   s    ``r   bypass_packagezOutputGraph.bypass_package  s     | 	F=1 	-#00/   	3V<<<''      	( 	
 	
 	
 	))+++r   c                     i }| j         j        D ]d}|j                            dd           }t	          |t
          j        j                  r(|                                }d |D             ||j	        <   e|S )Nr  c                 Z    g | ](}t          |t                    r|nt          |          )S r   )r7  r   repr)r   ss     r   r   z:OutputGraph.get_graph_sizes_structured.<locals>.<listcomp>  s1    !U!U!U1z!S'9'9"F!!tAww!U!U!Ur   )
r~   r<  r  r  r7  r   rf  r   sizer  )r   retr  r  rG  s        r   get_graph_sizes_structuredz&OutputGraph.get_graph_sizes_structured  s|    02J$ 	V 	VD IMM/4@@M-):)EFF V$))++!U!UPT!U!U!UDI
r   c                 0   d}|d| dz  }| j         j        D ]}|j                            dd           }t	          |t
          j        j                  r|                                }||j	         dt          |           dz  }g }d}|D ]j}t	          |t                    r|                    |           -t	          |t
          j                  r"d}|                    |j        j                   i n|r||j	         d	t          |           dz  }|S )
NzTRACED GRAPH TENSOR SIZES
z===== z =====
r  z: 
FTz (concrete): )r~   r<  r  r  r7  r   rf  r   rG  r  r*  r   r   r  r  hint)	r   r  graph_sizes_strr  r  rG  concrete_size
has_symintszs	            r   get_graph_sizeszOutputGraph.get_graph_sizes  sF   72D2222J$ 	 	D IMM/4@@M-):)EFF $))++di#B#B5;;#B#B#BB ""
  B!"c** %,,R0000#B55 %)
%,,RW\::::! '#yOOu]7K7KOOO r   c              #   x  K   | j         j                                        }i }|                     |           	 | j         j                            |           dV  | j         j                            t          |                     dS # | j         j                            t          |                     w xY w)zj
        Momentarily restores the global state to what it was prior to tracing the current output
        )r  N)rh  r'  copy_graphstater  restore_graphstater   )r   prior_global_statecurrent_global_states      r   restore_global_statez OutputGraph.restore_global_state.  s      
 "1@PPRR<>#7888	 /BBCUVVVEEE  /BB,-ABB    D /BB,-ABB   s   #B .B9c                    | j         }|J |j        xj        j        }t                              dj                   t          j        	                    dd fd           |j
        }t          |          dk    s0J d                    d                    |                                t          |                                                              |                                t          j                                        z            5  t)          d	d
          5  d g|                                z  }t-          j        |j        |           |_        d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |j                                         t4          j        d S d S )Nzcompiler_collective %sr1  c                      dddS )Ncompiler_collectivestringr5  r   r   r   r   r  z5OutputGraph.run_compiler_collective.<locals>.<lambda>H  s    1 (% % r   c                  6     j                                         S r   )local_staterender)dss   r   r  z5OutputGraph.run_compiler_collective.<locals>.<lambda>L  s    2>#8#8#:#: r   r9  r*   z&Expect only one device type but got {}+rZ  Tr  )group)r@  distributed_state
all_states
compile_pgr   infor]  r   r?  r@  _device_typesr  formatrY  r=   r  r  rankacceleratordevice_countr`   rG  distall_gather_objectspeculation_logr   r,    CompileCollectiveRestartAnalysis)r   r3  rd  device_typesrc  r_  s        @r   r  z#OutputGraph.run_compiler_collective@  s<   \~~~&&B38MJHH-r~>>>N++  ;::: ,    &3L|$$)))8??@V@VWW *)) ))9)9););<<CCOO%%(9(F(F(H(HH + + 2$OOO	+ + *.1B1B(B
&z2>TTTT *+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $$&&&667 438M8Ms6   F-<E5)F5E9	9F<E9	=FFFrvr	  c                 6    t           j        j                                        5  ddlm}  j        sJ                                   t           j	                  dk    r!t          |          dk    rg cddd           S t          dd          }t          |t                    sJ t          |t                    sJ                      dd j                            t%          d	 |D                                 fi           }                                 }|                    |            j                            ||           t,          j        sI                                  t3          t5          j        | j	                   j        | j        
                                             t           j	                  }t>          d         dxx         |z  cc<                                       j!        "                                 tG          | j	                   j$        r) j$        D ]!}	tK          |	tM          ||	                     " j'        D ]}
 |
           tQ          )                                d          B *                    dt           j+        j        j,        -                    ddd                      j.        |_/         j0        _0         j1        2                                j3        d<    j4        j3        d<   |j3        d<   tj          6                    dto          |ddd                     t           j8        9                    d fdfd            :                                  j;        j<        }|J  j        shddl=m>c m} |?                    d          5  t           j@        A                    |j                  }ddd           n# 1 swxY w Y   | j;        _<         B                                5   C                     D                                          ddd           n# 1 swxY w Y   ddlEmF} t          |          s*t          tM          dd          |          rPjG        dk    rEt          |          rnjH        }|I                    |           t          |          s|jJ         j.         j.        K                    |            |d           t>          d         d!xx         dz  cc<   |j        J |j        jL        x}r-g i d"  jM        D             }|D ]}|N                    |jO                  }t          jQ        |jR                  S                                }t                      }t          jV        ||jR        |g          }t          6                    d#|           X                    t          jZ        |fd$|          |f           t           j+                            d           d%t          d&t          d't          f fd(            } \                    ||           n \                    |            j]        J t           j]                  }t           jM                  D ]\  }}|jO         j`        ja        |<   |b                    |           |c                                cddd           S # 1 swxY w Y   dS ))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  r   N__compiled_fnT)	with_uuidr  c              3   >   K   | ]}|                                 V  d S r   )rn  rB  s     r   r  z8OutputGraph.compile_and_call_fx_graph.<locals>.<genexpr>~  s*      5O5Oqajjll5O5O5O5O5O5Or   )r  statscalls_capturedzfGraph contains named parameters: either inline_inbuilt_nn_modules=False or there are static addresses.Fprint_outputinclude_strideinclude_device)inline_builtin_nn_modulesr   r  rk  
backend_id%s)ry  rz  coloreddynamo_output_graphc                  0    d                                  iS )Nsizes)rI  r   s   r   r  z7OutputGraph.compile_and_call_fx_graph.<locals>.<lambda>  s    $"A"A"C"CD r   c                  4                          ddd          S )NFTrw  )print_readable)r   s   r   r  z7OutputGraph.compile_and_call_fx_graph.<locals>.<lambda>  s#    2#4#4!&tD $5 $ $ r   )r;  rN  )r  )_LazyGraphModule__self___lazy_forwardz"do not trace Dynamo-compiled graphr  unique_graphsc                     g | ]	}|j         
S r   r  )r   as     r   r   z9OutputGraph.compile_and_call_fx_graph.<locals>.<listcomp>  s    <<<18<<<r   z:Compiling backend specialized graph with specialization=%sc                 $     |||                    S r   r   )r  r   check_fns      r   r  z7OutputGraph.compile_and_call_fx_graph.<locals>.<lambda>  s    XX$(IF" F" r   r   r   r   c                     	D ]\  }} ||           r|v r |         | i |c S j                             |j        |j                  5  |j        d<   t          |           }t          j                  5                      |          |<   d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y    |         | i |c S  | i |S )Nspecialization)	r  patch_source_specializationr   r  r  r   r   rh  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 Y0.#8D>> Y-1EEE'K';N'K%)("-3(" (" !" !" !" "&!K!K . 5~7N" " 	& 	& =K(8 9?CDzz%,T-A%B%B !& !&(,(?(?N(S(S %9$H!& !& !& !& !& !& !& !& !& !& !& !& !& !& !&	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& $H#7#G#XQW#X#XXXX#Y$ ';7777s6   .B8;B!B8!B%%B8(B%)B88B<	?B<	)dr   r  r   clear_framer  r  r{  r  r^   r~   r  r9   r7  r   r   r  r  
create_argr*  
dedup_passr   _maybe_preserve_original_metar+   do_not_emit_runtime_assertsremove_unused_get_attr_nodesr&   r   r   r  r  remove_unused_graphargsr_   &remove_tensorify_specialized_graphargsr  r   r   r  r   rJ  rw  r]  
parametersrB  r  inline_inbuilt_nn_modulesr  rC  _backend_idr  r  r   r  rk  graph_code_logr  rh   r?  r@  r  rh  r  rd  r  re  rf  rg  rW  r  r   torch.fx._lazy_graph_moduler  r   r  force_recompiler   add_backend_idspecializationsr  r  r   inspect	getsourcer  stripRootGuardManagerr   LAMBDA_GUARDr   r   r+  r,  r   install_global_unsafer@  r;   r  r  r-  make_call_generated_coder  )r   r3  rp  r	  r  r  output_nodesub_gmsncallssubgraph_nameregister_finalizerold_fake_moder  backend_fake_moder  lazy_gmr  sourcesr  source_indexcheck_fn_sourceunused_root_guard_managerr  r  r  r  r  r  r   r  r  s   `                          @@@@r   r  z%OutputGraph.compile_and_call_fx_graph`  s!	    ])5577 V	) V	)++++++####((***4:&&!++B1V	) V	) V	) V	) V	) V	) V	) V	) _===Db$'''''dN33333**$//5O5OB5O5O5O0O0OPPR	 K oo''G(((==b+NNN5  11333/N444N;	    ((*** ,,FW.///69///77999 !'')))#D$*55B
 6 M%)%L M MMBwt]/K/KLLLL&*&A ' '"""2&&&&BMMOOT**6 ##|.3m.B.\((%*4PT )   $    |'!%)-)EB&5::<< G67 ,0+ABG'($(BGL!  &"T$PT     N++%DDDD    ,    ##%%% 0:M ,,,; C999999999]]E]RR  (-(9(H(H"/"9 )I ) )%               2C$.**,, Q Q"55b$:M:M:O:OPPQ Q Q Q Q Q Q Q Q Q Q Q Q Q Q EDDDDD+'788 27;
DAACSTT2(O;; "+/?@@.KK$-  !00999!+/?@@ 2")/K|'++D+>>>!'$H  K Wo...!3... *666"/"9"II ;>(*%SU$<<T^<<<&5  N#*==1F#G#GL&-&78O&P&P&V&V&X&XO0@0B0B-%21&/()   H IIT'  
 *00%-;C !" !" !" !-	  +
 
 
 
 &&.R&SS8 8s 8s 8 8 8 8 8 8 8 8 8 TS8. **41EFFFF **4===<+++4<((B%dn55 W WSLOJ$DSII''---&&((mV	) V	) V	) V	) V	) V	) V	) V	) V	) V	) V	) V	) V	) V	) V	) V	) V	) V	)sb   A\M\&O9-\9O=	=\ O=	#\$)Q\Q	\ Q	!J \\\c                 8    | j                             d          S )Nplaceholderr@  )r~   
find_nodesr   s    r   placeholderszOutputGraph.placeholdersE  s    z$$$666r   c                 $    d | j         D             S )Nc                 (    g | ]}|j         d          S )r  r  )r   r  s     r   r   z)OutputGraph.graphargs.<locals>.<listcomp>K  s    DDD$	*%DDDr   )r  r   s    r   r  zOutputGraph.graphargsI  s    DD$2CDDDDr   r   r   c                     t          dddddd          5  |                     ||          cd d d            S # 1 swxY w Y   d S )NOutputGraph.call_user_compilerbackend_compileTcompile_aot_autograd'aot_autograd_cumulative_compile_time_us)
phase_namer  log_waitcounterwaitcounter_name_overridedynamo_compile_column_us)r`   _call_user_compiler)r   r   r   s      r   r  zOutputGraph.call_user_compilerM  s     ,("& &<%N
 
 
 	@ 	@ ++B??	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@s   9= =c                    | j         J d}g }|j        j        D ]0}|j        dv r|dz  }|j        dk    r|                    |           1t          |           |D ]+}t          |d          s|j        d         }|j        |_	        ,| 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            n,# t,          t.          f$ r  t0          $ r}| j        r@t5          | j         |t7          j                                                  |j                  d t?          || j         j!        dd| dtE          |           d| j         #                                 d| dtE          |           ddg           Y d }~ndd }~wtH          $ r}|d }~wtJ          $ rE}t5          | j         |t7          j                                                  |j                  d d }~ww xY wtM          ddi | j'        |tQ          |j        j                  tQ          |          d           |
S )Nr   r  call_methodcall_moduler*   r  _dynamo_sourcer  r   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?  r~   r<  rA  r   rf   r  r  r   r  rp  _param_name_to_sourcerx  _source_to_user_stacksr   r   r-   INFOr+   r   r   callabler   r   r?   r  r>   r  currentframewith_traceback__traceback__rB   r@  rB  r   format_frame_summaryr@   r   r   rM  r  )r   r   r   totr  r  plr  r  r?  r  es               r   r  zOutputGraph._call_user_compilerZ  sb    +++HN 	* 	*DwIIIqw-''##D)))3 	/ 	/B2/00 /gj) %(J! $(#< $($>! t'44)D%%( 	
 	8LNN7<)Ld)L)LMMM*K( :,[99%+b.99KLNN7<)I4)I)IJJJK((OO*OOO(O.0@A 	 	 	0 	 	 	5 <+$a)=)?)?  .11t< *#4qDqqc!ffqqDLLmLmLoLoqqdddSVVdddC	 	 	 	 	 	 	 	 	  	 	 	 G 	8 	8 	8' !W%9%;%; nQ_--48	8
 	,.!"(.11"<00	  		
 		
 		
 s3   BE J 2B(HJ ,H..J ;A I;;J c                 P    t           j        j        j        rt	          |           S i S r   )r   r  r+   use_graph_deduplicationrC   r   s    r   r  zOutputGraph.dedup_pass  s%    =7 	,T222Ir   sub_gmc                     t          || j        d          }||_        d|_        |                     ||d            |S )NT)requires_suffixFr  )rd   r   r   torchdynamo_force_dynamicr  )r   r  r  	next_names       r   r  zOutputGraph.install_subgraph  sJ    'dotTTT	#+0( 	$$VYt$DDDr   c                 (    d | j         D             }|S )Nc                     g | ]	}|j         
S r   )example)r   r  s     r   r   z.OutputGraph.example_inputs.<locals>.<listcomp>  s    888##+888r   )r  )r   r   s     r   r   zOutputGraph.example_inputs  s    88888r   c                     t          | j                            d          d          D ]<}t          t	          |j                            dk    r|                     |           =d S )Nr`  r@  T)reverser   )sortedr~   r  r  r   usersr
  r   r  s     r   r  z(OutputGraph.remove_unused_get_attr_nodes  sm    4:00J0??NNN 	' 	'D4
##$$))  &&&	' 	'r   c                 >     j         sJ dt          j        j        dt          fd}dt          j        j        dt          fddt          j        dt          ffd}dd	lm} t          t           j
        j                            D ]}t          t          |j                            dk    r|j        d
k    sh|j        dk    r|j        t           j        u sJ|j        dk    r)|j        t$          j        u r ||j        d                   s ||          s ||          r                     |           dt          j        dt,          t.          j                 fd}dt          j        dd f fd}t3                      dt2          t.          j                 dt4          t$          j        t$          j        f         dd fdg } j        D ]} ||          d u}|r|j        s|                    |           /|j        s,t?          |j         d         tB                    s ||           b|j         d         }	t?          |	tB                    rt?          |j         d         j"        t$          j#                  r|j         d         j"        }
|j         d         j$        }t$          j%        j&        '                    |
          s}tQ          |
)                                          }|*                                D ]G}tW          |j,        |          }t[          j.        t$          j        t$          j        ffd|           Hv|	j/        |	j/        n|	j"        } |           |D ]4} ||          }|%|vr ||           0                    |           5d S )Nb_noder   c                     | du rdS t          | t          j                  sdS | j                            d          }|dS |du rdS t          |t
          j                  r|j                                        x}|S dS )NTFr  )	r7  r   Noder  r  r   SymBoolr  maybe_as_bool)r  brs      r   is_static_truez;OutputGraph.remove_unused_graphargs.<locals>.is_static_true  s    ~~tfbg.. u00AyuDyyt1em,,&..000Q= 5r   r  c                     ddl m} t          | t          t          t
          f          rdS t          | t          j                  r(t          | j        	                    d          |          S dS )Nr   SymTypesTr  F)
torch.fx.experimental.sym_noder  r7  r   r  r   r   r  r  r  )r  r  s     r   is_symnode_argz;OutputGraph.remove_unused_graphargs.<locals>.is_symnode_arg  sj    ??????!c5$/00 t!RW%% I!!&**_"="=xHHH5r   r  c                 .   ddl m} | j        dk    rdS t          | j                            d          |          sdS t          fd| j        D                       sdS t          fd| j        	                                D                       sdS dS )	Nr   r  r  Fr  c              3   .   K   | ]} |          V  d S r   r   r   r  r  s     r   r  zWOutputGraph.remove_unused_graphargs.<locals>.is_symnode_compute_node.<locals>.<genexpr>  s-      <<Q~~a((<<<<<<r   c              3   .   K   | ]} |          V  d S r   r   r  s     r   r  zWOutputGraph.remove_unused_graphargs.<locals>.is_symnode_compute_node.<locals>.<genexpr>  s-      GGQ~~a((GGGGGGr   T)
r  r  rA  r7  r  r  r  r   r   r  )r  r  r  s     r   is_symnode_compute_nodezDOutputGraph.remove_unused_graphargs.<locals>.is_symnode_compute_node  s    ??????w/))udimmO<<hGG u <<<<$)<<<<< uGGGG$+2D2D2F2FGGGGG u4r   r   )is_accessor_noder`  r  c                     | j         d         }|j        }t          |t          j                  r0t          |j        j        t          j                  r|j        j        S d S Nr  )	r  r  r7  r   r  r  exprsympySymbol)r  r  r  s      r   placeholder_binds_symbolzEOutputGraph.remove_unused_graphargs.<locals>.placeholder_binds_symbol	  sX    )J'CkG'5<00 )Z!5<6 6 ) |((4r   c                     t                               d| j        d         j                                                   | j        d=                     |            j                            | d            d S )NzREMOVE UNUSED GRAPHARG %sr  )r   r  r  r   r  r
  r  r  )r  r   s    r   remove_unusedz:OutputGraph.remove_unused_graphargs.<locals>.remove_unused	  sm    II149Z3H3O3T3T3V3VWWW 	*%T"""!%%dD11111r   used_symbolsfakec                 *    | t          |          z  } d S r   )r    )r  r  s     r   update_used_symbolsz@OutputGraph.remove_unused_graphargs.<locals>.update_used_symbols	  s     L...LLLr   r  c                      |           S r   r   )tr
  r  s    r   r  z5OutputGraph.remove_unused_graphargs.<locals>.<lambda>B	  s    .A.A,PQ.R.R r   )1r{  r   r  Argumentr   r  %torch.fx.experimental.symbolic_shapesr  r  r   r~   r<  r  r  rA  rd  operatorgetitemr   _checkr   r
  r   r  r  r  r   r  r   r  r   r7  r  rn   r  ScriptObjectexample_strong_ref_libraryfake_class_registrytracing_with_realr   __obj_flatten__rE  rJ  wrapped_objpytreetree_map_onlyfake_tensorremove)r   r  r  r  r  r  r  recheck_placeholdersbinds_symbolr  real_script_objfake_script_obj	flat_dictattrfake_attr_valr  symbolr  r
  r  s   `                @@@r   r  z#OutputGraph.remove_unused_graphargs  s_    	27#3 	 	 	 	 	&	bg. 	4 	 	 	 		"' 	d 	 	 	 	 	 	" 	KJJJJJT$*"23344 	+ 	+D4
##$$))Gz))?22t{hFV7V7V?22 K5<77*N49Q<88 8 /.t44 8 ('--	 8 $$T***	27 	x7M 	 	 	 		2 	2D 	2 	2 	2 	2 	2 	2 +.%%	/el+	/38u|9S3T	/	/ 	/ 	/ 	/
  "% $	< $	<D33D99EL !<z 6(//555z <*Ij)+@+ + < "M$'''' )J/C!#'<== ! !$)J"7"?ASTT !*.)J*?*G*.)J*?*R$~ASS+    " )-_-L-L-N-N(O(OI(1(8(8 " "07$3$?1" 1" !' 4%*\5<$@$R$R$R$R$R$1!" !" !" !"
 !+.?+FCK  ('d;;;; ) 	0 	0D--d33F!--!M$'''' !''///	0 	0r   c                 <   ddl m} | j        j        D ]}|j                            d          }t          |t                    r|j        t          |j        j
        j        d          rt          d |j        D                       r|                    |j        j
        j        j                  rht!          |j                  D ]>}|                    t%          |j                             |                     |           ?|                     |           	d S )Nr   )TensorifyStater  r  c              3   ,   K   | ]}|j         d k    V  dS )itemN)rd  )r   us     r   r  zEOutputGraph.remove_tensorify_specialized_graphargs.<locals>.<genexpr>l	  s)      ??qF*??????r   )torch._dynamo.symbolic_convertr&  r~   r<  r  r  r7  r   	item_memor  r  _exprr  r  should_specializer  r   replace_all_uses_withr!   r
  )r   r&  r  r  r)  s        r   r  z2OutputGraph.remove_tensorify_specialized_graphargsU	  s.    	BAAAAAJ$ 	' 	'D IMM/::M=*55'!+7M38>GG 8??DJ????? 8 #44!+06;  8 dj)) ( (A++L9P,Q,QRRR$$Q''''  &&&	' 	'r   c                 H    | j                             |           d| _        dS )zt
        We call this on the creation of a new compiled subgraph that is inserted
        before user code.
        TN)ru  r  r{  )r   r  s     r   r  z#OutputGraph.add_output_instructionsw	  s)    
 	 ''///r   c                     || j         vsJ | j                             |           | j                            t	          j        | j        ||                     dS )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)r`  r   rz  r   r\   r  r   )r   r  r   s      r   r  z!OutputGraph.install_global_unsafe	  s]     411111""4((([/0A4OOPPPPPr   c                     | dt          |           d| j         }|| j        v r|S |                     ||           |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.
        rP  _c)r   r_  r`  r  r   r  r   r  s       r   install_global_by_idz OutputGraph.install_global_by_id	  sU     992e9999994)))K""4///r   c                 P    t          |          }|                     ||           |S )z~
        Installs a global, generating a unique name for it.

        Returns the name of the newly installed global.
        )r9   r  r3  s       r   r  zOutputGraph.install_global	  s,       ""4///r   c                    d | _         | j                                         d | _        | j        j        D ]}d|j        v r|j        d= | j                                         | j                                         | j	                                         | j
                                         | j                                         | j                                         | j                                         | j                                         | j                                         | j                                         d S r   )r@  r   r   rp  r~   r<  r  r  r  r=  rq  rw  r  rh  r[  r|  r  r  s     r   cleanupzOutputGraph.cleanup	  s+    $(!J$ 	* 	*DTY&&Ij)##%%% &&(((!!!#))+++#))+++-33555""$$$ &&((( &&(((!!#####r   r  c                 :    | j                             |           d S r   )rw  r   )r   r  s     r   add_graph_finalizerzOutputGraph.add_graph_finalizer	  s"     	#**+=>>>>>r   r  c                 z    |j         dk    r|j        d         j        S |j         dk    sJ | j        |j                 S )z#Extract the non-fake example tensorr  r  r`  )rA  r  r  r   rd  r  s     r   example_value_from_input_nodez)OutputGraph.example_value_from_input_node	  sA    7m##9Z(00w*$$$$t{++r   r   )r  )r   rY  )r   r<  r   )r3  r}   r   N)r   r}   )rM  )Fr   )r  )r   r   r   r   rI   r   r   r   r   r   r0   r   r   r   r  r   r   r   r  r  r   r  r  r  rm   r*  r   Proxyr  r  rl  r  r   r  r	   r  r  r  r  r  r  r  Graphr~   setterr  r  r   r  r  r  r   r  r  r  r
  r  contextmanagerr%   r   Tracerr  r  rf  rg  r  r#   r  r  r  r   r   r  r  r  r5  r7  r9  r   r^   r=  rD  r   r   rL  r  rU  staticmethodr\  rc  r  r8   r   r  r  r  r   r  r;   r  r  rB  rI  rQ  rW  r  r   r  r  ro   r  r   r/   r  r  r  r  r   r  r  r  r  r  r4  r  r7  r9  r;  r   r   s   @r   r<  r<    s          J038nJ0 j)J0 -	J0
 J0 %%67J0 J0 J0 J0 J0 $((I#JJ0 *+J0 
J0 J0 J0 J0 J0 J0X
 
 
 
* * * *D3 D D D D
 4:5 5#5-05	sEHN"	#5 5 5 5)%(. ) ) ) )*   ::Xd3i=P : : : ::
#9 
 
 
 
(38$,1#s(O	   8&8BG#4 & & & & &# # # #
    X       X & & & & & )ux~ ) ) ) X) \*58> *d * * * \* 7T#rx-%8 7 7 7 X7 4$rw'<"= 4 4 4 X4 1tEL%8S2T$TU 1 1 1 X1A# A A A A A A@ @ @ @ @ @ @@ @ @ @ @ @ @ %f-=M	29dD(	)   2    X .5,; . . . X. 88 8 8 8 X8
 A/ A A A XA >DcN > > > X> FD)C$D F F F XF KO$
 $
DeHS#X,>,D&E!EFG$
	$
 $
 $
 $
L$ $ $ $& & & & N N N XN'S ' ' ' '0 0 0 0 0JT J J J J# %0D*E     C C    5C 5D 5 5 5 5
      \		,/			 	 	 	Kehou|S89K K 	K
 
K K K KZV/-V/	tK $vv~"66	7V/ V/ V/ V/pY"-Y";>Y"	tO$&99	:Y" Y" Y" Y"~ !&X& X&'X& #X& 	X&
 X& 
!	"X& X& X& X&t5'5 ?+5 	5
 
5 5 5 5<1 1 1 1< S      4Dd5c?6K1K,L    C C    2 c    "7 7 7 7@c)'c) !c) 	c)
 
k	c) c) c) c)J 7d27m 7 7 7 X7 E4> E E E XE@.@26v,@	@ @ @ @I.I26v,I	I I I IVDeh&:!:;    S %(2F 3    U\ 2    ' ' ' '
V0 V0 V0 V0p '  '  '  'D d;.?  D        
Q# 
Qc 
Qd 
Q 
Q 
Q 
Q3 s s    	S 	 	 	 	 	 	$ $ $ $*?"*BN+;T+A"B?	? ? ? ?
,%(- ,C , , , , , , , ,r   r<  c                   ^    e Zd ZU eed<   eed<   ee         ed<   	 d
dddee         ddfd	ZdS )DynamoTracerOutputerror_on_graph_breakis_tracing_resume_prologueoutput_graphNr  r}   errorr   c                 d    |j         | _         |j        | _        |r	d | _        d S |j        | _        d S r   )rD  rE  rF  r  )r   r  rG  s      r   r   zDynamoTracerOutput.__init__	  s@     %+$?!*0*K' 	. $D &Dr   r   )	r   r   r   r   r   r   r<  r   r   r   r   r   rC  rC  	  s{          $$$$;'''' KO. .1.:B3-.	. . . . . .r   rC  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.htmlrF  kindrd  r   r   c                     |dk    rd S dt           j        j        dd f fd}dt           j        j        dt          dd f fd}t	          |t           j        j                  r7t           j        j        |j        v r ||           d S  ||d| d           d S t	          |t           j        j                  rSt          |
                                          }t          |          d	k    rMt          ||d
                   }t           j        j        |j        v r ||           d S  ||d| d           d S t           j        j                             j        ||fd          \  }}	 t          j        j        |j        g|R i |}	n7# t(          $ r*}
t+          ddt          |
          g            Y d }
~
nd }
~
ww xY wt          ||	          }t           j        j        |j        v r ||           d S  ||d| d|	 d           d S d S )Nr  rd  r   c                 R    | j         dv rd S j                            |            d S )N>   atenprimprims)	namespacer  r   )rd  rF  s    r   encountered_compliant_opz8check_pt2_compliant_op.<locals>.encountered_compliant_op	  s4    888F)--f55555r   r   c                     j                             |            t          j        r t	          dd|dz   t
          z   g            d S d S )Nz Encountered non-PT2-compliant opr   r  )r  r   r+   only_allow_pt2_compliant_opsrA   err_epilogue)rd  r   rF  s     r   encountered_non_compliant_opz<check_pt2_compliant_op.<locals>.encountered_non_compliant_op	  se    &**622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.)r   _ops
OpOverloadr   r7  Tagpt2_compliant_tagtagsOpOverloadPacketr*  	overloadsr  rJ  r  r0  get_fake_values_from_nodesr9  r  _jit_resolve_packet_qualified_op_namer   rA   )rF  rI  rd  r   r   rP  rU  r\  rA  overloadr  s   `          r   check_pt2_compliant_opra  	  s    6)> 64 6 6 6 6 6 6
UZ-B  QU       &%*/00 9&&+55$$V,,,F$$WFWWW	
 	
 	
 	&%*566 )&**,,--	 y>>Q1..By*bg55((,,,((/.4/ / /   F}*EE#dF^U
 
f
	x3),0  4: HH  	 	 	DFF	        	 VX&&9&"'11$$R(((((((&f & &3;& & &    I) )s   +F 
F? F::F?PRc            
       Z    e Zd Zdddeeef         dej        dej        ddf
dZde	fd	Z
dS )
r   r  rY  r   r   r   r   Nc                 >    || _         || _        || _        || _        d S r   )r  r   r   r   )r   r  r   r   r   s        r   r   zLazyProxy.__init__2
  s$     	r   c                 0     | j         | j        i | j        S r   )r   r   r   r   s    r   r   zLazyProxy.__call__>
  s    tw	1T[111r   )r   r   r   r	   rb  rc  r   r   r   r   r   r   r   r   r   r   1
  s        
 
 QTN
 v	

 (
 

 
 
 
2# 2 2 2 2 2 2r   r   c                       e Zd ZdZ	 	 	 d*ddded          dedee         d	df
 fd
Zdddej	        d	dfdZ
	 	 	 d+dededededee         dee         deeej	        gej        f                  d	ej        f fdZ	 	 	 	 d,dededededee         dee         d	ej	        f fdZdej	        d	dfdZ	 	 d-dededededee         d	ej        fdZdej        d	eeej        f         fdZd ed	efd!Zded"eeej        j        f         d	dfd#Zdeej        ej        f         d$ee         d	dfd%Zd&ej        d	eej                 fd'Z d	e!fd(Z"d	e#fd)Z$ xZ%S ).rY  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.
    NFrF  r<  r  rE  r  r   c                    t                                                       t          j        |          | _        t
          j                                        | _        || _	        i | _
        i | _        || _        || _        i | _        i | _        d | _        d| _        d| _        d| _        d| _        |
|j        dz   nd| _        d | _        d | _        d | _        d | _        | j        g | _        n/| j        j        | j                            |          |fgz   | _        t9                      | _        g | _        t          j                    rtA          d          d S )NFr*   r   zSInference mode is supposed to be disabled during compilation. Please open an issue.)!r   r   weakrefrb  rF  r   r   r=  r~   rE  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   rF  r  rE  r  r   s        r   r   zSubgraphTracer.__init__J
  sy    	#M,77X^^%%
 # 9; =? * :< TV ,1(
 490
 =B9 ,1(:@:L 2Q 6 6RS26GK 37!
 ;.0D  #';#>**=99=IB $D 
 -7LL 8:)*,, 	e  	 	r   r3  r}   r  c                 @   | j         r| j        r| j        r|j        j        }d }|#| j                            || j        z
  d           }|Q| j         |         }t          j        j        D ]}||v r||         |j	        |<   d|v r|d         |j	        d<   d S d S d S d S d S d S )Nstack_trace)
rr  rs  rt  current_instructionstarts_liner  r   rb  _COPY_META_FIELDSr  )r   r3  r  linenonode_idxr  r   s          r   r  z,SubgraphTracer._maybe_preserve_original_meta
  s     	C(	C )	C
 +7FH!377T66  #)(3X7 7 7E}}+/;	%( D((/3M/BDIm,,,#	C 	C 	C 	C 	C 	C $#
 )(r   rI  rd  r   r   r  	type_exprproxy_factory_fnc           	      	   | j         bt          j        ||f          \  }}	g }
|D ],}|                     |          }|
                    |           -t          j        |
|	          \  }}t                                          ||||||          | j        j	        }t          j        dk    r|dv r|j        | j        uryj        rj        j        f|j        |                    j        j                  dt$          ffd}t&                              dt+          |                     | _        d}|j        | j        ur t/          j        |j                                      dd	                       }t5          |t6          j        j                  r@d
}d |j        j        D             | _         |j!        | _"        |j#        j$        j%        | _&        nd | _         d | _"        d | _&        |j'        }|r!|(                                j)        j*        d<   |dv r%| j+        j)        j,        fgz   j)        j*        d<   n|dk    r| j         t[          dd| j.         dg            | j+        j)        j,        t_          fdj)        j*        d         0                                D                       fgz   j)        j*        d<   | 1                    |j)                   |sdj)        j*        vr*|j'        }|r!|(                                j)        j*        d<   dj)        j*        vr|dv r%| j+        j)        j,        fgz   j)        j*        d<   n`|dk    rZ| j         t[          dddg            | j+        j)        j,        j)        j*        d                  d         fgz   j)        j*        d<   dj)        j*        vrg }|rN|2                                s'|                    |3                                           ti          |dd           }|N|5                                 tl          j7        8                    |          9                                }d:                    |          j)        _;        t6          j<        j=        j>        st6          j<        j=        j?        r/| j        j@        A                    | j        j	        j)                   S )Nr  r  )r  r   c                  r    t                                                    } dj        j         d d|  S )NzTRACE FX call z from rK  )ra   rstripr  r  )linecur_instheaderrp  tx_codes    r   get_trace_call_log_strz;SubgraphTracer.create_proxy.<locals>.get_trace_call_log_str  s@    5gxHHOOQQDPBGLPPPP$PPPr   r}  Forig_graphmodulec                      d S r   r   r   r   r   r  z-SubgraphTracer.create_proxy.<locals>.<lambda>  s    D r   Tc                     g | ]	}|j         
S r   r  )r   nds     r   r   z/SubgraphTracer.create_proxy.<locals>.<listcomp>  s'     & & & "BG& & &r   nn_module_stack>   r  r  ru  r  z4Invoking an nn.Module inside a higher order operatorzHigher order op name: zThis is not supported.r  c              3   f   K   | ]+\  }\  }}|                     d           d         k    '|V  ,dS )@r   N)rI  )r   r   rP  tyrd  s       r   r  z.SubgraphTracer.create_proxy.<locals>.<genexpr>;  sP        &Aw2773<<?f44 4444 r   z2Invoking an nn.Module inside a HigherOrderOperatorr  r*   r{  r  )Br  r  tree_flatten#maybe_lift_tracked_freevar_to_inputr   tree_unflattenr   r  rF  r9  r  r  r|  rk  	positionsr  rB  get_line_of_code_headerr   trace_call_logr  ri   rq  r:   get_contextr  r7  r   r   r   r~   r<  rr  _lineno_maprs  r   __code__rH  rt  r  r   r  r  ru  r  rA   r  r]  r   r  is_co_filename_from_nn_modulesframe_summaryrJ  r  r   StackSummary	from_listrg  rY  r{  r  r+   r  track_nodes_for_deduplicationra  
track_node)r   rI  rd  r   r   r  r  r  	flat_args	tree_specnew_flat_argsr  maybe_new_argr3  r  is_retracingorig_graphmodule_mayber  frame_summariesmsgsr  r  rp  r  r   s     `                 @@@@r   r  zSubgraphTracer.create_proxy
  s   V ;"#)#6f~#F#F IyM  4 4 $ H H M M$$]3333!0	JJLD&WW!!
 
 ) w&&4 4
 ,
 ,

 -H..&2&-9)338;M;T3UUQ Q Q Q Q Q Q Q Q Q $$T:6L+M+MNNN!) 9DN**&\%=bi%H%H%L%L"LL& & & &" 0%(2FGG 1#& &&<&B&H& & &" ,B+M(*2;J )) &*"+/(,0), 	E.=.B.B.D.DBGL*+333.2.Bv&F /BGL*++ ]""{& RIT5GII 8	    /3.BGL    *,',7H*I*O*O*Q*Q    	F 	/BGL*+ 	**2rw777 	 44"$"4" M6E6J6J6L6LBGL!23 44;;;6:6Jv.N 7BGL!233 ]**{.($X$&(@"$	    7;6JGLGL):;FCAFN 7BGL!23 ,,<>O 1 88:: ?#**2+;+;+=+=>>>R400  1 ##%%% )33ODDKKMMD"$''$--BG M 8	}#A	 ,77!,bg   	r   rA  c                    t          | j        ||||           | j        Pt          j        |i |}|D ]<}t          |t          j        j                  s"|j	        | j	        k    s
J d            =t                                          ||||||          }	| j        j        |	j        d<   | j                            |	j                   |	S )Nz2create_node using arg not from this SubgraphTracerr)  )ra  rF  r  r  arg_tree_leavesr7  r   r   r  r~   r   r  rv  r  rw  r   r  )r   rA  rd  r   r   r  r  r  r  r  r   s             r   r  zSubgraphTracer.create_nodey  s     	t0"fdFKKK;".???I   !#ux}55 yDJ...H /... ww""2vtVT9MM*.*;*E	&'TY'''r   c                    t          |j                  dk    rg }|j                                        D ]K}|j        | j        k    r9|                    t          t          |j        j                                       L|D ]}|j                            |           | j                            |           | j	        
                    |j        d            d S r  )r  r  rE  r~   r  r  r   r<  r-  r  r  r  )r   r  user_graph_nodesuserother_graph_nodes        r   r
  zSubgraphTracer.remove_node  s    tz??Q46
)) N N :++ %++HT$*:J5K5K,L,LMMM$4 D D  &112BCCCC
d### $$TY55555r   r  beforer   c                    t          |t          j                  r| j                            |j                   t                              d|||                                nd|| j	        |           || j
        J d| d| d            | j        r`| j
        Y|J t          |d          sD| j        j                            |g                               t!          j                               t%          || j                  }| j        rkt+          t-          | j                            }| j        |         j        }|r| j                            |          }n5| j                            |          }n| j                            d           }|5  |                     d|d	i |
          }	t9          |	j        |           | j        r3|r1| j                                        \  }
}|	| j        |<   || j        |
<   n
|	| j        |<   | j                            |           | j        }t          j                                         }|s|st          |t          j                  r| !                    ||           nxt          |tD          tF          f          r\tI          |          D ]L\  }}t          |t          j                  s d }|rtK          ||d          }| !                    ||           Mt          |t          j&                  r8t          |j        j'        tP          j)                  r|	| j*        |j        j'        <   |	cd d d            S # 1 swxY w Y   d S )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_inputr  r   r  F)r  r  index_is_slice)+r7  r   r   rx  r   _versionr   r  r  rp  r  rE  rR   rF  rx  
setdefaultr   extract_stackrd   rw  r  r]  r  r  r~   inserting_beforeinserting_afterr  rl   popitemr   compileris_compiling_lift_basic_symbolsr   r*  r  rO   r  r  r  r  r  )r   r  r  r  r  r   	prev_namer  ctxrb  r   r   is_strict_exportis_non_strict_exportr  r  e_sources                    r   r  z!SubgraphTracer.create_graph_input  s    mU\22 	M-44]5KLLL		E#/FKKMMMX	
 	
 	
 >;**x4xxVcxxx +** > 	dk1%%%'FFF !7BB62NNUU"022   #4)9::# 	4Xd&>??@@I+I6;D 7j11$77j0066*--d33C D	 D	%%mT2rY%WWEej-888' 7F 7/7799116(../(++16(.
   &&&@  $~#(>#>#>#@#@ # >,@ >mU\:: >,,]FCCCCe}== > )- 8 8 
> 
>1)!U\:: %$#'! '4%+1U( ( (H 00H==== -66 D:"'< < D ?D"=#5#:;ID	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	s   F3MMMrb  c                    | j         
J d            |j        j        d         }t          |t          j                  r*|j        j        | j        v r| j        |j        j                 S || j        v r| j        |         S |j	        | j         k    r| j         
                    |           |j        j        d         }|                     |j        j        t          |          |          }|| j        |<   |S )NzIlift_tracked_freevar_to_input should not be called on root SubgraphTracerr  )r  r  r  r7  r   r  r  r  rj  r  lift_tracked_freevar_to_inputr  r  r  )r   rb  r  	new_proxys       r   r  z,SubgraphTracer.lift_tracked_freevar_to_input$  s    
 {&&W '&& 
8 }el33	?"'4+===%m&8&=>>
 D((('..
 <4;&&K55e<<<
8++JOT-00-
 
	 '0U#r   r  c                     t          |t          j        j                  s>t          |t                    r't	           fd|j        |j        |j        fD              S |S |j         k    r|S  	                    |          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   B   K   | ]}                     |          V  d S r   )r  )r   sub_argr   s     r   r  zESubgraphTracer.maybe_lift_tracked_freevar_to_input.<locals>.<genexpr>[  sE        # @@II     r   )
r7  r   r   r<  slicestartstopstepr  r  )r   r  s   ` r   r  z2SubgraphTracer.maybe_lift_tracked_freevar_to_inputN  s     #ux~.. 	
 #u%%    (+	38SX'F    
Z4J11#666r   e_proxyc                     j         t          t                    sJ dt          dt          f fd}dt          dt          dt          dt
          j        ffd}t          |t          j                  rt          |
                                          D ]\  }} ||          rxt                              d||j                   t          ||d	t          j        j        j        j        |fi t'          |          
          }                     ||           |                                } ||          rqt                              d|j                   t          ||d	t          j        j        j        fi t'          |          
          }                     ||           |j        t          j        u rt          |                                          D ]\  }} ||          rxt                              d||j                   t          ||d	t          j        j        j        j        |fi t'          |          
          }                     ||           nC|j        t          j        u rQ                     |                                                                |                                           n|j        t          j        t          j        hv rQ                     |                                                                 |!                                           no|j        t          j"        t          j#        hv rP                     |$                                                                |%                                           tM          |          rP|'                                \  }	}
|	D ]8}tQ          ||          }                     |tQ          |                     7d S d S t          |t          j)                  r# ||          r|j*        j+        }j,        |<   d S d S d S )NrF  r   c                     ddl m}  ||           o6t          | j        j        t
          j                  o| j        j        j        vS )Nr   )r"   )r  r"   r7  r  r  r  r  r  )rF  r"   r   s     r   	need_bindz8SubgraphTracer.track_produced_symints.<locals>.need_bind  sS    IIIIII A :qv{EL99:FKt'99r   r  r   r   c                 B   t          t                    r
             nt          t          j        j                  sJ j                            j                  5   j        |i |}t          |j        |            |cd d d            S # 1 swxY w Y   d S r   )
r7  r   r   r   r<  r~   r  r  r  rl   )r  r   r   rb  r  r  s       r   _proxy_with_example_valuezHSubgraphTracer.track_produced_symints.<locals>._proxy_with_example_value  s    
 $.gy#A#ANggiiiwGgux~66666--gl;;  ++T<V<<!%*m<<<                 s   #$BBBz=track_produced_symints %s for %s.size()[%s] at debug_level %sr  r  zCtrack_produced_symints %s for %s.storage_offset() at debug_level %sz?track_produced_symints %s for %s.stride()[%s] at debug_level %s)-r  r7  rY  r   r   r   r<  r   r   r  rG  r   r  rp  r   opsrL  sym_sizer   r  track_produced_symintsstorage_offsetsym_storage_offset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__rJ  r  r  r  r  )r   r  r  r  r  r  rF  
lazy_proxyr  attrsr  r"  inner_tr  r  s   ` `           @r   r  z%SubgraphTracer.track_produced_symintsn  s     &.11111	 	 	 	 	 	 	 	
	
	'*
	69
	X
	 
	 
	 
	 
	 
	 
	 mU\22 Q	5!-"4"4"6"677 ? ?19Q<< ?IIW*   "+1'	/3 !"&q''	" 	" 	"J //:>>>*99;;Ny(( H		Y"&	   '-"#IN5J">22	 	 	
 ++NJGGG#u}44%m&:&:&<&<== C CDAq y|| C		]#".   &/"5+!IN59$aL&*1gg	& 	& 	&
 33AzBBB'C* %)999++M,B,B,D,DgNNN++M,A,A,C,CWMMMM%%*:E<L)MMM++M,F,F,H,H'RRR++M,E,E,G,GQQQQ%%*:E<L)MMM++M,F,F,H,H'RRR++M,E,E,G,GQQQ,];; Q*==??
s! Q QD%mT::G//$9O9OPPPP	Q QQ Q u|44 	5y'' 5$).-4$T***	5 	55 5r   srcc           	      N    	 d	dt           t          t          j        f         dt          t
                   dt          dd f fd}t          |t          j                  rt          |
                                          D ]0\  }} |||t          |t          j        |          nd d           1|j        t          j        u rt          |                                          D ]0\  }} |||t          |t          j        |          nd d           1 ||                                |t          |t          j                  nd d           nC|j        t          j        u rQ                     |                                |                                |                                |           n|j        t          j        t          j        hv rQ                     |                                |                                |                                |           no|j        t          j        t          j        hv rP                     |                                |                                |                                |           tA          |          rT|!                                \  }}|D ]<}tE          ||          }	                     |	|tG          ||          nd            ;d S d S t          |t          j                  r |||           d S d S )
NFrF  r   r  r   c                 2   t          |           sd S t          | t          j                  sJ                     |           }t          |          dk    rd S j        ؉j                            | |           |D ]}j        j        |         }|j	        j
        d         }t          |t          j                  sJ                     t          |          t          |          |||          }t                              d|||                                ndj                   |j        |<   d S t          |          dk    sJ d| d|              |J d	|  d
|  d            t'          t)          |                    }                    t          |          t          |           | ||          }t                              d| ||                                ndj                   t+          || dd d          |j	        j
        d<   d S )Nr   r  )r  r   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"   r7  r   r  lookup_unbound_symbolsr  r  r  r  r  r  r  r   r  r   r  r  rp  rj  r]  iterro   )	rF  r   r  self_to_be_bounds0parent_proxyexample_valphr   s	           r   _lift_symbols_in_symintzCSubgraphTracer._lift_basic_symbols.<locals>._lift_symbols_in_symint  s   
 q>> a.....#::1==#$$)) {&//6:::* < <B#';#<R#@L"."3"8"IK%k5<@@@@@00B[))#%% 1  B IIN)/);AR(	   :<D(66#< <( +,,111bHXb b^_b b 211 ))l! l lWXl l l *))
 $/0011,,GGGG!! -   		J%+%7FKKMMM=N$	   ,4', $#, , ,Z(((r   T)r  )F)$r   r   r   r  r   r   r   r7  r   r  rG  rY   rX   SIZEr  r  r  STRIDEr  STORAGE_OFFSETr  r  r  r  r  r  r  r  r  r  r  r  r)   r  rJ  rL   )
r   r  r  r  r  rF  r  r  r"  r  s
   `         r   r  z"SubgraphTracer._lift_basic_symbols  s    !B	 B	S%,&'B	V$B	 B	 	B	 B	 B	 B	 B	 B	H mU\22 3	!-"4"4"6"677 	 	1'' ? -S.2EqIII!     #u}44%m&:&:&<&<== 	 	DAq++  # 1n6KQOOO!%#     ('!0022 ? -S.2OPPP!     %)999(()?)?)A)A3GGG(()>)>)@)@#FFFF%%*:E<L)MMM(()C)C)E)EsKKK(()B)B)D)DcJJJJ%%*:E<L)MMM(()C)C)E)EsKKK(()B)B)D)DcJJJ,];; *==??
s!  D%mT::G,,#/C!6!6!6t   	  
 u|44 	##    	 	r   rF  c                    |j         j        j        }t          |          dk    rg S g }|D ]}|| j        vr|                    |           !| j        |         }t          |t                    r |            }|| j        |<   t          |t          j	        j
                  r	|j        | u sJ d| d            t          |d           S )Nr   zThe proxy of symbol z" doesn't belong to current tracer.c                     | j         S r   )r  )rF  s    r   r  z7SubgraphTracer.lookup_unbound_symbols.<locals>.<lambda>  s     r   )r   )r  r  r    r  r  r   r7  r   r   r   r<  r  r  )r   rF  r    to_be_boundr  rb  s         r   r  z%SubgraphTracer.lookup_unbound_symbolsl  s    v{/|!!I 	 	B+++""2&&&&r*E%++ /)."2&eUX^44 9M9M9MMrMMM :N9MM9M k'7'78888r   c                    | j         }g g }| j        j        D ]d}|j        dk    rW|j        d         }t          |t          j                  r/|                    |j	                                       |           d d t          t          ||                    D             }t          |          r#fd|D             }d| }t          d|          S t          dd          S )	Nr  r  c                 *    g | ]\  }\  }}||k    |S r   r   )r   r  v1v2s       r   r   z5SubgraphTracer.has_input_mutation.<locals>.<listcomp>  s5     
 
 
8B Rxx	  xxr   c                      g | ]
}|         S r   r   )r   r  input_nodess     r   r   z5SubgraphTracer.has_input_mutation.<locals>.<listcomp>  s    DDD[^DDDr   zInput mutation detected at TFr  )rx  r~   r<  rA  r  r7  r   r   r   r  r  r*  r  r   )	r   input_versions_at_beginninginput_versions_at_endr  r  mutated_inputsmutated_nodesr   r  s	           @r   has_input_mutationz!SubgraphTracer.has_input_mutation  s   &*&G# "J$ 	 	Dw-'' $	/ :mU\:: -)001GHHH&&t,,,
 
(/1FGG   
 
 
 ~ 	+DDDD^DDDM???Cc***E2&&&r   c                 .  
 ddl m} t                      
| j        j        D ]}|j        dk    rw ||g          d         }t          |t          j                  rJt          |
                                          }|
v r d
|          d| }t          d|          c S |
|<    t                      | j                            d          d         }t          j        |j        d                   D ]}|r ||g          d         }t          |t                     rJ t          |t          j                  rJt          |
                                          }|v r d	|          d| }t          d|          c S ||<   
                                                                z  }t%          |          dk    rC
fd
|D             }	d                    d |	D                       }	d|	 }t          d|          S t          dd          S )Nr   )_collect_fake_inputsr  z*Input-to-input aliasing detected at nodes  and Tr  r@  z,Output-to-output aliasing detected at nodes c                 0    g | ]}|         |         fS r   r   )r   rF  input_storagesoutput_storagess     r   r   z/SubgraphTracer.has_aliasing.<locals>.<listcomp>  s5       <="OA$67  r   z, c                 "    g | ]\  }}| d | S )r  r   )r   r  os      r   r   z/SubgraphTracer.has_aliasing.<locals>.<listcomp>  s&     D D DDAqAA D D Dr   z+Input-to-output aliasing detected at nodes Fr  )torch._higher_order_ops.utilsr
  r   r~   r<  rA  r7  r   r   r'   _typed_storager   r  r  tree_leavesr   r   rE  r  rY  )r   r
  r  r  storager   	out_nodesout_nodeintersected_storagesaliasedr  r  s             @@r   r   zSubgraphTracer.has_aliasing  ss   FFFFFF>BffJ$ 	 	Dw-'' 4 4dV < <Q ?mU\:: 3,]-I-I-K-KLLG.00o>ZaKbooimoo+D#66666.2N7+?CvvJ))X)66q9	*9>!+<== 
	8 
	8H 	8 4 4hZ @ @ C%mT:::::mU\:: 8,]-I-I-K-KLLG/11v_]dMevvltvv+D#66666/7OG,-22447K7K7M7MM#$$q((    AU  G ii D DG D D DEEGIIICc***E2&&&r   )NFN)NNN)NNNN)FN)&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  r  r   r  r   r  r  r  r   r  r   r   r   r   s   @r   rY  rY  B
  s         .2*.Y Y#Y )*Y 	Y
  'Y 
Y Y Y Y Y YxC-C57WC	C C C C8 ##'DH{ {{ { 	{
 { sm{ C={ #8RWIrx,?#@A{ 
{ { { { { {B "#'   	
  sm C= 
     46 6D 6 6 6 66 #'x xx x 	x
 x  x 
x x x xv(X(	y"("	#( ( ( (T7s 7s 7 7 7 7@y5 y5+0EHN1J+Ky5	y5 y5 y5 y5x~"5<#=>~EMfEU~	~ ~ ~ ~D9 9el9K 9 9 9 9*'L ' ' ' ':*'l *' *' *' *' *' *' *' *'r   rY  )r   rm  r  r   r+  r  rr  r-   r  rZ  r  r   r  ri  collections.abcr   r   dataclassesr   r   r)  typesr   typingr   r	   r
   r   r   r   typing_extensionsr   r   r  torch._guardsr   torch._loggingtorch.distributeddistributedrk  torch.nntorch.utils._pytreer0  r1  r  r   r   torch._C._dynamor   torch._dynamo.excr   r   r   r   r   r   r   r   torch._subclasses.fake_tensorr   torch._utils_internalr   torch.export.dynamic_shapesr   r  r   %torch.fx.experimental._backward_stater   r  r    r!   r"   r#   r$   torch.fx.noder%   torch.fx.passes.runtime_assertr&    torch.multiprocessing.reductionsr'   torch.utils._ordered_setr(   torch.utils._python_dispatchr)   r  r+   r,   r   r.   backends.registryr/   r0   bytecode_transformationr1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r  r;   current_scope_idr<   device_interfacer=   r>   r?   r@   rA   rB   graph_deduplicationrC   graph_region_trackerrD   rE   rF   mutation_guardrG   r=  rH   rI   rJ   r   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   variables.baserm   variables.builderrn   ro   rp   rq   variables.ctx_managerrr   variables.listsrs   variables.miscrt   variables.nn_moduleru   variables.tensorrv   rw   rx   ry   variables.torch_functionrz   variables.user_definedr{   torch._dynamo.packager|   r*  r}   	getLoggerr   r   r?  getArtifactLoggergraph_tabular_logr  graph_sizes_logr  r  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   objectr  r   r  r,  r:  r<  rC  rT  ra  rs  r^  rb  rc  r   r@  rY  r   r   r   <module>rE     s   *                     				 



       / / / / / / / / 4 4 4 4 4 4 4 4       F F F F F F F F F F F F F F F F 0 0 0 0 0 0 0 0                       $ $ $ $ $ $ $ $ $         # # # # # # N N N N N N N N                5 4 4 4 4 4 0 0 0 0 0 0 9 9 9 9 9 9 : : : : : : ? ? ? ? ? ?              !           J J J J J J ; ; ; ; ; ; / / / / / / F F F F F F D D D D D D D D D D D D 5 5 5 5 5 5 5 5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 ' & & & & &       - - - - - - 6 6 6 6 6 6              ; : : : : : 4 4 4 4 4 4 / / / / / / / / 0 0 0 0 0 0 W W W W W W W W W W                                 "                                         * , + + + + +            ; : : : : : - - - - - - ( ( ( ( ( ( 1 1 1 1 1 1            C B B B B B ; ; ; ; ; ;  I444444HHHHHHg!!N44XwGG 11(LII.228]KK11(LII*  $        $       
 $       
       0 4c 4 4 4 4 - - - - - - - -# (2tCy=2I             UX_       ! ! ! ! ! ! ! !H 	S&[ (( (( (( (( (( (( (( ((V X X X X X X X X"         E d38n    (p , p , p , p , p ,( p , p , p ,fA. . . . . . . ."J HH%(H25H=@HJMH	H H H HV &io'' IcNNGCLL2 2 2 2 2 2 2 2"F' F' F' F' F'RY F' F' F' F' F'r   