o
    ߗi                    @   sf  U d dl Z d dlZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZmZmZmZmZmZmZmZmZmZ d dlmZ d dl Z d dl!Z d dl"m#Z# d dl$m%Z%m&Z& ddl'm(Z(m)Z)mZ*m+Z+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1 dd	l2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z; dd
l<m<Z< ddl=m>Z> ddl)m?Z?m@Z@mAZAmBZB ddlCmDZD ddlEmFZFmGZG ddlHmIZImJZJ ddlKmLZLmMZM ddlNmOZOmPZP ddlQmRZRmSZSmTZTmUZUmVZVmWZWmXZX ddl+mYZYmZZZ ddl[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZb ddlcmdZdmeZemfZf ddlgmhZhmiZi ddljmkZk ddllmmZm ddlnmoZompZpmqZq ddlrmsZsmtZt ddlumvZvmwZwmxZxmyZymzZz ddl{m|Z| ddl}m~Z~ ddlmZmZmZmZmZ ddlmZmZmZmZmZ dd lmZmZ dd!lmZmZmZ dd"lmZmZ dd#lmZmZmZ eeZe jed$Ze jed%Ze jed&Ze jed'Ze Zd(d) e D Zeeef ed*< ekejjZekejjZd+d, ed-< d.d, ed/< d0ZejG d1d2 d2ZejG d3d4 d4ZejG d5d6 d6ZejG d7d8 d8ZG d9d: d:Zedd;d< ZejG d=d> d>ZG d?d@ d@eZdAejdBef fdCdDZdEdFdGejegef dHefdIdJZdKZd`dMdNZdGejegef dHefdOdPZdQdR ZG dSdT dTeZG dUdF dFedVZG dWdX dXeÃZejdYkrdZd[ ejD ZG d\d] d]eÃZG d^d_ d_eȃZdS )a    N)
AnyCallablecastDictListOptionalSetTupleTypeUnion)patch)TensorifyScalarRestartAnalysis)tracingTracingContext   )configexcloggingtrace_rules	variables)get_indexofJUMP_OPNAMESlivevars_analysispropagate_line_nums)	cleaned_instructionscreate_call_functioncreate_instructioncreate_jump_absolutecreate_swapget_code_keysInstructionis_generator	unique_id)code_context)	PyCodegen)ArgsMismatchErrorBackendCompilerFailedunimplementedUnsupported)get_funcname)GuardBuilderinstall_guard)GraphCompileReasonOutputGraph)DummyModuleExecutionRecorder)ContinueExecutionCacheReenterWith)
AttrSourceGetItemSourceGlobalSourceGlobalWeakRefSourceLocalCellSourceLocalSourceSource)is_builtin_constantis_forbidden)countersget_fake_valueget_instruction_source_311graph_break_dup_warning_checkeristype
LazyStringproxy_args_kwargs)typestrValueMutationNewVariableTracker)FrameStateSizeEntrywrap_fx_proxy)BuiltinVariable)ConstantVariable)ContextWrappingVariableGenericContextWrappingVariableWithExitFunctionVariable)ConstDictVariableSetVariable)BaseUserFunctionVariableNestedUserFunctionVariableSkipFunctionVariableUserFunctionVariableUserMethodVariable)MAX_ITERATOR_LIMIT)LazyVariableTracker)BaseListVariableListIteratorVariableListVariableSliceVariableTupleVariable)CellVariableGetAttrVariableNullVariablePythonModuleVariableUnknownVariable)NNModuleVariableUnspecializedNNModuleVariable)supported_comparison_opsSymNodeVariableTensorVariable)SymbolicTorchFunctionStateTorchFunctionModeVariable)RemovableHandleVariableUserDefinedClassVariableUserDefinedObjectVariablegraph_breaks
trace_calltrace_sourcetrace_bytecodec                 C   s   i | ]
\}}|t |jqS  )rG   call_function.0kvrm   rm   \/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/torch/_dynamo/symbolic_convert.py
<dictcomp>   s    rt   compare_op_handlersc                 C   s   t | g t|i S N)handle_containsreversedtxargs_rm   rm   rs   <lambda>   s    r}   inc                 C   s   t | t| g t|i gi S rv   )
handle_notrw   rx   ry   rm   rm   rs   r}      s    znot inzihttps://github.com/pytorch/pytorch/issues/new?&labels=oncall%3A+pt2&projects=&template=pt2-bug-report.ymlc                   @   sR   e Zd ZU eed< eed< eed< eed< dZeed< dZ	e
e ed< d	d
 ZdS )SpeculationEntryfilenamelinenoinstruction_pointerinstFfailedNreasonc                 C   s*   d| _ | jdur| jj}nd}tj|d)z\
        Start tracing of the current frame over again, and don't take this branch.
        TNz!Unknown fail_and_restart_analysis)restart_reason)r   r   r   SpeculationRestartAnalysis)selfr   rm   rm   rs   fail_and_restart_analysis   s
   

z*SpeculationEntry.fail_and_restart_analysis)__name__
__module____qualname__str__annotations__intr    r   boolr   r   r,   r   rm   rm   rm   rs   r      s   
 r   c                   @   s\   e Zd ZU dZejedZee	 e
d< dZee
d< dd Zdd	 Zd
edede	fddZdS )SpeculationLoga3  
    SpeculationLog replaces the prior copy_graphstate/restore_graphstate
    checkpointing.  Rather than saving/restoring state, we restart the
    dynamo conversion process over from the beginning -- but when we
    hit the start of the speculation that failed, we instead generate
    a graph break.
    default_factoryentriesr   indexc                 C   s
   d| _ d S Nr   )r   r   rm   rm   rs   restart      
zSpeculationLog.restartc                 C   s   | j   d| _d S r   )r   clearr   r   rm   rm   rs   r      s   

zSpeculationLog.clearr   r   returnc                 C   s  t | j| jkr| jt|||| | j| j }d}| jdkr<| j| jd  }d|j d|j d|jj d|j	 d	}|j	|krK|j|krK|j|ks{J d	| j d
t | j d|j d|j d|jj d|j	 d| d| d|j d| d| d|  jd7  _|S )z
        Lookup or create a SpeculationEntry() that is shared across
        RestartAnalysis calls.  Args are used only for debug checks.
         r   r   zPrevious instruction: :(z @ z)
z"
SpeculationLog diverged at index z
 (log had z entries):
- Expected:  (z at ip=z)
- Actual: a  
There are two usual reasons why this may have occured:
- When Dynamo analysis restarted, the second run took a different path than
  the first.  If this occurred, the previous instruction is the critical instruction that
  behaved differently.
- Speculation entries are only added under certain conditions (as seen in
  step()), e.g., there must exist operators in the graph; those conditions may
  have changed on restart.

If this divergence was intentional, clear the speculation log before restarting (do NOT
do this for graph breaks, you will infinite loop).

Otherwise, please submit a bug report, ideally including the contents of TORCH_LOGS=+dynamo
)
lenr   r   appendr   r   r   r   opnamer   )r   r   r   r   r   entryprev_entry_msg
prev_entryrm   rm   rs   next   sV   


zSpeculationLog.nextN)r   r   r   __doc__dataclassesfieldlistr   r   r   r   r   r   r   r   r   r   rm   rm   rm   rs   r      s   
 r   c                   @   s8   e Zd ZU ejedZeee	f e
d< defddZdS )
LocalStater   automatic_dynamicr   c                 C   s   d dd | j D S )N
c                 s   s&    | ]\}}| d |   V  qdS ): N)renderro   rm   rm   rs   	<genexpr>   s    
z$LocalState.render.<locals>.<genexpr>)joinr   itemsr   rm   rm   rs   r      s   
zLocalState.renderN)r   r   r   r   r   dictr   r   r   rE   r   r   rm   rm   rm   rs   r      s
   
 r   c                   @   s2   e Zd ZU eed< eed< dZeee  ed< dS )DistributedState
compile_pglocal_stateN
all_states)	r   r   r   r   r   r   r   r   r   rm   rm   rm   rs   r      s   
 r   c                   @   sZ   e Zd ZU e Zee ed< ededdfddZ	edede
fddZedd	d
ZdS )TensorifyStateforce_specializationsr   r   Nc                 C   s   | j | d S rv   )r   addclsr   rm   rm   rs   
specialize   s   zTensorifyState.specializec                 C   s
   || j v S rv   )r   r   rm   rm   rs   should_specialize     
z TensorifyState.should_specializec                 C      | j   d S rv   )r   r   r   rm   rm   rs   r        zTensorifyState.clearr   N)r   r   r   setr   r   r8   r   classmethodr   r   r   r   rm   rm   rm   rs   r      s   
 r   c                   C   s
   t tS rv   )torchdynamo_loggingget_step_loggerlogrm   rm   rm   rs   _step_logger  r   r   c                   @   s^   e Zd ZU eed< eed< dZee ed< dZee	e
ef  ed< dd Zdd	 Zd
d ZdS )BlockStackEntryr   targetNstack_indexwith_contextc                 C   s
   | j d uS rv   )r   r   rm   rm   rs   can_restore  r   zBlockStackEntry.can_restorec                 C   sF   | j d usJ | jrt| jdr| jjrt| j t| jjS t| j S )Ntarget_values)r   r   hasattrr   r1   tupler   rm   rm   rs   	resume_fn  s   

zBlockStackEntry.resume_fnc                 C   s0   | j d usJ |r| j  s|s| j |S d S rv   )r   exit_on_graph_breakexit)r   rz   is_graph_breakrm   rm   rs   r   (  s   zBlockStackEntry.exit)r   r   r   r    r   r   r   r   r   r   rI   rJ   r   r   r   rm   rm   rm   rs   r     s   
 
r   c                   @   s   e Zd ZdS )ReturnValueOpN)r   r   r   rm   rm   rm   rs   r   0  s    r   fn.c                    s>   t t| jt|  t| dddtf fdd}|S )Nr   InstructionTranslatorr   c                    s   |   | | i  d S rv   )pushrn   popnr   r   fn_varnargsrm   rs   impl8  s   zstack_op.<locals>.impl)r   inspect	signature
parametersrG   	functoolswrapsr    )r   r   rm   r   rs   stack_op4  s
   r   r   InstructionTranslatorBasetruth_fnr   c                 C   s   |t jus|r	dS t| jtsJ | j}| j| }tjdk r+|jdks(|j	dkr*dS n|jdkr2dS |d7 }d}| j| }|jdkrot|j	t
sJdS |j	}|d7 }| j| }|jd	vr]dS |d7 }|jd
krj|d7 }| j| }|jdkrvdS | t| dS )NF)   	   LOAD_GLOBALAssertionErrorLOAD_ASSERTION_ERRORr   zassertion error
LOAD_CONST)CALL_FUNCTIONPRECALLCALLr   RAISE_VARARGST)operatortruth
isinstancer   r   instructionssysversion_infor   argvalr   r   rH   create)r   r   r   current_instruction_pointerr   	error_msgrm   rm   rs   &_detect_and_normalize_assert_statement?  s<   









r   Fr   c                    s   |d u r
t jj }z|d j|d jf}W n ty'   | d | d f}Y nw dt	|}d|d |d ||f t j
jdd	d
  fdd
