o
    io                    @   st  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	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 ddlmZ ddlmZ ddlZdd	lmZ d
dlmZmZmZmZ d
dl m!Z!m"Z"m#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/m0Z0m1Z1 d
dl2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 d
dl9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZB ddlCmDZDmEZEmFZFmGZG ddlHmIZI zddlJmKZK W n eLy   dZKY nw erddlMmNZN ddlOmPZP ddlQmRZRmSZS ededZTdZUdZVe ZWG dd dZXdedeXfd d!ZYd"d# ZZdsdtd&d'Z[dtd(d)Z\d*e]e^eGf fd+d,Z_d-d. Z`h d/Zad0d1 ZbG d2d3 d3eGZcG d4d5 d5ecZdG d6d7 d7ecZeG d8d9 d9eGZfG d:d; d;efZgG d<d= d=ecZhG d>d? d?ehZiG d@dA dAedZjG dBdC dCejZkG dDdE dEedZldtdFdGZmG dHdI dIecZnG dJdK dKenZoG dLdM dMeGZpG dNdO dOepZqG dPdQ dQeGZrG dRdS dSerZsdTdU ZtdtdVdWZuG dXdY dYedZvG dZd[ d[edZwG d\d] d]edZxG d^d_ d_eGZyG d`da daeGZzG dbdc dceGZ{G ddde deeGZ|ddflQm}Z}m~Z~mZmZ G dgdh dheZe ZG didj djeGZG dkdl dleGZG dmdn dneGZG dodp dpeGZG dqdr dreGZdS )ua  
Function-related variable tracking classes for Dynamo's symbolic execution.

This module contains classes that track different types of functions during graph
compilation, including:
- User-defined functions and methods
- Built-in functions and methods
- Wrapped functions (e.g. from decorators)
- Special function types (e.g. functools.partial)
- Triton kernels and related function types

These classes are responsible for:
- Tracking function calls and their arguments
- Managing function closures and cell variables
- Handling function attributes and special methods
- Maintaining guards for function identity and closure contents
- Supporting function inlining and specialization
- Enabling proper symbolic execution of different function types

The variable trackers here work together with the rest of Dynamo to enable
accurate graph capture while handling Python's various function-related behaviors.
    N)SequenceFunctionType)AnyCallableOptionalTYPE_CHECKINGTypeVar)Never)patch)WeakKeyDictionary)get_stack_above_dynamo   )configgraph_break_hints	polyfills	variables)create_call_functioncreate_rot_nis_generator)
get_dynamo_observed_exceptionhandle_observed_exceptionInfiniteGeneratorErrorObservedExceptionObservedGeneratorExitObservedUserStopIterationraise_observed_exception	SkipFrameunimplemented_v2Unsupported)GuardBuilderinstall_guard)
AttrSourceClosureSourceConstantSourceDefaultsSourceGetItemSourceSkipGuardSource)	check_constant_argscheck_unspec_or_constant_argscmp_name_to_op_mappingcountersidentityis_functionis_wrapper_or_member_descriptoristype	make_cell   )#AsPythonConstantNotImplementedErrorAttributeMutationNewValueMutationNewVariableTrackerConstantVariable)_fsdp_param_group)	PyCodegenInstructionTranslator)TritonGridTypeTritonKernelType_F)bound      c                   @   s(   e Zd ZdefddZdefddZdS )FunctionSpecfuncc                 C   s   |j }|j}|j| _|j| _|j| _|d | j | _|| j| j | _	| j| j	 | _
|| j| j| j  | _| j| j }|jt@ rE|| nd | _|| jrNdnd7 }|jt@ r]|| | _d S d | _d S )Nr1   r   )__code__co_varnamesco_posonlyargcountposonly_countco_argcount	arg_countco_kwonlyargcountkwonly_countposonly_namespos_or_kw_namesall_pos_nameskwonly_namesco_flags
CO_VARARGSvarargs_nameCO_VARKEYWORDS
varkw_name)selfrC   codevnoff rY   ^/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/torch/_dynamo/variables/functions.py__init__p   s   "zFunctionSpec.__init__c                 C   sH   |j pd| _|jp
i | _tt| jt| j d  tt| j| _	d S NrY   )
__defaults__defaults__kwdefaults__
kwdefaultsdictziprN   lenrangepos_default_map)rU   rC   rY   rY   rZ   update_defaults   s
   $
zFunctionSpec.update_defaultsN)__name__
__module____qualname__r   r[   rf   rY   rY   rY   rZ   rB   o   s    rB   rC   returnc                 C   s&   t | }|d u rt| }|t | < |S N)_spec_cachegetrB   )rC   specrY   rY   rZ   	_get_spec   s
   
ro   c              
   C   s&  t | }||  i }t|}t|jD ]n\}}	|t|k r(t||| ||	< q|	|v rJ|	|jv r?tt	|t
|	 dgd t|||	||	< q|	|jv rt|j|	 }
d }|rht
|j|
 rctjsht||
}t||j|
 |||	< qtt	|t
d|	 gd q|t|jd  }|jrt|t|||j< n|rtt	|t
dt| dt|j gd |jD ];}	|	|v rt|||	||	< q|	|jv rd }|rt||	dd}t||j|	 |||	< qtt	|t
d|	 gd q|jrt||||j< |S |rtt	|t
d	t| gd |S )
Nz is positional-onlyargsz&Missing required positional argument: z#Too many positional arguments: got z, expected T)is_kwz(Missing required keyword-only argument: zUnexpected keyword arguments: )ro   rf   ra   	enumeraterN   rc   wrap_bound_argrL   r   	TypeErrorr7   createpopre   
is_literalr^   r   %skip_guards_on_constant_func_defaultsr%   rR   tuplerO   r`   rT   list)rC   tx	fn_sourcerq   kwargsrn   barem_kwinameidxdefault_sourceextrakwdefault_sourcerY   rY   rZ   bind_args_cached   s   







r   r|   r;   c                 C   s,   t |tr|S |st| |S tj||S rk   )
isinstancer5   buildr   LazyVariableTrackerrv   )r|   valsourcerY   rY   rZ   rt      s
   
rt   c                 C   s6   t | D ]\}}t|ttfrt| |||< qd S rk   )r{   itemsr   rz   ra   rt   )r|   resultkvrY   rY   rZ   wrap_args_kwargs   s
   r   r   c                 C   sB   | j j}|jD ]}| }||v r|||| |||< qdS )z
    Update `result` to add mapping from local name to new cells created
    directly by `code`, or update SideEffects in `parent` if the a local cell is
    already in `result` (cell argument).
    N)outputside_effectsco_cellvarstrack_cell_new
store_cellrw   )parentr   rV   r   r   new_cellrY   rY   rZ   init_cellvars  s   

r   c           
      C   sd   ddl m} || ||||}||_t|tr"ddlm}	 t|	|}|d u s-t|ts-J ||_|S )Nr   r   pairwise)	typesr   r_   r   rz   	itertoolsr   ra   __annotations__)
rV   	f_globalsr   r^   closurer`   annotationsr   rC   r   rY   rY   rZ   _create_nested_fn  s   
r   >   __doc__rD   __closure____globals__r]   r_   r   c                 C   s   |ot ||}|r|dkrt|}zt||}W n ty'   tt|  Y nw |tv r1t||}|r:tj	
||S t| |S )Nr   )r"   r'   inspectgetattr_staticAttributeErrorr   fn_known_dunder_attrsgetattrr   r   rv   r5   r   )r|   fnr   r   subobjrY   rY   rZ   fn_var_getattr1  s   
r   c                   @   s\   e Zd Zdd Zdd Z							
		dddZdddedefddZdd Z	dd Z
dS )BaseUserFunctionVariablec                 C   
   |   jS rk   get_codeco_filenamerU   rY   rY   rZ   get_filenameJ     
z%BaseUserFunctionVariable.get_filenamec                 C   r   rk   r   co_namer   rY   rY   rZ   get_nameM  r   z!BaseUserFunctionVariable.get_namer|   r;   rq   list[VariableTracker]r~   dict[str, VariableTracker]rj   r5   c                 C   s   | | g |  ||S rk   )inline_user_function_return	self_argsrU   r|   rq   r~   rY   rY   rZ   call_functionP  s   z&BaseUserFunctionVariable.call_functionr   c                 C   sL   d}z	t |  |}W n ty   |dkrt| trd}Y nw tj|S )NFrg   T)hasattrget_functionNotImplementedErrorr   NestedUserFunctionVariabler   r7   rv   rU   r|   r   r   rY   rY   rZ   call_obj_hasattrX  s   z)BaseUserFunctionVariable.call_obj_hasattrc                 C   s   t t|  jS rk   )r{   r   	signaturer   
parametersr   rY   rY   rZ   inspect_parameter_namesd     z0BaseUserFunctionVariable.inspect_parameter_namesc                 C      i S rk   rY   rU   r|   rY   rY   rZ   closure_varsg     z%BaseUserFunctionVariable.closure_varsNr|   r;   rq   r   r~   r   rj   r5   )rg   rh   ri   r   r   r   strr5   r   r   r   rY   rY   rY   rZ   r   I  s*    

