o
    ߗi                    @  s@  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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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 d dl:m;Z;m<Z< d dl=Z=d dl>Z=d dl?Z=d dl@mA  mBZC d d	l=mDZD d d
lEmFZFmGZGmHZHmIZI d dlJmKZK d dlLmMZM d dlNmOZOmPZP d dlQmRZR d dlSmTZTmUZUmVZVmWZW d dlXmYZYmZZZ d dl[m\Z\ d dl]m^Z^ d dl_m`Z`maZa d dlbmcZc zd dldZeW n efyP   dZeY nw zMd dlgZ=d dlhmiZj d dlNmkZk d dlgmlZl ddlmmnZn eereeeejoeejpeejqfZrdesd< eeejeejoejjoeejpejjpeejqejjqiZtndZri Ztd dlumvZvmwZwmxZx W n
 eyy   Y nw e7dZze=j{j|j}Z~e=j{j|jZe=j{j|jZeej(Zdesd< i Zd esd!< d"Zd#Zd$e d%ZeeZi Zd&esd'< eeZd(esd)< e ZG d*d+ d+e	jZG d,d- d-Zdd4d5Zd add7d8Zdd9d:Zd add=d>Zdd?d@ZddAdBZdCesdD< ddEdFZe 		G			Gd	d
dRdSZe3dddWdXZe3	Gddd[dXZddd\dXZejdd]d^Ze=je=je=jfe=je=je=jfe=je=je=jfe=je=jfe=je=jfe=je=jfe=je=je=jfe=je=je=jfe=je=je=jfe=je=jfi
ZG d_d` d`Ze Zdadb ZddcddZdedf Zdgdh ZddidjZddldmZddpdqZÐddsdtZdudv Zdwdx ZG dydz dzZe3dddZe3dddZe3dddZdd Zejdkrejejejej7ejejfZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Ze
"ddd ZܐdddZdd ZސdddZߐdddZdZejG dd dZdZejedadesd< dddZdddZdddZeMedÍZdddƄZdddȄZddd˄ZG dd̈́ d̓Zdadesd< dddфZe 	G	Gdd ddՄZejG ddׄ d׃ZG ddل deǃZe e_ddۄ ZddܜddބZdd Zd!ddZe dd Zdd ZdddZdd Zdd Zdd Ze
"dd"ddZdd Z d#ddZdd Ze"ddd Zeeeeeeedej	e
j	eje=je=je=je=je=je=je=j{jje=jjhZdesd< ea rd dlZeejj 	 dd  Zdd Zdd Zdd Zdd Zd	d
 Zdd Z ei ! Z"desd< ei # Z$desd< ee% # Z&desd< ee'dZ(desd< ee'e)d Z*desd< e(j+Z,e-j.Z/dd Z0dd Z1dd Z2e3Z4d$ddZ5dd Z6d d! Z7d"d# Z8d$d% Z9d&d' Z:dd(d)Z;d*d+ Z<d,d- Z=dd.d/Z>dd0d1Z?d2Z@d d3lAmBZB d4d5 ZCd6d7 ZDd8d9 ZEd:d; ZFddGd<dGd=dGdGejGdGf	d>d?ZHd@dA ZIej dBdC ZJeǃ ZKeeLZMdDesdE< g ZNdFesdG< eǃ ZOe
"ddHdI ZPdJdK ZQd%dLdMZRdNdO ZSdPdQ ZTddRdSZUeV ZWdTdU ZXe dVdW ZYdXdY ZZdZd[ Z[d\d] Z\d&d_d`Z]dadb Z^d'dedfZ_d(dhdiZ`d)dldmZadd*dodpZbG dqdr dre	jZcd+dtduZdd,d|d}Zed~d Zfdd ZgddgZhddgZig dZjehei ej Zkdd Zl	G	G	Gd-ddZm	G	G	Gd-ddZndd Zodd ZpG dd dZqdd ZrG dd dZsG dd dZtdd Zudd Zvdd Zwdd Zxdd Zydd Zzd.ddZ{ejG dd dZ|d/ddZ}d0ddZ~dd Zdd Zdd Zdd Zd1ddZdd ZddÄ ZdĐdń Zej d2dƐdǄZdȐdɄ Zdʐd˄ ZG d̐d̈́ de=j{j|Zd3dАdфZdҐdӄ ZdԐdՄ ZG d֐dׄ d׃Ze Zdesd< d#dڐdۄZdܐd݄ Zej dސd߄ Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zi Zdesd< dd Zdd ZG dd dZd4ddZdS (5      )annotationsN)contextmanager)is_dataclass)	lru_cache)MethodWrapperType)AnyCallablecastClassVarCounterDefaultDictDequeDict	GeneratorGenericIterableIteratorKeysViewListOptionaloverloadSetTupleTypeTypeVarUnion
ValuesView)LiteralTypeIs)fx)_instruction_counter_len_torch_function_stack_pop_torch_function_stack_push_on_torch_function_stack)enable_python_dispatcher)MetricsContext)SourceTracingContext)is_sparse_compressed)log_chromium_event_internallog_compilation_eventrecord_chromium_event_internalsignpost_event)_format_graph_codelazy_format_graph_code)_WaitCounter)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_metricsDict[str, float]cumulative_time_spent_nsc                   @     e Zd ZdZdZdZdS )ReInplaceTriggerr7         N)__name__
__module____qualname__AUTO_FUNC_V1AUTO_FUNC_V2
TRITON_OPSr:   r:   r:   Q/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/torch/_dynamo/utils.pyrF          rF   c                   @  sl   e Zd ZU eeZded< edddZ	edd
dZ
edd Zedd Zedd Zedd ZdS )ReinplaceCounterszDefaultDict[str, int]_valuestriggerrF   bytesintc                 C  s*   |dkr| j d|j   |7  < d S d S Nr   missed_bytes_)rR   name)clsrS   rT   r:   r:   rO   add_missed_bytes   s   z"ReinplaceCounters.add_missed_bytescountc                 C  s(   |dkr| j d|   |7  < d S d S Nr   missed_tensors_)rR   )rY   rS   r[   r:   r:   rO   add_missed_opportunities   s   z*ReinplaceCounters.add_missed_opportunitiesc                 C  s   | j   d S N)rR   clearrY   r:   r:   rO   r`      s   zReinplaceCounters.clearc                 C  s*   d}t D ]}|| jd| d7 }q|S r\   )rF   rR   getrY   sumrS   r:   r:   rO   get_total_missed   s   z"ReinplaceCounters.get_total_missedc                 C  s,   d}t D ]}|| jd|j d7 }q|S rV   )rF   rR   rb   rX   rc   r:   r:   rO   get_total_missed_bytes   s   z(ReinplaceCounters.get_total_missed_bytesc                 C  s   | j rtdd| j  d S d S )Ninductorreinplace_counters)rR   r,   ra   r:   r:   rO   log   s   zReinplaceCounters.logN)rS   rF   rT   rU   )rS   rF   r[   rU   )rI   rJ   rK   collectionsdefaultdictrU   rR   __annotations__classmethodrZ   r^   r`   re   rf   ri   r:   r:   r:   rO   rQ      s   
 


rQ   rows3Union[List[Tuple[str, object]], List[List[object]]]headers!Union[Tuple[str, ...], List[str]]returnstrc              
   C  sJ   zdd l }|j | |dW S  ty$   ddd t|g| D  Y S w )Nr   rp   
c                 s  s     | ]}d  tt|V  qdS ), N)joinmaprs   ).0rowr:   r:   rO   	<genexpr>       
ztabulate.<locals>.<genexpr>)tabulateImportErrorrw   	itertoolschain)rn   rp   r}   r:   r:   rO   r}      s   
r}   Nonec                   C  s   t d a d S Nr7   )
curr_framer:   r:   r:   rO   increment_frame      r   c                   C  s   t   t  dad S Nr   )rD   r`   rB   r   r:   r:   r:   rO   reset_frame_count   s   r   cntrU   c                 C  s   t | 7 a d S r_   )op_count)r   r:   r:   rO   increment_op_count   r   r   c                  C  sB   i } t  D ]
\}}|d | |< q| dd| dd | d< | S )N    eAentire_frame_compiler   entire_backward_compiletotal_wall_time)rD   itemsrb   )total_by_keyphasetimingr:   r:   rO   calculate_time_spent   s   
r   c                  C  sB   t  } d}|  D ]\}}| d| dt|d }q	t| d S )NzTIMING: :   )r   r   roundprint)r   outkeyvaluer:   r:   rO   print_time_report  s
   r   r%   _METRICS_CONTEXTc                   C  s   t S r_   )r   r:   r:   r:   rO   get_metrics_context%     r   Fr   
phase_nameOptional[str]log_pt2_compile_eventboolmetadataOptional[Dict[str, object]]dynamo_compile_column_uslog_waitcounterGenerator[Any, None, None]c                 c  s   |dur| dsJ |r|}| }n| }d}| tvrg t| < i }|r(|| |r1|d|i t }	t }
|	||
|| zstj	|  d* |rjt
d|    dV  W d   n1 sdw   Y  ndV  W d   n1 sww   Y  W t }||
 }t|  |d  |	||i |
| |rt }| r|||d  t|  |7  < dS dS t }||
 }t|  |d  |	||i |
| |rt }| r|||d  t|  |7  < w )a  
    dynamo_timed is a context manager
    By wrapping a function in dynamo_timed, we can get a few things:

    1) Log timings to pt2_compile_events.
    2) Log timings to CompilationMetrics (dynamo_compile).
    3) Chromium events.
    4) Storing a record in compilation_time_metrics
       For example:

        def _foo(...):
            with dynamo_timed("_foo"):
                ...

        Would show up as an entry in our timing dict:
        OrderedDict([('_foo', [0.083690, 0.23949, 3.1425e-05])])
        This is extremely useful for granular debugging.

    Although it is tempting to use dynamo_timed as a decorator, please do not.
    In its decorator form it makes cProfile traces less useful as dynamo_timed
    suddenly becomes a bottleneck for lots of function calls (as only one parent
    pointer is recorded).

    Params:
    - key: key into compile_time_metrics. If phase_name is not provided, this is
      also the event name used for pt2_compile_events logs and chromium events.
    - phase_name: Optional override for the event name.
    - log_pt2_compile_event: Whether to log a pt2 compile event internally.
    - metadata: Extra metadata to put in pt2_compile_events.
    - dynamo_compile_column_us: If provided, updates the specified CompilationMetrics
      field to be logged to dyname_compile column. We expect all columns to be _us;
      therefore, the field name must end with "_us".
    - log_waitcounter: If set, we'll log a waitcounter of the form "pytorch.dynamo_timed.{key}"
    N_usfn_namez (dynamo_timed)zpytorch.dynamo_timed.r     )endswithrB   updateget_chromium_event_loggertimetime_nslog_event_starttorchprofilerrecord_functionr/   guardappendlog_event_endr   in_progress	incrementrD   )r   r   r   r   r   r   
event_namer   event_metadatachromium_logstart_nsend_nstime_spent_nsmetrics_contextr:   r:   rO   dynamo_timed)  st   -


