
    9j"                    L   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	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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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 ddl9m:Z:m;Z; ddl<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZE ddlFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZN ddlOmPZPmQZQmRZRmSZS ddlTmUZU ddlVmWZW 	 ddlXmYZY er4ddl[m\Z\ ddl]m^Z^m_Z_m`Z`maZa ddlbmcZc ddldmeZemfZf ddlgmhZh ddlimjZjmkZk ddllmmZm  eded ef   !      Znd"Zod#Zp eqh d$      Zr eqd%h      Zsd&Zt e       Zueeef   evd'<    G d( d)ew      Zxej                  d*e=fd+       Zz G d, d-      Z{d.ed*e{fd/Z|d.ed0d1d2e dz  d3ee   d4e}e~ef   d*e}e~eSf   fd5Z	 dd0d1d6ed7e dz  d*eSfd8Zd0d1d9e}e~ef   d*dfd:Zd;d1d9e}e~eSf   d<e	j                  d*dfd=Zd<e	j                  d>e}e~ef   d?e~d@eed f   dz  dAee   dz  dBe}e~ef   dz  dCe}e~ef   dz  d*e	j                   fdDZh dEZd0d1dFed7e dz  d?e~d*eSf
dGZ G dH dIeS      Z G dJ dKe      Z G dL dMe      Z G dN dOe      Z G dP dQe      Z G dR dSeS      Z G dT dUe      Z G dV dWe      Z G dX dYe      Z G dZ d[e      Z G d\ d]e      Z G d^ d_e      Zd0d1dFed ef   d?e~d3eeS   d4e}e~eSf   d*eSfd`Z G da dbe      Z G dc dde      Z G de dfeS      Z G dg dhe      Z G di dje      Z G dk dle      Zd*e}eef   fdmZd0d1dFed ef   d*e=fdnZ G do dpe      Z G dq dre      Z G ds dteS      Z G du dveS      Z G dw dxeS      ZddyldmZmZmZmZ  G dz d{e      Z e       Z G d| d}eS      Z G d~ deS      Z G d deS      Z G d deS      Z G d deS      Z G d de      Z G d de      Z G d de      Zd0d1deg df   d?e~d*dfdZ G d deS      Zy# eZ$ r dZYY /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Literal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_frame_infoget_dynamo_observed_exceptionhandle_observed_exceptionInfiniteGeneratorErrorObservedExceptionObservedGeneratorExitObservedUserStopIterationraise_observed_exceptionraise_type_errorStepUnsupportedunimplementedUnsupported)GuardBuilderinstall_guard)	
AttrSourceCellContentsSourceClosureSourceConstantSourceDefaultsSourceGetItemSourceImportSourceSkipGuardSource
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ValueMutationNewVariableTrackerConstantVariable)UserDefinedObjectVariable)_fsdp_param_group)	PyCodegen)&InliningGeneratorInstructionTranslatorInliningInstructionTranslatorInstructionTranslatorInstructionTranslatorBase)ContextWrappingVariable)TritonGridTypeTritonKernelType)DunderDictVariable)BaseListVariableListVariable)TensorVariable_F.)bound      >   is_leaf	namespacenone_is_leafrS   zihttps://github.com/pytorch/pytorch/issues/new?&labels=oncall%3A+pt2&projects=&template=pt2-bug-report.yml_spec_cachec                       e Zd Zy)ClosureConversionErrorN)__name__
__module____qualname__     a/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/_dynamo/variables/functions.pyrX   rX      s    r]   rX   returnc            	      T    t        t        t        t        d      d      d      d      S )Ntorchutils_pytreeSUPPORTED_NODES)r)   r/   r\   r]   r^   !get_pytree_SUPPORTED_NODES_sourcere      s(    :l73W=yI r]   c                   ,    e Zd ZdeddfdZdeddfdZy)FunctionSpecfuncr_   Nc                 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 Nr:   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)selfrh   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'r]   c           
         |j                   xs d| _        |j                  xs i | _        t	        t        | j                  t        | j                         d  t        t        | j                                          | _	        y Nr\   )
__defaults__defaults__kwdefaults__
kwdefaultsdictzipru   lenrangepos_default_map)r|   rh   s     r^   update_defaultszFunctionSpec.update_defaults   si     ))/R--3  $""C$6#6#895T]]AS;TU 
r]   )rY   rZ   r[   r   r   r   r\   r]   r^   rg   rg      s+    N\ Nd N$	
L 	
T 	
r]   rg   rh   c                 \    t         j                  |       }|t        |       }|t         | <   |S N)rV   getrg   )rh   specs     r^   	_get_specr      s.    ??4 D|D! DKr]   txrF   	fn_sourceargskwargsc           
         t        |       }t        |      |j                  k(  rh| j                  s\|sZ|j                  sN|j
                  sB|j                  s6t        |j                        D ci c]  \  }}|t        |||          c}}S |j                  |        i }t        |      }	|j                  j                         D ]d  \  }}
d }|r>t        j                  |j                   |
         rt"        j$                  st'        ||
      }t        ||j                   |
   |      ||<   f t        |j                        D ]i  \  }}|t        |      k  rt        |||         ||<   '||	v r-||j(                  vrt        ||	j+                  |            ||<   X||vs]t-        d|        |t        |j                        d  }|j                  r#t        |t/        |            ||j                  <   n/|r-t-        dt        |       dt        |j                               |j                  D ]p  }||	v rt        ||	j+                  |            ||<   &||j0                  v r0d }|rt'        ||d      }t        ||j0                  |   |      ||<   dt-        d|        |j
                  rt        ||	      ||j
                  <   |S |	rt-        dt3        |	             |S c c}}w )Nz&missing required positional argument: z#Too many positional arguments: got z, expected T)is_kwz(Missing required keyword-only argument: zUnexpected keyword arguments: )r   r   rp   r   ry   r{   rv   	enumerateru   wrap_bound_argr   r   r   itemsr@   
is_literalr   r   %skip_guards_on_constant_func_defaultsr-   rs   pop	TypeErrortupler   list)rh   r   r   r   r   r   inamebarem_kwidxdefault_sourceextrakwdefault_sources                 r^   bind_args_cachedr      s    T?D
 	D	T^^#!!!!!! %T%7%78
4 .T!W--
 	
 		B&\F ))//1 J	c''c(:;<<+Is;N!"dmmC&8.I4J T//0 M4s4y=%b$q'2BtHV^ *** &b&**T*:;BtH^DTFKLL!M& T''(*+E .r5< @4	1#d)KDL^L^H_G`a
 	

 !! 	O6>%b&**T*:;BtHT__$##1)T#N %b$//$*?AQRBtHFtfMNN	O ,R84?? I 
8fGHHIE
s   .K#valsourcec                     t        |t              r|S |st        j                  | |      S t        j                  j                  ||      S r   )
isinstancer>   buildr   LazyVariableTrackercreate)r   r   r   s      r^   r   r     sD     #'
$$R-- ,,33C@@r]   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.r]   parentr}   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   r}   r   r   new_cells         r^   init_cellvarsr   #  sa     ==--L    ..06> ##Hfjj.>?t r]   	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__)
r}   r   r   r   r   r   r   r   rh   r   s
             r^   _create_nested_fnr   8  sa     #ixAD$D+u%&8K01 *[$"???&DKr]   >	   __doc__rk   rY   rZ   __closure____globals__r   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)   r0   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dddeddf fdZdedz  fdZd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efdZdefdZdedz  fdZdeeef   fdZdej&                  fdZdefdZdej.                  fdZdefdZdd	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ee
f   fdZdefdZ xZ S )BaseUserFunctionVariableNdict_vtzDunderDictVariable | Noner   r_   c                 2    t        |   di | || _        y r   )superr   r   )r|   r   r   	__class__s      r^   r   z!BaseUserFunctionVariable.__init__}  s     	"6"29r]   c                     | j                   S r   r   r|   s    r^   
get_sourcez#BaseUserFunctionVariable.get_source      {{r]   r   rF   c                 |    | j                   %t        j                  j                  ||       | _         | j                   S r   )r   r   rK   r   r|   r   s     r^   get_dict_vtz$BaseUserFunctionVariable.get_dict_vt  s0    <<$77>>r4HDL||r]   r   r   c                     |dk(  r,| j                  |      j                  |dt        |      |      S |dk(  r,| j                  |      j                  |dt        |      i       S t        |   ||t        |      |      S )N__setattr____setitem____delattr____delitem__)r   call_methodr   r   r|   r   r   r   r   r   s        r^   r   z$BaseUserFunctionVariable.call_method  s     = ##B'33M4:v  ]"##B'33BtDzSUVVw"2tT$Z@@r]   c                 6    | j                         j                  S r   get_codeco_filenamer   s    r^   get_filenamez%BaseUserFunctionVariable.get_filename      }}***r]   c                 6    | j                         j                  S r   r   co_namer   s    r^   get_namez!BaseUserFunctionVariable.get_name      }}&&&r]   c                 |    t         j                  dk\  r| j                         j                  S | j	                         S )N)      )sysversion_infor   co_qualnamer   r   s    r^   get_qualnamez%BaseUserFunctionVariable.get_qualname  s.    w&==?...==?"r]   c                 <    | j                         j                  d   S Nr   )r   	co_constsr   s    r^   get_docz BaseUserFunctionVariable.get_doc  s    }}((++r]   c                     t         r   NotImplementedErrorr   s    r^   get_globalsz$BaseUserFunctionVariable.get_globals      !!r]   c                     t         r   r  r   s    r^   r   z!BaseUserFunctionVariable.get_code  r  r]   c                     t         r   r  r   s    r^   has_selfz!BaseUserFunctionVariable.has_self  r  r]   c                     t         r   r  r   s    r^   get_functionz%BaseUserFunctionVariable.get_function  r  r]   c                 (    | j                         d   S )NrY   )r  r   s    r^   
get_modulez#BaseUserFunctionVariable.get_module  s    !*--r]   c                    | j                  |      }|dv rr t        | d|dd               }|j                  |      r|j                  |      S t	        j
                  || j                  xr t        | j                  |            S |dk(  r|S |dk(  r|j                  |d       S |d	k(  r|j                  |d
       S |j                  |      r|j                  |      S t        t        |       y )N)rY   r[   r   rZ   rk   get_r   r   __dict__r   c                  @    t        j                  i t                     S Nmutation_type)r   ConstDictVariabler=   r\   r]   r^   <lambda>z6BaseUserFunctionVariable.var_getattr.<locals>.<lambda>  s    	33"2"4 r]   __type_params__c                  @    t        j                  g t                     S r  )r   TupleVariabler=   r\   r]   r^   r  z6BaseUserFunctionVariable.var_getattr.<locals>.<lambda>  s    	//"2"4 r]   )r   r   containsgetitemr@   r   r   r)   getitem_or_defaultr"   r   )r|   r   r   fn_dictr   s        r^   var_getattrz$BaseUserFunctionVariable.var_getattr  s   ""2& TT4'$$tAbzl 346C%t,,#**DKKIJt{{D,I  ZN&&--  &&--  %t,,(<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r|   r   r   r   s       r^   call_functionz&BaseUserFunctionVariable.call_function  sd     MMO88!!#,,-JK#**400--d4Ndnn6F4N4NPVWWr]   c                     d}|t         v s|dk(  rd}n	 t        | j                         |      }t	        j
                  ||      S # t        $ r d}Y #w xY w)NFr  T)r   hasattrr
  r  r>   r   r|   r   r   r   s       r^   call_obj_hasattrz)BaseUserFunctionVariable.call_obj_hasattr  sc     ((DJ,>F !2!2!4d; $$R00 ' s   A AAc                     i S r   r\   r   s     r^   closure_varsz%BaseUserFunctionVariable.closure_vars      	r]   c                      yNTr\   r   s    r^    should_allow_nested_graph_breaksz9BaseUserFunctionVariable.should_allow_nested_graph_breaks      r]   r   )r   rF   r_   rK   )!rY   rZ   r[   r   r   r   r   r   strr   r>   r   r   r   r   r   r   r  r   CodeTyper   boolr  r   r
  r  r  r%  r@   r)  r+  r/  __classcell__r   s   @r^   r   r   |  s   59:2:EH:	:FTM 
A#A A '	A
 S/)*A 
A+c +'# '#c #,t ,"T#s(^ ""%.. ""$ ""e00 ".C .!=5 !=S !=FX#X 'X S/)*	X
 
X1)1141	16 4_@T;U $ r]   r   c                   F    e Zd ZdZej
                  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f fdZdee   fdZdej
                  fdZdej2                  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 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d
z  fdZ)d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-d e#e   eeef   f   d
z  fd"Z.dej
                  d
