
    /j                    d	   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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7 ddl8m9Z9m:Z: ddl;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZD ddlEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZM ddlNmOZOmPZPmQZQmRZRmSZS ddlTmUZUmVZV 	 ddlWmXZX n# eY$ r dZXY nw xY wer.ddlZm[Z[ ddl\m]Z]m^Z^m_Z_m`Z` ddlambZb ddlcmdZdmeZe ddlfmgZgmhZh ddlimjZj  ededef                   Zkd Zld!Zm enh d"          Zo end#h          Zpd$Zq e            Zreeef         esd%<    G d& d'et          Zuejv        d(e<fd)            Zw G d* d+          Zxd,ed(exfd-Zyd,ed.d/d0e dz  d1ee         d2eze{ef         d(eze{eSf         fd3Z|	 dd.d/d4ed5e dz  d(eSfd6Z}d.d/d7eze{ef         d(dfd8Z~d9d/d7eze{eSf         d:e	j        d(dfd;Zd:e	j        d<eze{ef         d=e{d>eedf         dz  d?ee         dz  d@eze{ef         dz  dAeze{ef         dz  d(e	j        fdBZh dCZd.d/dDed5e dz  d=e{d(eSf
dEZ G dF dGeS          Z G dH dIe          Z G dJ dKe          Z G dL dMe          Z G dN dOe          Z G dP dQeS          Z G dR dSe          Z G dT dUe          Z G dV dWe          Z G dX dYe          Z G dZ d[e          Z G d\ d]e          Zd.d/dDedef         d=e{d1eeS         d2eze{eSf         d(eSfd^Z G d_ d`e          Z G da dbe          Z G dc ddeS          Z G de dfe          Z G dg dheS          Z G di dje          Zd(ezeef         fdkZd.d/dDedef         d(e<fdlZ G dm dne          Z G do dpe          Z G dq dre          Z G ds dteS          Z G du dveS          Z G dw dxeS          ZddylcmZmZmZmZ  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          Z G d de          ZdS )a  
Function-related variable tracking classes for Dynamo's symbolic execution.

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

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

The variable trackers here work together with the rest of Dynamo to enable
accurate graph capture while handling Python's various function-related behaviors.
    N)
namedtuple)CallableSequence)CellTypeFunctionType)Anycast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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raise_type_error_excValueMutationNewVariableTracker)CONSTANT_VARIABLE_NONEConstantVariable)_fsdp_param_group)	PyCodegen)&InliningGeneratorInstructionTranslatorInliningInstructionTranslatorInstructionTranslatorInstructionTranslatorBase)ContextWrappingVariable)TritonGridTypeTritonKernelType)BaseListVariableListVariable)TensorVariable_F.)bound      >   is_leaf	namespacenone_is_leafrQ   zihttps://github.com/pytorch/pytorch/issues/new?&labels=oncall%3A+pt2&projects=&template=pt2-bug-report.yml_spec_cachec                       e Zd ZdS )ClosureConversionErrorN)__name__
__module____qualname__     f/home/longshao/multi-rider-rag/.venv/lib/python3.11/site-packages/torch/_dynamo/variables/functions.pyrV   rV      s        Dr[   rV   returnc            	      t    t          t          t          t          d          d          d          d          S )Ntorchutils_pytreeSUPPORTED_NODES)r(   r.   rZ   r[   r\   !get_pytree_SUPPORTED_NODES_sourcerc      s6    :l733W==yII  r[   c                   .    e Zd ZdeddfdZdeddfdZdS )FunctionSpecfuncr]   Nc                    |j         }|j        }|j        | _        |j        | _        |j        | _        |d | j                 | _        || j        | j                 | _	        | j        | j	        z   | _
        || j        | j        | j        z            | _        | j        | j        z   }|j        t          z  r||         nd | _        || j        rdndz  }|j        t          z  r||         nd | _        d S Nr9   r   )__code__co_varnamesco_posonlyargcountposonly_countco_argcount	arg_countco_kwonlyargcountkwonly_countposonly_namespos_or_kw_namesall_pos_nameskwonly_namesco_flags
CO_VARARGSvarargs_nameCO_VARKEYWORDS
varkw_name)selfrf   codevnoffs        r\   __init__zFunctionSpec.__init__   s    }!4) 2 4$"4 45!$"4t~"EF!/$2FFt~AR0RRSnt00'+}z'AKBsGGtD%,qq1,%)]^%CM"S''r[   c           
          |j         pd| _        |j        pi | _        t	          t          | j        t          | j                   d          t          t          | j                                                | _	        d S NrZ   )
__defaults__defaults__kwdefaults__
kwdefaultsdictziprs   lenrangepos_default_map)rz   rf   s     r\   update_defaultszFunctionSpec.update_defaults   sv     )/R-3  $"C$6$6#6#8#895T]ASAS;T;TUU 
  
r[   )rW   rX   rY   r   r~   r   rZ   r[   r\   re   re      s^        N\ Nd N N N N$	
L 	
T 	
 	
 	
 	
 	
 	
r[   re   rf   c                 p    t                               |           }|t          |           }|t           | <   |S N)rT   getre   )rf   specs     r\   	_get_specr      s4    ??4  D|D!! DKr[   txrE   	fn_sourceargskwargsc                    t          |           }t                    |j        k    r?| j        s8|s6|j        s/|j        s(|j        s!fdt          |j                  D             S |	                    |            i }t          |          }|j                                        D ]c\  }}	d }
|r;t          j        |j        |	                   rt           j        st%          ||	          }
t'          |j        |	         |
          ||<   dt          |j                  D ]|\  }}|t                    k     rt'          |                   ||<   2||v r0||j        vr't'          |                    |                    ||<   f||vrt-          d|           }t          |j                  d          }|j        r&t'          t/          |                    ||j        <   n6|r4t-          dt                     dt          |j                             |j        D ]}}||v r't'          |                    |                    ||<   -||j        v r6d }|rt%          ||d          }t'          |j        |         |          ||<   lt-          d|           |j        rt'          |          ||j        <   n!|rt-          dt3          |                     |S )	Nc                 D    i | ]\  }}|t          |                   S rZ   )wrap_bound_arg).0inamer   r   s      r\   
<dictcomp>z$bind_args_cached.<locals>.<dictcomp>   s=     
 
 
4 .T!W--
 
 
r[   z&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   rn   r   rw   ry   rt   	enumeraters   r   r   r   itemsr@   
is_literalr   r   %skip_guards_on_constant_func_defaultsr,   r   rq   pop	TypeErrortupler   list)rf   r   r   r   r   r   barem_kwr   idxdefault_sourcer   extrakwdefault_sources    ` `          r\   bind_args_cachedr      sn    T??D
 	D		T^##! 	$ 	$ ! 	$ 	 	$
 ! 	$
 
 
 
 
$T%788
 
 
 	
 		B&\\F )//11 J J	c 	<'c(:;;	<<	< ,Is;;N!"dmC&8.II4T/00 M M4s4yy==%b$q'22BtHHV^^ *** &b&**T*:*:;;BtHH^^KTKKLLL  T'((**+E 
 .r5<< @ @4	 
a#d))aaDL^H_H_aa
 
 	

 ! 	O 	O6>>%b&**T*:*:;;BtHHT_$$# O#1)T#N#N#N %b$/$*?AQRRBtHHMtMMNNN  I,R884?	 IGfGGHHHIr[   valsourcec                     t          |t                    r|S |st          j        | |          S t          j                            ||          S r   )
isinstancer>   buildr   LazyVariableTrackercreate)r   r   r   s      r\   r   r     sS     #'' A
 A$R--- ,33C@@@r[   resultc                     t          |                                          D ]4\  }}t          |t          t          f          rt          | |          ||<   5d S r   )r   r   r   r   r   r   )r   r   kvs       r\   wrap_args_kwargsr     sY    V\\^^$$ . .1a%'' 	.&r1--F1I. .r[   parentr{   c                     | j         j        }|j        D ]H}|                                }||v r)|                    ||                    |                     |||<   IdS )z
    Update `result` to add mapping from local name to new cells created
    directly by `code`, or update SideEffects in `parent` if the a local cell is
    already in `result` (cell argument).
    N)outputside_effectsco_cellvarstrack_cell_new
store_cellr   )r   r   r{   r   r   new_cells         r\   init_cellvarsr   !  ss     =-L     ..0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   rf   r   s
             r\   _create_nested_fnr   6  s     #"""""<ixAAD$D+u%% 2&&&&&&88K0011 *[$"?"??&DKr[   >   __doc__ri   __closure____globals__r   r   r   fnc                 p   |ot          ||          }|r|dk    rt          |          }d }	 t          j        ||          }n%# t          $ r t          t          |            Y nw xY w|t          v rt          ||          }|r t          j	        
                    ||          S t          j        | |          S )Nr   )r(   r/   inspectgetattr_staticAttributeErrorr"   fn_known_dunder_attrsgetattrr   r   r   r>   r   )r   r   r   r   subobjs        r\   fn_var_getattrr   [  s     0
6400F )$+++ !((F5'D11 5 5 5 	!444445 $$$T"" D,33FFCCC V,,,s   A A%$A%c                       e Zd ZdefdZdefdZdeeef         fdZde	j
        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fdZdddeeef         fdZdefdZdS )BaseUserFunctionVariabler]   c                 4    |                                  j        S r   get_codeco_filenamerz   s    r\   get_filenamez%BaseUserFunctionVariable.get_filenamew      }}**r[   c                 4    |                                  j        S r   r   co_namer   s    r\   get_namez!BaseUserFunctionVariable.get_namez      }}&&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[   r   rE   r   r   c                     |                                  dk    r.|                                                     d          rt          S |                    | g |                                 ||          S )Npatch_track_step_calledztorch/optim/lr_scheduler.py)r   r   endswithr?   inline_user_function_return	self_argsrz   r   r   r   s       r\   call_functionz&BaseUserFunctionVariable.call_function  sq     MMOO888!!##,,-JKK 9 *)--d4Ndnn6F6F4N4NPVWWWr[   r   c                     d}	 t          |                                 |          }n-# t          $ r  |dk    rt          | t                    rd}Y nw xY wt
          j                            |          S )NFrW   T)hasattrget_functionr   r   NestedUserFunctionVariabler   r@   r   rz   r   r   r   s       r\   call_obj_hasattrz)BaseUserFunctionVariable.call_obj_hasattr  s     	T..00$77FF" 	 	 	z!!j7Q&R&R!	 )00888s   "' 'AAc                     i S r   rZ   rz   r   s     r\   closure_varsz%BaseUserFunctionVariable.closure_vars      	r[   c                     dS NTrZ   r   s    r\    should_allow_nested_graph_breaksz9BaseUserFunctionVariable.should_allow_nested_graph_breaks      tr[   N)rW   rX   rY   strr   r   r   r   r   r   CodeTyper   boolr   r   r>   r   r@   r   r   r   rZ   r[   r\   r   r   v  sj       +c + + + +'# ' ' ' '"T#s(^ " " " ""%. " " " ""$ " " " "X#X 'X S/)*	X
 
X X X X
9)
914
9	
9 
9 
9 
96 4_@T;U    $      r[   r   c                   :    e Zd ZdZddhej        Z eh d          Zede	de	dd fd            Z
	 d,dej        ej        j        z  ded
e	ddf fdZde	f fdZdee         fdZdej        fdZdej        fdZdefdZdefdZdeee	f         fdZdefdZ ddde!e         d
eeef         deeef         fdZ"dddedefdZ#dddede$fdZ%ddde!e         d
eeef         def fdZ&ddde!e         d
eeef         dedz  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%Z-de	dee         dz  fd&Z.de/d'         fd(Z0de1fd)Z2d*e3defd+Z4 xZ5S )-UserFunctionVariablez-Some unsupported user-defined global functionr   is_constant>   
optree.opstorch.utils._pytreetorch.utils._cxx_pytreeoptreevaluer   r]   c                 t    t          |                    t          j                              | ||          S Nr   r'   
make_guardr&   CLOSURE_MATCHclsr  r   s      r\   create_with_sourcez'UserFunctionVariable.create_with_source  s6    f''(BCCDDDs5((((r[   Fr   Nc                 L    t                      j        d	i | t          |dd          rd| _        nd| _        t	          |t
          j        t          j        j	        f          s!t          d| ddgt          j                   t          j        |d|          }|| _        d S )
N_dynamo_marked_constantFTz1can't handle functions not implemented in python z2Dynamo can only handle functions defined in pythonz9Move usage of this function out of `torch.compile` regiongb_typecontextexplanationhints_torchdynamo_inlinerZ   )superr~   r   r  r   r   r   r_   jitScriptFunctionr$   r   INFERENCE_MODEr   r   r   rz   r   r  r   	__class__s       r\   r~   zUserFunctionVariable.__init__  s     	""6"""20%88 	%#D$D "u1593KLMM 		KPO&5	    #B(=rBBr[   c                 |    t          | t                    r| j        S t                                                      S r   )r7   r  r   r  as_python_constant)rz   r#  s    r\   r%  z'UserFunctionVariable.as_python_constant  s3    $,-- 	7Nww))+++r[   c                     g S r   rZ   r   s    r\   r   zUserFunctionVariable.self_args  r   r[   c                     | j         S r   r   r   s    r\   r   z!UserFunctionVariable.get_function  	    wr[   c                     | j         j        S r   )r   ri   r   s    r\   r   zUserFunctionVariable.get_code  s    wr[   c                     t           j        S r   r   r   r   s    r\   python_typez UserFunctionVariable.python_type      !!r[   c                 2    t          | j        dd           d uS )N__self__)r   r   r   s    r\   r   zUserFunctionVariable.has_self  s    tw
D11==r[   c                     | j         j        S r   )r   r   r   s    r\   r   z UserFunctionVariable.get_globals  s    w""r[   c                 Z    | j         }|r!t          | t          j                  r| j        }|S r   )r   r   r   UserMethodVariable	source_fn)rz   r   s     r\   
get_sourcezUserFunctionVariable.get_source  s1     	$jy'CDD 	$^Fr[   r   rE   r   c                    | j         rJ | j        }t          |t                    st	          d          |j        j        }|                                 }t          |||||          }t          |||j
                   | j        j        pd}t          |          t          | j        j
        j                  k    sJ t          t          j                    | j        j
        j        |          D ]\  }	}
}|j        j        }||v r	||         }n|rt%          t'          |          |	          }t)          |d|
          }	 t+          j        ||j        |          }n## t0          $ r t3          j                    }Y nw xY w|                    |||          }nV	 t+          j        ||j                  }n## t0          $ r t3          j                    }Y nw xY w|                    d||          }|||
<   |S )z
        Assume `args` and `kwargs` are VariableTracker arguments for a call to
        this function, create new bindings for initial locals.
        z'Only supports regular Python functions.rZ   cell_contents)freevar_nameN)r  r   r   r   r   r   root_txr5  r   r   ri   r   r   co_freevarsr   r   countr   r-   r*   r)   r>   r   r7  
ValueErrorr   DeletedVariabletrack_cell_existing)rz   r   r   r   r   r9  r   r   r   r   r   cellr   cell_varclosure_cellclosure_cell_contentscontents_vars                    r\   	bind_argszUserFunctionVariable.bind_args   s.    ####!%"l++ 	GEFFF-'""!"gvtVDDffbk222'%+7||s47#3#?@@@@@@"Otw/;W 
  
 "	$ "	$OCt "=5L|##'- V,]6-B-BCHH(: /) ) )%?#2#8 24I$ $LL " ? ? ?#,#<#>#>LLL? (;; $ ?#2#8AS#T#TLL! ? ? ?#,#<#>#>LLL? (;;D$UU#F4LLs$    EE<;E<F33GGr   r   c                     |t           v rt          j        | |          S |                                 }t	          || j        ||          S r   )r3   r   GetAttrVariabler5  r   r   )rz   r   r   r   s       r\   var_getattrz UserFunctionVariable.var_getattr>  sF    ))),T4888""b$'64888r[   c                 j    t          | j        |          }t          j                            |          S r   )r   r   r   r@   r   r   s       r\   r   z%UserFunctionVariable.call_obj_hasattrD  s,     $'')00888r[   c           
      Z   | j         t          j        j        u r	 d |D             }d |                                D             }t          j        j        |i |j        }t          j        |          S # t          $ r}t          d| d|           |d }~ww xY w| j         t          j        j
        u r	  t          j        | j                   j        |i |}|j        d                                         }	t!          |	t"                    sJ t          j        |	          S # t&          $ r}t          d| d|           |d }~ww xY w| j         t          j        j        u r t          j        | j                   j        |i |}|j        d         }
t!          |
t,                    sM|
                                }d|j         d	}t3          d
d| j         d| d| d|g t6          j                   t!          |
t:                    s4|
                                }d| d}t3          d|  |d| ddg           |
j         }t          j        |t          j        j         j!                  S | j"        r*tG          || j         |                                 ||          S |j$        j%        j&        s|| j         t          j        j'        j(        u r_t          j        j)        *                    |          5  tW                      ,                    |||          cd d d            S # 1 swxY w Y   t[          |j$        j%        dd           dk    r|j$        j%        j.        s	 ddl/m0} n# t&          $ r d }Y nw xY w|t| j         |j1        |j2        fv r_t          j        j)        .                    |          5  tW                      ,                    |||          cd d d            S # 1 swxY w Y   | 3                    |||          }||S tW                      ,                    |||          S )Nc                 6    g | ]}|                                 S rZ   r%  r   args     r\   
<listcomp>z6UserFunctionVariable.call_function.<locals>.<listcomp>S  s$    GGG3c4466GGGr[   c                 >    i | ]\  }}||                                 S rZ   rK  )r   keyr   s      r\   r   z6UserFunctionVariable.call_function.<locals>.<dictcomp>T  s7          6>c3C//11     r[   zCannot convert patch_dynamo_config args/kwargs to constants. Please fix your call to patch_dynamo_config by using simpler inputs. args: z
, kwargs: error_on_graph_breakz\Improper error_on_graph_break() call. Please fix your call to error_on_graph_break(). args: r   z=`nonstrict_trace` expects a callable, but got value of type <>zTypeError from user codezcall_function(, )r  z(Applying `nonstrict_trace` to function <zk>; however, `nonstrict_trace` currently requires the function to be defined outside `torch.compile` region.zLimitation of `nonstrict_tracezmake sure definition of z is outside z`torch.compile` regionkinddescriptionz!torch.utils.checkpoint.checkpoint)	FSDPState)4r   r_   _dynamopatch_dynamo_configr   changesr   DynamoConfigPatchVariabler:   RuntimeErrorrQ  r   	signaturebind	argumentsr%  r   r  ErrorOnGraphBreakVariable	Exceptionnonstrict_tracer   r   r-  rW   r$   r  r   
USER_ERRORr  r   TorchInGraphFunctionVariableAllowInGraphKindNONSTRICT_TRACEr  invoke_and_store_as_constantr   current_tracer,unsafe_allow_externally_visible_side_effectsr`   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_staterX  _pre_forward_post_forward_maybe_call_tree_map_fastpath)rz   r   r   r   
args_constkwargs_constr[  erN   rQ  fn_vartypmsgfn_namer   rX  tree_map_resultr#  s                    r\   r   z"UserFunctionVariable.call_functionJ  s    7em777GG$GGG
   BH,,..       -;#/   !:7CCC6   "6!6 6-36 6  	 W:::7)$'227HHH',*($$&& % ""6===== :;OPPP   "6!6 6-36 6   W5553G%dg..3TDVDDEZ]Ff&>?? 
((**eVYVbeee6LTZLL4LL6LLL #*5	    f&:;;  //++ v  v  v  v<#I #H7HHH0	    B99I     	/DGT]]__dF  
 	(U	?}"[\ \ +^^  ? ? ww,,Rv>>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? BI,mTBB23 3I,F3!UUUUUUU ! ! ! 			!$&'5 * * ]/II"MM C C 7700T6BBC C C C C C C C C C C C C C C C <<RvNN&""ww$$Rv666sg   AA4 4
B>BB5A-D# #
E-EE4#L$$L(+L( M' 'M65M64#O$$O(+O(c                 H   |                      |||          }||\  }}}n| }|}|}t          |t                    r3|                                rh |t          z
  st          |          dk    sd S |d         }|d         }	|dd          }
|	                    ||||
|          S )Nr   r   r9   )_rewrite_tree_map_only_callr   r  _is_tree_map_function_SUPPORTED_TREE_MAP_KWARGSr   call_tree_map)rz   r   r   r   rewritetree_map_fntree_map_argstree_map_kwargsmap_fn
first_treerests              r\   rq  z2UserFunctionVariable._maybe_call_tree_map_fastpath  s     222tVDD:A7KK M$O {$899	1133	 ('*DD	 M""a''4q!"1%
QRR ''
 
 	
r[   c                 p    t          | j        dd           dk    ot          | j        dd           | j        v S )NrW   tree_maprX   r   r   _TREE_MAP_MODULESr   s    r\   r|  z*UserFunctionVariable._is_tree_map_function  s<    DGZ..*< Ot448NN	
r[   c                 p    t          | j        dd           dk    ot          | j        dd           | j        v S )NrW   tree_map_onlyrX   r  r   s    r\   _is_tree_map_only_functionz/UserFunctionVariable._is_tree_map_only_function  s<    DGZ../A Ot448NN	
r[   c           	      t   |                                  sd S t          |          dk    rd S h |t          z
  rd S |\  }}}|                     |          }|d S |                                 }|d S t          ||t          |dd                     }	t          j        |          }
|
|	|gt          |          fS )N   r   r  )
r  r   _TREE_MAP_ONLY_SUPPORTED_KWARGS_extract_tree_map_only_types_lookup_tree_map_functionTreeMapOnlyFunctionVariabler   r   r  r   )rz   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_call  s     ..00 	4t99>>4V966 	4*.'vx99-HH 4 ::<<$4468T22
 
 

 &:;LMM >8"<d6llJJr[   c                     t          | j        dd           }|sd S t          j                            |          }|d S t          |dd           }t          |t          j                  r|S d S )NrX   r  )r   r   sysmodulesr   r   r   r   )rz   module_namemoduler  s       r\   r  z.UserFunctionVariable._lookup_tree_map_function  so    dg|T:: 	4-->46:t44h 233 	Otr[   selector.c                 2   |                                 sd S 	 |                                }n# t          $ r Y d S w xY w|                     |          }|sd S t	          d |D                       sd S t          t                              |                    S )Nc              3   @   K   | ]}t          |t                    V  d S r   )r   type)r   rv  s     r\   	<genexpr>zDUserFunctionVariable._extract_tree_map_only_types.<locals>.<genexpr>!  s,      >>S:c4((>>>>>>r[   )is_python_constantr%  r   _flatten_type_specallr   r   fromkeys)rz   r  	raw_value	flatteneds       r\   r  z1UserFunctionVariable._extract_tree_map_only_types  s     **,, 	4	 3355II" 	 	 	44	 ++I66	 	4>>I>>>>> 	4T]]9--...s   - 
;;c                    t          |t                    r|gS t          |t                    r8g }|D ]1}|                     |          }| d S |                    |           2|S t          t          dd           }|Mt          ||          r=g }|j        D ]1}|                     |          }| d S |                    |           2|S d S )N	UnionType)r   r  r   r  extendr   r   __args__)rz   r  	collectedentryflat
union_types         r\   r  z'UserFunctionVariable._flatten_type_spec%  s    eT"" 	7NeU## 	$&I ' '..u55<44  &&&&UK66
!j
&C&C!I ' '..u55<44  &&&&tr[   Tc                     dS r   rZ   r   s    r\   is_python_hashablez'UserFunctionVariable.is_python_hashable;  r  r[   c                 *    t          | j                  S r   )hashr   r   s    r\   get_python_hashz$UserFunctionVariable.get_python_hash>  s    DG}}r[   otherc                 R    t          |t          j                  o| j        |j        u S r   )r   r   r  r   rz   r  s     r\   is_python_equalz$UserFunctionVariable.is_python_equalA  s%    %!?@@XTWPUPXEXXr[   F)6rW   rX   rY   r   r   _nonvar_fields	frozensetr  classmethodr   r  r   r   r_   r  r   r  r~   r%  r   r>   r   r   r  r   r  r-  r   r   r  r   r   r5  r   rD  rG  r@   r   r   rq  r|  r  r   r{  r  r  r  r
   r  intr  objectr  __classcell__r#  s   @r\   r  r    s       77 	 
"	0N "		
 	
 	
  )s )C )<R ) ) ) [) " !99  	
 
     >,C , , , , , ,40    e0     %.        "T " " " ">$ > > > >#T#s(^ # # # #F    <'< '< S/)*	<
 
c?"	#< < < <|95 9S 9_ 9 9 9 99)9149	9 9 9 9i7#i7 'i7 S/)*	i7
 
i7 i7 i7 i7 i7 i7V
#
 '
 S/)*	

 
4	
 
 
 
B
t 
 
 
 

D 
 
 
 
$K#$K '$K S/)*	$K 	"_%o%&(	

 	$K $K $K $KL
5+=+D 
 
 
 
/'/	tSy	D	 / / / /" T
T0A    ,GDM        YV Y Y Y Y Y Y Y Y Yr[   r  c                   P     e Zd ZdZdddee         deeef         def fdZ xZ	S )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   rE   r   r   r]   c                    t          |          dk    r|s|d         }d }t          |t          t          f          r|                                }|T||j        j        v r|j        j        |         S t                                          |||          }||j        j        |<   |S t                                          |||          S rh   )	r   r   r  r3  r   r   signature_cacher  r   )rz   r   r   r   
target_arg	cache_keyr   r#  s          r\   r   z&InspectSignatureVariable.call_functionP  s     t99>>&>aJI*';=O&PQQ 6&3355	$	 99994Y??..r4@@7=	))4ww$$Rv666r[   
rW   rX   rY   r   r   r>   r   r  r   r  r  s   @r\   r  r  E  s|         7#7 '7 S/)*	7
 
7 7 7 7 7 7 7 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                 V     t                      j        di | || _        || _        d S r   )r  r~   r  r  )rz   r  r  r   r#  s       r\   r~   z$TreeMapOnlyFunctionVariable.__init__o  s5     	""6"""*r[   c                     t           S r   r   r   s    r\   r-  z'TreeMapOnlyFunctionVariable.python_typey  s    r[   nodec                     	 |                                 n# t          $ r Y dS w xY wt          fd| j        D                       S )NFc              3   8   K   | ]}t          |          V  d S r   )
issubclass)r   allowed	node_types     r\   r  zDTreeMapOnlyFunctionVariable._matches_allowed_type.<locals>.<genexpr>  s-      TTg:i11TTTTTTr[   )r-  r   anyr  )rz   r  r  s     @r\   _matches_allowed_typez1TreeMapOnlyFunctionVariable._matches_allowed_type|  sc    	((**II" 	 	 	55	TTTTASTTTTTTs    
&&r   rE   r   c                    |s| j                             |||          S |d         }|                     |          r| j                             |||          S t          |          dk    s|r| j                             |||          S |S )Nr   r9   )r  r   r  r   )rz   r   r   r   leafs        r\   r   z)TreeMapOnlyFunctionVariable.call_function  s      	?;,,Rv>>>Aw%%d++ 	?;,,Rv>>>t99>>V> ;,,Rv>>>r[   )rW   rX   rY   r   r  r   r  r>   r   r~   r-  r  r  r   r   r  r   r  r  s   @r\   r  r  i  s       	!	0N
T3Y'   	
 
     T    U/ Ud U U U U# ' S/)*	
 
       r[   r  c            	            e Zd Z	 ddej        dededdf fdZededefd	            Z	d
dde
e         deeef         defdZ xZS )BuiltinMethodVariableFr   r  r   r]   Nc                      t                      j        di | t          |t          j                  sJ || _        d S r   )r  r~   r   r   BuiltinMethodTyper   r"  s       r\   r~   zBuiltinMethodVariable.__init__  sF     	""6""""e566666r[   objc                 t    | j         }| j        }|t          u r|dk    pt          |          t          u o|dk    S )N__new____contains__)r0  rW   r   r  r  )r  method_selfmethod_names      r\   is_supported_builtin_methodz1BuiltinMethodVariable.is_supported_builtin_method  sH    ll u$A	)A 
*L{n/L	
r[   r   rE   r   c                     | j         j        }| j         j        }| j        ot	          | j        d          }t          j        |||d          }|                    ||||          S )Nr0  T)realize)r   r0  rW   r   r(   r>   r   call_method)rz   r   r   r   r  r   
obj_sourceobj_vts           r\   r   z#BuiltinMethodVariable.call_function  sc     g&w[HZZ%H%H
 &r;
DQQQ!!"dD&999r[   r  )rW   rX   rY   r   r  r  r   r~   staticmethodr  r   r>   r   r  r   r  r  s   @r\   r  r    s        ?D )8<PS	      
 
 
 
 
 \

:#
: '
: S/)*	
:
 

: 
: 
: 
: 
: 
: 
: 
:r[   r  c            
           e Zd Zdej        deeef         dddeddf
 fdZdej        fd	Z	defd
Z
defdZdefdZdefdZdefdZ defdZeZd(dZd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_tracerrC   r   r]   Nc                 d     t                      j        di | || _        || _        || _        d S r   )r  r~   r{   r   r  )rz   r{   r   r  r   r#  s        r\   r~   z%LocalGeneratorObjectVariable.__init__  s>     	""6"""	"*r[   c                     | j         S r   )r{   r   s    r\   r   z%LocalGeneratorObjectVariable.get_code  s
    yr[   c                 4    |                                  j        S r   r   r   s    r\   r   z)LocalGeneratorObjectVariable.get_filename  r   r[   c                 4    |                                  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_function  s    !.111r[   c                     dS NFrZ   r   s    r\   r   z%LocalGeneratorObjectVariable.has_self      ur[   c                 *    |                                  S r   )r   r   s    r\   rW   z%LocalGeneratorObjectVariable.__name__  s    }}r[   c                 J    | j         j         d|                                  dS )N(rT  )r#  rW   r   r   s    r\   __str__z$LocalGeneratorObjectVariable.__str__  s&    .)>>DMMOO>>>>r[   codegenrB   c                    ddl m} ddlm}m} |j        } ||          } ||          } ||          }|5  |5  |5  | j        }	|	j        s|                     |          | _	        t          j        | j	                                      |           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nr   )"disallow_side_effects_in_generator) save_and_restart_speculation_log(temporarely_allow_writes_to_output_graph)torch._dynamo.side_effectsr  torch._dynamo.symbolic_convertr  r  r   r  generator_exhaustedforce_unpack_var_sequenceremaining_itemsr   ListIteratorVariablereconstruct)
rz   r  r  r  r  r   savedisallowtemptracers
             r\   r  z(LocalGeneratorObjectVariable.reconstruct  s   QQQQQQ	
 	
 	
 	
 	
 	
 	
 	

 Z//3355b9977;; 	V 	V8 	V 	VT 	V 	V'F- J'+'E'Eb'I'I$*4+?@@LLWUUU		V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	VsX   CB7AB B7 B$$B7'B$(B7+C7B;	;C>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   rF   c           	         | j         }|                                 rt          t          |           	 |                                S # t
          $ r}d|_        |d }~wt          $ r- t          ddddt           dgt          j                   Y d S t          $ ra}t          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 .r  zA

Skipping frame due to graph break in a generator's next() call.)r  _is_generator_exhaustedr"   StopIterationinline_call_r   r  r   r$   PT2_ISSUE_TRACKER_URLr   rd  r%   r_   rY  
eval_frame	skip_coder   
skip_frame	one_graphrQ  rw  )rz   r   r  rt  s       r\   next_variablez*LocalGeneratorObjectVariable.next_variable  sC   #'')) 	8$]B777	 &&(((  	 	 	)-F&G% 	 	 	5I |cx{{{&1	 	 	 	 	 	 	  	 	 	M$..t}}???AL< _(? _^^	s*   A 
C<	A6C<	C<AC77C<rE   r   c                     ||                                  j        v rt          j        d          S t          j        d          S NTF)r-  __dict__r@   r   rz   r   r   s      r\   r   z-LocalGeneratorObjectVariable.call_obj_hasattr  s@     4##%%...#*4000&u---r[   c                     dS r  rZ   r   s     r\   has_unpack_var_sequencez4LocalGeneratorObjectVariable.has_unpack_var_sequence  r  r[   c                     dS r   rZ   r   s     r\   has_force_unpack_var_sequencez:LocalGeneratorObjectVariable.has_force_unpack_var_sequence  r  r[   c                 @    g }|                      ||j                   |S r   )force_apply_to_var_sequenceappend)rz   r   r   s      r\   r  z6LocalGeneratorObjectVariable.force_unpack_var_sequence  s&     )+((V];;;r[   r   c                     	 	  ||                      |                     n # t          $ r t          |           Y d S w xY wAr   )r  r!   r   )rz   r   r   s      r\   r   z8LocalGeneratorObjectVariable.force_apply_to_var_sequence&  sb    	4%%b))****,   )"---	s   " ??Fc                     dS r  rZ   r   s    r\   r   z=LocalGeneratorObjectVariable.should_allow_nested_graph_breaks1  r  r[   excc                     | j         }	 |                    |           d S # t          $ r }|                    |           Y d }~d S d }~ww xY wr   )r  _raise_exception_variabler   exception_handler)rz   r   r$  r  rt  s        r\   _setup_exceptionz-LocalGeneratorObjectVariable._setup_exception4  sr     #	(,,S11111  	( 	( 	( $$Q'''''''''	(s     
A
AA
c                 4    | j         d u p| j         j        dk    S )Nr   )r  instruction_pointerr   s    r\   _is_generator_just_startedz7LocalGeneratorObjectVariable._is_generator_just_started?  s!    !T)XT-?-SWX-XXr[   c                 .    t          | j        dd          S )Nr  F)r   r  r   s    r\   r  z4LocalGeneratorObjectVariable._is_generator_exhaustedB  s    t)+@%HHHr[   r   c                    |dk    r|                      |          S |dk    r| S |dk    r|                                 r=t          |          r.t          d |D                       st	          t
          |           | j        }|                    |           |                      |          S |dk    r3| j        }|                                 s|                                 rd|_	        t          j        S 	 |                     |t          j        t          d                     t          j        dk    r#|j        j        d	k    rd|_	        t          j        S n## t&          $ r d|_	        t          j        cY S w xY w	 |                      |          rt	          t(          |           n.# t&          $ r d|_	        t          j        cY S t*          $ r |j        J |j        cY S w xY w|d
k    r| j        }	 |                     |t          |          dk    r|d         n|d                    n# t.          $ r  w xY w|                      |          }t1          dt2          fi           }	 |                     |t          j        |d                     |                      |           t	          t(          |           n# t5          |          $ r Y nw xY w|S t7                                          ||||          S )N__next____iter__sendc              3   >   K   | ]}|                                 V  d S r   )is_constant_nonerL  s     r\   r  z;LocalGeneratorObjectVariable.call_method.<locals>.<genexpr>X  s.      BBc3//11BBBBBBr[   closeTrZ   )r     CALL_INTRINSIC_1throwr  r9   r   __InternalThrowException)r  r+  r   r  r"   r   r  	push_manyr  r  r   r?   r(  ExceptionVariableGeneratorExitr  version_infonext_instructionopnamer    r]  r!   symbolic_resultr   r  rb  r   r  r  )	rz   r   r   r   r   r  retvalexc_typer#  s	           r\   r  z(LocalGeneratorObjectVariable.call_methodE  sk    :%%b)))ZKV^^ ..00 <SYY < BBTBBBBB <,Y;;;'FT"""%%b)))W__ 'F..00 8D4P4P4R4R 8-1* 778%%	3M2FF  ( $///6:LLL15F.$;;( 8 8 8-1* 77778
.%%b)) ?,\2>>>( 8 8 8-1* 7777, . . .
 -999----. W__ 'F
 %%bSYY!^^$q''aQQQQ$    ''++F| 6bIIH?%%b)*EhPR*S*STTT""2&&&
 )v>>>>	 1::   
 Mww""2tT6:::sI   7A E E98E9=*F) )G$G$#G$57H- -H9)>J= =KKr  rB   r]   N)'rW   rX   rY   r   r  r   r  r   r~   r   r   r   r   r   r  r   r  __repr__r  r   r  r-  r>   r  r@   r   r  r  r   r  r   r   r
   r   r(  r+  r  r  r  r  s   @r\   r  r    s       
+n
+ S>
+ @	
+
 
+ 

+ 
+ 
+ 
+ 
+ 
+%.    +c + + + +'# ' ' ' '2e 2 2 2 2$    #    ? ? ? ? ? HV V V V$T#s(^    #T # # # # ;     B.).14.	. . . .*A d    0G D    -	o	   -3;_<Ms<R3S	   '%.    	()	(0?	(		( 	( 	( 	(YD Y Y Y YI I I I Iw;#w; w; ?#	w;
 S/)*w; 
w; w; w; w; w; w; w; w; w; w;r[   r  c                       e Zd ZdZdS )4ContextlibContextManagerLocalGeneratorObjectVariablez
    .. note::

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

        It is a special case of a generator function as we do not allow return a context manager
        from a torch.compile function.
    N)rW   rX   rY   r   rZ   r[   r\   rD  rD    s           r[   rD  c            	            e Zd Z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 xZS )LocalGeneratorFunctionVariablezxfunctions that behaves like iterators

    .. note::

        This is a wrapper around (Nested)UserFunctionVariable
    )generator_clsvtrG  r   r]   Nc                V     t                      j        di | || _        || _        d S r   )r  r~   rH  rG  )rz   rH  rG  r   r#  s       r\   r~   z'LocalGeneratorFunctionVariable.__init__  s7     	""6"""*r[   r   c                 h    || j         j        v rt          | |          S t          | j        |          S r   )r#  r  r   rH  )rz   r   s     r\   __getattr__z*LocalGeneratorFunctionVariable.__getattr__  s4    4>***4&&&tw%%%r[   c                 4    | j                                         S r   )rH  r   r   s    r\   r   z'LocalGeneratorFunctionVariable.get_code%      w!!!r[   c                 4    | j                                         S r   )rH  r   r   s    r\   r   z*LocalGeneratorFunctionVariable.get_globals(  s    w""$$$r[   c                 4    | j                                         S r   )rH  r   r   s    r\   r   z'LocalGeneratorFunctionVariable.has_self+  rM  r[   r   rF   r   rD   c                 4    ddl m}  |j        || ||          S )Nr   )rD   )r  rD   build_inline_tracer)rz   r   r   r   rD   s        r\   _build_inline_tracerz3LocalGeneratorFunctionVariable._build_inline_tracer.  s;     	QPPPPP@,@	
 
 	
r[   rE   c                    t          | j                                                  s9t          dt	          | j                                                  dddg           |                     |t          |          |          }| j                                        }| j                                        }|                     |||| j	                  S )Nz'non-generator contextlib.contextmanagerzvCannot compile function decorated with `@contextlib.contextmanager` that is not a generator, i.e. does not use `yield`z5Use `yield` in the function body instead of `return`.z2Remove the `@contextlib.contextmanager` decorator.r  r  )
r   rH  r   r$   r  rR  r   r   rG  r   )rz   r   r   r   r  r{   r   s          r\   r   z,LocalGeneratorFunctionVariable.call_function=  s     DG,,..// 
	ADG,,..//. LH	 	 	 	 11"d4jj&IIw!!G''))	 !!;	 " 
 
 	
r[   )rW   rX   rY   r   r  r   r  r   r~   r  rK  r   r  r   r   r   r  r   r   r>   rR  r   r   r  r  s   @r\   rF  rF    s         ;		+ 	+ 	+$	+ 		+
 	+ 
	+ 	+ 	+ 	+ 	+ 	+& & & & & &"%. " " " "%T#s(^ % % % %"$ " " " "
'
 ?#
 S/)*	

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

 

 
 
 
 
 
 
 
r[   rF  c                   h     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
    rH  r   r]   Nc                 J     t                      j        |fdt          i| d S )NrG  )r  r~   rD  )rz   rH  r   r#  s      r\   r~   z<FunctionDecoratedByContextlibContextManagerVariable.__init__e  sB    	
 	
N	
 	
 	
 	
 	
 	
r[   r   rF   r   rC   c                     t                                          |||          }t          |t          j        j        j                  sJ d|_        |S r   )r  rR  r   r_   rY  symbolic_convertrC   is_generator_from_ctx_manager)rz   r   r   r   r  r#  s        r\   rR  zHFunctionDecoratedByContextlibContextManagerVariable._build_inline_tracerl  sY     --b$??M*Q
 
 	
 	
 
 04,r[   )rW   rX   rY   r   r   r   r~   r   r>   r   r  rR  r  r  s   @r\   rU  rU  \  s         
3 
s 
t 
 
 
 
 
 
' ?# S/)*	
 
2         r[   rU  c                        e Zd Zd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 xZS )r3  z$Some unsupported user-defined methodNr   .r  r4  r   r]   c                      t                      j        dd|i| || _        || _        |?|                    d          ,t          |                    d          d          | _        d S d S d S )Nr   r   __func__rZ   )r  r~   r  r4  r   r(   )rz   r   r  r4  r   r#  s        r\   r~   zUserMethodVariable.__init__  s}     	))B)&)))" H!5!5!A'

8(<(<jIIDNNN !A!Ar[   c                 @    | j         j         d| j         d| j         dS )Nr  rS  rT  )r#  rW   r   r  r   s    r\   rB  zUserMethodVariable.__repr__  s*    .)BBDGBBtxBB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  s    r[   r   rE   r   c                    ddl m}m}  || j                  r^g |                                 |}t          j        | j        t
          j        j        j	                  }|
                    |||          S  || j                  r^g |                                 |}t          j        | j        t
          j        j        j                  }|
                    |||          S |j                                        rt          | j        t
          j                  rvt#          | j        dd          }||                    d          r|dk    s| j        r;| j                            || j        j        t-          |          || j                  S nVt.          O| j        t.          j        j        u r7t          j        | j                  
                    || j        g|R |          S | j        rIt#          | j        j        | j        j                  }	t9          ||	|                                 ||          S t=                      
                    |||          S )	Nr   )is_leaf_functionis_nonstrict_trace_callablerU  rX   r  z	torch.nn.ztorch.nn.utils.parametrize)constant)trace_rulesrd  re  r   r   r   re  r_   rf  rg  r   LEAF_FUNCTIONr   is_root_tracerr   r  NNModuleVariabler   
startswithr  r  rW   r   rA   FSDPParamGroupuse_training_stateTorchCtxManagerClassVariabler  rh  r   r  )rz   r   r   r   rd  re  	call_argsvarmodule_attrr   r#  s             r\   r   z UserMethodVariable.call_function  sm    	POOOOOOO&&tw// 	<2$..**2T2I8io>N  C $$RF;;;DG$$ 	<2$..**2T2I8io>L  C $$RF;;; 9##%% 	*Hi0+
 +
 	 "$'<<<K '**;77 (#???# @ x++($t**ftGW ,    @ ),;NNN9$'BBPPTX%%%v    	W)9::B/BvVVVww$$Rv666r[   r   c                     |dk    r| j         S |dk    r t          j        || j        | j                  S t                                          ||          S )Nr0  r\  )r  r>   r   r   r4  r  rG  rz   r   r   r#  s      r\   rG  zUserMethodVariable.var_getattr  sU    :8O: #(TWdnEEEww""2t,,,r[   r   )rW   rX   rY   r   r   r   r>   r   r~   r  rB  r   r   r  r   rb  r-  r   r   r   rG  r  r  s   @r\   r3  r3    s       .. $(	J JS#XJ J D=	J
 J 
J J J J J J2C# C C C C40     T%"23        B7#B7 'B7 S/)*	B7
 
B7 B7 B7 B7 B7 B7H-5 -S -_ - - - - - - - - - -r[   r3  c                   p     e Zd Zdedddeddf fdZdd	d
ee         dee	ef         def fdZ
ddZ xZS )WrappedUserMethodVariablewrappedr  rG   r   r]   Nc                     |                     dd            |                     dd             t                      j        |j        |j        fi | || _        || _        d S )Nr   r  )r   r  r~   r   r  rv  r  rz   rv  r  r   r#  s       r\   r~   z"WrappedUserMethodVariable.__init__  sd     	

4

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

4..v...r[   r   rE   r   c                     | j                             |           t                                          |||          }| j                             |           |S r   rz  r}  s        r\   r   z)WrappedUserFunctionVariable.call_function  r~  r[   r  rB   c                                            fd             j                                       t          dd                     d S )Nc                  $      j                   S r   r  r  s   r\   r  z9WrappedUserFunctionVariable.reconstruct.<locals>.<lambda>)  r  r[   r9   Fr  r  s   ``r\   r  z'WrappedUserFunctionVariable.reconstruct(  r  r[   rA  )rW   rX   rY   r  r   r~   r   r>   r   r  r   r  r  r  s   @r\   r  r    s        	%	 +	 		
 
	 	 	 	 	 		#	 '	 S/)*		
 
	 	 	 	 	 	> > > > > > > >r[   r  c                     dt           dt          fdfd|D             }fd|                                D             } ||i |}| j                            ||t          |                    S )Nxr]   c                     |                                  r"t          d|                                           S |                                 S )NrL   )	is_tensorr	   get_real_valuer%  )r  s    r\   convertz-invoke_and_store_as_constant.<locals>.convert5  sA    ;;== 	>(!,,;;===##%%%r[   c                 &    g | ]} |          S rZ   rZ   )r   r  r  s     r\   rN  z0invoke_and_store_as_constant.<locals>.<listcomp>:  s!    %%%1GGAJJ%%%r[   c                 .    i | ]\  }}| |          S rZ   rZ   )r   r   r   r  s      r\   r   z0invoke_and_store_as_constant.<locals>.<dictcomp>;  s'    7771a777r[   r  )r>   r   r   r   register_attr_or_moduler+   )r   r   r   r   r   resr  s         @r\   rh  rh  .  s    &? &s & & & &
 &%%%%%%D7777777F
"d
f

C9,,d## -   r[   c                   X    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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defdZdddedee         d
eeef         def
 fdZdefdZdddedef fdZdddedef fdZdefd Z deeef         fd!Z!d"ddee         d
eeef         deeef         fd#Z"d(d&Z# xZ$S ))r   r   Nrx  r{   r   r   r   r   
wrapped_fnr   r]   c	                    |	                     d          "|	                    t                                  t                      j        di |	 t          |                                t                    sJ t          |                                t          j	                  sJ t          |t                    sJ || _        || _        || _        || _        || _        || _        || _        || _        d S )Nmutation_typer  rZ   )r   updater;   r  r~   r   r%  r  r   r  r   rx  r{   r   r   r   r   r   r  )rz   rx  r{   r   r   r   r   r   r  r   r#  s             r\   r~   z#NestedUserFunctionVariable.__init__J  s     ::o&&.MM(<(>(>M???""6"""'4466<<<<<$1133U^DDDDD)T*****	" $&2<r[   c                     g S r   rZ   r   s    r\   r   z$NestedUserFunctionVariable.self_argsg  r   r[   c                 *    |                                  S r   )r   r   s    r\   r%  z-NestedUserFunctionVariable.as_python_constantj  s      """r[   c                 4    | j                                         S r   )r{   r%  r   s    r\   r   z#NestedUserFunctionVariable.get_codem  s    y++---r[   c                     t           j        S r   r,  r   s    r\   r-  z&NestedUserFunctionVariable.python_typep  r.  r[   _convertingc                 `   ddl m} t          |           }|t                      }||v rt	          d          |                    |           	 |                     |          |                    |           S # |$ r}t	          d          |d }~ww xY w# |                    |           w xY w)Nr9   )r:   z-cycle detected in mutually recursive closuresz1failed to convert closure cell to Python constant)baser:   idsetrV   add_get_function_impldiscard)rz   r  r:   self_idrt  s        r\   r   z'NestedUserFunctionVariable.get_functions  s     	>=====T((%%Kk!!(?   	   	)**;77 (((( 3 	 	 	(C 	
 ((((s$   A9 9B>BBB B-c                 `    	 |                                   dS # t          t          f$ r Y dS w xY wr  )r%  r   r%   r   s    r\   r  z-NestedUserFunctionVariable.is_python_constant  sE    	##%%%4#[1 	 	 	55	s    --c                    d }| j         rddlm}  |j                    }g }| j         j        D ]}|j        j                            |          }|| u rt          d          t          |t                    r|                    |          }n|                                }|                    t          |                     t          |          }t!          j        | j                                        | j        | j                                        d |          }	| j        r| j                                        |	_        | j        r| j                                        |	_        | j        rj| j                                        }
t          |
t                    rddlm} t9           ||
                    }
t          |
t8                    sJ |
|	_        |	S )Nr   )rE   z self-referential nested function)argdefsr   r   )r   r  rE   
current_txr   r   r   	load_cellrV   r   r   r   r%  r!  r8   r   r   r   r{   r   rx  r   r   r   r   r   r   r   r   r   )rz   r  closure_cellsrE   r   cellsr@  r7  r  rf   r   r   s               r\   r  z-NestedUserFunctionVariable._get_function_impl  s   < 	)LLLLLL1&133BE L. / / !#	 6 @ @ J J !D((01STTT m-GHH ?)66{CCEE)<<>>EYu--....!%LLM!I((**NL++--!
 
 
 = 	C $ @ @ B BD? 	G"&/"D"D"F"FD 		/*==??K+u-- :......"88K#8#899 k400000#.D r[   r   rE   name_varr   c                 \    |j         j                            | |j        |           t          S r   )r   r   
store_attrr  r?   )rz   r   r  r   s       r\   call_setattrz'NestedUserFunctionVariable.call_setattr  s)     		))$DDD%%r[   r   r   c                     |dk    r | j         |g|R  S t                                          ||t          |          |          S )N__setattr__)r  r  r  r   rz   r   r   r   r   r#  s        r\   r  z&NestedUserFunctionVariable.call_method  sO     =  $4$R/$////ww""2tT$ZZ@@@r[   c                     | j         d uS r   )r   r   s    r\   has_closurez&NestedUserFunctionVariable.has_closure  s    |4''r[   c                    |dk    r|                                  S |dk    r|                                 S |dk    r)t          | dd           }|r|                                nd S t	                                          ||          S )NrW   ri   r   r   )r   r   r   r%  r  const_getattr)rz   r   r   dr#  s       r\   r  z(NestedUserFunctionVariable.const_getattr  s    :==??":==??">!!j$//A-.81'')))D8ww$$R...r[   c                    |dk    r-t           j                            t          | d                    S |dk    r-t           j                            t          | d                    S t	                                          ||          S )Nri   r{   r   r   )r   r@   r   r   r  r   rs  s      r\   r   z+NestedUserFunctionVariable.call_obj_hasattr  sw     :-44WT65J5JKKK>!!-44WT:5N5NOOOww''D111r[   c                     dS r  rZ   r   s    r\   r   z#NestedUserFunctionVariable.has_self  r  r[   c                     | j         S r   r  r   s    r\   r   z&NestedUserFunctionVariable.get_globals  r  r[   r   c                 &   |                                  }t          j        || j        | j                                        | j        rt          | j        j                  nd t          d t          t          |                                  j                            D                                 }| j        r| j                                        |_         t          j        |          j        |i |}|                                 t'          |j                                                  }t+          |j        j        |           t1          |||           t3          |j                  D ]"\  }}	|	|vsJ | j        j        |         }
|
||	<   #|S )Nc              3   4   K   | ]}t          d           V  d S r   )r8   )r   _s     r\   r  z7NestedUserFunctionVariable.bind_args.<locals>.<genexpr>  s(      SSa)D//SSSSSSr[   )r   r   r   r   rx  r%  r   r   r   r   r   r:  r   keys_as_python_constantr   r   r^  r_  apply_defaultsr   r`  r   r   r9  r   r   r   )rz   r   r   r   r{   rf   rN   r   r   r   r?  s              r\   rD  z$NestedUserFunctionVariable.bind_args  st    }}!NL++--*.-AE$-%&&&TSS5T]]__5P1Q1Q+R+RSSSSS
 
 ? 	L"&/"I"I"K"KD,!$'',d=f==eo++--...777ffd+++"4#344 	  	 ICv%%%%<%c*DF4LLr[   r  rB   c                                         fd            | j                                                           | j                  g            t          j        | j        j        j                             | j	        r | j	                   n)                    
                    d           g           | j        r | j                   n)                    
                    d           g           | j        r | j                   n)                    
                    d           g           | j        rd	 | j                                        }                                        |          g           nI# t          $ r  | j                   Y n-w xY w                    
                    d           g                               t!          dd                     | j        r                     fd            | j                                       t!          dd                                         t%          d                                         t!          dd                     j        }|j        j                            |           r|j        j        j        |                                          D ]]\  }}                                  |                               t%          d                                         |           \d S d S )Nc                  :                          t          d          S )Nr   )load_import_fromrW   r  s   r\   r  z8NestedUserFunctionVariable.reconstruct.<locals>.<lambda>  s    G,,X7JKK r[      Fc                  0                          dd          S )N	functoolswrapsr  r  s   r\   r  z8NestedUserFunctionVariable.reconstruct.<locals>.<lambda>;  s    00gFF r[   r9   r   T)r  r{   r  create_load_const_uncheckedr   r@   r   r  r   r   create_load_constr   r   r   r%  r   r   r  r   r   r   r   has_pending_mutationstore_attr_mutationsr   dup_topr  )rz   r  r   r   r   r  s    `    r\   r  z&NestedUserFunctionVariable.reconstruct  su   KKKK	
 	
 	
 		wBB4>RRSTTT '	(?@@AAA= 	EGDM""""!!7#<#<T#B#B"CDDD< 	EGDL!!!!!!7#<#<T#B#B"CDDD? 	EGDO$$$$!!7#<#<T#B#B"CDDD 		E*".AACC%%88EEF    ' * * *()))))* !!7#<#<T#B#B"CDDD21e<<===? 	A!!FFFF   GDO$$$!!"6q%"@"@AAA!!,q//222!!"6q$"?"?@@@ Z9!66t<< 	)!y5J egg) )e !!!%%l1oo666""4((((	) 	)) )s   AF F/.F/r   rA  )%rW   rX   rY   r   r  r>   r   r  r   r~   r   r   r   r   r%  r  r   r  r-  r  r  r   r  r  r  r  r   r  r  r  r@   r   r   r   rD  r  r  r  s   @r\   r   r   D  s       	!	0N  .2= = = = S>	=
 "D(= $d*= %t+= !4'= $d*= = 
= = = = = =:40    #E$6 # # # #.%. . . . ."T%"45 " " " ") )C4 )5CU ) ) ) ),D    6c#h 65;M 6 6 6 6p&#& "& 	&
 
& & & &	A#	A 	A '		A
 S/)*	A 
	A 	A 	A 	A 	A 	A(T ( ( ( (/ 7 /s /s / / / / / /2)2142	2 2 2 2 2 2$    T#s(^    ' ' S/)*	
 
c?"	#   :6) 6) 6) 6) 6) 6) 6) 6)r[   r   c                   p     e Zd Zdedddeddf fdZdd	d
ee         dee	ef         def fdZ
ddZ xZS )!WrappedNestedUserFunctionVariablerv  r  rG   r   r]   Nc           
      $   |                     dd            |                     dd            |                     dd            |                     dd            |                     dd            |                     dd            |                     dd            |                     dd            t                                          |j        |j        |j        |j        |j        |j        |j	        |j
                   || _        || _        d S )	Nrx  r{   r   r   r   r   r   r  )r   r  r~   rx  r{   r   r   r   r   r   r  rv  r  rx  s       r\   r~   z*WrappedNestedUserFunctionVariable.__init__O  s    	

9d###

64   

;%%%

:t$$$

<&&&

=$'''

9d###

<&&&OLO		
 		
 		
 r[   r   rE   r   c                     | j                             |           t                                          |||          }| j                             |           |S r   rz  r}  s        r\   r   z/WrappedNestedUserFunctionVariable.call_functionj  r~  r[   r  rB   c                                            fd             j                                       t          dd                     d S )Nc                  $      j                   S r   r  r  s   r\   r  z?WrappedNestedUserFunctionVariable.reconstruct.<locals>.<lambda>v  r  r[   r9   Fr  r  s   ``r\   r  z-WrappedNestedUserFunctionVariable.reconstructu  r  r[   rA  )rW   rX   rY   r   r   r~   r   r>   r   r  r   r  r  r  s   @r\   r  r  N  s        + + 	
 
     6	#	 '	 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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                 V     t                      j        di | || _        || _        d S r   )r  r~   r  r  )rz   r  r  r   r#  s       r\   r~   zSkipFunctionVariable.__init__  s2    ""6"""
r[   c                     | j         S r   r  r   s    r\   r%  z'SkipFunctionVariable.as_python_constant  s
    zr[   r   c                    t          j        |dd          r]|}|}t          |dd          r(|j        }t	          |d          }t          |dd          (|                    t          j                   n|t          j        |          r-t          |                    t          j
                             n;t          |          s,t          |                    t          j                              | ||          S )N_torchdynamo_disableF_torchdynamo_orig_callabler  )r   r   r   r  r(   r  r&   r  	isbuiltinr'   BUILTIN_MATCHr6   )r  r  r   guard_on_sourceguard_on_values        r\   r  z'SkipFunctionVariable.create_with_source  s    !%)?GG 	I %O"N.*FNN !/!J",#%A# # .*FNN  &&|'ABBBBu%% 	I&++L,FGGHHHH077 	I &++L,FGGHHHs5((((r[   r   rE   r   c                    t          j        | j        dd          rOt          j        | j        dd           }t          dt	          | j                  d| j         d| ddg	           d S | j        t
          j        j        u rK|                    d
          }|r|	                                }t          dd| d| dd| dg	           d S | j        t
          j        j
        u rd|                    d
          }|r|	                                }nd}t          dd| d| dt          |j                   dd| dgd           d S | j        t
          j        j        u r>	 t          ddddg	           d S # t          $ r}t          |j                  d d }~ww xY wt"          j        rMddlm} |                    || j                  }	t-          |	t.                    s|	                    |||          S t3          | j        dd           }
t3          | j        d!d           }|d"nt	          |          }	 t          j        | j                  }d#|
 d$| d%}d&|
 d'g}d(|vr|d)|
 d*d+gz  }n# t6          $ r d,d-h}||v rd.| d|
 d'}d/d0g}n|_|                    d1          rJd2| d|
 d}d3g}t
          j        j                            |d4z   d4                    |          z              nJd5| d|
 d6}d7d8g}t
          j        j                            |d4z   d4                    |          z              Y nw xY w|
d9k    rd:}g }| j         r| j         nd;}t          d<d=| d>|
 d?| ||	           d S )@Nr  F_torchdynamo_disable_msgz1Skip calling `torch.compiler.disable()`d functionzSkip calling function `z>` since it was wrapped with `torch.compiler.disable` (reason: rT  z(Remove the `torch.compiler.disable` callr  rw  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.r  z$Call to `torch._dynamo.skip_frame()`z/Called `torch._dynamo.skip_frame()` with args `z`. Skipping frame r  z#User-inserted skip frame. Message: z-Remove the `torch._dynamo.skip_frame()` call.T)r  r  r  r  r  z*Call to `torch._dynamo.step_unsupported()`zUser-inserted step_unsupported.z3Remove the `torch._dynamo.step_unsupported()` call.r9   SourcelessBuilderrY   z<unknown qualname>rX   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`.rY  z:Apply `@torch._dynamo.dont_skip_tracing` to the function `zw` to force tracing into the function. More graph breaks may occur as a result of attempting to trace into the function.z Please file an issue to PyTorch._abc	_warningsz6Dynamo does not know how to trace the Python builtin `zIf you are attempting to call a logging function (e.g. `_warnings.warn`), you can try adding it to `torch._dynamo.config.reorderable_logging_functions`.zKPlease file an issue on GitHub so the PyTorch team can add support for it. r  z*Dynamo cannot trace optree C/C++ function zi Consider using torch.utils._pytree - https://github.com/pytorch/pytorch/blob/main/torch/utils/_pytree.py
z/Dynamo does not know how to trace the builtin `z.` This function is either a Python builtin (e.g. _warnings.warn) or a third-party C/C++ Python extension (perhaps created with pybind).zIf it is a Python builtin, please file an issue on GitHub so the PyTorch team can add support for it and see the next case for a workaround.a  If it is a third-party C/C++ Python extension, please either wrap it into a PyTorch-understood custom operator (see https://pytorch.org/tutorials/advanced/custom_ops_landing_page.html for more details) or, if it is traceable, use `torch.compiler.allow_in_graph`.allow_in_graphzFound an allow_in_graph decorator to a function which is created inside the parent function that is getting compiled. This is not supported for now.z<missing reason>z,Attempted to call function marked as skippedzmodule: z, qualname: z, skip reason: )!r   r   r  r$   r  r_   rY  graph_breakr   r%  r  r   f_codestep_unsupportedr%   r#   rw  r   dont_skip_tracingbuilderr  r   r   r  r   r   getfiler   rk  r`   	warn_oncejoinr  )rz   r   r   r   rw  graph_break_msgskip_frame_msgrt  r  
rebuilt_fnqualname	module_orr  pathr  r  known_python_builtin_modulesr  s                     r\   r   z"SkipFunctionVariable.call_function  sz    !$*.DeLL F	(5OQUVVCKDJAdj A A:=A A A ?      Z5=444$jj//O G"1"D"D"F"F?e4ee\beeeT?TTD	      Z5=333#ZZ..N $!/!B!B!D!D!#>B$ B B[a B B"3BI">">B B BR.RRC  	 	 	 	 	 	 Z5=999
7H AM	       7 7 7%ae,,$67 ' F666666 /55b$*EE
!*.BCC F%33BfEEEtz>;OPPH
L$??I090A,,s9~~K8Ytz22>V^ > > $> > > 
 @8??? D((lU] l l l ;	 E  %Y %Y %Y06/D, <<<7'7 7*27 7 7  
iGEE *y/C/CH/M/M*"h{"h"h]e"h"h"hK^E
 M'11+2DtyyQVGWGW2WXXXXb+ b bX` b b b  m;E M'11+2DtyyQVGWGW2WXXXK%YL +++?  $(KGT[[5GFF];]]H]]U[]]'	     s+   #E9 9