r   reprLiteral['str']	aggregatec                 C     d S r_   r:   r   r   r:   r:   rO   compile_times     r   Literal['csv']Tuple[List[str], List[object]]c                 C  r   r_   r:   r   r:   r:   rO   r        c                   s|   dd f fdd	| dkr#fddt D }d}|t|d	d
7 }|S | dkr<fddt  D }tt  }||fS dS )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     | S r_   r:   xr:   r:   rO   <lambda>      zcompile_times.<locals>.<lambda>c                   s     r|t | S dt|| S )Nrv   )rd   rw   rx   )valuesitem_fn)r   r:   rO   fmt_fn  s   zcompile_times.<locals>.fmt_fnrs   c                   s$   g | ]}| t | d d dfqS )c                 S     | dS )Nz.4fr:   r   r:   r:   rO   r         *compile_times.<locals>.<listcomp>.<lambda>r   )rB   ry   kr   r:   rO   
<listcomp>  s    z!compile_times.<locals>.<listcomp>z!TorchDynamo compilation metrics:
)FunctionzRuntimes (s)rt   csvc                   s   g | ]
} |d d dqS )c                 S  r   )Nz.6fr:   r   r:   r:   rO   r     r   r   r   r:   )ry   vr   r:   rO   r     s    N)rB   r}   r   listkeys)r   r   rn   r   r   rp   r:   )r   r   rO   r     s   

c                   C  s   t tddd d S )Nrs   Tr   )ri   infor   r:   r:   r:   rO   dump_compile_times     r   c                   @  s*   e Zd ZddddZdd	 ZdddZdS )DuplicateWarningChecker   maxsizerU   rr   r   c                 C  s   || _ |   d S r_   )r   reset)selfr   r:   r:   rO   __init__  s   z DuplicateWarningChecker.__init__c                 C  s   t  | _d S r_   )rj   OrderedDictsetr   r:   r:   rO   r        zDuplicateWarningChecker.resetr   !Union[str, Tuple[object, object]]r   c                 C  sd   || j v r| j j|dd tjsdS dS d | j |< t| j | jkr0| j jdd t| j | jks!dS )NT)lastF)r   move_to_endr8   verboselenr   popitemr   r   r:   r:   rO   add  s   

zDuplicateWarningChecker.addN)r   )r   rU   rr   r   )r   r   rr   r   )rI   rJ   rK   r   r   r   r:   r:   r:   rO   r     s    r   c                  C  s$   t jdddk} | rt S t S )NTORCH_COMPILE_DEBUG01)osenvironrb   add_file_handler
contextlib	ExitStack)compile_debugr:   r:   rO   setup_compile_debug  s   r   c                   C     t   d S r_   )graph_break_dup_warning_checkerr   r:   r:   r:   rO   reset_graph_break_dup_checker     r  c                    sf   t jt d} t j| dd tt j| d td  t	
 }| fdd |S )NtorchdynamoTexist_okz	debug.logztorch._dynamoc                     
     S r_   removeHandlerr:   log_file_handlerloggerr:   rO   r        
 z"add_file_handler.<locals>.<lambda>)r   pathrw   get_debug_dirmakedirsloggingFileHandler	getLogger
addHandlerr   r   callback)log_path	exitstackr:   r
  rO   r     s   

r   c                    sV   t  } tjd ur)ttj tjj	 D ]
  |  fdd q| S | S )Nc                     r  r_   r  r:   r
  r:   rO   r     r  z setup_log_file.<locals>.<lambda>)r   r   r8   log_file_namer  r  r   _logging	_internalget_loggersr  r  )r  r:   r
  rO   setup_log_file   s   

r  c                 C  s(   t   d|j dt| j d|j dS )Nz/error_recordings/_z.rec)r  co_nametyperI   co_firstlineno)exccoder:   r:   rO   gen_record_file_name  s   r#  filenamec                 C  s   z9t j| rtd|  W d S t jt j| dd t| d}|| W d    W d S 1 s2w   Y  W d S  t	yI   t
d|  Y d S w )Nz9Unable to write execution record %s; file already exists.Tr  wbz#Unable to write execution record %s)r   r  existsri   warningr  dirnameopendump	Exception	exception)r$  exec_recordfr:   r:   rO   write_record_to_file  s   
&r/  gfx.Graphc                 C  s&   d}| j D ]}d|jv r|d7 }q|S )Nr   callr7   )nodesop)r0  cnr:   r:   rO   count_calls  s   

r7  r   c                 C  r   r_   r:   r   r:   r:   rO   identity'  r   r8  c                 C  s6   zt |  W dS  ty   Y dS  ty   Y dS w )NTF)hash	TypeError
ValueErrorr   r:   r:   rO   hashable+  s   r<  c                  O  r   r_   r:   argskwargsr:   r:   rO   nothing6  r   r@  c                   @  sJ   e Zd ZdZdd Zdd ZdddZd	d
 Zdd Zdd Z	dd Z
dS )ExactWeakKeyDictionaryz\Similar to weakref.WeakKeyDictionary, but use `is`/`id` rather than `==` to compare equalityc                 C  s   i | _ i | _d S r_   r   refsr   r:   r:   rO   r   =  s   
zExactWeakKeyDictionary.__init__c                 C  s   | j t| S r_   )r   idr   r:   r:   rO   __getitem__A  r   z"ExactWeakKeyDictionary.__getitem__Nc                 C  s   | j t||S r_   )r   rb   rD  )r   r   defaultr:   r:   rO   rb   D     zExactWeakKeyDictionary.getc                 C  s   t || jv S r_   )rD  r   r   r:   r:   rO   __contains__G  r   z#ExactWeakKeyDictionary.__contains__c                   s<   t |  jvrt| fddj < |j < d S )Nc                   r  r_   )
_remove_id)refidxr   r:   rO   r   M  r  z4ExactWeakKeyDictionary.__setitem__.<locals>.<lambda>)rD  rC  weakrefrJ  r   )r   r   r   r:   rK  rO   __setitem__J  s   
z"ExactWeakKeyDictionary.__setitem__c                 C  s,   || j v r	| j |= || jv r| j|= d S d S r_   rB  )r   rL  r:   r:   rO   rI  P  s
   

z!ExactWeakKeyDictionary._remove_idc                 C  s   | j   | j  d S r_   )rC  r`   r   r   r:   r:   rO   r`   V  s   
zExactWeakKeyDictionary.clearr_   )rI   rJ   rK   __doc__r   rE  rb   rH  rN  rI  r`   r:   r:   r:   rO   rA  :  s    
rA  objobjectallowed_typesType[T]	TypeIs[T]c                 C  r   r_   r:   rP  rR  r:   r:   rO   istype[  r   rV  )Tuple[Type[List[T]], Type[Tuple[T, ...]]]c                 C  r   r_   r:   rU  r:   r:   rO   rV  `  r   Iterable[type]c                 C  r   r_   r:   rU  r:   r:   rO   rV  g  r   c                 C  s(   t |tttfrt| |v S t| |u S )zisinstance() without subclasses)
isinstancetupler   r   r  rU  r:   r:   rO   rV  l  s   rH      c                 C  s.   t jdkrt| trdS t| tjp| tju S )Nr[  T)sysversion_inforY  _builtin_final_typing_classestyping_Finalr   r   r:   r:   rO   	is_typing  s   	rc  c              
   C  s2   t sdS t| t jt jt jt jt jt jt jt j	fS NF)
nprV  int8int16int32int64uint8uint16uint32uint64rb  r:   r:   rO   is_numpy_int_type  s   rn  c                 C  s   t sdS t| t jt jt jfS rd  )re  rV  float16float32float64rb  r:   r:   rO   is_numpy_float_type  s   rr  c                 C  s   t | tjott| dS )N__wrapped__)rY  	functools_lru_cache_wrapperis_functioninspectgetattr_staticrb  r:   r:   rO   is_lru_cache_wrapped_function  s   
ry  c                 C  s   t | pt| tjjtjjfS r_   )rv  rY  r   _opsOpOverloadPacket
OpOverloadrb  r:   r:   rO   is_function_or_wrapper  s   
r}  c                 C  s   t | tjtjtjtjfS r_   )rY  typesFunctionTypeBuiltinFunctionTypeMethodDescriptorTypeWrapperDescriptorTyperb  r:   r:   rO   rv    s   rv  c                 C  s   t | tjtjtjtjtjfS r_   )rY  r~  GetSetDescriptorTyper  r  MemberDescriptorTyper   rb  r:   r:   rO   is_wrapper_or_member_descriptor  s   r  c                 C  s   t | d S r   ) unwrap_with_attr_name_if_wrapper)fnr:   r:   rO   unwrap_if_wrapper  r  r  c                 C  s<   t | rt| ddrt| d| } d}| |fS d }| |fS )N_torchdynamo_inlineF)rv  rw  rx  )r  	attr_namer:   r:   rO   r    s   r  c                 C  s   t sdS t| t jS rd  )re  rV  ndarrayrb  r:   r:   rO   is_numpy_ndarray  s   r  c                 C  s.   t jt jjgtjR }|t jjf }t| |S )zCheck of obj is a tensor)	r   Tensornn	Parameterr8   traceable_tensor_subclasses_subclassesr;   rV  )rP  tensor_listr:   r:   rO   istensor  s   
r  c                 C  s
   t | tS r_   )rY  r0   )modr:   r:   rO   is_lazy_module     
r  r   c                  G  s   t |   d S r_   )r   r>  r:   r:   rO   
print_once  r   r  c                   s6   |   fdd}|j dur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_   r:   r:   r   r:   rO   r.    r   zmake_cell.<locals>.fNr7   r   )__closure__r   )valr.  r:   r   rO   	make_cell  s   
r  c                 C  s   zt dd | D }dd | D }||fW S  tyJ } z'ddlm} ddlm} |d||   d	|t|   |d
 W Y d }~d S d }~ww )Nc                 s      | ]}|  V  qd S r_   as_proxyry   argr:   r:   rO   r{         z$proxy_args_kwargs.<locals>.<genexpr>c                 S  s   i | ]	\}}||  qS r:   r  )ry   r   r  r:   r:   rO   
<dictcomp>  s    z%proxy_args_kwargs.<locals>.<dictcomp>r7   unimplemented)typestrzcall_function args: r   from_exc)	rZ  r   NotImplementedErrorr!  r  variables.baser  r   r   )r>  r?  
proxy_argsproxy_kwargser  r  r:   r:   rO   proxy_args_kwargs  s   
r  r   Optional[float]Optional[int]c                 C     | d u rd S t | d S Nr   rU   r   r:   r:   rO   	to_int_ms     r  c                 C  r  )Ni@B r  r  r:   r:   rO   	to_int_us#  r  r  rH   c                   @  s2  e Zd ZU dZded< dZded< dZded< dZded< dZded< dZ	ded	< dZ
ded
< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded < dZded!< dZded"< dZ ded#< dZ!ded$< dZ"ded%< dZ#ded&< dZ$ded'< dZ%ded(< dZ&ded)< dZ'ded*< dZ(ded+< dZ)ded,< dZ*ded-< dZ+ded.< dZ,ded/< dZ-ded0< dZ.ded1< dZ/ded2< dZ0ded3< dZ1ded4< dZ2ded5< dZ3ded6< dZ4ded7< dZ5ded8< dZ6ded9< dZ7ded:< dZ8ded;< dZ9ded<< dZ:ded=< dZ;ded>< e<Z=d?ed@< dZ>dedA< dZ?dedB< dZ@dedC< dZAdedD< dZBdedE< dZCdedF< dZDdedG< dZEdedH< dZFdedI< dZGdJedK< dS )LCompilationMetricsNr   
compile_id	frame_keyr  co_filenamer  r   
cache_sizeaccumulated_cache_sizeguard_countshape_env_guard_countgraph_op_countgraph_node_countgraph_input_countr  
start_timeentire_frame_compile_time_sbackend_compile_time_sinductor_compile_time_scode_gen_time_s	fail_typefail_reasonfail_user_frame_filenamefail_user_frame_linenozOptional[Set[str]]non_compliant_opscompliant_custom_opsrestart_reasonsdynamo_time_before_restart_szOptional[bool]has_guarded_coderemote_cache_time_saved_sstructured_logging_overhead_sconfig_suppress_errors config_inline_inbuilt_nn_modulesspecialize_floatdynamo_config
is_forwardnum_triton_bundles!remote_fx_graph_cache_get_time_ms!remote_fx_graph_cache_put_time_msstart_time_usduration_us!dynamo_cumulative_compile_time_us'aot_autograd_cumulative_compile_time_us#inductor_cumulative_compile_time_us,inductor_code_gen_cumulative_compile_time_ustriton_compile_time_usruntime_cudagraphify_time_usruntime_triton_autotune_time_us%dynamo_compile_time_before_restart_uscuda_synchronize_time_us distributed_ephemeral_timeout_usstructured_logging_overhead_us!remote_fx_graph_cache_get_time_us!remote_fx_graph_cache_put_time_us#backward_cumulative_compile_time_usend_time_uspre_grad_pass_time_uspost_grad_pass_time_usjoint_graph_pass_time_usrU   log_format_versioninductor_configremote_cache_version"inductor_fx_remote_cache_hit_count#inductor_fx_remote_cache_miss_count%inductor_fx_remote_cache_backend_type!inductor_fx_remote_cache_hit_keys"inductor_fx_remote_cache_miss_keyscuda_versiontriton_versionzOptional[dict[str, bool]]feature_usage)HrI   rJ   rK   r  rl   r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  LOG_FORMAT_VERSIONr  r  r  r  r  r  r  r  r  r  r  r:   r:   r:   rO   r  ,  s   
 r  @   maxlenzDeque[CompilationMetrics]_compilation_metricsr5  c                 C  s,  t  }| }|sd S |jdi d|d| jd| jd| jd| jd| jd| jd| j	d	| j