z  fd#Z/d$ede-ed%f   d
z  fd&Z0dedee   d
z  fd'Z1de2d(   fd)Z3de4fd*Z5d+e6defd,Z7 xZ8S ).UserFunctionVariablez-Some unsupported user-defined global functionr   is_constant>   
optree.opstorch.utils._pytreetorch.utils._cxx_pytreeoptreevaluer   r_   c                 f    t        |j                  t        j                                | ||      S Nr   r(   
make_guardr'   CLOSURE_MATCHclsr=  r   s      r^   create_with_sourcez'UserFunctionVariable.create_with_source  s(    f''(B(BCD5((r]   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_inliner\   )r   r   r   r8  r   r   r   ra   jitScriptFunctionr%   r   INFERENCE_MODEr   r   r   r|   r   r8  r   r   s       r^   r   zUserFunctionVariable.__init__  s     	"6"20%8#D$D "u115993K3KLMK$PO&55	 ##B(=rBr]   c                 X    t        | t              r| j                  S t        |          S r   )r8   r7  r   r   as_python_constantr|   r   s    r^   rS  z'UserFunctionVariable.as_python_constant<  s%    $,-77Nw)++r]   c                 X    t        | t              r| j                  S t        |          S r   )r8   r7  r   r   get_real_python_backed_valuerT  s    r^   rV  z1UserFunctionVariable.get_real_python_backed_valueB  s%    $,-77Nw355r]   c                     g S r   r\   r   s    r^   r#  zUserFunctionVariable.self_argsG  r,  r]   c                     | j                   S r   r   r   s    r^   r
  z!UserFunctionVariable.get_functionJ      wwr]   c                 .    | j                   j                  S r   )r   rk   r   s    r^   r   zUserFunctionVariable.get_codeM  s    wwr]   c                 "    t         j                  S r   r   r   r   s    r^   python_typez UserFunctionVariable.python_typeP      !!!r]   c                 4    t        | j                  dd       d uS )N__self__)r   r   r   s    r^   r  zUserFunctionVariable.has_selfS  s    tww
D1==r]   c                 .    | j                   j                  S r   )r   r   r   s    r^   r  z UserFunctionVariable.get_globalsV  s    ww"""r]   c                 n    | j                   }|r&t        | t        j                        r| j                  }|S r   )r   r   r   UserMethodVariable	source_fn)r|   r   s     r^   r   zUserFunctionVariable.get_sourceY  s+    jy'C'CD^^Fr]   r   rF   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|rYt%        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.r\   cell_contents)freevar_nameN)r8  r   r   r   r   r   root_txr   r   r   rk   r   r   co_freevarsr   r   countr   r.   r+   r*   r>   r   rg  
ValueErrorr   DeletedVariabletrack_cell_existing)r|   r   r   r   r   ri  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#8#8 2 24I$L (;; $?#2#8#8ASAS#TL (;;D$U#F4LE"	$H ' " ?#,#<#<#>L? " ?#,#<#<#>L?s$   !G G2G/.G/2HHr   r   c           
          |dk(  rt         |   ||      S |t        v r5t        j                  | |t        t        | j                  |                  S | j                         }t        || j                  ||      S )Nr  py_type)
r   r  r4   r   GetAttrVariabletyper   r   r   r   )r|   r   r   r   r   s       r^   r  z UserFunctionVariable.var_getattr  ss    :7&r400++,,dD$)?$@  "b$''6488r]   c                 Z    t        | j                  |      }t        j                  ||      S r   )r'  r   r>   r   r(  s       r^   r)  z%UserFunctionVariable.call_obj_hasattr  s'     $'$$R00r]   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+                          |j                  d   }|j                  d   }t!        |t,              r|j	                         }t!        |t,              r|j	                         }t        j.                  ||      S | j                   t        j                  j0                  j2                  u r0d|j4                  _        t        j8                  j;                  d       S | j                   t        j                  j<                  u r" t        j                  | j                         j                  |i |}|j>                  d	   }t!        |t@              sS|jC                         }d
|jD                   d}tG        dd| jH                   d| d| d|g tJ        jL                         t!        |tN              s,|jQ                         }d| d}tG        d|  |d| ddg       |j                   }t        jR                  |t        j                  jT                  jV                        S | jX                  r't[        || j                   | jQ                         ||      S |j4                  j\                  j^                  st| j                   t        j                  j`                  jb                  u rDt        j                  jd                  jg                  |      5  th        |   |||      cd d d        S tm        |j4                  j\                  dd       dk(  r|j4                  j\                  jn                  sq	 d	dl8m9} |h| j                   |jt                  |jv                  fv rDt        j                  jd                  jo                  |      5  th        |   |||      cd d d        S | jy                  |||      }||S th        |   |||      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# t&        $ r}
t        d| d|       |
d }
~
ww xY w# 1 sw Y   [x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: 
, kwargs: error_on_graph_breakz\Improper error_on_graph_break() call. Please fix your call to error_on_graph_break(). args: fwdbwdzZImproper override_cudagraphs() call. Please fix your call to override_cudagraphs(). args: Tr   z=`nonstrict_trace` expects a callable, but got value of type <>zTypeError from user codezcall_function(, )rH  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` regionkinddescriptionz!torch.utils.checkpoint.checkpoint)	FSDPState)=r   ra   _dynamopatch_dynamo_configrS  r   changesr   DynamoConfigPatchVariabler;   RuntimeErrorr}  r   	signaturebind	argumentsr   r3  ErrorOnGraphBreakVariable	Exceptionoverride_cudagraphsapply_defaultsr>   CudagraphOverrideVariablebytecode_debugger
breakpointr   _emit_debugger_breakpointr@   r   nonstrict_tracer   r   r^  rY   r%   r=  r   
USER_ERRORr7  r   TorchInGraphFunctionVariableAllowInGraphKindNONSTRICT_TRACEr8  invoke_and_store_as_constantcurrent_tracer,unsafe_allow_externally_visible_side_effectsrb   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_stater  _pre_forward_post_forward_maybe_call_tree_map_fastpath)r|   r   r   r   arg
args_constkeyr   kwargs_constr  erP   r}  r~  r  fn_vartypmsgfn_namer   r  tree_map_resultr   s                         r^   r%  z"UserFunctionVariable.call_function  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9997))$''277HH$$&ooe,ooe,c?3002Cc?3002C ::3DD WW77BBB26BII/--44T::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99II  /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6g H  7 "!F*VH6 	  "!F*VH6    "!F*VH6 h? ?  ! 	!C Cs   V U6V U;4A V A2V$ 6B2W >W*W7 3X	6V 	V!
VV!$	W-V??W	W'W""W'*W47XX	Xc                    | j                  |||      }||\  }}}n| }|}|}t        |t              xr |j                         }t        |t              xr |j	                         }	|s|	sy h |t
        z
  ry t        |      dk  ry |d   }
|d   }|dd  }|	r|j                  |||
||d      S |j                  |||
||      S )Nr   r   r:   r\   )keypath)	_rewrite_tree_map_only_callr   r7  _is_tree_map_function_is_tree_map_with_path_function_SUPPORTED_TREE_MAP_KWARGSr   call_tree_map_with_pathcall_tree_map)r|   r   r   r   rewritetree_map_fntree_map_argstree_map_kwargsis_tree_mapis_tree_map_with_pathmap_fn
first_treerests                r^   r  z2UserFunctionVariable._maybe_call_tree_map_fastpath,  s    222tVD:A7KK M$O {$89 4113 	
 {$89 >;;= 	
 4_ ::}!q!"1%
QR  55 6   ++ r]   c                     t        | j                  dd       dk(  xr# t        | j                  dd       | j                  v S )NrY   tree_maprZ   r   r   _TREE_MAP_MODULESr   s    r^   r  z*UserFunctionVariable._is_tree_map_function`  s=    DGGZ.*< Ot48N8NN	
r]   c                     t        | j                  dd       dk(  xr# t        | j                  dd       | j                  v S )NrY   tree_map_with_pathrZ   r  r   s    r^   r  z4UserFunctionVariable._is_tree_map_with_path_functionf  s>    DGGZ.2FF Ot48N8NN	
r]   c                     t        | j                  dd       dk(  xr# t        | j                  dd       | j                  v S )NrY   tree_map_onlyrZ   r  r   s    r^   _is_tree_map_only_functionz/UserFunctionVariable._is_tree_map_only_functionl  s=    DGGZ./A Ot48N8NN	
r]   c           	      2   | 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 )Nr   r   r   )
r  r   _TREE_MAP_ONLY_SUPPORTED_KWARGS_extract_tree_map_only_types_lookup_tree_map_functionTreeMapOnlyFunctionVariabler   r>   r   r   )r|   r   r   r   type_selectorr  tree_argallowed_typestree_map_callablewrapped_map_fntree_map_variables              r^   r  z0UserFunctionVariable._rewrite_tree_map_only_callr  s     ..0t9>V966*.'vx99-H  ::<$468T2

 ,11"6GH >8"<d6lJJr]   c                     t        | j                  dd       }|sy t        j                  j	                  |      }|y t        |dd       }t        |t        j                        r|S y )NrZ   r  )r   r   r   modulesr   r   r   r   )r|   module_namemoduler  s       r^   r  z.UserFunctionVariable._lookup_tree_map_function  sZ    dgg|T:->6:t4h 2 23Or]   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   ry  ).0r  s     r^   	<genexpr>zDUserFunctionVariable._extract_tree_map_only_types.<locals>.<genexpr>  s     >S:c4(>   )is_python_constantrS  r  _flatten_type_specallr   r   fromkeys)r|   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   ry  r   r  extendr   r   __args__)r|   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<  &	'
 r]   Tc                      yr.  r\   r   s    r^   is_python_hashablez'UserFunctionVariable.is_python_hashable  r0  r]   c                 ,    t        | j                        S r   )hashr   r   s    r^   get_python_hashz$UserFunctionVariable.get_python_hash  s    DGG}r]   otherc                 j    t        |t        j                        xr | j                  |j                  u S r   )r   r   r7  r   r|   r  s     r^   is_python_equalz$UserFunctionVariable.is_python_equal  s*    %!?!?@XTWWPUPXPXEXXr]   F)9rY   rZ   r[   r   r   r   _cpython_typer   _nonvar_fields	frozensetr  classmethodr   rE  ra   rN  rO  r3  r   rS  rV  r   r>   r#  r
  r2  r   ry  r^  r  r   r1  r  r   r   r   rt  r  r@   r)  r%  r  r  r  r  r   r  r  r  r  r
   r  intr  objectr  r4  r5  s   @r^   r7  r7    sK   7 &&M 	 
"	0	0N "	
 )s )C )<R ) ) "!9!99  	
 
>,C ,6c 6
40 e00  %..  "T ">$ >#T#s(^ #F <'< '< S/)*	<
 
c?"	#<|95 9S 9_ 91)1141	1|7#|7 '|7 S/)*	|7
 
|7|2#2 '2 S/)*	2
 
4	2h
t 

 

D 
$K#$K '$K S/)*	$K 	"_%o%&(	

 	$KL
5+=+=+D 
/'/	tSy	D	 /" T
T0A ,GDM  YV Y Yr]   r7  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 )InspectSignatureVariablea  
    Variable tracker for inspect.signature with caching support.

    inspect.Signature is expensive to trace. When inspect.signature is called
    repeatedly on the same function during tracing, we cache the result to avoid
    retracing the signature construction each time. Although this is different
    from CPython behavior, it is safe to do so because inspect.signature does
    not change across different calls to the same function.
    r   rF   r   r   r_   c                 ^   t        |      dk(  r|s|d   }d }t        |t        t        f      r|j	                         }|]||j
                  j                  v r|j
                  j                  |   S t        | !  |||      }||j
                  j                  |<   |S t        | !  |||      S rj   )	r   r   r7  rd  r
  r   signature_cacher   r%  )r|   r   r   r   
target_arg	cache_keyr   r   s          r^   r%  z&InspectSignatureVariable.call_function  s     t9>&aJI*';=O&PQ&335	$		 9 999944Y??.r4@7=		)))4w$Rv66r]   
rY   rZ   r[   r   r   r>   r   r1  r%  r4  r5  s   @r^   r  r    sG    7#7 '7 S/)*	7
 
7 7r]   r  c                        e Zd Zdhej                  Zdeedf   dededdf fdZ	defdZ
d	edefd
Zdddee   deeef   defdZ xZS )r  r  .r  r   r_   Nc                 @    t        |   di | || _        || _        y r   )r   r   r  r  )r|   r  r  r   r   s       r^   r   z$TreeMapOnlyFunctionVariable.__init__  s$     	"6"*r]   c                     t         S r   r   r   s    r^   r^  z'TreeMapOnlyFunctionVariable.python_type	  s    r]   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>  s     Tg:i1Ts   )r^  r  anyr  )r|   r  r  s     @r^   _matches_allowed_typez1TreeMapOnlyFunctionVariable._matches_allowed_type  sC    	((*I TASASTTT # 		s   1 	==r   rF   r   c                    |s| j                   j                  |||      S |d   }| j                  |      r| j                   j                  |||      S t        |      dk7  s|r| j                   j                  |||      S |S )Nr   r:   )r  r%  r  r   )r|   r   r   r   leafs        r^   r%  z)TreeMapOnlyFunctionVariable.call_function  s}     ;;,,Rv>>Aw%%d+;;,,Rv>>t9>V ;;,,Rv>>r]   )rY   rZ   r[   r   r  r   ry  r>   r   r   r^  r3  r  r   r   r1  r%  r4  r5  s   @r^   r  r    s    	!	0	0N
T3Y'   	
 
T U/ Ud U# ' S/)*	
 
r]   r  c            	            e Zd Z	 ddej                  dededdf fdZde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   r8  r   r_   Nc                 j    t        |   di | t        |t        j                        sJ || _        y r   )r   r   r   r   BuiltinMethodTyper   rQ  s       r^   r   zBuiltinMethodVariable.__init__&  s2     	"6""e55666r]   c                 "    t         j                  S r   )r   r  r   s    r^   r^  z!BuiltinMethodVariable.python_type-  s    &&&r]   objc                     | j                   }| j                  }|t        u xr |dk(  xs t        |      t        u xr |dk(  S )N__new____contains__)ra  rY   r   ry  r  )r  method_selfmethod_names      r^   is_supported_builtin_methodz1BuiltinMethodVariable.is_supported_builtin_method0  sI    llll u$A	)A 
*L{n/L	
r]   r   rF   r   c                     | j                   j                  }| j                   j                  }| j                  xr t	        | j                  d      }t        j                  |||d      }|j                  ||||      S )Nra  T)realize)r   ra  rY   r   r)   r>   r   r   )r|   r   r   r   r  r   
obj_sourceobj_vts           r^   r%  z#BuiltinMethodVariable.call_function;  sh     gg&&ww[[HZZ%H
 &&r;
DQ!!"dD&99r]   r  )rY   rZ   r[   r   r  r3  r   r   ry  r^  staticmethodr  r   r>   r   r1  r%  r4  r5  s   @r^   r  r  %  s    ?D))8<PS	'T ' 
 
 
 

:#
: '
: S/)*	
:
 

:r]   r  c            
           e Zd Zej                  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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e"d   f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 )'LocalGeneratorObjectVariabler}   r   inline_tracerrD   r   r_   Nc                 N    t        |   di | || _        || _        || _        y r   )r   r   r}   r   r$  )r|   r}   r   r$  r   r   s        r^   r   z%LocalGeneratorObjectVariable.__init__L  s+     	"6"	"*r]   c                     | j                   S r   )r}   r   s    r^   r   z%LocalGeneratorObjectVariable.get_codeX  s    yyr]   c                 6    | j                         j                  S r   r   r   s    r^   r   z)LocalGeneratorObjectVariable.get_filename[  r   r]   c                 6    | j                         j                  S r   r   r   s    r^   r   z%LocalGeneratorObjectVariable.get_name^  r   r]   c                     t        d      )Nr
  r  r   s    r^   r
  z)LocalGeneratorObjectVariable.get_functiona  s    !.11r]   c                      yNFr\   r   s    r^   r  z%LocalGeneratorObjectVariable.has_selfd      r]   c                 "    | j                         S r   )r   r   s    r^   rY   z%LocalGeneratorObjectVariable.__name__g  s    }}r]   c                 V    | j                   j                   d| j                          dS )N(r  )r   rY   r   r   s    r^   __str__z$LocalGeneratorObjectVariable.__str__j  s'    ..))*!DMMO+<A>>r]   c                    ddl m} ddl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) save_and_restart_speculation_log(temporarely_allow_writes_to_output_graph)torch._dynamo.side_effectsr2  torch._dynamo.symbolic_convertr3  r4  r   r$  generator_exhaustedforce_unpack_var_sequenceremaining_itemsr   ListIteratorVariablereconstruct)
r|   codegenr2  r3  r4  r   savedisallowtemptracers
             r^   r;  z(LocalGeneratorObjectVariable.reconstructo  s    Q	

 ZZ/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	B=AB1B= C	1B:6B==C	C		Cc                     | j                   S r   r   r   s    r^   r  z(LocalGeneratorObjectVariable.get_globals      ~~r]   c                 "    t         j                  S r   )r   GeneratorTyper   s    r^   r^  z(LocalGeneratorObjectVariable.python_type  s    """r]   r   rG   c           	         | j                   }| j                         rt        t        |       	 |j	                         S # t
        $ r}d|_        |d }~wt        $ r+ t        ddddt         dgt        j                         Y y t        $ rq}t        j                  j                  j!                  | j#                                d|_        |j&                  s!|j(                  s|xj*                  dz  c_         d }~ww xY w)	NTzinfinite generator detected z}Dynamo traced the YIELD_VALUE bytecode too many times. This could mean that we have attempted to trace an infinite generator.zLIf you are sure that your generator is not infinite, please report a bug at .rH  zA