FFF98I2 2CM ?M r   c                 f    t           j                            t          | j        |                    S r   )r   r@   r   r   r  r  s      r\   r   z%SkipFunctionVariable.call_obj_hasattr3  s'     )00T1J1JKKKr[   c                 v    |t           v rt          j        | |          S t          || j        | j        |          S r   )r3   r   rF  r   r  r   r  s      r\   rG  z SkipFunctionVariable.var_getattr8  s9    ))),T4888b$*dk4@@@r[   c                     dS r   rZ   r   s    r\   r  z'SkipFunctionVariable.is_python_hashable>  r  r[   c                 *    t          | j                  S r   )r  r  r   s    r\   r  z$SkipFunctionVariable.get_python_hashA  s    DJr[   r  c                     t          |t                    o)|                                 |                                k    S r   )r   r>   r%  r  s     r\   r  z$SkipFunctionVariable.is_python_equalD  s:    uo.. H''))U-E-E-G-GG	
r[   r   )rW   rX   rY   r>   r  r   r  r~   r%  r  r   r  r   r   r   r@   r   rG  r  r  r  r  r  r  r  r  s   @r\   r  r  {  s        
	'N c 3:  PT      
C     )s )F )?U ) ) ) [)4L#L 'L S/)*	L
 
L L L L\L)L14L	L L L L
A5 AS A_ A A A AD             
V 
 
 
 
 
 
 
 
 
r[   r  c                   p     e Zd Zdedddeddf fdZdd	d
ee         dee	ef         def fdZ
ddZ xZS )WrappedSkipFunctionVariablerv  r  rG   r   r]   Nc                     |                     dd            |                     dd             t                      j        |j        fd|j        i| || _        || _        d S )Nr  r  )r   r  r~   r  r  rv  r  rx  s       r\   r~   z$WrappedSkipFunctionVariable.__init__L  sg     	