r   c                       s   e Zd ZdZddhejZedd Zd+d, 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dd Zdeeef fddZdddefd d!Zdddedefd"d#Z			$	%	&	'		(d- fd)d*Z  ZS ).UserFunctionVariablez-Some unsupported user-defined global functionr   is_constantc                 C      t |tj | ||dS Nr   )r!   
make_guardr    CLOSURE_MATCHclsvaluer   rY   rY   rZ   create_with_sourcet  s   z'UserFunctionVariable.create_with_sourceFrj   Nc                    sr   t  jd	i | t|ddrd| _nd| _t|tjtjj	fs-t
d| ddgtjd t|d|}|| _d S )
N_dynamo_marked_constantFTz1can't handle functions not implemented in python z2Dynamo can only handle functions defined in pythonz9Move usage of this function out of `torch.compile` regiongb_typecontextexplanationhints_torchdynamo_inlinerY   )superr[   r   r   r   r   r   torchjitScriptFunctionr   r   INFERENCE_MODEr   r   r   rU   r   r   r~   	__class__rY   rZ   r[   y  s    
zUserFunctionVariable.__init__c                    s   t | tr| jS t  S rk   )r/   r   r   r   as_python_constantr   r   rY   rZ   r     s   

z'UserFunctionVariable.as_python_constantc                 C      g S rk   rY   r   rY   rY   rZ   r     r   zUserFunctionVariable.self_argsc                 C      | j S rk   r   r   rY   rY   rZ   r        z!UserFunctionVariable.get_functionc                 C      | j jS rk   )r   rD   r   rY   rY   rZ   r        zUserFunctionVariable.get_codec                 C      t jS rk   r   r   r   rY   rY   rZ   python_type  r   z UserFunctionVariable.python_typec                 C   s   t | jdd d uS N__self__)r   r   r   rY   rY   rZ   has_self     zUserFunctionVariable.has_selfc                 C   r   rk   )r   r   r   rY   rY   rZ   get_globals  r   z UserFunctionVariable.get_globalsc                 C   s    | j }|rt| tjr| j}|S rk   )r   r   r   UserMethodVariable	source_fn)rU   r   rY   rY   rZ   
get_source  s   zUserFunctionVariable.get_sourcec              	   C   sV  | j rJ | j}t|tstd|jj}|  }t|||||}t	|||j
 | jjp-d}t|t| jj
jks;J tt | jj
j|D ]b\}	}
}|jj}||v rX|| }nL|rtt||	}t|d}z
t||j|}W n ty}   t }Y nw ||||}nz	t||j}W n ty   t }Y nw |d||}|||
< qF|S )z
        Assume `args` and `kwargs` are VariableTracker arguments for a call to
        this function, create new bindings for initial locals.
        z'Only supports regular Python functions.rY   cell_contentsN)r   r   r   r   ru   r   root_txr   r   r   rD   r   rc   co_freevarsrb   r   countr   r&   r#   r"   r5   r   r   
ValueErrorr   DeletedVariabletrack_cell_existing)rU   r   rq   r~   r   r   r   r   r   r   r   cellr   cell_varclosure_cellclosure_cell_contentscontents_varrY   rY   rZ   	bind_args  sJ   




zUserFunctionVariable.bind_argsr|   r;   r   c                 C   s,   |t v r
t| |S |  }t|| j||S rk   )r*   r   GetAttrVariabler   r   r   )rU   r|   r   r   rY   rY   rZ   var_getattr  s   z UserFunctionVariable.var_getattrc                 C   s   t | j|}tj|S rk   )r   r   r   r7   rv   r   rY   rY   rZ   r     s   z%UserFunctionVariable.call_obj_hasattrrq   r   r~   r   r5   c              
      s  | j tjju r?z dd |D }dd | D }tjj|i |j}t|W S  ty> } zt	d| d| |d }~ww | j tjj
u r~z t| j j|i |}|jd  }	t|	tsaJ t|	W S  ty} } zt	d| d| |d }~ww | j tjju rt| j j|i |}|jd	 }
t|
ts|
 }d
|j d}tdd| j d| d| d|g tjd t|
ts|
 }d| d}td|  |d| ddgd |
j }tj|ddS | j rt!|| j |  ||S |j"j#j$s!| j tjj%j&u r!tjj'(| t) *|||W  d    S 1 sw   Y  |j"j#j+rq|j"j#j,sqzd	dl-m.} W n tyA   d }Y nw |d urq| j |j/|j0fv rqtjj',| t) *|||W  d    S 1 slw   Y  t) *|||S )Nc                 S      g | ]}|  qS rY   r   .0argrY   rY   rZ   
<listcomp>      z6UserFunctionVariable.call_function.<locals>.<listcomp>c                 S      i | ]	\}}||  qS rY   r  )r  keyr   rY   rY   rZ   
<dictcomp>  s    z6UserFunctionVariable.call_function.<locals>.<dictcomp>zCannot convert patch_dynamo_config args/kwargs to constants. Please fix your call to patch_dynamo_config by using simpler inputs. args: z
, kwargs: error_on_graph_breakz\Improper error_on_graph_break() call. Please fix your call to error_on_graph_break(). args: r   z=`nonstrict_trace` expects a callable, but got value of type <>zTypeError from user codezcall_function(, )r   z(Applying `nonstrict_trace` to function <zk>; however, `nonstrict_trace` currently requires the function to be defined outside `torch.compile` region.zLimitation of `nonstrict_tracezmake sure definition of z is outside z`torch.compile` regionTnonstrict_traceable)	FSDPState)1r   r   _dynamopatch_dynamo_configr   changesr   DynamoConfigPatchVariabler2   RuntimeErrorr  r   r   bind	argumentsr   r   boolErrorOnGraphBreakVariable	Exceptionnonstrict_tracerq   r   r   rg   r   r   r   
USER_ERRORr   r   TorchInGraphFunctionVariabler   invoke_and_store_as_constantr   current_tracer,unsafe_allow_externally_visible_side_effectsutils8_disable_side_effect_safety_checks_for_current_subtracerr   2allow_externally_visible_side_effects_in_subtracerr   r   under_activation_checkpoint#allow_side_effects_under_checkpoint/torch.distributed.fsdp._fully_shard._fsdp_stater  _pre_forward_post_forward)rU   r|   rq   r~   
args_constkwargs_constr  er?   r  fn_vartypmsgfn_namer   r  r   rY   rZ   r     s   


	

""z"UserFunctionVariable.call_functionFrj   Nr   )rg   rh   ri   r   r   _nonvar_fieldsclassmethodr   r[   r   r   r   r   r   r   r   r   ra   r   r5   r  r	  r   r   __classcell__rY   rY   r   rZ   r   k  sH    
7
r   c                       sF   e Zd Zdd fddZedd Z				
					dddZ  ZS )BuiltinMethodVariableFrj   Nc                    s,   t  jdi | t|tjsJ || _d S r\   )r   r[   r   r   BuiltinMethodTyper   r   r   rY   rZ   r[   Z  s   
zBuiltinMethodVariable.__init__c                 C   s0   | j }| j}|tu r|dkpt|tu o|dkS )N__new____contains__)r   rg   rz   type	frozenset)objmethod_selfmethod_namerY   rY   rZ   is_supported_builtin_method_  s
   z1BuiltinMethodVariable.is_supported_builtin_methodr|   r;   rq   r   r~   r   r5   c                 C   s@   | j j}| j j}| jot| jd}t|||}|||||S r   )r   r   rg   r   r"   r5   r   call_method)rU   r|   rq   r~   rF  r   
obj_sourceobj_vtrY   rY   rZ   r   j  s
   z#BuiltinMethodVariable.call_functionr:  r;  r   )rg   rh   ri   r[   staticmethodrH  r   r>  rY   rY   r   rZ   r?  Y  s    

r?  c                
       s  e Zd Zdejded f fddZdd Zdd	 Zd
d Z	dd Z
dd Zdd Z dd ZeZd=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&ejfd'd(Zd&ee fd)d*Zd>d,d-Zd.d/ Zd0d1 Zd2d3 Zd4dd5e d6d7d8d9d&d:f
 fd;d<Z!  Z"S )?LocalGeneratorObjectVariablerV   inline_tracerr;   c                    s(   t  jdi | || _|| _|| _d S r\   )r   r[   rV   r   rN  )rU   rV   r   rN  r~   r   rY   rZ   r[   x  s   
z%LocalGeneratorObjectVariable.__init__c                 C   r   rk   )rV   r   rY   rY   rZ   r     r   z%LocalGeneratorObjectVariable.get_codec                 C   r   rk   r   r   rY   rY   rZ   r     r   z)LocalGeneratorObjectVariable.get_filenamec                 C   r   rk   r   r   rY   rY   rZ   r     r   z%LocalGeneratorObjectVariable.get_namec                 C   s   t rk   )r   r   rY   rY   rZ   r     r   z)LocalGeneratorObjectVariable.get_functionc                 C      dS NFrY   r   rY   rY   rZ   r     r   z%LocalGeneratorObjectVariable.has_selfc                 C      |   S rk   )r   r   rY   rY   rZ   rg     r   z%LocalGeneratorObjectVariable.__name__c                 C   s   | j j d|   dS )N(r  )r   rg   r   r   rY   rY   rZ   __str__  s   z$LocalGeneratorObjectVariable.__str__codegenr9   c              
   C   s   ddl m} ddlm}m}m} | }||}||}||}	|L |1 |	 | |}
|
js7| 	|| _
t| j
| W d    n1 sJw   Y  W d    n1 sYw   Y  W d    d S W d    d S 1 sqw   Y  d S )Nr   )"disallow_side_effects_in_generator)r;    save_and_restart_speculation_log(temporarely_allow_writes_to_output_graph)torch._dynamo.side_effectsrU  torch._dynamo.symbolic_convertr;   rV  rW  
current_tx_get_inline_tracergenerator_exhaustedforce_unpack_var_sequenceremaining_itemsr   ListIteratorVariablereconstruct)rU   rT  rU  r;   rV  rW  r|   savedisallowtemptracerrY   rY   rZ   r`    s   
P z(LocalGeneratorObjectVariable.reconstructc                 C   s   | j |||S rk   )r   r  r   rY   rY   rZ   r       z&LocalGeneratorObjectVariable.bind_argsc                 C   r   rk   r   r   rY   rY   rZ   r     r   z(LocalGeneratorObjectVariable.get_globalsc                 C   r   rk   )r   GeneratorTyper   rY   rY   rZ   r     r   z(LocalGeneratorObjectVariable.python_typec                 C   s.   ddl m} | jd u r||| g i | _| jS Nr   )InliningInstructionTranslator)rY  ri  rN  build_inline_tracer)rU   r|   ri  rY   rY   rZ   r[    s   
z/LocalGeneratorObjectVariable._get_inline_tracerc                 C   s  |  |}|  rtt| ziz,ttdtd i | W  d    W W td  td O  < S 1 s5w   Y  W n/ tyL } zd|_	|d }~w t
yS     tyj } ztjj|   t|d }~ww W td  td O  < d S td  td O  < w )Nunimplementedinline_callT)r[  _is_generator_exhaustedr   StopIterationr   ra   r+   inline_call_r   r\  r   r   r   r  
eval_frame	skip_coder   r   )rU   r|   rd  r5  rY   rY   rZ   next_variable  s,   