Skipping frame due to graph break in a generator's next() call.)r$  _is_generator_exhaustedr"   StopIterationinline_call_r   r7  r   r%   PT2_ISSUE_TRACKER_URLr   r  r&   ra   r  
eval_frame	skip_coder   
skip_frame	one_graphr}  r  )r|   r   r@  r  s       r^   next_variablez*LocalGeneratorObjectVariable.next_variable  s    ##'')$]B7	 &&((  	)-F&G% 	5I ccxbyyz{&11	  	MM$$..t}}?AL<<(?(?^^	s(   > 	C?	A4C?C?A,C::C?rF   r   c                     || j                         j                  v rt        j                  d      S t        j                  d      S NTF)r^  r  r@   r   r|   r   r   s      r^   r)  z-LocalGeneratorObjectVariable.call_obj_hasattr  s=     4##%...#**400&&u--r]   c                      yr+  r\   r   s     r^   has_unpack_var_sequencez4LocalGeneratorObjectVariable.has_unpack_var_sequence  r,  r]   c                      yr.  r\   r   s     r^   has_force_unpack_var_sequencez:LocalGeneratorObjectVariable.has_force_unpack_var_sequence  r0  r]   c                 B    g }| j                  ||j                         |S r   )force_apply_to_var_sequenceappend)r|   r   r   s      r^   r8  z6LocalGeneratorObjectVariable.force_unpack_var_sequence  s"     )+((V]];r]   r   c                 j    	 	  || j                  |             # t        $ r t        |       Y y w xY wr   )rQ  r!   r   )r|   r   r   s      r^   rZ  z8LocalGeneratorObjectVariable.force_apply_to_var_sequence  s@     4%%b)*  - )"-s    22Fc                      yr+  r\   r   s    r^   r/  z=LocalGeneratorObjectVariable.should_allow_nested_graph_breaks  r,  r]   excc                     | j                   }	 |j                  |       y # t        $ r}|j                  |       Y d }~y d }~ww xY wr   )r$  _raise_exception_variabler   exception_handler)r|   r   r^  r@  r  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 r   )r$  instruction_pointerr   s    r^   _is_generator_just_startedz7LocalGeneratorObjectVariable._is_generator_just_started  s*    !!T)XT-?-?-S-SWX-XXr]   c                 0    t        | j                  dd      S )Nr7  F)r   r$  r   s    r^   rI  z4LocalGeneratorObjectVariable._is_generator_exhausted  s    t))+@%HHr]   r   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                  j                  d       S 	 | j                  |t        j                  t        g              t         j"                  dk\  r?|j$                  j&                  dk(  r&d|_	        t        j                  j                  d       S 	 | j                  |      rt	        t*        |       n|d	k(  r| j                  }	 | j                  |t        |      d
k(  r|d   n|d          | j                  |      }t3        dt4        fi       }	 | j                  |t        j                  |g              | j                  |       t	        t*        |       |S t8        | u  ||||      S # t(        $ r) d|_	        t        j                  j                  d       cY S w xY w# t(        $ r) d|_	        t        j                  j                  d       cY S t,        $ r |j.                  J |j.                  cY S w xY w# t0        $ r  w xY w# t7        |      $ r Y |S w xY w)N__next____iter__sendc              3   <   K   | ]  }|j                           y wr   )is_constant_noner  r  s     r^   r  z;LocalGeneratorObjectVariable.call_method.<locals>.<genexpr>  s     Bc3//1Br  closeT)r      CALL_INTRINSIC_1throwr   r:   r   __InternalThrowException)rQ  re  r   r  r"   r   r$  	push_manyrI  r7  r   r@   r   rb  ExceptionVariableGeneratorExitr   r   next_instructionopnamer    r  r!   symbolic_resultr   ry  r  r   r   r   )	r|   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88>>?%%	33M2F( $$///66:LL15F.$55<<TBB.%%b),\2> W_ ''F
 %%bSY!^$q'aQ
 ''+F| 6bIH?%%b)*E*EhPR*ST""2&
 )v>Mw"2tT6::a ) ?-1* 1188>>? ) ?-1* 1188>>, .
 --999---., % N 1:  MsI   'A;H? $!I4 (K $7K ?/I10I14/K
%"K
	K
KK-,K-r<  rC   r_   N))rY   rZ   r[   r   rE  r  r2  r   r1  r   r   r   r   r   r   r
  r3  r  r0  __repr__r;  r  ry  r^  r>   rQ  r@   r)  rV  rX  r   r8  r   rZ  r
   r/  rb  re  rI  r   r4  r5  s   @r^   r#  r#  H  s   ''M
+nn
+ S>
+ @	
+
 
+ 

+%.. +c +'# '2e 2$ # ? ? HV$T#s(^ #T # ;  B.).14.	.*A d 0G D -	o	-3;_<Ms<R3S	'%. 	()	(0?	(		(YD YI Iw;#w; w; ?#	w;
 S/)*w; 
w; w;r]   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)rY   rZ   r[   r   r\   r]   r^   r~  r~    s    r]   r~  c            	            e Zd ZdZdefdZeddedededdf fd	Z	d
e
defdZdej                  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dfdZdddee   dee
ef   defdZdefdZ xZS )LocalGeneratorFunctionVariablezxfunctions that behaves like iterators

    .. note::

        This is a wrapper around (Nested)UserFunctionVariable
    r_   c                 "    t         j                  S r   r]  r   s    r^   r^  z*LocalGeneratorFunctionVariable.python_type  r_  r]   )generator_clsvtr  r   Nc                @    t        |   di | || _        || _        y r   )r   r   r  r  )r|   r  r  r   r   s       r^   r   z'LocalGeneratorFunctionVariable.__init__  s$     	"6"*r]   r   c                 v    || j                   j                  v rt        | |      S t        | j                  |      S r   )r   r  r   r  )r|   r   s     r^   __getattr__z*LocalGeneratorFunctionVariable.__getattr__  s2    4>>***4&&tww%%r]   c                 6    | j                   j                         S r   )r  r   r   s    r^   r   z'LocalGeneratorFunctionVariable.get_code      ww!!r]   c                 6    | j                   j                         S r   )r  r  r   s    r^   r  z*LocalGeneratorFunctionVariable.get_globals  s    ww""$$r]   c                 6    | j                   j                         S r   )r  r  r   s    r^   r  z'LocalGeneratorFunctionVariable.has_self  r  r]   r   rG   r   rE   c                 8    ddl m}  |j                  || ||      S )Nr   )rE   )r6  rE   build_inline_tracer)r|   r   r   r   rE   s        r^   _build_inline_tracerz3LocalGeneratorFunctionVariable._build_inline_tracer  s*     	Q@,@@	
 	
r]   rF   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.rH  r   )
r   r  r   r%   r1  r  r   r  r  r   )r|   r   r   r   r$  r}   r   s          r^   r%  z,LocalGeneratorFunctionVariable.call_function  s     DGG,,./ADGG,,./. LH	 11"d4j&Iww!GG'')	 !!;;	 " 
 	
r]   c                 6    | j                   j                         S r   )r  rV  r   s    r^   rV  z;LocalGeneratorFunctionVariable.get_real_python_backed_value  s    ww3355r]   )rY   rZ   r[   r   ry  r^  r#  r   r   r   r1  r  r   r2  r   r   r  r3  r  r   r>   r  r   r%  r  rV  r4  r5  s   @r^   r  r    s   "T " ;		+$	+ 		+
 	+ 
	+& & &"%.. "%T#s(^ %"$ "
'
 ?#
 S/)*	

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

 

<6f 6r]   r  c                   \     e Zd ZdZdededd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   r_   Nc                 2    t        |   |fdt        i| y )Nr  )r   r   r~  )r|   r  r   r   s      r^   r   z<FunctionDecoratedByContextlibContextManagerVariable.__init__  s%    	
N	
 	
