
    9i                    $	   U 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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 ddlmZ ddlZdd	lmZ dd
lm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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6 ddl7m8Z8m9Z9 ddl:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZC ddlDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZL ddlMmNZNmOZOmPZPmQZQmRZR ddlSmTZT 	 ddlUmVZV n# eW$ r dZVY nw xY wer.ddlXmYZY ddlZm[Z[m\Z\m]Z]m^Z^ ddl_m`Z` ddlambZbmcZc ddldmeZemfZf ddlgmhZh  ededef                   Zid Zjd!Zk elh d"          Zm eld#h          Zn e            Zoeeef         epd$<   ejq        d%             Zr G d& d'          Zsd(ed)esfd*Ztd(ed+d,d-ee         d.ee         d/euevef         d)eueveRf         fd0Zw	 dd+d,d1ed2ee         d)eRfd3Zxd+d,d4euevef         d)dfd5Zyd6d,d4eueveRf         d7ejz        d)dfd8Z{d7ejz        d9euevef         d:evd;ee|e}df                  d<ee|e                  d=eeuevef                  d>eeuevef                  d)ej        fd?Z~h d@Zd+d,dAe}d2ee         d:evd)eRf
dBZ G dC dDeR          Z G dE dFe          Z G dG dHe          Z G dI dJe          Z G dK dLeR          Z G dM dNe          Z G dO dPe          Z G dQ dRe          Z G dS dTe          Z G dU dVe          Z G dW dXe          Zd+d,dAedef         d:evd.eeR         d/eueveRf         d)eRfdYZ G dZ d[e          Z G d\ d]e          Z G d^ d_eR          Z G d` dae          Z G db dceR          Z G dd dee          Zd)eueef         fdfZd+d,dAedef         d)e;fdgZ G dh die          Z G dj dke          Z G dl dme          Z G dn doeR          Z G dp dqeR          Z G dr dseR          Z G dt dueR          ZddvlamZmZmZmZ  G dw dxe          Z e            Z G dy dzeR          Z G d{ d|eR          Z G d} d~eR          Z G d deR          Z G d deR          Z G d de          Z G d de          ZdS )a  
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)
namedtuple)CallableSequence)CellTypeFunctionType)AnycastOptionalTYPE_CHECKINGTypeVar)Never)WeakKeyDictionary)get_stack_above_dynamo)Source)is_namedtuple_class   )configgraph_break_hints	polyfills	variables)create_call_functioncreate_rot_nis_generator)format_skip_frame_messageget_dynamo_observed_exceptionhandle_observed_exceptionInfiniteGeneratorErrorObservedExceptionObservedGeneratorExitObservedUserStopIterationraise_observed_exception	SkipFrameStepUnsupportedunimplementedUnsupported)GuardBuilderinstall_guard)	
AttrSourceClosureSourceCollectionsSourceConstantSourceDefaultsSourceGetItemSourceSkipGuardSourceTorchSource
TypeSource)check_constant_argscheck_unspec_or_constant_argscmp_name_to_op_mappingidentityis_functionis_wrapper_or_member_descriptoristype	make_cell   )#AsPythonConstantNotImplementedErrorAttributeMutationNewraise_type_error_excValueMutationNewVariableTrackerConstantVariable)_fsdp_param_group)	PyCodegen)&InliningGeneratorInstructionTranslatorInliningInstructionTranslatorInstructionTranslatorInstructionTranslatorBase)ContextWrappingVariable)TritonGridTypeTritonKernelType)BaseListVariableListVariable)TensorVariable_F.)bound      >   is_leaf	namespacenone_is_leafrQ   _spec_cachec                  r    t          t          t          t                      d          d          d          S )Nutils_pytreeSUPPORTED_NODES)r(   r/        T/var/www/icac/venv/lib/python3.11/site-packages/torch/_dynamo/variables/functions.py!get_pytree_SUPPORTED_NODES_sourcer\      s2    :kmmW55yAACT  rZ   c                   *    e Zd ZdefdZdeddfdZdS )FunctionSpecfuncc                    |j         }|j        }|j        | _        |j        | _        |j        | _        |d | j                 | _        || j        | j                 | _	        | j        | j	        z   | _
        || j        | j        | j        z            | _        | j        | j        z   }|j        t          z  r||         nd | _        || j        rdndz  }|j        t          z  r||         nd | _        d S )Nr9   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)selfr_   codevnoffs        r[   __init__zFunctionSpec.__init__   s    }!4) 2 4$"4 45!$"4t~"EF!/$2FFt~AR0RRSnt00'+}z'AKBsGGtD%,qq1,%)]^%CM"S''rZ   returnNc           
          |j         pd| _        |j        pi | _        t	          t          | j        t          | j                   d          t          t          | j                                                | _	        d S NrY   )
__defaults__defaults__kwdefaults__
kwdefaultsdictziprk   lenrangepos_default_map)rr   r_   s     r[   update_defaultszFunctionSpec.update_defaults   sv     )/R-3  $"C$6$6#6#8#895T]ASAS;T;TUU 
  
rZ   )__name__
__module____qualname__r   rv   r   rY   rZ   r[   r^   r^      sV        N\ N N N N$	
L 	
T 	
 	
 	
 	
 	
 	
rZ   r^   r_   rw   c                 p    t                               |           }|t          |           }|t           | <   |S N)rT   getr^   )r_   specs     r[   	_get_specr      s4    ??4  D|D!! DKrZ   txrE   	fn_sourceargskwargsc                    t          |           }|                    |            i }t          |          }|j                                        D ]c\  }}	d }
|r;t          j        |j        |	                   rt          j	        st          ||	          }
t          ||j        |	         |
          ||<   dt          |j                  D ]\  }}|t          |          k     rt          |||                   ||<   2||v r0||j        vr't          ||                    |                    ||<   f||vr-t#          t$          |t          j        d|           g           |t          |j                  d          }|j        r&t          |t+          |                    ||j        <   nQ|rOt#          t$          |t          j        dt          |           dt          |j                             g           |j        D ]}||v r't          ||                    |                    ||<   -||j        v r6d }|rt          ||d          }t          ||j        |         |          ||<   lt#          t$          |t          j        d|           g           |j        rt          ||          ||j        <   n<|r:t#          t$          |t          j        dt3          |                     g           |S )	Nz&Missing required positional argument: r   z#Too many positional arguments: got z, expected T)is_kwz(Missing required keyword-only argument: zUnexpected keyword arguments: )r   r   r~   r   itemsr@   
is_literalr{   r   %skip_guards_on_constant_func_defaultsr,   wrap_bound_arg	enumeraterk   r   ri   popr!   	TypeErrorcreatero   tuplerl   r}   rq   list)r_   r   r   r   r   r   barem_kwnameidxdefault_sourceiextrakwdefault_sources                 r[   bind_args_cachedr      sn    T??D	B&\\F )//11 J J	c 	<'c(:;;	<<	< ,Is;;N!"dmC&8.II4T/00  4s4yy==%b$q'22BtHHV^^ *** &b&**T*:*:;;BtHH^^$$+GGG     T'((**+E 
 .r5<< @ @4	 	
  'i#d))iiPSTXTfPgPgii 	
 	
 	
 	
 !  6>>%b&**T*:*:;;BtHHT_$$# O#1)T#N#N#N %b$/$*?AQRRBtHH$$+I4II       	
,R884?	 
  '(Wf(W(WXX	
 	
 	
 	
 IrZ   valsourcec                     t          |t                    r|S |st          j        | |          S t          j                            ||          S r   )
isinstancer>   buildr   LazyVariableTrackerr   )r   r   r   s      r[   r   r     sS     #'' A
 A$R--- ,33C@@@rZ   resultc                     t          |                                          D ]4\  }}t          |t          t          f          rt          | |          ||<   5d S r   )r   r   r   r   r~   r   )r   r   kvs       r[   wrap_args_kwargsr     sY    V\\^^$$ . .1a%'' 	.&r1--F1I. .rZ   parentrs   c                     | j         j        }|j        D ]H}|                                }||v r)|                    ||                    |                     |||<   Id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_cellr   )r   r   rs   r   r   new_cells         r[   init_cellvarsr   %  ss     =-L     ..006>> ##Hfjj.>.>???t   rZ   	f_globalsr   r{   closurer}   annotationsc                     ddl m}  || ||||          }||_        t          |t                    rddlm}	 t           |	|                    }|t          |t                    sJ ||_        |S )Nr   r   pairwise)	typesr   r|   r   r   	itertoolsr   r~   __annotations__)
rs   r   r   r{   r   r}   r   r   r_   r   s
             r[   _create_nested_fnr   :  s     #"""""<ixAAD$D+u%% 2&&&&&&88K0011 *[$"?"?&DKrZ   >   __doc__ra   __closure____globals__rz   r|   r   fnc                 p   |ot          ||          }|r|dk    rt          |          }d }	 t          j        ||          }n%# t          $ r t          t          |            Y nw xY w|t          v rt          ||          }|r t          j	        
                    ||          S t          j        | |          S )Nr   )r(   r.   inspectgetattr_staticAttributeErrorr!   fn_known_dunder_attrsgetattrr   r   r   r>   r   )r   r   r   r   subobjs        r[   fn_var_getattrr   _  s     0
6400F )$+++ !((F5'D11 5 5 5 	!444445 $$$T"" D,33FFCCC V,,,s   A A%$A%c                       e Zd ZdefdZdefdZd Zdddee         de	eef         defd	Z
ddd
edefdZddde	eef         fdZd ZdS )BaseUserFunctionVariablerw   c                 4    |                                  j        S r   get_codeco_filenamerr   s    r[   get_filenamez%BaseUserFunctionVariable.get_filename{      }}**rZ   c                 4    |                                  j        S r   r   co_namer   s    r[   get_namez!BaseUserFunctionVariable.get_name~      }}&&rZ   c                     t           r   NotImplementedErrorr   s    r[   get_globalsz$BaseUserFunctionVariable.get_globals      !!rZ   r   rE   r   r   c                    |                                  dk    r;|                                                     d          rt          j        d           S |                    | g |                                 ||          S )Npatch_track_step_calledztorch/optim/lr_scheduler.py)r   r   endswithr@   r   inline_user_function_return	self_argsrr   r   r   r   s       r[   call_functionz&BaseUserFunctionVariable.call_function  s|     MMOO888!!##,,-JKK 9 $*4000--d4Ndnn6F6F4N4NPVWWWrZ   r   c                     d}	 t          |                                 |          }n-# t          $ r  |dk    rt          | t                    rd}Y nw xY wt
          j                            |          S )NFr   T)hasattrget_functionr   r   NestedUserFunctionVariabler   r@   r   rr   r   r   r   s       r[   call_obj_hasattrz)BaseUserFunctionVariable.call_obj_hasattr  s     	T..00$77FF" 	 	 	z!!j7Q&R&R!	 )00888s   "' 'AAc                     i S r   rY   rr   r   s     r[   closure_varsz%BaseUserFunctionVariable.closure_vars      	rZ   c                     dS NTrY   r   s    r[    should_allow_nested_graph_breaksz9BaseUserFunctionVariable.should_allow_nested_graph_breaks      trZ   N)r   r   r   strr   r   r   r   r>   r~   r   r@   r   r   r   rY   rZ   r[   r   r   z  s       +c + + + +'# ' ' ' '" " "X#X 'X S/)*	X
 
X X X X
9)
914
9	
9 
9 
9 
96 4_@T;U        rZ   r   c                   6    e Zd ZdZddhej        Z eh d          Zede	de	dd fd            Z
	 d*dej        ej        j        z  ded
e	ddf fdZde	f fdZdee         fdZdej        fdZdej        fdZdefdZdefdZdeee	f         fdZdefdZ ddde!e         d
eeef         deeef         fdZ"dddedefdZ#dddede$fdZ%ddde!e         d
eeef         def fdZ&ddde!e         d
eeef         de'e         fdZ(defdZ)defd Z*ddde!e         d
eeef         de'e+d e!e         eeef         f                  fd!Z,de'ej                 fd"Z-d#ede'e+ed$f                  fd%Z.de	de'ee                  fd&Z/d' Z0d( Z1d) Z2 xZ3S )+UserFunctionVariablez-Some unsupported user-defined global functionr   is_constant>   
optree.opstorch.utils._pytreetorch.utils._cxx_pytreeoptreevaluer   rw   c                 t    t          |                    t          j                              | ||          S Nr   r'   
make_guardr&   CLOSURE_MATCHclsr  r   s      r[   create_with_sourcez'UserFunctionVariable.create_with_source  s6    f''(BCCDDDs5((((rZ   Fr   Nc                 L    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                   t          j        |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   )superrv   r   r   r   r   r   torchjitScriptFunctionr$   r   INFERENCE_MODEr   r   r   rr   r   r   r   	__class__s       r[   rv   zUserFunctionVariable.__init__  s     	""6"""20%88 	%#D$D "u1593KLMM 		KPO&5	    #B(=rBBrZ   c                 |    t          | t                    r| j        S t                                                      S r   )r7   r   r   r  as_python_constant)rr   r  s    r[   r  z'UserFunctionVariable.as_python_constant  s3    $,-- 	7Nww))+++rZ   c                     g S r   rY   r   s    r[   r   zUserFunctionVariable.self_args  r   rZ   c                     | j         S r   r   r   s    r[   r   z!UserFunctionVariable.get_function  	    wrZ   c                     | j         j        S r   )r   ra   r   s    r[   r   zUserFunctionVariable.get_code  s    wrZ   c                     t           j        S r   r   r   r   s    r[   python_typez UserFunctionVariable.python_type      !!rZ   c                 2    t          | j        dd           d uS N__self__)r   r   r   s    r[   has_selfzUserFunctionVariable.has_self  s    tw
D11==rZ   c                     | j         j        S r   )r   r   r   s    r[   r   z UserFunctionVariable.get_globals  s    w""rZ   c                 Z    | j         }|r!t          | t          j                  r| j        }|S r   )r   r   r   UserMethodVariable	source_fn)rr   r   s     r[   
get_sourcezUserFunctionVariable.get_source  s1     	$jy'CDD 	$^FrZ   r   rE   r   c                    | 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
        j        |          D ]\  }	}
}|j        j        }||v r	||         }n|rt%          t'          |          |	          }t)          |d          }	 t+          j        ||j        |          }n## t0          $ r t3          j                    }Y nw xY w|                    |||          }nV	 t+          j        ||j                  }n## t0          $ r t3          j                    }Y nw xY w|                    d||          }|||
<   |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   r   r   root_txr-  r   r   ra   r   r   co_freevarsr   r   countr   r-   r)   r(   r>   r   r/  
ValueErrorr   DeletedVariabletrack_cell_existing)rr   r   r   r   r   r0  r   r   r   r   r   cellr   cell_varclosure_cellclosure_cell_contentscontents_vars                    r[   	bind_argszUserFunctionVariable.bind_args  s"    ####!%"l++ 	GEFFF-'""!"gvtVDDffbk222'%+7||s47#3#?@@@@@@"Otw/;W 
  
  	$  	$OCt "=5L|##'- V,]6-B-BCHH(2<(Q(Q%?#2#8 24I$ $LL " ? ? ?#,#<#>#>LLL? (;; $ ?#2#8AS#T#TLL! ? ? ?#,#<#>#>LLL? (;;D$UU#F4LLs$   >EE:9E:F11GGr   r   c                     |t           v rt          j        | |          S |                                 }t	          || j        ||          S r   )r3   r   GetAttrVariabler-  r   r   )rr   r   r   r   s       r[   var_getattrz UserFunctionVariable.var_getattr:  sF    ))),T4888""b$'64888rZ   c                 j    t          | j        |          }t          j                            |          S r   )r   r   r   r@   r   r   s       r[   r   z%UserFunctionVariable.call_obj_hasattr@  s,     $'')00888rZ   c           
      0   | j         t          j        j        u r	 d |D             }d |                                D             }t          j        j        |i |j        }t          j        |          S # t          $ r}t          d| d|           |d }~ww xY w| j         t          j        j
        u r	  t          j        | j                   j        |i |}|j        d                                         }	t!          |	t"                    sJ t          j        |	          S # t&          $ r}t          d| d|           |d }~ww xY w| j         t          j        j        u r t          j        | j                   j        |i |}|j        d         }
t!          |
t,                    sM|
                                }d|j         d	}t3          d
d| j         d| d| d|g t6          j                   t!          |
t:                    s4|
                                }d| d}t3          d|  |d| ddg           |
j         }t          j        |d          S | j         r*tC          || j         |                                 ||          S |j"        j#        j$        s|| j         t          j        j%        j&        u r_t          j        j'        (                    |          5  tS                      *                    |||          cd d d            S # 1 swxY w Y   tW          |j"        j#        dd           dk    r|j"        j#        j,        s	 ddl-m.} n# t&          $ r d }Y nw xY w|t| j         |j/        |j0        fv r_t          j        j'        ,                    |          5  tS                      *                    |||          cd d d            S # 1 swxY w Y   | 1                    |||          }||S tS                      *                    |||          S )Nc                 6    g | ]}|                                 S rY   r  .0args     r[   
<listcomp>z6UserFunctionVariable.call_function.<locals>.<listcomp>O  s$    GGG3c4466GGGrZ   c                 >    i | ]\  }}||                                 S rY   rB  )rD  keyr   s      r[   
<dictcomp>z6UserFunctionVariable.call_function.<locals>.<dictcomp>P  s7          6>c3C//11     rZ   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descriptionz!torch.utils.checkpoint.checkpoint)	FSDPState)2r   r  _dynamopatch_dynamo_configr   changesr   DynamoConfigPatchVariabler:   RuntimeErrorrJ  r   	signaturebind	argumentsr  r   boolErrorOnGraphBreakVariable	Exceptionnonstrict_tracer   r   r#  r   r$   r  r   
USER_ERRORr   r   TorchInGraphFunctionVariabler   invoke_and_store_as_constantr   current_tracer,unsafe_allow_externally_visible_side_effectsrV   8_disable_side_effect_safety_checks_for_current_subtracerr   2allow_externally_visible_side_effects_in_subtracerr  r   r   allow_side_effects_in_hop/torch.distributed.fsdp._fully_shard._fsdp_staterQ  _pre_forward_post_forward_maybe_call_tree_map_fastpath)rr   r   r   r   
args_constkwargs_constrT  erN   rJ  fn_vartypmsgfn_namer   rQ  tree_map_resultr  s                    r[   r   z"UserFunctionVariable.call_functionF  s    7em777GG$GGG
   BH,,..       -;#/   !:7CCC6   "6!6 6-36 6  	 W:::7)$'227HHH',*($$&& % ""6===== :;OPPP   "6!6 6-36 6   W5553G%dg..3TDVDDEZ]Ff&>?? 
((**eVYVbeee6LTZLL4LL6LLL #*5	    f&:;;  //++ v  v  v  v<#I #H7HHH0	    B9"RVWWWW 	/DGT]]__dF  
 	(U	?}"[\ \ +^^  ? ? ww,,Rv>>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? BI,mTBB23 3I,F3!UUUUUUU ! ! ! 			!$&'5 * * ]/II"MM C C 7700T6BBC C C C C C C C C C C C C C C C <<RvNN&""ww$$Rv666sg   AA4 4
B>BB5A-D# #
E-EE#LLLM M! M!#OOOc                 H   |                      |||          }||\  }}}n| }|}|}t          |t                    r3|                                rh |t          z
  st          |          dk    sd S |d         }|d         }	|dd          }
|	                    ||||
|          S )Nr   r   r9   )_rewrite_tree_map_only_callr   r   _is_tree_map_function_SUPPORTED_TREE_MAP_KWARGSr   call_tree_map)rr   r   r   r   rewritetree_map_fntree_map_argstree_map_kwargsmap_fn
first_treerests              r[   ri  z2UserFunctionVariable._maybe_call_tree_map_fastpath  s     222tVDD:A7KK M$O {$899	1133	 ('*DD	 M""a''4q!"1%
QRR ''
 
 	
rZ   c                 p    t          | j        dd           dk    ot          | j        dd           | j        v S )Nr   tree_mapr   r   r   _TREE_MAP_MODULESr   s    r[   rt  z*UserFunctionVariable._is_tree_map_function  s<    DGZ..*< Ot448NN	
rZ   c                 p    t          | j        dd           dk    ot          | j        dd           | j        v S )Nr   tree_map_onlyr   r  r   s    r[   _is_tree_map_only_functionz/UserFunctionVariable._is_tree_map_only_function  s<    DGZ../A Ot448NN	
rZ   c           	      t   |                                  sd S t          |          dk    rd S h |t          z
  rd S |\  }}}|                     |          }|d S |                                 }|d S t          ||t          |dd                     }	t          j        |          }
|
|	|gt          |          fS )N   r   r  )
r  r   _TREE_MAP_ONLY_SUPPORTED_KWARGS_extract_tree_map_only_types_lookup_tree_map_functionTreeMapOnlyFunctionVariabler   r   r   r~   )rr   r   r   r   type_selectorr{  tree_argallowed_typestree_map_callablewrapped_map_fntree_map_variables              r[   rs  z0UserFunctionVariable._rewrite_tree_map_only_call  s     ..00 	4t99>>4V966 	4*.'vx99-HH 4 ::<<$4468T22
 
 

 &:;LMM >8"<d6llJJrZ   c                     t          | j        dd           }|sd S t          j                            |          }|d S t          |dd           }t          |t          j                  r|S d S )Nr   r  )r   r   sysmodulesr   r   r   r   )rr   module_namemoduler  s       r[   r  z.UserFunctionVariable._lookup_tree_map_function  so    dg|T:: 	4-->46:t44h 233 	OtrZ   selector.c                 2   |                                 sd S 	 |                                }n# t          $ r Y d S w xY w|                     |          }|sd S t	          d |D                       sd S t          t                              |                    S )Nc              3   @   K   | ]}t          |t                    V  d S r   )r   type)rD  rn  s     r[   	<genexpr>zDUserFunctionVariable._extract_tree_map_only_types.<locals>.<genexpr>  s,      >>S:c4((>>>>>>rZ   )is_python_constantr  r   _flatten_type_specallr   r~   fromkeys)rr   r  	raw_value	flatteneds       r[   r  z1UserFunctionVariable._extract_tree_map_only_types  s     **,, 	4	 3355II" 	 	 	44	 ++I66	 	4>>I>>>>> 	4T]]9--...s   - 
;;c                    t          |t                    r|gS t          |t                    r8g }|D ]1}|                     |          }| d S |                    |           2|S t          t          dd           }|Mt          ||          r=g }|j        D ]1}|                     |          }| d S |                    |           2|S d S )N	UnionType)r   r  r   r  extendr   r   __args__)rr   r  	collectedentryflat
union_types         r[   r  z'UserFunctionVariable._flatten_type_spec  s    eT"" 	7NeU## 	$&I ' '..u55<44  &&&&UK66
!j
&C&C!I ' '..u55<44  &&&&trZ   c                     dS r   rY   r   s    r[   is_python_hashablez'UserFunctionVariable.is_python_hashable4  r   rZ   c                 *    t          | j                  S r   )hashr   r   s    r[   get_python_hashz$UserFunctionVariable.get_python_hash7  s    DG}}rZ   c                 R    t          |t          j                  o| j        |j        u S r   )r   r   r   r   rr   others     r[   is_python_equalz$UserFunctionVariable.is_python_equal:  s%    %!?@@XTWPUPXEXXrZ   F)4r   r   r   r   r   _nonvar_fields	frozensetr  classmethodr   r
  r   r   r  r  r  rZ  rv   r  r   r>   r   r   CodeTyper   r  r#  r(  r~   r   r   r   r-  r   r;  r>  r@   r   r   r
   ri  rt  r  r   rs  r  r  r  r  r  r  __classcell__r  s   @r[   r   r     s       77 	 
"	0N "		
 	
 	
  )s )C )<R ) ) ) [) " !99  	
 
     >,C , , , , , ,40    e0     %.        "T " " " ">$ > > > >#T#s(^ # # # #F    :': ': S/)*	:
 
c?"	#: : : :x95 9S 9_ 9 9 9 99)9149	9 9 9 9g7#g7 'g7 S/)*	g7
 
g7 g7 g7 g7 g7 g7R
#
 '
 S/)*	

 
/	"
 
 
 
B
t 
 
 
 

D 
 
 
 
#K##K '#K S/)*	#K
 
"_%o%&(	

#K #K #K #KJ
8E4F+G 
 
 
 
/'/	%c	"	#/ / / /" d0D    ,    Y Y Y Y Y Y YrZ   r   c                        e Zd Zdhej        Zdeedf         dededdf fdZ	defdZ
d	edefd
Zdddee         deeef         defdZ xZS )r  r  .r{  r   rw   Nc                 V     t                      j        di | || _        || _        d S ry   )r  rv   r  r{  )rr   r  r{  r   r  s       r[   rv   z$TreeMapOnlyFunctionVariable.__init__D  s5     	""6"""*rZ   c                     t           S r   r   r   s    r[   r#  z'TreeMapOnlyFunctionVariable.python_typeN  s    rZ   nodec                     	 |                                 n# t          $ r Y dS w xY wt          fd| j        D                       S )NFc              3   8   K   | ]}t          |          V  d S r   )
issubclass)rD  allowed	node_types     r[   r  zDTreeMapOnlyFunctionVariable._matches_allowed_type.<locals>.<genexpr>V  s-      TTg:i11TTTTTTrZ   )r#  r   anyr  )rr   r  r  s     @r[   _matches_allowed_typez1TreeMapOnlyFunctionVariable._matches_allowed_typeQ  sc    	((**II" 	 	 	55	TTTTASTTTTTTs    
&&r   rE   r   c                    |s| j                             |||          S |d         }|                     |          r| j                             |||          S t          |          dk    s|r| j                             |||          S |S )Nr   r9   )r{  r   r  r   )rr   r   r   r   leafs        r[   r   z)TreeMapOnlyFunctionVariable.call_functionX  s      	?;,,Rv>>>Aw%%d++ 	?;,,Rv>>>t99>>V> ;,,Rv>>>rZ   )r   r   r   r   r  r   r  r>   r   rv   r#  rZ  r  r   r~   r   r   r  r  s   @r[   r  r  >  s       	!	0N
T3Y'   	
 
     T    U/ Ud U U U U# ' S/)*	
 
       rZ   r  c            	            e Zd Z	 ddej        dededdf fdZededefd	            Z	d
dde
e         deeef         defdZ xZS )BuiltinMethodVariableFr   r   r   rw   Nc                      t                      j        di | t          |t          j                  sJ || _        d S ry   )r  rv   r   r   BuiltinMethodTyper   r  s       r[   rv   zBuiltinMethodVariable.__init__k  sF     	""6""""e566666rZ   objc                 t    | j         }| j        }|t          u r|dk    pt          |          t          u o|dk    S )N__new____contains__)r'  r   r   r  r  )r  method_selfmethod_names      r[   is_supported_builtin_methodz1BuiltinMethodVariable.is_supported_builtin_methodr  sH    ll u$A	)A 
*L{n/L	
rZ   r   rE   r   c                     | j         j        }| j         j        }| j        ot	          | j        d          }t          j        |||          }|                    ||||          S r&  )r   r'  r   r   r(   r>   r   call_method)rr   r   r   r   r  r   
obj_sourceobj_vts           r[   r   z#BuiltinMethodVariable.call_function}  s^     g&w[HZZ%H%H
 &r;
CC!!"dD&999rZ   r  )r   r   r   r   r  rZ  r   rv   staticmethodr  r   r>   r~   r   r   r  r  s   @r[   r  r  j  s        ?D )8<PS	      
 
 
 
 
 \

:#
: '
: S/)*	
:
 

: 
: 
: 
: 
: 
: 
: 
:rZ   r  c            
           e Zd Zdej        deeef         dddeddf
 fdZdej        fd	Z	defd
Z
defdZdefdZdefdZdefdZ defdZeZd'dZdddee         deeef         deeef         fdZdeeef         fdZdefdZdddefdZdddedefdZdddefdZdddefdZdddee         fdZddde egef         ddfd Z!d! Z"ddd"eddfd#Z#defd$Z$defd%Z%dddedee         deeef         def
 fd&Z& xZ'S )(LocalGeneratorObjectVariablers   r   inline_tracerrC   r   rw   Nc                 d     t                      j        di | || _        || _        || _        d S ry   )r  rv   rs   r   r  )rr   rs   r   r  r   r  s        r[   rv   z%LocalGeneratorObjectVariable.__init__  s>     	""6"""	"*rZ   c                     | j         S r   )rs   r   s    r[   r   z%LocalGeneratorObjectVariable.get_code  s
    yrZ   c                 4    |                                  j        S r   r   r   s    r[   r   z)LocalGeneratorObjectVariable.get_filename  r   rZ   c                 4    |                                  j        S r   r   r   s    r[   r   z%LocalGeneratorObjectVariable.get_name  r   rZ   c                     t           r   r   r   s    r[   r   z)LocalGeneratorObjectVariable.get_function  r   rZ   c                     dS NFrY   r   s    r[   r(  z%LocalGeneratorObjectVariable.has_self      urZ   c                 *    |                                  S r   )r   r   s    r[   r   z%LocalGeneratorObjectVariable.__name__  s    }}rZ   c                 J    | j         j         d|                                  dS )N(rM  )r  r   r   r   s    r[   __str__z$LocalGeneratorObjectVariable.__str__  s&    .)>>DMMOO>>>>rZ   codegenrB   c                    ddl m} ddlm}m}m}  |j                    } ||          } ||          } ||          }	|5  |5  |	5  | j        }
|
j        s| 	                    |          | _
        t          j        | j
                                      |           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nr   )"disallow_side_effects_in_generator)rE    save_and_restart_speculation_log(temporarely_allow_writes_to_output_graph)torch._dynamo.side_effectsr  torch._dynamo.symbolic_convertrE   r  r  
current_txr  generator_exhaustedforce_unpack_var_sequenceremaining_itemsr   ListIteratorVariablereconstruct)rr   r  r  rE   r  r  r   savedisallowtemptracers              r[   r  z(LocalGeneratorObjectVariable.reconstruct  s)   QQQQQQ	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 ."-////3355b9977;; 	V 	V8 	V 	VT 	V 	V'F- J'+'E'Eb'I'I$*4+?@@LLWUUU		V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	Vs[   CC	AB*C*B..C1B.2C5CC	CC		CC Cr   rE   r   c                 :    | j                             |||          S r   )vtr;  r   s       r[   r;  z&LocalGeneratorObjectVariable.bind_args  s     w  T6222rZ   c                     | j         S r   r   r   s    r[   r   z(LocalGeneratorObjectVariable.get_globals  
    ~rZ   c                     t           j        S r   )r   GeneratorTyper   s    r[   r#  z(LocalGeneratorObjectVariable.python_type  s    ""rZ   c                 l   | j         }|                                 rt          t          |           	 |                                S # t
          $ r}d|_        |d }~wt          $ r  t          $ rC}t          j
        j                            |                                            t          |d }~ww xY wr   )r  _is_generator_exhaustedr!   StopIterationinline_call_r   r  r   r%   r  rR  
eval_frame	skip_coder   r"   )rr   r   r  rl  s       r[   next_variablez*LocalGeneratorObjectVariable.next_variable  s    #'')) 	8$]B777	# &&(((  	 	 	)-F&G% 	 	 	 	# 	# 	#M$..t}}???"	#s#   A 
B3	AB30>B..B3r   c                     ||                                  j        v rt          j        d          S t          j        d          S )NTF)r#  __dict__r@   r   rr   r   r   s      r[   r   z-LocalGeneratorObjectVariable.call_obj_hasattr  s@     4##%%...#*4000&u---rZ   c                     dS r  rY   r   s     r[   has_unpack_var_sequencez4LocalGeneratorObjectVariable.has_unpack_var_sequence  r  rZ   c                     dS r   rY   r   s     r[   has_force_unpack_var_sequencez:LocalGeneratorObjectVariable.has_force_unpack_var_sequence  r   rZ   c                 @    g }|                      ||j                   |S r   )force_apply_to_var_sequenceappend)rr   r   r   s      r[   r  z6LocalGeneratorObjectVariable.force_unpack_var_sequence  s&     )+((V];;;rZ   r   c                     	 	  ||                      |                     n # t          $ r t          |           Y d S w xY wAr   )r  r    r   )rr   r   r   s      r[   r  z8LocalGeneratorObjectVariable.force_apply_to_var_sequence  sb    	4%%b))****,   )"---	s   " ??c                     dS r  rY   r   s    r[   r   z=LocalGeneratorObjectVariable.should_allow_nested_graph_breaks  r  rZ   excc                     | j         }	 |                    |           d S # t          $ r }|                    |           Y d }~d S d }~ww xY wr   )r  _raise_exception_variabler   exception_handler)rr   r   r  r  rl  s        r[   _setup_exceptionz-LocalGeneratorObjectVariable._setup_exception  sr     #	(,,S11111  	( 	( 	( $$Q'''''''''	(s     
A
AA
c                 4    | j         d u p| j         j        dk    S )Nr   )r  instruction_pointerr   s    r[   _is_generator_just_startedz7LocalGeneratorObjectVariable._is_generator_just_started  s!    !T)XT-?-SWX-XXrZ   c                 .    t          | j        dd          S )Nr  F)r   r  r   s    r[   r  z4LocalGeneratorObjectVariable._is_generator_exhausted  s    t)+@%HHHrZ   c                 6   |dk    r|                      |          S |dk    r| S |dk    r|                                 r=t          |          r.t          d |D                       st	          t
          |           | j        }|                    |           |                      |          S |dk    rS| j        }|                                 s|                                 rd|_	        t          j        d           S 	 |                     |t          j        t          d                     t          j        dk    r+|j        j        d	k    rd|_	        t          j        d           S n+# t&          $ r d|_	        t          j        d           cY S w xY w	 |                      |          rt	          t(          |           n6# t&          $ r d|_	        t          j        d           cY S t*          $ r |j        J |j        cY S w xY w|d
k    r| j        }	 |                     |t          |          dk    r|d         n|d                    n# t.          $ r  w xY w|                      |          }t1          dt2          fi           }	 |                     |t          j        |d                     |                      |           t	          t(          |           n# t5          |          $ r Y nw xY w|S t7                                          ||||          S )N__next____iter__sendc              3   >   K   | ]}|                                 V  d S r   )is_constant_nonerC  s     r[   r  z;LocalGeneratorObjectVariable.call_method.<locals>.<genexpr>*  s.      BBc3//11BBBBBBrZ   closeTrY   )r     CALL_INTRINSIC_1throwr  r9   r   __InternalThrowException)r  r  r   r  r!   r   r  	push_manyr  r  r   r@   r  ExceptionVariableGeneratorExitr  version_infonext_instructionopnamer   rV  r    symbolic_resultr   r  r\  r   r  r  )	rr   r   r   r   r   r  retvalexc_typer  s	           r[   r  z(LocalGeneratorObjectVariable.call_method  s    :%%b)))ZKV^^ ..00 <SYY < BBTBBBBB <,Y;;;'FT"""%%b)))W__ 'F..00 8D4P4P4R4R 8-1* 1$7778%%	3M2FF  ( $///6:LLL15F.$5d;;;( 8 8 8-1* 1$777778
.%%b)) ?,\2>>>( 8 8 8-1* 1$77777, . . .
 -999----. W__ 'F
 %%bSYY!^^$q''aQQQQ$    ''++F| 6bIIH?%%b)*EhPR*S*STTT""2&&&
 )v>>>>	 1::   
 Mww""2tT6:::sI   ?A(E) )%FF*G %H(HH7I I	>K K21K2r  rB   rw   N)(r   r   r   r   r  r~   r   r   rv   r   r   r   r   r   rZ  r(  r  __repr__r  r   r>   r;  r   r  r#  r  r@   r   r  r
  r   r  r   r  r   r  r  r  r  r  r  s   @r[   r  r    s       
+n
+ S>
+ @	
+
 
+ 

+ 
+ 
+ 
+ 
+ 
+%.    +c + + + +'# ' ' ' '"e " " " "$    #    ? ? ? ? ? HV V V V&3#3 '3 S/)*	3
 
c?"	#3 3 3 3T#s(^    #T # # # ## 7 #O # # # #*.).14.	. . . .*A d    0G D    )	o	   )/78I38N/O	     	()	(0?	(		( 	( 	( 	(YD Y Y Y YI I I I Iw;#w; w; ?#	w;
 S/)*w; 
w; w; w; w; w; w; w; w; w; w;rZ   r  c                       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)r   r   r   r   rY   rZ   r[   r0  r0    s           rZ   r0  c            	            e Zd ZdZeddedededdf fdZd	 Z	de
eef         fd
Zdddee         de
eef         ddfdZdddee         de
eef         defdZ xZS )LocalGeneratorFunctionVariablezxfunctions that behaves like iterators

    .. note::

        This is a wrapper around (Nested)UserFunctionVariable
    )generator_clsr  r3  r   rw   Nc                V     t                      j        di | || _        || _        d S ry   )r  rv   r  r3  )rr   r  r3  r   r  s       r[   rv   z'LocalGeneratorFunctionVariable.__init__  s7     	""6"""*rZ   c                 h    || j         j        v rt          | |          S t          | j        |          S r   )r  r  r   r  )rr   r   s     r[   __getattr__z*LocalGeneratorFunctionVariable.__getattr__  s4    4>***4&&&tw%%%rZ   c                 4    | j                                         S r   )r  r   r   s    r[   r   z*LocalGeneratorFunctionVariable.get_globals  s    w""$$$rZ   r   rF   r   rD   c                 4    ddl m}  |j        || ||          S )Nr   )rD   )r  rD   build_inline_tracer)rr   r   r   r   rD   s        r[   _build_inline_tracerz3LocalGeneratorFunctionVariable._build_inline_tracer  s;     	QPPPPP@,@	
 
 	
rZ   rE   c                    t          | j                                                  s9t          dt	          | j                                                  dddg           |                     |t          |          |          }| j                                        }| j                                        }|                     |||| j	                  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   r3  r   )rr   r   r   r   r  rs   r   s          r[   r   z,LocalGeneratorFunctionVariable.call_function  s     DG,,..// 
	ADG,,..//. LH	 	 	 	 11"d4jj&IIw!!G''))	 !!;	 " 
 
 	
rZ   )r   r   r   r   r  r>   r  r   rv   r6  r~   r   r   r   r:  r   r   r  r  s   @r[   r2  r2    s@         ;		+ 	+ 	+	+ 		+
 	+ 
	+ 	+ 	+ 	+ 	+ 	+& & &
%T#s(^ % % % %
'
 ?#
 S/)*	

 
)
 
 
 

#
 '
 S/)*	

 

 
 
 
 
 
 
 
rZ   r2  c                   d     e Zd ZdZdedef fdZdddee         dee	ef         dd	f fd
Z
 xZS )3FunctionDecoratedByContextlibContextManagerVariablezm
    .. note::

        This is only used when the function is annotated with @contextlib.contextmanager
    r  r   c                 J     t                      j        |fdt          i| d S )Nr3  )r  rv   r0  )rr   r  r   r  s      r[   rv   z<FunctionDecoratedByContextlibContextManagerVariable.__init__0  sB    	
 	
N	
 	
 	
 	
 	
 	
rZ   r   rF   r   rw   rC   c                     t                                          |||          }t          |t          j        j        j                  sJ d|_        |S r   )r  r:  r   r  rR  symbolic_convertrC   is_generator_from_ctx_manager)rr   r   r   r   r  r  s        r[   r:  zHFunctionDecoratedByContextlibContextManagerVariable._build_inline_tracer7  sY     --b$??M*Q
 
 	
 	
 	
 04,rZ   )r   r   r   r   r>   r   rv   r   r~   r   r:  r  r  s   @r[   r=  r=  '  s         
? 
c 
 
 
 
 
 
' ?# S/)*	
 
2         rZ   r=  c                        e Zd ZdZ	 ddedef         dedeedef                  deddf
 fd	Zde	fd
Z
dee         fdZdeej                 fdZdddee         dee	ef         def fdZddde	def fdZ xZS )r+  z$Some unsupported user-defined methodNr   .r  r,  r   rw   c                      t                      j        dd|i| || _        || _        |?|                    d          ,t          |                    d          d          | _        d S d S d S )Nr   r   __func__rY   )r  rv   r  r,  r   r(   )rr   r   r  r,  r   r  s        r[   rv   zUserMethodVariable.__init__M  s}     	))B)&)))" H!5!5!A'

8(<(<jIIDNNN !A!ArZ   c                 @    | j         j         d| j         d| j         dS )Nr  rL  rM  )r  r   r   r  r   s    r[   r.  zUserMethodVariable.__repr__f  s*    .)BBDGBBtxBBBBrZ   c                     | j         gS r   r  r   s    r[   r   zUserMethodVariable.self_argsi      zrZ   c                     t           j        S r   )r   
MethodTyper   s    r[   r#  zUserMethodVariable.python_typel  s    rZ   r   rE   r   c                    ddl m}  || j                  rJg |                                 |}t	          j        | j        d          }|                    |||          S |j                                        rt          | j
        t          j                  rvt          | j        dd          }||                    d          r|dk    s| j        r;| j
                            || j        j        t#          |          || j        	          S nVt$          O| j        t$          j        j        u r7t	          j        | j                                      || j
        g|R |          S | j        rIt          | j
        j        | j        j                  }t/          |||                                 ||          S t3                                          |||          S )
Nr   )is_nonstrict_trace_callableTrN  r    z	torch.nn.ztorch.nn.utils.parametrize)constant)trace_rulesrL  r   r   r   r_  r   r   is_root_tracerr   r  NNModuleVariabler   
startswithr   r  r   r   rA   FSDPParamGroupuse_training_stateTorchCtxManagerClassVariabler  r`  r   r  )
rr   r   r   r   rL  	call_argsvarmodule_attrr   r  s
            r[   r   z UserMethodVariable.call_functiono  s    	>=====&&tw// 	<2$..**2T2I8T  C $$RF;;; 9##%% 	*Hi0+
 +
 	 "$'<<<K '**;77 (#???# @ x++($t**ftGW ,    @ ),;NNN9$'BBPPTX%%%v    	W)9::B/BvVVVww$$Rv666rZ   r   c                     |dk    r| j         S |dk    r t          j        || j        | j                  S t                                          ||          S )Nr'  rD  )r  r>   r   r   r,  r  r>  rr   r   r   r  s      r[   r>  zUserMethodVariable.var_getattr  sU    :8O: #(TWdnEEEww""2t,,,rZ   r   )r   r   r   r   r   r   r>   r
   rv   r   r.  r   r   r  r   rJ  r#  r   r~   r   r>  r  r  s   @r[   r+  r+  J  s       .. 37	J JS#XJ J HS#X./	J
 J 
J J J J J J2C# C C C C40     T%"23        ;7#;7 ';7 S/)*	;7
 
;7 ;7 ;7 ;7 ;7 ;7z-5 -S -_ - - - - - - - - - -rZ   r+  c                   p     e Zd Zdedddeddf fdZdd	d
ee         dee	ef         def fdZ
ddZ xZS )WrappedUserMethodVariablewrappedr  rG   r   rw   Nc                     |                     dd            |                     dd             t                      j        |j        |j        fi | || _        || _        d S )Nr   r  )r   r  rv   r   r  r]  r  rr   r]  r  r   r  s       r[   rv   z"WrappedUserMethodVariable.__init__  sd     	

4

5$W[;;F;;;rZ   r   rE   r   c                     | j                             |           t                                          |||          }| j                             |           |S r   r  enterr  r   exitrr   r   r   r   r   r  s        r[   r   z'WrappedUserMethodVariable.call_function  Q     	2&&r488"rZ   r  rB   c                                            fd             j                                       t          dd                     d S )Nc                  $      j                   S r   r  r  rr   s   r[   <lambda>z7WrappedUserMethodVariable.reconstruct.<locals>.<lambda>      ggdl&;&; rZ   r9   Fadd_push_nullr]  extend_outputr   rr   r  s   ``r[   r  z%WrappedUserMethodVariable.reconstruct  \    ;;;;;<<<21e<<=====rZ   r-  )r   r   r   r+  r   rv   r   r>   r~   r   r   r  r  r  s   @r[   r\  r\    s        
#
 +
 	

 

 
 
 
 
 
	#	 '	 S/)*		
 
	 	 	 	 	 	> > > > > > > >rZ   r\  c                   p     e Zd Zdedddeddf fdZdd	d
ee         dee	ef         def fdZ
ddZ xZS )WrappedUserFunctionVariabler]  r  rG   r   rw   Nc                     |                     dd             t                      j        |j        fi | || _        || _        d S )Nr   )r   r  rv   r   r]  r  r_  s       r[   rv   z$WrappedUserFunctionVariable.__init__  sL     	

4..v...rZ   r   rE   r   c                     | j                             |           t                                          |||          }| j                             |           |S r   ra  rd  s        r[   r   z)WrappedUserFunctionVariable.call_function  re  rZ   r  rB   c                                            fd             j                                       t          dd                     d S )Nc                  $      j                   S r   rh  ri  s   r[   rj  z9WrappedUserFunctionVariable.reconstruct.<locals>.<lambda>  rk  rZ   r9   Frl  ro  s   ``r[   r  z'WrappedUserFunctionVariable.reconstruct  rp  rZ   r-  )r   r   r   r   r   rv   r   r>   r~   r   r   r  r  r  s   @r[   rr  rr    s        	%	 +	 		
 
	 	 	 	 	 		#	 '	 S/)*		
 
	 	 	 	 	 	> > > > > > > >rZ   rr  c                     dt           dt          fdfd|D             }fd|                                D             } ||i |}| j                            ||t          |                    S )Nxrw   c                     |                                  r"t          d|                                           S |                                 S )NrL   )	is_tensorr	   get_real_valuer  )rx  s    r[   convertz-invoke_and_store_as_constant.<locals>.convert  sA    ;;== 	>(!,,;;===##%%%rZ   c                 &    g | ]} |          S rY   rY   )rD  rx  r|  s     r[   rF  z0invoke_and_store_as_constant.<locals>.<listcomp>  s!    %%%1GGAJJ%%%rZ   c                 .    i | ]\  }}| |          S rY   rY   )rD  r   r   r|  s      r[   rI  z0invoke_and_store_as_constant.<locals>.<dictcomp>  s'    7771a777rZ   r  )r>   r   r   r   register_attr_or_moduler+   )r   r   r   r   r   resr|  s         @r[   r`  r`    s    &? &s & & & &
 &%%%%%%D7777777F