d ttjr`ts`t|r`t d S td|d |d | d S )Nco_filenameco_firstlinenor   zDGraph break in user code at %s:%s
Reason: %s
User code traceback:
%sr   r   artifactc                   S   s
   dddS )Ndynamo_graph_break_reasonstring)nameencodingrm   rm   rm   rm   rs   r}     s   z!log_graph_break.<locals>.<lambda>c                      s    d rt   S d S )Nr   r   )	traceback
format_excrm   exc_infouser_stack_tracerm   rs   r}     s    )metadata_fn
payload_fnzAGraph break (details suppressed) in user code at %s:%s
Reason: %s)torch_guardsr   extract_stackr   r   
IndexErrorr   r  format_list_loggingtrace_structuredgraph_break_logisEnabledForr   DEBUGexplainr>   r   debug)code_optionsr   r	  
user_stack	frame_locuser_stack_formattedrm   r  rs   log_graph_break  sL   	
r  c                    s,   d	fdd	 dddt f fdd}|S )
Nr   c                    s   t | jdd |  std |  r$d|   }t| t	|| 
| td | jj| tdt| | |  gd |   | | j} rT| 
| | |j}tjdkrh| jtdg | jt|j|d	 d
g| |  d S )NzData-dependent jumpr   "should_compile_partial_graph=FalseBSkipping frame because there is a graph break in a for/while loop
zgeneric_jump triggered compilezgeneric_jump r      TO_BOOLr   )r   )r  r  should_compile_partial_graphr'   maybe_has_backedgeframe_summaryr   infor   	SkipFramer   r  outputcompile_subgraphr,   rB   popcreate_call_resume_atnext_instructionr   r   r   add_output_instructionsr   r   )r   r   value	extra_msgmsgif_nextif_jumpr   rm   rs   jump_graph_break  s8   





z&generic_jump.<locals>.jump_graph_breakr   r   r   c                    s  |   }tjrt| r|   }| r&t| r | |S  | || t|t	rC| j
jdtjgt||fi R   | | d S t|trj|j}t|tjsU|dk}tjjj|}|sctd | | d S | j
jdtjgt|fi R  }t| |t|j| d}| j
jdtjgt||fi R   | | d S | r| rr| | | | d S d S t|t	r|  rȈ | || d S t|tr| j
|j}|rr| | | | d S d S t|t r|j!}|rr| | | | d S d S t|t"rz|#| d}	W n+ t$j%y?   t$&|  z|#| d}	W n t$j%y<   t$&|  d }	Y nw Y nw t|	t'r|	(| g i }t|t)rst|j!tt*frs|j!rqrj| | | | d S d S t|tr|+ rr| | | | d S d S td d S drr| | | | d S d S t|t	s|,| r҈t-|.| rЈr| | | | d S d S t|trz|+| j
}
W n% t$j/y } z|  r  | ||d	| d
W  Y d }~S  d }~ww |
rr| | | | d S d S t|t0j1r9dr7r0| | | | d S d S ddl2m3} |j2d urc||j2rc|4 rarZ| | | | d S d S t$j/t$j5j6ddd)Nrn   r   zKAssertion failed on symbolic shapes. Did you make sure eager mode succeeds?)example_value__bool____len__z@generic_jump on UserDefined with __bool__ returning non-constantTr   )r0  r   )is_constant_sourcezDynamic control flow is not supported at the moment. Please use functorch.experimental.control_flow.cond to explicitly capture the control flow.cond_operands)	case_name)7r+  r    rewrite_assert_with_torch_assertr   is_python_constantr   as_python_constantjumpr   rc   r)  create_proxyr  _assert_asyncrA   rb   sym_numSymBoolfxexperimentalsymbolic_shapesexpect_truer'   scalar_tensorrF   r<   noder   r$  r_   get_submodule
module_keyr`   r/  rh   var_getattrr   ObservedAttributeErrorhandle_observed_exceptionrR   rn   rH   r   evaluate_exprhas_unpack_var_sequencer   unpack_var_sequence	UserErrorr   BackwardHookVariablesourcer9  get_real_valueUserErrorTypeDYNAMIC_CONTROL_FLOW)r   r   r/  r   sym_exprresultscalar_to_tensor_proxyscalar_to_tensormodxeval_resulter9  r5  r   r   rm   rs   inner  s,  
























"




zgeneric_jump.<locals>.inner)r   )r    )r   r   ra  rm   r`  rs   generic_jump  s   $ !rb  c                    s    fdd}|S )Nc                    s@   t dddtf fdd}dddtdtffdd |S )	Nr   r   r   c              
      s  |   }|jr|jd usJ  | ||jS z| |W S  tyz } zS| jdkr0|  td t|tj	r7 | 
 s< t| jdd| |jd |  r_d|   }t| t|||  |d t|j|j|_W Y d }~nd }~ww |  d S )Nr   z0Graph break under GenericContextWrappingVariableTzUnsupported: )r	  r   r  r   graph_break)	speculater   r   r(   generic_context_manager_depthremove_from_statsr'   r   r   UncapturedHigherOrderOpErrorr$  r  r  
real_stackr%  r&  r   r'  r(  add_to_statsr,   r1  r   )r   r   speculationexcpr1  handle_graph_breakinner_fnrm   rs   wrapper  sB   


z>break_graph_if_unsupported.<locals>.decorator.<locals>.wrapperr   c           
         s  | j j| |d t| }g }| jD ]6}t|jtr&|| 	|j
| q|jd us-J t|jts5J |j| || |j
| q| j |  ~tjdkr|jdkr| jd ure| j nd}t|dkrtjdk stJ | j td|dg | j t|jd	 n|jd u sJ t|}d |_| j |g | j | tjdkrtjd
k r|jdkrttjd |jttjd |j }nt|j|j}|   |  t! D ]}	| "t#  q| j | $| j% d S )Nr  r      r   rm   r   r!  KW_NAMESr   Fr      r   )&r)  r*  r$   block_stackr   r   re   extend_outputr   try_except_torch_function_moder  rI   reconstruct_typetry_finallyr.  get_instructionsr   r   r   kw_namesr>  r   r   r   argr   copyexn_tab_entrydisstack_effectopmapopcoder   ranger   r^   r,  r-  )
r   r   r   cgcleanupbr|  	inst_copyr  r|   r4  rm   rs   rm    sd   








zIbreak_graph_if_unsupported.<locals>.decorator.<locals>.handle_graph_break)r   r   r    r,   )rn  ro  r4  rl  rs   	decorator  s   (Ez-break_graph_if_unsupported.<locals>.decoratorrm   )r   r  rm   r4  rs   break_graph_if_unsupported  s   qr  c                       s"   e Zd ZdZd fddZ  ZS )BytecodeDistpatchTableMetazTInstalls a `cls.dispatch_table` on every subclass to speed up calls to self.OPCODE()r   Nc                    sN   t  ||| dd   fddtj D fddtdD _d S )Nc                 W   s   t d|   d S )Nz	missing: r'   )r   r{   rm   rm   rs   _missing     z5BytecodeDistpatchTableMeta.__init__.<locals>._missingc              
      s&   i | ]\}}|t |t |qS rm   )getattrr   partial)rp   r   op)r  r   rm   rs   rt     s    z7BytecodeDistpatchTableMeta.__init__.<locals>.<dictcomp>c                       g | ]}  |qS rm   )getrp   i)dispatch_tablerm   rs   
<listcomp>      z7BytecodeDistpatchTableMeta.__init__.<locals>.<listcomp>   )super__init__r  r  r   r  r  )r   r  basesdct	__class__)r  r   r  rs   r    s   z#BytecodeDistpatchTableMeta.__init__r   )r   r   r   r   r  __classcell__rm   rm   r  rs   r    s    r  c                !       s	  e Zd ZU eed< eeef ed< eeef ed< eed< e	e ed< e
e ed< eed< e	e ed< eed	< e
e ed
< eed< e	e ed< eed< eed< e
e ed< e	e ed< e	e ed< e
e ed< e
eegef  ed< dd Zdd Zdd Zdd Zdd Zdd Zd ed!e	e d"eeef fd#d$Zd%d& Zdbd(d)Zd*d+ Zd,d- Zd.d/ Ze j!d0krd1d2 Z"nd3d2 Z"e#d4d5 Z$d6d7 Z%d8d9 Z&d:d; Z'd<e
e fd=d>Z(d?e	e fd@dAZ)dBefdCdDZ*dEedBe	e fdFdGZ+dHdI Z,dJdK Z-dLdM Z.dNdO Z/dPdQ Z0e,Z1dRdS Z2dTdU Z3dVdW Z4e5j6dXdY Z7dZd[ Z8d\d] Z9d^d_ Z:d`da Z;dbdc Z<ddde Z=dfdg Z>dhdi Z?djdk Z@dldm ZAeAZBeAZCeDeEjFdnZGeDeEjHdnZIeDeEjFdoZJeDeEjHdoZKdpdq ZLdrds ZMdtdu ZNdvdw ZOdxdy ZPdzd{ ZQd|d} ZRd~d ZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd Zadd Zbecdddd Zdecdddd Zeecdddd Zfdd Zgdd Zhdd Zidd Zjdd Zkdd Zldd Zmdd Zndd Zodd ZpdBefddZqecdddd Zrdd Zsdd ZtddĄ ZuddƄ ZvddȄ ZwexfddʄZydd̄ ZzezZ{dd΄ Z|ddЄ Z}e}Z~dd҄ ZddԄ Zddք Zdd؄ Zddڄ Zdd܄ Zddބ Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  ZeZdd Zdd Zdd Zdd Zd	d
 Zdd ZeeEjZeeEjZeeEjFZeeEjZeeEjZeeEjZeeEjZeeEjZeeEjZeeEjZeeEjZeeEjZeeEjZecddeeEjZeeEjZeeEjZeeEjZeeEjZeeEjZeeEjÃZeeEjŃZeeEjǃZeeEjɃZeeEj˃ZeeEj̓ZeeEj̓ZeeEjЃZeeEj҃ZeeEjԃZeeEjփZeeEj؃ZeeEjڃZeeEj܃Zݐdd Ze j!d0kr~dd Zߐdd Zdd Zdd ZdcddZecdddd Zdd Zdd ZeAZeAZeDeEjHdnZeDeEjHdnZeDeEjFdnZeDeEjFdnZdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zecddd9d: Zd;d< Zd=d> Zd?d@ ZdAdB ZdCdD ZdEdF Z dbdGdHZdIdJ ZdKdL ZdMdN Ze#dOdP ZejdQeegef fdRdSZdBefdTdUZ		'dbdedVe	e dWeeef dXeeef dYeeef dZeeef deeef deeef ded[e
jd\eded]ed^e
e d_e
ee
j  dBd'f  fd`daZ  ZS (d  r   r)  symbolic_localssymbolic_globalssymbolic_torch_function_statestackr   current_instructionrv  r   r|  accept_prefix_instprefix_instsinline_depthinconsistent_side_effectscurrent_speculationr  exn_vt_stackexec_recorderstrict_checks_fnc                 C   s
   d| _ dS )z
        InstructionTranslator has encountered instructions which may cause
        dynamo to see a different version of history from eager
        See: https://github.com/pytorch/pytorch/issues/110765
        TN)r  r   rm   rm   rs   mark_inconsistent_side_effects&  s   
z8InstructionTranslatorBase.mark_inconsistent_side_effectsc                 C   s^   | j j}| jd usJ | j| jd  D ]}|jdv r dS |jtv r,|j}||k r, dS qdS )N)RETURN_VALUERETURN_CONSTFT)r  offsetr   r   r   r   r   )r   
cur_offsetr   jump_offsetrm   rm   rs   r%  .  s   

z,InstructionTranslatorBase.maybe_has_backedgec                 C   B   t | dst| jd pg | _t| tr|  j| j 7  _| jS )N	_cellvarsco_cellvars)r   r   r  r  r   InliningInstructionTranslatorparentcellvarsr   rm   rm   rs   r  M  
   