r]   r   rG   r   rD   c                     t         |   |||      }t        |t        j                  j
                  j                        sJ d|_        |S r.  )r   r  r   ra   r  symbolic_convertrD   is_generator_from_ctx_manager)r|   r   r   r   r@  r   s        r^   r  zHFunctionDecoratedByContextlibContextManagerVariable._build_inline_tracer  sO     -b$?MM**QQ
 	
 
 04,r]   )rY   rZ   r[   r   r   r   r   r   r>   r   r1  r  r4  r5  s   @r^   r  r    sb    
3 
s 
t 
' ?# S/)*	
 
2 r]   r  c                        e Zd ZdZej
                  Z	 ddedef   de	de
dz  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defdZ xZS )rd  z$Some unsupported user-defined methodNr   .r  re  r   r_   c                     t        |   dd|i| || _        || _        |3|j	                  d      !t        |j	                  d      d      | _        y y y )Nr   r   __func__r\   )r   r   r  re  r   r)   )r|   r   r  re  r   r   s        r^   r   zUserMethodVariable.__init__!  s^     	)B)&)" H!5!A'

8(<jIDN "Br]   c                 h    | j                   j                   d| j                   d| j                   dS )Nr/  r  r  )r   rY   r   r  r   s    r^   r|  zUserMethodVariable.__repr__:  s.    ..))*!DGG9BtxxjBBr]   c                     | j                   gS r   r  r   s    r^   r#  zUserMethodVariable.self_args=      zr]   c                 "    t         j                  S r   r   
MethodTyper   s    r^   r^  zUserMethodVariable.python_type@      r]   r   rF   r   c                 4   ddl m}m}  || j                        rjg | j	                         |}t        j                  | j                  t
        j                  j                  j                        }|j                  |||      S  || j                        rjg | j	                         |}t        j                  | j                  t
        j                  j                  j                        }|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.        j0                  j2                  u r>t        j4                  | j                        j                  || j                  g||      S | j&                  rQt#        | j                  j6                  | j                  j*                        }	t9        ||	| j;                         ||      S t<        
| )  |||      S )	Nr   )is_leaf_functionis_nonstrict_trace_callabler  rZ   rG  z	torch.nn.ztorch.nn.utils.parametrize)constant)trace_rulesr  r  r   r#  r   r  ra   r  r  r%  LEAF_FUNCTIONr   is_root_tracerr   r  NNModuleVariabler   
startswithr8  r   rY   r   rB   FSDPParamGroupuse_training_stateTorchCtxManagerClassVariabler=  r  r   r   )r|   r   r   r   r  r  	call_argsvarmodule_attrr   r   s             r^   r%  z UserMethodVariable.call_functionC  s    	P&tww/2$..*2T2I88ioo>>NNC $$RF;;DGG$2$..*2T2I88ioo>>LL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6r]   r   c                     |dk(  r| j                   S |dk(  r+t        j                  || j                  | j                        S t
        |   ||      S )Nra  r  )r  r>   r   r   re  r   r  )r|   r   r   r   s      r^   r  zUserMethodVariable.var_getattr  sM    :88O: #((TWWdnnEEw"2t,,r]   c                     | j                   S r   rY  r   s    r^   rV  z/UserMethodVariable.get_real_python_backed_value  rZ  r]   r   )rY   rZ   r[   r   r   r  r  r   r   r>   r   r   r1  r|  r   r#  ry  r^  r   r   r%  r  rV  r4  r5  s   @r^   rd  rd    s    . $$M $(	JS#XJ J D=	J
 J 
J2C# C40  T%"2"23  B7#B7 'B7 S/)*	B7
 
B7H-5 -S -_ -c r]   rd  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wrappedrJ  rH   r   r_   Nc                     |j                  dd        |j                  dd        t        |   |j                  |j                  fi | || _        || _        y )Nr   r  )r   r   r   r   r  r  rJ  r|   r  rJ  r   r   s       r^   r   z"WrappedUserMethodVariable.__init__  sK     	

4

5$W[[;F;r]   r   rF   r   c                 R   t         j                  rNt        t        j                        }|j                  || j                  | j                  gt        |      z   |      S | j                  j                  |       t        |   |||      }| j                  j                  |       |S r   r   nested_graph_breaksr7  r   _fn_with_ctxr%  rJ  r  r   enterr   exitr|   r   r   r   
wrapper_fnr   r   s         r^   r%  z'WrappedUserMethodVariable.call_function       %%-i.D.DEJ++T\\4<<04:=v  	2&r48"r]   c                      j                   fd         j                         j                  t        dd             y )Nc                  (      j                         S r   rJ  r<  r|   s   r^   r  z7WrappedUserMethodVariable.reconstruct.<locals>.<lambda>      gdll&; r]   r:   Fadd_push_nullr  extend_outputr   r|   r<  s   ``r^   r;  z%WrappedUserMethodVariable.reconstruct  4    ;<21e<=r]   r{  )rY   rZ   r[   rd  r   r   r   r>   r   r1  r%  r;  r4  r5  s   @r^   r  r    sm    
#
 +
 	

 

# ' S/)*	
 
 >r]   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 )WrappedUserFunctionVariabler  rJ  rH   r   r_   Nc                 z    |j                  dd        t        |   |j                  fi | || _        || _        y )Nr   )r   r   r   r   r  rJ  r  s       r^   r   z$WrappedUserFunctionVariable.__init__  s7     	

4.v.r]   r   rF   r   c                 R   t         j                  rNt        t        j                        }|j                  || j                  | j                  gt        |      z   |      S | j                  j                  |       t        |   |||      }| j                  j                  |       |S r   r  r  s         r^   r%  z)WrappedUserFunctionVariable.call_function  r  r]   c                      j                   fd         j                         j                  t        dd             y )Nc                  (      j                         S r   r  r  s   r^   r  z9WrappedUserFunctionVariable.reconstruct.<locals>.<lambda>  r  r]   r:   Fr  r  s   ``r^   r;  z'WrappedUserFunctionVariable.reconstruct  r  r]   r{  )rY   rZ   r[   r7  r   r   r   r>   r   r1  r%  r;  r4  r5  s   @r^   r  r    sm    	%	 +	 		
 
	# ' S/)*	
 
 >r]   r  c                    dt         dt        ffd}|D cg c]
  } ||       }}|j                         D ci c]  \  }}| ||       }}} ||i |}	| j                  j	                  |	t                    S c c}w c c}}w )Nxr_   c           
         | j                         rt        d|       j                         S t        | t              r@| j
                  (t        | j                  t        j                               | j                  S 	 | j                         S # t        $ rG t        dd dt        |       j                   dt        |       j                   d ddd	g
       Y y w xY w)NrN   z1assume_constant_result argument conversion failedz	function z, variable type z Cannot convert argument of type z# to a Python constant for function zm marked with torch._dynamo.assume_constant_result. The variable tracker does not support constant conversion.z>Remove torch._dynamo.assume_constant_result from this functionzIEnsure all arguments passed to the function can be converted to constantsrH  )	is_tensorr	   get_real_valuer   rA   r   r(   rA  r'   ID_MATCHr=  rS  r;   r%   ry  rY   )r  r   s    r^   convertz-invoke_and_store_as_constant.<locals>.convert  s    ;;=(!,;;==a23xx#all<+@+@AB77N	''))2 	K#D6)9$q':J:J9KL>tAw?O?O>P Q  $v &MN U_
	s   =B ACCr   )r>   r   r   r   register_attr_or_moduler,   )
r   r   r   r   r   r  r  r   r   ress
     `       r^   r  r    s    ? s , !%%1GAJ%D%(.71am7F7
d
f
C99,,d# -   &7s
   BBc                       e Zd Zdhej                  Z	 d!dededeeef   dedz  dedz  dedz  dedz  d	ed
df fdZ	d
e
e   fdZd
ej                  fdZd
ej                  fdZd
eej                     fdZd!dee   dz  d
ej                  fdZd
efdZdee   d
ej                  fdZddde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 )#NestedUserFunctionVariabler   Nr  r}   r   r   r   
wrapped_fnr   r_   c                    |j                  d      |j                  t                      t        	|   di | t        |j                         t              sJ t        |j                         t        j                        sJ t        |t              sJ || _        || _        || _        || _        || _        || _        || _        y )Nr  r  r\   )r   updater<   r   r   r   rS  r1  r   r2  r   r  r}   r   r   r   r   r  )
r|   r  r}   r   r   r   r   r  r   r   s
            r^   r   z#NestedUserFunctionVariable.__init__  s     ::o&.MM(<(>M?"6"'446<<<$113U^^DDD)T***	" $2<r]   c                     g S r   r\   r   s    r^   r#  z$NestedUserFunctionVariable.self_args"  r,  r]   c                 "    | j                         S r   )r
  r   s    r^   rS  z-NestedUserFunctionVariable.as_python_constant%  s      ""r]   c                 6    | j                   j                         S r   )r}   rS  r   s    r^   r   z#NestedUserFunctionVariable.get_code(  s    yy++--r]   c                 "    t         j                  S r   r]  r   s    r^   r^  z&NestedUserFunctionVariable.python_type+  r_  r]   _convertingc                     ddl m} t        |       }|
t               }||v rt	        d      |j                  |       	 | j                  |      |j                  |       S # |$ r}t	        d      |d }~ww xY w# |j                  |       w xY w)Nr:   )r;   z-cycle detected in mutually recursive closuresz1failed to convert closure cell to Python constant)baser;   idsetrX   add_get_function_impldiscard)r|   r  r;   self_idr  s        r^   r
  z'NestedUserFunctionVariable.get_function.  s     	>T(%Kk!(?  	 	)**;7 ( 3 	(C	
 (s#   A! !A7&A22A77A: :Bc                 P    	 | j                          y# t        t        f$ r Y yw xY wrS  )rS  r  r&   r   s    r^   r  z-NestedUserFunctionVariable.is_python_constantD  s-    	##%#[1 		s    %%c                    d }| j                   rddlm}  |j                         }g }| j                   j                  D ]  }|j
                  j                  j                  |      }|| u rt        d      t        |t              r|j                  |      }n|j                         }|j                  t        |              t        |      }t!        j"                  | j$                  j                         | j&                  | j(                  j                         d |      }	| j*                  r| j*                  j                         |	_        | j.                  r| j.                  j                         |	_        | j2                  r| j2                  j5                  d      ri| j2                  j7                  d      j                         }
t        |
t              rddlm} t=         ||
            }
t        |
t<              sJ |
|	_        |	S )Nr   )rF   z self-referential nested function)argdefsr   r   r   ) r   r6  rF   
current_txr   r   r   	load_cellrX   r   r  r
  rS  r[  r9   r   r   r   r}   r   r  r   r   r   r   r   r  r  r   r   r   r   )r|   r  closure_cellsrF   r   cellsrp  rg  r=  rh   r   r   s               r^   r  z-NestedUserFunctionVariable._get_function_implK  s   <<L1&113BE LL.. / !#		 6 6 @ @ J !D(01STT m-GH)66{CE)<<>EYu-.-/. "%LM!!II((*NNLL++-!
 == $ @ @ BD??"&//"D"D"FD<<DLL112CD,,../@ATTVK+u-."8K#89 k4000#.D r]   r   rF   r   c           
      @   |dv rt         |   ||      S |dk(  r4t        | dd       }|r|j                         S t	        j
                  d       S |t        v r9t        j                  | |t        t        t        j                  |                  S t         |   ||      S )N)r   r  r   rk   rZ   rY   r[   r  r   r   rv  )r   r  r   rS  r@   r   r4   r   rx  ry  r   r   r|   r   r   dr   s       r^   r  z&NestedUserFunctionVariable.var_getattr  s     	
 	
 7&r400>!j$/A-.1'')Q4D4K4KD4QQ++,,dD1C1CT)J$K  7&r400r]   c                     | j                   d uS r   )r   r   s    r^   has_closurez&NestedUserFunctionVariable.has_closure  s    ||4''r]   c                     |dk(  r| j                         S |dk(  r| j                         S |dk(  r!t        | dd       }|r|j                         S d S t        |   ||      S )NrY   rk   r   r   )r   r   r   rS  r   const_getattrr  s       r^   r  z(NestedUserFunctionVariable.const_getattr  si    :==?":==?">!j$/A-.1'')8D8w$R..r]   c                 2   |dk(  r t        j                  |t        | d            S |dk(  r t        j                  |t        | d            S t        j                  |      }|| j                  |      v rt        j                  d      S t        |   ||      S )Nrk   r}   r   r   T)r>   r   r'  r@   r   r   r   r)  )r|   r   r   r  r   s       r^   r)  z+NestedUserFunctionVariable.call_obj_hasattr  s     :"((WT6-BCC>!"((WT:-FGG$$T*!!"%%#**400w'D11r]   c                      yr+  r\   r   s    r^   r  z#NestedUserFunctionVariable.has_self  r,  r]   c                     | j                   S r   rB  r   s    r^   r  z&NestedUserFunctionVariable.get_globals  rC  r]   r   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   )r9   )r  _s     r^   r  z7NestedUserFunctionVariable.bind_args.<locals>.<genexpr>  s     Sa)D/Ss   )r   r   r   r   r  rS  r   r   r   r   r   rj  r   keys_as_python_constantr   r   r  r  r  r   r  r   r   ri  r   r   r   )r|   r   r   r   r}   rh   rP   r   r   r   ro  s              r^   rt  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	 
 r]   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                  ri| j                  j                  d      rN| j                  j                  d      }	 |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             j*                  }|j,                  j.                  j1                  |       r}|j,                  j.                  j2                  |    j5                         D ]H  \  }}j7                           |       j                  t)        d             j9                  |       J y y # t"        $ r  |       Y `w xY w)	Nc                  0     j                  t        d      S )Nr   )load_import_fromrY   r<  s   r^   r  z8NestedUserFunctionVariable.reconstruct.<locals>.<lambda>  s    G,,X7JK r]   r      Fc                  (     j                  dd      S )N	functoolswrapsr  r  s   r^   r  z8NestedUserFunctionVariable.reconstruct.<locals>.<lambda>  s    00gF r]   r:   r   T)r  r}   r  create_load_const_uncheckedr   r@   r   r=  r   r   create_load_constr   r   r   r  r  rS  r  r   r  r   r   r   r   has_pending_mutationstore_attr_mutationsr   dup_top
