
    9i<                       d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlmZmZ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	l/m0Z0 dd
l1m2Z2m3Z3 ddl"m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z; ddl<m=Z= ddl>m?Z? ddl@mAZA ddlBmCZC ddlDmEZE ddlFmGZGmHZHmIZImJZJmKZKmLZL ddlMmNZN ddlOmPZP ddlQmRZR ddlSmTZT ddlUmVZVmWZWmZXmYZY ddlZm[Z[m\Z\ ddl]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZfmgZgmhZh ddlimiZi ddljmkZk ddllmmZm ddlnmoZo ddlWmpZpmqZqmrZrmsZsmtZt dd lumvZvmwZw dd!lxmyZy dd"lzm{Z{ dd#l0m|Z|m}Z} dd$l~mZ dd%lmZmZmZ dd&lmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ dd'l*mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ dd(lmZ dd)lmZmZmZmZ dd*lmZ dd+lmZ dd,lmZ dd-lmZ dd.lmZmZmZ dd/lmZ dd0lmZ erdd1lmZ dd2lmZ dd3lmZ  ej        eŦ          Ze#j                            ed4          Ze#j                            ed5          Ze#j                            ed6          Ze#j                            ed7          Ze0j        Ze#j        j        j        Ze#j        j        j        Z ed89           G d: d;                      Z ed89           G d< d=                      Z ed89           G d> d?                      Z G d@ dA          Zej        dBefdC            Ze G dD dE                      ZdFedBeg ee         f         fdGZ G dH dIe#j        j                  Z G dJ dK          Zeeef         Ze G dL dM                      Ze G dN dO                      Ze G dP dQ                      ZdRedBeeef         fdSZ G dT dUe          Z G dV dWe          Z G dX dY          ZdZZd[ed\ed]ed^ed_edBdfd`Z ej                    Z eda          Z e db          Z G dc dd          Z G de dfe-j                  ZdS )ga  
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)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)GraphRegionTracker)GuardBuilderinstall_guard)is_dynamic_nn_module)AttributeMutationExistingSideEffectsValueMutationExisting)_get_source_debug_name
AttrSourceBackwardStateSourceConstantSourceGetItemSourceGlobalStateSourceis_constant_sourceis_from_local_sourceLocalSourceNumpyTensorSourceParamBufferSourceShapeEnvSourceSyntheticLocalSourceTensorPropertyTensorPropertySource)_extract_tensor_dictcheckpoint_paramsCleanupHookclone_inputscount_callscountersdynamo_timedget_instruction_source_311get_locals_to_stealget_static_address_typeget_unique_name_wrtgraph_break_reasonsincrement_op_countistypelazy_format_graph_code
LazyStringnn_module_proxysameset_example_value)VariableTracker)BackwardStateGraphArgGraphArgTrackedFakewrap_fx_proxy)ContextWrappingVariable)BaseListVariable)NullVariable)NNModuleVariable)NumpyNdarrayVariableSymNodeVariableUnspecializedPythonVariable)TensorWithTFOverrideVariable)UserDefinedDictVariable)CompilePackage)InstructionTranslatorBase)StorageWeakRefgraph
graph_codegraph_sizes
trace_callT)frozenc                   $    e Zd ZU eed<   eed<   dS )VariableTrackerCacheKeyvt_idsourceN)__name__
__module____qualname__int__annotations__r        M/var/www/icac/venv/lib/python3.11/site-packages/torch/_dynamo/output_graph.pyr   r      s$         JJJ NNNNNr   r   c                   $    e Zd ZU eed<   eed<   dS )AliasingInfohas_aliasingmsgNr   r   r   boolr   strr   r   r   r   r      %         	HHHHHr   r   c                   $    e Zd ZU eed<   eed<   dS )MutationInfohas_mutationr   Nr   r   r   r   r   r      r   r   r   c                   ^    e Zd ZddZdededee         fdZdedededdfdZ	dd	Z
dd
ZdS )VariableTrackerCachereturnNc                     i | _         d S N)cacheselfs    r   __init__zVariableTrackerCache.__init__   s    EG


r   valuer   c                 l    t          t          |          |          }|| j        vrd S | j        |         S r   r   idr   )r   r   r   keys       r   lookupzVariableTrackerCache.lookup   s5    %bii88dj  4z#r   vtc                 T    t          t          |          |          }|| j        |<   d S r   r   )r   r   r   r   r   s        r   addzVariableTrackerCache.add   s&    %bii88
3r   c                 `    t                      }|j                            | j                   |S r   )r   r   update)r   	new_caches     r   clonezVariableTrackerCache.clone   s+    (**	tz***r   c                 8    | j                                          d S r   )r   clearr   s    r   r   zVariableTrackerCache.clear   s    
r   r   N)r   r   )r   r   r   r   r	   r   r   rr   r   r   r   r   r   r   r   r   r      s        H H H HC  H_4M     f / d            r   r   r   c                  4    t          j        t                    S r   )torchdynamo_loggingget_step_loggerlogr   r   r   _step_loggerr      s    .s333r   c                   T    e Zd ZU dZeed<   eej                 ed<   dZ	e
ed<   d	dZdS )
GraphCompileReasonzOStores why a given output graph was compiled; i.e. what caused the graph break.reason
user_stackTgraph_breakr   Nc                 @    | j         rt          j        |            d S d S r   )r   rj   appendr   s    r   __post_init__z GraphCompileReason.__post_init__   s.     	-&t,,,,,	- 	-r   r   )r   r   r   __doc__r   r   list	tracebackFrameSummaryr   r   r   r   r   r   r   r      s_         YYKKKY+,,,, K- - - - - -r   r   random_callsc                 8     dt           t                   f fd}|S )Nr   c                      d  D             S )Nc                 &    g | ]\  }}} ||i |S r   r   ).0fnargskwargss       r   
<listcomp>zE_get_gen_rand_values_fn.<locals>._gen_rand_values.<locals>.<listcomp>   s.    III(8D&D#F##IIIr   r   )r   s   r   _gen_rand_valuesz1_get_gen_rand_values_fn.<locals>._gen_rand_values   s    IILIIIIr   )r   r	   )r   r   s   ` r   _get_gen_rand_values_fnr      s;    Jd3i J J J J J J r   c                        e Zd ZdZdeeej        j        f         f fdZ	defdZ
deeej        j        f         ddfdZ xZS )FakeRootModulez'Trick the constructor of fx.GraphModule
nn_modulesc                     t                                                       |                                D ]\  }}t          | ||           d S r   )superr   itemssetattr)r   r   kv	__class__s       r   r   zFakeRootModule.__init__  sW    $$&& 	  	 DAqD!Q	  	 r   r   c                     dS )NzFakeRootModule(...)r   r   s    r   __repr__zFakeRootModule.__repr__  s    $$r   Nc                 \    |                                 D ]\  }}t          | ||           d S r   )r   r   )r   r   r   r   s       r   add_nn_moduleszFakeRootModule.add_nn_modules  s@    $$&& 	  	 DAqD!Q	  	 r   )r   r   r   r   dictr   torchnnModuler   r   r   __classcell__r   s   @r   r   r     s        11 4UX_(<#=            
%# % % % % c58?.B)C                  r   r   c                   \    e Zd ZdeddfdZdej        j        deej	                 de
fdZdS )WrapperBackendbackendr   Nc                     || _         d S r   )r   )r   r   s     r   r   zWrapperBackend.__init__  s    #*r   gmexample_inputsc                 x   t          |          | _        || _        t          j        | j                  }|                     ||          | _        | j        | j        | j        j        u r| j        j        S t          j	        s| j        S 	  | j        j        t          |           } | j        t          |           }t          ||          r| j        |                                  S t          d|            # t          $ r t                              d            w xY w# |                                  w xY w)Nzincorrect results of backend zerror in verify_correctness)r`   restorer   copydeepcopyr   	candidateforwardr,   verify_correctnessrb   rp   RuntimeError	Exceptionr   	exception)r   r   r   copy_gmcorrectresults         r   __call__zWrapperBackend.__call__  s1    ),,-((g~>>>!T^tw%F%F7?"( 	">!	%dgo|N'C'CDG#T^\.%A%ABF GV$$ &~ LLNNNN EtEEFFF 	 	 	MM7888	 LLNNNNs   
A	C: (C: :&D  D# #D9)r   r   r   r1   r   r   r   GraphModuler   r   r0   r   r   r   r   r   r     sn        +
 +t + + + +(&8<U\8J	     r   r   c                   >   e Zd ZU dZeed<   eed<   eej        j	                 ed<   e
e         ed<   eeeeef         f         ed<   eed<   eej        j        j                 ed<   eej                 ed	<   ej        j        j        j        ed
<   ej        j        ed<   eej        j                 ed<   dZeed<   dZeed<   dZeed<   dZ ee         ed<   e!de"fd            Z#e!dej        j        fd            Ze!deej        j                 fd            Z$ddZ%dS )OutputGraphGuardsStatear  
    A base class containing fields that are considered "persistent" when we
    want to save all the important state for reconstrucing guards in a different
    process. Normally we don't need to add states here, but we may have to when
    the information is needed to serialize the guards, so the fields here are
    supposed to be serializable as a requirement.
    local_scopeglobal_scopetorch_function_mode_stackguard_on_key_orderinput_source_to_sizes_strides
dual_levelfunctorch_layerscurrent_deviceglobal_state_guard_guards_aotautograd_guardsFexportskip_guards_checkexport_constraintsN%name_of_builtins_dict_key_in_fglobalsr   c                 @    t          dt          |                      )Nz%shape_env shouldn't be accessed from )AssertionErrortyper   s    r   	shape_envz OutputGraphGuardsState.shape_env[  s    QT$ZZQQR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_guardsc  s    ''r   c                     t          | j        | j        | j        | j        | j        | j        | j        | j        | j	        | j
        | j        | j        | j        | j        | j                  S )N)r   r   r  r  r  r  r  r  r  r  r
  r  r  r	  r  )r   r   r   r  r  r  r  r  r  r  r  r
  r  r   r  r  r   s    r   dump_guards_statez(OutputGraphGuardsState.dump_guards_stateg  sp    %(*&*&D#6*.*L!2.#6262\;#6K $ 7"4
 
 
 	
r   )r   r   )&r   r   r   r   Scoper   r   r   	overridesTorchFunctionModesetr   r   r   r	   r   
_functorchpyfunctorchFuncTorchInterpreterr   device_C_dynamor   GlobalStateGuardr  	GuardsSetGuardEnvExprr
  r   r  r  r  propertyr$   r  r  r  r   r   r   r   r   <  s          #EO$EFFFFF####'S#X(>#????OOO5+7LMMMMU\****(/@@@@]$$$$em89999 FD#t###$$$$;?)8C=???S8 S S S XS /    X (D)C$D ( ( ( X(
 
 
 
 
 
r   r   c                   z   e Zd ZU dZdZeed<    ee          Z	ee
ef         ed<    ee          Zee         ed<    ee          Zee
         ed<    ee          Zeeeeedf         f                  ed	<    ee          Zee         ed
<    ee          Zeee
eedf         f                  ed<   dS )StackLocalsMetadatazf
    Stores metadata for a frame's stack and locals for the purposes of building resume functions
    r   	num_stackdefault_factorylocals_namesstack_null_idxeslocals_null_keys.stack_ctx_argsstack_ctx_idxes_origlocals_ctx_argsN)r   r   r   r   r'  r   r   dc_fieldr   r*  r   r   r+  r,  r-  tupler	   r.  r/  r   r   r   r&  r&  |  s2          Is#+8$ $ $L$sCx.    #+(4"@"@"@d3i@@@"*(4"@"@"@d3i@@@8@QU8V8V8VNDsE#s(O345VVV&.ht&D&D&D$s)DDD9ARV9W9W9WOT%U38_ 456WWWWWr   r&  c                      e Zd ZU  ee          Zeeef         ed<    ee          Z	eee
eef         f         ed<   ej        j        j        Zeej        j        j        ej        j        j        f         ed<    ee          Zeeeeeej        j        j        ej        j        j        f         f         f         ed<   dS )ExportMetaDatar(  graph_input_idx_to_local_sourceoutput_return_typeout_specmodule_call_specN)r   r   r   r0  r   r4  r   r   r   r5  r1  r   r	   r   utils_pytree
_LEAF_SPECr6  r   TreeSpecLeafSpecr7  r   r   r   r3  r3    s        
 :BRV9W9W9W#T#v+%6WWW
 6>Xd5S5S5SS%S/12SSS 	& eEK'0%+2E2NNO    	&&& dS%+4ek6I6RRSST	V ' ' ' ' 'r   r3  r   c                 N    | d         }t          |t                    s|j        }|S )N__builtins__)
isinstancer   __dict__)r   
f_builtinss     r   get_builtins_dictrB    s.     n-Jj$'' )(
r   c                        e Zd ZdZ	 	 	 	 ddedeeeef                  dee         dee	         deee
ee         f                  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_sourcec                 t   t                                          |j        |j        |j        |j        |j        |j        |j        |j	        |j
        |j        |j        |j        |j        |j        |j                   |pi | _        |pt%                      | _        |pt)                      | _        |pi | _        d S r   )r   r   r   r   r  r  r  r  r  r  r  r  r	  r
  r  r  r  rF  r$   