.z*LocalGeneratorObjectVariable.next_variablec                 C   s"   ||   jv rtdS tdS )NTF)r   __dict__r7   rv   rU   r|   r   rY   rY   rZ   r     s   

z-LocalGeneratorObjectVariable.call_obj_hasattrc                 C   rO  rP  rY   r   rY   rY   rZ   has_unpack_var_sequence  r   z4LocalGeneratorObjectVariable.has_unpack_var_sequencerj   c                 C   rO  NTrY   r   rY   rY   rZ   has_force_unpack_var_sequence  r   z:LocalGeneratorObjectVariable.has_force_unpack_var_sequencec                 C   s   g }|  ||j |S rk   )force_apply_to_var_sequenceappend)rU   r|   r   rY   rY   rZ   r]    s   z6LocalGeneratorObjectVariable.force_unpack_var_sequenceNc                 C   s4   	 z	||  | W n ty   t| Y d S w qrk   )rr  r   r   )rU   r|   r   rY   rY   rZ   rx    s   z8LocalGeneratorObjectVariable.force_apply_to_var_sequencec              
   C   sL   |  |}z|| W d S  ty% } z|| W Y d }~d S d }~ww rk   )r[  _raise_exception_variabler   exception_handler)rU   r|   excrd  r5  rY   rY   rZ   _setup_exception  s   
z-LocalGeneratorObjectVariable._setup_exceptionc                 C   s   | j d u p
| j jdkS )Nr   )rN  instruction_pointerr   rY   rY   rZ   _is_generator_just_started  s   z7LocalGeneratorObjectVariable._is_generator_just_startedc                 C      t | jddS )Nr\  F)r   rN  r   rY   rY   rZ   rm    s   z4LocalGeneratorObjectVariable._is_generator_exhaustedr|   r   rq   r   r~   r   r5   c              	      s.  |dkr	|  |S |dkr| S |dkr8|  r)t|r)tdd |D s)tt| | |}|| |  |S |dkr| |}|  sI|  rQd|_	t
d S z | |t
td tjd	krp|jjd
krpd|_	t
d W S W n ty   d|_	t
d  Y S w z|  |rtt| W n| ty   d|_	t
d  Y S  ty   |jd usJ |j Y S w |dkr| |}z| |t|dkr|d n|d  W n ty    w |  |}tdtfi }z| |t
|d |  | W n t|y   Y |S w tt| |S t |||| d S )N__next____iter__sendc                 s   s$    | ]}t |to|jd u V  qd S rk   )r   r7   r   r  rY   rY   rZ   	<genexpr>  s
    
z;LocalGeneratorObjectVariable.call_method.<locals>.<genexpr>closeTrY   )      CALL_INTRINSIC_1throwr  r1   r   __InternalThrowException)rr  r  rc   allr   ru   r[  	push_manyrm  r\  r   r7   r}  ExceptionVariableGeneratorExitsysversion_infonext_instructionopnamer   r  r   symbolic_resultr   rC  r$  r   r   rI  )rU   r|   r   rq   r~   rd  retvalexc_typer   rY   rZ   rI    sz   












(
>
z(LocalGeneratorObjectVariable.call_methodrT  r9   r;  )#rg   rh   ri   r   CodeTyper   r[   r   r   r   r   r   rS  __repr__r`  r  r   r   r[  rr  r   ru  builtinsr"  rw  r{   r5   r]  rx  r}  r  rm  r   rI  r>  rY   rY   r   rZ   rM  w  sN    
	
	rM  c                   @   s   e Zd ZdZdS )4ContextlibContextManagerLocalGeneratorObjectVariablez
    .. note::

        This is only used when the function is annotated with @contextlib.contextmanager

        It is a special case of a generator function as we do not allow return a context manager
        from a torch.compile function.
    N)rg   rh   ri   r   rY   rY   rY   rZ   r    s    r  c                       sV   e Zd ZdZeddef fddZdd Zdd	 Z	
							dddZ	  Z
S )LocalGeneratorFunctionVariablezxfunctions that behaves like iterators

    .. note::

        This is a wrapper around (Nested)UserFunctionVariable
    )generator_clsvtc                   "   t  jdi | || _|| _d S r\   )r   r[   r  r  )rU   r  r  r~   r   rY   rZ   r[     s   
z'LocalGeneratorFunctionVariable.__init__c                 C   s&   || j j v rt| |S t| j|S rk   )r   rs  keysr   r  )rU   r   rY   rY   rZ   __getattr__  s   
z*LocalGeneratorFunctionVariable.__getattr__c                 C   s   ddl m} ||| ||S rh  )rY  ri  rj  )rU   r|   rq   r~   ri  rY   rY   rZ   _build_inline_tracer  s   z3LocalGeneratorFunctionVariable._build_inline_tracerr|   r;   rq   r   r~   r   rj   r5   c                 C   sb   t | j stdt| j dddgd | |||}| j }| j }| j|||| jdS )Nz'non-generator contextlib.contextmanagerzvCannot compile function decorated with `@contextlib.contextmanager` that is not a generator, i.e. does not use `yield`z5Use `yield` in the function body instead of `return`.z2Remove the `@contextlib.contextmanager` decorator.r   r   )	r   r  r   r   r   r  r   r  r   )rU   r|   rq   r~   rN  rV   r   rY   rY   rZ   r     s$   

