U
    ªÊ¹jë ã                   @   sÖ  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mZ d dlmZmZmZmZm Z  zd dl!Z"W n e#k
�r&   dZ"Y nX d dl$Z%d dl&m'Z( d dl)m*Z* d dl$m+Z+ ddl,m-Z- e"�rše"e"j.e"j/e"j0fZ1e"e(e"j.e(j.e"j/e(j/e"j0e(j0iZ2ni Z1i Z2d dl3Z3d dl%Z%d dl4Z%d dl5Z%d d	l%m6Z6 d d
l7m8Z8 d dl9m:Z:m;Z; d dl<m=Z= d dl>m?Z? e @ejA¡ZBdZCdZDdeD› d�ZEe FeG¡ZHe I¡ ZJe I¡ ZKe L¡ aMdd„ ZNdd„ ZOd aPdd„ ZQdd„ ZRd aSdd„ ZTdd„ ZUdüdd„ZVdýd"d#„ZWe jXd$d%„ ƒZYe%jZe%j[e%j\fe%j]e%j^e%j_fe%j`e%jae%jbfe%jce%jdfe%jee%jffe%jge%jhfe%jie%jje%jkfe%jle%jme%jnfe%joe%jpe%jqfe%jre%jsfi
ZtG d&d'„ d'ƒZueuƒ Zvd(d)„ Zwd*d+„ Zxd,d-„ Zyd.d/„ Zzd0d1„ Z{d2d3„ Z|e6j}d4œd5d6„Z~d7d8„ Zd9d:„ Z€G d;d<„ d<ƒZ�d=d>„ Z‚d?d@„ ZƒdAdB„ Z„dCdD„ Z…dEdF„ Z†dGdH„ Z‡dIdJ„ Zˆe	 dK¡dLdM„ ƒZ‰dþdNdO„ZŠdPdQ„ Z‹ejŒG dRdS„ dSƒƒZ�ejŒG dTdU„ dUƒƒZŽG dVdW„ dWe�ƒZ�e�ƒ e�_�dXdY„ Z‘ddZœd[d\„Z’d]d^„ Z“ed_d`„ ƒZ”dadb„ Z•dÿdcdd„Z–dedf„ Z—dgdh„ Z˜didj„ Z™e	 d¡dkdl„ ƒZšdmdn„ Z›�d dodp„Zœdqdr„ Z�edsƒdtdu„ ƒZždvdw„ ZŸdxdy„ Z dzd{„ Z¡d|d}„ Z¢d~d„ Z£d€d�„ Z¤e¥e¦ƒ  §¡ ƒZ¨e¥e I¡  §¡ ƒZ©e¥eªe«ƒ ƒƒZ¬e¬j­Z®e¯j°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’lºm»Z»m¼Z¼ d“d”„ Z½d•d–„ Z¾d—d˜„ Z¿dd!d™d!dšd!d!eHjÀfd›dœ„ZÁd�dž„ ZÂejdŸd „ ƒZÃe�ƒ ZÄe @eÅ¡ZÆeÅƒ ZÇe�ƒ ZÈG d¡d¢„ d¢ƒZÉe	 d¡d£d¤„ ƒZÊd¥d¦„ ZËd§d¨„ ZÌd©dª„ ZÍd«d¬„ ZÎd­d®„ ZÏed¯œd°d±„ZÐd²d³„ ZÑejÒd´œdµd¶„ZÓed·œd¸d¹„ZÔed·œdºd»„ZÕG d¼d½„ d½ejÖƒZ×e×d¾œd¿dÀ„ZØe e%jÙef esdÁeese×f dÂœdÃdÄ„ZÚ�ddÅdÆ„ZÛdÇdÈ„ ZÜdÉdÊ„ ZÝdËdÌ„ ZÞdÍdÎgZßdÏdÐgZàdÑdÒdÓdÔgZáeßeà eá Zâ�ddÕdÖ„Zã�dd×dØ„ZädÙdÚ„ ZådÛdÜ„ ZæG dÝdÞ„ dÞƒZçdßdà„ ZèG dádâ„ dâƒZéG dãdä„ däƒZêdådæ„ Zëdçdè„ Zìdédê„ Zídëdì„ Zîeïenendíœdîdï„ZðejŒG dðdñ„ dñƒƒZñeïeeñ dòœdódô„Zòejóejôeïdõœdöd÷„Zõdødù„ Zödúdû„ Z÷dS (  é    N)Úcontextmanager)Ú	lru_cacheÚwraps)ÚAnyÚDictÚOptionalÚTupleÚUnion)Údetect_fake_mode©Ú
LazyStringé   )Úconfig)Úfx)Úenable_python_dispatcher)Ú
FakeTensorÚis_fake)ÚLazyModuleMixin)Útree_mapz<https://pytorch.org/docs/master/compile/troubleshooting.htmlz6https://pytorch.org/docs/master/compile/nn-module.htmlzSee z& for more information and limitations.c              
   C   sP   zdd l }|j | |d�W S  tk
rJ   d dd„ t |g| ¡D ƒ¡ Y S X d S )Nr   ©ÚheadersÚ
c                 s   s   | ]}d   tt|ƒ¡V  qdS )ú, N)ÚjoinÚmapÚstr)Ú.0Úrow© r   úR/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/_dynamo/utils.pyÚ	<genexpr>Z   s    ztabulate.<locals>.<genexpr>)ÚtabulateÚImportErrorr   Ú	itertoolsÚchain)Úrowsr   r!   r   r   r   r!   T   s    
ÿr!   c                    s   t ˆ ƒ‡ fdd„ƒ}|S )Nc                     sš   ˆ j ttƒ› d� }t ¡ }| ¡  |jˆ f| ž|Ž}| ¡  tdˆ j › dttƒ› d�ƒ t	 
|¡}| t	jj¡ d¡ | t	jj¡ d¡ | |¡ |S )Nz.profilez### Cprofile for z iter z ###é   )Ú__name__ÚnextÚtimer_counterÚcProfileZProfileÚenableZruncallÚdisableÚprintÚpstatsZStatsZ
sort_statsZSortKeyZTIMEZprint_statsZ
CUMULATIVEZ
dump_stats)ÚargsÚkwargsZdatafnZprofÚretvalZps©Úfuncr   r   Úprofile_wrapper`   s    ÿ

z(dynamo_profiled.<locals>.profile_wrapper©r   )r3   r4   r   r2   r   Údynamo_profiled_   s    r6   c                   C   s   t d a d S ©Nr   )Ú
curr_framer   r   r   r   Úincrement_framex   s    r9   c                   C   s   t  ¡  t ¡  dad S ©Nr   )Úframe_phase_timingÚclearÚcompilation_time_metricsr8   r   r   r   r   Úreset_frame_count~   s    r>   c                 C   s   t | 7 a d S ©N)Úop_count)Zcntr   r   r   Úincrement_op_countˆ   s    rA   c                  C   sŽ   d} i }t  ¡ D ]@}| ¡ D ]2\}}| |7 } ||kr>|||< q||  |7  < qqd}| ¡ D ]"\}}|› d|› dt|dƒ› �}q^t|ƒ d S )Nr   zTIMING:ú ú:é   )r;   ÚvaluesÚitemsÚroundr-   )ÚtotalZtotal_by_keyZtimingsÚkeyZtimingÚoutÚvaluer   r   r   Úprint_time_report’   s    
rL   c                    s   ‡ fdd„}| r|| ƒS |S )Nc                    s   t ˆ ƒ‡ ‡fdd„ƒ}|S )Nc               	      s¬   ˆ j }|tkrg t|< tj |› d�¡�$ t ¡ }ˆ | |Ž}t ¡ | }W 5 Q R X t|  |¡ ˆr¨ttƒ}|t	kr|i t	|< ˆt	| ksœt
dˆ› d|› �ƒ‚|t	| ˆ< |S )Nz (dynamo_timed)zDuplicate phase name z for frame )Ú__qualname__r=   ÚtorchZprofilerZrecord_functionÚtimeÚappendr   r8   r;   ÚAssertionError)r/   r0   rI   Út0ÚrZ
time_spentÚ	frame_key)r3   Ú
phase_namer   r   Útime_wrapper¶   s$    

