U
    T?h                     @   sd   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	 d dl
mZ eeZG dd deZd	S )
    )	getLogger)Dict)Fusion)FusionUtils)helper)	OnnxModelc                       s2   e Zd Zed fddZeedddZ  ZS )FusionQOrderedGelu)modelc                    s   t  |dddg d S )NQOrderedGeluZGeluZFastGelu)super__init__)selfr	   	__class__ _/var/www/html/venv/lib/python3.8/site-packages/onnxruntime/transformers/fusion_qordered_gelu.pyr      s    zFusionQOrderedGelu.__init__)input_name_to_nodesoutput_name_to_nodec                 C   s  | j ||}t|dkr(|d jdksTt|dkrP|d jdkrP|d jdksTdS |d }d}t|dkrt|d }t|| j sdS | j |dgdgfg|\}}}	|dk rdS |d }
t|
| j sdS |g}|||
g | j ||dk	r|j	d |j	d gn|j	||s"t
d dS | j| tjd	|
jd |
jd |jd g|j	d g| j jd	d	d
d}|dk	r| j ||jd |j	d  |jtddg |jtddg d|_| j| | j| j|j< dS )a  
        INPUT PATTERN
        Fuse (quantized) Gelu subgraph into one node QOrderedGelu:
            -> quantized input  -> DQ -> Gelu -> Q ->

        (or)

            -> quantized input  -> DQ -> FastGelu -> Q ->

        OUTPUT PATTERN
            -> QOrderedGelu ->
           r   ZQuantizeLinear   ZShapeNZDequantizeLinearz.It is not safe to fuse QOrderedGelu node. Skipr
   )Zname_prefix)inputsoutputsnameZorder_XZorder_Yzcom.microsoft)r	   Zget_childrenlenZop_typer   Zcheck_qdq_node_for_fusionZmatch_parent_pathsextendZis_safe_to_fuse_nodesoutputloggerdebugZnodes_to_remover   Z	make_nodeinputZcreate_node_nameZreplace_node_input	attributeZmake_attributedomainZnodes_to_addappendZthis_graph_nameZnode_name_to_graph_namer   )r   noder   r   Zgelu_childrenZdownstream_quantize_nodeZdownstream_shape_nodeZfirst_path_idZfirst_input_parent_nodes_Zupstream_dequantize_nodeZsubgraph_nodesZordered_gelu_noder   r   r   fuse   sz    






  zFusionQOrderedGelu.fuse)__name__
__module____qualname__r   r   r   r$   __classcell__r   r   r   r   r      s   r   N)loggingr   typingr   Zfusion_baser   Zfusion_utilsr   Zonnxr   Z
onnx_modelr   r%   r   r   r   r   r   r   <module>   s   