Ë
    Q/æ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jp                  jr                     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jp                  jr                  ddfd„ZCdee5df   fd„ZDdejp                  jr                  deedf   fd„ZEdejp                  jr                  defd„ZFdejp                  jr                  dee5df   fd „ZGd!ee5df   dee5df   fd"„ZHd#eeej’                  ej”                  e6ej–                  eLejš                  e0f   df   ded$   fd%„ZNd&eej’                  df   d'ed$   deej’                  df   fd(„ZOd)edej’                  fd*„ZPd+eej’                  e6eLe0f   d,d-dej’                  fd.„ZQd)ej’                  d/eej’                  ej”                  e6ej–                  eLejš                  e0f   deej’                  e6eLe0f   fd0„ZRd1d2d3ee5df   d4eej’                  df   d5ed$   d6ee5df   d7eej’                  df   d8ed$   d9e0d:ed;   d<eeej’                  ej”                  e6ej–                  eLejš                  e0f   df   deeej’                  e6eLe0f   df   fd=„ZSd1d2d3ee5df   d4eej’                  df   d5ed$   d6ee5df   d7eej’                  df   d8ed$   d9e0d:ed;   d<eeej’                  ej”                  e6ej–                  eLejš                  e0f   df   deeej’                  e6eLe0f   df   fd>„ZT G d?„ d@«      ZUe j¬                   G dA„ dB«      «       ZWee5ee5e
e5ef   f   f   ZXee1dC<   	  e j¬                  dD¬E«       edF¬G«       G dH„ dI«      «       «       ZY edF¬G«       G dJ„ dK«      «       ZZ edF¬G«      ddLœdejp                  jr                  dMeeeYe
e5ef   f      fdN„«       Z[y)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         €d	 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 t         S t         S # t        $ r
 da Y t         S w xY w)	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        úc/root/repos/pocs/video-evals/.venv/lib/python3.12/site-packages/torch/onnx/_internal/onnxruntime.pyr   r   ;   s‚   € ô& Ðð	$Ü×#Ñ# MÔ2Ü×#Ñ#Ð$DÔEô ×#Ñ# LÔ1ãÛ'Û8Û3÷ó ð #ˆOô ÐŒ?Ðøô ò 	$Ø#‰OäÐð	$ús   ˆAA1 Á1BÂBÚ_dumped_onnx_modelÚmodel_stringÚgraph_modulec                 ó¨  — t         j                  j                  dd«      }|syt        j                  |d«      dz   }|› |› d�}t	        |d«      5 }|j                  | «       ddd«       |t        |<   |�D|› |› d�}t	        |d	d
¬«      5 }|j                  t        |j                  «      «       ddd«       |S |S # 1 sw Y   ŒZxY w# 1 sw Y   |S xY w)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   s×   € ô �Z‰Z�^‰^Ð.°Ó5€FÙØÜ×Ñ˜v rÓ*¨QÑ.€AØ�˜!˜˜EÐ"€HÜ	ˆh˜Ó	ð  Ø	�‰�Ô÷à!"Ô�vÑØÐØ ˜ !  DÐ)ˆÜ�, ¨gÔ6ð 	-¸!Ø�G‰G”C˜×*Ñ*Ó+Ô,÷	-à€Oˆ8€O÷ð ú÷
	-à€Oús   ÁB;Â
%CÂ;CÃCc                  ó   — dgS )NÚCPUExecutionProvider© rJ   ó    r/   Ú_infer_default_epsrL   ˆ   s   € ð #Ð#Ð#rK   Únamec                 ó”   — t         j                  j                  «       r*t         j                  j                  j	                  | «       yy)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   Ž   s/   € ô
 ‡z�z×ÑÔ Ü�
‰
�‰×"Ñ" 4Õ(ð !rK   c                  ó’   — t         j                  j                  «       r)t         j                  j                  j	                  «        yy)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�z×ÑÔ Ü�
‰
�‰×!Ñ!Õ#ð !rK   Údevice_typec                 óä   — ddl m} | dk(  r|j                  j                  «       S | dk(  r|j                  j	                  «       S | dk(  r|j                  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       sg   € Ý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                 ó2   •— t         ‰| �  |«       || _        y ©N)ÚsuperÚ__init__Ú_onnx_support_dict)Úselfrd   re   Ú	__class__s      €r/   ri   zOrtOperatorSupport.__init__»   s   ø€ ô
 	‰ÑÐ+Ô,Ø".ˆÕrK   Ú
