Ë
    ëÓ^jÍ˜  ã                   ód  — d Z ddlZddlZddlZddlmZ ddlmZmZ ddl	m
Z
 ddlmZ ddlZddlZ	 ddlZddlm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  e«       Z	 	 	 	 dddœdeee   z  dej<                  j>                  dee   dej@                  eej@                     z  dee   deeee!ef   f   dz  de"de"de!dedz  de#defd„Z$	 d dedee   dej@                  eej@                     z  de"def
d„Z% G d„ d«      Z&y# e$ r dZdZY ŒÖw xY w# e$ r dZdZY ŒÚw xY w# e$ r dZY Œàw xY w)!z/ONNX export, simplification, and OnnxOptimizer.é    N)ÚOrderedDict)ÚMappingÚSequence)Údeepcopy)ÚPathLike)Úshape_inference)ÚG_LOGGER)Úfold_constants)ÚCustomOpSymbolicRegistry)Ú
get_logger)ÚnotesÚ
output_dirÚmodelÚinput_namesÚinput_tensorsÚoutput_namesÚdynamic_axesÚbackbone_onlyÚverboseÚopset_versionÚvariant_namer   Úreturnc
                ó‚  — |	rIt         j                  j                  t         j                  j                  |	«      «      d   }	|r|	› d�n|	}n|rdnd}t         j                  j	                  | |› d�«      }t        |d«      r|j                  «        i }dt        j                  t        j                  j                  «      j                  v rd|d<   t        j                  j                  |||f||d	dd	|||d
œ|¤Ž |
�©t        �£t        j                  |«      }t        |
t        «      r|
nt        j                   |
d¬«      }t#        d„ |j$                  D «       d«      }|�||_        n(|j$                  j)                  «       }d|_        ||_        t        j,                  ||«       t.        j1                  d|› �«       |S )a"  Export a model to ONNX.

    Args:
        output_dir: Directory where the ONNX file will be written.
        model: Model to export.
        input_names: Names of model inputs in ONNX graph.
        input_tensors: Example model input tensor(s) for tracing.
        output_names: Names of model outputs in ONNX graph.
        dynamic_axes: Optional dynamic axis configuration for ONNX export.
        backbone_only: Whether to export backbone-only graph naming.
        verbose: Whether ONNX exporter should emit verbose logs.
        opset_version: ONNX opset version.
        variant_name: Model variant identifier (e.g. ``"rfdetr-medium"``).
            When provided, the exported file is named ``{variant_name}.onnx`` or ``{variant_name}-backbone.onnx`` (when
            ``backbone_only=True``) instead of the generic ``inference_model.onnx`` or ``backbone_model.onnx``.
        notes: Optional user-defined metadata (string, dict, list, or any
            JSON-serialisable value) to embed in the exported ONNX model under the ``"rfdetr_notes"`` metadata property.
            Ignored when ``None``. String values are stored verbatim; all other types are JSON-encoded, so consumers
            must call ``json.loads()`` to recover a dict or list.

    Returns:
        Path to the exported ONNX model.
    r   z	-backboneÚbackbone_modelÚinference_modelú.onnxÚexportÚdynamoFT)r   r   Úexport_paramsÚkeep_initializers_as_inputsÚdo_constant_foldingr   r   r   N)Ú	allow_nanc              3   ó@   K  — | ]  }|j                   d k(  sŒ|–— Œ y­w)Úrfdetr_notesN)Úkey)Ú.0Úps     úg/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/rfdetr/export/_onnx/exporter.pyú	<genexpr>zexport_onnx.<locals>.<genexpr>�   s   è ø€ ÒY˜qÀÇÁÈ.ÓAXœÑYùs   ‚—r$   z#