"d
f

C9,,d## -   rZ   c                        e Zd Zdhej        Z	 d#dededeeef         de	e         de	e         de	e         de	e         d	e	e         d
eddf fdZ
dee         fdZdej        fdZdefdZdej        fdZdddededefdZdddedee         d
eeef         def
 fdZdefdZdddedef fdZdddedef fdZdefdZdeeef         fdZdddee         d
eeef         deeef         fdZd$d"Z xZ S )%r   r   Nrp  rs   r{   r}   r   r   
wrapped_fnr   rw   c	                    |	                     d          "|	                    t                                  t                      j        di |	 t          |                                t                    sJ t          |                                t          j	                  sJ t          |t                    sJ || _        || _        || _        || _        || _        || _        || _        || _        d S )Nmutation_typer  rY   )r   updater;   r  rv   r   r  r   r   r  r~   rp  rs   r   r{   r}   r   r   r  )rr   rp  rs   r   r{   r}   r   r   r  r   r  s             r[   rv   z#NestedUserFunctionVariable.__init__  s     ::o&&.MM(<(>(>M???""6"""'4466<<<<<$1133U^DDDDD)T*****	" $&5?rZ   c                     g S r   rY   r   s    r[   r   z$NestedUserFunctionVariable.self_args+  r   rZ   c                 4    | j                                         S r   )rs   r  r   s    r[   r   z#NestedUserFunctionVariable.get_code.  s    y++---rZ   c                     t           j        S r   r"  r   s    r[   r#  z&NestedUserFunctionVariable.python_type1  r$  rZ   c                 *   | j         rt          t          j        | j                                        | j        | j                                                  }| j        r| j                                        |_	        | j
        r| j
                                        |_        | j        rj| j                                        }t          |t                    rddlm} t#           ||                    }t          |t"                    sJ ||_        |S )Nr   r   )r   r   r   r   rs   r  r   rp  r{   rz   r}   r|   r   r   r   r   r   r~   r   )rr   r_   r   r   s       r[   r   z'NestedUserFunctionVariable.get_function4  s   < 	&%%!I((**NL++--
 

 = 	C $ @ @ B BD? 	G"&/"D"D"F"FD 		/*==??K+u-- :......"88K#8#899 k400000#.D rZ   r   rE   name_varr   c                 l    |j         j                            | |j        |           t	          d           S r   )r   r   