submodulesÚnoder   c                 óÖ  •— |j                   t        vry|j                   dk(  rM|j                  | j                  v r5t        j                  d|j                  t        |j                  «      «       yt        ‰| �!  ||«      r5t        j                  d|j                  t        |j                  «      «       yt        j                  d|j                  t        |j                  «      «       y)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‰7Ô+Ñ+Øà�7‰7�oÒ%¨$¯+©+¸×9PÑ9PÑ*PÜ�K‰KØBØ—‘Ü�T—[‘[Ó!ôð
 ô ‰7Ñ$ Z°Ô6Ü�K‰KØHØ—‘Ü�T—[‘[Ó!ôð
 Ü�‰ØZØ�K‰KÜ�—‘Óô	
ð
 rK   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r@   ri   r   r.   ÚnnÚModuleÚfxÚNodeÚboolrv   Ú__classcell__)rl   s   @r/   rc   rc   ³   sc   ø„ ñð/ S¨¡Xð /À4ÈÈSÈÁ>õ /ðØ! # u§x¡x§¡Ð"6Ñ7ðØ?D¿x¹x¿}¹}ðà	÷ñ rK   rc   c                 óæ   — | j                   }g }d}|j                  D ]7  }|j                  dk(  r|j                  |«       |�Œ&|j                  dk7  sŒ6|}Œ9 |€y|D ]  }|j	                  |«       Œ y)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‰7�mÒ#Ø×Ñ Ô%Ø Ñ(¨T¯W©W¸Ó-EØ$(Ñ!ð	)ð
 Ð$ØØ#ò 3ˆØ×%Ñ% kÕ2ñ3rK   .c                  óà   — g }| D ]]  }t        |d«      sŒ|j                  }|j                  dk(  r|j                  d«       Œ=|j                  dk(  sŒM|j                  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’   ú   sg   € à
€CØò 3ˆÜ�3˜Õ!Ø—Z‘ZˆFØ�{‰{˜fÒ$Ø—
‘
Ð2Õ3Ø—‘ Ó%Ø—
‘
Ð1Õ2ð3ô �‹:ÐrK   c                 ó  — g }| j                   j                  D ]f  }|j                  dk(  sŒt        |d«      r7d|j                  v r)t        |j                  d   t        j                  «      sJ ‚|j                  |«       Œh t        |«      S )Nrƒ   ÚmetaÚval)
rA   r„   rq   r�   r”   Ú
isinstancer.   ÚTensorr…   rŽ   )r2   r‡   rn   s      r/   Ú_extract_graph_module_inputsr˜     s{   € Ø€LØ×"Ñ"×(Ñ(ò &ˆØ�7‰7�mÓ#Ü�t˜VÔ$¨°$·)±)Ñ);Ü! $§)¡)¨EÑ"2´E·L±LÔAÐAÐAØ×Ñ Õ%ð	&ô
 �ÓÐrK   c                 óŽ   — | j                   j                  D ]"  }|j                  dk(  sŒ|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›     sG   € à×"Ñ"×(Ñ(ò  ˆØ�7‰7�hÓð —9‘9˜Q‘<Òð	 ô
 ÐIÓ
JÐJrK   c                 óÊ   — t        j                  t        | «      «      \  }}|D �cg c]+  }t        |d«      rd|j                  v r|j                  d   ‘Œ- }}t        |Ž S c c}w )z[Return the all valid devices (i.e., GPU or CPU) among outputs of this torch.fx.GraphModule.r”   r•   )r   Útree_flattenr›   r�   r”   r’   )r2   Úflattened_output_argsÚ_Ú
output_argÚselected_output_argss        r/   Ú_infer_ep_from_graph_moduler¢     ss   € ä&×3Ñ3Ü% lÓ3ó ÑÐ˜1ð 0öàô �J Ô'¨E°Z·_±_Ñ,Dð	 	�‰˜ÓðÐð ô !Ð"6Ð7Ð7ùòs   ¦0A r�   c                 óf   — 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y| dk(  ryy)NrI   é   rŒ   r7   r   rJ   )r¤   s    r/   Úget_execution_provider_priorityz2_sort_eps.<locals>.get_execution_provider_priority.  s   € ØÐ'Ò'àØÐ(Ò(ð àrK   T)ÚkeyÚreverse)r@   ÚintÚsetrŽ   Úsorted)r�   r§   Ú
unique_epss      r/   Ú	_sort_epsr®   +  s6   € ð	¬Cð 	´Có 	ô �S“€JÜ”˜
Ð(GÐQUÔVÓWÐWrK   Úvalues©zORTC.OrtDevice.c           	      óP  ‡‡‡— 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kD  rt        ˆfd„| D «       «      }|S  ‰d	«      fS )
Nr   r   Ú	device_idr   c                 ó   — | xs dS )Nr   rJ   )r²   s    r/   Ú_device_id_or_zeroz-_get_onnx_devices.<locals>._device_id_or_zeroG  s   € ØŠ~˜AÐrK   Úvaluec           	      ó8  •— t        | t        j                  «      rc ‰j                  t	        | j
                  j                  «      ‰j                  j                  «        ‰| j
                  j                  «      «      S t        | t        j                  t        t        j                  t        t        j                  t        f«      r5 ‰j                  t	        d«      ‰j                  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Ÿ\™\Ô*Ø!�4—>‘>Ü$ U§\¡\×%6Ñ%6Ó7Ø—‘×-Ñ-Ó/Ù" 5§<¡<×#5Ñ#5Ó6óð ô
 Ø”E—L‘L¤#¤u§~¡~´u¼e¿m¹mÌTÐRô
