§
    kŠtj÷  ã                   ó|   — 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dS )	é    )Ú	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                 ól   •— t          ¦   «                              |ddd¦  «         d | _        d| _        d S )NÚGemmFastGeluÚFastGeluF)ÚsuperÚ__init__Úshape_inferÚshape_infer_done)Úselfr   Ú	__class__s     €új/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/onnxruntime/transformers/fusion_gemmfastgelu.pyr   zFusionGemmFastGelu.__init__   s7   ø€ Ý‰Œ×Ò˜ °
¸NÑKÔKÐKØˆÔØ %ˆÔÐÐó    Útensor_protoÚreturnNc                 óŠ   — |j         j                             d¦  «        r#t          |j         j        j        j        ¦  «        S d S )NÚshape)ÚtypeÚtensor_typeÚHasFieldÚlenr   Údim)r   r   s     r   Ú get_dimensions_from_tensor_protoz3FusionGemmFastGelu.get_dimensions_from_tensor_proto   s=   € ØÔÔ(×1Ò1°'Ñ:Ô:ð 	Ý�|Ô(Ô4Ô:Ô>Ñ?Ô?Ð?à�4r   Ú
input_namec                 ó  — | j                              |¦  «        }|r|                      |¦  «        S | j        s'| j                              d¬¦  «        | _        d| _        | j        �%|                      | j        j        |         ¦  «        S d S )NT)Úupdate)r   Úfind_graph_inputr!   r   Úinfer_runtime_shaper   Ú	known_vi_)r   r"   Úgraph_inputs      r   Úget_dimensionsz!FusionGemmFastGelu.get_dimensions   s�   € Ø”j×1Ò1°*Ñ=Ô=ˆØð 	FØ×8Ò8¸ÑEÔEÐEàÔ$ð 	)Ø#œz×=Ò=ÀTÐ=ÑJÔJˆDÔØ$(ˆDÔ!àÔÐ'Ø×8Ò8¸Ô9IÔ9SÐT^Ô9_Ñ`Ô`Ð`àˆtr   ÚnodeÚinput_name_to_nodesÚoutput_name_to_nodec                 óÀ  — d}t          |j        ¦  «        dk    rd}| j                             |dgdg¦  «        }|€dS |d         }d}d}d}	t	          |j        ¦  «        D ]X\  }
}| j                             |¦  «        }|€!|                      |j        |
         ¦  «        }ŒB|
}t          j        |¦  «        }	ŒY|	€dS t          |	j	        ¦  «        dk    rdS |t          |	j	        ¦  «        k     rdS d}|rmd}t	          |j        ¦  «        D ]8\  }
}| j                             |¦  «        }|€Œ"|
}t          j        |¦  «        } |€dS t          |j	        ¦  «        dk    rdS ||g}| j         
                    ||j        d         g||¦  «        sdS | j                             |¦  «         |r)|j        d|z
           |j        |         |j        |         gn|j        d|z
           |j        |         g}t          j        d	||j        | j                             d	¦  «        ¬
¦  «        }d|_        | j                             |¦  «         | j        | j        |j        <   dS )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‰?Œ?˜aÒÐØˆHà”j×2Ò2°4¸(¸ÀaÀSÑIÔIˆØÐØˆFØ˜Q”ˆð ˆØˆØˆå! &¤,Ñ/Ô/ð 	;ð 	;‰HˆAˆuØœ*×4Ò4°UÑ;Ô;ˆKØÐ"Ø×,Ò,¨V¬\¸!¬_Ñ=Ô=��à �Ý$Ô-¨kÑ:Ô:��Øˆ>ØˆFÝˆvŒ|ÑÔ Ò!Ð!ØˆFØ•C˜œÑ%Ô%Ò%Ð%ØˆFð ˆ
Øð 	ØˆKÝ% d¤jÑ1Ô1ð ð ‘��5Ø"œj×8Ò8¸Ñ?Ô?�ØÐ&ØØ�
Ý)Ô2°;Ñ?Ô?�ØØÐ"Ø�Ý�;Ô$Ñ%Ô%¨Ò*Ð*Ø�à ˜ˆØŒz×/Ò/Ø˜Tœ[¨œ^Ð,Ð.AÐCVñ
ô 
ð 	ð ˆFàÔ×#Ò# NÑ3Ô3Ð3ð ðNˆVŒ\˜!˜lÑ*Ô+¨V¬\¸,Ô-GÈÌÐT^ÔI_Ð`Ð`à”,˜q <Ñ/Ô0°&´,¸|Ô2LÐMð 	õ Ô%ØØØ”KØ”×,Ò,¨^Ñ<Ô<ð	
ñ 
ô 
ˆ
ð ,ˆ
ÔØÔ× Ò  Ñ,Ô,Ð,Ø8<Ô8LˆÔ$ Z¤_Ñ5Ð5Ð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ð OMð OMð OMð OMð OMð OMð OMr   r   N)Úloggingr   Úfusion_baser   Úfusion_utilsr   Úonnxr   r   r   Ú
onnx_modelr	   rR   Úloggerr   © r   r   ú<module>ra      sÄ   ðð Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ø /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ø  Ð  Ð  Ð  Ð  Ð  à	ˆ�8Ñ	Ô	€ðiMð iMð iMð iMð iM˜ñ iMô iMð iMð iMð iMr   