store_attrr  r@   )rr   r   r  r   s       r[   call_setattrz'NestedUserFunctionVariable.call_setattrL  s1     		))$DDD%%%rZ   r   r   c                     |dk    r | j         |g|R  S t                                          ||t          |          |          S )N__setattr__)r  r  r  r   rr   r   r   r   r   r  s        r[   r  z&NestedUserFunctionVariable.call_methodU  sO     =  $4$R/$////ww""2tT$ZZ@@@rZ   c                     | j         d uS r   )r   r   s    r[   has_closurez&NestedUserFunctionVariable.has_closure`  s    |4''rZ   c                    |dk    r|                                  S |dk    r|                                 S |dk    r)t          | dd           }|r|                                nd S t	                                          ||          S )Nr   ra   rz   r{   )r   r   r   r  r  const_getattr)rr   r   r   dr  s       r[   r  z(NestedUserFunctionVariable.const_getattrc  s    :==??":==??">!!j$//A-.81'')))D8ww$$R...rZ   c                    |dk    r-t           j                            t          | d                    S |dk    r-t           j                            t          | d                    S t	                                          ||          S )Nra   rs   rz   r{   )r   r@   r   r   r  r   rZ  s      r[   r   z+NestedUserFunctionVariable.call_obj_hasattrm  sw     :-44WT65J5JKKK>!!-44WT:5N5NOOOww''D111rZ   c                     dS r  rY   r   s    r[   r(  z#NestedUserFunctionVariable.has_selfv  r  rZ   c                     | j         S r   r  r   s    r[   r   z&NestedUserFunctionVariable.get_globalsy  r  rZ   r   c                 &   |                                  }t          j        || j        | j                                        | j        rt          | j        j                  nd t          d t          t          |                                  j                            D                                 }| j        r| j                                        |_         t          j        |          j        |i |}|                                 t'          |j                                                  }t+          |j        j        |           t1          |||           t3          |j                  D ]"\  }}	|	|vsJ | j        j        |         }
|
||	<   #|S )Nc              3   4   K   | ]}t          d           V  d S r   )r8   )rD  _s     r[   r  z7NestedUserFunctionVariable.bind_args.<locals>.<genexpr>  s(      SSa)D//SSSSSSrZ   )r   r   r   r   rp  r  r{   r   r   r   r   r1  r}   keys_as_python_constantr|   r   rW  rX  apply_defaultsr~   rY  r   r   r0  r   r   r   )rr   r   r   r   rs   r_   rN   r   r   r   r6  s              r[   r;  z$NestedUserFunctionVariable.bind_args|  st    }}!NL++--*.-AE$-%&&&TSS5T]]__5P1Q1Q+R+RSSSSS
 
 ? 	L"&/"I"I"K"KD,!$'',d=f==eo++--...777ffd+++"4#344 	  	 ICv%%%%<%c*DF4LLrZ   r  rB   c                                         fd            | j                                                           | j                  g            t          j        | j        j        j                             | j	        r | j	                   n)                    
                    d           g           | j        r | j                   n)                    
                    d           g           | j        r | j                   n)                    
                    d           g           | j        rd	 | j                                        }                                        |          g           nI# t          $ r  | j                   Y n-w xY w                    
                    d           g                               t!          dd                     | j        r                     fd            | j                                       t!          dd                                         t%          d                                         t!          dd                     dd	lm}  |j                    }|j        j                            |           r|j        j        j        |                                          D ]]\  }}                                  |                               t%          d                                         |           \d S d S )