Successfully exported ONNX model: )ÚosÚpathÚsplitextÚbasenameÚjoinÚhasattrr   ÚinspectÚ	signatureÚtorchÚonnxÚ
parametersÚloadÚ
isinstanceÚstrÚjsonÚdumpsÚnextÚmetadata_propsÚvalueÚaddr%   ÚsaveÚloggerÚinfo)r   r   r   r   r   r   r   r   r   r   r   Úexport_nameÚoutput_fileÚexport_kwargsÚ
onnx_modelÚnotes_valueÚexistingÚmetas                     r(   Úexport_onnxrH   4   sž  € ñJ ä—w‘w×'Ñ'¬¯©×(8Ñ(8¸Ó(FÓGÈÑJˆÙ4A˜˜ iÑ0À|‰á*7Ñ&Ð=NˆÜ—'‘'—,‘,˜z¨k¨]¸%Ð+@ÓA€Kô ˆu�hÔØ�‰Œà€MØ”7×$Ñ$¤U§Z¡Z×%6Ñ%6Ó7×BÑBÑBð #(ˆ�hÑä	‡J�J×ÑØØØðð  Ø!ØØ$)Ø ØØ#Ø!ñð òð ÐœTÐ-ô —Y‘Y˜{Ó+ˆ
ô  *¨%´Ô5‘e¼4¿:¹:ÀeÐW\Ô;]ˆÜÑY J×$=Ñ$=ÔYÐ[_Ó`ˆØÐØ(ˆH�Nà×,Ñ,×0Ñ0Ó2ˆDØ%ˆDŒHØ$ˆDŒJÜ�	‰	�*˜kÔ*ä
‡K�KÐ6°{°mÐDÔEØÐó    Úonnx_dirÚforcec                 óÆ  — ddl }ddl}| j                  dd«      }t        j                  j                  |«      r|s|S t        |t        j                  «      r|g}t        j                  d| › �«       t        | «      }|j                  d«       |j                  «        |j                  d«       |j                  |«       t        ||«      D ��	ci c]2  \  }}	||	j                  «       j!                  «       j#                  «       “Œ4 }
}}	|j%                  |d|
d	¬
«      \  }}|r |j&                  ||«       nt)        d«      ‚t        j                  d|› �«       |S c c}	}w )ad  Optimize and simplify an ONNX graph.

    Args:
        onnx_dir: Path to the source ONNX model.
        input_names: Input names matching the exported graph.
        input_tensors: Input tensor sample(s) used by the simplifier.
        force: Whether to overwrite an existing simplified model.

    Returns:
        Path to the simplified ONNX model.
    r   Nr   z	.sim.onnxzstart simplify ONNX model: zModel: originalzModel: optimizedé   F)Úcheck_nÚ
input_dataÚdynamic_input_shapezFailed to simplify ONNX model.z$Successfully simplified ONNX model: )r3   ÚonnxsimÚreplacer*   r+   Úisfiler6   r2   ÚTensorr?   r@   ÚOnnxOptimizerÚ
common_optÚ	save_onnxÚzipÚdetachÚcpuÚnumpyÚsimplifyr>   ÚRuntimeError)rJ   r   r   rK   r3   rQ   Úsim_onnx_dirÚoptÚnameÚtensorÚ
input_dictÚ	model_optÚcheck_oks                r(   Úonnx_simplifyre   Ž   s1  € ó" Ûà×#Ñ# G¨[Ó9€LÜ	‡w�w‡~�~�lÔ#©EØÐä�-¤§¡Ô.Ø&˜ˆä
‡K�KÐ-¨h¨ZÐ8Ô9Ü
˜Ó
!€CØ‡H�HÐÔØ‡N�NÔØ‡H�HÐÔ Ø‡M�M�,ÔÜJMÈkÐ[hÓJi×j¹,¸$À�$˜Ÿ™›×+Ñ+Ó-×3Ñ3Ó5Ñ5Ðj€JÑjØ!×*Ñ*¨<ÀÈzÐotÐ*ÓuÑ€IˆxÙØˆ�	‰	�)˜\Õ*äÐ;Ó<Ð<Ü
‡K�KÐ6°|°nÐEÔFØÐùó ks   Ã7Ec                   óÒ   — e Zd Zdd„Zd„ Zdefd„Zdefd„Zdd„Zdd„Z	dd	„Z
d d
edefd„Zd d
edefd„Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd!d„Zd!d„Zd!d„Zd!d„Zd„ Zd„ Zd„ Zd„ Zd„ Zy)"rU   Nc                 óà  — g }t         €|j                  d«       t        €|j                  d«       t        �t        €|j                  d«       t
        €|j                  d«       |r dj                  |«      }t        d|› d�«      ‚|€t        j                  }t        |t        «      r| j                  |«      }n|}t        j                  |«      | _        || _        | j                  |«       y )Nr3   zonnx.shape_inferenceÚonnx_graphsurgeonz-polygraphy.backend.onnx.loader.fold_constantsz, z&ONNX export dependencies are missing (z)). Install with: pip install rfdetr[onnx])r3   Úappendr   Úgsr	   r
   r.   ÚImportErrorÚINFOr6   r7   Ú	load_onnxÚimport_onnxÚgraphÚseverityÚset_severity)ÚselfÚinputrp   Úmissing_depsÚmissing_strÚ
onnx_graphs         r(   Ú__init__zOnnxOptimizer.__init__¿   sÛ   € ØˆÜˆ<Ø×Ñ Ô'ÜÐ"Ø×ÑÐ 6Ô7Üˆ:œÐ)Ø×ÑÐ 3Ô4ÜÐ!Ø×ÑÐ OÔPÙØŸ)™) LÓ1ˆKÜØ8¸¸ÐEnÐoóð ð ÐÜ—}‘}ˆHÜ�eœSÔ!ØŸ™¨Ó.‰JàˆJÜ—^‘^ JÓ/ˆŒ
Ø ˆŒØ×Ñ˜(Õ#rI   c                 ó   — |t         _        y ©N)r	   rp   )rr   rp   s     r(   rq   zOnnxOptimizer.set_severityØ   s
   € Ø$ŒÕrI   Ú	onnx_pathc                 ó²   — t         j                  j                  |«      s
J d|› �«       ‚t        j                  |«      }t        j                  d|› �«       |S )zLoad onnx from file.znot found onnx file: zload onnx file: )r*   r+   rS   r3   r5   r	   r@   ©rr   rz   rv   s      r(   rm   zOnnxOptimizer.load_onnxÛ   sM   € ä�w‰w�~‰~˜iÔ(ÐMÐ,AÀ)ÀÐ*MÓMÐ(Ü—Y‘Y˜yÓ)ˆ
Ü�‰Ð(¨¨Ð4Ô5ØÐrI   c                 óž   — t        j                  | j                  «      }t        j                  d|› �«       t        j                  ||«       y )Nzsave onnx file: )rj   rH   ro   r	   r@   r3   r>   r|   s      r(   rW   zOnnxOptimizer.save_onnxâ   s6   € Ü—^‘^ D§J¡JÓ/ˆ
Ü�‰Ð(¨¨Ð4Ô5Ü�	‰	�*˜iÕ(rI   c                 óX  — t        j                  |› dt        | j                  j                  «      › dt        | j                  j                  «       j                  «       «      › dt        | j                  j                  «      › dt        | j                  j                  «      › d�
«       y )Nz .. z nodes, z
 tensors, z	 inputs, z outputs)	r	   r   Úlenro   ÚnodesÚtensorsÚkeysÚinputsÚoutputs)rr   Úprefixs     r(   r@   zOnnxOptimizer.infoç   sƒ   € Ü×ÑØˆh�dœ3˜tŸz™z×/Ñ/Ó0Ð1°Ü�4—:‘:×%Ñ%Ó'×,Ñ,Ó.Ó/Ð0°
Ü�4—:‘:×$Ñ$Ó%Ð& i´°D·J±J×4FÑ4FÓ0GÐ/HÈðRõ	
rI   c                 ó–   — | j                   j                  «       j                  «        |rt        j                  | j                   «      S y ry   )ro   ÚcleanupÚtoposortrj   rH   )rr   Úreturn_onnxs     r(   r‡   zOnnxOptimizer.cleanupî   s6   € Ø�
‰
×ÑÓ×%Ñ%Ô'ÙÜ—>‘> $§*¡*Ó-Ð-ð rI   c                 óâ   — |D �cg c]  }| j                   j                  |   ‘Œ c}| j                   _        |r2t        |«      D ]#  \  }}|| j                   j                  |   _        Œ% y y c c}w ry   )ro   r„   Ú	enumerater`   )rr   ÚkeepÚnamesÚoÚir`   s         r(   Úselect_outputszOnnxOptimizer.select_outputsó   se   € Ø=AÖB¸˜dŸj™j×0Ñ0°Ó3ÒBˆ�
‰
ÔÙÜ$ UÓ+ò 2‘��4Ø-1�—
‘
×"Ñ" 1Ñ%Õ*ñ2ð ùò Cs   … A,r`   r   c                 óº   — t        |j                  «      D ]/  \  }}t        |t        «      r|j                  |k(  r|}Œ(||k(  sŒ.|}Œ1 dk\  sJ d|› d|› d�«       ‚|S )Nr   ú
not found ú(z) in node.inputs)r‹   rƒ   r6   r7   r`   ©rr   Únoder`   r<   r�   ÚinpÚindexs          r(   Úfind_node_inputzOnnxOptimizer.find_node_inputù   sl   € Ü §¡Ó,ò 	‰FˆAˆsÜ˜$¤Ô$¨¯©°TÒ)9Ø‘Ø˜“Ø‘ð		ð
 ˜ŠzÐF˜Z¨ v¨Q¨u¨gÐ5EÐFÓFˆzØˆrI   c                 óº   — t        |j                  «      D ]/  \  }}t        |t        «      r|j                  |k(  r|}Œ(||k(  sŒ.|}Œ1 dk\  sJ d|› d|› d�«       ‚|S )Nr   r’   r“   z) in node.outputs)r‹   r„   r6   r7   r`   r”   s          r(   Úfind_node_outputzOnnxOptimizer.find_node_output  sl   € Ü §¡Ó-ò 	‰FˆAˆsÜ˜$¤Ô$¨¯©°TÒ)9Ø‘Ø˜“Ø‘ð		ð
 ˜ŠzÐG˜Z¨ v¨Q¨u¨gÐ5FÐGÓGˆzØˆrI   c                 ót  — t         j                  D ]  } || «       | j                  «        Œ t        t	        j
                  | j                  «      d¬«      }|j                  «       dkD  rt        d«      ‚t        j                  |«      }t	        j                  |«      | _        | j                  «        |r|S y )NF)Ú!allow_onnxruntime_shape_inferencel        z-ERROR: model size exceeds supported 2GB limit)r   Ú
_OPTIMIZERr‡   r
   rj   rH   ro   ÚByteSizeÚ	TypeErrorr   Úinfer_shapesrn   )rr   r‰   Úfnrv   s       r(   rV   zOnnxOptimizer.common_opt  s—   € Ü*×5Ñ5ò 	ˆBÙˆtŒHØ�L‰L�Nð	ô $¤B§N¡N°4·:±:Ó$>ÐbgÔhˆ
Ø×ÑÓ  :Ò-ÜÐKÓLÐLä(×5Ñ5°jÓAˆJÜ—^‘^ JÓ/ˆŒ
Ø�‰ŒÙØÐð rI   c           
      ó  — d}| j                   j                  D �]`  }|j                  dk(  sŒt        |j                  «      dk(  sŒ-|j
                  dz   }|j                  «       j                  «       j                  d«      }|j                  «       }t        j                  |dz   t        j                  dg¬«      }t        j                  d	|d
z   |j                  d   g|g¬«      }t        j                  |dz   t        j                  dgt        j                  ¬«      ¬«      }t        j                  |dz   t        j                  dgt        j                  ¬«      ¬«      }	t        j                  |dz   t        j                  dgt        j                  ¬«      ¬«      }
t        j                  |dz   t        j                  dg¬«      }t        j                  d|dz   ||	|
|g|g¬«      }t        j                  |dz   t        j                  dg¬«      }t        j                  d	|dz   |j                  d   g|g¬«      }t        j                  |dz   t        j                  dg¬«      }t        j                  d|dz   |||	|g|g¬«      }t        j                  |dz   t        j                  dg¬«      }t        j                  d|dz   ddi||g|g¬«      }t        j                  j!                  «       }t        j                  d|dz   |j"                  |j                  d   |||g|j                  d   g¬«      }| j                   j                  j%                  ||||||g«       g |_        g |_        |dz  }�Œc | j'                  «        |S )a   This function loops through the graph looking for Resize nodes that uses scales for resize (has 3 inputs).

        It substitutes found Resize with Resize that takes the size of the output tensor instead of scales. It adds
        Shape->Slice->Concat         Shape->Slice----^     subgraph to the graph to extract the shape of the output
        tensor. This fix is required for the dynamic shape support.
        r   ÚResizerM   ú/é   Úshape_hw_outé   )r`   ÚdtypeÚshapeÚShapeÚshape_hw©Úopr`   rƒ   r„   Ú
