
    ɯwg                       U d dl m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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Zd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dlmZ d dl
mZ d dlm Z  d dlm!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 d dl5m6Z6m7Z7 d dl8Z8d dl9Z8d dl:m;c m<Z= d dl>Z8d dl?m@c mAZB d d	l8mCZC d d
lDmEZEmFZFmGZGmHZHmIZI d dlJmKZK d dlLmMZMmNZN d dlOmPZP d dlQmRZRmSZS d dlTmUZUmVZV d dlWmXZX d dlYmZZZm[Z[ d dl\m]Z] 	 d dl^Z_	 d dlaZ8d dlbmcZd d dlLmeZe d dlamfZf ddlgm<Z< e_rpe_e_j                  e_j                  e_j                  fZkdeld<   e_ede_j                  edj                  e_j                  edj                  e_j                  edj                  iZmndZki Zmd dlnmoZompZpmqZq  e2d      Zse8j                  j                  j                  Zw ej                  ejJ                        Zydeld<   i Zzdeld<   d Z{d!Z|d"e| d#Z} ej                  e      Zi Zd$eld%<    ej                  d&       Zd'eld(<    ej                         Z	 	 	 	 	 	 dd)Zd add*Zdd+Zd add,Zdd-Zdd.Zdd/Zdd0Ze	 	 d	 	 	 	 	 dd2       Ze.d	d
d4       Ze.	 d		 	 	 	 	 dd5       Zddd6Zej"                  dd7       Ze8j&                  e8j(                  e8j*                  fe8j,                  e8j.                  e8j0                  fe8j2                  e8j4                  e8j6                  fe8j8                  e8j:                  fe8j<                  e8j>                  fe8j@                  e8jB                  fe8jD                  e8jF                  e8jH                  fe8jJ                  e8jL                  e8jN                  fe8jP                  e8jR                  e8jT                  fe8jV                  e8jX                  fi
Z G d8 d9      Z e       Zd: Zdd;Zd< Zd= Zdd>Zdd?Zdd@ZdA ZdB ZdC Z G dD dE      Ze.ddF       Ze.	 	 	 	 	 	 ddG       Ze.ddH       ZdI Zejx                  dJk\  rIejz                  ej|                  ej~                  ejd                  ej                  ej                  fZdK ZdL ZdM ZdN ZdO ZdP ZdQ ZdR ZdS ZdT ZdU ZdV Z e
j>                  dW      dX        ZϐddYZdZ Zej                   G d[ d\             Zej                   G d] d^             Zd_Z ej                  eլ`      adaeldb<   	 	 ddcZؐdddZِddeZڐddfZ G dg dh      Zdadieldj<   ddkZej                   G dl dm             Z G dn doe      Z e       e_        dp ZddqdrZds ZddtZedu        Zdv Zd	dwZdx Zdy Zdz Z e
j>                  d      d{        Zd| Zdd}Zd~ Z ed      d        Zeeeeee ed      ej                  ej                  e8j                  e8j                  e8j                  e8j                  hZdeld<    e[       r,d dlZej                  ej                  j                         	 d Z d Zd Zd Zd Zd Zd Z ei j                               Zdeld<    ei j                               Z
deld<    e ej                         j                               Zdeld<    e ed            Zdeld<   ej                  Zej$                  Zd Zd Zd ZeZd Zd Zd Zd Zd Zd	dZd Zd Z ddZ!ddZ"dZ#d dl$m%Z% d Z&d Z'd Z(d Z)dd3dd3d1d3d3ejT                  d3f	dZ+d Z,ej:                  d        Z- e       Z. ej                  e/      Z0deld<   g Z1deld<    e       Z2 e
j>                  d      d        Z3d Z4ddZ5d Z6d Z7d	dZ8 ejr                         Z:d Z;ed        Z<d Z=d Z>d Z?ddZ@d ZAddZBddZCddZDd	d dZE G d de	j                        ZGd!dZH	 	 	 	 	 	 	 	 d"dZId ZJd ZKddgZLddgZMg dǢZNeLeMz   eNz   ZOdȄ ZP	 	 	 d#dɄZQ	 	 	 d#dʄZRd˄ ZSd̄ ZT G d̈́ dΫ      ZUdτ ZV G dЄ dѫ      ZW G d҄ dӫ      ZXdԄ ZYdՄ ZZdք Z[dׄ Z\d$d؄Z]ej                   G dل dګ             Z^d%dۄZ_d&d܄Z`d݄ Zadބ Zbd߄ Zcd Zdd'dZed Zfd Zgd Zhej:                  d(d       Zid Zjd Zk G d de8j                  j                        Zld)dZmd Znd Zo G d d      Zp eq       Zrdeld<   ddZsd Ztej:                  d        Zud ZvddZwd Zxd Zyd Zzd Z{d Z|i Z}deld<   d Z~d Z G d d       Zy# e`$ r dZ_Y 	Aw xY w# er$ r Y w xY w(*      )annotationsN)contextmanager)is_dataclass)	lru_cache)MethodWrapperType)AnyCallablecastClassVarCounterDefaultDictDequeDictIterableIteratorKeysViewListOptionaloverloadSetTupleTypeTypeVarUnion
ValuesView)Literal	TypeGuard)fx)_get_function_stack_at_instruction_counter_len_torch_function_stack_pop_torch_function_stack_push_on_torch_function_stack)enable_python_dispatcher)SourceTracingContext)is_sparse_compressed)log_chromium_event_internallog_compilation_event)_format_graph_codelazy_format_graph_code)LazyModuleMixin)
has_tritonhas_triton_package)RemovableHandle)detect_fake_mode
LazyString   )configzTuple[types.ModuleType, ...]NP_SUPPORTED_MODULES )
FakeTensoris_fakemaybe_get_fake_modeTzDefaultDict[str, Counter[str]]countersDict[str, Any]optimus_scuba_logzAhttps://pytorch.org/docs/main/torch.compiler_troubleshooting.htmlz;https://pytorch.org/docs/main/torch.compiler_nn_module.htmlzSee z& for more information and limitations.zDict[str, List[float]]compilation_time_metricsc                 4    t        j                  t              S N)collectionsdefaultdictfloatr6       X/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/torch/_dynamo/utils.py<lambda>rF      s    K##E* rD   zDict[str, Dict[str, float]]frame_phase_timingc                    	 dd l }|j                  | |      S # t        $ r0 dj                  d t        j                  |g|       D              cY S w xY w)Nr   headers
c              3  Z   K   | ]#  }d j                  t        t        |             % yw), N)joinmapstr).0rows     rE   	<genexpr>ztabulate.<locals>.<genexpr>   s$      
),DIIc#sm$
s   )+)tabulateImportErrorrN   	itertoolschain)rowsrJ   rT   s      rE   rT   rT      sZ    
  w 77 
yy 
09	40P
 
 	

s    6AAc                     t         dz   a y Nr3   )
curr_framer6   rD   rE   increment_framer\      s    aJrD   c                 X    t         j                          t        j                          day Nr   )rG   clearr>   r[   r6   rD   rE   reset_frame_countr`      s    ""$JrD   c                    t         | z  a y r@   )op_count)cnts    rE   increment_op_countrd      s    OHrD   c            	         d} i }t         j                         D ]V  }| |j                  d|j                  dd            z  } |j                         D ]  \  }}||vr|||<   ||xx   |z  cc<    X |r| |d<   |S )Ng        entire_frame_compileinductor_compiler   total_wall_time)rG   valuesgetitems)rh   total_by_keytimingskeytimings        rE   calculate_time_spentrp      s    OL%,,. 	,7;;"GKK0BA$F
 	
 #==? 	,KC,&$*S!S!V+!		,	, *9&'rD   c            	         t               } d}| j                         D ]  \  }}| d| dt        |d       } t        |       y )NzTIMING: :   )rp   rk   roundprint)rl   outrn   values       rE   print_time_reportry      sQ    ')L
C"((* /
UQse1U5!_-./ 
#JrD   c                ,    t         |    |xx   |z  cc<   y r@   )rG   )rn   
phase_name
time_spents      rE   _add_time_spentr}      s    sJ':5'rD   c                 N    t         d   d   t         d   d   t         d   d   d} | S )zMGet a bunch of metadata about cache hits and misses to use in chromium eventsinductorfxgraph_cache_hitfxgraph_cache_missfxgraph_cache_bypass)r   r   r   )r;   )cache_statss    rE   get_cache_statsr      s=     &j12EF&z23GH ( 45K LK
 rD   Tc           	   #    K   t               }| t        vr	g t        | <   d }d }t        d      }t        j                         }	 t
        j                  j                  |  d      5  t        j                         }|j                  | |d        |r|j                  ||       d  t        j                         |z
  }d d d        t        |    j                  |       	 |r0|j                  |t        j                         dt               i|       |j                  | t        j                         dt               i|       |r<t        t              }
|r|t!        |
||       y t
        j"                  j$                  j'                         t        t
        j"                  j$                  j)                         j*                        }d|v sd|v r|t!        |
||       y d|v rt        t
        j"                  j,                  j/                               }|t!        |||       |dk(  rT|3t0        |   j)                  dd       }t0        |   j)                  dd       }nd }d }t3        |||||      }t5        |       y y y y y # 1 sw Y   xY w# t        $ r%}	t        t        |	            }t        |	      } d }	~	ww xY w# |r0|j                  |t        j                         dt               i|       |j                  | t        j                         dt               i|       |r<t        t              }
|r|t!        |
||       w t
        j"                  j$                  j'                         t        t
        j"                  j$                  j)                         j*                        }d|v sd|v r|t!        |
||       w d|v rt        t
        j"                  j,                  j/                               }|t!        |||       |dk(  rT|3t0        |   j)                  dd       }t0        |   j)                  dd       }nd }d }t3        |||||      }t5        |       w w w w w xY ww)	Nz-infz (dynamo_timed)r   forward	inferencebackwardrg   code_gen)get_chromium_event_loggerr>   rC   timetime_nstorchprofilerrecord_functionlog_event_startappend	ExceptionrP   typelog_event_endr   r[   r}   _guardsr&   try_getrj   aot_graph_nameCompileContextcurrent_compile_idrG   BwdCompilationMetricsrecord_compilation_metrics)rn   r{   fwd_onlychromium_log	fail_typefail_reasonr|   startt0e	frame_keyr   
compile_idinductor_compile_timecode_gen_timemetricss                   rE   dynamo_timedr     sJ     )B(CL
**(* %#I!%KvJLLNEG@^^++se?,CD 	*B((eT:,,Z?r)J	* 	!%,,Z8 && 12	 	""-1B!CU	
 JI I-	:zB
 ==//779E%(4488:II&N "^3{n7T#+'	:zJ#~5%(!MM88KKM&
 %,+J
JO &);;(08J$.9""%#&8$"? !6 1C:0N0R0R$.1" 9= 504&; * 5 - ) +'G 7w?% < 6 F 3	* 	*  QL	!f && 12	 	""-1B!CU	
 JI I-	:zB
 ==//779E%(4488:II&N "^3{n7T#+'	:zJ#~5%(!MM88KKM&
 %,+J
JO &);;(08J$.9""%#&8$"? !6 1C:0N0R0R$.1" 9= 504&; * 5 - ) +'G 7w?% < 6 F sP   ?Q""J $AI>; J F"Q">JJ 	J9 J44J99J< <F#QQ"Fc                     y r@   r6   repr	aggregates     rE   compile_timesr   \      rD   c                     y r@   r6   r   s     rE   r   r   a       rD   c                F   d ffd	}| dk(  r9t         D cg c]  }| |t         |   d       f }}d}|t        |d      z  }|S | d	k(  rKt         j                         D cg c]  } ||d
        }}t        t         j	                               }||fS yc c}w c c}w )a  
    Get metrics about torchdynamo frontend/backend compilation times.

    Accumulates information from functions tagged with `dynamo_timed`.

    repr='str' returns a printable string for user interaction, and 'csv'
    returns headers, rows which can be logged for output

    aggregate causes values from multiple compilations (e.g. split graphs)
    to be accumulated into one value.  If false, expect more than one value
    per metric.
    c                    | S r@   r6   xs    rE   rF   zcompile_times.<locals>.<lambda>v  s     rD   c                `    r |t        |             S dj                  t        ||             S )NrM   )sumrN   rO   )ri   item_fnr   s     rE   fmt_fnzcompile_times.<locals>.fmt_fnv  s+    3v;''yyWf-..rD   rP   c                
    | dS )Nz.4fr6   r   s    rE   rF   zcompile_times.<locals>.<lambda>}  s
    3 rD   )r   z!TorchDynamo compilation metrics:
)FunctionzRuntimes (s)rI   csvc                
    | dS )Nz.6fr6   r   s    rE   rF   zcompile_times.<locals>.<lambda>  s
    1S' rD   N)r>   rT   ri   listkeys)	r   r   r   krX   rw   vri   rJ   s	    `       rE   r   r   h  s      + /
 u} .
 /2<PQR
 
 3x&BCC
	 .446
 123
 
 /4467

s   B#Bc                 D    t         j                  t        dd             y )NrP   Tr   )loginfor   r6   rD   rE   dump_compile_timesr     s    HH]67rD   c                  $    e Zd ZdddZd ZddZy)DuplicateWarningCheckerc                2    || _         | j                          y r@   )maxsizereset)selfr   s     rE   __init__z DuplicateWarningChecker.__init__  s    