_shape_envr3  rG  rH  )r   rE  rF  r  rG  rH  r   s         r   r   zOutputGraphCommon.__init__  s     	%1%2%?%8%C%0%6%4%8%-%9%,%7%8%K	
 	
 	
$ -2 $1xzz.B.2B2B&," 	'''r   r   c                     | j         S r   )rJ  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_package  s
     "!r   NNNNrL  )r   r   r   r   r   r   r   r   r$   r3  r   r   r   r   r$  r  r	   rP  r   r   s   @r   rD  rD    s
        4 48(,48HL$
 $
#9$
 !c3h0$
 H%	$

 ".1$
 %-T#tF|2C-D$E$
 $
 $
 $
 $
 $
L 8    X" "S " " " " " " " " " "r   rD  c                   
   e Zd ZU dZeed<   	 ddeeef         de	e
         ddded	ee         d
ededededeej        j                 de	d         d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e                  fdZde def         d eedf         defd!Z!de g ef         ddfd"Z"dd#Z#e$dd%            Z%e$dd&            Z&defd'Z'e$dej        j(        fd(            Z)e)j*        d)ej        j(        ddfd*            Z)e$deeej        f         fd+            Z+e$deej,        ej-        f         fd,            Z.e$dee/j0        e1ej        j        d-f         f         fd.            Z2d ed/edej        j        fd0Z3d ed/edej        j,        fd1Z4d ed/eddfd2Z5e6j7        	 dd3e	e8         d4d$d5e	e         de9ej:        ddf         fd6            Z;e$dd7            Z<e$dej=        j>        fd8            Z?e$de@fd9            ZAe$dejB        jC        fd:            ZDe$deeef         fd;            ZEe$deejB        jF                 fd<            ZG	 dd=e	eeee def         ef         f                  ddfd>ZHdd@ZIddAZJe$ddB            ZKdeLfdCZMdefdDZNdefdEZOdFede1ejP        jQ        ef         fdGZRddIedefdJZSdIeddfdKZTeUdLedefdM            ZVdNedOedej        fdPZWdQe1ejP        jQ        ej-        ef         dLedRedefdSZXd?ddeeeY         eeZeZf         f         fdTZ[d?ddUeLdeee         e\f         fdVZ]	 	 dd?ddXe^dYedUeLdee\         f
dZZ_d?dd[e`ddfd\Zad?dd]ee         d[e`ddfd^Zbdd_ZcddXed/eddfdaZddeeee1eLef                  f         fdbZedIedefdcZfe6j7        defdd            ZgddeZhd?ddfee         dgeideeY         fdhZje$deej,                 fdi            Zke$deel         fdj            Zmdkejn        dlee-         deofdmZpdkejn        dlee-         deofdnZqdeeej        jn        f         fdoZrdIedpej        jn        defdqZsdeej-                 fdrZtddsZuddtZvdduZwdeeY         ddfdvZxdIed)eddfdwZyded)edefdxZzded)edefdyZ{ddzZ|d{e ejn        gdf         ddfd|Z}d}ej        j,        defd~Z~dejP        jQ        deZddfdZdS )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_optionscompiler_fnroot_txr   r
  r  frame_stater   r   f_coder  packager   	one_graphr   Nc                    t                               | |||
t                      i t          j        j        j        t          j        j        	                                t          j
        j        j        t          j        j        j        p't          j        j        j                                        t          j                                        g            t+          | |          g| _        i | _        || _        || _        || _        g | _        t9          t:                    | _        t                      | _        |	j         |	j!        |	j"        d| _#        tI                      | _%        g | _&        tO          | j&        |ptP          j)        |ptP          j*        tP          j+        | j#                  }dd l,mc m(} |-                    d          5  t          j.        /                    |ta          | j                  | j                  }d d d            n# 1 swxY w Y   tc          |          | _2        | j2        j3        4                    |	           | j2        j3        | _3        tk          j6                    | _7        | 8                                 ts          j:        tv                    | _<        i | _=        t}          |           | _?        t                      | _A        t          jC                    | _D        t          |          | _F        g | _G        d| _H        g | _I        || _J        || _K        || _L        i | _M        g | _N        g | _O        d| _P        i | _Q        t          j        R                                | _S        d| _T        t          i           | _U        t          i           | _V        | W                                 i | _X        g | _Y        d | _Z        g | _[        i | _\        d | _]        d | _^        | _                                | _`        t          jb                    | _c        | d                                | _e        i | _f        t                      | _h        t                      | _j        d S )	N)r  r  r  r  r  r  r  r	  )	is_export)co_nameco_filenameco_firstlineno)tracked_fakesallow_scalar_outputsallow_dynamic_output_shape_ops+prefer_deferred_runtime_asserts_over_guards	co_fieldsr   F(fake_tensor_allow_unsafe_data_ptr_access)r  allow_non_fake_inputsr
  )kr   r   r  r   autograd
forward_ad_current_levelr  r  #retrieve_all_functorch_interpretersr8  _deviceCURRENT_DEVICEr   convert_frameinitial_global_stater  r   r!  r  r"  SubgraphTracertracersinput_source_to_varr
  r  rY  cleanup_hooksnext_compile_id_counter
compile_idinstalled_globalsr_  r`  ra  rf  rI   region_trackerrb  r$   r,   capture_scalar_outputs capture_dynamic_output_shape_opsre  torch._functorch.configpatch_subclassesFakeTensorModer   r   tracing_contexttraced_coder   r   current_compile_iddynamo_compile_idinit_ambient_guardscollectionsdefaultdictr   rH  param_name_to_sourcerN   rU  r   variable_tracker_cache	itertoolscountunique_var_idr   rV  output_instructions	timestampregister_finalizer_fnsrW  rX  r[  source_to_user_stacks_current_txcleanupsshould_exitunspec_variable_map_is_torch_function_mode_enabledtorch_function_mode_enabled!has_user_defined_allowed_in_graphnon_compliant_opscompliant_custom_opssave_global_state dynamo_flat_name_to_original_fqnr   random_values_varpregraph_bytecodebackward_statebackward_state_proxybackward_state_var!install_builtins_dict_in_fglobalsr  
contextlib	ExitStackcompiler_trace_stack+maybe_install_saved_tensors_hooks_subgraphs"saved_tensors_hooks_subgraph_namesrF  r3  rG  r)   "used_inlined_inbuilt_modules_names)r   rV  rW  rX  r
  r  rY  r   r   rZ  r  r[  r\  r  _config	fake_modes                   r   r   zOutputGraph.__init__  si    	''%"uu*,~0?"-9]]__ ;.=$}:O  :x&7799M++-- " 	( 	
 	
 	
" 'tv>>>? CE "4&68#$788+.55
 ~!-$3
 
 122 13 ,!*!Kf.K+4 ,768>8jn
 
 
	& 	211111111]]E]JJ 	 	)88#&*4;&7&7{	 9  I	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 0>i/H/H(//777/;-// 	 	  """ #D)) 	' BD!'-- ';&<&<#&_..,0,>,>68   OQ# 2= RT"<>+- KM  ,18+S+S+U+U( 27. >AWW ADB! 	    AC-  	 '+ 57 ;=>B!15 2244 	2 %/$8$:$:! <<>> 	/
 /1-// DN<<///s   :HHHc                 X    | j                             t          dd                     d S )Nbytecode_tracingTlog_pt2_compile_event)r  enter_contextre   r   s    r   mark_bytecode_tracing_startz'OutputGraph.mark_bytecode_tracing_start  s?    !//"&*  	
 	
 	
 	
 	
r   c                 8    | j                                          d S r   )r  closer   s    r   mark_bytecode_tracing_stopz&OutputGraph.mark_bytecode_tracing_stop  s    !'')))))r   c                 V    t          | j                  }|                     d|          S )N__builtins_dict__)rB  r   install_global)r   rA  s     r   r  z-OutputGraph.install_builtins_dict_in_fglobals  s)    &t'899
""#6
CCCr   hookprefixc                     | t          | j                   }|| j        vsJ || j        |<   ||                                 fS r   )lenr  get_backward_state_proxy)r   r  r  names       r   add_backward_state_hookz#OutputGraph.add_backward_state_hook  sW     4#d122444.....$(D!T224444r   c                 X   | j         | j        rt          dddg            t                      }| j                            dt          |          |t                                | _         t                      | j         j	        j
        d<   |                                 | _        | j         S )Nz&backward_state does not support exportrL  z3Compiled autograd doesn't work with `torch.export`.gb_typecontextexplanationhintsdynamo_backward_stater   grapharg)r  r
  rD   r    root_tracercreate_graph_inputr  rR   rs   nodemetanew_varr  )r   example_values     r   r  z$OutputGraph.get_backward_state_proxy  s    $,{ D U	    *OOM(,(8(K(K']##*,,	 )L ) )D% ?T>U>UD%*/
;&*llnnD#((r   c                    | j                             t                                          t          j                             | j                             t                                          t          j                             | j                             t                                          t          j                             | j                             t                                          t          j	                             | j                             t                                          t          j
                             | j                             t                                          t          j                             t          j        j                                        }|C| j                             t                                          t          j                             t          j        j        j        sE| j                             t                                          t          j                             d S d S r   )r   r   r[   
make_guardrJ   	SHAPE_ENVrU   DETERMINISTIC_ALGORITHMS	GRAD_MODEDEFAULT_DEVICEGLOBAL_STATETORCH_FUNCTION_STATEr   r  r  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  s    	((33L4JKKLLL**<+PQQ	
 	
 	
 	)++66|7MNNOOO)++66|7RSSTTT)++66|7PQQRRR**<+LMM	
 	
 	
 X 7799>KOO!##..|/QRR   }.J 	KOO!##.. =     	 	r   c                    t           j        j        j        rd S t           j        j        j        j        }t           j        j        j        j        } |            } ||          sd S |\  }}| 	                    dt           j
                            | j        |j                            }| 	                    dt           j
                            | j        |j                            }|dk    sJ |dk    sJ ||gS )Nsaved_tensors_hooks_packsaved_tensors_hooks_unpacksaved_tensors_hooks_pack_0saved_tensors_hooks_unpack_0)r   r   r  r  r  _aot_autogradr8  top_saved_tensors_hooks"saved_tensors_hooks_are_inlineableinstall_subgraphr   r   r   r   )r   	get_hooksare_inline_hookshookspack_gm	unpack_gmpack_subgraph_nameunpack_subgraph_names           r   r  z7OutputGraph.maybe_install_saved_tensors_hooks_subgraphs-  s   =*F 	4$28P	*0S 	 	&& 	4 #!22&H  '-@@
 
  $44(H  )/BB 
  
 "%AAAAA#'EEEEE"$899r   r   .r   c                     | }|                                  }t          | j                                      fd                               t          t          j        j        |                     	                    t          |          d                               |           | j                                                                       t          |          }t!          j        | j        ||          }|                                }t'          j                    j        j                            |           |S )z]
        call fn(*args) before the graph runs and turn the result into a fake input.
        c                  D                          j        j                  S r   )load_import_fromr   r   )cgr   s   r   <lambda>z3OutputGraph.synthetic_graph_input.<locals>.<lambda>T  s!    B''  r   F)r  r>   rX  add_push_nullforeachmapr/   ConstantVariablecreatecall_functionr  storer  extendget_instructionsr\   rr   buildrealizer   getguards_contextdynamo_guardsremove_guards_with_source)r   r   r   r  varnamer   r   r  s    `     @r   synthetic_graph_inputz!OutputGraph.synthetic_graph_inputJ  s6    D	,,..t|$$
    	
 	
 	
 	

