Ë
    ÝÍ:j÷  ã                   ón   — d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	 d dl
mZ  ee«      Z G d„ de«      Zy)	é    )Ú	getLogger)ÚFusion)ÚNumpyHelper)Ú	NodeProtoÚTensorProtoÚhelper)Ú	OnnxModelc                   ó~   ‡ — e Zd Zdefˆ fd„Zdededz  fd„Zdededz  fd„Z	d	e
d
eeee
   f   deee
f   fd„Zˆ xZS )ÚFusionGemmFastGeluÚmodelc                 óF   •— t         ‰| �  |ddd«       d | _        d| _        y )NÚGemmFastGeluÚFastGeluF)ÚsuperÚ__init__Úshape_inferÚshape_infer_done)Úselfr   Ú	__class__s     €ú�/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/onnxruntime/transformers/fusion_gemmfastgelu.pyr   zFusionGemmFastGelu.__init__   s&   ø€ Ü‰Ñ˜ °
¸NÔKØˆÔØ %ˆÕó    Útensor_protoÚreturnNc                 ó´   — |j                   j                  j                  d«      r3t        |j                   j                  j                  j
                  «      S y )NÚshape)ÚtypeÚtensor_typeÚHasFieldÚlenr   Údim)r   r   s     r   Ú get_dimensions_from_tensor_protoz3FusionGemmFastGelu.get_dimensions_from_tensor_proto   sB   € Ø×Ñ×(Ñ(×1Ñ1°'Ô:Ü�|×(Ñ(×4Ñ4×:Ñ:×>Ñ>Ó?Ð?àr   Ú
input_namec                 ó0  — | j                   j                  |«      }|r| j                  |«      S | j                  s(| j                   j	                  d¬«      | _        d| _        | j
                  �(| j                  | j
                  j                  |   «      S y )NT)Úupdate)r   Úfind_graph_inputr!   r   Úinfer_runtime_shaper   Ú	known_vi_)r   r"   Úgraph_inputs      r   Úget_dimensionsz!FusionGemmFastGelu.get_dimensions   s‡   € Ø—j‘j×1Ñ1°*Ó=ˆÙØ×8Ñ8¸ÓEÐEà×$Ò$Ø#Ÿz™z×=Ñ=ÀTÐ=ÓJˆDÔØ$(ˆDÔ!à×ÑÐ'Ø×8Ñ8¸×9IÑ9I×9SÑ9SÐT^Ñ9_Ó`Ð`àr   ÚnodeÚinput_name_to_nodesÚoutput_name_to_nodec                 ó  — d}t        |j                  «      dk(  rd}| j                  j                  |dgdg«      }|€y|d   }d}d}d}	t	        |j                  «      D ]X  \  }
}| j                  j                  |«      }|€| j                  |j                  |
   «      }ŒB|
}t        j                  |«      }	ŒZ |	€yt        |	j                  «      dk7  ry|t        |	j                  «      k  ryd}|rqd}t	        |j                  «      D ];  \  }
}| j                  j                  |«      }|€Œ$|
}t        j                  |«      } n |€yt        |j                  «      dk7  ry||g}| j                  j                  ||j                  d   g||«      sy| j                  j                  |«       |r/|j                  d|z
     |j                  |   |j                  |   gn |j                  d|z
     |j                  |   g}t        j                  d	||j                  | j                  j!                  d	«      ¬
«      }d|_        | j$                  j'                  |«       | j(                  | j*                  |j,                  <   y)z›
        This pattern is from PyTorch bert model
        Fuse MatMul with FastGelu into one node:

            [root] --> MatMul --> FastGelu -->

        Fé   TÚMatMulr   Néÿÿÿÿé   r   )ÚinputsÚoutputsÚnamezcom.microsoft)r   Úinputr   Úmatch_parent_pathÚ	enumerateÚget_initializerr)   r   Úto_arrayr   Úis_safe_to_fuse_nodesÚoutputÚnodes_to_removeÚextendr   Ú	make_nodeÚcreate_node_nameÚdomainÚnodes_to_addÚappendÚthis_graph_nameÚnode_name_to_graph_namer4   )r   r*   r+   r,   Úhas_biasÚmatch_nodesÚmatmulÚweight_indexÚx_dimsÚweightÚir5   ÚinitializerÚ
bias_indexÚbias_weightÚsubgraph_nodesr2   Ú
fused_nodes                     r   ÚfusezFusionGemmFastGelu.fuse*   s|  € ð ˆÜˆt�z‰z‹?˜aÒØˆHà—j‘j×2Ñ2°4¸(¸ÀaÀSÓIˆØÐØØ˜Q‘ˆð ˆØˆØˆä! &§,¡,Ó/ò 	;‰HˆAˆuØŸ*™*×4Ñ4°UÓ;ˆKØÐ"Ø×,Ñ,¨V¯\©\¸!©_Ó=‘à �Ü$×-Ñ-¨kÓ:‘ð	;ð ˆ>ØÜˆv�|‰|Ó Ò!ØØ”C˜Ÿ™Ó%Ò%Øð ˆ
ÙØˆKÜ% d§j¡jÓ1ò ‘��5Ø"Ÿj™j×8Ñ8¸Ó?�ØÐ&ØØ�
Ü)×2Ñ2°;Ó?�Ùðð Ð"ØÜ�;×$Ñ$Ó%¨Ò*Øà ˜ˆØ�z‰z×/Ñ/Ø˜TŸ[™[¨™^Ð,Ð.AÐCVô
ð à×Ñ×#Ñ# NÔ3ñ ð �\‰\˜!˜lÑ*Ñ+¨V¯\©\¸,Ñ-GÈÏÉÐT^ÑI_Ñ`à—,‘,˜q <Ñ/Ñ0°&·,±,¸|Ñ2LÐMð 	ô ×%Ñ%ØØØ—K‘KØ—‘×,Ñ,¨^Ó<ô	
ˆ
ð ,ˆ
ÔØ×Ñ× Ñ  Ô,Ø8<×8LÑ8Lˆ×$Ñ$ Z§_¡_Ò5r   )Ú__name__Ú
__module__Ú__qualname__r	   r   r   Úintr!   Ústrr)   r   ÚdictÚlistrQ   Ú__classcell__)r   s   @r   r   r      s~   ø„ ð&˜iõ &ð
¸[ð ÈSÐSWÉZó ð¨ð °°t±ó ðOMàðOMð " # t¨I¡Ð"6Ñ7ðOMð " # y .Ñ1÷	OMr   r   N)Úloggingr   Úfusion_baser   Úfusion_utilsr   Úonnxr   r   r   Ú
onnx_modelr	   rR   Úloggerr   © r   r   ú<module>ra      s3   ðõ å Ý $ß /Ñ /Ý  á	�8Ó	€ôiM˜õ iMr   