d
| jd| jd| jd| jd| jd| jd| jd| jd urYt| jnd d| jd urft| jnd d| jd urst| jnd d| jd| jd| j d S d| jd| jd| j d S )Nr   r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r:   )r   get_topadd_event_datar  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  )r5  event_loggerr   r:   r:   rO   #add_compilation_metrics_to_chromium~  s   
	






r  c                  C  s   G dd dt j} d}t }d}tjjrtjj nd}|durdz7| D ]\}}t|t	r4t
||r9|| t|trDt|||< q%|D ]}||= qGt j|| dd}W |S  tyc   d}Y |S w |S )zN
    Method to parse and scrub uninteresting configs from inductor config
    c                      s   e Zd Z fddZ  ZS )zA_scrubbed_inductor_config_for_logging.<locals>.TypeSafeSerializerc                   s$   zt  |W S  ty   Y dS w )NzValue is not JSON serializable)superrF  r+  )r   o	__class__r:   rO   rF    s
   zI_scrubbed_inductor_config_for_logging.<locals>.TypeSafeSerializer.default)rI   rJ   rK   rF  __classcell__r:   r:   r  rO   TypeSafeSerializer  s    r  zV((^TYPE_CHECKING$)|(.*_progress$)|(.*TESTING.*)|(.*(rocm|halide).*)|(^trace\..*)|(^_))NT)rY   skipkeysz(Inductor Config is not JSON serializable)jsonJSONEncoderr   r   	_inductorr8   get_config_copyr   rY  rs   researchr   r   dumpsr+  )r  configs_to_scrub_rekeys_to_scrubinductor_conf_strinductor_config_copyr   r  r:   r:   rO   %_scrubbed_inductor_config_for_logging  s2   

r  start_time_nsend_time_nsmetricsexc_typeOptional[Type[BaseException]]	exc_valueOptional[BaseException]c                   s  fdd}fdd}d!fd	d
}t j }t jj rAzddlm}	m}
 |
}|		 }t
|j}W n ty@   d }d }Y nw d }d }tt jj | d |d ||  d |r\|jnd |rct|nd t|t t jjt rrtjnd|d|d||d}| d |d|d|d|d|d|d|d|d	}td"i i || t   jrd}nd}t jj| fdddd  t  tj rt!  d S d S )#Nc                   s      | d }|d ur|d S d S )Ng    .Arb   fieldmetricr  r:   rO   us_to_s     z+record_compilation_metrics.<locals>.us_to_sc                   s      | d }|d ur|d S d S r  r  r  r!  r:   rO   us_to_ms  r#  z,record_compilation_metrics.<locals>.us_to_msr  rs   rr   r   c                   sX   d
dd  | d }|d u rd S | = t|ts t|ts d S d fdd	|D S )Nitemr   rr   rs   c                 S  s&   zt | W S  ty   t d  Y S w r_   )rs   r+  )r%  r:   r:   rO   safe_str  s
   
zPrecord_compilation_metrics.<locals>._convert_collection_to_str.<locals>.safe_str,c                 3      | ]} |V  qd S r_   r:   )ry   r%  r&  r:   rO   r{     r  zQrecord_compilation_metrics.<locals>._convert_collection_to_str.<locals>.<genexpr>)r%  r   rr   rs   )rb   rY  r   r   rw   r  r!  r)  rO   _convert_collection_to_str  s   
z>record_compilation_metrics.<locals>._convert_collection_to_strr   )FbRemoteFxGraphCacheREMOTE_CACHE_VERSIONr    r  r  )r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  )	r  r  r  r  r  r  r  r  r  compilation_metricsbwd_compilation_metricsc                     s   dd t   D S )Nc                 S  s(   i | ]\}}|t |trt|n|qS r:   )rY  r   r   )ry   r   r   r:   r:   rO   r  2  s    z@record_compilation_metrics.<locals>.<lambda>.<locals>.<dictcomp>)dataclassesasdictr   r:   )r.  r:   rO   r   2  s    z,record_compilation_metrics.<locals>.<lambda>F)record_logging_overhead)r  rs   rr   r   r:   )"r   r  get_structured_logging_overheadr  utils should_use_remote_fx_graph_cachetorch._inductor.fb.remote_cacher+  r,  get_remote_backendr  rI   ModuleNotFoundErrorrs   _guardsCompileContextcurrent_compile_idrK   r  r  versioncudar1   triton__version__r  r  r   r  trace_structuredr  r8   log_compilation_metricsr*   )r  r  r  r  r  r"  r$  r*  r  r+  r,  r  backendr  common_metricslegacy_metricsrX   r:   )r.  r  rO   record_compilation_metrics  s   



rE  )on_exitnew_sizec                 C  s6   t t| krt  t t| kstjt| d}|ad S )Nr  )r   r  popleftrj   deque)rG  	new_dequer:   r:   rO   set_compilation_metrics_limitI  s
   rK  c                   C  r   r_   )r  r`   r:   r:   r:   rO   clear_compilation_metricsQ  r   rL  List[CompilationMetrics]c                   C  s   t tS r_   )r   r  r:   r:   r:   rO   get_compilation_metricsV  s   rN  c                   @  s   e Zd ZdZd+ddZd,ddZd	d
 Zd-ddZdd Zd.ddZ	d.ddZ
	d/d0ddZd1dd Zd2d"d#Z	$d3d4d'd(Z	$	d5d6d)d*Zd$S )7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.
    rr   	List[str]c                 C  $   t | jdr
| jjS g | j_| jjS )z]
        The main event stack, with every chromium event.
        Logged to tlparse.
        stack)hasattrtlsrR  r   r:   r:   rO   	get_stacka     zChromiumEventLogger.get_stackr   c                 C  s   |   }|r
|d S dS )zG
        Get the top event name or None if the stack is empty.
        N)rU  )r   rR  r:   r:   rO   r  l  s   zChromiumEventLogger.get_topc                 C  rQ  )zq
        A smaller subset of the main stack that gets used to log
        PT2 Compile Events internally.
        pt2_compile_substack)rS  rT  rX  r   r:   r:   rO   get_pt2_compile_substacks  rV  z,ChromiumEventLogger.get_pt2_compile_substackr@   c                 C  s   t | jds
i | j_| jjS )N
event_data)rS  rT  rZ  r   r:   r:   rO   get_event_data~  s   z"ChromiumEventLogger.get_event_datac                 C  s*   t  | _tt | _td| j d S )Nz*ChromiumEventLogger initialized with id %s)		threadinglocalrT  rs   uuiduuid4id_ri   r   r   r:   r:   rO   r     s   
zChromiumEventLogger.__init__r   rs   r   c                 K  s&   ||   vrdS | j|fi | dS )zd
        Same as add_event_data, but will silently not log if the event isn't in the stack.
        N)rU  r   )r   r   r?  r:   r:   rO   try_add_event_data  s   z&ChromiumEventLogger.try_add_event_datac                 K  sT   ||   vrtdt| d|    d|  }||vr!i ||< || | dS )zz
        Adds additional metadata info to an in-progress event
        This metadata is recorded in the END event
        zEvent z not in zq. Cannot add metadata to events that aren't in progress. Please make sure the event has started and hasn't ended.N)rU  RuntimeErrorr   r[  r   )r   r   r?  rZ  r:   r:   rO   r     s   	z"ChromiumEventLogger.add_event_dataFr   rU   r   r   r   c                 C  sb   t tjj }||d< | ||d| |  | | j|fi | |r/| 	 | dS dS )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
        r  BN)
rs   r   r9  r:  r;  _log_timed_eventrU  r   r   rY  r   r   r   r   r   r  r:   r:   rO   r     s   z#ChromiumEventLogger.log_event_startc                 C  s4   |   }|  }|  |  |  }|  d S r_   )rU  rY  r`   r[  )r   rR  substackrZ  r:   r:   rO   r     s   zChromiumEventLogger.resetr  c                   s   t tjj }||d< |  } |v r|  }| = ni }|| |  |d|}	 fdd}
|  } |vr@t	
d dS |
| |rZ|  }|
| t|	|| j| |  |  dS )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
        r  Ec                   s2    | d krt d |    | d ksd S d S )NrW  z>ChromiumEventLogger: Detected overlapping events, fixing stack)ri   r'  pop)rR  r   r:   rO   	pop_stack  s   z4ChromiumEventLogger.log_event_end.<locals>.pop_stackz7ChromiumEventLogger: Start event not in stack, ignoringN)rs   r   r9  r:  r;  r[  r   rd  rU  ri   r'  rY  r)   r`  rh  )r   r   r   r   r  r   r  all_event_datar   eventrj  event_stackrX  r:   ri  rO   r     s8   



z!ChromiumEventLogger.log_event_endNr   Optional[Dict[str, Any]]c                   s@   ||d ||dddd t jjd fddddd	 t   S )
za
        Logs a timed event in chromium format. See log_event_start, log_event_end, etc.
        r   r   r   )rX   tsr>  phcattidpidchromium_eventc                     r  r_   r:   r:   rl  r:   rO   r   (  r   z6ChromiumEventLogger._log_timed_event.<locals>.<lambda>F
payload_fnsuppress_contextexpect_trace_id)r   r  r@  r+   )r   r   r   r   r   r:   ru  rO   rd    s    

z$ChromiumEventLogger._log_timed_eventc              	     sz   |du ri }t tjj }||d< ||d |dddddd tjjd	 fd
dddd |r;t |  | j	| dS dS )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
        Nr  r   ir   r   p)rX   ro  r>  rp  rq  rr  rs  srt  c                     r  r_   r:   r:   ru  r:   rO   r   O  r   z7ChromiumEventLogger.log_instant_event.<locals>.<lambda>FTrv  )
rs   r   r9  r:  r;  r  r@  r)   rY  r`  re  r:   ru  rO   log_instant_event/  s0   
z%ChromiumEventLogger.log_instant_event)rr   rP  rr   r   )rr   r@   )r   rs   rr   r   F)
r   rs   r   rU   r   r@   r   r   rr   r   rr   r   )r   rs   r   rU   r   r@   r  rU   r   r   rr   r   r_   )
r   rs   r   rU   r   rs   r   rn  rr   r@   rd  )
r   rs   r   rU   r   rn  r   r   rr   r   )rI   rJ   rK   rO  rU  r  rY  r[  r   ra  r   r   r   r   rd  r}  r:   r:   r:   rO   rO  Z  s$    



	



