§
    Ë²ÅjÓ  ã                   ó¾  — U d dl Z d dlZd dlZd dl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 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m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# er&d dl$Z$d dl%Z%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a/ee0         e1d<   g d¢Z2de0fd„Z3i Z4ee5e6f         e1d<   	 dOde7deej8        j9                 de5fd„Z:dee5         fd„Z;de5fd„Z<d„ Z=de5fd„Z> ej?        e@¦  «        ZA G d„ de¦  «        ZBdej8        j9        ddfd„ZCdee5df         fd„ZDdej8        j9        deedf         fd„ZEdej8        j9        defd„ZFdej8        j9        dee5df         fd „ZGd!ee5df         dee5df         fd"„ZHd#eeejI        ejJ        e6ejK        eLejM        e0f         df         ded$         fd%„ZNd&eejI        df         d'ed$         deejI        df         fd(„ZOd)edejI        fd*„ZPd+eejI        e6eLe0f         d,d-dejI        fd.„ZQd)ejI        d/eejI        ejJ        e6ejK        eLejM        e0f         deejI        e6eLe0f         fd0„ZRd1d2d3ee5df         d4eejI        df         d5ed$         d6ee5df         d7eejI        df         d8ed$         d9e0d:ed;         d<eeejI        ejJ        e6ejK        eLejM        e0f         df         deeejI        e6eLe0f         df         fd=„ZSd1d2d3ee5df         d4eejI        df         d5ed$         d6ee5df         d7eejI        df         d8ed$         d9e0d:ed;         d<eeejI        ejJ        e6ejK        eLejM        e0f         df         deeejI        e6eLe0f         df         fd>„ZT G d?„ d@¦  «        ZUe jV         G dA„ dB¦  «        ¦   «         ZWee5ee5e
e5ef         f         f         ZXee1dC<   	  e jV        dD¬E¦  «         edF¬G¦  «         G dH„ dI¦  «        ¦   «         ¦   «         ZY edF¬G¦  «         G dJ„ dK¦  «        ¦   «         ZZ edF¬G¦  «        ddLœdej8        j9        dMeeeYe
e5ef         f                  fdN„¦   «         Z[dS )Pé    N)ÚAnyÚCallableÚDictÚFinalÚListÚMappingÚOptionalÚSequenceÚSetÚTupleÚTYPE_CHECKINGÚUnion)Ú	TypeAlias)Ú
FakeTensor)Úcompatibility)ÚFakeTensorProp)ÚOperatorSupport)ÚCALLABLE_NODE_OPS)Ú_pytree©Ú_pybind_stateÚ_SUPPORT_ONNXRT)Úis_onnxrt_backend_supportedÚtorch_compile_backendÚOrtExecutionProviderÚOrtBackendOptionsÚ
OrtBackendÚreturnc                  óú   — t           €n	 t          j        d¦  «         t          j        d¦  «         t          j        d¦  «         ddl} ddl} ddl} ddl} ddlm}m	}m
}m} da n# t          $ r da Y nw xY wt           S )	a!  Returns ``True`` if ONNX Runtime dependencies are installed and usable
    to support TorchDynamo backend integration; ``False`` otherwise.

    Example::

        # xdoctest: +REQUIRES(env:TORCH_DOCTEST_ONNX)
        >>> import torch
        >>> if torch.onnx.is_onnxrt_backend_supported():
        ...     @torch.compile(backend="onnxrt")
        ...     def f(x):
        ...             return x * x
        ...     print(f(torch.randn(10)))
        ... else:
        ...     print("pip install onnx onnxscript onnxruntime")
        ...
    NÚonnxruntimezonnxruntime.capi._pybind_stateÚ
onnxscriptr   )Údecomposition_tableÚfx_onnx_interpreterÚpassesÚ
type_utilsTF)r   Ú	importlibÚimport_moduleÚ
torch.onnxÚtorch.onnx._internalÚ%torch.onnx._internal._exporter_legacyÚ torch.onnx._internal.diagnosticsÚtorch.onnx._internal.fxr"   r#   r$   r%   ÚImportError)Útorchr"   r#   r$   r%   s        úQC:\Projects\Historical\venv\Lib\site-packages\torch/onnx/_internal/onnxruntime.pyr   r   ;   sæ   € õ& Ðð	$ÝÔ# MÑ2Ô2Ð2ÝÔ#Ð$DÑEÔEÐEõ Ô# LÑ1Ô1Ð1àÐÐÐØ'Ð'Ð'Ð'Ø8Ð8Ð8Ð8Ø3Ð3Ð3Ð3ðð ð ð ð ð ð ð ð ð ð ð ð #ˆOˆOøÝð 	$ð 	$ð 	$Ø#ˆOˆOˆOð	$øøøõ Ðs   ‰AA$ Á$A3Á2A3Ú_dumped_onnx_modelÚmodel_stringÚgraph_modulec                 óÚ  — t           j                             dd¦  «        }|sdS t                               |d¦  «        dz   }|› |› d�}t	          |d¦  «        5 }|                     | ¦  «         ddd¦  «         n# 1 swxY w Y   |t          |<   |�X|› |› d�}t	          |d	d
¬¦  «        5 }|                     t          |j        ¦  «        ¦  «         ddd¦  «         n# 1 swxY w Y   |S )a  Stores the onnx model into a file.
    The name is "{ONNXRT_DUMP_PATH}{N}.onnx"
    where *N* is the number of files already stored with
    this prefix.
    If graph_module is not None, the graph is stored as a string with
    the same filename except the extension (.txt).
    ÚONNXRT_DUMP_PATHNÚ éÿÿÿÿé   z.onnxÚwbz.txtÚwzutf-8)Úencoding)ÚosÚenvironÚgetr0   ÚopenÚwriteÚstrÚgraph)r1   r2   ÚprefixÚnÚfilenameÚfÚfilename_txts          r/   Ú_dump_onnx_modelrG   o   su  € õ ŒZ�^Š^Ð.°Ñ5Ô5€FØð ØˆrÝ×Ò˜v rÑ*Ô*¨QÑ.€AØÐ"˜!Ð"Ð"Ð"€HÝ	ˆh˜Ñ	Ô	ð  Ø	�Š�ÑÔÐðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð à!"Õ�vÑØÐØ Ð) !Ð)Ð)Ð)ˆÝ�, ¨gÐ6Ñ6Ô6ð 	-¸!Ø�GŠG•C˜Ô*Ñ+Ô+Ñ,Ô,Ð,ð	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-à€Os$   ÁA<Á<B ÂB Â,(C Ã C$Ã'C$c                  ó   — dgS )NÚCPUExecutionProvider© rJ   ó    r/   Ú_infer_default_epsrL   ˆ   s   € ð #Ð#Ð#rK   Únamec                 óŽ   — t           j                             ¦   «         r&t           j        j                             | ¦  «         dS dS )zŠIf PyTorch is installed with CUDA support, this starts NVTX range.

    Check torch.cuda.nvtx.range_push's document for more details.
    N)r.   ÚcudaÚis_availableÚnvtxÚ
range_push©rM   s    r/   Ú_nvtx_range_pushrT   Ž   sB   € õ
 „z×ÒÑ Ô ð )ÝŒ