store_attr)r|   r<  r   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<<DLL112CD,,../@AK%)<<>%%88EF !!7#<#<T#B"CD21e<=??!!F DOO$!!"6q%"@A!!,q/2!!"6q$"?@ ZZ99!!66t<!yy55JJ eg)e !%%l1o6""4() =% ' %$%s   1L. .MMr   r{  )$rY   rZ   r[   r   r  r>   r   r1  r   r   r   r#  r   r   rS  r2  r   ry  r^  r  r  r
  r3  r  r  r  r  r  r@   r)  r  r  r   rt  r;  r4  r5  s   @r^   r  r    s   	!	0	0N .2= = = S>	=
 "D(= $d*= !4'= $d*= = 
=640 #E$6$6 #.%.. ."T%"4"45 ")C4 )5CUCU ),D 6c#h 65;M;M 6p15 1S 1_ 1,(T (/ 7 /s /s /
2)
214
2	
2$ T#s(^ ' ' S/)*	
 
c?"	#:7)r]   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 )!WrappedNestedUserFunctionVariabler  rJ  rH   r   r_   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                         || _
        || _        y )	Nr  r}   r   r   r   r   r   r  )r   r   r   r  r}   r   r   r   r   r  r  rJ  r  s       r^   r   z*WrappedNestedUserFunctionVariable.__init__  s     	

9d#

64 

;%

:t$

<&

=$'

9d#

<&OOLLOO	
 r]   r   rF   r   c                 R   t         j                  rNt        t        j                        }|j                  || j                  | j                  gt        |      z   |      S | j                  j                  |       t        |   |||      }| j                  j                  |       |S r   r  r  s         r^   r%  z/WrappedNestedUserFunctionVariable.call_function*  r  r]   c                      j                   fd         j                         j                  t        dd             y )Nc                  (      j                         S r   r  r  s   r^   r  z?WrappedNestedUserFunctionVariable.reconstruct.<locals>.<lambda>;  r  r]   r:   Fr  r  s   ``r^   r;  z-WrappedNestedUserFunctionVariable.reconstruct:  r  r]   r{  )rY   rZ   r[   r  r   r   r   r>   r   r1  r%  r;  r4  r5  s   @r^   r  r    sm    + + 	
 
4# ' S/)*	
 
 >r]   r  c            	           e Zd Zddhej                  Zddededz  deddf fdZde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efdZdefdZdedefdZ xZS )SkipFunctionVariabler=  reasonNr   r_   c                 @    t        |   di | || _        || _        y r   )r   r   r=  r  )r|   r=  r  r   r   s       r^   r   zSkipFunctionVariable.__init__G  s!    "6"
r]   c                     | j                   S r   r=  r   s    r^   rS  z'SkipFunctionVariable.as_python_constantL      zzr]   c                     | j                   S r   r  r   s    r^   rV  z1SkipFunctionVariable.get_real_python_backed_valueO  r  r]   r   c                 4   t        j                  |dd      rW|}|}t        |dd      r&|j                  }t	        |d      }t        |dd      r&|j                  t        j                         nt        j                  |      rYt        |d      r$t        |j                  t        j                        r\t        |j                  t        j                               n3t!        |      s(t        |j                  t        j                                | ||      S )N_torchdynamo_disableF_torchdynamo_orig_callablera  r   )r   r   r   r  r)   rA  r'   rB  	isbuiltinr'  r   ra  r   
ModuleTyper(   BUILTIN_MATCHr7   )rD  r=  r   guard_on_sourceguard_on_values        r^   rE  z'SkipFunctionVariable.create_with_sourceR  s     !!%)?G %O"N.*FN!/!J!J",#%A# .*FN &&|'A'ABu%
 5*- 0 02 f//0J0JKL07 &++L,F,FGH5((r]   r   rF   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 rX|j                  d
      }|r|j                         }nd}t        dd| d| dt        |j                         dd| dgd       y | j                  t
        j                  j                  u r	 t        ddddg	       y | j                  t"        j$                  j&                  u rtt)        |      dv r>|s<|d   }|d   }	t+        |t,              r"t/        |j0                  |	|j2                         S t        d!d"|  d#| d$| d%g t4        j6                  	       y t8        j:                  rEdd&lm}
 |
jA                  || j                        }t+        |tB              s|jE                  |||      S tG        | j                  d'd(      }tG        | j                  d)d       }|d*n
t	        |      }	 t        jH                  | j                        }d+| d,| d-}d.| d/g}d0|vr|d1| d2d3gz  }|dAk(  rdB}dCg}| jT                  r| jT                  }ndDdEl+m,}  || j                        }t        dFdG| dH| dI| ||	       y # t        $ r}t        |j                         d d }~ww xY w# tJ        $ r d4d5h}||v rd6| d| d/}d7d8g}n|\|jM                  d9      rKd:| d| d}d;g}t
        j                  jN                  jQ                  |d<z   d<jS                  |      z          nKd=| d| d>}d?d@g}t
        j                  jN                  jQ                  |d<z   d<jS                  |      z          Y Fw xY w)JNr  F_torchdynamo_disable_msgz1Skip calling `torch.compiler.disable()`d functionzSkip calling function `z>` since it was wrapped with `torch.compiler.disable` (reason: r  z(Remove the `torch.compiler.disable` callrH  r  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.rG  z$Call to `torch._dynamo.skip_frame()`z/Called `torch._dynamo.skip_frame()` with args `z`. Skipping frame rH  z#User-inserted skip frame. Message: z-Remove the `torch._dynamo.skip_frame()` call.T)rI  rJ  rK  rL  rO  z*Call to `torch._dynamo.step_unsupported()`zUser-inserted step_unsupported.z3Remove the `torch._dynamo.step_unsupported()` call.)r   r   r   r:   )re  z!unsupported function.__get__ callzcall_function z, args: r|  z^Dynamo only supports function.__get__(func, obj[, cls]) where func is a user-defined function.SourcelessBuilderr[   z<unknown qualname>rZ   z<unknown module>z?Dynamo developers have intentionally marked that the function `z` in file `z` should not be traced.zAvoid calling the function `z`.r  z:Apply `@torch._dynamo.dont_skip_tracing` to the function `zw` to force tracing into the function. More graph breaks may occur as a result of attempting to trace into the function.z Please file an issue to PyTorch._abc	_warningsz6Dynamo does not know how to trace the Python builtin `zIf you are attempting to call a logging function (e.g. `_warnings.warn`), you can try adding it to `torch._dynamo.config.reorderable_logging_functions`.zKPlease file an issue on GitHub so the PyTorch team can add support for it. 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_graphztorch.compiler.allow_in_graph (or torch._dynamo.allow_in_graph) was called inside a compiled region. Dynamically annotating functions inside a compiled region is not supported.ziApply @torch.compiler.allow_in_graph as a decorator before compilation, not inside the compiled function.r   )get_skip_reasonz,Attempted to call function marked as skippedzmodule: z, qualname: z, skip reason: )-r   r   r=  r%   r1  ra   r  graph_breakr   rS  rO  r   f_codestep_unsupportedr&   r$   r  r   r   __get__r   r   r7  rd  r   r   r   SUPPORTABLEr   dont_skip_tracingbuilderr)  r   r  r%  r   getfiler   r  rb   	warn_oncejoinr  r  r.  )r|   r   r   r   r  graph_break_msgskip_frame_msgr  func_varobj_varr)  
rebuilt_fnqualname	module_orr  pathrK  rL  known_python_builtin_modulesr  r.  s                        r^   r%  z"SkipFunctionVariable.call_functiont  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!#>I${[aZb c""3BII">!?qBA.AQRC  	 ZZ5==999
7H AM	 ZZ5--555 4yF"67q'h(<=- W  ;(htfJvhO96)556 ''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 ++A 8 {{9(4F";-|H:_U[T\]'	[  7%aee,$67n  %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+   M ?>M8 	M5M00M58CQQr   c                 V    t        j                  |t        | j                  |            S r   )r>   r   r'  r=  rT  s      r^   r)  z%SkipFunctionVariable.call_obj_hasattr	  s"     $$RT)BCCr]   c           
          |t         v r5t        j                  | |t        t	        | j
                  |                  S t        || j
                  | j                  |      S )Nrv  )r4   r   rx  ry  r   r=  r   r   rT  s      r^   r  z SkipFunctionVariable.var_getattr$	  sP    )),,dDT)B$C  b$**dkk4@@r]   c                      yr.  r\   r   s    r^   r  z'SkipFunctionVariable.is_python_hashable,	  r0  r]   c                 ,    t        | j                        S r   )r  r=  r   s    r^   r  z$SkipFunctionVariable.get_python_hash/	      DJJr]   r  c                 h    t        |t              xr! | j                         |j                         k(  S r   )r   r>   rS  r  s     r^   r  z$SkipFunctionVariable.is_python_equal2	  s1    uo. H'')U-E-E-GG	
r]   r   )rY   rZ   r[   r>   r  r   r1  r   rS  rV  r  r   rE  r   r   r%  r@   r)  r  r3  r  r  r  r  r  r4  r5  s   @r^   r  r  @  s4    
	'	'Nc 3:  PT 
C c  )s )F )?U ) )Bi#i 'i S/)*	i
 
iVD)D14D	D
A5 AS A_ AD    
V 
 
r]   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 )WrappedSkipFunctionVariabler  rJ  rH   r   r_   Nc                     |j                  dd        |j                  dd        t        |   |j                  fd|j                  i| || _        || _        y )Nr=  r  )r   r   r   r=  r  r  rJ  r  s       r^   r   z$WrappedSkipFunctionVariable.__init__:	  sN     	

7D!

8T"Hw~~HHr]   r   rF   r   c                 R   t         j                  rNt        t        j                        }|j                  || j                  | j                  gt        |      z   |      S | j                  j                  |       t        |   |||      }| j                  j                  |       |S r   r  r  s         r^   r%  z)WrappedSkipFunctionVariable.call_functionF	  r  r]   c                      j                   fd         j                         j                  t        dd             y )Nc                  (      j                         S r   r  r  s   r^   r  z9WrappedSkipFunctionVariable.reconstruct.<locals>.<lambda>W	  r  r]   r:   Fr  r  s   ``r^   r;  z'WrappedSkipFunctionVariable.reconstructV	  r  r]   r{  )rY   rZ   r[   r  r   r   r   r>   r   r1  r%  r;  r4  r5  s   @r^   rI  rI  9	  sm    
%
 +
 	

 

# ' S/)*	
 
 >r]   rI  c                        e Zd ZdZdefdZdedededdf fdZdefd	Z	defd