z,LocalGeneratorFunctionVariable.call_functionr   )rg   rh   ri   r   rM  r5   r[   r  r  r   r>  rY   rY   r   rZ   r    s"    
r  c                       s,   e Zd ZdZ fddZ fddZ  ZS )3FunctionDecoratedByContextlibContextManagerVariablezm
    .. note::

        This is only used when the function is annotated with @contextlib.contextmanager
    c                    s   t  j|fdti| d S )Nr  )r   r[   r  )rU   r  r~   r   rY   rZ   r[     s   
z<FunctionDecoratedByContextlibContextManagerVariable.__init__c                    s.   t  |||}t|tjjjsJ d|_|S rv  )r   r  r   r   r  symbolic_convert&InliningGeneratorInstructionTranslatoris_generator_from_ctx_manager)rU   r|   rq   r~   rd  r   rY   rZ   r    s   zHFunctionDecoratedByContextlibContextManagerVariable._build_inline_tracer)rg   rh   ri   r   r[   r  r>  rY   rY   r   rZ   r  
  s    r  c                       s   e Zd ZdZdd fddZdefddZdd	 Zd
d Z								d fddZ	 fddZ
dddef fddZ  ZS )r   z$Some unsupported user-defined methodNrj   c                    sV   t  jdd|i| || _|| _|d u r'|dd ur)t|dd| _d S d S d S )Nr   r   __func__rY   )r   r[   rE  r   rm   r"   )rU   r   rE  r   r~   r   rY   rZ   r[   +  s   zUserMethodVariable.__init__c                 C   s   | j j d| j d| j dS )NrR  r  r  )r   rg   r   rE  r   rY   rY   rZ   r  >  s   zUserMethodVariable.__repr__c                 C      | j gS rk   rE  r   rY   rY   rZ   r   A  r   zUserMethodVariable.self_argsc                 C   r   rk   )r   
MethodTyper   rY   rY   rZ   r   D  r   zUserMethodVariable.python_typer|   r;   rq   r   r~   r   r5   c           	         s  ddl m} || jr"g |  |}tj| jdd}||||S |j rTt	| j
tjrTt| jdd}|d urB|drB|dksE| jrS| j
j|| jj||| jd	S ntd uro| jtjju rot| j|| j
g|R |S | jrt| j
j| jj}t|||  ||S t |||S )
Nr   )is_nonstrict_trace_callableTr  rh    z	torch.nn.ztorch.nn.utils.parametrize)constant)trace_rulesr  r   r   r   r'  r   r   is_root_tracerr   rE  NNModuleVariabler   
startswithr   rI  rg   r8   FSDPParamGroupuse_training_stateTorchCtxManagerClassVariabler   r(  r   r   )	rU   r|   rq   r~   r  	call_argsvarmodule_attrr   r   rY   rZ   r   G  s<   
z UserMethodVariable.call_functionc                    s   t   dd  S Nr1   )r   r   r   r   rY   rZ   r     r   z*UserMethodVariable.inspect_parameter_namesr   c                    s6   |dkr| j S |dkrt|| j| jS t ||S )Nr   r  )rE  r5   r   r   r   r   r	  rt  r   rY   rZ   r	    s
   zUserMethodVariable.var_getattrrk   r;  r   )rg   rh   ri   r   r[   r   r  r   r   r   r   r	  r>  rY   rY   r   rZ   r   (  s"    =r   c                       D   e Zd Zd fddZ							
		d fddZdd Z  ZS )WrappedUserMethodVariablerj   Nc                    sB   | dd  | dd  t j|j|jfi | || _|| _d S )Nr   rE  )rw   r   r[   r   rE  wrappedr   rU   r  r   r~   r   rY   rZ   r[     s
   
z"WrappedUserMethodVariable.__init__r|   r;   rq   r   r~   r   r5   c                    ,   | j | t |||}| j | |S rk   r   enterr   r   exitrU   r|   rq   r~   r   r   rY   rZ   r        z'WrappedUserMethodVariable.call_functionc                    2      fdd  j  tdd d S )Nc                      
    j S rk   r   rY   rT  rU   rY   rZ   <lambda>     
 z7WrappedUserMethodVariable.reconstruct.<locals>.<lambda>r1   Fadd_push_nullr  extend_outputr   rU   rT  rY   r  rZ   r`       
z%WrappedUserMethodVariable.reconstructr;  r   rg   rh   ri   r[   r   r`  r>  rY   rY   r   rZ   r        r  c                       r  )WrappedUserFunctionVariablerj   Nc                    s2   | dd  t j|jfi | || _|| _d S )Nr   )rw   r   r[   r   r  r   r  r   rY   rZ   r[     s   
z$WrappedUserFunctionVariable.__init__r|   r;   rq   r   r~   r   r5   c                    r  rk   r  r  r   rY   rZ   r     r  z)WrappedUserFunctionVariable.call_functionc                    r  )Nc                      r  rk   r  rY   r  rY   rZ   r    r  z9WrappedUserFunctionVariable.reconstruct.<locals>.<lambda>r1   Fr  r  rY   r  rZ   r`    r  z'WrappedUserFunctionVariable.reconstructr;  r   r  rY   rY   r   rZ   r    s    r  c                    sT   dd   fdd|D } fdd|  D }||i |}| jj||t|dS )Nc                 S   s   t | tjr
|  S |  S rk   )r   r   TensorVariableget_real_valuer   )xrY   rY   rZ   convert  s   z-invoke_and_store_as_constant.<locals>.convertc                    s   g | ]} |qS rY   rY   r  r  r  rY   rZ   r    r  z0invoke_and_store_as_constant.<locals>.<listcomp>c                    s   i | ]	\}}| |qS rY   rY   r  r   r   r  rY   rZ   r        z0invoke_and_store_as_constant.<locals>.<dictcomp>r   )r   r   register_attr_or_moduler$   )r|   r   r   rq   r~   resrY   r  rZ   r(    s   r(  c                       s   e Zd ZdhejZ	d$	d% fddZdd Zdd	 Zd
d Zdd Z	ddde
de
fddZ fddZdd Z fddZdd Zdd Zdd Zd&d"d#Z  ZS )'r   r   Nrj   c	           
         s   |	 dd u r|	jt d t jdi |	 t| ts J t| tj	s*J t|t
s1J || _|| _|| _|| _|| _|| _|| _|| _d S )Nmutation_typer  rY   )rm   updater3   r   r[   r   r   r   r   r  ra   r9  rV   r   r^   r`   r   r   
wrapped_fn)
rU   r9  rV   r   r^   r`   r   r   r  r~   r   rY   rZ   r[     s   
z#NestedUserFunctionVariable.__init__c                 C   r   rk   rY   r   rY   rY   rZ   r     r   z$NestedUserFunctionVariable.self_argsc                 C   s
   | j  S rk   )rV   r   r   rY   rY   rZ   r     r   z#NestedUserFunctionVariable.get_codec                 C   r   rk   r   r   rY   rY   rZ   r     r   z&NestedUserFunctionVariable.python_typec                 C   s   | j rtt| j | j| j }| jr| j |_	| j
r%| j
 |_| jrH| j }t|tr>ddlm} t||}t|tsEJ ||_|S )Nr   r   )r   r   r   r   rV   r   r   r9  r^   r]   r`   r_   r   r   rz   r   r   ra   r   )rU   rC   r   r   rY   rY   rZ   r     s&   

z'NestedUserFunctionVariable.get_functionr|   r;   name_varr   c                 C   s   |j j| |j| td S rk   )r   r   
store_attrr   r7   )rU   r|   r  r   rY   rY   rZ   call_setattr  s   z'NestedUserFunctionVariable.call_setattrc                    s,   |dkr| j |g|R  S t ||||S )N__setattr__)r  r   rI  rU   r|   r   rq   r~   r   rY   rZ   rI     s   z&NestedUserFunctionVariable.call_methodc                 C   s
   | j d uS rk   )r   r   rY   rY   rZ   has_closure%  r   z&NestedUserFunctionVariable.has_closurec                    s    |dkr	| j  S t ||S )Nrg   )r9  r   r   const_getattrrt  r   rY   rZ   r  (  s   
z(NestedUserFunctionVariable.const_getattrc                 C   rO  rP  rY   r   rY   rY   rZ   r   -  r   z#NestedUserFunctionVariable.has_selfc                 C   r   rk   rf  r   rY   rY   rZ   r   0  r   z&NestedUserFunctionVariable.get_globalsc                 C   s   |   }t|| j| j | jrt| jjnd tdd t	t
|   jD }| jr1| j |_t|j|i |}|  t|j }t|jj| t||| t|jD ]\}}	|	|vscJ | jj| }
|
||	< qY|S )Nc                 s   s    | ]}t d V  qd S rk   )r0   )r  _rY   rY   rZ   r  :      z7NestedUserFunctionVariable.bind_args.<locals>.<genexpr>)r   r   r   r   r9  r   r^   rz   r   rd   rc   r   r`   keys_as_python_constantr_   r   r   r   apply_defaultsra   r!  r   r   r   r   rs   r   )rU   r   rq   r~   rV   rC   r?   r   r   r   r  rY   rY   rZ   r  3  s(   
z$NestedUserFunctionVariable.bind_argsrT  r9   c                    s     fdd  | j   | jg  t| jjj | j	r+ | j	 n	  
d g | jr= | j n	  
d g | jrO | j n	  
d g | jrzz| j }  |g W n tyy    | j Y n
w   
d g  tdd | jr   fdd  | j  tdd  td  tdd d	d
lm} | }|jj| r|jjj|   D ]\}}    |  td  | qd S d S )Nc                      s     tdS )Nr   )load_import_fromrg   rY   rT  rY   rZ   r  M      z8NestedUserFunctionVariable.reconstruct.<locals>.<lambda>   Fc                           ddS )N	functoolswrapsr  rY   r  rY   rZ   r  q  r  r1   r   Tr   r:   )r  rV   r  create_load_const_uncheckedr   r7   rv   r   r   r^   create_load_constr   r`   r   r   r   r   r  r   rY  r;   rZ  r   r   has_pending_mutationstore_attr_mutationsr   dup_topr  )rU   rT  r   r;   r|   r   r   rY   r  rZ   r`  K  s`   