Œ×"Ò" 4Ñ(Ô(Ð(Ð(Ð(ð)ð )rK   c                  óŒ   — t           j                             ¦   «         r%t           j        j                             ¦   «          dS dS )z�If PyTorch is installed with CUDA support, this terminates NVTX range.

    Check torch.cuda.nvtx.range_pop's document for more details.
    N)r.   rO   rP   rQ   Ú	range_poprJ   rK   r/   Ú_nvtx_range_poprW   —   s@   € õ
 „z×ÒÑ Ô ð $ÝŒ
Œ×!Ò!Ñ#Ô#Ð#Ð#Ð#ð$ð $rK   Údevice_typec                 óì   — ddl m} | dk    r|j                             ¦   «         S | dk    r|j                             ¦   «         S | dk    r|j                             ¦   «         S t          d| z   ¦  «        ‚)Nr   r   rO   ÚcpuÚmaiazUnsupported device type: )Úonnxruntime.capir   Ú	OrtDevicerO   rZ   ÚnpuÚ
ValueError)rX   ÚORTCs     r/   Ú_get_ort_device_typera       s…   € Ø6Ð6Ð6Ð6Ð6Ð6à�fÒÐØŒ~×"Ò"Ñ$Ô$Ð$Ø�eÒÐØŒ~×!Ò!Ñ#Ô#Ð#à�fÒÐØŒ~×!Ò!Ñ#Ô#Ð#Ý
Ð0°;Ñ>Ñ
?Ô
?Ð?rK   c                   ó˜   ‡ — e Zd ZdZdee         deeef         fˆ fd„Zde	ee
j        j        f         de
j        j        defˆ fd„Zˆ xZS )	ÚOrtOperatorSupporta0  Operator support for ONNXRuntime backend.

    It has two-level of support decision. One is via support_dict and the other one
    is via extra_support_dict. The logic of using support_dict is implemented in
    OrtOperatorSupport and extra_support_dict is used by OperatorSupport.is_node_supported.
    Úsupport_dictÚextra_support_dictc                 óX   •— t          ¦   «                              |¦  «         || _        d S ©N)ÚsuperÚ__init__Ú_onnx_support_dict)Úselfrd   re   Ú	__class__s      €r/   ri   zOrtOperatorSupport.__init__»   s,   ø€ õ
 	‰Œ×ÒÐ+Ñ,Ô,Ð,Ø".ˆÔÐÐrK   Ú
submodulesÚnoder   c                 óØ  •— |j         t          vrdS |j         dk    rC|j        | j        v r5t                               d|j        t          |j        ¦  «        ¦  «         dS t          ¦   «                              ||¦  «        r5t                               d|j        t          |j        ¦  «        ¦  «         dS t           	                    d|j        t          |j        ¦  «        ¦  «         dS )NFÚcall_functionz0support_dict supports node.target: %s (type: %s)Tz6extra_support_dict supports node.target: %s (type: %s)zLsupport_dict and extra_support_dict don't support node.target: %s (type: %s))
Úopr   Útargetrj   ÚloggerÚinfoÚtyperh   Úis_node_supportedÚwarning)rk   rm   rn   rl   s      €r/   rv   z$OrtOperatorSupport.is_node_supportedÃ   sè   ø€ ð Œ7Õ+Ð+Ð+Ø�5àŒ7�oÒ%Ð%¨$¬+¸Ô9PÐ*PÐ*PÝ�KŠKØBØ”Ý�T”[Ñ!Ô!ñô ð ð
 �4õ ‰7Œ7×$Ò$ Z°Ñ6Ô6ð 	Ý�KŠKØHØ”Ý�T”[Ñ!Ô!ñô ð ð
 �4Ý�ŠØZØŒKÝ�”ÑÔñ	
ô 	
ð 	
ð
 ˆurK   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r@   ri   r   r.   ÚnnÚModuleÚfxÚNodeÚboolrv   Ú__classcell__)rl   s   @r/   rc   rc   ³   s©   ø€ € € € € ðð ð/ S¨¤Xð /À4ÈÈSÈÄ>ð /ð /ð /ð /ð /ð /ðØ! # u¤x¤Ð"6Ô7ðØ?D¼x¼}ðà	ðð ð ð ð ð ð ð ð ð rK   rc   c                 óÊ   — | j         }g }d}|j        D ]1}|j        dk    r|                     |¦  «         |€|j        dk    r|}Œ2|€dS |D ]}|                     |¦  «         ŒdS )z«
    In torch.fx.Graph, placeholder is a special assignment node. If it's not
    executed in the beginning, it could overwrite values computed by upstream
    nodes.
    NÚplaceholder)rA   Únodesrq   ÚappendÚprepend)r2   rA   ÚplaceholdersÚfirst_not_placeholderrn   rƒ   s         r/   Ú_move_placeholder_to_frontr‰   å   s�   € ð Ô€EØ€LØ ÐØ”ð )ð )ˆØŒ7�mÒ#Ð#Ø×Ò Ñ%Ô%Ð%Ø Ð(¨T¬W¸Ò-EÐ-EØ$(Ð!øØÐ$ØˆØ#ð 3ð 3ˆØ×%Ò% kÑ2Ô2Ð2Ð2ð3ð 3rK   .c                  óÞ   — g }| D ]Z}t          |d¦  «        rH|j        }|j        dk    r|                     d¦  «         Œ:|j        dk    r|                     d¦  «         Œ[t	          |¦  «        S )zBReturn the first valid device (i.e., GPU or CPU) in argument list.ÚdevicerO   ÚCUDAExecutionProviderrZ   rI   )Úhasattrr‹   ru   r…   Útuple)ÚargsÚepsÚargr‹   s       r/   Ú_infer_ep_from_devicer’   ú   s   € à
€CØð 3ð 3ˆÝ�3˜Ñ!Ô!ð 	3Ø”ZˆFØŒ{˜fÒ$Ð$Ø—
’
Ð2Ñ3Ô3Ð3Ð3Ø” Ò%Ð%Ø—
’
Ð1Ñ2Ô2Ð2øÝ�‰:Œ:ÐrK   c                 ó  — g }| j         j        D ]b}|j        dk    rUt          |d¦  «        r0d|j        v r't          |j        d         t          j        ¦  «        sJ ‚|                     |¦  «         Œct          |¦  «        S )Nrƒ   ÚmetaÚval)
rA   r„   rq   r�   r”   Ú
isinstancer.   ÚTensorr…   rŽ   )r2   r‡   rn   s      r/   Ú_extract_graph_module_inputsr˜     sŠ   € Ø€LØÔ"Ô(ð &ð &ˆØŒ7�mÒ#Ð#Ý�t˜VÑ$Ô$ð B¨°$´)Ð);Ð);Ý! $¤)¨EÔ"2µE´LÑAÔAÐAÐAÐAØ×Ò Ñ%Ô%Ð%øÝ�ÑÔÐrK   c                 ór   — | j         j        D ]}|j        dk    r|j        d         c S Œt	          d¦  «        ‚)zHCollect "val" fields from outputs metadata in this torch.fx.GraphModule.Úoutputr   z2No output node found in this torch.fx.GraphModule.)rA   r„   rq   r�   r_   )r2   rn   s     r/   Ú_extract_graph_module_outputsr›     sN   € àÔ"Ô(ð  ð  ˆØŒ7�hÒÐð ”9˜Q”<ÐÐÐð õ ÐIÑ
JÔ
JÐJrK   c                 ót   — t          j        t          | ¦  «        ¦  «        \  }}d„ |D ¦   «         }t          |Ž S )z[Return the all valid devices (i.e., GPU or CPU) among outputs of this torch.fx.GraphModule.c                 óZ   — g | ](}t          |d ¦  «        rd|j        v ¯|j        d         ‘Œ)S )r”   r•   ©r�   r”   )Ú.0Ú
output_args     r/   ú
<listcomp>z/_infer_ep_from_graph_module.<locals>.<listcomp>!  sO   € ð ð ð àõ �J Ñ'Ô'ðð
 -2°Z´_Ð,DÐ,Dð	 	Œ˜Ôð -EÐ,DÐ,DrK   )r   Útree_flattenr›   r’   )r2   Úflattened_output_argsÚ_Úselected_output_argss       r/   Ú_infer_ep_from_graph_moduler¦     sR   € å&Ô3Ý% lÑ3Ô3ñ ô  ÑÐ˜1ðð à/ðñ ô Ðõ !Ð"6Ð7Ð7rK   r�   c                 ó‚   — dt           dt          fd„}t          | ¦  «        }t          t	          ||d¬¦  «        ¦  «        S )z:Sort execution providers in eps based on pre-set priority.Úepr   c                 ó&   — | dk    rdS | dk    rdS dS )NrI   é   rŒ   r7   r   rJ   )r¨   s    r/   Úget_execution_provider_priorityz2_sort_eps.<locals>.get_execution_provider_priority.  s+   € ØÐ'Ò'Ð'à�1ØÐ(Ò(Ð(ð �1àˆqrK   T)ÚkeyÚreverse)r@   ÚintÚsetrŽ   Úsorted)r�   r«   Ú