3y18$??@@@
TE***
%%b&9&9&;&;<<<%g.. &t|]FKK!!+9SS	
 	
 	
 r   c                 :    | j                             |           d S r   )ru  r   )r   r   s     r   add_cleanup_hookzOutputGraph.add_cleanup_hookf  s    !!"%%%%%r   c                 z    t          | j                  D ]} |             | j                                         d S r   )reversedru  r   )r   r  s     r   call_cleanup_hookszOutputGraph.call_cleanup_hooksi  sD    T/00 	 	DDFFFF  """""r   rr  c                     | j         d         S Nr   rs  r   s    r   r  zOutputGraph.root_tracern  s    |Ar   c                     | j         d         S Nr  r   s    r   current_tracerzOutputGraph.current_tracerr  s    |Br   c                 2    t          | j                  dk    S )Nr+   )r  rs  r   s    r   is_root_tracerzOutputGraph.is_root_tracerv  s    4<  A%%r   c                     | j         j        S r   r  r   r   s    r   r   zOutputGraph.graphz  s    "((r   r   c                     || j         _        d S r   r  )r   r   s     r   r   zOutputGraph.graph  s    $)!!!r   c                     | j         j        S r   )r  input_name_to_proxyr   s    r   r  zOutputGraph.input_name_to_proxy  s    "66r   c                     | j         j        S r   )r  real_value_cacher   s    r   r  zOutputGraph.real_value_cache  s    "33r   	LazyProxyc                     | j         j        S r   )r  bound_symbolsr   s    r   r  zOutputGraph.bound_symbols  s    "00r   r   c                 &     | j         j        |i |S r   )r  create_proxyr   r   r   s      r   r  zOutputGraph.create_proxy  s    /t"/@@@@r   c                 &     | j         j        |i |S r   )r  create_noder  s      r   r  zOutputGraph.create_node      .t".????r   c                 &     | j         j        |i |S r   )r  remove_noder  s      r   r  zOutputGraph.remove_node  r  r   source_targetprior_tracerdescriptionc              #     K   t                      }	 |r|j        | j        u sJ |                                 |r|n"t	          | | j        || j        j        |          }| j                            |           |V  |                    d d d            | j        	                                 d S # |                    d d d            | j        	                                 w xY w)N)parentr   r^  r"  )
r?   r$  r  	__enter__rr  r^  rs  r   __exit__pop)r   r   r!  r"  new_scope_ctxtracers         r   	subtracerzOutputGraph.subtracer  s      ())	 B#*d.AAAAA##%%%  #."/"1; +    L'''LLL""4t444L ""4t444Ls   A+B/ /2C!c                     | S r   r   r   s    r   outputzOutputGraph.output  s    r   c                 6    | j         j        J | j         j        S r   )r  r  r   s    r   r  zOutputGraph.fake_mode  s     #-999#--r   c                 f    | j         j        J | j         j        j        J | j         j        j        S r   )r  r  r  r   s    r   r  zOutputGraph.shape_env  s8    #-999#-7CCC#-77r   c                 $    | j         j        j        S r   )r  r  r  r   s    r   r   zOutputGraph.guards  s    #2@@r   c                 $    | j         j        j        S r   )r  module_contextr   r   s    r   r   zOutputGraph.nn_modules  s    #2==r   c                 $    | j         j        j        S r   )r  r  r  r   s    r   r  zOutputGraph.aotautograd_guards  s    #2EEr   outc                    t          t          t          t          t          dt
          f         t          f         f         ||n| j        j        j	                  }t          j        t          j                    f|d<   t          j        t          j        d          t          j        d          f|d<   t          j        t          j        d          t          j        d          f|d<   t          j        t          j        d          t          j        d          f|d<   t          j        t          j        d          t          j        d          f|d	<   t          j        t          j                    f|d
<   dS )zc
        Saves to out if it is provided. Else saves to the tracing context's global_state.
        .Ngrad_enabledcudaautocast_enabledcpuautocast_cpu_enabledautocast_gpu_dtypeautocast_cpu_dtypeautocast_cache_enabled)r
   r   r   r1  r   r	   r   r  global_contextglobal_stater   set_grad_enabledis_grad_enabled	functoolspartialset_autocast_enabledis_autocast_enabledset_autocast_dtypeget_autocast_dtypeset_autocast_cache_enabledis_autocast_cache_enabled)r   r3  r>  s      r   r  zOutputGraph.save_global_state  sQ    eHS#X.4556 ? )8E
 
 ).(>@U@W@W'X^$ e8&AA%f--,
'(
 e8%@@%e,,0
+,
 e6??$V,,.
)*
 e6>>$U++.
)*
 ,+--2
-...r   txc                 :    | j                             |           d S r   )r  r   )r   rI  s     r   push_txzOutputGraph.push_tx  s    #####r   c                 4    | j                                         S r   )r  r'  r   s    r   pop_txzOutputGraph.pop_tx   s    ##%%%r   c                 8    | j         s| j        n| j         d         S r	  )r  rX  r   s    r   
current_txzOutputGraph.current_tx  s    #'#3Mt||9I"9MMr   c                 *    t          | j                  S r   )rc   r   r   s    r   rc   zOutputGraph.count_calls  s    4:&&&r   c                 V    t          t          | j        j                            dk    S r  )r  r   r   nodesr   s    r   is_empty_graphzOutputGraph.is_empty_graph
  s"    4
())**a//r   c                 P    t          d | j        j        D                       dk    S )Nc                 (    g | ]}|j         d k    |S )r,  opr   xs     r   r   z+OutputGraph.has_outputs.<locals>.<listcomp>  s$    DDD!1483C3CA3C3C3Cr   r   )r  r   rR  r   s    r   has_outputszOutputGraph.has_outputs  s)    DDtz/DDDEEIIr   keysc                     |sJ | j         }|                    d          D ]0}t          |t                    r	||         } t	          ||          }1|S N.)r   splitr?  r   getattr)r   r[  objr   s       r   get_submodulezOutputGraph.get_submodule  s\    BF/C 	& 	&A#t$$ &!fc1oo
r   tmpr  c                     t          | j        d                   }	 | dt          | j                   }||vr| j        dxx         |fz  cc<   |S 6)Nco_varnamesT_)r  rV  rv  r  )r   r  existingvars       r   r  zOutputGraph.new_var  sp    t(788	66D!34466C(""!-000SF:000
		r   c                 T    || j         d         vr| j         dxx         |fz  cc<   dS dS )z/Ensure self.code_options.co_names contains nameco_namesN)rV  )r   r  s     r   update_co_nameszOutputGraph.update_co_names#  sD    t(444j)))dW4))))) 54r   namesc                  t   d                     t          t          |                     }t          j        dd|          }t          j        dd|          }t          j        dd|          }t          j        dd	|          }t          j        d
d|          }|r|d                                         sd|z   }|S )Nrf  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)joinr  r   rern  isalpha)rl  r  s     r   module_key_namezOutputGraph.module_key_name(  s     xxC((vH&RV
 
 vA8T
 
 v,eT::vlIt44vosD11 	 47??,, 	 4<Dr   attr_prefix
attr_valuec                 Z   t          |t          j        j                  r?| j                                        D ]%\  }}||u r|                     d|di           }|c S &t          || j                  }|| j        |<   |                     d|di           }t          |j	        |           |S )Nget_attrr   )
r?  r   r   r   r   r   r  ri   rq   r  )r   rs  rt  r  modproxy	attr_names          r   %register_static_attr_and_return_proxyz1OutputGraph.register_static_attr_and_return_proxy@  s    
 j%(/22 	!!_2244 ! !	c*$$ --j$BGGE LLL % (T_EE	 &0	"!!*iR@@%*j111r   targetoptionsc                 b   
 t           j                  rt          j         j        fi S t                    dv sJ d         t          t                    rJ t          t          j	                  r; j
                                         s j        dt          dt          f fd}nt          t          j        j                  r{t          t          j        j                  sJ rBt!                              t$          j                             dt          dt          ffd}nhdt          dt          ffd}nRt          t          j        t          j        f          rdt          dt          f fd}ndt          dt          f fd} j                                        D ]\  }}|u r ||          c S t1          j        | 
t5          
 j         j                  
 j        
<   t          t          j        j                  r{d	t          dd f
 fd
}t9          d          r%                                D ]\  }}	 ||           t9          d          r%                                D ]\  }}	 ||            |
          S )Nr   
module_keyr   c           	         j         J j         | <   j        J j        j        j        v rj        j        j                 S t	                    dk    rBt          t                    s-t                              t          j
                             n;t                    s,t                              t          j                             t          j                            d| di           fdi}j        j        j                            |          }d|                                j        j        vsJ t'                    |                                j        j        d<   |S )Nguardedrv  r   r  tensor_dict)r  rX  r,  rU  rh   r?  rY   rK   r  rJ   ID_MATCHrV   TENSOR_MATCHrv   r  track_object_existingas_proxyr  r  r_   )r~  r   r|  r   r   r{  r)  s     r   	wrap_namez6OutputGraph.register_attr_or_module.<locals>.wrap_names  s{   0<<<8>)*5 |///T\0===<.;FCC*622i??
-I I? "&"3"3L4I"J"JKKKK+F33 P!&"3"3L4M"N"NOOO"L''
JBGG  #) 	  \(5KKFTVWW$BKKMM,>,CCCCC9Mf9U9U"'6	r   c                 <    t          t                    | fi S r   )rz   r  r~  r|  r{  s    r   r  z6OutputGraph.register_attr_or_module.<locals>.wrap_name  s$    +DLL*fXXPWXXXr   c                 (    t          j        fi S r   )r/   UnspecializedNNModuleVariabler  s    r   r  z6OutputGraph.register_attr_or_module.<locals>.wrap_name  s    $B6UUWUUUr   c           	      Z    t          j                            d| di           fdiS )Nrv  r   sym_num)r|   r  r  )r~  r|  r   r{  s    r   r  z6OutputGraph.register_attr_or_module.<locals>.wrap_name  sK    &-%%j*b"EE  # 	  r   c                     j                             |            j        | <   t          j        t          |                     S )N)source_name)r,  rk  r   rr   r  rS   )r~  r   r{  s    r   r  z6OutputGraph.register_attr_or_module.<locals>.wrap_name  sO    ++J77706!*-&,"z:::  r   	leaf_namec                     j         J t          |           } d|  }|j         |<   t          t                    r)| j        t
                              |j                  <   d S d S r]  r  rZ   r?  rX   r  rT  rr  r  r  
new_sourcenew_namer  r   r   s      r   register_leaf_namez?OutputGraph.register_attr_or_module.<locals>.register_leaf_name  s    0<<<.vyAA
"00Y006@)(3fk22 " " 9#33JODD  " "r   _parameters_buffers)rL   r
  rr   r  rO  r   r?  rZ   r   r   r  r  r  r   r   r   rK   r  rJ   	NN_MODULESymIntSymFloatr   r   rT  rr  ri   r   hasattrnamed_parametersnamed_buffers)r   r{  rl  r|  r  r   r   r  r  rf  r  r   r)  s   `` `      @@@r   register_attr_or_modulez#OutputGraph.register_attr_or_moduleS  s     44 	M #(&LLGLLLw--7"""""f&788888fel++ _	(F&&(( * ) c  o                      D 00 -	feho66666 Vf//0FGGHHHY# Y/ Y Y Y Y Y Y Y YV# V/ V V V V V V V V u~ >?? 	c o         c o        O))++ 	$ 	$DAqF{{ y||###  *E2"4$:KLL &feho.. 	2"c "d " " " " " " " " v}-- 2$*$;$;$=$= 2 2LIq&&y1111vz** 2$*$8$8$:$: 2 2LIq&&y1111yr   c                 R   | j                             d          }t          |          }|sg i fS g }i }g |j        |j                                        | j        j                                        }|r|	                                }t          |t                    r't          |j        t                    sJ ||j        z  }R|| j        j        vst          |j        t                    rLt          |j        t"                    r2t          |j        j        t&                    r|j        j        j        |v s|j        j        j        }||vrg ||<   ||                             |           |i }	i }
| j        D ]&}t          |j        t                    r(t          |j        t&                    r|j        j        |v sF|j        j        }|| j        d         v sJ ||         D ]}|j        |
v r|j        J |j        j        }||	vrm|                     | d          }||	|<   |                    t9          d|          t;          |          t=                      t9          d|          g           |j        J |j        }t'          |	|                   |
|<   (||
fS )Nr   re  _ref	LOAD_FASTargval
STORE_FAST)r   r  rg   stacksymbolic_localsvaluesrU  store_attr_mutationsr[  r'  r?  rx   r   r   mutation_typerM   r   rT   baserX   
local_namer   	graphargs_examplerV  indexr  r  r7   r8   r3   )r   rI  maybe_gmstolen_list_namesalias_instsneeds_aliasqueuerY  stolen_namevisitedoverridden_sourcesarg	list_namelist_idx
alias_name
old_sources                   r   handle_aliases_for_stolen_listsz+OutputGraph.handle_aliases_for_stolen_lists  s    #''///99  	r6M8:
X
&&((
 388::
  	/		A!-.. !!'400000  T.CCC!!/3LMM D qx77 D qx}k::	 D
 HM,0AAA(-2K+--+-K($++A...+  	/. 35> '	P '	PC3<..sz;77 J)[88 
-I 1- @@@@@ + P P8111 x+++8>7**!%$***" "J )3GH%&&.{9MMM-h77022.|JOOO	   x+++X
1<WX=N1O1O":..9PD ...r   
stack_popsc                    |                                  g }t                      }t          |j                  D ]\  }}t          j                            |           t          |j                  |z
  |k    r|                    |           Vt          |t                    r|j                            |           n|                    |           t          |t                    rc|j        dnt          |j                  }|j                            t          |          dz
  |f           |j                            |           t          |          |_        t%          |                                |                                z             }|j                                        D ],\  }	}
t          |
j        t0                    r|
j        j        |	k    r
|| j        u r:|	|v r?t6          j        dk    r<t:                              t          |
          r|j                            |	           n"t:                              t          |
          rJ t          |j                   |j         |	<   t          |
t                    r9|
j        dnt          |
j                  }|j!                            |	|f           |                    |
           .||fS )a  
        Gets the stack + locals values belonging to tx that need to be restored.

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

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

        Returns:
            - stack_values: stack and locals values that need to be restored
            - meta: locations of NULLs and ContextWrappingVariables in the stack/locals
                (ignores the top `stack_pops` values on the stack)
        Nr   r+   )      )"prune_dead_localsr&  	enumerater  r/   LazyVariableTrackerrealize_allr  r   r?  ry   r+  rw   target_valuesr1  r-  r.  r'  r  cellvarsfreevarsr  r   r   rX   r  rX  sysversion_infor  __instancecheck__r,  r*  r/  )r   rI  r  stack_valuesr  ir   r  cell_and_freevarsr   r   s              r   _get_stack_values_to_restorez(OutputGraph._get_stack_values_to_restore=  s   " 	"$$ ""(++ 	4 	4HAu)55e<<<28}}q J..##E***%.. +%,,Q////##E***%!899 4-5BB5AT;U;U  #**C,=,=,A=+QRRR)00333\** =>> &,,.. !	# !	#DAq 18[11H'1,,$,&&%%%7** )),:: )00333
  11,BBBBB#&t'8#9#9Da !455 @/1BBuQ_7M7M  $++Q,>???""""T!!r   r   r   partial_convertc                    | j         J t          j        s| j         |u sJ |                                  || _        || _        d| _        t                              d|           g }t          j
        dk    r| j         j        D ]v}|j        dk    rB|                    t          dt          | j         j        d                                        O|                    t#          j        |                     wg }g }|}	|	t%          d |	j        D                       sJ |                     |	|	|u r|nd	          \  }
}|                    |
           |                    |           t+          |	j                  D ]}|                    |	|j        
           |	j        }	|	| j                            |           |                     |           | j        r| j        r
J d            |                     | j                   |                     | j                   \  }}|                     |           |                                  d | j         !                                D             }tE          |          }ddl#m$} t          | j%                  d	k    rg }| &                    d          | _'         |tQ          | j%                  d          }| )                    d|          }tU          | j         ||          }|+                    |,                    |d                     |+                    t[          d	d                     |                    |.                    | j'                             |                     |           d |D             }d}d}| j         |u rX|rUt%          d |D                       r;t%          d |D                       r!t          t_          |                    t          |          k    r| j        0                                r|j1        s| j2        s|d         j3        s|d         j4        stU          | j                   }| 5                    ||           |                     g | 6                    |to          t+          |                    |          |8                                ts          d          t          dt          |                               n| &                    d          }tU          | j         |||          }| :                    |||           i }|j;        !                                D ],\  }}|dk    r!ty          |tz          t|          f          sd||<   -tU          | j         ||||          }| :                    |||           t~          j@        j        jA        r|rt          |          dk    r|d	         }t          |t~          j@        jC        jD                  r|jE        t~          j@        jF        jG        u rh|j!        d	         } |j!        d         }!t          | t~          j@        jC        jH                  sJ i }"|jI        J                                D ]9}#t          |#t~          j@        jK        jL                  sJ |#jM        }$|#jN        |"|$<   :t          | j!                  D ]\  }%}||"v rd|"|         f| jP        jQ        |%<   !|jR        6t          |jR        dd          x}&r|&jT        rd|jR        f| jP        jQ        |%<   ^|U                                r$d|V                                f| jP        jQ        |%<   d | d!|% sJ |!V                                | jP        _W        g }'t          | jY                  d	k    st          |jI                  d	k    r|'+                    | 6                    ||Z                                |                     t          |jI                  d	k    r+|'                    |.                    |                     d}n7|'                    t          d"                     n| [                                 |                     |'|8                                z              |                     t          d#t          |          |d	         j\        z
            g           d	}(d	})t          |          D ]\  }*}t          |j]                  }+|*d	k    r