rD   c                6    t        j                         | _        y r@   )rA   OrderedDictsetr   s    rE   r   zDuplicateWarningChecker.reset  s    **,rD   c                ^   || j                   v r/| j                   j                  |d       t        j                  syyd | j                   |<   t	        | j                         | j
                  kD  r?| j                   j                  d       t	        | j                         | j
                  kD  r?y)NT)lastF)r   move_to_endr4   verboselenr   popitemr   rn   s     rE   addzDuplicateWarningChecker.add  s    $((?HH  4 0>>
  !DHHSMdhh-$,,.  e , dhh-$,,.rD   N)   )r   intreturnNone)rn   z!Union[str, Tuple[object, object]]r   bool)__name__
__module____qualname__r   r   r   r6   rD   rE   r   r     s    -	rD   r   c                     t         j                  j                  dd      dk(  } | r
t               S t	        j
                         S )NTORCH_COMPILE_DEBUG01)osenvironrj   add_file_handler
contextlib	ExitStack)compile_debugs    rE   setup_compile_debugr     s7    JJNN#8#>#EM!!!!rD   c                 ,    t         j                          y r@   )graph_break_dup_warning_checkerr   r6   rD   rE   reset_graph_break_dup_checkerr     s    #))+rD   c                    t         j                  j                  t               d      } t        j                  | d       t        j                  t         j                  j                  | d            t        j                  d      j                         t        j                         }|j                  fd       |S )NtorchdynamoTexist_okz	debug.logztorch._dynamoc                 &    j                         S r@   removeHandlerlog_file_handlerloggers   rE   rF   z"add_file_handler.<locals>.<lambda>  s    v334DE rD   )r   pathrN   get_debug_dirmakedirsloggingFileHandler	getLogger
addHandlerr   r   callback)log_path	exitstackr   r   s     @@rE   r   r     s    ww||MO];HKK4(**277<<++NO/F
&'$$&IEFrD   c                 B   t        j                         } t        j                  xt	        j
                  t        j                        t        j                  j                  j                         D ](  j                         | j                  fd       * | S | S )Nc                 &    j                         S r@   r   r   s   rE   rF   z setup_log_file.<locals>.<lambda>  s    v';';<L'M rD   )r   r   r4   log_file_namer   r   r   _logging	_internalget_loggersr   r   )r  r   r   s    @@rE   setup_log_filer    s    $$&I'"..v/C/CDnn..::< 	OF./MN	O rD   c                |    t                d|j                   dt        |       j                   d|j                   dS )Nz/error_recordings/_z.rec)r   co_namer   r   co_firstlineno)exccodes     rE   gen_record_file_namer    sB    o aS	""#1T%8%8$9? ?rD   c                   	 t         j                  j                  |       rt        j	                  d|        y t        j
                  t         j                  j                  |       d       t        | d      5 }|j                  |       d d d        y # 1 sw Y   y xY w# t        $ r t        j                  d|        Y y w xY w)Nz9Unable to write execution record %s; file already exists.Tr   wbz#Unable to write execution record %s)r   r   existsr   warningr   dirnameopendumpr   	exception)filenameexec_recordfs      rE   write_record_to_filer    s    
G77>>(#KKKX KK1DAh% $  #$ $ $ G;XFGs5   5B A B 8B
B BB B C Cc                T    d}| j                   D ]  }d|j                  v s|dz  } |S )Nr   callr3   )nodesop)gcns      rE   count_callsr#    s5    	AWW QTT>FA HrD   c                    | S r@   r6   r   s    rE   identityr%    s    HrD   c                N    	 t        |        y# t        $ r Y yt        $ r Y yw xY w)NTF)hash	TypeError
ValueErrorr   s    rE   hashabler*    s.    Q  s    	$$$c                      y r@   r6   argskwargss     rE   nothingr/    s    rD   c                  <    e Zd ZdZd Zd Zd
dZd Zd Zd Z	d	 Z
y)ExactWeakKeyDictionaryz\Similar to weakref.WeakKeyDictionary, but use `is`/`id` rather than `==` to compare equalityc                     i | _         i | _        y r@   ri   refsr   s    rE   r   zExactWeakKeyDictionary.__init__  s    	rD   c                2    | j                   t        |         S r@   )ri   idr   s     rE   __getitem__z"ExactWeakKeyDictionary.__getitem__  s    {{2c7##rD   Nc                L    | j                   j                  t        |      |      S r@   )ri   rj   r6  )r   rn   defaults      rE   rj   zExactWeakKeyDictionary.get  s    {{r#w00rD   c                0    t        |      | j                  v S r@   )r6  ri   r   s     rE   __contains__z#ExactWeakKeyDictionary.__contains__  s    #w$++%%rD   c                     t        |       j                  vr't        j                  | fd       j                  <   | j                  <   y )Nc                &    j                        S r@   )
_remove_id)refidxr   s    rE   rF   z4ExactWeakKeyDictionary.__setitem__.<locals>.<lambda>  s    $//#:N rD   )r6  r4  weakrefr?  ri   )r   rn   rx   r@  s   `  @rE   __setitem__z"ExactWeakKeyDictionary.__setitem__  s?    gdii$[[.NODIIcN CrD   c                r    || j                   v r| j                   |= || j                  v r| j                  |= y y r@   r3  )r   r@  s     rE   r>  z!ExactWeakKeyDictionary._remove_id!  s6    $++C $))		# rD   c                l    | j                   j                          | j                  j                          y r@   )r4  r_   ri   r   s    rE   r_   zExactWeakKeyDictionary.clear'  s     		rD   r@   )r   r   r   __doc__r   r7  rj   r;  rB  r>  r_   r6   rD   rE   r1  r1    s(    f$1&!rD   r1  c                     y r@   r6   objallowed_typess     rE   istyperJ  ,  r   rD   c                     y r@   r6   rG  s     rE   rJ  rJ  1  r   rD   c                     y r@   r6   rG  s     rE   rJ  rJ  8  r   rD   c                l    t        |t        t        t        f      rt	        |       |v S t	        |       |u S )zisinstance() without subclasses)
isinstancetupler   r   r   rG  s     rE   rJ  rJ  =  s1    -%s!34CyM))9%%rD         c                    t         j                  dk\  rt        | t              ryt        | t        j
                        xs | t        j                  u S )NrP  T)sysversion_inforN  _builtin_final_typing_classestyping_FinalGenericrx   s    rE   	is_typingr[  Q  s>     7"z%9V'WeV]]+Fu/FFrD   c                   t         syt        | t         j                  t         j                  t         j                  t         j
                  t         j                  t         j                  t         j                  t         j                  f      S NF)
nprJ  int8int16int32int64uint8uint16uint32uint64rZ  s    rE   is_numpy_int_typerg  _  sU    GGHHHHHHHHIIIIII		
 rD   c                    t         syt        | t         j                  t         j                  t         j                  f      S r]  )r^  rJ  float16float32float64rZ  s    rE   is_numpy_float_typerl  r  s2    JJJJJJ	
 rD   c                x    t        | t        j                        xr t        t	        j
                  | d            S )N__wrapped__)rN  	functools_lru_cache_wrapperis_functioninspectgetattr_staticrZ  s    rE   is_lru_cache_wrapped_functionrt    s4    eY99: {um4@ rD   c                    t        |       xs> t        | t        j                  j                  t        j                  j
                  f      S r@   )rq  rN  r   _opsOpOverloadPacket
OpOverloadrZ  s    rE   is_function_or_wrapperry    s9    u 

++UZZ-B-BC" rD   c                    t        | t        j                  t        j                  t        j                  t        j
                  f      S r@   )rN  typesFunctionTypeBuiltinFunctionTypeMethodDescriptorTypeWrapperDescriptorTyperZ  s    rE   rq  rq    s;    %%&&''		
 rD   c                    t        | t        j                  t        j                  t        j                  t        j
                  t        j                  f      S r@   )rN  r{  GetSetDescriptorTyper~  r  MemberDescriptorTyper   rZ  s    rE   is_wrapper_or_member_descriptorr    sF     &&&&''&&##	
 rD   c                    t        |       d   S r^   ) unwrap_with_attr_name_if_wrapper)fns    rE   unwrap_if_wrapperr    s    +B/22rD   c                    t        |       r4t        j                  | dd      rt        j                  | d|       } d}| |fS d }| |fS )N_torchdynamo_inlineF)rq  rr  rs  )r  	attr_names     rE   r  r    sT     2711"6KUS##B(=rB)	 y= 	y=rD   c                D    t         syt        | t         j                        S r]  )r^  rJ  ndarrayrZ  s    rE   is_numpy_ndarrayr    s    %$$rD   c                    t         j                  t         j                  j                  gt        j
                  }|t         j                  j                  fz   }t        | |      S )zCheck of obj is a tensor)	r   Tensornn	Parameterr4   traceable_tensor_subclasses_subclassesr7   rJ  )rH  tensor_lists     rE   istensorr    sW     	% 
	+	+%K
 !2!2!=!= ??K#{##rD   c                "    t        | t              S r@   )rN  r,   )mods    rE   is_lazy_moduler    s    c?++rD   r   c                     t        |   y r@   )rv   r-  s    rE   
print_oncer    s	    	4LrD   c                |    | fd}|j                   t        |j                         dk(  sJ |j                   d   S )zNSome black magic to create a cell object that usually only exists in a closurec                      S r@   r6   r   s   rE   r  zmake_cell.<locals>.f  s    rD   r3   r   )__closure__r   )valr  r   s     @rE   	make_cellr    s>    A ==$Q]]);q)@@@==rD   c                <   	 t        d | D              }|j                         D ci c]  \  }}||j                          }}}||fS c c}}w # t        $ rC}ddlm} ddlm}  |d ||   d |t        |j                                 |       Y d }~y d }~ww xY w)Nc              3  <   K   | ]  }|j                           y wr@   )as_proxyrQ   args     rE   rS   z$proxy_args_kwargs.<locals>.<genexpr>  s     :c3<<>:   r3   unimplemented)typestrzcall_function args: rr   from_exc)
rO  rk   r  NotImplementedErrorr  r  variables.baser  r   ri   )	r-  r.  
proxy_argsrn   r  proxy_kwargsr   r  r  s	            rE   proxy_args_kwargsr    s    
:T::
<BLLNKSS\\^+KK<'' L 
&+"7D>"2!GT&--/=R4S3TU	
 	
	
s(   %A A	A 	A 	B9BBc                     e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   ded	<   d
ed<   d
ed<   d
ed<   d
ed<   d
ed<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   d
ed<   ded<   ded<   ded<   ded <   d!ed"<   d
ed#<   y$)%CompilationMetricsrP   r   r   r  co_filenamer   r  
cache_sizeaccumulated_cache_sizeOptional[int]guard_countshape_env_guard_countgraph_op_countgraph_node_countgraph_input_countrC   
start_timeOptional[float]entire_frame_compile_time_sbackend_compile_time_sinductor_compile_time_scode_gen_time_sOptional[str]r   r   fail_user_frame_filenamefail_user_frame_linenoSet[str]non_compliant_opscompliant_custom_opsrestart_reasonsdynamo_time_before_restart_sr   has_guarded_code)possibly_missed_reinplacing_opportunitiesNr   r   r   __annotations__r6   rD   rE   r  r    s    ONLO((!!##$$!00++,,$$++))"""'' /<<rD   r  c                  @    e Zd ZU ded<   ded<   ded<   ded<   ded<   y	)
r   rP   r   r  r  r  r  r   r   Nr  r6   rD   rE   r   r     s    O,,$$rD   r   @   maxlenz7Deque[Union[CompilationMetrics, BwdCompilationMetrics]]_compilation_metricsc                     t         j                          t         t              rd}nd}t        j
                  j                  | fd       t        j                  rt                y y )Ncompilation_metricsbwd_compilation_metricsc            	         t        j                        j                         D  ci c]#  \  } }| t        |t              rt        |      n|% c}} S c c}} w r@   )dataclassesasdictrk   rN  r   r   )r   r   r  s     rE   rF   z,record_compilation_metrics.<locals>.<lambda>,  sM    #**+>?EEG
1 *Q,tAw!3
  