Nc                  :                          t          d          S )Nr   )load_import_fromr   r  s   r[   rj  z8NestedUserFunctionVariable.reconstruct.<locals>.<lambda>  s    G,,X7JKK rZ      Fc                  0                          dd          S )N	functoolswrapsr  r  s   r[   rj  z8NestedUserFunctionVariable.reconstruct.<locals>.<lambda>  s    00gFF rZ   r9   r   Tr   )rE   )rm  rs   rn  create_load_const_uncheckedr   r@   r   r  r   r{   create_load_constr   r}   r   r  r   r   r  r   r  rE   r  r   r   has_pending_mutationstore_attr_mutationsr   dup_topr  )rr   r  r   rE   r   r   r  s    `     r[   r  z&NestedUserFunctionVariable.reconstruct  s   KKKK	
 	
 	
 		wBB4>RRSTTT '	(?@@AAA= 	EGDM""""!!7#<#<T#B#B"CDDD< 	EGDL!!!!!!7#<#<T#B#B"CDDD? 	EGDO$$$$!!7#<#<T#B#B"CDDD 		E*".AACC%%88EEF    ' * * *()))))* !!7#<#<T#B#B"CDDD21e<<===? 	A!!FFFF   GDO$$$!!"6q%"@"@AAA!!,q//222!!"6q$"?"?@@@ 	IHHHHH-"-//9!66t<< 	)!y5J egg) )e !!!%%l1oo666""4((((	) 	)) )s   AF F/.F/r   r-  )!r   r   r   r   r  r>   r~   r   r   r
   rv   r   r   r   r  r   r  r#  r   r   r  r   r  rZ  r  r  r@   r   r(  r   r;  r  r  r  s   @r[   r   r     s2       	!	0N  15@ @ @ @ S>	@
 ?+@ _-@ o.@ /*@ _-@ @ 
@ @ @ @ @ @:40    .%. . . . ."T " " " "e0    0&#& "& 	&
 
& & & &	A#	A 	A '		A
 S/)*	A 
	A 	A 	A 	A 	A 	A(T ( ( ( (/ 7 /s /s / / / / / /2)2142	2 2 2 2 2 2$    T#s(^    ' ' S/)*	
 
c?"	#   :8) 8) 8) 8) 8) 8) 8) 8)rZ   r   c                   p     e Zd Zdedddeddf fdZdd	d
ee         deeef         def fdZ	ddZ
 xZS )!WrappedNestedUserFunctionVariabler]  r  rG   r   rw   Nc           
      $   |                     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 )	Nrp  rs   r   r{   r}   r   r   r  )r   r  rv   rp  rs   r   r{   r}   r   r   r  r]  r  r_  s       r[   rv   z*WrappedNestedUserFunctionVariable.__init__  s    	

9d###

64   

;%%%

:t$$$

<&&&

=$'''

9d###

<&&&OLO		
 		
 		
 rZ   r   rE   r   c                     | j                             |           t                                          |||          }| j                             |           |S r   ra  rd  s        r[   r   z/WrappedNestedUserFunctionVariable.call_function  re  rZ   r  rB   c                                            fd             j                                       t          dd                     d S )Nc                  $      j                   S r   rh  ri  s   r[   rj  z?WrappedNestedUserFunctionVariable.reconstruct.<locals>.<lambda>  rk  rZ   r9   Frl  ro  s   ``r[   r  z-WrappedNestedUserFunctionVariable.reconstruct  rp  rZ   r-  )r   r   r   r   rv   r   r>   r~   r   r   r  r  r  s   @r[   r  r    s         + 	
 
     6	#	 '	 S/)*		
 
	 	 	 	 	 	> > > > > > > >rZ   r  c            	            e Zd Zddhej        Zddedee         deddf fdZdefdZ	e
dededd fd	            Zd
ddee         deeef         defdZd
ddedefdZd
ddedefdZd Zd Zd Z xZS )SkipFunctionVariabler  reasonNr   rw   c                 V     t                      j        di | || _        || _        d S ry   )r  rv   r  r  )rr   r  r  r   r  s       r[   rv   zSkipFunctionVariable.__init__  s2    ""6"""
rZ   c                     | j         S r   r  r   s    r[   r  z'SkipFunctionVariable.as_python_constant  s
    zrZ   r   c                    t          j        |dd          r]|}|}t          |dd          r(|j        }t	          |d          }t          |dd          (|                    t          j                   n|t          j        |          r-t          |                    t          j
                             n;t          |          s,t          |                    t          j                              | ||          S )N_torchdynamo_disableF_torchdynamo_orig_callabler  )r   r   r   r  r(   r  r&   r  	isbuiltinr'   BUILTIN_MATCHr6   )r	  r  r   guard_on_sourceguard_on_values        r[   r
  z'SkipFunctionVariable.create_with_source  s    !%)?GG 	I %O"N.*FNN !/!J",#%A# # .*FNN  &&|'ABBBBu%% 	I&++L,FGGHHHH077 	I &++L,FGGHHHs5((((rZ   r   rE   r   c           	      f   t          j        | j        dd          rOt          j        | j        dd           }t          dt	          | j                  d| j         d| ddg	           d S | j        t
          j        j        u rK|                    d
          }|r|	                                }t          dd| d| dd| dg	           d S | j        t
          j        j
        u rS|                    d
          }|r|	                                }nd}t          t          |j        d|                     | j        t
          j        j        u rt          t           j        rMddlm} |                    || j                  }t+          |t,                    s|                    |||          S t1          | j        dd          }	t1          | j        dd           }
|
dnt	          |
          }	 t          j        | j                  }d|	 d| d}d|	 dg}d|vr|d|	 d d!gz  }n# t4          $ r d"d#h}|
|v rd$| d%|	 d}d&d'g}n|
_|
                    d(          rJd)| d%|	 d%}d*g}t
          j        j                            |d+z   d+                    |          z              nJd,| d%|	 d-}d.d/g}t
          j        j                            |d+z   d+                    |          z              Y nw xY w|	d0k    rd1}g }| j        r| j        nd2}t          d3d4| d5|	 d6| ||	           d S )7Nr  F_torchdynamo_disable_msgz1Skip calling `torch.compiler.disable()`d functionzSkip calling function `z>` since it was wrapped with `torch.compiler.disable` (reason: rM  z(Remove the `torch.compiler.disable` callr  ro  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.rM  z9Skip frame due to `torch._dynamo.skip_frame()`. Message: r9   SourcelessBuilderr   z<unknown qualname>r   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`.rR  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. r   z*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  rR  graph_breakr   r  
