o
    ٷi                     @   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)Fusion)FusionUtils)helper)	OnnxModelc                       s4   e Zd Zdef fddZdedefddZ  ZS )FusionQOrderedGelumodelc                    s   t  |dddg d S )NQOrderedGeluGeluFastGelu)super__init__)selfr   	__class__ a/home/ubuntu/.local/lib/python3.10/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s*t|dkr(|d jdkr(|d jdks*dS |d }d}t|dkr:|d }t|| j sCdS | j |dgdgfg|\}}}	|dk rYdS |d }
t|
| j sfdS |g}|||
g | j ||dur|j	d |j	d gn|j	||st
d dS | j| tjd	|
jd |
jd |jd g|j	d g| j jd	d	d
d}|du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   QuantizeLinear   ShapeNDequantizeLinearz.It is not safe to fuse QOrderedGelu node. Skipr	   )name_prefix)inputsoutputsnameorder_Xorder_Yzcom.microsoft)r   get_childrenlenop_typer   check_qdq_node_for_fusionmatch_parent_pathsextendis_safe_to_fuse_nodesoutputloggerdebugnodes_to_remover   	make_nodeinputcreate_node_namereplace_node_input	attributemake_attributedomainnodes_to_addappendthis_graph_namenode_name_to_graph_namer   )r   noder   r   gelu_childrendownstream_quantize_nodedownstream_shape_nodefirst_path_idfirst_input_parent_nodes_upstream_dequantize_nodesubgraph_nodesordered_gelu_noder   r   r   fuse   sj   



zFusionQOrderedGelu.fuse)__name__
__module____qualname__r   r   dictr@   __classcell__r   r   r   r   r      s    r   N)loggingr   fusion_baser   fusion_utilsr   onnxr   
onnx_modelr   rA   r(   r   r   r   r   r   <module>   s   