const_zero©r¨   ©r`   ÚvaluesÚ	const_twoé   Ú
const_fourÚslice_hw_outÚSliceÚslice_hwÚshape_bc_outÚshape_bcÚslice_bc_outÚslice_bcÚconcat_bchw_outÚConcatÚconcat_bchwÚaxis©r­   r`   Úattrsrƒ   r„   Úresize_bchw)ro   r€   r­   r   rƒ   r`   rŽ   r�   rj   ÚVariableÚnpÚint64ÚNoder„   ÚConstantÚarrayÚemptyrÁ   Úextendr‡   )rr   Úresized_node_countr•   r`   Úadd_nodeÚdiv_noder¦   r«   r®   r²   r´   rµ   r·   r¸   r¹   rº   r»   r¼   r¾   Únone_varrÂ   s                        r(   Ú
resize_fixzOnnxOptimizer.resize_fix  s$  € ð ÐØ—J‘J×$Ñ$ó =	(ˆDØ�w‰w˜(Ó"¤s¨4¯;©;Ó'7¸1Ó'<Ø—y‘y 3‘�àŸ6™6›8Ÿ:™:›<Ÿ>™>¨!Ó,�ØŸ6™6›8�ä!Ÿ{™{°°~Ñ0EÌRÏXÉXÐ^_Ð]`Ôa�ÜŸ7™7Ø T¨JÑ%6À×@PÑ@PÐQRÑ@SÐ?TÐ_kÐ^lô�ô  Ÿ[™[¨d°\Ñ.AÌ"Ï(É(ÐTUÐSVÔ^`×^fÑ^fÔJgÔh�
ÜŸK™K¨T°KÑ-?ÌÏÉÐRSÐQTÔ\^×\dÑ\dÔHeÔf�	ÜŸ[™[¨d°\Ñ.AÌ"Ï(É(ÐTUÐSVÔ^`×^fÑ^fÔJgÔh�
ä!Ÿ{™{°°~Ñ0EÌRÏXÉXÐ^_Ð]`Ôa�ÜŸ7™7ØØ 
Ñ*Ø(¨)°ZÀÐLØ)˜Nô	�ô  "Ÿ{™{°°~Ñ0EÌRÏXÉXÐ^_Ð]`Ôa�ÜŸ7™7Ø T¨JÑ%6À×@PÑ@PÐQRÑ@SÐ?TÐ_kÐ^lô�ô  "Ÿ{™{°°~Ñ0EÌRÏXÉXÐ^_Ð]`Ôa�ÜŸ7™7ØØ 
Ñ*Ø(¨*°iÀÐLØ)˜Nô	�ô #%§+¡+°4Ð:KÑ3KÔSU×S[ÑS[ÐdeÐcfÔ"g�Ü Ÿg™gØØ Ñ-Ø! 1˜+Ø(¨,Ð7Ø,Ð-ô�ô Ÿ;™;×,Ñ,Ó.�ä Ÿg™gØØ Ñ-ØŸ*™*Ø ŸK™K¨™N¨H°hÀÐPØ!Ÿ\™\¨!™_Ð-ô�ð —
‘
× Ñ ×'Ñ'¨°8¸XÀxÐQ\Ð^iÐ(jÔkà �”Ø!�”à" aÑ'Ò"ð{=	(ð~ 	�‰ŒØ!Ð!rI   c                 óN  — d}| j                   j                  D ]y  }|j                  dv sŒt        |j                  d   t
        j                  j                  j                  «      sŒN|j                  d   }|j                  d   }||g|_        |dz  }Œ{ | j                  «        |S )Nr   )ÚAddr¥   )
ro   r€   r­   r6   rƒ   rj   Úirra   rÇ   r‡   )rr   Úadjusted_add_node_countr•   ra   Úbiass        r(   ÚadjustAddNodezOnnxOptimizer.adjustAddNodec  s�   € Ø"#ÐØ—J‘J×$Ñ$ò 	-ˆDà�w‰w˜'Ò!¤j°·±¸Q±ÄÇÁÇÁ×AVÑAVÕ&WØŸ™ Q™�Ø—{‘{ 1‘~�Ø% t˜n�”Ø'¨1Ñ,Ñ'ð	-ð 	�‰ŒØ&Ð&rI   c                 ó$  — d}| j                   j                  D �]ã  }|j                  dk(  sŒ|j                  dz   }|j                  d   }|j
                  d   }t        j                  |dz   ¬«      }t        j                  d|dz   dd	gi|g|g¬