skip_framer"   r   f_codestep_unsupportedr#   r   dont_skip_tracingbuilderr  r   r   r  r   r   getfiler   rR  rV   	warn_oncejoinr  )rr   r   r   r   ro  graph_break_msgskip_frame_msgr  
rebuilt_fnqualname	module_orr  pathr  r  known_python_builtin_modulesr  s                    r[   r   z"SkipFunctionVariable.call_function+  s    !$*.DeLL w	(5OQUVVCKDJAdj A A:=A A A ?      Z5=444$jj//O G"1"D"D"F"F?e4ee\beeeT?TTD	      Z5=333#ZZ..N $!/!B!B!D!D!#)I`P^``    Z5=999!!' F666666 /55b$*EE
!*.BCC F%33BfEEEtz>;OPPH
L$??I090A,,s9~~K8Ytz22>V^ > > $> > > 
 @8??? D((lU] l l l ;	 E  %Y %Y %Y06/D, <<<7'7 7*27 7 7  
iGEE *y/C/CH/M/M*"h{"h"h]e"h"h"hK^E
 M'11+2DtyyQVGWGW2WXXXXb+ b bX` b b b  m;E M'11+2DtyyQVGWGW2WXXXK%YL +++? 
 $(KGT[[5GFF];]]H]]U[]]'	     s   18H* *CK87K8r   c                 f    t           j                            t          | j        |                    S r   )r   r@   r   r   r  r  s      r[   r   z%SkipFunctionVariable.call_obj_hasattr  s'     )00T1J1JKKKrZ   c                 v    |t           v rt          j        | |          S t          || j        | j        |          S r   )r3   r   r=  r   r  r   r  s      r[   r>  z SkipFunctionVariable.var_getattr  s9    ))),T4888b$*dk4@@@rZ   c                     dS r   rY   r   s    r[   r  z'SkipFunctionVariable.is_python_hashable  r   rZ   c                 *    t          | j                  S r   )r  r  r   s    r[   r  z$SkipFunctionVariable.get_python_hash  s    DJrZ   c                 V    |                                  |                                 k    S r   rB  r  s     r[   r  z$SkipFunctionVariable.is_python_equal  s%    &&((E,D,D,F,FFFrZ   r   )r   r   r   r>   r  r   r
   r   rv   r  r  r   r
  r   r~   r   r@   r   r>  r  r  r  r  r  s   @r[   r  r    s        
	'N c 8C= 3 SW      
C     )s )F )?U ) ) ) [)4}#} '} S/)*	}
 
} } } }~L)L14L	L L L L
A5 AS A_ A A A A       G G G G G G GrZ   r  c                   p     e Zd Zdedddeddf fdZdd	d
ee         deeef         def fdZ	ddZ
 xZS )WrappedSkipFunctionVariabler]  r  rG   r   rw   Nc                     |                     dd            |                     dd             t                      j        |j        fd|j        i| || _        || _        d S )Nr  r  )r   r  rv   r  r  r]  r  r_  s       r[   rv   z$WrappedSkipFunctionVariable.__init__  sg     	

7D!!!

8T"""HHw~HHHHrZ   r   rE   r   c                     | j                             |           t                                          |||          }| j                             |           |S r   ra  rd  s        r[   r   z)WrappedSkipFunctionVariable.call_function  re  rZ   r  rB   c                                            fd             j                                       t          dd                     d S )Nc                  $      j                   S r   rh  ri  s   r[   rj  z9WrappedSkipFunctionVariable.reconstruct.<locals>.<lambda>  rk  rZ   r9   Frl  ro  s   ``r[   r  z'WrappedSkipFunctionVariable.reconstruct  rp  rZ   r-  )r   r   r   r>   r   rv   r   r~   r   r   r  r  r  s   @r[   r  r    s        
 
 +
 	

 

 
 
 
 
 
	#	 '	 S/)*		
 
	 	 	 	 	 	> > > > > > > >rZ   r  c                        e Zd ZdZdedededdf fdZdd	d
edef fdZde	e         fdZ
dd	dee         deeef         defdZ x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".
    wrapper_objattr_to_tracer   rw   Nc                 V     t                      j        di | || _        || _        d S ry   )r  rv   r  r  )rr   r  r  r   r  s       r[   rv   z$WrapperUserFunctionVariable.__init__  s6    ""6"""&*rZ   r   rE   r   c                     || j         k    rLt          | j        | j                   }| j        ot	          | j        |          }t          j        |||          S t                                          ||          S r   )	r  r   r  r   r(   r>   r   r  r>  )rr   r   r   r   r   r  s        r[   r>  z'WrapperUserFunctionVariable.var_getattr  sm    4%%%$*D,>??C[BZT%B%BF"(S&999ww""2t,,,rZ   c                     g S r   rY   r   s    r[   r   z%WrapperUserFunctionVariable.self_args  r   rZ   r   c                    t          | j        d          rot          | j        | j        d           }t          |dd          pd}|                    dd          d         dk    rd	}t
          j        j                            |           t
          j        j        j	        
                    d
          }|                    t          j                  rt
          j        j                                        }t!                      |z   }|d         j        |d         j        f}	d                    t)          j        |                    }
d|	d          d|	d          d}|t-          |
          z  }|                    |           |                                 t3          |          z   }t5          j        t8          j                                      || t5          j        | j                  g||          S )N
cache_infor   rM  r  r9   )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  rR  rV   r  logging	getLoggerisEnabledForDEBUG_guardsTracingContextextract_stackr   filenamelinenor  	tracebackformat_listr   debugr   r   r   r   r   getattr_and_tracer   r@   )rr   r   r   r   	target_fnr  ro  dynamo_logger
user_stack	frame_locuser_stack_formatteduser_stack_traceall_argss                r[   r   z)WrapperUserFunctionVariable.call_function  s    4#\22 	: 0$2DdKKI!)\2>>D"K  q 11!4??K  #--c222 % 3 ; E Eo V V --gm<< :!&!=!K!K!M!MJ!7!9!9J!FJ!+B!8*R.:O PI+-7793H3T3T+U+U('rS\]^S_'r'rbklmbn'r'r'r$$,@(A(AA$!''(8999>>##d4jj0-'
 

-9-d.@AAMHM
 
	
rZ   )r   r   r   r   r   r   rv   r>   r>  r   r   r   r~   r   r  r  s   @r[   r  r    s         +C + +s +t + + + + + +
-5 -S -_ - - - - - -40    &
#&
 '&
 S/)*	&

 
&
 &
 &
 &
 &
 &
 &
 &
rZ   r  c            
       P     e Zd ZdZdededededdf
 fdZdee         fd	Z	 x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.
    r  r  self_objr   rw   Nc                 L     t                      j        ||fi | || _        d S r   )r  rv   r  )rr   r  r  r  r   r  s        r[   rv   z"WrapperUserMethodVariable.__init__%  s1     	m>>v>>>rZ   c                     | j         gS r   rG  r   s    r[   r   z#WrapperUserMethodVariable.self_args/  rH  rZ   )r   r   r   r   r   r   r>   rv   r   r   r  r  s   @r[   r  r    s           "	
  
     40        rZ   r  c                  R    t           j                                        rddlm}  | S i S )Nr   traceable_collective_remaps)r  distributedis_available)torch.distributed._functional_collectivesr  r  s    r[   _traceable_collective_remapsr  3  sD    %%'' +	
 	
 	
 	
 	
 	
 +*IrZ   c                     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  valuesr   import_sourcer(   )r   r   
inner_namepath_sources       r[   _traceable_collectives_sourcer  >  sw     ))++BB-BBBB-//66888888J""#NOOKk:...rZ   c                       e Zd ZdZdedef         dededdf fdZed	d
dedef         de	dedd f
d            Z
ededefd            Zed	d
dedef         deeef         fd            Zd	d
dee         deeef         defdZ x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.
    r   .replacement_varr   rw   Nc                x     t                      j        |fi | t          |t                    sJ || _        d S r   )r  rv   r   r   r  )rr   r   r  r   r  s       r[   rv   z*CollectiveFunctionRewriteVariable.__init__T  sI     	&&v&&&/+?@@@@@.rZ   r   rE   old_fnr   optionsc                 x    t                               | |          \  }}t          |ft          |fd|i||d|S )Nr   )r  r   )r  rw  r   )r   r  r   r  new_fn
new_sources         r[   r   z(CollectiveFunctionRewriteVariable.create_  sb     ?FFr6RR
0
0VV
VgVV
 
 	
 
 	
rZ   variablec                 J    t          j        |           o| t                      v S r   )r   
isfunctionr  )r!  s    r[   can_rewritez-CollectiveFunctionRewriteVariable.can_rewriten  s(     x((WX9U9W9W-W	
rZ   c                 N    t                      |         }|t          | |          fS r   )r  r  )r   r   r  s      r[   rw  z)CollectiveFunctionRewriteVariable.rewritet  s*     .//34R@@@@rZ   r   c                 |   dd l m} ddlm} t	          j        | j                  }t           |j        |i |j	                  }d}d|v rN|d         
                                r4t          d| j         d|d|d| j         g t          j        	           | j        |j        |j        |j        fv rn|                    d
          }||j        n|j        d
         j        }||vrt+          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  r'  r   rW  r   r~   rX  rY  r  r$   r   SUPPORTABLE