ð "�4—>‘>Ü$ UÓ+¨T¯^©^×-JÑ-JÓ-LÈaóð ô Ð7¼#¼dÀ5»kÓ:JÑJÓKÐKrK   c              3   ó.   •K  — | ]  } ‰|«      –— Œ y ­wrg   rJ   )Ú.0rµ   r½   s     €r/   ú	<genexpr>z$_get_onnx_devices.<locals>.<genexpr>_  s   øè ø€ ÒTÀEÑ8¸×?ÑTùs   ƒ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ð¤cð ¬có ðLÜÜ�L‰Lœ%Ÿ,™,¬¬U¯^©^¼UÄEÇMÁMÔSWÐWñ
ðLô 
ö	Lô( ˆ6ƒ{�Q‚ÜÓTÈVÔTÓTˆØÐá,¨QÓ/Ð1Ð1rK   ÚtensorsÚdevicesc                 óp  — ddl m} ddlm}  |j                  «       }|j                  t        | «      «       g }g }g }| D ]^  }|j                  ||j                     «       |j                  |j                  «       «       |j                  |j                  «       «       Œ` |j                  | ||||«       |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åNà#�×#Ñ#Ó%€IØ×Ñ”c˜'“lÔ#Ø€FØ€FØ€Iàò ,ˆØ�‰Ð1°&·,±,Ñ?Ô@Ø�‰�f—k‘k“mÔ$Ø×Ñ˜Ÿ™Ó*Õ+ð,ð ×Ñ˜g y°&¸&À'ÔJØÐrK   rÓ   c                 ó¨   — | j                   rt        d«      ‚t        j                  | 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  s<   € Ø×ÒÜÐ>Ó?Ð?Ü
�+‰+�f—k‘k“m¨6¯<©<ÀÇÁÔ
N€CØ€JrK   Údynamo_valueÚ
value_infoúonnx.ValueInfoProtoc                 ó€  — t        | t        j                  «      rZt        |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 ‚| 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Ñ1×5Ñ5Ó6¸!Ò;Ø×Ñ $Ò&ô �}‰}˜\Ó*Ð*Ü	�L¤#Ô	&Ü�|‰|˜L´·±Ô<Ð<Ü	�L¤%Ô	(Ü�|‰|˜L´·±Ô>Ð>Ü	�L¤$Ô	'Ü�|‰|˜L´·
±
Ô;Ð;ä˜,¬¯©Ô5Ð5Ð5Ø×&Ñ&Ó(Ð(rK   Ú
prim_valuec           	      óø   — t        | t        j                  «      sJ d«       ‚t        |t        j                  t        t        j
                  t        t        j                  t        f«      r| j                  «       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é   ¡  sX   € ô$ �fœeŸl™lÔ+ÐKÐ-KÓKÐ+ÜØÜ	�‰”sœEŸN™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                  «       }|j                  dd	«       | j                  ||||||«       t        «        |r3t        d
«       t	        d„ t        |	«      D «       «      }t        «        |S t        d
«       |
j                  j                  j                  j                  |«      }t	        d„ t        ||	«      D «       «      }t        «        |S )Nr   r   rä   c              3   ó:   K  — | ]  \  }}t        ||«      –— Œ y ­wrg   ©rå   ©r¿   r‘   rÛ   s      r/   rÀ   z8_run_onnx_session_with_ortvaluevector.<locals>.<genexpr>Ò  ó#   è ø€ ò áˆC�ô 	' s¨J×7ñùó   ‚rÎ   c              3   óV   K  — | ]!  }t        |t        «      rt        |«      n|–— Œ# y ­wrg   )r–   r   rÙ   )r¿   Úts     r/   rÀ   z8_run_onnx_session_with_ortvaluevector.<locals>.<genexpr>ß  s(   è ø€ ò 
ØGH¤*¨Q´
Ô";ŒO˜AÔÀÓBñ
ùs   ‚')Úrun_with_ortvaluevectorÚ'disable_synchronize_execution_providersÚ1zafter run_with_ortvaluevectorc              3   ó:   K  — | ]  \  }}t        ||«      –— Œ y ­wrg   ©ré   ©r¿   Úonnx_outputÚprim_outputs      r/   rÀ   z8_run_onnx_session_with_ortvaluevector.<locals>.<genexpr>ø  ó#   è ø€ ò 
á(�˜[ô +¨;¸×Dñ
ùrû   c              3   ó:   K  — | ]  \  }}t        ||«      –— Œ y ­wrg   r  r  s      r/   rÀ   z8_run_onnx_session_with_ortvaluevector.<locals>.<genexpr>  r  rû   )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  ½  sx  € ó" Ý6ä�\Ô"Üñ ä" 6Ð+<Ó=ôó €Fô ÔäÐ&Ô'Ü2°6¸=ÓI€Jñ
 Üñ 
ØLSô
ó 
ˆô 8¸À^ÓT‰à)�d×)Ñ)Ó+ˆÜÔäÐ.Ô/Ø(�+×(Ñ(Ó*€KØ×$Ñ$Ð%NÐPSÔTØ× Ñ Ø�[ *¨l¸KÈôô Ôñ äÐ8Ô9ô ñ 
ä,/°Ð=TÓ,Uô
ó 
ˆô 	ÔØÐô 	Ð8Ô9à!×*Ñ*×4Ñ4×;Ñ;×VÑVØó
ˆô ñ 
ä,/°Ð=TÓ,Uô
ó 
ˆô 	ÔØÐrK   c
           	      óV  — dd l }
t        d„ t        ||«      D «       «      }t        ||«      D ��ci c]=  \  }}||
j                  j	                  |j                  «       j                  «       «      “Œ? }}}| j                  ||«      }t        d„ t        ||	«      D «       «      }|S c c}}w )Nr   c              3   ó:   K  — | ]  \  }}t        ||«      –— Œ y ­wrg   rø   rù   s      r/   rÀ   z/_run_onnx_session_with_fetch.<locals>.<genexpr>!  rú   rû   c              3   ó`   K  — | ]&  \  }}t        t        j                  |«      |«      –— Œ( y ­wrg   )ré   r.   Ú
from_numpy)r¿   rµ   r  s      r/   rÀ   z/_run_onnx_session_with_fetch.<locals>.<genexpr>*  s4   è ø€ ò ñ
 ˆE�;ô	 	'Ü×Ñ˜UÓ#Ø÷	