7D!!!

8T"""HHw~HHHHr[   r   rE   r   c                     | j                             |           t                                          |||          }| j                             |           |S r   rz  r}  s        r\   r   z)WrappedSkipFunctionVariable.call_functionX  r~  r[   r  rB   c                                            fd             j                                       t          dd                     d S )Nc                  $      j                   S r   r  r  s   r\   r  z9WrappedSkipFunctionVariable.reconstruct.<locals>.<lambda>d  r  r[   r9   Fr  r  s   ``r\   r  z'WrappedSkipFunctionVariable.reconstructc  r  r[   rA  )rW   rX   rY   r  r   r~   r   r>   r   r  r   r  r  r  s   @r\   r  r  K  s        
%
 +
 	

 

 
 
 
 
 
	#	 '	 S/)*		
 
	 	 	 	 	 	> > > > > > > >r[   r  c                        e Zd ZdZdedededdf fdZdd	d
edef fdZde	e         fdZ
dd	dee         deeef         defdZ xZS )WrapperUserFunctionVariablea3  
    Used to represent a wrapper object that contains the actual callable as an
    attribute. For example, torch.jit.script/trace have the original function at
    their _torchdynamo_inline attribute. Similarly, functions with
    __script_if_tracing_wrapper have the original attr at "__original_fn".
    wrapper_objattr_to_tracer   r]   Nc                 V     t                      j        di | || _        || _        d S r   )r  r~   r  r  )rz   r  r  r   r#  s       r\   r~   z$WrapperUserFunctionVariable.__init__q  s6    ""6"""&*r[   r   rE   r   c                     || j         k    rLt          | j        | j                   }| j        ot	          | j        |          }t          j        |||          S t                                          ||          S r   )	r  r   r  r   r(   r>   r   r  rG  )rz   r   r   r   r   r#  s        r\   rG  z'WrapperUserFunctionVariable.var_getattrv  sm    4%%%$*D,>??C[BZT%B%BF"(S&999ww""2t,,,r[   c                     g S r   rZ   r   s    r\   r   z%WrapperUserFunctionVariable.self_args~  r   r[   r   c           
         t          | j        d          rt          | j        | j        d           }t          |dd          pd}|                    dd          d         dk    r|                                }t          j                            |j	                  }|j
        }d	| d