all_reducereduce_scatter_tensor_reduce_scatter_baser   r  
parametersdefaultr3  r   r@   r   r  r   )	rr   r   r   r   distr'  rW  reduce_op_var	reduce_ops	            r[   r   z/CollectiveFunctionRewriteVariable.call_function{  s    	)(((((NNNNNN %dg..	nind5f55?@@F:$6$I$I$K$KC788d88v88[RVRY[[&2	    7O&%
 
 

 #JJt,,M !, ##)$/7 
  000 !Jy!J!JKKK$5<< + F4L #11"dFCCCrZ   )r   r   r   r   r   r   r   rv   r  r   r   rZ  r$  r   r(   rw  r   r>   r~   r   r   r  r  s   @r[   r  r  I  s        	/S#X	/ .		/
 	/ 
	/ 	/ 	/ 	/ 	/ 	/ 
#
c"
 
 	

 
-
 
 
 \
 
c 
d 
 
 
 \

 A#A)1#s();A	sJ	A A A \A,D#,D ',D S/)*	,D
 
,D ,D ,D ,D ,D ,D ,D ,DrZ   r  c                   L     e Zd Zdddee         deeef         def fdZ xZS )FunctoolsWrapsVariabler   rE   r   r   rw   c                     |s;t                    dk    r(dt          dt          ffd}t          j        |          S t                                          ||          S )Nr9   r   rw   c                     t          | t          j                  r|                     d                   S t	          d|  dg t
          j                   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   r,  )r   r   s    r[   r  z3FunctoolsWrapsVariable.call_function.<locals>.wraps  sl    b)"FGG 888tAw8777-!G *6	     rZ   )r   r   r>   r   LambdaVariabler  r   )rr   r   r   r   r  r  s     `  r[   r   z$FunctoolsWrapsVariable.call_function  sw      	3#d))q..
# 
/ 
 
 
 
 
 
 +E222ww$$Rv666rZ   )	r   r   r   r   r>   r~   r   r   r  r  s   @r[   r6  r6    sr        7#7 '7 S/)*	7
 
7 7 7 7 7 7 7 7 7 7rZ   r6  c                   N    e Zd ZdefdZdddee         deeef         defdZ	dS )	CollectionsNamedTupleFunctionrw   c                     | j         S r   r  r   s    r[   r  z0CollectionsNamedTupleFunction.as_python_constant  r  rZ   r   rE   r   r   c                    t          ||          }|r	  | j        d |D             i d |                                D             }n`# t          $ rS}t	          t          |          |t          t          t          j	        |j
                                       Y d }~nd }~ww xY wt          j        |t                                S t          dd|d|dg t          j        	           d S )
Nc                 6    g | ]}|                                 S rY   rB  rD  rx  s     r[   rF  z?CollectionsNamedTupleFunction.call_function.<locals>.<listcomp>  $    ;;;a**,,;;;rZ   c                 >    i | ]\  }}||                                 S rY   rB  rD  r   r   s      r[   rI  z?CollectionsNamedTupleFunction.call_function.<locals>.<dictcomp>  *    LLLTQq!..00LLLrZ   r   r  znamedtuple constructionzargs=r)  z?`torch.compile` only support certain input types for namedtupler  )r1   r   r   r   r!   r  r   mapr@   r   r   r   UserDefinedClassVariabler=   r$   r   r,  )rr   r   r   r   constant_argsr  r  s          r[   r   z+CollectionsNamedTupleFunction.call_function  sP    ,D&99 	
;;d;;;LLV\\^^LLL     (IIc"2"938DDEE         5.00   
 	-)t))))Y".		
 	
 	
 	
 	
 	
s   3A 
B%A	B  B%N)
r   r   r   r   r  r   r>   r~   r   r   rY   rZ   r[   r<  r<    sx        C    
#
 '
 S/)*	

 

 
 
 
 
 
rZ   r<  c            
            e Zd Zdedee         deeef         deddf
 fdZde	fdZ
ddZdefdZdddee         deeef         defdZdddedefdZdddedefdZdefdZdefdZdefdZd Zd Z xZS )FunctoolsPartialVariabler_   r   keywordsr   rw   Nc                      t                      j        di | || _        t          |t                    sJ || _        t          |t                    sJ || _        t          j	        t                    | _        d S ry   )r  rv   r_   r   r   r   r~   rJ  r  partialr4   
fake_value)rr   r_   r   rJ  r   r  s        r[   rv   z!FunctoolsPartialVariable.__init__  s{     	""6"""	$%%%%%	(D)))))  $+H55rZ   c                     t           j        S r   )r  rL  r   s    r[   r#  z$FunctoolsPartialVariable.python_type  s      rZ   r  rB   c                 ^                        fd            | j                   | j        r                    | j                   | j        s:                    t          t          | j                  dz   d                     d S                     | j                                                   t          | j        
                                          }                                        t          |          t          | j                  z   dz   |d                     d S )Nc                  0                          dd          S )Nr  rL  r  r  s   r[   rj  z6FunctoolsPartialVariable.reconstruct.<locals>.<lambda> 	  s    g&>&>{I&V&V rZ   r9   F)rm  r_   r   foreachrJ  rn  r   r   r  r   keyscreate_call_function_kw)rr   r  rR  s    ` r[   r  z$FunctoolsPartialVariable.reconstruct  s   VVVVWWW	9 	'OODI&&&} 	!!"6s49~~7I5"Q"QRRRF,,..///T]''))**++CIIDI,F,JDRWXX	
 	
 	
 	
 	
rZ   c                 *    |                                  S r   rB  r   s    r[   r   z%FunctoolsPartialVariable.get_function	      &&(((rZ   r   rE   c                 ~    | j         t          |          z   }i | j        |}| j                            |||          S r   )r   r   rJ  r_   r   )rr   r   r   r   merged_argsmerged_kwargss         r[   r   z&FunctoolsPartialVariable.call_function	  sA     i$t**,34=3F3y&&r;FFFrZ   r   c                     t           j                            t          t	          j        t                    |                    S r   )r   r@   r   r   r  rL  r4   r  s      r[   r   z)FunctoolsPartialVariable.call_obj_hasattr	  s7     )00I%h//66
 
 	
rZ   c                 ~   | j         ot          | j         |          }|dk    r| j        S |dk    rt          j        | j        |          S |dk    r9d | j                                        D             }t          j        ||          S |t          v rt          j
        | |          S t          t          |           d S )Nr_   r   r  rJ  c                 >    i | ]\  }}t          j        |          |S rY   )r@   r   rC  s      r[   rI  z8FunctoolsPartialVariable.var_getattr.<locals>.<dictcomp>+	  s*    UUUtq!%,Q//UUUrZ   )r   r(   r_   r   rK   r   rJ  r   ConstDictVariabler3   r=  r!   r   )rr   r   r   r   r   s        r[   r>  z$FunctoolsPartialVariable.var_getattr#	  s    >DK!>!>6>>96>>)$)FCCCC:UUt}?R?R?T?TUUUE.uVDDDD))),T4888 44444rZ   c                     t          j        | j                                        gd | j        D             R i d | j                                        D             S )Nc                 6    g | ]}|                                 S rY   rB  rC  s     r[   rF  z?FunctoolsPartialVariable.as_python_constant.<locals>.<listcomp>4	  s$    <<<3c$$&&<<<rZ   c                 >    i | ]\  }}||                                 S rY   rB  rC  s      r[   rI  z?FunctoolsPartialVariable.as_python_constant.<locals>.<dictcomp>5	  s*    KKKTQq!&&((KKKrZ   )r  rL  r_   r  r   rJ  r   r   s    r[   r  z+FunctoolsPartialVariable.as_python_constant1	  sq     I((**
<<$)<<<
 
 
 LKT]5H5H5J5JKKK
 
 	
rZ   c                     t          j        | j                                        gd | j        D             R i d | j                                        D             S )zcSimilar to as_python_constant(), but add ID_MATCH guards to try to force things to become constantsc                 6    g | ]}|                                 S rY   guard_as_python_constant)rD  r   s     r[   rF  zEFunctoolsPartialVariable.guard_as_python_constant.<locals>.<listcomp><	  s$    >>>qa((**>>>rZ   c                 >    i | ]\  }}||                                 S rY   rb  rC  s      r[   rI  zEFunctoolsPartialVariable.guard_as_python_constant.<locals>.<dictcomp>=	  s*    QQQ41aq!,,..QQQrZ   )r  rL  r_   rc  r   rJ  r   r   s    r[   rc  z1FunctoolsPartialVariable.guard_as_python_constant8	  sq     I..00
>>DI>>>
 
 
 RQ4=;N;N;P;PQQQ
 
 	
rZ   c                     | j                                         oMt          d | j        D                       o/t          d | j                                        D                       S )Nc              3   >   K   | ]}|                                 V  d S r   r  rC  s     r[   r  z>FunctoolsPartialVariable.is_python_hashable.<locals>.<genexpr>C	  s.      BBC**,,BBBBBBrZ   c              3   >   K   | ]}|                                 V  d S r   rg  rD  r  s     r[   r  z>FunctoolsPartialVariable.is_python_hashable.<locals>.<genexpr>D	  s.      SS5E,,..SSSSSSrZ   )r_   r  r  r   rJ  r  r   s    r[   r  z+FunctoolsPartialVariable.is_python_hashable@	  sh    I((** TBB	BBBBBTSSDM<P<P<R<RSSSSS	
rZ   c                     | j                                         }d | j        D             }d | j                                        D             }t          |g||R           S )Nc              3   >   K   | ]}|                                 V  d S r   r  rC  s     r[   r  z;FunctoolsPartialVariable.get_python_hash.<locals>.<genexpr>I	  s.      @@sS((**@@@@@@rZ   c              3   >   K   | ]}|                                 V  d S r   rl  ri  s     r[   r  z;FunctoolsPartialVariable.get_python_hash.<locals>.<genexpr>J	  s.      SS5u,,..SSSSSSrZ   )r_   r  r   rJ  r  r  )rr   	func_hash	args_hashvalues_hashs       r[   r  z(FunctoolsPartialVariable.get_python_hashG	  si    I--//	@@di@@@	SSDM<P<P<R<RSSSY99[99:::rZ   c                 L   | j                             |j                   ot          d t          | j        |j                  D                       oTt          d t          | j                                        |j                                                  D                       S )Nc              3   F   K   | ]\  }}|                     |          V  d S r   r  )rD  arg_aarg_bs      r[   r  z;FunctoolsPartialVariable.is_python_equal.<locals>.<genexpr>P	  sH        "UE %%e,,     rZ   c              3   F   K   | ]\  }}|                     |          V  d S r   rs  )rD  value_avalue_bs      r[   r  z;FunctoolsPartialVariable.is_python_equal.<locals>.<genexpr>T	  sH        &Wg ''00     rZ   )r_   r  r  r   r   rJ  r  r  s     r[   r  z(FunctoolsPartialVariable.is_python_equalM	  s    I%%ej11 
  &)$)UZ&@&@    

   *-M((**EN,A,A,C,C+ +    	
rZ   r-  )r   r   r   r>   r   r~   r   r   rv   r  r#  r  r   r   r@   r   r>  r  rc  rZ  r  r  r  r  r  s   @r[   rI  rI    s       66 '6 sO+,	6
 6 
6 6 6 6 6 6"!T ! ! ! !
 
 
 
)c ) ) ) )G#G 'G S/)*	G
 
G G G G
)
14
	
 
 
 
55 5S 5_ 5 5 5 5
C 
 
 
 

# 
 
 
 

D 
 
 
 
; ; ;
 
 
 
 
 
 
rZ   rI  c            
           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                        Zede