|+|j\        z  }+|+d	k    r5|                     t          d#d	          gts          d                     nK|)|+z  })|                     t                      gt          |(|)          ts          d                     |(|+z  }(|*t          |          dz
  k    r$tU          | j                   },i }-| j         j`        !                                D ]~\  }.}/t          |/jR        t|                    r_|/jR        ja        |.k    rO|,b                    |,c                    |.                     t          |j]                  t          |-          z   |-|.<   |                     |,8                                t          d#t          |-                    t          d$d          gz              |j]        d                    |-           |                     t          d"          t          d#t          |                    gt          |d	         j\        dz                        |r'|r%|                     t          d%|&          g           t~          j@        j        jf        d'v rd	d(lgmh}0 g }1| j        i                                D ]^}2t          |2d)          rJ|2jk        }3t          |3t          t          f          r&t          |2t                    rt          |2jo        |0          r|2j!        !                                D ]\  }.}/i }4|/j!        !                                D ]3\  }5}|V                                |4|5jp        V                                <   4d*d+gto          |4q                                          k    sJ |4| jP        jr        |.jp        V                                <   t          |2t                    rt          |2jo        |0          s|1                    |2           `d, |1D             }6|6rDt~          j@        j        jf        d-k    rt          jt        d.|6            nt          d.|6           |S )/a  
        Compiles the current subgraph, with inputs w.r.t. self.root_tx, and codegens:
            - Call the compiled subgraph
            - Apply side effects
            - Codegen stack and locals
            - Store the locals

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

        Returns stack indices and locals keys where we dropped NULLs, and where we found inactive context manager objects.
        NTzCOMPILING GRAPH due to %sr     COPY_FREE_VARSco_freevarsr  c              3   >   K   | ]}|                                 V  d S r   )can_restore)r   blocks     r   	<genexpr>z/OutputGraph.compile_subgraph.<locals>.<genexpr>  s.      KKuu((**KKKKKKr   r   )is_graph_breakz)export does not support pregraph_bytecodec                 4    i | ]\  }}|t          |          S r   )ro   )r   r  rw  s      r   
<dictcomp>z0OutputGraph.compile_subgraph.<locals>.<dictcomp>  s3     
 
 
+44D/#&&
 
 
r   r+   disablerandom_valuesz.do not trace into Dynamo rng recovery functionr   __gen_rand_values)r  Fc                     g | ]	}|D ]}|
S r   r   )r   valsvals      r   r   z0OutputGraph.compile_subgraph.<locals>.<listcomp>%  s%    NNNTNN#SNNNNr   c              3      K   | ]X}t          |t          t          t          f           o0t          |t                    o|                                t          u  V  Yd S r   )r?  r}   r{   r~   r|   python_typefloat)r   r   s     r   r  z/OutputGraph.compile_subgraph.<locals>.<genexpr>-  s          3,4   V $A77TAMMOOu<TU     r   c              3   >   K   | ]}|                                 V  d S r   )	is_tensorrX  s     r   r  z/OutputGraph.compile_subgraph.<locals>.<genexpr>9  s*      ==aAKKMM======r   r
     UNPACK_SEQUENCE	graph_out)tempvarsr  r  inputconstantzEncountered unrecognized type z at output POP_TOP
BUILD_LISTLIST_EXTENDDELETE_FASTr  )warnerror)_ExportModuleSpecTrackerDictr  in_specr6  c                 6    g | ]}t          |j                  S r   )rP   r   )r   rh  s     r   r   z0OutputGraph.compile_subgraph.<locals>.<listcomp>>  s0          7:&sz22     r   r  zWhile compiling, we found certain side effects happened in the model.forward. Here are the list of potential sources you can double check: )vrX  r,   nested_graph_breaksr  r  compile_subgraph_reasonr  r   debugr  r  prefix_instsopnamer   r7   r  rV  r   allblock_stackr  r  exitr   r$  rU  prune_dead_object_newadd_output_instructionsr  r
  r  cleanup_graphr   r   r   
decoratorsr  r   r  r  r   r  r>   r  load_function_namer5   create_storer  is_emptydebug_localsr  r+  r,  codegen_cellscompile_and_call_fx_graphr   r  r:   codegen_suffixusesrl   r\   rX   r   r   log_graph_in_out_metadatar?  r/   NamedTupleVariable	tuple_clsfunctional_exportExportTracerOutputListVariablegraph_outputsr  codegenGraphOutputEntryvariabler  r  rG  r5  r   r`  is_inputis_python_constantas_python_constantr6  rc   r   graph_output_varsrun_compiler_collectiver'  r*  r6   r2   r  r  append_outputcreate_loadr   r9   side_effect_replay_policytorch.export._tracer  _get_modified_varsr  r  rM   rO   r   r   r   r[  r7  warningsr  r   )7r   rI  r   r  r  r  install_stack_valuesall_stack_locals_metascur_txr  r  r  r  r  nn_modules_proxiesrootr  random_calls_instructionsrand_fnrand_fn_namer  stack_values_flatstored_graph_output_vargraph_output_varcell_cgpass1r  r  r  pass2r   flat_returnsr6  vt_to_graph_out_idxr   r  idxr   r,  	start_idxend_idxr  n_valsroot_cgunmodified_locals_namesr   r   r  potential_side_effectsrh  mut_typespecsk_specside_effect_refss7                                                          r   compile_subgraphzOutputGraph.compile_subgraph  sh   , |''') 	&<2%%%% 	''))).'-$		-v666 +-w&&1 	9 	9;"222 ''*, #DL$=m$L M M      !''	$8888
 !#68 KK8JKKKKKKKK!%!B!Bfll

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

6&2D
EEEE]F  " 	//333$$\222* 	
t{ 	
 	
7	
 	
 	
 	$$T%;<<<*.*N*NL+
 +
'' 	$$[111
 
8<8M8M8O8O
 
 
 011'''''' t !!A%%(*%%)\\/%B%BD"g'(9::G  G  ../BGLLLd7I  G &,,**<>>   &,,-A!U-K-KLLL%,,$$T%;<<   (()BCCC& ON-=NNN"' LB!    +      ==+<=====  C)**++s3D/E/EEE!**,, FO F ' F +2.?	 F
 +2.? F  --Gr7+++((33D*;!<!<==t 
 --// !^^ ''8cBS>T>TUUU
 
 
 
  $||K88  #5	  E $5u=== H#j..00 ) )
U199VC2F1T%U%U9$(HSM !#5  E $5u=== $>.R%.R )**a//&q)r5=#:#MNN(R}6IJ J $&8A;L!x{H%$em&=&J     GI'!&!4!;!;!=!= D D)%1F1WXXXXX49N8=+H55#,\-?#@#@ Y YR!444 + 3B 7LD0CCHH
 I1+229fd+K+K!K 2 & 2
 !( "	LD0CCHH  2244 Y * " 5 5 7 7LD0CCHH
 $YB#X#XSV#X#XXXXX4<4O4O4Q4QD(1F4:&&!++s53F/G/G1/L/L222u7N7N7P7PRVWW   u*++q00MM%"4"45E"F"FGGG.2++MM"4Y"?"?@@@@ ,,...((%2H2H2J2J)JKKK 	$$" -..1G1J1TT  	
 	
 	
& 	 !788 -	B -	BGAt*++FAvv$.({{,,*<Q???$Q    6!,,&((,Y@@ %Q   V#	 C.//!333#DL11:<' L8>>@@  DAq!!(K88 QX=PTU=U=U--g.A.A!.D.DEEE589J5K5Kc3O O 6/2 ,,,,..*(c2I.J.J   +=a@@@	 	 	 !(()@AAA 	$$"9--"<S9O5P5PQQQ 4Q7AAEFF	
 	
 	
"  	 7 	((#M:JKKKL   =9=NNNHHHHHH%'"(;;== ? ?300 ?"0H! #<>S"T  ? &c+BCC *
I'CI I * ),	(9(9 	* 	*1(*347==?? !& !&KFC(+(>(>(@(@ %*&)*F*F*H*H$I$I )2:'>$uzz||BTBT'T'T'T'T %* !% 4 E$%D$;$;$=$=!" !" 's,CDD? *396R S S? 399#>>>   >T        
='AVKKMkXhk k   
 'kXhk k  
 &%r   r  c                 @   | j         j        rd}|}|t          t          |                                                    }|D ]S}|| j        u r)|                    |                    |                     4|j        sJ  ||j        |                    T|                    t          t          |                               |j        }|dz  }||                    t          d|                     d S |                    t          dd                     d S )Nr   r+   r  r  )r  r   r1  sortedr  rX  r  create_load_closurepost_prune_cell_and_freevarsr4   r  r$  r7   )r   rI  r  tx_cntr%  r  cells          r   r	  zOutputGraph.codegen_cellsP  s>   '3 	FF:<F$ !(@(@(B(B!C!CDD$ F FD--(()?)?)E)EFFFF%BBBB6>tDEEEE  !3CMM!B!BCCC! $  /&IIIJJJJJ/!DDDEEEEEr   r  c                 \   | j                                        | j        r~| j        rJ | j                                        D ][\  }} |           | j        J                                         | j                                                 |           \t          j
        r| j                                        |j        D ]\  }                    fd           |D ]} |                               t          t!          |          d                                         t#          d          g           |                     |                               ||j                    t          j
        r| j                                        d S d S )Nc                                  S r   r   )r  	debug_vars   r   r  z,OutputGraph.codegen_suffix.<locals>.<lambda>  s    RR	]] r   Fr  )value_from_source)rU  codegen_save_tempvarsr  r
  r   r  r  r  
store_attrr,   replay_side_effectscodegen_hooksr  r  extend_outputr5   r  r7   r	  restore_stackcodegen_update_mutated)	r   rI  r  r  r  r  r   r  rG  s	      `    @r   r  zOutputGraph.codegen_suffixi  s    	//333 	${"""!06688 $ $	c3.:::  0G!H!HIIId####% 	0++B///  " 	> 	>OIt22222333  31#d))UCCDDD0;;<==== 	2r"""
RYGGG% 	944R88888	9 	9r   c                 d   | j         sJ t          | j        j                  }|D ]}|j                            dd           t          j                    }t          j	        |          D ]\  }}|j
        t          j        j        u rt          |j                  | fk    r|j        s|j        d         }|j
        t          j        j        u rbt          |j                  | fk    rH|j        sA|j        d         }| j                            |           | j                            |           dS )z
        Remove "creation_timestamp" from node meta

        Remove this pattern from the graph:
            torch._C._set_grad_enabled(False)
            torch._C._set_grad_enabled(True)
        creation_timestampNr   )r  r   r   rR  r  r'  r   r@  r  pairwiser{  r  _set_grad_enabledr1  r   _erased
erase_node)r   rR  r  r5  node1node2s         r   r  zOutputGraph.cleanup_graph  s:    TZ%&& 	6 	6DIMM.5555,..%.u55 	1 	1LE5 :::%*%%l*:)<<< =  %z!}LEH$>>>ej)),.>-@@@!M A $):a=LJ))%000J))%000	1 	1r   rL  c                 V   | j         sdS t          j        j        j        r%t          j        j                            d          t                              d           t          j	        
                    dd fd           | j                                          d| _         dS )zE
        Do not save this output graph to the CompilePackage
        NzDetected a package bypass: %sartifactc                      dddS )Nprecompile_cache_bypassjsonr  encodingr   r   r   r   r  z,OutputGraph.bypass_package.<locals>.<lambda>  s    1"! ! r   c                      di S )N_reasonr   )r   r   s   r   r  z,OutputGraph.bypass_package.<locals>.<lambda>  s    6    r   metadata_fn
payload_fn)r[  r   r   r,   strict_precompiler-   PackageErrorr   warning_loggingtrace_structuredbypass_current_entryrO  s    ``r   rP  zOutputGraph.bypass_package  s     | 	F=1 	-#00/   	3V<<<''      	( 	
 	
 	
 	))+++r   c                     i }| j         j        D ]d}|j                            dd           }t	          |t
          j        j                  r(|                                }d |D             ||j	        <   e|S )Nr  c                 Z    g | ](}t          |t                    r|nt          |          )S r   )r?  r   repr)r   ss     r   r   z:OutputGraph.get_graph_sizes_structured.<locals>.<listcomp>  s1    !U!U!U1z!S'9'9"F!!tAww!U!U!Ur   )
r   rR  r  r  r?  r   r  r   sizer  )r   retr  r  rn  s        r   get_graph_sizes_structuredz&OutputGraph.get_graph_sizes_structured  s|    02J$ 	V 	VD IMM/4@@M-):)EFF V$))++!U!UPT!U!U!UDI
r   c                 0   d}|d| dz  }| j         j        D ]}|j                            dd           }t	          |t
          j        j                  r|                                }||j	         dt          |           dz  }g }d}|D ]j}t	          |t                    r|                    |           -t	          |t
          j                  r"d}|                    |j        j                   i n|r||j	         d	t          |           dz  }|S )
NzTRACED GRAPH TENSOR SIZES
z===== z =====
r  z: 
FTz (concrete): )r   rR  r  r  r?  r   r  r   rn  r  r1  r   r   r  r  hint)	r   r  graph_sizes_strr  r  rn  concrete_size
has_symintszs	            r   get_graph_sizeszOutputGraph.get_graph_sizes  sF   72D2222J$ 	 	D IMM/4@@M-):)EFF $))++di#B#B5;;#B#B#BB ""
  B!"c** %,,R0000#B55 %)
%,,RW\::::! '#yOOu]7K7KOOO r   c              #   x  K   | j         j                                        }i }|                     |           	 | j         j                            |           dV  | j         j                            t          |                     dS # | j         j                            t          |                     w xY w)zj
        Momentarily restores the global state to what it was prior to tracing the current output
        )r3  N)r  r=  copy_graphstater  restore_graphstater   )r   prior_global_statecurrent_global_states      r   restore_global_statez OutputGraph.restore_global_state  s      
 "1@PPRR<>#7888	 /BBCUVVVEEE  /BB,-ABB    D /BB,-ABB   s   #B .B9c                    | j         }|J |j        xj        j        }t                              dj                   t          j        	                    dd fd           |j
        }t          |          dk    s0J d                    d                    |                                t          |                                                              |                                t          j                                        z            5  t)          d	d
          5  d g|                                z  }t-          j        |j        |           |_        d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |j                                         t4          j        d S d S )Nzcompiler_collective %srY  c                      dddS )Ncompiler_collectivestringr]  r   r   r   r   r  z5OutputGraph.run_compiler_collective.<locals>.<lambda>  s    1 (% % r   c                  6     j                                         S r   )local_staterender)dss   r   r  z5OutputGraph.run_compiler_collective.<locals>.<lambda>  s    2>#8#8#:#: r   ra  r+   z&Expect only one device type but got {}+r  Tr  )group)rX  distributed_state
all_states
compile_pgr   infor  r   rg  rh  _device_typesr  formatro  r@   r'  r  rankacceleratordevice_countre   rn  distall_gather_objectspeculation_logr   r-    CompileCollectiveRestartAnalysis)r   rI  r  device_typesr  r  s        @r   r  z#OutputGraph.run_compiler_collective  s<   \~~~&&B38MJHH-r~>>>N++  ;::: ,    &3L|$$)))8??@V@VWW *)) ))9)9););<<CCOO%%(9(F(F(H(HH 
+ 
+ 2$OOO	
+ 
+ *.1B1B(B
&z2>TTTT *
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ $$&&&66= 438M8Ms6   F-<E5)F5E9	9F<E9	=FFFrvr'  c                     !"#$ t           j        j                                        5  ddlm}  j        sJ                                   t           j	                  dk    r!t          |          dk    rg cddd           S t          dd          }t          |t                    sJ t          |t                    sJ                      dd j                            t%          d	 |D                                 fi           }                                 }|                    |            j                            ||           t,          j        st1          |          D ]I}t3          ||          }	t          |	t4          j                  rt9          |	 j        | j        
           J                                  t9          t5          j        | j	                   j        | j        
                                              t           j	                  }