unique_epss      r/   Ú	_sort_epsr²   +  sP   € ð	­Cð 	µCð 	ð 	ð 	ð 	õ �S‘”€JÝ•˜
Ð(GÐQUÐVÑVÔVÑWÔWÐWrK   Úvalues©zORTC.OrtDevice.c           	      ób  ‡‡‡— ddl mŠ dt          dt          fd„Šdt          t          j        t          j        t          t          j        t          t          j	        t          f         dt          fˆˆfd„Št          | ¦  «        dk    rt          ˆfd„| D ¦   «         ¦  «        }|S  ‰d	¦  «        fS )
Nr   r   Ú	device_idr   c                 ó
   — | pdS )Nr   rJ   )r¶   s    r/   Ú_device_id_or_zeroz-_get_onnx_devices.<locals>._device_id_or_zeroG  s   € Øˆ~˜AÐrK   Úvaluec           	      ó(  •— t          | t          j        ¦  «        rS ‰j        t	          | j        j        ¦  «        ‰j                             ¦   «          ‰| j        j        ¦  «        ¦  «        S t          | t          j	        t          t          j        t          t          j        t          f¦  «        r6 ‰j        t	          d¦  «        ‰j                             ¦   «         d¦  «        S t          dt!          t          | ¦  «        ¦  «        z   ¦  «        ‚)NrZ   r   zUnsupported value type: )r–   r.   r—   r]   ra   r‹   ru   Údefault_memoryÚindexÚSymIntr®   ÚSymFloatÚfloatÚSymBoolr€   r_   r@   )r¹   r`   r¸   s    €€r/   Ú_map_tensor_or_sym_to_devicez7_get_onnx_devices.<locals>._map_tensor_or_sym_to_deviceJ  sê   ø€ õ
 �e�Uœ\Ñ*Ô*ð 	LØ!�4”>Ý$ U¤\Ô%6Ñ7Ô7Ø”×-Ò-Ñ/Ô/Ø"Ð" 5¤<Ô#5Ñ6Ô6ñô ð õ
 Ø•E”L¥#¥u¤~µu½e¼mÍTÐRñ
ô 
ð 	Lð "�4”>Ý$ UÑ+Ô+¨T¬^×-JÒ-JÑ-LÔ-LÈañô ð õ Ð7½#½dÀ5¹k¼kÑ:JÔ:JÑJÑKÔKÐKrK   c              3   ó.   •K  — | ]} ‰|¦  «        V — Œd S rg   rJ   )rŸ   r¹   rÁ   s     €r/   ú	<genexpr>z$_get_onnx_devices.<locals>.<genexpr>_  s/   øè è € ÐTÐTÀEÐ8Ð8¸Ñ?Ô?ÐTÐTÐTÐTÐTÐTrK   r7   )r\   r   r®   r   r.   r—   r½   r¾   r¿   rÀ   r€   ÚlenrŽ   )r³   Úort_devicesr`   r¸   rÁ   s     @@@r/   Ú_get_onnx_devicesrÆ   =  sæ   øøø€ ð 7Ð6Ð6Ð6Ð6Ð6ð¥cð ­cð ð ð ð ðLÝÝŒL�%œ,­­U¬^½UÅEÄMÕSWÐWô
ðLõ 
ð	Lð Lð Lð Lð Lð Lð Lõ( ˆ6�{„{�Q‚€ÝÐTÐTÐTÐTÈVÐTÑTÔTÑTÔTˆØÐà,Ð,¨QÑ/Ô/Ð1Ð1rK   ÚtensorsÚdevicesc                 ó¤  — ddl m} ddlm}  |j        ¦   «         }|                     t          | ¦  «        ¦  «         g }g }g }| D ]p}|                     ||j                 ¦  «         |                     | 	                    ¦   «         ¦  «         |                     | 
                    ¦   «         ¦  «         Œq|                     | ||||¦  «         |S )Nr   r   )Ú_TORCH_DTYPE_TO_NUMPY_DTYPE)r\   r   Ú"torch.onnx._internal.fx.type_utilsrÊ   ÚOrtValueVectorÚreserverÄ   r…   ÚdtypeÚsizeÚdata_ptrÚpush_back_batch)	rÇ   rÈ   r`   rÊ   Ú	ortvaluesÚdtypesÚshapesÚ	data_ptrsÚtensors	            r/   Ú!_get_ortvalues_from_torch_tensorsr×   e  sç   € ð 7Ð6Ð6Ð6Ð6Ð6àNÐNÐNÐNÐNÐNà#�Ô#Ñ%Ô%€IØ×Ò•c˜'‘l”lÑ#Ô#Ð#Ø€FØ€FØ€Iàð ,ð ,ˆØ�ŠÐ1°&´,Ô?Ñ@Ô@Ð@Ø�Š�f—k’k‘m”mÑ$Ô$Ð$Ø×Ò˜ŸšÑ*Ô*Ñ+Ô+Ð+Ð+Ø×Ò˜g y°&¸&À'ÑJÔJÐJØÐrK   rÖ   c                 ó˜   — | j         rt          d¦  «        ‚t          j        |                      ¦   «         | j        | j        ¬¦  «        }|S )Nz#sparse tensor is not yet supported.)rÎ   r‹   )Ú	is_sparser_   r.   ÚemptyrÏ   rÎ   r‹   )rÖ   Úouts     r/   Ú_to_real_tensorrÜ   z  sD   € ØÔð @ÝÐ>Ñ?Ô?Ð?Ý
Œ+�f—k’k‘m”m¨6¬<ÀÄÐ
NÑ
NÔ
N€CØ€JrK   Údynamo_valueÚ
value_infoúonnx.ValueInfoProtoc                 ó`  — t          | t          j        ¦  «        rFt          |j        j        j        j        ¦  «        dk    r| j        dk    rt          j        | ¦  «        S t          | t          ¦  «        r t          j
        | t          j        ¬¦  «        S t          | t          ¦  «        r t          j
        | t          j        ¬¦  «        S t          | t          ¦  «        r t          j
        | t          j        ¬¦  «        S t          | t          j        ¦  «        sJ ‚|                      ¦   «         S )z9Helper function to wrap PyTorch variables as torch.Tensorr   )r7   )rÎ   )r–   r.   r—   rÄ   ru   Útensor_typeÚshapeÚdimÚsqueezer®   rÖ   Úint64r¿   Úfloat32r€   Ú
contiguous)rÝ   rÞ   s     r/   Ú_adjust_scalar_from_fx_to_onnxrè   �  sû   € õ 	�<¥¤Ñ.Ô.ð)å�
”Ô+Ô1Ô5Ñ6Ô6¸!Ò;Ð;ØÔ $Ò&Ð&õ Œ}˜\Ñ*Ô*Ð*Ý	�L¥#Ñ	&Ô	&ð )ÝŒ|˜Lµ´Ð<Ñ<Ô<Ð<Ý	�L¥%Ñ	(Ô	(ð )ÝŒ|˜Lµ´Ð>Ñ>Ô>Ð>Ý	�L¥$Ñ	'Ô	'ð )ÝŒ|˜Lµ´
Ð;Ñ;Ô;Ð;å˜,­¬Ñ5Ô5Ð5Ð5Ð5Ø×&Ò&Ñ(Ô(Ð(rK   Ú
prim_valuec           	      óü   — t          | t          j        ¦  «        s
J d¦   «         ‚t          |t          j        t          t          j        t          t          j        t          f¦  «        r|  	                    ¦   «         S | S )zFHelper function to wrap ORT-produced torch.Tensor as PyTorch variableszORT's output must be tensor.)
r–   r.   r—   r½   r®   r¾   r¿   rÀ   r€   Úitem)rÖ   ré   s     r/   Ú_adjust_scalar_from_onnx_to_fxrì   ¡  se   € õ$ �f�eœlÑ+Ô+ÐKÐKÐ-KÑKÔKÐ+ÝØÝ	Œ•s�EœN­Eµ5´=Å$ÐGñô ð ð
 �{Š{‰}Œ}ÐØ€MrK   Úsessúonnxruntime.InferenceSessionÚinput_namesÚinputsÚinput_devicesÚoutput_namesÚoutputsÚoutput_devicesÚpreallocate_outputÚinput_value_infos©rß   .Únormalized_prim_outputsc
                 óŠ  — dd l }
ddlm} t          d¦  «         t	          d„ t          ||¦  «        D ¦   «         ¦  «        }t          ¦   «          t          d¦  «         t          ||¦  «        }|r*t	          d„ |D ¦   «         ¦  «        }t          ||¦  «        }n |j        ¦   «         }t          ¦   «          t          d¦  «          |
j	        ¦   «         }| 
                    dd	¦  «         |                      ||||||¦  «         t          ¦   «          |rFt          d
¦  «         t	          d„ t          ||	¦  «        D ¦   «         ¦  «        }t          ¦   «          |S t          d
¦  «         |
j        j        j                             |¦  «        }t	          d„ t          ||	¦  «        D ¦   «         ¦  «        }t          ¦   «          |S )Nr   r   rç   c              3   ó<   K  — | ]\  }}t          ||¦  «        V — Œd S rg   ©rè   ©rŸ   r‘   rÞ   s      r/   rÃ   z8_run_onnx_session_with_ortvaluevector.<locals>.<genexpr>Ò  óD   è è € ð ð áˆC�õ 	' s¨JÑ7Ô7ðð ð ð ð ð rK   rÑ   c              3   ób   K  — | ]*}t          |t          ¦  «        rt          |¦  «        n|V — Œ+d S rg   )r–   r   rÜ   )rŸ   Úts     r/   rÃ   z8_run_onnx_session_with_ortvaluevector.<locals>.<genexpr>ß  sO   è è € ð 
ð 
ØGH¥*¨Qµ
Ñ";Ô";ÐB�O˜AÑÔÐÀð
ð 
ð 
ð 
ð 
ð 
rK   Úrun_with_ortvaluevectorÚ'disable_synchronize_execution_providersÚ1zafter run_with_ortvaluevectorc              3   ó<   K  — | ]\  }}t          ||¦  «        V — Œd S rg   ©rì   ©rŸ   Úonnx_outputÚprim_outputs      r/   rÃ   z8_run_onnx_session_with_ortvaluevector.<locals>.<genexpr>ø  óD   è è € ð 
ð 
á(�˜[õ +¨;¸ÑDÔDð
ð 
ð 
ð 
ð 
ð 
rK   c              3   ó<   K  — | ]\  }}t          ||¦  «        V — Œd S rg   r  r  s      r/   rÃ   z8_run_onnx_session_with_ortvaluevector.<locals>.<genexpr>  r  rK   )r    r\   r   rT   rŽ   ÚziprW   r×   rÌ   Ú
RunOptionsÚadd_run_config_entryr   ÚtrainingÚ	ortmoduleÚ_utilsÚ_ortvalues_to_torch_tensor)rí   rï   rð   rñ   rò   ró   rô   rõ   rö   rø   r    r`   Ú
ort_inputsÚpth_outputsÚort_outputsÚrun_optionss                   r/   Ú%_run_onnx_session_with_ortvaluevectorr  ½  sC  € ð" ÐÐÐØ6Ð6Ð6Ð6Ð6Ð6å�\Ñ"Ô"Ð"Ýð ð å" 6Ð+<Ñ=Ô=ðñ ô ñ ô €Fõ ÑÔÐåÐ&Ñ'Ô'Ð'Ý2°6¸=ÑIÔI€Jð
 ð ,Ýð 
