
    9j                    	   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ZddlZddlZddlmZ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 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	l0m1Z1 dd
l2m3Z3m4Z4 ddl#m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: ddl;m<Z< ddl=m>Z> ddl?m@Z@ ddlAmBZB ddlCmDZD ddlEmFZF ddlGmHZH ddlImJZJmKZKmLZLmMZMmNZNmOZO ddlPmQZQ ddlRmSZS ddlTmUZU ddlVmWZW ddlXmYZYmZZZmZ[m\Z\ ddl]m^Z^m_Z_ ddl`maZambZbmcZcmdZdmeZemfZfmgZgmhZhmiZimjZjmkZk ddllmlZl ddlmmnZn ddlompZp ddlqmrZr dd lZmsZsmtZtmuZumvZvmwZw dd!lxmyZymzZz dd"l{m|Z| dd#l}m~Z~mZ dd$lmZ dd%l1mZmZ dd&lmZ dd'lmZmZmZ dd(lmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ dd)l+mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ dd*lmZmZmZmZ dd+lmZ dd,lmZmZ dd-lmZ dd.lmZ dd/lmZ dd0lmZmZmZ dd1lmZ dd2lmZ erdd3lmZ dd4lmZ dd5lmZ dd6lmZ dd7lmZ  ej                  eӫ      Ze$j                  j                  ed8      Ze$j                  j                  ed9      Ze$j                  j                  ed:      Ze$j                  j                  ed;      Ze1j                  Ze$j                  j                  j                  Ze$j                  j                  j                  Zd<ed=eeef   d>ed?ef   fd@Z edAB       G dC dD             Z edAB       G dE dF             Z	 dpdGeee$j^                  edz  f      dHee$j                  j                  j                     dz  d>ee$j                  j                  j                     fdIZej                  d>efdJ       Ze G dK dL             ZdMed>eg ee   f   fdNZ G dO dPe$j                  j                        Z G dQ dR      Zeeef   Ze G dS dT             Ze G dU dV             Ze G dW dX             Ze G dY dZ             Zd[ed>eeef   fd\Z G d] d^e      Z G d_ d`e      Z G da db      ZdcZddedeedfedgedhed>dfdiZ ej                          Z e dj      Z e!dk      Z G dl dm      Z G dn doe.j
                        Zy)qa  
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)Callable	GeneratorSequence)	dataclassfield)CodeType)AnycastOptionalTYPE_CHECKINGUnion)	ParamSpecTypeVar)fxTensor)guards)ShortenTracebackTensorifyScalarRestartAnalysis)CompileContext	CompileIdGlobalContextCheckpointStateSourcetracingTracingContext)FakeScriptObject)is_opaque_type)
FakeTensor)signpost_event)_ConstraintTarget)_make_graph_module)BackwardState)free_symbolsguard_scalaris_symbolicShapeEnvSpecializationuninteresting_files)Target)insert_deferred_runtime_asserts)
OrderedSet)is_traceable_wrapper_subclass   )configexclogging	variables)
CompiledFn
CompilerFn)create_binary_slicecreate_binary_subscrcreate_build_tuple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unimplemented_with_warning)has_user_objectsindex_to_bytecode_constructor)apply_graph_deduplication)#get_backend_override_for_compile_id+get_inductor_config_override_for_compile_id)GraphRegionTracker)GuardBuilderinstall_guard)is_dynamic_nn_module)AttributeMutationExistingSideEffectsValueMutationExisting)_get_source_debug_name
AttrSourceBackwardStateSourceConstantSourceDictGetItemSourceGetItemSourceGlobalStateSourceis_constant_sourceis_from_local_sourceLocalSourceNumpyTensorSourceParamBufferSourceShapeEnvSourceSyntheticLocalSourceTensorPropertyTensorPropertySource)_extract_tensor_dictcheckpoint_paramsCleanupHookclone_inputscompilation_time_metricscount_callscountersdynamo_timedget_chromium_event_logger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)BackwardStateGraphArgGraphArgTrackedFakewrap_fx_proxy)ContextWrappingVariable)ClosureConversionErrorVariableTracker)BaseListVariable)NullVariable)NNModuleVariable)NumpyNdarrayVariableSymNodeVariableUnspecializedPythonVariable)TensorWithTFOverrideVariable)UserDefinedDictVariableDynamoProfilerState)CompilePackage)InstructionTranslatorBase)_CudagraphAnnotation)StorageWeakRefgraph
graph_codegraph_sizes
trace_callcompiler_fnconfig_patchesreturn.c                 n     dt         dt         dt         f fd}t         dd      |_         |_        |S )z
    Wrap a compiler function to apply inductor config patches during compilation.

    Passes config_patches as a keyword argument so that compile_fx can
    propagate them to backward compilation via its inner_compile wrapping.
    gmexample_inputsr   c                      | |      S )N)r    )r   r   r   r   s     Z/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/_dynamo/output_graph.pywrappedz+_wrap_with_inductor_config.<locals>.wrapped   s    2~nMM    __name__z	<wrapped>)r	   getattrr   __wrapped__)r   r   r   s   `` r   _wrap_with_inductor_configr      sA    NC N N N {JDG%GNr   T)frozenc                   "    e Zd ZU eed<   eed<   y)AliasingInfohas_aliasingmsgNr   
__module____qualname__bool__annotations__strr   r   r   r   r          	Hr   r   c                   "    e Zd ZU eed<   eed<   y)MutationInfohas_mutationr   Nr   r   r   r   r   r      r   r   r   tensors_with_sourcesstop_atc                 p   |
t               }t               }g }| D ]@  \  }}t        |t        j                        s!|j                  }|0|j                  |       B |rV|j                         }||v r||v r|j                  |       |j                  D ]  \  }}|	|j                  |        |rV|S )a  Collect all grad_fns reachable from tensors' autograd graphs.

    Performs a DFS traversal and collects all visited grad_fns.
    Optionally stops traversal nodes in stop_at set. This signals the
    autograd.grad boundary.

    Args:
        tensors_with_sources: List of (tensor, source_name) tuples to start search from.
        stop_at: Optional set of grad_fns where traversal should stop (excluded from result).

    Returns:
        Set of all reachable grad_fns.
    )	set
isinstancetorchr   grad_fnappendpopaddnext_functions)	r   r   visitedstacktensor_r   nodenext_fns	            r   collect_reachable_grad_fnsr      s    " %.1eG-/E) &	fell+nnG"W%	& yy{7? 7?D-- 	&JGQ"W%	&  Nr   c                  4    t        j                  t              S N)torchdynamo_loggingget_step_loggerlogr   r   r   _step_loggerr     s    ..s33r   c                   V    e Zd ZU dZeed<   eej                     ed<   dZ	e
ed<   ddZy)	GraphCompileReasonzOStores why a given output graph was compiled; i.e. what caused the graph break.reason
user_stackTgraph_breakNc                 H    | j                   rt        j                  |        y y r   )r   rp   r   selfs    r   __post_init__z GraphCompileReason.__post_init__$  s    &&t, r   r   N)r   r   r   __doc__r   r   list	tracebackFrameSummaryr   r   r   r   r   r   r   r     s,    YKY++,, K-r   r   random_callsc                 .     dt         t           f fd}|S )Nr   c            
      N    D  cg c]  \  } }} | |i | c}}} S c c}}} w r   r   )fnargskwargsr   s      r   _gen_rand_valuesz1_get_gen_rand_values_fn.<locals>._gen_rand_values*  s+    <HII(8D&D#F#IIIs    )r   r	   )r   r   s   ` r   _get_gen_rand_values_fnr   )  s    Jd3i J r   c                        e Zd ZdZdeeej                  j                  f   dd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_modulesr   Nc                 l    t         |           |j                         D ]  \  }}t        | ||        y r   )super__init__itemssetattr)r   r   kv	__class__s       r   r   zFakeRootModule.__init__3  s6    $$& 	 DAqD!Q	 r   c                      y)NzFakeRootModule(...)r   r   s    r   __repr__zFakeRootModule.__repr__8  s    $r   c                 N    |j                         D ]  \  }}t        | ||        y r   )r   r   )r   r   r   r   s       r   add_nn_moduleszFakeRootModule.add_nn_modules;  s*    $$& 	 DAqD!Q	 r   )r   r   r   r   dictr   r   nnModuler   r   r   __classcell__r   s   @r   r   r   0  s\    1 4UXX__(<#=  $  
%# % c588??.B)C    r   r   c                   r    e Zd ZdeddfdZdej                  j                  deej                     de
fdZy)WrapperBackendbackendr   Nc                     || _         y r   )r   )r   r   s     r   r   zWrapperBackend.__init__A  s	    #*r   r   r   c                    t        |      | _        || _        t        j                  | j                        }| j                  ||      | _        | j                  "| j                  | j                  j                  u r| j                  j                  S t        j                  s| j                  S 	  | j                  j                  t        |       } | j                  t        |       }t        ||      r| j                  | j                          S t        d|        # t        $ r t        j                  d        w xY w# | j                          w xY w)Nzincorrect results of backend zerror in verify_correctness)rd   restorer   copydeepcopyr   	candidateforwardr-   verify_correctnessrf   rv   RuntimeError	Exceptionr   	exception)r   r   r   copy_gmcorrectresults         r   __call__zWrapperBackend.__call__D  s
    ),--(g~>>>!T^^tww%F77??"((>>!	%dggoo|N'CDG#T^^\.%ABF GV$~~ LLN !>tfEFF 	MM78	 LLNs   /AD D  D??E E)r   r   r   r2   r   r   r   GraphModuler   r   r1   r  r   r   r   r   r   @  sE    +
 +t +((&&8<U\\8J	r   r   c                   R    e Zd ZU dZdZeed<   dZeed<   dZeed<   dZ	eed<   d	dZ
y)
BytecodeTracingTimingsaX  Accumulated wall-clock time (ns) for major components during Dynamo
    bytecode tracing that are not related to variable trackers.  Each field
    is an int accumulator that gets bumped via ``time.time_ns()`` in the
    corresponding hot-path wrapper.  To add a new timer, add a field here
    and wire up the wrapper in the relevant function.r   get_fake_value_nscreate_proxy_ns!wrap_to_fake_tensor_and_record_nsvariable_builder_call_nsNc                 |   t               }i }t        j                  |       D ]  }t        | |j                        }|dkD  s|j                  j                  d      }|dz  || d<   t        j                  |g       j                  |dz         t        | |j                  d        |r |j                  di | yy)zFlush accumulated timings to the bytecode_tracing chromium event
        and to compilation_time_metrics, then reset all counters.r   _nsg    eA_time_sN)bytecode_tracing)rk   dataclassesfieldsr   nameremovesuffixrg   