tB          d         dxx         |
z  cc<    "                                  j#        $                                 tK          | j	                  "ddl&m'}  |"            j(        r) j(        D ]!}tS          "|t3          ||                     " j*        D ]} |"           tW          ",                                d          B -                    dt           j.        j        j/        "0                    ddd                      j1        |"_2         j3        "_3         j4        5                                "j6        d<    j7        "j6        d<   |"j6        d<   tp          9                    dtu          |"ddd                     t           j;        <                    d fd"fd            =                                  j>        j?        }|J  j        shddl@mAc m} |B                    d          5  t           jC        D                    |j                  }ddd           n# 1 swxY w Y   | j>        _?         E                                5   F                    " G                                          !ddd           n# 1 swxY w Y   ddlHmI} t          !|          s*t          t3          !dd          |          rP!jJ        dk    rEt          !|          r!n!jK        }|L                    |           t          !|          s|jM        ! j1         j1        N                    |!            |!d !          !tB          d         d"xx         dz  cc<   |j        J |j        jO        x}r-g $i #d#  jP        D             }|D ]}|Q                    |jR                  }t          jT        |jU                  V                                }t                      }t          jY        ||jU        |g          }t          9                    d$|           $[                    t          j]        |fd%|          |f           t           j.                            d !          d&t          d't          d(t          f!" #$fd)            } _                    ||           n _                    |!            j`        J t           j`                   t                      r c                     fd*           g }t          je                    D ]K} |             f                                } g                    |           |[                    |           L|D ]*} h                     i                    |                     + j                    t          t                    d            k                                 t           jP                  D ]\  }}|jR         jm        jn        |<    o                    |            p                                cddd           S # 1 swxY w Y   dS )+z
        Generate code from self.graph and return the Instruction()s to
        call that generated code.

        Code is generated w.r.t. self.root_tx.
        tx is only used for preserving GraphModule metadata
        r+   r  r   N__compiled_fnT)	with_uuidr,  c              3   >   K   | ]}|                                 V  d S r   )r  rX  s     r   r  z8OutputGraph.compile_and_call_fx_graph.<locals>.<genexpr>:  s*      5O5Oqajjll5O5O5O5O5O5Or   )r
  statscalls_captured)dce_hop_extra_outputszfGraph contains named parameters: either inline_inbuilt_nn_modules=False or there are static addresses.Fprint_outputinclude_strideinclude_device)inline_builtin_nn_modulesr   r  r  
backend_id%s)r  r  coloreddynamo_output_graphc                  0    d                                  iS )Nsizes)rp  r   s   r   r  z7OutputGraph.compile_and_call_fx_graph.<locals>.<lambda>  s    $"A"A"C"CD r   c                  4                          ddd          S )NFTr  )print_readable)r   s   r   r  z7OutputGraph.compile_and_call_fx_graph.<locals>.<lambda>  s#    2#4#4!&tD $5 $ $ r   )rc  rg  )r  )_LazyGraphModule__self___lazy_forwardz"do not trace Dynamo-compiled graphr  unique_graphsc                     g | ]	}|j         
S r   r  )r   as     r   r   z9OutputGraph.compile_and_call_fx_graph.<locals>.<listcomp>  s    <<<18<<<r   z:Compiling backend specialized graph with specialization=%sc                 $     |||                    S r   r   )r3  r   check_fns      r   r  z7OutputGraph.compile_and_call_fx_graph.<locals>.<lambda>  s    XX$(IF" F" r   r   r   r   c                     	D ]\  }} ||           r|v r |         | i |c S j                             |j        |j                  5  |j        d<   t          |           }t          j                  5                      |          |<   d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y    |         | i |c S  | i |S )Nspecialization)	r  patch_source_specializationr   r  r  r   r   r  call_user_compiler)
r   r   r  r  r   compiled_fnr   r   specialization_cachespecialization_guardss
        r   specialized_dispatchzCOutputGraph.compile_and_call_fx_graph.<locals>.specialized_dispatch  s   4I Y Y0.#8D>> Y-1EEE'K';N'K%)("-3(" (" !" !" !" "&!K!K . 5~7N" " 	& 	& =K(8 9?CDzz%,T-A%B%B !& !&(,(?(?N(S(S %9$H!& !& !& !& !& !& !& !& !& !& !& !& !& !& !&	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& $H#7#G#XQW#X#XXXX#Y$ ';7777s6   .B8;B!B8!B%%B8(B%)B88B<	?B<	c                  X                          t          j        j        j        d          S )Nstore_user_object_weakrefs)r  r   r   graph_bytecode_inputsr   )r  s   r   r  z7OutputGraph.compile_and_call_fx_graph.<locals>.<lambda>	  s%    B//;D4  r   )qr   r  r   clear_framer  r  r  r  rc   r   r  r<   r?  r   r   r  r  
create_argr1  
dedup_passr   _maybe_preserve_original_metar,   do_not_emit_runtime_assertsdirr`  r   r   r(   r  r
  remove_unused_get_attr_nodesremove_unused_graphargsrd   &remove_tensorify_specialized_graphargsr  r   r   dce_extra_outputsr  r  r   r  rv  
parametersrP  r   inline_inbuilt_nn_modulesr  r[  _backend_idr  r  r   r  r  graph_code_logr  rm   rg  rh  r  r  r  r}  r  r~  r  r  r~  r  r   torch.fx._lazy_graph_moduler  r   r  force_recompiler   add_backend_idspecializationsr  r  r   inspect	getsourcer  stripRootGuardManagerr   LAMBDA_GUARDr   r   rA  rB  r	   install_global_unsaferX  r>   rF   r  rG   r  r  r  r  r  r  pop_topr  rG  r4  make_call_generated_coder  )%r   rI  r  r'  r  r  output_nodesub_gmsattrsubgraphncallsr  subgraph_nameregister_finalizerold_fake_moder  backend_fake_moder  lazy_gmr  sourcesr  source_indexcheck_fn_sourceunused_root_guard_managerr  r  tmp_varsconstructorvar_namer3  r  r  r  r   r  r  s%   `                               @@@@@r   r
  z%OutputGraph.compile_and_call_fx_graph  s
    ])5577 K	) K	)++++++####((***4:&&!++B1K	) K	) K	) K	) K	) K	) K	) K	) _===Db$'''''dN33333**$//5O5OB5O5O5O0O0OPPR	 K oo''G(((==b+NNN5   II  D&tT22H!(BN;; 7$ N #';	    11333/N444N;	    ((*** ,,FW.///69///77999 !'')))#D$*55B@@@@@@!!"%%%
 6 M%)%L M MMBwt]/K/KLLLL&*&A ' '"""2&&&&BMMOOT**6 ##|.3m.B.\((%*4PT )   $    |'!%)-)EB&5::<< G67 ,0+ABG'($(BGL!  &"T$PT     N++%DDDD    ,    ##%%% 0:M ,,,; C999999999]]E]RR   ).(9(H(H"/"9 )I ) )%              & 2C$.**,, Q Q"55b$:M:M:O:OPPQ Q Q Q Q Q Q Q Q Q Q Q Q Q Q EDDDDD+'788 27;
DAACSTT2(O;; "+/?@@.KK$-  !00999!+/?@@ 2")/K|'++D+>>>!'$H  K Wo...!3... *666"/"9"II ;>(*%SU$<<T^<<<&5  N#*==1F#G#GL&-&78O&P&P&V&V&X&XO0@0B0B-%21&/()   H IIT'  
 *00%-;C !" !" !" !-	  +
 
 
 
 &&.R&SS8 8s 8s 8 8 8 8 8 8 8 8 8 TS8. **41EFFFF **4===<+++4<((B!!          #@#G#I#I . .KKOOO  HHX&&&OOH---- ( ? ?H$$R^^H%=%=>>>>  %B!C!CUKKK

%dn55 W WSLOJ$DSII''---&&((WK	) K	) K	) K	) K	) K	) K	) K	) K	) K	) K	) K	) K	) K	) K	) K	) K	) K	)sb   Aa)N+a)2&Q$a)$Q(	(a)+Q(	,#a))S8a)S	a)S	Na))a-0a-c                 8    | j                             d          S )NplaceholderrV  )r   
find_nodesr   s    r   placeholderszOutputGraph.placeholders6	  s    z$$$666r   c                 $    d | j         D             S )Nc                 (    g | ]}|j         d          S )r  r  )r   r  s     r   r   z)OutputGraph.graphargs.<locals>.<listcomp><	  s    DDD$	*%DDDr   )r  r   s    r   r  zOutputGraph.graphargs:	  s    DD$2CDDDDr   r   r   c                     t          dddddd          5  |                     ||          cd d d            S # 1 swxY w Y   d S )NOutputGraph.call_user_compilerbackend_compileTcompile_aot_autograd'aot_autograd_cumulative_compile_time_us)
phase_namer  log_waitcounterwaitcounter_name_overridedynamo_compile_column_us)re   _call_user_compiler)r   r   r   s      r   r  zOutputGraph.call_user_compiler>	  s     ,("& &<%N
 
 
 	@ 	@ ++B??	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@s   9= =c                    | j         J d}g }|j        j        D ]0}|j        dv r|dz  }|j        dk    r|                    |           1t          |           |D ]+}t          |d          s|j        d         }|j        |_	        ,| j
        |_        | j        |_        t          | j         d          r| j         j        nd}	  t                      t           j        d	|            | j         }	t$          j        rt)          |	          }	 |	||          }
 t                      t           j        d
|            t+          |
          s
J d            n,# t,          t.          f$ r  t0          $ r}| j        r@t5          | j         |t7          j                                                  |j                  d t?          || j         j!        dd| dtE          |           d| j         #                                 d| dtE          |           ddg           Y d }~ndd }~wtH          $ r}|d }~wtJ          $ rE}t5          | j         |t7          j                                                  |j                  d d }~ww xY wtM          ddi | j'        |tQ          |j        j                  tQ          |          d           |
S )Nr   r  call_methodcall_moduler+   r  _dynamo_sourcer  r   z<unknown compiler_fn>zcalling compiler function zdone compiler function z#compiler_fn did not return callablezBackend compiler exceptionz	Backend: z
Exception:z
Traceback:
zBackend compiler `z` failed with z. Adding a graph break.z-Report an issue to the backend compiler repo.r  dynamor  )op_count
node_countinput_count))rW  r   rR  rW  r   rk   r  r  r   r  r  _param_name_to_sourcer  _source_to_user_stacksr   r   r.   INFOr,   r   r   callabler   r   rB   r  rA   r  currentframewith_traceback__traceback__rE   rX  rZ  r   format_frame_summaryrC   r   r   rf  r  )r   r   r   totr  r  plr  r  rW  r  es               r   r  zOutputGraph._call_user_compilerK	  sb    +++HN 	* 	*DwIIIqw-''##D)))3 	/ 	/B2/00 /gj) %(J! $(#< $($>! t'44)D%%( 	
 	8LNN7<)Ld)L)LMMM*K( :,[99%+b.99KLNN7<)I4)I)IJJJK((OO*OOOOO.0@A 	 	 	0 	 	 	5 <+$a)=)?)?  .11t< '#4qDqqc!ffqqDLLmLmLoLoqqdddSVVdddC	 	 	 	 	 	 	 	 	  	 	 	 G 	8 	8 	8' !W%9%;%; nQ_--48	8
 	,.!"(.11"<00	  		
 		
 		
 s3   BE J 2B(HJ ,H..J ;A I;;J c                 P    t           j        j        j        rt	          |           S i S r   )r   r   r,   use_graph_deduplicationrH   r   s    r   r  zOutputGraph.dedup_pass	  s%    =7 	,T222Ir   sub_gmc                     t          || j        d          }||_        d|_        |                     ||d            |S )NT)requires_suffixFr  )ri   r   r   torchdynamo_force_dynamicr  )r   r  r  	next_names       r   r  zOutputGraph.install_subgraph	  sJ    'dotTTT	#+0( 	$$VYt$DDDr   c                 (    d | j         D             }|S )Nc                     g | ]	}|j         
S r   )example)r   r  s     r   r   z.OutputGraph.example_inputs.<locals>.<listcomp>	  s    888##+888r   )r  )r   r   s     r   r   zOutputGraph.example_inputs	  s    88888r   c                     t          | j                            d          d          D ]<}t          t	          |j                            dk    r|                     |           =d S )Nrv  rV  T)reverser   )r@  r   r  r  r   usersr  r   r  s     r   r  z(OutputGraph.remove_unused_get_attr_nodes	  sm    4:00J0??NNN 	' 	'D4
##$$))  &&&	' 	'r   c                 v     j         sJ dt          j        j        dt          fd}dt          j        j        dt          fddt          j        dt          ffd}dd	lm} t          t           j
        j                            D ]}t          t          |j                            dk    r|j        d
k    sh|j        dk    r|j        t           j        u sJ|j        dk    r)|j        t$          j        u r ||j        d                   s ||          s ||          r                     |           dt          j        dt,          t.          j                 fd}dt          j        dd f fd}t3                      dt2          t.          j                 dt4          t$          j        t$          j        f         dd fdg } j        D ]} ||          d u}|r|j        s|                    |           /|j        s,t?          |j         d         tB                    s ||           b|j         d         }	t?          |	tB                    rt?          |j         d         j"        t$          j#                  r|j         d         j"        }
|j         d         j$        }t$          j%        j&        '                    |
          sktQ          |
)                                          }|D ]G}tU          |j+        |          }tY          j-        t$          j        t$          j        ffd|           Hdt]          t_          |j         d         j"                            r|	j0        |	j0        n|	j"        } |           |D ]4} ||          }|%|vr ||           1                    |           5d S )Nb_noder   c                     | du rdS t          | t          j                  sdS | j                            d          }|dS |du rdS t          |t
          j                  r|j                                        x}|S dS )NTFr  )	r?  r   Noder  r  r   SymBoolr  maybe_as_bool)r  brs      r   is_static_truez;OutputGraph.remove_unused_graphargs.<locals>.is_static_true	  s    ~~tfbg.. u00AyuDyyt1em,,&..000Q= 5r   r  c                     ddl m} t          | t          t          t
          f          rdS t          | t          j                  r(t          | j        	                    d          |          S dS )Nr   SymTypesTr  F)
torch.fx.experimental.sym_noder(  r?  r   r  r   r   r   r  r  )r  r(  s     r   is_symnode_argz;OutputGraph.remove_unused_graphargs.<locals>.is_symnode_arg	  sj    ??????!c5$/00 t!RW%% I!!&**_"="=xHHH5r   r  c                 .   ddl m} | j        dk    rdS t          | j                            d          |          sdS t          fd| j        D                       sdS t          fd| j        	                                D                       sdS dS )	Nr   r'  r  Fr  c              3   .   K   | ]} |          V  d S r   r   r   r  r*  s     r   r  zWOutputGraph.remove_unused_graphargs.<locals>.is_symnode_compute_node.<locals>.<genexpr>	  s-      <<Q~~a((<<<<<<r   c              3   .   K   | ]} |          V  d S r   r   r-  s     r   r  zWOutputGraph.remove_unused_graphargs.<locals>.is_symnode_compute_node.<locals>.<genexpr>	  s-      GGQ~~a((GGGGGGr   T)
r)  r(  rW  r?  r  r  r  r   r   r  )r  r(  r*  s     r   is_symnode_compute_nodezDOutputGraph.remove_unused_graphargs.<locals>.is_symnode_compute_node	  s    ??????w/))udimmO<<hGG u <<<<$)<<<<< uGGGG$+2D2D2F2FGGGGG u4r   r   )is_accessor_noderv  r  c                     | j         d         }|j        }t          |t          j                  r0t          |j        j        t          j                  r|j        j        S d S Nr  )	r  r  r?  r   r  r  exprsympySymbol)r  r  r  s      r   placeholder_binds_symbolzEOutputGraph.remove_unused_graphargs.<locals>.placeholder_binds_symbol	  sX    )J'CkG'5<00 )Z!5<6 6 ) |((4r   c                     t                               d| j        d         j        j                   | j        d=                     |            j                            | d            d S )NzREMOVE UNUSED GRAPHARG %sr  )r   r  r  r   r  r  r  r'  )r  r   s    r   remove_unusedz:OutputGraph.remove_unused_graphargs.<locals>.remove_unused
  sd    II149Z3H3O3TUUU 	*%T"""!%%dD11111r   used_symbolsfakec                 *    | t          |          z  } d S r   )r!   )r9  r:  s     r   update_used_symbolsz@OutputGraph.remove_unused_graphargs.<locals>.update_used_symbols
  s     L...LLLr   r  c                      |           S r   r   )tr<  r9  s    r   r  z5OutputGraph.remove_unused_graphargs.<locals>.<lambda>4
  s    .A.A,PQ.R.R r   )2r  r   r  Argumentr   r   %torch.fx.experimental.symbolic_shapesr0  r  r   r   rR  r  r  rW  r{  operatorgetitemr   _checkr   r  r   r4  r5  r  r   r  r   r  r   r?  r  rs   r  ScriptObjectexample_strong_ref_libraryfake_class_registrytracing_with_realr   __obj_flatten__r`  wrapped_objpytreetree_map_onlyr   r  fake_tensorremove)r   r%  r/  r0  r  r6  r8  recheck_placeholdersbinds_symbolr  real_script_objfake_script_obj	flat_dictr  fake_attr_valr:  symbolr*  r<  r9  s   `                @@@r   r  z#OutputGraph.remove_unused_graphargs	  sz    	27#3 	 	 	 	 	&	bg. 	4 	 	 	 		"' 	d 	 	 	 	 	 	" 	KJJJJJT$*"23344 	+ 	+D4
##$$))Gz))?22t{hFV7V7V?22 K5<77*N49Q<88 8 /.t44 8 ('--	 8 $$T***	27 	x7M 	 	 	 		2 	2D 	2 	2 	2 	2 	2 	2 +.%%	/el+	/38u|9S3T	/	/ 	/ 	/ 	/
  "% &	< &	<D33D99EL #<z 6(//555z <*Ij)+@+ + < "M$'''' )J/C!#'<== ! !$)J"7"?ASTT !*.)J*?*G*.)J*?*R$~ASS+    " )-_-L-L-N-N(O(OI(1 " "07$3$?1" 1" !' 4%*\5<$@$R$R$R$R$R$1!" !" !" !"
 !%d49Z+@+H&I&IJJ ! +.?+FCK  ('d;;;; ) 	0 	0D--d33F!--!M$'''' !''///	0 	0r   c                 <   ddl m} | j        j        D ]}|j                            d          }t          |t                    r|j        t          |j        j
        j        d          rt          d |j        D                       r|                    |j        j
        j        j                  rht!          |j                  D ]>}|                    t%          |j                             |                     |           ?|                     |           	d S )Nr   )TensorifyStater  r  c              3   ,   K   | ]}|j         d k    V  dS )itemN)r{  )r   us     r   r  zEOutputGraph.remove_tensorify_specialized_graphargs.<locals>.<genexpr>`
  s)      ??qF*??????r   )torch._dynamo.symbolic_convertrW  r   rR  r  r  r?  r   	item_memor  r  _exprr  r  should_specializer  r   replace_all_uses_withr"   r  )r   rW  r  r  rZ  s        r   r  z2OutputGraph.remove_tensorify_specialized_graphargsI
  s.    	BAAAAAJ$ 	' 	'D IMM/::M=*55'!+7M38>GG 8??DJ????? 8 #44!+06;  8 dj)) ( (A++L9P,Q,QRRR$$Q''''  &&&	' 	'r   c                 H    | j                             |           d| _        dS )zt
        We call this on the creation of a new compiled subgraph that is inserted
        before user code.
        TN)r  r  r  )r   r  s     r   r  z#OutputGraph.add_output_instructionsk
  s)    
 	 ''///r   c                     || j         vsJ | j                             |           | j                            t	          j        | j        ||                     dS )a`  
        WARNING: prefer the safer `install_global_by_id/install_global`.
        torch.compile instances should be independent of each other;
        one footgun is to have one instance depend on the existence of
        a global installed by another instance. This can happen if we mangle
        a global the same way across both instances.
        N)ry  r   r  r   ra   r  r   )r   r  r   s      r   r  z!OutputGraph.install_global_unsafes
  s]     411111""4((([/0A4OOPPPPPr   c                     | dt          |           d| j         }|| j        v r|S |                     ||           |S )z
        Installs a global if it hasn't been installed already.
        This is determined by (prefix, id(value)) pair.

        Returns the name of the newly installed global.
        rf  _c)r   rx  ry  r  r   r  r   r  s       r   install_global_by_idz OutputGraph.install_global_by_id
  sU     992e9999994)))K""4///r   c                 P    t          |          }|                     ||           |S )z~
        Installs a global, generating a unique name for it.

        Returns the name of the newly installed global.
        )r<   r  rd  s       r   r  zOutputGraph.install_global
  s,       ""4///r   c                    d | _         | j                                         | j                                         d | _        | j        j        D ]}d|j        v r|j        d= | j                                         | j	                                         | j
                                         | j                                         | j                                         | j                                         | j                                         | j                                         | j                                         | j                                         d S r2  )rX  r   r   r  r  r   rR  r  r  r  rU  r  r  r  r  rt  r  r  r  s     r   cleanupzOutputGraph.cleanup
  s@    /55777$(!J$ 	* 	*DTY&&Ij)##%%% &&(((!!!#))+++#))+++-33555""$$$ &&((( &&(((!!#####r   r  c                 :    | j                             |           d S r   )r  r   )r   r  s     r   add_graph_finalizerzOutputGraph.add_graph_finalizer
  s"     	#**+=>>>>>r   r  c                 z    |j         dk    r|j        d         j        S |j         dk    sJ | j        |j                 S )z#Extract the non-fake example tensorr  r  rv  )rW  r  r  r   r{  r  s     r   example_value_from_input_nodez)OutputGraph.example_value_from_input_node
  sA    7m##9Z(00w*$$$$t{++r   inlined_moduler   c                 R    t                               j                  t           j         j                   j                                       dt          dd f fd}t          |d          rLt          |j
                  r8|j
        j        t          u r%|
                                D ]\  }} ||           t          |d          rLt          |j                  r:|j        j        t          u r)|                                D ]\  }} ||           d S d S d S d S )Nr  r   c                     j         J t          |           } d|  }|j         |<   t          t                    r)| j        t
                              |j                  <   d S d S r]  r  r  s      r   r  zHOutputGraph.add_fqn_info_for_inlined_modules.<locals>.register_leaf_name
  s    ,888*69==J,,,,H2<D%h/&+..   5//