s   (A)
r  r   rN  r  r   r  trace_structuredr4   log_compilation_metricsr)   )r  names   ` rE   r   r   !  s]      34%'9:$(	NN##	
 %%12 &rD   c                    t        t              | kD  r't        j                          t        t              | kD  r't        j                  t        |       }|ay )Nr  )r   r  popleftrA   deque)new_size	new_deques     rE   set_compilation_metrics_limitr  5  sE    
"
#h
.$$& "
#h
.!!"6xHI$rD   c                 ,    t         j                          y r@   )r  r_   r6   rD   rE   clear_compilation_metricsr  =  s     rD   c                      t        t              S r@   )r   r  r6   rD   rE   get_compilation_metricsr  B  s    $%%rD   c                      e Zd ZdZd Zd Z	 d
	 	 	 	 	 	 	 ddZddZ	 	 d	 	 	 	 	 	 	 	 	 ddZ	 d
	 	 	 	 	 	 	 	 	 ddZ		 d
	 	 	 	 	 	 	 dd	Z
y)ChromiumEventLoggera  Logs chromium events to structured logs. tlparse will concatenate these into a perfetto UI link.

    See https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU/preview#heading=h.yr4qxyxotyw for
    a specification of the Chromium Event JSON format.
    c                    t        | j                  d      r| j                  j                  S dg| j                  _        | j                  j                  S )Nstack	__start__)hasattrtlsr  r   s    rE   	get_stackzChromiumEventLogger.get_stackM  s9    488W%88>>!)]DHHN88>>!rD   c                    t        j                         | _        t        t	        j
                               | _        t        j                  d| j                         y )Nz*ChromiumEventLogger initialized with id %s)		threadinglocalr  rP   uuiduuid4id_r   r   r   s    rE   r   zChromiumEventLogger.__init__T  s9    ??$ tzz|$ 	=txxHrD   Nc                    | j                  ||d|      }t        || j                         | j                         | j                         j	                  |       y)z
        Logs the start of a single event.
        :param str event_name Name of event to appear in trace
        :param time_ns Timestamp in nanoseconds
        :param metadata: Any extra metadata associated with this event
        BN)_log_timed_eventr(   r  r  r   r   
event_namer   metadataevents        rE   r   z#ChromiumEventLogger.log_event_start]  sN     %%	
 	$E4>>+;TXXF
+rD   c                f    | j                         }|j                          |j                  d       y )Nr  )r  r_   r   )r   r  s     rE   r   zChromiumEventLogger.resetr  s%      [!rD   c                <   | j                         }||vrt        j                  d       y| j                  ||d|      }||d   k7  r.t        j                  d       |j	                          ||d   k7  r.t        ||| j                  |       |j	                          y)aA  
        Logs the end of a single event. This function should only be
        called after log_event_start with the same event_name.
        :param event_name: Name of event to appear in trace
        :param time_ns: Timestamp in nanoseconds
        :param metadata: Any extra metadata associated with this event
        z7ChromiumEventLogger: Start event not in stack, ignoringNEz>ChromiumEventLogger: Detected overlapping events, fixing stack)r  r   r  r  popr(   r  )r   r  r   r  start_time_nsr  r  s          rE   r   z!ChromiumEventLogger.log_event_endy  s    "  U" KKQR%%	
 E"I% KKP IIK E"I% 	$E5$((MJ		rD   c                n    ||dz  ||ddddt         j                  j                  dfddd       S )	za
        Logs a timed event in chromium format. See log_event_start, log_event_end, etc.
          r   r   )r  tsr-  phcattidpidchromium_eventc                      S r@   r6   r  s   rE   rF   z6ChromiumEventLogger._log_timed_event.<locals>.<lambda>      u rD   F
payload_fnsuppress_contextexpect_trace_id)r   r  r  )r   r  r   phaser  r  s        @rE   r  z$ChromiumEventLogger._log_timed_event  sQ     D.!	
 	''$"!	 	( 	
 rD   c           	         ||dz  |ddddddt         j                  j                  dfdd	d
       t        | j	                         | j
                         y)aZ  
        Log an instant event with no associated duration.
        :param str event_name: Name of event to appear in trace
        :param int time_ns Timestamp in nanoseconds
        :param Optional[Dict[str, Any]] metadata: Any extra metadata associated with this event
        :param str cname optional color for the arrow in the trace
        r  ir   r   p)r  r  r-  r  r  r  r  sr  c                      S r@   r6   r
  s   rE   rF   z7ChromiumEventLogger.log_instant_event.<locals>.<lambda>  r  rD   FTr  N)r   r  r  r(   r  r  r  s       @rE   log_instant_eventz%ChromiumEventLogger.log_instant_event  sf     D.!

 	''$" 	 	( 	
 	$E4>>+;TXXFrD   r@   )r  rP   r   r   r  Optional[Dict[str, Any]]r   r   r   r   )NN)
r  rP   r   r   r  r  r   r  r   r   )
r  rP   r   r   r  rP   r  r  r   r<   )r   r   r   rE  r  r   r   r   r   r  r  r6   rD   rE   r  r  F  s    "I .2	,, , +	,
 
,*" .2'+** * +	*
 %* 
*b .2  	
 + 
@ .2	GG G +	G
 
GrD   r  zOptional[ChromiumEventLogger]CHROMIUM_EVENT_LOGc                 .    t         
t               a t         S r@   )r  r  r6   rD   rE   r   r     s    !02rD   c                  <    e Zd ZU dZded<   ded<   d Zed        Zy)	CleanupHookz,Remove a global variable when hook is calledr<   scoperP   r  c                p    t         t         xj                  dz  c_        | j                  | j                  = y rZ   )CleanupManagercountr  r  r   r-  s     rE   __call__zCleanupHook.__call__  s)    %  A% JJtyy!rD   c                b    || vsJ t         xj                  dz  c_        || |<   t        | |      S rZ   )r  r   r  )r  r  r  s      rE   createzCleanupHook.create  s7    5   !d5$''rD   N)r   r   r   rE  r  r"  staticmethodr$  r6   rD   rE   r  r    s)    6
I" ( (rD   r  c                  .     e Zd ZU dZded<    fdZ xZS )r  r   zClassVar[CleanupManager]instancec                Z    | j                   |   D ]	  } |         t        | 	  |       y r@   )ri   superr>  )r   r@  hook	__class__s      rE   r>  zCleanupManager._remove_id  s-    KK$ 	DF	3rD   )r   r   r   r   r  r>  __classcell__r+  s   @rE   r  r    s    E&&   rD   r  c                    | j                         j                  | j                        }| j                  r+| j                  | j                  j                         |_        |S )z!Clone the tensor and its gradient)clonerequires_grad_requires_gradis_leafgrad)r   ys     rE   clone_tensorr5    sB    		  1AyyQVV'HrD   dtypec          	        t        |       r| S fd}t        j                         5  | j                  j                  dk(  r ||       cddd       S | j
                  t        j                  u rbt        j                   || j                                || j                               | j                  | j                               cddd       S t        |       r| j
                  t        j                  t        j                  hv r!| j                         }| j!                         }n | j#                         }| j%                         }t        j&                   ||       ||       || j)                               | j                  | j
                        cddd       S t+        d t-        | j/                         | j1                               D              }| j2                  rt        j4                  |dz   f|       }n3t        j6                  |dz   xs | j8                  | j                        }| j;                         |j;                         z
  dz  | j=                         z  }|j?                  | j/                         | j1                         |       	 |jA                  | jC                                | jD                  r|jG                  | jH                         | jD                  r(| jJ                  tM        | jJ                  	      |_%        tQ        | d
      r| jR                  jU                         |_)        |cddd       S # tN        $ r  ||       cY cddd       S w xY w# 1 sw Y   yxY w)zcopy while preserving stridesc                >   t        j                  |       }| j                  r|j                  | j                         | j                  r(| j
                  t        | j
                        |_        t        | d      r| j                  j                         |_        |S )Nr6  _dynamo_dynamic_indices)
r   r/  r2  r0  r1  r3  clone_inputr  r:  copy)r   r4  r7  s     rE   torch_clonez clone_input.<locals>.torch_clone  sr    KKN99Q__-99+ u5AF1/0()(A(A(F(F(HA%rD   xlaN)is_coalesced)layoutc              3  2   K   | ]  \  }}|d z
  |z    yw)r3   Nr6   )rQ   shapestrides      rE   rS   zclone_input.<locals>.<genexpr>D  s"      
%2UFUQY& 
       )r7  devicer6  r:  )+r8   r   no_gradrF  r   r@  
sparse_coosparse_coo_tensor_indices_valuesrB  r?  r'   
sparse_csr
sparse_bsrcrow_indicescol_indicesccol_indicesrow_indicessparse_compressed_tensorri   r   zipsizerC  is_quantizedempty_quantizedemptyr7  data_ptrelement_sizeas_strided_copy_r/  r2  r0  r1  r3  r;  RuntimeErrorr  r:  r<  )r   r7  r=  compressed_indicesplain_indicesneeded_sizeresultcache_line_offsets    `      rE   r;  r;    s    qz 
 688==E!q>6 6 88u'''**AJJL)AIIK(^^-	6 6 "!$xxE,,e.>.>??%&^^%5" !%&^^%5" !11./M*AHHJ'xx)6 68  
69!&&(AHHJ6O
 
 >>**K",<+>BF[[b (8F ZZ\FOO--3^^ 	1668QXXZ1BC
	"LL#yy%%aoo6yyQVV/)!&&> 1/0-.-F-F-K-K-MF*m6 6^  	" q>!g6 6^	"_6 6sE   !M'A4M'CM' C6M'A:M,M'M$M'#M$$M''M0c                   t        |       t        u r|t        |       }|j                         D ]\  \  }}t        |t              rt        |      ||<   %t        |t        j                        sJ t        |             t        |      ||<   ^ |S t        |       }t        t        |            D ]1  }t        ||   t        j                        s!t        ||         ||<   3 |S r@   )r   dictrk   rN  rO  clone_inputsr   r  r;  r   ranger   )example_inputsresrn   rx   r  s        rE   rd  rd  a  s    Nt#>"))+ 	.JC%''.C!%6CUC6&u-C	. 

~
C3s8_ )c!fell+ Q(CF) JrD   c                    	 | j                          y # t        $ r7}ddlm} t	        j
                  ddt        |             } |d|       |d }~ww xY w)Nr3   )	SkipFramez\(.* z(torch.compile cannot be run in context: )rX  r\  r  ri  resubr   )r  r   ri  functorch_subclass_names       rE   skip_frame_if_in_functorch_modern  t  sX    	 " #%&&"d3i"@67N6OP
	s    	A2AAc               #    K   t         j                  j                  } t         j                  j                  j
                  } |       5   |        5  t        j                  t         j                  j                               }t        |       t         j                  j                         r1t        j                  t         j                  j                               }d d d        d d d        	 d  t         j                  j                  j                         5  t         j                  j                         t         j                  j                         rt         j                  j                         d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w# t         j                  j                  j                         5  t         j                  j                         t         j                  j                         rt         j                  j                         d d d        w # 1 sw Y   w xY wxY wwr@   )r   _C_DisableFuncTorchutils_python_dispatch_disable_current_modesr/  randomget_rng_statern  cudais_availableset_rng_state)disable_functorchdisable_current_modes	rng_statecuda_rng_states       rE   preserve_rng_stater~    s    22!KK88OO		  E"3"5 EKK : : <=	'	2::""$"[[)A)A)CDN	E E
9[[))@@B 	9LL&&y1zz&&(

((8	9 	9E E E E	9 	9U[[))@@B 	9LL&&y1zz&&(

((8	9 	9 	9s   AIFBE?F$I-F# 1(IAF6	I?F	FFIF I#)H>AH2)	H>2H;7H>>Ic                
   t        | t        j                  j                  j                  t        j                  j
                  j                  t        j                  j                  t        j                  j                  f      S r@   )	rN  r   jit_traceTopLevelTracedModule_scriptRecursiveScriptModuleScriptFunctionScriptModule)model0s    rE   is_jit_modelr    sW    II11II33II$$II""		
 rD   c                6   t        |       r| S 	 t        j                  j                  | |      S # t        $ r` 	 t        j                  j                  |       cY S # t        $ r1 |rt        j                  d       nt        j                  d       Y Y y w xY ww xY w)Nz	jit errorz0Both torch.jit.trace and torch.jit.script failed)	r  r   r  tracer   scriptr   r  error)modelrf  r   s      rE   torchscriptr    s    E	Nyyun55 N	N99##E** 	Nk*		LM	NNs,   / 	BAB6BBBBc                X    	 t        j                  |       S # t        t        f$ r Y y w xY wr@   )rr  getfiler(  OSErrorrH  s    rE   r  r    s-    s##w s    ))c                *    t        t        |             S )zLTest if an object is a namedtuple or a torch.return_types.* quasi-namedtuple)is_namedtuple_clsr   r  s    rE   is_namedtupler    s    T#Y''rD   c                    	 t        | t              rLt        | dg       xs dg}t        | dd      }|dv xs' |d   t        u xr t        | d      xr t        | d      S 	 y# t        $ r Y yw xY w)	zhTest if an object is a namedtuple or a (torch.return_types|torch.autograd.forward_ad).* quasi-namedtuple	__bases__Nr   )torch.return_typesztorch.autograd.forward_adr   _make_fieldsF)
issubclassrO  getattrr  r(  )clsbasesmodules      rE   r  r    s    c5!Cb1;dVES,5FPP aE!Wgc7&;WY@W "   s   AA   	A,+A,c                   | t         u rg dS t        | t              sJ t        | d      r| j                  S t
        j                   G d d             }| j                  dk(  sJ  | t        |t        | j                                    }dg| j                  z  }t        |      D ];  }|d   dk7  st        t        ||      |      s#||t        ||      j                  <   = |S )	zIGet the fields of a namedtuple or a torch.return_types.* quasi-namedtuple)r   stopstepr  c                      e Zd ZU ded<   y)!namedtuple_fields.<locals>.Markerr   indexNr  r6   rD   rE   Markerr    s    
rD   r  r  Nr   r
  )slicer  rO  r  r  r  	dataclassr   rO   re  n_fieldsdirrN  r  r  )r  r  rH  fieldsr  s        rE   namedtuple_fieldsr    s     e|((c5!!!sI{{   >>1111
c&%-.
/C#'&3<<"7FC 47c>jd);VD/3F73%++,4 MrD   c           	     B   t        j                         5  t        j                  t         j                  j	                               t         j
                  j                         r1t        j                  t         j
                  j	                               g t        j                  | j                         | j                               D ]3  }j                  ||j                  t        j                  |      f       5 	 d d d        fd}|S # 1 sw Y   xY w)Nc                 j   t        j                         5  t         j                  j                         t         j                  j                         rt         j                  j                         D ]'  \  } }}| j                  |k7  s| j                  |       ) 	 d d d        y # 1 sw Y   y xY wr@   )r   rG  ru  ry  rw  rx  _versionr[  )paramversionoriginal_valuer}  r|  saved_states      rE   restorez"checkpoint_params.<locals>.restore  s    ]]_ 	0LL&&y1zz&&(

((82= 0.w>>W,KK/0		0 	0 	0s   A5B)B))B2)r   rG  r/  ru  rv  rw  rx  rV   rW   
parametersbuffersr   r  )gmr  r  r}  r|  r  s      @@@rE   checkpoint_paramsr    s    	 LKK : : <=	::""$"[[)A)A)CDN__R]]_bjjlC 	LEu~~u{{57IJK	LL0 N#L Ls   C+DDc                v   t         j                  j                         rt         j                  j                  }nt        } |        t        j                          t        j                  d       t        j                         }t        |      D ]  } | | } |         t        j                         }||z
  fS )Ni9  )r   rw  rx  synchronizer/  gccollectmanual_seedr   perf_counterre  )r  rf  timesr  r   r
  r`  t1s           rE   timedr    s    zz jj,,MJJL	d				B5\ ' 
			B27?rD   c           	     l    t        d t        j                  || j                  d            D              S )Nc              3  4   K   | ]  }|j                     y wr@   )is_cudarQ   r   s     rE   rS   z check_is_cuda.<locals>.<genexpr>  s     WQqyyWs   T)allrV   rW   r  )r  rf  s     rE   check_is_cudar  
  s(    W)//."--PTBU"VWWWrD   rE  c                    | dkD  sJ t        |       D cg c]  }d| 	 }}t        |dd  |d d z         }t        ddj                  |       ddj                  |       d      }d|  d	|_        |S c c}w )
Nr3   r   r  zlambda ,z: ()rot__helper)re  reversedevalrN   r   )r"  r  varsrotatedr  s        rE   rot_n_helperr    s    q5L5"1X&asG&D&tBCy49,-G	's388G+<*=Q?	@B7#BKI	 's   A4z	Set[type]common_constant_typesc                    t        | t        t        f      rt        t	        t
        |             S t        | t        j                  t        t        j                  f      xs t        | t        t        hz        S r@   )rJ  rO  	frozensetr  rO   is_safe_constantrN  enumEnumr   r   Sizer  r  )r   s    rE   r  r  5  s[    a%#$3'+,,a$))T5::67 6	'< rD   c                l    ddl m}m} t        | |      r|j	                  | j                               S | S )Nr3   )ConstantVariableSymNodeVariable)	variablesr  r  rN  r$  evaluate_expr)r  r  r  s      rE   specialize_symnoder  >  s0    < #'&&s'8'8':;;JrD   c                `    ddl m} t        |       } t        | |      r| j	                         S | S )Nr3   r  )r  r  r  rN  as_python_constant)r  r  s     rE   guard_if_dynr  H  s.    +
S
!C#'(%%''JrD   c                j    t        d t        j                  | |j                               D              S )Nc              3  <   K   | ]  }|j                           y wr@   )is_python_constantr  s     rE   rS   z&check_constant_args.<locals>.<genexpr>T  s     V!q##%Vr  )r  rV   rW   ri   r,  s     rE   check_constant_argsr  S  s$    VytV]]_/UVVVrD   c                    ddl m} ddlm} d}t	        j
                  | |j                               D ]"  }t        ||      r|dz  }t        ||      r" y |dkD  S )Nr3   r  UnspecializedPythonVariabler   F)variables.constantr  variables.tensorr  rV   rW   ri   rN  )r-  r.  r  r  unspec_countr   s         rE   check_unspec_python_argsr  W  s]    4=L__T6==?3 a45ALA/0	
 !rD   c                    ddl m} t        j                  | |j	                               D ]!  }|j                         rt        ||      r! y y)Nr3   r  FT)r  r  rV   rW   ri   r  rN  )r-  r.  r  r   s       rE   check_unspec_or_constant_argsr  d  sE     >__T6==?3 $$&*Q8S*T rD   c                |    ddl m t        fdt        j                  | |j                               D              S )Nr3   )NumpyNdarrayVariablec              3  6   K   | ]  }t        |        y wr@   )rN  )rQ   r   r  s     rE   rS   z+check_numpy_ndarray_args.<locals>.<genexpr>r  s!       	1*+s   )r  r  anyrV   rW   ri   )r-  r.  r  s     @rE   check_numpy_ndarray_argsr  o  s1    6 v}}7  rD   zType[KeysView[Any]]	dict_keyszType[ValuesView[Any]]dict_valuesodict_valueszType[Iterator[Any]]tuple_iteratorc                n    t        |       }t        j                  j                  j	                  |       |S r@   )
object_newr   r  Moduler   )r  rH  s     rE   nn_module_newr    s&    
S/C	HHOOS!JrD   c                L    t        j                  t        j                  | d      S rZ   )ro  reduceoperatormul)its    rE   productr    s    HLL"a00rD   c                >    | j                         \  }\  }}|||z      S r@   )
__reduce__)r  r  r
  rH  r   s        rE   tuple_iterator_getitemr    s%    }}Avuuu}rD   c                $    | j                  |      S r@   )as_subclass)tr  s     rE   to_subclassr	    s    ==rD   c                Z    t        t        j                  t        |       ||dz               S rZ   )nextrV   isliceiter)dr"  s     rE   dict_keys_getitemr    s$    	  a!QU344rD   c                j    | j                   j                  }| j                  }|rdnd}| d| d| }|S )NLGz["z"].)r+  r   r  )rx   r  r  r  r  
local_names         rE   	enum_reprr    sA     ??##D
**CCcE7"TF#cU+JrD   c                    || j                   d<   t        j                         j                  j                  }t
        j                  j                  j                  j                  ||      x}r|| j                   d<   y y )Nexample_valueunbacked_bindings)
metar&   rj   	fake_mode	shape_envr   r   experimentalsymbolic_shapescompute_unbacked_bindings)noder  r  symbol_to_paths       rE   set_example_valuer     sq     "/DIIo""$..88I..>>XX= ~  *8		%&rD   c                    | j                         j                  j                  j                  d      }t	        |      sddlm}  |d       |S )Nr  r3   r  z:Cannot check Tensor object identity without its fake value)r  r  r  rj   r8   r  r  )vtfake_tensorr  s      rE   _get_fake_tensorr$    s>    ++-$$))--o>K;&RSrD   c                
   ddl m}m}m}m} j                         r%t        fd| D              }|j                  |      S d}	|rt        |      rd}	t              d }
| D ]  }|	r.t        ||      st        |      u s |j                  d      c S  |t        j                        j                  ||gi       }|
|}
a |t        j                        j                  |||
gi       }
 |
|j                  d      }
|
S )Nr3   )BuiltinVariabler  TensorVariableVariableTrackerc              3     K   | ]7  }|j                         xr! |j                         j                         k(   9 y wr@   )r  r  )rQ   r   searchs     rE   rS   z iter_contains.<locals>.<genexpr>  sJ      
    " F$$&&*C*C*EEF
s   =A FT)r  r&  r  r'  r(  r  r  r$  rN  r$  r  eqcall_functionor_)rk   r*  txcheck_tensor_identityr&  r  r'  r(  found_constmust_check_tensor_idfoundr   checks    `           rE   iter_containsr4    s       " 
 
 

  &&{33 FN!C#!&)'+E !^,-a00+22488#HKK0>>rAv;PRSE}'5CC } ''.LrD   c                t    t        | t        j                  t        j                  j                  t
        f      S )z4Returns whether it indexes dictionaries using its id)rN  r   r  r  r  r   )r   s    rE   	key_is_idr6    s#    a%,,9JKLLrD   c                t    | j                         D cg c]  }t        |      rt        |      n| c}S c c}w r@   )r   r6  r6  )rx   r   s     rE   	key_to_idr8    s+    27**,?QYq\BqEq(???s   5c                  ddl m} t        | t        t        f      r\dj                  fd| D              }t        | t              rd| dS t        | t              sJ t        |       dk(  rd| dS d| d	S t        | t        j                        rt        | 
      j                  dd      S  ||       r| j                  S t        | t              rd } ||       S | S )Nr3   )is_builtin_callabler  c              3  8   K   | ]  }t        |         ywr  N
const_reprrQ   r  r  s     rE   rS   zconst_repr.<locals>.<genexpr>  s     DQj%88D   [](z,)r  r=  'rj  c                x    | j                   }|j                  }|dk(  r|j                  S |dz   |j                  z   S )Nbuiltins.)r+  r   r   )oklassr  s      rE   fullnamezconst_repr.<locals>.fullname  s?    KKE%%F#)))C<%"4"444rD   )trace_rulesr:  rN  r   rO  rN   r   r  r  r  replacer   r   )r   r  r:  
elems_reprrK  s    `   rE   r?  r?    s    0!dE]#XXD!DD
azl!$$a'''1v{:,b)):,a((	Atyy	! %(00b99	Q	zz	At		5 {rD   c               H    dj                  fd| D              }d|z   dz   S )Nr  c              3  8   K   | ]  }t        |         ywr<  r>  r@  s     rE   rS   z!dict_keys_repr.<locals>.<genexpr>  s     Gq
1E22GrA  rB  rC  )rN   )
const_keysr  keys_strs    ` rE   dict_keys_reprrS    s&    xxGJGGH>CrD   
__dict_key)UnsupportedFakeTensorExceptionc                P    | dt        |       d| j                  j                   S )Nr
  _c)r6  outputr   )r.  rootrH  s      rE   get_safe_global_namerZ    s*     V1RWIR		 4 4566rD   c                    	  |        S # t         $ r?}ddlm} d|j                   d}t        j                  |        |||       Y d }~y d }~ww xY w)Nr3   r  zUnsupported: z with fake tensor propagation.r  )rU  r  r  reasonr   r  )r  r   r  msgs       rE   wrap_fake_exceptionr^  $  sM    't) '&ahhZ'EFCcA&&'s   	 	A5AAc                     t         j                  j                  j                  |      5  t	         fd      cd d d        S # 1 sw Y   y xY w)Nc                 .    t        j                         S r@   )r<  deepcopyr  s   rE   rF   z)deepcopy_to_fake_tensor.<locals>.<lambda>1  s    4==+= rD   )r   r  r#  FakeCopyModer^  )rH  r  s   ` rE   deepcopy_to_fake_tensorrc  /  s;    				&	&	3	3I	> ?"#=>? ? ?s   AAc                ~    t        j                  t        j                  t        j                  | |z
                    S )z+
    Calculate root mean squared error
    )r   sqrtmeansquare)r?  rg  s     rE   rmserh  4  s)     ::ejjcCi!89::rD   g-C6?c                   	
  t         t        t        t        j                  t
        j                  j                  t
        j                  f      rt        t        t        t        j                  f      sJ dt                dt                      t               t              k7  r	 	d       yt               t              k(  xr& t        	
fdt               D              S t               j                  dk(  r4t         j                  j                  j                  	
      S t         t               rt        t               sJ t#         j%                               t#        j%                               k(  s;J d	t#         j%                                d
t#        j%                                       t'         j%                               D ],  }t         |   |   |   	
      r# 	d|        y yt         t"              rIt        t"              sJ t#               t#              k(  sJ dt#                d
t#                      yt         t
        j(                  t*        f      rt         t
        j,                  j.                        rJ t        t
        j,                  j.                        rJ d fd fD        \    j0                  r.j0                  sJ  j3                          j3                         t        t
        j(                        sJ dt                dt                      r j4                  j4                  k7  r 	d j4                  j4                         y j4                  t
        j6                  k(  reryt        j8                   j;                  t
        j<                        j;                  t
        j<                              }|s 	d       |S r j?                         j;                  t
        j@                         j?                         j;                  t
        j@                        t        j8                   d      ryt
        j                  jB                  jE                   dd      }|dk  r@tF        jI                  d|jK                         jM                         jO                                |dk\  S s j;                  j4                         t        j8                         ryj4                  t
        jP                  k(  r,d}jS                         jU                         sqjS                         jU                         sS jS                         jU                         r5t        j8                  j;                  j4                        ||      rytW               jO                         }tY        jR                  |      rtF        jI                  d       tW              jO                         }j4                  t
        jZ                  t
        j\                  fv rdnd}