z"InstructionTranslatorBase.cellvarsc                 C   r  )N	_freevarsco_freevars)r   r   r  r  r   r  r  freevarsr   rm   rm   rs   r  V  r  z"InstructionTranslatorBase.freevarsc                 C   s"   t | ds|  |   | _| jS )N_cell_and_freevars)r   r  r  r  r   rm   rm   rs   cell_and_freevars_  s   
z+InstructionTranslatorBase.cell_and_freevarsc                    s:   t | j| j  fdd| j D | _| jj|  d S )Nc                    s   i | ]\}}| v r||qS rm   rm   ro   readsrm   rs   rt   g  s    z?InstructionTranslatorBase.prune_dead_locals.<locals>.<dictcomp>)r   r   r  r  r   r)  side_effectsprune_dead_object_newr   rm   r  rs   prune_dead_localsd  s
   
z+InstructionTranslatorBase.prune_dead_localsr   r{   kwargsc                 C   s   t |tsJ t |tsJ t |tsJ tdd t|| D s&J d }t|dr0|j	}t|dr8|j
}|rIt|rIt|rItd| | || || d S )Nc                 s   s    | ]}t |tV  qd S rv   )r   rD   rp   r]  rm   rm   rs   r   v  s
    
z:InstructionTranslatorBase.call_function.<locals>.<genexpr>r/  r   z$Attempt to trace forbidden callable )r   rD   r   r   all	itertoolschainvaluesr   r/  r   callabler:   r   r   rn   )r   r   r{   r  rn  rm   rm   rs   rn   m  s   

z'InstructionTranslatorBase.call_functionc                 C   s   t | |||S )zF
        A call to some user defined function by inlining it.
        )r  inline_call)r   r   r{   r  rm   rm   rs   inline_user_function_return  s   z5InstructionTranslatorBase.inline_user_function_returnNc                 C   st   |d u r| j }| jdkrd| j dnd}t| jj|}|d u r"dnd| d}| jj d| d| jj | | S )Nr   z (inline depth: )r   r   r   z in )r   r  r)   f_coder   co_name)r   r   inline_depth_strfuncnamefuncname_strrm   rm   rs   get_line_of_code_header  s   $z1InstructionTranslatorBase.get_line_of_code_headerc                 C   s8   d|    d}t| jj| j }|d| 7 }|S )NzTRACE starts_line r   z    )r  	linecachegetliner  r   r   rstrip)r   log_strlinerm   rm   rs   get_log_starts_line_log_str  s   z5InstructionTranslatorBase.get_log_starts_line_log_strc                 C   sh   | j |krd S || _ t| jj|| jj ddlm} || jj t	t
jr2tdt| j d S d S )Nr   )	dump_file%s)r   r   set_current_locr  r   r  torch._logging.structuredr  trace_source_logr  r   r  r  r@   r  )r   r   r  rm   rm   rs   starts_line  s   
z%InstructionTranslatorBase.starts_linec              
   C   sP  | j }|du r	dS | j|  | _}|d | _ |jr| |j | js8|  r8|  r8|  | _| jj	r8| 
|S ttjrItd|j|j| j | | z| j|j | | | jj W S  tye     tjy} } z| | W Y d}~dS d}~w ty   Y dS  ty   | jdu rtd  tjddd Y nw | j  dS )	z<Process exactly one instruction, return False we should exitNFr   zTRACE %s %s %sTzempty checkpointzstep triggered compiler	  )r   r   r  r  r  r$  is_non_empty_graphrd  r  r   step_graph_breaktrace_bytecode_logr  r   r  r  r   r   update_block_stackr  r  r)  should_exitr   r   ObservedExceptionexception_handlerr   r(   r   r   )r   ipr   r_  rm   rm   rs   step  sN   






zInstructionTranslatorBase.steprp  c                 C   s   |j }|r+t| jdkr%|j| jd jur'|j| jd ju r)| j  d S d S d S d S | jrC|jdvrEt| jdks<J | j  d S d S d S )N   r   )NOPJUMP_BACKWARDr   )r  r   rv  r   r+  r   )r   r   r   rm   rm   rs   r    s   	z,InstructionTranslatorBase.update_block_stackc                 C      d S rv   rm   r   rm   rm   rs   r       c                 C   s   | j | j S rv   )r   r   r   rm   rm   rs   r-    s   z*InstructionTranslatorBase.next_instructionc                 C   sT   | j jrJ | jd usJ | j j| dtd|  gd | j t|g| j  d S )NTstep_unsupported)partial_convertr   )	r)  output_instructionsr  r*  r,   r&  r.  r   r   )r   continue_instrm   rm   rs   r    s   z*InstructionTranslatorBase.step_graph_breakc                 C   s
   t d S rv   )r   current_framer   rm   rm   rs   run_ctx_mgr  s   
z%InstructionTranslatorBase.run_ctx_mgrc                 C   s   |   b zGz| j|  |  r	 |  sW n$ ty     ty&     ty; } z
| jr6| j |_	 d }~ww W | j
  t| trL| j  n| j
  t| tr]| j  w w W d    d S 1 siw   Y  d S rv   )r  r)  push_txr  r   r&   	Exceptionr  
get_recordexec_recordpop_txr   r   r  )r   r_  rm   rm   rs   run  s8   





"zInstructionTranslatorBase.runvalc                 C   s4   |d u st |tsJ dt| | j| d S )Nz"push expects VariableTracker, got )r   rD   rB   r  r   )r   r  rm   rm   rs   r   0  s   
zInstructionTranslatorBase.pushvalsc                 C   s   |D ]}|  | qd S rv   r4  )r   r  r  rm   rm   rs   	push_many6  s   z#InstructionTranslatorBase.push_manyr   c                 C   s
   | j  S rv   )r  r+  r   rm   rm   rs   r+  :  r   zInstructionTranslatorBase.popnc                    s   g t  fddt|D S )Nc                    s   g | ]}   qS rm   r+  )rp   r|   r   rm   rs   r  >      z2InstructionTranslatorBase.popn.<locals>.<listcomp>)rx   r  )r   r   rm   r   rs   r   =  s   zInstructionTranslatorBase.popnc                 C   s   |j }| jr|| jv r| j|| j|  z| | j|   W n0 tyQ   |drKz|	dd}| | j|  W n tyJ   t
d Y nw t
d Y nw |dr_| j| d S d S )N.implicitzundefined LOAD_FAST (implicit)zundefined LOAD_FAST___stack)r   r  f_localsadd_local_varr   r  unwrapKeyError
startswithreplacer'   r+  )r   r   r  new_namerm   rm   rs   	LOAD_FAST@  s&   

z#InstructionTranslatorBase.LOAD_FASTc                 C   sl   |j |  v s	J | j|j  }| jj|}| | | jr2|j | jv r4| j	|j | j|j   d S d S d S rv   )
r   r  r  r)  r  	load_cellr   r  r  r  )r   r   cellcontents_varrm   rm   rs   
LOAD_DEREFV  s   
z$InstructionTranslatorBase.LOAD_DEREFc                 C   s&   |j }|  }|| || j|< d S rv   )r   r+  set_name_hintr  )r   r   r  	loaded_vtrm   rm   rs   
STORE_FAST_  s   
z$InstructionTranslatorBase.STORE_FASTc                 C   s   | j |j= d S rv   )r  r   r   rm   rm   rs   DELETE_FASTe     z%InstructionTranslatorBase.DELETE_FASTc                 C   sb   |j |  v s	J | j|j  }|  }| jj|| t|ts"J |j	d ur/|
|j	 d S d S rv   )r   r  r  r+  r)  r  
store_cellr   rZ   
local_namer  )r   r   r  r  rm   rm   rs   STORE_DEREFh  s   
z%InstructionTranslatorBase.STORE_DEREFc                 C   sF   |j }|d u rtj|jdS | j| }|s!tj|jd | j|< }|S )Nr/  )r}  rH   r   r   _constants_cache)r   r   r  r  rm   rm   rs   _load_constt  s   
z%InstructionTranslatorBase._load_constc                 C   s   |  | | d S rv   )r   r  r   rm   rm   rs   r   }     z$InstructionTranslatorBase.LOAD_CONSTc                 C   s   |j }| jr&|| jv r| j|| j|  n|| jv sJ | j| | jj|< || jv rA| jj| j|  }| 	| jj
|| d S z| j| }W n tyV   | | Y S w | 	t| |t| d S rv   )r   r  	f_globalsadd_global_var
f_builtinsbuiltinsr  r)  r  r   load_globalr	  load_builtinrD   buildr4   )r   r   r  variabler/  rm   rm   rs   _load_global  s    

z&InstructionTranslatorBase._load_globalc                 C   s&   d}|  |}t|}t| ||S )Nztorch.nn.modules.module)import_source	importlibimport_modulerD   r$  )r   module_namemodule_sourcefglobals_valuerm   rm   rs   nn_modules_globals_vt  s   

z/InstructionTranslatorBase.nn_modules_globals_vtc                 C   s\   t jdkrt jdk r|jd r| | | | t jdkr*|jd r,| | d S d S d S )Nrp  r!  r  )r   r   r}  	PUSH_NULLr&  r   rm   rm   rs   r     s   

z%InstructionTranslatorBase.LOAD_GLOBALc                 C   sj   |   }|j}t|}|| jvrt | j|< | jj|| j| }t|t	r*t
d | jj||| d S Nz Storing handles in globals - NYI)r+  r   r4   r  objectr)  r  track_global_existingr   rf   r'   store_global)r   r   r/  r  rT  r%  rm   rm   rs   STORE_GLOBAL  s   


z&InstructionTranslatorBase.STORE_GLOBALc                 C   s   d|v rt jjj| }|dddddd}nt|}d|dd }| jj}||vs8|| |u s8J |||< | j	| t
|S )z-Create an alias to a module for use in guardstorch_package>r|   <r  _dot_	__import_)r  packagepackage_importer_package_imported_modulesr  r(  r)  r)  global_scopeupdate_co_namesr4   )r   r*  r/  aliasr  rm   rm   rs   r'    s   
z'InstructionTranslatorBase.import_sourcec                 C   sB   | d|d }t||k rtd|d }|r| d| S |S )z
        Copied from the Cpython implementation of __import__
        Resolve a relative module name to an absolute one.
        https://github.com/python/cpython/blob/5a094f0255eea1db58fb2cf14c200971e64ec36e/Lib/importlib/_bootstrap.py#L902
        r  r   z2attempted relative import beyond top-level packager   )rsplitr   ImportError)r   r  r9  levelbitsbaserm   rm   rs   resolve_name  s
   z&InstructionTranslatorBase.resolve_namec                 C   s   | j d}| j d}|dur%|dur#||jkr#tjd||jdd |S |dur,|jS tjddd | j d }d	| j vrD|d
d }|S )z
        Copied from the Cpython implementation of __import__
        https://github.com/python/cpython/blob/5a094f0255eea1db58fb2cf14c200971e64ec36e/Lib/importlib/_bootstrap.py#L1090
        __package____spec__Nz)__package__ != __spec__.parent (%r != %r)r   )
stacklevelzYcan't resolve package from __spec__ or __package__, falling back on __name__ and __path__r   __path__r  r   )r  r  r  r   warning
rpartition)r   r9  specrm   rm   rs   calc_package  s*   

z&InstructionTranslatorBase.calc_packagec           
      C   s&  |  d\}}| }| }|j}tj d| d| d| }|| jv r/| j| }t|}n<zt|||| jd}W n tyG   t	d Y nw |dkrW| 
 }| |||}|sf|dd }	| |	}n| |}| jru| j|| t|tjtfr| t||d d S t	dt|  d S )	Nr  r|   )fromlistrA  globalsz#import a module that does not existr   r  rT  zIMPORT_NAME )r   r>  r   r/   LOCAL_MOD_PREFIXr  r4   