ð 
ØLSð
ñ 
ô 
ñ 
ô 
ˆõ 8¸À^ÑTÔTˆˆà)�dÔ)Ñ+Ô+ˆÝÑÔÐåÐ.Ñ/Ô/Ð/Ø(�+Ô(Ñ*Ô*€KØ×$Ò$Ð%NÐPSÑTÔTÐTØ× Ò Ø�[ *¨l¸KÈñô ð õ ÑÔÐð ð åÐ8Ñ9Ô9Ð9õ ð 
ð 
å,/°Ð=TÑ,UÔ,Uð
ñ 
ô 
ñ 
ô 
ˆõ 	ÑÔÐØÐõ 	Ð8Ñ9Ô9Ð9à!Ô*Ô4Ô;×VÒVØñ
ô 
ˆõ ð 
ð 
å,/°Ð=TÑ,UÔ,Uð
ñ 
ô 
ñ 
ô 
ˆõ 	ÑÔÐØÐrK   c
                 ó  ‡— dd l Št          d„ t          ||¦  «        D ¦   «         ¦  «        }ˆfd„t          ||¦  «        D ¦   «         }
|                      ||
¦  «        }t          d„ t          ||	¦  «        D ¦   «         ¦  «        }|S )Nr   c              3   ó<   K  — | ]\  }}t          ||¦  «        V — Œd S rg   rû   rü   s      r/   rÃ   z/_run_onnx_session_with_fetch.<locals>.<genexpr>!  rý   rK   c                 ó”   •— i | ]D\  }}|‰j                              |                     ¦   «                              ¦   «         ¦  «        “ŒES rJ   )ÚOrtValueÚortvalue_from_numpyrZ   Únumpy)rŸ   rM   rÖ   r    s      €r/   ú
<dictcomp>z0_run_onnx_session_with_fetch.<locals>.<dictcomp>%  sT   ø€ ð ð ð áˆD�&ð 	ˆkÔ"×6Ò6°v·z²z±|´|×7IÒ7IÑ7KÔ7KÑLÔLðð ð rK   c              3   ó`   K  — | ])\  }}t          t          j        |¦  «        |¦  «        V — Œ*d S rg   )rì   r.   Ú
from_numpy)rŸ   r¹   r  s      r/   rÃ   z/_run_onnx_session_with_fetch.<locals>.<genexpr>*  sW   è è € ð ð ñ
 ˆE�;õ	 	'ÝÔ˜UÑ#Ô#Øñ	
ô 	
ðð ð ð ð ð rK   )r    rŽ   r
  Úrun)rí   rï   rð   rñ   rò   ró   rô   rõ   rö   rø   Úfeedr  r  r    s                @r/   Ú_run_onnx_session_with_fetchr!    sÎ   ø€ ð" ÐÐÐåð ð å" 6Ð+<Ñ=Ô=ðñ ô ñ ô €Fðð ð ð å ¨VÑ4Ô4ðñ ô €Dð —(’(˜<¨Ñ.Ô.€KÝð ð õ
 #& kÐ3JÑ"KÔ"Kðñ ô ñ ô €Kð ÐrK   c                   óÄ   — e Zd ZdZdddeedf         ded         deedf         d	ed         d
ed         ded         deeej        df         ej        f         fd„Z	d„ Z
dS )ÚOrtExecutionInfoPerSessionzWInformation required to execute torch.fx.GraphModule using onnxruntime.InferenceSessionÚsessionrî   rï   .rö   r÷   rò   Úoutput_value_infosrñ   r´   rô   Úexample_outputsc	                 óv   — || _         || _        || _        || _        || _        || _        || _        || _        d S rg   ©r$  rï   rö   rò   r%  rñ   rô   r&  )	rk   r$  rï   rö   rò   r%  rñ   rô   r&  s	            r/   ri   z#OrtExecutionInfoPerSession.__init__7  sS   € ð 6=ˆŒð -8ˆÔàBSˆÔà-9ˆÔàCUˆÔð :GˆÔà:HˆÔð ð 	ÔÐÐrK   c                 ó.  — ddl m}m} t          |¦  «        t          | j        ¦  «        k    rdS t          || j        ¦  «        D �]N\  }}t          |t          j        t          t          f¦  «        s dS t          |t          t          t          f¦  «        r[ |t          |¦  «        ¦  «        }||j        j        j        k    r dS t          |j        j        j        j        ¦  «        dk    r dS Œ­||j                 }||j        j        j        k    r dS t          |j        |j        j        j        j        ¦  «        D ]R\  }}t          |t          ¦  «        r|j        |k    s|j        rŒ-t          |t          j        ¦  «        r|j        rŒO  dS �ŒPdS )Nr   )Ú(_TORCH_DTYPE_TO_ONNX_TENSOR_ELEMENT_TYPEÚ,from_python_type_to_onnx_tensor_element_typeFT)rË   r*  r+  rÄ   rö   r
  r–   r.   r—   r¿   r®   r€   ru   rá   Ú	elem_typerâ   rã   rÎ   Ú	dim_valueÚ	dim_paramr½   )	rk   r�   r*  r+  r‘   rÞ   Ú