setdefaultr   r   try_add_event_data)r   chromium_log
event_datafns_valkeys         r   report_and_resetz'BytecodeTracingTimings.report_and_resett  s     12
##D) 	)AT166*Fzff))%0.4sl
cU'?+(33C<CCFSLQaffa(	) +L++M*M r   r   )r   r   r   r   r  intr   r  r  r	  r  r   r   r   r  r  g  s:    9 sOS-.%s.$%c%Nr   r  c                      e Zd ZU dZeed<   eed<   eej                  j                     ed<   e
e   ed<   eeeeef   f   ed<   eed<   eej                   j"                  j$                     ed<   ej&                  d	z  ed
<   ej(                  j*                  j,                  j.                  ed<   ej0                  j2                  ed<   eej0                  j4                     ed<   dZeed<   dZeed<   dZeed<   d	Zed	z  ed<   e de!fd       Z"e dej0                  j2                  fd       Ze deej0                  j4                     fd       Z#ddZ$y	)OutputGraphGuardsStatear  
    A base class containing fields that are considered "persistent" when we
    want to save all the important state for reconstrucing guards in a different
    process. Normally we don't need to add states here, but we may have to when
    the information is needed to serialize the guards, so the fields here are
    supposed to be serializable as a requirement.
    local_scopeglobal_scopetorch_function_mode_stackguard_on_key_orderinput_source_to_sizes_strides
dual_levelfunctorch_layersNcurrent_deviceglobal_state_guard_guards_aotautograd_guardsFexportskip_guards_checkexport_constraints%name_of_builtins_dict_key_in_fglobalsr   c                 0    t        dt        |              )Nz%shape_env shouldn't be accessed from )AssertionErrortyper   s    r   	shape_envz OutputGraphGuardsState.shape_env  s    DT$ZLQRRr   c                     | j                   S r   )r&  r   s    r   r   zOutputGraphGuardsState.guards  s    ||r   c                     | j                   S r   )r'  r   s    r   aotautograd_guardsz)OutputGraphGuardsState.aotautograd_guards  s    '''r   c                 b   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   r2  r)  r   s    r   dump_guards_statez(OutputGraphGuardsState.dump_guards_state  s    %((**&*&D&D#66*.*L*L!22..#66262\2\;;#66KK $ 7 7"44
 	
r   )r   r  )%r   r   r   r   Scoper   r   r   	overridesTorchFunctionModer   r   r   r   r	   r  
_functorchpyfunctorchFuncTorchInterpreterdevice_C_dynamor   GlobalStateGuardr&  	GuardsSetGuardEnvExprr(  r   r)  r*  r+  propertyr%   r/  r2  r4  r   r   r   r  r    s_    #EOO$E$EFFF##'S#X(>#??O5++77LLMMLL4''((//@@@]]$$$emm8899 FD#t#$$8<)3:<S8 S S //   (D)C)C$D ( (
r   r  c                      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<   y)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   rD  r  r   dc_fieldr   rG  r   r   rH  rI  rJ  tupler	   rK  rL  r   r   r   rC  rC    s     Is#+$L$sCx.  #+4"@d3i@"*4"@d3i@8@QU8VNDsE#s(O345V&.t&D$s)D9ARV9WOT%U38_ 456Wr   rC  c                      e Zd ZU  ee      Zeeedz  f   ed<    ee      Z	eee
eef   f   ed<   ej                  j                  j                   Zej                  j                  j$                  ej                  j                  j&                  z  ed<    ee      Zeeeeej                  j                  j$                  ej                  j                  j&                  z  f   f   ed<   y)ExportMetaDatarE  Ngraph_input_idx_to_local_sourceoutput_return_typeout_specmodule_call_spec)r   r   r   rM  r   rQ  r  r   r   rR  rN  r   r	   r   utils_pytree
_LEAF_SPECrS  TreeSpecLeafSpecrT  r   r   r   rP  rP    s    
 AIA#T#v}*<%=  6>d5SS%S/12S 	&& ekk!!**U[[-@-@-I-II  	& dS%++%%..1D1D1M1MMMN	P 'r   rP  r  c                 H    | d   }t        |t              s|j                  }|S )N__builtins__)r   r   __dict__)r  
f_builtinss     r   get_builtins_dictr^    s)     n-Jj$'((
r   c                        e Zd ZdZ	 	 	 	 ddedeeef   dz  dedz  dedz  dee	e
e   f   dz  ddf fd	Zedefd
       ZddededdfdZ xZS )OutputGraphCommona  
    A minimal interface for full graph capture. It is intended to be
    the target of any tracer that feeds into backends.

    Currently dynamo's OutputGraph is the only known implementation
    of this interface, used by (aot) precompile and (strict) export.
    Importantly, that implementation also contains many other fields
    that are using during tracing but not included in this interface
    because they are not used once tracing is complete.

    It should be safe to assume that (caching) precompile also uses
    this interface.

    In the future, we want make_fx, used by (non-strict) export, to
    also implement this interface.

    The serializable part of this interface is OutputGraphGuardsState.
    We do not need to serialize other parts; however it will pay to
    be disciplined about what those other parts are, especially since
    we want other tracers to be able to meaningfully implement them,
    and we should generally try to cut them down when possible.
    Noutput_graph_guards_stateimport_sourcesr/  export_metadatatracked_fakes_id_to_sourcer   c                    t         |   |j                  |j                  |j                  |j
                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                          |xs i | _        |xs
 t%               | _        |xs
 t)               | _        |xs i | _        y r   )r   r   r  r  r  r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  rb  r%   
_shape_envrP  rc  rd  )r   ra  rb  r/  rc  rd  r   s         r   r   zOutputGraphCommon.__init__  s     	%11%22%??%88%CC%00%66%44%88%--%99%,,%77%88%KK	
$ -2 $1xz.B.2B&," 	'r   c                     | j                   S r   )rf  r   s    r   r/  zOutputGraphCommon.shape_env@  s    r   r   r   c                     t         r   )NotImplementedErrorr   r   r   s      r   bypass_packagez OutputGraphCommon.bypass_packageD  s
     "!r   NNNN )r   r   r   r   r  r   r   r%   rP  r  r   r   r   rA  r/  r	   rk  r   r   s   @r   r`  r`    s    4 15%)15EI$
#9$
 S#X-$
 d?	$

 ($.$
 %)d6l):$;d$B$
 
$
L 8  "S " " "r   r`  c                   `   e Zd ZU dZeed<   	 ddeeef   de	dz  ddd	e
d
ee   dededededeej"                  j$                     ded   de
ddfdZddde
dee   fdZdededefdZdededdfdZddZddZdefdZ	 dd ed!edeeej>                  j@                  f   fd"Z!dej>                  j@                  fd#Z"dd$Z#dee   dz  fd%Z$	 dd&e%d'ef   d(eed'f   d)eedz  d'f   dz  defd*Z&d&e%g ef   ddfd+Z'dd,Z(e)dd.       Z*e)dd/       Z+de
fd0Z,	 	 	 	 dd2Z-d3Z.d4e/ddfd5Z0e)dej>                  jb                  fd6       Z2e2jf                  d7ej>                  jb                  ddfd8       Z2e)deeej@                  f   fd9       Z4e)deejj                  ejl                  f   fd:       Z7e)dee8jr                  e:ej>                  j@                  d;f   f   fd<       Z;d(ed=edej>                  j@                  fd>Z<d(ed=edej>                  jj                  fd?Z=d(ed=eddfd@Z>e?j                  	 ddAeAdz  dBed-   dCedz  deBdD   fdE       ZCe)ddF       ZDe)dej                  j                  fdG       ZGe)deHfdH       ZIe)dej                  j                  fdI       ZLe)deeef   fdJ       ZMe)deej                  j                     fdK       ZO	 ddLeeee%d'ef   e
f   f   dz  ddfdMZPddNZQddOZRe)ddP       ZSdQedefdRZTde/fdSZUde
fdTZVde
fdUZWdVedej                  j                  ez  fdWZZddXedefdYZ[dXeddfdZZ\e]d[edefd\       Z^d]ed^edej@                  fd_Z_d`ej                  j                  ejl                  z  ez  d[edaedefdbZ`d1ddeeea   eeef   f   fdcZbd1ddde/deee   ecf   fdeZd	 dd1ddfeedde/deec   fdgZfd1ddhegddfdiZhd1ddjee   dhegdke
ddf
dlZiddmZjddfed=eddfdnZkdeeee/ez     f   fdoZldXedefdpZme?j                  defdq       ZnddrZodsedt   d1dddfduZpdsedt   d1dddfdvZqd1ddsee   dwerdeea   fdxZse)deejj                     fdy       Zte)deeu   fdz       Zvd{ej                  d|ee6   dexfd}Zyd{ej                  d|ee6   dexfd~Zzdeeej>                  j                  f   fdZ{dXedej>                  j                  defdZ|deejl                     fdZ}ddZ~ddZddZd!eea   ddfdZdXedej                  deeef   ddfdZdXed7eddfdZd!ed7edefdZd!ed7edefdZddZde%ej                  gdf   ddfdZdej>                  jj                  defdZdej                  j                  dQeddfdZy)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_effectsFcode_optionsr   Nroot_txr   r(  r*  frame_stater  r  f_coder  packager   	one_graphr   c                 >
   t         j                  | |||
t               i t        j                  j
                  j                  t        j                  j                  j                         t        j                  j                  j                  t        j                  j                  j                  xs2 t        j                   j                  j"                  j%                         t        j&                  j)                         g        t+        | |      g| _        i | _        g | _        || _        || _        || _        g | _        t;        t<              | _        t               | _         |	jB                  |	jD                  |	jF                  d| _$        d | _%        tM               | _'        d| _(        g | _)        tU        | jR                  |xs tV        jX                  |xs tV        jZ                  tV        j\                  | jH                        }dd l/mc m+} |ja                  d      5  t        jb                  je                  |tg        | j2                        | j2                        }d d d        ti              | _5        | jj                  jl                  jo                  |	       | jJ                  | jj                  _%        | jj                  jl                  | _6        tq        jr                         | _:        | jw                          ty        jz                  t|              | _?        i | _@        t        |       | _B        i | _C        i | _D        t               | _E        i | _F        t        j                         | _I        t        |      | _K        g | _L        d| _M        i | _N        d | _O        g | _P        || _Q        || _R        d | _S        || _T        i | _U        g | _V        g | _W        d| _X        i | _Y        t        j                   j                         | _[        d| _\        d| _]        t               | _^        t        i       | __        t        i       | _`        | j                          i | _b        g | _c        d | _d        g | _e        i | _f        i | _g        d | _h        d | _i        | j                         | _k        t        j                         | _n        t               | _p        | j                         | _r        i | _s        t               | _u        t               | _w        i | _x        d | _y        y # 1 sw Y   xY w)	N)r   r!  r"  r#  r$  r%  r&  r'  )	is_export)co_nameco_filenameco_firstlinenoF)tracked_fakesallow_scalar_outputsallow_dynamic_output_shape_ops+prefer_deferred_runtime_asserts_over_guards	co_fieldsr   (fake_tensor_allow_unsafe_data_ptr_access)r/  allow_non_fake_inputsr(  )zr  r   r   r   autograd
forward_ad_current_levelr8  r9  #retrieve_all_functorch_interpretersrU  _deviceCURRENT_DEVICEr=  convert_frameinitial_global_stater<  r   r>  r&  r?  SubgraphTracertracersinput_source_to_varleaf_var_creation_orderr(  r*  rt  cleanup_hooksnext_compile_id_counter
compile_idinstalled_globalsrz  r{  r|  r  cudagraph_annotationrL   region_tracker_emit_debugger_breakpointr}  r%   r-   capture_scalar_outputs capture_dynamic_output_shape_opsr  torch._functorch.configpatch_subclassesFakeTensorModer   r   tracing_contexttraced_coder   r   current_compile_iddynamo_compile_idinit_ambient_guardscollectionsdefaultdictr   rd  param_name_to_sourcerQ   rq  variable_tracker_cachemro_source_cacheguarded_mro_absent_keyssignature_cache	itertoolscountunique_var_idr   rr  output_instructions	timestamp_input_mutation_streams_last_checked_input_versionsregister_finalizer_fnsr   rs  profiler_staterv  source_to_user_stacks_current_txcleanupsshould_exitunspec_variable_map_is_torch_function_mode_enabledtorch_function_mode_enabledtorch_function_subclass_inlined!has_user_defined_allowed_in_graphautograd_grad_consumed_grad_fnsnon_compliant_opscompliant_custom_opssave_global_state dynamo_flat_name_to_original_fqnr   random_values_varpregraph_bytecodesynthetic_source_ctor_infobackward_statebackward_state_proxybackward_state_var!install_builtins_dict_in_fglobalsr+  
contextlib	ExitStackcompiler_trace_stackr  bytecode_tracing_timings+maybe_install_saved_tensors_hooks_subgraphs"saved_tensors_hooks_subgraph_namesrb  rP  rc  r*   "used_inlined_inbuilt_modules_namesattr_source_cache(_cached_replayed_side_effect_source_refs)r   rr  r   rs  r(  r*  rt  r  r  ru  r  rv  rw  r/  _config	fake_modes                   r   r   zOutputGraph.__init__X  s    	''%"u*,~~00??"--99]]_ ;;..==$}}::OO  :xx&&779MM++- " 	( 	
" 'tv>? CE  ?A$"4&68#$78+.5
 ~~!--$33
 BF!02/4& 13 ,,!*!Kf.K.K+4 ,7668>8j8jnn
	& 	21]]E]J 	))88#&*4;;&7{{	 9 I	 0>i/H((//7484M4M1//;;3A3T3T3V  " ##D) 	' ?A!'- FH# KM
 >AU$;=&__.,0,>68   KM$CG) OQ# /: ;? RT"<>+- KM  ,188+S+S+U( 05, 27. PSu, >AW ADB! 	  AC-  	 '+ 57  	' ;=;?!.2 224 	2 %/$8$8$:!(>(@% <<> 	/
 /1-/ DN</GIPT5o	 	s   $A TTpopulate_export_metadatar  c                   |s7| j                   j                  s!| j                  t        | j                        S ddlm} g }| j                   j                         D ]n  }t        |d      s|j                  }t        |t        t        f      s4t        |t              rt        |j                  |      r|r|j                  J |j                  j                  j                         D ]  \  }}i }|j                  j                         D ]0  \  }	}
|
j!                         ||	j"                  j!                         <   2 ddgt        |j%                               k(  sJ || j&                  j(                  |j"                  j!                         <    t        |t              rt        |j                  |      r^|j+                  |       q |D cg c]  }t-        |j.                         c}S c c}w )zKReturn Python-side effect sources that Dynamo replays outside the FX graph.r   )_ExportModuleSpecTrackerDictmutation_typein_specrS  )rq  id_to_variabler  r   torch.export._tracer  _get_modified_varshasattrr  r   rP   rR   r   value_base_vtr   as_python_constantvtkeysrc  rT  r   rS   source)r   r  r  potential_side_effectsvarmut_typer   r   specsk_specvals              r   $get_replayed_side_effect_source_refsz0OutputGraph.get_replayed_side_effect_source_refsn  s   
 )%%44==IEEFFD!#$$779 %	;CsO,,, 8:OP "#'>?J		#?E 4#&<<#;;#;
 !$ 2 2 8 8 :	* ! ! !
 )+3477==? !&KFC(+(>(>(@ %*&))*F*F*H$I!& )2:'>$uzz|BT'T T'T %* !% 4 4 E E$%DD$;$;$=!"** #3(?@&syy2NO.55c:K%	;N ?UUs&szz2UUUs   G1basepathc                 0   |j                  d      }||d   f}|| j                  vrt        ||d         | j                  |<   | j                  |   }|dd  D ]<  }||f}|| j                  vrt        ||      | j                  |<   | j                  |   }> |S )N.r   r,   )splitr  rT   )r   r  r  partsr  r  parts          r   get_chained_attr_sourcez#OutputGraph.get_chained_attr_source  s    

3U1Xd,,,*4T58*DD""3''',!"I 	1D4.C$000.8.F&&s+++C0F		1
 r   r^   c                     |j                  dd      }t        |      dk(  rt        ||      S | j                  ||d         }t        ||d         S )Nr  r,   r   )rsplitlenr^   r  )r   r  r  r  intermediate_bases        r   get_chained_param_buffer_sourcez+OutputGraph.get_chained_param_buffer_source  sU     C#u:?$T400 88uQxH !2E!H==r   c                 v   | j                   j                  t        dd             t        j                  rddlm} | j                   |       | _        | j                  j                  }| j                  j                  |j                  |j                  |j                  t        j                                y y )Nr  Tlog_pt2_compile_eventr   r   )r  enter_contextrj   r-   dynamo_profilertorch._dynamo.dynamo_profilerr   r  rs  ru  pushrz  r{  r|  timetime_ns)r   r   codes      r   mark_bytecode_tracing_startz'OutputGraph.mark_bytecode_tracing_start  s    !!//"&*	
 !!I""*&9&;#<<&&D$$  ##	 "r   c                    | j                   j                          | j                  j                          t        j
                  r,| j                  ddlm} | j                  j                         }t        j                         }|||j                  z
  }||j                  z
  } ||j                  |j                  |j                   ||t#        | j$                  j&                  j(                        dd d d |j*                  d      }| j                  j-                  |       d }t/        t        j
                  t0              rt        j
                  }| j                  j3                  |       y y y )Nr   )FunctionTraceTimingr   )	func_namefilenamefirstlineno
cumtime_ns
tottime_nsbytecode_countinline_depthcaller_func_namecaller_filenamecaller_firstlinenois_primitive_call
call_stack)r  r  r  closer-   r  r  r  r  r   r  r   start_time_nschild_time_nsr  r  r  r  rs  ru  co_coder  record_timingr   r   
dump_stats)r   r  stack_entrytrace_end_nsr  r	  timingoutput_files           r   mark_bytecode_tracing_stopz&OutputGraph.mark_bytecode_tracing_stop  s2   %%668!!'')!!d&9&9&EI--113K<<>L&)K,E,EE
'+*C*CC
,)33(11 + 7 7))#&t||':':'B'B#C!"%)$('+&1&C&C! ##11&9 K&00#6$44**;79 'F!r   c                 P    t        | j                        }| j                  d|      S )N__builtins_dict__)r^  r  install_global)r   r]  s     r   r  z-OutputGraph.install_builtins_dict_in_fglobals  s&    &t'8'89
""#6
CCr   hookprefixc                     | t        | j                         }|| j                  vsJ || j                  |<   || j                         fS r   )r  r  get_backward_state_proxy)r   r  r   r  s       r   add_backward_state_hookz#OutputGraph.add_backward_state_hook  sV     #d112344.....$(D!T22444r   c                 f   | j                   | j                  rt        dddg        t               }| j                  j                  dt        |      |t                     | _         t               | j                   j                  j                  d<   | j                         | _        | j                   S )Nz&backward_state does not support exportrn  z3Compiled autograd doesn't work with `torch.export`.gb_typecontextexplanationhintsdynamo_backward_stater  grapharg)r  r(  rE   r!   root_tracercreate_graph_inputr.  rU   rx   r   metanew_varr  )r   example_values     r   r"  z$OutputGraph.get_backward_state_proxy  s    $$,{{D U	 *OM(,(8(8(K(K']#*,	 )L )D% ?T>UD%%**//
;&*llnD#(((r   c                    | j                   j                  t               j                  t        j
                               | j                   j                  t               j                  t        j                               | j                   j                  t               j                  t        j                               | j                   j                  t               j                  t        j                               | j                   j                  t               j                  t        j                               | j                   j                  t               j                  t        j                               t        j                  j                  j                         }|@| j                   j                  t               j                  t        j                                t        j"                  j$                  j&                  sA| j                   j                  t               j                  t        j(                               y y r   )r   r   r_   
make_guardrM   	SHAPE_ENVrY   DETERMINISTIC_ALGORITHMS	GRAD_MODEDEFAULT_DEVICEGLOBAL_STATETORCH_FUNCTION_STATEr   r<  r8  peek_interpreter_stackFUNCTORCH_STACK_MATCHr=  compiled_autogradin_compiled_autograd_regionAUTOGRAD_SAVED_TENSORS_HOOKS)r   cis     r   r  zOutputGraph.init_ambient_guards  sr    	(33L4J4JKL**<+P+PQ	
 	)+66|7M7MNO)+66|7R7RST)+66|7P7PQR**<+L+LM	
 XX  779>KKOO!#..|/Q/QR }}..JJKKOO!#.. == Kr   c                 b   t         j                  j                  j                  ry t         j                  j
                  j                  j                  }t         j                  j
                  j                  j                  } |       } ||      sy |\  }}| j                  dt         j                  j                  | j                  |j                              }| j                  dt         j                  j                  | j                  |j                              }|dk(  sJ |dk(  sJ ||gS )Nsaved_tensors_hooks_packsaved_tensors_hooks_unpacksaved_tensors_hooks_pack_0saved_tensors_hooks_unpack_0)r   r=  r<  r=  r8  _aot_autogradrU  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_subgraphs1  s   ==**FF$$2288PP	**00SS 	 & #!22&HH  '--@
  $44(HH  )//B 
 "%AAAA#'EEEE"$899r   r   .r   ctor_arg_sourcesc                     | }| j                         }t        | j                        j                  fd       |r#j	                  d t        ||      D               n3j	                  t        t        j                  j                  |             j                  t        |      d       j                  |       | j                  j                  j                                t!        |      }||f| j"                  |<   t%        j&                  | j                  ||      }|j)                         }t+        j,                         j.                  j0                  j3                  |       |S )z]
        call fn(*args) before the graph runs and turn the result into a fake input.
        c                  P     j                  j                  j                        S r   )load_import_fromr   r   )cgr   s   r   <lambda>z3OutputGraph.synthetic_graph_input.<locals>.<lambda>[  s     B'' r   c              3   h   K   | ]*  \  }}||nt         j                  j                  |       , y wr   )r0   ConstantVariablecreate).0r  srcs      r   	<genexpr>z4OutputGraph.synthetic_graph_input.<locals>.<genexpr>a  s6      C I,F,F,M,Mc,RRs   02F)r0  r?   rs  add_push_nullforeachzipmapr0   rW  rX  call_functionr  storer  extendget_instructionsr`   r  r~   buildrealizer   getguards_contextdynamo_guardsremove_guards_with_source)	r   r   r   rP  r1  varnamer  r  rT  s	    `      @r   synthetic_graph_inputz!OutputGraph.synthetic_graph_inputN  s1    D	,,.t||$
	
 JJ  #D*: ; 
 JJs955<<dCD