J!rO  zOptional[ChromiumEventLogger]CHROMIUM_EVENT_LOGc                   C  s   t d u rt a t S r_   )r  rO  r:   r:   r:   rO   r   ]  s   r   r   reset_event_logc                 c  sh    t  }|r
|  t }|| |i | zdV  W || t i || dS || t i || w )z
    Context manager that creates a chromium start and end event. Chromium event
    logging is integrated with dynamo_timed, so you probably want to use that
    instead. Use this context manager only if you want to avoid dynamo_timed.
    N)r   r   r   r   r   r   )r   r  r   chromium_event_logchromium_start_timer:   r:   rO   chromium_event_timedd  s4   r  c                   @  s6   e Zd ZU dZded< ded< dd Zedd	 Zd
S )CleanupHookz,Remove a global variable when hook is calledr@   scopers   rX   c                 G  s$   t d urt  jd8  _| j| j= d S r   )CleanupManagerr[   r  rX   r   r>  r:   r:   rO   __call__  s   zCleanupHook.__call__c                 C  s,   || vsJ t  jd7  _|| |< t| |S r   )r  r[   r  )r  rX   r  r:   r:   rO   create  s   
zCleanupHook.createN)rI   rJ   rK   rO  rl   r  staticmethodr  r:   r:   r:   rO   r    s   
 r  c                      s*   e Zd ZU dZded<  fddZ  ZS )r  r   zClassVar[CleanupManager]instancec                   s&   | j | D ]}|  qt | d S r_   )r   r  rI  )r   rL  hookr  r:   rO   rI    s   zCleanupManager._remove_id)rI   rJ   rK   r[   rl   rI  r  r:   r:   r  rO   r    s   
 r  c                 C  s0   |   | j}| jr| jdur| j  |_|S )z!Clone the tensor and its gradientN)clonerequires_grad_requires_gradis_leafgradr   yr:   r:   rO   clone_tensor  s   r  dtypec             	     s.  t | r| S  fdd}t  | jjdkr"|| W  d   S | jtju rCtj||  || 	 | j
|  dW  d   S t| r|| jtjtjhv rY|  }|  }n|  }|  }tj||||||  | j
| jdW  d   S tdd t|  |  D }| jrt|d	 f| }ntj|d	  p| j| jd
}|  |  d	 |   }||  |  | z"| | !  | j"r|#| j$ | j"r| j%durt&| j% d|_%W n t'y   ||  Y W  d   S w t(| dr| j)* |_)|W  d   S 1 sw   Y  dS )zcopy while preserving stridesc                   sV   t | }| jr|| j | jr| jd urt| j d|_t| dr)| j	 |_|S )Nr  _dynamo_dynamic_indices)
r   r  r  r  r  r  clone_inputrS  r  copyr  r  r:   rO   torch_clone  s   

z clone_input.<locals>.torch_clonexlaN)is_coalesced)layoutc                 s  s     | ]\}}|d  | V  qdS )r7   Nr:   )ry   shapestrider:   r:   rO   r{     r|   zclone_input.<locals>.<genexpr>    )r  devicer  r  )+r<   r   no_gradr  r  r  
sparse_coosparse_coo_tensor_indicesrR   r  r  r(   
sparse_csr
sparse_bsrcrow_indicescol_indicesccol_indicesrow_indicessparse_compressed_tensorr   rd   zipsizer  is_quantizedempty_quantizedemptyr  data_ptrelement_sizeas_strided_copy_r  r  r  r  r  r  rb  rS  r  r  )r   r  r  compressed_indicesplain_indicesneeded_sizeresultcache_line_offsetr:   r  rO   r    sp   






/&r  c                 C  s   t | tu r3t| }| D ]"\}}t|trt|||< qt|tjs*J t |t|||< q|S t	| }t
t|D ]}t|| tjrOt|| ||< q=|S r_   )r  dictr   rY  rZ  clone_inputsr   r  r  r   ranger   )example_inputsresr   r   rz  r:   r:   rO   r    s   
r  r  torch.Tensorc              
   C  sV   z|    W d S  ty* } zddlm} tddt| }|d| |d }~ww )Nr7   )	SkipFramez\(.*r-  z(torch.compile cannot be run in context: )r  rb  r!  r  r  subr   )r  r  r  functorch_subclass_namer:   r:   rO   skip_frame_if_in_functorch_mode  s   r  c                  c  s^   t jj} t jjj}| 4 |  ! t t j }t	| t j
 r+t t j
 }W d    n1 s5w   Y  W d    n1 sDw   Y  z6d V  W t jj " t j| t j
 rnt j
| W d    d S W d    d S 1 syw   Y  d S t jj   t j| t j
 rt j
| W d    w W d    w 1 sw   Y  w r_   )r   _C_DisableFuncTorchr4  _python_dispatch_disable_current_modesr  randomget_rng_stater  r=  is_availableset_rng_state)disable_functorchdisable_current_modes	rng_statecuda_rng_stater:   r:   rO   preserve_rng_state  s6   

 
0
r  c                 C  s&   t | tjjjtjjjtjjtjjfS r_   )	rY  r   jit_traceTopLevelTracedModule_scriptRecursiveScriptModuleScriptFunctionScriptModule)model0r:   r:   rO   is_jit_model+  s   r  c                 C  sx   t | r| S ztj| |W S  ty;   z	tj| W  Y S  ty:   |r-td n	td Y Y d S Y Y d S w w )Nz	jit errorz0Both torch.jit.trace and torch.jit.script failed)	r  r   r  tracer+  scriptri   r,  error)modelr  r   r:   r:   rO   torchscript7  s    r  c              	   C  s&   zt | W S  ttfy   Y d S w r_   )rw  getfiler:  OSErrorrP  r:   r:   rO   r  I  s
   r  c                 C     t t| S )zLTest if an object is a namedtuple or a torch.return_types.* quasi-namedtuple)is_namedtuple_clsr  r  r:   r:   rO   is_namedtupleP  r   r  c                   s   zTt  trFt dd}|dv rW dS tt ddtrItt ddrLtdd  jD }|tfkr6W dS |rOt fd	d|D rRW dS W d