Z
dej                  fdZdddedef fdZd Zdee   fdZdddee   deeef   defdZ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".
    r_   c                 "    t         j                  S r   r]  r   s    r^   r^  z'WrapperUserFunctionVariable.python_typed	  r_  r]   wrapper_objattr_to_tracer   Nc                 @    t        |   di | || _        || _        y r   )r   r   rQ  rR  )r|   rQ  rR  r   r   s       r^   r   z$WrapperUserFunctionVariable.__init__g	  s#    "6"&*r]   c                 .    | j                   j                  S r   )rQ  rZ   r   s    r^   r  z&WrapperUserFunctionVariable.get_modulel	  s    ***r]   c                 .    | j                   j                  S r   )rQ  rY   r   s    r^   r   z$WrapperUserFunctionVariable.get_nameo	  s    (((r]   c                 6    | j                         j                  S r   )r
  rk   r   s    r^   r   z$WrapperUserFunctionVariable.get_coder	  s      "+++r]   r   rF   r   c                     || j                   k(  r[t        | j                  | j                         }| j                  xr t	        | j                  |      }t        j                  |||      S t        | !  ||      S r   )	rR  r   rQ  r   r)   r>   r   r   r  )r|   r   r   r   r   r   s        r^   r  z'WrapperUserFunctionVariable.var_getattru	  si    4%%%$**D,>,>?C[[BZT%BF"((S&99w"2t,,r]   c                 B    t        | j                  | j                        S r   r   rQ  rR  r   s    r^   r
  z(WrapperUserFunctionVariable.get_function|	      t''););<<r]   c                     g S r   r\   r   s    r^   r#  z%WrapperUserFunctionVariable.self_args	  r,  r]   r   c           
         t        | j                  d      rt        | j                  | j                  d       }t        |dd      xs d}|j	                  dd      d   dk7  r|j                         }t        j                  j                  |j                        }|j                  }d	| d
| ddj                  t        j                  |g             }	t        j                  j                   j#                  |	       t        j                  j                   j$                  j'                  d      }
|
j)                  t$        j*                        rt        j,                  j.                  j1                         }t3               |z   }|d   j                  |d   j                  f}dj                  t        j                  |            }d|d    d
|d    d}|t5        |      z  }|
j7                  |       | j9                         t;        |      z   }t=        j>                  |t@        jB                        jE                  || t=        j>                  || j                        g||      S )N
cache_inforZ   rG  rH  r:   )maxsplitr   ra   zGDynamo detected a call to a `functools.lru_cache`-wrapped function at ':z'. 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.

This call originates from:
ztorch._dynamoz)call to a lru_cache wrapped function at: r,  )#r'  rQ  r   rR  splitframe_summaryosr@  basenamefilenamelinenor8  	tracebackformat_listra   r  rb   r7  logging	getLoggerisEnabledForDEBUG_guardsTracingContextextract_stackr   r1  debugr#  r   r>   r   r   getattr_and_tracer%  )r|   r   r   r   	target_fnr  rb  re  rf  r  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? " 0 0 277++M,B,BC&--$$,:Qvh 73 wwy44m_EFGI  ##--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$$''
 -?((T-?-?@L8L
	
r]   c                 B    t        | j                  | j                        S r   rY  r   s    r^   rV  z8WrapperUserFunctionVariable.get_real_python_backed_value	  rZ  r]   )rY   rZ   r[   r   ry  r^  r   r1  r   r  r   r   r2  r   r>   r  r
  r   r#  r   r   r%  r  rV  r4  r5  s   @r^   rO  rO  \	  s    "T "+C + +s +t +
+C +)# ),%.. ,-5 -S -_ -=40 -
#-
 '-
 S/)*	-

 
-
^=f =r]   rO  c            
       V     e Zd ZdZdef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_   c                 "    t         j                  S r   r  r   s    r^   r^  z%WrapperUserMethodVariable.python_type	  r  r]   rQ  rR  self_objr   Nc                 6    t        |   ||fi | || _        y r   )r   r   r  )r|   rQ  rR  r}  r   r   s        r^   r   z"WrapperUserMethodVariable.__init__	  s      	m>v>r]   c                     | j                   gS r   r  r   s    r^   r#  z#WrapperUserMethodVariable.self_args	  r  r]   )rY   rZ   r[   r   ry  r^  r   r1  r>   r   r   r#  r4  r5  s   @r^   r{  r{  	  sZ     T    "	
  
40 r]   r{  c                  R    t         j                  j                         rddlm}  | S i S )Nr   traceable_collective_remaps)ra   distributedis_available)torch.distributed._functional_collectivesr  r  s    r^   _traceable_collective_remapsr  	  s&    %%'	
 +*Ir]   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)ra   r  r  r  valuesrY   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:..r]   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   r_   Nc                X    t        |   |fi | t        |t              sJ || _        y r   )r   r   r   r7  r  )r|   r   r  r   r   s       r^   r   z*CollectiveFunctionRewriteVariable.__init__	  s0     	&v&/+?@@@.r]   r   rF   old_fnr   optionsc                 j    t         j                  | |      \  }}t        |ft        |fd|i||d|S )Nr   )r  r   )r  r  r7  )r   r  r   r  new_fn
new_sources         r^   r   z(CollectiveFunctionRewriteVariable.create	  sO     ?FFr6R
0
0V
VgV
 	
 	
r]   variablec                 H    t        j                  |       xr | t               v S r   )r   
isfunctionr  )r  s    r^   can_rewritez-CollectiveFunctionRewriteVariable.can_rewrite
  s%     x(WX9U9W-W	
r]   c                 8    t               |   }|t        | |      fS r   )r  r  )r   r   r  s      r^   r  z)CollectiveFunctionRewriteVariable.rewrite
  s$     ./34R@@@r]   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                  k(  rt        j                   st        d
| j                   ddg	       |d   }t#        |t$        j&                        s)t(        j*                  j,                  j/                  d      t1               }t1               }	t1               }
t1               }d }|j2                  D ]  }|j5                         |j6                  ur)t(        j*                  j,                  j/                  d      |j9                  |d      }|j;                         r|j                         }||j<                  |j>                  fvr,t(        j*                  j,                  j/                  d|       t$        j@                  jC                  |jD                        }nftG        |d      r.t$        j@                  jC                  |jI                               }n,t(        j*                  j,                  j/                  d|       |jK                  |       |jK                  |j9                  |d             |	jK                  |j9                  |d             |
jK                  |j9                  |d             ||j9                  |d      } |J d}t%        j&                  |      t%        j&                  |	      t%        j&                  |
      t%        j&                  |      |d}| jL                  jO                  |||      S | j                  |j<                  |j>                  fv rHt        j                   st        d| j                   ddg	       | jL                  jO                  |||      S | j                  |jP                  |jR                  |jT                  fv rf|jW                  d      }||jX                  n|jZ                  d   j\                  }||vrt_        d|       ta        jb                  |||         |d<   | jL                  jO                  |||      S )Nr   )REDUCE_OP_TO_STRr\   async_opz)async_op=True for distributed collectivesz, args=	, kwargs=z3`torch.compile` doesn't support `async_op=True for rH  z.P2P compilation disabled for batch_isend_irecvzP2P compilation is disabled.z3Set TORCHDYNAMO_ENABLE_P2P_COMPILATION=1 to enable.p2p_op_listz`P2POp` used incorrectlyopzunexpected P2POp op r   zunexpected P2POp op variable tensorpeertaggroup)op_list	peer_listtag_listtensors
group_namez(P2P compilation disabled for isend/irecvzUnsupported all_reduce op: )2torch.distributedr  r  r  r   r  r   r   r  r  rS  r%   r   r3  batch_isend_irecvr   enable_p2p_compilationr   r   rM   ra   r  r^  InternalTorchDynamoErrorr   r   r^  P2POpr  r  isendirecvr@   r   rY   r'  r   r[  r  r%  
all_reducereduce_scatter_tensor_reduce_scatter_baser   r=  
parametersdefaultrl  r>   r   )r|   r   r   r   distr  r  p2p_opsopspeerstagsr  	group_varitemop_varr  new_args
new_kwargsreduce_op_var	reduce_ops                       r^   r%  z/CollectiveFunctionRewriteVariable.call_function
  sX    	)N %%dgg.	ninnd5f5??@F:$6$I$I$KC77)8dWJvi8QRVRYRYQZ[&22	 77d,,,00L#wwi >M	 ]+Ggy'='=>mm''@@.  *.CFE6DfG04I >##%TZZ7--++DD2  ))"d3,,.224B$**djj!99#mm//HH22$7  '77>>r{{KFVZ0&77>>v?PQF--++DD7x@  

6"t//H=>T--b&9:D,,R78$ $ 0 0W =I5>8 (((46H$11#6&33E:%2248$11':'6J ''55b(JOO77tzz4::..00F#wwi >M	 ''55b$GG77OO&&%%	
 
 #JJt,M !, ##))$/77 
  00 #>yk!JKK*005Ei5PQF4L##11"dFCCr]   )rY   rZ   r[   r   r   r   r7  r   r!  r   r   r3  r  r   r)   r  r   r>   r   r1  r%  r4  r5  s   @r^   r  r  	  s0   	/S#X	/ .		/
 	/ 
	/ 
#
c"
 
 	

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

 A#A)1#s();A	sJ	A AvD#vD 'vD S/)*	vD
 
vDr]   r  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)	CollectionsNamedTupleFunctionr_   c                     | j                   S r   rY  r   s    r^   rS  z0CollectionsNamedTupleFunction.as_python_constant
  rZ  r]   r   rF   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        $ r4}	t        t        |	      |t        |	j                               Y d }	~	d }	~	ww xY w)N)r   r  znamedtuple constructionzargs=r  z?`torch.compile` only support certain input types for namedtuplerH  )r2   r   rS  r   r   r"   ry  r   r   r   UserDefinedClassVariabler=   r%   r   r3  )
r|   r   r   r   constant_argsr  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chh s3   B> B3B> B8(B> 3B> >	C;*C66C;N)
rY   rZ   r[   r   rS  r   r>   r   r1  r%  r\   r]   r^   r  r  
  sH    C 
#
 '
 S/)*	

 