ñùs   ‚,.)r    rŽ   r  ÚOrtValueÚortvalue_from_numpyrZ   ÚnumpyÚrun)rê   rì   rí   rî   rï   rð   rñ   rò   ró   rõ   r    rM   rÓ   Úfeedr  r  s                   r/   Ú_run_onnx_session_with_fetchr    sµ   € ó" äñ ä" 6Ð+<Ó=ôó €Fô   ¨VÓ4÷áˆD�&ð 	ˆk×"Ñ"×6Ñ6°v·z±z³|×7IÑ7IÓ7KÓLÑLð€Dñ ð —(‘(˜<¨Ó.€KÜñ ô
 #& kÐ3JÓ"Kôó €Kð Ðùós   °AB%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
y)ÚOrtExecutionInfoPerSessionzWInformation required to execute torch.fx.GraphModule using onnxruntime.InferenceSessionÚsessionrë   rì   .ró   rô   rï   Úoutput_value_infosrî   r°   rñ   Úexample_outputsc	                 ót   — || _         || _        || _        || _        || _        || _        || _        || _        y 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  sM   € ð 6=ˆŒð -8ˆÔàBSˆÔà-9ˆÔàCUˆÔð :GˆÔà:HˆÔð ð 	ÕrK   c                 ó˜  — ddl m}m} t        |«      t        | j                  «      k7  ryt        || j                  «      D �]†  \  }}t        |t        j                  t        t        f«      s yt        |t        t        t        f«      ro |t        |«      «      }||j                  j                  j                  k7  r yt        |j                  j                  j                  j                   «      dk7  r yŒ¸||j"                     }||j                  j                  j                  k7  r yt        |j                  |j                  j                  j                  j                   «      D ]Z  \  }}t        |t        «      r|j$                  |k(  s|j&                  rŒ2t        |t        j(                  «      r|j&                  rŒY  y �Œ‰ y)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  sd  € ÷	
ô ˆt‹9œ˜D×2Ñ2Ó3Ò3ØÜ" 4¨×)?Ñ)?Ó@ó 	!‰OˆC�Ü˜c¤E§L¡L´%¼Ð#=Ô>Ùô ˜#¤¤U¬DÐ1Ô2áIÌ$ÈsË)ÓT�
Ø §¡×!<Ñ!<×!FÑ!FÒFÙ Ü�z—‘×2Ñ2×8Ñ8×<Ñ<Ó=ÀÒBÙ Øð BÀ#Ç)Á)ÑLˆJØ˜ZŸ_™_×8Ñ8×BÑBÒBÙÜ!$ S§Y¡Y°
·±×0KÑ0K×0QÑ0Q×0UÑ0UÓ!Vò !‘��XÜ˜c¤3Ô'Ø×&Ñ&¨#Ò-°×1CÒ1CàÜ ¤U§\¡\Ô2°x×7IÒ7IØâ ò!ð%	!ð6 rK   N)rx   ry   rz   r{   r   r@   r   r.   r—   ri   r-  rJ   rK   r/   r  r  4  s¢   „ Ùað
à/ð
ð ˜3 ˜8‘_ð
ð !Ð!;Ñ<ð	
ð
 ˜C ˜H‘oð
ð "Ð"<Ñ=ð
ð Ð2Ñ3ð
ð Ð3Ñ4ð
ð ˜u U§\¡\°3Ð%6Ñ7¸¿¹ÐEÑFó
óB%rK   r  c                   ó€   — e Zd Zdd„Zdej
                  j                  fd„Zdej
                  j                  defd„Z	y)Ú"OrtExecutionInfoForAllGraphModulesNc                 ó   — i | _         y rg   )Úexecution_info_per_graph_module)rk   s    r/   ri   z+OrtExecutionInfoForAllGraphModules.__init__‚  s   € ð
 ð 	Õ,rK   r2   c                 ót   — || j                   vry | j                   |   }|D ]  } |j                  |Ž sŒ|c S  y rg   )r1  r-  )rk   r2   r�   Ú
candidatesÚ	candidates        r/   Ú&search_reusable_session_execution_infozIOrtExecutionInfoForAllGraphModules.search_reusable_session_execution_info‰  sQ   € ð ˜t×CÑCÑCØð ×9Ñ9¸,ÑGˆ
à#ò 	!ˆIØ%ˆy×%Ñ% tÒ,à Ò ð	!ð
 rK   rt   c                 ó~   — || j                   vr|g| j                   |<   y | j                   |   j                  |«       y rg   )r1  r…   )rk   r2   rt   s      r/   Úcache_session_execution_infoz?OrtExecutionInfoForAllGraphModules.cache_session_execution_info™  s=   € ð ˜t×CÑCÑCØBFÀˆD×0Ñ0°Ò>à×0Ñ0°Ñ>×EÑEÀdÕKrK   )r   N)