__import__r@  r'   rL  rD  	partitionr'  r  add_local_modr?   types
ModuleTyper.   r   r]   rB   )
r   r   rA  rM  r*  recorded_namer/  rT  pkgtop_level_module_namerm   rm   rs   IMPORT_NAME  s>   




z%InstructionTranslatorBase.IMPORT_NAMEc                 C   s   |  | | | d S rv   )DUP_TOP
_load_attrr   rm   rm   rs   IMPORT_FROM     
z%InstructionTranslatorBase.IMPORT_FROMc                 C   s|   || j vrtd| d| j | }t|r-t| jj}t||}| t	| || d S t
|s3J | tj|d d S )Nzname 'z' is not definedr  )r   	NameErrorr  r4   r)  %name_of_builtins_dict_key_in_fglobalsr3   r   rD   r$  r9   rH   r   )r   r   r  builtins_source
var_sourcerm   rm   rs   load_builtin_from_argval  s   


z2InstructionTranslatorBase.load_builtin_from_argvalc                 C   s   |  |j d S rv   )rb  r   r   rm   rm   rs   r#  .     z&InstructionTranslatorBase.load_builtinc                 C   s   | j |j | _d S rv   )indexofr   r   r   rm   rm   rs   r?  1  r  zInstructionTranslatorBase.jumpFTc                 C      | j t||j d S rv   rv  r   r   r   r   rm   rm   rs   
SETUP_LOOP<     z$InstructionTranslatorBase.SETUP_LOOPc                 C   re  rv   rf  r   rm   rm   rs   SETUP_EXCEPT@  rh  z&InstructionTranslatorBase.SETUP_EXCEPTc                 C   r   rv   )rv  r+  r   rm   rm   rs   	POP_BLOCKD  r  z#InstructionTranslatorBase.POP_BLOCKc                 C      |  | d S rv   setup_or_before_withr   rm   rm   rs   
SETUP_WITHG  r  z$InstructionTranslatorBase.SETUP_WITHc                 C   re  rv   rf  r   rm   rm   rs   SETUP_FINALLYJ     z'InstructionTranslatorBase.SETUP_FINALLYc                 C   s   |  d  d S rv   r4  r   rm   rm   rs   BEGIN_FINALLYM  r  z'InstructionTranslatorBase.BEGIN_FINALLYc                 C   sH   |  d\}}|d u sJ | | | || td gd i  d S )Nr  r   )r   r   rn   rH   r   )r   r   r   r   rm   rm   rs   WITH_CLEANUP_STARTP  s   
$z,InstructionTranslatorBase.WITH_CLEANUP_STARTc                 C   s   |  d | d  d S )Nr  )r   r   r   rm   rm   rs   WITH_CLEANUP_FINISHV  r]  z-InstructionTranslatorBase.WITH_CLEANUP_FINISHc                 C   s*   | j | j }| t| | | dS )z|
        pushes the address of the next instruction onto the stack and increments
        bytecode counter by delta
        N)rd  r-  r   rH   r   r?  )r   r   addrrm   rm   rs   CALL_FINALLYZ  s   z&InstructionTranslatorBase.CALL_FINALLYc                 C   s&   |   }t|tr| | _d S 	 d S rv   )r+  r   rH   r>  r   r   r   tosrm   rm   rs   END_FINALLYd  s   
z%InstructionTranslatorBase.END_FINALLYc                 C   s0   |j }|r	|  }|  }|r| | d S d S rv   )r   r+  r   )r   r   preserve_tosrw  r|   rm   rm   rs   POP_FINALLYm  s   z%InstructionTranslatorBase.POP_FINALLYc              
   C   s   |    }z|| }| | | | W d S  ttjfyP } z)t|tjr.t|  t	j
dkr@| | | td  | | W Y d }~d S d }~ww Nrt  )r+  realizenext_variabler   StopIterationr   ObservedUserStopIterationr   rN  r   r   rH   r   r?  )r   r   itr  r_  rm   rm   rs   FOR_ITERv  s   




z"InstructionTranslatorBase.FOR_ITERc                 C   s|   |   }t|tjr|| g i }| j| t|tjr5tj	
|j }r-|d| td| tdt  d S )Nzraised exception zraise )r+  r   r   rG   rn   r  r   ExceptionVariabler   observed_exception_mapr  exc_typer  r'   )r   r   r  observed_exception_typerm   rm   rs   _raise_exception_variable  s   z3InstructionTranslatorBase._raise_exception_variablec                 C   s`   |j dkrtd d S |j dkr| | d S |  }t|tr*|jd u r*| | td d S )Nr   zre-raiser   zraise ... from ...)r}  r'   r  r+  r   rH   r/  )r   r   from_vtrm   rm   rs   r     s   


z'InstructionTranslatorBase.RAISE_VARARGSc                 C   s    t jdkr
| | td d S )Nrp  RERAISE)r   r   r  r'   r   rm   rm   rs   r    s   

z!InstructionTranslatorBase.RERAISEc                 C   s<  t jdkrS| jj}|rBt| j|jkr|   t| j|jks|jr,| 	t
| jj t| js3J | 	| jd  | | d S | j  t| tu rQtd|t| jrt| js`J | jd }| j }|jjdkr| d t| jdkr| j  t| tu rtd|| j }|jjdksp|jjdkrtd|j  td	dd d}| jt|d  t| jd
kr| jd }| 	t
  | 	| | 	t
|j n| 	t
d  | 	t
d  | 	t
d  | 	t
  | 	| | 	t
|j | | d S | j  t| tu rtd|)Nrp  r   zObserved exceptionEXCEPT_HANDLERr   r   ro  zvexception is raised when top of the block stack is not exception handler (e.g. try .. with .. except). Current TOS is g    .Ar  r  )r   r   r  r  r   r  depthr+  lastir   r   rH   r  r  r?  r   typer   r(   rv  r   r   r   r'   r    r   r   r^   rG   r  )r   raised_exceptionr  exception_varblock_stack_entryexcept_handler_instold_exceptionrm   rm   rs   r    sl   










z+InstructionTranslatorBase.exception_handlerc                 C   s4   |   }t| jsJ | | jd  | | d S Nr   )r+  r   r  r   r   r   r  rm   rm   rs   PUSH_EXC_INFO  s   z'InstructionTranslatorBase.PUSH_EXC_INFOc                 C   s   t jdkr|  }t|tjsJ t| jsJ | j  d S t| jdks(J | jd j	j
dkr5td| j  | d t| jsFJ | j  d S )Nrp  r   r   r  zYBug in Dynamo tracing of exception handling.Top of the block stack is not EXCEPT_HANDLER.r   )r   r   r+  r   r   r  r   r  rv  r   r   r   r   r  rm   rm   rs   
POP_EXCEPT  s   


z$InstructionTranslatorBase.POP_EXCEPTc                 C   s   t | jdks	J |  }tjdkr| jd }n| j }t|ttfs+td|  tjdkr=t|t	j
s=td|  t|trF|j}n|g}|D ].}t|tsYtd|  t|t	j
rit|j|jri dS t|t	jryt|j|jry dS qKdS )	Nr  rp  r   z+except has an unsupported types of objects zCexcept expects to recieve an object of exception type but received z*except has an unsupported types of object TF)r   r  r+  r   r   r   rG   rY   r'   r   r  r   
issubclassr  r   )r   expected_exc_typesexc_instanceexpected_typesexpected_typerm   rm   rs   check_if_exc_matches/  sB   




z.InstructionTranslatorBase.check_if_exc_matchesc                 C   s   |  t|   d S rv   )r   r   rH   r  r   rm   rm   rs   CHECK_EXC_MATCHf  rp  z)InstructionTranslatorBase.CHECK_EXC_MATCHc                 C   s   |   s| | d S d S rv   )r  r?  r   rm   rm   rs   JUMP_IF_NOT_EXC_MATCHi  s   z/InstructionTranslatorBase.JUMP_IF_NOT_EXC_MATCHc                 C   s:   |j dkr| | d S | t|j  | | di  d S )Nzexception matchr  )r   r  r   ru   r   r   rm   rm   rs   
COMPARE_OPm  s   
"z$InstructionTranslatorBase.COMPARE_OPc                 C   s   |  tt|  gi  d S rv   )rn   rG   iterr+  r   rm   rm   rs   GET_ITERs     z"InstructionTranslatorBase.GET_ITERr   r4  c                 C   s&   |  |j}|  }| ||i  d S rv   r   r   r+  rn   )r   r   r{   r   rm   rm   rs   r   v  s   z'InstructionTranslatorBase.CALL_FUNCTIONc                 C   s  |j dkrti }|  }n|j dkr|  }|  }ntd tjdkr0|  }t|ts0J |  }tjdkrItjdk rI|  }t|tsIJ t|trt|j	t
r| }|jdkrjt|tt
frjt|g}nC|jdkrt|trt|jdkrt|trtd|v rtd	 n!|jd
krt|trt|jdkrt|trtd|v rtd t|ts|| rt|| }t|trt| t|}t|trt|tstdt| dt|  | }| ||j| d S )Nr   r   CALL_FUNCTION_EXr!  rp  viewrandom_fromz&random_ op is called with from keyworduniform_z'uniform_ op is called with from keywordznon-static call  )r   rL   r+  r'   r   r   r   r\   r[   objrc   r|  r  rH   rY   r   r   r   rU   has_force_unpack_var_sequenceforce_unpack_var_sequencerh   rG   call_custom_dictr   rB   keys_as_python_constantrn   )r   r   
kwargsvarsargsvarsnullr   rm   rm   rs   r  |  sd   








z*InstructionTranslatorBase.CALL_FUNCTION_EXc                 C   s   |   }| |j}|   }t|tr| sJ | }|d t|  |t| d  }}tt	||}t|t|ksAJ | 
||| d S rv   )r+  r   r   r   rY   r=  r>  r   r   ziprn   )r   r   argnamesr{   r   kwargs_listr  rm   rm   rs   CALL_FUNCTION_KW  s   &z*InstructionTranslatorBase.CALL_FUNCTION_KWc                 C   sf   |  tj|dd |jd }| jd | }tjdk r'| tj||d d S | tj||d d S )Nr  rs  r   co_namesrp  )	r   r   r  r   r  r   r   r[  LOAD_METHODr   r   r}  r   rm   rm   rs   LOAD_METHOD_SUPER  s   

z+InstructionTranslatorBase.LOAD_METHOD_SUPERc                 C   sD   |  tj|dd |jd }| jd | }| tj||d d S )Nr  rs  r   r  )r   r   r  r   r  r[  r  rm   rm   rs   LOAD_ATTR_SUPER  s   
z)InstructionTranslatorBase.LOAD_ATTR_SUPERc                 C   sn   |  | |  }tjdkr| | | | d S tjdkr+| | | | d S | | | d  d S )Nr!  rp  )r[  r+  r   r   r   r.  r   r   r  rm   rm   rs   r    s   





z%InstructionTranslatorBase.LOAD_METHODc                 C   s:   |  |j}|  }|d u sJ |  }| ||i  d S rv   r  )r   r   r{   dummyr   rm   rm   rs   CALL_METHOD  s
   z%InstructionTranslatorBase.CALL_METHODc                 C   s4   |   }tt| |t|jgi }| | d S rv   )r+  rG   r  rn   rH   r   r   r   )r   r   r  rY  rm   rm   rs   r[    s
   z$InstructionTranslatorBase._load_attrc                 C   s0   t jdkr|jd r| | d S | | d S )Nrt  r  )r   r   r}  r  r[  r   rm   rm   rs   	LOAD_ATTR  s
   


z#InstructionTranslatorBase.LOAD_ATTRc              
   C   s   |   }|jr| |S | d\}}t|tr)t|ts)| jr)J d|j dzt	t
| |t|j|gi  W d S  tyc } z|  sI tjddd |  |d W Y d }~nd }~ww |  d S )Nr  zMutating module attribute z during export.zSTORE_ATTR triggered compileTr  rc  )rd  r   store_attr_graph_breakr   r   r_   rH   exportr   rG   setattrrn   r   r(   r$  r   r  rf  ri  r   )r   r   rj  r  r  r_  rm   rm   rs   
STORE_ATTR
  s.   
z$InstructionTranslatorBase.STORE_ATTRc                 C   sp   t | jdd |  std | jj| td|  gd | jt		|g | 
d | j| | j d S )NzSTORE_ATTR-caused graph breakr  r  
store_attrr  )r  r  r$  r'   r)  r*  r,   r&  r.  r~  r   r,  r-  r   rm   rm   rs   r  $  s   

z0InstructionTranslatorBase.store_attr_graph_breakc                 C   s*   |   }tt| |t|jgi  d S rv   )r+  rG   delattrrn   rH   r   r   r  rm   rm   rs   DELETE_ATTR1  s   z%InstructionTranslatorBase.DELETE_ATTRc                 C      t dt|  )Nz1create_call_resume_at not overridden by subclass r   r  r   r  rm   rm   rs   r,  7     z/InstructionTranslatorBase.create_call_resume_atc                 C   r  )Nz8should_compile_partial_graph not overridden by subclass r  r   rm   rm   rs   r$  <  r  z6InstructionTranslatorBase.should_compile_partial_graphr   c                 C   s(   |  d\}}}|| d||gi }d S )Nr   __setitem__r   call_method)r   r   r  r  keyrY  rm   rm   rs   STORE_SUBSCRA  s   z&InstructionTranslatorBase.STORE_SUBSCRc                 C   s$   |  d\}}|| d|gi  d S )Nr  __delitem__r  )r   r   r  r  rm   rm   rs   DELETE_SUBSCRF  s   z'InstructionTranslatorBase.DELETE_SUBSCRc                 C   s"   d }|  |j}| t| d S rv   )r   r   r   rY   )r   r   
name_tupler   rm   rm   rs   BUILD_TUPLEJ  s   z%InstructionTranslatorBase.BUILD_TUPLEc                 C   s   |  |j}| t| d S rv   )r   r   r   rX   r   r   r   rm   rm   rs   BUILD_SLICEO  s   z%InstructionTranslatorBase.BUILD_SLICEc                 C   s$   |  |j}| t|t d d S Nmutation_type)r   r   r   rW   rC   r  rm   rm   rs   
BUILD_LISTS  s   z$InstructionTranslatorBase.BUILD_LISTc                 C   s6   t jrtd | |j}t|t d}| | d S )Nzmissing: BUILD_SETr  )r   +inject_BUILD_SET_unimplemented_TESTING_ONLYr'   r   r   rM   rC   r   )r   r   r   new_setrm   rm   rs   	BUILD_SETW  s
   z#InstructionTranslatorBase.BUILD_SETc              	   C   sf   |  |j}g }|D ]}z
|||  W q
 ty&   td|  Y q
w | ||t d d S )NzBUILD_LIST_UNPACK r  )r   r   extendr  NotImplementedErrorr'   r   rC   )r   r   r   seqsr   seqrm   rm   rs   BUILD_LIST_UNPACK^  s   z+InstructionTranslatorBase.BUILD_LIST_UNPACKc                 C   s   | j |td d S )Nr   )r  rY   r   rm   rm   rs   BUILD_TUPLE_UNPACKh  r  z,InstructionTranslatorBase.BUILD_TUPLE_UNPACKc                 C   sJ   |  |jd }tt|d d d |dd d }| t|t d d S )Nr  r   r  )r   r   r   r  r   rL   rC   )r   r   r   drm   rm   rs   	BUILD_MAPm  s   "z#InstructionTranslatorBase.BUILD_MAPc                    s^     |j} fdd|D }i }|D ]}t|tsJ ||j q t|t d d S )Nc                    s    g | ]}t t |gi qS rm   )rG   r   rn   r  r   rm   rs   r  u  s     z>InstructionTranslatorBase.BUILD_MAP_UNPACK.<locals>.<listcomp>r  )r   r   r   rL   updater   r   rC   )r   r   r   rY  r]  rm   r   rs   BUILD_MAP_UNPACKr  s   z*InstructionTranslatorBase.BUILD_MAP_UNPACKc                 C   sn   |   }| |j}t|tsJ | sJ || }t|t|ks&J | t	t
t||t d d S r  )r+  r   r   r   rY   r=  r  r   r   rL   r   r  rC   )r   r   keysr  rm   rm   rs   BUILD_CONST_KEY_MAP  s   
z-InstructionTranslatorBase.BUILD_CONST_KEY_MAPc                 C   sT   |  d\}}|jdksJ | j|j   }t|tsJ || d||fi  d S )Nr  r   r  )r   r   r  r}  r|  r   rL   r  )r   r   rq   rr   r  rm   rm   rs   MAP_ADD  s
   z!InstructionTranslatorBase.MAP_ADDc                 C   sP   |   }|jdksJ | j|j  }t|tsJ | sJ || d|gi S )Nr   r   r+  r   r  r}  r   rM   
is_mutabler  r   r   rr   r  rm   rm   rs   SET_ADD  s   z!InstructionTranslatorBase.SET_ADDc                 C   T   |   }|jdksJ | j|j  }t|tsJ | sJ || d|gi  d S Nr   r  r  r  rm   rm   rs   
SET_UPDATE     z$InstructionTranslatorBase.SET_UPDATEc                 C   s`   |   }|jdksJ | j|j   }t|tsJ | s!J | jj	
| |j| d S r   )r+  r   r  r}  r|  r   rW   r  r)  r  mutationr   r   r  rm   rm   rs   LIST_APPEND  s   z%InstructionTranslatorBase.LIST_APPENDc           
   
   C   s   |j }t| j}tjdk r|  }|  }tjdkr*t|jds"J tj	|jj