rj_                         dk  rdk\  rd}nm
rj_                         d k  rdk\  rd!}nPj_                         d"k  s; j`                  d#k(  r' jb                  d$    jb                  d%   cxk(  rd&k(  sn d'k\  rd}|||z  dz  z   k  }|sHrFtY        jR                  |      r1tY        jR                  |      rtd        jf                  jh                  sd}|s' 	d(||jk                         j4                  |
       |S ry 	d)       yt         tl        tn        t        d      t6        t
        jp                  f      r ry k(  }|s 	d*t                       |S ts               stu               rSr&ts              stu              s jO                          t               t              u xr  k(  }|s
 	d+        |S tw               rTt               t              u xr< t        t        jx                         t        jx                        	
      S t               j                  d,v rNt               t              u sJ t        	 
fd- jz                  j%                         D              S t}        d.t               j                         )/z-Check correctness to see if ref and res matchNztype mismatch rr   zLength mismatchFc              3  R   K   | ]  \  }}}t        |||
	          yw)	log_error(use_larger_multiplier_for_smaller_tensorN)same)rQ   aibi	fp64_reficos_similarity	equal_nanexact_dtypeignore_non_fprl  relax_numpy_equalitytolrm  s       rE   rS   zsame.<locals>.<genexpr>T  sL      ,
 "B	 $#9a ,