rx   ry   rz   ri   r.   r~   ÚGraphModuler5  r  r7  rJ   rK   r/   r/  r/  €  s@   „ óðØ!ŸH™H×0Ñ0óð LØ!ŸH™H×0Ñ0ðLØ8RôLrK   r/  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<   y)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__r=  r€   r>  rò   r?  r@  rA  rB  r   rJ   rK   r/   r   r   ¯  sÌ   … ñð OSÐ! 8¨HÐ5IÑ,JÑ#KÓRðð '+Ð˜tÓ*ØmàLPÐ ¨(Ð3GÑ*HÑ!IÓPðð  %Ð˜Ó$ØVà!Ð�dÓ!ðð <@€N�HÐ7Ñ8Ó?ØUàBFÐ˜Ð">Ñ?ÓFØVð 	ð ˜hØ�Ð,Ð-¨tÐ3Ñ4Ñ5ñó ð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y)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                 ó¬  — ddl m} dd l}dd l}dd l}|€
t        «       n|| _        |j                  j                  j                  j                  | j                  j                  €|j                  j                  «       n| j                  j                  «      | _        |j                  j                  j                  j                  j!                  | j                  j"                  «      }d d d d d dœ}t%        ||«      | _        i | _        t+        «       | _        d| _        d| _        t3        |j4                  d«      rt6        | _        y t8        | _        y )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ÚResolvedExportOptionsr@  ÚExportOptionsÚ_resolved_onnx_exporter_optionsr~   r"   Ú'_create_onnx_supports_op_overload_tableÚonnx_registryrc   Ú_supported_opsÚ_partitioner_cacher/  Ú_all_ort_execution_infoÚ_assert_allclose_to_baselineÚexecution_countr�   rÉ   r  r  r  )rk   rE  r`   r.   rd   re   s         r/   ri   zOrtBackend.__init__û  s1  € Ý:ãÛ4Û:à6=°oÔ0Ô2È7ˆŒð  �J‰J× Ñ ×1Ñ1×GÑGà—=‘=×/Ñ/Ð7ð —
‘
×(Ñ(Ô*à—]‘]×1Ñ1óð 	Ô,ð& —z‘z×+Ñ+×.Ñ.×BÑB×jÑjØ×0Ñ0×>Ñ>ó
ˆð
 ð "&ð "Ø!Ø!ñ
.
Ðô 1°Ð?QÓRˆÔð UWˆÔô (JÓ'KˆÔ$à,1ˆÔ)à ˆÔô
 �t×*Ñ*Ð,=Ô>ô 2ð 	�ô .ð 	�rK   r2   r   c                 ó¤  — d}| j                   j                  rt        |Ž x}r|}nt        |«      x}r|}g }g | j                   j                  xs g ¢t        |«      ¢| j                   j                  xs
 t        «       ¢­D ]L  }t        |t        «      r|i f}nt        |t        «      r|d   €|d   i f}|€Œ7||vsŒ<|j                  |«       ŒN |S )NrJ   r7   r   )rI  r=  r’   r¢   r<  r®   r>  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Ò2Ü 5°tÐ <Ð<ˆ}Ð<ð
  -‘Ü*EÀlÓ*SÐSÐ&ÐSð  5�àˆð
Ø�m‰m×9Ñ9Ò?¸Rð
ä�|Ó$ð
ð �m‰m×7Ñ7ÒOÔ;MÓ;Oñ
ò 
	(ˆBô
 ˜"œcÔ"Ø˜"�X‘Ü˜B¤Ô&¨2¨a©5¨=Ø˜‘e˜R�[�Ø‰~ "¨LÒ"8Ø×#Ñ# BÕ'ð
	(ð ÐrK   c                 ó,
  — ddl }ddlm}m}  | j                  j
                  |g|¢­Ž }|rb|j                  }|j                  }	|j                  }