«      }t        j                  |dz   ¬«      }t        j                  d|dz   i ||g|g¬
«      }	t        j                  |dz   ¬«      }
t        j                  |dz   t        j                  dgt        j                  ¬«      ¬«      }t        j                  d|dz   i ||g|
g¬
«      }t        j                  |dz   ¬«      }t        j                  d|dz   dd	gi|
g|g¬
«      }t        j                  |dz   ¬«      }t        j                  |dz   t        j                  |j                  d   gt        j                  ¬«      ¬«      }t        j                  d|dz   i ||g|g¬
«      }t        j                  |dz   ¬«      }t        j                  d|dz   i |g|g¬
«      }t        j                  |dz   ¬«      }t        j                  d |d!z   i ||g|g¬
«      }t        j                  d"t        |«      z   t        j                  |j                  d#   j                  d   j                  d$   j                   j#                  d#d%d#«      «      «      }t        j                  d&t        |«      z   t        j                  |j                  d'   j                  d   j                  d$   j                   j#                  d#d%d#«      «      «      }t        j                  |d(z   ¬«      }t        j                  d)|d*z   i ||g|g¬
«      }t        j                  d|d+z   i ||g|g¬
«      }| j                   j                  j%                  ||	|||||||g	«       g |_        g |_        |d#z  }�Œæ | j'                  «        |S ),Nr   ÚInstanceNormalizationr¤   Úmean_out)r`   Ú
ReduceMeanÚ	mean_nodeÚaxeséÿÿÿÿrÀ   Úsub_outÚSubÚsub_nodeÚpow_outÚ	pow_constg       @r¯   r°   ÚPowÚpow_nodeÚ	mean2_outÚ
mean2_nodeÚepsilon_outÚepsilon_constÚepsilonrÑ   Úepsilon_nodeÚsqrt_outÚSqrtÚ	sqrt_nodeÚdiv_outÚDivrÍ   zInstanceNormScaleV-r¥   r<   é    zInstanceBiasV-r³   Úmul_outÚMulÚmul_noderÌ   )ro   r€   r­   r`   rƒ   r„   rj   rÃ   rÆ   rÇ   rÄ   rÈ   Úfloat32rÁ   r7   Úascontiguousarrayr±   ÚreshaperÊ   r‡   )rr   Úremoved_instance_norm_countr•   r`   Úinput_tensorÚoutput_tensorrØ   rÚ   rÝ   rß   rà   rá   rã   rä   rå   ræ   rç   ré   rê   rì   rí   rÍ   Úconstant_scaleÚconstant_biasrð   rò   rÌ   s                              r(   Údecompose_instancenormsz%OnnxOptimizer.decompose_instancenormsp  sô  € Ø&'Ð#Ø—J‘J×$Ñ$ó E	1ˆDØ�w‰wÐ1Ó1Ø—y‘y 3‘�Ø#Ÿ{™{¨1™~�Ø $§¡¨Q¡�ÜŸ;™;¨D°:Ñ,=Ô>�ÜŸG™GØ#Ø Ñ+Ø! B 4˜.Ø(˜>Ø%˜Jô�	ô Ÿ+™+¨4°)Ñ+;Ô<�ÜŸ7™7Ø 4¨*Ñ#4¸BÈÐV^ÐG_ÐjqÐirô�ô Ÿ+™+¨4°)Ñ+;Ô<�ÜŸK™K¨T°KÑ-?ÌÏÉÐRUÐQVÔ^`×^hÑ^hÔHiÔj�	ÜŸ7™7Ø 4¨*Ñ#4¸BÈÐQZÐG[ÐfmÐenô�ô ŸK™K¨T°KÑ-?Ô@�	ÜŸW™WØ#Ø Ñ,Ø! B 4˜.Ø#˜9Ø&˜Kô�
ô !Ÿk™k¨t°mÑ/CÔD�Ü "§¡Ø Ñ/¼¿¹À$Ç*Á*ÈYÑBWÐAXÔ`b×`jÑ`jÔ8kô!�ô  "Ÿw™wØØ Ñ.ØØ% }Ð5Ø(˜Mô �ô Ÿ;™;¨D°:Ñ,=Ô>�ÜŸG™GØ D¨;Ñ$6¸bÈ+ÈÐaiÐ`jô�	ô Ÿ+™+¨4°)Ñ+;Ô<�ÜŸ7™7Ø 4¨*Ñ#4¸BÈÐQYÐGZÐelÐdmô�ô "$§¡Ø)¬CÐ0KÓ,LÑLÜ×(Ñ(¨¯©°Q©×)>Ñ)>¸qÑ)A×)GÑ)GÈÑ)P×)WÑ)W×)_Ñ)_Ð`aÐceÐghÓ)iÓjó"�ô !#§¡Ø$¤sÐ+FÓ'GÑGÜ×(Ñ(¨¯©°Q©×)>Ñ)>¸qÑ)A×)GÑ)GÈÑ)P×)WÑ)W×)_Ñ)_Ð`aÐceÐghÓ)iÓjó!�ô Ÿ+™+¨4°)Ñ+;Ô<�ÜŸ7™7Ø 4¨*Ñ#4¸BÈÐQ_ÐG`ÐkrÐjsô�ô Ÿ7™7Ø 4¨*Ñ#4¸BÈÐQ^ÐG_ÐjwÐixô�ð —
‘
× Ñ ×'Ñ'Ø ¨(°JÀÈiÐYaÐckÐmuÐvôð !�”Ø!�”Ø+¨qÑ0Ò+ðKE	1ðN 	�‰ŒØ*Ð*rI   c                 óò  — d}| j                   j                  D �]@  }|j                  dk(  sŒ|j                  g k7  sŒ$|j	                  «       j                  dk(  sŒB|j	                  d«      j                  dk(  sŒa|j	                  «       j	                  «       |j	                  d«      k(  sŒ’|j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       j                  dk(  s�Œ=|j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       j                  dk(  s�Œöt        |j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       j                  d   j                  j                  «      dk(  s�Œ—|j                  d   }|j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       }|j                  D �cg c]0  }t        |t        j                  j                  j                  «      ‘Œ2 c}j                  d	«      }t        j                   t#        |j                  |   j                  j%                  «       «      t        j&                  ¬
«      }t        j                  dt)        |«      z   t        j*                  |j-                  d«      «      «      }|j	                  «       }	|	j                  D �cg c]0  }t        |t        j                  j                  j                  «      ‘Œ2 c}j                  d	«      }t        j                   t#        |	j                  |   j                  j%                  «       «      t        j&                  ¬
«      }
t        j                  dt)        |«      z   t        j*                  |
j-                  d«      «      «      }|j	                  «       j	                  «       j	                  «       j	                  «       j	                  «       j                  d   j                  j%                  «       d   }|	j	                  «       j                  dk(  r!d	}|	j	                  «       j	                  «       }nd}|	}|j	                  «       j                  dk(  r|j	                  «       }|||g}t        j.                  dt)        |«      z   t        j0                  t        j2                  «      |j                  «      }t        j4                  ddt)        |«      z   ||gt7        d|fdt9        |«      fg«      ¬«      }| j                   j                  j;                  |«       | j                   j                  D ]U  }|j                  d   |j                  v sŒ|j                  j                  |j                  d   «      }||j                  |<   ŒW g |_        g |_        |dz  }�ŒC | j=                  «        |S c c}w c c}w )Nr   ÚReshaperÙ   r¥   rÞ   rñ   rÑ   rM   Tr¯   zgroupNormGamma-rÜ   zgroupNormBeta-ÚSigmoidFÚCastzGroupNormV-Ú	GroupNormzGroupNormN-rè   ÚbSwish)rƒ   r„   rÁ   )ro   r€   r­   r„   rŽ   r   rƒ   r±   r©   r6   rj   rÒ   ra   rÇ   r—   rÄ   rÈ   r   Útolistró   r7   rô   rõ   rÃ   r¨   Úfloat16rÆ   r   Úintri   r‡   )rr   Úgroup_norm_plugin_countr•   r÷   Ú
gamma_noder–   r—   ÚgammaÚconstant_gammaÚ	beta_nodeÚbetaÚconstant_betarè   Ú	use_swishÚ	last_nodeÚ
input_listÚgroup_norm_vÚgroup_norm_nrß   s                      r(   Úinsert_groupnorm_pluginz%OnnxOptimizer.insert_groupnorm_plugin¼  sS  € Ø"#ÐØ—J‘J×$Ñ$ó ;	-ˆDà—‘˜9Ó$Ø—L‘L BÓ&Ø—F‘F“H—K‘K <Ó/Ø—F‘F˜1“I—L‘L EÓ)Ø—F‘F“H—J‘J“L D§F¡F¨1£IÓ-Ø—F‘F“H—J‘J“L—N‘NÓ$×&Ñ&Ó(×*Ñ*Ó,×.Ñ.Ó0×2Ñ2Ó4×6Ñ6Ó8×:Ñ:Ó<×>Ñ>Ó@×BÑBÓD×GÑGÈ5ÔPØ—F‘F“H—J‘J“L—N‘NÓ$×&Ñ&Ó(×*Ñ*Ó,×.Ñ.Ó0×2Ñ2Ó4×6Ñ6Ó8×:Ñ:Ó<×>Ñ>Ó@×BÑBÓD×FÑFÓH×KÑKÈuÔTÜ˜Ÿ™›Ÿ
™
›Ÿ™Ó(×*Ñ*Ó,×.Ñ.Ó0×2Ñ2Ó4×6Ñ6Ó8×:Ñ:Ó<×CÑCÀAÑF×MÑM×SÑSÓTÐXYÔYð  $Ÿ{™{¨1™~�à!ŸV™V›XŸZ™Z›\Ÿ^™^Ó-×/Ñ/Ó1×3Ñ3Ó5×7Ñ7Ó9×;Ñ;Ó=×?Ñ?ÓA×CÑCÓE×GÑGÓI×KÑKÓM�
ØKU×K\ÑK\Ö]ÀCœ C¬¯©¯©×)>Ñ)>Õ?Ò]×cÑcÐdhÓi�ÜŸ™¤¨*×*;Ñ*;¸EÑ*B×*IÑ*I×*PÑ*PÓ*RÓ!SÔ[]×[eÑ[eÔf�Ü!#§¡Ø%¬Ð,CÓ(DÑDÄb×FZÑFZÐ[`×[hÑ[hÐikÓ[lÓFmó"�ð 'ŸL™L›N�	ØKT×K[ÑK[Ö\ÀCœ C¬¯©¯©×)>Ñ)>Õ?Ò\×bÑbÐcgÓh�Ü—x‘x¤¨×)9Ñ)9¸%Ñ)@×)GÑ)G×)NÑ)NÓ)PÓ QÔY[×YcÑYcÔd�Ü "§¡Ø$¤sÐ+BÓ'CÑCÄR×EYÑEYÐZ^×ZfÑZfÐgiÓZjÓEkó!�ð Ÿ&™&›(Ÿ*™*›,Ÿ.™.Ó*×,Ñ,Ó.×0Ñ0Ó2×9Ñ9¸!Ñ<×CÑC×JÑJÓLÈQÑO�à—;‘;“=×#Ñ# yÒ0Ø $�IØ )§¡£§¡Ó 1‘Ià %�IØ )�Ià—;‘;“=×#Ñ# vÒ-Ø )§¡£�IØ*¨N¸MÐJ�
Ü!Ÿ{™{Ø!¤CÐ(?Ó$@Ñ@Ä"Ç(Á(Ì2Ï:É:ÓBVÐXd×XjÑXjó �ô  "Ÿw™wØØ!¤CÐ(?Ó$@Ñ@Ø%Ø)˜NÜ%¨	°7Ð';¸hÌÈIËÐ=WÐ&XÓYô �ð —
‘
× Ñ ×'Ñ'¨Ô5à $§
¡
× 0Ñ 0ò >�HØ ×(Ñ(¨Ñ+¨x¯©Ò>Ø (§¡× 5Ñ 5°i×6GÑ6GÈÑ6JÓ K˜Ø1=˜Ÿ™¨Ò.ð>ð !�”Ø$&�	Ô!Ø'¨1Ñ,Ò'ðw;	-ðz 	�‰ŒØ&Ð&ùò] ^ùò ]s   Í)5]/Ñ%5]4c           	      ó&  — d}| j                   j                  D �]Z  }|j                  dk(  sŒ|j                  «       j                  dk(  sŒ2|j                  «       j                  d   |j                  d   k(  sŒ`|j                  «       j                  d«      j                  dk(  sŒ�|j                  «       j                  d«      j                  dk(  sŒº|j                  «       j                  d«      j                  «       j                  dk(  sŒõ|j                  «       j                  d«      j                  «       j                  «       j                  dk(  s�Œ?|j                  «       j                  d«      j                  «       j                  «       j                  «       j                  dk(  s�Œ—|j                  «       j                  d«      j                  «       j                  «       j                  «       j                  «       j                  dk(  s�Œý|j                  «       j                  d«      j                  «       j                  «       j                  «       j                  «       |j                  «       j                  d«      k(  s�Œv|j                  «       j                  d«      j                  «       j                  «       j                  «       j                  «       j                  «       j                  d	k(  s�Œê|j                  «       j                  d«      j                  «       j                  «       j                  «       j                  «       j                  «       j                  «       j                  dk(  s�Œlt        |j                  «       j                  d«      j                  «       j                  «       j                  «       j                  «       j                  «       j                  d   j                  j                  «      dk(  s�Œ |j                  «       j                  dk(  r|j                  d   }n|j                  «       j                  d   }|j                  «       j                  «       j                  «       j                  «       j                  «       j                  «       j                  «       }|j                  D �cg c]0  }t        |t        j                  j                  j                  «      ‘Œ2 c}j                  d
«      }t        j                   t#        |j                  |   j                  j%                  «       «      t        j&                  ¬«      }t        j                  dt)        |«      z   t        j*                  |j-                  d«      «      «      }|j                  «       }	|	j                  D �cg c]0  }t        |t        j                  j                  j                  «      ‘Œ2 c}j                  d
«      }t        j                   t#        |	j                  |   j                  j%                  «       «      t        j&                  ¬«      }
t        j                  dt)        |«      z   t        j*                  |
j-                  d«      «      «      }|||g}t        j.                  dt)        |«      z   t        j0                  t        j&                  «      |j                  «      }t        j2                  ddt)        |«      z   |t5        dg«      |g¬«      }| j                   j                  j7                  |«       |dz  }|	j8                  d   | j                   j8                  v rM| j                   j8                  j                  |	j8                  d   «      }|| j                   j8                  |<   �Œ¶|	j                  «       j                  dk(  r|	j                  «       }n|	}| j                   j                  D ]U  }|j8                  d   |j                  v sŒ|j                  j                  |j8                  d   «      }||j                  |<   ŒW g |_        �Œ] | j;                  «        |S c c}w c c}w )Nr   rÙ   rÞ   râ   r¥   rî   rÑ   rë   rñ   Tr¯   zLayerNormGamma-rÜ   zLayerNormBeta-zLayerNormV-Ú	LayerNormzLayerNormN-)rè   gñhãˆµøä>)rƒ   rÁ   r„   rÿ   )ro   r€   r­   rŽ   rƒ   r   r±   r©   r�   r6   rj   rÒ   ra   rÇ   r—   rÄ   rÈ   r   r  ró   r7   rô   rõ   rÃ   r¨   rÆ   r   ri   r„   r‡   )rr   Úlayer_norm_plugin_countr•   r÷   r  r–   r—   r  r  r	  r
  r  r  Úlayer_norm_vÚlayer_norm_nr  rß   s                    r(   Úinsert_layernorm_pluginz%OnnxOptimizer.insert_layernorm_pluginþ  sô  € Ø"#ÐØ—J‘J×$Ñ$ó =	+ˆDà—‘˜<Ó'Ø—F‘F“H—K‘K 5Ó(Ø—F‘F“H—O‘O AÑ&¨$¯+©+°a©.Ó8Ø—F‘F“H—J‘J˜q“M×$Ñ$¨Ó-Ø—F‘F“H—J‘J˜q“M×$Ñ$¨Ó-Ø—F‘F“H—J‘J˜q“M—O‘OÓ%×(Ñ(¨LÓ8Ø—F‘F“H—J‘J˜q“M—O‘OÓ%×'Ñ'Ó)×,Ñ,°Ô5Ø—F‘F“H—J‘J˜q“M—O‘OÓ%×'Ñ'Ó)×+Ñ+Ó-×0Ñ0°FÔ:Ø—F‘F“H—J‘J˜q“M—O‘OÓ%×'Ñ'Ó)×+Ñ+Ó-×/Ñ/Ó1×4Ñ4¸Ô=Ø—F‘F“H—J‘J˜q“M—O‘OÓ%×'Ñ'Ó)×+Ñ+Ó-×/Ñ/Ó1°T·V±V³X·Z±ZÀ³]ÔBØ—F‘F“H—J‘J˜q“M—O‘OÓ%×'Ñ'Ó)×+Ñ+Ó-×/Ñ/Ó1×3Ñ3Ó5×8Ñ8¸EÔAØ—F‘F“H—J‘J˜q“M—O‘OÓ%×'Ñ'Ó)×+Ñ+Ó-×/Ñ/Ó1×3Ñ3Ó5×7Ñ7Ó9×<Ñ<ÀÔEÜ˜Ÿ™›Ÿ
™
 1›Ÿ™Ó)×+Ñ+Ó-×/Ñ/Ó1×3Ñ3Ó5×7Ñ7Ó9×@Ñ@ÀÑC×JÑJ×PÑPÓQÐUVÔVà—6‘6“8—;‘; %Ò'Ø#'§;¡;¨q¡>‘Là#'§6¡6£8§?¡?°1Ñ#5�Là!ŸV™V›XŸZ™Z›\Ÿ^™^Ó-×/Ñ/Ó1×3Ñ3Ó5×7Ñ7Ó9×;Ñ;Ó=�
ØKU×K\ÑK\Ö]ÀCœ C¬¯©¯©×)>Ñ)>Õ?Ò]×cÑcÐdhÓi�ÜŸ™¤¨*×*;Ñ*;¸EÑ*B×*IÑ*I×*PÑ*PÓ*RÓ!SÔ[]×[eÑ[eÔf�Ü!#§¡Ø%¬Ð,CÓ(DÑDÄb×FZÑFZÐ[`×[hÑ[hÐikÓ[lÓFmó"�ð 'ŸL™L›N�	ØKT×K[ÑK[Ö\ÀCœ C¬¯©¯©×)>Ñ)>Õ?Ò\×bÑbÐcgÓh�Ü—x‘x¤¨×)9Ñ)9¸%Ñ)@×)GÑ)G×)NÑ)NÓ)PÓ QÔY[×YcÑYcÔd�Ü "§¡Ø$¤sÐ+BÓ'CÑCÄR×EYÑEYÐZ^×ZfÑZfÐgiÓZjÓEkó!�ð +¨N¸MÐJ�
Ü!Ÿ{™{Ø!¤CÐ(?Ó$@Ñ@Ä"Ç(Á(Ì2Ï:É:ÓBVÐXd×XjÑXjó �ô  "Ÿw™wØØ!¤CÐ(?Ó$@Ñ@Ø%Ü%Ð':Ð&;Ó<Ø)˜Nô �ð —
‘
× Ñ ×'Ñ'¨Ô5Ø'¨1Ñ,Ð'à×$Ñ$ QÑ'¨4¯:©:×+=Ñ+=Ñ=Ø ŸJ™J×.Ñ.×4Ñ4°Y×5FÑ5FÀqÑ5IÓJ�EØ0<�D—J‘J×&Ñ& uÓ-à —{‘{“}×'Ñ'¨6Ò1Ø$-§K¡K£M™	à$-˜	Ø$(§J¡J×$4Ñ$4ò B˜Ø$×,Ñ,¨QÑ/°8·?±?ÒBØ$,§O¡O×$9Ñ$9¸)×:KÑ:KÈAÑ:NÓ$O˜EØ5A˜HŸO™O¨EÒ2ðBð )+�IÖ%ð{=	+ð~ 	�‰ŒØ&Ð&ùòU ^ùò ]s   Ó5b	×5bc                 óÄ  — |j                   d   j                  }|j                   d   j                  }|j                  d   }|}	|j                  d   |	z  }
t        j                  |j                  ||	|
«      |j                  ||	|
«      g«      j                  |d|	z  |
z  «      }|j                   d   }|j                  d   }t        j                  dj                  |«      t        j                  |«      «      }t        j                  ddj                  |«      ||g|g¬«      }| j                  j                  j                  |«       ||j                  |«      j                   d<   ||j                  |«      j                   d<   t!        d|«      D ]R  }|j                  «       j                   j#                  «        |j                  «       j                   j#                  «        ŒT |j                  j#                  «        |j                  j#                  «        |j                   j#                  «        |j                   j#                  «        | j%                  «        |S )Nr¥   r   r³   zWeights_KV_{}ÚMatMulzMatMul_KV_{}r¬   ©rƒ   r±   r©   rÄ   Údstackrõ   r„   rj   rÇ   Úformatrô   rÆ   ro   r€   ri   rŽ   ÚrangeÚclearr‡   )rr   Únode_kÚnode_vÚfused_kv_idxÚheadsÚnum_dynamicÚ	weights_kÚ	weights_vÚchannel_countÚ	num_headsÚhead_dimÚ
weights_kvr÷   Úoutput_tensor_kÚconstant_weights_kvÚfused_kv_noder�   s                    r(   Úfuse_kvzOnnxOptimizer.fuse_kvB  sÿ  € à—M‘M !Ñ$×+Ñ+ˆ	à—M‘M !Ñ$×+Ñ+ˆ	à!Ÿ™¨Ñ*ˆàˆ	à—?‘? 1Ñ%¨Ñ2ˆô —Y‘Yà×!Ñ! -°¸HÓEØ×!Ñ! -°¸HÓEðó
÷
 ‰'�-  Y¡°Ñ!9Ó
:ð 	ð —}‘} QÑ'ˆà Ÿ.™.¨Ñ+ˆä Ÿk™k¨/×*@Ñ*@ÀÓ*NÔPR×PdÑPdÐeoÓPpÓqÐô Ÿ™ØØ×&Ñ& |Ó4Ø Ð"5Ð6Ø$Ð%ô	
ˆð 	�
‰
×Ñ×Ñ Ô.ð +:ˆ�‰�Ó×$Ñ$ QÑ'Ø*9ˆ�‰�Ó×$Ñ$ QÑ'Ü�q˜+Ó&ò 	&ˆAØ�H‰H‹J×Ñ×#Ñ#Ô%Ø�H‰H‹J×Ñ×#Ñ#Õ%ð	&ð
 	�‰×ÑÔØ�‰×ÑÔØ�‰×ÑÔØ�‰×ÑÔà�‰ŒØÐrI   c                 ó¤  — |j                  |«      j                  «       j                  d   }|j                  «       j                  d   }|j                  d   }	|j                  d   j                  d   j                  j                  «        |j                  d   j                  d   j                  j                  «        |j                  |«      j                  «       j                  j                  «        t	        d|«      D ]H  }