dedd fd	            Zded
e
ddf fdZede	de
f         fd            ZdefdZde
fdZdddee         d
eeef         defdZdddedee         d
eeef         def
dZde
fdZ xZS )PolyfilledFunctionVariabler   r  traceable_fnrw   .c                     i S r   rY   )r	  s    r[   _get_polyfill_handlersz1PolyfilledFunctionVariable._get_polyfill_handlerse	  s	     	rZ   r  r   c                 t    t          |                    t          j                              | ||          S r  r  r  s      r[   r
  z-PolyfilledFunctionVariable.create_with_sourcej	  s8     	f''(BCCDDDs5((((rZ   r   Nc                 v    t                      j        di | || _        |                                                     ||          }d }t          |          sJ d| d|             dD ]*}t          ||d           }|rt          |          sJ |} n+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  rv   r   r}  r   callabler   rV  r  r{  )rr   r   r   handlerr{  candidate_attr	candidater  s          r[   rv   z#PolyfilledFunctionVariable.__init__r	  s   ""6"""--//33B;;  XX"Xg"X"XTV"X"XXXX
 	 	N  >>I 	*****(
 PGPPP   " ,rZ   c                     | j         S r   )r{  r   s    r[   polyfill_fnz&PolyfilledFunctionVariable.polyfill_fn	  s      rZ   c                 .    t          | j        dd          S )N*__torch_dynamo_can_constant_fold_through__F)r   r  r   s    r[   can_constant_fold_throughz4PolyfilledFunctionVariable.can_constant_fold_through	  s    OI5
 
 	
rZ   c                 *    |                                  S r   rB  r   s    r[   r   z'PolyfilledFunctionVariable.get_function	  rU  rZ   r   rE   r   c                 N   |                                  rXt          ||          rH | j        d |D             i d |                                D             }t	          j        ||          S | j        t          j        u rt          |          dk    r|st          |d         t          j        t          j        f          rt          d |d         j        D                       rt          j                            ||j                            dt$          j        t)          d |d         j        D                       fi           t%          j        d |d         j        D                       	          S t	          j        || j                  }|                    |||          S )
Nc                 6    g | ]}|                                 S rY   rB  r@  s     r[   rF  z<PolyfilledFunctionVariable.call_function.<locals>.<listcomp>	  rA  rZ   c                 >    i | ]\  }}||                                 S rY   rB  rC  s      r[   rI  z<PolyfilledFunctionVariable.call_function.<locals>.<dictcomp>	  rD  rZ   r9   r   c              3      K   | ]t}|                                 r't          |                                t                    p4t          |t          j                  o|                                t          u V  ud S r   )r  r   r  intr   SymNodeVariabler#  r@  s     r[   r  z;PolyfilledFunctionVariable.call_function.<locals>.<genexpr>	  s          %%''SJq7K7K7M7Ms,S,S Yq)";<<WTWAW     rZ   r   c              3   >   K   | ]}|                                 V  d S r   as_proxy)rD  as     r[   r  z;PolyfilledFunctionVariable.call_function.<locals>.<genexpr>	  s*      ??A1::<<??????rZ   c                 l    g | ]1}|                                 r|                                n|j        2S rY   )r  r  sym_numr@  s     r[   rF  z<PolyfilledFunctionVariable.call_function.<locals>.<listcomp>	  sQ          !3355+A00222!"	  rZ   )r  )r  r2   r   r   r>   r   builtinssumr   r   r   rK   TupleVariabler  r  r   r   create_proxyr  sym_sumr   r{  r   )rr   r   r   r   r   traceable_function_variables         r[   r   z(PolyfilledFunctionVariable.call_function	  s    ))++ 		50M&1
 1
 		5 ;;d;;;LLV\\^^LLL   #(V444 Gx|##D		Q 47Y%;Y=T$UVV     a      ,33	&&#M??a?????A	    "&a  	 	 4   ( '6&;B@Q&R&R#*88T6JJJrZ   r   c                 J   |dk    r|                      |||          S t          | j        |d           }|s*t          |          st	          |d| d| j                    i }| j        rt          | j        |          |d<   t          |fi |}|                     |||          S )N__call__zCannot find callable z in r   )r   r   r   r5   r<   r   r(   rz  )rr   r   r   r   r   methodr  polyfilled_method_variables           r[   r  z&PolyfilledFunctionVariable.call_method	  s     :%%b$777$-- 	R+f-- 	R %PT%P%Ptw%P%PQQQ; 	> *4; = =GH%?%R%R'%R%R")77D&IIIrZ   c                     | j         S r   r  r   s    r[   r  z-PolyfilledFunctionVariable.as_python_constant	  r  rZ   )r   r   r   r>   r  r  r  cacher~   r   r   r   r   r}  r   r
  rM   rv   propertyr  rZ  r  r   r   r   r   r   r  r  r  r  s   @r[   rz  rz  ]	  s        
	'	N _tHS#X,>@R,R'S    _ [ ))!')	%) ) ) [)-2 - - - - - - - -4 !Xc3h/ ! ! ! X!
4 
 
 
 

)c ) ) ) )2K#2K '2K S/)*	2K
 
2K 2K 2K 2KhJ#J J ?#	J
 S/)*J 