TE*
%%b&9&9&;<%g.35t=M2N''/ &&t||]FK!++99SS	
 r   c                 :    | j                   j                  |       y r   )r  r   )r   r   s     r   add_cleanup_hookzOutputGraph.add_cleanup_hookt  s    !!"%r   c                 z    t        | j                        D ]	  } |         | j                  j                          y r   )reversedr  clear)r   r  s     r   call_cleanup_hookszOutputGraph.call_cleanup_hooksw  s3    T//0 	DF	  "r   r  c                      | j                   d   S Nr   r  r   s    r   r-  zOutputGraph.root_tracer|  s    ||Ar   c                      | j                   d   S Nrt  r   s    r   current_tracerzOutputGraph.current_tracer  s    ||Br   c                 2    t        | j                        dk(  S )Nr,   )r  r  r   s    r   is_root_tracerzOutputGraph.is_root_tracer  s    4<< A%%r   txc                    t        |d      sy|j                  j                         sy| j                  }| j                  #t        t        |j                              | _        |j                  j                         }d}|j                  j                  D ]  }|j                  dk7  r y|j                  j                  d      }t        |t        j                         sJ| j                  j                  |      }|j"                  }|C||kD  r>|| j$                  vr!t'        j(                         | j$                  |<   || j                  |<   |dz  } y)zRecord which stream index has input mutations by comparing current
        tensor versions against the versions captured at graph input creation.symbolic_stream_stateNr   placeholderr1  r,   )r  r}  in_stream_contextr-  r  r   	enumerate_input_versions_at_beginningcur_stream_idr   nodesopr/  rf  r   r   r   _versionr  r   extract_stack)	r   r{  tracercur_stream_index	input_idxr   r1  prev_versioncur_versions	            r   &check_input_mutation_on_current_streamz2OutputGraph.check_input_mutation_on_current_stream  s6   
 r23''99;!!,,404&==>1D- 33AAC	LL&& 	Dww-' IIMM/:MmU\\:<<@@KL'00K'K,,F#4+G+GG&446 001AB @K11)<NI	r   a~  To fix this, either:
  1. Move the input mutation after the event.record() call.
  2. Record the event outside the compiled region:
       compiled_fn(x)
       event.record(stream)  # after torch.compile returns
  3. Insert a graph break before recording:
       torch._dynamo.graph_break()
       event.record(stream)
  4. Record the event on a stream that has no input mutations.stream_indexc                    || j                   vry| j                   |   }t        j                         }ddj                  |j	                                ddj                  |j	                                d| j
                  z   }t        |      )u   Error if an event is being recorded on a stream that already has
        an input mutation. Called at record time so ordering is naturally
        respected — records before mutations won't trigger this.Na  An event was recorded on a stream where a graph input was previously mutated. The input mutation is applied via copy_() in the runtime epilogue after the graph executes, so the event would not capture the mutation, leading to incorrect synchronization.

Input mutation occurred here:
rn  z
Event record occurred here:

)r  r   r  joinformat_EVENT_INPUT_MUTATION_FIXr   )r   r  mutation_stackrecord_stackr   s        r   'check_event_record_after_input_mutationz3OutputGraph.check_event_record_after_input_mutation  s     t;;;55lC%335. ww~,,./0 1,ww|**,-.b2 594R4RS 	 3r   c                 .    | j                   j                  S r   rx  r   r   s    r   r   zOutputGraph.graph  s    ""(((r   r  c                 &    || j                   _        y r   r  )r   r  s     r   r   zOutputGraph.graph  s    $)!r   c                 .    | j                   j                  S r   )rx  input_name_to_proxyr   s    r   r  zOutputGraph.input_name_to_proxy  s    ""666r   c                 .    | j                   j                  S r   )rx  real_value_cacher   s    r   r  zOutputGraph.real_value_cache  s    ""333r   	LazyProxyc                 .    | j                   j                  S r   )rx  bound_symbolsr   s    r   r  zOutputGraph.bound_symbols  s    ""000r   r   c                 :     | j                   j                  |i |S r   )rx  create_proxyr   r   r   s      r   r  zOutputGraph.create_proxy  s     /t""//@@@r   c                 :     | j                   j                  |i |S r   )rx  create_noder  s      r   r  zOutputGraph.create_node       .t""..???r   c                 :     | j                   j                  |i |S r   )rx  remove_noder  s      r   r  zOutputGraph.remove_node  r  r   source_targetprior_tracerdescription)r  NNc              #     K   t               }	 |r|j                  | j                  u sJ |j                          |r|n-t	        | | j                  || j                  j
                  |      }| j                  j                  |       | |j                  d d d        | j                  j                          y # |j                  d d d        | j                  j                          w xY ww)N)parentr  ry  r  )
r@   r  rx  	__enter__r  ry  r  r   __exit__r   )r   r  r  r  new_scope_ctxr  s         r   	subtracerzOutputGraph.subtracer  s      ()	#**d.A.AAAA##%   #.."/"11;; +  LL'L""4t4LL ""4t4LLs   C+A=B9 .C+9/C((C+c                     | S r   r   r   s    r   outputzOutputGraph.output  s    r   c                 ^    | j                   j                  J | j                   j                  S r   )r  r  r   s    r   r  zOutputGraph.fake_mode  s,    ##--999##---r   c                     | j                   j                  J | j                   j                  j                  J | j                   j                  j                  S r   )r  r  r/  r   s    r   r/  zOutputGraph.shape_env  sP    ##--999##--77CCC##--777r   c                 B    | j                   j                  j                  S r   )r  rg  rh  r   s    r   r   zOutputGraph.guards  s    ##22@@@r   c                 B    | j                   j                  j                  S r   )r  module_contextr   r   s    r   r   zOutputGraph.nn_modules"  s    ##22===r   c                 B    | j                   j                  j                  S r   )r  rg  r2  r   s    r   r2  zOutputGraph.aotautograd_guards&  s    ##22E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                  j                         x}r|j                  nd}t!        j"                  t        j$                  |      t        j&                  |      f|d<   t!        j"                  t        j$                  d      t        j&                  d      f|d<   t!        j"                  t        j(                  |      t        j*                  |      f|d<   t!        j"                  t        j(                  d      t        j*                  d      f|d	<   t        j,                  t        j.                         f|d
<   y)zc
        Saves to out if it is provided. Else saves to the tracing context's global_state.
        .Ngrad_enabledcudaautocast_enabledcpuautocast_cpu_enabledautocast_gpu_dtypeautocast_cpu_dtypeautocast_cache_enabled)r
   r   r   rN  r   r	   r   r  global_contextglobal_stater   set_grad_enabledis_grad_enabledacceleratorcurrent_acceleratorr.  	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  accgpu_types        r   r  zOutputGraph.save_global_state*  s    eHS#X.4556 ? ))88EE
 ).(>(>@U@U@W'X^$ !& 1 1 E E GGGCHHf 	 e88(C%%h/,
'(
 e88%@%%e,0
+,
 e66A$$X..
)*
 e66>$$U+.
)*
 ,,++-2
-.r   c                 :    | j                   j                  |       y r   )r  r   )r   r{  s     r   push_txzOutputGraph.push_txS  s    #r   c                 6    | j                   j                         S r   )r  r   r   s    r   pop_txzOutputGraph.pop_txV  s    ##%%r   c                 P    | j                   s| j                  S | j                   d   S rv  )r  rs  r   s    r   
current_txzOutputGraph.current_txY  s$    #'#3#3t||M9I9I"9MMr   r  c                 ~    |j                  | j                  j                  | j                  j                  di i       S )z
        Resolve the runtime value a Source points to using root_tx's frame.

        Useful to inspect the python object associated with the source during
        debugging. Will also be used by invoke subgraph caching later on.
        )GL)	get_valuers  	f_globalsf_locals)r   r  s     r   resolve_source_valuez OutputGraph.resolve_source_value]  s9     ,,((t||/D/DE
 	
r   c                 ,    t        | j                        S r   )rh   r   r   s    r   rh   zOutputGraph.count_callsj  s    4::&&r   c                 X    t        t        | j                  j                              dk(  S rs  )r  r   r   r  r   s    r   is_empty_graphzOutputGraph.is_empty_graphm  s!    4

(()*a//r   c                     t        | j                  j                  D cg c]  }|j                  dk(  s| c}      dkD  S c c}w )Nr  r   )r  r   r  r  )r   xs     r   has_outputszOutputGraph.has_outputsp  s5    tzz//D!14483CADEIIDs
   AAr  c                     |sJ | j                   }|j                  d      D ]$  }t        |t              r||   }t	        ||      }& |S Nr  )r   r  r   r   r   )r   r  objr   s       r   get_submodulezOutputGraph.get_submodules  sN    t<@OOC 	&A#t$!fc1o		&
 