@@   r   r  r  )rT  rr  r  ri   r  r   r   r   r  r  r  __func__!og_module_named_parameters_fn_ptrr  og_module_named_buffers_fn_ptr)r   rm  r   r  r  rf  r  s   ` `   @r    add_fqn_info_for_inlined_modulesz,OutputGraph.add_fqn_info_for_inlined_modules
  s    **6;77"$94;L
 
 	/33D999	# 	$ 	 	 	 	 	 	 	 	 >=11 	28992"3<45 5 %3$C$C$E$E 2 2LIq&&y1111>:.. 	25662"0912 2 %3$@$@$B$B 2 2LIq&&y1111	2 	22 22 22 2r   Fr   )r  )r   rr  r   )r   rT  )rI  r   r   N)r   r   )rc  )Fr   rR  )r   r   r   r   rN   r   r   r   r	   r   r1   r   r   r   r  r   r   r   r  r  r   r  r  r  rr   r1  r   Proxyr  r  r  r  r   r  r  r  r$  r  r  r  Graphr   setterr  r   r   r  r4  r5  r   r  r  r  r  r  contextmanagerr'   r   Tracerr*  r,  r  r  r  r$   r  r  r"  r   r   r#  r  r  rK  rM  rO  r   rc   rS  rZ  r   r   rb  r  rk  staticmethodrr  rz  r  r;   r   r  r&  r  r   r>  r>   r	  r  r  rP  rp  rx  r~  r  r   r
  r  rt   r  r   r0   r  r  r  r  r   r  r  r  r  r  re  r  rh  rj  rl  rs  r   r   r   rT  rT     sP            TP TP38nTP j)TP -	TP
 TP %%67TP TP TP TP TP $((I#JTP *+TP TP 
TP TP TP TPl
 
 
 
* * * *D3 D D D D
 4:5 5#5-05	sEHN"	#5 5 5 5)%(. ) ) ) )*   <:Xd3i=P : : : ::38$,1#s(O	   8&8BG#4 & & & & &# # # #
    X       X & & & & & )ux~ ) ) ) X) \*58> *d * * * \* 7T#rx-%8 7 7 7 X7 4$rw'<"= 4 4 4 X4 1tEL%8S2T$TU 1 1 1 X1A# A A A A A A@ @ @ @ @ @ @@ @ @ @ @ @ @ 
 &*	 ' ' c]	
 
29dD(	)   :    X .5,; . . . X. 88 8 8 8 X8
 A/ A A A XA >DcN > > > X> FD)C$D F F F XF KO$
 $
DeHS#X,>,D&E!EFG$
	$
 $
 $
 $
L$ $ $ $& & & & N N N XN'S ' ' ' '0 0 0 0 0JT J J J J# %0D*E     C C    5C 5D 5 5 5 5
      \.,/	   &Nehou|S89N N 	N
 