J J J J(C        rZ   rz  c                   B    e Zd Zdddee         deeef         defdZdS )TracebackVariabler   rE   r   r   rw   c                     d S r   rY   r   s       r[   r   zTracebackVariable.call_function	  s	    
 #rZ   Nr   r   r   r   r>   r~   r   r   rY   rZ   r[   r  r  	  s]        # ' S/)*	
 
     rZ   r  c                   x     e Zd Zdededdf fdZdd	Zdddefd
Zdddee         de	e
ef         defdZ xZS )SysFunctionVariabler  r   rw   Nc                 H     t                      j        di | || _        d S ry   )r  rv   r  )rr   r  r   r  s      r[   rv   zSysFunctionVariable.__init__	  s+    ""6"""


rZ   r   rE   variables.TupleVariablec                 L   t          |j                  rB|j        d         }|j        }d }t          j        ||          |t          j        ||          g}n;t          j        d           t          j        d           t          j        d           g}t          j        |          S )Nr  )r   exn_vt_stackr,  r>   r   r   r@   r  )rr   r   exnrn  tbr   s         r[   exc_infozSysFunctionVariable.exc_info	  s    r 	/"%C,CB%b#..%b"--EE *400*400*400E
 &u---rZ   c                 B    |                      |          j        d         S )Nr9   )r  r   r   s     r[   	exceptionzSysFunctionVariable.exception
  s    }}R  &q))rZ   r   c                     | j         t          j        u r|                     |          S | j         t          j        u sJ |                     |          S r   )r  r  r  r  r   s       r[   r   z!SysFunctionVariable.call_function
  sL     :%%==$$$zS]****~~b!!!rZ   )r   rE   rw   r  )r   r   r   r   rv   r  r>   r  r   r~   r   r   r  r  s   @r[   r  r  	  s        c S T      . . . .$*3 * * * * *	"#	" '	" S/)*		"
 
	" 	" 	" 	" 	" 	" 	" 	"rZ   r  ) create_tma_experimental_metadatacreate_tma_stable_metadataTMADescriptorMetadataTritonHOPifierc                      e Zd ZdedefdZdedefdZdede	fdZ
dd	deej        j        j        d
f         fdZde	deee	f         ddde	fdZded
e	f         dee         deeef         ded         de	defdZde	ded         de	dedef
dZde	ded         dee	         fdZdede	fdZdddee	         ddfdZddde	deee	f         dddd f
d!Zd"S )#DynamoTritonHOPifierro  rw   c                 2    t          ddd| g            d S )Nz!triton kernel unsupported featurerM  z/Encountered triton kernel unsupported feature: r  )r$   )rr   ro  s     r[   raise_unsupportedz&DynamoTritonHOPifier.raise_unsupported
  s7    7O#OO		
 	
 	
 	
 	
 	
rZ   maybe_callablec                 :    t          |t          t          f          S r   )r   r   r   )rr   r  s     r[   is_callablez DynamoTritonHOPifier.is_callable%
  s     79MN
 
 	
rZ   r   c                     |j         S r   r  )rr   r   s     r[   	get_valuezDynamoTritonHOPifier.get_value*
  s
    yrZ   gridrJ   .c                     ddl m} t          ||          r|                                S t	          ddt          |           dg t          j                   d S )Nr9   )rJ   z/unsupported grid type for triton hop check_gridzgrid type = z;`torch.compile` only supports list-like grid for check_gridr  )listsrJ   r   r  r$   r  r   r,  )rr   r  rJ   s      r[   
check_gridzDynamoTritonHOPifier.check_grid-
  s}    ++++++d,-- 
	==??"I3tDzz33Y&2	     rZ   metar   rE   c                 r    d |                                 D             }|                    ||gi           }|S )Nc                 T    i | ]%\  }}t           j                            |          |&S rY   r   r@   r   rC  s      r[   rI  z2DynamoTritonHOPifier.call_grid.<locals>.<dictcomp>?
  s/    UUU1I.55a88!UUUrZ   )r   r   )rr   r  r  r   meta_vars        r[   	call_gridzDynamoTritonHOPifier.call_grid<
  s>     VU

UUU!!"xj"55rZ   user_fnr   r   r!  c                 l    ddl m} |                    ||          }|                    |||          }|S )Nr9   r  )r  r  r   r   )	rr   r  r   r   r   r!  r  wrapped_user_functionr   s	            r[   call_user_defined_fnz)DynamoTritonHOPifier.call_user_defined_fnD
  sH     	/..... 1 8 8W E E&44RvFFrZ   user_objr   c                 x    ddl m}  ||t          |j        |                                         |          }|S )Nr9   )VariableBuilder)r  r  r(   kernel_source_wrap)rr   r  r   r!  r   r  wrapped_user_objs          r[   wrap_user_defined_objz*DynamoTritonHOPifier.wrap_user_defined_objR
  sQ     	-,,,,,*?
81d9==
 

%// 	  rZ   configsc                 H    |                     |          }d |D             }|S )Nc                 ,    g | ]} |j                     S rY   rb  )rD  r   s     r[   rF  z=DynamoTritonHOPifier.maybe_unpack_configs.<locals>.<listcomp>g
  s$    KKK26244KKKrZ   )unpack_var_sequence)rr   r  r   s      r[   maybe_unpack_configsz)DynamoTritonHOPifier.maybe_unpack_configs`
  s2     --b11 LK7KKKrZ   r   c                 |    |                                 s|                     d           |                                S )Nz`@triton.heuristics must return constant values because configs can only contain constant values.)r  r  rc  )rr   r   s     r[   maybe_unpack_heuristic_resultz2DynamoTritonHOPifier.maybe_unpack_heuristic_resultk
  sE    ((** 	""r   ..000rZ   TritonKernelVariablec                     |j         t          |          dk    r|                     d            t          |          |j        |j        |d         |j                  S )Nr9   z7Triton kernels should be called with only a single gridr   )kernel
kernel_idxr  r  )r  r   r  r  r  r  r   )rr   r!  r   s      r[   call_getitemz!DynamoTritonHOPifier.call_getitemu
  sm     =$D		Q""I   tH~~?*a"/	
 
 
 	
rZ   gridscombined_args_rawzvariables.ConstantVariablec                    ddl m} i }t          |                                          D ]T}||         }t	          |t
          t          f          r.|                                ||<   |                                ||<   Ud |	                                D             }	ddl
m}
m} d |	                                D             }d |		                                D             }|                                D ]d}|                                }|                                s:|                                s&|                     dt%          |           d	           e|
                    |          } ||t(                    }|j                            d
|d|j        ||||                                d           t3          j        d           S )Nr9   )r\  c                 T    i | ]%\  }}t           j                            |          |&S rY   r  rC  s      r[   rI  z1DynamoTritonHOPifier.call_HOP.<locals>.<dictcomp>
  s?     
 
 
1 &--a00!
 
 
rZ   r   )kernel_side_tabletriton_kernel_wrapper_mutationc                     i | ]C\  }}t          |t                    |                                .||                                DS rY   )r   r>   r  r  rC  s      r[   rI  z1DynamoTritonHOPifier.call_HOP.<locals>.<dictcomp>
  s`     
 
 
1!_--
 342F2F2H2H
q##%%
 
 
rZ   c                 l    i | ]1\  }}t          |t                    r|                                .||2S rY   )r   r>   r  rC  s      r[   rI  z1DynamoTritonHOPifier.call_HOP.<locals>.<dictcomp>
  sT     
 
 
1q/22
 897K7K7M7M
q
 
 
rZ   z.Unexpected argument type for a Triton kernel: r  r   rY   )r  constant_args_idxr  tma_descriptor_metadatar   )dictsr\  r   rR  r   !TMADescriptorExperimentalVariableTMADescriptorStableVariableto_metadata
get_tensorr   *torch._higher_order_ops.triton_kernel_wrapr  r  r  realizerz  is_symnode_liker  repradd_constant_argsr~   r   r  r  r  r   r@   )rr   r!  r  r  r   r\  r  r   r   combined_argsr  r  rG  non_constant_argsr  r  s                   r[   call_HOPzDynamoTritonHOPifier.call_HOP
  s>    	-,,,,, :<',,..// 	6 	6A!!$A57RS  6 ./]]__'*'(||~~!!$
 
)//11
 
 

	
 	
 	
 	
 	
 	
 	
 	

 
)//11
 
 


 
%++--
 
 
 #))++ 	 	A		AKKMM Q%6%6%8%8 &&OT!WWOOO   .??NN  !2D99
	*&1%6+B--// 		
 	
 	
 )
 
 	
rZ   N)r   r   r   r   r   r  r>   rZ  r  r   r  r   r  fxproxyProxyr  r~   r  r   r   r
   r  r  r   r  r  r  r  rY   rZ   r[   r  r  
  s       
S 
U 
 
 
 

/ 
d 
 
 
 

_     1 eEHN<PRU<U6V    #CH~3J	   #s(# ' S/)*	
 ,-  
      ,-  	 
   
       		 ()@ A		c	 	 	 	1O 1 1 1 1 1
(
 sm
 
 	
 
 
 
$H
(H
 H
  S>	H

 $H
 
&H
 H
 H
 H
 H
 H
rZ   r  c            
            e Zd ZU ded<   ded<   ee         ed<   ded<   dedee         deded	d
f
 fdZdddee	         de
ee	f         d	e	fdZdddedee	         de
ee	f         d	e	f
 fdZded	efdZ xZS )r  rH   r  rI   r  r  r(   r  r   rw   Nc                     |                     dd           | _         t                      j        di | t                              | |||           d S )Nr  rY   )r   r  r  rv    dynamo_triton_hopifier_singletoninit_variable)rr   r  r  r  r   r  s        r[   rv   zTritonKernelVariable.__init__
  sY     $ZZ>>""6"""(66tVZQUVVVVVrZ   r   rE   r   c                 <    t                               | |||          S r   )r  call_triton_kernelr   s       r[   r   z"TritonKernelVariable.call_function
  s%     0BB$
 
 	
rZ   r   c                     |dk    rt                               | |          S |dk    rt                               | |||          S t                                          ||||          S )N__getitem__run)r  r  call_runr  r  r  s        r[   r  z TritonKernelVariable.call_method
  sj     =  3@@tLLLU]]3<<T4QSTTT ww""2tT6:::rZ   rE  c                     ddl m} ddlm} t	          ||          r" |j        |                                          S |S )Nr9   r?   )r  )rN  r@   tensorr  r   r   evaluate_expr)rr   rE  r@   r  s       r[   specialize_symbolicz(TritonKernelVariable.specialize_symbolic
  s`    ......++++++ c?++ 	@*#*3+<+<+>+>???
rZ   )r   r   r   r   r
   r  r   rv   r   r>   r~   r   r   r   r  r
  r  r  s   @r[   r  r  
  sr        
WW'/}W<?WKNW	W W W W W W
#
 '
 S/)*	

 

 
 
 
;#; ; ?#	;
 S/)*; 
; ; ; ; ; ;s s        rZ   r  c                   p     e Zd Zdddee         dee         dededdf fd	Zdefd
ZddZdefdZ	 xZ
S )r  data_ptrzvariables.DataPtrVariabledims
block_dimselement_sizer   rw   Nc                     t          |t          j                  sJ  t                      j        di | || _        || _        || _        || _        d S ry   )	r   r   DataPtrVariabler  rv   r  r  r  r  )rr   r  r  r  r  r   r  s         r[   rv   z*TMADescriptorExperimentalVariable.__init__  s^     (I$=>>>>>""6""" 	$(rZ   c                     t          d | j        D             d | j        D             | j                                                  S )Nc                 6    g | ]}|                                 S rY   r  rD  dims     r[   rF  zATMADescriptorExperimentalVariable.to_metadata.<locals>.<listcomp>  s     111S\\^^111rZ   c                 6    g | ]}|                                 S rY   r  r  s     r[   rF  zATMADescriptorExperimentalVariable.to_metadata.<locals>.<listcomp>  s     777S\\^^777rZ   )r  r  r  r  r  r   s    r[   r  z-TMADescriptorExperimentalVariable.to_metadata  sL    /11ty11177t777&&((
 
 	
rZ   r  rB   c                                           fd            j                                       g  j         j         j        }                    |                               t          |          dz   d           d S )Nc                  \                          ddt          j                   d          S )Nz$triton.tools.experimental_descriptorcreate_d_tma_descriptor)r  r   r  ri  s   r[   rj  z?TMADescriptorExperimentalVariable.reconstruct.<locals>.<lambda>  s0    G,,6:#di..:::  rZ   r9   F)	rm  r  r  r  r  r  rQ  r   r   )rr   r  r   s   `` r[   r  z-TMADescriptorExperimentalVariable.reconstruct  s        	
 	
 	
 	!!'***@@T_@d.?@c$ii!mU33333rZ   c                     | j         j        S r   )r  from_tensorr   s    r[   r  z,TMADescriptorExperimentalVariable.get_tensor(  s    }((rZ   r-  )r   r   r   r   r>   r   rv   r  r  r  r  r  s   @r[   r  r    s        )-) ?#) )	)
 &) ) 
) ) ) ) ) )
S 
 
 
 

4 
4 
4 
4)O ) ) ) ) ) ) ) )rZ   r  c                   P     e Zd Zdddddeddf fdZdefd	ZddZdefdZ xZS )r  r  rL   block_shaperK   r   rw   Nc                     |                                 sJ  t                      j        di | || _        || _        d S ry   )rz  r  rv   r  r  )rr   r  r  r   r  s       r[   rv   z$TMADescriptorStableVariable.__init__-  sO     !!!!!""6"""&rZ   c                 N    t          | j                                                  S r   )r  r  r  r   s    r[   r  z'TMADescriptorStableVariable.to_metadata8  s&    )%%''
 
 	
rZ   r  rB   c                                          fd                               d           | j                                        | j                                       d           d S )Nc                  0                          dd          S )Nztriton.tools.tensor_descriptorTensorDescriptorr  r  s   r[   rj  z9TMADescriptorStableVariable.reconstruct.<locals>.<lambda>?  s    G,,0"  rZ   r  r   )rm  load_methodr  r  r  r  ro  s    `r[   r  z'TMADescriptorStableVariable.reconstruct=  s       	
 	
 	
 	M***((( !!!ArZ   c                     | j         S r   )r  r   s    r[   r  z&TMADescriptorStableVariable.get_tensorI  s
    {rZ   r-  )	r   r   r   r   rv   r  r  r  r  r  s   @r[   r  r  ,  s        	' 	' $	' 		'
 
	' 	' 	' 	' 	' 	'
S 
 
 
 


 
 
 
C        rZ   r  c                   `     e Zd Zdededdf fdZdddee         dee	ef         defd	Z
 xZS )
'CreateTMADescriptorExperimentalVariablerankr   rw   Nc                 T    |dv sJ  t                      j        di | || _        d S )N)r9   r   rY   )r  rv   r(  )rr   r(  r   r  s      r[   rv   z0CreateTMADescriptorExperimentalVariable.__init__N  s:    
 v~~~~""6"""			rZ   r   rE   r   c                 4   d|v r|d         n|d         }t          |t          j                  st          d| j         d          | j        dk    r~t          |          t          |          z   dk    r0t          |dt          |          t          |          z               d|v r|d         n|d         g}d	|v r|d	         n|d
         g}nt          |          t          |          z   dk    r0t          |dt          |          t          |          z               d|v r|d         n|d         d|v r|d         n|d
         g}d|v r|d         n|d         d|v r|d         n|d         g}d|v r|d         n|d         }t          ||||          S )Nptrr   z8Please ensure there were no graph breaks between create_z3d_tma_descriptor and the upstream .data_ptr() call.r9   rO   z6TMA metadata rank=1 requires exactly 4 arguments, got r  	block_dimr      z6TMA metadata rank=2 requires exactly 6 arguments, got dim1dim0
block_dim1r  
block_dim0r  r  )r  r  r  r  )r   r   r  r%   r(  r   r<   r  )rr   r   r   r   r+  r  r  r  s           r[   r   z5CreateTMADescriptorExperimentalVariable.call_functionW  s     %fUmmDG#y899 	$)$ $ $   9>>4yy3v;;&!++$fSQUYYY\]cYdYdMdff  
 "'&ud1gD (3f'<'<{##$q'JJ 4yy3v;;&!++$fSQUYYY\]cYdYdMdff  
 #)F"2"2vQ"(F"2"2vQD
 )5(>(>|$$DG(4(>(>|$$DGJ 2@61I1Ivn--tTVx0!%	
 
 
 	
rZ   )r   r   r   r  r   rv   r   r>   r~   r   r   r  r  s   @r[   r'  r'  M  s          
	     0
#0
 '0
 S/)*	0

 
0
 0
 0
 0
 0
 0
 0
 0
rZ   r'  c                   B    e Zd Zdddee         deeef         defdZdS )!CreateTMADescriptorStableVariabler   rE   r   r   rw   c                 t    d|v r|d         n|d         }d|v r|d         n|d         }t          ||          S )Nr  r   r  r9   )r  r  )r  )rr   r   r   r   r  r  s         r[   r   z/CreateTMADescriptorStableVariable.call_function  s\     &.%7%7!!T!W/</F/Ff]++DQRG*#
 
 
 	
rZ   Nr  rY   rZ   r[   r3  r3    s]        
#
 '
 S/)*	

 

 
 
 
 
 
rZ   r3  c                   F    e Zd ZdZdddee         deeef         defdZdS )	!PyTreeGetNodeTypeFunctionVariableaK  
    `torch.utils._pytree._get_node_type` function is very hot function. We want to special case it to reduce Dynamo tracing time.

    def _get_node_type(tree: Any) -> Any:
        node_type = type(tree)
        # All namedtuple types are implicitly registered as pytree nodes.
        # XXX: Other parts of the codebase expect namedtuple types always return
        #      `namedtuple` instead of the actual namedtuple type. Even if the type
        #      is explicitly registered.
        if is_namedtuple_class(node_type):
            return namedtuple
        return node_type
    r   rE   r   r   rw   c                    t          |          dk    r t          |dt          |                      d }|d         j        rQt          |d         j                            t
          j                             t          |d         j                  }|d                                         }t          |          r7t          t                      d          }t          j        |t          |          S t          j        |||          S )Nr9   z6pytree_get_node_type requires exactly 1 argument, got r   r   r  )r   r<   r   r'   r  r&   
TYPE_MATCHr0   r#  r   r(   r*   r>   r   r   )rr   r   r   r   type_sourcer#  s         r[   r   z/PyTreeGetNodeTypeFunctionVariable.call_function  s     t99>> TTTT   7> 	5$q'.33L4KLLMMM$T!W^44K1g))++{++ 	F$%6%8%8,GGK"(ZEEE$R[IIIIrZ   N)	r   r   r   r   r   r>   r~   r   r   rY   rZ   r[   r6  r6    sq         J#J 'J S/)*	J
 
J J J J J JrZ   r6  c                   P     e Zd ZdZdddee         deeef         def fdZ xZ	S ) PyTreeTreeIsLeafFunctionVariablea@  
    `torch.utils._pytree.tree_is_leaf` function is a hot function. We want to special case it to reduce Dynamo tracing time.

    def tree_is_leaf(
        tree: PyTree,
        is_leaf: Callable[[PyTree], bool] | None = None,
    ) -> bool:
        if is_leaf is not None and is_leaf(tree):
            return True
        return _get_node_type(tree) not in SUPPORTED_NODES

    When is_leaf is None (the common case), we can optimize by not tracing into the function.
    When is_leaf is not None, we fall back to regular tracing since it requires executing user code.
    r   rE   r   r   rw   c                    t          |          dk     st          |          dk    r t          |dt          |                      |                    dt          j        d                     }t          |          dk    r|d         }|                                s#t                                          |||          S |d         }t          t          j
        j        j                                      ||gi           }t          j        |t          j
        j        j        t!                                }|                    |d|gi           }t          j        |j                   S )Nr9   r   z,tree_is_leaf requires 1 or 2 arguments, got rQ   r   r  r  )r   r<   r   r@   r   r  r  r   r6  r  rV   rW   _get_node_typer>   r   rX   r\   r  r  )
rr   r   r   r   rQ   treenode_type_varsupported_nodes_varoutr  s
            r[   r   z.PyTreeTreeIsLeafFunctionVariable.call_function  sP    t99q==CIIMM Js4yyJJ   **Y(8(?(E(EFFt99>>1gG'')) 	;77((T6::: Aw9K.
 

-TFB
'
' 	 .3K/466
 
 

 "--b.=/SUVV&39}555rZ   )
r   r   r   r   r   r>   r~   r   r   r  r  s   @r[   r;  r;    s|         $6#$6 '$6 S/)*	$6
 
$6 $6 $6 $6 $6 $6 $6 $6 $6 $6rZ   r;  r   )r   r  r  r   r   r  r  r  r   collectionsr   collections.abcr   r   r   r   typingr   r	   r
   r   r   typing_extensionsr   weakrefr   r  torch._dynamo.excr   torch._guardsr   torch.utils._pytreer   rM  r   r   r   r   bytecode_transformationr   r   r   r  r   r   r   r   r   r   r    r!   r"   r#   r$   r%   guardsr&   r'   r   r(   r)   r*   r+   r,   r-   r.   r/   r0   rV   r1   r2   r3   r4   r5   r6   r7   r8   baser:   r;   r<   r=   r>   rN  r@   #torch.distributed.fsdp._fully_shardrA   ModuleNotFoundErrortorch._dynamo.codegenrB   r  rC   rD   rE   rF   #torch._dynamo.variables.ctx_managerrG   r  rH   rI   r  rJ   rK   r  rL   rM   rn   rp   r  ru  r  rT   r   	lru_cacher\   r^   r   r~   r   r   r   r   r  r   r   objectr   r   r   r   r   r  r  r  r0  r2  r=  r+  r\  rr  r`  r   r  r  r  r  r  r  r  r  r6  r<  rI  rz  r  r  r  r  r  r  r  r  r  r  r  r'  r3  r6  r;  rY   rZ   r[   <module>rS     s?    .            



      " " " " " " . . . . . . . . ( ( ( ( ( ( ( ( > > > > > > > > > > > > > > # # # # # # % % % % % %  4 4 4 4 4 4             3 3 3 3 3 3 > > > > > > > > > > > > V V V V V V V V V V                            1 0 0 0 0 0 0 0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	              ' & & & & &EEEEEEE     '//////            LKKKKK       
 65555555&&&&&& WT#s(+,,,
&Y'O'O'OPP "+)YK"8"8  ,=+<+>+>sCx( > > >   
 
 
 
 
 
 
 
>L \    `
`` ` 3-	`
 cN` 
#
` ` ` `H GKA AA&)A3;F3CAA A A A.0 .$sCx. .T . . . . # o%&  .  
	       *
.CH~  uVS[)*	
 eHo& c3h( $sCx.)    4   --%+-5=f5E-MP-- - - -6, , , , , , , ,^RY RY RY RY RY3 RY RY RYj) ) ) ) )": ) ) )X: : : : :4 : : :@D; D; D; D; D;? D; D; D;N

 
 
 
 
 
 
 
F
 F
 F
 F
 F
%= F
 F
 F
R         "     Fj- j- j- j- j-- j- j- j-Z> > > > > 2 > > ><> > > > >"6 > > >:c  ?
#	
 o%&    ,I) I) I) I) I)!9 I) I) I)X*> *> *> *> *>(B *> *> *>Z{G {G {G {G {G? {G {G {G|> > > > >"6 > > ><>
 >
 >
 >
 >
/ >
 >
 >
B     ;   *d38n    //%-c3h%7// / / /^D ^D ^D ^D ^D(< ^D ^D ^DB7 7 7 7 71 7 7 74#
 #
 #
 #
 #
$8 #
 #
 #
Lp
 p
 p
 p
 p
 p
 p
 p
fD D D D D D D DN       #" #" #" #" #"/ #" #" #"L           s
 s
 s
 s
 s
> s
 s
 s
l $8#7#9#9  - - - - -? - - -`$) $) $) $) $) $) $) $)N    /   B:
 :
 :
 :
 :
o :
 :
 :
z
 
 
 
 
 
 
 
 "J "J "J "J "J(< "J "J "JJ46 46 46 46 46'; 46 46 46 46 46s   #C* *C43C4