z&NestedUserFunctionVariable.reconstructrk   r;  r  )rg   rh   ri   r   r<  r[   r   r   r   r   r5   r  rI  r  r  r   r   r  r`  r>  rY   rY   r   rZ   r     s6    
	r   c                       r  )!WrappedNestedUserFunctionVariablerj   Nc              
      s   | dd  | dd  | dd  | dd  | dd  | dd  | dd  | dd  t |j|j|j|j|j|j|j	|j
 || _|| _d S )	Nr9  rV   r   r^   r`   r   r   r  )rw   r   r[   r9  rV   r   r^   r`   r   r   r  r  r   r  r   rY   rZ   r[     s(   

z*WrappedNestedUserFunctionVariable.__init__r|   r;   rq   r   r~   r   r5   c                    r  rk   r  r  r   rY   rZ   r     r  z/WrappedNestedUserFunctionVariable.call_functionc                    r  )Nc                      r  rk   r  rY   r  rY   rZ   r    r  z?WrappedNestedUserFunctionVariable.reconstruct.<locals>.<lambda>r1   Fr  r  rY   r  rZ   r`    r  z-WrappedNestedUserFunctionVariable.reconstructr;  r   r  rY   rY   r   rZ   r    s    r  c                       sx   e Zd ZddhejZdd fddZdd Zed	d
 Z								dddZ	dddZ
dddefddZ  ZS )SkipFunctionVariabler   reasonNrj   c                    r  r\   )r   r[   r   r  )rU   r   r  r~   r   rY   rZ   r[        
zSkipFunctionVariable.__init__c                 C   r   rk   r   r   rY   rY   rZ   r     r   z'SkipFunctionVariable.as_python_constantc                 C   sp   t |ddr&|}|}t|ddr|j}t|d}t|dds|tj nt|s2t	|tj | ||dS )N_torchdynamo_disableF_torchdynamo_orig_callabler   )
r   r   r   r  r"   r   r    r   r.   r!   )r   r   r   guard_on_sourceguard_on_valuerY   rY   rZ   r     s   z'SkipFunctionVariable.create_with_sourcer|   r;   rq   r   r~   r   r5   c              	   C   s  t | jddr&t | jdd }tdt| jd| j d| ddgd	 d S | jtjju rN|d
d }|r9|	 }tdd| d| dd| dgd	 d S | jtjj
u rh|d
d }|ra|	 }td| tjrddlm} ||| j}t|ts||||S t| jdd}	t| jdd }
|
d u rdnt|
}z&t | j}d|	 d| d}d|	 dg}d|vr|d|	 dd g7 }W na ty#   d!d"h}|
|v rd#| d$|	 d}d%d&g}nA|
d ur|
d'rd(| d$|	 d$}d)g}tjj|d* d*|  nd+| d$|	 d,}d-d.g}tjj|d* d*|  Y nw |	d/kr-d0}g }| jr4| jnd1}td2d3| d4|	 d5| ||d	 d S )6Nr  F_torchdynamo_disable_msgz1Skip calling `torch.compiler.disable()`d functionzSkip calling function `z>` since it was wrapped with `torch.compiler.disable` (reason: r  z(Remove the `torch.compiler.disable` callr   r8  z%Call to `torch._dynamo.graph_break()`z0Called `torch._dynamo.graph_break()` with args `z`, kwargs ``z$User-inserted graph break. Message: z.Remove the `torch._dynamo.graph_break()` call.z9Skip frame due to `torch._dynamo.skip_frame()`. Message: r1   SourcelessBuilderri   z<unknown qualname>rh   z<unknown module>z?Dynamo developers have intentionally marked that the function `z` in file `z` should not be traced.zAvoid calling the function `z`.r  z:Apply `@torch._dynamo.dont_skip_tracing` to the function `zw` to force tracing into the function. More graph breaks may occur as a result of attempting to trace into the function.z Please file an issue to PyTorch._abc	_warningsz6Dynamo does not know how to trace the Python builtin `.zIf you are attempting to call a logging function (e.g. `_warnings.warn`), you can try adding it to `torch._dynamo.config.reorderable_logging_functions`.zKPlease file an issue on GitHub so the PyTorch team can add support for it. optreez*Dynamo cannot trace optree C/C++ function zi Consider using torch.utils._pytree - https://github.com/pytorch/pytorch/blob/main/torch/utils/_pytree.py
z/Dynamo does not know how to trace the builtin `z.` This function is either a Python builtin (e.g. _warnings.warn) or a third-party C/C++ Python extension (perhaps created with pybind).zIf it is a Python builtin, please file an issue on GitHub so the PyTorch team can add support for it and see the next case for a workaround.a  If it is a third-party C/C++ Python extension, please either wrap it into a PyTorch-understood custom operator (see https://pytorch.org/tutorials/advanced/custom_ops_landing_page.html for more details) or, if it is traceable, use `torch.compiler.allow_in_graph`.allow_in_graphzFound an allow_in_graph decorator to a function which is created inside the parent function that is getting compiled. This is not supported for now.z<missing reason>z,Attempted to call function marked as skippedzmodule: z, qualname: z, skip reason: )r   r   r   r   r   r   r  graph_breakrm   r   
skip_framer   r   dont_skip_tracingbuilderr  rv   r   r  r   r   getfileru   r  r+  	warn_oncejoinr  )rU   r|   rq   r~   r8  graph_break_msgskip_frame_msgr  
rebuilt_fnqualname	module_ormodule_namepathr   r   known_python_builtin_modulesr  rY   rY   rZ   r     s   

	





&
z"SkipFunctionVariable.call_functionc                 C   s   t jt| j|S rk   )r   r7   rv   r   r   rt  rY   rY   rZ   r   N  r   z%SkipFunctionVariable.call_obj_hasattrr   c                 C   s&   |t v r
t| |S t|| j| j|S rk   )r*   r   r  r   r   r   rt  rY   rY   rZ   r	  Q  s   z SkipFunctionVariable.var_getattrrk   r;  r   r|   r;   )rg   rh   ri   r5   r<  r[   r   r=  r   r   r   r   r	  r>  rY   rY   r   rZ   r    s*    


xr  c                       r  )WrappedSkipFunctionVariablerj   Nc                    sD   | dd  | dd  t j|jfd|ji| || _|| _d S )Nr   r  )rw   r   r[   r   r  r  r   r  r   rY   rZ   r[   Y  s
   
z$WrappedSkipFunctionVariable.__init__r|   r;   rq   r   r~   r   r5   c                    r  rk   r  r  r   rY   rZ   r   `  r  z)WrappedSkipFunctionVariable.call_functionc                    r  )Nc                      r  rk   r  rY   r  rY   rZ   r  l  r  z9WrappedSkipFunctionVariable.reconstruct.<locals>.<lambda>r1   Fr  r  rY   r  rZ   r`  k  r  z'WrappedSkipFunctionVariable.reconstructr;  r   r  rY   rY   r   rZ   r  X  r  r  c                       sR   e Zd ZdZd fddZd fdd	Zd
d Z								dddZ  ZS )WrapperUserFunctionVariablea3  
    Used to represent a wrapper object that contains the actual callable as an
    attribute. For example, torch.jit.script/trace have the original function at
    their _torchdynamo_inline attribute. Similarly, functions with
    __script_if_tracing_wrapper have the original attr at "__original_fn".
    rj   Nc                    r  r\   )r   r[   wrapper_objattr_to_trace)rU   r  r  r~   r   rY   rZ   r[   y  r  z$WrapperUserFunctionVariable.__init__r|   r;   c                    sF   || j krt| j| j }| jot| j|}t|||S t ||S rk   )	r  r   r  r   r"   r5   r   r   r	  )rU   r|   r   r   r   r   rY   rZ   r	  ~  s
   
z'WrapperUserFunctionVariable.var_getattrc                 C   r   rk   rY   r   rY   rY   rZ   r     r   z%WrapperUserFunctionVariable.self_argsrq   r   r~   r   r5   c                 C   s  t | jdrmt| j| jd }t|ddpd}|jdddd dkrmd	}tjj| tjjj	
d
}|t	jrmtjj }t | }|d j|d jf}	dt|}
d|	d  d|	d  d}|t|
7 }|| |  | }ttj|| t| jg||S )N
cache_inforh   r  r  r1   )maxsplitr   r   a  Dynamo detected a call to a `functools.lru_cache`-wrapped function. Dynamo ignores the cache wrapper and directly traces the wrapped function. Silent incorrectness is only a *potential* risk, not something we have observed. Enable TORCH_LOGS="+dynamo" for a DEBUG stack trace.ztorch._dynamoz)call to a lru_cache wrapped function at: :r  )r   r  r   r  splitr   r  r+  r  logging	getLoggerisEnabledForDEBUG_guardsTracingContextextract_stackr   filenamelinenor  	tracebackformat_listr   debugr   r   r   r   getattr_and_tracer   r7   )rU   r|   rq   r~   	target_fnr  r8  dynamo_logger
user_stack	frame_locuser_stack_formatteduser_stack_traceall_argsrY   rY   rZ   r     s4   