|j                  }|j                  }|j                  }|j                  }|j                  }�n|j                  | j                  j                   |«      j#                  «       }| j                  j$                  r,d| _        t)        |«      }d„ }t+        j,                  ||«      }n	  t/        |«      j0                  |i |¤Ž}|j9                  | j                  j                   ¬«      }|j;                  | j                  j                   |«      j#                  «       }|j#                  || j                  j<                  ¬«      }|j?                  | j                  j@                  jB                  ¬	«      }	 dd
l"m#} ddl$m } |jK                  |«      }|jM                  |«      }| jP                  jR                  r#| jP                  jR                  D ]
  } ||«       Œ |jU                  «       }tV        jX                  j[                  dd«      rt]        ||¬«        |j^                  || jP                  j`                   | jb                  |g|¢­Ž ¬«      }te        d„ |jf                  jh                  D «       «      }	te        d„ |jf                  jj                  D «       «      }
tm        |«      }to        |td        «      rtm        |«      }ntm        |f«      }te        d„ |jf                  jh                  D «       «      }te        d„ |jf                  jj                  D «       «      }tq        ||	||
||||¬«      }| j                  js                  ||«       | xjt                  dz  c_:        to        |tv        jx                  «      }|r|fn|}to        |td        «      sJ ‚t{        d„ |D «       «      sJ ‚t}        d«       | j#                  ||	|||
||| jP                  j&                  ||«
      }t        «        | j€                  rhtw        j‚                  j„                  j†                  |g|¢­ddiŽ}|r|fn|}t‰        ||«      D ]%  \  }} tv        jŠ                  j�                  || «       Œ' |r|d   S |S # t2        $ r t4        j7                  d|«       d| _        ‚ w xY w# tN        $ r t4        j7                  d«       Y �Œw xY w)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                 óX   — t        | d«      rd| j                  v r| j                  d   S | S )Nr”   r•   )r�   r”   )rµ   s    r/   Úmaybe_map_to_meta_valz>OrtBackend._ort_acclerated_call.<locals>.maybe_map_to_meta_val   s-   € Ü˜u fÔ-°%¸5¿:¹:Ñ2Eð  %Ÿz™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   ó4   K  — | ]  }|j                   –— Œ y ­wrg   rS   ©r¿   Úinputs     r/   rÀ   z2OrtBackend._ort_acclerated_call.<locals>.<genexpr>  s   è ø€ ÒO¨u §
¥
ÑOùó   ‚c              3   ó4   K  — | ]  }|j                   –— Œ y ­wrg   rS   ©r¿   rš   s     r/   rÀ   z2OrtBackend._ort_acclerated_call.<locals>.<genexpr>  s   è ø€ Ò S° §¥Ñ Sùrk  c              3   ó    K  — | ]  }|–— Œ y ­wrg   rJ   ri  s     r/   rÀ   z2OrtBackend._ort_acclerated_call.<locals>.<genexpr>  s   è ø€ Ò%P°¤eÑ%Pùó   ‚c              3   ó    K  — | ]  }|–— Œ y ­wrg   rJ   rm  s     r/   rÀ   z2OrtBackend._ort_acclerated_call.<locals>.<genexpr>  s   è ø€ Ò&T°&¤vÑ&Tùro  r$  r7   c              3   óz   K  — | ]3  }t        |t        j                  t        j                  t        f«      –— Œ5 y ­wrg   )r–   r.   r—   r¹   rª   )r¿   Úelems     r/   rÀ   z2OrtBackend._ort_acclerated_call.<locals>.<genexpr>(  s.   è ø€ ò 
àô �tœeŸl™l¬E¯L©L¼#Ð>×?ñ
ùs   ‚9;Ú$run_onnx_session_with_ortvaluevectorÚexecutorÚaten)Gr    r,   r#   r$   rT  r5  r   rì   rï   ró   r!  rî   rñ   r"  ÚMovePlaceholderToFrontrO  r`  r  Údynamic_shapesrò   r›   r   Útree_mapr   Ú	propagateÚ	Exceptionrs   rw   ÚFxOnnxInterpreterÚInsertTypePromotionrb  Úto_model_protorQ  rc  r!   rd  Úonnxscript.rewriterÚoptimizeÚrewriter-   rI  rB  ÚSerializeToStringr;   r<   r=   rG   ÚInferenceSessionrA  r\  rŽ   rA   rj  rš   rÃ   r–   r  r7  rV  r.   r—   ÚallrT   rW   rU  Ú_primsrt  Ú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_outputsr_  Úfx_interpreterÚexportedÚ
onnx_modelrd  Ú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ð PˆD×(Ñ(×OÑOØðØ#òð 	*ñ
 -Ø<×DÑDˆLØ;×GÑGˆKØ<×IÑIˆLØ A× SÑ SÐØ!B×!UÑ!UÐØ=×KÑKˆMØ>×MÑMˆNØ<×LÑLŠLð
 "×8Ñ8Ø×4Ñ4×GÑGØó÷ ‰c‹eð ð ×3Ñ3×BÒBà*/�Ô'Ü$AÀ,Ó$OÐ!ò%ô  '×/Ñ/Ø)Ð+<ó ‘ðØ#I¤>°,Ó#?×#IÑ#IØð$Ø!'ñ$�Lð 1×BÑBØ#'×#GÑ#G×#ZÑ#Zð Có ˆNð "×5Ñ5Ø×4Ñ4×GÑGÈóç‰c‹eð ð
 &×)Ñ)Ø ,Ø(,×(LÑ(L×(dÑ(dð *ó ˆHð
 "×0Ñ0Ø"×BÑB×PÑP×^Ñ^ð 1ó ˆJðÝ0õð '×/Ñ/°
Ó;�
Ø)×1Ñ1°*Ó=�
ð �}‰}×5Ò5Ø!%§¡×!GÑ!Gò *�IÙ˜jÕ)ð*ð  *×;Ñ;Ó=ÐÜ�z‰z�~‰~Ð0°$Ô7ô !Ð!1ÀÕMð 8˜;×7Ñ7Ø.Ø!Ÿ]™]×>Ñ>Ø*˜$×*Ñ*¨<Ð?¸$Ò?ôˆLô  ÑO¸
×8HÑ8H×8NÑ8NÔOÓOˆKÜ Ñ S¸:×;KÑ;K×;RÑ;RÔ SÓSˆLÜ-¨dÓ3ˆMô ˜,¬Ô.Ü!2°<Ó!@‘ä!2°L°?Ó!C�ä %Ñ%P¸×9IÑ9I×9OÑ9OÔ%PÓ PÐÜ!&Ñ&T¸J×<LÑ<L×<SÑ<SÔ&TÓ!TÐä)CØ$Ø'Ø"3Ø)Ø#5Ø+Ø-Ø ,ô	*Ð&ð ×(Ñ(×EÑEØÐ8ôð 	×Ò Ñ!Õô
 #-¨\¼5¿<¹<Ó"HÐá6ˆ\‰O¸Lð 	 ô Ð1´5Ô9Ð9Ð9Üñ 
à/ô
ô 
ð 	
ð 
ô
 	Ð?Ô@Ø—x‘xØØØØØØ#ØØ�M‰M×,Ñ,ØØ#ó