|j                  |
«      j                  «       j                  d«      j                  j                  «        ŒJ |j                  d   j
                  }|j                  d   |dz  z  }t        j                  dj                  |«      t        j                  t        j                  dd|d|gt        j                  ¬«      «      «      }t        j                  dj                  |«      t        j                  t        j                   «      d «      }t        j"                  ddj                  |«      ||g|g¬	«      }| j$                  j&                  j)                  |«       t        j"                  d
dj                  |«      ||g|	g¬	«      }| j$                  j&                  j)                  |«       ||j                  |«      j                  d<   |dkD  rÀt        j                  dj                  |«      t        j                  t        j                  «      d «      }t        j"                  ddj                  |«      |j                  d   g|g¬«      }| j$                  j&                  j)                  |«       ||j                  «       j                  d<   |j                  j                  «        | j+                  «        y )Nr   r¥   r³   zShape_KV_{}r¯   zReshapeKV_{}rý   ú
Reshape_{}r¬   ÚfMHCAzfMHCA_{}zReshape2_fmhca{}_outrª   zReshape2_fmhca{}_shape©rƒ   r„   )rŽ   rƒ   r„   r  r  r±   r©   rj   rÇ   r  rÄ   rô   rÈ   rÅ   rÃ   r¨   r  rÆ   ro   r€   ri   r‡   )rr   Únode_qÚnode_kvÚfinal_tranposeÚmhca_idxr"  r#  Úoutput_qÚ	output_kvÚoutput_final_tranposer�   r)  Údims_per_headr©   Úoutput_reshaperõ   ÚfmhcaÚreshape2_input1_outÚreshape2_input1_shapes                      r(   Úinsert_fmhcazOnnxOptimizer.insert_fmhcav  s  € ð —8‘8˜KÓ(×*Ñ*Ó,×3Ñ3°AÑ6ˆØ—I‘I“K×&Ñ& qÑ)ˆ	Ø .× 6Ñ 6°qÑ 9Ðð 	�‰˜Ñ×"Ñ" 1Ñ%×,Ñ,×2Ñ2Ô4Ø�‰˜Ñ×"Ñ" 1Ñ%×,Ñ,×2Ñ2Ô4Ø�‰�Ó×ÑÓ!×(Ñ(×.Ñ.Ô0Ü�q˜+Ó&ò 	0ˆAØ�H‰H�Q‹K�M‰M‹O×Ñ˜aÓ ×'Ñ'×-Ñ-Õ/ð	0ð —^‘^ AÑ&×-Ñ-ˆ
Ø"×(Ñ(¨Ñ+°¸±	Ñ:ˆô —‘Ø× Ñ  Ó*Ü× Ñ ¤§¡¨1¨a°¸¸=Ð*IÔQS×QYÑQYÔ!ZÓ[ó
ˆô Ÿ™ ^×%:Ñ%:¸8Ó%DÄbÇhÁhÌrÏzÉzÓFZÐ\`Óaˆä—'‘'Ø˜|×2Ñ2°8Ó<ÀiÐQVÐEWÐbpÐaqô
ˆð 	�
‰
×Ñ×Ñ Ô(ô —‘ØØ×"Ñ" 8Ó,Ø˜nÐ-Ø*Ð+ô	
ˆð 	�
‰
×Ñ×Ñ Ô&ð ,4ˆ�‰�Ó×%Ñ% aÑ(à˜Š?Ü"$§+¡+Ð.D×.KÑ.KÈHÓ.UÔWY×W_ÑW_Ô`b×`hÑ`hÓWiÐkoÓ"pÐÜ$&§G¡GØØ(×/Ñ/°Ó9ØŸ™ aÑ(Ð)Ø,Ð-ô	%Ð!ð �J‰J×Ñ×#Ñ#Ð$9Ô:Ø+>ˆN×ÑÓ×%Ñ% aÑ(ð 	×Ñ×$Ñ$Ô&à�‰�rI   c           	      ó  — |j                   d   j                  }|j                   d   j                  }|j                   d   j                  }	|j                  d   }
|}|j                  d   |z  }t        j                  |j                  |
||«      |j                  |
||«      |	j                  |
||«      g«      j                  |
d|z  |z  «      }|j                   d   }|j                  d   }t        j                  dj                  |«      t        j                  |«      «      }t        j                  ddj                  |«      ||g|g¬«      }| j                  j                  j                  |«       ||j                  |«      j                   d<   ||j                  |«      j                   d<   ||j                  |«      j                   d<   t!        d|«      D ]z  }|j                  «       j                   j#                  «        |j                  «       j                   j#                  «        |j                  «       j                   j#                  «        Œ| |j                  j#                  «        |j                  j#                  «        |j                  j#                  «        |j                   j#                  «        |j                   j#                  «        |j                   j#                  «        | j%                  «        |S )Nr¥   r   rM   zWeights_QKV_{}r  zMatMul_QKV_{}r¬   r  )rr   r2  r  r   Úfused_qkv_idxr"  r#  Ú	weights_qr$  r%  r&  r'  r(  Úweights_qkvr÷   r*  Úconstant_weights_qkvÚfused_qkv_noder�   s                      r(   Úfuse_qkvzOnnxOptimizer.fuse_qkv´  sy  € à—M‘M !Ñ$×+Ñ+ˆ	à—M‘M !Ñ$×+Ñ+ˆ	à—M‘M !Ñ$×+Ñ+ˆ	ð "Ÿ™¨Ñ*ˆàˆ	à—?‘? 1Ñ%¨Ñ2ˆô —i‘ià×!Ñ! -°¸HÓEØ×!Ñ! -°¸HÓEØ×!Ñ! -°¸HÓEðó
÷ ‰'�-  Y¡°Ñ!9Ó
:ð 	ð —}‘} QÑ'ˆà Ÿ.™.¨Ñ+ˆä!Ÿ{™{Ð+;×+BÑ+BÀ=Ó+QÔSU×SgÑSgÐhsÓStÓuÐô Ÿ™ØØ ×'Ñ'¨Ó6Ø Ð"6Ð7Ø$Ð%ô	
ˆð 	�
‰
×Ñ×Ñ Ô/ð +:ˆ�‰�Ó×$Ñ$ QÑ'Ø*9ˆ�‰�Ó×$Ñ$ QÑ'Ø*9ˆ�‰�Ó×$Ñ$ QÑ'Ü�q˜+Ó&ò 	&ˆAØ�H‰H‹J×Ñ×#Ñ#Ô%Ø�H‰H‹J×Ñ×#Ñ#Ô%Ø�H‰H‹J×Ñ×#Ñ#Õ%ð	&ð 	�‰×ÑÔØ�‰×ÑÔØ�‰×ÑÔà�‰×ÑÔØ�‰×ÑÔØ�‰×ÑÔà�‰ŒØÐrI   c                 óZ  — |j                  «       j                  d   }|j                  d   }|j                  d   j                  d   j                  j                  «        |j                  d   j                  d   j                  j                  «        |j                  d   j                  d   j                  j                  «        |j                  d   j                  }|j
                  d   |dz  z  }	t        j                  dj                  |«      t        j                  t        j                  dd|d|	gt        j                  ¬«      «      «      }