r   r  c                     t        | j                  d         }	 | dt        | j                         }||vr| j                  dxx   |fz  cc<   |S 9)Nco_varnamesr   )r   rr  r  r  )r   r  existingr  s       r   r0  zOutputGraph.new_var}  s`    t((78F!D!3!3456C("!!-0SF:0
	 r   c                 X    || j                   d   vr| j                   dxx   |fz  cc<   yy)z/Ensure self.code_options.co_names contains nameco_namesN)rr  )r   r  s     r   update_co_nameszOutputGraph.update_co_names  s2    t((44j)dW4) 5r   namesc                  ^   dj                  t        t        |             }t        j                  dd|      }t        j                  dd|      }t        j                  dd|      }t        j                  dd	|      }t        j                  d
d|      }|r|d   j                         sd|z   }|S )Nr   z9\._(?:modules|parameters|buffers)\[(['\"])([^'\"\]]+)\1\]z.\2z2getattr\(\s*([^,]+?)\s*,\s*(['\"])([^'\"]+)\2\s*\)z\1.\3z^[GL]\['?(.*?)'?\]$z\1z	\[(\d+)\]z_\g<1>z[^a-zA-Z0-9]r   sub)r  r_  r   rer  isalpha)r  r  s     r   module_key_namezOutputGraph.module_key_name  s     xxC(vvH&RV
 vvA8T
 vv,eT:vvlIt4vvosD147??,4<Dr   attr_prefix
attr_valuec                 h   t        |t        j                  j                        r>| j                  j                         D ]!  \  }}||u s| j                  d|di       }|c S  t        || j                        }|| j                  |<   | j                  d|di       }t        |j                  |       |S Nget_attrr   )
r   r   r   r   r   r   r  ro   rw   r   )r   r  r  r  modproxy	attr_names          r   %register_static_attr_and_return_proxyz1OutputGraph.register_static_attr_and_return_proxy  s    
 j%((//2!__224 !	c*$ --j$BGE L!
 (T__E	 &0	"!!*iR@%**j1r   targetoptionsc                    
 t         j                        r!t        j                   j                  fi S t              dv sJ d   t        t              rJ t        t        j                        r@ j                   j                         s j                  dt        dt        f fd}n@t        t        j                  j                        rxt        t        j                  j                        sJ r<t!        j#                  t$        j&                               dt        dt        ffd}ndt        dt        ffd}nt        t        j(                  t        j*                  f      rdt        dt        f fd}net-        t/                    r> j                   j                         s j                  dt        dt        f fd}ndt        dt        f fd	} j0                  j3                         D ]  \  }}|u s ||      c S  t5        j6                  | 
t9        
 j0                   j:                        
 j0                  
<   t        t        j                  j                        rhd
t        dd f
 fd}t=        d      r j?                         D ]  \  }}	 ||        t=        d      r jA                         D ]  \  }}	 ||         |
      S )Nr  
module_keyr   c           	      B   j                   J j                   | <   j                  J j                  j                  j                  v r#j                  j                  j                     S t	              dk(  r9t        t              s)t        j                  t        j                               n3t              s(t        j                  t        j                               t        j                  j                  d| di       fdi}j                  j                  j                  j                  |      }d|j!                         j"                  j$                  vsJ t'              |j!                         j"                  j$                  d<   |S )Nguardedr  r   r1  tensor_dict)r  rs  r  rq  rn   r   r]   rN   r3  rM   ID_MATCHrZ   TENSOR_MATCHr{   r  track_object_existingas_proxyr   r/  rc   )r  r  r   r   r  r  r  s     r   	wrap_namez6OutputGraph.register_attr_or_module.<locals>.wrap_name  se   00<<<8>))*5 ||///T\\00===<<..;;FCC*62i?
-I "&"3"3L4I4I"JK+F3!&"3"3L4M4M"NO"LL''
JBG #) 	 \\((55KKFTVW$BKKM,>,>,C,CCCC9Mf9U""''6	r   c                 2    t        t              | fi S r   )r   r.  r  r   r  s    r   r
  z6OutputGraph.register_attr_or_module.<locals>.wrap_name  s    +DL*fXPWXXr   c                 0    t        j                  fi S r   )r0   UnspecializedNNModuleVariabler  s    r   r
  z6OutputGraph.register_attr_or_module.<locals>.wrap_name  s    $BB6UWUUr   c           	      n    t        j                  j                  j                  d| di       fdiS )Nr  r   sym_num)r   rX  rs  r  )r  r   r   r  s    r   r
  z6OutputGraph.register_attr_or_module.<locals>.wrap_name  sE    &--LL%%j*b"E # 	 r   c                 >   t         j                  j                  j                  j                        }j                  d| di       }t        |j                  |       t        j                  j                  j                  j                  j                  ||fi S r  )r   _libraryfake_class_registrymaybe_to_fake_objr  r  rw   r   r=  r0   script_objectTorchScriptObjectVariablerX  )r  fake_script_objr  r   r   r  r  s      r   r
  z6OutputGraph.register_attr_or_module.<locals>.wrap_name%  s    "'.."D"D"V"VNNF# ++J
BK!%**o>}}..<<VV]]?.5 r   c                     j                   j                  |        j                  | <   t        j                  t        |             S )N)source_name)r  r  r  r~   rd  rV   )r  r   r  s    r   r
  z6OutputGraph.register_attr_or_module.<locals>.wrap_name3  sF    ++J706!!*-&,,"z: r   	leaf_namec                     j                   J j                  |       } d|  }|j                   |<   t        t              r-| j                  t
        j                  |j                        <   y y r  r  r  r   r\   r  rp  r  r  r  
new_sourcenew_namer  r   r  s      r   register_leaf_namez?OutputGraph.register_attr_or_module.<locals>.register_leaf_nameF  s}    00<<<!AA&)T
"V1YK06@))(3fk2 " 99#33JOOD 3r   _parameters_buffers)!rO   r(  r~   rd  r  r   r   r^   r   r   rx  rz  r-  r   r   r   rN   r3  rM   	NN_MODULESymIntSymFloatr   r.  r   r   rp  r  ro   r  r  named_parametersnamed_buffers)r   r  r  r   r
  r   r   r   r  r   r  r  r  s   `` `      @@@r   register_attr_or_modulez#OutputGraph.register_attr_or_module  s     4 #((&LGLLw-7""""f&7888fell+((F&&( )) c  o    D 0fehhoo666f//0F0FGHY# Y/ YV# V/ V u~~ >?c o   DL)
 ((F&&())c o  c o  OO))+ 	$DAqF{ |#	$
 **E2"4$:K:KL &fehhoo."c "d " v}-$*$;$;$= 2LIq&y12vz*$*$8$8$: 2LIq&y12 r   c                    | j                   j                  d      }t        |      }|sg i fS g }i }g |j                  |j                  j                         | j                  j                  j                         }|r |j                         }t        |t              r,t        |j                  t              sJ ||j                  z  }O|| j                  j                  vst        |j                  t              r`t        |j                   t"              rFt        |j                   j$                  t&              r"|j                   j$                  j(                  |v s|j                   j$                  j(                  }||vrg ||<   ||   j+                  |       |r i }	i }
| j,                  D ]:  }t        |j.                  t              r2t        |j                   t&              r|j                   j(                  |v sQ|j                   j(                  }|| j0                  d   v sJ ||   D ]  }|j                   |
v r|j                   J |j                   j2                  }||	vrU| j5                  | d      }||	|<   |j7                  t9        d|      t;        |      t=               t9        d|      g       |j                   J |j                   }t'        |	|         |
|<    = ||
fS )Nr   r  _ref	LOAD_FASTargval
STORE_FAST)r  rf  rm   r   symbolic_localsvaluesrq  store_attr_mutationsr  r   r   r   r   r   r  rP   r  rX   r  r\   
local_namer   	graphargs_examplerr  indexr0  rb  r8   r9   r4   )r   r{  maybe_gmstolen_list_namesalias_instsneeds_aliasqueuer  stolen_namer   overridden_sourcesarg	list_namelist_idx
alias_name
old_sources                   r   handle_aliases_for_stolen_listsz+OutputGraph.handle_aliases_for_stolen_lists[  s    ##''//9 r6M8:
XX
&&(
 3388:
 		A!-.!!''4000  T..CCC!!//3LMqxx7qxx}}k:HHMM,,0AA((--22K+-+-K($++A.+ 0 35>> '	PC3<<.szz;7JJ))[8 

--I 1 1- @@@@ + P8811 xx+++88>>7*!%$+T*"J )3GH%&&.{9M-h702.|JO	 xx+++XX
1<WX=N1O":.9P'	PZ ...r   
stack_popsc                 H   |j                          g }t               }dt        ddfd}t        |j                        D ];  \  }}t        |j                        |z
  |k  }t        j                  j                  ||       t        |t        j                        st        j                  ||       |r|j                  |       t        |t              r|j                  j                  |       n|j                  |       t        |t              s|j                   dnt#        |j                         }	|j$                  j                  t        |      dz
  |	f       |j&                  j                  |       > t        |      |_        t+        |j-                         |j/                         z         }
|j0                  j3                         D ]K  \  }}t        j                  ||       t        |j4                  t6              r(|j4                  j8                  |k(  r|| j:                  u r_||
v rdt<        j>                  dk\  r6t@        jC                  t        |      r8|jD                  j                  |       t@        jC                  t        |      rJ t        |jF                        |jF                  |<   t        |t              r@|j                   dnt#        |j                         }	|jH                  j                  ||	f       |j                  |       N ||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)
        r  r   Nc                 b    t         j                  t        j                  |       rt	        d      y )NzCAttempted to reconstruct WithExitFunctionVariable outside the stack)r.  __instancecheck__r0   WithExitFunctionVariabler-  )r  s    r   ctx_exit_checkz@OutputGraph._get_stack_values_to_restore.<locals>.ctx_exit_check  s.    %%i&H&H#N$Y  Or   )allow_lazy_constantr   r,   )      )%prune_dead_localsrC  r~   r  r   r  r0   LazyVariableTrackerrealize_allr   rG  visitr   r   rH  r|   target_valuesrN  rJ  rK  rD  r   cellvarsfreevarsr/  r   r  r\   r2  rs  sysversion_infor.  rF  rI  rG  rL  )r   r{  rC  stack_valuesr/  rH  ir  rI  rP  cell_and_freevarsr   r   s                r   _get_stack_values_to_restorez(OutputGraph._get_stack_values_to_restore  s   " 	"$	 	D 	 ""((+ 	4HAu"%bhh-!"3z"A))55+> 6  eY%G%GH%%ne<"##E*%.%%,,Q/##E*%!89--5B5ATAT;U  ##**C,=,A=+QR))003/	42 \* => &&,,. #	#DAq!!.!4 188[1HH''1,$,,&%%7* )),:))003  11,BBB#&t'8'8#9Da !45//1BuQ__7M  $$++Q,>?"G#	#J T!!r   r   c                 r   | j                   J t        j                  s| j                   |u sJ | j                          || _        d| _        t        j                  d|       g }t        j                  dk\  r| j                   j                  D ]r  }|j                  dk(  r=|j                  t        dt        | j                   j                  d                      O|j                  t!        j                   |             t g }g }|}|t#        d |j$                  D              sJ | j'                  |||u r|nd	      \  }	}
|j                  |	       |j                  |
       t)        |j$                        D ]  }|j+                  ||j,                  
       ! |j.                  }|| j0                  j3                  |       | j5                  |       | j6                  r#ddlm} | j5                   |              d| _        | j<                  r| j>                  rJ d       | j5                  | j<                         | jA                  | j                         \  }}| j5                  |       | jC                          | jD                  jG                         D ci c]  \  }}|tI        |       }}}tK        |      }ddl&m'} t        | jP                        d	kD  rg }| jS                  d      | _*         |tW        | jP                        d      }| jY                  d|      }t[        | j                   ||      }|j]                  |j_                  |d             |j]                  ta        d	d             |j                  |jc                  | jT                               | j5                  |       |D cg c]  }|D ]  }|  }}}d}d}| j                   |u r)|r&t#        d |D              rt#        d |D              r t        te        |            t        |      k(  r| j0                  jg                         r|jh                  s| jj                  s|d   jl                  s|d   jn                  st[        | j                         }| jq                  ||       | j5                  g | js                  |tu        t)        |            |      |jw                         ty        d      t        dt        |                   n| jS                  d      }t[        | j                   |||      }| j{                  |||d       i }|j|                  jG                         D ]'  \  }} | dkD  st        |t        t        f      r#d||<   ) t[        | j                   ||||      }!| j{                  |||!d       t        j                  j                  j                  r3|r0t        |      dk(  r!|d	   }"t        |"t        j                  j                  j                        r|"j                  t        j                  j                  j                  u r|"jF                  d	   }#|"jF                  d   }$t        |#t        j                  j                  j                        sJ i }%|!j                  j                         D ]M  }&t        |&t        j                  j                  j                        sJ |&j                  }'|&j                  |%|'<   O t        |#jF                        D ]  \  }(}"|"|%v rd|%|"   f| j                  j                  |(<   )|"j                  Lt        |"j                  dd      x})r3t        |)dd      r&d|"j                  f| j                  j                  |(<   |"j                         r*d|"j                         f| j                  j                  |(<   t        d |" d!|(        	 |$j                         | j                  _Z        g }+t        | j                        d	k7  st        |!j                        d	k7  r|+j]                  | js                  ||!j                         |             t        |!j                        d	k7  r#|+j                  |!jc                  |             d}n+|+j                  t        d(             n| j                          | j5                  |+|!jw                         z          | j5                  t        d)t        |      |d	   j                  z
        g       d	},d	}-t        |      D ]  \  }.}
t        |
j                        }/|.d	k7  r|/|
j                  z  }/|/d	k(  r)| j5                  t        d)d	      gty        d             n;|-|/z  }-| j5                  t               gt        |,|-      ty        d             |,|/z  },|.t        |      dz
  k(  st[        | j                         }0i }1| j                   j                  jG                         D ]~  \  }2}3t        |3j                  t              s!|3j                  j                  |2k(  s;|0j                  |0j                  |2             t        |
j                        t        |1      z   |1|2<    | j5                  |0jw                         t        d)t        |1            t        d*d      gz          |
j                  j                  |1        | j5                  t        d(      t        d)t        |            gt        |d	   j                  dz                |r|r| j5                  t        d+|,      g       t        j                  j                  j                  d-v rc| j                  d.      }4|4rOt        j                  j                  j                  d/k(  rt        j                  d0|4        |S t        d0|4       |S c c}}w c c}}w # t        $ r }*t        d"d#|$ d$d%d&g|*'       Y d}*~*d}*~*ww xY w)1a  
        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rJ     COPY_FREE_VARSco_freevarsr=  c              3   <   K   | ]  }|j                           y wr   )can_restore)rY  blocks     r   r[  z/OutputGraph.compile_subgraph.<locals>.<genexpr>Z  s     Kuu((*K   r   )is_graph_breakr,   )create_breakpointFz)export does not support pregraph_bytecodedisablerandom_valuesz.do not trace into Dynamo rng recovery functionr   __gen_rand_values)r<  c              3      K   | ]K  }t        |t        t        t        f       xr) t        |t              xr |j                         t        u   M y wr   )r   r   r   r   r   python_typefloat)rY  r   s     r   r[  z/OutputGraph.compile_subgraph.<locals>.<genexpr>  s`        3,4  V $A7TAMMOu<TUVs   AAc              3   <   K   | ]  }|j                           y wr   )	is_tensorrY  r  s     r   r[  z/OutputGraph.compile_subgraph.<locals>.<genexpr>  s     =aAKKM=rb  rw     UNPACK_SEQUENCE	graph_out)tempvarsr<  r  is_inputinputconstantzEncountered unrecognized type z at output z8nested function with non-constructible closure in outputz as_python_constant for out_spec zCannot return a nested function with closure from a compiled function. Dynamo failed to construct the function defined in the compiled region with closure objects.zGDefine the function at module scope instead of inside another function z0Ensure that all closure variables are constants.)r&  r'  r(  r)  from_excPOP_TOP
BUILD_LISTLIST_EXTENDDELETE_FASTr,  )warnerrorr  r|  zWhile compiling, we found certain side effects happened in the model.forward. Here are the list of potential sources you can double check: )prs  r-   nested_graph_breaksr  compile_subgraph_reasonr  r   debugrS  rT  prefix_instsopnamer   r8   r  rr  r   allblock_stackrX  ro  exitr   r  rq  prune_dead_object_newadd_output_instructionsr  bytecode_transformationrd  r  r(  rB  cleanup_graphr   r   ru   r   
decoratorsrf  r   r0  r  r   r  r?   rb  load_function_namer6   create_storer   is_emptydebug_localsr  rH  rI  codegen_cellscompile_and_call_fx_graphr   rc  r;   codegen_suffixusesrr   r`   r\   r   r=  log_graph_in_out_metadatar   r0   NamedTupleVariable	tuple_clsfunctional_exportExportTracerOutputListVariablegraph_outputsr0  codegenGraphOutputEntryvariabler5  r  rc  rR  r  r   is_python_constantr  r-  rS  r}   rE   rh   r   graph_output_varsrun_compiler_collectiverD  rG  r7   r3   r/  r2  append_outputcreate_loadupdater:   side_effect_replay_policyr  warningsr|  r   )5r   r{  r   rC  r  install_stack_valuesall_stack_locals_metascur_txrU  r/  ra  rd  r8  r<  r  r  nn_modules_proxiesrootrf  random_calls_instructionsrand_fnrand_fn_namer  valsr  stack_values_flatstored_graph_output_vargraph_output_varcell_cgpass1rs  r  pass2r  flat_returnsrS  vt_to_graph_out_idxr  r  idxr  er  	start_idxend_idxrV  n_valsroot_cgunmodified_locals_namesr   r   side_effect_refss5                                                        r   compile_subgraphzOutputGraph.compile_subgraph   s   * ||'''))<<2%%% 	'')'-$		-v6 +-w&11 	9;;"22 ''*, #DLL$=$=m$L M !''		$8	9 !#35 K8J8JKKKK!%!B!Bfl
"L$ ##L1"))$/ "&"4"45 F

6&2D2D
EF ]]F  " 	//3$$\2))B(():)<=-2D***t{{ 	
7	
; 	$$T%;%;<*.*N*NLL+
'' 	$$[1 9=8M8M8O
+44D/#&&
 
 01' t  !A%(*%%)\\/%BD"'(9(9:GG  ../BGLLd7IG &,,**<> &,,-A!U-KL%,,$$T%;%;< (()BC& .>NTN#SNSNN"' LLB!  +  =+<==C)*+s3D/EE!!**,OO''*2.??*2.??  -Gr7+((33D*;!<=t
 --/ !^ ''8cBS>TU
  $||K8  #5	E $5ueD H#jj..0 )
U19VC2F1T%U$(HSM)  !#5E $5udC $$>>%)*a/&q)r5==#:#:#M#MN}}66IIJ $&88A;L!xx{H%$emm&=&=&J&J   GI'!&!4!4!;!;!= D)%1F1F1W1WXXX49NN8=+H5D
 $-\-?-?#@ R!44 + 3B 7LD00CCCH
 II1+2299fd+K!K!K '
E B !( "		LD00CCCH  224 * " 5 5 7LD00CCCH
 #1"@KPSu U# +08@8S8S8U,,5  F4::&!+s53F3F/G1/L222u7N7N7PRVW u**+q0MM%"4"45E"FG.2+MM"4Y"?@ ,,.((%2H2H2J)JK 	$$" -.1G1J1T1TT	
& 	 !78 -	BGAt**+FAv$..({,,*<Q?$Q 6!,,&(,Y@ %Q V#	 C./!33#DLL1:<' LL88>>@ DAq!!((K8QXX=P=PTU=U--g.A.A!.DE589J9J5Kc3O 6/2 ,,,,.*(c2I.J +=a@	 !!(()@A[-	Bv 	$$"9-"<S9O5PQ 4Q7AAAEF	
"  7((#M:JKL ==99=NN#HH)-  I    ==''AAVKMMXXhWik &% 'XXhWik 
 &%O

Z Oz 2 %$^&Fxj$Q! !j R# &' s$   p:p4p 	p6p11p6rT  c                    | j                   j                  rd}|}|t        t        |j	                                     }|D ]T  }|| j
                  u r!|j                  |j                  |             2|j                  sJ  ||j                  |          V |j                  t        t        |                   |j                  }|dz  }||j                  t        d|             y |j                  t        dd             y )Nr   r,   ry  r^  )r  r   rN  sortedrW  rs  r  create_load_closurepost_prune_cell_and_freevarsr5   r  r  r8   )r   r{  rT  tx_cntr  rR  cells          r   r  zOutputGraph.codegen_cells  s    ''33F79F$ !(@(@(B!CD$ FD-(()?)?)EF%BBBB6>>tDEF   !3CM!BC! $  /&IJ/!DEr   rU  log_side_effectsc                 4  	 | j                   j                         | j                  r| j                  rJ | j                  j	                         D ]V  \  }} |       | j
                  J j                  j                  | j
                               j                  |       X t        j                  r| j                   j                         |j                  D ]h  \  	}j                  	fd       |D ]
  } |        j                  t        t!        |      d             j                  t#        d      g       j | j%                  |       j'                  ||j                          | j                   j)                  |       y )Nc                              S r   r   )rT  	debug_vars   r   rU  z,OutputGraph.codegen_suffix.<locals>.<lambda>  s    R	] r   Frx  )value_from_source)rq  codegen_save_tempvarsr  r(  r   r  r  r  
store_attrr-   replay_side_effectscodegen_hooksr  r\  extend_outputr6   r  r8   r  restore_stackcodegen_update_mutated)
r   r{  rU  rT  r  r  r  r   r=  r  s
      `     @r   r  zOutputGraph.codegen_suffix  sb    	//3{{"?!00668 $	c3..:::  0G0G!HId#	$
 %%++B/  " 	>OIt23 31#d)UCD0;<=	> 	2r"
RYYG005EFr   c                    | j                   sJ t        | j                  j                        }|D ]  }|j                  j                  dd         t        j                         }t        j                  |      D ]  \  }}|j                  t        j                  j                  u s-t        |j                        | fk(  sH|j                  rU|j                  d   }|j                  t        j                  j                  u st        |j                        | fk(  s|j                  r|j                  d   }| j                  j!                  |       | j                  j!                  |        y)z
        Remove "creation_timestamp" from node meta

        Remove this pattern from the graph:
            torch._C._set_grad_enabled(False)
            torch._C._set_grad_enabled(True)
        creation_timestampNr   )r  r   r   r  r/  r   r   r  r  pairwiser  r<  _set_grad_enabledrN  r   _erased