s   $'QuestionAnsweringModelOutputrk  zkeys mismatch z == rr  rw  rs  rt  rv  ru  rl  rm  zAccuracy failed for key name %sTzelements mismatch c                d    t        | t        j                        r| S t        j                  |       S r@   )rN  r   r  tensorr  s    rE   	to_tensorzsame.<locals>.to_tensor  s"    "1ell31HaHrD   c              3  .   K   | ]  } |        y wr@   r6   )rQ   r  r}  s     rE   rS   zsame.<locals>.<genexpr>  s     MinMs   zdtype mismatch %s, %sr6  )atolrtolrs  z+Accuracy failed: uint8 tensor did not matchr   gư>)dimepsgGz?zSimilarity score=%sg{Gz?z=Found nan in reference. Consider running in higher precision.g      @g       @
   g      $@i  g      @r     r  r3   g{Gz?zRMSE (res-fp64): %.5f, (ref-fp64): %.5f and shape=%s. res.dtype: %s, multiplier: %f, tol: %f, use_larger_multiplier_for_smaller_tensor: %dz+Accuracy failed: allclose not within tol=%szAccuracy failed (%s): %s != %sz!Accuracy failed (numpy): %s != %s)MaskedLMOutputSeq2SeqLMOutput!CausalLMOutputWithCrossAttentionsLongformerMaskedLMOutput	InstancesSquashedNormalBoxesNormalTanhTransformFooVariablec              3     K   | ]8  }t        t        |      t        
|      t        |      	        : yw)ry  N)rn  r  )rQ   rn   rr  rs  rt  fp64_refru  rl  r?  rv  rg  rw  rm  s     rE   rS   zsame.<locals>.<genexpr>J  s[      
  S!S!#&-#'%9+#9a 
s   >Azunsupported type: )?rN  r   rO  rA   r  r   r  ParameterListr  r   r   r  rS  r   rn  lossrc  r   r   sortedr  rC   r  r7   	is_sparseto_denser7  r   allclosetorc  flattenrj  
functionalcosine_similarityr   r  cpudetachitemrk  isnanr  rh  mathri  bfloat16numelndimrB  inductor_configcppinject_relu_bug_TESTING_ONLYrT  rP   r   rF  rg  rl  r  	as_tensor__dict__r\  )r?  rg  r  rr  rw  rs  rt  rv  ru  rl  rm  r   rscore	loose_tol	ref_error	res_error
multiplierpasses_testr}  s   ```````````        @rE   rn  rn  ;  s     dE;,,ehh.D.DejjQ ${001
 	4DI;aS	{3	4 
 s8s3x'(3x3s8# 
 ,
 ,
 &)c8%<,
 )
 	
  
c		=	= HHHHMM 5]
 	
 
C	#t$$$388:#HHJ#
 
 	CC
O,DSXXZ0AB	C 
 
# 	AFFQK#1' +)="/'=e ;Q?#	$ 	C	#s###3x3s8#R'9#c(4Cz%RR#	C%,,.	/c5#4#4#?#?@@@c5#4#4#?#?@@@	I Nc88LMS(==== =,,.C,,.C#u||,VtCyk4PS9+.VV,yyCII%1399ciiHyyEJJ& NNFFF-FFF-' KL++-""5==1C++-""5==1C~~c3SsdK HH''99#st9TEt|1599;3E3E3G3L3L3NOD= ffSYY' ~~c3SsiP ~~. %	 (,,.IIKOO-		) #))4&&"+   3/446	::i(KKW !3/446	 99(GGCS  <NN$*sh!%J=NN$+x!$JNN$t+A#))B-399R=*MA*Mh
 "%J'J,BS4Z,OP#!

9-

9- ,//LL"&K"I!!
		"@
 #"CSI	C#sDJellC	D3J6S	3L	3	#6s#;c"&9#&>((*C#Y$s)#5#*93D	#	S	T#Y& 
DOOC OOC )#!5'5]-
 	
 
c		   
 CyDI%%% 
 
 ||((*
 
 	
" /S	0B0B/CDEErD   c                ~    | j                   j                  d      d   }d| j                   d| d| j                   dS )N/r  rE  z' (rs   r  )r  splitr  r  )r  short_filenames     rE   format_func_infor  ^  sD    %%++C04Nt||nC/q1D1D0EQGGrD   c               #    K   t         j                  } t        j                  t         _        t         j                  }t        j                  t         _        	 d  | t         _        |t         _        y # | t         _        |t         _        w xY wwr@   )r4   cache_size_limitrT  r   accumulated_cache_size_limit)priorprior_acc_limits     rE   disable_cache_limitr  c  s_     ##E!kkF99O*-++F'>"'.=+ #(.=+s   ABA1 B1B		BzDefaultDict[Any, List[Any]]guard_failuresz3List[torch._dynamo.output_graph.GraphCompileReason]graph_break_reasonsc                    dt         j                   j                         j                  d      z   dz   t        t	        j
                               z   }t        j                  j                  | |      S )Nrun_z%Y_%m_%d_%H_%M_%S_%fz-pid_)datetimenowstrftimerP   r   getpidr   rN   )root_dirdir_names     rE   _get_debug_dirr    sf     	





!
*
*+A
B	C 	 biik
		  77<<(++rD   c                 8    t         j                  } t        |       S r@   )r4   debug_dir_rootr  )
debug_roots    rE   r   r     s    &&J*%%rD   c                    d| j                   v r't        | j                   d         r| j                   d   S |rddlm}  |d       y y )Nr  r   r  z9`FakeTensor` example value was required but not available)r  r8   torch._dynamo.excr  )r  requiredr  s      rE   extract_fake_example_valuer    s?    $))#		/0J(Kyy))	3QRrD   c                8    t        |       |j                  u sJ | S r@   )r9   r  )r   r.  s     rE   ensure_graph_faker    s    q!R\\111HrD   c                h     d fd}t         j                  j                  j                  ||      S )Nc                    | j                   dk(  rd| j                  vrt        |       S | j                  d   }s&t        |t        j
                        rt        |      S |S )Nr,  r  )r  r  get_fake_valuerN  r   r  r  )r"  rw   allow_non_graph_faker.  s     rE   visitz)get_fake_values_from_nodes.<locals>.visit  s\    44?"aff'D "!R)=>>ff_%#
3(E$S"--
rD   )r"  ztorch.fx.Node)r   r   r  map_arg)r.  r  r  r  s   ` ` rE   get_fake_values_from_nodesr    s%    	 88==  ..rD   c           	     &	    ddl m} ddlm}m}m}m}m}  j                  }	d j                  v r't         j                  d         r j                  d   S t         j                   j                  f|      \  d|	dk(  r^t              dkD  rPt        d   t         j"                  j$                        r)t'        d   j(                        ft+        dd       z   |	dk(  rbj,                  j.                   j0                     t3              rt5        d	      rj7                         t'        j(                        	 j(                  5  t9               5  t;         fd
      }
ddd       ddd       |s>ts        jt                  t         jv                  ty        jz                  t|              
      }
S # 1 sw Y   SxY w# 1 sw Y   WxY w# |$ r  t<        $ r}|}|j>                  |j>                  }t        |t         j@                  jB                  jD                        r |d|jF                   d       nt        |t         j@                  jB                  jH                        rTt         jJ                  jL                  jN                  s |d|jF                   d       n |d|jF                   d       nt        |t         j@                  jB                  jP                        r|jF                  }	d}t        |	t         jR                  jT                        r[t         jV                  jY                  |	jZ                  j\                  |	jZ                  j^                        }||\  }}d| d| d| d} |d|jF                   d| d       nt        |t         j`                  jb                  jd                  jf                        r ||jh                  tk        |      d      t        ||      r! ||jh                  |j                  d         |t        |tl              r%dtk        |      v r |d j0                   d|         |tk        |            jo                  |jp                        dd}~ww xY w)az  
    Run the computation represented by `node` using fake tensors and return the result.

    allow_non_graph_fake: whether to allow the return result to be:
        1. non-fake or 2. fake that is not created by this instance of Dynamo.
        If `True`, you must be prepared to deal with such return values, ideally
        by further wrapping them as this graph's fakes.
    r   )ValueRangeErrorr3   )TorchRuntimeErrorr  Unsupported	UserErrorUserErrorTyper  Ncall_methodcall_module_initialize_hookc                 6    t        j                         S r@   )run_noderX  )r-  r.  nnmoduler  r.  s   rE   rF   z get_fake_value.<locals>.<lambda>  s    D$I rD   zdata dependent operator: zC; to enable, set torch._dynamo.config.capture_scalar_outputs = Truezdynamic shape operator: zM; to enable, set torch._dynamo.config.capture_dynamic_output_shape_ops = Truezm; Operator does not have a meta kernel that supports dynamic output shapes, please report an issue to PyTorchrj  z:It's possible that the support was implemented in module `z` and you may need to `import z`(z), otherwise zunsupported operator: z (z~see https://docs.google.com/document/d/1GgvOe7C8_NVOMLOCwDaYV1mXXyHMXY7ExoewHqooxrs/edit#heading=h.64r4npvq0w0 for how to fix)constrain_as_size_example)	case_nameargumentz
TypeError z: )r.  )?torch.utils._sympy.value_rangesr  r  r  r  r  r  r  r  r  r8   r  r-  r.  r   rN  r   r  r  rc  r  rO  rX  
nn_modulestargetr  r  _infer_parametersr$   r^  r\  	__cause__r  r#  DataDependentOutputExceptionfuncDynamicOutputShapeException_dynamor4    capture_dynamic_output_shape_opsUnsupportedOperatorExceptionrv  rx  rp  _dispatch_pystub_schemar  overload_namer   r  r  GuardOnDataDependentSymNodeCONSTRAINT_VIOLATIONrP   r(  with_traceback__traceback__pytreetree_map_onlyr  ro  partialr  )r  r.  r  r  r  r  r  r  r  r  ret_valr   causeimport_suggestionmaybe_pystubr  ctxr
  r-  r.  r  s   ``                @@@rE   r  r    s    @  
