U
    T?h5                     @   sX   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e
ZG dd deZdS )	    )	getLogger)Dict)Fusion)helper)	OnnxModelc                       s2   e Zd Zed fddZeedddZ  ZS )FusionBiasSplitGelu)modelc                    s   t  |dd d S )NBiasSplitGeluZGelu)super__init__)selfr   	__class__ _/var/www/html/venv/lib/python3.8/site-packages/onnxruntime/transformers/fusion_biassplitgelu.pyr      s    zFusionBiasSplitGelu.__init__)input_name_to_nodesoutput_name_to_nodec              
   C   s@  |j d |krdS ||j d  }t|dks:|d jdkr>dS |d }| j|dd|}|dkrddS | jj|dddd	kr~dS |jd }| j|d
ddddgdddddg|}|dkr| j|dd
ddddgddddddg|}|dks|d jd |krdS | j|dd
gddg|}	|	dks0|	d |kr4dS | j|dd|}
|
dkrTdS |
jd |jd krndS ||	d |||
|f}|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   ZMulSlicegMbP?)delta   DivAddZGatherZShape   zBSkip fuse BiasSplitGelu since it is not safe to fuse the subgraph.r	   )Zname_prefix)inputsoutputsnamezcom.microsoft)outputlenZop_typer   Zmatch_parentZfind_constant_inputinputZmatch_parent_pathZis_safe_to_fuse_nodesloggerinfoZget_constant_input
isinstanceintZnodes_to_removeextendZcreate_node_namer   Z	make_nodedomainZnodes_to_addappendZthis_graph_nameZnode_name_to_graph_name)r   Z	gelu_noder   r   childrenZmul_after_geluZslice_before_geluZ
add_outputZstart_index_nodesZend_index_nodesZslice_before_mulZsubgraph_nodesZsubgraph_outputadd_nodeZ
bias_index_valueZ	node_nameZ
fused_noder   r   r   fuse   s    



   
zFusionBiasSplitGelu.fuse)__name__
__module____qualname__r   r   r   r,   __classcell__r   r   r   r   r      s   r   N)loggingr   typingr   Zfusion_baser   Zonnxr   Z
onnx_modelr   r-   r"   r   r   r   r   r   <module>   s   