d}d }d }d }d }	tjdk rW|d@ r?|  }|d@ rG|  }|d@ rO|  }	|d@ rW|  }| t||| j||	|| d S )	Nrp  co_qualnamer  r!        r  r   )r}  r   r  r   r   r+  r   r/  rH   r   r  r   rO   r  )
r   r   flags	old_stackfn_namecodedefaultsclosureannotations
kwdefaultsrm   rm   rs   MAKE_FUNCTION  s@   



z'InstructionTranslatorBase.MAKE_FUNCTIONc                    s     }t|tr|jt|jd}n4t|tr6t|jtr6t|j	 |j
  fddt|jD }n|rA|}ntd|  t||jkrStd t|D ]}| qWd S )N)idxesc                    s   g | ]	}t  | qS rm   )rF   r  proxyr   rm   rs   r    s    z=InstructionTranslatorBase.UNPACK_SEQUENCE.<locals>.<listcomp>zUNPACK_SEQUENCE zUNPACK_SEQUENCE length mismatch)r+  r   rc   rQ  r  r   r[   r  r  as_proxyr  r  r  r'   r   rx   r   )r   r   r  r  r  rm   r  rs   UNPACK_SEQUENCE  s   

z)InstructionTranslatorBase.UNPACK_SEQUENCEc           
      C   s   d|j   krdksJ  J |j d@ }|j d? }|  }|| rnt|| }t||| ks3J |d | }||t||  }|t|| d  }t|D ]}	| |	 qQ| t| t|D ]}	| |	 qdd S t	d|  d S )Nr   i     r  z
UNPACK_EX )
r   r+  r  r   r  r   rx   r   rY   r'   )
r   r   prefixsuffixr  r  vals_prefix	vals_listvals_suffixitemrm   rm   rs   	UNPACK_EX  s"   


z#InstructionTranslatorBase.UNPACK_EXc                 C   r  rv   rm   r   rm   rm   rs   r    r  zInstructionTranslatorBase.NOPc                 C      |    d S rv   r  r   rm   rm   rs   POP_TOP     z!InstructionTranslatorBase.POP_TOPc                 C   s(   |   }|   }| | | | d S rv   r+  r   r   r   ar  rm   rm   rs   ROT_TWO  s   
z!InstructionTranslatorBase.ROT_TWOc                 C   s:   |   }|   }|   }| | | | | | d S rv   r  )r   r   r  r  crm   rm   rs   	ROT_THREE
  s   

z#InstructionTranslatorBase.ROT_THREEc                 C   sL   |   }|   }|   }|   }| | | | | | | | d S rv   r  )r   r   r  r  r  r  rm   rm   rs   ROT_FOUR  s   


z"InstructionTranslatorBase.ROT_FOURc                 C   s    |   }| | | | d S rv   r  )r   r   r  rm   rm   rs   rZ    s   
z!InstructionTranslatorBase.DUP_TOPc                 C   s<   |   }|   }| | | | | | | | d S rv   r  r  rm   rm   rs   DUP_TOP_TWO!  s   


z%InstructionTranslatorBase.DUP_TOP_TWOc                 C   sX   |dkrt t| |gi S |dkrt t| |gi S |dkr*t t| |gi S |S )Nr   r  r   )rG   r   rn   reprascii)r   r/  flagrm   rm   rs   _convert_value)  s   z(InstructionTranslatorBase._convert_valuec                 C   s   |   }t|tr#ddlm}m} |j||||jd}| | d S | 	||d@ }t
d|  d }| ttj||gi  d S )Nr   )LazySymNodeFormatStringrT   rO  r   z{:})r+  r   rb   torch._dynamo.variables.lazyr  rT   r   rT  r   r  rH   r>  rn   rG   r   format)r   fmt_specr  r/  r  rT   fmt_varrm   rm   rs   _format_value2  s   

z'InstructionTranslatorBase._format_valuec                 C   s2   |j }|d@ dkr|  }ntd}| ||S )Nr  r   )r}  r+  rH   r   r   )r   r   r  r  rm   rm   rs   FORMAT_VALUEF  s
   

z&InstructionTranslatorBase.FORMAT_VALUEc                 C   s   g }g }i }|  |jD ]J}t|tr|d || qt|tjrO||j ||j	 t
| t
|j @ rHtd| d|j  ||j qtd|  q| tjd||| d S )Nz{}zBUILD_STRING key conflict z & zBUILD_STRING r   )r   r}  r   rH   r   r   StringFormatVariableformat_stringr  sym_argsr   r  
sym_kwargsr'   r  r   r   r   )r   r   format_string_partsr{   r  partrm   rm   rs   BUILD_STRINGO  s*   