z)WrapperUserFunctionVariable.call_functionr;  r  r   )	rg   rh   ri   r   r[   r	  r   r   r>  rY   rY   r   rZ   r  q  s    r  c                       s*   e Zd ZdZd fddZdd Z  ZS )	WrapperUserMethodVariablez
    Similar to WrapperUserFunctionVariable, but for methods. The only delta is
    saving the vt for `self` object of the method which is then used by
    WrapperUserFunctionVariable in `call_function` method.
    rj   Nc                    s    t  j||fi | || _d S rk   )r   r[   rE  )rU   r  r  self_objr~   r   rY   rZ   r[     s   
z"WrapperUserMethodVariable.__init__c                 C   r  rk   r  r   rY   rY   rZ   r     r   z#WrapperUserMethodVariable.self_argsr;  )rg   rh   ri   r   r[   r   r>  rY   rY   r   rZ   r6    s    r6  c                  C   s   t j rddlm}  | S i S )Nr   traceable_collective_remaps)r   distributedis_available)torch.distributed._functional_collectivesr9  r8  rY   rY   rZ   _traceable_collective_remaps  s   
r=  c                 C   s>   t j s	J d|t  v sJ |j}| d}t||S )NzIllegal invocation.z)torch.distributed._functional_collectives)r   r:  r;  r=  valuesrg   import_sourcer"   )r|   r   
inner_namepath_sourcerY   rY   rZ   _traceable_collectives_source  s
   

rB  c                       sd   e Zd ZdZd fddZeddd	Zed
d ZedddZ								dddZ	  Z
S )!CollectiveFunctionRewriteVariablea  
    Some of the torch.distributed.* collective APIs are possible to rewrite to 'traceable' collectives.

    This class provides both a way to check if a function is remappable, and perform the remapping.

    In the case that a function is 'remappable' but only for some combinations of call-time arguments,
    we check the args at `call_function` time and fall back to graph-breaking if needed.  This is no worse
    than status-quo as we currently graph-break on all distributed.* collectives.
    rj   Nc                   s,   t  j|fi | t|tsJ || _d S rk   )r   r[   r   r   replacement_var)rU   r   rD  r~   r   rY   rZ   r[     s   
z*CollectiveFunctionRewriteVariable.__init__r|   r;   c                 K   s6   t | |\}}t |ft|fd|i||d|S )Nr   )rD  r   )rC  rewriter   )r|   old_fnr   optionsnew_fn
new_sourcerY   rY   rZ   rv     s   z(CollectiveFunctionRewriteVariable.createc                 C   s   t | o	| t v S rk   )r   
isfunctionr=  )variablerY   rY   rZ   can_rewrite  s   z-CollectiveFunctionRewriteVariable.can_rewritec                 C   s   t  | }|t| |fS rk   )r=  rB  )r|   r   rH  rY   rY   rZ   rE    s   
z)CollectiveFunctionRewriteVariable.rewriterq   r   r~   r   r5   c           	      C   s   dd l m} ddlm} t| j}t|j|i |j	}d}d|v rA|d 
 rAtd| j d|d|d| j g tjd	 | j|j|j|jfv rs|d
}|d urX|jn|jd
 j}||vritd| tj|| |d
< | j|||S )Nr   )REDUCE_OP_TO_STRrY   async_opz)async_op=True for distributed collectivesz, args=	, kwargs=z3`torch.compile` doesn't support `async_op=True for r   opzUnsupported all_reduce op: )torch.distributedr:  r<  rM  r   r   r   ra   r   r!  r   r   r   SUPPORTABLE
all_reducereduce_scatter_tensor_reduce_scatter_baserm   r   r   defaultr   r   r7   rv   rD  r   )	rU   r|   rq   r~   distrM  r   reduce_op_var	reduce_oprY   rY   rZ   r     s<   	
	

z/CollectiveFunctionRewriteVariable.call_functionr;  r  r   )rg   rh   ri   r   r[   rL  rv   rL  rE  r   r>  rY   rY   r   rZ   rC    s$    
	
rC  c                       s.   e Zd Z								d fd	d
Z  ZS )FunctoolsWrapsVariabler|   r;   rq   r   r~   r   rj   r5   c                    s6   |st  dkr fdd}t|S t | |S )Nr1   c                    s8   t | tjr| j d dS td|  dg tjd d S )Nr   )r  zfunctools.wrapsz]`torch.compile` can't trace `functools.wraps` on functions defined outside the compile regionr   )r   r   r   cloner   r   rR  r   rp   rY   rZ   r  2  s   
z3FunctoolsWrapsVariable.call_function.<locals>.wraps)rc   r   LambdaVariabler   r   )rU   r|   rq   r~   r  r   rp   rZ   r   *  s   
z$FunctoolsWrapsVariable.call_functionr   )rg   rh   ri   r   r>  rY   rY   r   rZ   rZ  )  s    rZ  c                   @   s.   e Zd Zdd Z									
dddZdS )CollectionsNamedTupleFunctionc                 C   r   rk   r   r   rY   rY   rZ   r   D  r   z0CollectionsNamedTupleFunction.as_python_constantr|   r;   rq   r   r~   r   rj   r5   c              
   C   s   t ||}|rHz| jdd |D i dd | D }W n" ty? } ztt||tttj	|j
d W Y d }~nd }~ww tj|t dS tdd|d	|d
g tjd d S )Nc                 S   r
  rY   r  r  rY   rY   rZ   r  Q  r  z?CollectionsNamedTupleFunction.call_function.<locals>.<listcomp>c                 S   r  rY   r  r  rY   rY   rZ   r  R  r  z?CollectionsNamedTupleFunction.call_function.<locals>.<dictcomp>rp   r  znamedtuple constructionzargs=rO  z?`torch.compile` only support certain input types for namedtupler   )r(   r   r   ru   r   rC  r{   mapr7   rv   rq   r   UserDefinedClassVariabler4   r   r   rR  )rU   r|   rq   r~   constant_argsr   r|  rY   rY   rZ   r   G  s6   


z+CollectionsNamedTupleFunction.call_functionNr   )rg   rh   ri   r   r   rY   rY   rY   rZ   r]  C  s    r]  c                       s   e Zd Zdeddf fddZdd Zd d
dZdd Z								d!ddZddde	defddZ
ddde	fddZdd Zdd Z  ZS )"FunctoolsPartialVariablerC   rj   Nc                    sP   t  jdi | || _t|tsJ || _t|tsJ || _t	t
| _d S r\   )r   r[   rC   r   r{   rq   ra   keywordsr  partialr,   
fake_value)rU   rC   rq   rb  r~   r   rY   rZ   r[   h  s   z!FunctoolsPartialVariable.__init__c                 C   r   rk   )r  rc  r   rY   rY   rZ   r   s  r   z$FunctoolsPartialVariable.python_typerT  r9   c                    s      fdd  | j | jr | j | js) tt| jd d d S  | j  t	| j
 }  t|t| j d |d d S )Nc                      r  )Nr  rc  r  rY   r  rY   rZ   r  w  r  z6FunctoolsPartialVariable.reconstruct.<locals>.<lambda>r1   F)r  rC   rq   foreachrb  r  r   rc   r>  rz   r  create_call_function_kw)rU   rT  r  rY   r  rZ   r`  v  s   
z$FunctoolsPartialVariable.reconstructc                 C   rQ  rk   r  r   rY   rY   rZ   r     r   z%FunctoolsPartialVariable.get_functionr|   r;   rq   r   r~   r   r5   c                 C   s(   | j | }i | j|}| j|||S rk   )rq   rb  rC   r   )rU   r|   rq   r~   merged_argsmerged_kwargsrY   rY   rZ   r     s   
z&FunctoolsPartialVariable.call_functionr   c                 C   s   t jttt|S rk   )r   r7   rv   r   r  rc  r,   rt  rY   rY   rZ   r     s   z)FunctoolsPartialVariable.call_obj_hasattrc                 C   s   | j ot| j |}|dkr| jS |dkrtj| j|dS |dkr1dd | j D }tj||dS |t	v r;t
| |S tt| d S )NrC   rq   r   rb  c                 S   s   i | ]
\}}t ||qS rY   )r7   rv   r  rY   rY   rZ   r    s    z8FunctoolsPartialVariable.var_getattr.<locals>.<dictcomp>)r   r"   rC   r   ListVariablerq   rb  r   ConstDictVariabler*   r  r   r   )rU   r|   r   r   r   rY   rY   rZ   r	    s   z$FunctoolsPartialVariable.var_getattrc                 C   :   t j| j gdd | jD R i dd | j D S )Nc                 S   r
  rY   r  r  rY   rY   rZ   r    r  z?FunctoolsPartialVariable.as_python_constant.<locals>.<listcomp>c                 S   r  rY   r  r  rY   rY   rZ   r    r  z?FunctoolsPartialVariable.as_python_constant.<locals>.<dictcomp>)r  rc  rC   r   rq   rb  r   r   rY   rY   rZ   r     s   z+FunctoolsPartialVariable.as_python_constantc                 C   rk  )zcSimilar to as_python_constant(), but add ID_MATCH guards to try to force things to become constantsc                 S   r
  rY   guard_as_python_constant)r  r   rY   rY   rZ   r    r  zEFunctoolsPartialVariable.guard_as_python_constant.<locals>.<listcomp>c                 S   r  rY   rl  r  rY   rY   rZ   r    r  zEFunctoolsPartialVariable.guard_as_python_constant.<locals>.<dictcomp>)r  rc  rC   rm  rq   rb  r   r   rY   rY   rZ   rm    s   z1FunctoolsPartialVariable.guard_as_python_constantr  r   )rg   rh   ri   r5   r[   r   r`  r   r   r   r   r	  r   rm  r>  rY   rY   r   rZ   ra  g  s0    



