
    i                       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 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j                  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j                  d)dfd8Z{d7ej                  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      Zy# eW$ r dZVY w xY w)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/        [/var/www/html/engine/venv/lib/python3.12/site-packages/torch/_dynamo/variables/functions.py!get_pytree_SUPPORTED_NODES_sourcer\      s%    :kmW5yACT rZ   c                   (    e Zd ZdefdZdeddfdZy)FunctionSpecfuncc                 p   |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||   | _        y d | _        y )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4)) 22 4$"4"45!$"4"4t~~F!//$2F2FFt~~ARAR0RSnnt000'+}}z'ABsGtD%%q1,%)]]^%C"S'rZ   returnNc           
         |j                   xs d| _        |j                  xs i | _        t	        t        | j                  t        | j                         d  t        t        | j                                          | _	        y NrY   )
__defaults__defaults__kwdefaults__
kwdefaultsdictziprk   lenrangepos_default_map)rr   r_   s     r[   update_defaultszFunctionSpec.update_defaults   si     ))/R--3  $""C$6#6#895T]]AS;TU 
rZ   )__name__
__module____qualname__r   rv   r   rY   rZ   r[   r^   r^      s#    N\ N$	
L 	
T 	
rZ   r^   r_   rw   c                 \    t         j                  |       }|t        |       }|t         | <   |S N)rT   getr^   )r_   specs     r[   	_get_specr      s.    ??4 D|D! DKrZ   txrE   	fn_sourceargskwargsc                    t        |       }|j                  |        i }t        |      }|j                  j	                         D ]d  \  }}	d }
|r>t        j                  |j                  |	         rt        j                  st        ||	      }
t        ||j                  |	   |
      ||<   f t        |j                        D ]  \  }}|t        |      k  rt        |||         ||<   '||v r-||j                  vrt        ||j!                  |            ||<   X||vs]t#        t$        |t        j&                  d|       g        |t        |j                        d  }|j(                  r#t        |t+        |            ||j(                  <   nJ|rHt#        t$        |t        j&                  dt        |       dt        |j                               g       |j,                  D ]  }||v rt        ||j!                  |            ||<   &||j.                  v r0d }|rt        ||d      }t        ||j.                  |   |      ||<   dt#        t$        |t        j&                  d|       g        |j0                  rt        ||      ||j0                  <   |S |r2t#        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      s    T?D	B&\F ))//1 J	c''c(:;<<+Is;N!"dmmC&8.I4J T//0 4s4y=%b$q'2BtHV^ *** &b&**T*:;BtH^$$++@G!6 T''(*+E .r5< @4	  ''9#d)KPSTXTfTfPgOhi	
 !! 6>%b&**T*:;BtHT__$##1)T#N %b$//$*?AQRBtH$$++B4&I( ,R84?? I 
  ''*Hf(WX	
 IrZ   valsourcec                     t        |t              r|S |st        j                  | |      S t        j                  j                  ||      S r   )
isinstancer>   buildr   LazyVariableTrackerr   )r   r   r   s      r[   r   r     sD     #'
$$R-- ,,33C@@rZ   resultc                     t        |j                               D ]+  \  }}t        |t        t        f      st        | |      ||<   - y r   )r   r   r   r   r~   r   )r   r   kvs       r[   wrap_args_kwargsr     s>    V\\^$ .1a%'&r1-F1I.rZ   parentrs   c                     | j                   j                  }|j                  D ]<  }|j                         }||v r!|j	                  ||j                  |             |||<   > y)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   %  sa     ==--L    ..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   :  sa     #ixAD$D+u%&8K01 *[$"???&DKrZ   >   __doc__ra   __closure____globals__rz   r|   r   fnc                 N   |xr t        ||      }|r|dk(  rt        |      }d }	 t        j                  ||      }|t        v rt        ||      }|r t        j                  j                  ||      S t        j                  | |      S # t        $ r t        t        |        Y gw xY w)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0F$++ !(F5''D1 $$T",,33FFCC  V,,  5 	!45s   B B$#B$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y)BaseUserFunctionVariablerw   c                 6    | j                         j                  S r   get_codeco_filenamerr   s    r[   get_filenamez%BaseUserFunctionVariable.get_filename{      }}***rZ   c                 6    | j                         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                     | j                         dk(  r4| j                         j                  d      rt        j                  d       S |j                  | g | j                         ||      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  sd     MMO88!!#,,-JK#**400--d4Ndnn6F4N4NPVWWrZ   r   c                     d}	 t        | j                         |      }t
        j                  j                  |      S # t        $ r |dk(  rt        | t              rd}Y Aw xY w)NFr   T)hasattrget_functionr   r   NestedUserFunctionVariabler   r@   r   rr   r   r   r   s       r[   call_obj_hasattrz)BaseUserFunctionVariable.call_obj_hasattr  se     	T..0$7F ))0088 # 	z!j7Q&R	s   =  A A c                     i S r   rY   rr   r   s     r[   closure_varsz%BaseUserFunctionVariable.closure_vars      	rZ   c                      yNTrY   r   s    r[    should_allow_nested_graph_breaksz9BaseUserFunctionVariable.should_allow_nested_graph_breaks      rZ   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
9)
914
9	
96 4_@T;U rZ   r   c                       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                 f    t        |j                  t        j                                | ||      S Nr   r'   
make_guardr&   CLOSURE_MATCHclsr  r   s      r[   create_with_sourcez'UserFunctionVariable.create_with_source  s(    f''(B(BCD5((rZ   r   Nc                 B   t        |   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|      }|| _        y )
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#D$D "u115993K3KLMK$PO&55	 ##B(=rBrZ   c                 X    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  s%    $,-77Nw)++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      wwrZ   c                 .    | j                   j                  S r   )r   ra   r   s    r[   r   zUserFunctionVariable.get_code  s    wwrZ   c                 "    t         j                  S r   r   r   r   s    r[   python_typez UserFunctionVariable.python_type      !!!rZ   c                 4    t        | j                  dd       d uS N__self__)r   r   r   s    r[   has_selfzUserFunctionVariable.has_self  s    tww
D1==rZ   c                 .    | j                   j                  S r   )r   r   r   s    r[   r   z UserFunctionVariable.get_globals  s    ww"""rZ   c                 n    | j                   }|r&t        | t        j                        r| j                  }|S r   )r   r   r   UserMethodVariable	source_fn)rr   r   s     r[   
get_sourcezUserFunctionVariable.get_source  s+    jy'C'CD^^FrZ   r   rE   r   c                 &   | j                   rJ | j                  }t        |t              st	        d      |j
                  j                  }| j                         }t        |||||      }t        |||j                         | j                  j                  xs d}t        |      t        | j                  j                  j                        k(  sJ t        t        j                          | j                  j                  j                  |      D ]  \  }	}
}|j
                  j"                  }||v r||   }n|rWt%        t'        |      |	      }t)        |d      }	 t+        j,                  ||j.                  |      }|j7                  |||      }n4	 t+        j,                  ||j.                        }|j7                  d||      }|||
<    |S # t0        $ r t3        j4                         }Y pw xY w# t0        $ r t3        j4                         }Y ^w xY w)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+EFF--''"!"gvtVDffbkk2''%%+7|s477#3#3#?#?@@@@"OOtww//;;W 
  	$OCt "==55L|#'-,]6-BCH(2<(Q%?#2#8#8 2 24I$L (;; $?#2#8#8ASAS#TL (;;D$U#F4LA 	$D ' " ?#,#<#<#>L? " ?#,#<#<#>L?s$   !G G0G-,G-0HHr   r   c                     |t         v rt        j                  | |      S | j                         }t	        || j
                  ||      S r   )r3   r   GetAttrVariabler-  r   r   )rr   r   r   r   s       r[   var_getattrz UserFunctionVariable.var_getattr:  s?    )),,T488"b$''6488rZ   c                 l    t        | j                  |      }t        j                  j	                  |      S r   )r   r   r   r@   r   r   s       r[   r   z%UserFunctionVariable.call_obj_hasattr@  s+     $'))0088rZ   c           
      *	   | j                   t        j                  j                  u r	 |D cg c]  }|j	                          }}|j                         D ci c]  \  }}||j	                          }}}t        j                  j                  |i |j                  }	t        j                  |	      S | j                   t        j                  j                  u rt	  t        j                  | j                         j                  |i |}|j                  d   j	                         }t!        |t"              sJ t        j$                  |      S | j                   t        j                  j(                  u r  t        j                  | j                         j                  |i |}|j*                  d   }t!        |t,              sS|j/                         }d|j0                   d}t3        dd	| j4                   d
| d
| d|g t6        j8                         t!        |t:              s,|j=                         }d| d}t3        d|  |d| ddg       |j                   }t        j>                  |d      S | j@                  r'tC        || j                   | j=                         ||      S |jD                  jF                  jH                  st| j                   t        j                  jJ                  jL                  u rDt        j                  jN                  jQ                  |      5  tR        |   |||      cd d d        S tW        |jD                  jF                  dd       dk(  r|jD                  jF                  jX                  sq	 ddl-m.} |h| j                   |j^                  |j`                  fv rDt        j                  jN                  jY                  |      5  tR        |   |||      cd d d        S | jc                  |||      }||S tR        |   |||      S c c}w c c}}w # t        $ r}
t        d| d|       |
d }
~
ww xY w# t&        $ r}
t        d| d|       |
d }
~
ww xY w# 1 sw Y   8xY w# t&        $ r d }Y w xY w# 1 sw Y   xY w)NzCannot 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  r   changesr   DynamoConfigPatchVariabler:   RuntimeErrorrA  r   	signaturebind	argumentsr   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_staterH  _pre_forward_post_forward_maybe_call_tree_map_fastpath)rr   r   r   r   arg
args_constkeyr   kwargs_constrK  erN   rA  fn_vartypmsgfn_namer   rH  tree_map_resultr  s                       r[   r   z"UserFunctionVariable.call_functionF  s~    77emm777BFG3c446G
GBH,,. 6>c3C//11     --;;#/'  !::7CC WW:::7))$''277HH',*($$& % ""6=== ::;OPP WW5553G%%dgg.33TDVDEZZ]Ff&>?((*UVYVbVbUccde6,TZZL4&6(!L #*55	 f&:; //+@	  Ju  v<#f #27)<H0	 B99"RVWW/DGGT]]_dF 
 		((UU}}""[[\ ++^^ ? w,Rv>? ? BII,,mTB23II,,FF!U $&&''5 * ]]//II"M C 70T6BC C <<RvN&""w$Rv66} H  7 "!F*VH6 	  "!F*VH6 ^? ?  ! 	!C Csx   P% PP% P4A P% A2Q "Q+Q8 R	P% %	Q.Q  Q	Q(Q##Q(+Q58RR	Rc                    | j                  |||      }||\  }}}n| }|}|}t        |t              r)|j                         rh |t        z
  st        |      dk\  sy |d   }|d   }	|dd  }
|	j                  ||||
|      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[   r`  z2UserFunctionVariable._maybe_call_tree_map_fastpath  s     222tVD:A7KK M$O {$89113''*DDM"a'q!"1%
QR ''
 	
rZ   c                     t        | j                  dd       dk(  xr# t        | j                  dd       | j                  v S )Nr   tree_mapr   r   r   _TREE_MAP_MODULESr   s    r[   rm  z*UserFunctionVariable._is_tree_map_function  s=    DGGZ.*< Ot48N8NN	
rZ   c                     t        | j                  dd       dk(  xr# t        | j                  dd       | j                  v S )Nr   tree_map_onlyr   ry  r   s    r[   _is_tree_map_only_functionz/UserFunctionVariable._is_tree_map_only_function  s=    DGGZ./A Ot48N8NN	
rZ   c           	      0   | j                         sy t        |      dk7  ry h |t        z
  ry |\  }}}| j                  |      }|y | j	                         }|y 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_selectorrt  tree_argallowed_typestree_map_callablewrapped_map_fntree_map_variables              r[   rl  z0UserFunctionVariable._rewrite_tree_map_only_call  s     ..0t9>V966*.'vx99-H  ::<$468T2

 &::;LM >8"<d6lJJrZ   c                     t        | j                  dd       }|sy t        j                  j	                  |      }|y t        |dd       }t        |t        j                        r|S y )Nr   rx  )r   r   sysmodulesr   r   r   r   )rr   module_namemodulerx  s       r[   r  z.UserFunctionVariable._lookup_tree_map_function  sZ    dgg|T:->6:t4h 2 23OrZ   selector.c                     |j                         sy 	 |j                         }| j                  |      }|sy t	        d |D              sy t        t        j                  |            S # t        $ r Y y w xY w)Nc              3   <   K   | ]  }t        |t                y wr   )r   type).0rg  s     r[   	<genexpr>zDUserFunctionVariable._extract_tree_map_only_types.<locals>.<genexpr>  s     >S:c4(>   )is_python_constantr  r   _flatten_type_specallr   r~   fromkeys)rr   r  	raw_value	flatteneds       r[   r  z1UserFunctionVariable._extract_tree_map_only_types  sw     **,	 335I ++I6	>I>>T]]9-.. # 		s   A( (	A43A4c                 `   t        |t              r|gS t        |t              r1g }|D ](  }| j                  |      }| y |j	                  |       * |S t        t        dd       }|Gt        ||      r;g }|j                  D ](  }| j                  |      }| y |j	                  |       * |S y )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<  &	'
 UK6
!j
&CI '..u5<  &	'
 rZ   c                      y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    DGG}rZ   c                 j    t        |t        j                        xr | j                  |j                  u S r   )r   r   r   r   rr   others     r[   is_python_equalz$UserFunctionVariable.is_python_equal:  s*    %!?!?@XTWWPUPXPXEXXrZ   F)4r   r   r   r   r   _nonvar_fields	frozensetrz  classmethodr   r
  r   r   r  r  r  rQ  rv   r  r   r>   r   r   CodeTyper   r  r#  r(  r~   r   r   r   r-  r   r;  r>  r@   r   r   r
   r`  rm  r}  r   rl  r  r  r  r  r  r  __classcell__r  s   @r[   r   r     s   7 	 
"	0	0N "	
 )s )C )<R ) ) "!9!99  	
 
>,C ,40 e00  %..  "T ">$ >#T#s(^ #F :': ': S/)*	:
 
c?"	#:x95 9S 9_ 99)9149	9g7#g7 'g7 S/)*	g7
 
g7R
#
 '
 S/)*	

 
/	"
B
t 

D 
#K##K '#K S/)*	#K
 
"_%o%&(	

#KJ
8E4F4F+G 
/'/	%c	"	#/" d0D ,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  .rt  r   rw   Nc                 @    t        |   di | || _        || _        y ry   )r  rv   r  rt  )rr   r  rt  r   r  s       r[   rv   z$TreeMapOnlyFunctionVariable.__init__D  s$     	"6"*rZ   c                     t         S r   r   r   s    r[   r#  z'TreeMapOnlyFunctionVariable.python_typeN  s    rZ   nodec                     	 |j                         t        fd| j                  D              S # t        $ r Y yw xY w)NFc              3   6   K   | ]  }t        |        y wr   )
issubclass)r  allowed	node_types     r[   r  zDTreeMapOnlyFunctionVariable._matches_allowed_type.<locals>.<genexpr>V  s     Tg:i1Ts   )r#  r   anyr  )rr   r  r  s     @r[   _matches_allowed_typez1TreeMapOnlyFunctionVariable._matches_allowed_typeQ  sC    	((*I TASASTTT # 		s   1 	==r   rE   r   c                    |s| j                   j                  |||      S |d   }| j                  |      r| j                   j                  |||      S t        |      dk7  s|r| j                   j                  |||      S |S )Nr   r9   )rt  r   r  r   )rr   r   r   r   leafs        r[   r   z)TreeMapOnlyFunctionVariable.call_functionX  s}     ;;,,Rv>>Aw%%d+;;,,Rv>>t9>V ;;,,Rv>>rZ   )r   r   r   r   r  r   r  r>   r   rv   r#  rQ  r  r   r~   r   r   r  r  s   @r[   r  r  >  s    	!	0	0N
T3Y'   	
 
T U/ Ud 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 )BuiltinMethodVariabler   r   r   rw   Nc                 j    t        |   di | t        |t        j                        sJ || _        y ry   )r  rv   r   r   BuiltinMethodTyper   r  s       r[   rv   zBuiltinMethodVariable.__init__k  s2     	"6""e55666rZ   objc                     | j                   }| j                  }|t        u xr |dk(  xs t        |      t        u xr |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  sI    llll u$A	)A 
*L{n/L	
rZ   r   rE   r   c                     | j                   j                  }| j                   j                  }| j                  xr t	        | j                  d      }t        j                  |||      }|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}  sf     gg&&ww[[HZZ%H
 &&r;
C!!"dD&99rZ   r  )r   r   r   r   r  rQ  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                 N    t        |   di | || _        || _        || _        y 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    yyrZ   c                 6    | j                         j                  S r   r   r   s    r[   r   z)LocalGeneratorObjectVariable.get_filename  r   rZ   c                 6    | j                         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                      yNFrY   r   s    r[   r(  z%LocalGeneratorObjectVariable.has_self      rZ   c                 "    | j                         S r   )r   r   s    r[   r   z%LocalGeneratorObjectVariable.__name__  s    }}rZ   c                 V    | j                   j                   d| j                          dS )N(rD  )r  r   r   r   s    r[   __str__z$LocalGeneratorObjectVariable.__str__  s'    ..))*!DMMO+<A>>rZ   c                    ddl m} ddlm}m}m}  |j                         } ||      } ||      } ||      }	|5  |5  |	5  | j                  }
|
j                  s| j                  |      | _
        t        j                  | j                        j                  |       d d d        d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)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   codegenr  rE   r  r  r   savedisallowtemptracers              r[   r  z(LocalGeneratorObjectVariable.reconstruct  s    Q	
 	
 ."--//35b97; 	V8 	VT 	V''F--'+'E'Eb'I$**4+?+?@LLWU		V 	V 	V 	V 	V 	V 	V 	V 	Vs;   CCAB8C'C8C=CC		CCr   rE   r   c                 <    | j                   j                  |||      S r   )vtr;  r   s       r[   r;  z&LocalGeneratorObjectVariable.bind_args  s     ww  T6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                 V   | j                   }| j                         rt        t        |       	 |j	                         S # t
        $ r}d|_        |d }~wt        $ r  t        $ rC}t        j                  j                  j                  | j                                t        |d }~ww xY wr   )r  _is_generator_exhaustedr!   StopIterationinline_call_r   r  r   r%   r  rI  
eval_frame	skip_coder   r"   )rr   r   r  re  s       r[   next_variablez*LocalGeneratorObjectVariable.next_variable  s    ##'')$]B7	# &&((  	)-F&G% 	 	#MM$$..t}}?"	#s!   > 	B(	AB(%>B##B(r   c                     || j                         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&&u--rZ   c                      yr  rY   r   s     r[   has_unpack_var_sequencez4LocalGeneratorObjectVariable.has_unpack_var_sequence  r  rZ   c                      yr   rY   r   s     r[   has_force_unpack_var_sequencez:LocalGeneratorObjectVariable.has_force_unpack_var_sequence  r   rZ   c                 B    g }| j                  ||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                 j    	 	  || j                  |             # t        $ r t        |       Y y w xY wr   )r  r    r   )rr   r   r   s      r[   r  z8LocalGeneratorObjectVariable.force_apply_to_var_sequence  s@     4%%b)*  - )"-s    22c                      yr  rY   r   s    r[   r   z=LocalGeneratorObjectVariable.should_allow_nested_graph_breaks  r  rZ   excc                     | j                   }	 |j                  |       y # t        $ r}|j                  |       Y d }~y d }~ww xY wr   )r  _raise_exception_variabler   exception_handler)rr   r   r  r  re  s        r[   _setup_exceptionz-LocalGeneratorObjectVariable._setup_exception  sE     ##	(,,S1  	( $$Q''	(s     	A?Ac                 T    | j                   d u xs | j                   j                  dk(  S )Nr   )r  instruction_pointerr   s    r[   _is_generator_just_startedz7LocalGeneratorObjectVariable._is_generator_just_started  s*    !!T)XT-?-?-S-SWX-XXrZ   c                 0    t        | j                  dd      S )Nr  F)r   r  r   s    r[   r  z4LocalGeneratorObjectVariable._is_generator_exhausted  s    t))+@%HHrZ   c                    |dk(  r| j                  |      S |dk(  r| S |dk(  rk| j                         r-t        |      r"t        d |D              st	        t
        |       | j                  }|j                  |       | j                  |      S |dk(  r| j                  }| j                         s| j                         rd|_	        t        j                  d       S 	 | j                  |t        j                  t        d             t        j                   dk\  r5|j"                  j$                  d	k(  rd|_	        t        j                  d       S 	 | j                  |      rt	        t(        |       n|d
k(  r| j                  }	 | j                  |t        |      dk(  r|d   n|d          | j                  |      }t1        dt2        fi       }	 | j                  |t        j                  |d             | j                  |       t	        t(        |       |S t6        | q  ||||      S # t&        $ r d|_	        t        j                  d       cY S w xY w# t&        $ r d|_	        t        j                  d       cY S t*        $ r |j,                  J |j,                  cY S w xY w# t.        $ r  w xY w# t5        |      $ r Y |S w xY w)N__next____iter__sendc              3   <   K   | ]  }|j                           y wr   )is_constant_noner  ra  s     r[   r  z;LocalGeneratorObjectVariable.call_method.<locals>.<genexpr>*  s     Bc3//1Br  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   rM  r    symbolic_resultr   r  rS  r   r  r  )	rr   r   r   r   r   r  retvalexc_typer  s	           r[   r  z(LocalGeneratorObjectVariable.call_method  s    :%%b))ZKV^ ..0SY BTBB,Y;''FT"%%b))W_ ''F..0D4P4P4R-1* 11$778%%	33M2F( $$///66:LL15F.$55d;;.%%b),\2> W_ ''F
 %%bSY!^$q'aQ
 ''+F| 6bIH?%%b)*E*EhPR*ST""2&
 )v>Mw"2tT6::a ) 8-1* 11$778 ) 8-1* 11$77, .
 --999---., % N 1:  MsI   A1H+ !I (J% 7J3 +%II%J"="J"!J"%J03KKr  rB   rw   N)(r   r   r   r   r  r~   r   r   rv   r   r   r   r   r   rQ  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    s9   
+nn
+ S>
+ @	
+
 
+ 

+%.. +c +'# '"e "$ # ? ? HV&3#3 '3 S/)*	3
 
c?"	#3T#s(^ #T ## 7 #O #*.).14.	.*A d 0G D )	o	)/78I38N/O		()	(0?	(		(YD YI Iw;#w; w; ?#	w;
 S/)*w; 
w; w;rZ   r  c                       e Zd ZdZy)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[   r,  r,    s    rZ   r,  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  r/  r   rw   Nc                @    t        |   di | || _        || _        y ry   )r  rv   r  r/  )rr   r  r/  r   r  s       r[   rv   z'LocalGeneratorFunctionVariable.__init__  s$     	"6"*rZ   c                 v    || j                   j                  v rt        | |      S t        | j                  |      S r   )r  r   r   r  )rr   r   s     r[   __getattr__z*LocalGeneratorFunctionVariable.__getattr__  s2    4>>***4&&tww%%rZ   c                 6    | j                   j                         S r   )r  r   r   s    r[   r   z*LocalGeneratorFunctionVariable.get_globals  s    ww""$$rZ   r   rF   r   rD   c                 8    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@,@@	
 	
rZ   rE   c                    t        | j                  j                               s2t        dt	        | j                  j                               dddg       | j                  |t        |      |      }| j                  j                         }| j                  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   r6  r   r   r/  r   )rr   r   r   r   r  rs   r   s          r[   r   z,LocalGeneratorFunctionVariable.call_function  s     DGG,,./ADGG,,./. LH	 11"d4j&Iww!GG'')	 !!;;	 " 
 	
rZ   )r   r   r   r   r  r>   r  r   rv   r2  r~   r   r   r   r6  r   r   r  r  s   @r[   r.  r.    s     ;		+	+ 		+
 	+ 
	+&
%T#s(^ %
'
 ?#
 S/)*	

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

 

rZ   r.  c                   X     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                 2    t        |   |fdt        i| y )Nr/  )r  rv   r,  )rr   r  r   r  s      r[   rv   z<FunctionDecoratedByContextlibContextManagerVariable.__init__0  s%    	
N	
 	
rZ   r   rF   r   rw   rC   c                     t         |   |||      }t        |t        j                  j
                  j                        sJ d|_        |S r   )r  r6  r   r  rI  symbolic_convertrC   is_generator_from_ctx_manager)rr   r   r   r   r  r  s        r[   r6  zHFunctionDecoratedByContextlibContextManagerVariable._build_inline_tracer7  sO     -b$?MM**QQ
 	
 
 04,rZ   )r   r   r   r   r>   r   rv   r   r~   r   r6  r  r  s   @r[   r9  r9  '  sZ    
? 
c 
' ?# S/)*	
 
2 rZ   r9  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        |   dd|i| || _        || _        |3|j	                  d      !t        |j	                  d      d      | _        y y y )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!A'

8(<jIDN "BrZ   c                 h    | j                   j                   d| j                   d| j                   dS )Nr  rC  rD  )r  r   r   r  r   s    r[   r*  zUserMethodVariable.__repr__f  s.    ..))*!DGG9Btxxj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                        rHg | j                         |}t	        j
                  | j                  d      }|j                  |||      S |j                  j                         rt        | j                  t        j                        rt        | j                  dd      }||j                  d      r|dk7  s| j                  r| j                  j                  || j                  j                   t#        |      || j                  	      S t$        d| j                  t$        j&                  j(                  u r>t	        j*                  | j                        j                  || j                  g||      S | j                  rQt        | j                  j,                  | j                  j                         }t/        ||| j1                         ||      S t2        	|   |||      S )
Nr   )is_nonstrict_trace_callableTrE  r    z	torch.nn.ztorch.nn.utils.parametrize)constant)trace_rulesrH  r   r   r   rV  r   r   is_root_tracerr   r  NNModuleVariabler   
startswithr   r  r   r   rA   FSDPParamGroupuse_training_stateTorchCtxManagerClassVariabler  rW  r   r  )
rr   r   r   r   rH  	call_argsvarmodule_attrr   r  s
            r[   r   z UserMethodVariable.call_functiono  s    	>&tww/2$..*2T2I88TC $$RF;; 99##%*HHi00+
 "$''<<K '**;7#??##xx++(($t*ftGWGW ,   ),;;NNN99$''BPPTXX%%v  )9)9:B/BvVVw$Rv66rZ   r   c                     |dk(  r| j                   S |dk(  r+t        j                  || j                  | j                        S t
        |   ||      S )Nr'  r@  )r  r>   r   r   r,  r  r>  rr   r   r   r  s      r[   r>  zUserMethodVariable.var_getattr  sM    :88O: #((TWWdnnEEw"2t,,rZ   r   )r   r   r   r   r   r   r>   r
   rv   r   r*  r   r   r  r   rF  r#  r   r~   r   r>  r  r  s   @r[   r+  r+  J  s    . 37	JS#XJ J HS#X./	J
 J 
J2C# C40  T%"2"23  ;7#;7 ';7 S/)*	;7
 
;7z-5 -S -_ - -rZ   r+  c                   d     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                     |j                  dd        |j                  dd        t        |   |j                  |j                  fi | || _        || _        y )Nr   r  )r   r  rv   r   r  rY  r  rr   rY  r  r   r  s       r[   rv   z"WrappedUserMethodVariable.__init__  sK     	

4

5$W[[;F;rZ   r   rE   r   c                     | j                   j                  |       t        |   |||      }| j                   j	                  |       |S r   r  enterr  r   exitrr   r   r   r   r   r  s        r[   r   z'WrappedUserMethodVariable.call_function  A     	2&r48"rZ   c                      j                   fd         j                         j                  t        dd             y )Nc                  (      j                         S r   r  r  rr   s   r[   <lambda>z7WrappedUserMethodVariable.reconstruct.<locals>.<lambda>      gdll&; rZ   r9   Fadd_push_nullrY  extend_outputr   rr   r  s   ``r[   r  z%WrappedUserMethodVariable.reconstruct  4    ;<21e<=rZ   r)  )r   r   r   r+  r   rv   r   r>   r~   r   r   r  r  r  s   @r[   rX  rX    sm    
#
 +
 	

 

	#	 '	 S/)*		
 
	>rZ   rX  c                   d     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 )WrappedUserFunctionVariablerY  r  rG   r   rw   Nc                 z    |j                  dd        t        |   |j                  fi | || _        || _        y )Nr   )r   r  rv   r   rY  r  r[  s       r[   rv   z$WrappedUserFunctionVariable.__init__  s7     	

4.v.rZ   r   rE   r   c                     | j                   j                  |       t        |   |||      }| j                   j	                  |       |S r   r]  r`  s        r[   r   z)WrappedUserFunctionVariable.call_function  ra  rZ   c                      j                   fd         j                         j                  t        dd             y )Nc                  (      j                         S r   rd  re  s   r[   rf  z9WrappedUserFunctionVariable.reconstruct.<locals>.<lambda>  rg  rZ   r9   Frh  rk  s   ``r[   r  z'WrappedUserFunctionVariable.reconstruct  rl  rZ   r)  )r   r   r   r   r   rv   r   r>   r~   r   r   r  r  r  s   @r[   rn  rn    sm    	%	 +	 		
 
		#	 '	 S/)*		
 
	>rZ   rn  c                    dt         dt        fd}|D cg c]
  } ||       }}|j                         D ci c]  \  }}| ||       }}} ||i |}	| j                  j	                  |	|t        |            S c c}w c c}}w )Nxrw   c                 v    | j                         rt        d|       j                         S | j                         S )NrL   )	is_tensorr	   get_real_valuer  )rt  s    r[   convertz-invoke_and_store_as_constant.<locals>.convert  s1    ;;=(!,;;==##%%rZ   r  )r>   r   r   r   register_attr_or_moduler+   )
r   r   r   r   r   rx  rt  r   r   ress
             r[   rW  rW    s    &? &s &
 !%%1GAJ%D%(.71am7F7
d
f
C99,,d# -   &7s
   A>B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   Nri  rs   r{   r}   r   r   
wrapped_fnr   rw   c	                    |	j                  d      |	j                  t                      t        
|   di |	 t        |j                         t              sJ t        |j                         t        j                        sJ t        |t              sJ || _        || _        || _        || _        || _        || _        || _        || _        y )Nmutation_typer~  rY   )r   updater;   r  rv   r   r  r   r   r  r~   ri  rs   r   r{   r}   r   r   r|  )rr   ri  rs   r   r{   r}   r   r   r|  r   r  s             r[   rv   z#NestedUserFunctionVariable.__init__  s     ::o&.MM(<(>M?"6"'446<<<$113U^^DDD)T***	" $&5?rZ   c                     g S r   rY   r   s    r[   r   z$NestedUserFunctionVariable.self_args+  r   rZ   c                 6    | j                   j                         S r   )rs   r  r   s    r[   r   z#NestedUserFunctionVariable.get_code.  s    yy++--rZ   c                 "    t         j                  S r   r"  r   s    r[   r#  z&NestedUserFunctionVariable.python_type1  r$  rZ   c                 D   | j                   rt        t        j                  | j                  j                         | j                  | j                  j                               }| j                  r| j                  j                         |_	        | j                  r| j                  j                         |_        | j                  rZ| j                  j                         }t        |t              rddlm} t#         ||            }t        |t"              sJ ||_        |S )Nr   r   )r   r   r   r   rs   r  r   ri  r{   rz   r}   r|   r   r   r   r   r   r~   r   )rr   r_   r   r   s       r[   r   z'NestedUserFunctionVariable.get_function4  s    <<%%!!II((*NNLL++-

 == $ @ @ BD??"&//"D"D"FD**==?K+u-."8K#89 k4000#.D rZ   r   rE   name_varr   c                 z    |j                   j                  j                  | |j                  |       t	        d       S r   )r   r   
store_attrr  r@   )rr   r   r  r   s       r[   call_setattrz'NestedUserFunctionVariable.call_setattrL  s/     			))$D%%rZ   r   r   c                 j    |dk(  r | j                   |g| S t        | 	  ||t        |      |      S )N__setattr__)r  r  r  r   rr   r   r   r   r   r  s        r[   r  z&NestedUserFunctionVariable.call_methodU  s?     = $4$$R/$//w"2tT$Z@@rZ   c                     | j                   d uS r   )r   r   s    r[   has_closurez&NestedUserFunctionVariable.has_closure`  s    ||4''rZ   c                     |dk(  r| j                         S |dk(  r| j                         S |dk(  r!t        | dd       }|r|j                         S 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  si    :==?":==?">!j$/A-.1'')8D8w$R..rZ   c                     |dk(  r)t         j                  j                  t        | d            S |dk(  r)t         j                  j                  t        | d            S t        |   ||      S )Nra   rs   rz   r{   )r   r@   r   r   r  r   rV  s      r[   r   z+NestedUserFunctionVariable.call_obj_hasattrm  sc     :--44WT65JKK>!--44WT:5NOOw'D11rZ   c                      y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                 H   | j                         }t        j                  || j                  | j                  j                         | j                  rt        | j                  j                        nd t        d t        t        | j                         j                              D                    }| j                  r| j                  j                         |_         t        j                   |      j"                  |i |}|j%                          t'        |j(                  j                               }t+        |j,                  j.                  |       t1        |||       t3        |j                        D ])  \  }}	|	|vsJ | j4                  j                  |   }
|
||	<   + |S )Nc              3   2   K   | ]  }t        d         y wr   )r8   )r  _s     r[   r  z7NestedUserFunctionVariable.bind_args.<locals>.<genexpr>  s     Sa)D/Ss   )r   r   r   r   ri  r  r{   r   r   r   r   r1  r}   keys_as_python_constantr|   r   rN  rO  apply_defaultsr~   rP  r   r   r0  r   r   r   )rr   r   r   r   rs   r_   rN   r   r   r   r6  s              r[   r;  z$NestedUserFunctionVariable.bind_args|  sJ    }}!!NNLL++-*.--E$--%%&TS5T]]_5P5P1Q+RSS
 ??"&//"I"I"KD,!!$',,d=f=eoo++-...7ffd+"4#3#34 	 ICv%%%<<%%c*DF4L	 
 rZ   c                 ^   j                  fd        | j                         j                  j                  | j                        g        t        j                  | j                  j                  j                               | j                  r | j                         n!j                  j                  d       g       | j                  r | j                         n!j                  j                  d       g       | j                  r | j                         n!j                  j                  d       g       | j                  r=	 | j                  j                         }j                  j                  |      g       n!j                  j                  d       g       j                  t!        dd             | j"                  rvj                  fd        | j"                         j                  t!        dd             j                  t%        d             j                  t!        dd             dd	lm}  |j*                         }|j,                  j.                  j1                  |       r}|j,                  j.                  j2                  |    j5                         D ]H  \  }}j7                           |       j                  t%        d             j9                  |       J y y # t        $ r  | j                         Y uw xY w)
Nc                  0     j                  t        d      S )Nr   )load_import_fromr   r  s   r[   rf  z8NestedUserFunctionVariable.reconstruct.<locals>.<lambda>  s    G,,X7JK rZ      Fc                  (     j                  dd      S )N	functoolswrapsr  r  s   r[   rf  z8NestedUserFunctionVariable.reconstruct.<locals>.<lambda>  s    00gF rZ   r9   r   Tr   )rE   )ri  rs   rj  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	
 			wBB4>>RST ''		(?(?@A==DMM"!!7#<#<T#B"CD<<DLL!!!7#<#<T#B"CD??DOO$!!7#<#<T#B"CD*"..AAC%%88EF !!7#<#<T#B"CD21e<=??!!F DOO$!!"6q%"@A!!,q/2!!"6q$"?@ 	I-"--/99!!66t<!yy55JJ eg)e !%%l1o6""4() =) ' *(()*s   ;L L,+L,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  rQ  r  r  r@   r   r(  r   r;  r  r  r  s   @r[   r   r     s   	!	0	0N  15@ @ @ S>	@
 ?+@ _-@ o.@ /*@ _-@ @ 
@:40 .%.. ."T "e00 0&#& "& 	&
 
&	A#	A 	A '		A
 S/)*	A 
	A(T (/ 7 /s /s /2)2142	2$ T#s(^ ' ' S/)*	
 
c?"	#:8)rZ   r   c                   d     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 )!WrappedNestedUserFunctionVariablerY  r  rG   r   rw   Nc           
         |j                  dd        |j                  dd        |j                  dd        |j                  dd        |j                  dd        |j                  dd        |j                  dd        |j                  dd        t        | 	  |j                  |j                  |j
                  |j                  |j                  |j                  |j                  |j                         || _        || _        y )	Nri  rs   r   r{   r}   r   r   r|  )r   r  rv   ri  rs   r   r{   r}   r   r   r|  rY  r  r[  s       r[   rv   z*WrappedNestedUserFunctionVariable.__init__  s     	

9d#

64 

;%

:t$

<&

=$'

9d#

<&OOLLOO		
 rZ   r   rE   r   c                     | j                   j                  |       t        |   |||      }| j                   j	                  |       |S r   r]  r`  s        r[   r   z/WrappedNestedUserFunctionVariable.call_function  ra  rZ   c                      j                   fd         j                         j                  t        dd             y )Nc                  (      j                         S r   rd  re  s   r[   rf  z?WrappedNestedUserFunctionVariable.reconstruct.<locals>.<lambda>  rg  rZ   r9   Frh  rk  s   ``r[   r  z-WrappedNestedUserFunctionVariable.reconstruct  rl  rZ   r)  )r   r   r   r   rv   r   r>   r~   r   r   r  r  r  s   @r[   r  r    sm     + 	
 
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                 @    t        |   di | || _        || _        y ry   )r  rv   r  r  )rr   r  r  r   r  s       r[   rv   zSkipFunctionVariable.__init__  s!    "6"
rZ   c                     | j                   S r   r  r   s    r[   r  z'SkipFunctionVariable.as_python_constant  s    zzrZ   r   c                    t        j                  |dd      rW|}|}t        |dd      r&|j                  }t	        |d      }t        |dd      r&|j                  t        j                         nqt        j                  |      r)t        |j                  t        j                               n3t        |      s(t        |j                  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 %O"N.*FN!/!J!J",#%A# .*FN &&|'A'ABu%&++L,F,FGH07 &++L,F,FGH5((rZ   r   rE   r   c           	         t        j                  | j                  dd      rVt        j                  | j                  dd       }t        dt	        | j                        d| j                   d| ddg	       y | j                  t
        j                  j                  u r>|j                  d
      }|r|j                         }t        dd| d| dd| dg	       y | j                  t
        j                  j                  u rH|j                  d
      }|r|j                         }nd}t        t        |j                  d|             | j                  t
        j                  j                  u rt        t         j"                  rEddlm} |j)                  || j                        }t+        |t,              s|j/                  |||      S t1        | j                  dd      }	t1        | j                  dd       }
|
dn
t	        |
      }	 t        j2                  | j                        }d|	 d| d}d|	 dg}d|vr|d|	 d d!gz  }|	d0k(  rd1}g }| j>                  r| j>                  nd2}t        d3d4| d5|	 d6| ||	       y # t4        $ r d"d#h}|
|v rd$| d%|	 d}d&d'g}n|
\|
j7                  d(      rKd)| d%|	 d%}d*g}t
        j                  j8                  j;                  |d+z   d+j=                  |      z          nKd,| d%|	 d-}d.d/g}t
        j                  j8                  j;                  |d+z   d+j=                  |      z          Y w xY w)7Nr  F_torchdynamo_disable_msgz1Skip calling `torch.compiler.disable()`d functionzSkip calling function `z>` since it was wrapped with `torch.compiler.disable` (reason: rD  z(Remove the `torch.compiler.disable` callr  rh  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.rI  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`.rI  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  rI  graph_breakr   r  
skip_framer"   r   f_codestep_unsupportedr#   r   dont_skip_tracingbuilderr  r   r   r  r   r   getfiler   rN  rV   	warn_oncejoinr  )rr   r   r   r   rh  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((5OQUVCKDJJ5djj\ B::=aA ? ZZ5==444$jj/O"1"D"D"F?J4&P[\b[ccdeB?BSTD	 ZZ5==333#ZZ.N!/!B!B!D!#)IIOP^O_`  ZZ5==999!!''6 /55b$**E
!*.BC%33BfEEtzz>;OPH

L$?I090A,s9~K8Ytzz2UV^U_ `  $v%<> 
 38*B? D(TU]T^ _l l ;	 EX ++? 
 $(KKT[[5GFF";-|H:_U[T\]'	]  %Y06/D, <<'=(27  
iGE *y/C/CH/M$N{m[\]e\ffg"hK^E
 MM''11+2DtyyQVGW2WX J+VWX`Wa ba b  m;E MM''11+2DtyyQVGW2WXK%Ys   	>J CMMr   c                 h    t         j                  j                  t        | j                  |            S r   )r   r@   r   r   r  r  s      r[   r   z%SkipFunctionVariable.call_obj_hasattr  s&     ))00T1JKKrZ   c                     |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  s7    )),,T488b$**dkk4@@rZ   c                      y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    DJJrZ   c                 D    | j                         |j                         k(  S r   r  r  s     r[   r  z$SkipFunctionVariable.is_python_equal  s    &&(E,D,D,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
A5 AS A_ A GrZ   r  c                   d     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 )WrappedSkipFunctionVariablerY  r  rG   r   rw   Nc                     |j                  dd        |j                  dd        t        |   |j                  fd|j                  i| || _        || _        y )Nr  r  )r   r  rv   r  r  rY  r  r[  s       r[   rv   z$WrappedSkipFunctionVariable.__init__  sN     	

7D!

8T"Hw~~HHrZ   r   rE   r   c                     | j                   j                  |       t        |   |||      }| j                   j	                  |       |S r   r]  r`  s        r[   r   z)WrappedSkipFunctionVariable.call_function  ra  rZ   c                      j                   fd         j                         j                  t        dd             y )Nc                  (      j                         S r   rd  re  s   r[   rf  z9WrappedSkipFunctionVariable.reconstruct.<locals>.<lambda>  rg  rZ   r9   Frh  rk  s   ``r[   r  z'WrappedSkipFunctionVariable.reconstruct  rl  rZ   r)  )r   r   r   r>   r   rv   r   r~   r   r   r  r  r  s   @r[   r  r    sm    
 
 +
 	

 

	#	 '	 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                 @    t        |   di | || _        || _        y ry   )r  rv   r  r  )rr   r  r  r   r  s       r[   rv   z$WrapperUserFunctionVariable.__init__  s#    "6"&*rZ   r   rE   r   c                     || j                   k(  r[t        | j                  | j                         }| j                  xr 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  si    4%%%$**D,>,>?C[[BZT%BF"((S&99w"2t,,rZ   c                     g S r   rY   r   s    r[   r   z%WrapperUserFunctionVariable.self_args  r   rZ   r   c                    t        | j                  d      rnt        | j                  | j                  d       }t        |dd      xs d}|j	                  dd      d   dk7  r"d	}t
        j                  j                  j                  |       t
        j                  j                  j                  j                  d
      }|j                  t        j                        rt
        j                  j                  j                         }t!               |z   }|d   j"                  |d   j$                  f}	dj'                  t)        j*                  |            }
d|	d    d|	d    d}|t-        |
      z  }|j/                  |       | j1                         t3        |      z   }t5        j6                  t8        j:                        j=                  || t5        j>                  | j                        g||      S )N
cache_infor   rI  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  rI  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  rh  dynamo_logger
user_stack	frame_locuser_stack_formatteduser_stack_traceall_argss                r[   r   z)WrapperUserFunctionVariable.call_function  s    4##\2 0 0$2D2DdKI!)\2>D"K  q 1!4?K  ##--c2 % 3 3 ; ; E Eo V --gmm<!&!=!=!K!K!MJ!7!9J!FJ!+B!8!8*R.:O:O PI+-7793H3H3T+U()RS\]^S_R``abklmbnaooq'r$$,@(AA$!''(89>>#d4j0--''

-9--d.@.@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            
       J     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                 6    t        |   ||fi | || _        y r   )r  rv   r  )rr   r  r  r  r   r  s        r[   rv   z"WrapperUserMethodVariable.__init__%  s      	m>v>rZ   c                     | j                   gS r   rC  r   s    r[   r   z#WrapperUserMethodVariable.self_args/  rD  rZ   )r   r   r   r   r   r   r>   rv   r   r   r  r  s   @r[   r  r    sN      "	
  
40 rZ   r  c                  R    t         j                  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  s&    %%'	
 +*IrZ   c                     t         j                  j                         sJ d       |t               j	                         v sJ |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  >  sd     ))+B-BB+-/668888J""#N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        |   |fi | t        |t              sJ || _        y r   )r  rv   r   r   r  )rr   r   r  r   r  s       r[   rv   z*CollectiveFunctionRewriteVariable.__init__T  s0     	&v&/+?@@@.rZ   r   rE   old_fnr   optionsc                 j    t         j                  | |      \  }}t        |ft        |fd|i||d|S )Nr   )r  r   )r  rp  r   )r   r  r   r  new_fn
new_sources         r[   r   z(CollectiveFunctionRewriteVariable.create_  sO     ?FFr6R
0
0V
VgV
 	
 	
rZ   variablec                 H    t        j                  |       xr | t               v S r   )r   
isfunctionr  )r  s    r[   can_rewritez-CollectiveFunctionRewriteVariable.can_rewriten  s%     x(WX9U9W-W	
rZ   c                 8    t               |   }|t        | |      fS r   )r  r  )r   r   r  s      r[   rp  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 rQ|d   j                         r>t        d| j                   d|d|d| j                   g t        j                  	       | j                  |j                  |j                  |j                   fv ro|j#                  d
      }||j$                  n|j&                  d
   j(                  }||vrt+        d|       t,        j.                  j1                  ||         |d
<   | j2                  j5                  |||      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   rN  r   r~   rO  rP  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"  rN  reduce_op_var	reduce_ops	            r[   r   z/CollectiveFunctionRewriteVariable.call_function{  sj    	)N %%dgg.	ninnd5f5??@F:$6$I$I$KC77)8dWJvi8QRVRYRYQZ[&22	 77OO&&%%
 

 #JJt,M !, ##))$/77 
  00 #>yk!JKK$55<< +F4L ##11"dFCCrZ   )r   r   r   r   r   r   r   rv   r  r   r   rQ  r  r   r(   rp  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,D#,D ',D S/)*	,D
 
,DrZ   r  c                   @     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                     |s5t              dk(  r'dt        dt        ffd}t        j                  |      S t
        |   ||      S )Nr9   r   rw   c                     t        | t        j                        r| j                  d         S t	        d|  dg t
        j                         y )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  sN    b)"F"FG88tAw877-!d *66	rZ   )r   r   r>   r   LambdaVariabler  r   )rr   r   r   r   r  r  s     `  r[   r   z$FunctoolsWrapsVariable.call_function  sL     #d)q.
# 
/ 
 ++E22w$Rv66rZ   )	r   r   r   r   r>   r~   r   r   r  r  s   @r[   r1  r1    sB    7#7 '7 S/)*	7
 
7 7rZ   r1  c                   @    e Zd ZdefdZdddee   deeef   defdZ	y)	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 cg c]  }|j                          c}i |j                         D ci c]  \  }}||j                          c}}}t        j                  t                     S t        dd|d|dg t         j"                         y c c}w c c}}w # t        $ rL}	t        t        |	      |t        t        t        j                  |	j                                     Y d }	~	d }	~	ww xY w)Nr   r  znamedtuple constructionzargs=r$  z?`torch.compile` only support certain input types for namedtupler  )r1   r   r  r   r   r!   r  r   mapr@   r   r   r   UserDefinedClassVariabler=   r$   r   r'  )
rr   r   r   r   constant_argsrt  r   r   r  r  s
             r[   r   z+CollectionsNamedTupleFunction.call_function  s    ,D&9
6:;a**,;=C\\^LTQq!..00L 55.0 
 	-tgZy)Y"..		
 <L (Ic"2"9"9388DE s4   B> B3B> B8(B> 3B> >	DADDN)
r   r   r   r   r  r   r>   r~   r   r   rY   rZ   r[   r7  r7    sH    C 
#
 '
 S/)*	

 

rZ   r7  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        |   di | || _        t        |t              sJ || _        t        |t              sJ || _        t        j                  t              | _        y ry   )r  rv   r_   r   r   r   r~   r?  r  partialr4   
fake_value)rr   r_   r   r?  r   r  s        r[   rv   z!FunctoolsPartialVariable.__init__  s^     	"6"	$%%%	(D)))  $++H5rZ   c                 "    t         j                  S r   )r  rA  r   s    r[   r#  z$FunctoolsPartialVariable.python_type  s       rZ   c                 <   j                  fd        | j                         | j                  rj                  | j                         | j                  s2j                  t        t        | j                        dz   d             y j                  | j                  j                                t        | j                  j                               }j                  j                  t        |      t        | j                        z   dz   |d             y )Nc                  (     j                  dd      S )Nr  rA  r  r  s   r[   rf  z6FunctoolsPartialVariable.reconstruct.<locals>.<lambda> 	  s    g&>&>{I&V rZ   r9   F)ri  r_   r   foreachr?  rj  r   r   r  r   keyscreate_call_function_kw)rr   r  rG  s    ` r[   r  z$FunctoolsPartialVariable.reconstruct  s    VW		99OODII&}}!!"6s499~7I5"QR,,./T]]'')*++CIDII,F,JDRWX	
rZ   c                 "    | j                         S r   r  r   s    r[   r   z%FunctoolsPartialVariable.get_function	      &&((rZ   r   rE   c                     | j                   t        |      z   }i | j                  |}| j                  j	                  |||      S r   )r   r   r?  r_   r   )rr   r   r   r   merged_argsmerged_kwargss         r[   r   z&FunctoolsPartialVariable.call_function	  sB     ii$t*,34==3F3yy&&r;FFrZ   r   c                     t         j                  j                  t        t	        j
                  t              |            S r   )r   r@   r   r   r  rA  r4   r  s      r[   r   z)FunctoolsPartialVariable.call_obj_hasattr	  s2     ))00I%%h/6
 	
rZ   c                    | j                   xr t        | j                   |      }|dk(  r| j                  S |dk(  r!t        j                  | j
                  |      S |dk(  rW| j                  j                         D ci c]  \  }}t        j                  |      | }}}t        j                  ||      S |t        v rt        j                  | |      S t        t        |       y c c}}w )Nr_   r   r  r?  )r   r(   r_   r   rK   r   r?  r   r@   r   ConstDictVariabler3   r=  r!   r   )rr   r   r   r   r   r   r   s          r[   r>  z$FunctoolsPartialVariable.var_getattr#	  s    >DKK!>6>996>))$))FCC:?C}}?R?R?TUtq!%,,Q/2UEU..uVDD)),,T488 4	 Vs   > C'c                 :   t        j                  | j                  j                         g| j                  D cg c]  }|j                          c}i | j
                  j                         D ci c]  \  }}||j                          c}}S c c}w c c}}w r   )r  rA  r_   r  r   r?  r   )rr   ra  r   r   s       r[   r  z+FunctoolsPartialVariable.as_python_constant1	  s      II((*
26))<3c$$&<
 6:]]5H5H5JKTQq!&&((K
 	
<K   B
1Bc                 :   t        j                  | j                  j                         g| j                  D cg c]  }|j                          c}i | j
                  j                         D ci c]  \  }}||j                          c}}S c c}w c c}}w )zcSimilar to as_python_constant(), but add ID_MATCH guards to try to force things to become constants)r  rA  r_   guard_as_python_constantr   r?  r   )rr   r   r   s      r[   rT  z1FunctoolsPartialVariable.guard_as_python_constant8	  s      II..0
48II>qa((*>
 <@==;N;N;PQ41aq!,,..Q
 	
>QrR  c                     | j                   j                         xrH t        d | j                  D              xr* t        d | j                  j                         D              S )Nc              3   <   K   | ]  }|j                           y wr   r  r  s     r[   r  z>FunctoolsPartialVariable.is_python_hashable.<locals>.<genexpr>C	  s     BC**,Br  c              3   <   K   | ]  }|j                           y wr   rW  r  r  s     r[   r  z>FunctoolsPartialVariable.is_python_hashable.<locals>.<genexpr>D	  s     S5E,,.Sr  )r_   r  r  r   r?  r  r   s    r[   r  z+FunctoolsPartialVariable.is_python_hashable@	  sP    II((* TB		BBTSDMM<P<P<RSS	
rZ   c                     | j                   j                         }d | j                  D        }d | j                  j	                         D        }t        |g||      S )Nc              3   <   K   | ]  }|j                           y wr   r  r  s     r[   r  z;FunctoolsPartialVariable.get_python_hash.<locals>.<genexpr>I	  s     @sS((*@r  c              3   <   K   | ]  }|j                           y wr   r\  rY  s     r[   r  z;FunctoolsPartialVariable.get_python_hash.<locals>.<genexpr>J	  s     S5u,,.Sr  )r_   r  r   r?  r  r  )rr   	func_hash	args_hashvalues_hashs       r[   r  z(FunctoolsPartialVariable.get_python_hashG	  sQ    II--/	@dii@	SDMM<P<P<RSY99[9::rZ   c                 L   | j                   j                  |j                         xr~ t        d t        | j                  |j                        D              xrL t        d t        | j
                  j                         |j
                  j                               D              S )Nc              3   D   K   | ]  \  }}|j                  |        y wr   r  )r  arg_aarg_bs      r[   r  z;FunctoolsPartialVariable.is_python_equal.<locals>.<genexpr>P	  s'      "UE %%e,    c              3   D   K   | ]  \  }}|j                  |        y wr   rc  )r  value_avalue_bs      r[   r  z;FunctoolsPartialVariable.is_python_equal.<locals>.<genexpr>T	  s'      &Wg ''0rf  )r_   r  r  r   r   r?  r  r  s     r[   r  z(FunctoolsPartialVariable.is_python_equalM	  s    II%%ejj1 
 &)$))UZZ&@ 

  *-MM((*ENN,A,A,C+ 	
rZ   r)  )r   r   r   r>   r   r~   r   r   rv   r  r#  r  r   r   r@   r   r>  r  rT  rQ  r  r  r  r  r  s   @r[   r>  r>    s	   66 '6 sO+,	6
 6 
6"!T !
)c )G#G 'G S/)*	G
 
G
)
14
	
55 5S 5_ 5
C 

# 

D 
;
rZ   r>  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                 f    t        |j                  t        j                                | ||      S r  r  r  s      r[   r
  z-PolyfilledFunctionVariable.create_with_sourcej	  s*     	f''(B(BCD5((rZ   r   Nc                 .   t        |   di | || _        | j                         j	                  ||      }d }t        |      sJ d| d|        dD ]"  }t        ||d       }|st        |      sJ |} n t        d| d      || _        || _	        y )NzPolyfill handler z is not callable for )__torch_dynamo_polyfill____python_implementation__z# does not have a traceable functionrY   )
r  rv   r   rn  r   callabler   rM  r|  rl  )rr   r   r   handlerrl  candidate_attr	candidater  s          r[   rv   z#PolyfilledFunctionVariable.__init__r	  s    "6"--/33B; X$5gY>STVSW"XX 
 	N  >I	***(	 #G9,OP  " ,rZ   c                     | j                   S r   )rl  r   s    r[   polyfill_fnz&PolyfilledFunctionVariable.polyfill_fn	  s       rZ   c                 0    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    OOI5
 	
rZ   c                 "    | j                         S r   r  r   s    r[   r   z'PolyfilledFunctionVariable.get_function	  rJ  rZ   r   rE   r   c                 "   | j                         rt        ||      rt | j                  |D cg c]  }|j                          c}i |j	                         D ci c]  \  }}||j                          c}}}t        j                  ||      S | j                  t        j                  u r t        |      dk(  r|st        |d   t        j                  t        j                  f      rt        d |d   j                  D              rt        j                  j!                  ||j"                  j%                  dt&        j(                  t+        d |d   j                  D              fi       t'        j(                  |d   j                  D cg c].  }|j-                         r|j                         n|j.                  0 c}            S t        j                  || j0                        }|j3                  |||      S c c}w c c}}w c c}w )Nr9   r   c              3      K   | ]h  }|j                         xr t        |j                         t              xs2 t        |t        j
                        xr |j                         t        u  j y wr   )r  r   r  intr   SymNodeVariabler#  )r  rt  s     r[   r  z;PolyfilledFunctionVariable.call_function.<locals>.<genexpr>	  se        %%'SJq7K7K7Ms,S Yq)";";<WTWAWYs   A.A0r   c              3   <   K   | ]  }|j                           y wr   )as_proxy)r  as     r[   r  z;PolyfilledFunctionVariable.call_function.<locals>.<genexpr>	  s     ?A1::<?r  )sym_num)r{  r2   r   r  r   r>   r   builtinssumr   r   r   rK   TupleVariabler  r  r   r   create_proxyr  sym_sumr   r  r  rl  r   )	rr   r   r   r   rt  r   r   r   traceable_function_variables	            r[   r   z(PolyfilledFunctionVariable.call_function	  s    ))+0M&1
 6:;a**,;=C\\^LTQq!..00L  #((V44 GGx||#D	Q47Y%;%;Y=T=T$UV  a  ,,33		&&#MM?a??A	  "&a   !335 002!"+	 4  ( '6&;&;B@Q@Q&R#*88T6JJO <L4s   HH3Hr   c                 >   |dk(  r| j                  |||      S t        | j                  |d       }|s't        |      st	        |d| d| j                          i }| j
                  rt        | j
                  |      |d<   t        |fi |}|j                  |||      S )N__call__zCannot find callable z in r   )r   r   r   r5   r<   r   r(   rk  )rr   r   r   r   r   methodr  polyfilled_method_variables           r[   r  z&PolyfilledFunctionVariable.call_method	  s     :%%b$77$-+f- '<TF$twwi%PQ;; *4;; =GH%?%R'%R")77D&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   rn  r   r
  rM   rv   propertyrx  rQ  r{  r   r   r   r   r   r  r  r  r  s   @r[   rk  rk  ]	  s{    
	'	'	N __tHS#X,>@R@R,R'S    ))!')	%) )-2 - - -4 !Xc3h/ ! !
4 

)c )2K#2K '2K S/)*	2K
 
2KhJ#J J ?#	J
 S/)*J 
J(C rZ   rk  c                   4    e Zd Zdddee   deeef   defdZy)TracebackVariabler   rE   r   r   rw   c                      y 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                   l     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                 2    t        |   di | || _        y ry   )r  rv   r  )rr   r  r   r  s      r[   rv   zSysFunctionVariable.__init__	  s    "6"
rZ   r   rE   c                 h   t        |j                        rK|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   exnrg  tbr   s         r[   exc_infozSysFunctionVariable.exc_info	  s    r//"%C,,CB%%b#.%%b"-E **40**40**40E
 &&u--rZ   c                 >    | j                  |      j                  d   S )Nr9   )r  r   r   s     r[   	exceptionzSysFunctionVariable.exception
  s    }}R &&q))rZ   r   c                     | j                   t        j                  u r| j                  |      S | j                   t        j                  u sJ | j                  |      S r   )r  r  r  r  r   s       r[   r   z!SysFunctionVariable.call_function
  sH     ::%==$$zzS]]***~~b!!rZ   )r   rE   rw   zvariables.TupleVariable)r   r   r   r   rv   r  r>   r  r   r~   r   r   r  r  s   @r[   r  r  	  sp    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y")#DynamoTritonHOPifierrh  rw   c                 (    t        ddd| g        y )Nz!triton kernel unsupported featurerI  z/Encountered triton kernel unsupported feature: r  )r$   )rr   rh  s     r[   raise_unsupportedz&DynamoTritonHOPifier.raise_unsupported
  s    7I#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    yyrZ   gridrJ   .c                     ddl m} t        ||      r|j                         S t	        ddt        |       dg t        j                         y )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-
  sK    +d,-==?"I&tDzl3Y&22	rZ   metar   rE   c                     |j                         D ci c]%  \  }}t        j                  j                  |      |' }}}|j	                  ||gi       }|S c c}}w r   )r   r   r@   r   r   )rr   r  r  r   r   r   meta_vars          r[   	call_gridzDynamoTritonHOPifier.call_grid<
  sZ     IM

U1I..55a8!;UU!!"xj"5 Vs   *Auser_fnr   r   r  c                 \    ddl m} |j                  ||      }|j                  |||      }|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
  s3     	/ 1 8 8W E&44RvFrZ   user_objr   c                 l    ddl m}  ||t        |j                  |             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
  s9     	-*
811dV=

%/ 	  rZ   configsc                 n    |j                  |      }|D cg c]  } |j                          }}|S c c}w r   )unpack_var_sequencerT  )rr   r  r   r   s       r[   maybe_unpack_configsz)DynamoTritonHOPifier.maybe_unpack_configs`
  sB     --b1 DKK26224KK Ls   2r   c                 d    |j                         s| j                  d       |j                         S )Nz`@triton.heuristics must return constant values because configs can only contain constant values.)r  r  rT  )rr   r   s     r[   maybe_unpack_heuristic_resultz2DynamoTritonHOPifier.maybe_unpack_heuristic_resultk
  s0    ((*""r ..00rZ   TritonKernelVariablec                     |j                   t        |      dk7  r| j                  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
  s\     ==$D	Q""I tH~??**a"//	
 	
rZ   gridscombined_args_rawzvariables.ConstantVariablec                 V   ddl m} i }t        |j                               D ]D  }||   }t	        |t
        t        f      s|j                         ||<   |j                         ||<   F |j                         D ci c]%  \  }}t        j                  j                  |      |' }	}}ddlm}
m} |j                         D ci c]6  \  }}t	        |t               r!|j#                         r||j%                         8 }}}|	j                         D ci c](  \  }}t	        |t               r|j#                         s||* }}}|j'                         D ]R  }|j)                         }|j+                         r$|j-                         r5| j/                  dt1        |       d       T |
j3                  |      } ||t4              }|j6                  j9                  d|d|j:                  ||||j=                         d	       t        j                  d       S c c}}w c c}}w c c}}w )
Nr9   )rP  r   )kernel_side_tabletriton_kernel_wrapper_mutationz.Unexpected argument type for a Triton kernel: r  r   rY   )r  constant_args_idxr  tma_descriptor_metadatar   )dictsrP  r   rG  r   !TMADescriptorExperimentalVariableTMADescriptorStableVariableto_metadata
get_tensorr   r   r@   r   *torch._higher_order_ops.triton_kernel_wrapr  r  r>   r  r  r  realizerv  is_symnode_liker  repradd_constant_argsr~   r   r  r  r  )rr   r  r  r  r   rP  r  r   r   combined_argsr  r  r<  non_constant_argsr  r  s                   r[   call_HOPzDynamoTritonHOPifier.call_HOP
  s%    	- :<',,./ 	6A!!$A57RS ./]]_'*'(||~!!$	6 *//1
1 &&--a0!3
 

	
 *//1
1!_-!2F2F2H q##%%
 
 &++-
1q/2q7K7K7M qD
 
 #))+ 	A		AKKMQ%6%6%8&&DT!WIQO	 .??N !2D9
		*&11%6+B--/		
 ))
 	
]



s   <*H;H-H%N)r   r   r   r   r   r  r>   rQ  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 eEHHNN<P<PRU<U6V #CH~3J	#s(# ' S/)*	
 ,-  
   ,-  	 
   
 		 ()@ A		c	1O 1 1
(
 sm
 
 	
$H
(H
 H
  S>	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                     |j                  dd       | _        t        |   di | t        j                  | |||       y )Nr  rY   )r   r  r  rv    dynamo_triton_hopifier_singletoninit_variable)rr   r  r  r  r   r  s        r[   rv   zTritonKernelVariable.__init__
  s=     $ZZ>"6"(66tVZQUVrZ   r   rE   r   c                 2    t         j                  | |||      S r   )r  call_triton_kernelr   s       r[   r   z"TritonKernelVariable.call_function
  s      0BB$
 	
rZ   r   c                     |dk(  rt         j                  | |      S |dk(  rt         j                  | |||      S t        |   ||||      S )N__getitem__run)r  r  call_runr  r  r  s        r[   r  z TritonKernelVariable.call_method
  sW     = 3@@tLLU]3<<T4QSTT w"2tT6::rZ   ra  c                 v    ddl m} ddlm} t	        ||      r  |j
                  |j                               S |S )Nr9   r?   )r  )rJ  r@   tensorr  r   r   evaluate_expr)rr   ra  r@   r  s       r[   specialize_symbolicz(TritonKernelVariable.specialize_symbolic
  s6    .+ 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  
  s    
WW'/}W<?WKNW	W
#
 '
 S/)*	

 

;#; ; ?#	;
 S/)*; 
;s s rZ   r  c                   d     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        |   di | || _        || _        || _        || _        y ry   )	r   r   DataPtrVariabler  rv   r  r  r  r  )rr   r  r  r  r  r   r  s         r[   rv   z*TMADescriptorExperimentalVariable.__init__  sH     (I$=$=>>>"6" 	$(rZ   c                     t        | j                  D cg c]  }|j                          c}| j                  D cg c]  }|j                          c}| j                  j                               S c c}w c c}w r   )r  r  r  r  r  )rr   dims     r[   r  z-TMADescriptorExperimentalVariable.to_metadata  sW    /'+yy1S\\^1'+7S\\^7&&(
 	
17s
   A2A7
c                     j                   fd        j                  j                         g  j                   j                   j
                  }j                  |       j                  t        |      dz   d       y )Nc                  V     j                  ddt        j                         d      S )Nz$triton.tools.experimental_descriptorcreate_d_tma_descriptor)r  r   r  re  s   r[   rf  z?TMADescriptorExperimentalVariable.reconstruct.<locals>.<lambda>  s+    G,,6#dii.))9: rZ   r9   F)	ri  r  r  r  r  r  rF  r   r   )rr   r  r   s   `` r[   r  z-TMADescriptorExperimentalVariable.reconstruct  sp    	
 	!!'*@@T__@d.?.?@c$i!mU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    si    )-) ?#) )	)
 &) ) 
)
S 

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                 d    |j                         sJ t        |   di | || _        || _        y ry   )rv  r  rv   r  r  )rr   r  r  r   r  s       r[   rv   z$TMADescriptorStableVariable.__init__-  s6     !!!"6"&rZ   c                 H    t        | j                  j                               S r   )r  r  r  r   s    r[   r  z'TMADescriptorStableVariable.to_metadata8  s!    )%%'
 	
rZ   c                     j                  fd       j                  d       | j                  j                          | j                         j                  d       y )Nc                  (     j                  dd      S )Nztriton.tools.tensor_descriptorTensorDescriptorr  r  s   r[   rf  z9TMADescriptorStableVariable.reconstruct.<locals>.<lambda>?  s    G,,0" rZ   r  r   )ri  load_methodr  r  r  r  rk  s    `r[   r  z'TMADescriptorStableVariable.reconstruct=  sT    	
 	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  ,  sK    	' 	' $	' 		'
 
	'
S 


C rZ   r  c                   T     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                 >    |dv sJ t        |   di | || _        y )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                    d|v r|d   n|d   }t        |t        j                        st        d| j                   d      | j                  dk(  r]t        |      t        |      z   dk7  r$t        |dt        |      t        |      z           d|v r|d   n|d   g}d	|v r|d	   n|d
   g}nvt        |      t        |      z   dk7  r$t        |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     %fUmDG#y889)) %$$  99>4y3v;&!+$LSQUYY\]cYdMdLef
 "'&ud1gD (3f'<{#$q'J 4y3v;&!+$LSQUYY\]cYdMdLef
 #)F"2vQ"(F"2vQD
 )5(>|$DG(4(>|$DGJ 2@61Ivn-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
rZ   r
  c                   4    e Zd Zdddee   deeef   defdZy)!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  sF     &.%7!T!W/</Ff]+DQRG*#
 	
rZ   Nr  rY   rZ   r[   r  r    s<    
#
 '
 S/)*	

 

rZ   r  c                   8    e Zd ZdZdddee   deeef   defdZy)	!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k7  rt        |dt        |              d }|d   j                  rMt        |d   j                  j	                  t
        j                               t        |d   j                        }|d   j                         }t        |      r/t        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     t9> HTT 7>>$q'..33L4K4KLM$T!W^^4K1g))+{+$%6%8,GK"((ZEE$$R[IIrZ   N)	r   r   r   r   r   r>   r~   r   r   rY   rZ   r[   r  r    sF    J#J 'J S/)*	J
 
JrZ   r  c                   D     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kD  rt        |dt        |              |j                  dt        j                  d             }t        |      dk(  r|d   }|j                         st        	|   |||      S |d   }t        t        j                  j                  j                        j                  ||gi       }t        j                  |t        j                  j                  j                  t!                     }|j#                  |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   r  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  s!    t9q=CIM >s4ykJ **Y(8(?(?(EFt9>1gG'')7(T6:: Aw9KK..

-TFB
' 	 .33KK//46

 "--b.=/SUV&&399}55rZ   )
r   r   r   r   r   r>   r~   r   r   r  r  s   @r[   r  r    sG    $6#$6 '$6 S/)*	$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   rI  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>   rJ  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  rn  r  rT   r   	lru_cacher\   r^   r   r~   r   r   r   r   r  r   r   objectr   r   r   r   r   r  r  r  r,  r.  r9  r+  rX  rn  rW  r   r  r  r  r  r  r  r  r  r1  r7  r>  rk  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r  rY   rZ   r[   <module>r6     s  .      
   " . ( > > # %  4   3 > > V V    1
 
 
	 	 	  'E
 /  L
 6& T#s(+,
&'OP "+YK"8  ,=+>sCx( >  
 
>L \ `
`` ` 3-	`
 cN` 
#
`H GKAA&)A3;F3CAA.0 .$sCx. .T . # o%&  ..  
	 *
..CH~  uVS[)*	
 eHo& c3h( $sCx.) 4 --%+-5=f5E-MP--6, ,^RY3 RYj)": )X:4 :@D;? D;N

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