r]   r  c                   2    e Zd Zej                  Zdhej                  Z	 ddedee   de	e
ef   de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efdZdedefdZ xZS )FunctoolsPartialVariableoriginal_cache_hashNrh   r   keywordsr   r_   c                     t        |   di | || _        t        |t              sJ || _        t        |t              sJ || _        t        j                  t              | _        || _        y r   )r   r   rh   r   r   r   r   r  r  partialr5   
fake_valuer  )r|   rh   r   r  r  r   r   s         r^   r   z!FunctoolsPartialVariable.__init__
  sf     	"6"	$%%%	(D)))  $++H5#6 r]   c                 "    t         j                  S r   )r  r  r   s    r^   r^  z$FunctoolsPartialVariable.python_type
  s       r]   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  r  r  r  s   r^   r  z6FunctoolsPartialVariable.reconstruct.<locals>.<lambda>
  s    g&>&>{I&V r]   r:   F)r  rh   r   foreachr  r  r   r   r  r   keyscreate_call_function_kw)r|   r<  r  s    ` r^   r;  z$FunctoolsPartialVariable.reconstruct
  s    VW		99OODII&}}!!"6s499~7I5"QR,,./T]]'')*++CIDII,F,JDRWX	
r]   c                 "    | j                         S r   rS  r   s    r^   r
  z%FunctoolsPartialVariable.get_function
      &&((r]   r   rF   c                     | j                   t        |      z   }i | j                  |}| j                  j	                  |||      S r   )r   r   r  rh   r%  )r|   r   r   r   merged_argsmerged_kwargss         r^   r%  z&FunctoolsPartialVariable.call_function
  sB     ii$t*,34==3F3yy&&r;FFr]   r   c                 p    t        j                  |t        t        j                  t
              |            S r   )r>   r   r'  r  r  r5   rT  s      r^   r)  z)FunctoolsPartialVariable.call_obj_hasattr
  s)     $$R1B1B81Ld)STTr]   c           
      "   | j                   xr t        | j                   |      }|dk(  r| j                  S |dk(  r!t        j                  | j
                  |      S |dk(  rX| j                  j                         D ci c]  \  }}t        j                  ||      | }}}t        j                  ||      S |t        v r9t        j                  | |t        t        t        j                   |                  S t#        t$        |       y c c}}w )Nrh   r   r   r  rv  )r   r)   rh   r   rM   r   r  r   r>   r   r  r4   rx  ry  r   r  r  r"   r   )r|   r   r   r   r   r   r   s          r^   r  z$FunctoolsPartialVariable.var_getattr
  s    >DKK!>6>996>))$))FCC:AEATATAVWA_**2q114WEW..uVDD)),,dD1B1BD)I$J  	!4 Xs   >!D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  r  rh   rS  r   r  r   )r|   r  r   r   s       r^   rS  z+FunctoolsPartialVariable.as_python_constant  s      II((*
26))<3c$$&<
 6:]]5H5H5JKTQq!&&((K
 	
<Ks   B
1Bc                 x   t        j                  | j                  j                         g| j                  D cg c]  }|j                          c}i | j
                  j                         D ci c]  \  }}||j                          c}}}| j                  | j                  |_        |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  r  rh   guard_as_python_constantr   r  r   r  
cache_hash)r|   r   r   r   s       r^   r  z1FunctoolsPartialVariable.guard_as_python_constant  s    ""II..0
48II>qa((*>
 <@==;N;N;PQ41aq!,,..Q
 ##/ $ 8 8F ?Qs   B1
1B6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  rm  s     r^   r  z>FunctoolsPartialVariable.is_python_hashable.<locals>.<genexpr>  s     BC**,Br  c              3   <   K   | ]  }|j                           y wr   r  r  r=  s     r^   r  z>FunctoolsPartialVariable.is_python_hashable.<locals>.<genexpr>  s     S5E,,.Sr  )rh   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	
r]   c                     | j                   j                         }d | j                  D        }d | j                  j	                         D        }t        |g||      S )Nc              3   <   K   | ]  }|j                           y wr   r  rm  s     r^   r  z;FunctoolsPartialVariable.get_python_hash.<locals>.<genexpr>!  s     @sS((*@r  c              3   <   K   | ]  }|j                           y wr   r  r  s     r^   r  z;FunctoolsPartialVariable.get_python_hash.<locals>.<genexpr>"  s     S5u,,.Sr  )rh   r  r   r  r  r  )r|   	func_hash	args_hashvalues_hashs       r^   r  z(FunctoolsPartialVariable.get_python_hash  sQ    II--/	@dii@	SDMM<P<P<RSY99[9::r]   r  c                 p   t        |t              xr | 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>)  s'      "UE %%e,    c              3   D   K   | ]  \  }}|j                  |        y wr   r  )r  value_avalue_bs      r^   r  z;FunctoolsPartialVariable.is_python_equal.<locals>.<genexpr>-  s'      &Wg ''0r  )	r   r  rh   r  r  r   r   r  r  r  s     r^   r  z(FunctoolsPartialVariable.is_python_equal%  s    u67 		))%**5 &)$))UZZ&@   *-MM((*ENN,A,A,C+ 	
r]   r   r{  )rY   rZ   r[   r  r  r  r>   r  r   r   r1  r   r   ry  r^  r;  r
  r%  r@   r)  r  rS  r  r3  r  r  r  r  r  r4  r5  s   @r^   r  r  
  sV   %%M 			'	'N $(77 '7 sO+,	7
 !7 7 
7(!T !
)c )G#G 'G S/)*	G
 
GU)U14U	U55 5S 5_ 5 
C 

# 

D 
; ;
V 
 
r]   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_fnr_   .c                     i S r   r\   )rD  s    r^   _get_polyfill_handlersz1PolyfilledFunctionVariable._get_polyfill_handlers>  s	     	r]   r=  r   c                 f    t        |j                  t        j                                | ||      S r?  r@  rC  s      r^   rE  z-PolyfilledFunctionVariable.create_with_sourceC  s*     	f''(B(BCD5((r]   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 functionr\   )
r   r   r   r  r   callabler   r  r  r  )r|   r   r   handlerr  candidate_attr	candidater   s          r^   r   z#PolyfilledFunctionVariable.__init__K  s    "6"--/33B; X$5gY>STVSW"XX 
 	N  >I	***(	 #G9,OP  " ,r]   c                     | j                   S r   )r  r   s    r^   polyfill_fnz&PolyfilledFunctionVariable.polyfill_fne  s       r]   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_throughi  s    OOI5
 	
r]   c                 "    | j                         S r   r  r   s    r^   r
  z'PolyfilledFunctionVariable.get_functionn  r  r]   r   rF   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 )Nr:   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   rS  r  r   SymNodeVariabler^  )r  r  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  r3   r   rS  r   r>   r   builtinssumr   r   r   rM   r  r  r  r   r   create_proxyra   sym_sumr   r  r  r  r%  )	r|   r   r   r   r  r   r   r   traceable_function_variables	            r^   r%  z(PolyfilledFunctionVariable.call_functionq  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   r6   r#   r   r)   r  )r|   r   r   r   r   methodr  polyfilled_method_variables           r^   r   z&PolyfilledFunctionVariable.call_method  s     :%%b$77$-+f-R#8d477)!LM;; *4;; =GH%?%R'%R")77D&IIr]   c                     | j                   S r   rY  r   s    r^   rS  z-PolyfilledFunctionVariable.as_python_constant  rZ  r]   )rY   rZ   r[   r>   r  r  r  cacher   r   r   r   r   r  r   rE  rO   r   propertyr  r3  r  r
  r   r1  r%  r   r   rS  r4  r5  s   @r^   r  r  6  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 r]   r  c                   x     e Zd Zdededdf fdZde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   r_   Nc                 2    t        |   di | || _        y r   r   r   r=  r|   r=  r   r   s      r^   r   zSysFunctionVariable.__init__      "6"
r]   c                 "    t         j                  S r   )r   BuiltinFunctionTyper   s    r^   r^  zSysFunctionVariable.python_type  s    (((r]   r   rF   c                 `   t        |j                        rG|j                  d   }|j                  }|j                  |d      }t	        j
                  ||      ||g}n>t        j                  d       t        j                  d       t        j                  d       g}t        j                  |      S )Nr`  __traceback__)
r   exn_vt_stackrz  r  r>   r   r@   r   r   r  )r|   r   exnr  tbr   s         r^   exc_infozSysFunctionVariable.exc_info  s    r//"%C,,C_5B$**2s3S"=E !''- ''- ''-E
 &&u--r]   c                 >    | j                  |      j                  d   S )Nr:   )r)  r   r   s     r^   	exceptionzSysFunctionVariable.exception  s    }}R &&q))r]   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!!r]   )r   rF   r_   zvariables.TupleVariable)rY   rZ   r[   r   r   ry  r^  r)  r>   r+  r   r   r1  r%  r4  r5  s   @r^   r  r    s|    c S T )T ).*3 * *
"#
" '
" S/)*	
"
 

"r]   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")#DynamoTritonHOPifierr  r_   c                 (    t        ddd| g        y )Nz!triton kernel unsupported featurerG  z/Encountered triton kernel unsupported feature: rH  )r%   )r|   r  s     r^   raise_unsupportedz&DynamoTritonHOPifier.raise_unsupported  s    7I#O		
r]   maybe_callablec                 .    t        |t        t        f      S r   )r   r  r7  )r|   r5  s     r^   is_callablez DynamoTritonHOPifier.is_callable  s    79MN
 	
r]   r   c                     |j                   S r   r  )r|   r   s     r^   	get_valuezDynamoTritonHOPifier.get_value  s    yyr]   gridrL   .c                     ddl m} t        ||      r|j                         S t	        ddt        |       dg t        j                         y )Nr:   )rL   z/unsupported grid type for triton hop check_gridzgrid type = z;`torch.compile` only supports list-like grid for check_gridrH  )listsrL   r   r  r%   ry  r   r3  )r|   r:  rL   s      r^   
check_gridzDynamoTritonHOPifier.check_grid  sK    +d,-==?"I&tDzl3Y&22	r]   metar   rF   c                     |j                         D ci c]  \  }}t        j                  ||      | }}}|j                  ||gi       }|S c c}}w r   )r   r>   r   r%  )r|   r:  r>  r   r   r   meta_vars          r^   	call_gridzDynamoTritonHOPifier.call_grid
  sV     AE

M1O))"a0!3MM!!"xj"5 Ns   !Auser_fnr   r   r  c                 \    ddl m} |j                  ||      }|j                  |||      }|S )Nr:   r(  )r5  r)  r   r%  )	r|   rB  r   r   r   r  r)  wrapped_user_functionr   s	            r^   call_user_defined_fnz)DynamoTritonHOPifier.call_user_defined_fn  s3     	/ 1 8 8W E&44RvFr]   user_objr   c                 b    ddl m} |J   ||t        |j                  |             |      }|S )Nr:   )VariableBuilder)r5  rH  r)   kernel_source)r|   rF  r   r  r   rH  wrapped_user_objs          r^   wrap_user_defined_objz*DynamoTritonHOPifier.wrap_user_defined_obj   sD     	-~~
?
811dV=

  r]   configsc                 n    |j                  |      }|D cg c]  } |j                          }}|S c c}w r   )unpack_var_sequencer  )r|   rL  r   r   s       r^   maybe_unpack_configsz)DynamoTritonHOPifier.maybe_unpack_configs2  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  r4  r  )r|   r   s     r^   maybe_unpack_heuristic_resultz2DynamoTritonHOPifier.maybe_unpack_heuristic_result=  s0    ((*""r ..00r]   TritonKernelVariablec                     |j                   t        |      dk7  r| j                  d        t        |      |j                  |j
                  |d   |j                        S )Nr:   z7Triton kernels should be called with only a single gridr   )kernel
kernel_idxr:  rI  )r:  r   r4  ry  rT  rU  rI  )r|   r  r   s      r^   call_getitemz!DynamoTritonHOPifier.call_getitemG  s^     ==$D	Q""I tH~??**a"00	
 	
r]   gridscombined_argszvariables.ConstantVariablec                 F   ddl m} i }t        |j                               D ]D  }||   }t	        |t
        t        f      s|j                         ||<   |j                         ||<   F |j                         D ci c]  \  }}t        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t-        |       d       T |
j/                  |      } ||t0              }|j2                  j5                  d|d|j6                  ||||j9                         d	       t        j                  |d       S c c}}w c c}}w c c}}w )
Nr:   )r  r   )kernel_side_tabletriton_kernel_wrapper_mutationz.Unexpected argument type for a Triton kernel: rH  r%  r\   )rU  constant_args_idxr:  tma_descriptor_metadatar   )dictsr  r   r  r   !TMADescriptorExperimentalVariableTMADescriptorStableVariableto_metadata
get_tensorr   r>   r   *torch._higher_order_ops.triton_kernel_wraprZ  r[  r  rS  r  r  r  is_symnode_liker4  repradd_constant_argsr   r   r  rU  r  )r|   r  rW  rX  r   r  r]  r   r   combined_args_vtrZ  r[  r  non_constant_argsr\  r>  s                   r^   call_HOPzDynamoTritonHOPifier.call_HOPY  s!    	- :<m((*+ 	2Aa A57RS ./]]_'*#$<<>a 	2 9F8K8K8M
041O!!"a(!+
 
	
 &++-
1!_-!2F2F2H q##%%
 
 )..0
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)rY   rZ   r[   r1  r   r4  r>   r3  r7  r   r9  r   ra   fxproxyProxyr=  r   rA  r   r   r   rE  rK  r   rO  rQ  rV  ri  r\   r]   r^   r2  r2    s   
S 
U 

/ 
d 

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

 $H
 
&H
r]   r2  c            
            e Zd ZU ded<   ded<   edz  ed<   edz  ed<   dede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dd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d	efdZ xZS )rR  rI   r:  rJ   rT  NrU  rI  r   r_   c                     |j                  d|j                  d            | _        t        |   di | t
        j                  | |||       y )NrI  r   r\   )r   r   rI  r   r    dynamo_triton_hopifier_singletoninit_variable)r|   rT  rU  r:  r   r   s        r^   r   zTritonKernelVariable.__init__  sF     $ZZH9MN"6"(66tVZQUVr]   r   rF   r   c                 2    t         j                  | |||      S r   )ro  call_triton_kernelr$  s       r^   r%  z"TritonKernelVariable.call_function  s      0BB$
 	
r]   r  c                 0    t         j                  | |g      S r   )ro  rV  )r|   r   r  s      r^   mp_subscript_implz&TritonKernelVariable.mp_subscript_impl  s     0<<TC5IIr]   r   c                 b    |dk(  rt         j                  | |||      S t        |   ||||      S )Nrun)ro  call_runr   r   r   s        r^   r   z TritonKernelVariable.call_method  s<     5=3<<T4QSTT w"2tT6::r]   r  c                 v    ddl m} ddlm} t	        ||      r  |j
                  |j                               S |S )Nr:   r?   )r  )r  r@   r  r  r   r   evaluate_expr)r|   r  r@   r  s       r^   specialize_symbolicz(TritonKernelVariable.specialize_symbolic  s6    .+ c?+*#**3+<+<+>??
r]   )rY   rZ   r[   r   r  r   r   r   r   r>   r   r1  r%  rt  r   r   rz  r4  r5  s   @r^   rR  rR    s   
d
D= WW'*TzW9<WHKW	W
#
 '
 S/)*	

 

J#J J 
	J;#; ; ?#	;
 S/)*; 
;s s r]   rR  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   r_   Nc                     t        |t        j                        sJ t        |   di | || _        || _        || _        || _        y r   )	r   r   DataPtrVariabler   r   r|  r}  r~  r  )r|   r|  r}  r~  r  r   r   s         r^   r   z*TMADescriptorExperimentalVariable.__init__  sH     (I$=$=>>>"6" 	$(r]   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  )r|   dims     r^   ra  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}  r  s   r^   r  z?TMADescriptorExperimentalVariable.reconstruct.<locals>.<lambda>  s+    G,,6#dii.))9: r]   r:   F)	r  r|  r;  r}  r~  r  r  r%  r   )r|   r<  r   s   `` r^   r;  z-TMADescriptorExperimentalVariable.reconstruct  sp    	
 	!!'*@@T__@d.?.?@c$i!mU3r]   c                 .    | j                   j                  S r   )r|  from_tensorr   s    r^   rb  z,TMADescriptorExperimentalVariable.get_tensor  s    }}(((r]   r{  )rY   rZ   r[   r   r>   r   r   ra  r;  rb  r4  r5  s   @r^   r_  r_    si    )-) ?#) )	)
 &) ) 
)
S 

4)O )r]   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  rN   block_shaperM   r   r_   Nc                 d    |j                         sJ t        |   di | || _        || _        y r   )r  r   r   r  r  )r|   r  r  r   r   s       r^   r   z$TMADescriptorStableVariable.__init__  s6     !!!"6"&r]   c                 H    t        | j                  j                               S r   )r.  r  r  r   s    r^   ra  z'TMADescriptorStableVariable.to_metadata  s!    )%%'
 	
r]   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^   r  z9TMADescriptorStableVariable.reconstruct.<locals>.<lambda>  s    G,,0" r]   r  r   )r  load_methodr  r;  r  r   r  s    `r^   r;  z'TMADescriptorStableVariable.reconstruct  sT    	
 	M*(  !Ar]   c                     | j                   S r   )r  r   s    r^   rb  z&TMADescriptorStableVariable.get_tensor"  r   r]   r{  )	rY   rZ   r[   r   r   ra  r;  rb  r4  r5  s   @r^   r`  r`    sK    	' 	' $	' 		'
 
	'