z&InstructionTranslatorBase.BUILD_STRINGc                 C   sF   |j dks|j dksJ |j dkrd}nd}td|d}| | d S )Nr   r   iszis notr  rs  )r   r   r  )r   r   
new_argvalnew_instrm   rm   rs   IS_OPg  s   
zInstructionTranslatorBase.IS_OPc                 C   s^   |j dks|j dksJ | d\}}|j }| || d|gi  |dkr-| | d S d S )Nr   r   r  __contains__)r   r   r   r  	UNARY_NOT)r   r   leftrightr  rm   rm   rs   CONTAINS_OPp  s   z%InstructionTranslatorBase.CONTAINS_OPc                 C   r  )Nr   r  )r+  r   r  r}  r   rW   r  r  r  rm   rm   rs   LIST_EXTENDx  r  z%InstructionTranslatorBase.LIST_EXTENDc                 C   s"   |  tt| |  gi  d S rv   )r   rG   r   rn   r+  r   rm   rm   rs   LIST_TO_TUPLE  s   "z'InstructionTranslatorBase.LIST_TO_TUPLEc                 C   sX   |   }|jdksJ | j|j   }t|tsJ | s!J || d|gi  d S r  )	r+  r   r  r}  r|  r   rL   r  r  r  rm   rm   rs   
DICT_MERGE  s   z$InstructionTranslatorBase.DICT_MERGEc                 C   r  rv   r  r   rm   rm   rs   	GEN_START  r  z#InstructionTranslatorBase.GEN_STARTc                 C   sH   | j d }| r| tt|  d S | || dg i  d S )Nr   r8  )r  r=  r   rH   r   r   r>  r  rv  rm   rm   rs   GET_LEN  s   
z!InstructionTranslatorBase.GET_LENc                 C   sP   | j d }t|tsJ t|jtjjr| t	d d S | t	d d S Nr   TF)
r  r   rL   r   collectionsabcMappingr   rH   r   rv  rm   rm   rs   MATCH_MAPPING  s
   
z'InstructionTranslatorBase.MATCH_MAPPINGc                 C   sd   | j d }| sJ | }t|tjjr(t|ttt	fs(| 
td d S | 
td d S r7  )r  r=  r>  r   r8  r9  Sequencer   bytes	bytearrayr   rH   r   )r   r   rw  	tos_valuerm   rm   rs   MATCH_SEQUENCE  s   

z(InstructionTranslatorBase.MATCH_SEQUENCEc                    s    j d } j d ttsJ tfdd|D r< t fdd|D  tjdk r: t	d d S d S  t	d  tjdk rS t	d	 d S d S )
Nr   r  c                 3   s    | ]}| v V  qd S rv   rm   rp   rq   )tos1rm   rs   r         z7InstructionTranslatorBase.MATCH_KEYS.<locals>.<genexpr>c                    s   g | ]}  |qS rm   )getitem_constrA  r   rB  rm   rs   r        z8InstructionTranslatorBase.MATCH_KEYS.<locals>.<listcomp>rp  TF)
r  r   rL   r  r   rY   r   r   rH   r   rv  rm   rE  rs   
MATCH_KEYS  s   



z$InstructionTranslatorBase.MATCH_KEYSc                 C   s   |  d d S )Nr   )rb  r   rm   rm   rs   r     r  z.InstructionTranslatorBase.LOAD_ASSERTION_ERRORc                 C   s,   |j dkr| | d| _d S | jrJ d S )Nr   F)r}  append_prefix_instr  r   rm   rm   rs   RESUME  s   


z InstructionTranslatorBase.RESUMEc                 C   s   t |j | |S rv   )_binary_op_lookupr}  r   rm   rm   rs   	BINARY_OP  rc  z#InstructionTranslatorBase.BINARY_OPc                 C   r  rv   rm   r   rm   rm   rs   r     r  z!InstructionTranslatorBase.PRECALLc                 C   sV   | j d |j }t|tsJ |D ]	}t|tsJ q| jd u s"J tj|d| _d S )N	co_constsr  )r  r}  r   r   r   r|  rH   r   )r   r   r|  r  rm   rm   rs   rr    s   z"InstructionTranslatorBase.KW_NAMESc                 C   s   |  t  d S rv   )r   r\   r   rm   rm   rs   r.    rc  z#InstructionTranslatorBase.PUSH_NULLc           	      C   sB  |rt jdks	J |  }t|tr| sJ | }n	| jr$| jjnd}| 	|j
d }t jdkrF|d }t|d tr@g n|d g}nt|d trT|d }g }n	|d }|d g}|r||dt|   }|t| d  }tt||}t|t|ksJ n
||dd   }i }z| ||| W d | _d S d | _w )Nr!  rm   r  r   r   )r   r   r+  r   rY   r=  r>  r|  r/  r   r}  r\   r   r   r  rn   )	r   r   call_kwr|  contentsr   r{   r  r  rm   rm   rs   _call  s2   


zInstructionTranslatorBase._callc                 C   rk  rv   rO  r   rm   rm   rs   r   #	  r   zInstructionTranslatorBase.CALLc                 C   s   |  | j|j   d S rv   )r   r  r}  r   rm   rm   rs   COPY'	  rp  zInstructionTranslatorBase.COPYc                 C   s.   | j |j  | j d | j d< | j |j < d S r  )r  r}  r   rm   rm   rs   SWAP*	  s   .zInstructionTranslatorBase.SWAPc                 C   r  rv   rm   r   rm   rm   rs   CACHE5	  r  zInstructionTranslatorBase.CACHEc                 C   rk  rv   rl  r   rm   rm   rs   BEFORE_WITH8	  r  z%InstructionTranslatorBase.BEFORE_WITHc                 C   s  |   }t|ttfst|j d|  t|tr%| s%|  jd7  _t|ttfs.J t||j	}t
jdkrR|jrL| jrI|jj	| jd j	urLd }n	| jjj	}n|j	}|rtt| trk| jt||t| j| n	| jt|| | | | ||  d S )Nr  r   rp  r   )r+  r   rI   rJ   r'   r   supports_graph_breaksre  rK   r   r   r   r  rv  r-  r   r   r   r   r  r   enter)r   r   ctxr   r   rm   rm   rs   rm  ;	  sB   


z.InstructionTranslatorBase.setup_or_before_withc                 C   s   | j sJ | j| d S rv   )r  r  r   r   rm   rm   rs   rH  l	  s   
z,InstructionTranslatorBase.append_prefix_instc                 C   sL   t jdkr| jst| j|j tsJ | jj	 | j|j< d S | 
| d S r{  )r   r   r  r   r  r   r\   r)  r  track_cell_newrH  r   rm   rm   rs   	MAKE_CELLp	  s   
z#InstructionTranslatorBase.MAKE_CELLc                 C   rk  rv   rH  r   rm   rm   rs   COPY_FREE_VARS{	  r  z(InstructionTranslatorBase.COPY_FREE_VARSc                 C   rk  rv   rZ  r   rm   rm   rs   RETURN_GENERATOR~	  r  z*InstructionTranslatorBase.RETURN_GENERATORc                 C   s$   t jdkr|   d S | d d S )Nr!  r  )r   r   r+  r   r   rm   rm   rs   END_FOR	  s   
z!InstructionTranslatorBase.END_FORc                 C   s(   t | j|j trtd | | d S )Nz)LOAD_FAST_CHECK on uninitialized variable)r   r  r   r\   r'   r  r   rm   rm   rs   LOAD_FAST_CHECK	  s   z)InstructionTranslatorBase.LOAD_FAST_CHECKc                 C   s6   |j | jvr| t  n| | t | j|j < d S rv   )r   r  r   r\   r  r   rm   rm   rs   LOAD_FAST_AND_CLEAR	  s   
z-InstructionTranslatorBase.LOAD_FAST_AND_CLEARc                 C   s:   |  tj|dd |jd@ r| | d S | | d S )Nr  rs  r   )r   r   r  r}  r  r[  r   rm   rm   rs   LOAD_SUPER_ATTR	  s   
z)InstructionTranslatorBase.LOAD_SUPER_ATTRc                 C   sR   |j dkr| | d S |j dkr| t|  |  d S td|j   d S )N      z!missing CALL_INTRINSIC_1 operand )r   UNARY_POSITIVEr   rY   r+  r  r'   r   rm   rm   rs   CALL_INTRINSIC_1	  s
   

z*InstructionTranslatorBase.CALL_INTRINSIC_1c                 C   s   |   }|    | | d S rv   r  rv  rm   rm   rs   END_SEND	  s   z"InstructionTranslatorBase.END_SENDc                 C   s   | j |dd d S )NT)rM  rP  r   rm   rm   rs   CALL_KW	  s   z!InstructionTranslatorBase.CALL_KWc                 C   s   | j jdv sJ d S )N)POP_JUMP_IF_TRUEPOP_JUMP_IF_FALSEr.  )r-  r   r   rm   rm   rs   r#  	  s   z!InstructionTranslatorBase.TO_BOOLc                 C   sp   |j }|  }t|tsJ |  }|d@ r||_n|d@ r"||_n|d@ r*||_n|d@ r1||_| | d S )Nr  r  r  r   )	r}  r+  r   rO   r  r  r  r  r   )r   r   r  r   attrrm   rm   rs   SET_FUNCTION_ATTRIBUTE	  s   z0InstructionTranslatorBase.SET_FUNCTION_ATTRIBUTEc                 C   s   |  | |  |j d S rv   )r   r  r+  r   r   rm   rm   rs   CONVERT_VALUE	  r  z'InstructionTranslatorBase.CONVERT_VALUEc                 C   s   |  tdd d S )Nr   r   )r   rH   r   r   rm   rm   rs   FORMAT_SIMPLE	  s   z'InstructionTranslatorBase.FORMAT_SIMPLEc                 C   s   |  |  d d S r   )r   r+  r   rm   rm   rs   FORMAT_WITH_SPEC	  r  z*InstructionTranslatorBase.FORMAT_WITH_SPECc                 C   s    | j  dkrdd | _dS dS )Nr   c                   S      dS )NTrm   rm   rm   rm   rs   r}   	      z>InstructionTranslatorBase.is_non_empty_graph.<locals>.<lambda>TF)r)  count_callsr  r   rm   rm   rs   r  	  s   
z,InstructionTranslatorBase.is_non_empty_graphc                 C   s.   |d u rg }d t|  gtt| S )Nr   )r   r  r  r&  r   rx   )r   additional_stack_framesrm   rm   rs   format_frame_summary	  s   z.InstructionTranslatorBase.format_frame_summaryc                 C   s(   t jt| jdd| jt| jddddS )Nr   	<unknown>r  F)lookup_line)r  FrameSummaryr  r  r   r   rm   rm   rs   r&  	  s   z'InstructionTranslatorBase.frame_summaryc                 C   s&   t | jdd}td}||d uS )Nr   rs  z.*torch/nn/modules.*)r  r  recompilematch)r   r   nn_modules_patternrm   rm   rs   is_co_filename_from_nn_modules	  s   
z8InstructionTranslatorBase.is_co_filename_from_nn_modulesc                 C   s,   | j |t|}tt|tj |S rv   )	r)  install_global_by_idweakrefrefr+   r5   
make_guardr*   WEAKREF_ALIVE)r   r  r/  global_namerm   rm   rs   store_global_weakref_by_id	  s
   z4InstructionTranslatorBase.store_global_weakref_by_idc                 C   s
   | j jjS rv   )r)  tracing_context	fake_moder   rm   rm   rs   r  	  r   z#InstructionTranslatorBase.fake_modecheck_fnc                 c   s*    | j }|| _ z	dV  W || _ dS || _ w )zx
        Strict mode is enabled on a per-VariableTracker level depending on the return value of check_fn(node).
        N)r  )r   r  priorrm   rm   rs   strict_translation_mode 
  s   z1InstructionTranslatorBase.strict_translation_modec                 C   sF   | j d usJ | j dksJ | j| jj| j| j d | j| j d  S )Nr   r   )r   speculation_logr   r  r   r   r   r   rm   rm   rs   rd  
  s   z#InstructionTranslatorBase.speculater   r  r  r   r  r  r  r  distributed_stater  c                    s^  t    || _|| _|| _|| _|| _|	| _g | _d| _	t