S W d
S W d
S W d
S W d
S  ty^   Y d
S w )zhTest if an object is a namedtuple or a (torch.return_types|torch.autograd.forward_ad).* quasi-namedtuplerJ   N)torch.return_typesztorch.autograd.forward_adT_fields_makec                 s  s    | ]	}|t ur|V  qd S r_   )r   ry   tr:   r:   rO   r{   `      z$is_namedtuple_cls.<locals>.<genexpr>c                 3  s$    | ]}t |o j|ju V  qd S r_   )r  __new__r  ra   r:   rO   r{   d  s    

F)
issubclassrZ  getattrrY  callable	__bases__anyr:  )rY   modulebasesr:   ra   rO   r  U  s:   


	r  Tuple[str, ...]c                 C  s   | t u rdS t| tsJ t| dr| jS tjG dd d}| jdks&J | t|t	| j
}i }t|D ]}|d dkrNtt|||rNt||j||< q6t|| j
ksXJ tt||jdS )	zIGet the fields of a namedtuple or a torch.return_types.* quasi-namedtuple)startstopstepr  c                   @  s   e Zd ZU ded< dS )z!namedtuple_fields.<locals>.MarkerrU   indexNrI   rJ   rK   rl   r:   r:   r:   rO   Marker~  s   
 r  r  r   r  )r   )slicer  rZ  rS  r  r0  	dataclassrJ   rx   r  n_fieldsdirrY  r  r  r   sortedrb   )rY   r  rP  fieldsrX   r:   r:   rO   namedtuple_fieldss  s    
r  c                   s   t  , t t j t j rt t j  dd t| 	 | 
 D W d    n1 s3w   Y   fdd}|S )Nc                 S  s   g | ]}||j t|fqS r:   )_versionr   r  )ry   paramr:   r:   rO   r         z%checkpoint_params.<locals>.<listcomp>c                    st   t  , t j t j rt j  D ]\} }}| j|kr'| | qW d    d S 1 s3w   Y  d S r_   )r   r  r  r  r=  r  r  r  )r  r<  original_valuer  r  saved_stater:   rO   restore  s   



"z"checkpoint_params.<locals>.restore)r   r  r  r  r  r=  r  r   r   
parametersbuffers)gmr
  r:   r  rO   checkpoint_params  s   

		r  c                 C  sh   t j r
t jj}nt}|  t  t d t	 }t
|D ]	}| | }|  q t	 }||| fS )Ni9  )r   r=  r  synchronizer@  gccollectmanual_seedr   perf_counterr  )r  r  timesr  t0r  r  t1r:   r:   rO   timed  s   


r  c                 C  s    t dd t|| dD S )Nc                 s  s    | ]}|j V  qd S r_   )is_cudary   r   r:   r:   rO   r{     s    z check_is_cuda.<locals>.<genexpr>T)allr   r   r  )r  r  r:   r:   rO   check_is_cuda  s    r  r  c                 C  sn   | dksJ dd t | D }t|dd  |d d  }tdd| dd| d}d	|  d
|_|S )Nr7   c                 S  s   g | ]}d | qS r  r:   ry   rz  r:   r:   rO   r         z rot_n_helper.<locals>.<listcomp>rW  zlambda r'  z: ()rot__helper)r  reversedevalrw   rI   )r6  varsrotatedr  r:   r:   rO   rot_n_helper  s   "r%  z	Set[type]common_constant_typesc                 C  s@   t | ttfrttt| S t| tjt	t
jfpt | tthB S r_   )rV  rZ  	frozensetr  rx   is_safe_constantrY  enumEnumr  r   Sizer&  r  r  r:   r:   rO   r(    s   r(  c                 C  s,   ddl m}m} t| |r||  S | S )Nr7   )ConstantVariableSymNodeVariable)	variablesr,  r-  rY  r  evaluate_expr)r  r,  r-  r:   r:   rO   specialize_symnode  s   
r0  c                 C  s*   ddl m} t| } t| |r|  S | S )Nr7   r,  )r.  r,  r0  rY  as_python_constant)r  r,  r:   r:   rO   guard_if_dyn  s
   
r3  c                 C  s   t dd t| | D S )Nc                 s  r  r_   )is_python_constantr  r:   r:   rO   r{     r  z&check_constant_args.<locals>.<genexpr>)r  r   r   r   r=  r:   r:   rO   check_constant_args  s   r5  c                 C  s^   ddl m} ddlm} d}t| | D ]}t||r"|d7 }qt||s* dS q|dkS )Nr7   r1  UnspecializedPythonVariabler   F)variables.constantr,  variables.tensorr7  r   r   r   rY  )r>  r?  r,  r7  unspec_countr   r:   r:   rO   check_unspec_python_args  s   


r;  c                 C  s>   ddl m} t| | D ]}| st||s dS qdS )Nr7   r6  FT)r9  r7  r   r   r   r4  rY  )r>  r?  r7  r   r:   r:   rO   check_unspec_or_constant_args  s   r<  c                   s.   ddl m  t fddt| | D S )Nr7   NumpyNdarrayVariablec                 3  s    | ]}t | V  qd S r_   )rY  r  r=  r:   rO   r{   "  s
    
z+check_numpy_ndarray_args.<locals>.<genexpr>)r9  r>  r  r   r   r   r=  r:   r=  rO   check_numpy_ndarray_args  s   r?  zType[KeysView[Any]]	dict_keyszType[ValuesView[Any]]dict_valuesodict_valueszType[Iterator[Any]]tuple_iteratorrange_iteratorc                 C  s   t | }tjj| |S r_   )
object_newr   r  Moduler   )rY   rP  r:   r:   rO   nn_module_new1  s   rG  c                 C  s   t tj| dS r   )rt  reduceoperatormul)itr:   r:   rO   product7     rL  c                 C  s   |   \}\}}|||  S r_   )
__reduce__)rK  r  r  rP  r  r:   r:   rO   tuple_iterator_getitem;  s   rO  Tuple[int, int, int]c                 C  s4   |   \}\}}|j|pd }|j}|j}|||fS r   )rN  r  r  r  )
range_iterr  	range_obj	maybe_idxr  r  r  r:   r:   rO   normalize_range_iterC  s
   
rT  c                 C  
   |  |S r_   )as_subclass)r  rY   r:   r:   rO   to_subclassM  r  rW  c                 C  s   t tt| ||d S r   )nextr   isliceiter)dr6  r:   r:   rO   dict_keys_getitemQ     r\  c                 C  s2   | j j}| j}|rdnd}| d| d| }|S )NLGz["z"].)r  rI   rX   )r   r]  rX   r  r  
local_namer:   r:   rO   	enum_reprU  s
   ra  c                 C  s>   || j d< t jj}tjjj	|| }r|| j d< d S d S )Nexample_valueunbacked_bindings)
metar'   rb   	fake_mode	shape_envr   r   experimentalsymbolic_shapescompute_unbacked_bindings)noderb  rf  symbol_to_pathr:   r:   rO   set_example_value_  s   

rl  c                 C  s2   |   jjd}t|sddlm} |d |S )Nrb  r7   r  z:Cannot check Tensor object identity without its fake value)r  rj  rd  rb   r<   r!  r  )vtfake_tensorr  r:   r:   rO   _get_fake_tensorn  s
   ro  c                   s   ddl m}m}m}m}   r t fdd| D }||S d}	|r/t |r/d}	t	  d }
| D ]6}|	rJt||rI t	|u rI|d  S q3|t
j|| gi }|
d u r]|}
q3|t
j|||
gi }
q3|
d u rs|d}
|
S )Nr7   )BuiltinVariabler,  TensorVariableVariableTrackerc                 3  s(    | ]}|  o|   kV  qd S r_   )r4  r2  r  r  r:   rO   r{     s    
z iter_contains.<locals>.<genexpr>FT)r.  rp  r,  rq  rr  r4  r  r  rY  ro  rI  eqcall_functionor_)r   r  txcheck_tensor_identityrp  r,  rq  rr  found_constmust_check_tensor_idfoundr   checkr:   rs  rO   iter_containsw  s4   




r}  c                 C  s   t | tjtjjtfS )z4Returns whether it indexes dictionaries using its id)rY  r   r  r  rF  r   )r   r:   r:   rO   	key_is_id  r   r~  c                 C  s   dd |   D S )Nc                 S  s    g | ]}t |rt|n|qS r:   )r~  rD  r   r:   r:   rO   r     s     zkey_to_id.<locals>.<listcomp>)r   rb  r:   r:   rO   	key_to_id  rG  r  c                  s   ddl m} t| ttfr=d fdd| D }t| tr$d| dS t| ts+J t| dkr7d| d	S d| d
S t| tjrMt	|  d
ddS || rT| jS t| tradd }|| S | S )Nr7   )is_builtin_callabler'  c                 3      | ]	}t | d V  qdS r]  N
const_reprry   r|  r  r:   rO   r{     r  zconst_repr.<locals>.<genexpr>[](z,)r  r  'r-  c                 S  s(   | j }|j}|dkr|jS |d |j S )Nbuiltins.)r  rJ   rK   )r  klassr  r:   r:   rO   fullname  s
   zconst_repr.<locals>.fullname)trace_rulesr  rY  r   rZ  rw   r   r)  r*  ra  replacerI   r  )r   r]  r  
elems_reprr  r:   r  rO   r    s"   

r  c                  s$   d  fdd| D }d| d S )Nr'  c                 3  r  r  r  r  r  r:   rO   r{     r  z!dict_keys_repr.<locals>.<genexpr>r  r  rw   )
const_keysr]  keys_strr:   r  rO   dict_keys_repr  s   r  
__dict_key)UnsupportedFakeTensorExceptionc                 C  s   | dt | d| jj S )Nr  _c)rD  outputr  )rw  rootrP  r:   r:   rO   get_safe_global_name  s   r  c              
   C  s`   z|  W S  t y/ } zddlm} d|j d}t| |||d W Y d }~d S d }~ww )Nr7   r  zUnsupported: z with fake tensor propagation.r  )r  r!  r  reasonri   r'  )r  r  r  msgr:   r:   rO   wrap_fake_exception  s   
r  c                   sB   t jj| t fddW  d    S 1 sw   Y  d S )Nc                     s
   t  S r_   )r  deepcopyr:   r  r:   rO   r     r  z)deepcopy_to_fake_tensor.<locals>.<lambda>)r   r  rn  FakeCopyModer  )rP  re  r:   r  rO   deepcopy_to_fake_tensor  s   $r  c                 C  s   t t t | | S )z+
    Calculate root mean squared error
    )r   sqrtmeansquare)rJ  r  r:   r:   rO   rmse  s   r  g-C6?Tc                   s  du rt tttjtjjtjfrWt tttjfs+J dt	 dt	 t
t
kr9d dS t
t
koVt 
fddtD S t	jdkrptjjj 
d	S t trt ts|J t t ksJ d
t  dt  t D ]}t| | |  
dsd|  dS qdS t trt tsJ ttksJ dt dt dS t tjtfrt tjjrJ t tjjrJ dd 		fddfD \jr'jsJ   t tjs<J dt	 dt	 ryjjkrPdjj dS jtjkryr\dS tjjtjdjtjd

d}|swd |S  r tj  tj tj

ddrdS tjj!j"ddd}|dk rt#$d|% & '  |dkS sjtj

drdS jtj(krd}) * s) * s) * rtjjjd||drdS t+' }t,)|rt#$d t+' }jtj-tj.fv r$dnd}r8/ d kr8
dkr8d!}n9rJ/ d"krJ
dkrJd#}n'/ d$k soj0d%krjj1d& j1d'   krid(kson 
d)krqd}||| 
d!  k}|srt,)|rt,)|rtj2j3j4j5sd}|sd*||6 j|
 |S rdS d+
 dS t t7t8t	dttj9frڈrdS k}|s؈d,t	 |S t:st;rrt:st;s' t	t	u ok}|sd- |S t<r0t	t	u o/tt=t= 
dS t	jd.v r[t	t	u sCJ t 
fd/dj> D S t?d0t	j )1z-Check correctness to see if ref and res matchNztype mismatch r   zLength mismatchFc                 3  s4    | ]\}}}t ||| d V  qdS )	log_error(use_larger_multiplier_for_smaller_tensorN)same)ry   aibi	fp64_refi)cos_similarity	equal_nanexact_dtypeignore_non_fpr  relax_numpy_equalitytolr  r:   rO   r{     s"    
zsame.<locals>.<genexpr>QuestionAnsweringModelOutputr  zkeys mismatch z == r  r  r  r  r  r  r  r  zAccuracy failed for key name %sTzelements mismatch c                 S  s   t | tjr| S t| S r_   )rY  r   r  tensorr  r:   r:   rO   	to_tensorP  r]  zsame.<locals>.to_tensorc                 3  r(  r_   r:   )ry   r  )r  r:   rO   r{   S  r  zdtype mismatch %s, %sr  )atolrtolr  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      rW  r7   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  s@    | ]}t t|t|t| 	
d V  qdS )r  N)r  r  ry   r   )r  r  r  fp64_refr  r  rJ  r  r  r  r  r:   rO   r{   	  s"    
zunsupported type: )@rY  r   rZ  rj   rI  r   r  ParameterListr+  r  r   r  r  rI   r  lossr  r   r   r  r  floatr  r;   	is_sparseto_denser  r   allclosetorj  flattenrp  
functionalcosine_similarityri   r'  cpudetachr%  rq  isnanr  r  mathro  bfloat16numelndimr  r  r8   cppinject_relu_bug_TESTING_ONLYr  rs   rU   r  rn  rr  r  	as_tensor__dict__rb  )rJ  r  r  r  r  r  r  r  r  r  r  r   rscore	loose_tol	ref_error	res_error
multiplierpasses_testr:   )r  r  r  r  r  r  rJ  r  r  r  r  r  rO   r    s  *



,*



2

	

 r  c                 C  s,   | j dd }d| j d| d| j dS )N/rW  r  z' (r   r  )r  splitr  r   )r"  short_filenamer:   r:   rO   format_func_info	  s   r  c                  c  sF    t j} tjt _t j}tjt _zd V  W | t _|t _d S | t _|t _w r_   )r8   cache_size_limitr]  r   accumulated_cache_size_limit)priorprior_acc_limitr:   r:   rO   disable_cache_limit	  s   
r  zDefaultDict[Any, List[Any]]guard_failuresz3List[torch._dynamo.output_graph.GraphCompileReason]graph_break_reasonsc                 C  s2   dt j  d d tt  }tj| |S )Nrun_z%Y_%m_%d_%H_%M_%S_%fz-pid_)datetimenowstrftimers   r   getpidr  rw   )root_dirdir_namer:   r:   rO   _get_debug_dir;	  s   
r  c                  C  s   t j} t| S r_   )r8   debug_dir_rootr  )
debug_rootr:   r:   rO   r  G	  s   r  c                 C  sB   d| j v rt| j d r| j d S |rddlm} |d d S d S )Nrb  r   r  z9`FakeTensor` example value was required but not available)rd  r<   torch._dynamo.excr  )rj  requiredr  r:   r:   rO   extract_fake_example_valueL	  s   
r  c                 C  s   t | |ju s	J | S r_   )r=   re  )r  rw  r:   r:   rO   ensure_graph_fakeW	  s   r   c                   s    d fdd}t jj||S )Nr6  torch.fx.Nodec                   sH   | j dkrd| jvrt|  S | jd } s"t|tjr"t|S |S )Nru  rb  )r4  rd  get_fake_valuerY  r   r  r   )r6  r   allow_non_graph_fakerw  r:   rO   visit]	  s   

z)get_fake_values_from_nodes.<locals>.visit)r6  r  )r   r   rj  map_arg)rw  r3  r  r  r:   r  rO   get_fake_values_from_nodes\	  s   r  c              
     sj  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rZt dkrZt d tjjrZt d jft dd   |	dkrzjjj trttd	rt  tjjd