onnx_dtyperã   Úonnx_dims	            r/   Úis_supportedz'OrtExecutionInfoPerSession.is_supportedX  s¶  € ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
õ ˆt‰9Œ9�˜DÔ2Ñ3Ô3Ò3Ð3Ø�5Ý" 4¨Ô)?Ñ@Ô@ð 	!ñ 	!‰OˆC�Ý˜c¥E¤Lµ%½Ð#=Ñ>Ô>ð Ø�u�uõ ˜#¥¥U­DÐ1Ñ2Ô2ð àIÐIÍ$ÈsÉ)Ì)ÑTÔT�
Ø ¤Ô!<Ô!FÒFÐFØ ˜5˜5Ý�z”Ô2Ô8Ô<Ñ=Ô=ÀÒBÐBØ ˜5˜5Øð BÀ#Ä)ÔLˆJØ˜Zœ_Ô8ÔBÒBÐBØ�u�uÝ!$ S¤Y°
´Ô0KÔ0QÔ0UÑ!VÔ!Vð !ð !‘��XÝ˜c¥3Ñ'Ô'ð !ØÔ&¨#Ò-Ð-°Ô1CÐ-àÝ ¥U¤\Ñ2Ô2ð !°xÔ7Ið !Øà ˜5˜5˜5ñ!ð ˆtrK   N)rx   ry   rz   r{   r   r@   r   r.   r—   ri   r1  rJ   rK   r/   r#  r#  4  sÌ   € € € € € ØaÐað
à/ð
ð ˜3 ˜8”_ð
ð !Ð!;Ô<ð	
ð
 ˜C ˜H”oð
ð "Ð"<Ô=ð
ð Ð2Ô3ð
ð Ð3Ô4ð
ð ˜u U¤\°3Ð%6Ô7¸¼ÐEÔFð
ð 
ð 
ð 
ðB%ð %ð %ð %ð %rK   r#  c                   óZ   — e Zd Zdd„Zdej        j        fd„Zdej        j        defd„Z	dS )	Ú"OrtExecutionInfoForAllGraphModulesr   Nc                 ó   — i | _         d S rg   )Úexecution_info_per_graph_module)rk   s    r/   ri   z+OrtExecutionInfoForAllGraphModules.__init__‚  s   € ð
 ð 	Ô,Ð,Ð,rK   r2   c                 ó\   — || j         vrd S | j         |         }|D ]} |j        |Ž r|c S Œd S rg   )r5  r1  )rk   r2   r�   Ú
candidatesÚ	candidates        r/   Ú&search_reusable_session_execution_infozIOrtExecutionInfoForAllGraphModules.search_reusable_session_execution_info‰  s_   € ð ˜tÔCÐCÐCØ�4ð Ô9¸,ÔGˆ
à#ð 	!ð 	!ˆIØ%ˆyÔ% tÐ,ð !à Ð Ð Ð ð!ð ˆtrK   rt   c                 ór   — || j         vr|g| j         |<   d S | j         |                              |¦  «         d S rg   )r5  r…   )rk   r2   rt   s      r/   Úcache_session_execution_infoz?OrtExecutionInfoForAllGraphModules.cache_session_execution_info™  sI   € ð ˜tÔCÐCÐCØBFÀˆDÔ0°Ñ>Ð>Ð>àÔ0°Ô>×EÒEÀdÑKÔKÐKÐKÐKrK   )r   N)
rx   ry   rz   ri   r.   r~   ÚGraphModuler9  r#  r;  rJ   rK   r/   r3  r3  €  sz   € € € € € ðð ð ð ðØ!œHÔ0ðð ð ð ð LØ!œHÔ0ðLØ8RðLð Lð Lð Lð Lð LrK   r3  r   T)ÚfrozenF)Úis_backward_compatiblec                   ó  — e Zd ZU dZdZeee                  ed<   	 dZ	e
ed<   	 dZeee                  ed<   	 dZe
ed<   	 dZe
ed	<   	 dZed
         ed<   	 dZed         ed<   	 dZeeedgdf                           ed<   dS )r   aJ  Options for constructing an ``OrtBackend``, the ONNX Runtime
    backend (``"onnxrt"``) for ``torch.compile``.

    Example::

        >>> @torch.compile(
        ...     backend="onnxrt",
        ...     options=torch.onnx._OrtBackendOptions(...),
        ... )
        ... def ort_function(x):
        ...     return x ** x
    NÚpreferred_execution_providersTÚinfer_execution_providersÚdefault_execution_providersFrõ   Úuse_aot_autogradztorch.onnx.ExportOptionsÚexport_optionszonnxruntime.SessionOptionsÚort_session_optionszonnx.ModelProtoÚpre_ort_model_transforms)rx   ry   rz   r{   r@  r	   r
   r   Ú__annotations__rA  r€   rB  rõ   rC  rD  rE  rF  r   rJ   rK   r/   r   r   ¯  s  € € € € € € ðð ð OSÐ! 8¨HÐ5IÔ,JÔ#KÐRÐRÑRðð '+Ð˜tÐ*Ð*Ñ*ØmàLPÐ ¨(Ð3GÔ*HÔ!IÐPÐPÑPðð  %Ð˜Ð$Ð$Ñ$ØVà!Ð�dÐ!Ð!Ñ!ðð <@€N�HÐ7Ô8Ð?Ð?Ñ?ØUàBFÐ˜Ð">Ô?ÐFÐFÑFØVð 	ð ˜hØ�Ð,Ð-¨tÐ3Ô4Ô5ôð ð ñ ð1ð 1rK   r   c            	       ó¾  — e Zd ZU dZddee         fd„Zdej        j	        de
eeeeef         f                  fd„Zdej        j	        fd„Zdej        j	        dej        j	        fd	„Zdej        j	        dej        j	        fd
„ZdZeed<   g Zeed                   ed<   e	 ddeeeeeef         f                  dd fd„¦   «         Zed„ ¦   «         Zed„ ¦   «         ZdS )r   a	  A backend compiles (sub-)graphs in torch.fx.GraphModule to onnxruntime.InferenceSession calls.

    The compiler entry point is OrtBackend.compile, which
        1. partitions the original graph into supported sub-graphs (type: torch.fx.GraphModule) and unsupported
           sub-graphs.
        2. For each supported sub-graph, it replaces its _wrapped_call function with _ort_accelerated_call.
        3. Inside _ort_accelerated_call, it creates onnxruntime.InferenceSession and calls it to execute the sub-graph.
    NÚoptionsc                 óH  — ddl m} dd l}dd l}dd l}|€t          ¦   «         n|| _        |j        j        j	         
                    | j        j        €|j                             ¦   «         n| j        j        ¦  «        | _        |j        j        j        j                             | j        j        ¦  «        }d d d d d dœ}t%          ||¦  «        | _        i | _        t+          ¦   «         | _        d| _        d| _        t3          |j        d¦  «        rt6          nt8          | _        d S )Nr   r   )Úgetattrz_operator.getitemz_operator.mulz_operator.addz_operator.subFrÑ   )r\   r   r(   r*   Ú+torch.onnx._internal.fx.decomposition_tabler   Ú_optionsÚonnxÚ	_internalÚ_exporter_legacyÚResolvedExportOptionsrD  ÚExportOptionsÚ_resolved_onnx_exporter_optionsr~   r"   Ú'_create_onnx_supports_op_overload_tableÚonnx_registryrc   Ú_supported_opsÚ_partitioner_cacher3  Ú_all_ort_execution_infoÚ_assert_allclose_to_baselineÚexecution_countr�   rÌ   r  r!  r  )rk   rI  r`   r.   rd   re   s         r/   ri   zOrtBackend.__init__û  sX  € Ø:Ð:Ð:Ð:Ð:Ð:àÐÐÐØ4Ð4Ð4Ð4Ø:Ð:Ð:Ð:à6=°oÕ0Ñ2Ô2Ð2È7ˆŒð  ŒJÔ Ô1×GÒGà”=Ô/Ð7ð ”
×(Ò(Ñ*Ô*Ð*à”]Ô1ñô ð 	Ô,ð& ”zÔ+Ô.ÔB×jÒjØÔ0Ô>ñ
ô 
ˆð
 ð "&ð "Ø!Ø!ð
.
ð 
.
Ðõ 1°Ð?QÑRÔRˆÔð UWˆÔõ (JÑ'KÔ'KˆÔ$à,1ˆÔ)à ˆÔõ
 �tÔ*Ð,=Ñ>Ô>ð.Õ1Ð1å-ð 	ŒˆˆrK   r2   r   c                 óš  — d}| j         j        r!t          |Ž x}r|}nt          |¦  «        x}r|}g }g | j         j        pg ¢t          |¦  «        ¢| j         j        pt          ¦   «         ¢R D ]^}t          |t          ¦  «        r|i f}n't          |t          ¦  «        r|d         €