d| _g | _d| _d| _d | _d| _g | _g | _|| _t| j| _|| _|| _|| _|| _|
| _|d ur_tjr_t|
||d| _nd | _i | _i | _ || _!d| _"d | _#d | _$t%j&dkrdd	l'm(}m)}m*}m+} |
j,||B |B |B @ r| -t.d  || _/d| _0d gt1|
j2 | _3t45|
j6| d S )
Nr   r  r   T)r  r  r  F)r   
   r   )CO_ASYNC_GENERATORCO_COROUTINECO_GENERATORCO_ITERABLE_COROUTINE)7r  r  r  r  r)  r  r  r  r  r   r   r  rv  re  r   r|  r  r  r  r   r   rd  r  r  r   r  r  r   replay_record_enabledr/   r  nn_module_stack	num_callsr  	one_graphr  r  r   r   resume_executionr  r  r  r  co_flagsr   rG   r  r  r   rL  r  r  	lazycacher   )r   r)  r   r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rm   rs   r  
  s`   



z"InstructionTranslatorBase.__init__rv   )F(  r   r   r   r-   r   r   r   rD   rd   r   r   r   r    r   rH   r   r   r   r/   r   r  r%  r  r  r  r  rn   r  r  r  r  r  r   r   r  propertyr-  r  r  r  r   r  r+  r   r  r  r  r  r  LOAD_CLOSUREr  r   r&  r   cached_propertyr-  r   r3  r'  rD  rL  rY  r\  rb  r#  r?  JUMP_FORWARDJUMP_ABSOLUTErb  r   not_rh  r   rg  JUMP_IF_FALSE_OR_POPJUMP_IF_TRUE_OR_POPrg  ri  rj  rn  ro  rq  rr  rs  ru  rx  rz  r  r  r   r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r[  r  r  r  r  r,  r$  r  r  r  r  r  r  rW   r  r  BUILD_TUPLE_UNPACK_WITH_CALLr  r  BUILD_MAP_UNPACK_WITH_CALLr  r  r  r  r  r  r  r
  r  r  r  r  r  rZ  r  r  r   r!  r(  r,  r1  r2  r3  r4  DICT_UPDATEr5  r6  r;  r@  rG  r   r   posrc  negUNARY_NEGATIVEr.  invertUNARY_INVERTpowBINARY_POWERmulBINARY_MULTIPLYmatmulBINARY_MATRIX_MULTIPLYfloordivBINARY_FLOOR_DIVIDEtruedivBINARY_TRUE_DIVIDEr\  BINARY_MODULOBINARY_REMAINDERr   
BINARY_ADDsubBINARY_SUBTRACTgetitemBINARY_SUBSCRlshiftBINARY_LSHIFTrshiftBINARY_RSHIFTand_
BINARY_ANDor_	BINARY_ORxor
BINARY_XORipowINPLACE_POWERimulINPLACE_MULTIPLYimatmulINPLACE_MATRIX_MULTIPLY	ifloordivINPLACE_FLOOR_DIVIDEitruedivINPLACE_TRUE_DIVIDEimodINPLACE_MODULOINPLACE_REMAINDERiaddINPLACE_ADDisubINPLACE_SUBTRACTilshiftINPLACE_LSHIFTirshiftINPLACE_RSHIFTiandINPLACE_ANDixorINPLACE_XORior
INPLACE_ORrI  rK  r   rr  r.  rO  r   rQ  rR  r  JUMP_BACKWARD_NO_INTERRUPTPOP_JUMP_FORWARD_IF_TRUEPOP_JUMP_BACKWARD_IF_TRUEPOP_JUMP_FORWARD_IF_FALSEPOP_JUMP_BACKWARD_IF_FALSErS  rT  rm  rH  rY  r[  r\  r]  r^  r_  r`  rd  re  rf  r#  rj  rk  rl  rm  r  rr  r&  rz  r  r  
contextlibcontextmanagerr  rd  rT  CodeTyper   r   r	   CellTyper  r  rm   rm   r  rs   r     s&  
 			



-
)
	
	
/
		_7

M
	

	'
			
































)1

	"





	
)	metaclassc                       s   e Zd ZedddZejdd Zdee	 de
dee dd	f fd
dZdd ZdefddZ fddZdd Zdd Zdd Zdd Zdd Zdd Z  ZS ) r   r   c                   C   s   t jS rv   )tls
current_txrm   rm   rm   rs   r  s
  s   z InstructionTranslator.current_txc                 c   s0    t tdd }| t_z	d V  W |t_d S |t_w )Nr  )r  r  r  )r   r  rm   rm   rs   set_current_txw
  s   z$InstructionTranslator.set_current_txr   r  r  Nc                    sd  t  tjd|j d|d  d|d   t jt||	| |||||||d
||||||i i d ||d||d |   t| j	j
 |   |
| _|| _| jrV| jsVJ d	i | _t|  }| D ]\}}||vrzt|t|d
d}|| j|< qc| j	j}|  D ]4}||v r|| }t|}t|}t|d
d
d}t||}||||}n| }||_|| j|< qt|  |D ]4\}}t|}t|d
d}z	t|j|}W n t y   t!" }Y nw ||||}||_|| j|< qt#|| _$g | _%|rt!j&| j| _W d    n1 sw   Y  W d    d S W d    d S 1 s+w   Y  d S )Nztorchdynamo start tracing r  r   r   r   )local_scoper<  r  torch_function_mode_stackr   )r)  r   r  r  r   r  r  r  r  r  r  r  r  r  r  z4Export without one graph - something has gone wrong.T)is_input)r  is_derefed_cell_contents)r  )'r   r   INFOr  r  r  r-   _throw_if_in_functorchr   r)  r  r  r  r  r  r   r  r   rT   r   r7   r  r  rT  r  r6   track_cell_existingrX  r  r  r  cell_contents
ValueErrorr   DeletedVariablerd   r  debug_localsrealize_all)r   r   r  r  r  r   r  r  r  compiler_fnr  r  export_constraintsframe_stater  r  r  r  r/  varr  
dummy_cellcell_sourcecontents_sourcer  cell_varr  r  rm   rs   r  
  s   

TzInstructionTranslator.__init__c                 C   s   t jd}t| jjd| jj}t jj	 }t jjj
jt jjj
jt jjj
jf}|d urO| |v rQ||urS| j }d| d| d| d}t| d S d S d S d S )Neagerr  zhIf you are reaching here, it means dynamo failed for one of the following reasons:
- Calling torch.func.zP(compiled_fn) function from eager mode is not supported. Ensure that torch.func.zp is also wrapped within a torch.compile function. For more information, see PyTorch issue #128711.
- torch.func.z2(fn) requires the function to be inlined by dynamo)r  _dynamolookup_backendr   getattr_staticr)  r  _C
_functorchpeek_interpreter_stackTransformTypeVmapGradJvpr  r  lowerr'   )r   r  r  ciforbidden_keysr  r1  rm   rm   rs   r    s*   


	z,InstructionTranslator._throw_if_in_functorchrT  c                 C   s0   t |tr| j|j S t |tr| j|j S trv   )r   r7   r  r  r4   r  r  r	  )r   rT  rm   rm   rs   get_example_value,  s
   

z'InstructionTranslator.get_example_valuec                    s   t    d S rv   )r  r  r   r  rm   rs   r  3  r  zInstructionTranslator.runc                 C   sX   t jdkr| jj}|r| jr|j| jd jurdS tdd | jD o+| j o+| jdkS )Nrp  r   Fc                 s       | ]}|  V  qd S rv   )r   rp   r  rm   rm   rs   r   ?  rC  zEInstructionTranslator.should_compile_partial_graph.<locals>.<genexpr>r   )	r   r   r  r  rv  r   r  r  re  )r   r   rm   rm   rs   r$  6  s   
z2InstructionTranslator.should_compile_partial_graphc                    s  d _ |jdkrtdgS |jdkrtd|jdgS tj|tfddj D }tfdd|D }tfdd|D }t	j
dk rTt|d	ksTJ d
t g }tjD ]<\}}tt|rtt|}|jd u rudnt|j}	|||	f |   ttj| d   td q_g }
|D ]3}ttj|  }rtt|}|jd u rdnt|j}	|
||	f |   td|d qg }t	j
dkr'tjD ]\}}tt|r|| qd	}ttjD ],\}}tt|r&td|d | D ]} td|d q    |d7 }qtjt| }|t| }td|j }t j!j"|jtdd j#D |||tdd j#D t|t|
t|}t$%j!&ddd  }|d urt'(|t$%|d< |j)rj*+||  ,||d| nj*+|t-.|j/|   0|d|   fdd|D   t1|d  td  2 S )Nr  r  rs  c                 3   s(    | ]}| v r|  vr|V  qd S rv   )r  rA  )r  r   rm   rs   r   M  s    z>InstructionTranslator.create_call_resume_at.<locals>.<genexpr>c                 3   s&    | ]}t t j| s|V  qd S rv   r  __instancecheck__r\   r  rA  r   rm   rs   r   S      
c                 3   s&    | ]}t t j| r|V  qd S rv   r  rA  r   rm   rs   r   X  r  rt  r   z&variables should not be NULL in < 3.12rm   r   r  r  rp  r  rR  )r}  __resume_at_c                 s   s    | ]}|j jV  qd S rv   )r   r  r  rm   rm   rs   r     rC  c                 s   r  rv   )r   r  rm   rm   rs   r     rC  orig_graphmodulec                   S   r  rv   rm   rm   rm   rm   rs   r}     ro  z=InstructionTranslator.create_call_resume_at.<locals>.<lambda>Tc                    r  rm   )create_loadrA  )r  rm   rs   r    r  z?InstructionTranslator.create_call_resume_at.<locals>.<listcomp>F)3r   r   r   r   r   r   r   r  r  r   r   r   r$   	enumerater  r  r  rI   r   r   r   ry  rw  r   append_outputr\   rx   r  pop_nullr"   r  r0   lookupr  r   rv  r#   get_contextr  r|  r}  r  r)  install_global_unsafemake_function_with_closurerT  FunctionTyper  load_function_namer   r{  )r   r   all_argnamesr  argnames_nullstack_ctx_varsr  r  rW  r   argnames_ctx_varsr  
null_idxesnull_cntj	stack_lenr   new_codeorig_graphmodule_mayberm   )r  r  r   rs   r,  D  s   









z+InstructionTranslator.create_call_resume_atc                 C   s6   | j  D ]}t|trt| tjjr dS qdS )NTF)	r  r  r   rg   r  r>  r  nnModule)r   rr   rm   rm   rs   $symbolic_locals_contain_module_class  s   z:InstructionTranslator.symbolic_locals_contain_module_classc                 C   s   | j  dkr| js|  s| jstdd | _t t	j
d| jj d|j d td|j | j j| td|  gdd	d
 |jdkrJtdntd|jd}| j |g t)Nr   z#because no content in function callztorchdynamo done tracing r   r  z%s triggered compilereturn_valueF)rc  r  r  r  rs  )r)  rp  r  r(  r  r   r(  r   r   r   r  r  r  r   r   r  r*  r,   r&  r   r   r.  r   )r   r   return_instrm   rm   rs   _return  s4   

zInstructionTranslator._returnc                 C   rk  rv   r+  r   rm   rm   rs   r    r  z"InstructionTranslator.RETURN_VALUEc                 C   rk  rv   r,  r   rm   rm   rs   r    r  z"InstructionTranslator.RETURN_CONST)r   r   )r   r   r   staticmethodr  r  r  r  r   r    r   r   r   r  r  r8   r
  r  r$  r,  r(  r+  r  r  r  rm   rm   r  rs   r   r
  s0    
 r   rp  c                 C   s<   g | ]\}}t td |v r|dd nd|dd  qS )INPLACEr   NBINARY_)r  r   )rp   r   r|   rm   rm   rs   r    s    $r  c                       s   e Zd ZU dZee ed< edd Ze	dd Z