ra  c                       s   e Zd ZdddhejZeejdee	de
f ejf fddZedd	 Zdedd
f fddZedefddZdd Zdd Z								d ddZ						d!ddZdd Z  ZS )"PolyfilledFunctionVariabler   r  traceable_fnrj   .c                 C   r   rk   rY   )r   rY   rY   rZ   _get_polyfill_handlers  s   z1PolyfilledFunctionVariable._get_polyfill_handlersc                 C   r   r   )r!   r   r    FUNCTION_MATCHr   rY   rY   rZ   r     s   z-PolyfilledFunctionVariable.create_with_sourceNc                    s   t  jdi | || _|  ||}t|s"J d| d| dD ]}t||d }|r8t|s4J |} n	q$td| d|| _|| _	d S )NzPolyfill handler z is not callable for )__torch_dynamo_polyfill____python_implementation__z# does not have a traceable functionrY   )
r   r[   r   rp  rm   callabler   r  r  ro  )rU   r   r~   handlercandidate_attr	candidatero  r   rY   rZ   r[     s    

z#PolyfilledFunctionVariable.__init__c                 C   r   rk   )ro  r   rY   rY   rZ   polyfill_fn  s   z&PolyfilledFunctionVariable.polyfill_fnc                 C   r  )N*__torch_dynamo_can_constant_fold_through__F)r   r  r   rY   rY   rZ   can_constant_fold_through     z4PolyfilledFunctionVariable.can_constant_fold_throughc                 C   rQ  rk   r  r   rY   rY   rZ   r     r   z'PolyfilledFunctionVariable.get_functionr|   r;   rq   r   r~   r   r5   c              
   C   s   |   r#t||r#| jdd |D i dd | D }t||S | jtju rot|dkro|sot	|d t
jt
jfrotdd |d jD rot
jj||jd	tjtd
d |d jD fi tdd |d jD dS t|| j}||||S )Nc                 S   r
  rY   r  r  rY   rY   rZ   r    r  z<PolyfilledFunctionVariable.call_function.<locals>.<listcomp>c                 S   r  rY   r  r  rY   rY   rZ   r    r  z<PolyfilledFunctionVariable.call_function.<locals>.<dictcomp>r1   r   c                 s   s@    | ]}t |tjrt |jtpt |tjo| tu V  qd S rk   )r   r   r7   r   intSymNodeVariabler   r  rY   rY   rZ   r    s    
z;PolyfilledFunctionVariable.call_function.<locals>.<genexpr>r   c                 s   s    | ]}|  V  qd S rk   as_proxy)r  arY   rY   rZ   r    r  c                 S   s$   g | ]}t |tjr|jn|jqS rY   )r   r   r7   r   sym_numr  rY   rY   rZ   r    s    
)r  )rz  r)   r   r   r5   r   r  sumrc   r   r   ri  TupleVariabler  r}  rv   r   create_proxyr   sym_sumrz   ro  r   )rU   r|   rq   r~   r   traceable_function_variablerY   rY   rZ   r     sH   
	z(PolyfilledFunctionVariable.call_functionc                 C   s   |dkr|  |||S t| j|d }|d us!J d| d| j t|s0J d| d| j i }| jr=t| j||d< t|fi |}| |||S )N__call__zMember z not found in z is not callable in r   )r   r   r   r-   r   r"   rn  )rU   r|   r   rq   r~   methodrG  polyfilled_method_variablerY   rY   rZ   rI  "  s   z&PolyfilledFunctionVariable.call_methodc                 C   r   rk   r   r   rY   rY   rZ   r   5  r   z-PolyfilledFunctionVariable.as_python_constantr   rq   r   r~   r   rj   r5   )rg   rh   ri   r5   r<  r=  r  cachera   r   r   r   r   rp  r   r>   r[   propertyrx  rz  r   r   rI  r   r>  rY   rY   r   rZ   rn    sD    $

4
rn  c                   @   s   e Zd Zdd ZdS )TracebackVariablec                 C   s   d S rk   rY   r   rY   rY   rZ   r   ;  s    zTracebackVariable.call_functionNrg   rh   ri   r   rY   rY   rY   rZ   r  9  s    r  c                       s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	SysFunctionVariablec                    s   t  jdi | || _d S r\   )r   r[   r   )rU   r   r~   r   rY   rZ   r[   ?  s   
zSysFunctionVariable.__init__c                 C   s`   t |jr|jd }|j}d }t|||t||g}ntd td td g}t|S )Nr  )rc   exn_vt_stackr  r5   r   r   r7   r  )rU   r|   exnr7  tbr   rY   rY   rZ   exc_infoC  s   




zSysFunctionVariable.exc_infoc                 C   s   |  |jd S r  )r  r   r   rY   rY   rZ   	exceptionU  re  zSysFunctionVariable.exceptionc                 C   s0   | j tju r| |S | j tju sJ | |S rk   )r   r  r  r  r   rY   rY   rZ   r   X  s   

z!SysFunctionVariable.call_function)rg   rh   ri   r[   r  r  r   r>  rY   rY   r   rZ   r  >  s
    r  ) create_tma_experimental_metadatacreate_tma_stable_metadataTMADescriptorMetadataTritonHOPifierc                   @   s   e Zd ZdedefddZdedefddZdedefd	d
Z	de
ejjjdf fddZdd Zdd Zdd Zdd ZdedefddZdddee ddfddZdefddZd S )!DynamoTritonHOPifierr8  rj   c                 C   s   t |rk   )r   )rU   r8  rY   rY   rZ   raise_unsupportedh  r   z&DynamoTritonHOPifier.raise_unsupportedmaybe_callablec                 C   s   t |ttfS rk   )r   r   r   )rU   r  rY   rY   rZ   is_callablek  r{  z DynamoTritonHOPifier.is_callabler   c                 C   s   |j S rk   r  )rU   r   rY   rY   rZ   	get_valuep  r   zDynamoTritonHOPifier.get_value.c                 C   sB   ddl m} t||r| S tddt| dg tjd d S )Nr1   )BaseListVariablez/unsupported grid type for triton hop check_gridzgrid type = z;`torch.compile` only supports list-like grid for check_gridr   )listsr  r   r  r   rC  r   rR  )rU   gridr  rY   rY   rZ   
check_grids  s   

zDynamoTritonHOPifier.check_gridc                 C   s&   dd |  D }|||gi }|S )Nc                 S      i | ]\}}t j||qS rY   r   r7   rv   r  rY   rY   rZ   r    s    z2DynamoTritonHOPifier.call_grid.<locals>.<dictcomp>)r   r   )rU   r  metar|   rY   rY   rZ   	call_grid  s   zDynamoTritonHOPifier.call_gridc           	      C   s*   ddl m} |||}||||}|S )Nr1   r  )r  r  rv   r   )	rU   user_fnrq   r~   r|   rK  r  wrapped_user_functionr   rY   rY   rZ   call_user_defined_fn  s   z)DynamoTritonHOPifier.call_user_defined_fnc                 C   s*   ddl m} ||t|j| |}|S )Nr1   )VariableBuilder)r  r  r"   kernel_source_wrap)rU   user_objr|   rK  r   r  wrapped_user_objrY   rY   rZ   wrap_user_defined_obj  s   z*DynamoTritonHOPifier.wrap_user_defined_objc                 C   s   | |}dd |D }|S )Nc                 S   r
  rY   rl  )r  r   rY   rY   rZ   r    r  z=DynamoTritonHOPifier.maybe_unpack_configs.<locals>.<listcomp>)unpack_var_sequence)rU   configsr|   rY   rY   rZ   maybe_unpack_configs  s   
z)DynamoTritonHOPifier.maybe_unpack_configsr   c                 C   s   |  s	| d | S )Nz`@triton.heuristics must return constant values because configs can only contain constant values.)is_python_constantr  rm  )rU   r   rY   rY   rZ   maybe_unpack_heuristic_result  s
   z2DynamoTritonHOPifier.maybe_unpack_heuristic_resultrK  TritonKernelVariablerq   c                 C   s>   |j d ust|dkr| d t||j|j|d |jdS )Nr1   z7Triton kernels should be called with only a single gridr   )kernel