v stdd  D rtdd  D  z4j' t  t fdd}
W d   n1 sw   Y  W d   n1 sw   Y  W n |y     t y } z|}|j!dur|j!}t|tj"j#j$r|d|j% d nt|tj"j#j&rtj'j(j)s
|d|j% d n|d|j% d nt|tj"j#j*rW|j%}	d}t|	tj+j,rJtj-.|	j/j|	j/j0}|durJ|\}}d| d| d| d}|d|j% d| d n<t|tj1j2j3j4rk||j5t6|ddt||r{||j5|jd |t|t7rdt6|v r|d j d!|  |t6|8|j9dd}~ww |st:;tj<t=j>t?d"|
}|
S )#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   )ValueRangeErrorr7   )TorchRuntimeErrorr  Unsupported	UserErrorUserErrorTyperb  Ncall_methodcall_module_initialize_hook)interpolate
is_integerwrapped_gradientc                 s  s    | ]}t |tV  qd S r_   )rY  complex)ry   ar:   r:   rO   r{   	  s    

z!get_fake_value.<locals>.<genexpr>c                 s  s4    | ]}t |tjr|jjd urt|n|V  qd S r_   )rY  r   SymFloatrj  hintr  r  r:   r:   rO   r{   	  s    

c                     s   t j S r_   )run_noder  r:   r>  r?  nnmodulerj  rw  r:   rO   r   	  s    z get_fake_value.<locals>.<lambda>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 PyTorchr-  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: )rw  )@torch.utils._sympy.value_rangesr  r!  r	  r  r
  r  r  r4  rd  r<   r  r>  r?  r   rY  r   r  rF  r  re  rZ  r  
nn_modulestargetr  rS  _infer_parametersrX   r  r$   r  rb  	__cause__r  rn  DataDependentOutputExceptionfuncDynamicOutputShapeException_dynamor8    capture_dynamic_output_shape_opsUnsupportedOperatorExceptionrz  r|  r  _dispatch_pystub_schemaoverload_namer   rg  rh  GuardOnDataDependentSymNodeCONSTRAINT_VIOLATIONrs   r:  with_traceback__traceback__pytreetree_map_onlyr  rt  partialr   )rj  rw  r  r  r	  r  r
  r  r  r4  ret_valr  causeimport_suggestionmaybe_pystubr  ctxr  r:   r  rO   r  k	  s   	
&" 




>r  c                   C  s   t tdd S )Nr   )r  _current_noder:   r:   r:   rO   get_current_node	  r  r8  c                 c  s*    t  }| t_z	d V  W |t_d S |t_w r_   )r8  r7  r   )rj  oldr:   r:   rO   set_current_node	  s   r:  c                   s  j t  fdd}zwdkr&j i W W  d   S dkrCt d j dd i W W  d   S dkr\|dusMJ | i W W  d   S d	kro| jjW W  d   S d
krdjv szJ jd W W  d   S W n8 ttfy } zddl	m
} ||||d W Y d}~n%d}~w ty } zt|||j|d}~ww W d   tW d   t1 sw   Y  t)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              	     s(   d dj  d  d d	t|  S )NzFailed running r   z(*z, **z):
)r  rs   )r  r>  r?  rj  r4  r:   rO   make_error_message
  s   (z$run_node.<locals>.make_error_messageru  Nr  r   r7   r  get_attrplaceholderrb  r  r  )r4  r:  r  r  output_graphget_submodulerd  r  r  r!  r  r+  rb  r-  r.  AssertionError)tracerrj  r>  r?  r  r<  r  r  r:   r;  rO   r  
  sT   
"



r  c           
   
     s   ddl m}  j}| |v r||  S | j}tjj| j| j	f fdd\}}|dkr5d| j
v r5| j
d jS |dkrR jj| j }t|sJt|}n
||i | nd}zt | |||}||| < W |S  tyz }	 z|t|	|	jdd}	~	ww )	z
    Run the actual computation represented by `node` and return the result.
    This will execute any dependent nodes in the graph as well.
    r7   )r	  c                   s
   t |  S r_   )get_real_value)r6  rB  r:   rO   r   A
  r  z get_real_value.<locals>.<lambda>r>  graphargr  N)r!  r	  real_value_cacher4  r   r   rj  r  r>  r?  rd  exampler?  r  r  r  r  r  r  rb  rs   r-  r.  )
rj  rB  r	  cacher4  r>  r?  	nn_module
real_valuer  r:   rD  rO   rC  3
  s2   


rC  c                   s   ddl m m}  fdd}|  D ]\}}||r&J d| d|| q|  D ]\}}||r?J d| d|| q+d S )Nr   )FakeTensorConfigr<   c                   s$    j rdd l}d|| j S dS )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  rM  rK  r:   rO   stack_or_hint]
  s   z7assert_no_fake_params_or_buffers.<locals>.stack_or_hintzUnexpected fake buffer r   zUnexpected fake param )torch._subclasses.fake_tensorrK  r<   named_buffersnamed_parameters)r  r<   rQ  rX   bufferr  r:   rP  rO    assert_no_fake_params_or_buffersZ
  s   rV  r   c                 C  s   | j  d| j S )z9
    Returns the fully qualified name of the object.
    r  )rJ   rK   r  r:   r:   rO   fqno
  s   rW  c                 C  s   t jjjr| S |S r_   )r   r%  r8   assume_static_by_default)count1count2r:   r:   rO   ifdynstaticdefaultv
  s   
r[  r  types.ModuleTypec                 C  s\   t ttjtt| jD ]}|dr+|d dkr+t	
| j d|dd   qdS )z@
    Ensure all the files in a given submodule are imported
    z.pyr   r  r  N)r  r   listdirr  r(  r	   rs   __file__r   	importlibimport_modulerI   )r  r$  r:   r:   rO   import_submodule}
  s
   "rb  r   c                 C  r  r_   )class_has_getattributer  rb  r:   r:   rO   object_has_getattribute
  r  rd  rY   r  c                 C  s6   zt t| dtjrW dS W dS  ty   Y dS w )N__getattribute__TF)rY  rw  rx  r~  r  AttributeErrorra   r:   r:   rO   rc  
  s   
rc  ignore_nn_module_getattrc                 C  sF   z
t t| d}W n ty   d }Y nw |r!|tjjju r!d }|S )N__getattr__)rw  rx  r  rf  r   r  rF  rh  )r   rg  
getattr_fnr:   r:   rO   get_custom_getattr
  s   rj  c                   @  rE   )TensorStaticReasonrG   r  r   N)rI   rJ   rK   	PARAMETER
NOT_TENSORNN_MODULE_PROPERTYr:   r:   r:   rO   rk  
  rP   rk  r  c                 C  s8   | t jkrdS | t jkrdS | t jkrdS 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 )rk  rl  rm  rn  rA  )r  r:   r:   rO   tensor_static_reason_to_message
  s   


ro  r  Union[torch.Tensor, Any]	is_tensortensor_sourcer&   )Tuple[bool, Optional[TensorStaticReason]]c                 C  sn   ddl m} |  s|  rtjrdtjfS t	| t
jju s&||r.tjr.dtjfS |s5dtjfS dS )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.
    r7   ))is_from_unspecialized_param_buffer_sourceT)FN)sourcert  guard_sourceis_specialized_nn_module"is_unspecialized_builtin_nn_moduler8   &force_nn_module_property_static_shapesrk  rn  r  r   r  r  force_parameter_static_shapesrl  rm  )r  rq  rr  rt  r:   r:   rO   tensor_always_has_static_shape
  s"   




r{  c                   s    fdd}t |S )Nc                    sj   zddl m }  W n ty   dtt   Y S w dd jjD }| |g dd}t jjj	|S )Nr   )r}   zkTabulate module missing, please install tabulate to log the graph in tabular format, logging code instead:
c                 S  s$   g | ]}|j |j|j|j|jgqS r:   )r4  rX   r  r>  r?  )ry   r6  r:   r:   rO   r   
  s    z<lazy_format_graph_tabular.<locals>.inner.<locals>.<listcomp>)opcoderX   r  r>  r?  rt   )
r}   r~   rs   r.   graphr3  r-   forward__code__r  )r}   
node_specs	graph_strr   r  r:   rO   inner
  s   z(lazy_format_graph_tabular.<locals>.innerr5   )r   r  r  r:   r  rO   lazy_format_graph_tabular
  s   r  c                 C  s,   |  d| d| d| dt |   d
S )Nr   z line z 
ru   )disBytecode)prefixrX   r$  line_nor"  r:   r:   rO   format_bytecode
  s   ,r  _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                   C  s    t tjjjjpt tjjjjS r_   )r   r   r  modulesr  _global_backward_hooks_global_backward_pre_hooksr:   r:   r:   rO   nn_module_has_global_hooks
  s   
r  c                 C  s   g }| o
| o
| }|s|r| t |s|r| t |r$| t g }|D ]}t| |g }|D ]}	||	 }
||
 q2q(|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  r:   r:   rO   nn_module_get_all_hooks
  s(   



r  c                 C  s   t | |||d}t|S )zL
    Helper function to check if a module has any hooks attached to it.
    )r  r  r  )r  r   )r  r  r  r  r  r:   r:   rO   nnmodule_has_hooks   s   	r  c                 C  sb   t | r| S t| tjrt| jS t| tjr| jddS t| t	t
fr/t| dd | D S | S )z0Convert tensor and tnp.ndarray to numpy.ndarray.T)forcec                 s      | ]}t |V  qd S r_   )to_numpy_helperry   rP  r:   r:   rO   r{   ;  r  z"to_numpy_helper.<locals>.<genexpr>)r<   rY  tnpr  r  r  r   r  numpyrZ  r   r  rb  r:   r:   rO   r  2  s   
r  c                 C  s\   t dusJ t| t jrt| S t| tjr| jS t| ttfr,t	| dd | D S | S )zeConvert tnp.ndarray to tensor, leave other types intact. If a list/tuple, loop through it to convert.Nc                 s  r  r_   )numpy_to_tensorr  r:   r:   rO   r{   H  r  z"numpy_to_tensor.<locals>.<genexpr>)
re  rY  r  r   r  r  r  rZ  r   r  rb  r:   r:   rO   r  @  s   
r  c                   @  s&   e Zd Zdd Zd
ddZdd Zd	S )numpy_to_tensor_wrapperc                 C  s   || _ d| j j | _d S Nwrapped_r.  rI   )r   r.  r:   r:   rO   r   N     z numpy_to_tensor_wrapper.__init__rr   rs   c                 C  s   d| j j dS )Nz<Wrapped function <original >>r  r   r:   r:   rO   __repr__R  rM  z numpy_to_tensor_wrapper.__repr__c                 O  s   | j |i |}t|S r_   )r.  r  r   r>  r?  r   r:   r:   rO   r  U  s   z numpy_to_tensor_wrapper.__call__Nrr   rs   )rI   rJ   rK   r   r  r  r:   r:   r:   rO   r  M  s    
r  c                 C  sF   t | tjrt| |}t|S t | tjr!tt| |}t|S d S r_   )rY  r  r  r  r  r   r  )rP  rX   r   r:   r:   rO   numpy_attr_wrapperZ  s   
r  c                   @  s,   e Zd ZdZdddZdddZd	d
 ZdS )numpy_method_wrapperzgConvert obj from torch.Tensor to tnp.ndarray and call method. Then convert result back to torch.Tensor.methodrs   c                 C  s   || _ d| j  | _d S r  )r  rI   )r   r  r:   r:   rO   r   f  s   znumpy_method_wrapper.__init__rr   c                 C     d| j  dS )Nz<Wrapped method <original r  )r  r   r:   r:   rO   r  j  r   znumpy_method_wrapper.__repr__c                 O  sH   |d }t |tjrt|}t|| j}||dd  i |}t|S Nr   r7   )rY  r   r  r  r  r  r  r  )r   r>  r?  rP  method_callabler   r:   r:   rO   r  m  s   
znumpy_method_wrapper.__call__N)r  rs   r  rI   rJ   rK   rO  r   r  r  r:   r:   r:   rO   r  c  
    