e	dedee fd	d
Zdedejdeeef deeef dededdf fddZedd Zdd Zdd Zdd Zdd Zdd  Zd!d" Z fd#d$Z fd%d&Z  Z S )'r  z Trace and inline a called methodsymbolic_resultc                 C   sH   t tdtd i | ||||W  d    S 1 sw   Y  d S )Nr'   r  )r   r   r;   inline_call_)r   r  funcr{   r  rm   rm   rs   r    s   $z)InliningInstructionTranslator.inline_callc              
   C   s   |   rtd tj| dd}|jrOddlm} tt| dd dr.| j	j
|fv r.tdd	S t| dr7| j	jnd
}td| d|   d|   d|j d	 t| trht|  ddrhtd|    d S |S )Nzinline with __self__T)is_inlined_callr   )!produce_trampoline_autograd_applyr   _originFz"allowlist in dynamo known functionr   z'inline in skipfiles: z | r  z, '_torchdynamo_disablez.call torch._dynamo.disable() wrapped function )has_selfr'   r   check_verboseskippedtorch._dynamo.variables.miscr4  r   r  r   r5  
SkipResultr   get_nameget_filenamer   r   rQ   r   r  get_function)r2  rY  r4  fn_qualnamerm   rm   rs   check_inlineable  s,   &
z.InliningInstructionTranslator.check_inlineabler2  r{   c                    s  t |tr	td t |ttfsJ t|}|jdu sJ z	|| ||}W n. t	yU } z"t
djt|d|  d|  d| j dd |D |d	d }~ww t| D ]}t |tsktd
|  q]|   jdv r|rt |d tjtjfstd j  d}tjjjdrdt   }t j!dkr| j"| j#| j$j%j&d fdd}	t'(dt)|	 t*(d ||j+ |rt |d t,r| j-.|d j/}
t |
tj0j1rt23|
t45|
j6j7d< t8 rt9|  || j:| j;|}nt|  || j:| j;|}t<= }| j>r|?| j>}z| |@  W d    n	1 s-w   Y  W nU tAjByV } zd  d| }| jCD|jC t*(|  d }~w tAjEyu } zd  d| }t*(| tF||d }~w tGy } zt*(d   d }~ww |jHd usJ |jI| jIu r| j:J|j: |  jK|jKO  _Kt*(d  t8 rt |t9sJ |jHL d u sJ tM|jNtO dS |jHS )Nz#inline with functions in skip filesFz;{reason}.
  func = {func}, args = {args}, kwargs = {kwargs}r6  z' r   c                 S   s   g | ]}|  qS rm   )python_type)rp   r}  rm   rm   rs   r  6  r  z>InliningInstructionTranslator.inline_call_.<locals>.<listcomp>)r   r2  r{   r  zunconverted arg )r  __setattr__r   zinline r   bytecoder   rp  )r   c                     s&   t  } d j d d|  S )NzTRACE inlined call z from r   )r=   r  r  )r  r  cur_instheaderparent_coderm   rs   get_trace_call_log_strS  s   zJInliningInstructionTranslator.inline_call_.<locals>.get_trace_call_log_strr  zINLINING %s%s, %sr  z!Observed exception DURING INLING z : zSKIPPED INLINING r   zFAILED INLINING %szDONE INLINING %sr  )Pr   rP   r'   rQ   rO   r  rA  r:  	bind_args	TypeErrorr%   r  r   r=  r>  get_coder   r  r  r  rD   r  r   CustomizedDictVariablerh   r  r  	_internal	log_stateis_artifact_enabledr  Bytecoder   r   r  r  r  	positionsr   trace_call_logr  r@   r   r   r_   r)  rJ  rK  rD  GraphModuler|  r}  r#   r  forward__code__r!   &InliningGeneratorInstructionTranslatorr  r  r  nullcontextr  r  r  r   r  r  r  r(  r(   r  r0  r  r  r  r>  rV   generated_itemsrC   )r  r2  r{   r  rY  
sub_localsr_  rr   r  rI  moduletracer
strict_ctxr1  rm   rE  rs   r1  "  s   

"




		




z*InliningInstructionTranslator.inline_call_r  r  r  r  r  funcvarr   Nc           
         s   |  }|d }t|ts|j}t }	t|	 t j|ji ||||||	 fddt	 D  |j
|jd |j|jd || _|j| _d | _|j | _|j| _d S )N__builtins__c                    s   i | ]}|t  |qS rm   )r  rA  r  rm   rs   rt     rF  z:InliningInstructionTranslator.__init__.<locals>.<dictcomp>r   )r)  r  r  r   r  r  r  r   r  r  r  r  r  r  )get_globalsr   r   __dict__r   r   r  r  r)  r   r  r  r  r  r  r  r0  r  r~  r  )
r   r  r  r  r  r  r^  r  r   r   r  r`  rs   r    s6   	
z&InliningInstructionTranslator.__init__c                 C   s   | j jS rv   )r  r  r   rm   rm   rs   r    s   z'InliningInstructionTranslator.fake_modec                 C   s   t | j S rv   )r   r  r  r&  r   rm   rm   rs   r    rc  z)InliningInstructionTranslator.run_ctx_mgrc                 C   rn  )NFrm   r   rm   rm   rs   r$    r  z:InliningInstructionTranslator.should_compile_partial_graphc                 C   s   t d d S )Nzcant resume while inliningr  r  rm   rm   rs   r,    r  z3InliningInstructionTranslator.create_call_resume_atc                 C   s   |   | _d | _trv   )r+  r0  r   r   r   rm   rm   rs   r    s   
z*InliningInstructionTranslator.RETURN_VALUEc                 C   s   |  || _d | _trv   )r  r0  r   r   r   rm   rm   rs   r    s   z*InliningInstructionTranslator.RETURN_CONSTc           	      C   s   d| j v r-| j d }| |}d|v rtjjj| }nt|}t	| ||}t
||}n| jd| j }t|}| j }t	| ||}t||}|||fS )Nr   r4  ___unnamed_scope)r  r'  r  r9  r:  r;  r(  r)  rD   r$  r2   r)  r{  r4   r3   )	r   r  r*  r+  r,  fglobals_vtglobal_sourceglobals_nameglobals_sourcerm   rm   rs   get_globals_source_and_value  s    





z:InliningInstructionTranslator.get_globals_source_and_valuec                    s   | j j| ju rt | d S |j}| |\}}}| j j||r/| 	| j j
|| d S z| j| }W n tyD   | | Y S w | 	t| || d S rv   )r)  r<  r  r  r&  r   rh  r  has_pending_mutation_of_attrr   	load_attrr	  r#  rD   r$  )r   r   r  r|   rd  re  r/  r  rm   rs   r&    s   z*InliningInstructionTranslator._load_globalc                    sd   | j | jj u rt | d S |  }t|trtd |j}| 	|\}}}| j
j||| d S r/  )r  r  r  r3  r+  r   rf   r'   r   rh  r)  r  r  )r   r   r/  r  r,  rd  r|   r  rm   rs   r3    s   
z*InliningInstructionTranslator.STORE_GLOBAL)!r   r   r   r   r   rc   r   r   r  r-  rA  rD   r   r1  r   rT  r  r   r   rd   rN   r  r  r  r  r$  r,  r  r  rh  r&  r3  r  rm   rm   r  rs   r    sL   
 



%
r  c                       sR   e Zd ZU ee ed< d fddZdefddZd	d
 Z	dd Z
dd Z  ZS )rW  rY  r   Nc                    s   t  j|i | g | _d S rv   )r  r  rY  )r   r{   r  r  rm   rs   r    s   
z/InliningGeneratorInstructionTranslator.__init__r   c                 C   s@   | j |   t| j tkrtdt  | t	d  d S )NzqToo many yield values in generator. Maybe you are inlining an infinite generator. If not, please report a bug at )
rY  r   r+  r   rS   r'   PT2_ISSUE_TRACKER_URLr   rH   r   r   rm   rm   rs   YIELD_VALUE  s   z2InliningGeneratorInstructionTranslator.YIELD_VALUEc                 C   sB   | j d }t|ts|   tt| |gi }| | d S d S r  )r  r   rV   r+  rG   r  rn   r   )r   r   rw  resrm   rm   rs   GET_YIELD_FROM_ITER  s   

z:InliningGeneratorInstructionTranslator.GET_YIELD_FROM_ITERc              
   C   s   t | jdks	J |  }| jd }t|tr|jd u s td z|| }W n. tt	j
fyU } zt|t	j
r=t	|  |   | t|j W Y d }~d S d }~ww | | | | t| jtrk| jdksmJ |  jd8  _d S )Nr  r   Unreachable sub-generator coder   r   )r   r  r+  r   rH   r/  r'   r}  r~  r   r  rN  r   r   rl  r   r   r   r   r  rw  exrm   rm   rs   
YIELD_FROM&  s(   

 


z1InliningGeneratorInstructionTranslator.YIELD_FROMc              
   C   s   t | jdks	J |  }| jd }t|ts$t|trpt|jtjj	rpt|t
rj|jd u rjz|| }W n- ttjfyb } ztjdk rI|   | t
|j | | W Y d }~d S d }~ww | | d S td d S tdt|  d S )Nr  r   rt  ro  zSEND )r   r  r+  r   rV   rh   r/  r8  r9  IteratorrH   r}  r~  r   r  r   r   r   r   r?  r'   rB   rp  rm   rm   rs   SENDG  s*   


z+InliningGeneratorInstructionTranslator.SENDr   )r   r   r   r   rD   r   r  r    rl  rn  rr  rt  r  rm   rm   r  rs   rW    s   
 	!rW  )r   FN)r8  collections.abcr  r~  r   r  r   r(  r   r  r  r   r   rv  r   	threadingr  rT  typingr|  r   r   r   r   r   r   r   r	   r
   r   unittest.mockr   r  torch._loggingtorch._dynamo.excr   torch._guardsr   r   r   r   r   r   r   r   bytecode_analysisr   r   r   r   bytecode_transformationr   r   r   r   r   r   r    r!   r"   r#   codegenr$   r%   r&   r'   r(   funcname_cacher)   guardsr*   r+   output_graphr,   r-   replay_recordr.   r/   r  r0   r1   rT  r2   r3   r4   r5   r6   r7   r8   r9   r:   utilsr;   r<   r=   r>   r?   r@   rA   variables.baserB   rC   rD   variables.builderrE   rF   variables.builtinrG   variables.constantrH   variables.ctx_managerrI   rJ   rK   variables.dictsrL   rM   variables.functionsrN   rO   rP   rQ   rR   variables.iterrS   variables.lazyrT   variables.listsrU   rV   rW   rX   rY   variables.miscrZ   r[   r\   r]   r^   variables.nn_moduler_   r`   variables.tensorra   rb   rc   variables.torch_functionrd   re   variables.user_definedrf   rg   rh   	getLoggerr   r   r  getArtifactLoggerr  rS  r  r  localr  r   ru   r   r   containsrn   rw   r  r   rk  	dataclassr   r   r   r   r   	lru_cacher   r   r  r   r0  r   r   r   r  r  rb  r  r  r  r   r   r   _nb_opsrJ  r  rW  rm   rm   rm   rs   <module>   s   
0,$	$	
@

F
: Iu
              q  ~	  