B $))#		/0J(Kyy))-
TYY$&:LD& H	]s4y1}DGUXX__1U'Q>@5ab?R	]99''4(#:L(M
 &&x6 +8R\\BCR\\ 	35 	)IG	 	H    LL)++,="Ew
 NQ	 	 	 	   <R ;;"KKE5$$00MM
 +EJJ< 8T T 5$$00LL
 ==''HH.uzzl ;b b
 .uzzl ;8 8
 5$$00MM
 B ""ejj334$xx88JJOORZZ%=%=   +".KFC##)(*H Q5/ &
 (B7H6I J# #
 588((88TT
 22E
5 
 /M>>q	JPQQy)jCJ.FJt{{m2eW=>A'66qGTQy<RsI   G" G%G
8G G" 
G	GGG" "R1JRRc                 $    t        t        dd       S )Nrx   )r  _current_noder6   rD   rE   get_current_noder  .  s    ='400rD   c              #  v   K   t               }| t        _        	 d  |t        _        y # |t        _        w xY wwr@   )r  r  rx   )r  olds     rE   set_current_noder  2  s.     

CM"!cs   9) 969c                   j                   t              5  fd}	 dk(  r j                  i cddd       S dk(  r+ t        d   j                        dd i cddd       S dk(  r|J  |i cddd       S dk(  r.| j                  j                  j                        cddd       S d	k(  r(d
j                  v sJ j                  d
   cddd       S 	 ddd       t              # t        t        f$ r }ddl	m
}  | ||      |       Y d}~=d}~wt        $ r0}t         ||            j                  |j                        |d}~ww xY w# 1 sw Y   t              xY w)a  
    Runs a given node, with the given args and kwargs.

    Behavior is dictated by a node's op.

    run_node is useful for extracting real values out of nodes.
    See get_real_value for more info on common usage.

    Note: The tracer arg is only used for 'get_attr' ops
    Note: The nnmodule arg is only used for 'call_module' ops

    Nodes that are not call_function, call_method, call_module, or get_attr will
    raise an AssertionError.
    c           	     N    d dj                    d d d	t        |       z   S )NzFailed running rr   z(*z, **z):
)r  rP   )r   r-  r.  r  r  s    rE   make_error_messagez$run_node.<locals>.make_error_messageO  s4    $RD$++bd6($ORUVWRXXXrD   r,  Nr  r   r3   r  get_attrplaceholderr  r  r  )r  r  r  r  output_graphget_submoduler  r  rU  r  r  r   r\  r  r  AssertionError)	tracerr  r-  r.  r  r  r   r  r  s	    ```    @rE   r  r  <  s    
B	$	 	Y	_$"t{{D3F3  }$4wtAw4d12hI&I  }$+++00  z!**88E  }$&$))333yy1#  %: 
 $%CD 	=*,Q/!<< 	1!45DD	1: 
sX   	E-D&D6D)D#D0E-E*D.)E-.E*:+E%%E**E--F c                   ddl m} j                  }| |v r||    S | j                  }t        j
                  j                  j                  | j                  | j                  ffd      \  }}|dk(  r'd| j                  v r| j                  d   j                  S |dk(  rMj                  j                  | j                     }t        |      st!        j"                  |      }n ||i | nd}	 t%        | |||      }||| <   |S # t&        $ r0}	 |t)        |	            j+                  |	j,                        dd}	~	ww xY w)z
    Run the actual computation represented by `node` and return the result.
    This will execute any dependent nodes in the graph as well.
    r3   )r  c                    t        |       S r@   )get_real_value)r"  r  s    rE   rF   z get_real_value.<locals>.<lambda>{  s    .F+ rD   r
  graphargr  N)r  r  real_value_cacher  r   r   r  r  r-  r.  r  exampler  r  r  r  r<  ra  r  r\  rP   r  r  )
r  r  r  cacher  r-  r.  	nn_module
real_valuer   s
    `        rE   r  r  m  s/   
 '##Eu}T{	B88==((	DKK +LD&
 
]zTYY6yy$,,,	]''224;;?	i(i0I t&v&	RfdD&)D
 d   RA'66qGTQRs   0D 	D?+D::D?c                    ddl mm} fd}| j                         D ]   \  }} ||      sJ d| d ||               | j	                         D ]   \  }} ||      sJ d| d ||               y )Nr   )FakeTensorConfigr8   c                b    j                   r"dd l}d|j                  | j                         S y)Nr   z"FAKE TENSOR CREATION TRACEBACK: 
 zNEnable TORCH_FAKE_TENSOR_DEBUG=1 to get creation stack traces on fake tensors.)debug	tracebackformat_list_debug_trace)r  r  r  s     rE   stack_or_hintz7assert_no_fake_params_or_buffers.<locals>.stack_or_hint  s/    !!89N9Nq~~9^8_``crD   zUnexpected fake buffer rr   zUnexpected fake param )torch._subclasses.fake_tensorr  r8   named_buffersnamed_parameters)r  r8   r  r  bufferr  r  s         @rE    assert_no_fake_params_or_buffersr$    s    Gd ((* Df
 	D$TF!M&,A+BC	D 
D **, Be
 	B#D6=+?*@A	B 
BrD   c                8    | j                    d| j                   S )z9
    Returns the fully qualified name of the object.
    rH  )r   r   r  s    rE   fqnr&    s!     nnQs//011rD   c                R    t         j                  j                  j                  r| S |S r@   )r   r  r4   assume_static_by_default)count1count2s     rE   ifdynstaticdefaultr+    s    }}44rD   c           
     8   t        t        j                  t        j                  j	                  t        t        | j                                          D ]D  }|j                  d      s|d   dk7  st        j                  | j                   d|dd         F y)z@
    Ensure all the files in a given submodule are imported
    z.pyr   r
  rH  N)r  r   listdirr   r  r
   rP   __file__endswith	importlibimport_moduler   )r  r  s     rE   import_submoduler3    sw     2::bggood36M&NOP GU#s(:##s||nAhsm_$EFGrD   c                *    t        t        |             S r@   )class_has_getattributer   rZ  s    rE   object_has_getattributer6    s    !$u+..rD   c                    	 t        t        j                  | d      t        j                        ry	 y# t
        $ r Y yw xY w)N__getattribute__TF)rN  rr  rs  r{  r|  AttributeErrorr  s    rE   r5  r5    sO    ""3(:;
 	
   s   .3 	??c                    	 t        j                  t        |       d      }|r(|t        j
                  j                  j                  u rd }|S # t        $ r d }Y 9w xY w)N__getattr__)rr  rs  r   r9  r   r  r  r<  )rx   ignore_nn_module_getattr
getattr_fns      rE   get_custom_getattrr?    sX    ++DKG
  J%((//2M2M$M
  
s   A AAc                      e Zd ZdZdZdZy)TensorStaticReason   r  rt   N)r   r   r   	PARAMETER
NOT_TENSORNN_MODULE_PROPERTYr6   rD   rE   rA  rA    s    IJrD   rA  c                    | t         j                  k(  ry| t         j                  k(  ry| t         j                  k(  ryt	        d|        )Nz>mark_dynamic on parameter, parameters are always static today.z2mark_dynamic on a non tensor, how did this happen?z4tensor is static because it is nn module associated.zIllegal reason )rA  rC  rD  rE  r  )r\  s    rE   tensor_static_reason_to_messagerG    sJ    #---O#...C#666E
?6(3
44rD   c                   ddl m} |j                         j                         s|j                         j	                         r"t
        j                  rdt        j                  fS t        |       t        j                  j                  u s ||      r"t
        j                  rdt        j                  fS |sdt        j                  fS y)a@  
    Given a tensor, source, and is_tensor flag, determine if a shape should be static.

    Args:
    tensor - the real tensor to evaluate, parameters force a static shape.
    is_tensor - internal dynamo check, essentially "is_tensor": target_cls is TensorVariable,
    tensors not in a TensorVariable for whatever reason are forced static.

    Returns a tuple, where the first element is the bool of whether or not this tensor should have a static shape.
    The second element is a TensorStaticReason, useful for passing to tensor_static_reason_to_message if needed.
    r3   ))is_from_unspecialized_param_buffer_sourceT)FN)sourcerI  guard_sourceis_specialized_nn_module"is_unspecialized_builtin_nn_moduler4   &force_nn_module_property_static_shapesrA  rE  r   r   r  r  force_parameter_static_shapesrC  rD  )r{  	is_tensortensor_sourcerI  s       rE   tensor_always_has_static_shaperR    s      B 	""$==?%%'JJL

7
7':::: 	V***4]C

.
.'1111'2222rD   c                (      fd}t        |      S )Nc                    	 ddl m }  j                  j
                  D cg c];  }|j                  |j                  |j                  |j                  |j                  g= }} | |g d      }t        j                  j                  j                  |      S # t        $ r dt        t                    z   cY S w xY wc c}w )Nr   )rT   zkTabulate module missing, please install tabulate to log the graph in tabular format, logging code instead:
)opcoder  r  r-  r.  rI   )rT   rU   rP   r+   graphr  r  r  r  r-  r.  r*   r   __code__r  )rT   r"  
node_specs	graph_strfn_namer  s       rE   innerz(lazy_format_graph_tabular.<locals>.inner	  s    	) AC
;<QTT166188QVVQXX6

 
  N
	 "'2::+>+>+J+JIVV  	~,Wb9:;	
s   B A C!B>=B>r1   )rZ  r  r[  s   `` rE   lazy_format_graph_tabularr\  	  s    W" erD   c                f    |  d| d| d| dt        j                  |      j                          d
S )Nrr   z line z 
rK   )disBytecode)prefixr  r  line_nor  s        rE   format_bytecoderb  "	  s;    XQtfAhZvgYc#,,t:L:P:P:R9SSUVVrD   _forward_pre_hooks_forward_hooks_backward_pre_hooks_backward_hooks)_state_dict_pre_hooks_state_dict_hooks_load_state_dict_pre_hooks_load_state_dict_post_hooksc                     t        t        j                  j                  j                  j
                        xs7 t        t        j                  j                  j                  j                        S r@   )r   r   r  modulesr  _global_backward_hooks_global_backward_pre_hooksr6   rD   rE   nn_module_has_global_hooksro  1	  sM     uxx&&==> #::C rD   c                   g }| xr | xr | }|s|r|j                  t               |s|r|j                  t               |r|j                  t               g }|D ],  }t	        | |g       }|D ]  }	||	   }
|j                  |
        . |S )z
    Sometimes its useful to differentiate between types of hooks such as forward/backward/pre
    hooks executed during module.__call__, and state_dict hooks which are executed separately.
    )extendforward_hook_namesbackward_hook_namesstate_dict_hook_namesr  r   )r  check_forward_hookscheck_backward_hookscheck_state_dict_hookshook_dicts_to_checkcheck_all_hooks	all_hookshook_dict_namehooks	hook_namer*  s              rE   nn_module_get_all_hooksr~  9	  s      	'$$	'&& 
 o""#56""#67""#89I- #^R0 	#I#DT"	## rD   c                6    t        | |||      }t        |      S )zL
    Helper function to check if a module has any hooks attached to it.
    )ru  rv  rw  )r~  r   )r  ru  rv  rw  r|  s        rE   nnmodule_has_hooksr  Z	  s&     $/15	E ;rD   c                2   t        |       r| S t        | t        j                        rt	        | j
                        S t        | t        j                        r| j                  d      S t        | t        t        f      r t        |       d | D              S | S )z0Convert tensor and tnp.ndarray to numpy.ndarray.T)forcec              3  2   K   | ]  }t        |        y wr@   )to_numpy_helperrQ   rH  s     rE   rS   z"to_numpy_helper.<locals>.<genexpr>u	       AC?3/ArD  )r8   rN  tnpr  r  r{  r   r  numpyrO  r   r   rZ  s    rE   r  r  l	  st    u~%%u||,,	E5<<	({{{&&	EE4=	)tE{A5AAArD   c                   t         J t        | t         j                        rt        j                  |       S t        | t
        j                        r| j                  S t        | t        t        f      r t        |       d | D              S | S )zeConvert tnp.ndarray to tensor, leave other types intact. If a list/tuple, loop through it to convert.c              3  2   K   | ]  }t        |        y wr@   )numpy_to_tensorr  s     rE   rS   z"numpy_to_tensor.<locals>.<genexpr>	  r  rD  )
r^  rN  r  r   r  r  r{  rO  r   r   rZ  s    rE   r  r  z	  sk    >>%$u%%%%||	EE4=	)tE{A5AAArD   c                      e Zd Zd Zd Zd Zy)numpy_to_tensor_wrapperc                N    || _         d| j                   j                  z   | _        y Nwrapped_r  r   )r   r  s     rE   r   z numpy_to_tensor_wrapper.__init__	  s    "TVV__4rD   c                6    d| j                   j                   dS )Nz<Wrapped function <original >>r  r   s    rE   __repr__z numpy_to_tensor_wrapper.__repr__	  s    -dffoo->bAArD   c                <     | j                   |i |}t        |      S r@   )r  r  r   r-  r.  rw   s       rE   r"  z numpy_to_tensor_wrapper.__call__	  s"    dffd%f%s##rD   N)r   r   r   r   r  r"  r6   rD   rE   r  r  	  s    5B$rD   r  c                    t        | t        j                        rt        | |      }t	        |      S t        | t
        j                        r*t        t        j                  |       |      }t	        |      S y r@   )rN  r  r  r  r  r   r  )rH  r  rw   s      rE   numpy_attr_wrapperr  	  sZ    #s{{#c4 s##	C	&ckk#&-s## 
'rD   c                  $    e Zd ZdZddZd Zd Zy)numpy_method_wrapperzgConvert obj from torch.Tensor to tnp.ndarray and call method. Then convert result back to torch.Tensor.c                :    || _         d| j                   z   | _        y r  )methodr   )r   r  s     rE   r   znumpy_method_wrapper.__init__	  s    "T[[0rD   c                "    d| j                    dS )Nz<Wrapped method <original r  )r  r   s    rE   r  znumpy_method_wrapper.__repr__	  s    +DKK=;;rD   c                    |d   }t        |t        j                        rt        j                  |      }t        || j                        } ||dd  i |}t        |      S Nr   r3   )rN  r   r  r  r  r  r  r  )r   r-  r.  rH  method_callablerw   s         rE   r"  znumpy_method_wrapper.__call__	  sW    1gc5<<(++c"C!#t{{3tABx262s##rD   N)r  rP   r   r   r   rE  r   r  r"  r6   rD   rE   r  r  	  s    q1<$rD   r  c                  $    e Zd ZdZddZd Zd Zy)numpy_operator_wrapperzQImplements dunder methods for tnp.ndarray via functions from the operator libraryc                :    || _         d|j                   | _        y r  )r  r   )r   r  s     rE   r   znumpy_operator_wrapper.__init__	  s    "2;;-0rD   c                "    d| j                    dS )Nz<Wrapped operator <original r  )r   r   s    rE   r  znumpy_operator_wrapper.__repr__	  s    -dmm_B??rD   c                P    |rJ d |D        } | j                   | }t        |      S )Nc              3  ~   K   | ]5  }t        |t        j                        rt        j                  |      n| 7 y wr@   )rN  r   r  r  r  r  s     rE   rS   z2numpy_operator_wrapper.__call__.<locals>.<genexpr>	  s0      
KN
3 =CKK3F
s   ;=)r  r  r  s       rE   r"  znumpy_operator_wrapper.__call__	  s5    z
RV
 dggtns##rD   N)r  zCallable[..., Any]r  r6   rD   rE   r  r  	  s    [1@$rD   r  c                B   t        | t              s| S | j                  rg }| j                         D ]v  }t        |t        j
                        rI|j                  |j                  j                  j                  |j                  j                               f|j                  |       x g }| j                         D ]v  }t        |t        j
                        rI|j                  |j                  j                  j                  |j                  j                               f|j                  |       x n | j                         }| j                         }t	        j                  ||| j                  | j                  | j                        }|j!                          |S )N)r7  rF  r1  )rN  r7   _has_symbolic_sizes_stridesrT  r   SymIntr   r  r  	size_hintexprrC  empty_stridedr7  rF  r1  zero_)r   rT  r  rC  r4  s        rE   defaker  	  s*   a$ 	$$ 	A!U\\*AFF,,66qvv{{CDA		
  	!A!U\\*aff..88EFa 		! vvxggxxoo	A GGIHrD   c                N    dd l }| |j                  j                  j                  u S r^   )torch.utils.checkpointrr  