N N N N`X/-X/	tK $vv~"66	7X/ X/ X/ X/tY"-Y";>Y"	tO$&99	:Y" Y" Y" Y"~ !&v& v&'v& #v& 	v&
 v& 
!	"v& v& v& v&pF ; F Ft F F F F2"9'"9 ?+"9 	"9
 
"9 "9 "9 "9H1 1 1 1< S      4Dd5c?6K1K,L    C C    2 c    "!7 !7 !7 !7FX)'X) !X) 	X)
 
k	X) X) X) X)t 7d27m 7 7 7 X7 E4> E E E XE@.@26v,@	@ @ @ @J.J26v,J	J J J JXDeh&:!:;    S %(2F 3    U\ 2    ' ' ' '
X0 X0 X0 X0t '  '  '  'D d;.?  D        
Q# 
Qc 
Qd 
Q 
Q 
Q 
Q3 s s    	S 	 	 	 	 	 	$ $ $ $,?"*BN+;T+A"B?	? ? ? ?
,%(- ,C , , , ,$2#ho$27=$2	$2 $2 $2 $2 $2 $2r   rT  c                       e Zd ZU eed<   eed<   ee         ed<   ee         ed<   eeedf                  ed<   e	e
ef         ed<   	 dd	d
dee         ddfdZddZdS )DynamoTracerOutputerror_on_graph_breakis_tracing_resume_prologueoutput_graphoutput_graph_for_cleanup.closure	f_globalsNr)  r   r  r   c                     |j         | _         |j        | _        |j        | _        |j        | _        |j        | _        |r	d | _        d S |j        | _        d S r   )r}  r~  r  r  r,  r  r  )r   r)  r  s      r   r   zDynamoTracerOutput.__init__
  s]     %+$?!*0*K'~)(.% 	. $D &Dr   c                     | j         }|rX|j        D ]}|j                                         |j        j        r+|j        j        j        rd |j        j        j        _        d S d S d S d S r   )r  rs  r   _clear_nodesr  r  r  rb  )r   r  r)  s      r   _cleanup_output_graphz(DynamoTracerOutput._cleanup_output_graph
  s    4 	V&. , ,))++++ ,6V 0:DV RV,6@NNN	V 	VV V V Vr   r   r   )r   r   r   r   r   r   rT  r1  r	   r   r   r   r  r   r   r   r|  r|  
  s          $$$$;'''' '{3333eCHo&&&&CH~ KO. .1.:B3-.	. . . .
V 
V 
V 
V 
V 
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k    rd S dt           j        j        dd f fd}dt           j        j        dt          dd f fd}t	          |t           j        j                  r7t           j        j        |j        v r ||           d S  ||d| d           d S t	          |t           j        j                  rSt          |
                                          }t          |          d	k    rMt          ||d
                   }t           j        j        |j        v r ||           d S  ||d| d           d S t           j        j                             j        ||fd          \  }}	 t          j        j        |j        g|R i |}	n7# t(          $ r*}
t+          ddt          |
          g            Y d }
~
nd }
~
ww xY wt          ||	          }t           j        j        |j        v r ||           d S  ||d| d|	 d           d S d S )Nr  r{  r   c                 R    | j         dv rd S j                            |            d S )N>   atenprimprims)	namespacer  r   )r{  r  s    r   encountered_compliant_opz8check_pt2_compliant_op.<locals>.encountered_compliant_op  s4    888F)--f55555r   r   c                     j                             |            t          j        r t	          dd|dz   t
          z   g            d S d S )Nz Encountered non-PT2-compliant oprL   r  )r  r   r,   only_allow_pt2_compliant_opsrD   err_epilogue)r{  r   r  s     r   encountered_non_compliant_opz<check_pt2_compliant_op.<locals>.encountered_non_compliant_op  se    &**6222. 	:#I4	     	 	r   z%Encountered the torch.ops.OpOverload z that is not PT2 compliant.r+   r   z:Encountered the non-overloaded torch.ops.OpOverloadPacket z that is not PT2 compliant. Fz*Error when attempting to resolve op packetrL  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OpOverloadPacketr1  	overloadsr  r`  r   r8  get_fake_values_from_nodesrO  r  _jit_resolve_packet_qualified_op_namer   rD   )r  r  r{  r   r   r  r  r  rW  overloadr  s   `          r   check_pt2_compliant_opr    s    6)> 64 6 6 6 6 6 6
UZ-B  QU       &%*/00 9&&+55$$V,,,F$$WFWWW	
 	
 	
 	&%*566 +&**,,--	 y>>Q1..By*bg55((,,,((/.4/ / /   F}*EE#dF^U
 
f
	x3),0  4: HH  	 	 	DFF	        	 VX&&9&"'11$$R(((((((&f & &3;& & &    K+ +s   +F 
F? F::F?PRc            
       Z    e Zd Zdddeeef         dej        dej        ddf
dZde	fd	Z
dS )
r  r)  rr  r   r   r   r   Nc                 >    || _         || _        || _        || _        d S r   )r)  r   r   r   )r   r)  r   r   r   s        r   r   zLazyProxy.__init__c  s$     	r   c                 0     | j         | j        i | j        S r   )r   r   r   r   s    r   r   zLazyProxy.__call__p  s    tw	1T[111r   )r   r   r   r   r  r  r   r   r   r	   r   r   r   r   r  r  b  s          QTN v	
 ( 
   2# 2 2 2 2 2 2r   r  c                       e Zd ZdZ	 	 	 	 d-ddded          dedee         d	ee         d
df fdZde	fdZ
dddej        d
dfdZ	 	 	 d.dededededee         dee         deeej        gej        f                  d
ej        f fdZ	 	 	 	 d/dededededee         dee         d
ej        f fdZdej        d
dfdZ	 	 d0dededededee         d
ej        fd Zd!ej        d
eeej        f         fd"Zd#ed
efd$Zded%eeej        j        f         d
dfd&Zdeej        ej        f         d'ee         d
dfd(Zd)ej        d
ee j!                 fd*Z"d
e#fd+Z$d
e%fd,Z& xZ'S )1rr  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.
    NFr  rT  r$  r^  r   r"  r   c                    t                                                       t          j        |          | _        t
          j                                        | _        || _	        i | _
        i | _        || _        || _        || _        i | _        i | _        i | _        d | _        d| _        d| _        d| _        d| _        |
|j        dz   nd| _        d | _        d | _        d | _        d | _        | j        g | _        n/| j        j        | j                            |          |fgz   | _        t=                      | _        g | _         t          j!                    rtE          d          t=                      | _#        d S )NFr+   r   zSInference mode is supposed to be disabled during compilation. Please open an issue.)$r   r   weakrefrx  r  r   r   rv  r   r^  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is_reconstructing_generatordebug_level	_cur_code_orig_gm_meta_orig_gm_lineno_map_orig_gm_firstlinenosource_fn_stack_target_to_strr)   _used_names_input_versions_at_beginningis_inference_mode_enabledr   tracked_tensor_or_symint_vt)r   r  r$  r^  r   r"  r   s         r   r   zSubgraphTracer.__init__|  s    	#M,77X^^%%
 # 9; =? *& :< TV >@!
 =B9;@8 */& ,1(:@:L 2Q 6 6RS26GK 37!
 ;.0D  #';#>**=99=IB $D 
 -7LL 8:)*,, 	e   IS(((r   r   c                 :    | j                             |           d S r   )r  r   )r   r   s     r   record_tensor_or_symint_vtz)SubgraphTracer.record_tensor_or_symint_vt  s    (,,R00000r   rI  r   r  c                 @   | j         r| j        r| j        r|j        j        }d }|#| j                            || j        z
  d           }|Q| j         |         }t          j        j        D ]}||v r||         |j	        |<   d|v r|d         |j	        d<   d S d S d S d S d S d S )Nstack_trace)
r  r  r  current_instructionstarts_liner  r   rx  _COPY_META_FIELDSr  )r   rI  r  linenonode_idxr  r   s          r   r  z,SubgraphTracer._maybe_preserve_original_meta  s     	C(	C )	C
 +7FH!377T66  #)(3X7 7 7E}}+/;	%( D((/3M/BDIm,,,#	C 	C 	C 	C 	C 	C $#
 )(r   r  r{  r   r   r  	type_exprproxy_factory_fnc           	      
   | j         bt          j        ||f          \  }}	g }
|D ],}|                     |          }|
                    |           -t          j        |
|	          \  }}t                                          ||||||          | j        j	        }t          j        dk    r|dv r|j        | j        uryj        rj        j        f|j        |                    j        j                  dt$          ffd}t&                              dt+          |                     | _        d}|j        | j        ur t/          j        |j                                      dd	                       }t5          |t6          j        j                  r@d
}d |j        j        D             | _         |j!        | _"        |j#        j$        j%        | _&        nd | _         d | _"        d | _&        |j'        }|r!|(                                j)        j*        d<   |dv rj)        j+        f}|rtY          j)        j*        d         -                                          d         d         }|j.        /                    d          r(|j.        /                    d          sj)        j+        |f}| j0        |gz   j)        j*        d<   n|dk    r| j         tc          dd| j2         dg            | j0        j)        j+        tg          fdj)        j*        d         4                                D                       fgz   j)        j*        d<   | 5                    |j)                   |sdj)        j*        vr*|j'        }|r!|(                                j)        j*        d<   dj)        j*        vr|dv r%| j0        j)        j+        fgz   j)        j*        d<   n`|dk    rZ| j         tc          dddg            | j0        j)        j+        j)        j*        d                  d         fgz   j)        j*        d<   dj)        j*        vrg }|rN|6                                s'|                    |7                                           tq          |dd           }|Nd |D             }|9                                 tt          j;        <                    |          =                                }d>                    |          j)        _?        t6          j@        jA        jB        st6          j@        jA        jC        r/| j        jD        E                    | j        j	        j)                   S )Nr  r  )r  r   c                  r    t                                                    } dj        j         d d|  S )NzTRACE FX call z from rr  )rf   rstripr  r  )linecur_instheaderr  tx_codes    r   get_trace_call_log_strz;SubgraphTracer.create_proxy.<locals>.get_trace_call_log_strE  s@    5gxHHOOQQDPBGLPPPP$PPPr   r  Forig_graphmodulec                      d S r   r   r   r   r   r  z-SubgraphTracer.create_proxy.<locals>.<lambda>P  s    D r   Tc                     g | ]	}|j         
S r   r  )r   nds     r   r   z/SubgraphTracer.create_proxy.<locals>.<listcomp>T  s'     & & & "BG& & &r   nn_module_stack>   r  r  r
  r+   )ztorch.nn.modulesz	torch.ao.ztorch.nn.modules.containerr  r  z4Invoking an nn.Module inside a higher order operatorzHigher order op name: zThis is not supported.r  c              3   f   K   | ]+\  }\  }}|                     d           d         k    '|V  ,dS )@r   N)r_  )r   r   rf  tyr{  s       r   r  z.SubgraphTracer.create_proxy.<locals>.<genexpr>  sP        &Aw2773<<?f44 4444 r   z2Invoking an nn.Module inside a HigherOrderOperatorrL  r  r$  c                 <    g | ]}|j         t                      v|S r   )filenamer&   )r   frames     r   r   z/SubgraphTracer.create_proxy.<locals>.<listcomp>  s6     ( ( (>)<)>)>>> >>>r   )Fr$  rK  tree_flatten#maybe_lift_tracked_freevar_to_inputr   tree_unflattenr   r  r  rO  r  r  r  r  	positionsr  rZ  get_line_of_code_headerr   trace_call_logr  rn   r  r=   get_contextr  r?  r   r   r   r   rR  r  _lineno_mapr  r   __code__ra  r  r  r   r  r  r  r   r  r   
startswithr  rD   r   rv  r   r  is_co_filename_from_nn_modulesframe_summaryr`  r  r   StackSummary	from_listr  ro  r  r   r,   r  track_nodes_for_deduplicationrz  
track_node)r   r  r{  r   r   r  r  r  	flat_args	tree_specnew_flat_argsr  maybe_new_argrI  r  is_retracingorig_graphmodule_mayber  r  current_nn_moduleframe_summariesfiltered_frame_summariesmsgsr  r  r  r  r   s     `                    @@@@r   r  zSubgraphTracer.create_proxy  sU   V ;"#)#6f~#F#F IyM  4 4 $ H H M M$$]3333!0	JJLD&WW!!
 
 ) w&&4 4
 ,
 ,

 -H..&2&-9)338;M;T3UUQ Q Q Q Q Q Q Q Q Q $$T:6L+M+MNNN!) 9DN**&\%=bi%H%H%L%L"LL& & & &" 0%(2FGG 1#& &&<&B&H& & &" ,B+M(*2;J )) &*"+/(,0), 	E.=.B.B.D.DBGL*+333W\6*E > %)6G)H)O)O)Q)Q$R$RSU$V%! %/::5  >+6AA0 >
  W\+<=E.2.BeW.LBGL*++]""{&RIT5GII 8	    /3.BGL    *,',7H*I*O*O*Q*Q    	F 	/BGL*+ 	**2rw777 	 44"$"4" M6E6J6J6L6LBGL!23 44;;;6:6Jv.N 7BGL!233 ]**{.%$X$&(@"$	    7;6JGLGL):;FCAFN 7BGL!23 ,,<>O 1 88:: ?#**2+;+;+=+=>>>R400  1( (,( ( ($ %,,... )334LMMTTVVD"$''$--BG M 8	}#A	 ,77!,bg   	r   rW  c                    t          | j        ||||           | j        Pt          j        |i |}|D ]<}t          |t          j        j                  s"|j	        | j	        k    s
J d            =t                                          ||||||          }	| j        j        |	j        d<   | j                            |	j                   |	S )Nz2create_node using arg not from this SubgraphTracerrQ  )r  r  r$  rK  arg_tree_leavesr?  r   r   r   r   r   r  r  r  r  r   r  )r   rW  r{  r   r   r  r  r  r  r  r   s             r   r  zSubgraphTracer.create_node  s     	t0"fdFKKK;".???I   !#ux}55 yDJ...H /... ww""2vtVT9MM*.*;*E	&'TY'''r   c                    t          |j                  dk    rtg }|j        D ]K}|j        | j        k    r9|                    t	          t          |j        j                                       L|D ]}|j                            |           | j                            |           | j        	                    |j
        d            d S r  )r  r  r   r  r  r   rR  rU  r  r'  r  )r   r  user_graph_nodesuserother_graph_nodes        r   r  zSubgraphTracer.remove_node  s    tz??Q46
 N N :++ %++HT$*:J5K5K,L,LMMM$4 D D  &112BCCCC
d### $$TY55555r   r  beforer   c                    t          |t          j                  r| j                            |j                   t                              d|||j        nd|| j	        |           || j
        J d| d| d            | j        r`| j
        Y|J t          |d          sD| j        j                            |g                               t!          j                               t%          || j                  }| j        rkt+          t-          | j                            }| j        |         j        }|r| j                            |          }n5| j                            |          }n| j                            d           }|5  |                     d|d	i |
          }	t9          |	j        |           | j        r3|r1| j                                        \  }
}|	| j        |<   || j        |
<   n
|	| j        |<   | j                            |           | j        }t          j                                         }|s|st          |t          j                  r| !                    ||           nxt          |tD          tF          f          r\tI          |          D ]L\  }}t          |t          j                  s d }|rtK          ||d          }| !                    ||           Mt          |t          j&                  r8t          |j        j'        tP          j)                  r|	| j*        |j        j'        <   |	cd d d            S # 1 swxY w Y   d S )Nz7create_graph_input %s %s %s at debug_level %s before=%sz(none)z0you are required to provide a source for inputs z example_val z on the root tracerT)only_allow_inputr  r   r  F)r  r  index_is_slice)+r?  r   r   r  r   _versionr   r  r  r  r$  r^  rW   r  r  
setdefaultr   extract_stackri   r  r  rv  r  r  r   inserting_beforeinserting_afterr  rq   popitemr   compileris_compiling_lift_basic_symbolsr   r1  r  rT   r  r3  r4  r5  r  )r   r  r  r  r  r   	prev_namer  ctxrx  r   r   is_strict_exportis_non_strict_exportr  r  e_sources                    r   r  z!SubgraphTracer.create_graph_input  s    mU\22 	M-44]5KLLL		E!-FKK8	
 	
 	
 >;**x4xxVcxxx +** > 	dk1%%%'FFF !7BB62NNUU"022   #4)9::# 	4Xd&>??@@I+I6;D 7j11$77j0066*--d33C D	 D	%%mT2rY%WWEej-888' 7F 7/7799116(../(++16(.
   &&&@  $~#(>#>#>#@#@ # >,@ >mU\:: >,,]FCCCCe}== > )- 8 8 
> 
>1)!U\:: %$#'! '4%+1U( ( (H 00H==== -66 D:"'< < D ?D"=#5#:;ID	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	s   F3MMMrx  c                    | j         
J d            |j        j        d         }t          |t          j                  r*|j        j        | j        v r| j        |j        j                 S || j        v r| j        |         S |j	        | j         k    r| j         
                    |           |j        j        d         }|                     |j        j        t          |          |          }|| j        |<   |S )NzIlift_tracked_freevar_to_input should not be called on root SubgraphTracerr  )r$  r  r  r?  r   r  r3  r  r  r)  lift_tracked_freevar_to_inputr  r  r  )r   rx  r  	new_proxys       r   r  z,SubgraphTracer.lift_tracked_freevar_to_inputp  s    
 {&&W '&& 
8 }el33	?"'4+===%m&8&=>>
 D((('..
 <4;&&K55e<<<
8++JOT-00-
 
	 '0U#r   r  c                     t          |t          j        j                  s>t          |t                    r't	           fd|j        |j        |j        fD              S |S |j         k    r|S  	                    |          S )z
        If arg is a free variable, then lift it to be an input.
        Returns the new lifted arg (if arg was a freevar), else the
        original arg.
        c              3   B   K   | ]}                     |          V  d S r   )r  )r   sub_argr   s     r   r  zESubgraphTracer.maybe_lift_tracked_freevar_to_input.<locals>.<genexpr>  sE        # @@II     r   )
r?  r   r   ru  slicestartstopstepr)  r  )r   r  s   ` r   r  z2SubgraphTracer.maybe_lift_tracked_freevar_to_input  s     #ux~.. 	
 #u%%    (+	38SX'F    