ˆô 	Ôà×,Ò,ä$Ÿ|™|×4Ñ4×<Ñ<Øð Ø#ò Ø.4ñ Ðñ (?Ð!Ñ#ÐDTð (ô 14ØÐ9ó1ò IÑ,�˜_ô —‘×*Ñ*¨;¸ÕHðIñ #:ˆ|˜A‰ÐK¸|ÐKøôs !ò Ü—N‘NÐ#AÀ<ÔPð /4�DÔ+ð ðûôN ò Ü—‘ð]÷ðús   ÄS Ç.S1 Ó(S.Ó1TÔTc                 ó~  — ddl m} || j                  v r| j                  |   }|S |} ||| j                  d¬«      }|j	                  «       }|| j                  |<   |j
                  j                  D ]H  }|j                  dk(  sŒd|j                  v sŒ"t        ||j                  «      }| j                  |_        ŒJ |S )Nr   )ÚCapabilityBasedPartitionerT)Úallows_single_node_partitionÚcall_moduleÚfused_)Ú!torch.fx.passes.infra.partitionerr›  rS  rR  Úpartition_and_fuserA   r„   rq   rM   rG  r™  Ú_wrapped_call)	rk   r2   r�   r›  Úpartitioned_prim_graph_moduleÚprim_graph_moduleÚpartitionerrn   Úfused_modules	            r/   ÚcompilezOrtBackend.compileK  sÔ   € õ
 	Qð, ˜4×2Ñ2Ñ2Ø,0×,CÑ,CÀLÑ,QÐ)ð0 -Ð,ð- !-ÐÙ4Ø!Ø×#Ñ#Ø-1ôˆKð
 -8×,JÑ,JÓ,LÐ)Ø4QˆD×#Ñ# LÑ1ð 6×;Ñ;×AÑAò K�ð —7‘7˜mÓ+°¸D¿I¹IÒ0EÜ#*Ð+HÈ$Ï)É)Ó#T�Lð 26×1JÑ1J�LÕ.ðKð -Ð,rK   c                 óÊ   — | j                   j                  r<ddlm} ddlm}   || j                  || j                  j                  ¬«      ||«      S | j                  ||«      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)	rI  r?  Úfunctorch.compiler¨  Útorch._dynamo.backends.commonr©  r¦  rO  r"   )rk   r2   r�   r¨  r©  s        r/   Ú__call__zOrtBackend.__call__�  s`   € ð �=‰=×)Ò)ÝMÝBð‘<Ø ŸL™LØ@Ø#×CÑC×WÑWôð ˜Dó	"ð "ð �|‰|˜L¨$Ó/Ð/rK   é   Ú%_OrtBackend__instance_cache_max_countÚ_OrtBackend__instance_cachec                 óª  ‡ ‡— dt         dt         fd„Št        ‰ t         «      st        d
i ‰ xs 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                  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                 ó6  — | j                   |j                   k7  s}| j                  |j                  k7  sd| j                  |j                  k7  sK| j                  |j                  k7  s2| j                  |j                  k7  s| j
                  |j
                  k7  ry| j                  €|j                  �y| j                  |j                  u ry| j                  �Ä|j                  �¸| j                  j                  |j                  j                  k(  xr‰ | j                  j                  |j                  j                  k(  xrZ | j                  j                  |j                  j                  u xr, | j                  j                  |j                  j                  u S y)NFT)r<  r=  r>  rò   r?  rB  rA  r@  rw  Údiagnostic_optionsrQ  Úfake_context)r´  rµ  s     r/   Úreusablez<OrtBackend.get_cached_instance_for_options.<locals>.reusable£  sl  € à×/Ñ/°1×3RÑ3RÒRØ×.Ñ.°!×2MÑ2MÒMØ×0Ñ0°A×4QÑ4QÒQØ×'Ñ'¨1×+?Ñ+?Ò?Ø×%Ñ%¨×);Ñ);Ò;Ø×-Ñ-°×1KÑ1KÒKàð ×$Ñ$Ð0°A×4IÑ4IÐ4UØà×Ñ 1×#3Ñ#3Ñ3Øð ×ÑÐ+°×0@Ñ0@Ð0Là×$Ñ$×3Ñ3°q×7GÑ7G×7VÑ7VÑVò WØ×(Ñ(×;Ñ;Ø×'Ñ'×:Ñ:ñ;òWð ×(Ñ(×6Ñ6¸!×:JÑ:J×:XÑ:XÐXòWð ×(Ñ(×5Ñ5¸×9IÑ9I×9VÑ9VÐVðð rK   c              3   óJ   •K  — | ]  } ‰|j                   ‰«      sŒ|–— Œ y ­wrg   )rI  )r¿   rµ  rE  r¹  s     €€r/   rÀ   z=OrtBackend.get_cached_instance_for_options.<locals>.<genexpr>Ê  s   øè ø€ ÒU�1±xÀÇ
Á
ÈGÕ7TŒQÑUùs   ƒ#œ#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…   )rE  Úbackendr¹  s   ` @r/   Úget_cached_instance_for_optionsz*OrtBackend.get_cached_instance_for_options–  sÍ   ù€ ð!	Ô)ð !	Ô.?ó !	ôF ˜'Ô#4Ô5Ü'Ñ:¨7ª=°bÑ:ˆGäÜUœ
×3Ñ3ÔUØó
ˆð
 ˆ?ä”J×/Ñ/Ó0´:×3XÑ3XÒXðð  ¤