checkpoint)rH  r   s     rE   is_utils_checkpointr  	  s     !%++((3333rD   c                     dd l mc m} ddlm} |j
                  }t        j                  j                  j                  r|j                  } |j                  |fi | S )Nr   r3   ) TorchHigherOrderOperatorVariable)torch._higher_order_ops.wrap_higher_order_opswrapvariables.higher_order_opsr  tag_activation_checkpointr   
_functorchr4   functionalize_rng_opswrap_activation_checkpointmake)optionshigher_order_opsr  activation_checkpoint_ops       rE   build_checkpoint_variabler  	  s_    ;;L
 	22  44#3#N#N 0+00 
 rD   c                Z    ddl m}  |       }| dk(  r	 |S | dk(  r|rt               }|S d}|S )Nr3   )is_dynamo_supportedr  rw  F)
eval_framer  r-   )device_typer  compile_supporteds      rE   is_compile_supportedr  	  sL    /+-e
 	 
	#4&L  "rD   c                b    | j                  d      }t        |d| j                  dd            S )z
    Convert byte offset `offset` of `str` into character offset.
    Byte offset is used for 3.11+ instruction column data.
    Takes things like unicode characters into consideration.

    Unchanged from CPython implementation.
    zutf-8NrM  )errors)encoder   decode)rP   offsetas_utf8s      rE   _fix_offsetr  
  s4     jj!Gww&&wy&ABBrD   c                  6    e Zd ZU ded<   ded<   ded<   ded<   y)_Anchorsr   left_end_linenoleft_end_offsetright_start_linenoright_start_offsetNr  r6   rD   rE   r  r  
  s     rD   r  c                   t         j                  dk\  sJ ddl}	 |j                  d| z   dz         }t        |j                        dk7  ry| j                  d      fd}fd	fd
}fd}|j                  d   }t        ||j                        r|j                  }t        ||j                        rt        t        |j                  j                        dz
  } |||j                  j                         }	 ||	      \  }}	|   |	   x}
j#                         s|
dv r;|
dv r |||	      \  }}	n |||	      \  }}	|   |	   x}
j#                         r6|
dv r;|	dz   }|t        |         k  r!|   |   x}
j#                         s	|
dvr|dz  }t%        ||	||      S t        ||j&                        rt        t        |j                  j                        dz
  } |||j                  j                         } ||      \  }}|   |   dk7  r |||      \  }}|   |   dk7  rt        t        |j                        dz
  } |||j                         }t%        ||||      S t        ||j(                        rt        t        |j*                  j                        dz
  } |||j*                  j                         } ||      \  }}|   |   dk7  r |||      \  }}|   |   dk7  rt        t        |j                        dz
  } |||j                         }t%        ||||      S y# t        $ r Y yw xY w)a  
    Given source code `segment` corresponding to a bytecode
    instruction, determine:
        - for binary ops, the location of the binary op
        - for indexing, the location of the brackets.
    `segment` is expected to be a valid Python expression
    )rQ     r   Nz(
z
)r3   rK   c                "    t        |    |      S r@   )r  )linenor  liness     rE   	normalizez-_extract_anchors_from_expr.<locals>.normalize?
  s    5=&11rD   c                    | t              k  r8|t        |          k\  r'd}| dz  } | t              k  r|t        |          k\  r'| t              k  r|t        |          k  sJ | |fS r  r   )r  colr  s     rE   next_valid_charz3_extract_anchors_from_expr.<locals>.next_valid_charD
  sy    s5z!cSv-?&?CaKF s5z!cSv-?&? E
"sSv-?'???s{rD   c                p    |dz  } | |      \  } }| t              k  r|t        |          k  sJ | |fS rZ   r  r  r  r  r  s     rE   	incrementz-_extract_anchors_from_expr.<locals>.incrementL
  sH    q%fc2E
"sSv-?'???s{rD   c                t    d}| dz  }  | |      \  } }| t              k  r|t        |          k  sJ | |fS r  r  r  s     rE   nextlinez,_extract_anchors_from_expr.<locals>.nextlineS
  sM    !%fc2E
"sSv-?'???s{rD   rB  z)\#z\#rB  rD  )rT  rU  astparseSyntaxErrorr   bodyr  rN  Exprrx   BinOpr
   r   left
end_linenoend_col_offsetisspacer  	SubscriptCallr  )segmentr  treer  r  r  	statementr  
cur_linenocur_colch	right_colleft_linenoleft_colright_linenor  r  s                  @@rE   _extract_anchors_from_exprr  %
  sQ    w&&& yy501 499~MM$E2
 		!I)SXX&dCII& c499#7#781<J
DII,D,DEG"1*g"FJ z*7332<<>",;*2:w*G'J*3J*H'J	 z*7332<<>",  !ICj 122$Z0;;DDFeOQ	 JYGGcmm, sDJJ$9$9:Q>K djj.G.GHH$3K$J!K$X.#5(1+x(H%X $X.#5  T__59L!,0C0CDIK<KKchh'
 sDII$8$89A=K dii.F.FGH$3K$J!K$X.#5(1+x(H%X $X.#5  T__59L!,0C0CDIK<KKK  s   L7 7	MMc                	   |j                   J |j                   j                  yt        j                  | j                  |j                   j                        j                         }|j                   j                  |S |j                   j                  |j                   j                  |S t        ||j                   j                        }d}d}g }|j                   j                  |j                   j                  k(  rDt        ||j                   j                        }||| }|j                  d|z  d||z
  z  z          n||d dz   }|j                  d|z  dt        |      |z
  z  z          t        j                  | j                  |j                   j                        j                         }t        ||j                   j                        }t        |j                   j                  dz   |j                   j                        D ]  }t        j                  | j                  |      j                         }	||	dz   z  }t        |	      t        |	j                               z
  }
|j                  d|
z  dt        |	      |
z
  z  z           ||d| z  }t        |      t        |j                               z
  }
|j                  d|
z  d||
z
  z  z          d}	 t        |      }|!|D cg c]  }|j!                  dd       }}n%|D cg c]  }t#        |       }}|j$                  dk(  r|xj&                  |z  c_        |j(                  dk(  r|xj*                  |z  c_        t        t        |            D ]  }t        t        ||               D ]t  }||j$                  k  r||j$                  k(  r||j&                  k  r2||j(                  k(  r||j*                  k\  rQ||j(                  kD  ra||   |   dk(  smd||   |<   v  |D cg c]  }dj-                  |       }}d}t        t        |            D ]X  }|t        j                  | j                  |j                   j                  |z         j                         dz   z  }|||   dz   z  }Z |S # t        $ r Y w xY wc c}w c c}w c c}w )	a  
    Python 3.11+ only. Returns lines of source code (from code object `code`)
    corresponding to `inst`'s location data, and underlines relevant code to `inst`.

    Example: CALL on `g`:
    f(g(
      ^^
        h(x)))
        ^^^^^

    We need our own implementation since `format_frame_summary` in
    Python's `traceback` module doesn't handle multi-line expressions
    (and their anchor extraction code is not completely correct).
    Nrj  rr   ~rK   r3   ^r   )	positionsr  	linecachegetliner  rstripr  
col_offsetr  r  r   r   re  lstripr  r  rM  r   r  r  r  r  rN   )r  inst
first_linestart_offset
end_offsetr  markers	last_liner  line
num_spacesanchorsmarkermutable_markersr  r`  r  s                    rE   get_instruction_source_311r  
  s    >>%%%~~$ ""4#3#3T^^5J5JKRRTJ~~  (~~  (DNN,I,I,Q z4>>+D+DEL JGG ~~  DNN$9$99 T^^-J-JK
\*5s\)C:3L,MMN\]+d2s\)C3z?\3Q,RRS%%dnn77

&( 	 !DNN,I,IJ
DNN11A5t~~7P7PQ 	NF$$T%5%5v>EEGDtd{"GTS%77JNN3+cSY5K.LLM	N 	9[j))^c)*:*:*<&==
sZ'#j1H*IIJ"&G,W5
 :AB6>>#s+BB HO+OVDL+O+O ""a'##|3#%%*&&,6& CL) 	7FS!89: 7G333W444w?V?V9Vg888w999G666"6*3/3636OF+C07	7" 2AAv2776?AAF3w<  $d..0E0E0IJQQS	
 	'!*t##$ MW  
 C ,P4 Bs$   R% 0R5R:R?%	R21R2c                R    t        | t        j                        rt        | dd       S y )N_dynamo_static_input_type)rN  r   r  r  r|  s    rE   get_static_address_typer  
  s#    !U\\"q5t<<rD   c                   t         j                  j                  j                  t         j                  j                  t         j
                  t         j                  j
                  f}t         j                  j                  j                  t         j                  j                  t         j                  t         j                  j                  f}| g ||v S r@   )	r   rp  	Generator	get_statedefault_generatorrv  rw  	set_statery  )rx   getterssetterss      rE   is_rng_state_getter_or_setterr    s     	$$))

  G 	$$))

  	G (g((((rD   c                    t        | t        j                        xrA | j                  dk(  xr0 | j                  j
                  t        j                  j                  u S )N__get__)	rN  r{  r   r   __self____objclass__r   rp  _TensorBaserZ  s    rE   is_tensor_base_attr_getterr!  "  sK    5%112 	@NNi'	@NN''588+?+??rD   c                    t        | d      S )N__torch_function__)r  rZ  s    rE   is_torch_function_objectr$  *  s    5.//rD   c                    ddl m}m} ddlm} t        | |      ryt        | |      r|j                  |        t        | |      xr t        | j                  d      S )Nr   )LazyVariableTrackerUserDefinedObjectVariable)TensorWithTFOverrideVariableTr#  )	torch._dynamo.variablesr&  r'  &torch._dynamo.variables.torch_functionr(  rN  realizer  rx   )r"  r&  r'  r(  s       rE   has_torch_functionr,  .  sU    VS"23")*##B'b34 
&: rD   c                    d }d }t         j                  j                  j                         x}r)| |j                  v r|j                  |    }|j
                  }|j                  | d||      S )NF)static_shapessymbolic_contextrJ  )r   r   r&   r   tensor_to_contextrQ  from_tensor)r  r  r/  rJ  tracing_contexts        rE   to_fake_tensorr3  >  sw    F--66>>@@@111.@@C%33F  	1A& !  rD   c                    t        |        xr1 t        |        xr# t        |       xr | j                  j                  S r@   )r6  r5  r   __dataclass_params__frozenrZ  s    rE   is_frozen_dataclassr7  L  sE    #E** 	.&u--	.	. &&--	rD   c                d    |D ]  }t        | |      st        | |      c S  t        |  d|       )zX
    Return the first available attribute or throw an exception if none is present.
    z% does not has any of the attributes: )r  r  r  )rH  attrsattrs      rE   get_first_attrr;  U  sC      &33%%& C5 EeWM
NNrD   c              #     K   | sd  y fd}t         j                  j                  j                  |      5 }| d d d        y # 1 sw Y   y xY ww)Nc                <    d }t        j                  | |      S )Nc                    t         j                  j                  j                  d   dxx   dz  cc<   t         j                  j                  | |      S )Ncompiled_autogradcompilesr3   )r   r  rr  r;   	_inductorcompile)gm_example_inputs_s     rE   inner_compilerzKmaybe_enable_compiled_autograd.<locals>.compiler_fn.<locals>.inner_compilerg  s@    ##,,-@A*MQRRM..sODDrD   )backend	fullgraphdynamic)r   rB  )r  rE  rH  rG  s     rE   compiler_fnz3maybe_enable_compiled_autograd.<locals>.compiler_fnf  s%    E ==Ni rD   )r   r  r?  enable)should_enablerG  rH  rI  r  s    ``  rE   maybe_enable_compiled_autogradrL  `  sG     	 ]],,33K@ 	CI	 	 	s   7AA	 	A	AAc                 @     G d dt               } t         |              S )Nc                      e Zd Zy)*invalid_removeable_handle.<locals>.InvalidN)r   r   r   r6   rD   rE   InvalidrO  u  s    rD   rP  )rc  r/   )rP  s    rE   invalid_removeable_handlerQ  s  s    $  79%%rD   c                
   t        | t        j                  j                        s| S t        | t        j                  j
                        r| S | j                  j                  | j                        }| j                  |_        |S r@   )	rN  r   r  r  r   GraphModuler+  __new__r  )r  proxys     rE   nn_module_proxyrV    sZ    c588??+
#uxx++,
MM!!#--0E\\ENLrD   c                  $     e Zd Z fdZd Z xZS )	GmWrapperc                >    t         |           || _        || _        y r@   )r)  r   r  unflatten_fn)r   r  rZ  r+  s      rE   r   zGmWrapper.__init__  s    (rD   c                T    t        |      } | j                  | j                  |       S r@   )r   r  rZ  r!  s     rE   r   zGmWrapper.forward  s'    t*tww))$/00rD   )r   r   r   r   r   r,  r-  s   @rE   rX  rX    s    )
1rD   rX  c                  	
 t        | j                  j                        D cg c]2  \  }}|j                  dk(  r|j                  j                  dd      r|4 c}}t        j                  j                  j                  rMdgk(  sJ t        |d   t              sJ t        |d         	d 	fd} |t        | |       |            