| dd                    t          j        |g                     }	t          j        j                            |	           t          j        j        j                            d          }
|
                    t$          j                  rt          j        j                                        }t3                      |z   }|d         j	        |d         j
        f}d                    t          j        |                    }d|d          d
|d          d}|t5          |          z  }|
                    |           |                                 t;          |          z   }t=          j        t@          j!                  "                    || t=          j#        | j                  g||          S )N
cache_inforX   r  r  r9   )maxsplitr   r_   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   r  r   r  splitframe_summaryosr  basenamefilenamelinenor  	tracebackformat_listr_   rY  r`   r  logging	getLoggerisEnabledForDEBUG_guardsTracingContextextract_stackr   r  debugr   r   r   r  r   getattr_and_tracer   r@   )rz   r   r   r   	target_fnr  r  r  r  rw  dynamo_logger
user_stack	frame_locuser_stack_formatteduser_stack_traceall_argss                   r\   r   z)WrapperUserFunctionVariable.call_function  sK    4#\22 	: 0$2DdKKI!)\2>>D"K  q 11!4?? " 0 0 2 27++M,BCC&-I$,I I/5I I wwy4m_EEFFI I  #--c222 % 3 ; E Eo V V --gm<< :!&!=!K!K!M!MJ!7!9!9J!FJ!+B!8*R.:O PI+-7793H3T3T+U+U('rS\]^S_'r'rbklmbn'r'r'r$$,@(A(AA$!''(8999>>##d4jj0-'
 

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

 
,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
r[   r  c            
       P     e Zd ZdZdededededdf
 fdZdee         fd	Z	 xZ
S )
WrapperUserMethodVariablez
    Similar to WrapperUserFunctionVariable, but for methods. The only delta is
    saving the vt for `self` object of the method which is then used by
    WrapperUserFunctionVariable in `call_function` method.
    r  r  self_objr   r]   Nc                 L     t                      j        ||fi | || _        d S r   )r  r~   r  )rz   r  r  r2  r   r#  s        r\   r~   z"WrapperUserMethodVariable.__init__  s1     	m>>v>>>r[   c                     | j         gS r   r_  r   s    r\   r   z#WrapperUserMethodVariable.self_args  r`  r[   )rW   rX   rY   r   r   r  r>   r~   r   r   r  r  s   @r\   r1  r1    s           "	
  
     40        r[   r1  c                  R    t           j                                        rddlm}  | S i S )Nr   traceable_collective_remaps)r_   distributedis_available)torch.distributed._functional_collectivesr7  r6  s    r\   _traceable_collective_remapsr;    sD    %%'' +	
 	
 	
 	
 	
 	
 +*Ir[   c                     t           j                                        s
J d            |t                                                      v sJ |j        }|                     d          }t          ||          S )NzIllegal invocation.z)torch.distributed._functional_collectives)r_   r8  r9  r;  valuesrW   import_sourcer(   )r   r   
inner_namepath_sources       r\   _traceable_collectives_sourcerA    sw     ))++BB-BBB+-//66888888J""#NO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                      j        |fi | t          |t                    sJ || _        d S r   )r  r~   r   r  rD  )rz   r   rD  r   r#  s       r\   r~   z*CollectiveFunctionRewriteVariable.__init__  sI     	&&v&&&/+?@@@@@.r[   r   rE   old_fnr   optionsc                 x    t                               | |          \  }}t          |ft          |fd|i||d|S )Nr   )rD  r   )rC  r  r  )r   rF  r   rG  new_fn
new_sources         r\   r   z(CollectiveFunctionRewriteVariable.create  sb     ?FFr6RR
0
0VV
VgVV
 
 	
 
 	
r[   variablec                 J    t          j        |           o| t                      v S r   )r   
isfunctionr;  )rK  s    r\   can_rewritez-CollectiveFunctionRewriteVariable.can_rewrite 	  s(     x((WX9U9W9W-W	
r[   c                 N    t                      |         }|t          | |          fS r   )r;  rA  )r   r   rI  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 rN|d         
                                r4t          d| j         d|d|d| j         g t          j        	           | j        |j        |j        |j        fv rn|                    d
          }||j        n|j        d
         j        }||vrt+          d|           t,          j                            ||                   |d