× EÑ EÐFÀnÜ�,Ð<¼Z¸Lð I"ð"óØXô ×'Ñ'×.Ñ.¼*ÀWÓ:MÐ/M¨wÔNàˆrK   c                  ó@   — t         j                  j                  «        y 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Ñ0Ó1Ð1rK   rg   )rx   ry   rz   r{   r	   r   ri   r.   r~   r8  r
   r   r@   r   r   r\  r™  r¦  r¯  r±  r   rC  r²  r   Ústaticmethodr   r½  rÀ  rÂ  rJ   rK   r/   r   r   ð  sM  … ññV
 Ð):Ñ ;ó V
ðpØ!ŸH™H×0Ñ0ðà	�%˜˜W S¨# XÑ.Ð.Ñ/Ñ	0óðBUL°·±×1EÑ1Eó ULðn4- E§H¡H×$8Ñ$8ð 4-À5Ç8Á8×CWÑCWó 4-ðl0Ø!ŸH™H×0Ñ0ð0à	�‰×	Ñ	ó0ð$ )*Ð Ó)Ø24Ð�e˜D Ñ.Ñ/Ó4ààIMñCØ˜%Ð 1°7¸3À¸8Ñ3DÐ DÑEÑFðCà	òCó ðCðJ ñ,ó ð,ð ñ2ó ñ2rK   r   )rE  rE  c                ó8   — t        j                  |«      | |«      S rg   )r   r½  )r2   r�   rE  s      r/   r   r   å  s   € ô ×5Ñ5°gÓ>¸|ÈTÓ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   rJ  r    r\   r   r`   r(   r)   r*   r+   rH  Útorch.onnx._internal.fx.passesr   r€   rC  Ú__all__r   r0   r@   rª   Úbytesr~   r8  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  Ú	dataclassr/  r   r   r   r   rJ   rK   r/   ú<module>rØ     sf  ðä Û Û Û 	÷÷ ÷ ó õ (ã Û Û Û Û Ý 4Ý 1Ý ;Ý <Ý :Ý ñ ÛÛÝ6ãÛÛ0Û+Û6Û)ð #'€�˜$‘Ó &ò€ð. Tó .ðb &(Ð �D˜˜c˜‘NÓ 'ð IMñØðØ'/°·±×0DÑ0DÑ'Eðàóð2$˜H S™Mó $ð)˜3ó )ò$ð
@ có 
@ð 
ˆ×	Ñ	˜8Ó	$€ô/˜ô /ðd3¨U¯X©X×-AÑ-Að 3Àdó 3ð*
 E¨#¨s¨(¡Oó 
ð¨u¯x©x×/CÑ/Cð ÈÈcÐSVÈhÉó ðK°·±×0DÑ0Dð KÈó Kð8¨e¯h©h×.BÑ.Bð 8ÀuÈSÐRUÈXÁó 8ð X�5˜˜c˜‘?ð X u¨S°#¨X¡ó Xð$%2ØØØ�L‰L˜%Ÿ,™,¨¨U¯^©^¸UÀEÇMÁMÐSWÐWñ	
ð 	ð	ñð%2ð Ð Ñ!ó%2ðPØ�5—<‘< Ð$Ñ%ðØ05Ð6KÑ0Lðà
ˆ5�<‰<˜ÐÑóð*˜Jð ¨5¯<©<ó ð)ØØ�‰ØØØð	ñð)ð &ð)ð ‡\�\ó)ð@Ø�L‰LðàØ�‰Ø�‰ØØ�‰ØØ�‰Øð	ñðð Ø	‡L�LØØ	Øð
ñóð8NØ
(ðNà�s˜C�x‘ðNð �%—,‘, Ð#Ñ$ðNð Ð.Ñ/ð	Nð
 ˜˜S˜‘/ðNð �5—<‘< Ð$Ñ%ðNð Ð/Ñ0ðNð ðNð Ð7Ñ8ðNð #ØØ�L‰L˜%Ÿ,™,¨¨U¯^©^¸UÀEÇMÁMÐSWÐWñ	
ð 	ð	ñðNð  ˆ5�—‘˜s E¨4Ð/Ñ0°#Ð5Ñ6ó!Nðb#Ø
(ð#à�s˜C�x‘ð#ð �%—,‘, Ð#Ñ$ð#ð Ð.Ñ/ð	#ð
 ˜˜S˜‘/ð#ð �5—<‘< Ð$Ñ%ð#ð Ð/Ñ0ð#ð ð#ð Ð7Ñ8ð#ð #ØØ�L‰L˜%Ÿ,™,¨¨U¯^©^¸UÀEÇMÁMÐSWÐWñ	
ð 	ð	ñð#ð  ˆ5�—‘˜s E¨4Ð/Ñ0°#Ð5Ñ6ó!#÷LIñ IðX ×Ñ÷Lð Ló ðLðB #(¨¨U°3¸ÀÀSÀÑ8IÐ3IÑ-JÐ(JÑ"KÐ �iÓ Kð	ð €×Ñ˜dÔ#Ù eÔ,÷<1ð <1ó -ó $ð<1ñ~  eÔ,÷q2ð q2ó -ðq2ñh  eÔ,ð
 FJò	SØ—(‘(×&Ñ&ðSð �eÐ-¨w°s¸C°xÑ/@Ð@ÑAÑBò	Só -ñSrK   