erase_node)r   r  r   r  node1node2s         r   r  zOutputGraph.cleanup_graph	  s    TZZ%%& 	6DIIMM.5	6 ,,.%..u5 	1LE5 : ::%**%l*:)<<$zz!}LLEHH$>$>>ejj),.>-@@!MM#(::a=LJJ))%0JJ))%0	1r   c                 z   | j                   syt        j                  j                  j                  r*t        j                  j
                  j                  d      t        j                  d       t        j                  j                  dd fd       | j                   j                          d| _         y)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   rU  z,OutputGraph.bypass_package.<locals>.<lambda>6	  s    1"! r   c                      di S )N_reasonr   )r   r   s   r   rU  z,OutputGraph.bypass_package.<locals>.<lambda>:	  s    6    r   metadata_fn
payload_fn)rv  r   r=  r-   strict_precompiler.   PackageErrorr   warning_loggingtrace_structuredbypass_current_entryrj  s    ``r   rk  zOutputGraph.bypass_package)	  s     ||==11--##00/  	3V<'' 	( 	
 	))+r   c                 T   i }| j                   j                  D ]  }|j                  j                  dd       }t	        |t
        j                  j                        sD|j                  }|D cg c]  }t	        |t              r|n
t        |      ! c}||j                  <    |S c c}w )Nr1  )r   r  r/  rf  r   r   r  r   shaper  reprr  )r   retr   r1  sizess         r   get_graph_sizes_structuredz&OutputGraph.get_graph_sizes_structuredC	  s    *,JJ$$ 	VD IIMM/4@M-):):)E)EF$**PT!U1z!S'9!tAw"F!UDII		V
 
 "Vs   -$B%c                 L   d}|d| dz  }| j                   j                  D ]  }|j                  j                  dd       }t	        |t
        j                  j                        sD|j                  }||j                   dt        |       dz  }g }d}|D ]g  }t	        |t              r|j                  |       %t	        |t
        j                        r(d}|j                  |j                  j                         g  |s||j                   d	t        |       dz  } |S )
NzTRACED GRAPH TENSOR SIZES
z===== z =====
r1  z: r  FTz (concrete): )r   r  r/  rf  r   r   r  r   r  r  rN  r  r   r$  r   hint)	r   r  graph_sizes_strr   r1  r  concrete_size
has_symintszs	            r   get_graph_sizeszOutputGraph.get_graph_sizesL	  s   7VD622JJ$$ 	D IIMM/4@M-):):)E)EF$**dii[5;-r#BB ""
 B!"c*%,,R0#B5%)
%,,RWW\\: "'#yyku]7K6LBO#	( r   c              #     K   | j                   j                  j                         }i }| j                  |       	 | j                   j                  j	                  |       d | j                   j                  j	                  t        |             y# | j                   j                  j	                  t        |             w xY ww)zj
        Momentarily restores the global state to what it was prior to tracing the current output
        )r  N)r  r  copy_graphstater  restore_graphstater   )r   prior_global_statecurrent_global_states      r   restore_global_statez OutputGraph.restore_global_statee	  s     
 "11@@PPR<>#78	  //BBCUV   //BB,-ABD  //BB,-ABs   9C)B %/C0CCc                 h   | j                   }|J |j                  xzj                  lj                  }t        j                  dj                         t        j                  j                  dd fd       |j                  }t        |      dk(  s%J dj                  dj                  |                   t        |j                               j!                  |j#                         t        j$                  j'                         z        5  t)        d	d
      5  d g|j+                         z  }t-        j.                  |j                  |       |_        d d d        d d d        |j0                  j3                          t4        j6                  y y # 1 sw Y   =xY w# 1 sw Y   AxY w)Nzcompiler_collective %sr  c                      dddS )Ncompiler_collectivestringr  r   r   r   r   rU  z5OutputGraph.run_compiler_collective.<locals>.<lambda>	  s    1 (% r   c                  8     j                   j                         S r   )local_staterender)dss   r   rU  z5OutputGraph.run_compiler_collective.<locals>.<lambda>	  s    2>>#8#8#: r   r  r,   z&Expect only one device type but got {}+r  Tr  )group)rs  distributed_state
all_states
compile_pgr   infor  r   r  r  _device_typesr  r  r  rA   r   r;  rankr  device_countrj   r  distall_gather_objectspeculation_logrp  r.    CompileCollectiveRestartAnalysis)r   r{  r  device_typesr  r  s        @r   r  z#OutputGraph.run_compiler_collectivew	  s|   \\~~&&&B38MJHH-r~~>NN++ ; ,  &33L|$) 8??@VW) ))9)9);<CCOO%(9(9(F(F(HH
+ 2$O	
+ *.1B(B
&&z2>>T *
+ 
+ $$&666= 9N3 
+ 
+ 
+ 
+s$   F(">F F(F%	!F((F1rvr~   c                    | j                   syddlm} |D ]  }t        ||      r|j                  s|j                         j                  j                  j                  d      }t        |t        j                  j                  j                        sJ |j                  t        |dfg      }|| j                   z  s|j                  rt!        |j                        n|j"                  j                  j$                  }|j&                  j(                  j+                  |        |j&                  j(                  r'd|j&                  _        t/        j0                  d      y)aj  
        Validate that if torch.autograd.grad is used in the graph and outputs
        require grad, we trigger AutogradGradRestartAnalysis only if the output is connected
        to the autograd.grad computation.

        rv here refers to list of variables that are being returned from dynamo graph.

        See Note [Tracing autograd.grad in dynamo]
        Nr,   TensorVariabler1  Tz3autograd.grad consumed grad_fns of returned tensorsrestart_reason)r  variables.tensorr  r   requires_gradr	  r   r/  rf  r   r  fake_tensorr   r   r   r  r   r  r  r  autograd_grad_leaked_tensorsr   graph_break_on_autograd_gradr.   AutogradGradRestartAnalysis)r   r  r{  r  r  r  reachable_grad_fnstensor_names           r   )_validate_outputs_safe_for_autograd_nodesz5OutputGraph._validate_outputs_safe_for_autograd_nodes	  s&    334 	TCc>2#:K:K,,.--2266GKk5+<+<+H+H+S+STTT""* "<k4=P<Q!R!D$H$HH14c#**oATAT""??FF{S	T" ::>BB;11T  ;r   c                 |   ddl m} t               | j                  D ]E  }t	        ||      s|j
                  rj                  |j                         j                         G sy| j                  j                  D ]7  }|v rt        fd|j                  D              s'j                  |       9 |D ]  }t	        ||      s|j                  s|j                         j                  v s:d}|j                  rt        dd|dd	g
       Zd|j                   _        t%        j&                  d       y)a  Skip frame if a source-less requires_grad_() intermediate leaks as output.

        AOTAutograd's functionalization drops requires_grad_() on intermediates,
        so returning them (or tensors derived from them) produces wrong results.
        We detect this via FX graph reachability: find the requires_grad_() nodes
        for source-less intermediates, then check if any output is downstream.
        r,   r  Nc              3   &   K   | ]  }|v  
 y wr   r   )rY  inptainted_nodess     r   r[  zHOutputGraph._check_requires_grad_intermediate_outputs.<locals>.<genexpr>	  s     HC3-'Hs   aK  An intermediate tensor that had requires_grad_() called on it (or a tensor derived from it) is being returned from the compiled region. AOTAutograd's functionalization drops the requires_grad_() effect on graph outputs, producing wrong results. If you only need the tensor values without gradients, call .detach() before returning.z,returning intermediate with requires_grad_()z4graph output depends on source-less requires_grad_()zVIf you only need the tensor values without gradients, call .detach() before returning.zConsume the gradient inside the compiled function (call backward() and use .grad), or move requires_grad_() outside torch.compile.r%  Tz:source-less requires_grad_() intermediate leaked as outputr  )r  r  r   r  r   r  r   r	  r   r   r  anyall_input_nodesr  rw  rE   r  graph_break_on_requires_grad_r.   RequiresGradRestartAnalysis)	r   r  r{  r  r   r   r  r   r(  s	           @r   )_check_requires_grad_intermediate_outputsz5OutputGraph._check_requires_grad_intermediate_outputs	  s5    	5 -0E-- 	5A!^,QXX!!!**,"3"34	5  JJ$$ 	(D}$H43G3GHH!!$'		(  	C3/%%LLN''=8Q  <<! N V$'?N	 HLB&&D99'c ;	r   r  c                    "#$%&' t         j                  j                  j                         5  ddlm}  j                  sJ  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  j                  ||        j!                  ||        j#                  dd j$                  j'                  t)        d	 |D                    fi       } j+                         }|j-                  |        j$                  j/                  ||       t0        j2                  st5        d
      5  t7        |      D ]L  }t9        ||      }	t        |	t:        j<                        s*t?        |	 j@                  | jB                         N  jE                          t?        t;        j<                  | j                         j@                  | jB                         ddd        jG                          t         j                        }
tH        d   dxx   |
z  cc<    jK                           jL                  jO                          tQ        | j                        $ddl)m*}  |$        jV                  r( jV                  D ]  }tY        $|t9        ||               jZ                  D ]
  } |$        t]        $j_                         d      % ja                  d$jc                  ddd              jd                  |$_3         jh                  $_4         jj                  jm                         $jn                  d<    jp                  $jn                  d<   |$jn                  d<    jr                   jr                  $jn                  d<   tt        jw                  dty        |$ddd             t         jz                  j}                  d fd$fd        j                           j                  j                  }|J | _B         jB                  s_ddlCmDc m} |j                  d      5  t         j                  j                  |j@                        }ddd        j                  _A         j                         5   j                  $ j                               #ddd       ddlKmL} t        #|      s&t        t9        #d d      |      rR#j                  d!k(  rCt        #|      r#n#j                  }|j                  |       t        #|      s|j                  # jd                   jd                  j                  |#        j                  r	#%%fd"}|# |#d#$      #tH        d   d%xx   dz  cc<   |j@                  J |j@                  j                  x}r5g 'i & j                  D cg c]  }|j                   }}|D ]  }|j                  |j                        }t        j                  |j                        j                         }t               }t        j                  ||j                  |gd      }t        jw                  d&|       'j                  t        j                  |fd'|      |f        t         j                  j                  d#$      d(t        d)t        d*t        f#$ &'fd+       } j                  ||       n j                  |#        j                  J t         j                        "t               r"j                  "fd,       g }t        j                         D ]<  } |"        j                         }"j                  |       |j                  |       > |D ]"  }"j                  "j                  |             $ "j                  t        t              d       "j                          t         j                        D ](  \  } }!|!j                   j                  j                  | <   * "j                  |       "j                         cddd       S # 1 sw Y   pxY w# 1 sw Y   xY w# 1 sw Y   xY wc c}w # 1 sw Y   yxY w)-z
        Generate code from self.graph and return the Instruction()s to
        call that generated code.

        Code is generated w.r.t. self.root_tx.
        tx is only used for preserving GraphModule metadata
        r,   re  r   N__compiled_fnT)	with_uuidr  c              3   <   K   | ]  }|j                           y wr   )r	  ro  s     r   r[  z8OutputGraph.compile_and_call_fx_graph.<locals>.<genexpr>*
  s     5Oqajjl5Orb  r)   )r(  statscalls_captured)dce_hop_extra_outputsz8Graph contains named parameters due to static addresses.Fprint_outputinclude_strideinclude_devicer   r  r  
backend_idr  %s)r7  r8  coloreddynamo_output_graphc                  (    d j                         iS )Nsizes)r  r   s   r   rU  z7OutputGraph.compile_and_call_fx_graph.<locals>.<lambda>
  s    $"A"A"CD r   c                  ,     j                  ddd      S )NFTr5  )print_readabler9  s   r   rU  z7OutputGraph.compile_and_call_fx_graph.<locals>.<lambda>
  s    2#4#4!&tD $5 $ r   )r  r  )r/  )_LazyGraphModule__self___lazy_forwardc                  |    t         j                  j                         5   | i |cd d d        S # 1 sw Y   y xY wr   )r   r<  DisableTorchFunctionSubclass)r   r   real_compiled_fns     r   _tf_disabled_wrapperzCOutputGraph.compile_and_call_fx_graph.<locals>._tf_disabled_wrapper
  s9    >>@ A/@@A A As   2;z"do not trace Dynamo-compiled graphrh  unique_graphsz:Compiling backend specialized graph with specialization=%sc                      |||          S r   r   )r  r   check_fns      r   rU  z7OutputGraph.compile_and_call_fx_graph.<locals>.<lambda>
  s    X$(IF" r   r   r   r   c                     	D ]  \  }} ||       s|v r |   | i |c S j                   j                  |j                  |j                        5  |j                  d<   t        |       }t        j                        5  j                  |      |<   d d d        d d d         |   | i |c S   | i |S # 1 sw Y   'xY w# 1 sw Y   +xY w)Nspecialization)	r/  patch_source_specializationr  rK  r/  r   r   r  call_user_compiler)
r   r   rK  rM  r   compiled_fnr   r   specialization_cachespecialization_guardss
        r   specialized_dispatchzCOutputGraph.compile_and_call_fx_graph.<locals>.specialized_dispatch
  s	   4I Y0.#D>-1EE'K';N'K%)("-3(" !" "&!K!K . 5 5~7N7N" 	& =K(8 9?CDz%,T-A-A%B !&(,(?(?N(S %9$H!&	& $H#7#G#XQW#XX%Y& '777!& !&	& 	&s$   0CC C C	CC	c                  l     j                  t        j                  j                  j                  d      S )Nstore_user_object_weakrefs)rS  r   r=  graph_bytecode_inputsr   )rT  s   r   rU  z7OutputGraph.compile_and_call_fx_graph.<locals>.<lambda>   s(    B//;;DD4 r   )vr   r&  r   clear_framer  rf  r  r  rh   r   r  r=   r   r   r   r-  r$  r  rx  
create_argrN  
dedup_passr   _maybe_preserve_original_metar-   do_not_emit_runtime_assertsrj   dirr   r   r  r)   r/  r(  remove_unused_get_attr_nodesremove_unused_graphargsri   &remove_tensorify_specialized_graphargsr  rp  r    dce_extra_outputsr4  r  r   r  r  
parametersrk  rA  rv  _backend_idr  r  r   r/  r  r  graph_code_logr  rs   r  r  rq  r  r  _old_fake_moder  r8  r  r  r  r  rO  r   torch.fx._lazy_graph_modulerB  r   rC  force_recompiler   add_backend_idr  specializationsr3  r  r5  inspect	getsourcerK  stripRootGuardManagerr   LAMBDA_GUARDr   r   r  r  r=  r	   install_global_unsafers  r?   rG   r\  rH   r0  r0  ra  r  r  r`  pop_topr  rc  rQ  make_call_generated_coderc  )(r   r{  r  r  rf  r  output_nodesub_gmsattrsubgraphncallsr4  subgraph_nameregister_finalizerold_fake_moder  backend_fake_moderB  lazy_gmrH  rh  asourcesrM  source_indexcheck_fn_sourceunused_root_guard_managerrK  rS  tmp_varsconstructorvar_namer  r=  rT  rP  r   rG  rQ  rR  s(   `                                 @@@@@@r   r  z%OutputGraph.compile_and_call_fx_graph
  s    ]]))557 j	)+####((*4::&!+B1j	) j	) _=Db$'''dN333
 ::2rB ::2rB**$$//5OB5O0OPR	K oo'G(==b+N55 ""CD  #D	 #*4#6%h?; ( $ $'+{{	 5573tTZZ8#{{	& ((* ,FW./69/779 !!'')#D$**5B@!"%
 66%)%L%L MMBwt]/KLM '+&A&A '""2&' BMMOT*6 ##N((%*4PT )  $  ||'!% *.)E)EB& 55::< GG67 ,0+A+ABGG'($(BGGL!((4262K2K./  &"T$PT NN++%D ,  ##% 00::M ,,,"/D;;99]]E]R  ).(9(9(H(H"/"9"9 )I )%& 2C$$.**, Q"55b$:M:M:OPQ E+'787;
