o
    3Ih                     @   sL   d dl mZ d dlmZ d dlmZ d dlmZ eeZ	G dd deZ
dS )    )	getLogger)Fusion)helper)	OnnxModelc                       s4   e Zd Zdef fddZdedefddZ  ZS )FusionBiasSplitGelumodelc                    s   t  |dd d S )NBiasSplitGeluGelu)super__init__)selfr   	__class__ m/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/onnxruntime/transformers/fusion_biassplitgelu.pyr      s   zFusionBiasSplitGelu.__init__input_name_to_nodesoutput_name_to_nodec                 C   s"  |j d |vr	dS ||j d  }t|dks|d jdkrdS |d }| j|dd|}|du r2dS | jj|dddd	kr?dS |jd }| j|g d
g d|}|du rb| j|g dg d|}|du so|d jd |krqdS | j|ddgddg|}	|	du s|	d |vrdS | j|dd|}
|
du rdS |
jd |jd krdS g ||	d |||
|}|j d }| j||g||st	
d dS |d }| j|\}}t|tsdS | j| | jjddd}tjd|jd|  |j| g|g|d}d|_| j| | j| j|< dS )a  
        [root] --->Add -------------------->  Slice ---------------> Mul -->
                   |                            ^                    ^
                   |                            |                    |
                   +----------------------------+---Slice --> Gelu---+
                   |                            |     ^
                   |                            |-----|
                   |                            |     |
                   |                           Mul   Mul
                   |                            ^     ^
                   v                            |     |
                  Shape ---> Gather --> Add --> Div --+
        r   N   MulSlicegMbP?)delta   )DivAddGatherShaper   )r   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   r      zBSkip fuse BiasSplitGelu since it is not safe to fuse the subgraph.r   )name_prefix)inputsoutputsnamezcom.microsoft)outputlenop_typer   match_parentfind_constant_inputinputmatch_parent_pathis_safe_to_fuse_nodesloggerinfoget_constant_input
isinstanceintnodes_to_removeextendcreate_node_namer   	make_nodedomainnodes_to_addappendthis_graph_namenode_name_to_graph_name)r   	gelu_noder   r   childrenmul_after_geluslice_before_gelu
add_outputstart_index_nodesend_index_nodesslice_before_mulsubgraph_nodessubgraph_outputadd_node
bias_index_value	node_name
fused_noder   r   r   fuse   s   




zFusionBiasSplitGelu.fuse)__name__
__module____qualname__r   r   dictrH   __classcell__r   r   r   r   r      s    r   N)loggingr   fusion_baser   onnxr   
onnx_modelr   rI   r+   r   r   r   r   r   <module>   s   