r  c                   @  s,   e Zd ZdZdddZddd	Zd
d ZdS )numpy_operator_wrapperzQImplements dunder methods for tnp.ndarray via functions from the operator libraryr4  Callable[..., Any]c                 C  s   || _ d|j | _d S r  )r4  rI   )r   r4  r:   r:   rO   r   y  r  znumpy_operator_wrapper.__init__rr   rs   c                 C  r  )Nz<Wrapped operator <original r  )rI   r   r:   r:   rO   r  }  r   znumpy_operator_wrapper.__repr__c                 O  s(   |rJ dd |D }| j | }t|S )Nc                 s  s*    | ]}t |tjrt|n|V  qd S r_   )rY  r   r  r  r  r  r:   r:   rO   r{     s    
z2numpy_operator_wrapper.__call__.<locals>.<genexpr>)r4  r  r  r:   r:   rO   r    s   
znumpy_operator_wrapper.__call__N)r4  r  r  r  r:   r:   r:   rO   r  v  r  r  c                 C  s   t | ts| S | jrMg }|  D ]}t |tjr%||jj	|jj
 q|| qg }|  D ]}t |tjrF||jj	|jj
 q1|| q1n|  }|  }tj||| j| j| jd}|  |S )N)r  r  r  )rY  r;   _has_symbolic_sizes_stridesr  r   SymIntr   rj  rf  	size_hintexprr  empty_stridedr  r  r  zero_)r   r  r|  r  r  r:   r:   rO   defake  s2   
r  c                 C  s   dd l }| |jjju S r   )torch.utils.checkpointr4  
checkpoint)rP  r   r:   r:   rO   is_utils_checkpoint  s   r  c                 C  s   ddl m} | |u S )Nr   )invoke_subgraph_placeholder)'torch._higher_order_ops.invoke_subgraphr  )rP  r  r:   r:   rO   is_invoke_subgraph  s   r  c                  K  s"   ddl m} |jtjjfi | S )Nr7    TorchHigherOrderOperatorVariable)variables.higher_order_opsr  maker   _higher_order_opsinvoke_subgraph)optionsr  r:   r:   rO   build_invoke_subgraph_variable  s   r  c                  K  sF   dd l m  m} ddlm} |j}tjjj	r|j
}|j|fi | S )Nr   r7   r  )torch._higher_order_ops.wrapr  wrapr  r  tag_activation_checkpointr   
_functorchr8   functionalize_rng_opswrap_activation_checkpointr  )r  higher_order_opsr  activation_checkpoint_opr:   r:   rO   build_checkpoint_variable  s   
r  c                 C  s>   ddl m} | }| dkr	 |S | dkr|rt }|S d}|S )Nr7   )is_dynamo_supportedr  r=  F)
eval_framer  r1   )device_typer  compile_supportedr:   r:   rO   is_compile_supported  s   r  offsetc                 C  s$   |  d}t|d| jd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-8Nr  )errors)encoder   decode)rs   r  as_utf8r:   r:   rO   _fix_offset  s   
r  c                   @  s.   e Zd ZU ded< ded< ded< ded< dS )_AnchorsrU   left_end_linenoleft_end_offsetright_start_linenoright_start_offsetNr  r:   r:   r:   rO   r    s
   
 r  segmentOptional[_Anchors]c                   s  t jdksJ ddl}z|d|  d }W n
 ty    Y dS w t|jdkr*dS | d  fdd	} fd
d fdd} fdd}|jd }t||j	r_|j
}t||jrtt|jjd }|||jj}	||	\}}	 | |	  }
 s|
dv r|
dv r|||	\}}	n|||	\}}	 | |	  }
 s|
dv s|	d }|t | k r | |  }
 s|
dvr|d7 }t||	||S t||jrtt|j
jd }|||j
j}||\}} | | dkr|||\}} | | dkstt|jd }|||j}t||||S t||jr_tt|jjd }|||jj}||\}} | | dkrJ|||\}} | | dks:tt|jd }|||j}t||||S dS )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
    )rH      r   Nz(
z
)r7   ru   c                   s   t  |  |S r_   )r  )linenor  linesr:   rO   	normalize  r   z-_extract_anchors_from_expr.<locals>.normalizec                   sl   | t  k r"|t  |  kr"d}| d7 } | t  k r"|t  |  ks| t  k r0|t  |  k s2J | |fS r  r   r  colr  r:   rO   next_valid_char  s    z3_extract_anchors_from_expr.<locals>.next_valid_charc                   s>   |d7 }| |\} }| t  k r|t  |  k sJ | |fS r   r  r  r  r  r:   rO   r   !  s    z-_extract_anchors_from_expr.<locals>.incrementc                   sB   d}| d7 } | |\} }| t  k r|t  |  k sJ | |fS r  r  r  r  r:   rO   nextline(  s
    z,_extract_anchors_from_expr.<locals>.nextlinerG   z)\#z\#r  r  )r]  r^  astparseSyntaxErrorr   bodyr  rY  Exprr   BinOpr	   rU   left
end_linenoend_col_offsetisspacer  	SubscriptCallr#  )r  r  treer  r   r  	statementr  
cur_linenocur_colch	right_colleft_linenoleft_colright_linenor:   r  rO   _extract_anchors_from_expr  sl   

r  r"  types.CodeTypeinstdis.Instructionc                   s  t jdkrhtj j|jj j|jj|jj	|jj
d}t|gd }d| dd } fddt|jj|jjd D }td| }t|d t|d  }|d d| }tt||}|S |jdusoJ |jjdu rwd	S t j|jj }|jjdu r|S |jj	du s|jj
du r|S t||jj	}	d}
d	}g }|jj|jjkrt||jj
}
||	|
 }|d
|	 d|
|	    n~||	d d }|d
|	 dt||	    t j|jj }t||jj
}
t|jjd |jjD ]*}t j| }||d 7 }t|t|  }|d
| dt||    q||d|
 7 }t|t|  }|d
| d|
|    d}zt|}W n
 tyX   Y nw |du rfdd |D }nydd |D }|jdkrz| j|	7  _|jdkr| j|	7  _tt|D ]J}tt|| D ]>}||jk rq||jkr||jk rq||jkr||jkrq||jkrŐq|| | dkrd|| |< qqdd |D }d	}tt|D ]}|t j|jj|  d 7 }||| d 7 }q|S )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 in < 3.13 since `format_frame_summary` in
    Python's `traceback` module doesn't handle multi-line expressions
    (and their anchor extraction code is not completely correct).
    )rH      )r  colno	end_colnor   ru   r7   Nc                   s   g | ]}t  j| qS r:   )	linecachegetliner  rstrip)ry   r  r"  r:   rO   r     r  z.get_instruction_source_311.<locals>.<listcomp>r-  r   ~c                 S  s   g | ]}| d dqS )r  ^)r  ry   markerr:   r:   rO   r     s    c                 S     g | ]}t |qS r:   r   r  r:   r:   rO   r     s    r  c                 S  s   g | ]}d  |qS )r-  r  r  r:   r:   rO   r     r  )r]  r^  rM  FrameSummaryr  	positionsr  r  r  
col_offsetr  rN  rw   
splitlinesr  textwrapdedentr   indentr  r  r  r  r   lstripr  rA  r  r  r  r  )r"  r  frame_summaryr  
orig_linesorig_lines_dedent
indent_lenr&  
first_linestart_offset
end_offsetr  markers	last_liner  line
num_spacesanchorsmutable_markersr  rz  r:   r  rO   get_instruction_source_311s  s   


 
r5  c                 C  s   t | tjrt| dd S d S )N_dynamo_static_input_type)rY  r   r  r  r  r:   r:   rO   get_static_address_type  s   r7  c                 C  sJ   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 ||R v S r_   )	r   r  r   	get_statedefault_generatorr  r=  	set_stater  )r   getterssettersr:   r:   rO   is_rng_state_getter_or_setter  s   r=  c                 C  s&   t | tjo| jdko| jjtjju S )N__get__)	rY  r~  r   rI   __self____objclass__r   r  _TensorBaserb  r:   r:   rO   is_tensor_base_attr_getter  s
   rB  c                 C  s
   t | dS )N__torch_function__)rS  rb  r:   r:   rO   is_torch_function_object  r  rD  rm  ,torch._dynamo.variables.base.VariableTrackerc                 C  s`   ddl m} ddlm} |  st| dr.t|  dr.t| |r#dS t| |o-t| jdS dS )Nr   )UserDefinedObjectVariable)TensorWithTFOverrideVariable
peek_valuerC  TF)	torch._dynamo.variablesrF  &torch._dynamo.variables.torch_functionrG  is_realizedrS  rH  rY  r   )rm  rF  rG  r:   r:   rO   has_torch_function  s   

rL  c                 C  sD   d }d }t jj  }r| |jv r|j|  }|j}|j| d||dS )NF)static_shapessymbolic_contextru  )r   r9  r'   try_gettensor_to_contextrr  from_tensor)r  re  rN  ru  tracing_contextr:   r:   rO   to_fake_tensor5  s   

rS  c                 C  s:   t |  ot|  ot| ot| dot| jdo| jjS )N__dataclass_params__frozen)rd  rc  r   rS  rT  rU  rb  r:   r:   rO   is_frozen_dataclassC  s   

rV  c                 G  s4   |D ]}t | |rt| |  S qt|  d| )zX
    Return the first available attribute or throw an exception if none is present.
    z% does not has any of the attributes: )rS  r  rA  )rP  attrsattrr:   r:   rO   get_first_attrN  s
   
rY  c                 #  sX    | sd V  d S  fdd}t jj|}|V  W d    d S 1 s%w   Y  d S )Nc                   s   dd }t j| | dS )Nc                 S  s(   t jjjd d  d7  < t j| |S )Ncompiled_autogradcompilesr7   )r   r%  r4  r?   r  compile)gm_example_inputs_r:   r:   rO   inner_compiler`  s   zKmaybe_enable_compiled_autograd.<locals>.compiler_fn.<locals>.inner_compiler)rB  	fullgraphdynamic)r   r\  )r  r_  ra  r`  r:   rO   compiler_fn_  s   z3maybe_enable_compiled_autograd.<locals>.compiler_fn)r   r%  rZ  _enable)should_enabler`  ra  rc  r6  r:   rb  rO   maybe_enable_compiled_autogradY  s   
	"rf  c                  C  s   G dd dt } t|  S )Nc                   @  s   e Zd ZdS )z*invalid_removeable_handle.<locals>.InvalidN)rI   rJ   rK   r:   r:   r:   rO   Invalidn  s    rg  )r  r3   )rg  r:   r:   rO   invalid_removeable_handlel  s   
rh  c                 C  s>   t | tjjs	| S t | tjjr| S | j| j}| j|_|S r_   )	rY  r   r  rF  r   GraphModuler  r  r  )r  proxyr:   r:   rO   nn_module_proxyx  s   rk  c                      s$   e Zd Z fddZdd Z  ZS )	GmWrapperc                   s   t    || _|| _d S r_   )r  r   r  unflatten_fn)r   r  rm  r  r:   rO   r     s   