DACST((O; "+/?@  $--  !009!+/?@")//K||'++D+> 33#. A 3!$HK Wo.!3. **666"/"9"9"I"III(*%SU$-1^^<188<<&5 N#*==1F1F#GL&-&7&78O8O&P&V&V&XO0@0B-%221&//()	 H IIT'
 *00%--;C !" !-	 +
#: &&.R&S8 8s 8s 8 8 T8. **41EF **4=<<+++4<<(B!    #@#G#G#I .KO  HHX&OOH-. !) ?H$$R^^H%=>?   %B!CUK

%dnn5 WSLOJJ$$DDSIW ''-&&(U	j	) j	)P t *Q Qh =Wj	) j	)sq   Ab7C+b715b'A6bIb74+b)b7!b%)Db7 b2I.b7b	b7b"	b7%b/	*b77c c                 :    | j                   j                  d      S )Nr~  r  )r   
find_nodesr   s    r   placeholderszOutputGraph.placeholders<  s    zz$$$66r   c                 Z    | j                   D cg c]  }|j                  d    c}S c c}w Nr,  )r  r/  r   r   s     r   r3  zOutputGraph.graphargs@  s%    262C2CD$		*%DDDs   (r   r   c                 t    t        dddddd      5  | j                  ||      cd d d        S # 1 sw Y   y xY w)NOutputGraph.call_user_compilerbackend_compileTcompile_aot_autograd'aot_autograd_cumulative_compile_time_us)
phase_namer  log_waitcounterwaitcounter_name_overridedynamo_compile_column_us)rj   _call_user_compiler)r   r   r   s      r   rO  zOutputGraph.call_user_compilerD  sI     ,("& &<%N
 	@ ++B?	@ 	@ 	@s   .7c                    | j                   J d}g }|j                  j                  D ]6  }|j                  dv r|dz  }|j                  dk(  s&|j	                  |       8 t        |       |D ]/  }t        |d      r|j                  d   }|j                  |_	        1 | j                  |_        | j                  |_        t        | j                  t         j"                        xs | j                   }t%        | j                  t         j&                        }	|	rt)        ||	      }t        |d      r|j*                  nd}
t         j,                  rdd	lm}  ||      }	  t1               t2        j4                  d
|
        t         j6                  rt9        |      } |||      } t1               t2        j4                  d|
        t;        |      sJ d       	 t]        ddi | j^                  |ta        |j                  j                        ta        |      d       S # t<        t>        f$ r  t@        $ r}| jB                  rCtE        | j                   |tG        jH                               jK                  |jL                        d tO        || jP                  jR                  dd|
 dtU        |       d| jP                  jW                          d|
 dtU        |       ddg       Y d }~d }~wtX        $ r  tZ        $ rH}tE        | j                   |tG        jH                               jK                  |jL                        d d }~ww xY w)Nr   r`  call_methodcall_moduler,   r~  _dynamo_sourcer,  r   z<unknown compiler_fn>)inline_invoke_subgraphz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)1r   r   r  r  r   rq   r  r/  r  r  r  _param_name_to_sourcer  _source_to_user_stacksrJ   r  r-   debug_backend_overriderK   debug_inductor_config_overrider   r   r  5torch._higher_order_ops.passes.inline_invoke_subgraphr   r/   INFOr   r   callabler   r   rC   r  rB   ri  currentframewith_traceback__traceback__rF   rs  ru  r   format_frame_summaryrD   r   r   r  r  )r   r   r   totr  r   plr=  r   inductor_config_overrider  r  rP  r  s                 r   r  zOutputGraph._call_user_compilerQ  s-    +++HHNN 	*DwwIIqww-'##D)		*
 	3 	/B2/0ggj) %(JJ!	/ $(#<#< $($>$>! 0&&(E(E   	 	 $O""F$I$I$
  $45K {J/   ( 	
 (( (+B	8LN7<<+EdV)LM((,[9%b.9KLN7<<+B4&)IJK(O*OO(6 	,..!"((..1"<0			
 M /0@A 	0 	55+$$a)=)=)? .1t< '##4#D6c!fX^DLLLmLmLoKpq0nSVHLcdC	 	  	  	8'  !W%9%9%;nQ__-48	8s'    A:H" "M:B/K//MAMMc                 d    t         j                  j                  j                  rt	        |       S i S r   )r   r=  r-   use_graph_deduplicationrI   r   s    r   rY  zOutputGraph.dedup_pass  s%    ==77,T22Ir   sub_gmc                 z    t        || j                  d      }||_        d|_        | j	                  ||d        |S )NT)requires_suffixFr+  )ro   r   r   torchdynamo_force_dynamicr(  )r   r  r  	next_names       r   rH  zOutputGraph.install_subgraph  s@    'dootT	#+0( 	$$VYt$Dr   c                 V    | j                   D cg c]  }|j                   }}|S c c}w r   )r3  example)r   r=  r  s      r   r   zOutputGraph.example_inputs  s'    )-8##++88 9s   &c                     t        | j                  j                  d      d      D ]5  }t        t	        |j
                              dk(  s%| j                  |       7 y )Nr  r  T)reverser   )r  r   r  r  r   usersr  r  s     r   r]  z(OutputGraph.remove_unused_get_attr_nodes  sN    4::00J0?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(  s%|j                  d
k(  s||j                  dk(  r|j                  t         j"                  u sQ|j                  dk(  r1|j                  t$        j&                  u r ||j(                  d         s ||      s	 ||      s j+                  |        dt        j
                  dt,        j.                  d z  fd}dt        j
                  dd f fd}t1               dt0        t,        j.                     dt$        j2                  t$        j4                  z  dd fdg } j6                  D ]  } ||      d u}|r|j                  r|j9                  |       /|j                  s&t;        |j<                  d   t>              s	 ||       a|j<                  d   }	t;        |	t>              rt;        |j<                  d   j@                  t$        jB                        r|j<                  d   j@                  }
|j<                  d   jD                  }t$        jF                  jH                  jK                  |
      sotM        |
jO                               }|D ]Q  }tQ        |jR                  |      }tU        jV                  t$        j2                  t$        j4                  ffd|       S ~tY        t[        |j<                  d   j@                              r|	j\                  |	j\                  n|	j@                  } |        |D ]+  } ||      }||vr	 ||       j_                  |       - y )Nb_noder   c                     | du ryt        | t        j                        sy| j                  j	                  d      }|y|du ryt        |t
        j                        r|j                  j                         x}|S y)NTFr1  )	r   r   Noder/  rf  r   SymBoolr   maybe_as_bool)r  brs      r   is_static_truez;OutputGraph.remove_unused_graphargs.<locals>.is_static_true  sq    ~fbgg.0AyDy1emm,&&..00Q= r   r{  c                     ddl m} t        | t        t        t
        f      ryt        | t        j                        r%t        | j                  j                  d      |      S y)Nr   SymTypesTr1  F)
torch.fx.experimental.sym_noder  r   r  rl  r   r   r  r/  rf  )r{  r  s     r   is_symnode_argz;OutputGraph.remove_unused_graphargs.<locals>.is_symnode_arg  sD    ?!c5$/0!RWW%!!&&**_"=xHHr   r   c                    ddl m} | j                  dk7  ryt        | j                  j                  d      |      syt        fd| j                  D              syt        fd| j                  j                         D              syy)	Nr   r  r`  Fr1  c              3   .   K   | ]  } |        y wr   r   rY  r{  r  s     r   r[  zWOutputGraph.remove_unused_graphargs.<locals>.is_symnode_compute_node.<locals>.<genexpr>  s     <Q~a(<   c              3   .   K   | ]  } |        y wr   r   r  s     r   r[  zWOutputGraph.remove_unused_graphargs.<locals>.is_symnode_compute_node.<locals>.<genexpr>  s     GQ~a(Gr  T)
r  r  r  r   r/  rf  r  r   r   r0  )r   r  r  s     r   is_symnode_compute_nodezDOutputGraph.remove_unused_graphargs.<locals>.is_symnode_compute_node  sg    ?ww/)diimmO<hG <$))<<G$++2D2D2FGGr   r   )is_accessor_noder  r`  c                     | j                   d   }|j                  }t        |t        j                        rDt        |j
                  j                  t        j                        r|j
                  j                  S y r  )	r/  r  r   r   r$  r   exprsympySymbol)r   r=  r  s      r   placeholder_binds_symbolzEOutputGraph.remove_unused_graphargs.<locals>.placeholder_binds_symbol  sV    ))J'CkkG'5<<0Z!!5<<6 ||(((r   c                     t         j                  d| j                  d   j                  j                         | j                  d= j                  |        j                  j                  | d        y )NzREMOVE UNUSED GRAPHARG %sr,  )r   r  r/  r  r  r  r  r   )r   r   s    r   remove_unusedz:OutputGraph.remove_unused_graphargs.<locals>.remove_unused%  sY    II1499Z3H3O3O3T3TU 		*%T"!!%%dD1r   used_symbolsfakec                      | t        |      z  } y r   )r"   )r  r  s     r   update_used_symbolsz@OutputGraph.remove_unused_graphargs.<locals>.update_used_symbols/  s     L..Lr   r,  c                      |       S r   r   )tr  r  s    r   rU  z5OutputGraph.remove_unused_graphargs.<locals>.<lambda>R  s    .A,PQ.R r   )0r  r   r   Argumentr   r  %torch.fx.experimental.symbolic_shapesr  ro  r   r   r  r  r  r  r  operatorgetitemr   _checkr   r  r  r  r   r$  r   r  r   r   r/  rx   r  ScriptObjectexample_strong_refr  r  tracing_with_realr   __obj_flatten__r   wrapped_objpytreetree_map_onlyr   r.  r  remove)r   r  r  r  r   r  r  recheck_placeholdersbinds_symbolr=  real_script_objr  	flat_dictrs  fake_attr_valr  symbolr  r  r  s   `                @@@r   r^  z#OutputGraph.remove_unused_graphargs  sb    	277#3#3 	 	&	bgg.. 	4 		"'' 	d 	" 	KT$**"2"234 	+D4

#$)GGz)?2t{{hFVFV7V?2 KK5<<7*499Q<8.t4'-$$T*	+	277 	u||d7J 		2 	2D 	2 +.%	/ell+	/38<<%,,3N	/	/
  "%% &	<D3D9ELzz(//5zz*IIj)+@+ "$' ))J/C!#'<= !$))J"7"?"?ASAST*.))J*?*G*G*.))J*?*R*R$~~AASS+  )-_-L-L-N(OI(1 "07$3$?$?1" !' 4 4%*\\5<<$@$R$1!"	" !%d499Z+@+H+H&IJ +.??+FCKK  (d;M&	<R ) 	0D-d3F!-!$' !''/	0r   c                    ddl m} | j                  j                  D ]  }|j                  j                  d      }t        |t              s0|j                  =t        |j                  j                  j                  d      sht        d |j                  D              s|j                  |j                  j                  j                  j                        st!        |j                        D ]7  }|j#                  t%        |j                               | j'                  |       9 | j'                  |       ! y )Nr   )TensorifyStater1  r  c              3   :   K   | ]  }|j                   d k(    yw)itemN)r  )rY  us     r   r[  zEOutputGraph.remove_tensorify_specialized_graphargs.<locals>.<genexpr>~  s     ?qF*?s   )torch._dynamo.symbolic_convertr  r   r  r/  rf  r   r   	item_memor  r   _exprr  r  should_specializer  r   replace_all_uses_withr#   r  )r   r  r   r1  r  s        r   r_  z2OutputGraph.remove_tensorify_specialized_graphargsg  s     	BJJ$$ 	'D IIMM/:M=*5!++7M3388>>G?DJJ??"44!++0066;;
 djj) (A++L9P9P,QR$$Q'(   &	'r   c                 H    | j                   j                  |       d| _        y)zt
        We call this on the creation of a new compiled subgraph that is inserted
        before user code.
        TN)r  rb  r  )r   r   s     r   r  z#OutputGraph.add_output_instructions  s     
 	  ''/r   r  r  c                     j                   rDdt        t        j                  df   dt        j                  ffd}| j                  |       y| j                  t        j                               y)aa  Install a resume function as a global.

        When the code has freevars, installs a factory that creates the
        function with correct globals and closure (since MAKE_FUNCTION
        inherits the current frame's globals, which is wrong for resume
        functions from inlined frames). Otherwise installs the function
        directly.
        closure.r   c                 6    t        j                  d |       S r   )typesFunctionType)r  r  r  r  s    r   _make_fnz<OutputGraph.install_resume_function_global.<locals>._make_fn  s     ))$	4wOOr   N)r]  rN  r  CellTyper  rn  )r   r  r  r  r  s    ``` r   install_resume_function_globalz*OutputGraph.install_resume_function_global  so     Pu~~s23P##P
 &&tX6&&""4D9r   c                     || j                   vsJ | j                   j                  |       | j                  j                  t	        j
                  | j                  ||             y)a`  
        WARNING: prefer the safer `install_global_by_id/install_global`.
        torch.compile instances should be independent of each other;
        one footgun is to have one instance depend on the existence of
        a global installed by another instance. This can happen if we mangle
        a global the same way across both instances.
        N)r  r   r  r   re   rX  r  )r   r  r  s      r   rn  z!OutputGraph.install_global_unsafe  sS     411111""4([//0A0A4OPr   c                     | dt        |       d| j                   }|| j                  v r|S | j                  ||       |S )z
        Installs a global if it hasn't been installed already.
        This is determined by (prefix, id(value)) pair.

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

        Returns the name of the newly installed global.
        )r=   rn  r  s       r   r  zOutputGraph.install_global  s#      ""4/r   c                 
   d | _         | j                  j                          | j                  j                          d | _        | j
                  j                  D ]  }d|j                  v s|j                  d=   | j                  j                          | j                  j                          t        | j                               | _        | j                  j                          | j                  j                          | j                  j                          | j                   j                          | j"                  j                          | j$                  j                          | j&                  j                          | j(                  j                          | j*                  j                          | j,                  j                          | j.                  j                          | j0                  j                          y r  )rs  r   rp  r  r  r   r  r/  r  r  rN  r  r  rq  r  r  r  r  r  r  r  r  r  r  r  r  s     r   cleanupzOutputGraph.cleanup  s    //557$(!JJ$$ 	*DTYY&IIj)	* 	##%  &&(8=5579
5 	!##))+##%$$**,""$##))+--335""$  &&($$**,  &&(!!#r   rw  c                 :    | j                   j                  |       y r   )r  r   )r   rw  s     r   add_graph_finalizerzOutputGraph.add_graph_finalizer  s     	##**+=>r   r   c                     |j                   dk(  r|j                  d   j                  S |j                   dk(  sJ | j                  |j                     S )z#Extract the non-fake example tensorr~  r,  r  )r  r/  r  r   r  r  s     r   example_value_from_input_nodez)OutputGraph.example_value_from_input_node  sH    77m#99Z(000ww*$$$t{{++r   inlined_modulec                 Z    t         j                  j                        t         j                   j
                         j                  j                         dt        dd f fd}t        |d      rQt        |j                        r<|j                  j                  t        u r |j                         D ]  \  }} ||        t        |d      rTt        |j                        r>|j                  j                  t        u r!|j                         D ]  \  }} ||        y y y y )Nr  r   c                     j                   J j                  |       } d|  }|j                   |<   t        t              r-| j                  t
        j                  |j                        <   y y r  r  r  s      r   r   zHOutputGraph.add_fqn_info_for_inlined_modules.<locals>.register_leaf_name  s}    ,,888==fiPJq,H2<D%%h/&+.  55//