|d         i f}|�||vr|                     |¦  «         Œ_|S )NrJ   r7   r   )rM  rA  r’   r¦   r@  r²   rB  rL   r–   r@   rŽ   r…   )rk   r2   r�   Úinferred_epsÚeps_from_argsÚeps_from_graph_moduleÚselected_epsr¨   s           r/   Ú_select_epszOrtBackend._select_epsS  s  € ð )+ˆØŒ=Ô2ð 	5Ý 5°tÐ <Ð<ˆ}ð 
5ð
  -��Ý*EÀlÑ*SÔ*SÐSÐ&ð 5ð  5�àˆð
ØŒmÔ9Ð?¸Rð
å�|Ñ$Ô$ð
ð ŒmÔ7ÐOÕ;MÑ;OÔ;Oð
ð 
ð 
	(ð 
	(ˆBõ
 ˜"�cÑ"Ô"ð !Ø˜"�X��Ý˜B¥Ñ&Ô&ð !¨2¨a¬5¨=Ø˜”e˜R�[�Øˆ~ "¨LÐ"8Ð"8Ø×#Ò# BÑ'Ô'Ð'øàÐrK   c                 óz	  — ddl }ddlm}m}  | j        j        |g|¢R Ž }|r:|j        }|j        }	|j        }
|j	        }|j
        }|j        }|j        }|j        }�nJ|                     | j        j        |¦  «                             ¦   «         }| j        j        r/d| _        t)          |¦  «        }d„ }t+          j        ||¦  «        }nM	  t/          |¦  «        j        |i |¤Ž}n1# t2          $ r$ t4                               d|¦  «         d| _        ‚ w xY w|                     | j        j        ¬¦  «        }|                     | j        j        |¦  «                             ¦   «         }|                     || j        j        ¬¦  «        }|                     | j        j         j!        ¬	¦  «        }	 dd
l"m#} ddl$m } | %                    |¦  «        }| &                    |¦  «        }n*# tN          $ r t4                               d¦  «         Y nw xY w| j(        j)        r| j(        j)        D ]} ||¦  «         Œ| *                    ¦   «         }tV          j,         -                    dd¦  «        rt]          ||¬¦  «          |j/        || j(        j0         | j1        |g|¢R Ž ¬¦  «        }te          d„ |j3        j4        D ¦   «         ¦  «        }	te          d„ |j3        j5        D ¦   «         ¦  «        }
tm          |¦  «        }to          |td          ¦  «        rtm          |¦  «        }ntm          |f¦  «        }te          d„ |j3        j4        D ¦   «         ¦  «        }te          d„ |j3        j5        D ¦   «         ¦  «        }tq          ||	||
||||¬¦  «        }| j         9                    ||¦  «         | xj:        dz  c_:        to          |tv          j<        ¦  «        }|r|fn|}to          |td          ¦  «        sJ ‚t{          d„ |D ¦   «         ¦  «        sJ ‚t}          d¦  «         |                      ||	|||
||| j(        j        ||¦
  «
        }t          ¦   «          | j@        r\tw          jA        jB        jC        |g|¢R ddiŽ}|r|fn|}t‰          ||¦  «        D ]%\  }} tv          jE         F                    || ¦  «         Œ&|r|d         n|S )a  This function replaces GraphModule._wrapped_call in compiled model.

        The _wrapped_call is the underlying implementation of forward method. Replacing
        it means we delegate the computation to _ort_acclerated_call and therefore
        onnxruntime.InferenceSession.
        r   N)r#   r$   Fc                 óR   — t          | d¦  «        rd| j        v r| j        d         S | S )Nr”   r•   rž   )r¹   s    r/   Úmaybe_map_to_meta_valz>OrtBackend._ort_acclerated_call.<locals>.maybe_map_to_meta_val   s4   € Ý˜u fÑ-Ô-ð %°%¸5¼:Ð2EÐ2Eð  %œz¨%Ô0Ð0à$˜rK   zFakeTensorProb failed for %s)Údiagnostic_context)Úfx_graph_moduleÚonnxfunction_dispatcher)Úopset_version)Ú	optimizer)r    z„ONNXScript optimizer is not available. Skipping optimization. Please `pip install onnxscript -U` to enable post-export optimization.r4   )r2   )Úpath_or_bytesÚsess_optionsÚ	providersc              3   ó$   K  — | ]}|j         V — Œd S rg   rS   ©rŸ   Úinputs     r/   rÃ   z2OrtBackend._ort_acclerated_call.<locals>.<genexpr>  s$   è è € ÐOÐO¨u ¤
ÐOÐOÐOÐOÐOÐOrK   c              3   ó$   K  — | ]}|j         V — Œd S rg   rS   ©rŸ   rš   s     r/   rÃ   z2OrtBackend._ort_acclerated_call.<locals>.<genexpr>  s$   è è € Ð SÐ S° ¤Ð SÐ SÐ SÐ SÐ SÐ SrK   c              3   ó   K  — | ]}|V — Œd S rg   rJ   rm  s     r/   rÃ   z2OrtBackend._ort_acclerated_call.<locals>.<genexpr>  s"   è è € Ð%PÐ%P° eÐ%PÐ%PÐ%PÐ%PÐ%PÐ%PrK   c              3   ó   K  — | ]}|V — Œd S rg   rJ   rp  s     r/   rÃ   z2OrtBackend._ort_acclerated_call.<locals>.<genexpr>  s"   è è € Ð&TÐ&T°& vÐ&TÐ&TÐ&TÐ&TÐ&TÐ&TrK   r(  r7   c              3   ón   K  — | ]0}t          |t          j        t          j        t          f¦  «        V — Œ1d S rg   )r–   r.   r—   r½   r®   )rŸ   Úelems     r/   rÃ   z2OrtBackend._ort_acclerated_call.<locals>.<genexpr>(  sK   è è € ð 
ð 
àõ �t�eœl­E¬L½#Ð>Ñ?Ô?ð
ð 
ð 
ð 
ð 
ð 
rK   Ú$run_onnx_session_with_ortvaluevectorÚexecutorÚaten)Gr    r,   r#   r$   rX  r9  r$  rï   rò   rö   r%  rñ   rô   r&  ÚMovePlaceholderToFrontrS  rd  r  Údynamic_shapesrõ   r›   r   Útree_mapr   Ú	propagateÚ	Exceptionrs   rw   ÚFxOnnxInterpreterÚInsertTypePromotionrf  Úto_model_protorU  rg  r!   rh  Úonnxscript.rewriterÚoptimizeÚrewriter-   rM  rF  ÚSerializeToStringr;   r<   r=   rG   ÚInferenceSessionrE  r`  rŽ   rA   rn  rš   rÆ   r–   r#  r;  rZ  r.   r—   ÚallrT   rW   rY  Ú_primsrv  Úexecuter
  ÚtestingÚassert_close)!rk   r2   r�   Úkwargsr    r#   r$   Ú!cached_execution_info_per_sessionÚonnx_sessionrï   rò   rö   r%  rñ   rô   Úprim_outputsÚextracted_outputsrc  Úfx_interpreterÚexportedÚ