<   | j                            |||          S )Nr   )REDUCE_OP_TO_STRrZ   async_opz)async_op=True for distributed collectivesz, args=	, kwargs=z3`torch.compile` doesn't support `async_op=True for r  opzUnsupported all_reduce op: )torch.distributedr8  r:  rQ  r   r^  r   r   r_  r`  r%  r$   r   SUPPORTABLE
all_reducereduce_scatter_tensor_reduce_scatter_baser   r  
parametersdefaultr<  r   r@   r   rD  r   )	rz   r   r   r   distrQ  r^  reduce_op_var	reduce_ops	            r\   r   z/CollectiveFunctionRewriteVariable.call_function	  s    	)(((((NNNNNN %dg..	nind5f55?@@F:$6$I$I$K$KC788d88v88[RVRY[[&2	    7O&%	
 
 
 #JJt,,M !, ##)$/7 
  000 !Jy!J!JKKK$5<< + F4L #11"dFCCCr[   )rW   rX   rY   r   r   r   r  r~   r  r   r   r  rN  r   r(   r  r   r>   r   r  r   r  r  s   @r\   rC  rC    s        	/S#X	/ .		/
 	/ 
	/ 	/ 	/ 	/ 	/ 	/ 
#
c"
 
 	

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

 A#A)1#s();A	sJ	A A A \A-D#-D '-D S/)*	-D
 
-D -D -D -D -D -D -D -Dr[   rC  c                   L     e Zd Zdddee         deeef         def fdZ xZS )FunctoolsWrapsVariabler   rE   r   r   r]   c                     |s;t                    dk    r(dt          dt          ffd}t          j        |          S t                                          ||          S )Nr9   r   r]   c                     t          | t          j                  r|                     d                   S t	          d|  dg t
          j                   d S )Nr   )r  zfunctools.wrapsz]`torch.compile` can't trace `functools.wraps` on functions defined outside the compile regionr  )r   r   r   cloner$   r   rV  )r   r   s    r\   r  z3FunctoolsWrapsVariable.call_function.<locals>.wrapsF	  sl    b)"FGG 888tAw8777-!G *6	     r[   )r   r   r>   r   LambdaVariabler  r   )rz   r   r   r   r  r#  s     `  r\   r   z$FunctoolsWrapsVariable.call_function>	  sw      	3#d))q..
# 
/ 
 
 
 
 
 
 +E222ww$$Rv666r[   )	rW   rX   rY   r   r>   r   r  r   r  r  s   @r\   r`  r`  =	  sr        7#7 '7 S/)*	7
 
7 7 7 7 7 7 7 7 7 7r[   r`  c                   N    e Zd ZdefdZdddee         deeef         defdZ	dS )	CollectionsNamedTupleFunctionr]   c                     | j         S r   r(  r   s    r\   r%  z0CollectionsNamedTupleFunction.as_python_constantX	  r)  r[   r   rE   r   r   c                    t          ||          }|r	  | j        d |D             i d |                                D             }n`# t          $ rS}t	          t          |          |t          t          t          j	        |j
                                       Y d }~nd }~ww xY wt          j        |t                                S t          dd|d|dg t          j        	           d S )