kernel_idxr  r  )r  rc   r  rC  r  r  r   )rU   rK  rq   rY   rY   rZ   call_getitem  s   z!DynamoTritonHOPifier.call_getitemc                    s*  ddl m  ddlm} i }t| D ]}|| }t|ttfr-|	 ||< |
 ||< qdd | D }	ddlm}
m}  fdd| D } fd	d|	 D }| D ]}| }t|tjtjfss| d
t| d qY|
|}||t}|jd|d|j|||| d td S )Nr1   r6   )rj  c                 S   r  rY   r  r  rY   rY   rZ   r    s    z1DynamoTritonHOPifier.call_HOP.<locals>.<dictcomp>r   )kernel_side_tabletriton_kernel_wrapper_mutationc                    s$   i | ]\}}t | r|| qS rY   )r   r   r  r6   rY   rZ   r    s    c                    s    i | ]\}}t | s||qS rY   )r   r  r6   rY   rZ   r    s    z.Unexpected argument type for a Triton kernel: r  r   rY   )r  constant_args_idxr  tma_descriptor_metadatar~   )r  r7   dictsrj  r{   r  r   !TMADescriptorExperimentalVariableTMADescriptorStableVariableto_metadata
get_tensorr   *torch._higher_order_ops.triton_kernel_wrapr  r  r>  realizer   r  r}  r  repradd_constant_argsra   r   r  r  r  )rU   rK  gridscombined_args_rawr|   rj  r  r   r   combined_argsr  r  r`  non_constant_argsr  r  rY   r6   rZ   call_HOP  sX   



zDynamoTritonHOPifier.call_HOPN)rg   rh   ri   r   r
   r  r   r"  r  r  rz   r   fxproxyProxyr  r  r  r  r  r  r   r  r7   r  rY   rY   rY   rZ   r  g  s$    	

r  c                       s   e Zd ZU ded< ded< ee ed< ded< d fd
dZ								dddZ						d fddZde	de	fddZ
  ZS )r  r<   r  r=   r  r  r"   r  rj   Nc                    s4   | dd | _t jdi | t| ||| d S )Nr  rY   )rw   r  r   r[    dynamo_triton_hopifier_singletoninit_variable)rU   r  r  r  r~   r   rY   rZ   r[   	  s   zTritonKernelVariable.__init__r|   r;   rq   r   r~   r   r5   c                 C   s   t | |||S rk   )r  call_triton_kernelr   rY   rY   rZ   r   	  s   z"TritonKernelVariable.call_functionc                    s>   |dkr
t | |S |dkrt | |||S t ||||S )N__getitem__run)r  r  call_runr   rI  r  r   rY   rZ   rI  	  s
   z TritonKernelVariable.call_methodr  c                 C   s4   ddl m} ddlm} t||r|| S |S )Nr1   r6   )r}  )r  r7   tensorr}  r   rv   evaluate_expr)rU   r  r7   r}  rY   rY   rZ   specialize_symbolic)	  s
   
z(TritonKernelVariable.specialize_symbolicr;  r   r  )rg   rh   ri   r   r   r|  r[   r   rI  r   r  r>  rY   rY   r   rZ   r  	  s.   
 

r  c                       sH   e Zd Z								d fdd	Zd
d ZdddZdd Z  ZS )r  data_ptrvariables.DataPtrVariabledimslist[ConstantVariable]
block_dimselement_sizer7   c                    s>   t |tjsJ t jdi | || _|| _|| _|| _d S r\   )	r   r   DataPtrVariabler   r[   r  r  r  r  )rU   r  r  r  r  r~   r   rY   rZ   r[   4	  s   
z*TMADescriptorExperimentalVariable.__init__c                 C   s*   t dd | jD dd | jD | j S )Nc                 S   r
  rY   r~  r  dimrY   rY   rZ   r  E	  r  zATMADescriptorExperimentalVariable.to_metadata.<locals>.<listcomp>c                 S   r
  rY   r~  r  rY   rY   rZ   r  F	  r  )r  r  r  r  r  r   rY   rY   rZ   r  C	  s
   z-TMADescriptorExperimentalVariable.to_metadatarT  r9   c                    sX      fdd j  g jjj} |  t|d d d S )Nc                      s     ddtj dS )Nz$triton.tools.experimental_descriptorcreate_d_tma_descriptor)r  rc   r  rY   r  rY   rZ   r  L	  s    z?TMADescriptorExperimentalVariable.reconstruct.<locals>.<lambda>r1   F)	r  r  r`  r  r  r  re  r   rc   )rU   rT  rq   rY   r  rZ   r`  J	  s   
z-TMADescriptorExperimentalVariable.reconstructc                 C   r   rk   )r  from_tensorr   rY   rY   rZ   r  V	  r   z,TMADescriptorExperimentalVariable.get_tensor)r  r  r  r  r  r  r  r7   r  rg   rh   ri   r[   r  r`  r  r>  rY   rY   r   rZ   r  3	  s    
r  c                       sB   e Zd Z				d fddZdd ZdddZdddZ  ZS )r  r  variables.TensorVariableblock_shapevariables.ListVariablec                    s2   t |tjsJ t jdi | || _|| _d S r\   )r   r   r  r   r[   r  r  )rU   r  r  r~   r   rY   rZ   r[   [	  s   
z$TMADescriptorStableVariable.__init__c                 C   s   t | j S rk   )r  r  r  r   rY   rY   rZ   r  f	  r{  z'TMADescriptorStableVariable.to_metadatarT  r9   c                    s@      fdd  d | j   | j  d d S )Nc                      r  )Nztriton.tools.tensor_descriptorTensorDescriptorr  rY   r  rY   rZ   r  m	  s    z9TMADescriptorStableVariable.reconstruct.<locals>.<lambda>r  r   )r  load_methodr  r`  r  rI  r  rY   r  rZ   r`  k	  s   


z'TMADescriptorStableVariable.reconstructrj   c                 C   r   rk   )r  r   rY   rY   rZ   r  w	  r   z&TMADescriptorStableVariable.get_tensor)r  r  r  r  r  )rj   r  r  rY   rY   r   rZ   r  Z	  s    
r  c                       s@   e Zd Zdeddf fddZ						
			dddZ  ZS )'CreateTMADescriptorExperimentalVariablerankrj   Nc                    s(   |dv sJ t  jdi | || _d S )N)r1   r   rY   )r   r[   r  )rU   r  r~   r   rY   rZ   r[   |	  s   
z0CreateTMADescriptorExperimentalVariable.__init__r|   r;   rq   r   r~   r   r5   c                 C   s.  d|v r|d n|d }t |tjstd| j d| jdkrGt|t| dks,J d|v r4|d n|d g}d|v rA|d n|d	 g}n<t|t| d
ksSJ d|v r[|d n|d d|v rf|d n|d	 g}d|v rs|d n|d d|v r~|d n|d g}d|v r|d n|d }t||||dS )Nptrr   z8Please ensure there were no graph breaks between create_z3d_tma_descriptor and the upstream .data_ptr() call.r1   r@   r  	block_dimr      dim1dim0
block_dim1r  
block_dim0r  r  )r  r  r  r  )r   r   r  r   r  rc   r  )rU   r|   rq   r~   r  r  r  r  rY   rY   rZ   r   	  s6   
z5CreateTMADescriptorExperimentalVariable.call_functionr   )rg   rh   ri   r|  r[   r   r>  rY   rY   r   rZ   r  {	  s    	r  c                   @   s&   e Zd Z								dd	d
ZdS )!CreateTMADescriptorStableVariabler|   r;   rq   r   r~   r   rj   r5   c                 C   s<   d|v r|d n|d }d|v r|d n|d }t ||dS )Nr  r   r  r1   )r  r  )r  )rU   r|   rq   r~   r  r  rY   rY   rZ   r   	  s   z/CreateTMADescriptorStableVariable.call_functionNr   r  rY   rY   rY   rZ   r  	  s    r  rk   r  )r   r  r  r   r   r"  r  r+  r   collections.abcr   r   typingr   r   r   r   r	   typing_extensionsr
   unittest.mockr   weakrefr   r   torch._dynamo.excr   r  r   r   r   r   bytecode_transformationr   r   r   r|  r   r   r   r   r   r   r   r   r   r   guardsr    r!   r   r"   r#   r$   r%   r&   r'   r+  r(   r)   r*   r+   r,   r-   r.   r/   r0   baser2   r3   r4   r5   r  r7   #torch.distributed.fsdp._fully_shardr8   ModuleNotFoundErrortorch._dynamo.codegenr9   rY  r;   r  r<   r=   r>   rQ   rS   rl   rB   ro   r   rt   r   ra   r   r   r   r   r   r   r   r?  rM  r  r  r  r   r  r  r(  r   r  r  r  r  r6  r=  rB  rC  rZ  r]  ra  rn  r  r  r  r  r  r  r  r  r  r  r  r  r  rY   rY   rY   rZ   <module>   s   0 ,X
" o  
G
Aj
 4( +A
	T$Q ! .'!5