ÿþz>dynamo_timed.<locals>.dynamo_timed_inner.<locals>.time_wrapperr5   )r3   rV   ©rU   r2   r   Údynamo_timed_innerµ   s    z(dynamo_timed.<locals>.dynamo_timed_innerr   )Zoriginal_functionrU   rX   r   rW   r   Údynamo_timed´   s    rY   r   Fc                    s|   dd„ f‡ fdd„	‰| dkrF‡fdd„t D ƒ}d}|t|d	d
�7 }|S | dkrx‡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   | S r?   r   ©Úxr   r   r   Ú<lambda>ß   ó    zcompile_times.<locals>.<lambda>c                    s    ˆ r|t | ƒƒS d t|| ƒ¡S )Nr   )Úsumr   r   )rE   Úitem_fn)Ú	aggregater   r   Úfmt_fnß   s    zcompile_times.<locals>.fmt_fnr   c                    s$   g | ]}|ˆ t | d d„ d�f‘qS )c                 S   s   | d›S )Nz.4fr   rZ   r   r   r   r\   æ   r]   ú*compile_times.<locals>.<listcomp>.<lambda>©r_   )r=   ©r   Úk©ra   r   r   Ú
<listcomp>å   s   ÿz!compile_times.<locals>.<listcomp>z!TorchDynamo compilation metrics:
)ÚFunctionzRuntimes (s)r   Úcsvc                    s   g | ]}ˆ |d d„ d�‘qS )c                 S   s   | d›S )Nz.6fr   rZ   r   r   r   r\   î   r]   rb   rc   r   )r   Úvrf   r   r   rg   í   s   ÿN)r=   r!   rE   ÚlistÚkeys)Úreprr`   r%   rJ   rE   r   r   )r`   ra   r   Úcompile_timesÑ   s    
þ
þrn   c                   C   s   t  tddd�¡ d S )Nr   T)rm   r`   )ÚlogÚinforn   r   r   r   r   Údump_compile_timesõ   s    rq   c                   @   s&   e Zd Zd	dd„Zdd„ Zdd„ ZdS )
ÚDuplicateWarningCheckeré   c                 C   s   || _ |  ¡  d S r?   )ÚmaxsizeÚreset)Úselfrt   r   r   r   Ú__init__	  s    z DuplicateWarningChecker.__init__c                 C   s   t  ¡ | _d S r?   )ÚcollectionsÚOrderedDictÚset©rv   r   r   r   ru     s    zDuplicateWarningChecker.resetc                 C   sT   || j kr&| j j|dd� tjsPdS n*d | j |< t| j ƒ| jkrP| j jdd� q0dS )NT)ÚlastF)rz   Úmove_to_endr   ÚverboseÚlenrt   Úpopitem©rv   rI   r   r   r   Úadd  s    

zDuplicateWarningChecker.addN)rs   )r'   Ú
__module__rM   rw   ru   r‚   r   r   r   r   rr     s   
rr   c                  C   s>   t j dd¡dk} | r6tjjtjtjtjdd� tƒ S t	 
¡ S )NZTORCH_COMPILE_DEBUGÚ0Ú1T)ZdynamoZaotZinductorZoutput_code)ÚosÚenvironÚgetrN   Ú_loggingZset_logsÚloggingÚDEBUGÚadd_file_handlerÚ
contextlibÚ	ExitStack)Zcompile_debugr   r   r   Úsetup_compile_debug  s    ür�   c                   C   s   t  ¡  d S r?   )Úgraph_break_dup_warning_checkerru   r   r   r   r   Úreset_graph_break_dup_checker.  s    r‘   c                     sn   t j tƒ d¡} t j | ¡s&t  | ¡ t t j | d¡¡‰ t d¡‰ˆ 	ˆ ¡ t
 ¡ }| ‡ ‡fdd„¡ |S )NZtorchdynamoz	debug.logztorch._dynamoc                      s
   ˆ  ˆ ¡S r?   ©ÚremoveHandlerr   ©Zlog_file_handlerÚloggerr   r   r\   <  r]   z"add_file_handler.<locals>.<lambda>)r†   Úpathr   Úget_debug_dirÚexistsÚmakedirsrŠ   ÚFileHandlerÚ	getLoggerÚ
addHandlerr�   rŽ   Úcallback)Úlog_pathÚ	exitstackr   r”   r   rŒ   2  s    


rŒ   c                     sR   t  ¡ } tjd k	rNt tj¡‰ t ¡ D ]"‰ˆ ˆ ¡ |  ‡ ‡fdd„¡ q&| S | S )Nc                      s
   ˆ  ˆ ¡S r?   r’   r   r”   r   r   r\   F  r]   z setup_log_file.<locals>.<lambda>)	r�   rŽ   r   Zlog_file_namerŠ   rš   Zget_loggersrœ   r�   )rŸ   r   r”   r   Ú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Útyper'   Úco_firstlineno)ÚexcÚcoder   r   r   Úgen_record_file_nameL  s    ÿÿÿr§   c              	   C   s~   zTt j | ¡rt d| ¡ n6t jt j | ¡dd� t| dƒ�}| |¡ W 5 Q R X W n$ t	k
rx   tj
d| dd� Y nX d S )Nz9Unable to write execution record %s; file already exists.T)Úexist_okÚwbz#Unable to write execution record %sr   )Úexc_info)r†   r–   r˜   ro   Úwarningr™   ÚdirnameÚopenÚdumpÚ	ExceptionÚerror)ÚfilenameZexec_recordÚfr   r   r   Úwrite_record_to_fileQ  s     ÿr³   )Úgc                 C   s&   d}| j D ]}d|jkr
|d7 }q
|S )Nr   Úcallr   )ÚnodesÚop)r´   ÚcÚnr   r   r   Úcount_calls_  s
    


rº   c                 C   s   | S r?   r   rZ   r   r   r   Úidentityg  s    r»   c                  O   s   d S r?   r   ©r/   r0   r   r   r   Únothingk  s    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   t ƒ | _t ƒ | _d S r?   )ÚdictrE   Úrefsr{   r   r   r   rw   r  s    zExactWeakKeyDictionary.__init__c                 C   s   | j t|ƒ S r?   )rE   Úidr�   r   r   r   Ú__getitem__v  s    z"ExactWeakKeyDictionary.__getitem__Nc                 C   s   | j  t|ƒ|¡S r?   )rE   rˆ   rÁ   )rv   rI   Údefaultr   r   r   rˆ   y  s    zExactWeakKeyDictionary.getc                 C   s   t |ƒ| jkS r?   )rÁ   rE   r�   r   r   r   Ú__contains__|  s    z#ExactWeakKeyDictionary.__contains__c                    s<   t |ƒ‰ ˆ ˆjkr.t |‡ ‡fdd„¡ˆjˆ < |ˆjˆ < d S )Nc                    s
   ˆ  ˆ ¡S r?   )Ú
_remove_id)Úref©Úidxrv   r   r   r\   ‚  r]   z4ExactWeakKeyDictionary.__setitem__.<locals>.<lambda>)rÁ   rÀ   ÚweakrefrÆ   rE   )rv   rI   rK   r   rÇ   r   Ú__setitem__  s    
z"ExactWeakKeyDictionary.__setitem__c                 C   s(   || j kr| j |= || jkr$| j|= d S r?   )rE   rÀ   )rv   rÈ   r   r   r   rÅ   …  s    

z!ExactWeakKeyDictionary._remove_idc                 C   s   | j  ¡  | j ¡  d S r?   )rÀ   r<   rE   r{   r   r   r   r<   ‹  s    
zExactWeakKeyDictionary.clear)N)r'   rƒ   rM   Ú__doc__rw   rÂ   rˆ   rÄ   rÊ   rÅ   r<   r   r   r   r   r¾   o  s   
r¾   c                 C   s(   t |tttfƒrt| ƒ|kS t| ƒ|kS )zisinstance() without subclasses)Ú
isinstanceÚtuplerk   rz   r£   )ÚobjZallowed_typesr   r   r   Úistype�  s    rÏ   c                 C   s,   t jdk rt| tjƒS t| tjtjfƒS d S )N)é   é	   )ÚsysÚversion_inforÌ   ÚtypingÚ_GenericAliasÚ_SpecialGenericAliasZ_UnionGenericAlias©rK   r   r   r   Ú	is_typing—  s    
 
ÿrØ   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)
ÚnprÏ   Úint8Úint16Úint32Úint64Úuint8Zuint16Zuint32Zuint64r×   r   r   r   Úis_numpy_int_type   s    øþrà   c                 C   s   t sdS t| t jt jt jfƒS rÙ   )rÚ   rÏ   Úfloat16Úfloat32Úfloat64r×   r   r   r   Úis_numpy_float_type³  s    ýþrä   c                 C   s   t sdS t| t jƒS rÙ   )rÚ   rÏ   Úndarrayr×   r   r   r   Úis_numpy_ndarrayÁ  s    ræ   c                 C   s,   t jt jjftj˜}|t jjf }t| |ƒS )zCheck of obj is a tensor)	rN   ÚTensorÚnnÚ	Parameterr   Ztraceable_tensor_subclassesÚ_subclassesr   rÏ   )rÎ   Ztensor_listr   r   r   ÚistensorÈ  s    þýrë   c                 C   s
   t | tƒS r?   )rÌ   r   ©Úmodr   r   r   Úis_lazy_moduleÓ  s    rî   rs   c                  G   s   t | Ž  d S r?   )r-   )r/   r   r   r   Ú
print_once×  s    rï   c                    s,   | ‰ ‡ fdd„}t |jƒdks"t‚|jd S )zNSome black magic to create a cell object that usually only exists in a closurec                      s   ˆ S r?   r   r   rZ   r   r   r²   à  s    zmake_cell.<locals>.fr   r   )r   Ú__closure__rQ   )Úvalr²   r   rZ   r   Ú	make_cellÜ  s    rò   c                 C   s”   z.t dd„ | D ƒƒ}dd„ | ¡ D ƒ}||fW S  tk
rŽ } zBddlm} ddlm} |d|| Ž › d	|t| ¡ ƒŽ › �ƒ|‚W 5 d }~X Y nX d S )
Nc                 s   s   | ]}|  ¡ V  qd S r?   ©Zas_proxy©r   Úargr   r   r   r    é  s     z$proxy_args_kwargs.<locals>.<genexpr>c                 S   s   i | ]\}}||  ¡ “qS r   ró   )r   rI   rõ   r   r   r   Ú
<dictcomp>ê  s      z%proxy_args_kwargs.<locals>.<dictcomp>r   ©Úunimplemented)Útypestrzcall_function args: rB   )	rÍ   rF   ÚNotImplementedErrorr¥   rø   Zvariables.baserù   rk   rE   )r/   r0   Z
proxy_argsÚproxy_kwargsÚerø   rù   r   r   r   Úproxy_args_kwargsç  s    
ÿþrý   c                   @   sŠ   e Zd ZU eed< eed< eed< eed< eed< ee ed< ee ed< ee ed< ee ed	< ee ed
< ee ed< ee ed< dS )ÚCompilationMetricsrT   r¢   Úco_filenamer¤   Z
cache_sizeZguard_countZgraph_op_countZgraph_node_countZgraph_input_countZentire_frame_compile_time_sZbackend_compile_time_sZfail_reasonN)r'   rƒ   rM   r   Ú__annotations__Úintr   Úfloatr   r   r   r   rþ   õ  s   
rþ   c                   @   s>   e Zd ZU dZeeef ed< eed< dd„ Ze	dd„ ƒZ
dS )	ÚCleanupHookz,Remove a global variable when hook is calledÚscopeÚnamec                 G   s   t  jd8  _| j| j= d S r7   )ÚCleanupManagerÚcountr  r  )rv   r/   r   r   r   Ú__call__  s    zCleanupHook.__call__c                 C   s,   || kst ‚t jd7  _|| |< t| |ƒS r7   )rQ   r  r  r  )r  r  rñ   r   r   r   Úcreate  s    zCleanupHook.createN)r'   rƒ   rM   rË   r   r   r   r   r  Ústaticmethodr	  r   r   r   r   r    s   
r  c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )r  r   c                    s&   | j | D ]
}|ƒ  q
tƒ  |¡ d S r?   )rE   ÚsuperrÅ   )rv   rÈ   Úhook©Ú	__class__r   r   rÅ     s    zCleanupManager._remove_id)r'   rƒ   rM   r  rÅ   Ú__classcell__r   r   r  r   r    s   r  c                 C   s0   |   ¡  | j¡}| jr,| jdk	r,| j  ¡ |_|S )z!Clone the tensor and its gradientN)ÚcloneÚrequires_grad_Úrequires_gradÚis_leafÚgrad©r[   Úyr   r   r   Úclone_tensor$  s    r  ©Údtypec             
      sx  t | tjjƒr| S ‡ fdd„}t ¡ ��F | jjdkrJ|| ƒW  5 Q R £ S tdd„ t|  	¡ |  
¡ ƒD ƒƒ}| jr„t |d f| ¡}ntj|d ˆ p–| j| jd�}|  ¡ | ¡  d |  ¡  }| |  	¡ |  
¡ |¡ zH| |  ¡ ¡ | jrô| | j¡ | j�r| jdk	�rt| jˆ d	�|_W n* tk
�rD   || ƒ Y W  5 Q R £ S X t| d
ƒ�r^| j ¡ |_|W  5 Q R £ S Q R X dS )zcopy while preserving stridesc                    sV   t  | ¡}| jr| | j¡ | jr<| jd k	r<t| jˆ d�|_t| dƒrR| j 	¡ |_|S )Nr  Ú_dynamo_dynamic_indices)
rN   r  r  r  r  r  Úclone_inputÚhasattrr  Úcopyr  r  r   r   Útorch_clone3  s    

z clone_input.<locals>.torch_cloneZxlac                 s   s   | ]\}}|d  | V  qdS )r   Nr   )r   ÚshapeÚstrider   r   r   r    B  s    zclone_input.<locals>.<genexpr>é    )r  ÚdeviceNr  r  )rÌ   rN   rê   r   Úno_gradr"  r£   r^   ÚzipÚsizer   Zis_quantizedZempty_quantizedÚemptyr  Zdata_ptrZelement_sizeZas_strided_Úcopy_r  r  r  r  r  r  ÚRuntimeErrorr  r  r  )r[   r  r  Zneeded_sizeÚresultZcache_line_offsetr   r  r   r  ,  s>    
ÿ  ÿþr  c                 C   s¤   t | ƒtkrft| ƒ}| ¡ D ]D\}}t|tƒr<t|ƒ||< qt|tjƒsTtt |ƒƒ‚t	|ƒ||< q|S t
| ƒ}tt|ƒƒD ]$}t|| tjƒrzt	|| ƒ||< qz|S r?   )r£   r¿   rF   rÌ   rÍ   Úclone_inputsrN   rç   rQ   r  rk   Úranger   )Úexample_inputsÚresrI   rK   Úir   r   r   r*  _  s    
r*  c                  c   sŽ   t jj ¡ �0 t  t j ¡ ¡} t j ¡ r8t  t j ¡ ¡}W 5 Q R X z
d V  W 5 t jj ¡ �( t j 	| ¡ t j ¡ r~t j 	|¡ W 5 Q R X X d S r?   )
rN   ÚutilsZ_python_dispatchZ_disable_current_modesr  ÚrandomÚget_rng_stateÚcudaÚis_availableÚset_rng_state)Ú	rng_stateÚcuda_rng_stater   r   r   Úpreserve_rng_stateq  s    


r7  c                 C   s&   t | tjjjtjjjtjjtjjfƒS r?   )	rÌ   rN   ÚjitZ_traceZTopLevelTracedModuleÚ_scriptZRecursiveScriptModuleZScriptFunctionZScriptModule)Zmodel0r   r   r   Úis_jit_model€  s    üþr:  c                 C   sx   t | ƒr| S ztj | |¡W S  tk
rr   ztj | ¡W  Y S  tk
rl   |r^t d¡ n
t d¡ Y nX Y nX d S )Nz	jit errorz0Both torch.jit.trace and torch.jit.script failed)	r:  rN   r8  Útracer¯   Úscriptro   Ú	exceptionr°   )Úmodelr,  r~   r   r   r   ÚtorchscriptŒ  s    r?  c                 C   s(   zt  | ¡W S  tk
r"   Y d S X d S r?   )ÚinspectÚgetfileÚ	TypeError©rÎ   r   r   r   rA  ž  s    rA  c                 C   s   t t| ƒƒS )úLTest if an object is a namedtuple or a torch.return_types.* quasi-namedtuple)Úis_namedtuple_clsr£   rC  r   r   r   Úis_namedtuple¥  s    rF  c                 C   sp   zVt | tƒrTt| dg ƒpdg}t| ddƒ}|dkpP|d tkoPt| dƒoPt| dƒW S W n tk
rj   Y nX dS )	rD  Ú	__bases__Nrƒ   útorch.return_typesr   Ú_makeÚ_fieldsF)Ú
issubclassrÍ   Úgetattrr  rB  )ÚclsÚbasesÚmoduler   r   r   rE  ª  s    
ÿrE  c                 C   s°   | t krdddgS t| tƒs t‚t| dƒr0| jS tjG dd„ dƒƒ}| jdksRt‚| t	|t
| jƒƒƒ}dg| j }t|ƒD ]0}|d	 d
krztt||ƒ|ƒrz||t||ƒj< qz|S )zIGet the fields of a namedtuple or a torch.return_types.* quasi-namedtupleÚstartÚstopÚsteprJ  c                   @   s   e Zd ZU eed< dS )z!namedtuple_fields.<locals>.MarkerÚindexN©r'   rƒ   rM   r  r   r   r   r   r   ÚMarkerÃ  s   
rU  rH  Nr   r¡   )ÚslicerK  rÍ   rQ   r  rJ  ÚdataclassesÚ	dataclassrƒ   r   r+  Ún_fieldsÚdirrÌ   rL  rS  )rM  rU  rÎ   Úfieldsr  r   r   r   Únamedtuple_fields¸  s    

r\  c              	      sˆ   t  ¡ �f t  t j ¡ ¡‰t j ¡ r4t  t j ¡ ¡‰ g ‰t |  	¡ |  
¡ ¡D ]}ˆ ||jt  |¡f¡ qLW 5 Q R X ‡ ‡‡fdd„}|S )Nc               	      s^   t  ¡ �L t j ˆ¡ t j ¡ r,t j ˆ ¡ ˆD ]\} }}| j|kr0|  |¡ q0W 5 Q R X d S r?   )rN   r#  r0  r4  r2  r3  Ú_versionr'  )ÚparamÚversionÚoriginal_value©r6  r5  Úsaved_stater   r   ÚrestoreÚ  s    


z"checkpoint_params.<locals>.restore)rN   r#  r  r0  r1  r2  r3  r#   r$   Ú
parametersÚbuffersrP   r]  )Úgmr^  rc  r   ra  r   Úcheckpoint_paramsÑ  s    

$	rg  c                 C   sh   t j ¡ rt jj}nt}|ƒ  t ¡  t  d¡ t 	¡ }t
|ƒD ]}| |Ž }|ƒ  q@t 	¡ }||| fS )Ni9  )rN   r2  r3  Úsynchronizer½   ÚgcZcollectZmanual_seedrO   Úperf_counterr+  )r>  r,  Útimesrh  rR   r¡   r)  Út1r   r   r   Útimedæ  s    


rm  c                 C   s    t dd„ t ||  d¡¡D ƒƒS )Nc                 s   s   | ]}|j V  qd S r?   )Zis_cuda©r   r[   r   r   r   r    ø  s     z check_is_cuda.<locals>.<genexpr>T)Úallr#   r$   rd  )rf  r,  r   r   r   Úcheck_is_cuda÷  s    rp  r!  c                 C   sn   | dkst ‚dd„ t| ƒD ƒ}t|dd … |d d…  ƒ}tdd |¡› dd |¡› d�ƒ}d	| › d
�|_|S )Nr   c                 S   s   g | ]}d |› �‘qS ©rj   r   )r   r.  r   r   r   rg   þ  s     z rot_n_helper.<locals>.<listcomp>éÿÿÿÿzlambda ú,z: (ú)Zrot_Z_helper)rQ   r+  ÚreversedÚevalr   r'   )r¹   ÚvarsZrotatedÚfnr   r   r   Úrot_n_helperû  s    "ry  c                 C   sZ   t | ttfƒrttt| ƒƒS t| tjt	fƒpXt | t
jtttttt	d ƒtt	t	ƒtjtjfƒS r?   )rÏ   rÍ   Ú	frozensetro  r   Úis_safe_constantrÌ   ÚenumÚEnumr£   ÚtypesÚCodeTyper  r  Úboolr   ÚbytesrV  rN   r"  r  rq  r   r   r   r{    s"    õþr{  c                 C   s8   ddl m}m} t| |ƒr"|  ¡ S t| |ƒr4|  ¡ S | S )Nr   )ÚConstantVariableÚSymNodeVariable)Ú	variablesr‚  rƒ  rÌ   Zevaluate_exprZas_python_constant)rõ   r‚  rƒ  r   r   r   Úguard_if_dyn  s    

r…  c                 C   s   t dd„ t | | ¡ ¡D ƒƒS )Nc                 s   s   | ]}|  ¡ V  qd S r?   )Zis_python_constantrn  r   r   r   r    *  s     z&check_constant_args.<locals>.<genexpr>)ro  r#   r$   rE   r¼   r   r   r   Úcheck_constant_args)  s    r†  c                 C   sb   ddl m} ddlm} d}t | | ¡ ¡D ],}t||ƒrD|d7 }q,t|||fƒs, dS q,|dkS )Nr   )r‚  )ÚUnspecializedPythonVariabler   F)Zvariables.constantr‚  Úvariables.tensorr‡  r#   r$   rE   rÌ   )r/   r0   r‚  r‡  Zunspec_countr[   r   r   r   Úcheck_unspec_python_args-  s    

r‰  c                    s.   ddl m‰  t‡ fdd„t | | ¡ ¡D ƒƒS )Nr   ©ÚNumpyNdarrayVariablec                 3   s   | ]}t |ˆ ƒV  qd S r?   )rÌ   rn  rŠ  r   r   r    @  s   ÿz+check_numpy_ndarray_args.<locals>.<genexpr>)rˆ  r‹  Úanyr#   r$   rE   r¼   r   rŠ  r   Úcheck_numpy_ndarray_args=  s    þr�  c                 C   sP   g }i }|D ]}|  | | ¡¡ q| ¡ D ]\}}| || | ¡i¡ q*||fS r?   )rP   Zas_specializedrF   Úupdate)Útxr/   r0   Zspecialized_argsZspecialized_kwargsr[   re   rj   r   r   r   Úspecialize_args_kwargsF  s    r�  c                 C   s   t | ƒ}tjj |¡ |S r?   )Ú
object_newrN   rè   ÚModulerw   )rM  rÎ   r   r   r   Únn_module_newW  s    r“  c                 C   s   t  tj| d¡S r7   )Ú	functoolsÚreduceÚoperatorÚmul)Úitr   r   r   Úproduct]  s    r™  c                 C   s   |   ¡ \}\}}|||  S r?   )Ú
__reduce__)r˜  rS  r¡   rÎ   rP  r   r   r   Útuple_iterator_getitema  s    r›  c                 C   s2   | j j}| j}|rdnd}|› d|› d|› �}|S )NÚLÚGz["z"].)r  r'   r  )rK   Úlocalr  rñ   r  Z
local_namer   r   r   Ú	enum_reprf  s
    rŸ  c                 C   s   dd„ |   ¡ D ƒS )Nc                 S   s(   h | ] }t |tjjtjfƒrt|ƒ’qS r   )rÌ   rN   rè   ré   rç   rÁ   rd   r   r   r   Ú	<setcomp>q  s     z%dict_param_key_ids.<locals>.<setcomp>©rl   r×   r   r   r   Údict_param_key_idsp  s    ÿr¢  c                 C   s   dd„ |   ¡ D ƒS )Nc                 S   s$   h | ]}t |tjjtjfƒs|’qS r   )rÌ   rN   rè   ré   rç   rd   r   r   r   r   w  s     z"dict_const_keys.<locals>.<setcomp>r¡  r×   r   r   r   Údict_const_keysv  s    ÿr£  c                   s:   t dd„ | D ƒƒr0‡ fdd„| D ƒ›  dd¡}n| ›}|S )Nc                 s   s   | ]}t |tjƒV  qd S r?   )rÌ   r|  r}  rd   r   r   r   r    }  s     z'dict_const_keys_repr.<locals>.<genexpr>c                    s,   h | ]$}t |tjƒr t|ˆ d �nt|ƒ’qS )©rž  )rÌ   r|  r}  rŸ  rm   rd   r¤  r   r   r   €  s     z'dict_const_keys_repr.<locals>.<setcomp>ú'Ú )rŒ  Úreplace)Z
const_keysrž  Zconst_keys_strr   r¤  r   Údict_const_keys_repr|  s     ÿr¨  c                 C   s   dt | ƒ› �S )NZ__dict_key_)rÁ   )rI   r   r   r   Úglobal_key_nameˆ  s    r©  )ÚFakeTensorModeÚUnsupportedFakeTensorExceptionc              
   C   s^   z| ƒ W S  t k
rX } z2ddlm} d|j› d�}t |¡ ||ƒ|‚W 5 d }~X Y nX d S )Nr   r÷   zUnsupported: z with fake tensor propagation.)r«  r¥   rø   Úreasonro   r«   )rx  rü   rø   Úmsgr   r   r   Úwrap_fake_exception’  s    
r®  c              
      s6   t jj |¡� t‡ fdd„ƒW  5 Q R £ S Q R X d S )Nc                      s
   t  ˆ ¡S r?   )r  Údeepcopyr   rC  r   r   r\   Ÿ  r]   z)deepcopy_to_fake_tensor.<locals>.<lambda>)rN   rê   Úfake_tensorZFakeCopyModer®  )rÎ   Ú	fake_moder   rC  r   Údeepcopy_to_fake_tensor�  s    r²  c                 C   s   t  t  t  | | ¡¡¡S )z+
    Calculate root mean squared error
    )rN   ÚsqrtZmeanZsquare)rÆ   r-  r   r   r   Úrmse¢  s    r´  g-Cëâ6?Tc
                    sT  ˆdkrˆ‰t ˆtttjjtjfƒr¤t ˆttfƒsNtdtˆƒ› dtˆƒ› �ƒ‚t	ˆƒt	ˆƒkrjˆdƒ dS t	ˆƒt	ˆƒko¢t
‡ ‡‡‡‡‡‡	fdd„tˆˆˆƒD ƒƒS t ˆtƒ�rLt ˆtƒs¾t‚tˆ ¡ ƒtˆ ¡ ƒksútdtˆ ¡ ƒ› d	tˆ ¡ ƒ› �ƒ‚tˆ ¡ ƒD ]@}
tˆ|
 ˆ|
 ˆ|
 ˆ ˆ	ˆˆˆˆˆd
�
�sˆd|
ƒ  dS �qdS t ˆtjƒ�r¾t ˆtjjƒ�rnt‚t ˆtjjƒ�r‚t‚ˆj�r¦ˆj�s–t‚ˆ ¡ ‰ˆ ¡ ‰t ˆtjƒ�sÐtdtˆƒ› dtˆƒ› �ƒ‚ˆ�rJˆjˆjk�røˆdˆjˆjƒ dS ˆjtjk�rJˆ�rdS tjˆjtjd�ˆjtjd�ˆ	ˆ	ˆd�}|�sFˆdƒ |S ˆ �rÊˆ ¡  tj¡‰ˆ ¡  tj¡‰tjˆˆˆ	ˆ	dd��rŠdS tjjjˆˆddd�}|dk �rÂt  d| !¡  "¡  #¡ ¡ |dkS ˆ�sÜˆ ˆj¡‰tjˆˆˆ	ˆ	ˆd��rödS ˆjtj$k�r¢t%ˆˆƒ #¡ }t%ˆˆƒ #¡ }d}ˆ &¡ dk �snˆj'dk�rdˆj(d ˆj(d   k�rbdk�snn ˆ	dk�rrd}||| ˆ	d  k}|�sžˆd||ˆ )¡ ƒ |S ˆ�r¬dS ˆd ˆ	ƒ dS �n’t ˆt*t+tdƒttj,fƒ�rˆ�rädS ˆˆk}|�sˆd!tˆƒˆˆƒ |S t ˆt-ƒ�r>t.j/ˆˆˆ	ˆ	d"�}|�s:ˆd#ˆˆˆ	ƒ |S t0ˆƒ�sRt1ˆƒ�r¤ˆ�rtt0ˆƒ�stt1ˆƒ�stˆ #¡ ‰tˆƒtˆƒk�oŒˆˆk}|�s ˆd$ˆˆƒ |S t2ˆƒ�rètˆƒtˆƒk�oætt 3ˆ¡t 3ˆ¡ˆˆ ˆ	ˆˆˆˆˆd
�
S tˆƒj4d%k�r<tˆƒtˆƒk�st‚t
‡ ‡‡‡‡‡‡‡‡‡	f
d&d„ˆj5 ¡ D ƒƒS t6d'tˆƒj4› �ƒ‚dS )(z-Check correctness to see if ref and res matchNztype mismatch rB   zLength mismatchFc                 3   s0   | ](\}}}t |||ˆ ˆˆˆˆˆˆd �
V  qdS ))Ú	log_errorN)Úsame)r   ZaiZbiZ	fp64_refi)Úcos_similarityÚ	equal_nanÚexact_dtypeÚignore_non_fprµ  Úrelax_numpy_equalityÚtolr   r   r    ½  s   ôözsame.<locals>.<genexpr>zkeys mismatch z == ©r·  r¼  r¸  r¹  r»  rº  rµ  zAccuracy failed for key name %sTzdtype mismatch %s, %sr  )ZatolZrtolr¸  z+Accuracy failed: uint8 tensor did not matchr   g�íµ ÷Æ°>)ÚdimÚepsg®Gáz®ï?zSimilarity score=%sg       @iè  é   rr  éþÿÿÿr   g{®Gáz”?g      @g      $@z4RMSE (res-fp64): %.5f, (ref-fp64): %.5f and shape=%sz+Accuracy failed: allclose not within tol=%szAccuracy failed (%s): %s != %s)Zrel_tolZabs_tolz1Accuracy failed (float): %s != %s (within tol=%s)z!Accuracy failed (numpy): %s != %s)ZMaskedLMOutputZSeq2SeqLMOutputZ!CausalLMOutputWithCrossAttentionsZLongformerMaskedLMOutputZ	InstancesZSquashedNormalZBoxesZNormalZTanhTransformZFooÚVariablec                 3   s<   | ]4}t tˆ|ƒtˆ|ƒtˆ|ƒˆ ˆ	ˆˆˆˆˆd �
V  qdS )r½  N)r¶  rL  )r   rI   ©
r·  r¸  r¹  Úfp64_refrº  rµ  rÆ   r»  r-  r¼  r   r   r    e  s   ôözunsupported type: )7rÌ   rk   rÍ   rN   rè   ZParameterListÚSizerQ   r£   r   ro  r$  r¿   rz   rl   Úsortedr¶  rç   rê   r   Z	is_sparseZto_denser  r€  ZallcloseÚtorß   Úflattenrâ   Z
functionalZcosine_similarityro   r«   ÚcpuÚdetachÚitemrã   r´  ZnumelÚndimr  r%  r   r  r"  r  ÚmathÚiscloserà   rä   ræ   Ú	as_tensorr'   Ú__dict__r(  )rÆ   r-  rÄ  r·  r¼  r¸  r¹  r»  rº  rµ  re   rS   ZscoreZ	ref_errorZ	res_errorZ
multiplierZpasses_testr   rÃ  r   r¶  ©  s(   *(
óÿþöÿ

*û

ÿþ þ
þ
ü	ü
   ÿÿÿ
öór¶  c                 C   s,   | j  d¡d }d| j› d|› d| j› d�S )Nú/rr  r¥  z' (rC   rt  )rÿ   Úsplitr¢   r¤   )r¦   Zshort_filenamer   r   r   Úformat_func_infox  s    rÓ  c                  c   s&   t j} tjt _z
d V  W 5 | t _X d S r?   )r   Zcache_size_limitrÒ   rt   )Zpriorr   r   r   Údisable_cache_limit}  s
    
rÔ  c                   @   sJ   e Zd ZdZdd„ Zejjdœdd„Zdd„ Z	d	d
„ Z
dd„ Zdd„ ZdS )ÚCompileProfilerzìUtility for profiling how and what dynamo would compile.

    Can be used for
     * diagnosing recompilation issues
     * determining an appropriate compile cache limit
     * (TODO)confirming which functions got compiled/skipped
    c                 C   s   d| _ d| _dd„ | _d S )Nr   c                   S   s   t ƒ S r?   )rÔ  r   r   r   r   r\   ¢  r]   z*CompileProfiler.__init__.<locals>.<lambda>)Úframe_countr@   Zbackend_ctx_ctorr{   r   r   r   rw   Ÿ  s    zCompileProfiler.__init__)rf  c                 C   s:   |  j d7  _ |jjD ]}d|jkr|  jd7  _q|jS )Nr   rµ   )rÖ  Úgraphr¶   r·   r@   Úforward)rv   rf  r,  Únoder   r   r   r  ¤  s
    
zCompileProfiler.__call__c                 C   s   t j| _dt _| S )NT)r   Úreport_guard_failuresÚold_report_guard_failurer{   r   r   r   Ú	__enter__«  s    zCompileProfiler.__enter__c                 C   s   | j t_d S r?   )rÛ  r   rÚ  )rv   Útyprñ   Ú	tracebackr   r   r   Ú__exit__°  s    zCompileProfiler.__exit__c                 C   s   dt iS )NÚguard_failures)rà  r{   r   r   r   Úget_metrics³  s    zCompileProfiler.get_metricsc                    sŒ   |   ¡ }|d ‰ ‡ fdd„‰‡ fdd„‰‡‡fdd„ˆ D ƒ‰dd	„ }‡ ‡‡fd
d„}t d¡}||ƒ phd7 }|t d¡7 }||ƒ p„d7 }|S )Nrà  c                    s   t ˆ |  ƒS r?   )r   ©r¦   ©Úgfr   r   Únum_recompilesº  s    z.CompileProfiler.report.<locals>.num_recompilesc                    s   d  dd„ ˆ |  D ƒ¡S )Nr   c                 S   s   g | ]}t |ƒ‘qS r   )r   rn  r   r   r   rg   ¾  s     zECompileProfiler.report.<locals>.recompile_reasons.<locals>.<listcomp>©r   râ  rã  r   r   Úrecompile_reasons½  s    z1CompileProfiler.report.<locals>.recompile_reasonsc                    s"   g | ]}t |ƒˆ |ƒˆ|ƒg‘qS r   )rÓ  ©r   r¦   )rå  rç  r   r   rg   À  s   ÿz*CompileProfiler.report.<locals>.<listcomp>c                      s2   dt kr.t d ‰ t‡ fdd„ˆ D ƒddgd�S d S )NZgraph_breakc                    s   g | ]}|ˆ | g‘qS r   r   )r   r­  ©Zgraph_breaksr   r   rg   É  s     zFCompileProfiler.report.<locals>.graph_break_report.<locals>.<listcomp>zGraph Break ReasonZCountr   )Úcountersr!   r   r   ré  r   Úgraph_break_reportÅ  s    þz2CompileProfiler.report.<locals>.graph_break_reportc                     sJ   t ˆ ƒrFt‡fdd„ˆ D ƒƒ} tˆdddgd�}|t d| › d�¡ S d S )	Nc                    s   g | ]}ˆ |ƒ‘qS r   r   rè  )rå  r   r   rg   Ï  s     zHCompileProfiler.report.<locals>.recompilation_report.<locals>.<listcomp>rh   Z
RecompileszRecompile Reasonsr   zC

                    Set torch._dynamo.config.cache_size_limit to z/ to avoid being cache limited.
                )r   Úmaxr!   ÚtextwrapÚdedent)Zmax_recompilesZrecomp_table)rä  rå  Úsummarized_gfr   r   Úrecompilation_reportÍ  s    þþÿz4CompileProfiler.report.<locals>.recompilation_reportaÇ  
            Torchdynamo Profiler Report
            ===========================

            Graph Breaks
            ------------
            Graph breaks happen when torchdynamo encounters code it can't safely trace.
            If you want to find out why breaks are happening, check below for each break reason
            You may gain additional insight by passing `fullgraph=True` to torch.compile,
            to stop at the first break.

        zNo graph breaks detected.a+  

            Recompilation
            -------------
            These subgraphs were recompiled more than once due to guard failures
            Guard failures indicate some condition assumed to be static by the tracer changed,
            making it unsafe to reuse the compiled program.

        zNo recompilation detected.
)rá  rí  rî  )rv   Zmetricsrë  rð  Úreportr   )rä  rå  rç  rï  r   rñ  ¶  s$    þÿÿzCompileProfiler.reportN)r'   rƒ   rM   rË   rw   rN   r   ZGraphModuler  rÜ  rß  rá  rñ  r   r   r   r   rÕ  –  s   rÕ  c                 C   s2   dt j  ¡  d¡ d tt ¡ ƒ }tj | |¡S )NZrun_z%Y_%m_%d_%H_%M_%S_%fz-pid_)ÚdatetimeÚnowÚstrftimer   r†   Úgetpidr–   r   )Úroot_dirÚdir_namer   r   r   Ú_get_debug_dirú  s    ÿý
üÿrø  c                  C   s   t j} t| ƒS r?   )r   Zdebug_dir_rootrø  )Z
debug_rootr   r   r   r—     s    r—   c                    sz  ddl m}m}m}m}m} ˆj}dd„ }tjj	dœdd„}	tjj
 ˆjˆjf|	¡\‰ ‰t|ˆ ƒ‰ t|ˆƒ‰d‰|d	kr¸tˆ ƒd
kr¸tˆ d
 tjjƒr¸tˆ d
 ˆjƒftˆ dd… ƒ ‰ |dkrøˆjjˆj ‰tˆƒrìtˆdƒrìˆ ˆˆ ¡ tˆˆjƒ‰zXˆj�F tƒ �4 t‡ ‡‡‡‡fdd„ƒW  5 Q R £ W  5 Q R £ W S Q R X W 5 Q R X W �n$ |k
�rj   ‚ Y �n tk
�rt }
 zì|
}|
jdk	�r’|
j}t|tj j!j"ƒ�r¶|d|j#› �ƒ n˜t|tj j!j$ƒ�rÚ|d|j#› �ƒ ntt|tj j!j%ƒ�r |d|j#› d�ƒ nNt|tjj&j'j(ƒ�r&||j)ddd�‚n(t|tj*j+j,j-ƒ�rN||j)|
jd
 ƒ|
‚|t.|
ƒƒ /|
j0¡d‚W 5 d}
~
X Y nX dS )z]
    Run the computation represented by `node` using fake tensors and return the result.
    r   )ÚTorchRuntimeErrorrø   ÚUnsupportedÚ	UserErrorÚUserErrorTypec                 S   s   t | tjƒrt| ƒst‚| S r?   )rÌ   rN   rç   r   rQ   )rü   r   r   r   Úfake_wrapper  s    z$get_fake_value.<locals>.fake_wrapper©r¹   c                 S   s
   | j d S )NÚexample_value)Úmetarþ  r   r   r   Úvisit  s    zget_fake_value.<locals>.visitNÚcall_methodr   Úcall_moduleZ_initialize_hookc                      s   t ˆjˆˆ ˆˆƒS r?   )Úrun_nodeÚoutputr   ©r/   r0   ÚnnmodulerÙ  r�  r   r   r\   :  r]   z get_fake_value.<locals>.<lambda>zdata dependent operator: zdynamic shape operator: zunsupported operator: z€ (see https://docs.google.com/document/d/1GgvOe7C8_NVOMLOCwDaYV1mXXyHMXY7ExoewHqooxrs/edit#heading=h.64r4npvq0w0 for how to fix)a  Tried to use data-dependent value in the subsequent computation. This can happen when we encounter unbounded dynamic value that is unknown during tracing time.You will need to explicitly give hint to the compiler. Please take a look at constrain_as_value OR constrain_as_size APIsZconstrain_as_size_example)Z	case_name)1r¥   rù  rø   rú  rû  rü  r·   rN   r   ÚNoderÙ  Úmap_argr/   r0   r   r   rÌ   rè   r’  r²  r±  rÍ   r  Ú
nn_modulesÚtargetrî   r  Z_infer_parametersr   r®  r(  Ú	__cause__rê   r°  ZDataDependentOutputExceptionr3   ZDynamicOutputShapeExceptionZUnsupportedOperatorExceptionZexperimentalZsymbolic_shapesZGuardOnDataDependentSymNodeZCONSTRAIN_VIOLATIONr/  Z_sympyZvalue_rangesZValueRangeErrorr   Úwith_tracebackÚ__traceback__)rÙ  r�  rù  rø   rú  rû  rü  r·   rý  r  rü   Úcauser   r  r   Úget_fake_value  sn    

&"ÿ4 ÿ ÿ ÿÿ 
ÿúr  c                 C   s  |j }zš|dkr|j||ŽW S |dkrFt|d |jƒ|dd… |ŽW S |dkrf|dk	sZt‚|||ŽW S |dkr||  |j¡W S |dkržd	|jks’t‚|jd	 W S W n^ tk
� rþ } z>d
|› d|j› d|› d|› d�	}t|t|ƒ ƒ 	|j
¡|‚W 5 d}~X Y nX t|ƒ‚dS )aÅ  
    Runs a given node, with the given args and kwargs.

    Behavior is dicatated 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.
    Zcall_functionr  r   r   Nr  Zget_attrÚplaceholderrÿ  zFailed running rB   z(*z, **z):
)r·   r  rL  rQ   Zget_submoduler   r¯   r(  r   r  r  )ÚtracerrÙ  r/   r0   r  r·   rü   Zfn_strr   r   r   r  c  s$      ,r  c           
   
      sà   ddl m} ˆ j}| |kr"||  S | j}tjj | j| j	f‡ fdd„¡\}}|dkr‚ˆ j
j| j }t|ƒsvt |¡}q†|||Ž nd}ztˆ | |||ƒ}||| < W n8 tk
rÚ }	 z|t|	ƒƒ |	j¡d‚W 5 d}	~	X Y nX |S )z‘
    Run the actual computation represented by `node` and return the result.
    This will execute any dependent nodes in the graph as well.
    r   )rù  c                    s
   t | ˆ ƒS r?   )Úget_real_valuerþ  ©r  r   r   r\   •  r]   z get_real_value.<locals>.<lambda>r  N)r¥   rù  Zreal_value_cacher·   rN   r   rÙ  r	  r/   r0   Zoutput_graphr
  r  rî   r  r¯  r  r(  r   r  r  )
rÙ  r  rù  Úcacher·   r/   r0   Z	nn_moduleÚ
real_valuerü   r   r  r   r  ‡  s*    

þ(r  c                    sŒ   ddl m‰  ‡ fdd„}|  ¡ D ].\}}t|tjjƒr td|› d||ƒ› �ƒ‚q |  ¡ D ].\}}t|tjjƒrXtd|› d||ƒ› �ƒ‚qXd S )Nr   ©ÚFakeTensorConfigc                    s(   ˆ j r dd l}d| | j¡› �S dS d S )Nr   z"FAKE TENSOR CREATION TRACEBACK: 
 zNEnable TORCH_FAKE_TENSOR_DEBUG=1 to get creation stack traces on fake tensors.)ÚdebugrÞ  Úformat_listZ_debug_trace)ÚtrÞ  r  r   r   Ústack_or_hint®  s    z7assert_no_fake_params_or_buffers.<locals>.stack_or_hintzUnexpected fake buffer rB   zUnexpected fake param )	Útorch._subclasses.fake_tensorr  Znamed_buffersrÌ   rN   rê   r   rQ   Znamed_parameters)rf  r  r  Úbufferr^  r   r  r   Ú assert_no_fake_params_or_buffers«  s      ÿþ ÿþr  rC  c                 C   s   | j › d| j› �S )z9
    Returns the fully qualified name of the object.
    Ú.)rƒ   rM   rC  r   r   r   ÚfqnÀ  s    r!  c                 C   s   t jjjr| S |S d S r?   )rN   Ú_dynamor   Zassume_static_by_default)Zcount1Zcount2r   r   r   ÚifdynstaticdefaultÇ  s    
r#  rì   c                 C   sV   t t tj | j¡¡ƒD ]8}| 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¬   Ú__file__ÚendswithÚ	importlibÚimport_moduler'   )rí   r±   r   r   r   Úimport_submoduleÎ  s    r*  r×   c                 C   s<   z"t t t| ƒd¡tjƒr W dS W n tk
r6   Y nX dS )NÚ__getattribute__TF)rÌ   r@  Úgetattr_staticr£   r~  ÚFunctionTypeÚAttributeErrorr×   r   r   r   Úobject_has_getattribute×  s    þ
r/  c                 C   sD   zt  t| ƒd¡}W n tk
r,   d }Y nX |tjjjkr@d }|S )NÚ__getattr__)r@  r,  r£   r.  rN   rè   r’  r0  )rK   Z
getattr_fnr   r   r   Úget_custom_getattrã  s    
r1  c                   @   s   e Zd ZdZdZdZdS )ÚTensorStaticReasoné   rÀ  rD   N)r'   rƒ   rM   Ú	PARAMETERÚ
NOT_TENSORÚNN_MODULE_PROPERTYr   r   r   r   r2  î  s   r2  ©r¬  c                 C   s<   | t jkrdS | t jkrdS | t jkr*dS td| › �ƒ‚d S )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 )r2  r4  r5  r6  rQ   r7  r   r   r   Útensor_static_reason_to_messageô  s    


r8  ZGuardSource)ÚtensorÚ	is_tensorÚguard_sourceÚreturnc                 C   sJ   |  ¡ rtjrdtjfS t| ƒtjjkr8tj	r8dtj
fS |sFd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, esentially "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.
    T)FN)Zis_nn_moduler   Z&force_nn_module_property_static_shapesr2  r6  r£   rN   rè   ré   Zforce_parameter_static_shapesr4  r5  )r9  r:  r;  r   r   r   Útensor_always_has_static_shapeþ  s    


r=  c                    s    ‡‡fdd„‰ t ‡ ‡fdd„ƒS )Nc                      s   ˆ d k	rˆ› dˆ › �S ˆS d S )NrB   r   r   )Úmaybe_idr  r   r   Úformat_name  s    z+lazy_format_graph_code.<locals>.format_namec                      s$   t dˆ ƒ › d�ˆjjjˆjdd�ƒS )Nz===== z =====
F)Zprint_output)Ú_format_graph_coderØ  Ú__code__rÿ   Zprint_readabler   )r?  rf  r   r   r\     s   
ýz(lazy_format_graph_code.<locals>.<lambda>r   )r  rf  r>  r   )r?  rf  r>  r  r   Úlazy_format_graph_code  s    ÿrB  c                 C   s   d| › d|› d|› d�S )NzTRACED GRAPH
 rB   r   r   )r  r±   Ú	graph_strr   r   r   r@  %  s    r@  c                    s   ‡ ‡fdd„}t |ƒS )Nc                     sr   zddl m }  W n& tk
r6   dttˆ ˆƒƒ  Y S X dd„ ˆjjD ƒ}| |dddd	d
g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   )r·   r  r  r/   r0   )r   r¹   r   r   r   rg   3  s    z<lazy_format_graph_tabular.<locals>.inner.<locals>.<listcomp>Úopcoder  r  r/   r0   r   )
r!   r"   r   rB  r×  r¶   r@  rØ  rA  rÿ   )r!   Z
node_specsrC  ©Úfn_namerf  r   r   Úinner*  s    ÿÿÿ ÿz(lazy_format_graph_tabular.<locals>.innerr   )rF  rf  rG  r   rE  r   Úlazy_format_graph_tabular)  s    rH  c                 C   s,   | › d|› d|› d|› dt  |¡  ¡ › d�
S )NrB   z line z 
r   )ÚdisÚBytecode)Úprefixr  r±   Úline_nor¦   r   r   r   Úformat_bytecode>  s    rM  Z_forward_pre_hooksZ_forward_hooksZ_backward_pre_hooksZ_backward_hooksZ_state_dict_pre_hooksZ_state_dict_hooksZ_load_state_dict_pre_hooksZ_load_state_dict_post_hooksc                 C   sŽ   t jjjj}g }| o | o | }|s*|r4| t¡ |s<|rF| t¡ |rT| t¡ g }|D ],}t	| |g ƒ}	|	D ]}
|	|
 }| 
|¡ qpq\|S r?   )rN   Z_Cr"  Ú
eval_frameÚ
reset_codeÚextendÚforward_hook_namesÚbackward_hook_namesÚstate_dict_hook_namesrL  rP   )rí   Úcheck_forward_hooksÚcheck_backward_hooksÚcheck_state_dict_hooksrO  Zhook_dicts_to_checkZcheck_all_hooksZ	all_hooksZhook_dict_nameÚhooksÚ	hook_namer  r   r   r   Únn_module_get_all_hooksM  s(    ÿý


rY  c                 C   s   t | |||d�}t|ƒS )zL
    Helper function to check if a module has any hooks attached to it.
    )rT  rU  rV  )rY  r€  )rí   rT  rU  rV  rW  r   r   r   Únnmodule_has_hookso  s    	ürZ  c                 C   sZ   t | tjƒrt| jƒS t | tjƒr.|  ¡  ¡ S t | t	t
fƒrRt| ƒdd„ | D ƒƒS | S dS )z0Convert tensor and tnp.ndarray to numpy.ndarray.c                 s   s   | ]}t |ƒV  qd S r?   )Úto_numpy_helper©r   rÎ   r   r   r   r    ˆ  s     z"to_numpy_helper.<locals>.<genexpr>N)rÌ   Útnprå   r[  r9  rN   rç   rÉ  ÚnumpyrÍ   rk   r£   r×   r   r   r   r[  �  s    
r[  c                 C   sT   t | tjƒrt | ¡S t | tjƒr(| jS t | ttfƒrLt	| ƒdd„ | D ƒƒS | S dS )zeConvert tnp.ndarray to tensor, leave other types intact. If a list/tuple, loop through it to convert.c                 s   s   | ]}t |ƒV  qd S r?   )Únumpy_to_tensorr\  r   r   r   r    ”  s     z"numpy_to_tensor.<locals>.<genexpr>N)
rÌ   rÚ   rå   rN   rÏ  r]  r9  rÍ   rk   r£   r×   r   r   r   r_  �  s    
r_  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Únumpy_to_tensor_wrapperc                 C   s   || _ d| j j | _d S ©NZwrapped_©r²   r'   )rv   r²   r   r   r   rw   š  s    z numpy_to_tensor_wrapper.__init__c                 C   s   d| j j› d�S )Nz<Wrapped function <original ú>>rb  r{   r   r   r   Ú__repr__ž  s    z numpy_to_tensor_wrapper.__repr__c                 O   s   | j ||Ž}t|ƒS r?   )r²   r_  ©rv   r/   r0   rJ   r   r   r   r  ¡  s    z numpy_to_tensor_wrapper.__call__N)r'   rƒ   rM   rw   rd  r  r   r   r   r   r`  ™  s   r`  c                 C   sF   t | tjƒrt| |ƒ}t|ƒS t | tjƒrBtt | ¡|ƒ}t|ƒS d S r?   )rÌ   r]  rå   rL  r_  rN   rç   )rÎ   r  rJ   r   r   r   Únumpy_attr_wrapper¦  s    
rf  c                   @   s.   e Zd ZdZedœdd„Z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.©Úmethodc                 C   s   || _ d| j  | _d S ra  )ri  r'   )rv   ri  r   r   r   rw   ²  s    znumpy_method_wrapper.__init__c                 C   s   d| j › d�S )Nz<Wrapped method <original rc  rh  r{   r   r   r   rd  ¶  s    znumpy_method_wrapper.__repr__c                 O   sD   |d }t |tjƒrt |¡}t|| jƒ}||dd … |Ž}t|ƒS ©Nr   r   )rÌ   rN   rç   r]  rå   rL  ri  r_  )rv   r/   r0   rÎ   Zmethod_callablerJ   r   r   r   r  ¹  s    
znumpy_method_wrapper.__call__N©r'   rƒ   rM   rË   r   rw   rd  r  r   r   r   r   rg  ¯  s   rg  c                   @   s.   e Zd ZdZedœdd„Zdd„ Zdd„ Zd	S )
Únumpy_operator_wrapperzQImplements dunder methods for tnp.ndarray via functions from the operator library)r·   c                 C   s   || _ d|j› �| _d S ra  )r·   r'   )rv   r·   r   r   r   rw   Å  s    znumpy_operator_wrapper.__init__c                 C   s   d| j › d�S )Nz<Wrapped operator <original rc  )r'   r{   r   r   r   rd  É  s    znumpy_operator_wrapper.__repr__c                 O   s(   |rt ‚dd„ |D ƒ}| j|Ž }t|ƒS )Nc                 s   s(   | ] }t |tjƒrt |¡n|V  qd S r?   )rÌ   rN   rç   r]  rå   rô   r   r   r   r    Ï  s    z2numpy_operator_wrapper.__call__.<locals>.<genexpr>)rQ   r·   r_  re  r   r   r   r  Ì  s    ÿ
znumpy_operator_wrapper.__call__Nrk  r   r   r   r   rl  Â  s   rl  c                 C   sp   t | tƒs| S | jr:dd„ |  ¡ D ƒ}dd„ |  ¡ D ƒ}n|  ¡ }|  ¡ }tj||| j| j| j	d�}| 
¡  |S )Nc                 S   s.   g | ]&}t |tjƒr&|jj |jj¡n|‘qS r   ©rÌ   rN   ZSymIntrÙ  Z	shape_envZ	size_hintÚexpr©r   Úsr   r   r   rg   Ú  s   þ
ÿzdefake.<locals>.<listcomp>c                 S   s.   g | ]&}t |tjƒr&|jj |jj¡n|‘qS r   rm  ro  r   r   r   rg   à  s   þ
ÿ)r  r"  r  )rÌ   r   Z_has_symbolic_sizes_stridesr%  r   rN   Zempty_stridedr  r"  r  Zzero_)r[   r%  r   r  r   r   r   ÚdefakeÖ  s(    
üüûrq  c                 C   s   dd l }| |jjjkS r:   )Ztorch.utils.checkpointr/  Ú
checkpoint)rÎ   rN   r   r   r   Úis_utils_checkpointô  s    rs  c                  K   sB   dd l m  m} ddlm} |j}tjjj	r4|j
}|j|f| ŽS )Nr   r   )Ú TorchHigherOrderOperatorVariable)Ztorch._higher_order_ops.wrapZ_higher_order_opsÚwrapZvariables.higher_order_opsrt  Ztag_activation_checkpointrN   Z
_functorchr   Zfunctionalize_rng_opsZwrap_activation_checkpointÚmake)ÚoptionsZhigher_order_opsrt  Zactivation_checkpoint_opr   r   r   Úbuild_checkpoint_variableû  s    
ÿþrx  c                 C   sD   ddl m} |ƒ }| dkrn$| dkr<|r<ddlm} |ƒ }nd}|S )Nr   )Úis_dynamo_supportedrÉ  r2  r   )Ú
has_tritonF)rN  ry  Ztorch._inductor.utilsrz  )Zdevice_typery  Zcompile_supportedrz  r   r   r   Úis_compile_supported  s    r{  )r   Úoffsetr<  c                 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)r   r|  Zas_utf8r   r   r   Ú_fix_offset  s    
r€  c                   @   s.   e Zd ZU eed< eed< eed< eed< dS )Ú_AnchorsÚleft_end_linenoÚleft_end_offsetÚright_start_linenoÚright_start_offsetNrT  r   r   r   r   r�  *  s   
r�  )Úsegmentr<  c                    s‚  t jdkst‚ddl}z| d|  d ¡}W n tk
rB   Y dS X t|jƒdkrVdS |  d¡‰ ‡ fdd	„}‡ fd
d„‰‡ ‡fdd„}‡ ‡fdd„}|jd }t	||j
ƒ�r~|j}t	||jƒ�r‚|jjd }|||jjƒ}	ˆ||	ƒ\}}	ˆ | |	  }
 ¡ �s|
dk�r2|
dk�r"|||	ƒ\}}	qè|||	ƒ\}}	qè|	d }|tˆ | ƒk �rtˆ | |  }
 ¡ �st|
dk�rt|d7 }t||	||ƒS t	||jƒ�r |jjd }|||jjƒ}ˆ||ƒ\}}ˆ | | dk�rÜ|||ƒ\}}�q¸|jd }|||jƒ}t||||ƒS t	||jƒ�r~|jjd }|||jjƒ}ˆ||ƒ\}}ˆ | | dk�rZ|||ƒ\}}�q6|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
    )rÐ   é   r   Nz(
z
)r   r   c                    s   t ˆ |  |ƒS r?   )r€  )Úlinenor|  ©Úlinesr   r   Ú	normalizeN  s    z-_extract_anchors_from_expr.<locals>.normalizec                    sR   | t ˆ ƒk r*|t ˆ |  ƒkr*d}| d7 } q | t ˆ ƒk rF|t ˆ |  ƒk sJt‚| |fS rj  ©r   rQ   ©rˆ  Úcolr‰  r   r   Únext_valid_charS  s
    
 z3_extract_anchors_from_expr.<locals>.next_valid_charc                    s>   |d7 }ˆ| |ƒ\} }| t ˆ ƒk r2|t ˆ |  ƒk s6t‚| |fS r7   rŒ  r�  ©rŠ  r�  r   r   Ú	increment[  s     z-_extract_anchors_from_expr.<locals>.incrementc                    sB   d}| d7 } ˆ| |ƒ\} }| t ˆ ƒk r6|t ˆ |  ƒk s:t‚| |fS rj  rŒ  r�  r�  r   r   Únextlineb  s
     z,_extract_anchors_from_expr.<locals>.nextliner3  z)\#z\#ú[ú()rÒ   rÓ   rQ   ÚastÚparseÚSyntaxErrorr   ÚbodyrÒ  rÌ   ÚExprrK   ÚBinOpÚleftÚ
end_linenoÚend_col_offsetÚisspacer�  Ú	SubscriptÚCallr3   )r†  r•  Útreer‹  r‘  r’  Z	statementrn  Z
cur_linenoZcur_colÚchZ	right_colZleft_linenoZleft_colZright_linenor   r�  r   Ú_extract_anchors_from_expr4  sh    

 
ÿþý

r£  )r¦   Úinstr<  c                 C   s2  |j jdkrdS t | j|j j¡ ¡ }|j jdkr6|S |j jdksN|j jdkrR|S t	||j jƒ}d}d}g }|j j|j jkr²t	||j jƒ}|||… }| 
d| d||   ¡ nþ||d… d }| 
d| dt|ƒ|   ¡ t | j|j j¡ ¡ }t	||j jƒ}t|j jd |j jƒD ]V}t | j|¡ ¡ }	||	d 7 }t|	ƒt|	 ¡ ƒ }
| 
d|
 dt|	ƒ|
   ¡ �q||d|… 7 }t|ƒt| ¡ ƒ }
| 
d|
 d||
   ¡ d}zt|ƒ}W n tk
�rÖ   Y nX |dk�ròdd„ |D ƒ}nòd	d„ |D ƒ}|jd
k�r| j|7  _|jd
k�r4| j|7  _tt|ƒƒD ]”}	tt||	 ƒƒD ]|}|	|jk �rh�qT|	|jk�r„||jk �r„�qT|	|jk�r ||jk�r �qT|	|jk�r°�qT||	 | dk�rTd||	 |< �qT�q@dd„ |D ƒ}d}tt|ƒƒD ]8}|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 since `format_frame_summary` in
    Python's `traceback` module doesn't handle multi-line expressions
    (and their anchor extraction code is not completely correct).
    Nr¦  rB   ú~r   r   c                 S   s   g | ]}|  d d¡‘qS )r¥  ú^)r§  ©r   Úmarkerr   r   r   rg   ï  s     z.get_instruction_source_311.<locals>.<listcomp>c                 S   s   g | ]}t |ƒ‘qS r   )rk   r§  r   r   r   rg   ò  s     r   r¦  c                 S   s   g | ]}d   |¡‘qS )r¦  ræ  r§  r   r   r   rg     s     )Z	positionsrˆ  Ú	linecacheÚgetlinerÿ   Úrstriprœ  Ú
col_offsetr�  r€  rP   r   r+  Úlstripr£  rQ   r‚  rƒ  r„  r…  )r¦   r¤  Ú
first_lineZstart_offsetÚ
end_offsetr†  ÚmarkersÚ	last_linerˆ  ÚlineÚ
num_spacesÚanchorsrŽ  r)  r.  r   r   r   Úget_instruction_source_311­  s†     ÿ"
ÿþÿÿrµ  c                   C   s   t jptjjj d¡S )NZ
recompiles)r   rÚ  rN   r‰   Ú	_internalZ	log_stateZis_artifact_enabledr   r   r   r   Ú"is_guard_failure_reporting_enabled  s    þr·  c                 C   s   t | tjƒrt| dd ƒS d S )NZ_dynamo_static_input_type)rÌ   rN   rç   rL  )r  r   r   r   Úget_static_address_type  s    r¸  )NN)r   F)N)F)r   )N)FFF)FFF)øÚatexitrx   r�   r  r*   rW  rò  rI  r|  r”  ri  r@  r#   r©  rŠ   rÍ  r–  r†   r.   rÒ   rí  rO   r~  rÔ   rÉ   r   r   r   r   r   r   r   r	   r^  rÚ   ÚModuleNotFoundErrorZtorch._loggingrN   Ztorch._numpyZ_numpyr]  Ztorch._guardsr
   r   r¦  r   ZfftZlinalgr0  ZNP_SUPPORTED_MODULESZNP_TO_TNP_MODULEr(  Ztorch._functorch.configZ%torch.fx.experimental.symbolic_shapesr   Ztorch._dispatch.pythonr   r  r   r   Ztorch.nn.modules.lazyr   Ztorch.utils._pytreer   ÚdefaultdictÚCounterrê  Ztroubleshooting_urlZnnmodule_doc_urlZnnmodule_doc_url_msgr›   r'   ro   ry   r=   r;   r  r)   r!   r6   r8   r9   r>   r@   rA   rL   rY   rn   Úregisterrq   ZFloatTensorrâ   r  ZDoubleTensorrã   ÚdoubleZ
HalfTensorrá   ZhalfZBFloat16TensorZbfloat16Z
ByteTensorrß   Z
CharTensorrÛ   Z
LongTensorrÞ   ÚlongZ	IntTensorrÝ   r  ZShortTensorrÜ   ÚshortZ
BoolTensorr€  Ztensortype_to_dtyperr   r�   r�   r‘   rŒ   r    r§   r³   ZGraphrº   r»   r½   r¾   rÏ   rØ   rà   rä   ræ   rë   rî   rï   rò   rý   rX  rþ   r  r  Úinstancer  r  r*  r7  r:  r?  rA  rF  rE  r\  rg  rm  rp  ry  r{  r…  r†  r‰  r�  r�  r£   r¿   rE   Údict_valuesZodict_valuesÚiterrÍ   Útuple_iteratorÚ__length_hint__Ztuple_iterator_lenÚobjectÚ__new__r‘  r“  r™  r›  rŸ  r¢  r£  r¨  r©  Ztorch._subclassesrª  r«  r®  r²  r´  r°   r¶  rÓ  rÔ  Zorig_code_maprk   rà  Zgraph_break_reasonsZseen_code_maprÕ  rø  r—   r  r  r  r  r!  r#  Ú
ModuleTyper*  r/  r1  r}  r2  r8  rç   r=  rB  r@  rH  rM  rQ  rR  rS  Zall_hook_namesrY  rZ  r[  r_  r`  rf  rg  rl  rq  rs  rx  r{  r   r€  r�  r£  r  ÚInstructionrµ  r·  r¸  r   r   r   r   Ú<module>   sä  
    ü

"

$
 
 
 
    
 
 
 ö!	

	3



		


ö
 P

d
X$$	  
þü  ü
$  ü
		yk