@ /r   r!  r"  )rp  r  r  ro   r  r  r   r   r  r  r&  __func__!og_module_named_parameters_fn_ptrr'  og_module_named_buffers_fn_ptr)r   r  r  r   r  r   r  s   ` `   @r    add_fqn_info_for_inlined_modulesz,OutputGraph.add_fqn_info_for_inlined_modules  s    **6;;7"$994;L;L
 	//33D9	# 	$ 	 >=1889"33<<45 %3$C$C$E 2LIq&y12>:.556"009912 %3$@$@$B 2LIq&y122 7 /r   Fr   )r  r   )r   r  )r{  r   r   N)r   rp  )r   r   )tmp)r   rm  )r   r   r   r   rQ   r   r   r   r	   r2   r   r   r   r5  r   r   r   r6  r7  r   r   r  r   rT   r  r  r  r  r  r~   rN  r   Proxyr#  r"  r  r  r   rk  rm  rq  rA  r-  rx  rz  r  r  r  r  Graphr   setterr  r  r   r  r  r  r   r  r  r  r  r  contextmanagerr(   r   r  r  r  r  r  r%   r/  r&  r?  r   r   r@  r2  r  r  r  r  r  rh   r  r  r   r   r  r0  r  staticmethodr  r  r(  r<   rB  rC  rX  r   r  r?   r  r  r  rk  r  r  r  r  r$  r-  r   r  r  ry   r3  r  r1   rO  r  rY  rH  r   r]  r^  r_  r  r  r  rn  r  r  r  r
  r  r  r   r   r   rp  rp  K  st
      TU38nTU  $&TU -	TU
 TU %%67TU TU TU TU TU $((I(I#JTU *+TU TU 
TUn 385V+/5V	c5VnF # * >>"%>	>* 8DD3 D
 4:5#5-05	sEHHNN"	#5)%((.. )*<:T#Y=M :B >B	$S#X$ CHo$  s 23d:	$
 
$L&8BG#4 & &#
      & & - 	 F	I  C  D  . )uxx~~ ) ) \\*588>> *d * * 7T#rxx-%8 7 7 4$rww'<"= 4 4 1tELL%8S2T$TU 1 1A# A A A@ @ @ @@ @ @ @ 
 #'	} /0 4Z	
 
/	0 :   .5,,;; . . 88 8 8
 A// A A >DcN > > FD)C)C$D F F HL'
U8CH#5t#;<<=D'
	'
R$& N N
6 
c 
'S '0 0JT J# %((//C*? C C 5C 5D 5
    .,/	&c%,,.4c c 	c
 
cJY/-Y/	tK $vv~"66	7Y/vh"-h";>h"	tO$&99	:h"\ 	l&'l& #l& 	l&
 
!	"l&\F ; F Ft F2"G'"G ?+"G 	"G
 "G 
"GH1<S   4Dd39o1E,F C C 2 c  "!7F'()'/J'	'R>()>/J>	>@w)'w) !w) 	w)
 
k	w)r	 7d277m 7 7 E4> E E@..@26v,@	@a..a26v,a	aFDehh&:&:!:; S %((2F2F 3 U\\ 2 
'
X0t 'D d;.?  D   nn S>	
 
8
Q# 
Qc 
Qd 
Q3 s s 	S 	 	 	$:?"*BNN+;T+A"B?	?
,%((-- ,C ,$2#hhoo$27=$2	$2r   rp  c                       e Zd ZU eed<   eed<   edz  ed<   edz  ed<   eedf   dz  ed<   ee	ef   ed<   	 dd	d
dedz  ddfdZ
ddZy)DynamoTracerOutputerror_on_graph_breakis_tracing_resume_prologueNoutput_graphoutput_graph_for_cleanup.r  r  r  r   r}  r   c                     |j                   | _         |j                  | _        |j                  | _        |j                  | _        |j                  | _        |rd | _        y |j                  | _        y r   )r  r  r  r  r  r   r  )r   r  r}  s      r   r   zDynamoTracerOutput.__init__-  s[     %+$?$?!*0*K*K'~~))(.% $D &Dr   c                 2   | j                   }|r|j                  D ]  }|j                  j                           |j                  j
                  rG|j                  j
                  j                  r&d |j                  j
                  j                  _        y y y y r   )r   r  r   _clear_nodesr  r  r/  r}  )r   r  r  s      r   _cleanup_output_graphz(DynamoTracerOutput._cleanup_output_graph:  s    44&.. ,))+, ,,66 00::DDQU,,66@@N E 7 r   r   r   )r   r   r   r   r   rp  rN  r	   r   r   r   r$  r   r   r   r  r  #  su     $$$$ *D0038_t##CH~ HL.1.:=*.	.
Vr   r  a  With the current config, we will graph break (and fall back to eager-mode PyTorch) on all ops that have do not have the 'pt2_compliant_tag'. Please see the following doc for how to mark this op as PT2 compliant https://pytorch.org/tutorials/advanced/custom_ops_landing_page.htmlr  kindr  r   r   c                 \    |dk7  ry dt         j                  j                  dd f fd}dt         j                  j                  dt        dd f fd}t	        |t         j                  j                        r=t         j
                  j                  |j                  v r	 ||       y  ||d| d       y t	        |t         j                  j                        r't        |j                               }t        |      d	k(  rLt        ||d
         }t         j
                  j                  |j                  v r	 ||       y  ||d| d       y t         j                  j                  j                   j                   ||fd      \  }}	 t        j"                  j$                  |j&                  g|i |}	t        |	      }t         j
                  j                  |j                  v r	 ||       y  ||d| d|	 d       y y # t(        $ r"}
t+        ddt        |
      g        Y d }
~
sd }
~
ww xY w)Nr`  r  r   c                 Z    | j                   dv ry j                  j                  |        y )N>   atenprimprims)	namespacer  r   )r  r  s    r   encountered_compliant_opz8check_pt2_compliant_op.<locals>.encountered_compliant_opV  s)    88))--f5r   r   c                     j                   j                  |        t        j                  rt	        dd|dz   t
        z   g        y y )Nz Encountered non-PT2-compliant oprn   r%  )r  r   r-   only_allow_pt2_compliant_opsrE   err_epilogue)r  r   r  s     r   encountered_non_compliant_opz<check_pt2_compliant_op.<locals>.encountered_non_compliant_op[  sB    &&**62..:#I4	 /r   z%Encountered the torch.ops.OpOverload z that is not PT2 compliant.r,   r   z:Encountered the non-overloaded torch.ops.OpOverloadPacket z that is not PT2 compliant. Fz*Error when attempting to resolve op packetrn  r%  z+Encountered the torch.ops.OpOverloadPacket z! which resolves to the overload (z) that is not PT2 compliant.)r   _ops
OpOverloadr   r   Tagpt2_compliant_tagtagsOpOverloadPacketrN  	overloadsr  r   r=  rU  get_fake_values_from_nodesr  r<  _jit_resolve_packet_qualified_op_namer   rE   )r  r%  r  r   r   r,  r1  r8  r  overloadr  s   `          r   check_pt2_compliant_opr=  P  s    6)>)> 64 6
UZZ-B-B  QU  &%**//099&&&++5$V,$3F8;VW	
 	&%**556&**,-	 y>Q1.Byy**bgg5(,(..4X 6./ }}**EE##dF^U
f
	xx33)),04:H VX&99&&"''1$R((=fX F33;* =%&I 70  	DF	 	s   -H   	H+	H&&H+PRc            
       f    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
y)
r  r  r  r   r   r   r   Nc                 <    || _         || _        || _        || _        y r   )r  r   r   r   )r   r  r   r   r   s        r   r   zLazyProxy.__init__  s      	r   c                 N     | j                   | j                  i | j                  S r   )r   r   r   r   s    r   r  zLazyProxy.__call__  s     tww		1T[[11r   )r   r   r   r   r>  r?  r   r   r   r	   r  r   r   r   r  r    sS      QTN vv	
 (( 
2# 2r   r  c                       e Zd ZdZ	 	 	 	 d,ddded    dededz  dedz  d	df fd
Zde	d	dfdZ
dddej                  d	dfdZ	 	 	 d-dedededededz  dedz  deej                  gej                   f   dz  d	ej                   fdZ	 	 	 d-dedededededz  dedz  deej                  gej                   f   dz  d	ej                   f fdZ	 	 	 	 d.dedededededz  dedz  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dz  d	ej                   fdZd ej                   d	eej                   z  fd!Zd"ed	efd#Zded$eej                  j                   z  d	dfd%Zdej8                  ej:                  z  d&edz  d	dfd'Zd(ej8                  d	ee jB                     fd)Z"d	e#fd*Z$d	e%fd+Z& xZ'S )0r  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.
    Nr  rp  r  ry  r  r  r   c                    t         |           t        j                  |      | _        t
        j                  j                         | _        || _	        i | _
        i | _        || _        || _        || _        i | _        i | _        i | _        d | _        d| _        d| _        d| _        d | _        t/               | _        d| _        ||j4                  dz   nd| _        d | _        d | _        d | _        d | _        | j                  g | _        n:| j                  j>                  | j                  jA                  |      |fgz   | _        t/               | _!        g | _"        t        jF                         rtI        d      t/               | _%        y )NFr,   r   zSInference mode is supposed to be disabled during compilation. Please open an issue.)&r   r   weakrefr  r  r   r   r  r   ry  r  r  r  r  r  lifted_freevarsr  dynamic_scalar_nodes	prev_inst,unsafe_allow_externally_visible_side_effects+traced_with_externally_visible_side_effectsallow_side_effects_in_hopside_effect_stackr*   traced_sourcesis_reconstructing_generatordebug_level	_cur_code_orig_gm_meta_orig_gm_lineno_map_orig_gm_firstlinenosource_fn_stack_target_to_str_used_namesr  is_inference_mode_enabledr   tracked_proxyable_vt)r   r  r  ry  r  r  r   s         r   r   zSubgraphTracer.__init__  s    	#MM,7XX^^%
 # 9; =? *& :< NP >@!
 =B9;@8 */& AE 3=, ,1(:@:L 2 2Q 6RS/3AE 04!
 ;;.0D #';;#>#>**=9=IB $D 
 -7L 8:)**,e  BL!r   r  c                 :    | j                   j                  |       y r   )rX  r   )r   r  s     r   record_proxyable_vtz"SubgraphTracer.record_proxyable_vt"  s    !!%%b)r   r{  r   r   c                    | j                   r| j                  r| j                  r|j                  j                  }d }|)| j                  j                  || j                  z
  d       }|]| j                   |   }t        j                  j                  D ]  }||v s||   |j                  |<    d|v r|d   |j                  d<   y y y y y y )Nstack_trace)
rQ  rR  rS  current_instructionstarts_linerf  r   r  _COPY_META_FIELDSr/  )r   r{  r   linenonode_idxr/  r   s          r   rZ  z,SubgraphTracer._maybe_preserve_original_meta&  s     (())++77FH!3377T666 #))(3XX77 7E}+/;		%(7 !D(/3M/BDIIm, ) $ * ) r   r%  r  r   r   r  	type_exprproxy_factory_fnc           	      \   t        j                         }	 | j                  |||||||      | j                  j                  xj
                  t        j                         |z
  z  c_        S # | j                  j                  xj
                  t        j                         |z
  z  c_        w xY wr   )r  r   _create_proxyr  r  r  )	r   r%  r  r   r   r  rb  rc  _t0s	            r   r  zSubgraphTracer.create_proxy<  s     lln	%%fdFD)=M 66FF$FD66FF$Fs   A+ +A B+c           	      >   | j                   ^t        j                  ||f      \  }}	g }
|D ]$  }| j                  |      }|
j	                  |       & t        j
                  |
|	      \  }}t        |   ||||||      | j                  j                  }t        j                  dk\  r|dv r|j                  | j                  urj                  }j                  j                  g|j                   |j#                  j                  j                        dt$        ffd}t&        j)                  dt+        |             | _        d}|j                   | j,                  ur t/        j0                  |j                         j3                  dd	              }t5        |t6        j8                  j:                        rld
}|j<                  j>                  D cg c]  }|j@                   c}| _!        |jD                  | _#        |jH                  jJ                  jL                  | _'        nd | _!        d | _#        d | _'        |jP                  }|r'|jS                         jT                  j@                  d<   |dv rƉjT                  jV                  f}|rtY        jT                  j@                  d   j[                               d   d   }|j\                  j_                  d      r3|j\                  j_                  d      sjT                  jV                  |f}| j`                  |gz   jT                  j@                  d<   n|dk(  r| j                   tc        dd| jd                   dg        | j`                  jT                  jV                  tg        fdjT                  j@                  d   ji                         D              fgz   jT                  j@                  d<   | jk                  |jT                         |s!djT                  j@                  vr5|jP                  }|r'|jS                         jT                  j@                  d<   djT                  j@                  vr|dv r>| j`                  jT                  jV                  fgz   jT                  j@                  d<   nz|dk(  ru| j                   tc        dddg        | j`                  jT                  jV                  jT                  j@                  d      d   fgz   jT                  j@                  d<   djT                  j@                  vrg }|r?|jm                         s|j	                  |jo                                tq        |dd       }|r?|D cg c]  }|jr                  tu               vr| }}|jw                          tx        jz                  j}                  |      j                         }dj                  |      jT                  _A        t6        j                  j                  j                  s$t6        j                  j                  j                  rD| j                  j                  j                  | j                  j                  jT                         S c c}w c c}w )NrZ  r  )r`  r   c                  v    t              j                         } dj                  j                   d d|  S )NzTRACE FX call z from r  )rl   rstripr   r  )linecur_instheaderr  tx_codes    r   get_trace_call_log_strz<SubgraphTracer._create_proxy.<locals>.get_trace_call_log_str  s9    5gxHOOQD+BGGLL>xr$PPr   r;  Forig_graphmodulec                       y r   r   r   r   r   rU  z.SubgraphTracer._create_proxy.<locals>.<lambda>  s    r   Tnn_module_stack>   r  r`  rw  r,   )ztorch.nn.modulesz	torch.ao.ztorch.nn.modules.containerrT  r  z4Invoking an nn.Module inside a higher order operatorzHigher order op name: zThis is not supported.r%  c              3   \   K   | ]#  \  }\  }}|j                  d       d   k(  r| % yw)@r   N)r  )rY  r   r   tyr  s       r   r[  z/SubgraphTracer._create_proxy.<locals>.<genexpr>  s5      &Aw2773<?f4 s   ),z2Invoking an nn.Module inside a HigherOrderOperatorrn  r\  r  )Hr  r  tree_flatten#maybe_lift_tracked_freevar_to_inputr   tree_unflattenr   r  r  r  rS  rT  r]  rH  	positionsr`  ru  get_line_of_code_headerr   trace_call_logr  rt   rP  r>   get_contextrf  r   r   r   r  r   r  r/  rQ  _lineno_maprR  r   __code__r|  rS  rq  r   r   r  r   r0  r   
startswithrT  rE   r  r  r   rZ  is_co_filename_from_nn_modulesframe_summaryr   r  r'   r  r   StackSummary	from_listr  r  r\  r=  r-   r  track_nodes_for_deduplicationr  
track_node)r   r%  r  r   r   r  rb  rc  	flat_args	tree_specnew_flat_argsr=  maybe_new_argr{  rn  is_retracingorig_graphmodule_maybendrq  r   current_nn_moduleframe_summariesframefiltered_frame_summariesmsgsrk  rl  r  rm  r   s     `                      @@@@r   re  zSubgraphTracer._create_proxyP  s   V ;;"#)#6#6f~#F IyM  4 $ H H M$$]34 "00	JLD&W!
 )) w&4 4
 ,

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

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

d#  $$TYY5r   r1  beforer  c                 (   t        |t        j                        r%| j                  j	                  |j
                         t        j                  d|||j                  nd|| j                  |       || j                  J d| d| d       | j                  rd| j                  X|J t        |d      sG| j                  j                  j                  |g       j	                  t!        j"                                t%        || j&                        }| j(                  rqt+        t-        | j(                              }| j(                  |   j.                  }|r| j0                  j3                  |      }n7| j0                  j5                  |      }n| j0                  j3                  d       }|5  | j7                  d|d	i |
      }	t9        |	j.                  |       | j(                  r>|r<| j(                  j;                         \  }
}|	| j(                  |<   || j(                  |
<   n|	| j(                  |<   | j&                  j=                  |       | j                  }t        j>                  jA                         }|s|st        |t        j                        r| jC                  ||       nht        |tD        tF        f      rRtI        |      D ]D  \  }}t        |t        j                        s!d }|rtK        ||d      }| jC                  ||       F t        |t        jL                        rQt        |j.                  jN                  tP        jR                        r#|	| jT                  |j.                  jN                  <   |	cd d d        S # 1 sw Y   y xY w)Nz7create_graph_input %s %s %s at debug_level %s before=%sz(none)z0you are required to provide a source for inputs z example_val z on the root tracerT)only_allow_inputr~  r   rb  F)r  r5  index_is_slice)+r   r   r   r  r   r  r   r  r  rO  r  ry  r[   r  r  r  r   r  ro   rV  r  r  ro  r   r   inserting_beforeinserting_afterr  rw   popitemr   compileris_compiling_lift_basic_symbolsr   rN  r  rX   r$  r  r  r  r  )r   r  rb  r1  r  r  	prev_namer   ctxr  r   r   is_strict_exportis_non_strict_exportrV  r  e_sources                    r   r.  z!SubgraphTracer.create_graph_inputN  s    mU\\2--44]5K5KL		E!-FKK8	
 >;;* B4&VcUddwx* >>dkk1%%%'F!!77BB62NUU"002 #4)9)9:##Xd&>&>?@I++I6;;Djj11$7jj006**--d3C F	%%mT2rY%WEejj-8''F//779116((../((+16((.
   &@  $~~#(>>#>#>#@ #,@mU\\:,,]FCe}= )- 8 >1)!U\\:$#'!'4%+&'/4(H 00H=> -6:""''< ?D""=#5#5#:#:;MF	 F	 F	s   .GNNr  c                    | j                   J d       |j                  j                  d   }t        |t        j
                        rE|j                  j                  | j                  v r#| j                  |j                  j                     S || j                  v r| j                  |   S |j                  | j                   k7  r| j                   j                  |       |j                  j                  d   }t        |t              rt        |j                        n
t        |      }| j                  |j                  j                  ||      }|| j                  |<   |S )NzIlift_tracked_freevar_to_input should not be called on root SubgraphTracerr1  )r  r   r/  r   r   r$  r  r  rF  r  lift_tracked_freevar_to_inputr   r.  real_objr.  r  )r   r  r1  rb  	new_proxys        r   r  z,SubgraphTracer.lift_tracked_freevar_to_input  s.    {{& 	
W	
& 

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

8 -)9: ''(m$ 	
 ++EJJOOYV	&/U#r   r=  c                     t        |t        j                  j                        sDt        |t              r2t	         fd|j
                  |j                  |j                  fD         S |S |j                   k(  r|S  j                  |      S )z
        If arg is a free variable, then lift it to be an input.
        Returns the new lifted arg (if arg was a freevar), else the
        original arg.
        c              3   @   K   | ]  }j                  |        y wr   )rv  )rY  sub_argr   s     r   r[  zESubgraphTracer.maybe_lift_tracked_freevar_to_input.<locals>.<genexpr>  s$      # @@Is   )
r   r   r   r  slicestartstopstepr  r  )r   r=  s   ` r   rv  z2SubgraphTracer.maybe_lift_tracked_freevar_to_input  sy     #uxx~~.
 #u%(+		388SXX'F  
ZZ4J11#66r   e_proxyc                     j                   t        t              sJ dt        dt        f fd}dt        dt        dt        dt
        j                  ffd}t        |t        j                        rt        |j                               D ]  \  }} ||      st        j                  d||j                         t        ||d	t        j                  j                   j"                  j$                  |fi t'        |      
      } j)                  ||        |j+                         } ||      rst        j                  d|j                         t        ||d	t        j                  j                   j,                  fi t'        |      
      } j)                  ||       |j.                  t        j0                  u rt        |j3                               D ]  \  }} ||      st        j                  d||j                         t        ||d	t        j                  j                   j4                  j$                  |fi t'        |      
      } j)                  ||        n6|j.                  t        j6                  u rA j)                  |j9                                 j)                  |j;                                n|j.                  t        j<                  t        j>                  hv rA j)                  |jA                                 j)                  |jC                                nl|j.                  t        jD                  t        jF                  hv r@ j)                  |jI                                 j)                  |jK                                tM        |      rC|jO                         \  }	}