n`t        j                  |      \  }}t!        j"                  t        j$                  |      } |t        | |      |      
t        j&                  
fd}|S c c}}w )	z
    Mutate inputs so that they are flat and wrap gm such that it
    accepts those inputs.  This is needed for graphs that take
    bumpy inputs.
    r
  	steal_argFr   c                *    | d   t        | dd        z   S r  )r   r  s    rE   
flatten_fnz(flatten_graph_inputs.<locals>.flatten_fn  s    7T$qr(^++rD   c                    | d  g| d  S r@   r6   )	flat_argsboxed_inputs_counts    rE   rZ  z*flatten_graph_inputs.<locals>.unflatten_fn  s#    112TY?Q?R5STTrD   )treespecc                 X     |       }D ]  }| |   j                            |      S r@   )r_   )r-  ra  r  compiled_fnr_  inputs_idx_to_clears      rE   wrapperz%flatten_graph_inputs.<locals>.wrapper  s8    t$	 % 	AGMMO	 9%%rD   )	enumeraterV  r  r  r  rj   r   r  r?  in_compiled_autograd_regionrN  r   r   rX  r  tree_flattenro  r  tree_unflattenarg_tree_leaves)r  inputs
compile_gmr  r  rZ  flat_inputsspecrg  rb  re  r_  rf  s            @@@@rE   flatten_graph_inputsrq    s    !0At77m#		k5(I 	
 }}&&BB #qc)))&)T*** ^	,	U !2|!<j>PQ #//7T (()>)>N 2|!<kJ++
& NMs   7D<c                    t        | t        j                  j                        rt	        | d      sg S | j
                  j                  dg       S )Nr  locals_to_steal)rN  r   r   rS  r  r  rj   )maybe_gms    rE   get_locals_to_stealru    s<    h 4 45WXv=V	==.33rD   c                "    || j                   d<   y )Nrs  )r  )r  rs  s     rE   set_locals_to_stealrw    s    !0BGGrD   c                      e Zd Zd Zd Zy)Litc                    || _         y r@   r  )r   r  s     rE   r   zLit.__init__  s	    rD   c                    | j                   S r@   r{  r   s    rE   r  zLit.__repr__  s    vvrD   N)r   r   r   r   r  r6   rD   rE   ry  ry    s    rD   ry  r  warn_once_cachec                t    | t         v ry t         j                  |        t        j                  | |dz          y )Nr3   )
stacklevel)r}  r   warningswarn)r]  r  s     rE   	warn_oncer    s/     oMM#*q.1rD   c                P    t        j                  d      }|j                  d|       S )Nz\x1B[@-_][0-?]*[ -/]*[@-~]rj  )rk  rB  rl  )textansi_escapes     rE   strip_color_from_stringr    s"    **:;K??2t$$rD   c               #    K   	 t         j                  j                  j                  d      } d  t         j                  j                  j                  |        y # t         j                  j                  j                          w xY wwNT)r   rp  	_autograd _saved_tensors_hooks_set_tracing)r  s    rE   +_disable_saved_tensors_hooks_during_tracingr    sY     C""CCDI;;EB;;EBs   B	-A *B	+BB	c                 x    t         j                  j                  j                  xr t        j                          S r@   )r   rA  r4   freezingis_grad_enabledr6   rD   rE   is_parameter_freezingr    s)    ??!!**J53H3H3J/JJrD   c                    ddl m} t        t                     D cg c]  }t	        |       }}| r|D cg c]  }t        |      |vs| }}|S c c}w c c}w )Nr3   )IGNORED_MODES)variables.torch_functionr  re  r!   r   r   )filter_ignoredr  r  r  modes        rE   get_torch_function_mode_stackr    sV    7056O6Q0RS1#A&SES"'K$4:]+JKKL	 TKs   AA	Ac                h    | t               k  r| dk\  sJ t        j                  j                  |       S r^   )r!   r   rp  r   )inds    rE    get_torch_function_mode_stack_atr    s/    *,,9988**3//rD   c                l    t        t                     D ]  }t                 | D ]  }t        |        y r@   )re  r!   r"   r#   )r  r  r  s      rE   set_torch_function_mode_stackr    s9    ,./ $!#$  ,%d+,rD   c                    | j                   }t        j                  |      }t        |j                        dk7  rddlm}  |d      |j                  | j                  k7  rddlm}  |d      y )NrB  r3   )InternalTorchDynamoErrorz[Tensor subclass method __metadata_guard__ must take exactly two subclass metadata argumentsz?Tensor subclass method __metadata_guard__ must be a classmethod)	__metadata_guard__rr  	signaturer   r  r  r  r  r+  )rx   r  sigr  s       rE   verify_guard_fn_signaturer    sk    		!	!B


B
C
3>>a1&i
 	
 
{{eoo%1&M
 	
 &rD   c                   | j                   t        j                   t        j                  j                   fv xr | j                  t        j                  t        j                  j                  fv xrn | j
                  t        j
                  t        j                  j
                  fv xr6 | j                  t        j                  t        j                  j                  fv S r@   )rk   rc  rA   r   ri   r   __iter__)user_clss    rE   #does_not_override_dict_iter_methodsr  !  s    4::{'>'>'D'DEE 	SOO[-D-D-K-KLL	SMMdii)@)@)E)EFF	S $--1H1H1Q1Q!RR	rD   c                    ddg}|D ci c]4  }|| j                   v s|t        j                  | j                   |         6 }}|S c c}w )Nr  tag)r  r<  )r  KEYS_TO_COPYrn   tensor_dicts       rE   _extract_tensor_dictr  ,  sZ    #L 4@,/3!**CTTYYqzz#''K  	s
   A%Az(Dict[int, weakref.ReferenceType[object]]user_obj_id_to_weakrefc                2    t        |           }|J d       |S )NzUser object is no longer alive)r  )obj_idrH  s     rE   get_user_object_from_idr  ?  s$    
 
(
*C?<<<?JrD   c                R    t        |       }t        j                  |       t        |<   y r@   )r6  rA  r?  r  )rH  r  s     rE   store_user_object_weakrefr  E  s    WF%,[[%56"rD   c                      e Zd ZU dZded<   dZded<   dZedd       Zedd       Z	edd       Z
edd	       Zeed
               Zy)CompileTimeInstructionCounterr   r   _counterr  _idc                ~    | j                   dz   | _         | j                   dk(  rt        j                         | _        y y rZ   )_depthr    r   r  r:  s    rE   r   z#CompileTimeInstructionCounter.startO  s1    ZZ!^
::?*002CG rD   c                    | j                   dz
  | _         | j                   dk(  r:| xj                  t        j                  | j                        z  c_        d| _        y y )Nr3   r   r  )r  r  r    endr  r:  s    rE   r  z!CompileTimeInstructionCounter.endU  sF    ZZ!^
::?LL044SWW==LCG rD   c                    d| _         y r^   r  r:  s    rE   r_   z#CompileTimeInstructionCounter.clear\  s	    rD   c                    | j                   S r@   r  r:  s    rE   rx   z#CompileTimeInstructionCounter.value`  s    ||rD   c              #     K   	 t         j                  r| j                          d  t         j                  r| j                          y y # t         j                  r| j                          w w xY wwr@   )r4   %record_compile_time_instruction_countr   r  r:  s    rE   recordz$CompileTimeInstructionCounter.recordd  sN     	;;		;;	 <v;;	 <s   A0$A
 "A0
#A--A0Nr  )r   r   )r   r   r   r  r  r  r  classmethodr   r  r_   rx   r   r  r6   rD   rE   r  r  J  s    HcCMF3 3
         rD   r  )rX   z3Union[List[Tuple[str, object]], List[List[object]]]rJ   z!Union[Tuple[str, ...], List[str]]r   rP   r  )rc   r   r   r   )r   zDict[str, float])rn   rP   r{   rP   r|   rC   r   r   )r   r<   r  )rn   rP   r{   r  r   r   )F)r   zLiteral['str']r   r   r   rP   )r   zLiteral['csv']r   r   r   zTuple[List[str], List[object]])rP   F)r   r   )r   rP   )r  rP   r   r   )r   zfx.Graphr   r   )rH  objectrI  zType[T]r   TypeGuard[T])rH  r  rI  z)Tuple[Type[List[T]], Type[Tuple[T, ...]]]r   r  )rH  r  rI  zIterable[type]r   r   r@   )r  z0Union[CompilationMetrics, BwdCompilationMetrics])r  r   r   r   )r   z6List[Union[CompilationMetrics, BwdCompilationMetrics]])r   r  )r  ztorch.Tensor)r3   )T)rH  r   )r  ztypes.ModuleType)rx   r   )r  r   )rx   r   r=  r   )r\  rA  )r{  zUnion[torch.Tensor, Any]rP  r   rQ  r%   r   z)Tuple[bool, Optional[TensorStaticReason]])FFF)rP   rP   r  r   r   r   )r  rP   r   zOptional[_Anchors])r  ztypes.CodeTyper  zdis.Instructionr   rP   )r"  z,torch._dynamo.variables.base.VariableTrackerr   r   )TT)r  ztorch.fx.GraphModule(  
__future__r   atexitrA   r   r<  r  r  r^  r  ro  r  r1  rr  rV   r   r   r  r  r   rk  rT  r  r   r{  rW  r  r  rA  r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   typing_extensionsr   r   r   torch._functorch.configtorch._inductor.configrA  r4   r  %torch.fx.experimental.symbolic_shapestorch.utils._pytreerr  _pytreer  r   torch._Cr   r    r!   r"   r#   torch._dispatch.pythonr$   torch._guardsr%   r&   torch._subclasses.meta_utilsr'   torch._utils_internalr(   r)   torch.fx._utilsr*   r+   torch.nn.modules.lazyr,   torch.utils._tritonr-   r.   torch.utils.hooksr/   r  r^  ModuleNotFoundErrortorch._loggingtorch._numpy_numpyr  r0   r2   rj  fftlinalgru  r5   r  NP_TO_TNP_MODULEr   r7   r8   r9   rU   r:   r  r  r<  unpatched_nn_module_getattrrB   r;   r=   troubleshooting_urlnnmodule_doc_urlnnmodule_doc_url_msgr   r   r   r>   rG   r   timer_counterrT   r[   r\   r`   rb   rd   rp   ry   r}   r   r   r   registerr   FloatTensorrj  rC   DoubleTensorrk  double
HalfTensorri  halfBFloat16Tensorr  
ByteTensorrc  
CharTensorr_  
LongTensorrb  long	IntTensorra  r   ShortTensorr`  short
BoolTensorr   tensortype_to_dtyper   r   r   r   r   r  r  r  r#  r%  r*  r/  r1  rJ  rU  ParamSpecArgsParamSpecKwargs	ParamSpecTypeVarTupleTypeAliasTyperV  r[  rg  rl  rt  ry  rq  r  r  r  r  r  r  r  r  r  r  r  r   !DEFAULT_COMPILATION_METRICS_LIMITr  r  r   r  r  r  r  r  r   r  r  r'  r5  r;  rd  rn  r~  r  r  r  r  r  r  r  r  r  r  complexrP   bytesr   Ellipsisr+  CodeTyperF  r7  memory_formatr@  r  tritonr   languager  r  r  r  r  r  r  r   r  ri   r  r   r  r  r  __length_hint__tuple_iterator_lenr  rT  r  r  r  r  r  	iter_nextr	  r  r  r   r$  r4  r6  r8  r?  rS  GLOBAL_KEY_PREFIXtorch._subclassesrU  rZ  r^  rc  rh  r  rn  r  r  orig_code_mapr   r  r  seen_code_mapr  r   r  r  r  r  r  r  r  r  r  r  r$  r&  r+  r3  r6  r5  r?  r  rA  rG  rR  r\  rb  rr  rs  rt  all_hook_namesro  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r$  r,  r3  r7  r;  rL  rQ  rV  rX  rq  ru  rw  ry  r   r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r6   rD   rE   <module>r     s   "       
   	        	 	 
        % $  #     , 1   0 0 , $ $   < 0 = T F 1 > -	.) 
FFIIII	>
: 	
 FFCGGIIszzIIszz	
  "VV
 CL#hhoo99 +B;+B+B;CVCV+W
( W$& > &G  Q .//UV g! 46 0 5 3J+2I2I*3 /   	!

=
.
 	
 
  26J  !%T@	T@T@ T@ T@n 
 
 
,1
%)# 
"J 8 8
 
u{{3	5	u}}ejj1	5>>+	u{{n	uzzm	u{{EJJ/	OOekk599-	U[[1	uzzm  ( #:"; ",
	?
G	 B 
 
 
	 I 
 
 
& w 	%!G&	$3%$, T 
 = = =B    %' !
 K>?   @
3I3(%!
&ZG ZGz 59 1 8 ( ( (( +   )*  ! GT&
 9 9"	$(
 Q 0*"X 2  		J	NN	LL	KK		LL$ y   foo334W
 "&bggi	 0%)"))+%6" 6&*+B;+B+B+D+K+K+M&N# N&*48n# 4#33 ^^
1
 	58&RM
@B 
 !  = <7'?
; ii-2`FF	H
 
> 
> '( /Fk.E.Ed.K+ K LN H M '( T, ,&

/xv  	!1 " ".b$NB*2G/	 5$  /	D*W +,<= ,.?@   $&99<QQ  	F  	$

$ 
$$$ $&$ $(@4&
"	C   vriX)"0 
O  $&1 1,^41   E !	2% C CK0
,
"
  DF @ E6
# #m_  	B>  		s%   +i& 0Bi4 &i10i14i=<i=