onnx_modelrh  Úort_rewriterÚ	transformÚonnx_model_bytesÚexecution_info_per_sessionÚis_single_tensor_outputrø   Úonnx_outputsÚbaseline_outputsÚnormalized_baseline_ouptutsr  Úbaseline_outputs!                                    r/   Ú_ort_acclerated_callzOrtBackend._ort_acclerated_callt  s@  € ð 	ÐÐÐàGÐGÐGÐGÐGÐGÐGÐGð PˆDÔ(ÔOØðØ#ðð ð ð 	*ð
 -ð X	Ø<ÔDˆLØ;ÔGˆKØ<ÔIˆLØ AÔ SÐØ!BÔ!UÐØ=ÔKˆMØ>ÔMˆNØ<ÔLˆL‰Lð
 "×8Ò8ØÔ4ÔGØñô ÷ Šc‰eŒeð ð Ô3ÔBð à*/�Ô'Ý$AÀ,Ñ$OÔ$OÐ!ð%ð %ð %õ  'Ô/Ø)Ð+<ñ ô  ��ðØ#I¥>°,Ñ#?Ô#?Ô#IØð$Ø!'ð$ð $�L�Løõ !ð ð ð Ý—N’NÐ#AÀ<ÑPÔPÐPð /4�DÔ+ð ðøøøð 1×BÒBØ#'Ô#GÔ#Zð Cñ ô ˆNð "×5Ò5ØÔ4ÔGÈñô çŠc‰eŒeð ð
 &×)Ò)Ø ,Ø(,Ô(LÔ(dð *ñ ô ˆHð
 "×0Ò0Ø"ÔBÔPÔ^ð 1ñ ô ˆJðØ0Ð0Ð0Ð0Ð0Ð0ðð ð ð ð ð ð '×/Ò/°
Ñ;Ô;�
Ø)×1Ò1°*Ñ=Ô=�
�
øÝð ð ð Ý—’ð]ñô ð ð ð ðøøøð Œ}Ô5ð *Ø!%¤Ô!Gð *ð *�IØ�I˜jÑ)Ô)Ð)Ð)à)×;Ò;Ñ=Ô=ÐÝŒz�~Š~Ð0°$Ñ7Ô7ð 	Nõ !Ð!1ÀÐMÑMÔMÐMð 8˜;Ô7Ø.Ø!œ]Ô>Ø*˜$Ô*¨<Ð?¸$Ð?Ð?Ð?ðñ ô ˆLõ  ÐOÐO¸
Ô8HÔ8NÐOÑOÔOÑOÔOˆKÝ Ð SÐ S¸:Ô;KÔ;RÐ SÑ SÔ SÑSÔSˆLÝ-¨dÑ3Ô3ˆMõ ˜,­Ñ.Ô.ð DÝ!2°<Ñ!@Ô!@��å!2°L°?Ñ!CÔ!C�å %Ð%PÐ%P¸Ô9IÔ9OÐ%PÑ%PÔ%PÑ PÔ PÐÝ!&Ð&TÐ&T¸JÔ<LÔ<SÐ&TÑ&TÔ&TÑ!TÔ!TÐå)CØ$Ø'Ø"3Ø)Ø#5Ø+Ø-Ø ,ð	*ñ 	*ô 	*Ð&ð Ô(×EÒEØÐ8ñô ð ð 	ÐÔ Ñ!ÐÔõ
 #-¨\½5¼<Ñ"HÔ"HÐà6ÐHˆ\ˆOˆO¸Lð 	 õ Ð1µ5Ñ9Ô9Ð9Ð9Ð9Ýð 
ð 
à/ð
ñ 
ô 
ñ 
ô 
ð 	
ð 	
ð 
õ
 	Ð?Ñ@Ô@Ð@Ø—x’xØØØØØØ#ØØŒMÔ,ØØ#ñ
ô 
ˆõ 	ÑÔÐàÔ,ð 	Iå$œ|Ô4Ô<Øð Ø#ð ð  ð  Ø.4ð ð  Ðð (?ÐTÐ!Ð#Ð#ÐDTð (õ 14ØÐ9ñ1ô 1ð Ið IÑ,�˜_õ ”×*Ò*¨;¸ÑHÔHÐHÐHØ"9ÐKˆ|˜AŒˆ¸|ÐKs   Ã
C% Ã%.DÆ/6G& Ç&$HÈHc                 ó.  — ddl m} || j        v r| j        |         }nw|} ||| j        d¬¦  «        }|                     ¦   «         }|| j        |<   |j        j        D ]7}|j        dk    r*d|j        v r!t          ||j        ¦  «        }| j
        |_        Œ8|S )Nr   )ÚCapabilityBasedPartitionerT)Úallows_single_node_partitionÚcall_moduleÚfused_)Ú!torch.fx.passes.infra.partitionerr�  rW  rV  Úpartition_and_fuserA   r„   rq   rM   rK  r›  Ú_wrapped_call)	rk   r2   r�   r�  Úpartitioned_prim_graph_moduleÚprim_graph_moduleÚpartitionerrn   Úfused_modules	            r/   ÚcompilezOrtBackend.compileK  sÜ   € ð
 	QÐPÐPÐPÐPÐPð, ˜4Ô2Ð2Ð2Ø,0Ô,CÀLÔ,QÐ)Ð)à ,ÐØ4Ð4Ø!ØÔ#Ø-1ðñ ô ˆKð
 -8×,JÒ,JÑ,LÔ,LÐ)Ø4QˆDÔ# LÑ1ð 6Ô;ÔAð Kð K�ð ”7˜mÒ+Ð+°¸D¼IÐ0EÐ0EÝ#*Ð+HÈ$Ì)Ñ#TÔ#T�Lð 26Ô1J�LÔ.øà,Ð,rK   c                 ó¬   — | j         j        r3ddlm} ddlm}   || j        || j        j        ¬¦  «        ||¦  «        S |                      ||¦  «        S )zçIf ``OrtBackendOptions.use_aot_autograd`` is ``True``, the `auto_autograd` compiler
        will be invoked, wrapping this ``OrtBackend`` instance's ``compile`` method. Otherwise,
        the ``compile`` method is invoked directly.r   )Ú#min_cut_rematerialization_partition)Úaot_autograd)Úfw_compilerÚpartition_fnÚdecompositions)	rM  rC  Úfunctorch.compilerª  Útorch._dynamo.backends.commonr«  r¨  rS  r"   )rk   r2   r�   rª  r«  s        r/   Ú__call__zOrtBackend.__call__�  sŠ   € ð Œ=Ô)ð 	"ØMÐMÐMÐMÐMÐMØBÐBÐBÐBÐBÐBð�<�<Ø œLØ@Ø#ÔCÔWðñ ô ð ˜Dñ	"ô "ð "ð �|Š|˜L¨$Ñ/Ô/Ð/rK   é   Ú%_OrtBackend__instance_cache_max_countÚ_OrtBackend__instance_cachec                 óÀ  ‡ ‡— dt           dt           fd„Št          ‰ t           ¦  «        st          d
i ‰ pi ¤ŽŠ t          ˆ ˆfd„t          j        D ¦   «         d¦  «        }|€}t          t          j        ¦  «        t          j        k     s(J dt          j        › dt          › dt          › d	�¦   «         ‚t          j                             t          ‰ ¦  «        x}¦  «         |S )a½  Returns a possibly cached instance of an ``OrtBackend``. If an existing
        backend was created previously through this function with the same options,
        it will be returned. Otherwise a new backend will be created, cached, and
        returned.

        Note: if ``options`` sets ``ort_session_options``, a new ``OrtBackend``
        will always be returned, since ``onnxruntime.SessionOptions`` cannot
        participate in caching.ÚaÚbc                 óî  — | j         |j         k    sP| j        |j        k    s@| j        |j        k    s0| j        |j        k    s | j        |j        k    s| j        |j        k    rdS | j        €|j        �dS | j        |j        u rdS | j        �k|j        �d| j        j        |j        j        k    oI| j        j	        |j        j	        k    o/| j        j
        |j        j
        u o| j        j        |j        j        u S dS )NFT)r@  rA  rB  rõ   rC  rF  rE  rD  ry  Údiagnostic_optionsrU  Úfake_context)r¶  r·  s     r/   Úreusablez<OrtBackend.get_cached_instance_for_options.<locals>.reusable£  s#  € àÔ/°1Ô3RÒRÐRØÔ.°!Ô2MÒMÐMØÔ0°AÔ4QÒQÐQØÔ'¨1Ô+?Ò?Ð?ØÔ%¨Ô);Ò;Ð;ØÔ-°Ô1KÒKÐKà�uð Ô$Ð0°AÔ4IÐ4UØ�uàÔ 1Ô#3Ð3Ð3Ø�tð ÔÐ+°Ô0@Ð0LàÔ$Ô3°qÔ7GÔ7VÒVð WØÔ(Ô;ØÔ'Ô:ò;ðWð Ô(Ô6¸!Ô:JÔ:XÐXðWð Ô(Ô5¸Ô9IÔ9VÐVðð �5rK   c              3   ó>   •K  — | ]} ‰|j         ‰¦  «        ¯|V — Œd S rg   )rM  )rŸ   r·  rI  r»  s     €€r/   rÃ   z=OrtBackend.get_cached_instance_for_options.<locals>.<genexpr>Ê  s6   øè è € ÐUÐU�1°x°xÀÄ