|	D ]*  }tQ        ||      } j)                  |tQ        |             , y y t        |t        jR                        r/ ||      r&|jT                  jV                  }jX                  |<   y y y )Nr  r   c                     ddl m}  ||       xrR t        | j                  j                  t
        j                        xr" | j                  j                  j                  vS )Nr   )r$   )r  r$   r   r   r  r  r  r  )r  r$   r   s     r   	need_bindz8SubgraphTracer.track_produced_symints.<locals>.need_bind)  sJ    I A :qvv{{ELL9:FFKKt'9'99r   r1  r   r   c                 L   t        t              r        nt        t        j                  j                        sJ j
                  j                  j                        5   j                  |i |}t        |j                  |        |cd d d        S # 1 sw Y   y xY wr   )
r   r  r   r   r  r   r  r   r  rw   )r1  r   r   r  r  r  s       r   _proxy_with_example_valuezHSubgraphTracer.track_produced_symints.<locals>._proxy_with_example_value2  s    
 $.gy#AgiwGguxx~~666--gll; +++T<V<!%**m<  s   &*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  r   r  r	   r   r   r  r   r   r  r  r   r  rO  r  opsr(  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__r   r$  r   r  r  )r   r1  r  r  r  rV  r  
lazy_proxyr  attrsr  rs  inner_tr  r  s   ` `           @r   r  z%SubgraphTracer.track_produced_symints  s     &.111	 	 	
	
	'*
	69
	XX
	 mU\\2!-"4"4"67 ?1Q<IIW** "+1'		//33 !"&q'	"J //:>'?* +99;N(		Y"&&	 '-"#IINN55J">2	
 ++NJG##u}}4%m&:&:&<= CDAq |		]#".. &/"5+!IINN5599$aL&*1g	&
 33AzB'C* %%)9)99++M,B,B,DgN++M,A,A,CWM%%%*:*:E<L<L)MM++M,F,F,H'R++M,E,E,GQ%%%*:*:E<L<L)MM++M,F,F,H'R++M,E,E,GQ,];*==?
s! QD%mT:G//$9OPQ <
 u||4'$))..-4$$T* ( 5r   rZ  c           	          	 ddt         t        j                  z  dt        d z  dt        dd f fd}t        |t        j                        rnt        |j                               D ]-  \  }} |||t        |t        j                  |      nd d       / |j                  t        j                  u rt        |j                               D ]-  \  }} |||t        |t        j                  |      nd d       /  ||j!                         |t        |t        j"                        nd d       n6|j                  t        j$                  u rA j'                  |j)                         |        j'                  |j+                         |       n|j                  t        j,                  t        j.                  hv rA j'                  |j1                         |        j'                  |j3                         |       nl|j                  t        j4                  t        j6                  hv r@ j'                  |j9                         |        j'                  |j;                         |       t=        |      rG|j?                         \  }}|D ].  }tA        ||      }	 j'                  |	|tC        ||      nd        0 y y t        |t        j                        r
 |||       y y )	Nr  r  r  r   c                    t        |       sy t        | t        j                        sJ j	                  |       }t        |      dk(  ry j                  ىj                  j                  | |       |D ]  }j                  j                  |   }|j                  j                  d   }t        |t        j                        sJ j                  t        |      t        |      |||      }t        j                  d|||j                   ndj"                         |j$                  |<    y t        |      dk(  sJ d| d|         |J d	|  d
|  d       t'        t)        |            }j                  t        |      t        |       | ||      }t        j                  d| ||j                   ndj"                         t+        || dd d      |j                  j                  d<   y )Nr   r1  )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  rn  r,  )r$   r   r   r$  lookup_unbound_symbolsr  r  r  r  r   r/  r.  r   r.  r   r  r  rO  rF  r  iterry   )	r  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"3"8"8"IK%k5<<@@@00B[)#%% 1 B IIN'-'9?P((	 :<D((6#<( +,1 HHXGYY]^_]`b1 ) !! %WWXVYYjl)
 $/01,,GG!! -  		J#)#5FKK;L$$	 ,4', $#,Z(r   T)r  r  )"r  r   r$  r   r   r   r   r  r  rb   ra   SIZEr  r  r  STRIDEr  STORAGE_OFFSETr  r  r  r  r  r  r  r  r  r  r  r  r+   r  r   rT   )
r   r1  rZ  r  rV  r  r  r  rs  r  s
   `         r   r  z"SubgraphTracer._lift_basic_symbols  s    !B	U\\!B	TMB	 B	 	B	H mU\\2!-"4"4"67 	1' ? -S.2E2EqI!	 ##u}}4%m&:&:&<= 	DAq+  # 1n6K6KQO!%#	 (!002 ? -S.2O2OP! %%)9)99(()?)?)A3G(()>)>)@#F%%%*:*:E<L<L)MM(()C)C)EsK(()B)B)DcJ%%%*:*:E<L<L)MM(()C)C)EsK(()B)B)DcJ,];*==?
s! D%mT:G,,#/C!6t < u||4# 5r   r  c                    |j                   j                  j                  }t        |      dk(  rg S g }|D ]  }|| j                  vr|j                  |       #| j                  |   }t        |t              r |       }|| j                  |<   t        |t        j                  j                        r|j                  | u rJ d| d        t        |d       S )Nr   zThe proxy of symbol z" doesn't belong to current tracer.c                     | j                   S r   )r  )r  s    r   rU  z7SubgraphTracer.lookup_unbound_symbols.<locals>.<lambda>'  s
     r   )r  )r   r  r"   r  r  r   r   r  r   r   r  r  r  )r   r  r"   to_be_boundr  r  s         r   r  z%SubgraphTracer.lookup_unbound_symbols  s    vv{{//|!I 	B+++""2&&&r*E%+).""2&eUXX^^49M &rd*LMM	 k'788r   c                    | j                   }g }g }| j                  j                  D ]i  }|j                  dk(  rW|j                  d   }t        |t        j                        s<|j                  |j                         |j                  |       i n t        t        ||            D cg c]  \  }\  }}||k7  r| }	}}}|	r#|	D cg c]  }||   	 }
}d|
 }t        d|      S t        dd      S c c}}}w c c}w )Nr~  r1  zInput mutation detected at TFrn  )r  r   r  r  r/  r   r   r   r   r  r  r^  r   )r   input_versions_at_beginninginput_nodesinput_versions_at_endr   r1  rV  v1v2mutated_inputsmutated_nodesr   s               r   has_input_mutationz!SubgraphTracer.has_input_mutation)  s   &*&G&G# "JJ$$ 	Dww-' $		/ :mU\\:)001G1GH&&t,	  )/1FG 
 
8B Rx	 
 
 5CD[^DMD/?Cc**E2&&
 Es   ,C5
C<c           	         ddl m} ddlm} t	               }| j
                  j                  D ]k  }|j                  dk(  rY ||g      d   }t        |t        j                        s9 ||      D ]&  }||v rd||    d| }t        d|      c c S |||<   ( k n t	               }| j
                  j                  d	      d   }	t        j                  |	j                  d         D ]o  }
|
s ||
g      d   }t        |t               rJ t        |t        j                        s? ||      D ]&  }||v rd
||    d|
 }t        d|      c c S |
||<   ( q |j#                         |j#                         z  }t%        |      dkD  rQ|D cg c]  }||   ||   f }}dj'                  |D cg c]  \  }}| d|  c}}      }d| }t        d|      S t        dd      S c c}w c c}}w )Nr   )get_tensor_storages)_collect_fake_inputsr~  z*Input-to-input aliasing detected at nodes z and Tr  r  z,Output-to-output aliasing detected at nodes z, z+Input-to-output aliasing detected at nodes Frn  )(torch._dynamo.variables.higher_order_opsr  torch._higher_order_ops.utilsr  r   r   r  r  r   r   r   r   r  r  tree_leavesr   r   r  r  r  )r   r  r  input_storagesr   r1  storager   output_storages	out_nodesout_nodeintersected_storagesr  aliasedrV  os                   r   r   zSubgraphTracer.has_aliasingF  s'   PF>BfJJ$$ 	Dww-' 4dV <Q ?mU\\:#6}#E 7"n4$N~^eOfNgglmqlr"sC#/c#::26w/7 	 @DvJJ))X)6q9	**9>>!+<= 
	<H 4hZ @ C%mT:::mU\\:#6}#E <"o5$PQ`ahQiPjjopxoy"zC#/c#::3;0<
	<  .2247K7K7MM#$q( BV<="OA$67G  iiG DDAqA3eA3 DEG?yICc**E2&& !Es   G$.G)
)NFNN)NNNrl  )FN)(r   r   r   r   r   r   r(   r   r   r~   rZ  r   r  rZ  r	   r   r  r  re  r  r  r   r.  r  r  rv  r   r  r$  r   r  r   r  r  r  r   r  r   r   r   r   s   @r   r  r    sZ    .2'+"&eN#eN )*eN 	eN
 }eN 4ZeN 
eNN*o *$ *C-C57WWC	C8   $AE  	
  Dj : #BGG9bhh#67$> 
4   $AELL L 	L
 L DjL :L #BGG9bhh#67$>L 
Ld  $  	
  Dj : 
46 6D 66  $zz z 	z
 z z 
zz)288 )	BHH@T )V7s 7s 7@y5 y5+4uxx~~+Ey5	y5x~"\\ELL8~?E}~	~D9 9ell9K 9*'L ':+'l +'r   r  r   (  r   r  r  r   r  r  ri  r  r/   r  r  rS  r  r   r  r  rE  collections.abcr   r   r   r   r   rM  r   typingr	   r
   r   r   r   typing_extensionsr   r   r  torch._guardsr   torch._loggingtorch.distributeddistributedr  torch.nntorch.utils._pytreerU  rV  r  r   r   torch._C._dynamor   torch._dynamo.excr   r   r   r   r   r   r   r   "torch._library.fake_class_registryr   torch._library.opaque_objectr   torch._subclasses.fake_tensorr   torch._utils_internalr   torch.export.dynamic_shapesr   re  r    %torch.fx.experimental._backward_stater!   r  r"   r#   r$   r%   r&   r'   torch.fx.noder(   torch.fx.passes.runtime_assertr)   torch.utils._ordered_setr*   torch.utils._python_dispatchr+   rn  r-   r.   r   r0   backends.registryr1   r2   r  r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r  r?   current_scope_idr@   device_interfacerA   rB   rC   rD   rE   rF   rV  rG   rH   graph_deduplicationrI   graph_id_filterrJ   rK   graph_region_trackerrL   rM   rN   mutation_guardrO   rq  rP   rQ   rR   r  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   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   variables.builderrx   ry   rz   r{   variables.ctx_managerr|   variables.functionsr}   r~   variables.listsr   variables.miscr   variables.nn_moduler   r  r   r   r   variables.torch_functionr   variables.user_definedr   r  r   torch._dynamo.packager   r  r   torch._inductorr    torch.multiprocessing.reductionsr   	getLoggerr   r   r  getArtifactLoggergraph_tabular_logrc  graph_sizes_logrz  rl  r   r   r'  r  r&  r  r   r   r   r   r   r   rN  r   r  r   r  r   cacher   r   r   r   r   objectr5  r  r  rC  rP  r^  r`  rp  r  r0  r=  r  r  r>  r?  r  Tracerr  r   r   r   <module>r&     s  *          	 
      9 9 4  < < 0       $ $  # N  @ 7 4 0 9 : ?  ! J / F D D 5    '  - 6  S : 5 / 0 W W    $     .  ; H - ( 1 
 C ; A4H4?g!NN44XwG 11(LI..228]K11(LI**  "'!>!> $)HHOO$D$D !&*38nc3h& $  
 $   6:)uU\\3:%=>?)%%**+d2) 				"	"#)X 4c 4 4 - - -# (2tCy=2I  UXX__   ! !H 	S&[ N N N: <
 <
 <
~ X X X" ' ' ',E d38n (F". F"RU+2# U+2pV!V !VJJ HH%(H25H=@HJMH	HV &ioo' cNCL2 2$~'RYY ~'r   