t        j                  dj                  |«      t        j                  t        j                  «      d «      }t        j                   dd	j                  |«      ||
g|g¬
«      }| j"                  j$                  j'                  |«       t        j                   ddj                  |«      |g|g¬
«      }| j"                  j$                  j'                  |«       |dkD  rÀt        j                  dj                  |«      t        j                  t        j                  «      d «      }t        j                   ddj                  |«      |j                  d   g|g¬«      }| j"                  j$                  j'                  |«       ||j                  «       j                  d<   |j                  j                  «        | j)                  «        y )Nr   r³   r¥   rM   zShape_QKV_{}r¯   zReshapeQKV_{}rý   r/  r¬   ÚfMHA_V2zfMHA_{}zReshape2_{}_outrª   zReshape2_{}_shaper1  )rŽ   rƒ   r„   r  r±   r©   rj   rÇ   r  rÄ   rô   rÈ   rÅ   rÃ   r¨   r  rÆ   ro   r€   ri   r‡   )rr   Únode_qkvr4  Úmha_idxr"  r#  Ú
output_qkvr8  rB  r9  r©   Úoutput_shaperõ   Úfmhar<  r=  s                   r(   Úinsert_fmhazOnnxOptimizer.insert_fmhað  s�  € à—Z‘Z“\×(Ñ(¨Ñ+ˆ
Ø .× 6Ñ 6°qÑ 9Ðð 	×Ñ˜Ñ×#Ñ# AÑ&×-Ñ-×3Ñ3Ô5Ø×Ñ˜Ñ×#Ñ# AÑ&×-Ñ-×3Ñ3Ô5Ø×Ñ˜Ñ×#Ñ# AÑ&×-Ñ-×3Ñ3Ô5à—o‘o aÑ(×/Ñ/ˆØ#×)Ñ)¨!Ñ,°¸±Ñ;ˆô —‘Ø×!Ñ! 'Ó*Ü× Ñ ¤§¡¨1¨a°¸¸=Ð*IÔQS×QYÑQYÔ!ZÓ[ó
ˆô —{‘{ ?×#9Ñ#9¸'Ó#BÄBÇHÁHÌRÏZÉZÓDXÐZ^Ó_ˆä—'‘'Ø˜|×2Ñ2°7Ó;ÀZÐQVÐDWÐbnÐaoô
ˆð 	�
‰
×Ñ×Ñ Ô(ô �w‰wØ˜y×/Ñ/°Ó8À,ÀÐZoÐYpô
ˆð 	�
‰
×Ñ×Ñ Ô%à˜Š?Ü"$§+¡+Ð.?×.FÑ.FÀwÓ.OÔQS×QYÑQYÔZ\×ZbÑZbÓQcÐeiÓ"jÐÜ$&§G¡GØÐ,×3Ñ3°GÓ<ÀhÇoÁoÐVWÑFXÐEYÐdwÐcxô%Ð!ð �J‰J×Ñ×#Ñ#Ð$9Ô:Ø+>ˆN×ÑÓ×%Ñ% aÑ(ð 	×Ñ×$Ñ$Ô&à�‰�rI   c                 ó&  — |j                   dk(  �r�t        |j                  «      dk(  �rh|rBt        |j                  d   j                  «      dkD  r|j	                  «       j                   dk(  s)|�s!t        |j                  d   j                  «      dk(  �rû|j                  «       j                   dk(  rM|j                  d«      j                   dk(  r#|j                  d«      j                   dk(  rdnd}nd}|r|n|dz   }nd}d}|j                  |«      }|j                   dk(  �rl|j                  «       j                   d	k(  �rN|j                  «       j                  «       j                   dk(  �r"|j                  «       j                  «       j                  «       j                   dk(  �rè|j                  «       j                  «       j                  «       j	                  d«      j                   d
k(  �rŸ|j                  «       j                  «       j                  «       j	                  d«      j                   dk(  �rV|j                  «       j                  «       j                  «       j	                  d«      j	                  «       j                   dk(  �rÿ|j                  «       j                  «       j                  «       j	                  d«      j	                  «       j	                  «       j                   dk(  �rš|j                  «       j                  «       j                  «       j	                  d«      j	                  «       j	                  «       j	                  d«      j                   dk(  �r&|j                  «       j                  «       j                  «       j	                  d«      j	                  «       j	                  «       j	                  d«      j                   d	k(  �r²|j                  «       j                  «       j                  «       j	                  d«      j	                  «       j	                  «       j	                  d«      j	                  «       j                   dk(  �r0|j                  «       j                  «       j                  «       j	                  d«      j	                  «       j	                  «       j	                  d«      j	                  «       j	                  «       j                   d	k(  �r |j                  «       j                  «       j                  «       j	                  d«      j	                  «       j	                  «       j	                  d«      j	                  «       j	                  «       j	                  «       j                   dk(  �r|j                  «       j                  «       j                  «       j	                  d«      j	                  «       j	                  «       j	                  d«      j	                  «       j	                  «       j	                  «       j	                  «       j                   dk(  �rV|j                  |j                  «       j                  «       j                  «       j	                  d«      j	                  «       j	                  «       j	                  d«      j	                  «       j	                  «       j	                  «       j	                  «       j                  k7  �r |j                  «       j                  «       j                  «       j	                  d«      j	                  «       j	                  «       j	                  d«      j	                  «       j	                  «       j	                  «       }|j                  «       j                  «       j                  «       j	                  d«      j	                  «       j	                  «       j	                  d«      j	                  «       j	                  «       j	                  «       j	                  «       }|}|j                  «       j                  «       j                  «       j                  |«      j                  «       }	|j                   dk(  r|	j                   d	k(  r	d||||||	fS y)Nr  r¥   r   rÑ   rª   r³   rM   rý   Ú	TransposeÚSoftmaxrñ   T)Fr   r   NNNN)r­   r   r„   rƒ   r�   rŽ   r`   )
rr   r•   ÚmhaÚnum_dynamic_kvÚnum_dynamic_qrŽ   r2  r  r   r4  s
             r(   Úmha_mhca_detectedzOnnxOptimizer.mha_mhca_detected!  sv  € ð
 �G‰G�xÓÜ�D—L‘LÓ! QÓ&áœ˜TŸ[™[¨™^×2Ñ2Ó3°aÒ7¸D¿F¹F»H¿K¹KÈ5Ò<PÚ¤ D§K¡K°¡N×$9Ñ$9Ó :¸aÓ ?ð �v‰v‹x�{‰{˜gÒ%Ø—6‘6˜!“9—<‘< 7Ò*Ø*.¯&©&°«)¯,©,¸'Ò*A¡QÀq‘Nà%&�Ná25¡¸>ÈAÑ;M‘à!"�Ø !�à—‘�~Ó&ˆAà—‘˜	Ó!Ø—C‘C“E—H‘H Ó+Ø—C‘C“E—G‘G“I—L‘L IÓ-Ø—C‘C“E—G‘G“I—K‘K“M×$Ñ$¨Ó0Ø—C‘C“E—G‘G“I—K‘K“M—O‘O AÓ&×)Ñ)¨YÓ6Ø—C‘C“E—G‘G“I—K‘K“M—O‘O AÓ&×)Ñ)¨YÓ6Ø—C‘C“E—G‘G“I—K‘K“M—O‘O AÓ&×(Ñ(Ó*×-Ñ-°Ó6Ø—C‘C“E—G‘G“I—K‘K“M—O‘O AÓ&×(Ñ(Ó*×,Ñ,Ó.×1Ñ1°XÓ=Ø—C‘C“E—G‘G“I—K‘K“M—O‘O AÓ&×(Ñ(Ó*×,Ñ,Ó.×0Ñ0°Ó3×6Ñ6¸)ÓCØ—C‘C“E—G‘G“I—K‘K“M—O‘O AÓ&×(Ñ(Ó*×,Ñ,Ó.×0Ñ0°Ó3×6Ñ6¸+ÓEØ—C‘C“E—G‘G“I—K‘K“M—O‘O AÓ&×(Ñ(Ó*×,Ñ,Ó.×0Ñ0°Ó3×5Ñ5Ó7×:Ñ:¸iÓGØ—C‘C“E—G‘G“I—K‘K“M—O‘O AÓ&×(Ñ(Ó*×,Ñ,Ó.×0Ñ0°Ó3×5Ñ5Ó7×9Ñ9Ó;×>Ñ>À+ÓMØ—C‘C“E—G‘G“I—K‘K“M—O‘O AÓ&×(Ñ(Ó*×,Ñ,Ó.×0Ñ0°Ó3×5Ñ5Ó7×9Ñ9Ó;×=Ñ=Ó?×BÑBÀiÓOØ—C‘C“E—G‘G“I—K‘K“M—O‘O AÓ&×(Ñ(Ó*×,Ñ,Ó.×0Ñ0°Ó3×5Ñ5Ó7×9Ñ9Ó;×=Ñ=Ó?×AÑAÓC×FÑFÈ(ÓRØ—I‘I §¡£§¡£§¡£§¡°Ó!3×!5Ñ!5Ó!7×!9Ñ!9Ó!;×!=Ñ!=¸aÓ!@×!BÑ!BÓ!D×!FÑ!FÓ!H×!JÑ!JÓ!L×!NÑ!NÓ!P×!UÑ!UÓUð Ÿ™›Ÿ™›Ÿ™›Ÿ™¨Ó+×-Ñ-Ó/×1Ñ1Ó3×5Ñ5°aÓ8×:Ñ:Ó<×>Ñ>Ó@×BÑBÓD�ØŸ™›Ÿ™›Ÿ™›Ÿ™¨Ó+×-Ñ-Ó/×1Ñ1Ó3×5Ñ5°aÓ8×:Ñ:Ó<×>Ñ>Ó@×BÑBÓD×FÑFÓH�Ø�Ø!"§¡£§¡£§¡£§¡°Ó!?×!AÑ!AÓ!C�à—9‘9 Ò(¨^×->Ñ->À+Ò-MØ °ÀÈÐPVÐXfÐfÐfØ2rI   c           	      ó¤  — | j                   j                  }t        |«      D ]¬  \  }}|dz   t        |«      kD  s|dz   t        |«      kD  rŒ)| j	                  ||   d¬«      \  }}}	}
}}}|sŒJ|dk(  s
||	dz   k(  sJ ‚|dk(  r#|
j
                  d   j                  d   |z  dk(  rŒ�| j                  |||||	«      }| j                  |
|||||«        y y)	Nr¥   r³   F©rQ  r   éK   é    T)	ro   r€   r‹   r   rT  rƒ   r©   r-  r>  )rr   r"  Ú
mhca_indexÚsmr€   ÚidxÚ_ÚdetectedrS  rR  r2  r  r   r4  r3  s                  r(   Úfuse_kv_insert_fmhcaz"OnnxOptimizer.fuse_kv_insert_fmhcaT  sÿ   € Ø—
‘
× Ñ ˆä Ó&ò 	‰FˆC�à�Q‰wœ˜U›Ò# s¨Q¡w´°U³Ò';Øð _c×^tÑ^tØ�c‘
 ð _uó _Ñ[ˆH�m ^°V¸VÀVÈ^ò Ø$¨Ò)¨]¸nÈqÑ>PÒ-PÐPÐPà˜’8 §¡¨aÑ 0× 6Ñ 6°qÑ 9¸UÑ BÀcÒ IØàŸ,™, v¨v°zÀ5È.ÓY�à×!Ñ! &¨'°>À:ÈuÐVcÔdÙð%	ð& rI   c           	      óD  — | j                   j                  }t        |«      D ]|  \  }}|dz   t        |«      kD  s|dz   t        |«      kD  rŒ)| j	                  ||   d¬«      \  }}}}	}
}}|sŒJ||k(  sJ ‚| j                  |	|
||||«      }| j                  |||||«        y y)Nr¥   r³   TrV  F)ro   r€   r‹   r   rT  rE  rM  )rr   r"  Ú	mha_indexr€   r[  r\  r]  rS  rR  r2  r  r   r4  rH  s                 r(   Úfuse_qkv_insert_fmhaz"OnnxOptimizer.fuse_qkv_insert_fmhal  sÉ   € Ø—
‘
× Ñ ˆä Ó&ò 	‰FˆC�à�Q‰wœ˜U›Ò# s¨Q¡w´°U³Ò';Øð _c×^tÑ^tØ�c‘
 ð _uó _Ñ[ˆH�m ^°V¸VÀVÈ^ò Ø$¨Ò6Ð6Ð6àŸ=™=¨°¸ÀÈEÐSaÓb�à× Ñ  ¨>¸9ÀeÈ^Ô\Ùð	ð  rI   c                 ób   — d}| j                  |||«      r|dz  }| j                  |||«      rŒ|S ©Nr   r¥   )r^  )rr   r'  rZ  rY  s       r(   Úinsert_fmhca_pluginz!OnnxOptimizer.insert_fmhca_plugin�  s<   € Øˆ
Ø×'Ñ'¨	°:¸rÔBØ˜!‰OˆJð ×'Ñ'¨	°:¸rÕBàÐrI   c                 ó^   — d}| j                  ||«      r|dz  }| j                  ||«      rŒ|S rc  )ra  )rr   r'  r`  s      r(   Úinsert_fmha_pluginz OnnxOptimizer.insert_fmha_plugin‡  s8   € Øˆ	Ø×'Ñ'¨	°9Ô=Ø˜‰NˆIð ×'Ñ'¨	°9Õ=àÐrI   ry   )Ú ©F)NN)r   )Ú__name__Ú
__module__Ú__qualname__rw   rq   r7   rm   rW   r@   r‡   r�   r  r˜   rš   rV   rÏ   rÕ   rû   r  r  r-  r>  rE  rM  rT  r^  ra  rd  rf  © rI   r(   rU   rU   ¾   s±   „ ó$ò2%ð 3ó ð) 3ó )ó

ó.ó
2ñ¨#ð ÀSó ñ¨3ð Àcó óòH"òT'òJ+òX@'òDB'óH2óh<ó|:óx/òb13òfò0ò*órI   rU   )FTé   Nrh  )'Ú__doc__r0   r8   r*   Úcollectionsr   Úcollections.abcr   r   Úcopyr   r   r[   rÄ   r2   r3   r   rk   rh   rj   Úonnx_graphsurgeon.logger.loggerr	   Úpolygraphy.backend.onnx.loaderr
   Úrfdetr.export._onnx.symbolicr   Úrfdetr.utilities.loggerr   r?   r7   ÚnnÚModulerT   r  ÚboolÚobjectrH   re   rU   rl  rI   r(   ú<module>rz     sà  ðñ 6ã Û Û 	Ý #ß -Ý Ý ã Û ðÛÝ$ð
Û"Ý8ð
Ý=õ BÝ .á	‹€ð  ØØØ#ðWð òWØ�h˜s‘mÑ#ðWà�8‰8�?‰?ðWð ˜#‘ðWð —<‘< (¨5¯<©<Ñ"8Ñ8ð	Wð
 ˜3‘-ðWð ˜#˜w s¨C xÑ0Ð0Ñ1°DÑ8ðWð ðWð ðWð ðWð ˜‘*ðWð ðWð 	óWð| ñ	(Øð(à˜#‘ð(ð —<‘< (¨5¯<©<Ñ"8Ñ8ð(ð ð	(ð
 	ó(÷`Mò MøðK ò Ø€DØ‚Oðûð ò Ø	€BØ‚Hðûð ò Ø‚Nðús4   ²
D ½
D ÁD% Ä	DÄDÄ	D"Ä!D"Ä%D/Ä.D/