ÈGÑ7TÔ7TÐUˆQÐUÐUÐUÐUÐUÐUrK   NzNo more than z instances of z allowed. Please instantiate `z‚` explicitly to pass to `torch.compile`. See https://github.com/pytorch/pytorch/pull/107973#discussion_r1306144795 for discussion.rJ   )r   r–   Únextr   r´  rÄ   r³  r…   )rI  Úbackendr»  s   ` @r/   Úget_cached_instance_for_optionsz*OrtBackend.get_cached_instance_for_options–  s  øø€ ð!	Õ)ð !	Õ.?ð !	ð !	ð !	ð !	õF ˜'Õ#4Ñ5Ô5ð 	;Ý'Ð:Ð:¨7¨=°bÐ:Ð:ˆGåØUÐUÐUÐUÐU�
Ô3ÐUÑUÔUØñ
ô 
ˆð
 ˆ?å•JÔ/Ñ0Ô0µ:Ô3XÒXÐXÐXð"¥
Ô Eð "ð "Ýð"ð "Ý=Gð"ð "ð "ñ YÔXÐXõ Ô'×.Ò.½*ÀWÑ:MÔ:MÐ/M¨wÑNÔNÐNàˆrK   c                  óB   — t           j                             ¦   «          d S rg   )r   r´  ÚclearrJ   rK   r/   Úclear_cached_instancesz!OrtBackend.clear_cached_instancesÜ  s   € åÔ#×)Ò)Ñ+Ô+Ð+Ð+Ð+rK   c                  ó4   — t          t          j        ¦  «        S rg   )rŽ   r   r´  rJ   rK   r/   Úget_cached_instanceszOrtBackend.get_cached_instancesà  s   € å•ZÔ0Ñ1Ô1Ð1rK   rg   )rx   ry   rz   r{   r	   r   ri   r.   r~   r<  r
   r   r@   r   r   r`  r›  r¨  r±  r³  r   rG  r´  r   Ústaticmethodr   r¿  rÂ  rÄ  rJ   rK   r/   r   r   ð  sÐ  € € € € € € ðð ðV
ð V
 Ð):Ô ;ð V
ð V
ð V
ð V
ðpØ!œHÔ0ðà	�%˜˜W S¨# XÔ.Ð.Ô/Ô	0ðð ð ð ðBUL°´Ô1Eð ULð ULð ULð ULðn4- E¤HÔ$8ð 4-À5Ä8ÔCWð 4-ð 4-ð 4-ð 4-ðl0Ø!œHÔ0ð0à	ŒÔ	ð0ð 0ð 0ð 0ð$ )*Ð Ð)Ð)Ñ)Ø24Ð�e˜D Ô.Ô/Ð4Ð4Ñ4ààIMðCð CØ˜%Ð 1°7¸3À¸8Ô3DÐ DÔEÔFðCà	ðCð Cð Cñ „\ðCðJ ð,ð ,ñ „\ð,ð ð2ð 2ñ „\ð2ð 2ð 2rK   r   )rI  rI  c                óH   — t                               |¦  «        | |¦  «        S rg   )r   r¿  )r2   r�   rI  s      r/   r   r   å  s"   € õ ×5Ò5°gÑ>Ô>¸|ÈTÑRÔRÐRrK   rg   )\Údataclassesr&   Úloggingr;   Útypingr   r   r   r   r   r   r	   r
   r   r   r   r   Útyping_extensionsr   r.   Útorch._CÚ
torch._opsÚtorch._prims.executorÚtorch.fxÚtorch._subclasses.fake_tensorr   Útorch.fx._compatibilityr   Ú torch.fx.passes.fake_tensor_propr   Ú torch.fx.passes.operator_supportr   Útorch.fx.passes.tools_commonr   Útorch.utilsr   rN  r    r\   r   r`   r(   r)   r*   r+   rL  Útorch.onnx._internal.fx.passesr   r€   rG  Ú__all__r   r0   r@   r®   Úbytesr~   r<  rG   rL   rT   rW   ra   Ú	getLoggerrx   rs   rc   r‰   r’   r˜   r›   r¦   r²   r—   r½   r¾   r¿   rÀ   rÆ   r×   rÜ   rè   rì   r  r!  r#  Ú	dataclassr3  r   r   r   r   rJ   rK   r/   ú<module>rÚ     s´	  ðà Ð Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø 	€	€	€	ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð (Ð 'Ð 'Ð 'Ð 'Ð 'à €€€Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø <Ð <Ð <Ð <Ð <Ð <Ø :Ð :Ð :Ð :Ð :Ð :Ø Ð Ð Ð Ð Ð ð ð 
*Ø€K€K€KØÐÐÐØ6Ð6Ð6Ð6Ð6Ð6àÐÐÐØÐÐÐØ0Ð0Ð0Ð0Ø+Ð+Ð+Ð+Ø6Ð6Ð6Ð6Ø)Ð)Ð)Ð)ð #'€�˜$”Ð &Ð &Ñ &ðð ð €ð. Tð .ð .ð .ð .ðb &(Ð �D˜˜c˜”NÐ 'Ð 'Ñ 'ð IMðð ØðØ'/°´Ô0DÔ'Eðàðð ð ð ð2$˜H SœMð $ð $ð $ð $ð)˜3ð )ð )ð )ð )ð$ð $ð $ð
@ cð 
@ð 
@ð 
@ð 
@ð 
ˆÔ	˜8Ñ	$Ô	$€ð/ð /ð /ð /ð /˜ñ /ô /ð /ðd3¨U¬XÔ-Að 3Àdð 3ð 3ð 3ð 3ð*
 E¨#¨s¨(¤Oð 
ð 
ð 
ð 
ð¨u¬xÔ/Cð ÈÈcÐSVÈhÌð ð ð ð ðK°´Ô0Dð KÈð Kð Kð Kð Kð8¨e¬hÔ.Bð 8ÀuÈSÐRUÈXÄð 8ð 8ð 8ð 8ð X�5˜˜c˜”?ð X u¨S°#¨X¤ð Xð Xð Xð Xð$%2ØØØŒL˜%œ,¨¨U¬^¸UÀEÄMÐSWÐWô	
ð 	ð	ôð%2ð Ð Ô!ð%2ð %2ð %2ð %2ðPØ�5”< Ð$Ô%ðØ05Ð6KÔ0Lðà
ˆ5Œ<˜ÐÔðð ð ð ð*˜Jð ¨5¬<ð ð ð ð ð)ØØŒØØØð	ôð)ð &ð)ð „\ð)ð )ð )ð )ð@ØŒLðàØŒØŒØØŒØØŒØð	ôðð Ø	„LØØ	Øð
ôðð ð ð ð8NØ
(ðNà�s˜C�x”ðNð �%”, Ð#Ô$ðNð Ð.Ô/ð	Nð
 ˜˜S˜”/ðNð �5”< Ð$Ô%ðNð Ð/Ô0ðNð ðNð Ð7Ô8ðNð #ØØŒL˜%œ,¨¨U¬^¸UÀEÄMÐSWÐWô	
ð 	ð	ôðNð  ˆ5�”˜s E¨4Ð/Ô0°#Ð5Ô6ð!Nð Nð Nð Nðb#Ø
(ð#à�s˜C�x”ð#ð �%”, Ð#Ô$ð#ð Ð.Ô/ð	#ð
 ˜˜S˜”/ð#ð �5”< Ð$Ô%ð#ð Ð/Ô0ð#ð ð#ð Ð7Ô8ð#ð #ØØŒL˜%œ,¨¨U¬^¸UÀEÄMÐSWÐWô	
ð 	ð	ôð#ð  ˆ5�”˜s E¨4Ð/Ô0°#Ð5Ô6ð!#ð #ð #ð #ðLIð Ið Ið Ið Iñ Iô Ið IðX ÔðLð Lð Lð Lð Lñ Lô Lñ ÔðLðB #(¨¨U°3¸ÀÀSÀÔ8IÐ3IÔ-JÐ(JÔ"KÐ �iÐ KÐ KÑ Kð	ð €Ô˜dÐ#Ñ#Ô#Ø€ eÐ,Ñ,Ô,ð<1ð <1ð <1ð <1ð <1ñ <1ô <1ñ -Ô,ñ $Ô#ð<1ð~ € eÐ,Ñ,Ô,ðq2ð q2ð q2ð q2ð q2ñ q2ô q2ñ -Ô,ðq2ðh € eÐ,Ñ,Ô,ð
 FJð	Sð Sð SØ”(Ô&ðSð �eÐ-¨w°s¸C°xÔ/@Ð@ÔAÔBð	Sð Sð Sñ -Ô,ðSð Sð SrK   