zGmWrapper.__init__c                 G  s   t |}| j| | S r_   )r   r  rm  r  r:   r:   rO   r~    s   zGmWrapper.forward)rI   rJ   rK   r   r~  r  r:   r:   r  rO   rl    s    rl  r  torch.fx.GraphModulec                   s   dd t | jjD tjjjr;dgksJ t|d ts J t	|d  dd  fdd}|t
| ||nt|\}}tjtj|d}|t
| ||tjfd	d
}|S )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.
    c                 S  s,   g | ]\}}|j d kr|jddr|qS )r>  	steal_argF)r4  rd  rb   )ry   rz  rj  r:   r:   rO   r     s
    z(flatten_graph_inputs.<locals>.<listcomp>r   c                 S  s   | d t | dd   S r  r  r  r:   r:   rO   
flatten_fn  r  z(flatten_graph_inputs.<locals>.flatten_fnc                   s   | d   g|  d  R S r_   r:   )	flat_args)boxed_inputs_countr:   rO   rm    s   z*flatten_graph_inputs.<locals>.unflatten_fn)treespecc                    s&   | }D ]}| |    q |S r_   )r`   )r>  rq  rz  )compiled_fnrp  inputs_idx_to_clearr:   rO   wrapper  s   z%flatten_graph_inputs.<locals>.wrapper)	enumerater}  r3  r   r%  rZ  in_compiled_autograd_regionrY  r   r   rl  r/  tree_flattenrt  r1  tree_unflattenarg_tree_leaves)r  inputs
compile_gmrm  flat_inputsspecrv  r:   )rr  rt  rp  ru  rO   flatten_graph_inputs  s    


r  c                 C  s*   t | tjjrt| dsg S | jdg S )Nrd  locals_to_steal)rY  r   r   ri  rS  rd  rb   )maybe_gmr:   r:   rO   get_locals_to_steal  s   r  c                 C  s   || j d< d S )Nr  )rd  )r  r  r:   r:   rO   set_locals_to_steal  r   r  c                   @  s   e Zd Zdd ZdddZdS )	Litc                 C  s
   || _ d S r_   r|  )r   r|  r:   r:   rO   r     r  zLit.__init__rr   rs   c                 C     | j S r_   r  r   r:   r:   rO   r    s   zLit.__repr__Nr  )rI   rJ   rK   r   r  r:   r:   r:   rO   r    s    r  zSet[str]warn_once_cachec                 C  s,   | t v rd S t |  tj| |d d d S )Nr7   )
stacklevel)r  r   warningswarn)r  r  r:   r:   rO   	warn_once  s   
r  c                 C  s   t d}|d| S )Nz\x1B[@-_][0-?]*[ -/]*[@-~]r-  )r  r\  r  )textansi_escaper:   r:   rO   strip_color_from_string  s   
r  c               	   c  s<    zt jjd} d V  W t jj|  d S t jj|  w )NT)r   r  	_autograd _saved_tensors_hooks_set_tracing)r  r:   r:   rO   +_disable_saved_tensors_hooks_during_tracing  s
   "r  c                   C  s   t jjjo	t   S r_   )r   r  r8   freezingis_grad_enabledr:   r:   r:   rO   is_parameter_freezing  s   r  c                   C  s   dd t t D S )Nc                 S  r  r:   ) get_torch_function_mode_stack_atr  r:   r:   rO   r     s    z1get_torch_function_mode_stack.<locals>.<listcomp>)r  r!   r:   r:   r:   rO   get_torch_function_mode_stack  s   r  c                 C  s"   | t  k r	| dksJ tj| S r   )r!   r   r  _get_function_stack_at)indr:   r:   rO   r    s   r  c                 C  s,   t t D ]}t  q| D ]}t| qd S r_   )r  r!   r"   r#   )rR  rz  moder:   r:   rO   set_torch_function_mode_stack  s
   
r  c                  C  s   t t D ]} t  qd S r_   )r  r!   r"   )rz  r:   r:   rO   clear_torch_function_mode_stack  s   r  c                  G  s
   t   d S r_   )
breakpointr  r:   r:   rO   _breakpoint_for_c_dynamo  r  r  c                 C  sV   | j }t|}t|jdkrddlm} |d|j| jkr)ddlm} |dd S )NrG   r7   )InternalTorchDynamoErrorz[Tensor subclass method __metadata_guard__ must take exactly two subclass metadata argumentsz?Tensor subclass method __metadata_guard__ must be a classmethod)	__metadata_guard__rw  	signaturer   r  r!  r  r?  r  )r   r  sigr  r:   r:   rO   verify_guard_fn_signature  s   
r  c                 C  sP   | j tj tjj fv o'| jtjtjjfv o'| jtjtjjfv o'| jtjtjjfv S r_   )r   r  rj   r   r   r   __iter__)user_clsr:   r:   rO   #does_not_override_dict_iter_methods   s   r  c                 C      t jjdddd }|| |S )NT	recursivec                 S  rU  r_   )r  r   rz  r:   r:   rO   r  .     
zcall_size.<locals>.fnr   r%  disabler   rz  r  r:   r:   rO   	call_size-     

r  c                 C  r  )NTr  c                 S  rU  r_   )r  r  r:   r:   rO   r  6  r  zcall_stride.<locals>.fnr  r  r:   r:   rO   call_stride5  r  r  c                 C  s   t jjdddd }|| S )NTr  c                 S  s   |   S r_   )storage_offsetr   r:   r:   rO   r  >  s   zcall_storage_offset.<locals>.fnr  )r   r  r:   r:   rO   call_storage_offset=  s   
r  c                   s   ddg} fdd|D }|S )Nr6  tagc                   s(   i | ]}| j v r|t j | qS r:   )r  r  r  r  r:   rO   r  M  s    "z(_extract_tensor_dict.<locals>.<dictcomp>r:   )r  KEYS_TO_COPYtensor_dictr:   r  rO   _extract_tensor_dictG  s   
r  z(Dict[int, weakref.ReferenceType[object]]user_obj_id_to_weakrefc                 C  s   t |   }|d usJ d|S )NzUser object is no longer alive)r  )obj_idrP  r:   r:   rO   get_user_object_from_idZ  s   
r  c                 C  s   t | }t| t|< d S r_   )rD  rM  rJ  r  )rP  r  r:   r:   rO   store_user_object_weakref`  s   r  c                   @  sr   e Zd ZU dZded< dZded< dZeddd	Zedd
dZ	edddZ
edddZeedd ZdS )CompileTimeInstructionCounterr   rU   _counterrW  _idrr   r   c                 C  s(   | j d | _ | j dkrt | _d S d S r   )_depthr    r  r  ra   r:   r:   rO   r  j  s   
z#CompileTimeInstructionCounter.startc                 C  s:   | j d | _ | j dkr|  jt| j7  _d| _d S d S )Nr7   r   rW  )r  r  r    endr  ra   r:   r:   rO   r  p  s
   

z!CompileTimeInstructionCounter.endc                 C  s
   d| _ d S r   r  ra   r:   r:   rO   r`   w  r  z#CompileTimeInstructionCounter.clearc                 C  r  r_   r  ra   r:   r:   rO   r   {  s   z#CompileTimeInstructionCounter.valuec                 c  sB    zt jr	|   d V  W t jr|   d S d S t jr |   w w r_   )r8   %record_compile_time_instruction_countr  r  ra   r:   r:   rO   record  s   

z$CompileTimeInstructionCounter.recordNr  )rr   rU   )rI   rJ   rK   r  rl   r  r  rm   r  r  r`   r   r   r  r:   r:   r:   rO   r  e  s   
 r  featureusagec                 C  s"   t   rt  d| | dS dS )zQ
    Records whether we are using a feature
    Generally a feature is a JK.
    r  N)r   r   set_key_value)r  r  r:   r:   rO   set_feature_use  s   
r  )rn   ro   rp   rq   rr   rs   r  )r   rU   rr   r   )rr   rC   )rr   r%   )NFNNF)r   rs   r   r   r   r   r   r   r   r   r   r   rr   r   r  )r   r   r   r   rr   rs   )r   r   r   r   rr   r   )rs   F)r   r   r  )r$  rs   rr   r   )r0  r1  rr   rU   )r   r>   rr   r>   )rP  rQ  rR  rS  rr   rT  )rP  rQ  rR  rW  rr   rT  )rP  rQ  rR  rX  rr   r   r_   )r   r  rr   r  )r5  r  rr   r   r~  )
r  rU   r  rU   r  r@   r  r  r  r  )rG  rU   rr   r   )rr   rM  )rr   rO  )FF)r   rs   r  r   r   r   rr   r   )r  r  )rr   r  )r7   )rr   rP  )T)rP  r   )r  r\  )r   r   )rY   r  )r   r   rg  r   )r  rk  )r  rp  rq  r   rr  r&   rr   rs  )FFF)rs   rs   r  rU   rr   rU   )r  rs   rr   r  )r"  r  r  r  rr   rs   )rm  rE  rr   r   )TT)r  rn  )r  rs   r  r   (  
__future__r   atexitrj   r   r  r0  r  r  r)  rt  r  r`  rw  r   r
  r  r  r  rI  r   r  r]  r$  r\  r   rM  r~  r`  r^  r  rM  r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   typing_extensionsr   r   r   torch._functorch.config%torch.fx.experimental.symbolic_shapestorch.utils._pytreer4  _pytreer/  r   torch._Cr    r!   r"   r#   torch._dispatch.pythonr$   torch._dynamo.metrics_contextr%   torch._guardsr&   r'   torch._subclasses.meta_utilsr(   torch._utils_internalr)   r*   r+   r,   torch.fx._utilsr-   r.   torch.monitorr/   torch.nn.modules.lazyr0   torch.utils._tritonr1   r2   torch.utils.hooksr3   r  re  r8  torch._loggingtorch._numpy_numpyr  r4   r6   r-  r8   fftlinalgr  r9   rl   NP_TO_TNP_MODULErR  r;   r<   r=   r~   r>   r  rF  rh  unpatched_nn_module_getattrr  unpatched_nn_module_call
_call_implunpatched_nn_module_call_implrk   r?   rA   troubleshooting_urlnnmodule_doc_urlnnmodule_doc_url_msgr  rI   ri   rB   r  rD   r[   timer_counterr*  rF   rQ   r}   r   r   r   r   r   r   r   r   r   r   registerr   FloatTensorrp  DoubleTensorrq  double
HalfTensorro  halfBFloat16Tensorr  
ByteTensorrj  
CharTensorrf  
LongTensorri  long	IntTensorrh  rU   ShortTensorrg  short
BoolTensorr   tensortype_to_dtyper   r  r   r  r   r  r#  r/  r7  r8  r<  r@  rA  rV  r^  ParamSpecArgsParamSpecKwargs	ParamSpecTypeVarTupleTypeAliasTyper_  rc  rn  rr  ry  r}  rv  r  r  r  r  r  r  r  r  r  r  r  r  r  r  !DEFAULT_COMPILATION_METRICS_LIMITrI  r  r  r  rE  r   rK  rL  rN  rO  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r%  r  rs   rT   r  Ellipsisr  NotImplementedCodeTyper  r  memory_formatr  finfoiinfo	attention
SDPBackendr=  _CudaDevicePropertiesr&  r>  r   languager(  r0  r3  r5  r;  r<  r?  r   r@  r   rA  r   rB  rZ  rC  r  rD  __length_hint__tuple_iterator_lenrQ  r  rE  rG  rL  rO  rX  	iter_nextrT  rW  r\  ra  rl  ro  r}  r~  r  r  r  GLOBAL_KEY_PREFIXtorch._subclassesr  r  r  r  r  r  r  r  r  orig_code_mapr   r  r  seen_code_mapr  r  r  r   r  r  r]  r7  r8  r:  r  rC  rV  rW  r[  rb  rd  rc  rj  rk  ro  r{  r  r  r  r  r  all_hook_namesr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r5  r7  r=  rB  rD  rL  rS  rV  rY  rf  rh  rk  rl  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r:   r:   r:   rO   <module>   s  `



(a%



	!

I&)
y   
J




	
	$$

	)!

  % 	1'	
"
#	 		y /	
&