Z4J11#666r   e_proxyc                     j         t          t                    sJ dt          dt          f fd}dt          dt          dt          dt
          j        ffd}t          |t          j                  rt          |
                                          D ]\  }} ||          rxt                              d||j                   t          ||d	t          j        j        j        j        |fi t'          |          
          }                     ||           |                                } ||          rqt                              d|j                   t          ||d	t          j        j        j        fi t'          |          
          }                     ||           |j        t          j        u rt          |                                          D ]\  }} ||          rxt                              d||j                   t          ||d	t          j        j        j        j        |fi t'          |          
          }                     ||           nC|j        t          j        u rQ                     |                                                                |                                           n|j        t          j        t          j        hv rQ                     |                                                                 |!                                           no|j        t          j"        t          j#        hv rP                     |$                                                                |%                                           tM          |          rP|'                                \  }	}
|	D ]8}tQ          ||          }                     |tQ          |                     7d S d S t          |t          j)                  r# ||          r|j*        j+        }j,        |<   d S d S d S )Nrm  r   c                     ddl m}  ||           o6t          | j        j        t
          j                  o| j        j        j        vS )Nr   )r#   )r@  r#   r?  r  r3  r4  r5  r  )rm  r#   r   s     r   	need_bindz8SubgraphTracer.track_produced_symints.<locals>.need_bind  sS    IIIIII A :qv{EL99:FKt'99r   r  r   r   c                 B   t          t                    r
             nt          t          j        j                  sJ j                            j                  5   j        |i |}t          |j        |            |cd d d            S # 1 swxY w Y   d S r   )
r?  r  r   r   ru  r   r  r  r  rq   )r  r   r   rx  r  r)  s       r   _proxy_with_example_valuezHSubgraphTracer.track_produced_symints.<locals>._proxy_with_example_value  s    
 $.gy#A#ANggiiiwGgux~66666--gl;;  ++T<V<<!%*m<<<                 s   #$BBBz=track_produced_symints %s for %s.size()[%s] at debug_level %sr  r  zCtrack_produced_symints %s for %s.storage_offset() at debug_level %sz?track_produced_symints %s for %s.stride()[%s] at debug_level %s)-r)  r?  rr  r	   r   r   ru  r   r   r  rn  r   r  r  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  r3  r  )r   r  r  r  r  r  rm  
lazy_proxyr  attrsr  r  inner_tr3  r)  s   ` `           @r   r  z%SubgraphTracer.track_produced_symints  s     &.11111	 	 	 	 	 	 	 	
	
	'*
	69
	X
	 
	 
	 
	 
	 
	 
	 mU\22 Q	5!-"4"4"6"677 ? ?19Q<< ?IIW*   "+1'	/3 !"&q''	" 	" 	"J //:>>>*99;;Ny(( H		Y"&	   '-"#IN5J">22	 	 	
 ++NJGGG#u}44%m&:&:&<&<== C CDAq y|| C		]#".   &/"5+!IN59$aL&*1gg	& 	& 	&
 33AzBBB'C* %)999++M,B,B,D,DgNNN++M,A,A,C,CWMMMM%%*:E<L)MMM++M,F,F,H,H'RRR++M,E,E,G,GQQQQ%%*:E<L)MMM++M,F,F,H,H'RRR++M,E,E,G,GQQQ,];; Q*==??
s! Q QD%mT::G//$9O9OPPPP	Q QQ Q u|44 	5y'' 5$).-4$T***	5 	55 5r   srcc           	      N    	 d	dt           t          t          j        f         dt          t
                   dt          dd f fd}t          |t          j                  rt          |
                                          D ]0\  }} |||t          |t          j        |          nd d           1|j        t          j        u rt          |                                          D ]0\  }} |||t          |t          j        |          nd d           1 ||                                |t          |t          j                  nd d           nC|j        t          j        u rQ                     |                                |                                |                                |           n|j        t          j        t          j        hv rQ                     |                                |                                |                                |           no|j        t          j        t          j        hv rP                     |                                |                                |                                |           tA          |          rT|!                                \  }}|D ]<}tE          ||          }	                     |	|tG          ||          nd            ;d S d S t          |t          j                  r |||           d S d S )
NFrm  r   r  r   c                    t          |           sd S t          | t          j                  sJ                     |           }t          |          dk    rd S j        ˉj                            | |           |D ]}j        j        |         }|j	        j
        d         }t          |t          j                  sJ                     t          |          t          |          |||          }t                              d|||j        ndj                   |j        |<   d S t          |          dk    sJ d| d|              |J d	|  d
|  d            t'          t)          |                    }                    t          |          t          |           | ||          }t                              d| ||j        ndj                   t+          || dd d          |j	        j
        d<   d S )Nr   r  )r  r   z4_lift_symbols_in_symint %s from %s at debug_level %szsubgraph inputsr+   zyFor root tracer, we only expect to bind basic symbols (compound symbols should be cached before) but got unbound symbols z in zSource of 'z' is None when lifting it to input of top-level. If it's an unbacked symbol, this could be because it's not tracked with lazy_bind_unbacked_symbols. Otherwise, should provide a source when create_graph_input for `z` at root tracer.F)pass_arg_as_tensorrM  r  r  )r#   r?  r   r  lookup_unbound_symbolsr  r$  r  r  r  r  r  r   r  r   r  r  r  r  rv  iterrt   )	rm  r   r  self_to_be_bounds0parent_proxyexample_valphr   s	           r   _lift_symbols_in_symintzCSubgraphTracer._lift_basic_symbols.<locals>._lift_symbols_in_symint=  s   
 q>> a.....#::1==#$$)) {&//6:::* < <B#';#<R#@L"."3"8"IK%k5<@@@@@00B[))#%% 1  B IIN'-'9?P(	   :<D(66#< <( +,,111bHXb b^_b b 211 ))l! l lWXl l l *))
 $/0011,,GGGG!! -   		J#)#5FKK;L$	   ,4', $#, , ,Z(((r   T)r  rt  )$r   r   r   r  r   r   r   r?  r   r  rn  r^   r]   SIZEr   r!  r"  STRIDEr  STORAGE_OFFSETr$  r  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r*   r/  r`  rQ   )
r   r  r3  r>  r  rm  r1  r  r  r2  s
   `         r   r  z"SubgraphTracer._lift_basic_symbols6  s    !B	 B	S%,&'B	V$B	 B	 	B	 B	 B	 B	 B	 B	H mU\22 3	!-"4"4"6"677 	 	1'' ? -S.2EqIII!     #u}44%m&:&:&<&<== 	 	DAq++  # 1n6KQOOO!%#     ('!0022 ? -S.2OPPP!     %)999(()?)?)A)A3GGG(()>)>)@)@#FFFF%%*:E<L)MMM(()C)C)E)EsKKK(()B)B)D)DcJJJJ%%*:E<L)MMM(()C)C)E)EsKKK(()B)B)D)DcJJJ,];; *==??
s!  D%mT::G,,#/C!6!6!6t   	  
 u|44 	##    	 	r   rm  c                    |j         j        j        }t          |          dk    rg S g }|D ]}|| j        vr|                    |           !| j        |         }t          |t                    r |            }|| j        |<   t          |t          j	        j
                  r	|j        | u sJ d| d            t          |d           S )Nr   zThe proxy of symbol z" doesn't belong to current tracer.c                     | j         S r   )r  )rm  s    r   r  z7SubgraphTracer.lookup_unbound_symbols.<locals>.<lambda>  s     r   )r   )r  r3  r!   r  r  r   r?  r  r   r   ru  r)  r@  )r   rm  r!   to_be_boundr:  rx  s         r   r7  z%SubgraphTracer.lookup_unbound_symbols  s    v{/|!!I 	 	B+++""2&&&&r*E%++ /)."2&eUX^44 9M9M9MMrMMM :N9M9M9M k'7'78888r   c                    | j         }g g }| j        j        D ]d}|j        dk    rW|j        d         }t          |t          j                  r/|                    |j	                                       |           d d t          t          ||                    D             }|r#fd|D             }d| }t          d|          S t          dd          S )	Nr  r  c                 *    g | ]\  }\  }}||k    |S r   r   )r   r  v1v2s       r   r   z5SubgraphTracer.has_input_mutation.<locals>.<listcomp>  s5     
 
 
8B Rxx	  xxr   c                      g | ]
}|         S r   r   )r   r  input_nodess     r   r   z5SubgraphTracer.has_input_mutation.<locals>.<listcomp>  s    DDD[^DDDr   zInput mutation detected at TFrL  )r  r   rR  rW  r  r?  r   r   r   r  r  zipr   )	r   input_versions_at_beginninginput_versions_at_endr  r  mutated_inputsmutated_nodesr   rJ  s	           @r   has_input_mutationz!SubgraphTracer.has_input_mutation  s   &*&G# "J$ 	 	Dw-'' $	/ :mU\:: -)001GHHH&&t,,,
 
(/1FGG   
 
 
  	+DDDD^DDDM???Cc***E2&&&r   c                    ddl m} ddlm} t	                      | j        j        D ]s}|j        dk    rf ||g          d         }t          |t          j
                  r9 ||          D ]-}|v r"d|          d| }t          d|          c c S ||<   .s t	                      | j                            d	          d         }t          j        |j        d                   D ]}|r| ||g          d         }t          |t                     rJ t          |t          j
                  r9 ||          D ]-}|v r"d
|          d| }t          d|          c c S ||<   .                                                                z  }	t%          |	          dk    rCfd|	D             }
d                    d |
D                       }
d|
 }t          d|          S t          dd          S )Nr   )get_tensor_storages)_collect_fake_inputsr  z*Input-to-input aliasing detected at nodes  and Tr,  rV  z,Output-to-output aliasing detected at nodes c                 0    g | ]}|         |         fS r   r   )r   rm  input_storagesoutput_storagess     r   r   z/SubgraphTracer.has_aliasing.<locals>.<listcomp>  s5       <="OA$67  r   z, c                 "    g | ]\  }}| d | S )rT  r   )r   r  os      r   r   z/SubgraphTracer.has_aliasing.<locals>.<listcomp>  s&     D D DDAqAA D D Dr   z+Input-to-output aliasing detected at nodes FrL  )(torch._dynamo.variables.higher_order_opsrR  torch._higher_order_ops.utilsrS  r   r   rR  rW  r?  r   r   r   r  rK  tree_leavesr   r   r[  r  ro  )r   rR  rS  r  r  storager   	out_nodesout_nodeintersected_storagesaliasedrV  rW  s              @@r   r   zSubgraphTracer.has_aliasing  s   PPPPPPFFFFFF>BffJ$ 	 	Dw-'' 4 4dV < <Q ?mU\:: 7#6#6}#E#E 7 7"n44"s~^eOf"s"smq"s"sC#/c#:#::::::26w//?CvvJ))X)66q9	*9>!+<== 
	< 
	<H 	< 4 4hZ @ @ C%mT:::::mU\:: <#6#6}#E#E < <"o55"zQ`ahQi"z"zpx"z"zC#/c#:#::::::3;00-22447K7K7M7MM#$$q((    AU  G ii D DG D D DEEGIIICc***E2&&&r   )NFNN)NNNrQ  )FN)(r   r   r   r   r   r   r'   r   r   rr   r  r   r   r  r	   r   ru  r  r  r  r   r  r   r  r  r  r   r  r  r   r  r   r4  r5  r7  r   rP  r   r   r   r   s   @r   rr  rr  t  s
         .2*.%)]U ]U#]U )*]U 	]U
  ']U c]]U 
]U ]U ]U ]U ]U ]U~1_ 1 1 1 1C-C57WC	C C C C8 ##'DHN NN N 	N
 N smN C=N #8RWIrx,?#@AN 
N N N N N Nh "#'   	
  sm C= 
     46 6D 6 6 6 66 #'x xx x 	x
 x  x 
x x x xv(X(	y"("	#( ( ( (T7s 7s 7 7 7 7@y5 y5+0EHN1J+Ky5	y5 y5 y5 y5x~"5<#=>~EMfEU~	~ ~ ~ ~D9 9el9K 9 9 9 9*'L ' ' ' ':+'l +' +' +' +' +' +' +' +'r   rr  )r   r  r  r   rA  r  r  r.   rA  rp  r  r   r!  r  collections.abcr   r   r   dataclassesr   r   r0  typesr   typingr	   r
   r   r   r   typing_extensionsr   r   r4  torch._guardsr   torch._loggingtorch.distributeddistributedr  torch.nntorch.utils._pytreer8  r9  rK  r   r   torch._C._dynamor   torch._dynamo.excr   r   r   r   r   r   r   r   torch._library.opaque_objectr   torch._subclasses.fake_tensorr   torch._utils_internalr   torch.export.dynamic_shapesr   r  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*   rL  r,   r-   r   r/   backends.registryr0   r1   bytecode_transformationr2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r  r>   current_scope_idr?   device_interfacer@   rA   rB   rC   rD   rE   r  rF   rG   graph_deduplicationrH   graph_region_trackerrI   rJ   rK   mutation_guardrL   rU  rM   rN   rO   r   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   variables.baserr   variables.builderrs   rt   ru   rv   variables.ctx_managerrw   variables.listsrx   variables.miscry   variables.nn_modulerz   variables.tensorr{   r|   r}   variables.torch_functionr~   variables.user_definedr   torch._dynamo.packager   r[  r    torch.multiprocessing.reductionsr   	getLoggerr   r   rg  getArtifactLoggergraph_tabular_logr  graph_sizes_logr  r  r   r   r  rr  r  rq  r   r   r   r   r   r   r   r   r   r   r   r   r   objectr  r   r&  r3  rB  rD  rT  r|  r  r  r  rw  r  r  r  ry  rr  r   r   r   <module>r     sa   *                     				 



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