S 


C r]   r`  c                   `     e Zd Zdededdf fdZdefdZddd	ee	   de
ee	f   de	fd
Z xZS )'CreateTMADescriptorExperimentalVariablerankr   r_   Nc                 >    |dv sJ t        |   di | || _        y )N)r:   r   r\   )r   r   r  )r|   r  r   r   s      r^   r   z0CreateTMADescriptorExperimentalVariable.__init__'  s(    
 v~~"6"	r]   c                 "    t         j                  S r   r]  r   s    r^   r^  z3CreateTMADescriptorExperimentalVariable.python_type0  r_  r]   r   rF   r   c                    d|v r|d   n|d   }t        |t        j                        s2t        dd| d| d| j                   dd| j                   d	g
       | 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        |t        j                        sJ t        ||||      S )Nptrr   z.invalid ptr argument for create_tma_descriptorzargs = z, kwargs = z#Expected `ptr` argument of `create_z]d_tma_descriptor`to be from a `.data_ptr()` call, represented internally by `DataPtrVariable`z`torch.compile` may fail to internally represent result of `.data_ptr()` with `DataPtrVariable` due to a graph break between the `.data_ptr()` call and `create_zTd_tma_descriptor`. Please ensure there were no graph breaks between these two calls.rH  r:   rQ   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_  )r|   r   r   r   r  r}  r~  r  s           r^   r%  z5CreateTMADescriptorExperimentalVariable.call_function3  s     %fUmDG#y889H!${6(;A$)) M_ _#yyk *// 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 #y889990!%	
 	
r]   )rY   rZ   r[   r  r   r   ry  r^  r   r>   r   r1  r%  r4  r5  s   @r^   r  r  &  sj      
	"T ":
#:
 ':
 S/)*	:

 
:
r]   r  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)	!CreateTMADescriptorStableVariabler_   c                 "    t         j                  S r   r]  r   s    r^   r^  z-CreateTMADescriptorStableVariable.python_typeq  r_  r]   r   rF   r   r   c                 T    d|v r|d   n|d   }d|v r|d   n|d   }t        ||      S )Nr  r   r  r:   )r  r  )r`  )r|   r   r   r   r  r  s         r^   r%  z/CreateTMADescriptorStableVariable.call_functiont  sF     &.%7!T!W/</Ff]+DQRG*#
 	
r]   N)
rY   rZ   r[   ry  r^  r   r>   r   r1  r%  r\   r]   r^   r  r  p  sH    "T "
#
 '
 S/)*	

 

r]   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   rF   r   r   r_   c                    t        |      dk7  rt        |dt        |              d }|d   j                  rMt        |d   j                  j	                  t
        j                               t        |d   j                        }|d   j                         }t        |      r0t        t        d      d      }t        j                  |t        |      S t        j                  |||      S )Nr:   z6pytree_get_node_type requires exactly 1 argument, got r   collectionsr   r   )r   r#   r   r(   rA  r'   
TYPE_MATCHr1   r^  r   r)   r/   r>   r   r   )r|   r   r   r   type_sourcer^  s         r^   r%  z/PyTreeGetNodeTypeFunctionVariable.call_function  s     t9>LSQUYKX 7>>$q'..33L4K4KLM$T!W^^4K1g))+{+$\-%@,OK"((ZEE$$R[IIr]   N)	rY   rZ   r[   r   r   r>   r   r1  r%  r\   r]   r^   r  r    sF    J#J 'J S/)*	J
 
Jr]   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   rF   r   r   r_   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 )Nr:   r   z,tree_is_leaf requires 1 or 2 arguments, got rS   r   r   r  )r   r#   r   r@   r   rl  r   r%  r  ra   rb   rc   _get_node_typer>   r   rd   re   r   r=  )
r|   r   r   r   rS   treenode_type_varsupported_nodes_varoutr   s
            r^   r%  z.PyTreeTreeIsLeafFunctionVariable.call_function  s#    t9q=CIMB3t9+N
 **Y(8(?(?(EFt9>1gG'')7(T6:: Aw9KK..

-TFB
' 	 .33KK//46

 "--b.=/SUV$$RSYY77r]   r  r5  s   @r^   r  r    sG    #8##8 '#8 S/)*	#8
 
#8 #8r]   r  c                   X     e Zd 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 ) SparseTensorCreationSkipVariablezk
    Skip variable for sparse tensor factory functions with clear messaging regarding lack of support.
    r=  r   r_   Nc                 .    d}t        |   |fd|i| y )Nz8sparse tensor creation is not supported in torch.compiler  )r   r   )r|   r=  r   r  r   s       r^   r   z)SparseTensorCreationSkipVariable.__init__  s    K8v88r]   r   rF   r   c                     ddl m} t        | j                  dt	        | j                              }t        dd| d| dg |j                         y )	Nr   )r   rY   z$Sparse tensor creation not supportedz
function: zEtorch.compile does not support sparse tensor creation functions like zZ. Sparse tensors require specialized handling that is not yet implemented in the compiler.rH  )rG  r   r   r=  r1  r%   SPARSE_TENSOR)r|   r   r   r   r   r  s         r^   r%  z.SparseTensorCreationSkipVariable.call_function  s]     	)$**j#djj/B: 	*WX_W` ak k 5%334	
r]   )rY   rZ   r[   r   r   r   r   r>   r   r1  r%  r4  r5  s   @r^   r  r    s\    9c 9S 9T 9
#
 '
 S/)*	

 

r]   r  	real_implc                 R    ddl mc m} ddlm}m}m} d }dg} ||||      \  }	}
 ||	      } ||
      }|j                  di f      d   }dt        dt        d	t        f fd
} || d|       || d|       || d|      df} j                  j                  d||i        y)aI  Emit an invoke_leaf_function node for a side-effectful function with no
    tensor inputs or outputs.

    The function is captured as a closure inside _LeafCallable objects and
    registered as a static attribute on the graph module.  Because
    invoke_leaf_function is registered as EffectType.ORDERED, effect tokens
    prevent DCE and maintain execution ordering relative to other ops.

    Use this when Dynamo needs to preserve a pure-side-effect call (like
    setting global runtime state) in the compiled graph so that it replays
    at the correct position at runtime.
    r   N)_LeafCallableinvoke_leaf_functionmake_leaf_function_wrappersc                       y r   r\   r\   r]   r^   	fake_implz5emit_noargs_leaf_function_to_graph.<locals>.fake_impl  r0  r]   r\   r:   	attr_namer   r_   c                 t    j                   j                  | |      }t        |      |j                  _        |S r   )r   %register_static_attr_and_return_proxyry  r  )r  r   rk  r   s      r^   
make_proxyz6emit_noargs_leaf_function_to_graph.<locals>.make_proxy  s-    		??	3Os)

r]   _real_fn_fake_fn_input_specrG  r%  )torch.utils._pytreerb   rc   ,torch._higher_order_ops.invoke_leaf_functionr  r  r  tree_flattenr1  r   r   r  )r   r  r   pytreer  r  r  r  captured_out_specwrapped_realwrapped_fakereal_callablefake_callable
input_specr  invoke_argss   `               r^   "emit_noargs_leaf_function_to_graphr    s    " )(  8<f!<9/"L, ",/M!,/M$$b"X.q1Jc    	dV8$m4dV8$m4dV;'4
	K II?,@+rRr]   c                   d     e Zd ZdZdededdf fdZdefdZdd	d
ee	   de
ee	f   de	fdZ xZS )TritonSetAllocatorVariablezTrace triton.set_allocator as an invoke_leaf_function node in the
    graph so that it executes at the right point at runtime, ordered by
    effect tokens.r=  r   r_   Nc                 2    t        |   di | || _        y r   r  r   s      r^   r   z#TritonSetAllocatorVariable.__init__1  r!  r]   c                 ,    t        | j                        S r   )ry  r=  r   s    r^   r^  z&TritonSetAllocatorVariable.python_type5  rF  r]   r   rF   r   c                     t        |      dk(  r|rJ |d   j                         | j                  fd}t        ||d       t	        j
                  d       S )Nr:   r   c                               y r   r\   )alloc_fnset_allocators   r^   r  z;TritonSetAllocatorVariable.call_function.<locals>.real_implD  s    (#r]   	set_alloc)r   rS  r=  r  r@   r   )r|   r   r   r   r  r  r  s        @@r^   r%  z(TritonSetAllocatorVariable.call_function8  sY     4yA~f,,7--/ 

	 	+2y+F&&t,,r]   )rY   rZ   r[   r   r   r   ry  r^  r   r>   r   r1  r%  r4  r5  s   @r^   r  r  ,  sh    c S T  T  -#- '- S/)*	-
 
-r]   r  r   )r   r  r  r   r   ri  rc  r   rg  r   r  r   collections.abcr   r   r   r   typingr   r	   r
   r   r   r   typing_extensionsr   weakrefr   ra   torch._dynamo.excr   torch._guardsr   r  r   rG  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/   r0   r1   rb   r2   r3   r4   r5   r6   r7   r8   r9   r  r;   r<   r=   r>   r  r@   user_definedrA   #torch.distributed.fsdp._fully_shardrB   ModuleNotFoundErrortorch._dynamo.codegenrC   r6  rD   rE   rF   rG   #torch._dynamo.variables.ctx_managerrH   rc  rI   rJ   r^  rK   r<  rL   rM   r  rN   rO   rx   rz   r  r  r  rL  rV   r   r  rX   	lru_cachere   rg   r   r   r1  r   r   r   r2  r   r   r  r   r   r   r   r7  r  r  r  r#  r~  r  r  rd  r  r  r  r  r  r  rI  rO  r{  r  r  r  r  r  r  r  r-  r.  r/  r0  r2  ro  rR  r_  r`  r  r  r  r  r  r  r  r\   r]   r^   <module>r     s  .      	 
   " . ( G G # %  4   3 > > V V    1
 
 
	 	 	  ' 3E
 /  L
 *5& T#s(+,
&'OP "+YK"8  D  ,=+>sCx( >	0 	 :  
 
>L \ U
UU }U 3-	U
 cNU 
#
Ur DHAA&)A39D=AA.0 .$sCx. .T . # o%&  ..  
	 *
..CH~  FCK 4'	
 8_t# S#X% c3h$& 4
 --%+-5;d]-JM--:D DNOY3 OYd!73 !7H)": )X :4  :FJ;? J;Z

 
S6%= S6l " Fw- wt > 2  >F>"6 >D$$c$ $ ?
#	$
 o%&$ $NK)!9 K)\.>(B .>bv
? v
r >"6  >FV=": V=r ; 0d38n //%-c3h%7//hD(< hDV"
$8 "
J@
 @
FC CL#"/ #"L w
> w
t $8#9  4? 4n$) $)N/ BG
o G
T
 
&!J(< !JH38'; 38l
'; 
:/S/SD!/S /S 
	/Sd- -[n  s   -P P#"P#