Nc                 6    g | ]}|                                 S rZ   rK  r   r  s     r\   rN  z?CollectionsNamedTupleFunction.call_function.<locals>.<listcomp>e	  $    ;;;a**,,;;;r[   c                 >    i | ]\  }}||                                 S rZ   rK  r   r   r   s      r\   r   z?CollectionsNamedTupleFunction.call_function.<locals>.<dictcomp>f	  *    LLLTQq!..00LLLr[   )r   r  znamedtuple constructionzargs=rS  z?`torch.compile` only support certain input types for namedtupler  )r1   r   r   r   r"   r  r   mapr@   r   r   r   UserDefinedClassVariabler=   r$   r   rV  )rz   r   r   r   constant_argsr  r$  s          r\   r   z+CollectionsNamedTupleFunction.call_function[	  sP    ,D&99 	
;;d;;;LLV\\^^LLL     (IIc"2"938DDEE         5.00   
 	-)t))))Y".		
 	
 	
 	
 	
 	
s   3A 
B%A	B  B%N)
rW   rX   rY   r   r%  r   r>   r   r  r   rZ   r[   r\   rf  rf  W	  sx        C    
#
 '
 S/)*	

 

 
 
 
 
 
r[   rf  c                   (    e Zd 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_hashNrf   r   keywordsr   r]   c                 
    t                      j        di | || _        t          |t                    sJ || _        t          |t                    sJ || _        t          j	        t                    | _        || _        d S r   )r  r~   rf   r   r   r   r   ru  r  partialr4   
fake_valuert  )rz   rf   r   ru  rt  r   r#  s         r\   r~   z!FunctoolsPartialVariable.__init__	  s     	""6"""	$%%%%%	(D)))))  $+H55#6   r[   c                     t           j        S r   )r  rw  r   s    r\   r-  z$FunctoolsPartialVariable.python_type	  s      r[   r  rB   c                 ^                        fd            | j                   | j        r                    | j                   | j        s:                    t          t          | j                  dz   d                     d S                     | j                                                   t          | j        
                                          }                                        t          |          t          | j                  z   dz   |d                     d S )Nc                  0                          dd          S )Nr  rw  r  r  s   r\   r  z6FunctoolsPartialVariable.reconstruct.<locals>.<lambda>	  s    g&>&>{I&V&V r[   r9   F)r  rf   r   foreachru  r  r   r   r=  r   keyscreate_call_function_kw)rz   r  r}  s    ` r\   r  z$FunctoolsPartialVariable.reconstruct	  s   VVVVWWW	9 	'OODI&&&} 	!!"6s49~~7I5"Q"QRRRF,,..///T]''))**++CIIDI,F,JDRWXX	
 	
 	
 	
 	
r[   c                 *    |                                  S r   rK  r   s    r\   r   z%FunctoolsPartialVariable.get_function	      &&(((r[   r   rE   c                 ~    | j         t          |          z   }i | j        |}| j                            |||          S r   )r   r   ru  rf   r   )rz   r   r   r   merged_argsmerged_kwargss         r\   r   z&FunctoolsPartialVariable.call_function	  sA     i$t**,34=3F3y&&r;FFFr[   r   c                     t           j                            t          t	          j        t                    |                    S r   )r   r@   r   r   r  rw  r4   r  s      r\   r   z)FunctoolsPartialVariable.call_obj_hasattr	  s7     )00I%h//66
 
 	
r[   c                 ~   | j         ot          | j         |          }|dk    r| j        S |dk    rt          j        | j        |          S |dk    r9d | j                                        D             }t          j        ||          S |t          v rt          j
        | |          S t          t          |           d S )Nrf   r   r  ru  c                 >    i | ]\  }}t          j        |          |S rZ   )r@   r   rm  s      r\   r   z8FunctoolsPartialVariable.var_getattr.<locals>.<dictcomp>	  s*    UUUtq!%,Q//UUUr[   )r   r(   rf   r   rK   r   ru  r   ConstDictVariabler3   rF  r"   r   )rz   r   r   r   r   s        r\   rG  z$FunctoolsPartialVariable.var_getattr	  s    >DK!>!>6>>96>>)$)FCCCC:UUt}?R?R?T?TUUUE.uVDDDD))),T4888 44444r[   c                     t          j        | j                                        gd | j        D             R i d | j                                        D             S )Nc                 6    g | ]}|                                 S rZ   rK  rL  s     r\   rN  z?FunctoolsPartialVariable.as_python_constant.<locals>.<listcomp>	  s$    <<<3c$$&&<<<r[   c                 >    i | ]\  }}||                                 S rZ   rK  rm  s      r\   r   z?FunctoolsPartialVariable.as_python_constant.<locals>.<dictcomp>	  s*    KKKTQq!&&((KKKr[   )r  rw  rf   r%  r   ru  r   r   s    r\   r%  z+FunctoolsPartialVariable.as_python_constant	  sq     I((**
<<$)<<<
 
 
 LKT]5H5H5J5JKKK
 
 	
r[   c                     t          j        | j                                        gd | j        D             R i d | j                                        D             }| j        | j        |_        |S )zcSimilar to as_python_constant(), but add ID_MATCH guards to try to force things to become constantsc                 6    g | ]}|                                 S rZ   guard_as_python_constant)r   r   s     r\   rN  zEFunctoolsPartialVariable.guard_as_python_constant.<locals>.<listcomp>	  s$    >>>qa((**>>>r[   c                 >    i | ]\  }}||                                 S rZ   r  rm  s      r\   r   zEFunctoolsPartialVariable.guard_as_python_constant.<locals>.<dictcomp>	  s*    QQQ41aq!,,..QQQr[   )	r  rw  rf   r  r   ru  r   rt  
cache_hashrz   r   s     r\   r  z1FunctoolsPartialVariable.guard_as_python_constant	  s    "I..00
>>DI>>>
 
 
 RQ4=;N;N;P;PQQQ
 
 #/ $ 8Fr[   c                     | j                                         oMt          d | j        D                       o/t          d | j                                        D                       S )Nc              3   >   K   | ]}|                                 V  d S r   r  rL  s     r\   r  z>FunctoolsPartialVariable.is_python_hashable.<locals>.<genexpr>	  s.      BBC**,,BBBBBBr[   c              3   >   K   | ]}|                                 V  d S r   r  r   r  s     r\   r  z>FunctoolsPartialVariable.is_python_hashable.<locals>.<genexpr>	  s.      SS5E,,..SSSSSSr[   )rf   r  r  r   ru  r=  r   s    r\   r  z+FunctoolsPartialVariable.is_python_hashable	  sh    I((** TBB	BBBBBTSSDM<P<P<R<RSSSSS	
r[   c                     | j                                         }d | j        D             }d | j                                        D             }t          |g||R           S )Nc              3   >   K   | ]}|                                 V  d S r   r  rL  s     r\   r  z;FunctoolsPartialVariable.get_python_hash.<locals>.<genexpr>	  s.      @@sS((**@@@@@@r[   c              3   >   K   | ]}|                                 V  d S r   r  r  s     r\   r  z;FunctoolsPartialVariable.get_python_hash.<locals>.<genexpr>	  s.      SS5u,,..SSSSSSr[   )rf   r  r   ru  r=  r  )rz   	func_hash	args_hashvalues_hashs       r\   r  z(FunctoolsPartialVariable.get_python_hash	  si    I--//	@@di@@@	SSDM<P<P<R<RSSSY99[99:::r[   r  c                 v   t          |t                    o| j                            |j                  ot	          d t          | j        |j                  D                       oTt	          d t          | j                                        |j                                                  D                       S )Nc              3   F   K   | ]\  }}|                     |          V  d S r   r  )r   arg_aarg_bs      r\   r  z;FunctoolsPartialVariable.is_python_equal.<locals>.<genexpr>	  sH        "UE %%e,,     r[   c              3   F   K   | ]\  }}|                     |          V  d S r   r  )r   value_avalue_bs      r\   r  z;FunctoolsPartialVariable.is_python_equal.<locals>.<genexpr>	  sH        &Wg ''00     r[   )	r   rs  rf   r  r  r   r   ru  r=  r  s     r\   r  z(FunctoolsPartialVariable.is_python_equal	  s    u677 	))%*55  &)$)UZ&@&@       *-M((**EN,A,A,C,C+ +    	
r[   r   rA  )rW   rX   rY   r>   r  r   r   r  r   r~   r  r-  r  r   r   r@   r   rG  r%  r  r  r  r  r  r  r  r  r  s   @r\   rs  rs  }	  s$       		'N $(7 77 '7 sO+,	7
 !7 7 
7 7 7 7 7 7(!T ! ! ! !
 
 
 
)c ) ) ) )G#G 'G S/)*	G
 
G G G G
)
14
	
 
 
 
55 5S 5_ 5 5 5 5
C 
 
 
 

# 
 
 
 

D 
 
 
 
; ; ; ; ;
V 
 
 
 
 
 
 
 
 
r[   rs  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   rZ   )r  s    r\   _get_polyfill_handlersz1PolyfilledFunctionVariable._get_polyfill_handlers
  s	     	r[   r  r   c                 t    t          |                    t          j                              | ||          S r  r  r  s      r\   r  z-PolyfilledFunctionVariable.create_with_source

  s8     	f''(BCCDDDs5((((r[   r   Nc                 v    t                      j        di | || _        |                                                     ||          }d }t          |          sJ d| d|             dD ]*}t          ||d           }|rt          |          sJ |} n+t          d| d          || _        || _	        d S )NzPolyfill handler z is not callable for )__torch_dynamo_polyfill____python_implementation__z# does not have a traceable functionrZ   )
r  r~   r   r  r   callabler   r]  r  r  )rz   r   r   handlerr  candidate_attr	candidater#  s          r\   r~   z#PolyfilledFunctionVariable.__init__
  s   ""6"""--//33B;;  XX"Xg"X"XTV"X"XXX 
 	 	N  >>I 	*****(
 PGPPP   " ,r[   c                     | j         S r   )r  r   s    r\   polyfill_fnz&PolyfilledFunctionVariable.polyfill_fn,
  s      r[   c                 .    t          | j        dd          S )N*__torch_dynamo_can_constant_fold_through__F)r   r  r   s    r\   can_constant_fold_throughz4PolyfilledFunctionVariable.can_constant_fold_through0
  s    OI5
 
 	
r[   c                 *    |                                  S r   rK  r   s    r\   r   z'PolyfilledFunctionVariable.get_function5
  r  r[   r   rE   r   c                 N   |                                  rXt          ||          rH | j        d |D             i d |                                D             }t	          j        ||          S | j        t          j        u rt          |          dk    r|st          |d         t          j        t          j        f          rt          d |d         j        D                       rt          j                            ||j                            dt$          j        t)          d |d         j        D                       fi           t%          j        d |d         j        D                       	          S t	          j        || j                  }|                    |||          S )
Nc                 6    g | ]}|                                 S rZ   rK  rj  s     r\   rN  z<PolyfilledFunctionVariable.call_function.<locals>.<listcomp>C
  rk  r[   c                 >    i | ]\  }}||                                 S rZ   rK  rm  s      r\   r   z<PolyfilledFunctionVariable.call_function.<locals>.<dictcomp>D
  rn  r[   r9   r   c              3      K   | ]t}|                                 r't          |                                t                    p4t          |t          j                  o|                                t          u V  ud S r   )r  r   r%  r  r   SymNodeVariabler-  rj  s     r\   r  z;PolyfilledFunctionVariable.call_function.<locals>.<genexpr>O
  s          %%''SJq7K7K7M7Ms,S,S Yq)";<<WTWAW     r[   r   c              3   >   K   | ]}|                                 V  d S r   as_proxy)r   as     r\   r  z;PolyfilledFunctionVariable.call_function.<locals>.<genexpr>Z
  s*      ??A1::<<??????r[   c                 l    g | ]1}|                                 r|                                n|j        2S rZ   )r  r%  sym_numrj  s     r\   rN  z<PolyfilledFunctionVariable.call_function.<locals>.<listcomp>^
  sQ          !3355+A00222!"	  r[   )r  )r  r2   r   r   r>   r   builtinssumr   r   r   rK   TupleVariabler  r  r   r   create_proxyr_   sym_sumr   r  r   )rz   r   r   r   r   traceable_function_variables         r\   r   z(PolyfilledFunctionVariable.call_function8
  s    ))++ 		50M&1
 1
 		5 ;;d;;;LLV\\^^LLL   #(V444 Gx|##D		Q 47Y%;Y=T$UVV     a      ,33	&&#M??a?????A	    "&a  	 	 4   ( '6&;B@Q&R&R#*88T6JJJr[   r   c                 J   |dk    r|                      |||          S t          | j        |d           }|s*t          |          st	          |d| d| j                    i }| j        rt          | j        |          |d<   t          |fi |}|                     |||          S )N__call__zCannot find callable z in r   )r   r   r   r5   r<   r   r(   r  )rz   r   r   r   r   methodrG  polyfilled_method_variables           r\   r  z&PolyfilledFunctionVariable.call_methodl
  s     :%%b$777$-- 	R+f-- 	R %PT%P%Ptw%P%PQQQ; 	> *4; = =GH%?%R%R'%R%R")77D&IIIr[   c                     | j         S r   r(  r   s    r\   r%  z-PolyfilledFunctionVariable.as_python_constant
  r)  r[   )rW   rX   rY   r>   r  r  r  cacher   r   r   r   r   r  r   r  rM   r~   propertyr  r  r  r   r   r  r   r   r  r%  r  r  s   @r\   r  r  	  s        
	'	N _tHS#X,>@R,R'S    _ [ ))!')	%) ) ) [)-2 - - - - - - - -4 !Xc3h/ ! ! ! X!
4 
 
 
 

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


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

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

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

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

 $G
 
&G
 G
 G
 G
 G
 G
r[   r  c            
            e Zd ZU ded<   ded<   edz  ed<   d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e         d	e	e
ef         d
ef
 fdZded
efdZ xZS )r  rH   r  rI   r
  Nr  r(   r  r   r]   c                     |                     dd           | _         t                      j        di | t                              | |||           d S )Nr  rZ   )r   r  r  r~    dynamo_triton_hopifier_singletoninit_variable)rz   r
  r  r  r   r#  s        r\   r~   zTritonKernelVariable.__init__n  sY     $ZZ>>""6"""(66tVZQUVVVVVr[   r   rE   r   c                 <    t                               | |||          S r   )r(  call_triton_kernelr   s       r\   r   z"TritonKernelVariable.call_functionu  s%     0BB$
 
 	
r[   r   c                     |dk    rt                               | |          S |dk    rt                               | |||          S t                                          ||||          S )N__getitem__run)r(  r  call_runr  r  r  s        r\   r  z TritonKernelVariable.call_method  sj     =  3@@tLLLU]]3<<T4QSTTT ww""2tT6:::r[   rM  c                     ddl m} ddlm} t	          ||          r" |j        |                                          S |S )Nr9   )r@   )r  )rf  r@   tensorr  r   r   evaluate_expr)rz   rM  r@   r  s       r\   specialize_symbolicz(TritonKernelVariable.specialize_symbolic  s`    ......++++++ c?++ 	@*#*3+<+<+>+>???
r[   )rW   rX   rY   r   r  r   r~   r   r>   r   r  r   r   r  r3  r  r  s   @r\   r  r  h  sr        
d
WW'*TzW9<WHKW	W W W W W W
#
 '
 S/)*	

 

 
 
 
;#; ; ?#	;
 S/)*; 
; ; ; ; ; ;s s        r[   r  c                   p     e Zd Zdddee         dee         dededdf fd	Zdefd
ZddZdefdZ	 xZ
S )r  data_ptrzvariables.DataPtrVariabledims
block_dimselement_sizer   r]   Nc                     t          |t          j                  sJ  t                      j        di | || _        || _        || _        || _        d S r   )	r   r   DataPtrVariabler  r~   r5  r6  r7  r8  )rz   r5  r6  r7  r8  r   r#  s         r\   r~   z*TMADescriptorExperimentalVariable.__init__  s^     (I$=>>>>>""6""" 	$(r[   c                     t          d | j        D             d | j        D             | j                                                  S )Nc                 6    g | ]}|                                 S rZ   r  r   dims     r\   rN  zATMADescriptorExperimentalVariable.to_metadata.<locals>.<listcomp>  s     111S\\^^111r[   c                 6    g | ]}|                                 S rZ   r  r=  s     r\   rN  zATMADescriptorExperimentalVariable.to_metadata.<locals>.<listcomp>  s     777S\\^^777r[   )r  r6  r7  r8  r  r   s    r\   r  z-TMADescriptorExperimentalVariable.to_metadata  sL    /11ty11177t777&&((
 
 	
r[   r  rB   c                                           fd            j                                       g  j         j         j        }                    |                               t          |          dz   d           d S )Nc                  \                          ddt          j                   d          S )Nz$triton.tools.experimental_descriptorcreate_d_tma_descriptor)r  r   r6  r  s   r\   r  z?TMADescriptorExperimentalVariable.reconstruct.<locals>.<lambda>  s0    G,,6:#di..:::  r[   r9   F)	r  r5  r  r6  r7  r8  r|  r   r   )rz   r  r   s   `` r\   r  z-TMADescriptorExperimentalVariable.reconstruct  s        	
 	
 	
 	!!'***@@T_@d.?@c$ii!mU33333r[   c                     | j         j        S r   )r5  from_tensorr   s    r\   r  z,TMADescriptorExperimentalVariable.get_tensor  s    }((r[   rA  )rW   rX   rY   r   r>   r   r~   r  r  r  r  r  s   @r\   r  r    s        )-) ?#) )	)
 &) ) 
) ) ) ) ) )
S 
 
 
 

4 
4 
4 
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  r1  rL   block_shaperK   r   r]   Nc                     |                                 sJ  t                      j        di | || _        || _        d S r   )r  r  r~   r1  rG  )rz   r1  rG  r   r#  s       r\   r~   z$TMADescriptorStableVariable.__init__  sO     !!!!!""6"""&r[   c                 N    t          | j                                                  S r   )r  rG  r  r   s    r\   r  z'TMADescriptorStableVariable.to_metadata  s&    )%%''
 
 	
r[   r  rB   c                                          fd                               d           | j                                        | j                                       d           d S )Nc                  0                          dd          S )Nztriton.tools.tensor_descriptorTensorDescriptorr  r  s   r\   r  z9TMADescriptorStableVariable.reconstruct.<locals>.<lambda>  s    G,,0"  r[   rE  r   )r  load_methodr1  r  rG  r  r  s    `r\   r  z'TMADescriptorStableVariable.reconstruct  s       	
 	
 	
 	M***((( !!!Ar[   c                     | j         S r   )r1  r   s    r\   r  z&TMADescriptorStableVariable.get_tensor  s
    {r[   rA  )	rW   rX   rY   r   r~   r  r  r  r  r  s   @r\   r  r    s        	' 	' $	' 		'
 
	' 	' 	' 	' 	' 	'
S 
 
 
 


 
 
 
C        r[   r  c                   `     e Zd Zdededdf fdZdddee         dee	ef         defd	Z
 xZS )
'CreateTMADescriptorExperimentalVariablerankr   r]   Nc                 T    |dv sJ  t                      j        di | || _        d S )N)r9   r   rZ   )r  r~   rQ  )rz   rQ  r   r#  s      r\   r~   z0CreateTMADescriptorExperimentalVariable.__init__  s:    
 v~~~~""6"""			r[   r   rE   r   c                    d|v r|d         n|d         }t          |t          j                  s,t          dd| d| d| j         dd| j         d	g
           | j        dk    r~t          |          t          |          z   dk    r0t          |dt          |          t          |          z               d|v r|d         n|d         g}d|v r|d         n|d         g}nt          |          t          |          z   dk    r0t          |dt          |          t          |          z               d|v r|d         n|d         d|v r|d         n|d         g}d|v r|d         n|d         d|v r|d         n|d         g}d|v r|d         n|d         }t          |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.r  r9   rO   z6TMA metadata rank=1 requires exactly 4 arguments, got r>  	block_dimr      z6TMA metadata rank=2 requires exactly 6 arguments, got dim1dim0
block_dim1r  
block_dim0r8  r  )r5  r6  r7  r8  )r   r   r:  r$   rQ  r   r<   r  )rz   r   r   r   rT  r6  r7  r8  s           r\   r   z5CreateTMADescriptorExperimentalVariable.call_function  sk     %fUmmDG#y899 	H;$;;6;;_$) _ _ _/#y/ / /    9>>4yy3v;;&!++$fSQUYYY\]cYdYdMdff  
 "'&ud1gD (3f'<'<{##$q'JJ 4yy3v;;&!++$fSQUYYY\]cYdYdMdff  
 #)F"2"2vQ"(F"2"2vQD
 )5(>(>|$$DG(4(>(>|$$DGJ 2@61I1Ivn--tTVx #y8999990!%	
 
 
 	
r[   )rW   rX   rY   r  r   r~   r   r>   r   r  r   r  r  s   @r\   rP  rP    s          
	     :
#:
 ':
 S/)*	:

 
:
 :
 :
 :
 :
 :
 :
 :
r[   rP  c                   B    e Zd Zdddee         deeef         defdZdS )!CreateTMADescriptorStableVariabler   rE   r   r   r]   c                 t    d|v r|d         n|d         }d|v r|d         n|d         }t          ||          S )Nr1  r   rG  r9   )r1  rG  )r  )rz   r   r   r   r1  rG  s         r\   r   z/CreateTMADescriptorStableVariable.call_function(  s\     &.%7%7!!T!W/</F/Ff]++DQRG*#
 
 
 	
r[   N)rW   rX   rY   r   r>   r   r  r   rZ   r[   r\   r\  r\  '  s]        
#
 '
 S/)*	

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

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

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

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

-TFB
'
' 	 .3K/466
 
 

 "--b.=/SUVV&39}555r[   r  r  s   @r\   re  re  \  s|         $6#$6 '$6 S/)*	$6
 
$6 $6 $6 $6 $6 $6 $6 $6 $6 $6r[   re  c                   d     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    d} t                      j        |fd|i| d S )Nz8sparse tensor creation is not supported in torch.compiler  r  r~   rz   r  r   r  r#  s       r\   r~   z)SparseTensorCreationSkipVariable.__init__  s2    K88v888888r[   r   rE   r   c                     ddl m} t          | j        dt	          | j                            }t          dd| d| dg |j                   d S )	Nr   )r   rW   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.r  )r  r   r   r  r  r$   SPARSE_TENSOR)rz   r   r   r   r   rx  s         r\   r   z.SparseTensorCreationSkipVariable.call_function  s     	)((((($*j#dj//BB:***kX_ k k k 5%34	
 	
 	
 	
 	
 	
r[   rW   rX   rY   r   r   r~   r   r>   r   r  r   r  r  s   @r\   rm  rm             9c 9S 9T 9 9 9 9 9 9
#
 '
 S/)*	

 

 
 
 
 
 
 
 
r[   rm  c                   d     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 )TritonSetAllocatorSkipVariablezm
    Skip variable for triton.set_allocator with a clear message to move it outside the compiled region.
    r  r   r]   Nc                 D    d} t                      j        |fd|i| d S )Nz:triton.set_allocator is not supported inside torch.compiler  ro  rp  s       r\   r~   z'TritonSetAllocatorSkipVariable.__init__  s2    M88v888888r[   r   rE   r   c                 .    t          ddddg           d S )Nz"triton.set_allocator not supportedz2triton.set_allocator called inside compiled regionz{triton.set_allocator is not supported inside torch.compile. It modifies global Triton allocator state and cannot be traced.zgMove triton.set_allocator() outside of the torch.compile region (call it before the compiled function).r  r  r   s       r\   r   z,TritonSetAllocatorSkipVariable.call_function  s;     	8HR:	
 	
 	
 	
 	
 	
r[   rs  r  s   @r\   rv  rv    rt  r[   rv  r   )r   r  r  r   r   r   r  r  r  r   ra  r   collections.abcr   r   r   r   typingr   r	   r
   r   r   r   typing_extensionsr   weakrefr   r_   torch._dynamo.excr   torch._guardsr   torch.utils._pytreer   r  r   r   r   r   bytecode_transformationr   r   r   r$  r   r   r   r   r   r    r!   r"   r#   r$   r%   guardsr&   r'   r   r(   r)   r*   r+   r,   r-   r.   r/   r0   r`   r1   r2   r3   r4   r5   r6   r7   r8   r  r:   r;   r<   r=   r>   rf  r?   r@   #torch.distributed.fsdp._fully_shardrA   ModuleNotFoundErrortorch._dynamo.codegenrB   r  rC   rD   rE   rF   #torch._dynamo.variables.ctx_managerrG   r  rH   rI   r  rJ   rK   r1  rL   rM   rv   rx   r  r}  r  r  rT   r   r   rV   	lru_cacherc   re   r   r   r  r   r   r   r  r   r   r  r   r   r   r   r  r  r  r  r  rD  rF  rU  r3  ru  r  rh  r   r  r  r  r  r1  r;  rA  rC  r`  rf  rs  r  r  r  r  r  r  r  r(  r  r  r  rP  r\  r_  re  rm  rv  rZ   r[   r\   <module>r     s    .            				 



      " " " " " " . . . . . . . . ( ( ( ( ( ( ( ( G G G G G G G G G G G G G G G G # # # # # # % % % % % %  4 4 4 4 4 4             3 3 3 3 3 3 > > > > > > > > > > > > V V V V V V V V V V                          1 0 0 0 0 0 0 0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	              ? > > > > > > >EEEEEEE     '//////            LKKKKK       
 65555555&&&&&& WT#s(+,,,
&Y'O'O'OPP "+)YK"8"8  D  ,=+<+>+>sCx( > > >	 	 	 	 	0 	 	 	 :    
 
 
 
 
 
 
 
>L \    U
UU }U 3-	U
 cNU 
#
U U U Ur DHA AA&)A39D=AA A A A.0 .$sCx. .T . . . . # o%&  .  
	       *
.CH~  FCK 4'	
 8_t# S#X% c3h$&    4   --%+-5;d]-JM-- - - -62 2 2 2 2 2 2 2jWY WY WY WY WY3 WY WY WYt!7 !7 !7 !7 !73 !7 !7 !7H) ) ) ) )": ) ) )X: : : : :4 : : :@G; G; G; G; G;? G; G; G;T

 
 
 
 
 
 
 
M
 M
 M
 M
 M
%= M
 M
 M
`         "     Fq- q- q- q- q-- q- q- q-h> > > > > 2 > > ><> > > > >"6 > > >:c  ?
#	
 o%&    ,G) G) G) G) G)!9 G) G) G)T*> *> *> *> *>(B *> *> *>ZM
 M
 M
 M
 M
? M
 M
 M
`> > > > >"6 > > ><D
 D
 D
 D
 D
/ D
 D
 D
N     ;   *d38n    //%-c3h%7// / / /_D _D _D _D _D(< _D _D _DD7 7 7 7 71 7 7 74#
 #
 #
 #
 #
$8 #
 #
 #
L}
 }
 }
 }
 }
 }
 }
 }
@D D D D D D D DN "  "  "  "  "/  "  "  "F           s
 s
 s
 s
 s
> s
 s
 s
l $8#7#9#9  - - - - -? - - -`$) $) $) $) $) $) $) $)N    /   BD
 D
 D
 D
 D
o D
 D
 D
N
 
 
 
 
 
 
 
 "J "J "J "J "J(< "J "J "JJ46 46 46 46 46'; 46 46 46n
 
 
 
 
'; 
 
 
:
 
 
 
 
%9 
 
 
 
 
s   )C0 0C:9C: